From c82b010f1e4feebcc29d498363f58773b7a34594 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 4 Dec 2024 22:18:39 +1000 Subject: [PATCH] prepare --- DSS/drivers/media/ATAPI/CDX.ASM | 524 +++++++++ DSS/drivers/media/ATAPI/CDX.TXT | 7 + DSS/drivers/media/ATAPI/CMDPARSE.ASM | 89 ++ DSS/drivers/media/ATAPI/COMMAND.ASM | 942 +++++++++++++++ DSS/drivers/media/ATAPI/Cd_dos.asm | 1212 ++++++++++++++++++++ DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM | 525 +++++++++ DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm | 372 ++++++ DSS/drivers/media/ATAPI/Hidden/Cdriver.asm | 356 ++++++ DSS/drivers/media/ATAPI/Hidden/DSS.INC | 104 ++ DSS/drivers/media/ATAPI/Hidden/DUMP.TXT | 6 + DSS/drivers/media/ReScanDRV.ASM | 495 -------- DSS/drivers/media/fdd-drv.asm | 417 ------- DSS/drivers/media/ide-drv.asm | 715 ------------ DSS/drivers/media/ram_disk-drv.asm | 533 --------- DSS/drivers/media/shared-drv.asm | 290 ----- 15 files changed, 4137 insertions(+), 2450 deletions(-) create mode 100644 DSS/drivers/media/ATAPI/CDX.ASM create mode 100644 DSS/drivers/media/ATAPI/CDX.TXT create mode 100644 DSS/drivers/media/ATAPI/CMDPARSE.ASM create mode 100644 DSS/drivers/media/ATAPI/COMMAND.ASM create mode 100644 DSS/drivers/media/ATAPI/Cd_dos.asm create mode 100644 DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM create mode 100644 DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm create mode 100644 DSS/drivers/media/ATAPI/Hidden/Cdriver.asm create mode 100644 DSS/drivers/media/ATAPI/Hidden/DSS.INC create mode 100644 DSS/drivers/media/ATAPI/Hidden/DUMP.TXT delete mode 100644 DSS/drivers/media/ReScanDRV.ASM delete mode 100644 DSS/drivers/media/fdd-drv.asm delete mode 100644 DSS/drivers/media/ide-drv.asm delete mode 100644 DSS/drivers/media/ram_disk-drv.asm delete mode 100644 DSS/drivers/media/shared-drv.asm diff --git a/DSS/drivers/media/ATAPI/CDX.ASM b/DSS/drivers/media/ATAPI/CDX.ASM new file mode 100644 index 0000000..cac2242 --- /dev/null +++ b/DSS/drivers/media/ATAPI/CDX.ASM @@ -0,0 +1,524 @@ +;[BEGIN] +; +; CDX.EXE [command] [-switches] [directory] +; +;commands: +; OPEN +; EJECT +; CLOSE +; COPY +; LIST +; DUMP +; COMMAND +; -h,? Help page + + DEFINE _MAME 1 + + +CR EQU 13 +LF EQU 10 + + INCLUDE "Shared_Includes/constants/BIOS_equ.inc" + INCLUDE "Shared_Includes/constants/dss_equ.inc" + INCLUDE "Shared_Includes/constants/Sp2000.inc" + + + ORG #8100-22 + + DB "EXE" ;EXE ID + DB #00 ;EXE VERSION + DW #0016 ;CODE OFFSET LOW + DW #0000 ;CODE OFFSET HIGH + DW #0000 ;END-BEG ;PRIMARY LOADER + DW #0000 ; + DW #0000 ;RESERVED + DW #0000 ; + DW START ;LOAD ADDRESS + DW START ;START ADDRESS + DW #BFFF ;STACK ADDRESS + ;DS 490 + +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,MSG_HELLO + CALL MESSAGE + ; + CALL INIT + JR NC,.next + ; + LD HL,PRM1 + LD (HL),0 + LD A,MSG_NO_CDROM + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + ; +.next: LD C,Dss.Version + RST ToDSS ;GET DSS VERSION + EX DE,HL + AND A + LD DE,#0146 ;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 +.loop: LD BC,Dss.Exit + RST ToDSS + JP .loop + +OLD_DSS + LD A,MSG_OLD_DSS + CALL MESSAGE + JR QUIT + +HNDMEM DB #FF + +MALLOC + LD BC,2*256 + Dss.GetMem + RST ToDSS + JR NC,M_ALLOK + LD A,MSG_MEMERROR + CALL MESSAGE + SCF + RET +M_ALLOK + LD (HNDMEM),A + LD BC,1*256 + Dss.SetWin3 + RST ToDSS + LD HL,BANKTBL + LD C,BIOS.GetMemBlkPages + LD A,(HNDMEM) + JP ToBIOS + +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 BC,+(#C0-1)*256 + BIOS.DRV_DETECT +.loop: INC B + LD A,B + CP #C4 + SCF + RET Z + PUSH BC + RST ToBIOS + POP BC + JR C,.loop + LD A,B + LD (CDDRIVE),A + RET + ; + ; LD C,BIOS.DRV_RESET + ; JP ToBIOS +; RET + +;VARIABLES + +; FILENAME DS 256 +; FILEHND DB #FF + +STOPMODE DB #00 + + INCLUDE "cmdparse.asm" + INCLUDE "command.asm" + INCLUDE "cd_dos.asm" + +CRLF: PUSH HL + LD HL,MSG0.crlf + LD C,Dss.PChars + ; LD A,#0D + ; LD C,Dss.PutChar + ; RST #10 + ; LD A,#0A + ; LD C,Dss.PutChar + RST ToDSS + POP HL + RET +; + +ERROR CP MAX_DSS_ERR + LD E,A + LD D,0 + JP 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 INC DE + LD HL,ERR0 + LD BC,ERR0.Size +LCPIR XOR A + CPIR + RET PO + RET NZ + DEC DE + LD A,D + OR E + JP NZ,LCPIR + RET + +MAX_DSS_ERR EQU 33 + +ERRCDX DB "CDX: ",0 + + include 'Shared_includes/constants/dss_errors.z80' +; ERR0 DB #00 +; DB "Unknown error",0 +; DB "Invalid function",0 +; DB "Invalid drive number",0 +; DB "File not found",0 +; DB "Path not found",0 +; DB "Invalid handle",0 +; DB "Extended error 6",0 +; DB "File exist",0 +; DB "File read only",0 +; DB "Root overflow",0 +; DB "No free space",0 +; DB "Directory not empty",0 +; DB "Can't delete current directory",0 +; DB "Invalid media",0 +; DB "Unknown operation",0 ;R02 +; DB "Directory exist",0 +; DB "Invalid filename",0 +; DB "Invalid EXE-file",0 +; DB "Not supported EXE-file",0 +; DB "Access denied",0 +; DB "Not ready",0 +; DB "Seek error",0 +; DB "Sector not found",0 +; DB "CRC error",0 +; DB "Write protect",0 +; DB "Read error",0 +; DB "Write error",0 +; DB "Drive failure",0 +; DB "Extended error 28",0 +; DB "Extended error 29",0 +; DB "No free memory",0 +; DB "Invalid memory block",0 +; DB "Extended error 32",0 +; DB "Extended error 33",0 +; DB "Extended error 34",0 +; DB "35",0 +; DB "36",0 +; DB "37",0 +; DB "38",0 +; DB "39",0 +; DB "40",0 +; DB "41",0 +; DB "42",0 +; DB "43",0 +; DB "44",0 +; DB "45",0 +; DB "46",0 +; DB "47",0 +; DB "48",0 +; DB "49",0 +; DB "50" +; DB 0 +; ERR1 + +;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 + LD C,Dss.PChars + RST ToDSS + POP HL + JR PRINTZ +PRINTZ2 LD C,Dss.PutChar + RST ToDSS + JP PRINTZ + +PRINT_ LD BC,1*256 + BIOS.LP_PRINT_SYM + JP ToBIOS + +PUTVAR LD DE,PRM1 +PUTPRM LD BC,15 +PUTPRMA LD A,(HL) + LDI + RET PO + OR A + JR NZ,PUTPRMA + RET + +CDDRIVE DB #FF + +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 + + +MSG_HELLO EQU 0 +MSG_TRAY_OPEN EQU 1 +MSG_TRAY_CLOSE EQU 2 +MSG_USAGE EQU 3 +MSG_UNK_DEVICE_NUMBER EQU 4 +MSG_UNK_COMMAND EQU 5 +;MSG_DISABLED EQU 6 +;MSG_ENABLED EQU 7 +MSG_DONE EQU 6 ;8 +MSG_NO_CDROM EQU 7 ;9 +MSG_IO_ERROR EQU 8 ;10 +MSG_OLD_DSS EQU 9 ;11 +MSG_COPYFILE EQU 10 ;12 +MSG_DIRHEAD EQU 11 ;13 +MSG_DIRENTRY EQU 12 ;14 +MSG_MEMERROR EQU 13 ;15 +MSG_COPYTO EQU 14 ;16 +MSG_CD_READ_ERR EQU 15 ;17 +MSG_F_WRITE_ERR EQU 16 ;18 +MSG_FAILURE EQU 17 ;19 +MSG_ERR_DEST EQU 18 ;20 +MSG_COPYABORTED EQU 19 ;21 + +MSG0 BYTE 0 +;0 + BYTE "CDROM eXtension utility v1.01, 2023 (c) Sprinter Team",CR,LF + DZ "Type CDX.EXE -? for help.",CR,LF,CR,LF +;1 + DZ "Opening tray..." +;2 + DZ "Closing tray..." + ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 +;3 + BYTE ' Usage: CDX.EXE [-switches] [command] [param1] [param2]',CR,LF,CR,LF + BYTE 'Commands:',CR,LF + BYTE ' CDX.EXE OPEN - Open tray',CR,LF + BYTE ' CDX.EXE CLOSE - Close tray',CR,LF + BYTE ' CDX.EXE LIST [\cd_path\][pattern] - Show CDROM filelist',CR,LF + BYTE ' CDX.EXE COPY \source d:\destination\ - Copy file(s) from CDROM to another disk',CR,LF + BYTE ' CDX.EXE DUMP sector [offset] - Show sector dump from CDROM',CR,LF + BYTE CR,LF + BYTE 'Switches:',CR,LF + BYTE ' -1 CDROM installed as Primary IDE Master device',CR,LF + BYTE ' -2 CDROM installed as Primary IDE Slave device',CR,LF + BYTE ' -3 CDROM installed as Secondary IDE Master device',CR,LF + BYTE ' -4 CDROM installed as Secondary IDE Slave device',CR,LF + DZ ' -h,? Help page',CR,LF +;4 + DZ " Error: Unknown device number %1",CR,LF +;5 + DZ " Error: Unknown command: %1",CR,LF + ;6 + ;DZ "Disabled" + ;7 + ;DZ "Enabled" +;6 + DZ "Done!",CR,LF +;7 + DZ " Error: Can't find CDROM device %1",CR,LF +;8 + DZ " Error: I/O Error",CR,LF +;9 + DZ " Error: Need DSS version 1.70 or higher",CR,LF +;10 + DZ "Copying " +;11 + DZ "Directory of CDROM:" +;12 FILENAME EXT SIZE DATE TIME + DZ "%1 %2 %3 %4 %5",CR,LF +;13 + DZ " Error: Memory allocation error",CR,LF +;14 + DZ " to " +;15 + DZ " Error: Reading failure",CR,LF +;16 + DZ " Error: Writing failure",CR,LF +;17 + DZ "Failure!",CR,LF +;18 + DZ " Error: Can't open destination file",CR,LF +;19 + DZ "Copying aborted",CR,LF +;20 +.crlf: DZ CR,LF +;21 + BYTE 0 +MSG1 + +BUF_PTRS + DW BUF1,BUF2,BUF3,BUF4,0 + +;-------------------------------/BUFFERS\-------------------------------; +FF_STRUCT: + DB "12345678" + DB "123" + DB #00 + 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 #00 ;ATTR +CDFNAME DB "12345678123",0 +; +BUFFERS_START EQU $ + ;DS 256-($-FF_STRUCT) + +DIRSPEC: EQU FF_STRUCT+256 + ;DB '\',0 + ;DS 254 +BUF1 EQU DIRSPEC+256 +BUF2 EQU DIRSPEC+256+256 +BUF3 EQU DIRSPEC+256+256+256 +BUF4 EQU DIRSPEC+256+256+256+256 +ARGCBUF EQU DIRSPEC+256+256+256+256+256 +DUMPBUF EQU DIRSPEC+256+256+256+256+256+256 +BUFFERS_END EQU DUMPBUF+2048-BUFFERS_START +; +BUFERS_NUMBER EQU 6 +; + ASSERT (DUMPBUF+2048 < #C000), "NO FREE SPACE FOR BUFFERS" +;-----------------------------------------------------------------------; +DEV_CFG +;[END] diff --git a/DSS/drivers/media/ATAPI/CDX.TXT b/DSS/drivers/media/ATAPI/CDX.TXT new file mode 100644 index 0000000..92da5ac --- /dev/null +++ b/DSS/drivers/media/ATAPI/CDX.TXT @@ -0,0 +1,7 @@ + + CDROM eXtension utility version 1.01 + ------------------------------------------------ + + It's utility came for solving the problem with support CDROM in DSS ver 1.x. +It's allow browse and copy files that stored on your CD. Also utility has commands +for tray control. \ No newline at end of file diff --git a/DSS/drivers/media/ATAPI/CMDPARSE.ASM b/DSS/drivers/media/ATAPI/CMDPARSE.ASM new file mode 100644 index 0000000..0b23d08 --- /dev/null +++ b/DSS/drivers/media/ATAPI/CMDPARSE.ASM @@ -0,0 +1,89 @@ + +; HL - exe-prefix +; IX - pointers at work buffers +EX_COMMAND_LINE + INC HL +NEXTPR LD DE,ARGCBUF + LD BC,Dss.EX_Path.GSWITCH + RST ToDSS + 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,MSG_UNK_DEVICE_NUMBER + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + JR EOCL + ; +.number:; + SUB A,'1' + OR #C0 + LD (CDDRIVE),A + LD C,BIOS.DRV_RESET + RST ToBIOS + JR NC,EOCL + ; + LD HL,ARGCBUF+1 + CALL PUTVAR + LD A,MSG_NO_CDROM + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + SCF + JR CL_FAILURE + ; +.HELP: LD A,MSG_USAGE + CALL MESSAGE + LD A,1 + LD (STOPMODE),A + JR EOCL + + + +; MAS_CD: +; ;LD A,MASTER +; ;LD (CDDRIVE),A +; JR EOCL + +; SLA_CD: +; ;LD A,SLAVE +; ;LD (CDDRIVE),A +; JR EOCL diff --git a/DSS/drivers/media/ATAPI/COMMAND.ASM b/DSS/drivers/media/ATAPI/COMMAND.ASM new file mode 100644 index 0000000..ccd493d --- /dev/null +++ b/DSS/drivers/media/ATAPI/COMMAND.ASM @@ -0,0 +1,942 @@ + +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 #61 + JP C,COMP001 + CP #7B + JP NC,COMP001 + SUB #20 +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,#FF + 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,MSG_UNK_COMMAND + CALL MESSAGE + SCF + RET + +CMDLIST DB "CLOSE",0 + DW CCLOSE + DB "COPY",0 + DW CCOPY + DB "DUMP",0 + DW CDUMP + DB "EJECT",0 + DW COPEN + DB "HELP",0 + DW CHELP + DB "LIST",0 + DW CDIR + DB "OPEN",0 + DW COPEN + DB "SECTORDUMP",0 + DW CDUMP + DB 0 + +CHELP: LD A,MSG_USAGE + JP MESSAGE + +CCLOSE: LD A,MSG_TRAY_CLOSE + CALL MESSAGE + LD A,(CDDRIVE) + LD BC,BIOS.DRV_EXTENDED.CD_Close + RST ToBIOS + LD A,MSG_DONE + JP MESSAGE + +COPEN: LD A,MSG_TRAY_OPEN + CALL MESSAGE + LD A,(CDDRIVE) + LD BC,BIOS.DRV_EXTENDED.CD_Eject + RST ToBIOS + LD A,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 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 + JR Z,.NONSTOP + LD HL,#011B ;ESC + AND A + SBC HL,DE + JR NZ,.NONSTOP + LD A,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,#20 + 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 + JR NC,.OFOK + LD A,MSG_ERR_DEST + CALL MESSAGE + SCF + RET + ; +.OFOK: LD (FHND),A + LD A,MSG_COPYFILE + CALL MESSAGE + LD HL,BUF2 + LD C,Dss.PChars + RST ToDSS + LD A,MSG_COPYTO + CALL MESSAGE + LD HL,BUF3 + LD C,Dss.PChars + RST ToDSS + LD A," " + LD C,Dss.PutChar + RST ToDSS + 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 +; + LD A,(FHND) + LD C,Dss.Close + RST ToDSS + LD A,MSG_DONE + CALL MESSAGE + AND A + RET +.COPY_FAULT: + LD A,(FHND) + LD C,Dss.Close + RST ToDSS + 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 + AND #80 + 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 + AND #81 ;PATTERN & FILENAME + CP #01 ;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,#C000 + LD A,(FHND) + LD C,Dss.Write + RST ToDSS + JR C,.WRDERR + XOR A + INC A + RET +.WRDERR: + LD A,MSG_FAILURE + CALL MESSAGE + CALL CRLF + LD A,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,#4000 ;BLOCKSIZE + SBC HL,BC + LD B,C + EX DE,HL + SBC HL,BC + EX DE,HL + LD BC,#4000 + 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 #07 + 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,#C000 + LD C,BIOS.DRV_READ + RST ToBIOS + LD BC,(BYTECOUNTER) + RET NC + LD A,MSG_FAILURE + CALL MESSAGE + CALL CRLF + LD A,MSG_CD_READ_ERR + CALL MESSAGE + SCF + RET + + +FHND DB #FF + +;---------------------- +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 + 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 B,0 + CALL F_FIRST + JP C,ERROR +.CDIR_HEAD: + LD A,MSG_DIRHEAD + CALL MESSAGE + LD HL,DIRSPEC + LD C,Dss.PChars + RST ToDSS + 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 #00 +; 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 #00 ;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,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),#20 + 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),#20 + 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 #1F + PUSH BC + CALL NUMB + LD (HL),"." + INC HL + POP BC + LD A,C + SRL B + RLA + RLA + RLA + RLA + AND #0F + CALL NUMB + LD (HL),"." + INC HL + LD A,B + ADD A,#50 + CP 100 + JP C,NUMB +.SUB100: + SUB 100 + CP 100 + JP C,NUMB + JR .SUB100 + +NUMB: LD C,#2F +.NUMB1: INC C + SUB 10 + JP NC,.NUMB1 + ADD A,10 + ADD A,#30 + LD (HL),C + INC HL + LD (HL),A + INC HL + RET + +PRNSIZE LD A,(IX+32) + LD HL,DIRIDD + AND #10 + 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 #20 + JR NZ,.ALR + LD A,#30 + 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,#3B9A ; 1000000000 + EXX + LD DE,#CA00 + CALL GET_DIG + EXX + LD DE,#05F5 ; 100000000 + EXX + LD DE,#E100 + CALL GET_DIG + EXX + LD DE,#0098 ; 10000000 + EXX + LD DE,#9680 + CALL GET_DIG + EXX + LD DE,#000F ; 1000000 + EXX + LD DE,#4240 + CALL GET_DIG + EXX + LD DE,#0001 ; 100000 + EXX + LD DE,#86A0 + CALL GET_DIG + EXX + LD DE,#0000 ; 10000 + EXX + LD DE,#2710 + CALL GET_DIG + EXX + LD DE,#0000 ; 1000 + EXX + LD DE,#03E8 + CALL GET_DIG + EXX + LD DE,#0000 ; 100 + EXX + LD DE,#0064 + CALL GET_DIG + EXX + LD DE,#0000 ; 10 + EXX + LD DE,#000A + CALL GET_DIG + LD A,L ; 1 + ADD A,#30 + LD (IX+0),A + INC IX + LD HL,L32BIT_ + LD DE,#2030 + ; +.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,#30 + LD (IX+0),A + INC IX + RET + +L32BIT_ DB "0000000000" + +DIRIDD DB " ",0 + +SIZEBFF DB "0 000 000 000",0,0 + +DEFDIR DB #5C,"*.*",0 + +;------------------------ + +CDUMP: LD HL,BUF2 + LD BC,#0000 + 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 + JR C,.DMPERR + ; + LD HL,BUF3 + CALL GETNUM + PUSH IX + POP BC + LD A,B + AND #07 + LD B,A + LD HL,2048-#01C0 + AND A + SBC HL,BC + JR NC,.GOODOFFS + LD BC,2048-#01C0 +.GOODOFFS: + LD HL,DUMPBUF + ADD HL,BC + ; + CALL DUMP + JP CRLF +.DMPERR: + LD A,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: BYTE " +00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ",CR,LF + DZ " -------------------------------------------------- +----------------+" + + +DUMP: PUSH HL + LD HL,UPDUMP + LD C,Dss.PChars + RST ToDSS + POP HL + LD BC,#1C00 +.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,#08 +.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,#08 +.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,#10 +.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 #0F + ADD A,#30 + CP #3A + JR C,.PHEX2 + ADD A,7 +.PHEX2: CALL PRINT_ + LD A,E + AND #0F + ADD A,#30 + CP #3A + JR C,.PHEX3 + ADD A,7 +.PHEX3: CALL PRINT_ + RET + +PRNCHAR: + LD C,Dss.PutChar + JP ToDSS +; \ No newline at end of file diff --git a/DSS/drivers/media/ATAPI/Cd_dos.asm b/DSS/drivers/media/ATAPI/Cd_dos.asm new file mode 100644 index 0000000..3dd5bc0 --- /dev/null +++ b/DSS/drivers/media/ATAPI/Cd_dos.asm @@ -0,0 +1,1212 @@ +PAGE0 EQU #82 ;WIN #0000-#3FFF +PAGE1 EQU #A2 ;WIN #4000-#7FFF +PAGE2 EQU #C2 ;WIN #8000-#BFFF +PAGE3 EQU #E2 ;WIN #C000-#FFFF + +DIR EQU #C000 + +DIRPAGE EQU 0 + +DAY EQU 19 +MONTH EQU 05 +YEAR EQU 2002 + +NAM EQU 0 +EXT EQU 8 +ATR EQU 11 + +CLU3 EQU 20 +CLU4 EQU 21 + +TIM1 EQU 22 +TIM2 EQU 23 +DAT1 EQU 24 +DAT2 EQU 25 +CLU1 EQU 26 +CLU2 EQU 27 +LEN1 EQU 28 +LEN2 EQU 29 +LEN3 EQU 30 +LEN4 EQU 31 +POS1 EQU 32 +POS2 EQU 33 +POS3 EQU 34 +POS4 EQU 35 +DIRCLU1 EQU 36 +DIRCLU2 EQU 37 +HND1 EQU 38 +HND2 EQU 39 +FDRV EQU 40 +AMODE EQU 41 +FTASK EQU 42 + +;ACCESS MODE: +; 00 - READ/WRITE +; 01 - READ +; 02 - WRITE + +;File Manipulator (FM) +FM_BUF DB ". " ;+00 NAME + DB " " ;+08 EXT + DB #10 ;+11 ATTRIBUT + DB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED + DW #0000 ;+22 TIME + DW #0000 ;+24 DATE + DW #0000 ;+26 START CLUSTER + DW #0000,#0000 ;+28 SIZE FILE + DW #0000,#0000 ;+32 FILE POSITION (FP) + DW #0000 ;+36 DIRECTORY CLUSTER + DW #0000 ;+38 HANDLE NUMBER + DB #00 ;+40 DRIVE OR CURRENT + DB #00 ;+41 ACCESS MODE + DB #00 ;+42 TASK + DB #00 ;+43 EMPTY +END_FM +;End of FM + DS 44*2 + +FM_SIZE EQU END_FM-FM_BUF + +SET_FM PUSH DE + INC A + LD IY,FM_BUF-FM_SIZE + LD DE,FM_SIZE +SET_FM1 ADD IY,DE + DEC A + JR NZ,SET_FM1 + POP DE + LD A,(IY+0) + OR A + LD A,0 + RET NZ + LD A,5 + SCF + RET + +; HL:IX - OFFSET POINTER +; A - FILE MANIPULATOR + +MOVE_FP CALL SET_FM + RET C + INC B + DEC B + JP Z,MOVE_FA + DEC B + JP Z,MOVE_FB + DEC B + JP Z,MOVE_FC + LD A,1 + SCF + RET + +;from Start File +MOVE_FA LD BC,0 + LD DE,0 + JR MOVE_F1 + +;from End File +MOVE_FC LD C,(IY+28) + LD B,(IY+29) + LD E,(IY+30) + LD D,(IY+31) + JR MOVE_F1 + +;from Current Position +MOVE_FB LD C,(IY+32) + LD B,(IY+33) + LD E,(IY+34) + LD D,(IY+35) +MOVE_F1 ADD IX,BC + ADC HL,DE + LD D,XH + LD E,XL + LD (IY+32),E + LD (IY+33),D + LD (IY+34),L + LD (IY+35),H + XOR A + RET + +;FP COMPARE +; CY - FILE POINTER > SIZE +; NC - FILE POINTER < SIZE + +MOVE_CP LD L,(IY+28) + LD H,(IY+29) + LD E,(IY+32) + LD D,(IY+33) + AND A + SBC HL,DE + LD L,(IY+30) + LD H,(IY+31) + LD E,(IY+34) + LD D,(IY+35) + SBC HL,DE + RET + +CHANGEDISK + ;PUSH AF + LD A,(CDDRIVE) + LD C,BIOS.DRV_RESET + RST ToBIOS + ;POP BC + JP C,NDISK11 + ;LD A,B +; LD (DRIVE),A + CALL INITDISK + RET C +; LD A,(LDRIVE) + AND A + RET + +NDISK11 CP 2 + SCF +; RET Z + LD A,20 + SCF + RET + +INITDISK + LD A,DIRPAGE + CALL BANK + PUSH AF + LD B,4 +CD_I_LP PUSH BC + LD DE,DIR + LD A,(CDDRIVE) + LD HL,#0000 + LD IX,#0010 + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP BC + JR NC,CD_I_OK + DJNZ CD_I_LP +UNKCD POP AF + OUT (PAGE3),A + LD A,13 ;!HARDCODE sys error + SCF + RET + +CD_I_OK LD HL,DIR + LD A,(HL) + INC HL + CP #01 + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "C" + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "D" + JR NZ,UNKCD + LD HL,DIR+#009E + LD DE,ROOTDIR + LDI + LDI + LDI + LDI + LD HL,DIR+#00A6 + LD DE,ROOTLEN + LDI + LDI + LDI + LDI + POP AF + OUT (PAGE3),A +; LD HL,0 +; LD (FATCASH),HL + XOR A + RET + + +;---------------------------------------------- + +OPEN LD (ACCESS),A + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C +OPENEXE CALL SEARCH + RET C + LD A,1 ;; + CALL SET_FM ;; CALL GET_FM + RET C + LD A,C + EX AF,AF' + EXX + LD (IY+HND1),E + LD (IY+HND2),D + EXX + LD D,YH + LD E,YL + LD HL,HANDBUF + LD BC,#0020 + LDIR + LD A,(ACCESS) + LD (IY+AMODE),A +;; LD A,(TASK) + XOR A ;; + LD (IY+FTASK),A + XOR A + LD (IY+POS1),A + LD (IY+POS2),A + LD (IY+POS3),A + LD (IY+POS4),A +;; LD A,(DRIVE) +; XOR A ;; +; LD (IY+FDRV),A + LD HL,FM_BUF+CLU1 + LD E,(HL) + INC HL + LD D,(HL) + LD (IY+DIRCLU1),E + LD (IY+DIRCLU2),D + + LD C,(IY+CLU1) + LD B,(IY+CLU2) + LD E,(IY+CLU3) + LD D,(IY+CLU4) + EX DE,HL + PUSH BC + POP IX + LD C,(IY+LEN1) + LD B,(IY+LEN2) + LD E,(IY+LEN3) + LD D,(IY+LEN4) + EX AF,AF' + AND A + RET + +;RET +; HL:IX - SECTOR +; DE:BC - SIZE IN BYTES + +;PATH0 DEFW #0000 + +ACCESS DEFB #00 + +HANDBUF DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +WRT_HND LD A,DIRPAGE + CALL BANK + PUSH AF + LD IX,DIR + EXX + LD DE,0 + EXX +WRT_HN1 LD A,(IX+00) + OR A + JR Z,WRT_HN2 + CP #E5 + JR Z,WRT_HN2 + LD BC,#0020 + ADD IX,BC + JR NC,WRT_HN1 + POP AF + OUT (PAGE3),A + LD A,9 + SCF + RET + +WRT_HN2 LD D,XH + LD E,XL + LD HL,HANDBUF + LD BC,#0020 + LDIR + POP AF + OUT (PAGE3),A + LD HL,DIR + LD BC,(DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + RET NC + LD HL,(DIRSIZE) + LD BC,#0020 + ADD HL,BC + LD (DIRSIZE),HL + AND A + RET + +GETNAME LD BC,#08FF +GETN1 LD A,(HL) + CP " " + JR NZ,GETN3 +GETN2 INC HL + DJNZ GETN2 + JR GETN4 +GETN3 LDI + DJNZ GETN1 +GETN4 LD A,(HL) + CP " " + LD A,"." + JR NZ,GETN5 + LD A,#00 +GETN5 LD (DE),A + INC DE + RET Z + LD B,#03 +GETN6 LD A,(HL) + CP " " + RET Z + LDI + XOR A + LD (DE),A + DJNZ GETN6 + RET + +DTABUF DEFW #0000 +CURHND DEFW #0000 +NO_NEXT DEFB #00 +FNDMODE DEFB #00 + +F_FIRST LD (ACCESS),A + LD (DTABUF),DE + LD A,B + LD (FNDMODE),A + PUSH HL + CALL LOADDIR + POP HL + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + LD A,(ACCESS) + CALL ASEARCH + RET C + LD HL,MASKARE + LD DE,(DTABUF) + LD BC,11 + LDIR + LD A,(ACCESS) + LD (DE),A + INC DE +FIND_S LD BC,#0020 + ADD IX,BC + LD (CURHND),IX + LD HL,HANDBUF+12 + LD BC,20 + LDIR + LD A,(HANDBUF+11) + LD (DE),A + INC DE + LD HL,HANDBUF + LD A,(FNDMODE) + OR A + JR NZ,FIND_M2 + LD BC,11 + LDIR + LD A,#FF + LD (NO_NEXT),A + XOR A + RET +FIND_M2 CALL GETNAME + LD A,#FF + LD (NO_NEXT),A + XOR A + RET + +F_NEXT LD A,(NO_NEXT) + OR A + LD A,14 + SCF + RET Z + LD (DTABUF),DE + LD DE,MASKARE + LD HL,(DTABUF) + LD BC,11 + LDIR + LD A,(HL) + PUSH HL + CALL NSEARCH + POP DE + EX AF,AF' + XOR A + LD (NO_NEXT),A + EX AF,AF' + RET C + INC DE + JP FIND_S + +NSEARCH EX AF,AF' + LD A,DIRPAGE + CALL BANK + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,(CURHND) + EXX + LD DE,0 + EXX + JP SEARCH1 + +DSEARCH LD A,#10 + CALL ASEARCH + RET NC + LD A,4 + RET + +SEARCH LD A,#23 +ASEARCH EX AF,AF' + LD A,DIRPAGE + CALL BANK + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,DIR + EXX + LD DE,0 + EXX +SEARCH1 LD A,(IX+00) + OR A + JR Z,SEARCH4 + CP #E5 + JR Z,SEARCH3 + LD A,(IX+11) + AND C + JR NZ,SEARCH3 + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 + EX DE,HL +SEARCH2 LD A,(DE) + CP "?" + JR Z,SEARCH5 + CP (HL) + JR NZ,SEARCH3 +SEARCH5 INC HL + INC DE + DJNZ SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,#0020 + LDIR + POP AF + OUT (PAGE3),A + AND A + RET + +SEARCH3 EXX + INC DE + EXX + LD DE,#0020 + ADD IX,DE + JR NC,SEARCH1 +SEARCH4 POP AF + OUT (PAGE3),A + LD A,3 + SCF + RET + +GETWORD LD DE,TMPNAME + LD BC,#0DFF +GETWRD1 LD A,(HL) + INC HL + CP '\' ; + JR Z,DIRNAME + CP ":" + JR Z,DRVNAME + LD (DE),A + INC DE + CP #21 + CCF + RET NC + DJNZ GETWRD1 + LD A,16 + SCF + RET + +DIRNAME LD A,#00 + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + JP NC,GETWORD + RET + +DRVNAME LD A,(TMPNAME) + CP "a" + JR C,DRVN2 + CP "{" + JR NC,DRVN2 + SUB #20 +DRVN2 SUB "A" + PUSH HL +; CALL OPENDSK + POP HL + JP NC,GETWORD + RET + +TMPNAME DB " ",#00 + +OPENDIR XOR A + CALL SET_FM + LD A,(HL) + OR A + JP NZ,SUBDIR + + LD DE,(ROOTDIR+0) + LD (IY+CLU1),E + LD (IY+CLU2),D + LD DE,(ROOTDIR+2) + LD (IY+CLU3),E + LD (IY+CLU4),D + + LD DE,(ROOTLEN+0) + LD (IY+LEN1),E + LD (IY+LEN2),D + LD DE,(ROOTLEN+2) + LD (IY+LEN3),E + LD (IY+LEN4),D + + CALL LOADDIR + LD HL,DIRSPEC + LD (HL),'\' ; + INC HL + LD (HL),#00 + AND A + RET + +SUBDIR CP "." + JR NZ,SUBDIR2 + EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 + LD (HL),#20 + LDIR + EXX + LD DE,MASKARE +SUBDIR0 LDI + LD A,(HL) + OR A + JR NZ,SUBDIR0 + JR SUBDIR3 + +SUBDIR2 LD DE,MASKARE + CALL MASK + RET C +SUBDIR3 CALL FINDDIR + RET C + LD (IY+CLU1),E + LD (IY+CLU2),D + LD (IY+CLU3),C + LD (IY+CLU4),B + EXX + LD (IY+LEN1),E + LD (IY+LEN2),D + LD (IY+LEN3),C + LD (IY+LEN4),B + EXX + CALL LOADDIR + AND A + RET + + + +FINDD03 LD BC,#0020 + ADD IX,BC + JR NC,FINDD01 +FINDD04 POP AF + OUT (PAGE3),A + LD A,4 + SCF + RET + +; FIND "MASKAREA" IN DIRECTORY + +FINDDIR LD A,DIRPAGE + CALL BANK + PUSH AF + LD IX,DIR +FINDD01 LD A,(IX+00) + OR A + JR Z,FINDD04 + CP #E5 + JR Z,FINDD03 + LD A,(IX+11) + AND #10 + JR Z,FINDD03 + LD HL,MASKARE + LD D,XH + LD E,XL + EX DE,HL + LD B,11 +FINDD02 LD A,(DE) + CP "?" + JR Z,FINDD05 + CP (HL) + JR NZ,FINDD03 +FINDD05 INC HL + INC DE + DJNZ FINDD02 + LD A,(IX+0) + CP "." + JP NZ,ADDSPEC + LD A,(IX+1) + CP "." + JP NZ,IT_DIR + LD HL,DIRSPEC + LD D,H + LD E,L + LD BC,#100 + XOR A + CPIR + LD BC,#100 + LD A,'\' ; + CPDR + INC HL + AND A + EX DE,HL + SBC HL,DE + EX DE,HL + JR NZ,ROTZ + INC HL +ROTZ LD (HL),0 +IT_DIR LD E,(IX+CLU1) + LD D,(IX+CLU2) + LD C,(IX+CLU3) + LD B,(IX+CLU4) + EXX + LD E,(IX+LEN1) + LD D,(IX+LEN2) + LD C,(IX+LEN3) + LD B,(IX+LEN4) + EXX + POP AF + OUT (PAGE3),A + AND A + RET + +ADDSPEC LD E,XL + LD D,XH + LD HL,DIRSPEC + LD BC,#FF + XOR A + CPIR + DEC HL + DEC HL + LD A,#5C ;"\" + CP (HL) + INC HL + JR Z,ADDSPE0 + LD (HL),A + INC HL +ADDSPE0 LD BC,#0820 +MM1 LD A,(DE) + INC DE + CP C + JR Z,MM2 + LD (HL),A + INC HL +MM2 DJNZ MM1 + LD A,(DE) + INC DE + CP C + JR Z,MM3 + LD (HL),"." + INC HL + LD (HL),A + INC HL + LD A,(DE) + INC DE + CP C + JR Z,MM3 + LD (HL),A + INC HL + LD A,(DE) + CP C + JR Z,MM3 + LD (HL),A + INC HL +MM3 LD (HL),0 + JP IT_DIR + +CURRDIR EX DE,HL + LD HL,DIRSPEC +CURDIR1 LD A,(HL) + OR A + LDI + JP NZ,CURDIR1 + RET + +LOADDIR XOR A + LD HL,0 + LD IX,0 + LD B,0 + CALL MOVE_FP + LD A,DIRPAGE + CALL BANK + PUSH AF + LD B,3 +LOADFFF PUSH BC + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF + LD (HL),L + LDIR +; LD A,(DRIVE) +; LD (IY+FDRV),A +; LD C,(IY+LEN1) + LD C,(IY+LEN2) + LD B,(IY+LEN3) + LD E,(IY+LEN4) + LD D,0 + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + LD E,(IY+CLU1) + LD D,(IY+CLU2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + LD XH,D + LD XL,E + LD B,C + LD A,B + OR A + JR Z,ERRLEND + CP #08 + JR C,NORLEND + LD B,8 +NORLEND + LD A,(CDDRIVE) + LD C,BIOS.DRV_READ + LD DE,DIR + RST ToBIOS + POP BC + JR NC,LOADMMM + DEC B + JP NZ,LOADFFF + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +ERRLEND POP BC + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +LOADMMM POP AF + OUT (PAGE3),A + CALL CORRDIR + AND A + RET + +CORRDIR LD A,DIRPAGE + CALL BANK + PUSH AF + LD HL,DIR + LD DE,DIR +CORRL1 PUSH DE + LD C,(HL) + LD B,0 + LD DE,ENTRYBF + LDIR + POP DE + PUSH HL + LD HL,FCDFLEN + LD C,(HL) + LD B,0 + ADD HL,BC + INC HL + LD (HL),0 + SBC HL,BC + PUSH DE + CALL MASK + POP HL + LD BC,11 + ADD HL,BC + LD A,(FCDFLAG) + BIT 1,A ;IS IT DIR? +; AND 2 + LD C,#01 ;ATTRIBUT FILE + JR Z,CORRL0 + LD C,#10 ;ATTRIBUT DIRECTORY +CORRL0 BIT 0,A ;IS IT HIDDEN + JR Z,CORRL00 + SET 1,C +CORRL00 + LD (HL),C + INC HL + XOR A + LD B,8 +FILLCDN LD (HL),A + INC HL + DJNZ FILLCDN + LD A,(FCDSEC+2) + LD (HL),A + INC HL + LD A,(FCDSEC+3) + LD (HL),A + INC HL +;MKDATE + PUSH HL + LD A,(FCDYEAR) + LD XL,A + LD XH,0 + LD DE,1900 + ADD IX,DE + LD A,(FCDMOUN) + LD E,A + LD A,(FCDDAY) + LD D,A + LD A,(FCDHOUR) + LD H,A + LD A,(FCDMIN) + LD L,A + LD A,(FCDSECN) + LD B,A + CALL MK_TIME + POP HL +; LD DE,#0000 ;TIME + LD (HL),E + INC HL + LD (HL),D + INC HL +; LD DE,#0000 ;DATE + LD (HL),C + INC HL + LD (HL),B + INC HL + + LD DE,(FCDSEC) + LD (HL),E + INC HL + LD (HL),D + INC HL + EX DE,HL + LD HL,FCDLEN + LDI + LDI + LDI + LDI + POP HL + BIT 7,H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 + LD L,0 + INC H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 +CORRL2 XOR A + LD (DE),A + LD DE,(ROOTDIR+0) + LD L,(IY+CLU1) + LD H,(IY+CLU2) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD DE,(ROOTDIR+2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + JR CORRL4 +CORRL6 LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + INC HL + LD (HL),"." +CORRL4 POP AF + OUT (PAGE3),A + AND A + RET + +;SYSTEM ATTRIBUTES +READONLY_ATR EQU %00000001 +HIDDEN_ATR EQU %00000010 +SYSTEM_ATR EQU %00000100 +ARCHIVE_ATR EQU %00100000 + +ENTRYBF + DEFB #00 ;Entry lenght + DEFB #00 ;XAR in LBN +FCDSEC DEFW #00,#00 ;Start sector (Intel) + DEFW #00,#00 ;Start sector (Motorola) +FCDLEN DEFW #00,#00 ;Lenght file (Intel) + DEFW #00,#00 ;Lenght file (Motorola) +FCDYEAR DEFB #00 ;Year +FCDMOUN DEFB #00 ;Mount +FCDDAY DEFB #00 ;Day +FCDHOUR DEFB #00 ;Hour +FCDMIN DEFB #00 ;Minute +FCDSECN DEFB #00 ;Second + DEFB #00 ;Reserve +FCDFLAG DEFB #00 ;Flag + DEFB #00 ;Interlive size + DEFB #00 ;Interlive skip factor + DEFW #0000 ;Volume Set Sequence (Intel) + DEFW #0000 ;Volume Set Sequence (Motorola) +FCDFLEN DEFB #00 +DEFSA EQU $-ENTRYBF +FCDNAME DEFS #100-DEFSA + +ROOTDIR DEFW 0,0 +ROOTLEN DEFW 0,0 + +DIRSIZE DEFW 0 + +BANK LD C,A + LD B,0 + LD HL,BANKTBL + ADD HL,BC + IN A,(PAGE3) + LD C,PAGE3 + OUTI + RET + +BANKTBL DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + +;HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +; DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +MASKARE + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +; HL - MASK "file*.t??" +; DE - 11 bytes filename +; RET: C=2 FILE WITHOUT EXTENTION +; C=1 FILE WITH EXTENTION + +MASK PUSH HL + PUSH DE + LD H,D + LD L,E + INC DE + LD (HL),#20 + LD BC,10 + LDIR + POP DE + POP HL + LD A,(HL) + CP #21 + RET C + LD BC,#0902 +MASK1 LD A,(HL) + CP #21 + CCF + RET NC + CP #22 + JR Z,MASK7 + CP "*" + JR Z,MASK3 + CP "+" + JR Z,MASK7 + CP "," + JR Z,MASK7 + CP "." + JR Z,MASK5 + CP "/" + JR Z,MASK7 + CP ":" + JR Z,MASK7 + CP ";" + JR Z,MASK7 + CP "<" + JR Z,MASK7 + CP "=" + JR Z,MASK7 + CP ">" + JR Z,MASK7 + CP "[" + JR Z,MASK7 + CP '\' ; + JR Z,MASK7 + CP "]" + JR Z,MASK7 + CP "|" + JR Z,MASK7 + CP "a" + JR C,MASK2 + CP "{" + JR NC,MASK2 + SUB #20 +MASK2 LD (DE),A + INC HL + INC DE + DJNZ MASK1 +MASK7 LD A,16 + SCF + RET + +MASK3 LD A,"?" + INC HL + DJNZ MASK6 + LD A,16 + SCF + RET + +MASK6 LD (DE),A + INC DE + DJNZ MASK6 + LD B,1 + JR MASK1 + +MASK5 LD A," " + INC HL + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET + +MASK4 LD (DE),A + INC DE + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET + +SYSTIME LD DE,DAY*256+MONTH ;DAY/MONTH + LD HL,#0000 ;HOUR/MINUTE + LD BC,#0001 ;SECOND/WEEKDAY + LD IX,YEAR ;YEAR + AND A + RET + +;INPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) + +MK_TIME LD A,L + RLCA + RLCA + SLA A + RL H + SLA A + RL H + SLA A + RL H + SRL B + OR B + LD L,A + + LD BC,#F844 ;(-1980) + ADD IX,BC + LD A,E + RLCA + RLCA + RLCA + RLCA + AND #F0 + LD B,XL + SLA A + RL B + OR D + LD C,A + EX DE,HL + AND A + RET + +;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) +;OUTPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) + +RMKTIME EX DE,HL + LD A,C + AND #1F + LD D,A + SRL B + RR C + LD A,C + RRCA + RRCA + RRCA + RRCA + AND #0F + LD E,A + LD C,B + LD B,0 + LD IX,1980 + ADD IX,BC + LD A,L + AND #1F + ADD A,A + LD B,A + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL L + SRL L + AND A + RET + +; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 + +CHDIR CALL GETWORD + RET C + LD HL,TMPNAME + LD A,(HL) + OR A + CALL NZ,OPENDIR + RET +; \ No newline at end of file diff --git a/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM b/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM new file mode 100644 index 0000000..fd61bdf --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM @@ -0,0 +1,525 @@ + +NAM EQU 0 +EXT EQU 8 +ATR EQU 11 + +CLU3 EQU 20 +CLU4 EQU 21 + +TIM1 EQU 22 +TIM2 EQU 23 +DAT1 EQU 24 +DAT2 EQU 25 +CLU1 EQU 26 +CLU2 EQU 27 +LEN1 EQU 28 +LEN2 EQU 29 +LEN3 EQU 30 +LEN4 EQU 31 +POS1 EQU 32 +POS2 EQU 33 +POS3 EQU 34 +POS4 EQU 35 +DIRCLU1 EQU 36 +DIRCLU2 EQU 37 +HND1 EQU 38 +HND2 EQU 39 +FDRV EQU 40 +AMODE EQU 41 +FTASK EQU 42 + +DIR EQU #C000 + +DIRPAGE EQU 0 + +;ACCESS MODE: +; 00 - READ/WRITE +; 01 - READ +; 02 - WRITE + +;File Manipulator (FM) +FM_BUF DEFB ". " ;+00 NAME + DEFB " " ;+08 EXT + DEFB #10 ;+11 ATTRIBUT + DEFB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED + DEFW #0000 ;+22 TIME + DEFW #0000 ;+24 DATE + DEFW #0000 ;+26 START CLUSTER + DEFW #0000,#0000 ;+28 SIZE FILE + DEFW #0000,#0000 ;+32 FILE POSITION (FP) + DEFW #0000 ;+36 DIRECTORY CLUSTER + DEFW #0000 ;+38 HANDLE NUMBER + DEFB #00 ;+40 DRIVE OR CURRENT + DEFB #00 ;+41 ACCESS MODE + DEFB #00 ;+42 TASK + DEFB #00 ;+43 EMPTY +END_FM +;End of FM + DEFS 44*1,0 + +FM_SIZE EQU END_FM-FM_BUF + +SET_FM PUSH DE + INC A + LD IY,FM_BUF-FM_SIZE + LD DE,FM_SIZE +SET_FM1 ADD IY,DE + DEC A + JR NZ,SET_FM1 + POP DE + LD A,(IY+0) + OR A + LD A,0 + RET NZ + LD A,5 + SCF + RET + +; HL:IX - OFFSET POINTER +; A - FILE MANIPULATOR + +MOVE_FP CALL SET_FM + RET C + INC B + DEC B + JP Z,MOVE_FA + DEC B + JP Z,MOVE_FB + DEC B + JP Z,MOVE_FC + LD A,1 + SCF + RET + +;from Start File +MOVE_FA LD BC,0 + LD DE,0 + JR MOVE_F1 + +;from End File +MOVE_FC LD C,(IY+28) + LD B,(IY+29) + LD E,(IY+30) + LD D,(IY+31) + JR MOVE_F1 + +;from Current Position +MOVE_FB LD C,(IY+32) + LD B,(IY+33) + LD E,(IY+34) + LD D,(IY+35) +MOVE_F1 ADD IX,BC + ADC HL,DE + LD D,HX + LD E,LX + LD (IY+32),E + LD (IY+33),D + LD (IY+34),L + LD (IY+35),H + XOR A + RET + +;FP COMPARE +; CY - FILE POINTER > SIZE +; NC - FILE POINTER < SIZE + +MOVE_CP LD L,(IY+28) + LD H,(IY+29) + LD E,(IY+32) + LD D,(IY+33) + AND A + SBC HL,DE + LD L,(IY+30) + LD H,(IY+31) + LD E,(IY+34) + LD D,(IY+35) + SBC HL,DE + RET + +INITDISK + LD B,4 +CD_I_LP PUSH BC + LD DE,DIR + LD HL,#0000 + LD IX,#0010 + LD BC,#0105 +; LD A,(DRIVE) + CALL CDCMD +; RST #18 + POP BC + JR NC,CD_I_OK + DJNZ CD_I_LP +UNKCD SCF + RET + +CD_I_OK LD HL,DIR + LD A,(HL) + INC HL + CP #01 + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "C" + JR NZ,UNKCD + LD A,(HL) + INC HL + CP "D" + JR NZ,UNKCD + LD HL,DIR+#009E + LD DE,ROOTDIR + LDI + LDI + LDI + LDI + LD HL,DIR+#00A6 + LD DE,ROOTLEN + LDI + LDI + LDI + LDI +; POP AF +; OUT (PAGE3),A +; LD HL,0 +; LD (FATCASH),HL + XOR A + RET + + + + + +LOADDIR XOR A + LD A,DIRPAGE + CALL BANK + PUSH AF + LD B,3 +LOADFFF PUSH BC + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF + LD (HL),L + LDIR +; LD A,(DRIVE) +; LD (IY+FDRV),A +;; LD C,(IY+LEN1) + LD C,(IY+LEN2) + LD B,(IY+LEN3) + LD E,(IY+LEN4) + LD D,0 + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + SRL D + RR E + RR B + RR C + LD E,(IY+CLU1) + LD D,(IY+CLU2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + LD HX,D + LD LX,E + LD B,C + LD A,B + OR A + JR Z,ERRLEND + CP #08 + JR C,NORLEND + LD B,8 +NORLEND LD A,(DRIVE) + LD C,5 + LD DE,DIR + CALL CDCMD +; RST #18 + POP BC + JR NC,LOADMMM + DEC B + JP NZ,LOADFFF + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +ERRLEND POP BC + POP AF + OUT (PAGE3),A + SCF + LD A,20 + RET + +LOADMMM POP AF + OUT (PAGE3),A + CALL CORRDIR + AND A + RET + +CORRDIR LD A,DIRPAGE + CALL BANK + PUSH AF + LD HL,DIR + LD DE,DIR +CORRL1 PUSH DE + LD C,(HL) + LD B,0 + LD DE,ENTRYBF + LDIR + POP DE + PUSH HL + LD HL,FCDFLEN + LD C,(HL) + LD B,0 + ADD HL,BC + INC HL + LD (HL),0 + SBC HL,BC + PUSH DE + CALL MASK + POP HL + LD BC,11 + ADD HL,BC + LD A,(FCDFLAG) + AND 2 + LD A,#00 ;ATTRIBUT FILE + JR Z,CORRL0 + LD A,#10 ;ATTRIBUT DIRECTORY +CORRL0 LD (HL),A + INC HL + XOR A + LD B,8 +FILLCDN LD (HL),A + INC HL + DJNZ FILLCDN + LD A,(FCDSEC+2) + LD (HL),A + INC HL + LD A,(FCDSEC+3) + LD (HL),A + INC HL + LD DE,#0000 ;TIME + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,#0000 ;DATE + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,(FCDSEC) + LD (HL),E + INC HL + LD (HL),D + INC HL + EX DE,HL + LD HL,FCDLEN + LDI + LDI + LDI + LDI + POP HL + BIT 7,H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 + LD L,0 + INC H + JR Z,CORRL2 + LD A,(HL) + OR A + JP NZ,CORRL1 +CORRL2 XOR A + LD (DE),A + LD DE,(ROOTDIR+0) + LD L,(IY+CLU1) + LD H,(IY+CLU2) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD DE,(ROOTDIR+2) + LD L,(IY+CLU3) + LD H,(IY+CLU4) + AND A + SBC HL,DE + JR NZ,CORRL6 + LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),#E5 + JR CORRL4 +CORRL6 LD HL,DIR + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + LD BC,#0020 + ADD HL,BC + LD A,(HL) + CP " " + JR NZ,CORRL4 + LD (HL),"." + INC HL + LD (HL),"." +CORRL4 POP AF + OUT (PAGE3),A + AND A + RET + +ENTRYBF + DEFB #00 ;Entry lenght + DEFB #00 ;XAR in LBN +FCDSEC DEFW #00,#00 ;Start sector (Intel) + DEFW #00,#00 ;Start sector (Motorola) +FCDLEN DEFW #00,#00 ;Lenght file (Intel) + DEFW #00,#00 ;Lenght file (Motorola) +FCDYEAR DEFB #00 ;Year +FCDMOUN DEFB #00 ;Month +FCDDAY DEFB #00 ;Day +FCDHOUR DEFB #00 ;Hour +FCDMIN DEFB #00 ;Minute +FCDSECN DEFB #00 ;Second + DEFB #00 ;Reserve +FCDFLAG DEFB #00 ;Flag + DEFB #00 ;Interlive size + DEFB #00 ;Interlive skip factor + DEFW #0000 ;Volume Set Sequence (Intel) + DEFW #0000 ;Volume Set Sequence (Motorola) +FCDFLEN DEFB #00 +DEFSA EQU $-ENTRYBF +FCDNAME DEFS #100-DEFSA + +ROOTDIR DEFW 0,0 +ROOTLEN DEFW 0,0 + +DIRSIZE DEFW 0 + +BANK LD C,A + LD B,0 + LD HL,BANKTBL + ADD HL,BC + IN A,(PAGE3) + LD C,PAGE3 + OUTI + RET + +BANKTBL DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF + +HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +MASKARE + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +; HL - MASK "file*.t??" +; DE - 11 bytes filename +; RET: C=2 FILE WITHOUT EXTENTION +; C=1 FILE WITH EXTENTION + +MASK PUSH HL + PUSH DE + LD H,D + LD L,E + INC DE + LD (HL),#20 + LD BC,10 + LDIR + POP DE + POP HL + LD A,(HL) + CP #21 + RET C + LD BC,#0902 +MASK1 LD A,(HL) + CP #21 + CCF + RET NC + CP #22 + JR Z,MASK7 + CP "*" + JR Z,MASK3 + CP "+" + JR Z,MASK7 + CP "," + JR Z,MASK7 + CP "." + JR Z,MASK5 + CP "/" + JR Z,MASK7 + CP ":" + JR Z,MASK7 + CP ";" + JR Z,MASK7 + CP "<" + JR Z,MASK7 + CP "=" + JR Z,MASK7 + CP ">" + JR Z,MASK7 + CP "[" + JR Z,MASK7 + CP '\' ; + JR Z,MASK7 + CP "]" + JR Z,MASK7 + CP "|" + JR Z,MASK7 + CP "a" + JR C,MASK2 + CP "{" + JR NC,MASK2 + SUB #20 +MASK2 LD (DE),A + INC HL + INC DE + DJNZ MASK1 +MASK7 LD A,16 + SCF + RET + +MASK3 LD A,"?" + INC HL + DJNZ MASK6 + LD A,16 + SCF + RET + +MASK6 LD (DE),A + INC DE + DJNZ MASK6 + LD B,1 + JR MASK1 + +MASK5 LD A," " + INC HL + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET + +MASK4 LD (DE),A + INC DE + DJNZ MASK4 + LD B,4 + DEC C + JP NZ,MASK1 + LD A,16 + SCF + RET diff --git a/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm b/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm new file mode 100644 index 0000000..02deff8 --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm @@ -0,0 +1,372 @@ +MASTER EQU 0 +SLAVE EQU 1 +;======================================================== +R170 EQU #0050 ;Data +R171 EQU #0051 ;Error +R172 EQU #0052 ;Direct +R173 EQU #0053 ;Reserve +R174 EQU #0054 ;Lenght block low +R175 EQU #0055 ;Lenght block high +R176 EQU #4052 ;Drive device +R177 EQU #4053 ;Status + +W170 EQU #0150 ;Data +W171 EQU #0151 ;???? +W172 EQU #0152 ;???? +W173 EQU #0153 ;Reserve +W174 EQU #0154 ;Lenght block low +W175 EQU #0155 ;Lenght block high +W176 EQU #4152 ;Drive device +W177 EQU #4153 ;Command + +BSY EQU 7 +DRQ EQU 3 +ERR EQU 0 + + +;-----------------------------------------------------------------------; +SIZESEC: DW #0800 + +PKTSIZE: DB 12 +;-----------------------------------------------------------------------; + + +CDCMD BIT 7,C + JP NZ,EXTCD + INC C + DEC C + JP Z,RESETCD ; 0 + DEC C + JP Z,RESETCD ; 1 + DEC C + JP Z,NOPCDC ; 2 + DEC C + JP Z,CHEK_C ; 3 + DEC C + JP Z,GBPB_C ; 4 ; [ ] перенести в DSS + DEC C + JP Z,READC ; 5 + DEC C + JP Z,NOPCDC ; 6 +NOPCDC LD A,1 + SCF + RET + +EXTCD RES 7,C + INC C + DEC C + JP Z,NOPCDC + DEC C + JP Z,OPENC + DEC C + JP Z,CLOSC + JP NOPCDC + + +RESETCD LD B,50 +RESECD PUSH BC + LD A,(CDDRIVE) + CALL CD_TEST + POP BC + RET NC + OR A + RET Z + EI + HALT + DJNZ RESECD + RET + +CHEK_C LD A,(CDDRIVE) + CALL CD_TEST + LD A,#FF + AND A + RET + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; [ ] перенести в DSS +GBPB_C LD HL,CD_BPB + LD BC,#0200 + LDIR + XOR A + RET +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +READC LD A,(CDDRIVE) + JP CD_READ + +OPENC LD A,(CDDRIVE) + JP CD_OPEN + +CLOSC LD A,(CDDRIVE) + JP CD_CLOS + +CD_TEST LD HL,CMDNOPP + LD DE,0 + JP AP_COM + +CD_OPEN LD HL,CMDOPEN + LD DE,0 + JP AP_COM + +CD_CLOS LD HL,CMDCLOS + LD DE,0 + JP AP_COM + +; HL:IX - SECTOR +; DE - ADDRESS +; B - SECTOR COUNT +; A - DRIVE +CD_READ: + LD C,A + LD A,H + LD (SECREAD+0),A + LD A,L + LD (SECREAD+1),A + LD A,XH + LD (SECREAD+2),A + LD A,XL + LD (SECREAD+3),A + LD A,B + LD (COUNT+1),A + LD HL,CMDREAD + LD A,C + CALL AP_COM + RET + +; INPUT: HL - AP paket (12bytes) +; RETURN: CF - ERROR +; 01h - RECOVERED ERROR +; 02h - NOT READY +; 03h - MEDIUM ERROR +; 04h - HARDWARE ERROR +; 05h - ILLEGAL REQUEST +; 06h - UNIT ATTETION +; 07h - DATA PROTECT +; 0Bh - ABORTED COMMAND +; 80h - TIME OUT + +AP_COM ;AND #01 + ;LD A,#A0 ;0 + ;JR Z,APCOM1 + ;LD A,#B0 +APCOM1 ;LD BC,W176 + ;OUT (C),A ;SELECT DRIVE + EXX + LD DE,#8000 + LD BC,R177 + CALL WAITPRT + EXX + JR NC,CDREADY + LD BC,W177 + LD A,#08 + OUT (C),A + LD B,#80 + DJNZ $ + EXX + LD DE,#8000 + LD BC,R177 + CALL WAITPRT + EXX + RET C +CDREADY XOR A + EXX + LD BC,W171 + OUT (C),A + LD DE,(SIZESEC) ;SIZE BLOCK + LD BC,W174 + OUT (C),E + LD BC,W175 + OUT (C),D + LD BC,W177 + LD A,#A0 ;ATAPI.Packet + OUT (C),A + LD DE,#8000 + LD BC,R177 + CALL WAITPRT + EXX + RET C + EXX + LD DE,#0908 + LD BC,R177 + CALL WAITPRT + EXX + BIT ERR,A + JR NZ,CDERROR + JR NC,YEP_DRQ + LD A,#80 + RET + +YEP_DRQ LD BC,W170 + LD A,(PKTSIZE) + SRL A +OUTPKT OUTI + OUTI + DEC A + JR NZ,OUTPKT + LD B,#80 + DJNZ $ +AP_LOOP EXX + LD DE,#8000 + LD BC,R177 + CALL WAITPRT + EXX + RET C + LD BC,R177 + IN A,(C) + BIT ERR,A + JR Z,NO_ERR +CDERROR LD BC,R171 ;ERROR + IN A,(C) + RRCA + RRCA + RRCA + RRCA + AND #0F + SCF + RET + +NO_ERR BIT DRQ,A + LD A,0 + RET Z ;NO DATA REQUEST + EX DE,HL + LD BC,R174 + IN E,(C) + LD BC,R175 + IN D,(C) ;TRANSFER BLOCK SIZE + LD A,D + OR E + RET Z ;BLOCK = 0 + LD BC,R172 + IN A,(C) + AND #02 + ;CP #02 + JP NZ,FROM_CD +TO_CD LD BC,R170 +WR_T_CD OUTI + OUTI + DEC DE + DEC DE + LD A,D + OR E + JR NZ,WR_T_CD + EX DE,HL + JR AP_LOOP + +FROM_CD LD A,H + OR L + JR Z,NULL + LD BC,R170 +RD_F_CD INI + INI + DEC DE + DEC DE + LD A,D + OR E + JR NZ,RD_F_CD + EX DE,HL + JR AP_LOOP + +NULL LD BC,R170 +RD_N_CD IN A,(C) + DEC B + IN A,(C) + DEC B + DEC DE + DEC DE + LD A,D + OR E + JR NZ,RD_N_CD +; DE = 0 !!! + JR AP_LOOP + +; E - Second * 10 + +PAUSE LD HL,#0000 +PAUSE1 DEC L + JR NZ,PAUSE1 + DEC H + JR NZ,PAUSE1 + DEC E + JR NZ,PAUSE1 + RET + +; D - MASK +; E - PATTERN +; BC - PORT + +WAITPRT LD A,100 + LD HL,#0000 +WAITPX EX AF,AF' +WAITP0 IN A,(C) + CP #FF + JR Z,WAITP1 + AND D + CP E + JR NZ,WAITP2 + AND A + RET + +WAITP2 DEC L + JR NZ,WAITP0 + DEC H + JR NZ,WAITP0 + EX AF,AF' + DEC A + JR NZ,WAITPX + EX AF,AF' +WAITP1 SCF + RET + +CMDNOPP DEFB #00 + DEFB 00,00,00 + DEFB #00 + DEFB 00,00,00 + DEFB 00,00,00 + DEFB #00 + +CMDOPEN DEFB #1B + DEFB #00,#00,#00 + DEFB #02 + DEFB #00,#00,#00,#00,#00,#00,#00 + +CMDCLOS DEFB #1B + DEFB #00,#00,#00 + DEFB #03 + DEFB #00,#00,#00,#00,#00,#00,#00 + +;CMDREAD DEFB #28,#00 +CMDREAD DEFB #28,#00 +SECREAD DEFB #00,#00,#00,#00 + DEFB #00 +COUNT DEFB #00,#01 + DEFB #00,#00,#00 + + +; Area for boot sector [512Bytes] +CD_BPB DB #00,#00,#00 ; +00 JMP + DB " " ; +03 DOS NAME + +; Block Parameters BIOS + + DW #0200 ; +0B BYTE PER SECTOR + DB 4 ; +0D SECTORS PER CLUSTER + DW 1 ; +0E RESERVE SECTORS + DB 1 ; +10 AMOUNT FATS + DW 512 ; +11 FILES IN DIRECTORY + DW 0 ; +13 ALL SECTORS ON DISK + DB #F8 ; +15 ID FORMAT + DW 1 ; +16 SIZE FAT IN SECTORS + DW 63 ; +18 SECTOR PER TRACK + DW 255 ; +1A AMOUNT SIDES + DW #0010 ; +1C HIDDEN SECTORS + + DS 24 + + DB "FAT16" ; +36 FAT ID + + DS 453 +; end boot sector +;======================================================== + + + diff --git a/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm b/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm new file mode 100644 index 0000000..aee4820 --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm @@ -0,0 +1,356 @@ +;CD ROM DRIVE DRIVER +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +; 02-08-2001 DNS Initial this module +;--------------------------------------------------------------- +;======================================================== +R170 EQU #0050 ;Data +R171 EQU #0051 ;Error +R172 EQU #0052 ;Direct +R173 EQU #0053 ;Reserve +R174 EQU #0054 ;Lenght block low +R175 EQU #0055 ;Lenght block high +R176 EQU #4052 ;Drive device +R177 EQU #4053 ;Status + +W170 EQU #0150 ;Data +W171 EQU #0151 ;???? +W172 EQU #0152 ;???? +W173 EQU #0153 ;Reserve +W174 EQU #0154 ;Lenght block low +W175 EQU #0155 ;Lenght block high +W176 EQU #4152 ;Drive device +W177 EQU #4153 ;Command + +RAM_ATAPI_PK EQU #FEE0 +RAM_ATAPI_READ EQU #FEF0 + + +; BSY EQU 7 +; DRQ EQU 3 +; ERR EQU 0 + +RESETC +RESETCD LD B,50 +RESECD PUSH BC + LD A,1 + CALL CD_TEST + POP BC + RET NC + EI + HALT + DJNZ RESECD + RET + +LREADC + +READC LD A,1 + JP CD_READ + +OPENC LD A,1 + JP CD_OPEN + +CLOSC LD A,1 + JP CD_CLOS + +SIZESEC EQU #0800 +PKTSIZE EQU 12 + +CD_TEST LD HL,CMDNOPP + LD DE,0 + CALL AP_COM + RET + +DETECTC + +CD_OPEN LD HL,CMDOPEN + LD DE,0 + CALL AP_COM + RET + +CD_CLOS LD HL,CMDCLOS + LD DE,0 + CALL AP_COM + RET + +; HL:IX - SECTOR +; DE - ADDRESS +; B - SECTOR COUNT +; A - DRIVE + +CD_READ LD C,A + EXX + LD C,PAGE3 + IN A,(C) + PUSH AF + LD A,SYSPAGE + OUT (C),A + LD HL,CMDREAD + LD DE,RAM_ATAPI_READ + LD BC,PKTSIZE + LDIR + EXX + LD A,H + LD (RAM_ATAPI_READ+SECREAD+0),A ;R01 + LD A,L + LD (RAM_ATAPI_READ+SECREAD+1),A ;R01 + LD A,XH + LD (RAM_ATAPI_READ+SECREAD+2),A ;R01 + LD A,XL + LD (RAM_ATAPI_READ+SECREAD+3),A ;R01 + LD A,B + LD (RAM_ATAPI_READ+COUNT+1),A ;R01 + POP AF + OUT (PAGE3),A +;R01 LD HL,CMDREAD + LD HL,RAM_ATAPI_READ + LD A,C + CALL AP_COM + RET + +; INPUT: HL - AP paket (12bytes) +; RETURN: CF - ERROR +; 01h - RECOVERED ERROR +; 02h - NOT READY +; 03h - MEDIUM ERROR +; 04h - HARDWARE ERROR +; 05h - ILLEGAL REQUEST +; 06h - UNIT ATTETION +; 07h - DATA PROTECT +; 0Bh - ABORTED COMMAND +; 80h - TIME OUT + +AP_COM AND #01 + LD A,#A0 + JR Z,APCOM1 + LD A,#B0 +APCOM1 LD BC,W176 + OUT (C),A ;SELECT DRIVE + EXX + LD DE,#8000 + LD BC,R177 + CALL CWAITPRT + EXX + JR NC,CDREADY + LD BC,W177 + LD A,#08 + OUT (C),A + LD B,#00 + DJNZ $ + EXX + LD DE,#8000 + LD BC,R177 + CALL CWAITPRT + EXX + RET C +CDREADY + LD C,PAGE3 + IN B,(C) + + PUSH DE + PUSH BC + + LD A,SYSPAGE + OUT (C),A + LD A,B + LD DE,RAM_ATAPI_PK + LD BC,PKTSIZE + LDIR + + POP BC + POP DE + OUT (C),B + + XOR A + EXX + OUT (C),A + XOR A + LD BC,W171 + OUT (C),A + LD DE,SIZESEC ;SIZE BLOCK + LD BC,W174 + OUT (C),E + LD BC,W175 + OUT (C),D + LD BC,W177 + LD A,#A0 + OUT (C),A + LD DE,#8000 + LD BC,R177 + CALL CWAITPRT + EXX + RET C + EXX + IF _MAME + LD DE,#0808 + ELSE + LD DE,#0908 + ENDIF + LD BC,R177 + CALL CWAITPRT + EXX + BIT ERR,A + JR NZ,CDERROR + JR NC,YEP_DRQ + LD A,#80 + RET + +YEP_DRQ LD C,PAGE3 + IN B,(C) + PUSH BC + LD A,SYSPAGE + OUT (PAGE3),A + LD HL,RAM_ATAPI_PK + LD BC,W170 + LD A,PKTSIZE + SRL A +OUTPKT OUTI + OUTI + DEC A + JR NZ,OUTPKT + POP BC + OUT (C),B + LD B,#80 + DJNZ $ +AP_LOOP EXX + LD DE,#8000 + LD BC,R177 + CALL CWAITPRT + EXX + RET C + LD BC,R177 + IN A,(C) + BIT ERR,A + JR Z,NO_ERR +CDERROR LD BC,R171 ;ERROR + IN A,(C) + RRCA + RRCA + RRCA + RRCA + AND #0F + SCF + RET + +NO_ERR BIT DRQ,A + LD A,0 + RET Z ;NO DATA REQUEST + EX DE,HL + LD BC,R174 + IN E,(C) + LD BC,R175 + IN D,(C) ;TRANSFER BLOCK SIZE + LD A,D + OR E + RET Z ;BLOCK = 0 + LD BC,R172 + IN A,(C) + AND #02 + CP #02 + JP Z,FROM_CD +TO_CD LD BC,R170 +WR_T_CD OUTI + OUTI + DEC DE + DEC DE + LD A,D + OR E + JR NZ,WR_T_CD + EX DE,HL + JR AP_LOOP + +FROM_CD LD A,H + OR L + JR Z,NULL + LD BC,R170 +RD_F_CD INI + INI + DEC DE + DEC DE + LD A,D + OR E + JR NZ,RD_F_CD + EX DE,HL + JR AP_LOOP + +NULL LD BC,R170 +RD_N_CD IN A,(C) + DEC B + IN A,(C) + DEC B + DEC DE + DEC DE + LD A,D + OR E + JR NZ,RD_N_CD +; DE = 0 !!! + JR AP_LOOP + +; E - Second * 10 + +PAUSE LD HL,#0000 +PAUSE1 DEC L + JR NZ,PAUSE1 + DEC H + JR NZ,PAUSE1 + DEC E + JR NZ,PAUSE1 + RET + +; D - MASK +; E - PATTERN +; BC - PORT + +CWAITPRT + LD A,100 + LD HL,#0000 +CWAITPX EX AF,AF' +CWAITP0 IN A,(C) + CP #FF + JR Z,CWAITP1 + AND D + CP E + JR NZ,CWAITP2 + AND A + RET + +CWAITP2 DEC L + JR NZ,CWAITP0 + DEC H + JR NZ,CWAITP0 + EX AF,AF' + DEC A + JR NZ,CWAITPX + EX AF,AF' +CWAITP1 SCF + RET + +CMDNOPP DEFB #00 + DEFB 00,00,00 + DEFB #00 + DEFB 00,00,00 + DEFB 00,00,00 + DEFB #00 + +CMDOPEN DEFB #1B + DEFB #00,#00,#00 + DEFB #02 + DEFB #00,#00,#00,#00,#00,#00,#00 + +CMDCLOS DEFB #1B + DEFB #00,#00,#00 + DEFB #03 + DEFB #00,#00,#00,#00,#00,#00,#00 + +CMDREAD DEFB #28,#00 +SECREAD EQU $-CMDREAD + DEFB #00,#00,#00,#00 + DEFB #00 +COUNT EQU $-CMDREAD + DEFB #00,#01 + DEFB #00,#00,#00 + +;======================================================== + + diff --git a/DSS/drivers/media/ATAPI/Hidden/DSS.INC b/DSS/drivers/media/ATAPI/Hidden/DSS.INC new file mode 100644 index 0000000..5197cee --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/DSS.INC @@ -0,0 +1,104 @@ + +DSS_VERSION EQU #00 +DSS_CHDISK EQU #01 +DSS_CURDISK EQU #02 +DSS_DSKINFO EQU #03 +;DSS_G_ENTRY EQU #04 +; EQU #05 +; EQU #06 +; EQU #07 +; EQU #08 +DSS_BOOTDSK EQU #09 +;File io +DSS_CREATE EQU #0A +DSS_CREAT_N EQU #0B +; EQU #0C +;DSS_ERASE EQU #0D +DSS_DELETE EQU #0E +;DSS_MOVE EQU #0F +DSS_RENAME EQU #10 +DSS_OPEN EQU #11 +DSS_CLOSE EQU #12 +DSS_READ EQU #13 +DSS_WRITE EQU #14 +DSS_MOVE_FP EQU #15 +DSS_ATTRIB EQU #16 +DSS_GET_D_T EQU #17 +DSS_PUT_D_T EQU #18 +DSS_F_FIRST EQU #19 +DSS_F_NEXT EQU #1A +DSS_MKDIR EQU #1B +DSS_RMDIR EQU #1C +DSS_CHDIR EQU #1D +DSS_CURDIR EQU #1E +; EQU #1F +; EQU #20 +DSS_SYSTIME EQU #21 +DSS_SETTIME EQU #22 +; EQU #23 +; EQU #24 +; EQU #25 +; EQU #26 +; EQU #27 +; EQU #28 +; EQU #29 +; EQU #2A +; EQU #2B +; EQU #2C +; EQU #2D +; EQU #2E +; EQU #2F +;Keyboard +DSS_WAITKEY EQU #30 +DSS_SCANKEY EQU #31 +DSS_ECHOKEY EQU #32 +DSS_CTRLKEY EQU #33 +;DSS_EDIT EQU #34 +DSS_K_CLEAR EQU #35 +DSS_K_SETUP EQU #36 +DSS_TESTKEY EQU #37 +;Memory +DSS_SETWIN EQU #38 +DSS_SETWIN1 EQU #39 +DSS_SETWIN2 EQU #3A +DSS_SETWIN3 EQU #3B +DSS_INFOMEM EQU #3C +DSS_GETMEM EQU #3D +DSS_FREEMEM EQU #3E +DSS_SETMEM EQU #3F +;Execution +DSS_EXEC EQU #40 +DSS_EXIT EQU #41 +DSS_WAIT EQU #42 + +DSS_GSWITCH EQU #43 +DSS_DOSNAME EQU #44 +DSS_EX_PATH EQU #45 +DSS_ENVIRON EQU #46 +DSS_APPINFO EQU #47 +; EQU #48 +; EQU #49 +; EQU #4A +; EQU #4B +; EQU #4C +; EQU #4D +; EQU #4E +; EQU #4F + +DSS_SETVMOD EQU #50 +DSS_GETVMOD EQU #51 +DSS_LOCATE EQU #52 +DSS_CURSOR EQU #53 +DSS_SELPAGE EQU #54 +DSS_SCROLL EQU #55 +DSS_CLEAR EQU #56 +DSS_RDCHAR EQU #57 +DSS_WRCHAR EQU #58 +DSS_WINCOPY EQU #59 +DSS_WINREST EQU #5A +DSS_PUTCHAR EQU #5B +DSS_PCHARS EQU #5C +;DSS_RES_PRN EQU #5D +;DSS_CTRLPRN EQU #5E +DSS_PRINT EQU #5F +; diff --git a/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT b/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT new file mode 100644 index 0000000..e88e42d --- /dev/null +++ b/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT @@ -0,0 +1,6 @@ + +00000000 00 43 44 30 30 31 01 45 4c 20 54 4f 52 49 54 4f |.CD001.EL TORITO| +00000010 20 53 50 45 43 49 46 49 43 41 54 49 4f 4e 00 00 | SPECIFICATION..| +00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| +* +00000040 00 00 00 00 00 00 00 13 00 00 00 00 00 00 00 00 |................| diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM deleted file mode 100644 index 29d977b..0000000 --- a/DSS/drivers/media/ReScanDRV.ASM +++ /dev/null @@ -1,495 +0,0 @@ -;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC -ReScanDRV: -.NUMBER_OF_SUBTABLES EQU 2 ;количество таблиц второго уровня (LOGDRV, RMDRIVE) -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 0. запоминаем бут-диск -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,B - LD (.old_letter),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 1. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD HL,DEVICE - LD DE,OLD_TABLES.DEVICE - LD BC,OLD_TABLES.DEVICE - DEVICE - LDIR - ; - LD A,.NUMBER_OF_SUBTABLES - LD (Fill_if_Exists.tbl),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 2. вызываем инициализацию драйвов -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - CALL INITDVC_RET_DRIVE - LD (DRV_PAGE.LDRIVE),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 3. сравниваем записи старых таблиц с новыми: -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD HL,OLD_TABLES.DEVICE - LD B,DSS_MAX_DRIVES_AMOUNT -.tbl_scanNew_mainLoop: - PUSH BC - PUSH HL - ; получаем номер процедуры для этой буквы диска - LD A,(HL) - ; - CP #FF - JR Z,.nextN - ; - LD B,A - INC HL - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - ; [ищем что за драйв] - EX DE,HL - ; FDD? - LD HL,FDD_DRV.API_TABLE - AND A - SBC HL,DE - JR Z,.nextN ; пропуск FDD драйвов - ; HDD? - LD HL,HDDRIVE - AND A - SBC HL,DE - ; HDD! Сверка по таблице LOGDRV - JP Z,SCAN_TABLES.HARD_DRV - ; RD? - LD HL,RMDRIVE - AND A - SBC HL,DE - ; RAM Drive! Сверка по таблице RAMDTBL - JP Z,SCAN_TABLES.RAM_DRV - ; CD/DVD? - ;LD HL,CDDRIVE - ;AND A - ;SUB HL,DE - ; CD/DVD! - ; JR Z,SCAN_TABLES.CD_ROM - - ; следующий виток -.nextN: POP HL -.nextN2: - INC HL - INC HL - INC HL - POP BC - DJNZ .tbl_scanNew_mainLoop -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 4. сравниваем запись новых таблиц со старыми -; а. если драйв только в новой: -; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва) -; -; ВХОД: IX - OLD_TABLES.DEVICE -; HL - OLD_TABLES.DEVICE.End -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - INC HL - LD (OLD_TABLES_CURRENT),HL - EXX - LD HL,OLD_TABLES.LOGDRV - LOGDRV - LD B,DSS_MAX_DRIVES_AMOUNT - EXX - ; находим в старой DEVICE первую свободную ячейку (проверяем с конца в начало) - LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry - LD IY,LOGDRV - LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; двигаемся по таблице назад - LD B,DSS_MAX_DRIVES_AMOUNT - ; -.loop1: LD A,#FF - CP (IX+0) - JR NZ,.loop2_start - ADD IX,DE - DJNZ .loop1 -.loop1_exit: - LD A,C ; закончили считать переменную LDRIVE - LD (DRV_PAGE.LDRIVE),A -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 5. проверяем, не грохнулся ли бут-диск. -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -.old_letter+1: - LD A,0 - _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE - LD A,(HL) - INC A - SCF - ;JP Z,ERROR_BOOTDRV_DIES - RET Z -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 6. заменяем новые таблицы на модифицированные старые -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD HL,OLD_TABLES.DEVICE - LD DE,DEVICE - LD BC,OLD_TABLES.DEVICE - DEVICE - LDIR - ; -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -;7. выход -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - LD A,(DRV_PAGE.LDRIVE) - AND A - RET -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -;-----------------------[] -.loop2_start: - LD C,B ; начинаем считать переменную LDRIVE - LD A,DSS_MAX_DRIVES_AMOUNT - SUB B ; сколько шагов вперёд по таблице осталось - LD B,A - ; -.loop2: LD DE,DEVICE.TBL_Entry ; теперь двигаемся по таблице вперёд - ADD IX,DE - ; тут указатель показывает на первую свободную ячейку после блока с данными драйвов - PUSH IX - PUSH BC - CALL Fill_if_Exists - POP BC - POP IX - ; NC: - ; DE = адрес процедуры обработчика таблицы - ; A = логический номер устройства в таблице обработчика - ; - ; CF - нет больше новых записей - JR C,.loop1_exit - - LD (IX+0),A - LD (IX+1),E - LD (IX+2),D - ; - INC C ; добавили драйв - ; - DJNZ .loop2 - JR .loop1_exit -;-----------------------[] - -;-----------------------[] -Fill_if_Exists: -.tbl+1: LD B,ReScanDRV.NUMBER_OF_SUBTABLES - DJNZ 1F - ; B=1, RAMDTBL - LD A,RAMDTBL.TBL_Entry - LD IY,RAMDTBL - CALL .RUN - LD DE,RMDRIVE - RET NC - LD A,(.tbl) - DEC A ;!!!!! может быть переполнение - LD (.tbl),A - RET - ; -1: DJNZ 1F - ; B=2, LOGDRV - LD A,LOGDRV.TBL_Entry - LD IY,LOGDRV - CALL .RUN - LD DE,HDDRIVE - RET NC - ; переходим на другую таблицу - RAMDTBL - LD A,(.tbl) - DEC A ;!!!!! может быть переполнение - LD (.tbl),A - LD HL,OLD_TABLES.RAMDTBL - LD (OLD_TABLES_CURRENT),HL - EXX - LD B,MAX_RAMDRIVES - EXX - JR Fill_if_Exists - ; -1: SCF ; unknown table number - RET -; -.RUN: EXX - ; - LD D,0 - LD E,A - PUSH DE - ; - LD A,#FE ; Так поиск закончится либо на номере драйва, либо по концу таблицы - PUSH BC - CALL Find_Record.loop1 ; ищет в новой таблице новую запись - POP BC - JR NC,1F - ; - POP DE - EXX - RET - ; -1: PUSH IY ; сохраняем текущий адрес новой таблицы - ; - LD IY,(OLD_TABLES_CURRENT) - ; - LD A,#FF ; Так поиск закончится либо на пустой записи, либо по концу таблицы - LD C,D ; номер записи в таблице. D=0 - PUSH BC - CALL Find_Record.loop2 - LD A,C - POP BC - JR NC,1F - ; - POP DE - POP DE - EXX - RET - ; -1: EX (SP),IY ; переключение со старой на новую таблицу - PUSH IY - EXX - ; перекидываем запись из новой в старую - POP HL - POP DE - POP BC - LDIR - - LD (IY),#FF ; грохаем только что перекинутую запись из новой таблицы - AND A - RET -OLD_TABLES_CURRENT: WORD 0 -;-----------------------[] - -;-----------------------[] -; ВХОД: A - Маска для сравнения -; DE - Длина одной записи -; IY - Адрес данных в таблице -; ВЫХОД: NC: -; IY - начало подходящей записи -; C - номер новой записи в старой таблице -; CF - Не найдено, таблица закончилась -Find_Record: -.loop1: CP (IY) - RET NC - ADD IY,DE - INC C - DJNZ .loop1 - ; таблицу прошерстили - SCF - RET -.loop2: CP (IY) - RET Z - ADD IY,DE - INC C - DJNZ .loop2 - ; таблицу прошерстили - SCF - RET -;-----------------------[] - -;-----------------------[] -; ERROR_BOOTDRV_DIES: -; DI -; LD E,1 -; LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default -; RST ToBIOS -; ; -; LD HL,#2050 -; LD DE,0 -; LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN -; RST ToBIOS -; ; -; LD A,1 -; OUT (SCREEN_SWITCH),A ; set scr-2 -; ; -; LD HL,.ERROR_MSG -; LD DE,#A000 -; LD BC,.ERROR_MSG.size -; LD A,C -; LDIR -; ; -; LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 -; LD C,BIOS.LP_SET_PLACE -; RST ToBIOS -; ; -; LD HL,#A000 -; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE -; LD B,A -; LD C,BIOS.LP_PRINT_LINE3 -; RST ToBIOS -; ; -; .loop: DI -; HALT -; JR .loop -; ; -; .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -; .ERROR_MSG.size EQU $-.ERROR_MSG -;-----------------------[] - - -;-----------------------[] -; НЕ ГРОХАТЬ HL! -; а. если драйв есть в новой и старой, то затираем в новой -; таблице совпавший драйв -; б. если драйв есть только в старой, то: -; б1) грохаем файловые манипуляторы с его номером - MODULE SCAN_TABLES -; вход: B - лог.номер драйва, DE -RAM_DRV: - ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL - LD A,B - LD BC,OLD_TABLES.RAMDTBL - CALL GET_RAMDRV_NUM.skip_tbl - LD (.cur_drv),BC - AND #0F - LD C,A ; номер рамдиска - ; Ищем в новой такой же номер рамдиска - LD B,MAX_RAMDRIVES - LD DE,RAMDTBL -.loop: LD A,(DE) - SUB C - JR Z,.found - INC DE - INC DE - DJNZ .loop - ; ЗАПИСЬ НЕ НАЙДЕНА - ; Достаём положение в OLD_TABLES.DEVICE - POP HL - ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM - POP BC - PUSH BC - ; Грохаем ФМ и запись в OLD_TABLES.DEVICE - CALL KILL_FM - ; грохаем в старой RAMDTBL этот драйв - EX DE,HL -.cur_drv+1: - LD HL,0 - LD (HL),#FF - DEC HL - LD (HL),#FF - EX DE,HL - JP ReScanDRV.nextN2 - ; -.found: DEC A - ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) - LD (DE),A - DEC DE - LD (DE),A - JP ReScanDRV.nextN -;-----[] -HARD_DRV: - LD L,B - LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV - LD IX,LOGDRV - LD DE,LOGDRV.TBL_Entry - LD B,DSS_MAX_DRIVES_AMOUNT - ; -.loop: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) - ;CP #FF - ;JR Z,.skip - CP (IX+LOGDRV.PHISICAL_DRV_NUMBER) - JR NZ,.skip - ; - LD A,(IY+LOGDRV.SECTOR_OFFSET) - CP (IX+LOGDRV.SECTOR_OFFSET) - JR NZ,.skip - LD A,(IY+LOGDRV.SECTOR_OFFSET+1) - CP (IX+LOGDRV.SECTOR_OFFSET+1) - JR NZ,.skip - LD A,(IY+LOGDRV.SECTOR_OFFSET+2) - CP (IX+LOGDRV.SECTOR_OFFSET+2) - JR NZ,.skip - LD A,(IY+LOGDRV.SECTOR_OFFSET+3) - CP (IX+LOGDRV.SECTOR_OFFSET+3) - JR NZ,.skip - LD A,(IY+LOGDRV.SIZE_IN_SECTORS) - CP (IX+LOGDRV.SIZE_IN_SECTORS) - JR NZ,.skip - LD A,(IY+LOGDRV.SIZE_IN_SECTORS+1) - CP (IX+LOGDRV.SIZE_IN_SECTORS+1) - JR NZ,.skip - LD A,(IY+LOGDRV.SIZE_IN_SECTORS+2) - CP (IX+LOGDRV.SIZE_IN_SECTORS+2) - JR NZ,.skip - LD A,(IY+LOGDRV.SIZE_IN_SECTORS+3) - CP (IX+LOGDRV.SIZE_IN_SECTORS+3) - JR Z,.found - ; -.skip: ADD IX,DE - DJNZ .loop - ; ЗАПИСЬ НЕ НАЙДЕНА - ; Грохаем старую запись в OLD_TABLES.LOGDRV - LD A,#FF - LD (IY+LOGDRV.PHISICAL_DRV_NUMBER),A - ; Достаём положение в OLD_TABLES.DEVICE - POP HL - ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM - POP BC - PUSH BC - ; Грохаем ФМ и запись в OLD_TABLES.DEVICE - CALL KILL_FM - ; - JP ReScanDRV.nextN2 - ; -.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) - LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),#FF - JP ReScanDRV.nextN - ; -; CD_ROM: -; JP ReScanDRV.nextN -;-----[] -; ВХОД: HL - текущая запись в таблице DEVICE -; B - шаг общего цикла -KILL_FM:; - LD A,DSS_MAX_DRIVES_AMOUNT - SUB B - LD C,A - ; втыкаем страницу ядра с таблицей файловых манипуляторов - PUSH BC - LD A,(PORTAL.out_DRV.RETBANK) - LD B,A - LD C,SLOT3 - IN A,(SLOT3) - OUT (C),B - POP BC - PUSH AF - ; Шерстим манипуляторы на наличие в них грохнутого драйва - LD IY,CORE_BUFFERS.FM_BUF + #C000 ; - CORE_BUFFERS.FM_BUF.Size - LD B,FMCOUNT - 1 ; пропускаем служебный нулевой манипулятор - LD DE,CORE_BUFFERS.FM_BUF.Size -.loop_fm: - ADD IY,DE - LD A,(IY+_sFM.DRIVE) - CP C - JR NZ,.skip - XOR A - LD (IY+_sFM.FS_REC.NAME),A ; грохаем манипулятор -.skip: DJNZ .loop_fm - ; - POP AF - OUT (SLOT3),A - ; - ; грохаем в OLD_TABLES.DEVICE убитый драйв - LD (HL),#FF - ; - RET - ENDMODULE -;-----------------------[] - -/* -[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78+1 + 416 + 32 == 526 - -; логический номер устройства + адрес обработчика. -; Порядковый номер * 3 = буква диска + "A" -DEVICE EQU $ -.TBL_Entry EQU 3 -.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; для стоп-байта #FF -.Size EQU .End - $ - -;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -;+01 LONG SECTOR OFFSET -;+05 LONG SIZE IN SECTORS -;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO -;+13 WORD FREE -;+15 BYTE FREE -; Логический номер раздела. -;Номер группы = логический номер раздела HDD из DEVICE -LOGDRV EQU DEVICE + DEVICE.Size -.TBL_Entry EQU 16 -.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID -RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size -.TBL_Entry EQU 2 -.Size EQU .TBL_Entry * MAX_RAMDRIVES -*/ \ No newline at end of file diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm deleted file mode 100644 index e196213..0000000 --- a/DSS/drivers/media/fdd-drv.asm +++ /dev/null @@ -1,417 +0,0 @@ - -; Disk Driver Specification ver. 2.00 -;[]===========================================================[0] -;Procedure : Initialization -; -;Function : Initialization device(s) -; -;Input : C = 00h -; IX - Environment -;Output : A = Amount drive support -; HL = Size driver -;[]===========================================================[] -;[]===========================================================[1] -;Procedure : Open -; -;Function : Open disk -; -;Input : C = 01h -; A - Drive -;Output : None -; -;[]===========================================================[] -;[]===========================================================[2] -;Procedure : Close -; -;Function : Close disk -; -;Input : C = 02h -; A - Drive -;Output : None -; -;[]===========================================================[] -;[]===========================================================[3] -;Procedure : Media check -; -;Function : Checking change line -; -;Input : C = 03h -; A - Drive -;Output : A = 00h disk no changed -; A = 0FFh disk changed -; -;[]===========================================================[] -;[]===========================================================[4] -;Procedure : Get BPB -; -;Function : Get Block Parameters BIOS -; -;Input : C = 04h -; DE - Address -;Output : None -; -;[]===========================================================[] -;[]===========================================================[5] -;Procedure : Input -; -;Function : Input from disk -; -;Input : C = 05h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[] -;[]===========================================================[6] -;Procedure : Output -; -;Function : Output to disk -; -;Input : C = 06h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[] -;[]===========================================================[7] -;Procedure : Removable -; -;Function : Checking change line -; -;Input : C = 07h -; A - Drive -;Output : A = 00h Removable -; A = FFh Nonremovable -; -;[]===========================================================[] -;[]===========================================================[8] -;Procedure : Generic IOCTL -; -;Function : Generic Input Output Control -; -;Input : C = 08h -; B - Subcommand -; DE = 55AAh Magic Number -; Subcommand -;---------------------- -; 00h - Get Device Parameters -; 01h - Read track -; 02h - Test track -; 80h - Set Device Parameters -; 81h - Write track -; 82h - Format track -;Output : -; -;[]===========================================================[] -; -; Errors: -; 0 (00h) - NO ERRORS -; 1 (01h) - BAD COMMAND -; 2 (02h) - BAD DRIVE NUMBER -; 3 (03h) - UNKNOW FORMAT -; 4 (04h) - NOT READY -; 5 (05h) - SEEK ERROR -; 6 (06h) - SECTOR NOT FOUND -; 7 (07h) - CRC ERROR -; 8 (08h) - WRITE PROTECT -; 9 (09h) - READ ERROR -; 10 (0Ah) - WRITE ERROR -; 11 (0Bh) - FAILURE -; 12 (0Ch) - BUSY (DEVICE OPENED) -; 13 (0Dh) - RESERVED - -; R_COM EQU #0F ;Command/Status -; R_TRK EQU #3F ;Track -; R_SEC EQU #5F ;Sector -; R_DAT EQU #7F ;Data -; R_DSK EQU #FF ;Drive Control -; COM_B EQU #1B - - - -//////////////////////////////////////////////////////////////////////// - MODULE FDD_DRV -//////////////////////////////////////////////////////////////////////// - - - -;------------------------------------------------- -; Обработчик FDD (rst 18h) -;------------------------------------------------- -API_TABLE: INC C - DEC C - JP Z,Init ;#00 Init - DEC C - JP Z,Open ;#01 Open - DEC C - JP Z,Close ;#02 Close - DEC C - JP Z,MediaCheck ;#03 MediaCheck - DEC C - JP Z,GetBPB ;#04 GetBPB - DEC C - JP Z,Read ;#05 Read - DEC C - JP Z,Write ;#06 Write - DEC C - JP Z,Removable ;#07 Removable - DEC C - JP Z,GenIOCTL ;#08 GenIOCTL - DEC C - JP Z,Reserved ;#09 - ; -Reserved: LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - - -;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Commands for restart #18 ; -;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; -Init: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? - AND A - RET -; ; ; - -; -Open: LD C,BIOS.DRV_RESET - RST ToBIOS - RET -; ; ; - -; -Close: XOR A - RET -; ; ; - - -;!FIXIT проверять ВГ93 когда это станет возможным -MediaCheck: IF NON_REMOVABLE_FDD - XOR A - ELSE - LD A,#FF - OR A - ENDIF - RET -; ; ; - - -;DE - ADDRESS -GetBPB: LD IX,0 - LD HL,0 - PUSH DE - PUSH AF - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP DE - POP HL - RET C - LD BC,BOOT_SECTOR.SectorsPerTrack - ADD HL,BC - LD E,(HL) - PUSH DE - LD A,D - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - LD A,H - POP HL - PUSH HL - LD H,A - POP AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS - XOR A - RET -; ; ; - - -; !TODO read track? -;READTR: XOR A -; RET -; ; ; - -; -Read: LD C,BIOS.DRV_READ - RST ToBIOS - RET -; ; ; - -; -Write: LD C,BIOS.DRV_WRITE - RST ToBIOS - RET -; ; ; - - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -GenIOCTL: BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.GetParams - ;!TODO - ;DEC B - ;JP Z,.ReadTrack - ;DEC B - ;JP Z,.TestTRK - ; - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - ; -.O_CTL_F: RES 7,B - INC B - DEC B - JP Z,.SetParams - ;!TODO - ;DEC B - ;JP Z,.WriteTRK - ;DEC B - ;JP Z,.FormatTRK - ; - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET -; ; ; - - -; Вход: - A - Drive number -; Выход: -; HL:DE - SECTORS ON LOGICAL DISK -; C - PARTITION RECORD NUMBER IN DRIVE MBR. 0 for fdd ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - EXTENDED INFORMATION -; D1..D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.GetParams: EX DE,HL - LD BC,#55AA - AND #0F - SBC HL,BC - JR Z,.next - ; - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - ; -.next: PUSH AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - JR C,.NONE_FDD - PUSH HL - PUSH DE - LD A,H - LD H,0 - ; -.mull_loop1: ADD HL,HL - DEC A - JR NZ,.mull_loop1 - ; - ; HL - SECTOR PER CYLLINDER - ; A=0 ZF=0 CF=0 - LD B,H - LD C,L - ;LD HL,0 - ;XOR A - LD H,A - LD L,A - EX AF,AF' - ; -.mull_loop2: EX AF,AF' - ADD HL,BC - ADC A,0 - DEC DE - EX AF,AF' - LD A,D - OR E - JR NZ,.mull_loop2 - ; - ; A=0 DE=0 ZF=0 CF=0 - EX AF,AF' - LD E,A - EX DE,HL - ; H=0 - LD C,H ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - EXX - POP DE - POP HL - POP AF - EX AF,AF' - ; A=0 ZF=0 CF=0 - LD B,0 - LD C,L - LD L,H - LD H,B - EX DE,HL - EXX - AND A - RET - ; -.NONE_FDD: POP BC - LD A,DSS_Error.drv.INVALID_DRIVE - ; CF=1 - RET -; ; ; - - -; HL:DE - SECTORS ON LOGICAL DISK -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.SetParams: PUSH AF - EXX - EX DE,HL - LD H,L - LD L,C - POP AF - AND #0F - PUSH AF - PUSH HL - PUSH DE - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP DE - POP HL - JR C,.NONE_FDD - POP AF - LD C,BIOS.DRV_SET_PAR - JP ToBIOS - ;RST ToBIOS - ;RET C - ;AND A - ;RET -; ; ; - - -Removable: ; LD A,1 - ; AND A - XOR A - INC A - RET -; ; ; - -;============================================== - - ENDMODULE ; FDD_DRV - -//////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm deleted file mode 100644 index 306d487..0000000 --- a/DSS/drivers/media/ide-drv.asm +++ /dev/null @@ -1,715 +0,0 @@ -;!TODO привести к общему виду в одну инструкцию, проверить корректность -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;R02 06-08-2001 DNS Secondary IDE -;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk -;--------------------------------------------------------------- -; -; Disk Driver Specification ver. 2.20 -;[]===========================================================[0] -;Procedure: Initialization -; -;Function: Initialization device(s) -; -;Input: C = #00 -; IX = Environment -; -;Output: A = Amount drive support -;[]===========================================================[0] - -;[]===========================================================[1] -;Procedure: Open -; -;Function: Open disk -; -;Input: C = #01 -; A = Drive -; -;Output: None -;[]===========================================================[1] - -;[]===========================================================[2] -;Procedure: Close -; -;Function: Close disk -; -;Input: C = #02 -; A = Drive -; -;Output: None -;[]===========================================================[2] - -;[]===========================================================[3] -;Procedure: Media check -; -;Function: Checking change line -; -;Input: C = #03 -; A = Drive -; -;Output: A = #00 disk no changed -; #FF disk changed -;[]===========================================================[3] - -;[]===========================================================[4] -;Procedure: Get BPB -; -;Function: Get Block Parameters BIOS -; -;Input: C = #04 -; A = Drive -; DE = Address -; -;Output: None -;[]===========================================================[4] - -;[]===========================================================[5] -;Procedure: Read -; -;Function: Read from disk -; -;Input: C = #05 -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A = Drive -; -;Output: None -;[]===========================================================[5] - -;[]===========================================================[6] -;Procedure: Write -; -;Function: Write to disk -; -;Input: C = #06 -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; -;Output: None -;[]===========================================================[6] - -;[]===========================================================[7] -;Procedure: Removable -; -;Function: Checking change line -; -;Input: C = #07 -; A = Drive -; -;Output: A = #00 Removable -; A = #FF Non-removable -;[]===========================================================[7] - -;[]===========================================================[8] -;Procedure: Generic IOCTL -; -;Function: Generic Input Output Control -; -;Input: C = #08 -; B = Subcommand -; DE = #55AA Magic Number -; A = Drive -; -;Subcommands: #00 - Get Device Parameters -; #01 - Read track -; #02 - Test track -; #80 - Set Device Parameters -; #81 - Write track -; #82 - Format track -;Output: -;[]===========================================================[8] - -;[]===========================================================[9] -;Procedure: Read Long -; -;Function: Reading sectors from disk -; -;Input: C = #0A -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A' = Page -; -;Output: A' = Next Page -; HL:IX = Next Logical Block (sector) -; DE = Next Address -;[]===========================================================[9] - -;[]===========================================================[10] -;Procedure: Write Long -; -;Function: Writing sectors to disk -; -;Input: C = #0B -; HL:IX = Logical Block (sector) -; DE = Address -; B = Sector count -; A' = Page -; -;Output: A' = Next Page -; HL:IX = Next Logical Block (sector) -; DE = Next Address -;[]===========================================================[10] - -; -; Errors: -; 0 (#00) - NO ERRORS -; 1 (#01) - BAD COMMAND -; 2 (#02) - BAD DRIVE NUMBER -; 3 (#03) - UNKNOW FORMAT -; 4 (#04) - NOT READY -; 5 (#05) - SEEK ERROR -; 6 (#06) - SECTOR NOT FOUND -; 7 (#07) - CRC ERROR -; 8 (#08) - WRITE PROTECT -; 9 (#09) - READ ERROR -; 10 (#0A) - WRITE ERROR -; 11 (#0B) - FAILURE -; 12 (#0C) - BUSY (DEVICE OPENED) -; 13 (#0D) - RESERVED - -; IDE0 EQU #0C1C0 -; IDE1 EQU #0C1C8 -PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR - -HDDRIVE: INC C - DEC C - JP Z,INIT_H ; c=0 Initialization - DEC C - JP Z,RESE_H ; c=1 open - DEC C - JP Z,STAT_H ; c=2 close - DEC C - JP Z,CHEK_H ; c=3 media check (смена носителя) - DEC C - JP Z,GBPB_H ; c=4 get BPB - DEC C - JP Z,READH ; c=5 read (чтение секторов) - DEC C - JP Z,WRITEH ; c=6 write (запись секторов) - DEC C - JP Z,REMOV_H ; c=7 Removable - DEC C - JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL - DEC C - JP Z,.Reserved ; c=9 Reserved - DEC C - JP Z,LREADH ; c=10 Read Long - DEC C - JP Z,LWRITEH ; c=11 Write Long - ; -.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - - -//////////////////////////////////////////////////////////////////////// -// Commands for restart #18 // -//////////////////////////////////////////////////////////////////////// - -;--------------------------------------------------------------------[v] -; c=0 Initialization -INIT_H: PUSH IY - ;!TEST ;[ ] для rescanDRV - XOR A - LD (DRVCLC.count),A - ; - LD HL,LOGDRV - LD (OFFSECT),HL - - LD IX,SYS_PAGE.TMP_BUFFER - LD C,BIOS.DRV_LIST - RST ToBIOS - ; DRV_LIST: - ; +0 LEN - ; +1 FDD COUNT - ; +2 HDD COUNT - ; +3 CDROM COUNT - ; +4 RESERVED (28) - ; - IN A,(SLOT3) - LD C,A - LD A,SYS_PAGE - OUT (SLOT3),A - XOR A - LD B,(IX+2) ;количество HDD для процедуры NX_DVCI - CP B - LD A,C - OUT (SLOT3),A - JR Z,NO_HARDS - LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT - -NX_DVCI: PUSH BC - LD A,C - LD (DRV_NUM),A - LD C,BIOS.DRV_DETECT - RST ToBIOS - ;JR C,.NO_DRIVE - CALL NC,DEFINE_PARTITIONS.BEGIN - POP BC - INC C - JR C,NX_DVCI - DJNZ NX_DVCI - ; -NO_HARDS: - POP IY - ;!TEST - ; LD HL,(OFFSECT) - ; LD DE,LOGDRV - ; XOR A - ; SBC HL,DE - ; RET Z - ; LD DE,LOGDRV.TBL_Entry -DRVCLC: ; INC A - ; SBC HL,DE - ; JR NZ,DRVCLC - ; -.count+1: LD A,0 - ; - AND A - RET -;---------------------------------------------------------------------[^] - -; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -; ;+01 DWORD SECTOR OFFSET -; ;+05 DWORD SIZE IN SECTORS -; ;+09 FREE -; ;+15 -; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 -; .TBL_Entry EQU 16 -; .Size EQU $-LOGDRV -SELHDD: PUSH DE - PUSH HL - ; - LD L,A - LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - ADD IX,DE - LD E,(IY+3) - LD D,(IY+4) - POP HL - ADC HL,DE - LD A,(IY+0) ;DRIVE NUMBER - POP DE - RET - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -IOCTL_H BIT 7,B - JR NZ,O_CTL_H - INC B - DEC B - JP Z,HGETPRM - DEC B - JP Z,HRDTRAC - DEC B - JP Z,HCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -O_CTL_H RES 7,B - INC B - DEC B - JP Z,HSETPRM - DEC B - JP Z,HWRTRAC - DEC B - JP Z,HFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -HCHTRAC LD B,L - CALL CHECKH - RET - -HSETPRM AND A - RET - -HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET - -; HL:DE - SECTORS ON LOGICAL DISK -; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - DRIVE/HEAD REGISTER PHISICAL DISK: -; bit7 - reserved "1" -; bit6 - ADDRESSING MODE LBA/CHS -; bit5 - reserved "1" -; bit4 - DEVICE MASTER/SLAVE -; bit3 - reserved "0" (MAY BE OTHER) -; bit2 - reserved "0" (MAY BE OTHER) -; bit1 - reserved "0" (MAY BE OTHER) -; bit0 - Primary/Secondary Chanel -HGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - ; - PUSH IX - PUSH IY - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... - PUSH IY - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP IY - LD A,DSS_Error.drv.INVALID_DRIVE - JR C,.error - ; перетасовка регистров с результатом от BIOS - EX DE,HL - LD C,E - LD E,D - LD D,0 - LD A,B - LD B,D - EXX - ; SECTORS ON LOGICAL DISK - LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0) - LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) - LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) - LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) - ; - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска - ; - EX AF,AF' - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... - EX AF,AF' - ; - AND A -.error: POP IY - POP IX - RET - -REMOV_H: - LD A,1 - AND A - RET - - - -RESE_H: XOR A - RET - -STAT_H: XOR A - RET - -CHEK_H: ;LD A,#FF - XOR A - ;AND A - RET - - -; DE - ADDRESS -; A - DRIVE -GBPB_H: PUSH IY - PUSH DE - LD L,A - ; - LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - LD L,(IY+3) - LD H,(IY+4) - LD XL,E - LD XH,D - LD A,(IY+0) - POP DE - POP IY - LD BC,1*256 + BIOS.DRV_READ - JP ToBIOS - - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A'- PAGE -; A - HDD LOG NUMBER -;READ SECTOR -LREADH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_READ_LONG - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A'- PAGE -; A - HDD LOG NUMBER -;WRITE SECTOR -LWRITEH: - PUSH IY - CALL SELHDD - LD C,BIOS.DRV_WRITE_LONG - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;WRITE SECTOR -WRITEH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_WRITE - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;READ SECTOR -READH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_READ - RST ToBIOS - POP IY - RET - -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;CHECK SECTOR -CHECKH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_VERIFY - RST ToBIOS - POP IY - RET - -;------------------------------[ PARTIT ]------------------------------; -DEFINE_PARTITIONS: -.FAT32_DOS: ; -.EASYDOS: ; -.MEDIDOS: ; -.HIGHDOS: ; - LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) - LD IX,(CURRENT_SECTOR_L) - ADD IX,DE - LD DE,(CURRENT_SECTOR_H) - ADC HL,DE - LD D,XH - LD E,XL - ;BPB SECTOR - LD IX,(OFFSECT) - LD (IX + LOGDRV.SECTOR_OFFSET + 0),E - LD (IX + LOGDRV.SECTOR_OFFSET + 1),D - LD (IX + LOGDRV.SECTOR_OFFSET + 2),L - LD (IX + LOGDRV.SECTOR_OFFSET + 3),H - LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) - ;SIZE DISK - LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E - LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D - LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L - LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -.ExtendedPartitionFlag+1: - LD A,0 - OR A ; !TODO загрузка с расширенного раздела не поддерживается - LD A,#FF - JR NZ,.not_supported ; если расширенный раздел, то облом - ; - POP BC - PUSH BC - LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table - SUB B -.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A - ; - ;!TEST Подстраховка от переполнения таблицы LOGDRV - LD A,(DRVCLC.count) - INC A - CP DSS_MAX_DRIVES_AMOUNT+1 - RET NC - LD (DRVCLC.count),A - ; - LD A,(DRV_NUM) - LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A - LD DE,LOGDRV.TBL_Entry ;DSKITEM - ADD IX,DE - LD (OFFSECT),IX - JP .NextPartition - ; -.NotExtended: CP PartitionSysTypes.FAT16 - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_LBA - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_32Mb - JR Z,.MEDIDOS - CP PartitionSysTypes.FAT12 - JR Z,.EASYDOS - ;[ ] fat32 - CP PartitionSysTypes.FAT32 - JP Z,.FAT32_DOS - CP PartitionSysTypes.FAT32_LBA - JP Z,.FAT32_DOS - ; - CP PartitionSysTypes.Win_Ext_LBA - JR Z,.SubLevel - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - ;OR A ;PartitionSysTypes.Empty - ;JR NZ,NXTPART - JR .NextPartition ; раздел не поддерживается - ;POP BC ; баланс стека - ;RET - ;POP BC - ;OR A - ;RET Z - ;NODEFIN: - ;SCF - ;RET - ; -.BEGIN: IN A,(SLOT3) - PUSH AF - LD A,SHARED_PAGE - OUT (SLOT3),A - CALL .Start - POP AF - OUT (SLOT3),A - RET -.Start: LD IX,0 - LD DE,0 - LD (EXTDOSL),DE ;R01 - LD (EXTDOSH),IX ;R01 - ; -.LOOP: LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - ; - LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) - LD DE,#AA55 - AND A - SBC HL,DE - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - ;JR NZ,NODEFIN - SCF - RET NZ - ; - LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR - LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table -.DOSAGA: PUSH BC - LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) - CP PartitionSysTypes.Extended - JR Z,.SubLevel - CP PartitionSysTypes.Win_Ext_LBA - JR NZ,.NotExtended - ; -.SubLevel: PUSH IY - LD DE,(CURRENT_SECTOR_L) - LD IX,(CURRENT_SECTOR_H) - PUSH DE - PUSH IX - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - INC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - CALL .ParseExtended - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - DEC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - POP IX - POP DE - LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - POP IY -.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry - ADD IY,DE - POP BC - DJNZ .DOSAGA - AND A - RET - ; -.ParseExtended: LD HL,(EXTDOSL) - LD DE,(EXTDOSH) - LD A,L - OR H - OR E - OR D - LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) - LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) - LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) - LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) - JP NZ,.ext_in_ext - LD (EXTDOSL),DE - LD (EXTDOSH),HL - PUSH DE - JR .set_regs - ; -.ext_in_ext: LD IX,(EXTDOSL) - ADD IX,DE - LD DE,(EXTDOSH) - ADC HL,DE - PUSH IX -.set_regs: PUSH HL - POP IX - POP DE - JP .LOOP - ; -.LOAD_SECTOR: PUSH IY - LD IX,(CURRENT_SECTOR_L) - LD HL,(CURRENT_SECTOR_H) - LD DE,PARTITION_BUFFER - LD A,(DRV_NUM) - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP IY - RET -;----------------------------------------------------------------------; -; - -;======================================================================= -; PHISICAL DRIVE NUMBER -; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв -DRV_NUM: DB #00 -CURRENT_SECTOR_L: DW #0000 -CURRENT_SECTOR_H: DW #0000 -EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE -EXTDOSH: DW #0000 -OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD -;======================================================================= \ No newline at end of file diff --git a/DSS/drivers/media/ram_disk-drv.asm b/DSS/drivers/media/ram_disk-drv.asm deleted file mode 100644 index b9b5480..0000000 --- a/DSS/drivers/media/ram_disk-drv.asm +++ /dev/null @@ -1,533 +0,0 @@ - - -; SYSPAGE EQU #FE -; SLOT1 EQU #A2 -; SLOT2 EQU #C2 -; SLOT3 EQU #E2 - -; ORG #3CDB -; Disk Driver Specification ver. 2.20 -;[]===========================================================[ 0] -;Procedure : Initialization -; -;Function : Initialization device(s) -; -;Input : C = 00h -; IX - Environment -;Output : A = Amount drive support -; HL = Size driver -;[]===========================================================[ 0] - - -;[]===========================================================[ 1] -;Procedure : Open -; -;Function : Open disk -; -;Input : C = 01h -; A - Drive -;Output : None -; -;[]===========================================================[ 1] - - -;[]===========================================================[ 2] -;Procedure : Close -; -;Function : Close disk -; -;Input : C = 02h -; A - Drive -;Output : None -; -;[]===========================================================[ 2] - - -;[]===========================================================[ 3] -;!TODO -;Procedure : Media check -; -;Function : Checking change line -; -;Input : C = 03h -; A - Drive -;Output : A = 00h disk no changed -; A = 0FFh disk changed -; -;[]===========================================================[ 3] - - -;[]===========================================================[ 4] -;Procedure : Get BPB -; -;Function : Get Block Parameters BIOS -; -;Input : C = 04h -; DE - Address -;Output : None -; -;[]===========================================================[ 4] - - -;[]===========================================================[ 5] -;Procedure : Input -; -;Function : Input from disk -; -;Input : C = 05h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[ 5] - - -;[]===========================================================[ 6] -;Procedure : Output -; -;Function : Output to disk -; -;Input : C = 06h -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -;Output : None -; -;[]===========================================================[ 6] - - -;[]===========================================================[ 7] -;!TODO -;Procedure : Removable -; -;Function : Checking change line -; -;Input : C = 07h -; A - Drive -;Output : A = 00h Removable -; A = FFh Nonremovable -; -;[]===========================================================[ 7] - - -;[]===========================================================[ 8] -;Procedure : Generic IOCTL -; -;Function : Generic Input Output Control -; -;Input : C = 08h -; B - Subcommand -; DE = 55AAh Magic Number -; Subcommand -;---------------------- -; 00h - Get Device Parameters -; 01h - Read track -; 02h - Test track -; 80h - Set Device Parameters -; 81h - Write track -; 82h - Format track -;Output : -; -;[]===========================================================[ 8] - - -;[]===========================================================[ 9] -; RESERVED -;[]===========================================================[ 9] - - -;[]===========================================================[ 10] -;!TODO -;Procedure : Read Long -; -;Function : Reading sectors from disk -; -;Input : C = 0Ah -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address -; -;[]===========================================================[ 10] - - -;[]===========================================================[ 11] -;!TODO -;Procedure : Write Long -; -;Function : Writing sectors to disk -; -;Input : C = 0Bh -; HL:IX - Logical Block (sector) -; DE - Address -; B - Sector count -; A'- Page -;Output : A'- Next Page -; HL:IX - Next Logical Block (sector) -; DE - Next Address -; -;[]===========================================================[ 11] -; -; Errors: -; 0 (00h) - NO ERRORS -; 1 (01h) - BAD COMMAND -; 2 (02h) - BAD DRIVE NUMBER -; 3 (03h) - UNKNOW FORMAT -; 4 (04h) - NOT READY -; 5 (05h) - SEEK ERROR -; 6 (06h) - SECTOR NOT FOUND -; 7 (07h) - CRC ERROR -; 8 (08h) - WRITE PROTECT -; 9 (09h) - READ ERROR -; 10 (0Ah) - WRITE ERROR -; 11 (0Bh) - FAILURE -; 12 (0Ch) - BUSY (DEVICE OPENED) -; 13 (0Dh) - RESERVED - - -; MACRO CALL GET_RAMDRV_NUM -; LD BC,RAMDTBL -; SLA A -; ADD A,C -; LD C,A -; LD A,0 -; ADC A,B -; LD B,A -; INC BC -; LD A,(BC) -; OR #60 ;!HARDCODE сделать номера разных устройств через метки -; ENDM - - -; parser -RMDRIVE: INC C - DEC C - JP Z,INIT_RD ; 0 - DEC C - JR Z,RESET_RD ; 1 - DEC C - JR Z,STATUS_RD ; 2 - DEC C - JR Z,CHEK_RD ; 3 - DEC C - JR Z,GBPB_RD ; 4 - DEC C - JR Z,READ_RD ; 5 - DEC C - JR Z,WRITE_RD ; 6 - DEC C - JR Z,REMOV_RD ; 7 - DEC C - JP Z,IOCTL_RD ; 8 - DEC C - JP Z,.error ; 9 RESR_H - DEC C - JP Z,LREAD_RD ; 10 - DEC C - JP Z,LWRITE_RD ; 11 -.error: - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -REMOV_RD: -RESET_RD: -STATUS_RD: XOR A - RET - -;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение - ;!FIXIT как-то определять смену RMD? - ; [x] 18/08/2024 пока немного костыльно и опасно -CHEK_RD: ;LD A,#FF - ;AND A - XOR A - ; - RET - -;DE - ADDRESS -GBPB_RD: LD IX,0 - LD HL,0 - LD B,#01 - ;JP READ_RD -;READ SECTORS -; HL:IX - SECTOR -; DE - ADDRESS -; B - COUNT -; A - DRIVE -READ_RD: PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_READ - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET -LREAD_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_READ_LONG - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET - -;WRITE SECTORS -; HL:IX - SECTOR -; DE - ADDRESS -; B - COUNT -; A - DRIVE -WRITE_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_WRITE - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET - -LWRITE_RD: - PUSH BC - CALL GET_RAMDRV_NUM - POP BC - LD C,BIOS.DRV_WRITE_LONG - JP ToBIOS - ; RST ToBIOS - ; XOR A - ; RET - -; -;; -;;; -;----------------------------------------------------------------------;!TEST -; ;S_P_P DB #00 -; INIT_RD: -; ; .SectorSize EQU 512 ;!HARDCODE -; ; LD HL,.SectorSize -; ; LD A,#80 -; ; .loop: SRL A -; ; RR H -; ; JR NC,.loop -; ; LD (S_P_P),A - -; LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk -; LD DE,RAMDTBL -; .initLoop: -; PUSH BC -; LD A,B -; PUSH DE -; RST ToBIOS -; POP DE -; OR A -; JR Z,.noDRV - -; LD (DE),A -; INC DE -; POP BC -; LD A,B -; LD (DE),A -; INC DE -; JP 1F -; .noDRV: POP BC -; 1: INC B -; LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry -; CP B -; JR NZ,.initLoop - -; LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL -; EX DE,HL -; AND A ;!FIXIT ---- -; SBC HL,DE ;!FIXIT ADD HL,DE -; SRL L -; LD A,L -; ; LD HL,ENDDRVR -; AND A -; RET -;----------------------------------------------------------------------;!TEST -;;; -;; -; - -; -;; -;;; -;----------------------------------------------------------------------;!TEST -;S_P_P DB #00 -INIT_RD: -; .SectorSize EQU 512 ;!HARDCODE -; LD HL,.SectorSize -; LD A,#80 -; .loop: SRL A -; RR H -; JR NC,.loop -; LD (S_P_P),A - - LD BC,0*256+BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk - LD DE,RAMDTBL -.initLoop: PUSH BC - LD A,B - PUSH DE - RST ToBIOS - POP DE - OR A - JR Z,.noDRV - ; - INC DE - LD (DE),A - DEC DE - ; - POP BC - LD A,B - LD (DE),A - INC DE - INC DE - JP .skip_pop - ; -.noDRV: POP BC -.skip_pop: INC B - LD A,RAMDTBL.Size/RAMDTBL.TBL_Entry - CP B - JR NZ,.initLoop - - LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL - EX DE,HL - AND A ;!FIXIT ---- - SBC HL,DE ;!FIXIT ADD HL,DE - SRL L - LD A,L - ; LD HL,ENDDRVR - AND A - RET -;----------------------------------------------------------------------;!TEST -;;; -;; -; - -; ; -; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -; RAMDTBL.TBL_Entry EQU 2 -; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry -; DB #FF -; EDUP -; .Size EQU $-RAMDTBL -; ; - - -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -IOCTL_RD: - BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.RGETPRM - ;DEC B - ;JP Z,FRDTRAC - ;DEC B - ;JP Z,FCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -.O_CTL_F: ;RES 7,B - ;INC B - ;DEC B - ;JP Z,.RSETPRM - ;DEC B - ;JP Z,FWRTRAC - ;DEC B - ;JP Z,FFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL:DE - SECTORS ON LOGICAL DISK -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.RGETPRM: EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - ; - EX AF,AF' - LD A,L - CALL GET_RAMDRV_NUM - PUSH AF - PUSH AF - EX AF,AF' - - POP AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - - PUSH HL ;число головок, число секторов (на целиндр) - PUSH DE ;количество цилиндров - EXX - POP HL ;количество цилиндров - POP BC ;число секторов (на целиндр) - LD D,0 - LD E,B ;число головок - LD B,D - EXX - - LD A,L - - RRA - JR C,.end -.loopShift: SLA E - RL D - RRA - JR NC,.loopShift - ; -.end: EX AF,AF' - POP AF - EX AF,AF' - XOR A - LD L,A - LD H,L - LD C,A ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD A,%10100000 - RET - -; !TODO -; !FIXIT -; .RSETPRM: AND A -; RET - -GET_RAMDRV_NUM: LD BC,RAMDTBL -.skip_tbl: ADD A,A - ADD A,C - LD C,A - LD A,0 - ADC A,B - LD B,A - ;INC BC - LD A,(BC) - OR #60 ;!HARDCODE сделать номера разных устройств через метки - RET -; -;ENDDRVR EQU $ -; \ No newline at end of file diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm deleted file mode 100644 index 97f01cc..0000000 --- a/DSS/drivers/media/shared-drv.asm +++ /dev/null @@ -1,290 +0,0 @@ -;[BEGIN] -;//MODULE: Shared AUTHOR: Denis Parinov -;//CREATE: A LONG TIME AGO :) -;--------------------------------------------------------------- -;Rev Date Name Description -;R01 17-04-2023 BAO Добавлена процедура INITDVC_RET_DRIVE и изменена INTDISK для поддержки рескана драйвов -;--------------------------------------------------------------- - - - -; DISK DRIVER SPECIFICATION -; !FIXIT некорректная! -;--------------------------------------------- -; COMMAND 00h (INITIALIZATION) -; -; INPUT: A - DRIVE LETTER -; IX - ENVIRONMENT -; RETURN: A - AMOUNT DRIVE SUPPORT -; HL - LENGTH DRIVER -;--------------------------------------------- -; COMMAND 01h (OPEN) -; -; INPUT: A - DRIVE -; -;--------------------------------------------- -; COMMAND 02h (CLOSE) -; -; INPUT: A - DRIVE -; RETURN: A - -;--------------------------------------------- -; COMMAND 03h (MEDIA CHECK) -; -; INPUT: A - DRIVE -; RETURN: A - 00h - OLD DISK, 0FFh - NEW DISK -;--------------------------------------------- -; COMMAND 04h (GET BPB) -; -; INPUT: HL - ADDRESS -; A - DRIVE -;--------------------------------------------- -; COMMAND 05h (INPUT) -; -; INPUT: IX:DE - ABSOLUTE SECTOR -; HL - MEMORY ADDRESS -; B - SECTORS COUNT -; A - DRIVE -;--------------------------------------------- -; COMMAND 06h (OUTPUT) -; -; INPUT: IX:DE - ABSOLUTE SECTOR -; HL - MEMORY ADDRESS -; B - SECTORS COUNT -; A - DRIVE -;--------------------------------------------- -; COMMAND 07h (REMOVABLE) -; -; INPUT: A - DRIVE -; RETURN: A = 0 - REMOVABLE -; A = 1 - NONREMOVABLE -;--------------------------------------------- -; COMMAND 08h (GENERIC IOCTL) -; -; INPUT: A - DRIVE -; B - SUBCOMMAND -; DE - MAGIC NUMBER (55AAh) -; SUBCOMMAND -;---------------------- -; 00 - GET DEVICE PARAMETERS -; 01 - READ TRACK -; 02 - TEST TRACK -; 80 - SET DEVICE PARAMETERS -; 81 - WRITE TRACK -; 82 - FORMAT TRACK -;--------------------------------------------- -; -; ERRORS: -; 0 - NO ERRORS -; 1 - BAD COMMAND -; 2 - BAD DRIVE NUMBER -; 3 - UNKNOW FORMAT -; 4 - NOT READY -; 5 - SEEK ERROR -; 6 - SECTOR NOT FOUND -; 7 - CRC ERROR -; 8 - WRITE PROTECT -; 9 - READ ERROR -; 10 - WRITE ERROR -; 11 - FAILURE -; 12 - BUSY (DEVICE OPENED) -; 13 - RESERVED - -;INTDISK PUSH HL -; PUSH BC -; LD HL,DEVICE -; INC A -;INTD001 DEC A -; JP Z,YEP -; LD C,(HL) -; INC C -; INC HL -; INC HL -; INC HL -; JP NZ,INTD001 -; POP BC -; POP HL -; LD A,2 -; SCF -; RET - -;YEP LD A,(HL) -; INC HL -; LD C,(HL) -; INC HL -; LD H,(HL) -; LD L,C -; POP BC -; EX (SP),HL -; RET - - -;----------------------------------------------------------- -; Просканировать систему на FDD/HDD девайсы и RAM-диски -;----------------------------------------------------------- -INITDVC: XOR A - LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку - LD HL,DEVICE - LD (PDEVICE),HL ; восст. ячейку - ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] - LD HL,DEVICE - LD (HL),#FF - LD DE,DEVICE+1 - LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 - LDIR - ; FDD девайсы - CALL FDD_DRV.Init ; узнать число FDD-девайсов - LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы -.if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET - LD DE,HDDRIVE - CALL MAKEDVC - ; RAM-диски - CALL INIT_RD - LD DE,RMDRIVE - CALL MAKEDVC - XOR A - RET - -; Инициировать таблицу переходов девайса. -; вход: de=адрес обработчика девайса -; a=число девайсов (0=нет) -MAKEDVC: LD C,A - LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска - ADD A,(HL) - LD (HL),A - ;!TEST ;[ ] оптимизировать было лень - CP DSS_MAX_DRIVES_AMOUNT+1 - JR C,1F - LD (HL),DSS_MAX_DRIVES_AMOUNT - SUB DSS_MAX_DRIVES_AMOUNT - NEG - ADD C - JP 2F - ; -1: LD A,C - OR A - RET Z ; нет девайсов -2: LD C,0 ; сбр. - LD HL,(PDEVICE) ; тек. полож. в таблице -.loop: LD (HL),C ; номер лог.драйва этого устройства - INC HL - LD (HL),E ; de=адрес обработчика - INC HL - LD (HL),D - INC HL - INC C ; ++номер драйва - DEC A - JR NZ,.loop - LD (PDEVICE),HL - DEC A - LD (HL),A - RET - - -;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые -;------------------------------------------------- -; RST 18h. Вектор дисковых устройств -; вход: a=номер устройства (0-25) -;------------------------------------------------- -INTDISK: - ;R01 - CP #FF - JR NZ,.noNeedRescan - CP C - ;JR Z,INITDVC_RET_DRIVE - JR Z,ReScanDRV -.noNeedRescan: - ; - PUSH HL - PUSH BC - _CALC_DEVICE_ENTRY DEVICE - LD A,(HL) - CP #FF - JR Z,NODEV - INC HL - LD C,(HL) - INC HL - LD H,(HL) - LD L,C - POP BC - EX (SP),HL - RET -NODEV: POP BC - POP HL - LD A,DSS_Error.drv.INVALID_DRIVE - SCF - RET - -PDEVICE DW DEVICE -; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF -; .Size: DB #FF -; .TBL_Entry EQU 3 - -FLOPPY EQU #0001 -FIXED EQU #0002 -CDROM EQU #0004 -NETWORK EQU #0008 - -;DISKS: DB 27 ;LENGTH DISK INFO -; DW FLOPPY ;DISK TYPE -; DB 2,"A:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT12 " -; DB #00 ;PHISICAL DRIVE NUMBER -; -; DB 27 ;LENGTH DISK INFO -; DW FLOPPY ;DISK TYPE -; DB 2,"B:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT12 " -; DB #01 ;PHISICAL DRIVE NUMBER -; -; DB 27 ;LENGTH DISK INFO -; DW FIXED ;DISK TYPE -; DB 2,"C:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT16 " -; DB #80 ;PHISICAL DRIVE NUMBER -; -; DB #00 ;END OF TABLE -;----------------------------------------------------------------------- - - ;R01 -; INITDVC_RET_DRIVE: -; CALL INITDVC -; LD A,(DRV_PAGE.LDRIVE) -; AND A -; RET - ; - - - -//////////////////////////////////////////////////////////////////////// -// NEW RESCAN // -//////////////////////////////////////////////////////////////////////// - INCLUDE 'ReScanDRV.ASM' -//////////////////////////////////////////////////////////////////////// - - -;DEVICE DB #00 -; DW FDDRIVE ; FDD A -; DB #01 -; DW FDDRIVE ; FDD B -; DB #00 -; DW HDDRIVE ; HDD C -; DB #01 -; DW HDDRIVE ; HDD D -; DB #02 -; DW HDDRIVE ; HDD E -; DB #03 -; DW HDDRIVE ; HDD F -; DB #04 -; DW HDDRIVE ; HDD G -; DB #05 -; DW HDDRIVE ; HDD H -; DB #06 -; DW HDDRIVE ; HDD I -; DB #07 -; DW HDDRIVE ; HDD J -; DB #FF \ No newline at end of file