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' JP C,COMP001 CP 'z' + 1 JP NC,COMP001 SUB %0010'0000 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 .loop: CPI JP NZ,.loop 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 JR COPEN.cmd ; COPEN: LD A,MSG_TRAY_OPEN CALL MESSAGE LD A,(CDDRIVE) LD BC,BIOS.DRV_EXTENDED.ATAPI_Eject .cmd: 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 "