MountIMA/mountima.asm
Anatoliy Belyanskiy cf4295cc85 Initial commit
2023-06-15 02:40:28 +10:00

653 lines
24 KiB
NASM
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.

;
;
; !TODO
;
; [ ] - ª«îç ¤«ï § £à㧪¨ ®¡à §  ¢ ­®¢ë© à ¬-¤¨áª "/i ¨¬ï_ä ©« "
; [ ] - ª«îç ¤«ï § £à㧪¨ ®¡à §  ¢ áãé¥áâ¢ãî騩 à ¬-¤¨áª "/i ¨¬ï_ä ©«  /d ¡ãª¢  ¤¨áª "
; [ ] - ª«îç ¤«ï á®åà ­¥­¨ï à ¬-¤¨áª  ¢ ®¡à § "/s ¡ãª¢  ¤¨áª "
; [ ] - ª«îç ¤«ï § ªàëâ¨ï à ¬-¤¨áª  "/á ¡ãª¢  ¤¨áª "
;
;
; Compilation parameters
;-------------[]
;DEVICE SPRINTER
;MMU 2 e, 0 ; ­ã«¥¢ ï áâà ­¨æ  ¢ ¡ ­ªã 2 ¨ ¯à®¢¥àª  ­  £à ­¨æë
;OUTPUT './Build/new.bin'
;-------------[]
; Defines section
;-------------[]
define NEED_LOADER 0
; define NeedSafePort_Y 0
;-------------[]
; Included LUA section
;-------------[]
includelua <Shared_Includes/LUA/Functions.LUA>
;-------------[]
; Included constants section
;-------------[]
include 'Shared_Includes/constants/sp2000.inc'
include 'Shared_Includes/constants/dss_equ.inc'
include 'Shared_Includes/constants/BIOS_equ.inc'
;-------------[]
; Included macroses section
;-------------[]
include 'Shared_Includes/macroses/macros.z80'
include 'Shared_Includes/macroses/accelerator.z80'
;-------------[]
; Standart EQU section
;-------------[]
org_addr EQU #8000 + CLP_Buffer
code_addr EQU BEGIN
stack_point EQU #C000
stack_buffer EQU 64
program_start EQU BEGIN
;-------------[]
; Program EQU section
;-------------[]
; IMG_File:
; .Sectors EQU 2880
; .RamPages EQU 90
; STRUCT MEM_BUFFER_BLOCK
; FileID BYTE
; BlockID BYTE
; SavePage BYTE
; PagesBuffer BLOCK IMG_File.RamPages+1
; ENDS
;-------------[]
; Code start section
;[]-------------------------------------------------------------------[]
include 'Shared_Includes/constants/EXE_Header.z80'
ORG org_addr
BEGIN:
; LD C,BIOS.LP_GET_PLACE
; RST ToBIOS
; PUSH DE
; LD HL,EXIT.messages.test
; LD C,Dss.PChars
; RST ToDSS
; POP DE
; LD E,0
; LD C,BIOS.LP_SET_PLACE
; RST ToBIOS
; LD HL,EXIT.messages.help
; LD C,Dss.PChars
; RST ToDSS
; di : halt
LD (dss_line),IX ; ‘®å࠭塞 㪠§ â¥«ì ­  áâப㠧 ¯ã᪠.
LD A,(IX) ; âãâ DSS ª« ¤ñâ ¤«¨­ã ¯ à ¬¥â஢ ª®¬.áâப¨
AND A ; ¯à®¢¥à塞 ­  ®âáãâá⢨¥ ¯ à ¬¥â஢
JP Z,EXIT.help ; § ¯ã᪠ ¢ ª®¬.áâப¥. …᫨ ¨å ­¥â - ¢ë室 á ¨­áâàãªæ¨¥©
CALL Set_keys
JP C,EXIT.error.UNDEFINED
; ¯à®¢¥àª  ª«î祩 ­  ­¥á®¢¬¥á⨬®áâì))
LD HL,key_buff
LD A,(HL)
INC HL
XOR (HL)
JR NZ,.not_saveRMD
INC HL
OR (HL)
JP Z,EXIT.error.WrongKeys
CALL RMD_SAVE
JP EXIT.good
.not_saveRMD:
AND (HL)
JR NZ,RMD_MOUNT
RMD_UNMOUNT: ;LD A,(key_buff.DRVsave)
;INC A
;CALL NZ,RMD_SAVE
;!TODO check error?
LD A,(key_buff.DRV)
LD C,BIOS.FreeMemRMD
RST ToBIOS
;!TODO check error?
LD C,Dss.RescanDrives
RST ToDSS
JP EXIT.good
;!TODO
;-------------[]
;-------------[]
;‘®åà ­¥­¨¥ ®¡à §  à ¬¤¨áª  ¢ ä ©«
RMD_SAVE: IN A,(SLOT3)
LD (.SavePage),A
LD A,(key_buff.DRVsave)
LD C,BIOS.GET_RAMD_ST
RST ToBIOS
LD HL,PagesBuffer
LD C,BIOS.GetMemBlkPages
RST ToBIOS
;LD HL,PagesBuffer
LD C,Dss.Write
.loop: PUSH BC
PUSH HL
LD A,(HL)
OUT (SLOT3),A
LD A,(key_buff.FM)
LD HL,#C000
LD DE,#4000
;LD C,Dss.Write
RST ToDSS
; A - ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
; HL -  ¤à¥á ¢ ¯ ¬ïâ¨
; DE - ª®«¨ç¥á⢮ ç¨â ¥¬ëå ¡ ©â
POP HL
POP BC
;!TODO 㤠«ïâì ä ©« ¥á«¨ ®è¨¡ª  § ¯¨á¨
JP C,EXIT.error.writeFile
INC HL
DJNZ .loop
.SavePage+*: LD A,0
OUT (SLOT3),A
LD C,Dss.RescanDrives
RST ToDSS
LD A,(key_buff.FM)
LD C,Dss.Close
RST ToDSS
RET
;-------------[]
;-------------[]
RMD_MOUNT: LD A,(key_buff.FM)
LD HL,0
LD IX,0
LD B,Dss.Move_FP.FrEnd
LD C,Dss.Move_FP
RST ToDSS ; ã§­ ñ¬ à §¬¥à ä ©« 
; A - ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
; HL:IX - ᬥ饭¨¥ 㪠§ â¥«ï ¢ ä ©«¥
; B - ᯮᮡ ¯¥à¥¬¥é¥­¨ï:
; 0 - ®â ­ ç «  ä ©« 
; 1 - ®â ⥪ã饣® §­ ç¥­¨ï 㪠§ â¥«ï
; 2 - ®â ª®­æ  ä ©« 
XOR A
OR H
JP NZ,EXIT.error.noRAM
LD A,L
CP #39
JP NC,EXIT.error.noRAM
PUSH IX
POP HL
DUP 2 ; ¯à¥¢à é ¥¬ à §¬¥à ä ©«  ¢ ¡ ©â å ¢ áâà ­¨æë
SLA L
RL H
RLA
EDUP
LD B,A
LD A,H
OR L
JR Z,.skipINK
INC B ; ­¥®¡å®¤¨¬®¥ ç¨á«® áâà ­¨æ
;-------------[]
.skipINK: LD A,B
LD (.RamPagesNum),A
LD C,BIOS.GetMem
RST ToBIOS
;LD B,num_pages ; § ¯à è¨¢ ¥¬®¥ ç¨á«® áâà ­¨æ އ“
;LD C,0C2h ; ­®¬¥à ä㭪樨
;CALL 3D13h ; NC -> € - ¨¤¥­â¨ä¨ª â®à ¡«®ª 
; CF -> A=1 - ­¥â ¯ ¬ïâ¨
JP C,EXIT.error.noRAM
LD (.BlockID),A
;-------------[]
;-------------[]
LD HL,PagesBuffer
LD C,BIOS.GetMemBlkPages
RST ToBIOS
; LD A,id_blk ; ¨¤¥­â¨ä¨ª â®à ¡«®ª 
; LD HL,bufer ; ¡ãä¥à ¤«¨­®© 256 ¡ ©â ¤«ï à §¬¥é¥­¨ï ᯨ᪠
; ; ¡ãä¥à ¤®«¦¥­ ¡ëâì ¤«¨­®© ­  ¥¤¨­¨æã ¡®«ìè¥ ç¨á« 
; ; áâà ­¨æ ¢ ¡«®ª¥
; LD C,0C5h ; ­®¬¥à ä㭪樨
; RST ToBIOS ; NC -> HL - â®â ¦¥ ¡ãä¥à, B - ç¨á«® áâà ­¨æ ¢ ¡«®ª¥
; ; ¤ ­­ë¥ ¯®  ¤à¥áã HL - ᯨ᮪ 䨧¨ç¥áª¨å áâà ­¨æ ¯®
; ; ¯®à浪ã. ‘¯¨á®ª § ª ­ç¨¢ ¥âáï ¡ ©â®¬ FF
; ; CF -> ­¥¢¥à­ë© ¨¤¥­â¨ä¨ª â®à ¡«®ª . ‘â à ï
; ; ¨­ä®à¬ æ¨ï ¢ ¡ãä¥à¥ ¬®¦¥â ¡ëâì § â¥àâ 
JP C,EXIT.error.wrongMEMblkID
;-------------[]
;-------------[]
XOR A
.loop: PUSH AF
LD C,BIOS.GET_RAMD_ST
RST ToBIOS ; ¯®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª , ­ §­ ç¥­­®£® ­  RAM-Disk
AND A
JR Z,.loopExit
POP AF
INC A
CP 16
JP NZ,.loop
JP EXIT.error.noFreeRAMdsk
.loopExit:
POP AF
;-------------[.]
; .
; .
;-------------[.]
; A = ram_disk number from BIOS.GET_RAMD_ST
.BlockID+*: LD HL,0
LD B,L
LD C,BIOS.BLK_TO_RAMD
RST ToBIOS
; ; «î¡®© ¡«®ª ¯ ¬ï⨠¬®¦¥â ᮤ¥à¦ âì ¤ ­­ë¥
; ; RAM-Disk-  ¢ ä®à¬ â¥ TR-DOS ¤«ï ¯®¤ª«î祭¨ï íâ¨å
; ; ¤ ­­ëå ¢ ª ç¥á⢥ ¤¨áª  ¨ á«ã¦¨â íâ  äã­ªæ¨ï
; LD A,ram_disk ; ­®¬¥à RAM-Disk-  0..15 - ᮮ⢥âáâ¢ã¥â
; ; RAM-Disk- ¬ ®â e: ¤® t:
; LD B,id_blk ; ¨¤¥­â¨ä¨ª â®à ¡«®ª 
; LD C,0C9h ; ­®¬¥à ä㭪樨
; RST ToBIOS ; NC -> ­®à¬ «ì­®¥ § ¢¥à襭¨¥
; ; CF -> ®è¨¡ª : ­¥¢¥à­ë© ­®¬¥à RAM-Disk-  ¨«¨
; ; RAM-Disk § ­ïâ
JR C,EXIT.error.wrongRAMdrv
;-------------[]
;—⥭¨¥ ®¡à §  ¢ ¯ ¬ïâì à ¬¤¨áª 
;-------------[]
LD A,(key_buff.FM)
LD HL,0
LD IX,0
LD B,Dss.Move_FP.FrStart
LD C,Dss.Move_FP
RST ToDSS
IN A,(SLOT3)
LD (.SavePage),A
.RamPagesNum+*: LD B,0
LD HL,PagesBuffer
LD C,Dss.Read
;;;;!TODO ᤥ« âì ®¡é¥© ¯à®æ¥¤ãன
.LOOP: PUSH BC
PUSH HL
LD A,(HL)
OUT (SLOT3),A
LD A,(key_buff.FM)
LD HL,#C000
LD DE,#4000
;LD C,Dss.Read
RST ToDSS
; A - ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
; HL -  ¤à¥á ¢ ¯ ¬ïâ¨
; DE - ª®«¨ç¥á⢮ ç¨â ¥¬ëå ¡ ©â
POP HL
POP BC
JR C,EXIT.error.readFile
INC HL
DJNZ .LOOP
;;;;
.SavePage+*: LD A,0
OUT (SLOT3),A
LD C,Dss.RescanDrives
RST ToDSS
LD A,(key_buff.FM)
LD C,Dss.Close
RST ToDSS
;!TODO check error?
; JP EXIT.good
;-------------[]
;-------------[]
MODULE EXIT
good: LD B,DSS_Error.sys.NO_ERROR
LD HL,messages.good
printANDexit: PUSH BC
LD C,Dss.PChars
RST ToDSS
POP BC
.loop: LD C,Dss.Exit
RST ToDSS
JR .loop
help: LD HL,messages.help
LD B,DSS_Error.sys.NO_ERROR
JP printANDexit
error:
.writeFile: LD B,DSS_Error.sys.WRITE_ERROR
LD HL,messages.writeFile
JP printANDexit
.WrongKeys: LD B,DSS_Error.sys.GENERAL_FAILURE
LD HL,messages.WrongKeys
JP printANDexit
.UNDEFINED: LD B,DSS_Error.sys.GENERAL_FAILURE
LD HL,messages.UNDEFINED
JP printANDexit
.noRAM: LD B,DSS_Error.sys.NOT_ENOUGH_MEMORY
LD HL,messages.noRAM
JP printANDexit
.wrongMEMblkID: LD B,DSS_Error.sys.INVALID_MEMORY_HND
LD HL,messages.wrongMEMblkID
JP printANDexit
.wrongRAMdrv: LD B,DSS_Error.sys.INVALID_DRIVE
LD HL,messages.wrongRAMdrv
JP printANDexit
.readFile: LD B,DSS_Error.sys.READ_ERROR
LD HL,messages.readFile
JP printANDexit
.noFreeRAMdsk: LD B,DSS_Error.sys.GENERAL_FAILURE
LD HL,messages.noFreeRAMdsk
JP printANDexit
;
messages:
.good: DZ "\r\n All Done. Good luck)))\r\n"
.noRAM: DZ "\r\n ERROR! No enough memory.\r\n"
.wrongMEMblkID: DZ "\r\n ERROR! Invalid Memory block ID.\r\n"
.wrongRAMdrv: DZ "\r\n ERROR! Invalid RAM disk ID or RAM disk busy.\r\n"
.readFile: DZ "\r\n ERROR! Unable to read disk image file.\r\n"
.writeFile: DZ "\r\n ERROR! Unable to write disk image to file.\r\n"
.noFreeRAMdsk: DZ "\r\n ERROR! The number of RAM disks in use has reached its maximum.\r\n"
.WrongKeys: DZ "\r\n ERROR! Wrong key combination.\r\n"
.help: DZ "\r\n HELP MESSAGE IN PROGRESS\r\n" ;!TODO
.UNDEFINED: DZ "\r\n Undefined error: SET_KEYS\r\n" ;!TODO
;.test DZ "1234567890-1234567890-1234567890-1234567890"
;.help: DZ " HELP MESSAGE IN PROGRESS\r\n" ;!TODO
ENDMODULE
;-------------[]
dss_line: DW 0
;*******************************************************
; ____ _ _
; / ___| ___| |_ | | _____ _ _ ___
; \___ \ / _ \ __| | |/ / _ \ | | / __|
; ___) | __/ |_ | < __/ |_| \__ \
; |____/ \___|\__| |_|\_\___|\__, |___/
; |___/
; <20>®«ãç ¥¬ ª«îç¨ § ¯ã᪠, à á¯¨å¨¢ ¥¬ ¨å ¯® 㣫 ¬,
; ­ áâà ¨¢ ¥¬ ­ ç «ì­ë¥ ãá«®¢¨ï à ¡®âë.
;-----------------;
key_buff:
.U: DB 0 ; unmount
.M: DB 0 ; mount
.S: DB 0 ; save ramdisk
.FM: DB 0 ; File Manipulator
.DRV: DB #FF ; ­®¬¥à à ¬¤¨áª  ¤«ï unmount
.DRVsave: DB #FF ; ­®¬¥à à ¬¤¨áª  ¤«ï SAVE
;-----------------;
Set_keys: LD HL,(dss_line)
INC HL
LD (.NextParam),HL
.CheckChar: CALL .GetParam
;JR NC,.next
CCF
RET NC ; <20> §¡®à ®ª®­ç¥­.
.next: LD A,(Buffer+2) ; ®á­®¢­®¬ 横«¥ CheckChar ¬ë ¦¤ñ¬ ⮫쪮 ¤¢ 
ADD #FF ; ᨬ¢®«  ¢ ª«îç¥. <20>®í⮬㠥᫨ ¨å ¡®«ìè¥,
RET C ; â® ¢ë室¨¬ á ®è¨¡ª®©.
LD A,(Buffer)
SUB '/'
SCF
RET NZ
; <20>஢¥àª /ãáâ ­®¢ª  ª«îç 
LD HL,key_buff ; ­ ç «® åà ­¥­¨ï ª«î祩
LD E,L ; ¤«ï ¯à®¢¥àª¨ ­  ª«îç U
LD A,(Buffer+1)
AND %11011111 ; ¤¥« ¥¬ ¬ «¥­ìª¨© ᨬ¢®« ¡®«ì訬)))
CP 'U' ; ¯à®¢¥à塞 ¯ à ¬¥âà mount image
JR Z,.set_key
INC HL ; á«¥¤ãî騩 ª«îç
CP 'M' ; ¯à®¢¥à塞 ¯ à ¬¥âà unmount image
JR Z,.set_key
INC HL ; á«¥¤ãî騩 ª«îç
CP 'S' ; ¯à®¢¥à塞 ¯ à ¬¥âà save image
JR Z,.set_key
SCF ; ®è¨¡ª  ¢ ¯ à ¬¥âà¥
RET ; ¢ë室 á ®è¨¡ª®©
;-----------------;
;-----------------;
.set_key: LD A,(HL) ; ¯à®¢¥à塞 ­¥ ãáâ ­®¢«¥­ «¨ ª«îç.
ADD #FF ; ¥á«¨ ¥áâì, §­ ç¨â ª«îç ¢¢¥¤ñ­ 2 à § 
RET C ; ®è¨¡ª  - ¯®¢â®à ª«îç . ¢ë室
INC (HL) ; <20>ਧ­ ª ãáâ ­®¢ª¨ ª«îç  - ­¥ ­®«ì. “áâ ­®¢¨«¨ ª«îç.
LD A,L
SUB E ; ¤«ï ¯à®¢¥àª¨ ­  ª«îç U
LD (.save_a),A
CALL .GetParam ; ¯®«ãç ¥¬ á«¥¤ãî騩 ¯ à ¬¥âà áâப¨ DOS ª ­ ©¤¥­®¬ã ª«îçã
RET C ; ¢ë室, ¥á«¨ ®è¨¡ª 
XOR A
.save_a+*: OR 0
JR NZ,.file_key
CALL .GetDRVnum
RET C
LD (key_buff.DRV),A ; á®å࠭塞 ­®¬¥à à ¬¤¨áª  ¤«ï BIOS.FreeMemRMD
JP .CheckChar ; ¯®£­ «¨ ­  á«¥¤ãî騩 ¢¨â®ª à §¡®à  ª«î祩
/*
.save_a+*: LD A,0
XOR 2
JR Z,.key_save
XOR 2
JR NZ,.file_key
;unmount key
CALL .GetDRVnum
;!TODO error number
RET C
LD (key_buff.DRV),A ; á®å࠭塞 ­®¬¥à à ¬¤¨áª  ¤«ï BIOS.FreeMemRMD
;--------------------
JP .CheckChar ; ¯®£­ «¨ ­  á«¥¤ãî騩 ¢¨â®ª à §¡®à  ª«î祩
.key_save:
CALL .GetDRVnum
RET C
LD (key_buff.DRVsave),A ; á®å࠭塞 ­®¬¥à à ¬¤¨áª  ¤«ï BIOS.FreeMemRMD
*/
;!FIXIT
.file_key:
LD HL,Buffer
LD A,(key_buff.M)
AND A
JR Z,.noRD
CALL .OpenRDfile ; Žâªàë⨥ ä ©«  (¨«¨ ¯à®¢¥àª  ­ «¨ç¨ï) ¯® ¨¬¥­¨ ¨§ ¡ãä¥à 
RET C ; ¢ë室, ¥á«¨ ®è¨¡ª 
JP .CheckChar ; ¯®£­ «¨ ­  á«¥¤ãî騩 ¢¨â®ª à §¡®à  ª«î祩
.noRD: CALL .OpenWRfile
RET C ; ¢ë室, ¥á«¨ ®è¨¡ª 
LD A,(key_buff.DRVsave)
INC A
JP NZ,.CheckChar
LD HL,(.NextParam)
INC HL
LD A,(HL)
CP ':'
JP NZ,.CheckChar
CALL .GetParam
CCF
RET NC
CALL .GetDRVnum
RET C
LD (key_buff.DRVsave),A ; á®å࠭塞 ­®¬¥à à ¬¤¨áª  ¤«ï save ram drive
JP .CheckChar ; ¯®£­ «¨ ­  á«¥¤ãî騩 ¢¨â®ª à §¡®à  ª«î祩
;-----------------;
;-----------------;
.GetParam:
.NextParam+1: LD HL,0
LD DE,Buffer ; ¡ãä¥à ¤«ï ®¯¥à æ¨© á® áâப ¬¨
LD C,Dss.GSwitch ; âã⠢뤥«ï¥¬ ¯ à ¬¥âà § ¯ã᪠
RST #10 ; ¯®«ãç ¥¬ ¢ ¡ãä¥à¥ á«¥¤ãî騩 ¯ à ¬¥âà
LD (.NextParam),HL
LD A,(Buffer)
AND A
RET NZ ; <20>®à¬ «ì­ë© ¢®§¢à â C = 0
SCF
RET ; ‚®§¢à â á ®è¨¡ª®© C = 1
;-----------------;
;-----------------;
.OpenRDfile: LD BC,Dss.EX_Path.GET_ALL * 256 + Dss.EX_Path ; ¯à®¢¥à塞 ¡ãä¥à ­  ª®à४⭮áâì ¨¬¥­¨ ä ©« 
RST ToDSS
RET C ; ®è¨¡ª  ¢ áâப¥
AND %00000011 ; ¯à®¢¥à塞, çâ® ¥áâì ¨¬ï ¨
XOR %00000011 ; à áè¨à¥­¨¥ ä ©«  (0 ¨ 1 ¡¨âë)
SCF
RET NZ ; ®è¨¡ª  ä ©«  - ¢ë室
LD A,Dss.Open.R
LD HL,Buffer
LD C,Dss.Open
RST 10h ; ®âªàë⨥ ä ©« 
LD (key_buff.FM),A ; á®å࠭塞 ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
RET
;
.OpenWRfile: XOR A ;LD A,FileAttrib.Normal
LD C,Dss.Create
RST ToDSS
LD (key_buff.FM),A ; á®å࠭塞 ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
RET
;-----------------;
.GetDRVnum: LD HL,Buffer+2
LD (HL),'\'
INC HL
LD (HL),0
EX DE,HL
LD HL,Buffer
LD B,Dss.EX_Path.GET_DRIVE
LD C,Dss.EX_Path ; âãâ ®¯à¥¤¥«ï¥¬ ¨¬ï ¤¨áª  «¨ ¢ ¡ãä¥à¥
RST ToDSS ; ¯®«ãç ¥¬ ¢ € «®£¨ç¥áª¨© ­®¬¥à ¤¨áª 
RET C
LD BC,0*256 + 8
LD DE,#55AA
RST #18 ; ¨§ «®£¨ç¥áª®£® ¢ 䨧¨ç¥áª¨© ­®¬¥à ¤¨áª 
EX AF,AF'
LD C,A
AND #F0
XOR #60
SCF
RET NZ
LD A,C
AND #0F
RET
;-----------------;
;*******************************************************
Loader_length EQU $-BEGIN
;!FIXIT
PagesBuffer EQU $
Buffer EQU PagesBuffer+256
;----------------------------------------------[End Code section]
STACK_CHECK_MACRO stack_point, (stack_buffer+256)
;----------------------------------------------[Data after Loader]
/*
;-----------------------------------------------------------------------;
Test: LD (dss_line),IX ; ‘®å࠭塞 㪠§ â¥«ì ­  áâப㠧 ¯ã᪠.
LD A,(IX) ; âãâ DSS ª« ¤ñâ ¤«¨­ã ¯ à ¬¥â஢ ª®¬.áâப¨
AND A ; ¯à®¢¥à塞 ­  ®âáãâá⢨¥ ¯ à ¬¥â஢
JP NZ,1F ; § ¯ã᪠ ¢ ª®¬.áâப¥. …᫨ ¨å ­¥â,
LD HL,Help_Msg ; â® ¯¥ç â ¥¬ ¨­áâàãªæ¨î ¨ ¢ë室¨¬
CALL PrintStr ; ¨§ ¯à®£à ¬¬ë á ­®à¬ «ì­ë¬ ª®¤®¬
LD B,0 ; § ¢¥à襭¨ï.
JP Exit ;
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
GetParam: LD HL,(NextParameter) ;
LD C,43h ; âã⠢뤥«ï¥¬ ¯ à ¬¥âà § ¯ã᪠
LD DE,Buffer ; ¡ãä¥à ¤«ï ®¯¥à æ¨© á® áâப ¬¨
RST #10 ; ¯®«ãç ¥¬ ¢ ¡ãä¥à¥ á«¥¤ãî騩 ¯ à ¬¥âà
ld (NextParameter),hl ;
CCF ;
LD A,(Buffer) ;
AND A ;
RET NZ ; <20>®à¬ «ì­ë© ¢®§¢à â C = 0
SCF ;
RET ; ‚®§¢à â á ®è¨¡ª®© C = 1
;-----------------------------------------------------------------------;
LD HL,COMLINE ;HL 㪠§ë¢ ¥â ­  ª®¬ ­¤­ãî áâபã
.loop: LD DE,BUFFER ;DE 㪠§ë¢ ¥â ­  ¡ãä¥à ¤«ï ¯ à ¬¥â஢
LD C,43h ;”ã­ªæ¨ï ¢ë¤¥«¥­¨ï ¯ à ¬¥âà 
RST 10h ;‚믮«­¥­¨¥ ä㭪樨
PUSH AF
PUSH HL
POP HL
POP AF
JP NC,.loop
LD A,(BUFFER)
AND A
JR NZ,NEXTP
*/