commit 3a5f267f9afbdb9f715561caaf262fe4e615ba12 Author: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri Jan 17 23:41:59 2025 +1000 какая-то из уже перепиленных версий 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 " ",0 + +SIZEBFF DB "0 000 000 000",0,0 + +DEFDIR DB #5C,"*.*",0 + +;------------------------ + +CDUMP: LD HL,BUF2 + LD BC,#0000 + CALL GETNUM +; LD XL,C +; LD XH,0 +; LD HL,0 + LD A,(CDDRIVE) + LD DE,DUMPBUF + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + JR C,.DMPERR + ; + LD HL,BUF3 + CALL GETNUM + PUSH IX + POP BC + LD A,B + AND #07 + LD B,A + LD HL,2048-#01C0 + AND A + SBC HL,BC + JR NC,.GOODOFFS + LD BC,2048-#01C0 +.GOODOFFS: + LD HL,DUMPBUF + ADD HL,BC + ; + CALL DUMP + JP CRLF +.DMPERR: + LD A,MSG_IO_ERROR + JP MESSAGE + ; + +GETNUM: EXX + LD IX,0 + LD HL,0 + EXX +.GETNUM0: + LD A,(HL) + OR A + JR Z,.EGETN + INC HL + CP "0" + JR C,.GETNUM0 + CP "9"+1 + JR NC,.GETNUM0 + SUB "0" + ; + EXX + PUSH IX ; + PUSH HL + POP DE + POP BC ;LD DE:BC,HL:IX + ; + ADD IX,IX + ADC HL,HL ;x2 + ADD IX,IX + ADC HL,HL ;x4 + ADD IX,BC + ADC HL,DE ;x5 + ADD IX,IX + ADC HL,HL ;x10 + ; + LD C,A + LD B,0 + ADD IX,BC + LD C,B + ADC HL,BC + EXX + JR .GETNUM0 +.EGETN: EXX + ;PUSH IX + PUSH HL + EXX + POP HL + ;POP IX + RET +;;;;;;;;;;;;;;; +; LD A,(HL) +; OR A +; RET Z +; INC HL +; CP "0" +; JR C,GETNUM +; CP "9"+1 +; JR NC,GETNUM +; SUB "0" +; LD B,A +; +; LD A,C +; ADD A,A +; ADD A,A +; ADD A,C +; ADD A,A +; +; ADD A,B +; LD C,A +; JR GETNUM +;;;;;;;;;;;;;;;; + +UPDUMP: BYTE " +00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ",CR,LF + DZ " -------------------------------------------------- +----------------+" + + +DUMP: PUSH HL + LD HL,UPDUMP + LD C,Dss.PChars + RST ToDSS + POP HL + LD BC,#1C00 +.L1: PUSH BC + PUSH BC + CALL CRLF + ; + LD DE,DUMPBUF + AND A + SBC HL,DE + LD A,L + PUSH AF + LD A,H + ADD HL,DE + ; + CALL PHEX + POP AF + CALL PHEX + LD A,":" + CALL PRNCHAR + LD A," " + CALL PRNCHAR + LD A," " + CALL PRNCHAR + POP BC + PUSH HL + ; + LD B,#08 +.L2: PUSH BC + LD A,(HL) + INC HL + CALL PHEX + LD A," " + CALL PRNCHAR + POP BC + INC C + DJNZ .L2 + ; + LD A," " + CALL PRNCHAR + ; + LD B,#08 +.L2_00: PUSH BC + LD A,(HL) + INC HL + CALL PHEX + LD A," " + CALL PRNCHAR + POP BC + INC C + DJNZ .L2_00 + ; + LD A," " + CALL PRNCHAR + ; + LD A,"|" + CALL PRNCHAR + POP HL + LD B,#10 +.LLL: LD A,(HL) + INC HL + PUSH BC + CALL PRINT_ + POP BC + DJNZ .LLL + LD A,"|" + CALL PRNCHAR + ; + LD A,C + POP BC + LD C,A + DJNZ .L1 + RET + +PHEX: LD E,A + RRCA + RRCA + RRCA + RRCA + AND #0F + ADD A,#30 + CP #3A + JR C,.PHEX2 + ADD A,7 +.PHEX2: CALL PRINT_ + LD A,E + AND #0F + ADD A,#30 + CP #3A + JR C,.PHEX3 + ADD A,7 +.PHEX3: CALL PRINT_ + RET + +PRNCHAR: + LD C,Dss.PutChar + JP ToDSS +; \ No newline at end of file diff --git a/Cd_dos.asm b/Cd_dos.asm new file mode 100644 index 0000000..f635791 --- /dev/null +++ b/Cd_dos.asm @@ -0,0 +1,1220 @@ +PAGE0 EQU #82 ;WIN #0000-#3FFF +PAGE1 EQU #A2 ;WIN #4000-#7FFF +PAGE2 EQU #C2 ;WIN #8000-#BFFF +PAGE3 EQU #E2 ;WIN #C000-#FFFF + +DIR EQU #C000 + +DIRPAGE EQU 0 + +DAY EQU 19 +MONTH EQU 05 +YEAR EQU 2002 + +NAM EQU 0 +EXT EQU 8 +ATR EQU 11 + +CLU3 EQU 20 +CLU4 EQU 21 + +TIM1 EQU 22 +TIM2 EQU 23 +DAT1 EQU 24 +DAT2 EQU 25 +CLU1 EQU 26 +CLU2 EQU 27 +LEN1 EQU 28 +LEN2 EQU 29 +LEN3 EQU 30 +LEN4 EQU 31 +POS1 EQU 32 +POS2 EQU 33 +POS3 EQU 34 +POS4 EQU 35 +DIRCLU1 EQU 36 +DIRCLU2 EQU 37 +HND1 EQU 38 +HND2 EQU 39 +FDRV EQU 40 +AMODE EQU 41 +FTASK EQU 42 + +;ACCESS MODE: +; 00 - READ/WRITE +; 01 - READ +; 02 - WRITE + +;File Manipulator (FM) +FM_BUF DB ". " ;+00 NAME + DB " " ;+08 EXT + DB #10 ;+11 ATTRIBUT + DB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED + DW #0000 ;+22 TIME + DW #0000 ;+24 DATE + DW #0000 ;+26 START CLUSTER + DW #0000,#0000 ;+28 SIZE FILE + DW #0000,#0000 ;+32 FILE POSITION (FP) + DW #0000 ;+36 DIRECTORY CLUSTER + DW #0000 ;+38 HANDLE NUMBER + DB #00 ;+40 DRIVE OR CURRENT + DB #00 ;+41 ACCESS MODE + DB #00 ;+42 TASK + DB #00 ;+43 EMPTY +END_FM +;End of FM + DS 44*2 + +FM_SIZE EQU END_FM-FM_BUF + +SET_FM PUSH DE + INC A + LD IY,FM_BUF-FM_SIZE + LD DE,FM_SIZE +SET_FM1 ADD IY,DE + DEC A + JR NZ,SET_FM1 + POP DE + LD A,(IY+0) + OR A + LD A,0 + RET NZ + LD A,5 + SCF + RET + +; HL:IX - OFFSET POINTER +; A - FILE MANIPULATOR + +MOVE_FP CALL SET_FM + RET C + INC B + DEC B + JP Z,MOVE_FA + DEC B + JP Z,MOVE_FB + DEC B + JP Z,MOVE_FC + LD A,1 + SCF + RET + +;from Start File +MOVE_FA LD BC,0 + LD DE,0 + JR MOVE_F1 + +;from End File +MOVE_FC LD C,(IY+28) + LD B,(IY+29) + LD E,(IY+30) + LD D,(IY+31) + JR MOVE_F1 + +;from Current Position +MOVE_FB LD C,(IY+32) + LD B,(IY+33) + LD E,(IY+34) + LD D,(IY+35) +MOVE_F1 ADD IX,BC + ADC HL,DE + LD D,XH + LD E,XL + LD (IY+32),E + LD (IY+33),D + LD (IY+34),L + LD (IY+35),H + XOR A + RET + +;FP COMPARE +; CY - FILE POINTER > SIZE +; NC - FILE POINTER < SIZE + +MOVE_CP LD L,(IY+28) + LD H,(IY+29) + LD E,(IY+32) + LD D,(IY+33) + AND A + SBC HL,DE + LD L,(IY+30) + LD H,(IY+31) + LD E,(IY+34) + LD D,(IY+35) + SBC HL,DE + RET + +CHANGEDISK: LD A,(CDDRIVE) + LD C,BIOS.DRV_RESET + RST ToBIOS + JR NC,.cont + ; + CP BIOS.Error.ATAPI.UnitAttention + JR Z,.drv_change + ; + CP BIOS.Error.ATAPI.NotReady + SCF + RET NZ + LD A,DSS_Error.sys.NOT_READY + RET + ; +.drv_change: LD A,(CDDRIVE) + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + ; +.cont: CALL INITDISK + RET C + AND A + RET + +NDISK11 CP BIOS.Error.ATAPI.NotReady + SCF + RET NZ + ; + LD A,DSS_Error.sys.NOT_READY + RET + +INITDISK: + LD A,DIRPAGE + CALL BANK + PUSH AF + LD B,4 +CD_I_LP PUSH BC + LD DE,DIR + LD A,(CDDRIVE) + LD HL,#0000 + LD IX,#0010 + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP BC + JR NC,CD_I_OK + DJNZ CD_I_LP +UNKCD POP AF + OUT (PAGE3),A + LD A,DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET + +CD_I_OK LD HL,DIR + LD A,(HL) + INC HL + CP #01 + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "C" + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "D" + JR NZ,UNKCD + LD HL,DIR+#009E + LD DE,ROOTDIR + LDI + LDI + LDI + LDI + LD HL,DIR+#00A6 + LD DE,ROOTLEN + LDI + LDI + LDI + LDI + POP AF + OUT (PAGE3),A +; LD HL,0 +; LD (FATCASH),HL + XOR A + RET + + +;---------------------------------------------- + +OPEN LD (ACCESS),A + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C +OPENEXE CALL SEARCH + RET C + LD A,1 ;; + CALL SET_FM ;; CALL GET_FM + RET C + LD A,C + EX AF,AF' + EXX + LD (IY+HND1),E + LD (IY+HND2),D + EXX + LD D,YH + LD E,YL + LD HL,HANDBUF + LD BC,#0020 + LDIR + LD A,(ACCESS) + LD (IY+AMODE),A +;; LD A,(TASK) + XOR A ;; + LD (IY+FTASK),A + XOR A + LD (IY+POS1),A + LD (IY+POS2),A + LD (IY+POS3),A + LD (IY+POS4),A +;; LD A,(DRIVE) +; XOR A ;; +; LD (IY+FDRV),A + LD HL,FM_BUF+CLU1 + LD E,(HL) + INC HL + LD D,(HL) + LD (IY+DIRCLU1),E + LD (IY+DIRCLU2),D + + LD C,(IY+CLU1) + LD B,(IY+CLU2) + LD E,(IY+CLU3) + LD D,(IY+CLU4) + EX DE,HL + PUSH BC + POP IX + LD C,(IY+LEN1) + LD B,(IY+LEN2) + LD E,(IY+LEN3) + LD D,(IY+LEN4) + EX AF,AF' + AND A + RET + +;RET +; HL:IX - SECTOR +; DE:BC - SIZE IN BYTES + +;PATH0 DEFW #0000 + +ACCESS DEFB #00 + +HANDBUF DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +WRT_HND LD A,DIRPAGE + CALL BANK + PUSH AF + LD IX,DIR + EXX + LD DE,0 + EXX +WRT_HN1 LD A,(IX+00) + OR A + JR Z,WRT_HN2 + CP #E5 + JR Z,WRT_HN2 + LD BC,#0020 + ADD IX,BC + JR NC,WRT_HN1 + POP AF + OUT (PAGE3),A + LD A,9 + SCF + RET + +WRT_HN2 LD D,XH + LD E,XL + LD HL,HANDBUF + LD BC,#0020 + LDIR + POP AF + OUT (PAGE3),A + LD HL,DIR + LD BC,(DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + RET NC + LD HL,(DIRSIZE) + LD BC,#0020 + ADD HL,BC + LD (DIRSIZE),HL + AND A + RET + +GETNAME LD BC,#08FF +GETN1 LD A,(HL) + CP " " + JR NZ,GETN3 +GETN2 INC HL + DJNZ GETN2 + JR GETN4 +GETN3 LDI + DJNZ GETN1 +GETN4 LD A,(HL) + CP " " + LD A,"." + JR NZ,GETN5 + LD A,#00 +GETN5 LD (DE),A + INC DE + RET Z + LD B,#03 +GETN6 LD A,(HL) + CP " " + RET Z + LDI + XOR A + LD (DE),A + DJNZ GETN6 + RET + +DTABUF DEFW #0000 +CURHND DEFW #0000 +NO_NEXT DEFB #00 +FNDMODE DEFB #00 + +F_FIRST LD (ACCESS),A + LD (DTABUF),DE + LD A,B + LD (FNDMODE),A + PUSH HL + CALL LOADDIR + POP HL + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + LD A,(ACCESS) + CALL ASEARCH + RET C + LD HL,MASKARE + LD DE,(DTABUF) + LD BC,11 + LDIR + LD A,(ACCESS) + LD (DE),A + INC DE +FIND_S LD BC,#0020 + ADD IX,BC + LD (CURHND),IX + LD HL,HANDBUF+12 + LD BC,20 + LDIR + LD A,(HANDBUF+11) + LD (DE),A + INC DE + LD HL,HANDBUF + LD A,(FNDMODE) + OR A + JR NZ,FIND_M2 + LD BC,11 + LDIR + LD A,#FF + LD (NO_NEXT),A + XOR A + RET +FIND_M2 CALL GETNAME + LD A,#FF + LD (NO_NEXT),A + XOR A + RET + +F_NEXT LD A,(NO_NEXT) + OR A + LD A,14 + SCF + RET Z + LD (DTABUF),DE + LD DE,MASKARE + LD HL,(DTABUF) + LD BC,11 + LDIR + LD A,(HL) + PUSH HL + CALL NSEARCH + POP DE + EX AF,AF' + XOR A + LD (NO_NEXT),A + EX AF,AF' + RET C + INC DE + JP FIND_S + +NSEARCH EX AF,AF' + LD A,DIRPAGE + CALL BANK + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,(CURHND) + EXX + LD DE,0 + EXX + JP SEARCH1 + +DSEARCH LD A,#10 + CALL ASEARCH + RET NC + LD A,4 + RET + +SEARCH LD A,#23 +ASEARCH EX AF,AF' + LD A,DIRPAGE + CALL BANK + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,DIR + EXX + LD DE,0 + EXX +SEARCH1 LD A,(IX+00) + OR A + JR Z,SEARCH4 + CP #E5 + JR Z,SEARCH3 + LD A,(IX+11) + AND C + JR NZ,SEARCH3 + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 + EX DE,HL +SEARCH2 LD A,(DE) + CP "?" + JR Z,SEARCH5 + CP (HL) + JR NZ,SEARCH3 +SEARCH5 INC HL + INC DE + DJNZ SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,#0020 + LDIR + POP AF + OUT (PAGE3),A + AND A + RET + +SEARCH3 EXX + INC DE + EXX + LD DE,#0020 + ADD IX,DE + JR NC,SEARCH1 +SEARCH4 POP AF + OUT (PAGE3),A + LD A,3 + SCF + RET + +GETWORD LD DE,TMPNAME + LD BC,#0DFF +GETWRD1 LD A,(HL) + INC HL + CP '\' ; + JR Z,DIRNAME + CP ":" + JR Z,DRVNAME + LD (DE),A + INC DE + CP #21 + CCF + RET NC + DJNZ GETWRD1 + LD A,16 + SCF + RET + +DIRNAME LD A,#00 + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + JP NC,GETWORD + RET + +DRVNAME LD A,(TMPNAME) + CP "a" + JR C,DRVN2 + CP "{" + JR NC,DRVN2 + SUB #20 +DRVN2 SUB "A" + PUSH HL +; CALL OPENDSK + POP HL + JP NC,GETWORD + RET + +TMPNAME DB " ",#00 + +OPENDIR XOR A + CALL SET_FM + LD A,(HL) + OR A + JP NZ,SUBDIR + + LD DE,(ROOTDIR+0) + LD (IY+CLU1),E + LD (IY+CLU2),D + LD DE,(ROOTDIR+2) + LD (IY+CLU3),E + LD (IY+CLU4),D + + LD DE,(ROOTLEN+0) + LD (IY+LEN1),E + LD (IY+LEN2),D + LD DE,(ROOTLEN+2) + LD (IY+LEN3),E + LD (IY+LEN4),D + + CALL LOADDIR + LD HL,DIRSPEC + LD (HL),'\' ; + INC HL + LD (HL),#00 + AND A + RET + +SUBDIR CP "." + JR NZ,SUBDIR2 + EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 + LD (HL),#20 + LDIR + EXX + LD DE,MASKARE +SUBDIR0 LDI + LD A,(HL) + OR A + JR NZ,SUBDIR0 + JR SUBDIR3 + +SUBDIR2 LD DE,MASKARE + CALL MASK + RET C +SUBDIR3 CALL FINDDIR + RET C + LD (IY+CLU1),E + LD (IY+CLU2),D + LD (IY+CLU3),C + LD (IY+CLU4),B + EXX + LD (IY+LEN1),E + LD (IY+LEN2),D + LD (IY+LEN3),C + LD (IY+LEN4),B + EXX + CALL LOADDIR + AND A + RET + + + +FINDD03 LD BC,#0020 + ADD IX,BC + JR NC,FINDD01 +FINDD04 POP AF + OUT (PAGE3),A + LD A,4 + SCF + RET + +; FIND "MASKAREA" IN DIRECTORY + +FINDDIR LD A,DIRPAGE + CALL BANK + PUSH AF + LD IX,DIR +FINDD01 LD A,(IX+00) + OR A + JR Z,FINDD04 + CP #E5 + JR Z,FINDD03 + LD A,(IX+11) + AND #10 + JR Z,FINDD03 + LD HL,MASKARE + LD D,XH + LD E,XL + EX DE,HL + LD B,11 +FINDD02 LD A,(DE) + CP "?" + JR Z,FINDD05 + CP (HL) + JR NZ,FINDD03 +FINDD05 INC HL + INC DE + DJNZ FINDD02 + LD A,(IX+0) + CP "." + JP NZ,ADDSPEC + LD A,(IX+1) + CP "." + JP NZ,IT_DIR + LD HL,DIRSPEC + LD D,H + LD E,L + LD BC,#100 + XOR A + CPIR + LD BC,#100 + LD A,'\' ; + CPDR + INC HL + AND A + EX DE,HL + SBC HL,DE + EX DE,HL + JR NZ,ROTZ + INC HL +ROTZ LD (HL),0 +IT_DIR LD E,(IX+CLU1) + LD D,(IX+CLU2) + LD C,(IX+CLU3) + LD B,(IX+CLU4) + EXX + LD E,(IX+LEN1) + LD D,(IX+LEN2) + LD C,(IX+LEN3) + LD B,(IX+LEN4) + EXX + POP AF + OUT (PAGE3),A + AND A + RET + +ADDSPEC LD E,XL + LD D,XH + LD HL,DIRSPEC + LD BC,#FF + XOR A + CPIR + DEC HL + DEC HL + LD A,#5C ;"\" + CP (HL) + INC HL + JR Z,ADDSPE0 + LD (HL),A + INC HL +ADDSPE0 LD BC,#0820 +MM1 LD A,(DE) + INC DE + CP C + JR Z,MM2 + LD (HL),A + INC HL +MM2 DJNZ MM1 + LD A,(DE) + INC DE + CP C + JR Z,MM3 + LD (HL),"." + INC HL + LD (HL),A + INC HL + LD A,(DE) + INC DE + CP C + JR Z,MM3 + LD (HL),A + INC HL + LD A,(DE) + CP C + JR Z,MM3 + LD (HL),A + INC HL +MM3 LD (HL),0 + JP IT_DIR + +CURRDIR EX DE,HL + LD HL,DIRSPEC +CURDIR1 LD A,(HL) + OR A + LDI + JP NZ,CURDIR1 + RET + +LOADDIR XOR A + LD HL,0 + LD IX,0 + LD B,0 + CALL MOVE_FP + LD A,DIRPAGE + CALL BANK + PUSH AF + LD B,3 +LOADFFF PUSH BC + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF + LD (HL),L + LDIR +; LD A,(DRIVE) +; LD (IY+FDRV),A +; LD C,(IY+LEN1) + LD C,(IY+LEN2) + LD B,(IY+LEN3) + LD E,(IY+LEN4) + LD D,0 + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + LD E,(IY+CLU1) + LD D,(IY+CLU2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + LD XH,D + LD XL,E + LD B,C + LD A,B + OR A + JR Z,ERRLEND + CP #08 + JR C,NORLEND + LD B,8 +NORLEND + LD A,(CDDRIVE) + LD C,BIOS.DRV_READ + LD DE,DIR + RST ToBIOS + POP BC + JR NC,LOADMMM + DEC B + JP NZ,LOADFFF + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +ERRLEND POP BC + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +LOADMMM POP AF + OUT (PAGE3),A + CALL CORRDIR + AND A + RET + +CORRDIR LD A,DIRPAGE + CALL BANK + PUSH AF + LD HL,DIR + LD DE,DIR +CORRL1 PUSH DE + LD C,(HL) + LD B,0 + LD DE,ENTRYBF + LDIR + POP DE + PUSH HL + LD HL,FCDFLEN + LD C,(HL) + LD B,0 + ADD HL,BC + INC HL + LD (HL),0 + SBC HL,BC + PUSH DE + CALL MASK + POP HL + LD BC,11 + ADD HL,BC + LD A,(FCDFLAG) + BIT 1,A ;IS IT DIR? +; AND 2 + LD C,#01 ;ATTRIBUT FILE + JR Z,CORRL0 + LD C,#10 ;ATTRIBUT DIRECTORY +CORRL0 BIT 0,A ;IS IT HIDDEN + JR Z,CORRL00 + SET 1,C +CORRL00 + LD (HL),C + INC HL + XOR A + LD B,8 +FILLCDN LD (HL),A + INC HL + DJNZ FILLCDN + LD A,(FCDSEC+2) + LD (HL),A + INC HL + LD A,(FCDSEC+3) + LD (HL),A + INC HL +;MKDATE + PUSH HL + LD A,(FCDYEAR) + LD XL,A + LD XH,0 + LD DE,1900 + ADD IX,DE + LD A,(FCDMOUN) + LD E,A + LD A,(FCDDAY) + LD D,A + LD A,(FCDHOUR) + LD H,A + LD A,(FCDMIN) + LD L,A + LD A,(FCDSECN) + LD B,A + CALL MK_TIME + POP HL +; LD DE,#0000 ;TIME + LD (HL),E + INC HL + LD (HL),D + INC HL +; LD DE,#0000 ;DATE + LD (HL),C + INC HL + LD (HL),B + INC HL + + LD DE,(FCDSEC) + LD (HL),E + INC HL + LD (HL),D + INC HL + EX DE,HL + LD HL,FCDLEN + LDI + LDI + LDI + LDI + POP HL + BIT 7,H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 + LD L,0 + INC H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 +CORRL2 XOR A + LD (DE),A + LD DE,(ROOTDIR+0) + LD L,(IY+CLU1) + LD H,(IY+CLU2) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD DE,(ROOTDIR+2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + JR CORRL4 +CORRL6 LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + INC HL + LD (HL),"." +CORRL4 POP AF + OUT (PAGE3),A + AND A + RET + +;SYSTEM ATTRIBUTES +READONLY_ATR EQU %00000001 +HIDDEN_ATR EQU %00000010 +SYSTEM_ATR EQU %00000100 +ARCHIVE_ATR EQU %00100000 + +ENTRYBF + DEFB #00 ;Entry lenght + DEFB #00 ;XAR in LBN +FCDSEC DEFW #00,#00 ;Start sector (Intel) + DEFW #00,#00 ;Start sector (Motorola) +FCDLEN DEFW #00,#00 ;Lenght file (Intel) + DEFW #00,#00 ;Lenght file (Motorola) +FCDYEAR DEFB #00 ;Year +FCDMOUN DEFB #00 ;Mount +FCDDAY DEFB #00 ;Day +FCDHOUR DEFB #00 ;Hour +FCDMIN DEFB #00 ;Minute +FCDSECN DEFB #00 ;Second + DEFB #00 ;Reserve +FCDFLAG DEFB #00 ;Flag + DEFB #00 ;Interlive size + DEFB #00 ;Interlive skip factor + DEFW #0000 ;Volume Set Sequence (Intel) + DEFW #0000 ;Volume Set Sequence (Motorola) +FCDFLEN DEFB #00 +DEFSA EQU $-ENTRYBF +FCDNAME DEFS #100-DEFSA + +ROOTDIR DEFW 0,0 +ROOTLEN DEFW 0,0 + +DIRSIZE DEFW 0 + +BANK LD C,A + LD B,0 + LD HL,BANKTBL + ADD HL,BC + IN A,(PAGE3) + LD C,PAGE3 + OUTI + RET + +BANKTBL DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + +;HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +; DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +MASKARE + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +; HL - MASK "file*.t??" +; DE - 11 bytes filename +; RET: C=2 FILE WITHOUT EXTENTION +; C=1 FILE WITH EXTENTION + +MASK PUSH HL + PUSH DE + LD H,D + LD L,E + INC DE + LD (HL),#20 + LD BC,10 + LDIR + POP DE + POP HL + LD A,(HL) + CP #21 + RET C + LD BC,#0902 +MASK1 LD A,(HL) + CP #21 + CCF + RET NC + CP #22 + JR Z,MASK7 + CP "*" + JR Z,MASK3 + CP "+" + JR Z,MASK7 + CP "," + JR Z,MASK7 + CP "." + JR Z,MASK5 + CP "/" + JR Z,MASK7 + CP ":" + JR Z,MASK7 + CP ";" + JR Z,MASK7 + CP "<" + JR Z,MASK7 + CP "=" + JR Z,MASK7 + CP ">" + JR Z,MASK7 + CP "[" + JR Z,MASK7 + CP '\' ; + JR Z,MASK7 + CP "]" + JR Z,MASK7 + CP "|" + JR Z,MASK7 + CP "a" + JR C,MASK2 + CP "{" + JR NC,MASK2 + SUB #20 +MASK2 LD (DE),A + INC HL + INC DE + DJNZ MASK1 +MASK7 LD A,16 + SCF + RET + +MASK3 LD A,"?" + INC HL + DJNZ MASK6 + LD A,16 + SCF + RET + +MASK6 LD (DE),A + INC DE + DJNZ MASK6 + LD B,1 + JR MASK1 + +MASK5 LD A," " + INC HL + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET + +MASK4 LD (DE),A + INC DE + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET + +SYSTIME LD DE,DAY*256+MONTH ;DAY/MONTH + LD HL,#0000 ;HOUR/MINUTE + LD BC,#0001 ;SECOND/WEEKDAY + LD IX,YEAR ;YEAR + AND A + RET + +;INPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) + +MK_TIME LD A,L + RLCA + RLCA + SLA A + RL H + SLA A + RL H + SLA A + RL H + SRL B + OR B + LD L,A + + LD BC,#F844 ;(-1980) + ADD IX,BC + LD A,E + RLCA + RLCA + RLCA + RLCA + AND #F0 + LD B,XL + SLA A + RL B + OR D + LD C,A + EX DE,HL + AND A + RET + +;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) +;OUTPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) + +RMKTIME EX DE,HL + LD A,C + AND #1F + LD D,A + SRL B + RR C + LD A,C + RRCA + RRCA + RRCA + RRCA + AND #0F + LD E,A + LD C,B + LD B,0 + LD IX,1980 + ADD IX,BC + LD A,L + AND #1F + ADD A,A + LD B,A + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL L + SRL L + AND A + RET + +; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 + +CHDIR CALL GETWORD + RET C + LD HL,TMPNAME + LD A,(HL) + OR A + CALL NZ,OPENDIR + RET +; \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes new file mode 160000 index 0000000..857938d --- /dev/null +++ b/Shared_Includes @@ -0,0 +1 @@ +Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa