; LAST UPDATE: 30.03.2024 savelij ; для вызывов BIOS ; RGC - номер функции BIOS ; RGB - регистр B ; RGA - регистр A ; RGIX - регистр IX SPBIOS MACRO RGC,RGB,RGA,RGIX IFNB RGIX LD IX,RGIX ENDIF IFNB RGA IF RGA = 0 XOR A ELSE LD A,RGA ENDIF ENDIF IFNB RGC IFNB RGB LD BC,RGB << 8 + RGC ELSE LD C,RGC ENDIF ENDIF RST 8 ENDM ; для вызывов DSS ; RGC - номер функции BIOS ; RGB - регистр B ; RGA - регистр A ; RGIX - регистр IX SPDSS MACRO RGC,RGB,RGA,RGIX IFNB RGIX LD IX,RGIX ENDIF IFNB RGA IF RGA = 0 XOR A ELSE LD A,RGA ENDIF ENDIF IFNB RGC IFNB RGB LD BC,RGB << 8 + RGC ELSE LD C,RGC ENDIF ENDIF RST 0x10 ENDM ; для работы с MOUSE ; RGC - номер функции BIOS ; RGB - регистр B ; RGA - регистр A ; RGIX - регистр IX SPMOUSE MACRO RGC,RGB,RGA,RGIX IFNB RGIX LD IX,RGIX ENDIF IFNB RGA IF RGA = 0 XOR A ELSE LD A,RGA ENDIF ENDIF IFNB RGC IFNB RGB LD BC,RGB << 8 + RGC ELSE LD C,RGC ENDIF ENDIF RST 0x30 ENDM ; для BIOS ; RGC - номер функции BIOS ; RGB - регистр B ; RGA - регистр A BIOS18 MACRO RGC,RGB,RGA,RGIX IFNB RGIX LD IX,RGIX ENDIF IFNB RGA IF RGA = 0 XOR A ELSE LD A,RGA ENDIF ENDIF IFNB RGC IFNB RGB LD BC,RGB << 8 + RGC ELSE LD C,RGC ENDIF ENDIF RST 0x18 ENDM ; для SYSTEM.DOS и SYSTEM.EXE ; RSTNUM - номер RST ; RGC - номер функции BIOS ; RGB - регистр B ; RGA - регистр A SPSYSDOS MACRO RSTNUM,RGC,RGB,RGA,RGIX IFNB RGIX LD IX,RGIX ENDIF IFNB RGA IF RGA = 0 XOR A ELSE LD A,RGA ENDIF ENDIF IFNB RGC IFNB RGB LD BC,RGB << 8 + RGC ELSE LD C,RGC ENDIF ENDIF RST RSTNUM ENDM ; PORT - адрес порта ; NUM - значение для записи ; FLAG - при наличии в порт пишется содержимое регистра A SETPORT MACRO PORT,NUM,FLAG IFB FLAG ; если FLAG есть, не меняем регистр A IF NUM = 0 XOR A ELSE LD A,NUM ENDIF ENDIF OUT (PORT),A ENDM GETPORT MACRO PORT IN A,(PORT) ENDM ; инит счетчика для генерации имени метки GEN_NAME_INIT MACRO NAMENUM := 0 ENDM ; генерация имени метки и инкримент счетчика имени метки GEN_NAME MACRO NAME,LABEL NAMENUMTXT := "\{NAMENUM}" NAME_{NAMENUMTXT} := $ IFNB LABEL LABEL EQU NAMENUM ; генерация указанного имени с текущим номером сообщения ENDIF NAMENUM := NAMENUM + 1 ENDM ; генерация таблицы меток (только со второго прохода) GEN_TABL MACRO NAME IF MOMPASS > 1 CURRENT := 0 REPT MAXITEM CURRENTTXT := "\{CURRENT}" DW NAME_{CURRENTTXT} CURRENT := CURRENT + 1 ENDM ENDIF ENDM ACCEL MACRO BYTE DB BYTE ENDM HDR_EXE MACRO VERSION,OFFSET,PRIMARYLOADER,ADRLOAD,ADRSTART,ADRSTACK,RESERVED DB "EXE",VERSION DD OFFSET DW PRIMARYLOADER DW 0,0,0 DW ADRLOAD,ADRSTART,ADRSTACK IF RESERVED > 0 DB RESERVED DUP (0) ENDIF ENDM