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