Estex-DSS/DSS/Media_drivers/Shared.ASM
Anatoliy Belyanskiy 1b8bd30582 FIXED BUGS
2023-07-12 04:04:37 +10:00

250 lines
4.6 KiB
NASM

; DISK DRIVER SPECIFICATION
;---------------------------------------------
; 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
DSS_MAX_DRIVES_AMOUNT EQU 26
INTDISK:
CP #FF
JR NZ,.noNeedRescan
CP C
JR Z,INITDVC_RET_DRIVE
.noNeedRescan:
PUSH HL
PUSH BC
LD C,A
ADD A,A
ADD A,C
LD C,A
LD B,0
LD HL,DEVICE
ADD HL,BC
LD A,(HL)
INC A
JR Z,NODEV
DEC A
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*3,#FF
.End: DB #FF
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
INITDVC_RET_DRIVE:
CALL INITDVC
LD A,(LDRIVE)
AND A
RET
INITDVC XOR A
LD (LDRIVE),A
LD HL,DEVICE
LD (PDEVICE),HL
LD C,A
CALL FDDRIVE
LD DE,FDDRIVE
CALL MAKEDVC
// XOR A
LD C,0
CALL HDDRIVE
LD DE,HDDRIVE
CALL MAKEDVC
// XOR A
LD C,0
CALL RMDRIVE
LD DE,RMDRIVE
CALL MAKEDVC
XOR A
RET
MAKEDVC LD C,A
LD HL,LDRIVE
ADD A,(HL)
LD (HL),A
LD A,C
LD C,0
OR A
RET Z
LD HL,(PDEVICE)
.loop: LD (HL),C
INC HL
LD (HL),E
INC HL
LD (HL),D
INC HL
INC C
DEC A
JR NZ,.loop
LD (PDEVICE),HL
DEC A
LD (HL),A
RET
;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