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

489 lines
8.4 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
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: