; 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: ;!FIXIT неправильные значения ; 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 MODULE RAMDSK_DRV ; parser API_TABLE: INC C DEC C JP Z,Init ; 0 DEC C JR Z,Open ; 1 DEC C JR Z,Close ; 2 DEC C JR Z,MediaCheck ; 3 DEC C JR Z,GetBPB ; 4 DEC C JR Z,Read ; 5 DEC C JR Z,Write ; 6 DEC C JR Z,Removable ; 7 DEC C JP Z,GenIOCTL ; 8 DEC C JP Z,.error ; 9 RESR_H DEC C JP Z,ReadLong ; 10 DEC C JP Z,WriteLong ; 11 ; .error: LD A,BIOS.Error.InvalidSubFunction SCF RET ; Removable: Open: Close: XOR A RET ; ;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение ;!FIXIT как-то определять смену RMD? ; [x] 18/08/2024 пока немного костыльно и опасно MediaCheck: ;LD A,#FF ;AND A XOR A ; RET ;DE - ADDRESS GetBPB: LD IX,0 LD HL,0 LD B,#01 ;JP READ_RD ;READ SECTORS ; HL:IX - SECTOR ; DE - ADDRESS ; B - COUNT ; A - DRIVE Read: PUSH BC CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_READ JP ToBIOS ; RST ToBIOS ; XOR A ; RET ReadLong: 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: PUSH BC CALL GET_RAMDRV_NUM POP BC LD C,BIOS.DRV_WRITE JP ToBIOS ; RST ToBIOS ; XOR A ; RET WriteLong: 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: ; .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 GenIOCTL: 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,BIOS.Error.InvalidSubFunction 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,BIOS.Error.InvalidSubFunction 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,Dss.DRV.GenIOCTL.Enter ;AND A ;SBC HL,BC LD L,A ;LD A,BIOS.Error.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 $ ENDMODULE ;RAMDSK_DRV ;