; 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 для рамдисков переменные и брать оттуда значение CHEK_RD LD A,#FF AND 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 ;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 / 2 CP B JR NZ,.initLoop LD HL,RAMDTBL EX DE,HL AND A SBC HL,DE SRL L LD A,L ; LD HL,ENDDRVR AND A RET ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID ; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER RAMDTBL: DUP MAX_RAMDRIVES * 2 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 ; 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 A,%10100000 RET ; !TODO ; !FIXIT ; .RSETPRM: ; AND A ; RET 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 сделать номера разных устройств через метки RET ENDDRVR EQU $ ;