cdx/command.a80
savelij13 a20b5d0156 Версия 1.04.01
- неправильно инитился CD-ROM после закрытия трея в команде CLOSETOC.
2025-07-13 21:53:27 +03:00

1104 lines
14 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HEX <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
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 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
.L2 CALL .GET_HALFBYTE
RET C
RRCA
RRCA
RRCA
RRCA
LD C,A ; <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><E3A1A0> <20><> <20><><EFBFBD>
CALL .GET_HALFBYTE
RET C
OR C ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><E3A1A0>
LD (DE),A ; <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>
INC DE
DJNZ .L2
AND A
RET
; <20><><EFBFBD><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><E3A1A0><EFBFBD> <20><> <20><><EFBFBD>
.GET_HALFBYTE LD A,(HL)
INC HL
CP '.' ; ࠧ<><E0A0A7><EFBFBD><EFBFBD><EFBFBD> <20> HEX <20><><EFBFBD> <20><EFBFBD><EFBFBD><E1AAA0>
JR Z,.GET_HALFBYTE
AND A
SCF
RET Z
CP '0'
RET C ; <20><><20><> <20><EFBFBD><E8A8A1>
CP '9'+1
JR C,.L3 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A6A5> <20><><EFBFBD><EFBFBD><EFBFBD>
AND %11011111
CP 'F'+1
CCF
RET C ; <20><><20><> <20><EFBFBD><E8A8A1>
CP 'A'
RET C ; <20><><20><> <20><EFBFBD><E8A8A1>
SUB 7 ; <20><20><><EFBFBD><><E1A8AC><EFBFBD> A-F
.L3 SUB '0' ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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 "<DIR> ",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