Estex-DSS/DSS/drivers/media/ATAPI/COMMAND.ASM
2024-12-04 22:39:16 +10:00

942 lines
12 KiB
NASM

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.CD_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.CD_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 "<DIR> ",0
SIZEBFF DB "0 000 000 000",0,0
DEFDIR DB #5C,"*.*",0
;------------------------
CDUMP: LD HL,BUF2
LD BC,#0000
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
JR C,.DMPERR
;
LD HL,BUF3
CALL GETNUM
PUSH IX
POP BC
LD A,B
AND #07
LD B,A
LD HL,2048-#01C0
AND A
SBC HL,BC
JR NC,.GOODOFFS
LD BC,2048-#01C0
.GOODOFFS:
LD HL,DUMPBUF
ADD HL,BC
;
CALL DUMP
JP CRLF
.DMPERR:
LD A,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: BYTE " +00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ",CR,LF
DZ " -------------------------------------------------- +----------------+"
DUMP: PUSH HL
LD HL,UPDUMP
LD C,Dss.PChars
RST ToDSS
POP HL
LD BC,#1C00
.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,#08
.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,#08
.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,#10
.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 #0F
ADD A,#30
CP #3A
JR C,.PHEX2
ADD A,7
.PHEX2: CALL PRINT_
LD A,E
AND #0F
ADD A,#30
CP #3A
JR C,.PHEX3
ADD A,7
.PHEX3: CALL PRINT_
RET
PRNCHAR:
LD C,Dss.PutChar
JP ToDSS
;