; 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 ; массив строк 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 " 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: