; 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,BIOS.Error.InvalidSubFunction SCF RET ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Commands for restart #18 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Init: LD A,2 ;количество FDD в компе AND A RET ; ; ; ; Open: PUSH AF LD C,BIOS.DRV_RESET RST ToBIOS POP BC RET C ; LD A,B LD C,BIOS.DRV_GET_PAR RST ToBIOS LD DE,-DSS_MAX_SECTOR_SIZE - 1 ; [ ] 15/04/25 не будет читать сектор больше DSS_MAX_SECTOR_SIZE ; ZF = 0 LD A,BIOS.Error.UnknownDevice OR A ; убираем ZF, если есть ; ADD IX,DE ; если размер сектора больше, то облом RET ; ; ; ; Close: XOR A RET ; ; ; ;!FIXIT проверять ВГ93 когда (если) это станет возможным MediaCheck: CALL Open RET C IF NON_REMOVABLE_FDD XOR A ELSE LD A,#FF OR A ENDIF RET ; ; ; ;DE - ADDRESS GetBPB: LD IX,0 ; fix bug 14/01/2026. если нет MBR, то никаких муток LD H,D LD L,E LD BC,BOOT_SECTOR.MBR_SIGNATURE ADD HL,BC LD (HL),C ; 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) ; fix bug 14/01/2026. если нет MBR, то никаких муток LD BC,BOOT_SECTOR.MBR_SIGNATURE - BOOT_SECTOR.SectorsPerTrack ADD HL,BC LD C,(HL) INC HL LD B,(HL) LD HL,#AA55 SBC HL,BC LD A,DSS_Error.drv.UNKNOWN_FORMAT SCF RET NZ ; PUSH DE ; D - drive, E - Sectors Per Track LD A,D LD C,BIOS.DRV_GET_PAR RST ToBIOS ; !TEST ;LD A,H ; A heads ;POP HL ; H - drive, L - Sectors Per Track ;PUSH HL ;LD H,A ; H - heads, L - Sectors Per Track ;POP AF ; A - drive ; LD C,H ; C heads POP HL ; H - drive, L - Sectors Per Track LD A,H ; A - drive LD H,C ; H - heads, L - Sectors Per Track ; 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,BIOS.Error.InvalidSubFunction 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,BIOS.Error.InvalidSubFunction 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 ; D7 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D5 - "1" RESERVED ; D4 - DEVICE MASTER/SLAVE ; D1..D3 - "0" RESERVED (MAY BE OTHER) .GetParams: EX DE,HL LD BC,#55AA AND #0F SBC HL,BC JR Z,.next ; LD A,BIOS.Error.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,BIOS.Error.BadNumber ; 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 ; ; ; Removable: XOR A INC A RET ; ; ; ;============================================== ENDMODULE ; FDD_DRV ////////////////////////////////////////////////////////////////////////