From 34e1fc6773804a34a0e29d41d2801c606ffb57ac Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 24 Apr 2024 05:52:14 +1000 Subject: [PATCH] =?UTF-8?q?no=20bugs.=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B8=D0=BB=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=8F=D0=BB=D0=BA=D1=83=20=D1=84=D0=B0=D1=82?= =?UTF-8?q?=20-=20=D0=B3=D0=BB=D1=8E=D1=87=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 190 ++++++++++++++++++++++--------------------- DSS/FS/FAT/FAT_X.asm | 31 +++++-- DSS/build.txt | 2 +- DSS/defines.inc | 1 + 4 files changed, 124 insertions(+), 100 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 76ef5e2..c8113e3 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -87,15 +87,37 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD DE,(FSIZE0) LD HL,#4000 SBC HL,DE - RLA -.set_size: LD (BIG_SHELL),A - ; + JR NC,.set_no_size +.set_size: LD A,#FF +.set_no_size: LD (BIG_CORE),A + OR A + PUSH AF + ; загрузка LD HL,(FCLUSTR) LD DE,#C000 - CALL FLOAD ; загрузка - - - DI + CALL LOAD_CORE + ; [ ] загрузка system.dos больше #4000 байтов + EX AF,AF' + POP AF + JR Z,.no_big_core + EX AF,AF' + JR C,.no_big_core + ; + IN A,(SLOT1) + LD (BANKDOS),A + LD A,SUBLOAD_SIZE + LD (LOAD_CORE.max_sectors),A + LD (BIG_CORE),A ; теперь это счётчик оставшихся секторов + ; + LD A,(BOOT.SectorsPerCluster) + CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов + JP NC,INC_SECTOR_NUM + CALL C,R_F_FAT ; next cluster in chain + EX DE,HL + LD DE,#C000 + CALL NC,LOAD_CORE +.no_big_core: ; +RUN_CORE: DI XOR A OUT (SYS_PORT.OFF),A ; @@ -171,6 +193,21 @@ XFAIL: CALL DOSMESS .halt: JR .halt ; +; +INC_SECTOR_NUM: PUSH DE + CALL NSECTOR + LD DE,#20 ;!HARDCODE количество прочитанных секторов + ADD IX,DE + JR NC,.no_inc + INC HL +.no_inc: ; + POP DE + CALL .set_stack + JP RUN_CORE +.set_stack: PUSH HL + JP LOAD_CORE.subload +; + ; PART_TB: PUSH BC LD HL,(BOOT+510) @@ -439,6 +476,53 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 ; ; HL - CLUSTER ; ; DE - ADDRESS ; ;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы +LOAD_CORE: LD (READMEM),DE +.loop: PUSH HL + CALL NSECTOR + LD DE,(READMEM) + LD A,(BOOT.SectorsPerCluster) +.max_sectors+1: CP #20 + JR C,.SMALL_CLUSTER + ; +.subload: LD A,(.max_sectors) + LD B,A + LD C,BIOS.DRV_READ_LONG + LD A,(BANKDOS) + EX AF,AF' + LD A,(DRIVE) + RST ToBIOS_18 + POP HL + AND A + RET + ; +.SMALL_CLUSTER: LD B,A + LD C,BIOS.DRV_READ_LONG + LD A,(BANKDOS) + EX AF,AF' + LD A,(DRIVE) + RST ToBIOS_18 + ; + LD HL,(READMEM) + LD DE,(CLU_LEN) + ADD HL,DE + LD (READMEM),HL + POP HL + CCF + RET NC + ; [ ] загрузка system.dos больше #4000 байтов + LD A,(BIG_CORE) + DEC A + LD (BIG_CORE),A + RET Z + ; + CALL R_F_FAT + RET C + EX DE,HL + JP .loop + +; HL - CLUSTER +; DE - ADDRESS +;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы ; FLOAD: LD (READMEM),DE ; .LD_FILE: PUSH HL ; system.dos first cluster ; CALL NSECTOR ; Cluster to Sector @@ -476,7 +560,6 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 ; JR .set_drv ; ; ; .SMALL_CLUSTER: LD B,A -; ;LD C,BIOS.DRV_READ_LONG ; LD A,(BANKDOS) ; EX AF,AF' ; LD A,(DRIVE) @@ -511,92 +594,15 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 ; LD (BANKDOS),A ; LD HL,#C000 ; LD (READMEM),HL +; LD A,(BOOT.SectorsPerCluster) +; SUB SUBLOAD_SIZE + 1 +; CCF +; RET NC +; LD A,SUBLOAD_SIZE +; LD (BOOT.SectorsPerCluster),A ; AND A ; RET -; HL - CLUSTER -; DE - ADDRESS -;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы -FLOAD: LD (READMEM),DE -.LD_FILE: PUSH HL ; system.dos first cluster - CALL NSECTOR ; Cluster to Sector - LD DE,(READMEM) - LD A,(BOOT.SectorsPerCluster) - CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов - LD C,BIOS.DRV_READ_LONG - JR C,.SMALL_CLUSTER - LD A,(BANKDOS) - EX AF,AF' - ;LD BC,#20*256 + BIOS.DRV_READ_LONG - LD B,#20 ; !HARDCODE кол-во загружаемых секторов -.set_drv: LD A,(DRIVE) - RST ToBIOS_18 - JP C,GOOD_DRIVE.NoShell - POP HL - ; [ ] загрузка system.dos больше #4000 байтов - ;AND A - ;RET - LD A,(BIG_SHELL) - OR A - RET Z - ; - XOR A - LD (BIG_SHELL),A - PUSH HL - CALL NSECTOR - LD DE,#20 ; !HARDCODE кол-во прочитанных секторов - AND A - ADD IX,DE - JR NC,.no_inc_hl - INC HL -.no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE кол-во ДОзагружаемых секторов - LD DE,#4000 - JR .set_drv - ; -.SMALL_CLUSTER: LD B,A - LD A,(BANKDOS) - EX AF,AF' - LD A,(DRIVE) - RST ToBIOS_18 - JP C,GOOD_DRIVE.NoShell - ; - LD HL,(READMEM) - LD DE,(CLU_LEN) - ADD HL,DE - LD (READMEM),HL - ; [ ] загрузка system.dos больше #4000 байтов - ;POP HL - ;RET C - CALL C,.more_than_1 - POP HL - RET C - ; - CALL R_F_FAT ; next cluster in chain - RET C - EX DE,HL - JP .LD_FILE - ; [ ] загрузка system.dos больше #4000 байтов -.more_than_1: LD A,(BIG_SHELL) - OR A - SCF - RET Z - IN A,(SLOT1) - LD HL,BANKDOS - CP (HL) - CCF - RET Z - LD (BANKDOS),A - LD HL,#C000 - LD (READMEM),HL - LD A,(BOOT.SectorsPerCluster) - SUB SUBLOAD_SIZE + 1 - CCF - RET NC - LD A,SUBLOAD_SIZE - LD (BOOT.SectorsPerCluster),A - AND A - RET - ; @@ -906,7 +912,7 @@ DISKH EQU VALUE+48 DISKL EQU VALUE+50 READMEM EQU VALUE+52 ;SHEL_FM EQU VALUE+54 -BIG_SHELL EQU VALUE+54 +BIG_CORE EQU VALUE+54 BANKDOS EQU VALUE+55 ; EQU VALUE+56 diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index f1a82d6..d256392 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -28,8 +28,8 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE EXX LD E,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера LD D,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - OR D OR E + OR D ; EX AF,AF' OUT (SLOT3),A @@ -327,7 +327,14 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; Вход: HL - Номер первой ячейки кластера в блоке фата ; Портить только HL и A SET_FAT32_CACHE_BLOCK_CHANGED_REGION: - LD A,H + DEC HL + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x16 + 1 + JR C,.start + DEC HL + DEC HL + ; +.start: LD A,H AND #38 LD HL,#0108 JR Z,.set_region @@ -391,6 +398,7 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; SET_PAGE_X FATPAGE EXX PUSH HL + AND A PUSH AF PUSH DE ; младший номер кластера который вписать ; [x] 2/12/23 FAT не всегда мог записаться на HDD @@ -407,17 +415,21 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D - ; -.exit: ; [ ] ускорение работы с кэшем FAT +.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 - ;XOR A - ;INC A - ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + LD A,#FF + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ; + ENDIF ; CF = 0 RET ; @@ -672,13 +684,17 @@ 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 @@ -735,6 +751,7 @@ WRITE_FAT_TABLE: POP AF DJNZ .region_loop RET + ENDIF ;----------------------------------------------------------------------- ; ;[x] fat32 ;!TEST diff --git a/DSS/build.txt b/DSS/build.txt index a8a24cb..1c4af3a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -959 \ No newline at end of file +972 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 2461fc3..815195c 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -29,6 +29,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE USE_FSINFO_FAT32 1 ; недоделано. А нужно ли? DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 + DEFINE FAST_FAT_CASHE 0 ; !FIXIT баги при стирании SERVICE_SECTORS: .FAT12 EQU #0FEF