; LAST UPDATE: 05.06.2025 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 ; формирователь EXE заголовка, параметры: ; ORGADR - адрес ORG для учета размера EXE заголовка ; VERSION (BYTE) - версия заголовка ; PRIMARYLOADER (WORD) - Размер первичного загрузчика или 0 ; ADRLOAD (WORD) - Адрес расположения кода в памяти (0x4100-0xFFFF) ; ADRSTART (WORD) - Адрес в памяти с которого запустится код (Reg. PC) ; ADRSTACK (WORD) - Адрес стека (Reg. SP) ; RESERVED - сколько байт 0 резервировать HDR_EXE MACRO ORGADR,VERSION,PRIMARYLOADER,ADRLOAD,ADRSTART,ADRSTACK,RESERVED IFNB ORGADR IF MOMPASS > 1 ORG ORGADR - (.END - .START) ELSE ORG ORGADR ENDIF ENDIF .START DB "EXE",VERSION IF MOMPASS > 1 DD .END - .START ELSE DD 22 ENDIF DW PRIMARYLOADER DW 0,0,0 DW ADRLOAD,ADRSTART,ADRSTACK IF RESERVED > 0 DB RESERVED DUP (0) ENDIF .END ENDM