MountIMA/mountima.asm

686 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 App_EXE_Version 1
; 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
Loader_length EQU 0
;-------------[]
; 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 (dss_line),IX ; ‘®å࠭塞 㪠§ â¥«ì ­  áâப㠧 ¯ã᪠.
LD HL,EXIT.messages.start
LD C,Dss.PChars
RST ToDSS
LD C,Dss.CurDisk
RST ToDSS
LD A,'A'
ADD A,C
LD (EXIT.messages.ramDrive),A
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: XOR A ;LD A,FileAttrib.Normal
LD HL,SaveName
LD C,Dss.Create
RST ToDSS
JP C,EXIT.error.writeFile
LD (key_buff.FM),A ; á®å࠭塞 ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
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 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
JP ToDSS
;-------------[]
;-------------[]
RMD_MOUNT: LD A,(key_buff.FM)
LD HL,0
LD IX,0
LD BC,Dss.Move_FP.FrEnd
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 § ­ïâ
JP C,EXIT.error.wrongRAMdrv
;-------------[]
;—⥭¨¥ ®¡à §  ¢ ¯ ¬ïâì à ¬¤¨áª 
;-------------[]
LD A,(key_buff.FM)
LD HL,0
LD IX,0
LD BC,Dss.Move_FP.FrStart
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?
JR EXIT.mounted
;-------------[]
;-------------[]
MODULE EXIT
good: LD HL,messages.good
LD B,DSS_Error.sys.NO_ERROR
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
JR printANDexit
mounted: LD HL,OpenName
LD C,Dss.PChars
RST ToDSS
LD HL,messages.mounted
LD B,DSS_Error.sys.NO_ERROR
JR printANDexit
error:
.writeFile: LD B,DSS_Error.sys.WRITE_ERROR
LD HL,messages.writeFile
JR printANDexit
.WrongKeys: LD B,DSS_Error.sys.COMMON_ERROR
LD HL,messages.WrongKeys
JR printANDexit
.UNDEFINED: LD B,DSS_Error.sys.COMMON_ERROR
LD HL,messages.UNDEFINED
JR printANDexit
.noRAM: LD B,DSS_Error.sys.NOT_ENOUGH_MEMORY
LD HL,messages.noRAM
JR printANDexit
.wrongMEMblkID: LD B,DSS_Error.sys.INVALID_MEMORY_HND
LD HL,messages.wrongMEMblkID
JR printANDexit
.wrongRAMdrv: LD B,DSS_Error.sys.INVALID_DRIVE
LD HL,messages.wrongRAMdrv
JR printANDexit
.readFile: LD B,DSS_Error.sys.READ_ERROR
LD HL,messages.readFile
JR printANDexit
.noFreeRAMdsk: LD B,DSS_Error.sys.COMMON_ERROR
LD HL,messages.noFreeRAMdsk
JR printANDexit
;
;
messages:
.start: DB "\r\nMountima v"
.verNum: DB "0.25 beta. (c) Tolik_Trek@SprinterTeam, "
.year: DZ "2026.\r\n"
;
.mounted: DB " mounted to RAM drive "
.ramDrive: DZ "Z:\r\n"
;
.good: DZ "Done.\r\n"
.noRAM: DZ "ERROR! No enough memory.\r\n"
.wrongMEMblkID: DZ "ERROR! Invalid Memory block ID.\r\n"
.wrongRAMdrv: DZ "ERROR! Invalid RAM disk ID or RAM disk busy.\r\n"
.readFile: DZ "ERROR! Unable to read disk image file.\r\n"
.writeFile: DZ "ERROR! Unable to write disk image to file.\r\n"
.noFreeRAMdsk: DZ "ERROR! The number of RAM disks in use has reached its maximum.\r\n"
.WrongKeys: DZ "ERROR! Wrong key combination.\r\n"
.help: DB "Mountima Help:\r\n"
DB " /M - Mounts IMG file to RAM drive.\r\n"
DB " /U - Unmounts RAM drive.\r\n"
DB " /S - Saves RAM drive to IMG file.\r\n"
DB "Examples:\r\n"
DB ' mountima.exe /M c:\images\image.img', "\r\n"
DB ' mountima.exe /U e:', "\r\n"
DZ ' mountima.exe /S c:\images\image.img e:',"\r\n"
.UNDEFINED: DZ "Undefined error: SET_KEYS\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+1: 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
*/
.file_key: LD A,(key_buff.M)
AND A
JR Z,.noRD
LD HL,Buffer
CALL .OpenRDfile ; Žâªàë⨥ ä ©«  (¨«¨ ¯à®¢¥àª  ­ «¨ç¨ï) ¯® ¨¬¥­¨ ¨§ ¡ãä¥à 
RET C ; ¢ë室, ¥á«¨ ®è¨¡ª 
JP .CheckChar ; ¯®£­ «¨ ­  á«¥¤ãî騩 ¢¨â®ª à §¡®à  ª«î祩
.noRD: LD HL,(.NextParam) ; ¯à®¢¥àª , çâ® ¥áâì á«¥¤ãî騩 ¯ à ¬¥âà
LD A,H
OR L
SCF
RET Z
;
LD HL,Buffer
LD BC,256
XOR A
CPIR
JP PE,.yes_filename
SCF
RET
;
.yes_filename: LD DE,Buffer
SBC HL,DE
SCF
RET Z
;
LD B,H
LD C,L
EX DE,HL
LD DE,SaveName
LDIR
LD HL,(.NextParam)
INC HL
LD A,(HL)
CP ':'
SCF
RET NZ
CALL .GetParam
CCF
RET NC
CALL .GetDRVnum
RET C
LD (key_buff.DRVsave),A ; á®å࠭塞 ­®¬¥à à ¬¤¨áª  ¤«ï save ram drive
RET
;-----------------;
;-----------------;
.GetParam:
.NextParam+1: LD HL,0
LD DE,Buffer ; ¡ãä¥à ¤«ï ®¯¥à æ¨© á® áâப ¬¨
LD C,Dss.GSwitch ; âã⠢뤥«ï¥¬ ¯ à ¬¥âà § ¯ã᪠
RST ToDSS ; ¯®«ãç ¥¬ ¢ ¡ãä¥à¥ á«¥¤ãî騩 ¯ à ¬¥âà
LD (.NextParam),HL
LD A,(Buffer)
AND A
RET NZ ; <20>®à¬ «ì­ë© ¢®§¢à â C = 0
LD HL,0 ; Œ àª¥à ª®­æ  à §¡®à 
LD (.NextParam),HL
SCF
RET ; ‚®§¢à â á ®è¨¡ª®© C = 1
;-----------------;
;-----------------;
.OpenRDfile: LD BC,Dss.EX_Path.GET_ALL ; ¯à®¢¥à塞 ¡ãä¥à ­  ª®à४⭮áâì ¨¬¥­¨ ä ©« 
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 ToDSS ; ®âªàë⨥ ä ©« 
LD (key_buff.FM),A ; á®å࠭塞 ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
RET C
;
LD HL,Buffer
LD DE,OpenName ; ¡ãä¥à (13 ¡ ©â)
LD BC,Dss.EX_Path.GET_NAME ; B=3, C=#45
RST ToDSS ; CF=0: A - १ã«ìâ â, ¡ãä¥à - "FILE.EXT",0
RET
;-----------------;
.GetDRVnum: LD HL,Buffer+2
LD (HL),'\'
INC HL
LD (HL),0
EX DE,HL
LD HL,Buffer
LD BC,Dss.EX_Path.GET_DRIVE ; âãâ ®¯à¥¤¥«ï¥¬ ¨¬ï ¤¨áª  «¨ ¢ ¡ãä¥à¥
RST ToDSS ; ¯®«ãç ¥¬ ¢ € «®£¨ç¥áª¨© ­®¬¥à ¤¨áª 
RET C
LD BC,0*256 + 8
LD DE,#55AA
RST ToDSS.DRV ; ¨§ «®£¨ç¥áª®£® ¢ 䨧¨ç¥áª¨© ­®¬¥à ¤¨áª 
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
SaveName EQU Buffer+256
OpenName EQU SaveName+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 ToDSS ; ¯®«ãç ¥¬ ¢ ¡ãä¥à¥ á«¥¤ãî騩 ¯ à ¬¥âà
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 ToDSS ;‚믮«­¥­¨¥ ä㭪樨
PUSH AF
PUSH HL
POP HL
POP AF
JP NC,.loop
LD A,(BUFFER)
AND A
JR NZ,NEXTP
*/