/////////////////////////////// IVAN_MAK /////////////////////////////// MACRO RET_SLOT0 LD A,0 OUT (SLOT0),A DISPLAY "WARNING!!! Hardcoded zx page!!!" ENDM MACRO RET_SLOT1 LD A,5 OUT (SLOT1),A DISPLAY "WARNING!!! Hardcoded zx page!!!" ENDM MACRO RET_SLOT2 LD A,2 OUT (SLOT2),A DISPLAY "WARNING!!! Hardcoded zx page!!!" ENDM ; MACRO RET_SLOT3 LD A, 0 OUT (SLOT3), A DISPLAY "WARNING!!! Hardcoded zx page!!!" ENDM ; MACRO CALL_48 adr PUSH HL LD HL, .ADR_R PUSH HL LD HL,SW_ROM PUSH HL LD HL,adr JP JP_HL_48 .ADR_R: POP HL ENDM MACRO CALL_48X adr PUSH HL LD HL,.ADR_R EX (SP),HL PUSH HL LD HL,SW_ROM EX (SP),HL PUSH HL LD HL,adr EX (SP),HL JP SW_ROM .ADR_R: ;RET ENDM MACRO RAMD_KEY SUB 4 DI LD B,SYS_PAGE LD C,SLOT3 OUT (C),B LD HL,RAMD_KEYS ADD A,L LD L,A DEC L LD (A_RAMD_VARS),HL INC L LD L, (HL) RET_SLOT3 EI LD A, L ENDM ; MACRO DSS adr, dt ; IF (adr >= $) ; DUP ((adr - $) / 16) ; B dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt,dt ; EDUP ; DUP (adr - $) ; DB dt ; EDUP ; ELSE ; ASSERT 0, "Error memory relocation." ; ENDIF ; ENDM ; //////////////////////////////////////////////////////////////////////// ;======================================= ; склеивает строку пути к файлу со строкой имени файла ; retname - имя дефайна содержащее путь и имя файла ; pname - строка в одинарных кавычках с путём к файлу ; fname - строка в одинарных кавычках с именем файла ; OStype - 'MacOS', 'Linux' или 'Windows'. Указывает какой разделитель между файлами/папками используется в переданной строке,'/' или '\' MACRO mGETfullNAME retname, pname, fname, OStype DEFINE tmpLString1 pname DEFINE tmpLString2 fname DEFINE tmpLString3 retname DEFINE tmpLString4 OStype LUA local tmp3 = sj.get_define("tmpLString3") tmp3 = string.gsub(string.match(tmp3, '\'.*\''), "'", "") sj.insert_define(tmp3, "'" .. Get_Full_Filename(sj.get_define("tmpLString1"), sj.get_define("tmpLString2"), sj.get_define("tmpLString4")) .. "'") ENDLUA UNDEFINE tmpLString4 UNDEFINE tmpLString3 UNDEFINE tmpLString2 UNDEFINE tmpLString1 ENDM ;======================================= ;======================================= MACRO _mInfoBLOCK endAddr, filler IF endAddr > 0 DISPLAY " Free bytes: ",/D,endAddr, " From ",/H, $, " to ",/H, endAddr+$," address." ENDIF BLOCK endAddr,filler ENDM ;======================================= ;======================================= MACRO _mInfoALIGN num, filler .curr EQU $ .size EQU .temp-.curr IF .size > 0 DISPLAY " Free bytes: ",/D,.size, " From ",/H, .curr, " to ",/H, .temp, " address." ENDIF ALIGN num,filler .temp EQU $ ENDM ;======================================= ;======================================= MACRO _mSIZE_INFO name, startAddr, endAddr, pages, mKey IF mKey == 1 display " " display "v----------------------------------------------------------v" display " Start End Size Free in page" ENDIF display "* ",name," ",/H,startAddr, " ", endAddr, " ", (endAddr) - (startAddr), " ",/A, (#4000*(pages))-((endAddr) - (startAddr)) IF mKey == 2 display "^----------------------------------------------------------^" display " " ENDIF ENDM ;======================================= ;======================================= MACRO _mCHECK_SYS_VERSIONS dss_v, dss_m, dss_b, bios_v, bios_m DEFINE MIN_DSS_VERSION dss_v*256 + dss_m DEFINE MIN_DSS_BUILD dss_b DEFINE MIN_BIOS_VERSION bios_v*256 + bios_m ; DEFINE TXT_DSS_VERSION ('0'+dss_v),\ '.',\ ('0'+dss_m/10),\ ('0'+dss_m-(dss_m/10)*10),\ '.',\ ('0'+dss_b/100),\ ('0'+(dss_b/10 - dss_b/100*10)),\ ('0'+(dss_b - dss_b/10*10)) ; ; DEFINE TXT_BIOS_VERSION '0'+bios_v,\ '.',\ '0'+bios_m/10,\ '0'+bios_m-(bios_m/10)*10 ; LD C,Dss.Version RST ToDSS JR C,.Error_DOS LD HL,MIN_DSS_VERSION EX DE,HL SBC HL,DE JR C,.Error_DOS ; LD HL,-(MIN_DSS_BUILD) ADD HL,BC JR NC,.Error_DOS ; LD C,BIOS.DRV_VERSION RST ToBIOS JR C,.Error_BIOS LD HL,-(MIN_BIOS_VERSION) ADD HL,DE RET C .Error_BIOS: LD HL,.MSG.Error_BIOS JR .next .Error_DOS: LD HL,.MSG.Error_DSS .next: LD C,Dss.PChars RST ToDSS ; .loop: LD B,DSS_Error.sys.COMMON_ERROR .error: LD C,Dss.Exit RST ToDSS JR .loop ; .MSG.Error_BIOS: DB "\r\nERROR! Uncompatible version of BIOS. Needs version ",TXT_BIOS_VERSION," or higher.\r\n",0 .MSG.Error_DSS: DB "\r\nERROR! Uncompatible version of DSS. Needs version ",TXT_DSS_VERSION," or higher.\r\n",0 ; UNDEFINE MIN_DSS_VERSION UNDEFINE MIN_DSS_BUILD UNDEFINE MIN_BIOS_VERSION UNDEFINE TXT_DSS_VERSION UNDEFINE TXT_BIOS_VERSION ENDM ;======================================= ;======================================= MACRO _mCollectInfo_begin IF COLLECT_INFO LUA PASS3 INCLUDING_INFO_START() ENDLUA ENDIF ENDM ;--------------------------------------- MACRO _mCollectInfo_addStart IF COLLECT_INFO LUA PASS3 INCLUDING_INFO_ADDstart() ENDLUA ENDIF ENDM ;--------------------------------------- MACRO _mCollectInfo_addEnd IF COLLECT_INFO LUA PASS3 INCLUDING_INFO_ADDend() ENDLUA ENDIF ENDM ;--------------------------------------- MACRO _mCollectInfo_end IF COLLECT_INFO LUA PASS3 INCLUDING_INFO_END() ENDLUA ENDIF ENDM ;======================================= ;======================================= MACRO _mARRAYstart ENDM ;--------------------------------------- MACRO _mARRAYadd ENDM ;--------------------------------------- MACRO _mARRAYshow ENDM ;======================================= ;======================================= MACRO mHRUSTfile fname, hstEXT, macPATH, linPATH, winPATH, osName IF osName = 'MacOS' : DEFINE tmpLString3 = ELSEIF osName = 'Linux' : ELSEIF osName = 'Windows' : DEFINE tmpLString1 = fname DEFINE tmpLString2 = hstEXT DEFINE tmpLString3 = DEFINE tmpLString4 = DEFINE tmpLString5 = ENDM ;======================================= ;======================================= ; Возвращает имя операционной системы в дефайне retname ; 'MacOS', 'Linux' или 'Windows' MACRO mGETosNAME retname DEFINE tmpLString retname LUA local tmp = sj.get_define("tmpLString") tmp = string.gsub(string.match(tmp, '\'.*\''), "'", "") sj.insert_define(tmp, "'" .. Detect_os() .. "'") ENDLUA ENDM ;======================================= ;======================================= MACRO STACK_CHECK_MACRO _mSP, _mSPbuffer assert $ < _mSP-_mSPbuffer, WARNING! Stack buffer may corrupt data/code! ENDM ;======================================= ;======================================= MACRO SAFE_PORTY IFNDEF NeedSafePort_Y ASSERT 0, "--===[ Error! To use SAFE_PORTY you MUST define NeedSafePort_Y 0/1 ]===--" ELSEIF NeedSafePort_Y LD A,#C0 OUT (PORT_Y),A ENDIF ENDM MACRO ZERO_PORTY IFNDEF NeedSafePort_Y ASSERT 0, "--===[ Error! To use SAFE_PORTY you MUST define NeedSafePort_Y 0/1 ]===--" ELSEIF NeedSafePort_Y LD A,0 OUT (PORT_Y),A ENDIF ENDM MACRO SAFE_PORTY_2 IFNDEF NeedSafePort_Y ASSERT 0, "--===[ Error! To use SAFE_PORTY you MUST define NeedSafePort_Y 0/1 ]===--" ELSEIF NeedSafePort_Y EXX LD C,PORT_Y IN B,(C) PUSH BC LD E,#C0 OUT (C),E EXX ENDIF ENDM MACRO RESTORE_PORTY IFNDEF NeedSafePort_Y ASSERT 0, "--===[ Error! To use SAFE_PORTY you MUST define NeedSafePort_Y 0/1 ]===--" ELSEIF NeedSafePort_Y EXX POP BC OUT (C),B EXX ENDIF ENDM ;======================================= ;======================================= MACRO PrintProc MODULE PrintF ;--------------------------------------- printstr: ; в рег. HL адрес на печатаемый буфер LD C,Dss.PChars jp ToDSS ;--------------------------------------- ;--------------------------------------- ; в рег. A число печатаемое как hex printhex: LD D,A RRCA RRCA RRCA RRCA AND #0F ADD A,#30 CP #3A JR C,.PRNH1 ADD A,7 .PRNH1: CALL .PRINT_CHAR LD A,D AND #0F ADD A,#30 CP #3A JP C,.PRINT_CHAR ADD A,7 JP .PRINT_CHAR ; в регистре A символ для печати .PRINT_CHAR: LD BC,#0182 JP ToBIOS ;--------------------------------------- ENDMODULE ENDM ;======================================= ;======================================= MACRO M_hex2dec2ascii_8bit size ; ВХОД: ; рег. C - HEX число для преобразования (0-255) ; рег. HL - адрес в памяти для сохранения строки результата (1-3 байта ASCII) ; size - 1-3 ascii символа на выходе (от младшего к старшему разряду) IF size == 3 ld a,199 cp c ld a,#30 jr nc,.nxt inc a .nxt: ld (hl),a ENDIF xor a ld b,8 .loop: sla c adc a,a daa IF size == 3 jp nc,.skip inc (hl) ENDIF .skip: djnz .loop IF size == 3 inc hl ENDIF IF size == 1 and #0F or #30 ld (hl),a ELSE ld (hl),a ld a,#33 rrd inc hl ld (hl),a ENDIF ;.exit: ENDM ;======================================= ;======================================= MACRO M_Get_Mem mem_buf_addr, pages ld b,pages rst ToDSS ret c ld hl,mem_buf_addr ld c,BIOS.GetMemBlkPages rst ToBIOS ret ENDM ;======================================= ;======================================= ; !TODO border color - активировать макрос и влупить везде когда переменные sys_page будут через структуру сделаны в SP2000.INC ; MACRO BORDER color ; IF color == 0 ; XOR A ; ELSE ; LD A,color ; ENDIF ; out (BorderColor),a ; ENDM ;======================================= ;-----------[DSS Functions]----------[v] MACRO DSS_GETMEM pages, error_handler ld b,pages ld c,Dss.GetMem rst ToDSS jp c,error_handler ;A - идентификатор блока, ;либо код ошибки если CF-1 ENDM ;------------------------------------[^] ;----------[BIOS Functions]----------[v] ;------------------------------------[^]