;--------------------------------------------------------------- ;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 ; 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 // //////////////////////////////////////////////////////////////////////// ;--------------------------------------------------------------------[v] ; c=0 Initialization INIT_H: PUSH IY ;!TEST ;[ ] для rescanDRV XOR A LD (DRVCLC.count),A ; LD HL,LOGDRV LD (OFFSECT),HL LD IX,SYS_PAGE.TMP_BUFFER LD C,BIOS.DRV_LIST RST ToBIOS ; DRV_LIST: ; +0 LEN ; +1 FDD COUNT ; +2 HDD COUNT ; +3 CDROM COUNT ; +4 RESERVED (28) ; 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 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 ; NO_HARDS: POP IY ;!TEST ; LD HL,(OFFSECT) ; LD DE,LOGDRV ; XOR A ; SBC HL,DE ; RET Z ; LD DE,LOGDRV.TBL_Entry DRVCLC: ; INC A ; SBC HL,DE ; JR NZ,DRVCLC ; .count+1: LD A,0 ; AND A RET ;---------------------------------------------------------------------[^] ; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ; ;+01 DWORD SECTOR OFFSET ; ;+05 DWORD SIZE IN SECTORS ; ;+09 FREE ; ;+15 ; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV ;!TODO заменить PUSH на EXX? SELHDD: PUSH DE PUSH BC PUSH HL ; LD L,A LOGDRV_ENTRY_FIND LOGDRV ; 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 ; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[ ] 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 - 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 ; LOGDRV_ENTRY_FIND LOGDRV ; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... PUSH IY LD C,BIOS.DRV_GET_PAR RST ToBIOS POP IY LD A,DSS_Error.drv.INVALID_DRIVE JR C,.error ; перетасовка регистров с результатом от BIOS 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+LOGDRV.SIZE_IN_SECTORS+0) LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1) LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2) LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3) ; ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; EX AF,AF' LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; 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: ;LD A,#FF XOR A ;AND A RET ;HL:IX - SECTOR ; DE - ADDRESS GBPB_H: PUSH IY PUSH DE LD L,A ; LOGDRV_ENTRY_FIND LOGDRV ; 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 JP ToBIOS ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A'- PAGE ; A - HDD LOG NUMBER ;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+LOGDRV.SECTOR_OFFSET+0),E ;BPB SECTOR LD (IX+LOGDRV.SECTOR_OFFSET+1),D LD (IX+LOGDRV.SECTOR_OFFSET+2),L LD (IX+LOGDRV.SECTOR_OFFSET+3),H LD E,(IY+12) LD D,(IY+13) LD L,(IY+14) LD H,(IY+15) LD (IX+LOGDRV.SIZE_IN_SECTORS+0),E ;SIZE DISK LD (IX+LOGDRV.SIZE_IN_SECTORS+1),D LD (IX+LOGDRV.SIZE_IN_SECTORS+2),L LD (IX+LOGDRV.SIZE_IN_SECTORS+3),H ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ExtendedPartitionFlag+1: LD A,0 OR A ; !TODO загрузка с расширенного раздела не поддерживается LD A,#FF JR NZ,.not_supported ; если расширенный раздел, то облом ; POP BC PUSH BC LD A,4 ;!HARDCODE MBR: Number of entries in the partition table SUB B .not_supported: LD (IX+LOGDRV.PARTITION_RECORD_NUM),A ; ;!TEST Подстраховка от переполнения таблицы LOGDRV LD A,(DRVCLC.count) INC A CP DSS_MAX_DRIVES_AMOUNT+1 RET NC LD (DRVCLC.count),A ; LD A,(DRV_NUM) LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),A LD DE,LOGDRV.TBL_Entry ;DSKITEM ADD IX,DE LD (OFFSECT),IX JP NXTPART ; NXTPART: ; LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry ; ADD IY,DE ; POP BC ; DJNZ DOSAGA ; AND A ; RET ; NOEXTDS: CP PartitionSysTypes.FAT16 JR Z,HIGHDOS CP PartitionSysTypes.FAT16_LBA JR Z,HIGHDOS CP PartitionSysTypes.FAT16_32Mb JR Z,MEDIDOS CP PartitionSysTypes.FAT12 JR Z,EASYDOS CP PartitionSysTypes.Win_Ext_LBA JR Z,SUBLEV ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта ;OR A ;PartitionSysTypes.Empty ;JR NZ,NXTPART JR NXTPART ; раздел не поддерживается ;POP BC ; баланс стека ;RET ;POP BC ;OR A ;RET Z ;NODEFIN: ;SCF ;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 ; LD HL,(PART+510) ;!HARDCODE Signature word LD DE,#AA55 AND A SBC HL,DE ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов ;JR NZ,NODEFIN SCF RET NZ ; LD IY,PART+#01BE ;!HARDCODE MBR: Offset of partition table in the MBR LD B,4 ;!HARDCODE MBR: Number of entries in the partition table DOSAGA: PUSH BC LD A,(IY+4) CP PartitionSysTypes.Extended JR NZ,NOEXTDS SUBLEV: PUSH IY LD DE,(CURSECL) LD IX,(CURSECH) PUSH DE PUSH IX ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов LD A,(ExtendedPartitionFlag) INC A LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается ; CALL EXTDOS ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов LD A,(ExtendedPartitionFlag) DEC A LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается ; POP IX POP DE LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC POP IY NXTPART: LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry ADD IY,DE POP BC DJNZ DOSAGA AND A 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 ;=======================================================