mirror of
https://github.com/Tolik-Trek/MountIMA.git
synced 2026-06-15 01:11:34 +03:00
686 lines
24 KiB
NASM
686 lines
24 KiB
NASM
;
|
||
;
|
||
; !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
|
||
*/ |