diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 92ba73d..e251750 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -227,8 +227,6 @@ PORTAL.out_MAIN: ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; -; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; -; ;R01 ; Area for boot sector BootSector. @@ -236,61 +234,12 @@ PORTAL.out_MAIN: ; ; end boot sector ;R01 -; Первый старт системы, после инициализации адрес в таблице меняется на VERSION -F_START: DI - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - ;LD (.saveDRV),A - LD H,A - LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве - ; +; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; +; - ;R12 - LD C,BIOS.DRV_VERSION - RST ToBIOS - JR C,.err_oldBIOS - EX DE,HL - LD DE,MINIMUM_BIOS_VERSION - SBC HL,DE - JR NC,.good - LD A,(.saveDRV+1) - CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 - JR NC,.err_oldBIOS - LD HL,#C9AF ; XOR A : RET opcodes - LD (DRV_CONTENT + INITDVC.if_old),HL ;!!!!!! - ; - -.good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения - RET C ;R10 - CALL KEYBOARD_INIT - CALL PRINT_INIT - LD C,Dss.Mouse.Init - RST ToDSS.Mouse - LD A,(VMODE) - LD C,Dss.Mouse.SetVideoMode - RST ToDSS.Mouse - ;CALL INITDVC ;R05 - ;R05 - LD C,Dss.DRV.Init - RST ToDSS.DRV - LD (LDRIVE),A - ;R05 -.saveDRV+1: - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - LD HL,0 ; H - номер устройства, L - номер раздела на устройстве - ;LD A,H - ;LD A,0 - ; - LD B,1 - CALL BOOTDSK - RET C - ; - EI - ;Set new address fn. VERSION - LD HL,ADRST10 - LD (HL),low VERSION ;R03 - INC H - LD (HL),high VERSION ;R03 +; +CLEAR_BUFFER_AND_INIT_PROC: ;------[CLEAR BUFFERS]------; ;R07 ;R11 LD HL,CLEAR_ZONE.start @@ -304,7 +253,6 @@ F_START: DI LD (HL),'.' ;R11 ;---------------------------; - ;R02 ;LD B,#FF ;INIT ENVIRONMENT CALL INITENV @@ -313,18 +261,7 @@ F_START: DI ENDIF ;R02 JP VERSION - - ;R12 -.err_oldBIOS: - LD HL,.err_oldBIOS_message - ;LD C,Dss.PChars - ;RST ToDSS - CALL PCHARS - SCF - RET -.err_oldBIOS_message: - DZ "\r\nWARNING! This version of DSS requires BIOS v2.55 or later to boot from IDE." - ; + ;R03 ;R07Allocate memory @@ -524,9 +461,76 @@ SECBUF EQU BUFFER ; - ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; ; !!!!! эта процедура затрётся после исполнения +; Первый старт системы, после инициализации адрес в таблице меняется на VERSION +F_START: DI + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;LD (.saveDRV),A + LD H,A + LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве + ; + + ;R12 + LD C,BIOS.DRV_VERSION + RST ToBIOS + JR C,.err_oldBIOS + EX DE,HL + LD DE,MINIMUM_BIOS_VERSION + SBC HL,DE + JR NC,.good + LD A,(.saveDRV+1) + CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55 + JR NC,.err_oldBIOS + LD HL,#C9AF ; XOR A : RET opcodes + LD (DRV_CONTENT + INITDVC.if_old),HL ;!!!!!! + ; + +.good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения + RET C ;R10 + CALL KEYBOARD_INIT + CALL PRINT_INIT + LD C,Dss.Mouse.Init + RST ToDSS.Mouse + LD A,(VMODE) + LD C,Dss.Mouse.SetVideoMode + RST ToDSS.Mouse + ;CALL INITDVC ;R05 + ;R05 + LD C,Dss.DRV.Init + RST ToDSS.DRV + LD (LDRIVE),A + ;R05 +.saveDRV+1: + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD HL,0 ; H - номер устройства, L - номер раздела на устройстве + ;LD A,H + ;LD A,0 + ; + LD B,1 + CALL BOOTDSK + RET C + ; + EI + ;Set new address fn. VERSION + LD HL,ADRST10 + LD (HL),low VERSION ;R03 + INC H + LD (HL),high VERSION ;R03 + JP CLEAR_BUFFER_AND_INIT_PROC + ; + ;R12 +.err_oldBIOS: + LD HL,.err_oldBIOS_message + ;LD C,Dss.PChars + ;RST ToDSS + CALL PCHARS + SCF + RET +.err_oldBIOS_message: + DZ "\r\nWARNING! This version of DSS requires BIOS v2.55 or later to boot from IDE." + ; + DEPLOY: ;Allocate memory LD BC,USING_MEMPAGES*256 + BIOS.GetMem RST ToBIOS diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index e882438..78187a5 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -526,8 +526,13 @@ RD_BPB: LD C,SLOT3 ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; ADD HL,DE ; - LD (FatBuffer.FAT1_SEC_L),HL ; first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL ; first sector FAT #2 + LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + ;[ ] fat32 ;!FIXIT + LD DE,0 + LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 + LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 + ; ; LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 6b3f4a0..cdb6ce8 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -29,7 +29,7 @@ G_CLUST: ; [x] fat32 IF _FAT32_ENABLE LD A,(FatBuffer.FAT_TYPE) - XOR 32 + XOR FAT_TYPE.x32 CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER ENDIF ; @@ -73,22 +73,22 @@ INC_FAT: RET ;RX01 -;----------------------------------------------------------- +;------------------------------------------------------------------------------------------------ ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl - номер кластера (младшее слово) ; hl' - номера кластера (старшее слово. только для FAT32) ; выход: hl - номер кластера (младшее слово) ; hl' - номера кластера (старшее слово) -; de - номер след. кластера (младшее слово. если 0, то кластер hl свободен) -; de' - номер след. кластера (старшее слово. если 0, то кластер hl' свободен) +; de - номер след. кластера (младшее слово) +; de' - номер след. кластера (старшее слово) +; если DE':DE = 0, то кластер HL':HL свободен ; CF - конец цепочки -;!FIXIT далее заточка на то, что в DE всегда 0 - файл не больше 2Gb -;----------------------------------------------------------- -;[ ] fat32 +;------------------------------------------------------------------------------------------------ +;[x] fat32 ;!TEST READ_FROM_FAT: ;[x] fat32 LD A,(FatBuffer.FAT_TYPE) - XOR 32 + XOR FAT_TYPE.x32 JR NZ,.low ; Z=0 проверяем младшее слово номера кластера ; проверяем старшее слово номера кластера ; !FIXIT fat32 проверять оба слова FAT_Max_Cluster @@ -101,7 +101,7 @@ READ_FROM_FAT: EXX LD A,DSS_Error.sys.DISK_FULL RET C - JP NZ,.correct_cluster ; если FAT_Max_Cluster_H - IX != 0, то кластер корректный + JP NZ,.correct_cluster ; если FAT_Max_Cluster_H - hl' != 0, то кластер корректный ; ; проверяем младше слово номера кластера .low: EX DE,HL @@ -118,7 +118,7 @@ READ_FROM_FAT: PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYPE) - CP 16 ; fat16 + CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 ; fat16, просто читать след. номер @@ -127,11 +127,13 @@ READ_FROM_FAT: INC HL LD D,(HL) ; - POP AF + LD HL,SERVICE_SECTORS.FAT16 +.exit: POP AF OUT (SLOT3),A - LD HL,#FFEF ;!HARDCODE -.exit: XOR A ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR - SBC HL,DE ; проверка на служ. кластеры + ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR + XOR A + ; проверка на служ. кластеры + SBC HL,DE POP HL ; [x] fat32 EXX @@ -146,12 +148,8 @@ READ_FROM_FAT: LD E,(HL) INC HL LD D,(HL) - JR C,.Correct_1 - LD A,D - AND #0F - LD D,A - JR .Correct_2 - ; + LD HL,SERVICE_SECTORS.FAT12 + JR NC,.Correct_2 .Correct_1: LD A,E AND #F0 @@ -160,23 +158,60 @@ READ_FROM_FAT: RRA EDUP LD E,A -.Correct_2: - POP AF - OUT (SLOT3),A - LD HL,#0FEF JR .exit ; -.FAT32: ; [ ] fat32 +.Correct_2 + LD A,D + AND #0F + LD D,A + JR .exit + ; +.FAT32: ; [x] fat32 ;!TEST + EXX + PUSH HL + EXX + ; CALL GET_FAT32_CELL - DI - HALT + ; прочитать младшее слово номера кластера + LD E,(HL) + INC HL + LD D,(HL) + INC HL + ; прочитать старшее слово номера кластера + LD A,(HL) + INC HL + EX AF,AF' + LD A,(HL) + EXX + AND #0F + LD D,A + EX AF,AF' + LD E,A + EXX + ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR + XOR A + ; проверка на служ. кластеры младшего слова кластера + LD HL,SERVICE_SECTORS.FAT32.Low + SBC HL,DE + ; проверка на служ. кластеры старшего слова кластера + EXX + LD HL,SERVICE_SECTORS.FAT32.High + SBC HL,DE + POP HL + EXX + ; + POP BC + LD A,B + OUT (SLOT3),A RET -;----------------------------------------------------------- +;------------------------------------------------------------------------------------------------ ; Записать в кеш FAT-а номер кластера -; вход: hl = номер кластера в который записать -; de = номер кластера который вписать +; вход: hl = младшее слово номера кластера в который записать +; hl' = старшее слово номера кластера в который записать (только для fat32) +; de = младшее слово номера кластера которое вписать +; de' = старшее слово номера кластера которое вписать (только для fat32) ; выход: такой же как и вход -;----------------------------------------------------------- +;------------------------------------------------------------------------------------------------ ; [ ] fat32 WRITE_TO_FAT: PUSH DE @@ -193,22 +228,22 @@ WRITE_TO_FAT: EXX PUSH HL PUSH AF + PUSH DE ; de = номер кластера который вписать ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,1 ;LD (FatCache.Update),A ; LD A,(FatBuffer.FAT_TYPE) - CP 16 ; fat16 + CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 ; -.FAT16: PUSH DE - CALL GET_FAT16_CELL - POP DE +.FAT16: CALL GET_FAT16_CELL + POP DE ; de = номер кластера который вписать LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера LD (HL),D - POP AF ; восст. порт +.exit: POP AF ; восст. порт POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD @@ -219,9 +254,8 @@ WRITE_TO_FAT: RET ; .FAT12: ;!FIXIT переделать на переменные FAT_CACHE - PUSH DE CALL GET_FAT12_CELL - POP DE + POP DE ; de = номер кластера который вписать JR C,.Correct_1 ; номер нечётный LD (HL),E INC HL @@ -229,15 +263,8 @@ WRITE_TO_FAT: AND #F0 OR D LD (HL),A - POP AF - POP HL - OUT (SLOT3),A - ; [x] 2/12/23 FAT не всегда мог записаться на HDD - XOR A - INC A - LD (FatCache.Update),A - ; CF = 0 - RET + JR .exit + ; .Correct_1: ; влево на 4 битa EX DE,HL @@ -267,15 +294,22 @@ WRITE_TO_FAT: ; CF = 0 RET .FAT32: ; [ ] fat32 + CALL GET_FAT32_CELL + POP DE ; de = номер кластера который вписать + LD (HL),E ; сохр. в кеше FAT-а + INC HL ; номер кластера + LD (HL),D + + DI HALT + + ;RE_FAT: ;RX01 ; Прочитать в кеш ХХ секторов FAT-а -; [ ] fat32 - //; A - NEW FAT BLOCK +; [ ] fat32 ;!TEST ; DE - NEW FAT BLOCK -; READ_FAT_TABLE: PUSH HL ; [x] fat32 @@ -297,24 +331,29 @@ READ_FAT_TABLE: EX DE,HL ; LD (FatCache.Block),HL - LD (FatCache.Update),A + ;LD (FatCache.Update),A ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT - DUP FAT_CACHE.Degree_16 + DUP FAT_CACHE.Degree ; 4 ADD HL,HL ;x2 EDUP LD DE,(FatBuffer.FAT1_SEC_L) + ; номер лог. сектора ADD HL,DE EX DE,HL - ; - LD XH,D - LD XL,E - ;LD IX,0 - ;ADD IX,DE ; номер лог. сектора - ; - LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING - LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS + LD XH,D + LD XL,E + LD HL,(FatBuffer.FAT1_SEC_H) + LD DE,0 + ADC HL,DE + ; HL:IX - SECTOR FAT FOR READING + LD B,FAT_CACHE.Sectors_16 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.nxt + LD B,FAT_CACHE.Sectors_32 +.nxt: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска - LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE + LD C,Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE RST ToDSS.DRV POP HL RET @@ -333,13 +372,13 @@ WRITE_FAT_TABLE: ; ;LD H,0 ;FAT BLOCK * 16 = SECTOR OF FAT - DUP FAT_CACHE.Degree_16 + DUP FAT_CACHE.Degree ADD HL,HL ;x2 EDUP ; HL - номер лог. сектора LD B,H LD C,L ;BC - BLOCK OF FAT - LD DE,FAT_CACHE.Sectors + LD DE,FAT_CACHE.Sectors_16 ADD HL,DE ;+ SIZE CASH (16 SECTORS) LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT @@ -347,7 +386,7 @@ WRITE_FAT_TABLE: SBC HL,DE JR C,.WALLFAT EX DE,HL - LD HL,FAT_CACHE.Sectors + LD HL,FAT_CACHE.Sectors_16 ; CF = 0 SBC HL,DE JR C,.ERR @@ -499,7 +538,7 @@ GET_FAT12_CELL: PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; - IF FAT_CACHE.Size < #2000 + IF FAT_CACHE.Size_12 < #2000 ;!FIXIT оптимизировать LD A,H LD B,H @@ -1093,8 +1132,8 @@ SaveGotCluster: LD A,C FatCache: ;WORD #0000 -.Block WORD #0000 ;EQU FatCache -.Update BYTE 0 ;EQU FatCache+1 +.Block WORD #0000 +.Update BYTE 0 FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm index 054fcbd..34d5cdf 100644 --- a/DSS/FS/FAT/FAT32.asm +++ b/DSS/FS/FAT/FAT32.asm @@ -32,12 +32,47 @@ CHECK_INC_HIGH_CLUSTER: ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;----------------------------------------------------------------------- -;вход: DE:HL - номер кластера +;вход: HL':HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE +; +;[x] fat32 ;!TEST GET_FAT32_CELL: - ;[ ] fat32 - DI - HALT + ; двигаем влево HL':H + LD A,H + EXX + LD C,A + LD A,H + AND FAT_CACHE.Size_Mask_32 ; #0F + LD H,A + LD A,C + ; + LD B,FAT_CACHE.Degree_32 ; 4 сдвига +.loop_block: + RLCA ; << H + RL L ; << L' + RL H ; << H' + DJNZ .loop_block + EXX + ; В итоге тут в HL' номер блока FAT + ; + ; HL - FAT32 OFFSET (FROM CASH) + LD A,H + AND FAT_CACHE.Size_Mask_32 ; #0F + LD H,A + ADD HL,HL + ADD HL,HL + PUSH HL ; сохраняем на случай, если READ_FAT_TABLE испортит + AND A + ; + EXX + EX DE,HL + LD HL,(FatCache.Block) ; BC - BLOCK FAT IN CASH + SBC HL,DE + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + POP HL + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + RET ; FOR 8192 bytes cache ; 1 073 741 824 bytes max fat32 size diff --git a/DSS/build.txt b/DSS/build.txt index cebfe35..b475567 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -946 \ No newline at end of file +945 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 4484ee0..2b165fe 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -21,6 +21,17 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE _FAT32_ENABLE 1 ;!TODO пока недоделано +SERVICE_SECTORS: +.FAT12 EQU #0FEF +.FAT16 EQU #FFEF +.FAT32.High EQU #0FFF +.FAT32.Low EQU #FFEF + +FAT_TYPE: +.x32 EQU 32 +.x16 EQU 16 +.x12 EQU 12 +/* define _bit (1