Версия 1.03

- поправлен cdx.txt
- добалена возможность послать ATAPI пакет.
- если нет диска в приводе, то не пишет ошибку, что нет привода
This commit is contained in:
savelij13 2025-07-07 19:49:39 +03:00
commit 194e7a1fca
11 changed files with 2958 additions and 0 deletions

BIN
bin/CDX.EXE Normal file

Binary file not shown.

75
bin/CDX.TXT Normal file
View File

@ -0,0 +1,75 @@
CDROM Extension utility v1.03
(c) Sprinter Team, 2025
<EFBFBD>â  ª®­á®«ì­ ï ¯à®£à ¬¬  ¯à¥¤­ §­ ç¥­  ¤«ï ¯®¤¤¥à¦ª¨ CD-ROM ­  ª®¬¯ìîâ¥à¥
‘¯à¨­â¥à. ƒ« ¢­ë¬ ®¡à §®¬, ã⨫¨â  á«ã¦¨â ¤«ï ª®¯¨à®¢ ­¨ï ä ©«®¢ á CD-ROM ­ 
¤à㣨¥ ¤¨áª¨ ª®¬¯ìîâ¥à . ’ ª ¦¥ ¥áâì ¢®§¬®¦­®áâì ®â¯à ¢ª¨ ATAPI ¯ ª¥â  ¤«ï
ã¯à ¢«¥­¨ï CD-ROM.
ˆá¯®«ì§®¢ ­¨¥:
CDX [-ª«îç] [ª®¬ ­¤ ] [¯ à ¬¥âà 1] [¯ à ¬¥âà 2]
Š®¬ ­¤ë:
OPEN -- ®âªàëâì «®â®ª
CLOSE -- § ªàëâì «®â®ª
LIST [\cd\path\] [pattern] -- ¯®ª § âì ᮤ¥à¦¨¬®¥ ª â «®£ 
COPY \source \destination -- ª®¯¨à®¢ âì ä ©«ë
DUMP sector [offset] -- ¯®ª § âì ¤ ¬¯ ᥪâ®à  ¤¨áª 
SEND hexline ["." separator] -- ®â¯à ¢ª  ATAPI ¯ ª¥â 
Š«îç¨:
-h,? -- ¢ë¢¥á⨠⥪áâ ¯®¤áª §ª¨
-1 -- CDROM ãáâ ­®¢«¥­ ª ª Primary IDE Master
-2 -- CDROM ãáâ ­®¢«¥­ ª ª Primary IDE Slave device
-3 -- CDROM ãáâ ­®¢«¥­ ª ª Secondary IDE Master device
-4 -- CDROM ãáâ ­®¢«¥­ ª ª Secondary IDE Slave device
<EFBFBD>ਬ¥àë ¨á¯®«ì§®¢ ­¨ï:
cdx list
cdx list \waves\
cdx copy \docs\*.* c:\docs\
cdx copy \cd\waves\*.wav c:\waves\
cdx copy \soft\filename.exe c:\files\newname.exe
cdx send 4B.000000.0000000000000000.00000000
cdx send 4B000000000000000000000000000000
---
It is a command-line program for supporting of CD-ROM. Mainly, it serves
copying files from CD-ROM to hard disk or floppy disk.
Usage:
CDX [-switches] [command] [param1] [param2]
Commands:
OPEN -- open tray
CLOSE -- close tray
LIST [\cd\path\] [pattern] -- show file(s)
COPY \source \destination -- copy file(s) from CD-ROM to another disk
DUMP sector [offset] -- show sector dump from CD-ROM
SEND hexline ["." separator] -- send ATAPI packet
Switches:
-h,? -- help page
-1 -- CDROM installed as Primary IDE Master device
-2 -- CDROM installed as Primary IDE Slave device
-3 -- CDROM installed as Secondary IDE Master device
-4 -- CDROM installed as Secondary IDE Slave device
Examples:
cdx list
cdx list \waves\
cdx copy \docs\*.* c:\docs\
cdx copy \cd\waves\*.wav c:\waves\
cdx copy \soft\filename.exe c:\files\newname.exe
cdx send 4B.000000.0000000000000000.00000000
cdx send 4B000000000000000000000000000000
---

5
bin/history.txt Normal file
View File

@ -0,0 +1,5 @@
‚¥àá¨ï 1.03
- ¯®¯à ¢«¥­ cdx.txt
- ¤®¡ «¥­  ¢®§¬®¦­®áâì ¯®á« âì ATAPI ¯ ª¥â.
- ¥á«¨ ­¥â ¤¨áª  ¢ ¯à¨¢®¤¥, â® ­¥ ¯¨è¥â ®è¨¡ªã, çâ® ­¥â ¯à¨¢®¤ 

23
build.bat Normal file
View File

@ -0,0 +1,23 @@
@echo off
if not exist tmp md tmp
set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad\svn\pentevo\tools\noice2equ\
set includes=d:\yad\svn\pentevo\rom;d:\yad\zxgit\common_includes\
cls
asl -U -L -C -x -olist tmp\cdx.lst -i %includes% cdx.a80 || goto error
p2bin cdx.p bin\cdx.exe -r $-$ -k
echo ########################
echo # -= End Compile Ok =- #
echo ########################
goto exit
:error
echo #######################
echo # -= Error Compile =- #
echo #######################
:exit

6
build_pause.bat Normal file
View File

@ -0,0 +1,6 @@
@ECHO OFF
call build.bat
pause

1225
cd_dos.a80 Normal file

File diff suppressed because it is too large Load Diff

488
cdx.a80 Normal file
View File

@ -0,0 +1,488 @@
; LAST UPDATE: 07.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
;VARIABLES
; FILENAME DS 256
; FILEHND DB 0xFF
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 ; ¬ áᨢ áâப
LD BC,SYS_ERRORS.Size ; à §¬¥à ¬ áᨢ 
RLA
jr nc,.set_de
ld hl,DRV_ERRORS ; ¬ áᨢ áâப
ld bc,DRV_ERRORS.Size ; à §¬¥à ¬ áᨢ 
.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 ; ¬ áᨢ áâப
ld bc,SYS_ERRORS.Size ; à §¬¥à ¬ áᨢ 
;cp %1000'0000
RLA
jr nc,.set_de
;
;and %0111'1111
ld hl,DRV_ERRORS ; ¬ áᨢ áâப
ld bc,DRV_ERRORS.Size ; à §¬¥à ¬ áᨢ 
;
.set_de: SRL A
ld e,a
ld d,0
inc de
call LCPIR ; ­ ©â¨ áâபã
call PRINTZ ; ä®à¬ â. ¢ë¢®¤ áâப¨
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 "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..."
.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
;
; ASSERT (DUMPBUF+2048 < 0xC000), "NO FREE SPACE FOR BUFFERS"
;-----------------------------------------------------------------------;
DEV_CFG:
; DISPLAY "\n\tCDX size: ",/D,DEV_CFG - START
;[END]

90
cmdparse.a80 Normal file
View File

@ -0,0 +1,90 @@
; LAST UPDATE: 07.07.2025 savelij
; HL - exe-prefix
; IX - pointers at work buffers
EX_COMMAND_LINE:
INC HL
.NEXTPR: LD DE,ARGCBUF
SPDSS DSSF.EX_PATH,EX_PATH.GSWITCH
PUSH AF
PUSH HL
LD A,(ARGCBUF)
OR A
JR Z,.EOCL ;end of command line
CP "-"
JR Z,.ITCKEY
CP "/"
JR Z,.ITCKEY
LD HL,ARGCBUF
LD E,(IX+0)
LD D,(IX+1)
INC IX
INC IX
LD A,D
OR E
JR Z,.CL_FAILURE
;LD A,1
;LD (NAME_FLG),A
.MOVNAME: LD A,(HL)
LDI
OR A
JR NZ,.MOVNAME
.EOCL: POP HL
POP AF
JR NC,.NEXTPR
RET
.CL_FAILURE: POP HL
POP AF
RET
.ITCKEY: LD A,(ARGCBUF+1)
CP "5"
JR NC,.HELP
CP "1"
JR NC,.number
; ERROR
LD HL,ARGCBUF+1
CALL PUTVAR
LD A,MSG0.MSG_UNK_DEVICE_NUMBER
CALL MESSAGE
LD A,1
LD (STOPMODE),A
JR .EOCL
.number: SUB '1'
OR 0xC0
PUSH IX
PUSH AF
CALL RESTORE_STATE
XOR A
LD (RESTORE_STATE.set_par),A
POP AF
LD (CDDRIVE),A
SPBIOS BIOSF.DRV_DETECT
POP IX
JR NC,.EOCL
CP ERR_DRV.ATAPI_MediumError
JR Z,.EOCL
CP ERR_DRV.ATAPI_UnitAttention
JR NZ,.error
LD A,(CDDRIVE)
PUSH IX
CALL SAVE_MEDIA_CHANGED
POP IX
JR NC,.EOCL
.error: LD HL,ARGCBUF+1
CALL PUTVAR
LD A,MSG0.MSG_NO_CDROM
CALL MESSAGE
LD A,1
LD (STOPMODE),A
SCF
JR .CL_FAILURE
.HELP: LD A,MSG0.MSG_USAGE
CALL MESSAGE
LD A,1
LD (STOPMODE),A
JR .EOCL

1036
command.a80 Normal file

File diff suppressed because it is too large Load Diff

6
readme.md Normal file
View File

@ -0,0 +1,6 @@
CDROM Extension utility для компьютера Sprinter
Консольная программа предназначена для поддержки CD-ROM на компьютере
Спринтер. Главным образом, утилита служит для копирования файлов с CD-ROM на
другие диски компьютера. Так же есть возможность отправки ATAPI пакета для
управления CD-ROM.

4
vers.a80 Normal file
View File

@ -0,0 +1,4 @@
; LAST UPDATE: 05.07.2025 savelij
VERS EQU "1.03"