;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R02 06-08-2001 DNS Secondary IDE ;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk ;--------------------------------------------------------------- ; ; 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] ;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] ;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] ;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 ; ;[]===========================================================[9] ;[]===========================================================[10] ;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 ; ;[]===========================================================[10] ; ; 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 LD_DSK EQU 16 ; максимальное количество логических дисков в системе ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 PART EQU #C000 HDDRIVE INC C DEC C JP Z,INIT_H ; c=0 Initialization DEC C JP Z,RESE_H ; c=1 open DEC C JP Z,STAT_H ; c=2 close DEC C JP Z,CHEK_H ; c=3 media check (смена носителя) DEC C JP Z,GBPB_H ; c=4 get BPB DEC C JP Z,READH ; c=5 input (чтение секторов) DEC C JP Z,WRITEH ; c=6 output (запись секторов) DEC C JP Z,REMOV_H ; c=7 Removable DEC C JP Z,IOCTL_H ; c=8 узнать геометрию диска Generic IOCTL DEC C JP Z,RESR_H ; c=9 Reserved DEC C JP Z,LREADH ; c=10 Read Long DEC C JP Z,LWRITEH ; c=11 Write Long RESR_H LD A,DSS_Error.drv.INVALID_COMMAND SCF RET //////////////////////////////////////////////////////////////////////// // Commands for restart #18 // //////////////////////////////////////////////////////////////////////// ;!FIXIT ---------------------------------------------------------------------------[v] ; c=0 Initialization INIT_H: PUSH IY LD HL,LOGDRV LD (OFFSECT),HL ; IN A,(SLOT2) ; PUSH AF ; IN A,(SLOT0) ; OUT (SLOT2),A ;LD IX,DEVICE_CFG+#8000 ; могло засрать память LD IX,SYS_PAGE.TMP_BUFFER LD C,BIOS.DRV_LIST RST ToBIOS IN A,(SLOT3) LD C,A LD A,SYS_PAGE OUT (SLOT3),A XOR A LD B,(IX+2) ;количество HDD для процедуры NX_DVCI CP B LD A,C OUT (SLOT3),A JR Z,NO_HARDS ;LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT LD C,#80 ;!HARDCODE - ID винта для процедуры BIOS.DRV_DETECT NX_DVCI: PUSH BC LD A,C LD (DRV_NUM),A LD C,BIOS.DRV_DETECT RST ToBIOS ;JR C,.NO_DRIVE CALL NC,PARTIT POP BC INC C JR C,NX_DVCI DJNZ NX_DVCI ; c=0 Initialization ; INIT_H: PUSH IY ; LD HL,LOGDRV ; LD (OFFSECT),HL ; LD IX,DEVICE_CFG ;!FIXIT не засрет ли память? ; LD C,BIOS.DRV_LIST ; RST ToBIOS ; XOR A ; ;!TEST ; ;LD B,(IX+2) ; ;CP B ; CP (IX+2) ;HDD ; JR Z,NO_HARDS ; LD BC,4*256 + #80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT ; ;LD C,#80 ;!HARDCODE 4 - количество винтов, 80 - ID винта ;!FIXIT ; NX_DVCI: PUSH BC ; LD A,C ; LD (DRV_NUM),A ; LD C,BIOS.DRV_DETECT ; RST ToBIOS ; ;JR C,.NO_DRIVE ; CALL NC,PARTIT ; POP BC ; INC C ; ;JR C,NX_DVCI ; DJNZ NX_DVCI ;!FIXIT ---------------------------------------------------------------------------[^] ; NO_HARDS: POP IY LD HL,(OFFSECT) LD DE,LOGDRV XOR A SBC HL,DE RET Z LD DE,LD_DSK DRVCLC: INC A SBC HL,DE JR NZ,DRVCLC AND A RET ;DEVICE_CFG EQU #4000 ;!TEST ;DEVICE_CFG EQU DRV_TEMP_BUFFER ;!TEST ; DB 0 ;LEN ; DB 0 ;FDD COUNT ; DB 0 ;HDD COUNT ; DB 0 ;CDROM COUNT ; DS 28 ;RESERVED ;+00 ;SECTORS PER TRACK ;+01 ;TRACKS PER CYLLINDER ;+02 ;RESERVED ;+03 ;HDD/DRIVE/LBA ;+04 ;SECTOR PER CYLINDER LOW ;+05 ;SECTOR PER CYLINDER HIGH ;+06 ;RESERVED ;+07 ;RESERVED LOGDRV: BLOCK 16*LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 .Size EQU $-LOGDRV SELHDD: PUSH DE PUSH BC PUSH HL LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL EX DE,HL LD IY,LOGDRV ADD IY,DE LD C,(IY+1) LD B,(IY+2) LD E,(IY+3) LD D,(IY+4) POP HL ADD IX,BC ADC HL,DE LD A,(IY+0) ;DRIVE NUMBER POP BC POP DE RET ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK ; 02 - TEST TRACK ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK IOCTL_H BIT 7,B JR NZ,O_CTL_H INC B DEC B JP Z,HGETPRM DEC B JP Z,HRDTRAC DEC B JP Z,HCHTRAC LD A,DSS_Error.drv.INVALID_COMMAND SCF RET O_CTL_H RES 7,B INC B DEC B JP Z,HSETPRM DEC B JP Z,HWRTRAC DEC B JP Z,HFRTRAC LD A,DSS_Error.drv.INVALID_COMMAND SCF RET HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET HCHTRAC LD B,L CALL CHECKH RET HSETPRM AND A RET HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE 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 - DRIVE/HEAD REGISTER PHISICAL DISK: ; bit7 - reserved "1" ; bit6 - ADDRESSING MODE LBA/CHS ; bit5 - reserved "1" ; bit4 - DEVICE MASTER/SLAVE ; bit3 - reserved "0" (MAY BE OTHER) ; bit2 - reserved "0" (MAY BE OTHER) ; bit1 - reserved "0" (MAY BE OTHER) ; bit0 - Primary/Secondary Chanel HGETPRM: EX DE,HL LD BC,#55AA AND A SBC HL,BC LD L,A LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET NZ PUSH IX PUSH IY LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD B,H LD C,L LD IY,LOGDRV ADD IY,BC ; LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;!TEST --------------------------------------------------------------------------------+ PUSH IY LD C,BIOS.DRV_GET_PAR RST ToBIOS POP IY LD A,DSS_Error.drv.INVALID_DRIVE JR C,.error EX DE,HL LD C,E LD E,D LD D,0 LD A,B LD B,D EXX ;SECTORS ON LOGICAL DISK LD E,(IY+5) LD D,(IY+6) LD L,(IY+7) LD H,(IY+8) ; EX AF,AF' LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; LD C,A ; LD IY,SYS_PAGE.IDE_0 ; AND #0F ; JR Z,GELH1 ; LD IY,SYS_PAGE.IDE_1 ; CP 2 ; JR C,GELH1 ; LD IY,SYS_PAGE.IDE_2 ; JR Z,GELH1 ; LD IY,SYS_PAGE.IDE_3 ; GELH1: IN A,(SLOT3) ; PUSH AF ; LD A,SYS_PAGE ; OUT (SLOT3),A ; LD A,(IY+HDD_INIT_TABLE.DRV_Flags) ;HDD/DRV ; EXX ; LD L,(IY+HDD_INIT_TABLE.CylinderNumberLow) ;CYLINDER LOW + ; LD H,(IY+HDD_INIT_TABLE.CylinderNumberHigh) ;CYLINDER HIGH + ; LD E,(IY+HDD_INIT_TABLE.HeadsNumber) ;HEADS + ; LD D,0 ; LD C,(IY+HDD_INIT_TABLE.SectorsPerTrack) ;SECTORS + ; LD B,0 ; EXX ; EX AF,AF' ; POP AF ; OUT (SLOT3),A ; LD A,C ; EX AF,AF' ;!TEST --------------------------------------------------------------------------------+ AND A .error: POP IY POP IX RET REMOV_H: LD A,1 AND A RET RESE_H: XOR A RET STAT_H: XOR A RET CHEK_H: ;!TEST ;LD A,#FF XOR A ; AND A RET ;HL:IX - SECTOR ; DE - ADDRESS GBPB_H: PUSH IY PUSH DE LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD B,H LD C,L LD IY,LOGDRV ADD IY,BC LD E,(IY+1) LD D,(IY+2) LD L,(IY+3) LD H,(IY+4) LD XL,E LD XH,D LD A,(IY+0) POP DE POP IY LD BC,1*256 + BIOS.DRV_READ RST ToBIOS RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A'- PAGE ; A - HDD NUMBER +#80 ;READ SECTOR LREADH: PUSH IY CALL SELHDD LD C,BIOS.DRV_READ_LONG RST ToBIOS POP IY RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A'- PAGE ; A - HDD NUMBER +#80 ;WRITE SECTOR LWRITEH: PUSH IY CALL SELHDD LD C,BIOS.DRV_WRITE_LONG RST ToBIOS POP IY RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A - HDD NUMBER +#80 ;WRITE SECTOR WRITEH: PUSH IY CALL SELHDD LD C,BIOS.DRV_WRITE RST ToBIOS POP IY RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A - HDD NUMBER +#80 ;READ SECTOR READH: PUSH IY CALL SELHDD LD C,BIOS.DRV_READ RST ToBIOS POP IY RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A - HDD NUMBER +#80 ;CHECK SECTOR CHECKH: PUSH IY CALL SELHDD LD C,BIOS.DRV_VERIFY RST ToBIOS POP IY RET ;----------------- EASYDOS: MEDIDOS: HIGHDOS: LD E,(IY+08) LD D,(IY+09) LD L,(IY+10) LD H,(IY+11) LD IX,(CURSECL) ADD IX,DE LD DE,(CURSECH) ADC HL,DE LD D,XH LD E,XL LD IX,(OFFSECT) LD (IX+1),E ;BPB SECTOR LD (IX+2),D LD (IX+3),L LD (IX+4),H ; LD DE,(CURSECL) ; LD HL,(CURSECH) ; LD (IX+1),E ;START DISK ; LD (IX+2),D ; LD (IX+3),L ; LD (IX+4),H LD E,(IY+12) LD D,(IY+13) LD L,(IY+14) LD H,(IY+15) LD (IX+5),E ;SIZE DISK LD (IX+6),D LD (IX+7),L LD (IX+8),H LD A,(DRV_NUM) LD (IX+0),A LD DE,LD_DSK ; DSKITEM ADD IX,DE LD (OFFSECT),IX NXTPART LD DE,#10 ADD IY,DE POP BC DJNZ DOSAGA AND A RET PARTIT: IN A,(SLOT3) PUSH AF LD A,SHARED_PAGE OUT (SLOT3),A CALL PARTIT1 POP AF OUT (SLOT3),A RET PARTIT1 LD IX,0 LD DE,0 LD (EXTDOSL),DE ;R01 LD (EXTDOSH),IX ;R01 PARTIT2 LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC ;!TEST ;RET C ; for absent drive ; LD HL,(PART+510) ;!HARDCODE LD DE,#AA55 AND A SBC HL,DE JR NZ,NODEFIN LD IY,PART+#01BE ;!HARDCODE LD B,4 DOSAGA PUSH BC LD A,(IY+4) CP 5 JR NZ,NOEXTDS SUBLEV PUSH IY LD DE,(CURSECL) LD IX,(CURSECH) PUSH DE PUSH IX CALL EXTDOS POP IX POP DE LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC POP IY JP NXTPART NOEXTDS CP #0F JP Z,SUBLEV CP #0E JP Z,HIGHDOS CP 6 JP Z,HIGHDOS CP 4 JP Z,MEDIDOS CP 1 JP Z,EASYDOS POP BC OR A RET Z NODEFIN SCF RET EXTDOS: LD HL,(EXTDOSL) LD DE,(EXTDOSH) LD A,L OR H OR E OR D LD E,(IY+08) LD D,(IY+09) LD L,(IY+10) LD H,(IY+11) JP NZ,EXTDOS2 LD (EXTDOSL),DE LD (EXTDOSH),HL LD IX,(EXTDOSH) JP PARTIT2 EXTDOS2 LD IX,(EXTDOSL) ADD IX,DE PUSH IX LD DE,(EXTDOSH) ADC HL,DE PUSH HL POP IX POP DE JP PARTIT2 LOADSEC PUSH IY LD IX,(CURSECL) LD HL,(CURSECH) LD DE,PART LD A,(DRV_NUM) LD BC,1*256 + BIOS.DRV_READ RST ToBIOS POP IY RET DRV_NUM DB #00 ;PHISICAL DRIVE NUMBER. номер девайса (#80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв) CURSECL DW #0000 ;CURRENT SECTOR LOADED CURSECH DW #0000 EXTDOSL DW #0000 ;CURRENT PARTITION TABLE EXTDOSH DW #0000 OFFSECT DW LOGDRV ;POINTER ON CURRENT DISK RECORD ;=======================================================