From 3a5f267f9afbdb9f715561caaf262fe4e615ba12 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 17 Jan 2025 23:41:59 +1000 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=B0=D0=BA=D0=B0=D1=8F-=D1=82=D0=BE=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=83=D0=B6=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=B8=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CDX.ASM | 524 ++++++++++++++++++++ CDX.TXT | 7 + CMDPARSE.ASM | 89 ++++ COMMAND.ASM | 942 ++++++++++++++++++++++++++++++++++++ Cd_dos.asm | 1220 +++++++++++++++++++++++++++++++++++++++++++++++ Shared_Includes | 1 + 6 files changed, 2783 insertions(+) create mode 100644 CDX.ASM create mode 100644 CDX.TXT create mode 100644 CMDPARSE.ASM create mode 100644 COMMAND.ASM create mode 100644 Cd_dos.asm create mode 160000 Shared_Includes diff --git a/CDX.ASM b/CDX.ASM new file mode 100644 index 0000000..7b6b835 --- /dev/null +++ b/CDX.ASM @@ -0,0 +1,524 @@ +;[BEGIN] +; +; CDX.EXE [command] [-switches] [directory] +; +;commands: +; OPEN +; EJECT +; CLOSE +; COPY +; LIST +; DUMP +; COMMAND +; -h,? Help page + + DEFINE _MAME 1 + + +CR EQU 13 +LF EQU 10 + + INCLUDE "Shared_Includes/constants/BIOS_equ.inc" + INCLUDE "Shared_Includes/constants/dss_equ.inc" + INCLUDE "Shared_Includes/constants/Sp2000.inc" + + + ORG #8100-22 + + DB "EXE" ;EXE ID + DB #00 ;EXE VERSION + DW #0016 ;CODE OFFSET LOW + DW #0000 ;CODE OFFSET HIGH + DW #0000 ;END-BEG ;PRIMARY LOADER + DW #0000 ; + DW #0000 ;RESERVED + DW #0000 ; + DW START ;LOAD ADDRESS + DW START ;START ADDRESS + DW #BFFF ;STACK ADDRESS + ;DS 490 + +START: PUSH IX + ; + XOR A + ; + ; LD HL,BUF1 + ; LD (HL),A + ; LD DE,BUF1+1 + ; LD BC,BUFFERS_END-1 + ; LDIR + ; + LD HL,'\' ; + LD (DIRSPEC),HL + ; + LD HL,BUF1 + LD B,BUFERS_NUMBER +.initBuffersLoop: + LD (HL),A + INC H + DJNZ .initBuffersLoop + ; + + LD A,MSG_HELLO + CALL MESSAGE + ; + CALL INIT + JR NC,.next + ; + LD HL,PRM1 + LD (HL),0 + LD A,MSG_NO_CDROM + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + ; +.next: LD C,Dss.Version + RST ToDSS ;GET DSS VERSION + EX DE,HL + AND A + LD DE,#0146 ;1.70 + SBC HL,DE ;CHECK DSS VERSION + POP HL + ; + JP C,OLD_DSS + LD IX,BUF_PTRS + CALL EX_COMMAND_LINE + + CALL MALLOC + JR C,QUIT + + ;CALL FIND_CDROM + LD A,(STOPMODE) + OR A + CALL Z,COMMAND + + CALL MDEALLOC +QUIT: CALL CRLF +.loop: LD BC,Dss.Exit + RST ToDSS + JP .loop + +OLD_DSS + LD A,MSG_OLD_DSS + CALL MESSAGE + JR QUIT + +HNDMEM DB #FF + +MALLOC + LD BC,2*256 + Dss.GetMem + RST ToDSS + JR NC,M_ALLOK + LD A,MSG_MEMERROR + CALL MESSAGE + SCF + RET +M_ALLOK + LD (HNDMEM),A + LD BC,1*256 + Dss.SetWin3 + RST ToDSS + LD HL,BANKTBL + LD C,BIOS.GetMemBlkPages + LD A,(HNDMEM) + JP ToBIOS + +MDEALLOC + LD A,(HNDMEM) + LD C,Dss.FreeMem + JP ToDSS + +; FIND_CDROM +; LD IX,DEV_CFG +; LD C,BIOS.DRV_LIST +; RST ToBIOS +; LD A,(IX+3) ;CDROM +; OR A +; JR Z,W_O_CD +; LD A,(CDDRIVE) +; INC A +; RET NZ +; LD A,SLAVE ;DEFAULT +; LD (CDDRIVE),A +; RET +; W_O_CD LD A,MSG_NO_CDROM +; CALL MESSAGE +; LD A,1 +; LD (STOPMODE),A +; SCF +; RET + +;BUF_PRINT +; LD HL,BUF_PTRS +;BUF_PL LD E,(HL) +; INC HL +; LD D,(HL) +; INC HL +; LD A,D +; OR E +; RET Z +; PUSH HL +; EX DE,HL +; LD C,Dss.PCHARS +; RST ToDSS +; CALL CRLF +; POP HL +; JR BUF_PL + +;OPEN_FILE +; LD HL,FILENAME +; XOR A +; LD C,Dss.OPEN +; RST ToDSS +; LD (FILEHND),A +; RET NC +; LD HL,FILENAME +; CALL PUTVAR +; LD A,MSG_CANT_OPEN +; CALL MESSAGE +; SCF +; RET + +;CLOSE_FILE +; LD A,(FILEHND) +; LD C,Dss.CLOSE +; RST ToDSS +; RET + +INIT: XOR A + LD (STOPMODE),A + DEC A + LD (CDDRIVE),A + ; + LD BC,+(#C0-1)*256 + BIOS.DRV_DETECT +.loop: INC B + LD A,B + CP #C4 + SCF + RET Z + PUSH BC + RST ToBIOS + POP BC + JR C,.loop + LD A,B + LD (CDDRIVE),A + RET + ; + ; LD C,BIOS.DRV_RESET + ; JP ToBIOS +; RET + +;VARIABLES + +; FILENAME DS 256 +; FILEHND DB #FF + +STOPMODE DB #00 + + INCLUDE "cmdparse.asm" + INCLUDE "command.asm" + INCLUDE "cd_dos.asm" + +CRLF: PUSH HL + LD HL,MSG0.crlf + LD C,Dss.PChars + ; LD A,#0D + ; LD C,Dss.PutChar + ; RST #10 + ; LD A,#0A + ; LD C,Dss.PutChar + RST ToDSS + POP HL + RET +; + +ERROR: CP MAX_DSS_ERR + LD E,A + LD D,0 + JR C,.ERR_MSG + LD E,D + ;JP .ERR_MSG + ; +.ERR_MSG: PUSH DE + LD HL,ERRCDX + CALL PRINTZ + POP DE + CALL FMESAGE + CALL PRINTZ + CALL CRLF + JP CRLF + + +FMESAGE INC DE + LD HL,ERR0 + LD BC,ERR0.Size +LCPIR XOR A + CPIR + RET PO + RET NZ + DEC DE + LD A,D + OR E + JP NZ,LCPIR + RET + +MAX_DSS_ERR EQU 33 + +ERRCDX DB "CDX: ",0 + + include 'Shared_includes/constants/dss_errors.z80' +; ERR0 DB #00 +; DB "Unknown error",0 +; DB "Invalid function",0 +; DB "Invalid drive number",0 +; DB "File not found",0 +; DB "Path not found",0 +; DB "Invalid handle",0 +; DB "Extended error 6",0 +; DB "File exist",0 +; DB "File read only",0 +; DB "Root overflow",0 +; DB "No free space",0 +; DB "Directory not empty",0 +; DB "Can't delete current directory",0 +; DB "Invalid media",0 +; DB "Unknown operation",0 ;R02 +; DB "Directory exist",0 +; DB "Invalid filename",0 +; DB "Invalid EXE-file",0 +; DB "Not supported EXE-file",0 +; DB "Access denied",0 +; DB "Not ready",0 +; DB "Seek error",0 +; DB "Sector not found",0 +; DB "CRC error",0 +; DB "Write protect",0 +; DB "Read error",0 +; DB "Write error",0 +; DB "Drive failure",0 +; DB "Extended error 28",0 +; DB "Extended error 29",0 +; DB "No free memory",0 +; DB "Invalid memory block",0 +; DB "Extended error 32",0 +; DB "Extended error 33",0 +; DB "Extended error 34",0 +; DB "35",0 +; DB "36",0 +; DB "37",0 +; DB "38",0 +; DB "39",0 +; DB "40",0 +; DB "41",0 +; DB "42",0 +; DB "43",0 +; DB "44",0 +; DB "45",0 +; DB "46",0 +; DB "47",0 +; DB "48",0 +; DB "49",0 +; DB "50" +; DB 0 +; ERR1 + +;FIND_MESSAGE + ; LD E,A + ; LD D,0 + ; CALL MESAGE + ; RET +MESSAGE LD E,A + LD D,0 + CALL MESAGE + JP PRINTZ +; + +MESAGE INC DE + LD HL,MSG0 + LD BC,MSG1-MSG0 +LCPIR2 XOR A + CPIR + RET PO + RET NZ + DEC DE + LD A,D + OR E + JP NZ,LCPIR2 + RET + +PRINTZ LD A,(HL) + INC HL + OR A + RET Z + CP "%" + JR NZ,PRINTZ2 + LD A,(HL) + INC HL + SUB "1" + PUSH HL + LD L,A + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,PRM1 + ADD HL,BC + LD C,Dss.PChars + RST ToDSS + POP HL + JR PRINTZ +PRINTZ2 LD C,Dss.PutChar + RST ToDSS + JP PRINTZ + +PRINT_ LD BC,1*256 + BIOS.LP_PRINT_SYM + JP ToBIOS + +PUTVAR LD DE,PRM1 +PUTPRM LD BC,15 +PUTPRMA LD A,(HL) + LDI + RET PO + OR A + JR NZ,PUTPRMA + RET + +CDDRIVE DB #FF + +PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +MSG_HELLO EQU 0 +MSG_TRAY_OPEN EQU 1 +MSG_TRAY_CLOSE EQU 2 +MSG_USAGE EQU 3 +MSG_UNK_DEVICE_NUMBER EQU 4 +MSG_UNK_COMMAND EQU 5 +;MSG_DISABLED EQU 6 +;MSG_ENABLED EQU 7 +MSG_DONE EQU 6 ;8 +MSG_NO_CDROM EQU 7 ;9 +MSG_IO_ERROR EQU 8 ;10 +MSG_OLD_DSS EQU 9 ;11 +MSG_COPYFILE EQU 10 ;12 +MSG_DIRHEAD EQU 11 ;13 +MSG_DIRENTRY EQU 12 ;14 +MSG_MEMERROR EQU 13 ;15 +MSG_COPYTO EQU 14 ;16 +MSG_CD_READ_ERR EQU 15 ;17 +MSG_F_WRITE_ERR EQU 16 ;18 +MSG_FAILURE EQU 17 ;19 +MSG_ERR_DEST EQU 18 ;20 +MSG_COPYABORTED EQU 19 ;21 + +MSG0 BYTE 0 +;0 + BYTE "CDROM eXtension utility v1.01, 2023 (c) Sprinter Team",CR,LF + DZ "Type CDX.EXE -? for help.",CR,LF,CR,LF +;1 + DZ "Opening tray..." +;2 + DZ "Closing tray..." + ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 +;3 + BYTE ' Usage: CDX.EXE [-switches] [command] [param1] [param2]',CR,LF,CR,LF + BYTE 'Commands:',CR,LF + BYTE ' CDX.EXE OPEN - Open tray',CR,LF + BYTE ' CDX.EXE CLOSE - Close tray',CR,LF + BYTE ' CDX.EXE LIST [\cd_path\][pattern] - Show CDROM filelist',CR,LF + BYTE ' CDX.EXE COPY \source d:\destination\ - Copy file(s) from CDROM to another disk',CR,LF + BYTE ' CDX.EXE DUMP sector [offset] - Show sector dump from CDROM',CR,LF + BYTE CR,LF + BYTE 'Switches:',CR,LF + BYTE ' -1 CDROM installed as Primary IDE Master device',CR,LF + BYTE ' -2 CDROM installed as Primary IDE Slave device',CR,LF + BYTE ' -3 CDROM installed as Secondary IDE Master device',CR,LF + BYTE ' -4 CDROM installed as Secondary IDE Slave device',CR,LF + DZ ' -h,? Help page',CR,LF +;4 + DZ " Error: Unknown device number %1",CR,LF +;5 + DZ " Error: Unknown command: %1",CR,LF + ;6 + ;DZ "Disabled" + ;7 + ;DZ "Enabled" +;6 + DZ "Done!",CR,LF +;7 + DZ " Error: Can't find CDROM device %1",CR,LF +;8 + DZ " Error: I/O Error",CR,LF +;9 + DZ " Error: Need DSS version 1.70 or higher",CR,LF +;10 + DZ "Copying " +;11 + DZ "Directory of CDROM:" +;12 FILENAME EXT SIZE DATE TIME + DZ "%1 %2 %3 %4 %5",CR,LF +;13 + DZ " Error: Memory allocation error",CR,LF +;14 + DZ " to " +;15 + DZ " Error: Reading failure",CR,LF +;16 + DZ " Error: Writing failure",CR,LF +;17 + DZ "Failure!",CR,LF +;18 + DZ " Error: Can't open destination file",CR,LF +;19 + DZ "Copying aborted",CR,LF +;20 +.crlf: DZ CR,LF +;21 + BYTE 0 +MSG1 + +BUF_PTRS + DW BUF1,BUF2,BUF3,BUF4,0 + +;-------------------------------/BUFFERS\-------------------------------; +FF_STRUCT: + DB "12345678" + DB "123" + DB #00 + DW 0,0,0,0 +CDFPOSH DW 0 ;CLUSTER HIGH +CDFTIME DW 0 ;TIME +CDFDATE DW 0 ;DATE +CDFPOSL DW 0 ;CLUSTER +CDFSIZE DW 0,0 ;SIZE +CDFATTR DB #00 ;ATTR +CDFNAME DB "12345678123",0 +; +BUFFERS_START EQU $ + ;DS 256-($-FF_STRUCT) + +DIRSPEC: EQU FF_STRUCT+256 + ;DB '\',0 + ;DS 254 +BUF1 EQU DIRSPEC+256 +BUF2 EQU DIRSPEC+256+256 +BUF3 EQU DIRSPEC+256+256+256 +BUF4 EQU DIRSPEC+256+256+256+256 +ARGCBUF EQU DIRSPEC+256+256+256+256+256 +DUMPBUF EQU DIRSPEC+256+256+256+256+256+256 +BUFFERS_END EQU DUMPBUF+2048-BUFFERS_START +; +BUFERS_NUMBER EQU 6 +; + ASSERT (DUMPBUF+2048 < #C000), "NO FREE SPACE FOR BUFFERS" +;-----------------------------------------------------------------------; +DEV_CFG +;[END] diff --git a/CDX.TXT b/CDX.TXT new file mode 100644 index 0000000..92da5ac --- /dev/null +++ b/CDX.TXT @@ -0,0 +1,7 @@ + + CDROM eXtension utility version 1.01 + ------------------------------------------------ + + It's utility came for solving the problem with support CDROM in DSS ver 1.x. +It's allow browse and copy files that stored on your CD. Also utility has commands +for tray control. \ No newline at end of file diff --git a/CMDPARSE.ASM b/CMDPARSE.ASM new file mode 100644 index 0000000..0b23d08 --- /dev/null +++ b/CMDPARSE.ASM @@ -0,0 +1,89 @@ + +; HL - exe-prefix +; IX - pointers at work buffers +EX_COMMAND_LINE + INC HL +NEXTPR LD DE,ARGCBUF + LD BC,Dss.EX_Path.GSWITCH + RST ToDSS + PUSH AF + PUSH HL + LD A,(ARGCBUF) + OR A + JR Z,EOCL ;end of command line + CP "-" + JR Z,ITCKEY + CP "/" + JR Z,ITCKEY + LD HL,ARGCBUF + LD E,(IX+0) + LD D,(IX+1) + INC IX + INC IX + LD A,D + OR E + JR Z,CL_FAILURE +; LD A,1 +; LD (NAME_FLG),A +MOVNAME LD A,(HL) + LDI + OR A + JR NZ,MOVNAME +EOCL POP HL + POP AF + JR NC,NEXTPR + RET + +CL_FAILURE + POP HL + POP AF + RET + +ITCKEY: LD A,(ARGCBUF+1) + CP "5" + JR NC,.HELP + CP "1" + JR NC,.number + ; ERROR + LD HL,ARGCBUF+1 + CALL PUTVAR + LD A,MSG_UNK_DEVICE_NUMBER + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + JR EOCL + ; +.number:; + SUB A,'1' + OR #C0 + LD (CDDRIVE),A + LD C,BIOS.DRV_RESET + RST ToBIOS + JR NC,EOCL + ; + LD HL,ARGCBUF+1 + CALL PUTVAR + LD A,MSG_NO_CDROM + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + SCF + JR CL_FAILURE + ; +.HELP: LD A,MSG_USAGE + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + JR EOCL + + + +; MAS_CD: +; ;LD A,MASTER +; ;LD (CDDRIVE),A +; JR EOCL + +; SLA_CD: +; ;LD A,SLAVE +; ;LD (CDDRIVE),A +; JR EOCL diff --git a/COMMAND.ASM b/COMMAND.ASM new file mode 100644 index 0000000..ccd493d --- /dev/null +++ b/COMMAND.ASM @@ -0,0 +1,942 @@ + +COMMAND LD HL,BUF1 + LD A,(HL) + OR A + RET Z + DEC HL +SKIPSP INC HL + LD A,(HL) + CP 9 + JR Z,SKIPSP + CP " " + JR Z,SKIPSP +COMP01 LD D,H + LD E,L + XOR A + LD BC,255 + CPIR + LD A,254 + SUB C + LD C,A + LD HL,CMDLIST +COMP004 PUSH BC + PUSH DE +COMP000 LD A,(DE) + CP #61 + JP C,COMP001 + CP #7B + JP NC,COMP001 + SUB #20 +COMP001 CP (HL) + JP NZ,COMP002 + INC HL + INC DE + DEC C + JP NZ,COMP000 + XOR A + CP (HL) + JP NZ,COMP002 + POP BC + POP BC + LD A,(DE) + CP " " + JR NZ,NOSPC + INC DE +NOSPC INC HL + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + JP (HL) + +COMP002 XOR A + LD C,#FF + CPI + JP NZ,$-2 + INC HL + INC HL + POP DE + POP BC + LD A,(HL) + OR A + JP NZ,COMP004 + LD HL,BUF1 + CALL PUTVAR + LD A,MSG_UNK_COMMAND + CALL MESSAGE + SCF + RET + +CMDLIST DB "CLOSE",0 + DW CCLOSE + DB "COPY",0 + DW CCOPY + DB "DUMP",0 + DW CDUMP + DB "EJECT",0 + DW COPEN + DB "HELP",0 + DW CHELP + DB "LIST",0 + DW CDIR + DB "OPEN",0 + DW COPEN + DB "SECTORDUMP",0 + DW CDUMP + DB 0 + +CHELP: LD A,MSG_USAGE + JP MESSAGE + +CCLOSE: LD A,MSG_TRAY_CLOSE + CALL MESSAGE + LD A,(CDDRIVE) + LD BC,BIOS.DRV_EXTENDED.CD_Close + RST ToBIOS + LD A,MSG_DONE + JP MESSAGE + +COPEN: LD A,MSG_TRAY_OPEN + CALL MESSAGE + LD A,(CDDRIVE) + LD BC,BIOS.DRV_EXTENDED.CD_Eject + RST ToBIOS + LD A,MSG_DONE + JP MESSAGE + + +CCOPY: CALL CHANGEDISK + JR NC,.CH2OK + JP ERROR +.CH2OK: CALL EX_COPY_PARAM + LD HL,BUF2 + LD DE,FF_STRUCT + LD A,FAT_ATTR.NoDIRnoVolID + LD B,1 + CALL F_FIRST + JP C,ERROR +.COPIER: + CALL MAKECOPY + RET C + LD A,(COPYMODE) + BIT DSTFILE,A + RET NZ +; + LD C,Dss.ScanKey + RST ToDSS + JR Z,.NONSTOP + LD HL,#011B ;ESC + AND A + SBC HL,DE + JR NZ,.NONSTOP + LD A,MSG_COPYABORTED + CALL MESSAGE + SCF + RET +.NONSTOP: + LD DE,FF_STRUCT + CALL F_NEXT + JR NC,.COPIER + XOR A + RET + +; IFNOTFOUND +; CALL ERROR +; RET + +;IFOK +MAKECOPY: + LD A,(COPYMODE) + BIT SRCPATT,A + JR NZ,.WITH_SRC_PATT + BIT DSTFILE,A + JR NZ,.WITH_DST_FILE +.WITH_SRC_PATT: + LD HL,CDFNAME +.YCR1: LD A,(HL) + CP "A" + JR C,.NCR1 + CP "Z"+1 + JR NC,.NCR1 + ADD A,#20 + LD (HL),A +.NCR1: OR A + INC HL + JR NZ,.YCR1 +; + LD HL,CDFNAME + LD DE,(SRC_PUT_ADR) +.CZSL2: LD A,(HL) + LDI + OR A + JR NZ,.CZSL2 +; + LD A,(COPYMODE) + BIT DSTFILE,A + JR NZ,.WITH_DST_FILE +; + LD HL,CDFNAME + LD DE,(DST_PUT_ADR) +.CZSL1: LD A,(HL) + LDI + OR A + JR NZ,.CZSL1 +; +.WITH_DST_FILE: + LD HL,BUF3 + LD A,(CDFATTR) + LD C,Dss.Create + RST ToDSS + JR NC,.OFOK + LD A,MSG_ERR_DEST + CALL MESSAGE + SCF + RET + ; +.OFOK: LD (FHND),A + LD A,MSG_COPYFILE + CALL MESSAGE + LD HL,BUF2 + LD C,Dss.PChars + RST ToDSS + LD A,MSG_COPYTO + CALL MESSAGE + LD HL,BUF3 + LD C,Dss.PChars + RST ToDSS + LD A," " + LD C,Dss.PutChar + RST ToDSS + LD IX,FF_STRUCT + + LD E,(IX+LEN1) + LD D,(IX+LEN2) + LD (CL_SIZE),DE + LD E,(IX+LEN3) + LD D,(IX+LEN4) + LD (CH_SIZE),DE + + LD E,(IX+CLU1) + LD D,(IX+CLU2) + LD (CL_OFFSET),DE + LD E,(IX+CLU3) + LD D,(IX+CLU4) + LD (CH_OFFSET),DE +.CDCOPY_LOOP: + CALL RCDFSB ;!!!!! + JR C,.COPY_FAULT + CALL WDATAB + JR C,.COPY_FAULT + JR NZ,.CDCOPY_LOOP +; + LD DE,(CDFTIME) + LD BC,(CDFDATE) + CALL RMKTIME + LD A,(FHND) + LD C,Dss.Put_D_T ;COPY DATE AND TIME + RST ToDSS +; + LD A,(FHND) + LD C,Dss.Close + RST ToDSS + LD A,MSG_DONE + CALL MESSAGE + AND A + RET +.COPY_FAULT: + LD A,(FHND) + LD C,Dss.Close + RST ToDSS + SCF + RET + +EX_COPY_PARAM + LD HL,BUF2 ;SOURCE + LD BC,255 + XOR A + CPIR + DEC HL + EX DE,HL + LD HL,256 + AND A + SBC HL,BC + LD B,H + LD C,L + EX DE,HL + LD A,'\' ; + CPDR + INC HL + INC HL + LD (SRC_PUT_ADR),HL +; + LD HL,BUF2 + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + AND #80 + LD A,(COPYMODE) + SET SRCPATT,A + JR NZ,.NOPATSR + RES SRCPATT,A +.NOPATSR: + LD (COPYMODE),A + LD HL,BUF3 ;DESTINATION + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + AND #81 ;PATTERN & FILENAME + CP #01 ;IF FILENAME=1 AND PATTERN=0 + LD A,(COPYMODE) + SET DSTFILE,A + JR Z,.SINGC1 + RES DSTFILE,A +.SINGC1: + LD (COPYMODE),A + RET Z + LD HL,BUF3 + LD BC,255 + XOR A + CPIR ;MOVE TO END OF STRING + DEC HL ;MOVE TO ZERO-CHAR + DEC HL ;MOVE TO LAST CHAR + LD A,(HL) ;GET LAST CHAR + INC HL ;MOVE TO ZERO-CHAR + CP '\' ;IS IT BACKSLASH? + LD (DST_PUT_ADR),HL ;SAVE END ADDRESS + RET Z + LD A,'\' ; + LD (HL),A ;PUT BACKSLASH TO THE END OF STRING + INC HL ;MOVE TO THE NEW END OF STRING + LD (DST_PUT_ADR),HL ;SAVE END ADDRESS + LD (HL),0 ;PUT ZERO CHAR + RET + +DSTFILE EQU 0 ;SPECIFIED DESTINATION FILENAME +SRCPATT EQU 3 ;SPECIFIED SOURCE PATTERN A??.* + +COPYMODE DB 0 + +SRC_PUT_ADR DW BUF2 +DST_PUT_ADR DW BUF3 + +CL_OFFSET DW 0 +CH_OFFSET DW 0 +CL_SIZE DW 0 +CH_SIZE DW 0 +BYTECOUNTER DW 0 + +WDATAB: LD DE,(BYTECOUNTER) + LD A,D + OR E + RET Z + LD HL,#C000 + LD A,(FHND) + LD C,Dss.Write + RST ToDSS + JR C,.WRDERR + XOR A + INC A + RET +.WRDERR: + LD A,MSG_FAILURE + CALL MESSAGE + CALL CRLF + LD A,MSG_F_WRITE_ERR + CALL MESSAGE + XOR A + SCF + RET + +RCDFSB: LD HL,(CL_SIZE) + LD DE,(CH_SIZE) + LD A,H + OR L + OR D + OR E + LD BC,0 + LD (BYTECOUNTER),BC + RET Z ;SIZE = 0 + AND A + LD BC,#4000 ;BLOCKSIZE + SBC HL,BC + LD B,C + EX DE,HL + SBC HL,BC + EX DE,HL + LD BC,#4000 + JR NC,.RC_NOCAR +;CORRECT RESULT + ADD HL,BC + LD B,C + EX DE,HL + ADC HL,BC + EX DE,HL + LD B,H + LD C,L + LD HL,0 + LD DE,0 +.RC_NOCAR: + LD (CL_SIZE),HL + LD (CH_SIZE),DE + LD (BYTECOUNTER),BC + ; + LD A,B + SRL B + SRL B + SRL B + AND #07 + OR C + JR Z,.RC_EVEN_NUM + INC B +.RC_EVEN_NUM: + LD A,B + LD C,B + LD B,0 + ; + LD IX,(CL_OFFSET) + LD HL,(CH_OFFSET) + PUSH IX + PUSH HL + ADD IX,BC + LD C,B + ADC HL,BC + LD (CL_OFFSET),IX + LD (CH_OFFSET),HL + POP HL + POP IX + LD B,A + LD A,(CDDRIVE) + LD DE,#C000 + LD C,BIOS.DRV_READ + RST ToBIOS + LD BC,(BYTECOUNTER) + RET NC + LD A,MSG_FAILURE + CALL MESSAGE + CALL CRLF + LD A,MSG_CD_READ_ERR + CALL MESSAGE + SCF + RET + + +FHND DB #FF + +;---------------------- +CDIR: CALL CHANGEDISK + JP C,ERROR + LD HL,BUF2 + LD A,(HL) + OR A + JR NZ,.NODEFD + LD HL,DEFDIR + JR .PATPRESNT +.NODEFD: + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + BIT 7,A ;PATTERN + LD HL,BUF2 + JR NZ,.PATPRESNT + ; + LD BC,255 + XOR A + CPIR ;MOVE TO END OF STRING + DEC HL ;MOVE TO ZERO-CHAR + DEC HL ;MOVE TO LAST CHAR + LD A,(HL) ;GET LAST CHAR + INC HL ;MOVE TO ZERO-CHAR + CP '\' ;IS IT BACKSLASH? + JR Z,.WITHSL9 + LD A,'\' ; + LD (HL),A ;PUT BACKSLASH TO THE END OF STRING + INC HL ;MOVE TO THE NEW END OF STRING +.WITHSL9: + LD A,"*" + LD (HL),A + INC HL + LD (HL),"." + INC HL + LD (HL),A + INC HL + LD (HL),0 + LD HL,BUF2 +.PATPRESNT + LD DE,FF_STRUCT + LD A,FAT_ATTR.NoVolID + LD B,0 + CALL F_FIRST + JP C,ERROR +.CDIR_HEAD: + LD A,MSG_DIRHEAD + CALL MESSAGE + LD HL,DIRSPEC + LD C,Dss.PChars + RST ToDSS + CALL CRLF + CALL CRLF +.CDIR_LOOP: + LD HL,CDFNAME + CALL PNAME + LD DE,FF_STRUCT + CALL F_NEXT + JR NC,.CDIR_LOOP + RET + +; FF_STRUCT +; DB "12345678" +; DB "123" +; DB #00 +; DW 0,0,0,0 +; CDFPOSH DW 0 ;CLUSTER HIGH +; CDFTIME DW 0 ;TIME +; CDFDATE DW 0 ;DATE +; CDFPOSL DW 0 ;CLUSTER +; CDFSIZE DW 0,0 ;SIZE +; CDFATTR DB #00 ;ATTR +; CDFNAME DB "12345678123",0 +; ; DS 44 +; DS 256-($-FF_STRUCT) + +PNAME LD BC,8 + LD DE,PRM1 + LDIR + XOR A + LD (DE),A + LD DE,PRM2 + LDI + LDI + LDI + LD (DE),A + LD IX,FF_STRUCT + CALL PRNSIZE + CALL PRNDATE + CALL PRNTIME + LD A,MSG_DIRENTRY + JP MESSAGE + +PRNDATE LD B,(IX+25) + LD C,(IX+24) + LD HL,SIZEBFF + CALL DATE + LD (HL),0 + LD HL,SIZEBFF + LD DE,PRM4 + LD A,(HL) + CP "0" + JP NZ,PUTPRM + LD (HL),#20 + JP PUTPRM + +PRNTIME LD B,(IX+22) + LD C,(IX+23) + LD HL,SIZEBFF + CALL TIME + LD (HL),0 + LD HL,SIZEBFF + LD DE,PRM5 + LD A,(HL) + CP "0" + JP NZ,PUTPRM + LD (HL),#20 + JP PUTPRM + +TIME: SRL C + RR B + SRL C + RR B + SRL C + RR B + SRL B + SRL B + LD A,C + CALL NUMB + LD (HL),":" + INC HL + LD A,B + JP NUMB + +DATE: LD A,C + AND #1F + PUSH BC + CALL NUMB + LD (HL),"." + INC HL + POP BC + LD A,C + SRL B + RLA + RLA + RLA + RLA + AND #0F + CALL NUMB + LD (HL),"." + INC HL + LD A,B + ADD A,#50 + CP 100 + JP C,NUMB +.SUB100: + SUB 100 + CP 100 + JP C,NUMB + JR .SUB100 + +NUMB: LD C,#2F +.NUMB1: INC C + SUB 10 + JP NC,.NUMB1 + ADD A,10 + ADD A,#30 + LD (HL),C + INC HL + LD (HL),A + INC HL + RET + +PRNSIZE LD A,(IX+32) + LD HL,DIRIDD + AND #10 + JP NZ,.PRZ + LD L,(IX+28) + LD H,(IX+29) + EXX + LD L,(IX+30) + LD H,(IX+31) + EXX + PUSH IX + CALL MAKE_LN + LD HL,L32BIT_+9 + LD A,(HL) + CP #20 + JR NZ,.ALR + LD A,#30 + LD (HL),A +.ALR: LD DE,SIZEBFF + LD HL,L32BIT_;; +1 + LDI + LD A," " + LD (DE),A + INC DE + LDI + LDI + LDI + LD (DE),A + INC DE + LDI + LDI + LDI + LD (DE),A + INC DE + LDI + LDI + LDI + LD HL,SIZEBFF + POP IX +.PRZ: LD DE,PRM3 + JP PUTPRM + +MAKE_LN: + LD IX,L32BIT_ + EXX + LD DE,#3B9A ; 1000000000 + EXX + LD DE,#CA00 + CALL GET_DIG + EXX + LD DE,#05F5 ; 100000000 + EXX + LD DE,#E100 + CALL GET_DIG + EXX + LD DE,#0098 ; 10000000 + EXX + LD DE,#9680 + CALL GET_DIG + EXX + LD DE,#000F ; 1000000 + EXX + LD DE,#4240 + CALL GET_DIG + EXX + LD DE,#0001 ; 100000 + EXX + LD DE,#86A0 + CALL GET_DIG + EXX + LD DE,#0000 ; 10000 + EXX + LD DE,#2710 + CALL GET_DIG + EXX + LD DE,#0000 ; 1000 + EXX + LD DE,#03E8 + CALL GET_DIG + EXX + LD DE,#0000 ; 100 + EXX + LD DE,#0064 + CALL GET_DIG + EXX + LD DE,#0000 ; 10 + EXX + LD DE,#000A + CALL GET_DIG + LD A,L ; 1 + ADD A,#30 + LD (IX+0),A + INC IX + LD HL,L32BIT_ + LD DE,#2030 + ; +.KILLZ: LD A,(HL) + CP E + JR NZ,.KILLZ2 + LD (HL),D + INC HL + JP .KILLZ +.KILLZ2: + LD HL,L32BIT_+9 + LD A,(HL) + CP D + RET NZ + LD (HL),E + RET + +; HL:HL - DE:DE + +GET_DIG: + XOR A +.INC_DG: + INC A + SBC HL,DE + EXX + SBC HL,DE + EXX + JP NC,.INC_DG + ADD HL,DE + EXX + ADC HL,DE + EXX + DEC A + ADD A,#30 + LD (IX+0),A + INC IX + RET + +L32BIT_ DB "0000000000" + +DIRIDD DB "