Shared_Includes/macroses/macros.z80
2026-01-27 21:28:01 +10:00

522 lines
12 KiB
Z80 Assembly
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/////////////////////////////// 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
JR NZ,.bios
;
LD HL,-(MIN_DSS_BUILD)
ADD HL,BC
JR NC,.Error_DOS
;
.bios: 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 EXE_ORG addr_exe
IFNDEF App_EXE_Version
DEFINE App_EXE_Version 0
ENDIF
ORG 0
exe_header:
BYTE 'EXE' ; 0-2 EXE ‘¨£­ âãà 
BYTE App_EXE_Version ; 3 Version of EXE file
DWORD exe_header.length ; 4-5 ª ª®£® ᬥ饭¨ï ¢ ä ©«¥ ¡ã¤¥â £à㧨âìáï ª®¤ ¢
; ; 6-7 ¯ ¬ïâì ¯®  ¤à¥áã (Code_addr) Low addr, High addr.
WORD Loader_length ; 8-9 <20> §¬¥à ¯¥à¢¨ç­®£® § £àã§ç¨ª  ¨«¨ 0
WORD #0000 ; 10-11 Reserved
WORD #0000 ; 12-13 Reserved
WORD #0000 ; 14-15 Reserved
WORD code_addr ; 16-17 €¤à¥á à á¯®«®¦¥­¨ï ª®¤  ¢ ¯ ¬ï⨠(#4100-#FFFF)
WORD program_start ; 18-19 €¤à¥á ¢ ¯ ¬ïâ¨ á ª®â®à®£® § ¯ãáâ¨âáï ª®¤ (Reg. PC)
WORD stack_point ; 20-21 €¤à¥á á⥪  (Reg. SP)
IFDEF EXEinfoMACRO ; 22-512 Œ®¦­® ¨á¯®«ì§®¢ âì ¯®¤ ⥪áâ ¤«ï ¢ë¯¥­¤àñ¦  ¨«¨ ­¥ ¨á¯®«ì§®¢ âì
_mEXEinfo
ENDIF
; <20><>ˆŒ…<C592>:
; BLOCK 10,' ' ; ‚ëà ¢­¨¢ ­¨¥ ¤«ï ªà á¨¢®£® ®â®¡à ¦¥­¨ï ¢ HEX
; BYTE 'Turbo Assembler '
; BYTE ' v 0.71 '
; BYTE 'Coded in 1999 by'
; BYTE ' Enin Anton. '
; BYTE ' Resurrected & '
; BYTE ' modified by '
; BYTE ' Anatoliy '
; BYTE ' Belyanskiy, '
; BYTE ' Sprinter Team '
; BYTE ' 2023 '
exe_header.length equ $-exe_header
ORG addr_exe
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]
;------------------------------------[^]