diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 08e4811..4ae29fb 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -268,8 +268,8 @@ LOGDRV EQU DEVICE + DEVICE.End .SECTOR_SIZE EQU 10 ; word .RemovableMedia EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Reserved_1 EQU 13 -.Reserved_1 EQU 14 -.Reserved_1 EQU 15 +.Reserved_2 EQU 14 +.Reserved_3 EQU 15 ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи ; ПОРТИТ: HL, IY. HL<-->DE diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM index 29d977b..f88ebdd 100644 --- a/DSS/drivers/media/ReScanDRV.ASM +++ b/DSS/drivers/media/ReScanDRV.ASM @@ -49,7 +49,7 @@ ReScanDRV: SBC HL,DE JR Z,.nextN ; пропуск FDD драйвов ; HDD? - LD HL,HDDRIVE + LD HL,IDE_DRV.API_TABLE AND A SBC HL,DE ; HDD! Сверка по таблице LOGDRV @@ -185,7 +185,7 @@ Fill_if_Exists: LD A,LOGDRV.TBL_Entry LD IY,LOGDRV CALL .RUN - LD DE,HDDRIVE + LD DE,IDE_DRV.API_TABLE RET NC ; переходим на другую таблицу - RAMDTBL LD A,(.tbl) diff --git a/DSS/drivers/media/atapi-drv.asm b/DSS/drivers/media/atapi-drv.asm index c4ca9b1..7831101 100644 --- a/DSS/drivers/media/atapi-drv.asm +++ b/DSS/drivers/media/atapi-drv.asm @@ -174,36 +174,38 @@ ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 -; MODULE ATAPI_DRV + MODULE IDE_DRV + + PARTITION_BUFFER _sBOOT_SECTOR = #C000 ATAPI_BUFFER _sCDFS_PRIMARY_VOLUME_DESCRIPTOR = #C000 -HDDRIVE: INC C +API_TABLE: INC C DEC C - JP Z,INIT_H ; [ ] ; c=0 Initialization + JP Z,Init ; [ ] ; c=0 Initialization DEC C - JP Z,RESE_H ; [ ] ; c=1 open + JP Z,Open ; [ ] ; c=1 open DEC C - JP Z,STAT_H ; [ ] ; c=2 close + JP Z,Close ; [ ] ; c=2 close DEC C - JP Z,CHEK_H ; [ ] ; c=3 media check (смена носителя) + JP Z,MediaCheck ; [ ] ; c=3 media check (смена носителя) DEC C - JP Z,GBPB_H ; [ ] ; c=4 get BPB + JP Z,GetBPB ; [ ] ; c=4 get BPB DEC C - JP Z,READH ; [ ] ; c=5 read (чтение секторов) + JP Z,Read ; [ ] ; c=5 read (чтение секторов) DEC C - JP Z,WRITEH ; [ ] ; c=6 write (запись секторов) + JP Z,Write ; [ ] ; c=6 write (запись секторов) DEC C - JP Z,REMOV_H ; [ ] ; c=7 Removable + JP Z,Removable ; [ ] ; c=7 Removable DEC C - JP Z,IOCTL_H ; [ ] ; c=8 узнать геометрию диска Generic IOCTL + JP Z,GenIOCTL ; [ ] ; c=8 узнать геометрию диска Generic IOCTL DEC C JP Z,.Reserved ; [ ] ; c=9 Reserved DEC C - JP Z,LREADH ; [ ] ; c=10 Read Long + JP Z,ReadLong ; [ ] ; c=10 Read Long DEC C - JP Z,LWRITEH ; [ ] ; c=11 Write Long + JP Z,WriteLong ; [ ] ; c=11 Write Long ; .Reserved: LD A,DSS_Error.drv.INVALID_COMMAND SCF @@ -216,7 +218,7 @@ HDDRIVE: INC C ;--------------------------------------------------------------------[v] ; c=0 Initialization -INIT_H: PUSH IY +Init: PUSH IY ;!TEST ;[ ] для rescanDRV XOR A LD (.count),A @@ -285,32 +287,34 @@ INIT_H: PUSH IY ; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV -SELHDD: PUSH DE - PUSH HL - ; - LD L,A - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - ; [ ] custorm sector size - CALL CHECK_IDE_SECTOR_SIZE - RLA - ; - ; - LD E,(IY+LOGDRV.SECTOR_OFFSET) - LD D,(IY+LOGDRV.SECTOR_OFFSET+1) - ADD IX,DE - LD E,(IY+LOGDRV.SECTOR_OFFSET+2) - LD D,(IY+LOGDRV.SECTOR_OFFSET+3) - POP HL - ADC HL,DE - ; [ ] custom sector size - ;JR C,.exit - RRA - ; -.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) - POP DE - RET +SelectDrive: PUSH DE + PUSH HL + ; + LD L,A + ; + LOGDRV_ENTRY_FIND LOGDRV + ; + ; [ ] custorm sector size + CALL CHECK_IDE_SECTOR_SIZE + RLA + ; + ; + LD E,(IY+LOGDRV.SECTOR_OFFSET) + LD D,(IY+LOGDRV.SECTOR_OFFSET+1) + ADD IX,DE + LD E,(IY+LOGDRV.SECTOR_OFFSET+2) + LD D,(IY+LOGDRV.SECTOR_OFFSET+3) + POP HL + ADC HL,DE + ; [ ] custom sector size + ;JR C,.exit + RRA + ; +.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) + POP DE + RET NC + LD A,DSS_Error.drv.UNKNOWN_FORMAT + RET ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK @@ -318,49 +322,54 @@ SELHDD: PUSH DE ; 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 +GenIOCTL: BIT 7,B + JR NZ,.Set + INC B + DEC B + JR Z,GetParams + DEC B + JR Z,.error ;ReadTrack + DEC B + JR Z,TestTRK + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + ; +.Set: RES 7,B + INC B + DEC B + RET Z ;SetParams + DEC B + JR Z,.error ;WriteTrack + DEC B + JR Z,.error + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + ; +.error: LD A,DSS_Error.drv.GENERAL_FAILURE + 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 +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;CHECK SECTOR +TestTRK: LD C,BIOS.DRV_VERIFY + JP Exec_BIOS + ;LD B,L + ;CALL CHECKH + ;RET -HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET -HCHTRAC LD B,L - CALL CHECKH - RET +; HSETPRM: AND A +; 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 +; 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 ;[x] 17.12.2023 загрузка с активного раздела, а не с первого @@ -387,143 +396,173 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE ; 32 - 4096 bytes ; 64 - 8192 bytes ; 128 - 16384 bytes -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 - ;[ ] 04/01/2025 возвращение размера сектора - EX AF,AF' - LD A,XH - LD E,XL - RL E - RLA - ; - ; 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) - ; - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска - ; - ;[ ] 04/01/2025 возвращение размера сектора - ; 00 - undefined - ; 01 - 128 bytes - ; 02 - 256 bytes - ; 04 - 512 bytes - ; 08 - 1024 bytes - ; 16 - 2048 bytes - ; 32 - 4096 bytes - ; 64 - 8192 bytes - ; 128 - 16384 bytes - ;EX AF,AF' - LD B,A - ; - 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 +GetParams: 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 + ;[ ] 04/01/2025 возвращение размера сектора + EX AF,AF' + LD A,XH + LD E,XL + RL E + RLA + ; + ; 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) + ; + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска + ; + ;[ ] 04/01/2025 возвращение размера сектора + ; 00 - undefined + ; 01 - 128 bytes + ; 02 - 256 bytes + ; 04 - 512 bytes + ; 08 - 1024 bytes + ; 16 - 2048 bytes + ; 32 - 4096 bytes + ; 64 - 8192 bytes + ; 128 - 16384 bytes + ;EX AF,AF' + LD B,A + ; + 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 -RESE_H: XOR A - RET +Removable: XOR A + INC A + RET -STAT_H: XOR A - RET +Open: XOR A + RET -CHEK_H: ;LD A,#FF - XOR A - ;AND A - RET +Close: XOR A + RET + + ;[ ] media changed - bios 5x DETECT +; выход A=#FF - changed, A=0 - not changed, ZF=1 - not changed +MediaCheck: PUSH IY + CALL SelectDrive + JR C,.exit + ; + LD A,#FF + BIT 1,(IY + LOGDRV.RemovableMedia) + JR NZ,.exit + ; + LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) + LD C,BIOS.DRV_DETECT + RST ToBIOS + AND %0000'0010 + JR Z,.norm_exit + ; + ld + ; реинит драйва + ; +.norm_exit: XOR A +.exit: POP IY + RET ; [ ] custorm sector size CHECK_IDE_SECTOR_SIZE: - LD E,(IY+LOGDRV.SECTOR_SIZE) - LD D,(IY+LOGDRV.SECTOR_SIZE+1) - LD HL,DSS_MAX_SECTOR_SIZE - AND A - SBC HL,DE - RET + LD E,(IY+LOGDRV.SECTOR_SIZE) + LD D,(IY+LOGDRV.SECTOR_SIZE+1) + LD HL,DSS_MAX_SECTOR_SIZE + AND A + SBC HL,DE + RET ; + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;READ SECTOR + ; DE - ADDRESS ; A - DRIVE -GBPB_H: PUSH IY - PUSH DE - LD L,A - ; - LOGDRV_ENTRY_FIND LOGDRV - ; - ; [ ] custorm sector size - CALL CHECK_IDE_SECTOR_SIZE - JR C,.error - ; - LD E,(IY+LOGDRV.SECTOR_OFFSET) - LD D,(IY+LOGDRV.SECTOR_OFFSET+1) - LD L,(IY+LOGDRV.SECTOR_OFFSET+2) - LD H,(IY+LOGDRV.SECTOR_OFFSET+3) - LD XL,E - LD XH,D - LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) - POP DE - POP IY - LD BC,1*256 + BIOS.DRV_READ - JP ToBIOS - ; -.error: POP DE - POP IY - LD A,DSS_Error.drv.UNKNOWN_FORMAT - RET +GetBPB: ; !FIXIT выбирать значения исходя из типа драйва или ещё чего-нибудь + LD HL,0 + LD IX,0 + JR Read + +; PUSH IY +; PUSH DE +; LD L,A +; ; +; LOGDRV_ENTRY_FIND LOGDRV +; ; +; ; [ ] custorm sector size +; CALL CHECK_IDE_SECTOR_SIZE +; JR C,.error +; ; +; LD E,(IY+LOGDRV.SECTOR_OFFSET) +; LD D,(IY+LOGDRV.SECTOR_OFFSET+1) +; LD L,(IY+LOGDRV.SECTOR_OFFSET+2) +; LD H,(IY+LOGDRV.SECTOR_OFFSET+3) +; LD XL,E +; LD XH,D +; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) +; POP DE +; POP IY +; LD BC,1*256 + BIOS.DRV_READ +; JP ToBIOS +; ; +; .error: POP DE +; POP IY +; LD A,DSS_Error.drv.UNKNOWN_FORMAT +; RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A'- PAGE ; A - HDD LOG NUMBER ;READ SECTOR -LREADH: PUSH IY - CALL SELHDD - JR C,.error ; [ ] custorm sector size - LD C,BIOS.DRV_READ_LONG - RST ToBIOS -.error: POP IY - RET +ReadLong: LD C,BIOS.DRV_READ_LONG + JP Exec_BIOS +; PUSH IY +; CALL SelectDrive +; JR C,.error ; [ ] custorm sector size +; LD C,BIOS.DRV_READ_LONG +; RST ToBIOS +; .error: POP IY +; RET ;HL:IX - SECTOR ; DE - ADDRESS @@ -531,53 +570,66 @@ LREADH: PUSH IY ; A'- PAGE ; A - HDD LOG NUMBER ;WRITE SECTOR -LWRITEH: - PUSH IY - CALL SELHDD - JR C,.error ; [ ] custorm sector size - LD C,BIOS.DRV_WRITE_LONG - RST ToBIOS -.error: POP IY - RET +WriteLong: LD C,BIOS.DRV_WRITE_LONG + JP Exec_BIOS +; PUSH IY +; CALL SelectDrive +; JR C,.error ; [ ] custorm sector size +; LD C,BIOS.DRV_WRITE_LONG +; RST ToBIOS +; .error: POP IY +; RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A - HDD LOG NUMBER ;WRITE SECTOR -WRITEH: PUSH IY - CALL SELHDD - JR C,.error ; [ ] custorm sector size - LD C,BIOS.DRV_WRITE - RST ToBIOS -.error: POP IY - RET +Write: LD C,BIOS.DRV_WRITE + JP Exec_BIOS +; PUSH IY +; CALL SelectDrive +; JR C,.error ; [ ] custorm sector size +; LD C,BIOS.DRV_WRITE +; RST ToBIOS +; .error: POP IY +; RET -;HL:IX - SECTOR -; DE - ADDRESS -; B - COUNTER -; A - HDD LOG NUMBER -;READ SECTOR -READH: PUSH IY - CALL SELHDD - JR C,.error ; [ ] custorm sector size - LD C,BIOS.DRV_READ - RST ToBIOS -.error: POP IY - RET ;HL:IX - SECTOR ; DE - ADDRESS ; B - COUNTER ; A - HDD LOG NUMBER ;CHECK SECTOR -CHECKH: PUSH IY - CALL SELHDD - LD C,BIOS.DRV_VERIFY - RST ToBIOS - POP IY - RET +; CHECKH: PUSH IY +; CALL SelectDrive +; LD C,BIOS.DRV_VERIFY +; RST ToBIOS +; POP IY +; RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A - HDD LOG NUMBER +;READ SECTOR +Read: LD C,BIOS.DRV_READ + ; +Exec_BIOS: PUSH IY + CALL .exec + POP IY + RET + +.exec: CALL SelectDrive + RET C + RST ToBIOS + RET NC + CP BIOS.Error.ATAPI.UnitAttention + SCF + RET NZ + SET 1,(IY + LOGDRV.RemovableMedia) + RET ;------------------------------[ PARTIT ]------------------------------; DEFINE_PARTITIONS: .FAT32_DOS: ; @@ -647,7 +699,7 @@ DEFINE_PARTITIONS: JP Z,.FAT32_DOS ; CP PartitionSysTypes.Win_Ext_LBA - JR Z,.SubLevel + JP Z,.SubLevel JP .NextPartition ; раздел не поддерживается ; @@ -813,11 +865,11 @@ DEFINE_PARTITIONS: ; ;!TEST Подстраховка от переполнения таблицы LOGDRV -INC_DRV_COUNT: LD A,(INIT_H.count) +INC_DRV_COUNT: LD A,(Init.count) INC A CP DSS_MAX_DRIVES_AMOUNT+1 RET NC - LD (INIT_H.count),A + LD (Init.count),A RET ;======================================================================= @@ -831,4 +883,4 @@ EXTDOSH: DW #0000 OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD ;======================================================================= -; ENDMODULE \ No newline at end of file + ENDMODULE \ No newline at end of file diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm index 7e9fa1e..5b4d88e 100644 --- a/DSS/drivers/media/shared-drv.asm +++ b/DSS/drivers/media/shared-drv.asm @@ -121,30 +121,30 @@ ;----------------------------------------------------------- ; Просканировать систему на FDD/HDD девайсы и RAM-диски ;----------------------------------------------------------- -INITDVC: XOR A - LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку - LD HL,DEVICE - LD (PDEVICE),HL ; восст. ячейку - ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] - LD HL,DEVICE - LD (HL),#FF - LD DE,DEVICE+1 - LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 - LDIR - ; FDD девайсы - CALL FDD_DRV.Init ; узнать число FDD-девайсов - LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы -.if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET - LD DE,HDDRIVE - CALL MAKEDVC - ; RAM-диски - CALL INIT_RD - LD DE,RMDRIVE - CALL MAKEDVC - XOR A - RET +INITDVC: XOR A + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку + LD HL,DEVICE + LD (PDEVICE),HL ; восст. ячейку + ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] + LD HL,DEVICE + LD (HL),#FF + LD DE,DEVICE+1 + LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 + LDIR + ; FDD девайсы + CALL FDD_DRV.Init ; узнать число FDD-девайсов + LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы +.if_old: CALL IDE_DRV.Init ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET + LD DE,IDE_DRV.API_TABLE + CALL MAKEDVC + ; RAM-диски + CALL INIT_RD + LD DE,RMDRIVE + CALL MAKEDVC + XOR A + RET ; Инициировать таблицу переходов девайса. ; вход: de=адрес обработчика девайса diff --git a/Shared_Includes b/Shared_Includes index 7ef1dd9..857938d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7ef1dd98b491068d5a9ded34f5ff51430b7fa7e7 +Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa