; 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 ;------------------------------------------------- ; Обработчик FDD (rst 18h) ;------------------------------------------------- FDDRIVE: INC C DEC C JP Z,.INIT ;#00 DEC C JP Z,.RESE ;#01 DEC C JP Z,.STAT ;#02 DEC C JP Z,.CHEK ;#03 DEC C JP Z,.GBPB ;#04 DEC C JP Z,.READD ;#05 DEC C JP Z,.WRITED ;#06 DEC C JP Z,.REMOV_F ;#07 DEC C JP Z,.IOCTL_F ;#08 DEC C JP Z,.RESRV_F ;#09 .RESRV_F: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET ;Commands for restart #18 .INIT: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? AND A RET .RESE: LD C,BIOS.DRV_RESET RST ToBIOS RET .STAT: XOR A RET ;!FIXIT проверять ВГ93 когда это станет возможным .CHEK: LD A,#FF AND A RET ;DE - ADDRESS .GBPB: 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,#0018 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 ;READTR: XOR A RET .READD: LD C,BIOS.DRV_READ RST ToBIOS RET .WRITED: 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 .IOCTL_F: BIT 7,B JR NZ,.O_CTL_F INC B DEC B JP Z,.FGETPRM ; 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,.FSETPRM ; DEC B ; JP Z,FWRTRAC ; DEC B ; JP Z,FFRTRAC LD A,DSS_Error.drv.INVALID_COMMAND SCF RET ; HL:DE - SECTORS ON LOGICAL DISK ; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 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 ; D0...D3 - "0" RESERVED (MAY BE OTHER) ; D4 - DEVICE MASTER/SLAVE ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED .FGETPRM: EX DE,HL LD BC,#55AA AND A SBC HL,BC LD L,A LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET NZ LD A,L AND #0F PUSH AF LD C,BIOS.DRV_GET_PAR RST ToBIOS JR C,.NONEF PUSH HL PUSH DE LD A,H LD H,0 .MULL1 ADD HL,HL DEC A JR NZ,.MULL1 ; HL - SECTOR PER CYLLINDER LD B,H LD C,L LD HL,0 EX AF,AF' XOR A .MULL2 EX AF,AF' ADD HL,BC ADC A,0 DEC DE EX AF,AF' LD A,D OR E JR NZ,.MULL2 EX AF,AF' LD E,A EX DE,HL EXX POP DE POP HL POP AF EX AF,AF' LD A,B LD C,L LD B,0 LD L,H LD H,B EX DE,HL EXX LD C,0 ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого AND A RET .NONEF POP AF LD A,DSS_Error.drv.INVALID_DRIVE SCF 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 .FSETPRM: 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,.NONEF POP AF LD C,BIOS.DRV_SET_PAR RST ToBIOS RET C AND A RET .REMOV_F: LD A,1 AND A RET ;==============================================