From 194e7a1fca39cef2d452e8dcff8c97546c609846 Mon Sep 17 00:00:00 2001 From: savelij13 Date: Mon, 7 Jul 2025 19:49:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=201.03=20-?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20cdx?= =?UTF-8?q?.txt=20-=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=BB=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B0=D1=82=D1=8C=20ATAPI=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82.=20-=20=D0=B5=D1=81=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B5=D1=82=20=D0=B4=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B2?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=D0=B2=D0=BE=D0=B4=D0=B5,=20=D1=82=D0=BE?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=BF=D0=B8=D1=88=D0=B5=D1=82=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BA=D1=83,=20=D1=87=D1=82=D0=BE=20=D0=BD=D0=B5?= =?UTF-8?q?=D1=82=20=D0=BF=D1=80=D0=B8=D0=B2=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/CDX.EXE | Bin 0 -> 7414 bytes bin/CDX.TXT | 75 +++ bin/history.txt | 5 + build.bat | 23 + build_pause.bat | 6 + cd_dos.a80 | 1225 +++++++++++++++++++++++++++++++++++++++++++++++ cdx.a80 | 488 +++++++++++++++++++ cmdparse.a80 | 90 ++++ command.a80 | 1036 +++++++++++++++++++++++++++++++++++++++ readme.md | 6 + vers.a80 | 4 + 11 files changed, 2958 insertions(+) create mode 100644 bin/CDX.EXE create mode 100644 bin/CDX.TXT create mode 100644 bin/history.txt create mode 100644 build.bat create mode 100644 build_pause.bat create mode 100644 cd_dos.a80 create mode 100644 cdx.a80 create mode 100644 cmdparse.a80 create mode 100644 command.a80 create mode 100644 readme.md create mode 100644 vers.a80 diff --git a/bin/CDX.EXE b/bin/CDX.EXE new file mode 100644 index 0000000000000000000000000000000000000000..114afa2ab839fb42839103ca90a71f164f239974 GIT binary patch literal 7414 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 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 + SPBIOS BIOSF.DRV_RESET + JR NC,.cont + ; + CP ERR_DRV.ATAPI_UnitAttention;BIOS.Error.ATAPI.UnitAttention + JR Z,.drv_change + ; + CP ERR_DRV.ATAPI_NotReady;BIOS.Error.ATAPI.NotReady + SCF + RET NZ + LD A,ERR_DSS.NOT_READY;DSS_Error.sys.NOT_READY + RET + ; +.drv_change: LD A,(CDDRIVE) + CALL SAVE_MEDIA_CHANGED + ; +.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,ADRDIR + LD A,(CDDRIVE) + LD HL,0x0000 + LD IX,0x0010 +; LD BC,1*256 + BIOS.DRV_READ +; RST ToBIOS + SPBIOS BIOSF.DRV_READ,1 + POP BC + JR NC,CD_I_OK + DJNZ CD_I_LP +UNKCD POP AF + OUT (PAGE3),A + LD A,ERR_DSS.UNKNOWN_FORMAT;DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET + +CD_I_OK LD HL,ADRDIR + LD A,(HL) + INC HL + CP 0x01 + 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,ADRDIR+0x009E + LD DE,ROOTDIR + LDI + LDI + LDI + LDI + LD HL,ADRDIR+0x00A6 + 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,IYH + LD E,IYL + LD HL,HANDBUF + LD BC,0x0020 + 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 0x0000 + +ACCESS DEFB 0x00 + +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,ADRDIR + EXX + LD DE,0 + EXX +WRT_HN1 LD A,(IX+00) + OR A + JR Z,WRT_HN2 + CP 0xE5 + JR Z,WRT_HN2 + LD BC,0x0020 + ADD IX,BC + JR NC,WRT_HN1 + POP AF + OUT (PAGE3),A + LD A,9 + SCF + RET + +WRT_HN2 LD D,IXH + LD E,IXL + LD HL,HANDBUF + LD BC,0x0020 + LDIR + POP AF + OUT (PAGE3),A + LD HL,ADRDIR + LD BC,(DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + RET NC + LD HL,(DIRSIZE) + LD BC,0x0020 + ADD HL,BC + LD (DIRSIZE),HL + AND A + RET + +GETNAME LD BC,0x08FF +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,0x00 +GETN5 LD (DE),A + INC DE + RET Z + LD B,0x03 +GETN6 LD A,(HL) + CP " " + RET Z + LDI + XOR A + LD (DE),A + DJNZ GETN6 + RET + +DTABUF DEFW 0x0000 +CURHND DEFW 0x0000 +NO_NEXT DEFB 0x00 +FNDMODE DEFB 0x00 + +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,0x0020 + 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,0xFF + LD (NO_NEXT),A + XOR A + RET +FIND_M2 CALL GETNAME + LD A,0xFF + 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,0x10 + CALL ASEARCH + RET NC + LD A,4 + RET + +SEARCH LD A,0x23 +ASEARCH EX AF,AF' + LD A,DIRPAGE + CALL BANK + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,ADRDIR + EXX + LD DE,0 + EXX +SEARCH1 LD A,(IX+00) + OR A + JR Z,SEARCH4 + CP 0xE5 + JR Z,SEARCH3 + LD A,(IX+11) + AND C + JR NZ,SEARCH3 + LD HL,MASKARE + LD D,IXH + LD E,IXL + 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,IXH + LD E,IXL + LD HL,HANDBUF + EX DE,HL + LD BC,0x0020 + LDIR + POP AF + OUT (PAGE3),A + AND A + RET + +SEARCH3 EXX + INC DE + EXX + LD DE,0x0020 + ADD IX,DE + JR NC,SEARCH1 +SEARCH4 POP AF + OUT (PAGE3),A + LD A,3 + SCF + RET + +GETWORD LD DE,TMPNAME + LD BC,0x0DFF +GETWRD1 LD A,(HL) + INC HL + CP '\\' + JR Z,DIRNAME + CP ":" + JR Z,DRVNAME + LD (DE),A + INC DE + CP 0x21 + CCF + RET NC + DJNZ GETWRD1 + LD A,16 + SCF + RET + +DIRNAME LD A,0x00 + 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 0x20 +DRVN2 SUB "A" + PUSH HL +; CALL OPENDSK + POP HL + JP NC,GETWORD + RET + +TMPNAME DB " ",0x00 + +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),0x00 + AND A + RET + +SUBDIR CP "." + JR NZ,SUBDIR2 + EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 + LD (HL),0x20 + 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,0x0020 + 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,ADRDIR +FINDD01 LD A,(IX+00) + OR A + JR Z,FINDD04 + CP 0xE5 + JR Z,FINDD03 + LD A,(IX+11) + AND 0x10 + JR Z,FINDD03 + LD HL,MASKARE + LD D,IXH + LD E,IXL + 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,0x100 + XOR A + CPIR + LD BC,0x100 + 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,IXL + LD D,IXH + LD HL,DIRSPEC + LD BC,0xFF + XOR A + CPIR + DEC HL + DEC HL + LD A,'\\' + CP (HL) + INC HL + JR Z,ADDSPE0 + LD (HL),A + INC HL +ADDSPE0 LD BC,0x0820 +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,0xC000 + LD DE,0xC001 + LD BC,0x3FFF + 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 IXH,D + LD IXL,E + LD B,C + LD A,B + OR A + JR Z,ERRLEND + CP 0x08 + JR C,NORLEND + LD B,8 +NORLEND + LD A,(CDDRIVE) +; LD C,BIOS.DRV_READ + LD DE,ADRDIR +; RST ToBIOS + SPBIOS BIOSF.DRV_READ + 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,ADRDIR + LD DE,ADRDIR +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,0x01 ;ATTRIBUT FILE + JR Z,CORRL0 + LD C,0x10 ;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 IXL,A + LD IXH,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,0x0000 ;TIME + LD (HL),E + INC HL + LD (HL),D + INC HL +; LD DE,0x0000 ;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,ADRDIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),0xE5 + LD BC,0x0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),0xE5 + JR CORRL4 +CORRL6 LD HL,ADRDIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + LD BC,0x0020 + 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 0x00 ;Entry lenght + DEFB 0x00 ;XAR in LBN +FCDSEC DEFW 0x00,0x00 ;Start sector (Intel) + DEFW 0x00,0x00 ;Start sector (Motorola) +FCDLEN DEFW 0x00,0x00 ;Lenght file (Intel) + DEFW 0x00,0x00 ;Lenght file (Motorola) +FCDYEAR DEFB 0x00 ;Year +FCDMOUN DEFB 0x00 ;Mount +FCDDAY DEFB 0x00 ;Day +FCDHOUR DEFB 0x00 ;Hour +FCDMIN DEFB 0x00 ;Minute +FCDSECN DEFB 0x00 ;Second + DEFB 0x00 ;Reserve +FCDFLAG DEFB 0x00 ;Flag + DEFB 0x00 ;Interlive size + DEFB 0x00 ;Interlive skip factor + DEFW 0x0000 ;Volume Set Sequence (Intel) + DEFW 0x0000 ;Volume Set Sequence (Motorola) +FCDFLEN DEFB 0x00 +DEFSA EQU $-ENTRYBF +FCDNAME DB 0x100-DEFSA DUP 0 + +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 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + DEFB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + +;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),0x20 + LD BC,10 + LDIR + POP DE + POP HL + LD A,(HL) + CP 0x21 + RET C + LD BC,0x0902 +MASK1 LD A,(HL) + CP 0x21 + CCF + RET NC + CP 0x22 + 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 0x20 +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,0x0000 ;HOUR/MINUTE + LD BC,0x0001 ;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,0xF844 ;(-1980) + ADD IX,BC + LD A,E + RLCA + RLCA + RLCA + RLCA + AND 0xF0 + LD B,IXL + 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 0x1F + LD D,A + SRL B + RR C + LD A,C + RRCA + RRCA + RRCA + RRCA + AND 0x0F + LD E,A + LD C,B + LD B,0 + LD IX,1980 + ADD IX,BC + LD A,L + AND 0x1F + 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/cdx.a80 b/cdx.a80 new file mode 100644 index 0000000..305d131 --- /dev/null +++ b/cdx.a80 @@ -0,0 +1,488 @@ + +; LAST UPDATE: 07.07.2025 savelij + + include macros.a80 + include bios_sp.a80 + include dss_sp.a80 + include errors_sp.a80 + include fat_dir_sp.a80 + include macros_sp.a80 + include vers.a80 + +;[BEGIN] +; +; CDX.EXE [command] [-switches] [directory] +; +;commands: +; OPEN +; EJECT +; CLOSE +; COPY +; LIST +; DUMP +; COMMAND +; SEND +; -h,? Help page + + HDR_EXE 0x8100,1,0,START,START,0xBFFF,0 + +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,MSG0.MSG_HELLO + CALL MESSAGE + CALL INIT + JR NC,.next + LD HL,PRM1 + LD (HL),0 + LD A,MSG0.MSG_NO_CDROM + CALL MESSAGE + LD A,1 + LD (STOPMODE),A +.next: + SPDSS DSSF.VERSION + EX DE,HL + AND A + LD DE,0x0146 ;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 + CALL RESTORE_STATE +.loop: + SPDSS DSSF.EXIT,0 + JP .loop + +OLD_DSS: LD A,MSG0.MSG_OLD_DSS + CALL MESSAGE + JR QUIT + +RESTORE_STATE: LD B,1 +.set_par: EQU $-1 + LD A,(CDDRIVE) + SPBIOS BIOSF.DRV_SET_PAR + RET + +;HNDMEM DB 0xFF + +MALLOC: + SPDSS DSSF.GETMEM,2 + JR NC,.cont + LD A,MSG0.MSG_MEMERROR + CALL MESSAGE + SCF + RET + +.cont: PUSH AF + SPDSS DSSF.SETWIN3,1 + LD HL,BANKTBL + POP AF + SPBIOS BIOSF.GETMEMBLKPAGES + RET + +; 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 B,0xC0 - 1 +.loop: INC B + LD A,B + CP 0xC4 + SCF + RET Z + PUSH BC + SPBIOS BIOSF.DRV_DETECT + POP BC + JR NC,.found + CP ERR_DRV.ATAPI_MediumError + JR Z,.media_changed + CP ERR_DRV.ATAPI_UnitAttention + JR NZ,.loop +.media_changed: PUSH BC + LD A,B + CALL SAVE_MEDIA_CHANGED + POP BC +.found: LD A,B + LD (CDDRIVE),A + RET + +SAVE_MEDIA_CHANGED: + SPBIOS BIOSF.DRV_GET_PAR + OR %00000010 + LD B,A + LD A,(RESTORE_STATE.set_par) + OR B + LD (RESTORE_STATE.set_par),A + RET + +;VARIABLES + +; FILENAME DS 256 +; FILEHND DB 0xFF + +STOPMODE DB 0x00 + +CMD_PARSE_ASM.Start: + include cmdparse.a80 +CMD_PARSE_ASM.End EQU $ +COMMAND_ASM.Start + include command.a80 +COMMAND_ASM.End EQU $ +CD_DOS_ASM.Start: + include cd_dos.a80 +CD_DOS_ASM.End EQU $ + +CRLF: PUSH HL + LD HL,MSG0.crlf + SPDSS DSSF.PCHARS + 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: LD A,E + LD HL,SYS_ERRORS ; массив строк + LD BC,SYS_ERRORS.Size ; размер массива + RLA + jr nc,.set_de + ld hl,DRV_ERRORS ; массив строк + ld bc,DRV_ERRORS.Size ; размер массива +.set_de: SRL A + LD E,A + INC DE +LCPIR: XOR A + CPIR + RET PO + RET NZ + XOR A + CP (HL) + JR Z,.no_mess + DEC DE + LD A,D + OR E + JP NZ,LCPIR + RET +.no_mess: INC HL + RET + + IF 0;/* +LCPIR: xor a + cpir + ret po + ret nz + ;R11 + XOR A + CP (HL) + JR Z,.no_mess + ; + dec de + ld a,d + or e + jr nz,LCPIR + ret +.no_mess: INC HL + RET + +print_err_message: + ld hl,SYS_ERRORS ; массив строк + ld bc,SYS_ERRORS.Size ; размер массива + ;cp %1000'0000 + RLA + jr nc,.set_de + ; + ;and %0111'1111 + ld hl,DRV_ERRORS ; массив строк + ld bc,DRV_ERRORS.Size ; размер массива + ; +.set_de: SRL A + ld e,a + ld d,0 + inc de + call LCPIR ; найти строку + call PRINTZ ; формат. вывод строки + jp newline + ENDIF;*/ + +ERRCDX DB "CDX: ",0 + + include dss_errors.a80 + +;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 + SPDSS DSSF.PCHARS + POP HL + JR PRINTZ + +PRINTZ2 + SPDSS DSSF.PUTCHAR + JP PRINTZ + +PRINT_ + SPBIOS BIOSF.LP_PRINT_SYM,1 + RET + +PUTVAR LD DE,PRM1 +PUTPRM LD BC,15 +PUTPRMA LD A,(HL) + LDI + RET PO + OR A + JR NZ,PUTPRMA + RET + +CDDRIVE DB 0xFF + +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 + +MSG0 DB 0 + _INIT_VAR + _SETVAR .MSG_HELLO + DB "CDROM eXtension utility v\{VERS}, build \{BUILDDATE} (c) Sprinter Team\r\n" + DZ "Type CDX.EXE -? for help.\r\n" + _SETVAR .MSG_TRAY_OPEN + DZ "Opening tray..." + _SETVAR .MSG_TRAY_CLOSE + DZ "Closing tray..." + ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 + _SETVAR .MSG_USAGE + DB " Usage: CDX.EXE [-switches] [command] [param1] [param2]\r\n\r\n" + DB "Commands:\r\n" + DB " CDX OPEN - Open tray\r\n" + DB " CDX CLOSE - Close tray\r\n" + DB " CDX LIST [\\cd_path\\][pattern] - Show CDROM filelist\r\n" + DB " CDX COPY \\source d:\\destination\\ - Copy file(s) from CDROM to another disk\r\n" + DB " CDX DUMP sector [offset] - Show sector dump from CDROM\r\n" + DB " CDX SEND hexline [\".\" separator] - Send ATAPI command\r\n" + DB " example:\r\n" + DB " CDX SEND 4B.000000.0000000000000000.00000000\r\n" + DB "\r\n" + DB "Switches:\r\n" + DB " -1 CDROM installed as Primary IDE Master device\r\n" + DB " -2 CDROM installed as Primary IDE Slave device\r\n" + DB " -3 CDROM installed as Secondary IDE Master device\r\n" + DB " -4 CDROM installed as Secondary IDE Slave device\r\n" + DZ " -h,? Help page\r\n" + _SETVAR .MSG_UNK_DEVICE_NUMBER + DZ " Error: Unknown device number %1\r\n" + _SETVAR .MSG_UNK_COMMAND + DZ " Error: Unknown command: %1\r\n" + _SETVAR .MSG_DONE + DZ "Done!\r\n" + _SETVAR .MSG_NO_CDROM + DZ " Error: Can't find CDROM device %1\r\n" + _SETVAR .MSG_IO_ERROR + DZ " Error: I/O Error\r\n" + _SETVAR .MSG_OLD_DSS + DZ " Error: Need DSS version 1.70 or higher\r\n" + _SETVAR .MSG_COPYFILE + DZ "Copying " + _SETVAR .MSG_DIRHEAD + DZ "Directory of CDROM:" + _SETVAR .MSG_DIRENTRY +; FILENAME EXT SIZE DATE TIME + DZ "%1 %2 %3 %4 %5\r\n" + _SETVAR .MSG_MEMERROR + DZ " Error: Memory allocation error\r\n" + _SETVAR .MSG_COPYTO + DZ " to " + _SETVAR .MSG_CD_READ_ERR + DZ " Error: Reading failure\r\n" + _SETVAR .MSG_F_WRITE_ERR + DZ " Error: Writing failure\r\n" + _SETVAR .MSG_FAILURE + DZ "Failure!\r\n" + _SETVAR .MSG_ERR_DEST + DZ " Error: Can't open destination file\r\n" + _SETVAR .MSG_COPYABORTED + DZ "Copying aborted\r\n" + _SETVAR .MSG_ERR_PACKET + DZ "Error: packet size incorrect\r\n" + _SETVAR .MSG_SEND_ATAPI + DZ "Send ATAPI packet..." + +.crlf: DZ "\r\n" + + DB 0 +MSG1 + +BUF_PTRS DW BUF1,BUF2,BUF3,BUF4,0 + +APCMD_BUF DB 12 DUP 0 + +;-------------------------------//BUFFERS\\-------------------------------; +FF_STRUCT: DB "12345678" + DB "123" + DB 0x00 + 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 0x00 ;ATTR +CDFNAME DB "12345678123",0 + +BUFFERS_START EQU $ + + INIT_VAR FF_STRUCT+256 + SETVAR DIRSPEC, 256 + SETVAR BUF1, 256 + SETVAR BUF2, 256 + SETVAR BUF3, 256 + SETVAR BUF4, 256 + SETVAR ARGCBUF, 256 + SETVAR DUMPBUF, 256 + +BUFFERS_END EQU DUMPBUF+2048-BUFFERS_START +; +BUFERS_NUMBER EQU 6 +; +; ASSERT (DUMPBUF+2048 < 0xC000), "NO FREE SPACE FOR BUFFERS" +;-----------------------------------------------------------------------; +DEV_CFG: +; DISPLAY "\n\tCDX size: ",/D,DEV_CFG - START +;[END] diff --git a/cmdparse.a80 b/cmdparse.a80 new file mode 100644 index 0000000..b292018 --- /dev/null +++ b/cmdparse.a80 @@ -0,0 +1,90 @@ + +; LAST UPDATE: 07.07.2025 savelij + +; HL - exe-prefix +; IX - pointers at work buffers +EX_COMMAND_LINE: + INC HL +.NEXTPR: LD DE,ARGCBUF + SPDSS DSSF.EX_PATH,EX_PATH.GSWITCH + 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,MSG0.MSG_UNK_DEVICE_NUMBER + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + JR .EOCL + +.number: SUB '1' + OR 0xC0 + PUSH IX + PUSH AF + CALL RESTORE_STATE + XOR A + LD (RESTORE_STATE.set_par),A + POP AF + LD (CDDRIVE),A + SPBIOS BIOSF.DRV_DETECT + POP IX + JR NC,.EOCL + CP ERR_DRV.ATAPI_MediumError + JR Z,.EOCL + CP ERR_DRV.ATAPI_UnitAttention + JR NZ,.error + LD A,(CDDRIVE) + PUSH IX + CALL SAVE_MEDIA_CHANGED + POP IX + JR NC,.EOCL +.error: LD HL,ARGCBUF+1 + CALL PUTVAR + LD A,MSG0.MSG_NO_CDROM + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + SCF + JR .CL_FAILURE + +.HELP: LD A,MSG0.MSG_USAGE + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + JR .EOCL diff --git a/command.a80 b/command.a80 new file mode 100644 index 0000000..db072b4 --- /dev/null +++ b/command.a80 @@ -0,0 +1,1036 @@ + +; LAST UPDATE: 05.07.2025 savelij + +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 0x61 + JP C,COMP001 + CP 0x7B + JP NC,COMP001 + SUB 0x20 +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,0xFF + 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,MSG0.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 + DZ "SEND" + DW SENDPACKET + DB 0 + +SENDPACKET LD A,MSG0.MSG_SEND_ATAPI + CALL MESSAGE + CALL CONV_HEX + JR NC,.L1 + LD A,MSG0.MSG_ERR_PACKET + JP MESSAGE + +.L1 LD A,(CDDRIVE) + LD HL,APCMD_BUF + SPBIOS BIOSF.DRV_EXTENDED,DRV_EXTENDED.ATAPI_Custom_PCMD + LD A,MSG0.MSG_DONE + JP MESSAGE + +; конвертор HEX дампа в бинарный формат +CONV_HEX LD HL,APCMD_BUF + PUSH HL + LD B,12 +.L1 LD (HL),0 + INC HL + DJNZ .L1 + LD HL,BUF2 + POP DE + LD B,12 ; количество байт в бинарном виде +.L2 CALL .GET_HALFBYTE + RET C + RRCA + RRCA + RRCA + RRCA + LD C,A ; старший полубайт из строки + CALL .GET_HALFBYTE + RET C + OR C ; доббавили младший полубайт + LD (DE),A ; занесли байт + INC DE + DJNZ .L2 + AND A + RET + +; получение полубайта из строки +.GET_HALFBYTE LD A,(HL) + INC HL + CP '.' ; разделитель в HEX строке пропускаем + JR Z,.GET_HALFBYTE + AND A + SCF + RET Z + CP '0' + RET C ; выход по ошибке + CP '9'+1 + JR C,.L3 ; обнаружена цифра + AND %11011111 + CP 'F'+1 + CCF + RET C ; выход по ошибке + CP 'A' + RET C ; выход по ошибке + SUB 7 ; если это символ A-F +.L3 SUB '0' ; конверсия в бинарь + AND A + RET + +CHELP: LD A,MSG0.MSG_USAGE + JP MESSAGE + +CCLOSE: LD A,MSG0.MSG_TRAY_CLOSE + CALL MESSAGE + LD A,(CDDRIVE) +; LD BC,BIOS.DRV_EXTENDED.ATAPI_Close +; RST ToBIOS + SPBIOS BIOSF.DRV_EXTENDED,DRV_EXTENDED.ATAPI_Close + LD A,MSG0.MSG_DONE + JP MESSAGE + +COPEN: LD A,MSG0.MSG_TRAY_OPEN + CALL MESSAGE + LD A,(CDDRIVE) +; LD BC,BIOS.DRV_EXTENDED.ATAPI_Eject +; RST ToBIOS + SPBIOS BIOSF.DRV_EXTENDED,DRV_EXTENDED.ATAPI_Eject + LD A,MSG0.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 A, DIR.M_Archive + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly + 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 + SPDSS DSSF.SCANKEY + JR Z,.NONSTOP + LD HL,0x011B ;ESC + AND A + SBC HL,DE + JR NZ,.NONSTOP + LD A,MSG0.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,0x20 + 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 + SPDSS DSSF.CREATE + JR NC,.OFOK + LD A,MSG0.MSG_ERR_DEST + CALL MESSAGE + SCF + RET + ; +.OFOK: LD (FHND),A + LD A,MSG0.MSG_COPYFILE + CALL MESSAGE + LD HL,BUF2 +; LD C,Dss.PChars +; RST ToDSS + SPDSS DSSF.PCHARS + LD A,MSG0.MSG_COPYTO + CALL MESSAGE + LD HL,BUF3 +; LD C,Dss.PChars +; RST ToDSS + SPDSS DSSF.PCHARS +; LD A," " +; LD C,Dss.PutChar +; RST ToDSS + SPDSS DSSF.PUTCHAR,,' ' + 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 + SPDSS DSSF.PUT_D_T +; + LD A,(FHND) +; LD C,Dss.Close +; RST ToDSS + SPDSS DSSF.CLOSE + LD A,MSG0.MSG_DONE + CALL MESSAGE + AND A + RET +.COPY_FAULT: + LD A,(FHND) +; LD C,Dss.Close +; RST ToDSS + SPDSS DSSF.CLOSE + 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 + SPDSS DSSF.EX_PATH,EX_PATH.GET_ALL + AND 0x80 + 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 + SPDSS DSSF.EX_PATH,EX_PATH.GET_ALL + AND 0x81 ;PATTERN & FILENAME + CP 0x01 ;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,0xC000 + LD A,(FHND) +; LD C,Dss.Write +; RST ToDSS + SPDSS DSSF.WRITE + JR C,.WRDERR + XOR A + INC A + RET +.WRDERR: + LD A,MSG0.MSG_FAILURE + CALL MESSAGE + CALL CRLF + LD A,MSG0.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,0x4000 ;BLOCKSIZE + SBC HL,BC + LD B,C + EX DE,HL + SBC HL,BC + EX DE,HL + LD BC,0x4000 + 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 0x07 + 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,0xC000 +; LD C,BIOS.DRV_READ +; RST ToBIOS + SPBIOS BIOSF.DRV_READ + LD BC,(BYTECOUNTER) + RET NC + LD A,MSG0.MSG_FAILURE + CALL MESSAGE + CALL CRLF + LD A,MSG0.MSG_CD_READ_ERR + CALL MESSAGE + SCF + RET + + +FHND DB 0xFF + +;---------------------- +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 + SPDSS DSSF.EX_PATH,EX_PATH.GET_ALL + 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 A, DIR.M_Archive + \ + DIR.M_Dir + \ + DIR.M_System + \ + DIR.M_Hidden + \ + DIR.M_ReadOnly + LD B,0 + CALL F_FIRST + JP C,ERROR +.CDIR_HEAD: + LD A,MSG0.MSG_DIRHEAD + CALL MESSAGE + LD HL,DIRSPEC +; LD C,Dss.PChars +; RST ToDSS + SPDSS DSSF.PCHARS + 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 0x00 +; 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 0x00 ;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,MSG0.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),0x20 + 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),0x20 + 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 0x1F + PUSH BC + CALL NUMB + LD (HL),"." + INC HL + POP BC + LD A,C + SRL B + RLA + RLA + RLA + RLA + AND 0x0F + CALL NUMB + LD (HL),"." + INC HL + LD A,B + ADD A,0x50 + CP 100 + JP C,NUMB +.SUB100: + SUB 100 + CP 100 + JP C,NUMB + JR .SUB100 + +NUMB: LD C,0x2F +.NUMB1: INC C + SUB 10 + JP NC,.NUMB1 + ADD A,10 + ADD A,0x30 + LD (HL),C + INC HL + LD (HL),A + INC HL + RET + +PRNSIZE LD A,(IX+32) + LD HL,DIRIDD + AND 0x10 + 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 0x20 + JR NZ,.ALR + LD A,0x30 + 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,0x3B9A ; 1000000000 + EXX + LD DE,0xCA00 + CALL GET_DIG + EXX + LD DE,0x05F5 ; 100000000 + EXX + LD DE,0xE100 + CALL GET_DIG + EXX + LD DE,0x0098 ; 10000000 + EXX + LD DE,0x9680 + CALL GET_DIG + EXX + LD DE,0x000F ; 1000000 + EXX + LD DE,0x4240 + CALL GET_DIG + EXX + LD DE,0x0001 ; 100000 + EXX + LD DE,0x86A0 + CALL GET_DIG + EXX + LD DE,0x0000 ; 10000 + EXX + LD DE,0x2710 + CALL GET_DIG + EXX + LD DE,0x0000 ; 1000 + EXX + LD DE,0x03E8 + CALL GET_DIG + EXX + LD DE,0x0000 ; 100 + EXX + LD DE,0x0064 + CALL GET_DIG + EXX + LD DE,0x0000 ; 10 + EXX + LD DE,0x000A + CALL GET_DIG + LD A,L ; 1 + ADD A,0x30 + LD (IX+0),A + INC IX + LD HL,L32BIT_ + LD DE,0x2030 + ; +.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,0x30 + LD (IX+0),A + INC IX + RET + +L32BIT_ DB "0000000000" + +DIRIDD DB " ",0 + +SIZEBFF DB "0 000 000 000",0,0 + +DEFDIR DB 0x5C,"*.*",0 + +;------------------------ + +CDUMP: LD HL,BUF2 + LD BC,0x0000 + 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 + SPBIOS BIOSF.DRV_READ,1 + JR C,.DMPERR + ; + LD HL,BUF3 + CALL GETNUM + PUSH IX + POP BC + LD A,B + AND 0x07 + LD B,A + LD HL,2048-0x01C0 + AND A + SBC HL,BC + JR NC,.GOODOFFS + LD BC,2048-0x01C0 +.GOODOFFS: + LD HL,DUMPBUF + ADD HL,BC + ; + CALL DUMP + JP CRLF +.DMPERR: + LD A,MSG0.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: DB " +00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF \r\n" + DZ " -------------------------------------------------- +----------------+" + + +DUMP: PUSH HL + LD HL,UPDUMP +; LD C,Dss.PChars +; RST ToDSS + SPDSS DSSF.PCHARS + POP HL + LD BC,0x1C00 +.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,0x08 +.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,0x08 +.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,0x10 +.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 0x0F + ADD A,0x30 + CP 0x3A + JR C,.PHEX2 + ADD A,7 +.PHEX2: CALL PRINT_ + LD A,E + AND 0x0F + ADD A,0x30 + CP 0x3A + JR C,.PHEX3 + ADD A,7 +.PHEX3: CALL PRINT_ + RET + +PRNCHAR: +; LD C,Dss.PutChar +; JP ToDSS + SPDSS DSSF.PUTCHAR + RET diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..e5a2443 --- /dev/null +++ b/readme.md @@ -0,0 +1,6 @@ +CDROM Extension utility ╨┤╨╗╤П ╨║╨╛╨╝╨┐╤М╤О╤В╨╡╤А╨░ Sprinter + +╨Ъ╨╛╨╜╤Б╨╛╨╗╤М╨╜╨░╤П ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨░ ╨┐╤А╨╡╨┤╨╜╨░╨╖╨╜╨░╤З╨╡╨╜╨░ ╨┤╨╗╤П ╨┐╨╛╨┤╨┤╨╡╤А╨╢╨║╨╕ CD-ROM ╨╜╨░ ╨║╨╛╨╝╨┐╤М╤О╤В╨╡╤А╨╡ +╨б╨┐╤А╨╕╨╜╤В╨╡╤А. ╨У╨╗╨░╨▓╨╜╤Л╨╝ ╨╛╨▒╤А╨░╨╖╨╛╨╝, ╤Г╤В╨╕╨╗╨╕╤В╨░ ╤Б╨╗╤Г╨╢╨╕╤В ╨┤╨╗╤П ╨║╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╤Д╨░╨╣╨╗╨╛╨▓ ╤Б CD-ROM ╨╜╨░ +╨┤╤А╤Г╨│╨╕╨╡ ╨┤╨╕╤Б╨║╨╕ ╨║╨╛╨╝╨┐╤М╤О╤В╨╡╤А╨░. ╨в╨░╨║ ╨╢╨╡ ╨╡╤Б╤В╤М ╨▓╨╛╨╖╨╝╨╛╨╢╨╜╨╛╤Б╤В╤М ╨╛╤В╨┐╤А╨░╨▓╨║╨╕ ATAPI ╨┐╨░╨║╨╡╤В╨░ ╨┤╨╗╤П +╤Г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╤П CD-ROM. diff --git a/vers.a80 b/vers.a80 new file mode 100644 index 0000000..86af9b1 --- /dev/null +++ b/vers.a80 @@ -0,0 +1,4 @@ + +; LAST UPDATE: 05.07.2025 savelij + +VERS EQU "1.03"