commit 194e7a1fca39cef2d452e8dcff8c97546c609846 Author: savelij13 Date: Mon Jul 7 19:49:39 2025 +0300 Версия 1.03 - поправлен cdx.txt - добалена возможность послать ATAPI пакет. - если нет диска в приводе, то не пишет ошибку, что нет привода diff --git a/bin/CDX.EXE b/bin/CDX.EXE new file mode 100644 index 0000000..114afa2 Binary files /dev/null and b/bin/CDX.EXE differ diff --git a/bin/CDX.TXT b/bin/CDX.TXT new file mode 100644 index 0000000..31fb6ab --- /dev/null +++ b/bin/CDX.TXT @@ -0,0 +1,75 @@ + +CDROM Extension utility v1.03 + +(c) Sprinter Team, 2025 + + ᮫쭠 ணࠬ ।祭 প CD-ROM +ਭ. ࠧ, ⨫ 㦨 ஢ 䠩 CD-ROM +㣨 ᪨ . ࠢ ATAPI +ࠢ CD-ROM. + +ᯮ짮: + +CDX [-] [] [ࠬ 1] [ࠬ 2] + +: + +OPEN -- ⮪ +CLOSE -- ⮪ +LIST [\cd\path\] [pattern] -- ᮤন ⠫ +COPY \source \destination -- ஢ 䠩 +DUMP sector [offset] -- ᥪ ᪠ +SEND hexline ["." separator] -- ࠢ ATAPI + +: + +-h,? -- 뢥 ⥪ ᪠ +-1 -- CDROM ⠭ Primary IDE Master +-2 -- CDROM ⠭ Primary IDE Slave device +-3 -- CDROM ⠭ Secondary IDE Master device +-4 -- CDROM ⠭ Secondary IDE Slave device + +ਬ ᯮ짮: + +cdx list +cdx list \waves\ +cdx copy \docs\*.* c:\docs\ +cdx copy \cd\waves\*.wav c:\waves\ +cdx copy \soft\filename.exe c:\files\newname.exe +cdx send 4B.000000.0000000000000000.00000000 +cdx send 4B000000000000000000000000000000 + +--- + +It is a command-line program for supporting of CD-ROM. Mainly, it serves +copying files from CD-ROM to hard disk or floppy disk. + +Usage: + +CDX [-switches] [command] [param1] [param2] + +Commands: +OPEN -- open tray +CLOSE -- close tray +LIST [\cd\path\] [pattern] -- show file(s) +COPY \source \destination -- copy file(s) from CD-ROM to another disk +DUMP sector [offset] -- show sector dump from CD-ROM +SEND hexline ["." separator] -- send ATAPI packet + +Switches: +-h,? -- help page +-1 -- CDROM installed as Primary IDE Master device +-2 -- CDROM installed as Primary IDE Slave device +-3 -- CDROM installed as Secondary IDE Master device +-4 -- CDROM installed as Secondary IDE Slave device + +Examples: +cdx list +cdx list \waves\ +cdx copy \docs\*.* c:\docs\ +cdx copy \cd\waves\*.wav c:\waves\ +cdx copy \soft\filename.exe c:\files\newname.exe +cdx send 4B.000000.0000000000000000.00000000 +cdx send 4B000000000000000000000000000000 + +--- diff --git a/bin/history.txt b/bin/history.txt new file mode 100644 index 0000000..f96071b --- /dev/null +++ b/bin/history.txt @@ -0,0 +1,5 @@ + + 1.03 +- ࠢ cdx.txt +- ᫠ ATAPI . +- ᫨ ᪠ ਢ, 訡, ਢ diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..94036a8 --- /dev/null +++ b/build.bat @@ -0,0 +1,23 @@ + +@echo off + +if not exist tmp md tmp +set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\svn\pentevo\tools\noice2equ\ +set includes=d:\yad\svn\pentevo\rom;d:\yad\zxgit\common_includes\ + +cls + +asl -U -L -C -x -olist tmp\cdx.lst -i %includes% cdx.a80 || goto error +p2bin cdx.p bin\cdx.exe -r $-$ -k + +echo ######################## +echo # -= End Compile Ok =- # +echo ######################## +goto exit + +:error +echo ####################### +echo # -= Error Compile =- # +echo ####################### + +:exit \ No newline at end of file diff --git a/build_pause.bat b/build_pause.bat new file mode 100644 index 0000000..84aefe7 --- /dev/null +++ b/build_pause.bat @@ -0,0 +1,6 @@ + +@ECHO OFF + +call build.bat + +pause diff --git a/cd_dos.a80 b/cd_dos.a80 new file mode 100644 index 0000000..e6076aa --- /dev/null +++ b/cd_dos.a80 @@ -0,0 +1,1225 @@ + +; LAST UPDATE: 29.06.2025 savelij + +PAGE0 EQU 0x82 ;WIN 0x0000-0x3FFF +PAGE1 EQU 0xA2 ;WIN 0x4000-0x7FFF +PAGE2 EQU 0xC2 ;WIN 0x8000-0xBFFF +PAGE3 EQU 0xE2 ;WIN 0xC000-0xFFFF + +ADRDIR EQU 0xC000 + +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 0x10 ;+11 ATTRIBUT + DB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED + DW 0x0000 ;+22 TIME + DW 0x0000 ;+24 DATE + DW 0x0000 ;+26 START CLUSTER + DW 0x0000,0x0000 ;+28 SIZE FILE + DW 0x0000,0x0000 ;+32 FILE POSITION (FP) + DW 0x0000 ;+36 DIRECTORY CLUSTER + DW 0x0000 ;+38 HANDLE NUMBER + DB 0x00 ;+40 DRIVE OR CURRENT + DB 0x00 ;+41 ACCESS MODE + DB 0x00 ;+42 TASK + DB 0x00 ;+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,IXH + LD E,IXL + 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 + 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"