.XLIST ; FILENAME: MMACROS.MAC ; Определяет длину ASCIIZ строки LenString macro StringSeg, StringOfs, StringLen local mark__1,mark__2 LoadAddress ,,, xor BX, BX mark__1: cmp byte ptr [SI+BX], 0 je mark__2 inc BX jmp short mark__1 mark__2: SaveValue , endm ; Ищет вхождение символа в ASCIIZ строке, если есть DL=chr - нет DL=0 ChrString macro char, StringSeg, StringOfs local mark__1,mark__2 LoadAddress ,,, mark__1: mov DL, [SI] inc SI cmp DL, char je mark__2 cmp DL, 0 jne mark__1 mark__2: endm ; Копирует строку ASCIIZ CpyString macro DstSeg, DstOfs, SrcSeg, SrcOfs local mark__1 LoadAddress ,,, LoadAddress ,,, mark__1: mov DL, ES:[DI] mov DS:[SI], DL inc DI inc SI cmp DL, 0 jne mark__1 endm ; Сравнивает строки CmpString macro Count, DstSeg, DstOfs, SrcSeg, SrcOfs, Direction mov CX, Count LoadAddress ,,, LoadAddress ,,, ifnb Direction endif repe cmpsb endm ; Преобразует прописные буквы в заглавные MUPPER macro Char LoadValue AL, and AL, 11101111b SaveValue ,AL endm ; Allocate a string using Turbo Pascal format MakePascalString macro Id, Msg local MsgLen, EndStr Id db EndStr - Id - 1, "&Msg&" ;; Allocate space for the string EndStr label byte ;; a preceding byte storing the length of the string. endm ; Determine the segment address of video ram GetVideoSeg macro SegScrn local mark__1,mark__2 mov AH,0Fh int 10h cmp al, 07h jne short mark__1 mov ax, 0B000h ;; It's a monochrome card jmp short mark__2 mark__1: mov ax, 0B800h ;; It's a color card mark__2: SaveValue , endm ; Расчитывает смещение видео памяти по координатам курсора GetVideoOff macro CurX, CurY, CurMaxX, OfsScrn xor AH, AH ;; (Y*MaxX+X)*2 mov AL, CurY xor DH, DH mov DL, CurMaxX mul DX xor DH, DH mov DL, CurX add AX, DX shl AX, 1 ;; *2 SaveValue , ;; current offset screen endm ; Performs the DOS int 21h call DosCall macro Service mov ah, Service int 21h endm ; The speaker Beep macro mov dl, BELL DosCall 02h endm ; Установить индексный регистр массива MINDEX macro IReg, Index, Long LoadValue , LoadValue , mul DX SaveValue , endm ; Пауза PAUSE macro Count local paus mov CX, Count paus: loop paus endm ; reg=dif1-dif2 differ macro dif1, dif2, reg mov reg, dif1 sub reg, dif2 endm ; reg=(ave1+ave2)/2 average macro ave1, ave2, reg mov reg, ave1 add reg, ave2 shr reg, 1 endm ; Десять в степени power power10 macro power, result local mark__1,mark__2 mov AX, 1 LoadValue CX, dec CX jcxz mark__1 mov BX, 10 mark__2: mul BX loop mark__2 mark__1: SaveValue ,AX endm ; Раздвинуть и вставить символ в строку InsChar macro Char,Direction local refusal jcxz refusal ifnb Direction endif rep movsb refusal: mov byte ptr ES:[DI], Char endm ; NewStack macro Old_SS,Old_SP,New_SS,New_SP mov DX, SS mov Old_SS, DX mov Old_SP, SP ifnb mov DX, New_SS cli mov SS, DX mov SP, New_SP sti endif endm ; OldStack macro Old_SS,Old_SP mov DX, Old_SS cli mov SS, DX mov SP, Old_SP sti endm ; Поместить значения регистров в стек (PUSH_REGS ) PUSH_REGS macro reg_list IRP reg, push reg endm endm ; Извлечь из стека значения регистров (POP_REGS ) POP_REGS macro reg_list IRP reg, pop reg endm endm .LIST