489 lines
8.4 KiB
Plaintext
489 lines
8.4 KiB
Plaintext
|
||
; LAST UPDATE: 13.07.2025 savelij
|
||
|
||
include macros.a80
|
||
include bios_sp.a80
|
||
include dss_sp.a80
|
||
include errors_sp.a80
|
||
include fat_dir_sp.a80
|
||
include macros_sp.a80
|
||
include vers.a80
|
||
|
||
;[BEGIN]
|
||
;
|
||
; CDX.EXE [command] [-switches] [directory]
|
||
;
|
||
;commands:
|
||
; OPEN
|
||
; EJECT
|
||
; CLOSE
|
||
; COPY
|
||
; LIST
|
||
; DUMP
|
||
; COMMAND
|
||
; SEND
|
||
; -h,? Help page
|
||
|
||
HDR_EXE 0x8100,1,0,START,START,0xBFFF,0
|
||
|
||
START: PUSH IX
|
||
XOR A
|
||
; LD HL,BUF1
|
||
; LD (HL),A
|
||
; LD DE,BUF1+1
|
||
; LD BC,BUFFERS_END-1
|
||
; LDIR
|
||
LD HL,'\\'
|
||
LD (DIRSPEC),HL
|
||
LD HL,BUF1
|
||
LD B,BUFERS_NUMBER
|
||
.initBuffersLoop:
|
||
LD (HL),A
|
||
INC H
|
||
DJNZ .initBuffersLoop
|
||
LD A,MSG0.MSG_HELLO
|
||
CALL MESSAGE
|
||
CALL INIT
|
||
JR NC,.next
|
||
LD HL,PRM1
|
||
LD (HL),0
|
||
LD A,MSG0.MSG_NO_CDROM
|
||
CALL MESSAGE
|
||
LD A,1
|
||
LD (STOPMODE),A
|
||
.next:
|
||
SPDSS DSSF.VERSION
|
||
EX DE,HL
|
||
AND A
|
||
LD DE,0x0146 ;1.70
|
||
SBC HL,DE ;CHECK DSS VERSION
|
||
POP HL
|
||
JP C,OLD_DSS
|
||
LD IX,BUF_PTRS
|
||
CALL EX_COMMAND_LINE
|
||
CALL MALLOC
|
||
JR C,QUIT
|
||
; CALL FIND_CDROM
|
||
LD A,(STOPMODE)
|
||
OR A
|
||
CALL Z,COMMAND
|
||
; CALL MDEALLOC
|
||
QUIT: CALL CRLF
|
||
CALL RESTORE_STATE
|
||
.loop:
|
||
SPDSS DSSF.EXIT,0
|
||
JP .loop
|
||
|
||
OLD_DSS: LD A,MSG0.MSG_OLD_DSS
|
||
CALL MESSAGE
|
||
JR QUIT
|
||
|
||
RESTORE_STATE: LD B,1
|
||
.set_par: EQU $-1
|
||
LD A,(CDDRIVE)
|
||
SPBIOS BIOSF.DRV_SET_PAR
|
||
RET
|
||
|
||
;HNDMEM DB 0xFF
|
||
|
||
MALLOC:
|
||
SPDSS DSSF.GETMEM,2
|
||
JR NC,.cont
|
||
LD A,MSG0.MSG_MEMERROR
|
||
CALL MESSAGE
|
||
SCF
|
||
RET
|
||
|
||
.cont: PUSH AF
|
||
SPDSS DSSF.SETWIN3,1
|
||
LD HL,BANKTBL
|
||
POP AF
|
||
SPBIOS BIOSF.GETMEMBLKPAGES
|
||
RET
|
||
|
||
; MDEALLOC
|
||
; LD A,(HNDMEM)
|
||
; LD C,Dss.FreeMem
|
||
; JP ToDSS
|
||
|
||
; FIND_CDROM
|
||
; LD IX,DEV_CFG
|
||
; LD C,BIOS.DRV_LIST
|
||
; RST ToBIOS
|
||
; LD A,(IX+3) ;CDROM
|
||
; OR A
|
||
; JR Z,W_O_CD
|
||
; LD A,(CDDRIVE)
|
||
; INC A
|
||
; RET NZ
|
||
; LD A,SLAVE ;DEFAULT
|
||
; LD (CDDRIVE),A
|
||
; RET
|
||
; W_O_CD LD A,MSG_NO_CDROM
|
||
; CALL MESSAGE
|
||
; LD A,1
|
||
; LD (STOPMODE),A
|
||
; SCF
|
||
; RET
|
||
|
||
;BUF_PRINT
|
||
; LD HL,BUF_PTRS
|
||
;BUF_PL LD E,(HL)
|
||
; INC HL
|
||
; LD D,(HL)
|
||
; INC HL
|
||
; LD A,D
|
||
; OR E
|
||
; RET Z
|
||
; PUSH HL
|
||
; EX DE,HL
|
||
; LD C,Dss.PCHARS
|
||
; RST ToDSS
|
||
; CALL CRLF
|
||
; POP HL
|
||
; JR BUF_PL
|
||
|
||
;OPEN_FILE
|
||
; LD HL,FILENAME
|
||
; XOR A
|
||
; LD C,Dss.OPEN
|
||
; RST ToDSS
|
||
; LD (FILEHND),A
|
||
; RET NC
|
||
; LD HL,FILENAME
|
||
; CALL PUTVAR
|
||
; LD A,MSG_CANT_OPEN
|
||
; CALL MESSAGE
|
||
; SCF
|
||
; RET
|
||
|
||
;CLOSE_FILE
|
||
; LD A,(FILEHND)
|
||
; LD C,Dss.CLOSE
|
||
; RST ToDSS
|
||
; RET
|
||
|
||
INIT: XOR A
|
||
LD (STOPMODE),A
|
||
DEC A
|
||
LD (CDDRIVE),A
|
||
LD B,0xC0 - 1
|
||
.loop: INC B
|
||
LD A,B
|
||
CP 0xC4
|
||
SCF
|
||
RET Z
|
||
PUSH BC
|
||
SPBIOS BIOSF.DRV_DETECT
|
||
POP BC
|
||
JR NC,.found
|
||
CP ERR_DRV.ATAPI_MediumError
|
||
JR Z,.media_changed
|
||
CP ERR_DRV.ATAPI_UnitAttention
|
||
JR NZ,.loop
|
||
.media_changed: PUSH BC
|
||
LD A,B
|
||
CALL SAVE_MEDIA_CHANGED
|
||
POP BC
|
||
.found: LD A,B
|
||
LD (CDDRIVE),A
|
||
RET
|
||
|
||
SAVE_MEDIA_CHANGED:
|
||
SPBIOS BIOSF.DRV_GET_PAR
|
||
OR %00000010
|
||
LD B,A
|
||
LD A,(RESTORE_STATE.set_par)
|
||
OR B
|
||
LD (RESTORE_STATE.set_par),A
|
||
RET
|
||
|
||
STOPMODE DB 0x00
|
||
|
||
CMD_PARSE_ASM.Start:
|
||
include cmdparse.a80
|
||
CMD_PARSE_ASM.End EQU $
|
||
COMMAND_ASM.Start
|
||
include command.a80
|
||
COMMAND_ASM.End EQU $
|
||
CD_DOS_ASM.Start:
|
||
include cd_dos.a80
|
||
CD_DOS_ASM.End EQU $
|
||
|
||
CRLF: PUSH HL
|
||
LD HL,MSG0.crlf
|
||
SPDSS DSSF.PCHARS
|
||
POP HL
|
||
RET
|
||
|
||
ERROR: ;CP MAX_DSS_ERR
|
||
LD E,A
|
||
LD D,0
|
||
;JR C,.ERR_MSG
|
||
;LD E,D
|
||
;JP .ERR_MSG
|
||
|
||
.ERR_MSG: PUSH DE
|
||
LD HL,ERRCDX
|
||
CALL PRINTZ
|
||
POP DE
|
||
CALL FMESAGE
|
||
CALL PRINTZ
|
||
CALL CRLF
|
||
JP CRLF
|
||
|
||
FMESAGE: LD A,E
|
||
LD HL,SYS_ERRORS ; <20><><EFBFBD>ᨢ <20><>ப
|
||
LD BC,SYS_ERRORS.Size ; ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨢ<EFBFBD>
|
||
RLA
|
||
jr nc,.set_de
|
||
ld hl,DRV_ERRORS ; <20><><EFBFBD>ᨢ <20><>ப
|
||
ld bc,DRV_ERRORS.Size ; ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨢ<EFBFBD>
|
||
.set_de: SRL A
|
||
LD E,A
|
||
INC DE
|
||
LCPIR: XOR A
|
||
CPIR
|
||
RET PO
|
||
RET NZ
|
||
XOR A
|
||
CP (HL)
|
||
JR Z,.no_mess
|
||
DEC DE
|
||
LD A,D
|
||
OR E
|
||
JP NZ,LCPIR
|
||
RET
|
||
.no_mess: INC HL
|
||
RET
|
||
|
||
IF 0;/*
|
||
LCPIR: xor a
|
||
cpir
|
||
ret po
|
||
ret nz
|
||
;R11
|
||
XOR A
|
||
CP (HL)
|
||
JR Z,.no_mess
|
||
;
|
||
dec de
|
||
ld a,d
|
||
or e
|
||
jr nz,LCPIR
|
||
ret
|
||
.no_mess: INC HL
|
||
RET
|
||
|
||
print_err_message:
|
||
ld hl,SYS_ERRORS ; <20><><EFBFBD>ᨢ <20><>ப
|
||
ld bc,SYS_ERRORS.Size ; ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨢ<EFBFBD>
|
||
;cp %1000'0000
|
||
RLA
|
||
jr nc,.set_de
|
||
;
|
||
;and %0111'1111
|
||
ld hl,DRV_ERRORS ; <20><><EFBFBD>ᨢ <20><>ப
|
||
ld bc,DRV_ERRORS.Size ; ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ᨢ<EFBFBD>
|
||
;
|
||
.set_de: SRL A
|
||
ld e,a
|
||
ld d,0
|
||
inc de
|
||
call LCPIR ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><>ப<EFBFBD>
|
||
call PRINTZ ; <20><>ଠ<EFBFBD>. <20>뢮<EFBFBD> <20><>ப<EFBFBD>
|
||
jp newline
|
||
ENDIF;*/
|
||
|
||
ERRCDX DB "CDX: ",0
|
||
|
||
include dss_errors.a80
|
||
|
||
;FIND_MESSAGE LD E,A
|
||
; LD D,0
|
||
; CALL MESAGE
|
||
; RET
|
||
|
||
MESSAGE LD E,A
|
||
LD D,0
|
||
CALL MESAGE
|
||
JP PRINTZ
|
||
|
||
MESAGE INC DE
|
||
LD HL,MSG0
|
||
LD BC,MSG1-MSG0
|
||
LCPIR2 XOR A
|
||
CPIR
|
||
RET PO
|
||
RET NZ
|
||
DEC DE
|
||
LD A,D
|
||
OR E
|
||
JP NZ,LCPIR2
|
||
RET
|
||
|
||
PRINTZ LD A,(HL)
|
||
INC HL
|
||
OR A
|
||
RET Z
|
||
CP "%"
|
||
JR NZ,PRINTZ2
|
||
LD A,(HL)
|
||
INC HL
|
||
SUB "1"
|
||
PUSH HL
|
||
LD L,A
|
||
LD H,0
|
||
ADD HL,HL
|
||
ADD HL,HL
|
||
ADD HL,HL
|
||
ADD HL,HL
|
||
LD BC,PRM1
|
||
ADD HL,BC
|
||
SPDSS DSSF.PCHARS
|
||
POP HL
|
||
JR PRINTZ
|
||
|
||
PRINTZ2
|
||
SPDSS DSSF.PUTCHAR
|
||
JP PRINTZ
|
||
|
||
PRINT_
|
||
SPBIOS BIOSF.LP_PRINT_SYM,1
|
||
RET
|
||
|
||
PUTVAR LD DE,PRM1
|
||
PUTPRM LD BC,15
|
||
PUTPRMA LD A,(HL)
|
||
LDI
|
||
RET PO
|
||
OR A
|
||
JR NZ,PUTPRMA
|
||
RET
|
||
|
||
CDDRIVE DB 0xFF
|
||
|
||
PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
|
||
MSG0 DB 0
|
||
_INIT_VAR
|
||
_SETVAR .MSG_HELLO
|
||
DB "CDROM eXtension utility v\{VERS}, build \{BUILDDATE} (c) Sprinter Team\r\n"
|
||
DZ "Type CDX.EXE -? for help.\r\n"
|
||
_SETVAR .MSG_TRAY_OPEN
|
||
DZ "Opening tray..."
|
||
_SETVAR .MSG_TRAY_CLOSE
|
||
DZ "Closing tray..."
|
||
; 01234567890123456789012345678901234567890123456789012345678901234567890123456789
|
||
_SETVAR .MSG_USAGE
|
||
DB " Usage: CDX.EXE [-switches] [command] [param1] [param2]\r\n\r\n"
|
||
DB "Commands:\r\n"
|
||
DB " CDX OPEN - Open tray\r\n"
|
||
DB " CDX CLOSE - Close tray\r\n"
|
||
DB " CDX LIST [\\cd_path\\][pattern] - Show CDROM filelist\r\n"
|
||
DB " CDX COPY \\source d:\\destination\\ - Copy file(s) from CDROM to another disk\r\n"
|
||
DB " CDX DUMP sector [offset] - Show sector dump from CDROM\r\n"
|
||
DB " CDX SEND hexline [\".\" separator] - Send ATAPI command\r\n"
|
||
DB " example:\r\n"
|
||
DB " CDX SEND 4B.000000.0000000000000000.00000000\r\n"
|
||
DB "\r\n"
|
||
DB " CDX READTOC - Read TOC Audio-CD\r\n"
|
||
DB " CDX CLOSETOC - Close tray and read TOC Audio-CD\r\n"
|
||
DB "Switches:\r\n"
|
||
DB " -1 CDROM installed as Primary IDE Master device\r\n"
|
||
DB " -2 CDROM installed as Primary IDE Slave device\r\n"
|
||
DB " -3 CDROM installed as Secondary IDE Master device\r\n"
|
||
DB " -4 CDROM installed as Secondary IDE Slave device\r\n"
|
||
DZ " -h,? Help page\r\n"
|
||
_SETVAR .MSG_UNK_DEVICE_NUMBER
|
||
DZ " Error: Unknown device number %1\r\n"
|
||
_SETVAR .MSG_UNK_COMMAND
|
||
DZ " Error: Unknown command: %1\r\n"
|
||
_SETVAR .MSG_DONE
|
||
DZ "Done!\r\n"
|
||
_SETVAR .MSG_NO_CDROM
|
||
DZ " Error: Can't find CDROM device %1\r\n"
|
||
_SETVAR .MSG_IO_ERROR
|
||
DZ " Error: I/O Error\r\n"
|
||
_SETVAR .MSG_OLD_DSS
|
||
DZ " Error: Need DSS version 1.70 or higher\r\n"
|
||
_SETVAR .MSG_COPYFILE
|
||
DZ "Copying "
|
||
_SETVAR .MSG_DIRHEAD
|
||
DZ "Directory of CDROM:"
|
||
_SETVAR .MSG_DIRENTRY
|
||
; FILENAME EXT SIZE DATE TIME
|
||
DZ "%1 %2 %3 %4 %5\r\n"
|
||
_SETVAR .MSG_MEMERROR
|
||
DZ " Error: Memory allocation error\r\n"
|
||
_SETVAR .MSG_COPYTO
|
||
DZ " to "
|
||
_SETVAR .MSG_CD_READ_ERR
|
||
DZ " Error: Reading failure\r\n"
|
||
_SETVAR .MSG_F_WRITE_ERR
|
||
DZ " Error: Writing failure\r\n"
|
||
_SETVAR .MSG_FAILURE
|
||
DZ "Failure!\r\n"
|
||
_SETVAR .MSG_ERR_DEST
|
||
DZ " Error: Can't open destination file\r\n"
|
||
_SETVAR .MSG_COPYABORTED
|
||
DZ "Copying aborted\r\n"
|
||
_SETVAR .MSG_ERR_PACKET
|
||
DZ "Error: packet size incorrect\r\n"
|
||
_SETVAR .MSG_SEND_ATAPI
|
||
DZ "Send ATAPI packet..."
|
||
_SETVAR .MSG_READTOC
|
||
DZ "Read audio CD-ROM TOC..."
|
||
_SETVAR .MSG_RESULT_READTOC
|
||
DB "RESULT: 0x00\r\n"
|
||
.MRR1 EQU $-4
|
||
DZ "Found in TOC: 0x00\r\n"
|
||
.MRR2 EQU $-5
|
||
_SETVAR .MSG_CLOSETRAY_READTOC
|
||
DZ "Close tray and read TOC Audio-CD..."
|
||
|
||
.crlf: DZ "\r\n"
|
||
|
||
DB 0
|
||
MSG1
|
||
|
||
BUF_PTRS DW BUF1,BUF2,BUF3,BUF4,0
|
||
|
||
APCMD_BUF DB 12 DUP 0
|
||
|
||
;-------------------------------//BUFFERS\\-------------------------------;
|
||
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
|
||
|
||
BUFFERS_START EQU $
|
||
|
||
INIT_VAR FF_STRUCT+256
|
||
SETVAR DIRSPEC, 256
|
||
SETVAR BUF1, 256
|
||
SETVAR BUF2, 256
|
||
SETVAR BUF3, 256
|
||
SETVAR BUF4, 256
|
||
SETVAR ARGCBUF, 256
|
||
SETVAR DUMPBUF, 256
|
||
|
||
BUFFERS_END EQU DUMPBUF+2048-BUFFERS_START
|
||
BUFERS_NUMBER EQU 6
|
||
;DEV_CFG:
|