diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index d4a04e1..703b016 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -163,7 +163,7 @@ MKDIR: LD E,L INC DE LD (HL),0 - LD BC,512-65 ;!HARDCODE sector size + LD BC,512-65 ;!HARDCODE ;!FIXIT ; [ ] sector size LDIR ; POP HL ; старший номер сектора @@ -197,7 +197,7 @@ MKDIR: JR Z,.skip_clean ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 - LD BC,511 ;!HARDCODE sector size + LD BC,511 ;!HARDCODE ;!FIXIT ; [ ] sector size LD (HL),0 LDIR .skip_clean: ; diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index de82ab2..f3b537b 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -110,7 +110,7 @@ READ: LD (.R_POINT),HL ; EXX POP DE - LD HL,512 ;!HARDCODE sector size! + LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size AND A SBC HL,DE LD B,H diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index ec87280..93df482 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -152,7 +152,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] EXX POP DE JP C,.ERR1 - LD HL,512 ;!HARDCODE sector size! + LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size AND A SBC HL,DE LD B,H diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index c271642..08e4811 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -254,8 +254,9 @@ DEVICE EQU $ ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 BYTE PARTITION RECORD NUMBER (in drive MBR) -;+09 FREE -;+15 +;+10 WORD Sector Size +;+12 FREE +; LOGDRV EQU DEVICE + DEVICE.End .TBL_Entry EQU 16 .Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry @@ -264,6 +265,11 @@ LOGDRV EQU DEVICE + DEVICE.End .SECTOR_OFFSET EQU 1 .SIZE_IN_SECTORS EQU 5 .PARTITION_RECORD_NUM EQU 9 +.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 ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи ; ПОРТИТ: HL, IY. HL<-->DE diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 5b0f282..e74d536 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -1599,7 +1599,7 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: JR Z,.set_region ; .loop: SLA H - AND A + ;AND A SUB L JR NZ,.loop ; @@ -1676,20 +1676,16 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; INC HL ; номер кластера LD (HL),D .exit: ; - IF FAST_FAT_CASHE ; [ ] ускорение работы с кэшем FAT CALL SET_FAT32_CACHE_BLOCK_CHANGED_REGION ; - ENDIF POP AF ; восст. порт POP HL OUT (SLOT3),A - IFN FAST_FAT_CASHE ; [x] 2/12/23 FAT не всегда мог записаться на HDD - LD A,#FF - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ;LD A,#FF + ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ; - ENDIF ; CF = 0 RET ; @@ -1862,7 +1858,6 @@ WRITE_FAT_TABLE: LD B,E ; MAX число секторов для чтения в кэш LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) LD (.sub_A),A - ;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) AND A LD A,C @@ -1970,17 +1965,14 @@ WRITE_FAT_TABLE: LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) - IF FAST_FAT_CASHE CP #FF JR NZ,.SAVE_NOT_ALL_BLOCK - ENDIF ; LD DE,FATPAGE.cache ; откуда LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV ; - IF FAST_FAT_CASHE .SAVE_NOT_ALL_BLOCK: ; A = CORE_BUFFERS.FatBuffer.CacheUpdated ; HL:IX - смещение внутри раздела на начало нужного блока FAT @@ -2042,9 +2034,6 @@ WRITE_FAT_TABLE: POP DE POP AF RET - ; DJNZ .region_loop - ; RET - ENDIF ;----------------------------------------------------------------------- ; ;[x] fat32 ;!TEST @@ -2390,7 +2379,6 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX ; .ECL1: AND A RET - ;----------------------------------------------------------------------- ; [x] fat32 diff --git a/DSS/VERSION.INC b/DSS/VERSION.INC index 984fa6c..eaffa57 100644 --- a/DSS/VERSION.INC +++ b/DSS/VERSION.INC @@ -31,7 +31,7 @@ ; номер версии (0..9) VERS EQU 1 ; номер модификации (0..99) -MODF EQU 70 +MODF EQU 71 ; номер билда (0..999) BUILD EQU lua_BUILD ; diff --git a/DSS/build.txt b/DSS/build.txt index cf5106d..c227083 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -999 \ No newline at end of file +0 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f53305f..95a0251 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -28,7 +28,6 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 - DEFINE FAST_FAT_CASHE 1 SERVICE_SECTORS: .FAT12 EQU #0FEF @@ -94,6 +93,8 @@ FAT_CACHE: ;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ; + DEFINE DSS_MAX_SECTOR_SIZE 512 + DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE MAX_RAMDRIVES 16 DEFINE NeedSafePort_Y 1 diff --git a/DSS/drivers/media/atapi-drv.asm b/DSS/drivers/media/atapi-drv.asm index 3d03c86..c4ca9b1 100644 --- a/DSS/drivers/media/atapi-drv.asm +++ b/DSS/drivers/media/atapi-drv.asm @@ -289,16 +289,26 @@ SELHDD: PUSH DE PUSH HL ; LD L,A + ; LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) + ; + ; [ ] 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+3) - LD D,(IY+4) + LD E,(IY+LOGDRV.SECTOR_OFFSET+2) + LD D,(IY+LOGDRV.SECTOR_OFFSET+3) POP HL ADC HL,DE - LD A,(IY+0) ;DRIVE NUMBER + ; [ ] custom sector size + ;JR C,.exit + RRA + ; +.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) POP DE RET @@ -367,6 +377,16 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE ; bit2 - reserved "0" (MAY BE OTHER) ; bit1 - reserved "0" (MAY BE OTHER) ; bit0 - Primary/Secondary Chanel +; B - ;[ ] sector size ;!TODO +; 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 HGETPRM: EX DE,HL LD BC,#55AA @@ -397,6 +417,13 @@ HGETPRM: 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) @@ -406,7 +433,19 @@ HGETPRM: ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; - EX AF,AF' + ;[ ] 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' ; @@ -434,6 +473,16 @@ CHEK_H: ;LD A,#FF 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 +; + ; DE - ADDRESS ; A - DRIVE GBPB_H: PUSH IY @@ -441,20 +490,27 @@ GBPB_H: PUSH IY LD L,A ; LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - LD L,(IY+3) - LD H,(IY+4) + ; + ; [ ] 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+0) + 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 @@ -463,9 +519,10 @@ GBPB_H: PUSH IY ;READ SECTOR LREADH: PUSH IY CALL SELHDD + JR C,.error ; [ ] custorm sector size LD C,BIOS.DRV_READ_LONG RST ToBIOS - POP IY +.error: POP IY RET ;HL:IX - SECTOR @@ -477,9 +534,10 @@ LREADH: PUSH IY LWRITEH: PUSH IY CALL SELHDD + JR C,.error ; [ ] custorm sector size LD C,BIOS.DRV_WRITE_LONG RST ToBIOS - POP IY +.error: POP IY RET ;HL:IX - SECTOR @@ -489,9 +547,10 @@ LWRITEH: ;WRITE SECTOR WRITEH: PUSH IY CALL SELHDD + JR C,.error ; [ ] custorm sector size LD C,BIOS.DRV_WRITE RST ToBIOS - POP IY +.error: POP IY RET ;HL:IX - SECTOR @@ -501,9 +560,10 @@ WRITEH: PUSH IY ;READ SECTOR READH: PUSH IY CALL SELHDD + JR C,.error ; [ ] custorm sector size LD C,BIOS.DRV_READ RST ToBIOS - POP IY +.error: POP IY RET ;HL:IX - SECTOR @@ -595,12 +655,23 @@ DEFINE_PARTITIONS: ;SCF ;RET .check_atapi: LD A,(DRV_NUM) + LD B,A AND #F0 CP DRIVE_CODES.SPRINTER.ATAPI SCF RET NZ ; ; No Media + ;!TODO sector size + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + JR NC,.no_err + ; + LD IX,#FFFF +.no_err: LD D,XH + LD E,XL + ; XOR A ;BPB SECTOR LD IX,(OFFSECT) @@ -613,6 +684,10 @@ DEFINE_PARTITIONS: LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),A LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),A LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),A + ; [ ] sector size + LD (IX + LOGDRV.SECTOR_SIZE),E + LD (IX + LOGDRV.SECTOR_SIZE + 1),D + ; ; для правильного выхода из парсера разделов LD B,1 PUSH BC diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index 11c3129..e1d65f6 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -293,11 +293,11 @@ GenIOCTL: BIT 7,B ; BC' - SECTORS PER TRACK ON PHISICAL DISK ; A' - PHISICAL DRIVE NUMBER ; A - EXTENDED INFORMATION -; D1..D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED +; D6 - ADDRESSING MODE LBA/CHS +; D5 - "1" RESERVED +; D4 - DEVICE MASTER/SLAVE +; D1..D3 - "0" RESERVED (MAY BE OTHER) .GetParams: EX DE,HL LD BC,#55AA AND #0F diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm index 2856e7b..025caae 100644 --- a/DSS/drivers/media/ide-drv.asm +++ b/DSS/drivers/media/ide-drv.asm @@ -393,6 +393,13 @@ HGETPRM: 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) @@ -402,7 +409,19 @@ HGETPRM: ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; - EX AF,AF' + ;[ ] 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' ; @@ -437,14 +456,14 @@ GBPB_H: PUSH IY LD L,A ; LOGDRV_ENTRY_FIND LOGDRV - ; !HARDCODE - LD E,(IY+1) - LD D,(IY+2) - LD L,(IY+3) - LD H,(IY+4) + ; + 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+0) + LD A,(IY+LOGDRV.SECTOR_OFFSET.PHISICAL_DRV_NUMBER) POP DE POP IY LD BC,1*256 + BIOS.DRV_READ diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm index 97f01cc..7e9fa1e 100644 --- a/DSS/drivers/media/shared-drv.asm +++ b/DSS/drivers/media/shared-drv.asm @@ -149,37 +149,37 @@ INITDVC: XOR A ; Инициировать таблицу переходов девайса. ; вход: de=адрес обработчика девайса ; a=число девайсов (0=нет) -MAKEDVC: LD C,A - LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска - ADD A,(HL) - LD (HL),A - ;!TEST ;[ ] оптимизировать было лень - CP DSS_MAX_DRIVES_AMOUNT+1 - JR C,1F - LD (HL),DSS_MAX_DRIVES_AMOUNT - SUB DSS_MAX_DRIVES_AMOUNT - NEG - ADD C - JP 2F - ; -1: LD A,C - OR A - RET Z ; нет девайсов -2: LD C,0 ; сбр. - LD HL,(PDEVICE) ; тек. полож. в таблице -.loop: LD (HL),C ; номер лог.драйва этого устройства - INC HL - LD (HL),E ; de=адрес обработчика - INC HL - LD (HL),D - INC HL - INC C ; ++номер драйва - DEC A - JR NZ,.loop - LD (PDEVICE),HL - DEC A - LD (HL),A - RET +MAKEDVC: LD C,A + LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска + ADD A,(HL) + LD (HL),A + ;!TEST ;[ ] оптимизировать было лень + CP DSS_MAX_DRIVES_AMOUNT+1 + JR C,1F + LD (HL),DSS_MAX_DRIVES_AMOUNT + SUB DSS_MAX_DRIVES_AMOUNT + NEG + ADD C + JP 2F + ; +1: LD A,C + OR A + RET Z ; нет девайсов +2: LD C,0 ; сбр. + LD HL,(PDEVICE) ; тек. полож. в таблице +.loop: LD (HL),C ; номер лог.драйва этого устройства + INC HL + LD (HL),E ; de=адрес обработчика + INC HL + LD (HL),D + INC HL + INC C ; ++номер драйва + DEC A + JR NZ,.loop + LD (PDEVICE),HL + DEC A + LD (HL),A + RET ;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые @@ -192,10 +192,9 @@ INTDISK: CP #FF JR NZ,.noNeedRescan CP C - ;JR Z,INITDVC_RET_DRIVE JR Z,ReScanDRV -.noNeedRescan: ; +.noNeedRescan: PUSH HL PUSH BC _CALC_DEVICE_ENTRY DEVICE diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index cb29be6..501b2b5 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -87,7 +87,7 @@ cmd_info: CALL Get_Path POP BC PUSH BC LD A,C - CP "C" + CP "C" - "A" JR C,.ItIsFDD LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams @@ -98,18 +98,20 @@ cmd_info: CALL Get_Path LD DE,Buffers.bat_params.PRM5 ; Drive size CALL ncopy_string JR .print_info_2 - ; HL:DE * 512 = A:HL:H'L' + ; HL:DE * 512 = A:H'L':HL ;!HARDCODE sector size .calc_size: RL E RL D RL L RL H - LD C,E LD A,H + EX AF,AF + LD A,E LD H,L LD L,D EXX - LD H,C + LD H,A LD L,0 + EX AF,AF JR .convert_hex ; .Collect_Msg: DZ " A: \r" ; патчится буква драйва в цикле diff --git a/SHELL/build.txt b/SHELL/build.txt index 3fa694f..cb856a4 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -437 \ No newline at end of file +444 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 6f28f9f..7ef1dd9 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6f28f9f83e4737733b76053891bd9be121aed186 +Subproject commit 7ef1dd98b491068d5a9ded34f5ff51430b7fa7e7