COMMAND LD HL,BUF1 LD A,(HL) OR A RET Z DEC HL SKIPSP INC HL LD A,(HL) CP 9 JR Z,SKIPSP CP " " JR Z,SKIPSP COMP01 LD D,H LD E,L XOR A LD BC,255 CPIR LD A,254 SUB C LD C,A LD HL,CMDLIST COMP004 PUSH BC PUSH DE COMP000 LD A,(DE) CP #61 JP C,COMP001 CP #7B JP NC,COMP001 SUB #20 COMP001 CP (HL) JP NZ,COMP002 INC HL INC DE DEC C JP NZ,COMP000 XOR A CP (HL) JP NZ,COMP002 POP BC POP BC LD A,(DE) CP " " JR NZ,NOSPC INC DE NOSPC INC HL LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) COMP002 XOR A LD C,#FF CPI JP NZ,$-2 INC HL INC HL POP DE POP BC LD A,(HL) OR A JP NZ,COMP004 LD HL,BUF1 CALL PUTVAR LD A,MSG_UNK_COMMAND CALL MESSAGE SCF RET CMDLIST DB "CLOSE",0 DW CCLOSE DB "COPY",0 DW CCOPY DB "DUMP",0 DW CDUMP DB "EJECT",0 DW COPEN DB "HELP",0 DW CHELP DB "LIST",0 DW CDIR DB "OPEN",0 DW COPEN DB "SECTORDUMP",0 DW CDUMP DB 0 CHELP: LD A,MSG_USAGE JP MESSAGE CCLOSE: LD A,MSG_TRAY_CLOSE CALL MESSAGE LD A,(CDDRIVE) LD BC,BIOS.DRV_EXTENDED.ATAPI_Close RST ToBIOS LD A,MSG_DONE JP MESSAGE COPEN: LD A,MSG_TRAY_OPEN CALL MESSAGE LD A,(CDDRIVE) LD BC,BIOS.DRV_EXTENDED.ATAPI_Eject RST ToBIOS LD A,MSG_DONE JP MESSAGE CCOPY: CALL CHANGEDISK JR NC,.CH2OK JP ERROR .CH2OK: CALL EX_COPY_PARAM LD HL,BUF2 LD DE,FF_STRUCT LD A,FAT_ATTR.NoDIRnoVolID LD B,1 CALL F_FIRST JP C,ERROR .COPIER: CALL MAKECOPY RET C LD A,(COPYMODE) BIT DSTFILE,A RET NZ ; LD C,Dss.ScanKey RST ToDSS JR Z,.NONSTOP LD HL,#011B ;ESC AND A SBC HL,DE JR NZ,.NONSTOP LD A,MSG_COPYABORTED CALL MESSAGE SCF RET .NONSTOP: LD DE,FF_STRUCT CALL F_NEXT JR NC,.COPIER XOR A RET ; IFNOTFOUND ; CALL ERROR ; RET ;IFOK MAKECOPY: LD A,(COPYMODE) BIT SRCPATT,A JR NZ,.WITH_SRC_PATT BIT DSTFILE,A JR NZ,.WITH_DST_FILE .WITH_SRC_PATT: LD HL,CDFNAME .YCR1: LD A,(HL) CP "A" JR C,.NCR1 CP "Z"+1 JR NC,.NCR1 ADD A,#20 LD (HL),A .NCR1: OR A INC HL JR NZ,.YCR1 ; LD HL,CDFNAME LD DE,(SRC_PUT_ADR) .CZSL2: LD A,(HL) LDI OR A JR NZ,.CZSL2 ; LD A,(COPYMODE) BIT DSTFILE,A JR NZ,.WITH_DST_FILE ; LD HL,CDFNAME LD DE,(DST_PUT_ADR) .CZSL1: LD A,(HL) LDI OR A JR NZ,.CZSL1 ; .WITH_DST_FILE: LD HL,BUF3 LD A,(CDFATTR) LD C,Dss.Create RST ToDSS JR NC,.OFOK LD A,MSG_ERR_DEST CALL MESSAGE SCF RET ; .OFOK: LD (FHND),A LD A,MSG_COPYFILE CALL MESSAGE LD HL,BUF2 LD C,Dss.PChars RST ToDSS LD A,MSG_COPYTO CALL MESSAGE LD HL,BUF3 LD C,Dss.PChars RST ToDSS LD A," " LD C,Dss.PutChar RST ToDSS LD IX,FF_STRUCT LD E,(IX+LEN1) LD D,(IX+LEN2) LD (CL_SIZE),DE LD E,(IX+LEN3) LD D,(IX+LEN4) LD (CH_SIZE),DE LD E,(IX+CLU1) LD D,(IX+CLU2) LD (CL_OFFSET),DE LD E,(IX+CLU3) LD D,(IX+CLU4) LD (CH_OFFSET),DE .CDCOPY_LOOP: CALL RCDFSB ;!!!!! JR C,.COPY_FAULT CALL WDATAB JR C,.COPY_FAULT JR NZ,.CDCOPY_LOOP ; LD DE,(CDFTIME) LD BC,(CDFDATE) CALL RMKTIME LD A,(FHND) LD C,Dss.Put_D_T ;COPY DATE AND TIME RST ToDSS ; LD A,(FHND) LD C,Dss.Close RST ToDSS LD A,MSG_DONE CALL MESSAGE AND A RET .COPY_FAULT: LD A,(FHND) LD C,Dss.Close RST ToDSS SCF RET EX_COPY_PARAM LD HL,BUF2 ;SOURCE LD BC,255 XOR A CPIR DEC HL EX DE,HL LD HL,256 AND A SBC HL,BC LD B,H LD C,L EX DE,HL LD A,'\' ; CPDR INC HL INC HL LD (SRC_PUT_ADR),HL ; LD HL,BUF2 LD BC,Dss.EX_Path.GET_ALL RST ToDSS AND #80 LD A,(COPYMODE) SET SRCPATT,A JR NZ,.NOPATSR RES SRCPATT,A .NOPATSR: LD (COPYMODE),A LD HL,BUF3 ;DESTINATION LD BC,Dss.EX_Path.GET_ALL RST ToDSS AND #81 ;PATTERN & FILENAME CP #01 ;IF FILENAME=1 AND PATTERN=0 LD A,(COPYMODE) SET DSTFILE,A JR Z,.SINGC1 RES DSTFILE,A .SINGC1: LD (COPYMODE),A RET Z LD HL,BUF3 LD BC,255 XOR A CPIR ;MOVE TO END OF STRING DEC HL ;MOVE TO ZERO-CHAR DEC HL ;MOVE TO LAST CHAR LD A,(HL) ;GET LAST CHAR INC HL ;MOVE TO ZERO-CHAR CP '\' ;IS IT BACKSLASH? LD (DST_PUT_ADR),HL ;SAVE END ADDRESS RET Z LD A,'\' ; LD (HL),A ;PUT BACKSLASH TO THE END OF STRING INC HL ;MOVE TO THE NEW END OF STRING LD (DST_PUT_ADR),HL ;SAVE END ADDRESS LD (HL),0 ;PUT ZERO CHAR RET DSTFILE EQU 0 ;SPECIFIED DESTINATION FILENAME SRCPATT EQU 3 ;SPECIFIED SOURCE PATTERN A??.* COPYMODE DB 0 SRC_PUT_ADR DW BUF2 DST_PUT_ADR DW BUF3 CL_OFFSET DW 0 CH_OFFSET DW 0 CL_SIZE DW 0 CH_SIZE DW 0 BYTECOUNTER DW 0 WDATAB: LD DE,(BYTECOUNTER) LD A,D OR E RET Z LD HL,#C000 LD A,(FHND) LD C,Dss.Write RST ToDSS JR C,.WRDERR XOR A INC A RET .WRDERR: LD A,MSG_FAILURE CALL MESSAGE CALL CRLF LD A,MSG_F_WRITE_ERR CALL MESSAGE XOR A SCF RET RCDFSB: LD HL,(CL_SIZE) LD DE,(CH_SIZE) LD A,H OR L OR D OR E LD BC,0 LD (BYTECOUNTER),BC RET Z ;SIZE = 0 AND A LD BC,#4000 ;BLOCKSIZE SBC HL,BC LD B,C EX DE,HL SBC HL,BC EX DE,HL LD BC,#4000 JR NC,.RC_NOCAR ;CORRECT RESULT ADD HL,BC LD B,C EX DE,HL ADC HL,BC EX DE,HL LD B,H LD C,L LD HL,0 LD DE,0 .RC_NOCAR: LD (CL_SIZE),HL LD (CH_SIZE),DE LD (BYTECOUNTER),BC ; LD A,B SRL B SRL B SRL B AND #07 OR C JR Z,.RC_EVEN_NUM INC B .RC_EVEN_NUM: LD A,B LD C,B LD B,0 ; LD IX,(CL_OFFSET) LD HL,(CH_OFFSET) PUSH IX PUSH HL ADD IX,BC LD C,B ADC HL,BC LD (CL_OFFSET),IX LD (CH_OFFSET),HL POP HL POP IX LD B,A LD A,(CDDRIVE) LD DE,#C000 LD C,BIOS.DRV_READ RST ToBIOS LD BC,(BYTECOUNTER) RET NC LD A,MSG_FAILURE CALL MESSAGE CALL CRLF LD A,MSG_CD_READ_ERR CALL MESSAGE SCF RET FHND DB #FF ;---------------------- CDIR: CALL CHANGEDISK JP C,ERROR LD HL,BUF2 LD A,(HL) OR A JR NZ,.NODEFD LD HL,DEFDIR JR .PATPRESNT .NODEFD: LD BC,Dss.EX_Path.GET_ALL RST ToDSS BIT 7,A ;PATTERN LD HL,BUF2 JR NZ,.PATPRESNT ; LD BC,255 XOR A CPIR ;MOVE TO END OF STRING DEC HL ;MOVE TO ZERO-CHAR DEC HL ;MOVE TO LAST CHAR LD A,(HL) ;GET LAST CHAR INC HL ;MOVE TO ZERO-CHAR CP '\' ;IS IT BACKSLASH? JR Z,.WITHSL9 LD A,'\' ; LD (HL),A ;PUT BACKSLASH TO THE END OF STRING INC HL ;MOVE TO THE NEW END OF STRING .WITHSL9: LD A,"*" LD (HL),A INC HL LD (HL),"." INC HL LD (HL),A INC HL LD (HL),0 LD HL,BUF2 .PATPRESNT LD DE,FF_STRUCT LD A,FAT_ATTR.NoVolID LD B,0 CALL F_FIRST JP C,ERROR .CDIR_HEAD: LD A,MSG_DIRHEAD CALL MESSAGE LD HL,DIRSPEC LD C,Dss.PChars RST ToDSS CALL CRLF CALL CRLF .CDIR_LOOP: LD HL,CDFNAME CALL PNAME LD DE,FF_STRUCT CALL F_NEXT JR NC,.CDIR_LOOP RET ; FF_STRUCT ; DB "12345678" ; DB "123" ; DB #00 ; DW 0,0,0,0 ; CDFPOSH DW 0 ;CLUSTER HIGH ; CDFTIME DW 0 ;TIME ; CDFDATE DW 0 ;DATE ; CDFPOSL DW 0 ;CLUSTER ; CDFSIZE DW 0,0 ;SIZE ; CDFATTR DB #00 ;ATTR ; CDFNAME DB "12345678123",0 ; ; DS 44 ; DS 256-($-FF_STRUCT) PNAME LD BC,8 LD DE,PRM1 LDIR XOR A LD (DE),A LD DE,PRM2 LDI LDI LDI LD (DE),A LD IX,FF_STRUCT CALL PRNSIZE CALL PRNDATE CALL PRNTIME LD A,MSG_DIRENTRY JP MESSAGE PRNDATE LD B,(IX+25) LD C,(IX+24) LD HL,SIZEBFF CALL DATE LD (HL),0 LD HL,SIZEBFF LD DE,PRM4 LD A,(HL) CP "0" JP NZ,PUTPRM LD (HL),#20 JP PUTPRM PRNTIME LD B,(IX+22) LD C,(IX+23) LD HL,SIZEBFF CALL TIME LD (HL),0 LD HL,SIZEBFF LD DE,PRM5 LD A,(HL) CP "0" JP NZ,PUTPRM LD (HL),#20 JP PUTPRM TIME: SRL C RR B SRL C RR B SRL C RR B SRL B SRL B LD A,C CALL NUMB LD (HL),":" INC HL LD A,B JP NUMB DATE: LD A,C AND #1F PUSH BC CALL NUMB LD (HL),"." INC HL POP BC LD A,C SRL B RLA RLA RLA RLA AND #0F CALL NUMB LD (HL),"." INC HL LD A,B ADD A,#50 CP 100 JP C,NUMB .SUB100: SUB 100 CP 100 JP C,NUMB JR .SUB100 NUMB: LD C,#2F .NUMB1: INC C SUB 10 JP NC,.NUMB1 ADD A,10 ADD A,#30 LD (HL),C INC HL LD (HL),A INC HL RET PRNSIZE LD A,(IX+32) LD HL,DIRIDD AND #10 JP NZ,.PRZ LD L,(IX+28) LD H,(IX+29) EXX LD L,(IX+30) LD H,(IX+31) EXX PUSH IX CALL MAKE_LN LD HL,L32BIT_+9 LD A,(HL) CP #20 JR NZ,.ALR LD A,#30 LD (HL),A .ALR: LD DE,SIZEBFF LD HL,L32BIT_;; +1 LDI LD A," " LD (DE),A INC DE LDI LDI LDI LD (DE),A INC DE LDI LDI LDI LD (DE),A INC DE LDI LDI LDI LD HL,SIZEBFF POP IX .PRZ: LD DE,PRM3 JP PUTPRM MAKE_LN: LD IX,L32BIT_ EXX LD DE,#3B9A ; 1000000000 EXX LD DE,#CA00 CALL GET_DIG EXX LD DE,#05F5 ; 100000000 EXX LD DE,#E100 CALL GET_DIG EXX LD DE,#0098 ; 10000000 EXX LD DE,#9680 CALL GET_DIG EXX LD DE,#000F ; 1000000 EXX LD DE,#4240 CALL GET_DIG EXX LD DE,#0001 ; 100000 EXX LD DE,#86A0 CALL GET_DIG EXX LD DE,#0000 ; 10000 EXX LD DE,#2710 CALL GET_DIG EXX LD DE,#0000 ; 1000 EXX LD DE,#03E8 CALL GET_DIG EXX LD DE,#0000 ; 100 EXX LD DE,#0064 CALL GET_DIG EXX LD DE,#0000 ; 10 EXX LD DE,#000A CALL GET_DIG LD A,L ; 1 ADD A,#30 LD (IX+0),A INC IX LD HL,L32BIT_ LD DE,#2030 ; .KILLZ: LD A,(HL) CP E JR NZ,.KILLZ2 LD (HL),D INC HL JP .KILLZ .KILLZ2: LD HL,L32BIT_+9 LD A,(HL) CP D RET NZ LD (HL),E RET ; HL:HL - DE:DE GET_DIG: XOR A .INC_DG: INC A SBC HL,DE EXX SBC HL,DE EXX JP NC,.INC_DG ADD HL,DE EXX ADC HL,DE EXX DEC A ADD A,#30 LD (IX+0),A INC IX RET L32BIT_ DB "0000000000" DIRIDD DB "