; LAST UPDATE: 13.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 'a' ;0x61 JP C,COMP001 CP 'z'+1 ;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 DZ "CLOSE" DW CCLOSE DZ "COPY" DW CCOPY DZ "DUMP" DW CDUMP DZ "EJECT" DW COPEN DZ "HELP" DW CHELP DZ "LIST" DW CDIR DZ "OPEN" DW COPEN DZ "SECTORDUMP" DW CDUMP DZ "SEND" DW SENDPACKET DZ "READTOC" DW READTOC DZ "CLOSETOC" DW CLOSETOC DB 0 RESULT EQU DUMPBUF + 3000 CLOSETOC LD A,MSG0.MSG_CLOSETRAY_READTOC CALL MESSAGE LD HL,APCMD.CLOSETRAY CALL SENDPAKET CALL CHANGEDISK JR READTOC.L2 READTOC LD A,MSG0.MSG_READTOC CALL MESSAGE .L2 LD A,0xAA LD (RESULT + 6),A LD HL,APCMD.READTOC CALL SENDPAKET LD HL,RESULT-2 LD B,0xFF LD DE,8 .L1 INC B ADD HL,DE LD A,(HL) CP 0xAA JR NZ,.L1 LD A,B CALL A2HEX LD HL,MSG0.MRR2 LD (HL),B INC HL LD (HL),A LD A,(RESULT) CALL A2HEX LD HL,MSG0.MRR1 LD (HL),B INC HL LD (HL),A LD A,MSG0.MSG_RESULT_READTOC JP MESSAGE SENDPAKET LD DE,RESULT LD A,(CDDRIVE) SPBIOS BIOSF.DRV_EXTENDED,DRV_EXTENDED.ATAPI_Custom_PCMD RET A2HEX PUSH AF AND %11110000 RRCA RRCA RRCA RRCA CALL .L2 LD B,A POP AF AND %00001111 .L2 ADD A,'0' CP '9'+1 RET C ADD A,7 RET APCMD .READTOC DB 0x43,0x02,0x00,0x00,0x00,0x00,0x01,0x03,0x24,0x00,0x00,0x00 .CLOSETRAY DB 0x1B,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00 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