; ; 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 RMDRIVE: INC C DEC C JP Z,INIT_RD ; 0 DEC C JR Z,RESE_RD ; 1 DEC C JR Z,STAT_RD ; 2 DEC C JR Z,CHEK_RD ; 3 DEC C JR Z,GBPB_RD ; 4 DEC C JR Z,READR ; 5 DEC C JR Z,WRITER ; 6 DEC C JR Z,REMOV_R ; 7 DEC C JP Z,IOCTL_R ; 8 ; DEC C ; JP Z,RESR_H ; 9 ; DEC C ; JP Z,LREADH ; 10 ; DEC C ; JP Z,LWRITEH ; 11 .error: LD A,DSS_Error.drv.INVALID_COMMAND SCF RET REMOV_R: RESE_RD: STAT_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 READR ;READ SECTORS ; HL:IX - SECTOR ; DE - ADDRESS ; B - COUNT ; A - DRIVE READR PUSH BC PUSH IX PUSH HL PUSH BC CALL RAMADDR POP BC LD IX,512 RAMRLOP PUSH BC PUSH IX CALL LRDSEC POP IX POP BC DJNZ RAMRLOP POP HL POP IX POP BC XOR A CP B LD C,B LD B,A JR Z,DYEP256 ADD IX,BC LD C,B ADC HL,BC XOR A RET DYEP256 INC B ADD IX,BC LD B,C ADC HL,BC XOR A RET ;WRITE SECTORS ; HL:IX - SECTOR ; DE - ADDRESS ; B - COUNT ; A - DRIVE WRITER PUSH BC PUSH IX PUSH HL PUSH BC CALL RAMADDR POP BC LD IX,512 RAMWLOP PUSH BC PUSH IX CALL WRDSEC POP IX POP BC DJNZ RAMWLOP POP HL POP IX POP BC XOR A CP B LD C,B LD B,A JR Z,WYEP256 ADD IX,BC LD C,B ADC HL,BC XOR A RET WYEP256 INC B ADD IX,BC LD B,C ADC HL,BC XOR A RET 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 ; SECTOR / S_P_P = START PAGE ; INPUT : HL:IX -SECTOR ; OUTPUT: A':HL - ADDRESS RAMADDR LD BC,RAMDTBL SLA A ADD A,C LD C,A LD A,0 ADC A,B LD B,A LD A,(BC) EX AF,AF' LD B,XH LD C,XL LD A,(S_P_P) ; (S_P_P) ;SECTORS PER Page ;AGE DIVR0 RRCA JR C,DIVR1 RR H RR L RR B RR C JR DIVR0 DIVR1 LD B,C LD C,#C4 ;GET FIRST PAGE EX AF,AF' RST ToBIOS EX AF,AF' LD A,(S_P_P) LD C,A DEC C LD A,XL AND C INC A LD HL,#C000 LD BC,512 SBC HL,BC ADDLP ADD HL,BC DEC A JR NZ,ADDLP RET S_P_P DB #00 ; A':HL - ADDRESS SOURCE ; DE - ADDRESS DESTINATION LRDSEC LD A,D CP #A0 LD C,SLOT3 SET 6,H JR C,RMDL02 LD C,SLOT1 RES 7,H RMDL02 IN A,(C) EX AF,AF' DI OUT (C),A LD B,XH LD XH,C LD C,XL LDIR EX AF,AF' LD C,XH OUT (C),A LD A,H AND #7F EI RET NZ LD C,SLOT3 ;GET NEXT PAGE IN B,(C) LD A,SYS_PAGE OUT (C),A EX AF,AF' LD XH,#C2 LD XL,A LD A,(IX) EX AF,AF' OUT (C),B LD H,#C0 RET ; A':HL - ADDRESS SOURCE ; DE - ADDRESS DESTINATION WRDSEC LD A,D CP #A0 LD C,SLOT3 SET 6,H JR C,WMDL02 LD C,SLOT1 RES 7,H WMDL02 IN A,(C) EX AF,AF' DI OUT (C),A LD B,XH LD XH,C LD C,XL EX DE,HL LDIR EX DE,HL EX AF,AF' LD C,XH OUT (C),A LD A,H AND #7F EI RET NZ LD C,SLOT3 ;GET NEXT PAGE IN B,(C) LD A,SYS_PAGE OUT (C),A EX AF,AF' LD XH,#C2 LD XL,A LD A,(IX) EX AF,AF' OUT (C),B LD H,#C0 RET ;; ;; ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK ; 02 - TEST TRACK ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK IOCTL_R: 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 BC,RAMDTBL LD A,L SLA A ADD A,C LD C,A LD A,0 ADC A,B LD B,A INC BC LD A,(BC) ADD #60 ;!HARDCODE сделать номера разных устройств через метки 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 ;!HARDCODE .RSETPRM: AND A RET ENDDRVR EQU $ ;