From 4da5e6c35027b446053f61b8a37718b460eaef08 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:25:12 +1000 Subject: [PATCH] prepare for FAT "big dir" support --- DSS/API/Attribute.asm | 1 + DSS/API/Close.asm | 165 +++++++++--------- DSS/API/Create.asm | 5 +- DSS/API/Environ.asm | 2 +- DSS/API/Find.asm | 88 +++++----- DSS/API/Open.asm | 133 ++++++++++---- DSS/API/SetVMod.asm | 4 +- DSS/DSS-MAIN.ASM | 10 +- DSS/FS/FAT.asm | 391 +++++++++++++++++++++++++----------------- DSS/KEYINTER.ASM | 2 +- DSS/Structures.inc | 3 +- DSS/defines.inc | 184 ++++++++++---------- DSS/first_init.asm | 5 +- Shared_Includes | 2 +- 14 files changed, 571 insertions(+), 424 deletions(-) diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 8b7ac2c..6c19ad9 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -37,6 +37,7 @@ ATTRIB: ; Current Dir ;[x] 15/10/23 XOR A LD (OPEN_FN.TMP),A CALL .OPENATR ;R002 + ; DE = record index CALL NC,OPEN_FN.FM ; POP BC diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index e39e794..33db8a2 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -6,86 +6,87 @@ ;Выходные значения: ; A - код ошибки, если CF=1 //////////////////////////////////////////////////////////////////////// -CLOSE_FN: -;R008 ; -;CLOSE: ; - LD (.TMP),A - CALL SET_FM - RET C - LD A,(TASK) - CP (IY+_sFM.TASK_NUM) - LD A,DSS_Error.sys.ACCESS_DENIED - SCF - RET NZ - BIT 7,(IY+_sFM.ACCESS_MODE) - JR Z,.NOTMODF - ; - LD E,(IY+_sFM.DIR_CLUSTER_L) - LD D,(IY+_sFM.DIR_CLUSTER_L+1) - PUSH DE - ; [x] fat32 - LD E,(IY+_sFM.DIR_CLUSTER_H) - LD D,(IY+_sFM.DIR_CLUSTER_H+1) - PUSH DE - ; - ; [x] 15/11/2023 -bug with bad clusters ;!TEST - LD A,(IY+_sFM.DRIVE) - CALL OPENDSK - JR C,.error - ; - XOR A - CALL SET_FM - ; [x] fat32 - POP DE - LD (IY+_sFM.DIR_CLUSTER_H),E - LD (IY+_sFM.DIR_CLUSTER_H+1),D - LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),E - LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),D - ; - POP DE - LD (IY+_sFM.DIR_CLUSTER_L),E - LD (IY+_sFM.DIR_CLUSTER_L+1),D - ; [x] 15/11/2023 -bug with bad clusters ;!TEST - LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E - LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D - ; - CALL LOADDIR -.TMP+1: LD A,0 - CALL SET_FM - ; - SET_PAGE_X DIRPAGE - ; - ;!TEST 9/11/23 record index - ; LD HL,DIR - ; LD DE,FAT_DIRECTORY_RECORD - ; LD C,(IY+_sFM.HANDLE) - ; LD B,(IY+_sFM.HANDLE+1) - ; JR .CLOSE2 - ; .CLOSE1: - ; ADD HL,DE - ; DEC BC - ; .CLOSE2: - ; LD A,B - ; OR C - ; JR NZ,.CLOSE1 - LD L,(IY+_sFM.HANDLE) - LD H,(IY+_sFM.HANDLE+1) - ; - LD D,YH - LD E,YL - EX DE,HL - ;PUSH HL - ;SET_PAGE_X DIRPAGE - ;POP HL - LD BC,FAT_DIRECTORY_RECORD - LDIR - OUT (SLOT3),A - CALL SAVEDIR -.NOTMODF: - LD A,(.TMP) - JP RES_FM - ; -.error: POP DE - POP DE - RET +;CLOSE: +CLOSE_FN: LD (.TMP),A + CALL SET_FM + RET C + LD A,(TASK) + CP (IY+_sFM.TASK_NUM) + LD A,DSS_Error.sys.ACCESS_DENIED + SCF + RET NZ + BIT 7,(IY+_sFM.ACCESS_MODE) + JR Z,.NOTMODF + ; + ; файл изменён + LD E,(IY+_sFM.DIR_CLUSTER_L) + LD D,(IY+_sFM.DIR_CLUSTER_L+1) + PUSH DE + LD E,(IY+_sFM.DIR_CLUSTER_H) + LD D,(IY+_sFM.DIR_CLUSTER_H+1) + PUSH DE + ; + ; [x] 15/11/2023 -bug with bad clusters ;!TEST + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + JR C,.error + ; + XOR A + CALL SET_FM + ; [x] fat32 + POP DE + LD (IY+_sFM.DIR_CLUSTER_H),E + LD (IY+_sFM.DIR_CLUSTER_H+1),D + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),E + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),D + ; + POP DE + LD (IY+_sFM.DIR_CLUSTER_L),E + LD (IY+_sFM.DIR_CLUSTER_L+1),D + ; [x] 15/11/2023 -bug with bad clusters ;!TEST + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D + ; + CALL LOADDIR + ; [ ] big dir + ;!TODO отмотать кэш до нужного record index? + ; +.TMP+1: LD A,0 + CALL SET_FM + ; + SET_PAGE_X DIRPAGE + EX AF,AF' + ; [ ] big dir + ;!TEST 9/11/23 record index + LD HL,DIRPAGE.buffer + LD DE,FAT_DIRECTORY_RECORD + LD C,(IY+_sFM.HANDLE) + LD B,(IY+_sFM.HANDLE+1) + JR .CLOSE2 + ; +.CLOSE1: ADD HL,DE + DEC BC +.CLOSE2: LD A,B + OR C + JR NZ,.CLOSE1 + ;LD L,(IY+_sFM.HANDLE) + ;LD H,(IY+_sFM.HANDLE+1) + ;;;;;;;;; + LD D,YH + LD E,YL + EX DE,HL + ;PUSH HL + ;SET_PAGE_X DIRPAGE + ;POP HL + LD BC,FAT_DIRECTORY_RECORD + LDIR + EX AF,AF' + OUT (SLOT3),A + CALL SAVEDIR +.NOTMODF: LD A,(.TMP) + JP RES_FM + ; +.error: POP DE + POP DE + RET ; \ No newline at end of file diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 21fa9a5..7378abd 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -86,7 +86,10 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: .PATH0+1: LD HL,0 XOR A LD (OPEN_FN.TMP),A - JP OPEN_FN.FILE ;R008 + ; DE - record index из WRT_HND + ; !FIXIT можно оптимизнуть переходом сразу на + ; выделение FM (GET_FM) + JP OPEN_FN.FILE ; .Prepare: ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE AND FAT_ATTR.NoDIRnoVolID diff --git a/DSS/API/Environ.asm b/DSS/API/Environ.asm index 4a3c1d3..1779225 100644 --- a/DSS/API/Environ.asm +++ b/DSS/API/Environ.asm @@ -274,7 +274,7 @@ ENVVALUE EQU CORE_BUFFERS.BUFFER //#3800 ; BUFFER ;DS 128 ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160 -ENVIRONMENT EQU ENVADDR +ENVIRONMENT EQU ENVPAGE.ADDR DEFAULT_ENV: DB 'BOOTDSK=' ;R02 .boot_disk: DB 'X:',0 ;R02 diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 1d1d9f1..9e6b1bf 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -31,6 +31,7 @@ F_FIRST: CALL .INIT_VARS LD A,(.SEARCH_ATTRIBUT) CALL SEARCH.Custom RET C + PUSH DE ; record index может и не нужно LD HL,CORE_BUFFERS.MASKARE .DTABUF+1: LD DE,0 LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; копируем .NAME и .EXT @@ -38,11 +39,19 @@ F_FIRST: CALL .INIT_VARS .SEARCH_ATTRIBUT+1: LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT LD (DE),A + ; при прыжке сюда на стеке должен лежать record index .FIND_S: INC DE ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes LD BC,FAT_DIRECTORY_RECORD ADD IX,BC LD (F_NEXT.CURHND),IX + ; record index может и не нужно + POP HL + ;!FIXIT нет проверки на переполнение + ; надеемся, что FAT без косяков + INC HL + LD (F_NEXT.RecordIndex),HL + ; LD HL,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT LDIR @@ -79,43 +88,44 @@ F_FIRST: CALL .INIT_VARS F_NEXT: .NO_NEXT.YES EQU 0 .NO_NEXT.NO EQU #FF -.NO_NEXT+1: - LD A,0 - OR A - LD A,DSS_Error.sys.INVALID_ACCESS - SCF - RET Z - LD (F_FIRST.DTABUF),DE - EX DE,HL - LD DE,CORE_BUFFERS.MASKARE - LD BC,11 ;!HARDCODE - LDIR - - XOR A ; F_NEXT.NO_NEXT.YES - LD (F_NEXT.NO_NEXT),A - - LD A,(HL) - PUSH HL - CALL .NSEARCH - POP DE - RET C - JP F_FIRST.FIND_S -.NSEARCH: - EX AF,AF' - SET_PAGE_X DIRPAGE - ;PUSH AF - EX AF,AF' - CPL - LD C,A - ;!TEST 9/11/23 record index - ; EXX - ; LD DE,0 - ; EXX - ; -.CURHND+2: - LD IX,0 - LD A,XH - OR XL - JP Z,SEARCH.error_too_many_files - JP SEARCH.loop +.NO_NEXT+1: LD A,0 + OR A + LD A,DSS_Error.sys.INVALID_ACCESS + SCF + RET Z + ; + LD (F_FIRST.DTABUF),DE + EX DE,HL + LD DE,CORE_BUFFERS.MASKARE + LD BC,11 ;!HARDCODE + LDIR + ; + XOR A ; F_NEXT.NO_NEXT.YES + LD (F_NEXT.NO_NEXT),A + LD A,(HL) + PUSH HL + CALL .NSEARCH + POP HL + RET C + ; + PUSH DE + EX DE,HL + JP F_FIRST.FIND_S + ; +.NSEARCH: EX AF,AF' + SET_PAGE_X DIRPAGE + ;PUSH AF + EX AF,AF' + CPL + LD C,A + ;!TEST 9/11/23 record index + EXX +.RecordIndex+1: LD DE,0 ; record index может и не нужно + EXX + ; +.CURHND+2: LD IX,0 ; адрес следующей записи в кэше директории + LD A,XH + OR XL + JP Z,SEARCH.error_too_many_files ; [ ] big dir + JP SEARCH.loop ; \ No newline at end of file diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index ed6c7e8..75d4aeb 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -13,7 +13,7 @@ ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 - ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO + ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO LD (.TMP),A PUSH HL CALL DIR_PATH_CHECK.forceCheck @@ -28,15 +28,20 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 RET C .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C -;R002 ;!TEST 9/11/23 record index -.FM: PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) ; - CALL GET_FM ; enter point from ATTRIB - RET C - LD A,C - EX AF,AF' +.FM: ; enter point from ATTRIB +;R002 ;!TEST 9/11/23 record index + PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) + ; + CALL GET_FM ;!TEST 9/11/23 record index указатель на запись в каталоге FS POP DE + ; + RET C + LD A,C ; дескриптор файла + EX AF,AF' + ;!TEST 9/11/23 record index указатель на запись в каталоге FS + ;POP DE ; EXX LD (IY+_sFM.HANDLE),E LD (IY+_sFM.HANDLE+1),D @@ -49,43 +54,95 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 LDIR .TMP+1: LD A,0 LD (IY+_sFM.ACCESS_MODE),A - LD A,(TASK) - LD (IY+_sFM.TASK_NUM),A - ;!FIXIT оптимизнуть тут зануление + ; оптимизнул тут + ;LD A,(TASK) + ;LD (IY+_sFM.TASK_NUM),A + ;XOR A + ;LD (IY+_sFM.OptimizedClusters),A + ;LD (IY+_sFM.KnownCluster_L),A + ;LD (IY+_sFM.KnownCluster_L+1),A + ;LD (IY+_sFM.KnownOffset_L),A + ;LD (IY+_sFM.KnownOffset_L+1),A + ;; fat32 + ; LD (IY+_sFM.KnownCluster_H),A + ; LD (IY+_sFM.KnownCluster_H+1),A + ; LD (IY+_sFM.KnownOffset_H),A + ; LD (IY+_sFM.KnownOffset_H+1),A + ;; + ;LD (IY+_sFM.F_POSITION),A + ;LD (IY+_sFM.F_POSITION+1),A + ;LD (IY+_sFM.F_POSITION+2),A + ;LD (IY+_sFM.F_POSITION+3),A + ;LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) + ;LD (IY+_sFM.DRIVE),A + ;; fat32 + ;LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H + ;LD E,(HL) + ;INC HL + ;LD D,(HL) + ;LD (IY+_sFM.DIR_CLUSTER_H),E + ;LD (IY+_sFM.DIR_CLUSTER_H+1),D + ;; + ;LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM + ;LD E,(HL) + ;INC HL + ;LD D,(HL) + ;LD (IY+_sFM.DIR_CLUSTER_L),E + ;LD (IY+_sFM.DIR_CLUSTER_L+1),D + ; + PUSH IY + POP HL + LD DE,_sFM.F_POSITION + ADD HL,DE XOR A - LD (IY+_sFM.OptimizedClusters),A - LD (IY+_sFM.KnownCluster_L),A - LD (IY+_sFM.KnownCluster_L+1),A - LD (IY+_sFM.KnownOffset_L),A - LD (IY+_sFM.KnownOffset_L+1),A - ; fat32 - LD (IY+_sFM.KnownCluster_H),A - LD (IY+_sFM.KnownCluster_H+1),A - LD (IY+_sFM.KnownOffset_H),A - LD (IY+_sFM.KnownOffset_H+1),A + LD (HL),A ; _sFM.F_POSITION + INC HL + LD (HL),A ; _sFM.F_POSITION + 1 + INC HL + LD (HL),A ; _sFM.F_POSITION + 2 + INC HL + LD (HL),A ; _sFM.F_POSITION + 3 + INC HL ; - LD (IY+_sFM.F_POSITION),A - LD (IY+_sFM.F_POSITION+1),A - LD (IY+_sFM.F_POSITION+2),A - LD (IY+_sFM.F_POSITION+3),A + EX DE,HL + LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L + LDI ; _sFM.DIR_CLUSTER_L + LDI ; _sFM.DIR_CLUSTER_L + 1 + LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H + LDI ; _sFM.DIR_CLUSTER_H + LDI ; _sFM.DIR_CLUSTER_H + 1 + EX DE,HL + ; + INC HL + INC HL LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - LD (IY+_sFM.DRIVE),A - ; fat32 - LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H - LD E,(HL) + LD (HL),A ; _sFM.DRIVE INC HL - LD D,(HL) - LD (IY+_sFM.DIR_CLUSTER_H),E - LD (IY+_sFM.DIR_CLUSTER_H+1),D - ; - LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM - LD E,(HL) INC HL - LD D,(HL) - LD (IY+_sFM.DIR_CLUSTER_L),E - LD (IY+_sFM.DIR_CLUSTER_L+1),D + LD A,(TASK) + LD (HL),A ; _sFM.TASK_NUM + INC HL ; + XOR A + LD (HL),A ; _sFM.OptimizedClusters + INC HL + LD (HL),A ; _sFM.KnownCluster_L + INC HL + LD (HL),A ; _sFM.KnownCluster_L + 1 + INC HL + LD (HL),A ; _sFM.KnownCluster_H + INC HL + LD (HL),A ; _sFM.KnownCluster_H + 1 + INC HL + LD (HL),A ; _sFM.KnownOffset_L + INC HL + LD (HL),A ; _sFM.KnownOffset_L + 1 + INC HL + LD (HL),A ; _sFM.KnownOffset_H + INC HL + LD (HL),A ; _sFM.KnownOffset_H + 1 + ; ; EX AF,AF' AND A RET -; \ No newline at end of file +; diff --git a/DSS/API/SetVMod.asm b/DSS/API/SetVMod.asm index 945202d..df6d396 100644 --- a/DSS/API/SetVMod.asm +++ b/DSS/API/SetVMod.asm @@ -193,7 +193,7 @@ SAVETXT: PUSH AF LD L,#28 .SVTEXT1: LD (BACKTXT.WinMax),HL LD DE,#0000 - LD A,(BANKTBL + TXTPAGE) + LD A,((#FF00 & BANKTBL) + TXTPAGE) LD B,A LD C,BIOS.WIN_COPY @@ -229,7 +229,7 @@ BACKTXT: PUSH AF LD IX,#C000 .WinMax+1: LD HL,#2050 LD DE,#0000 - LD A,(BANKTBL + TXTPAGE) + LD A,((#FF00 & BANKTBL) + TXTPAGE) LD B,A LD C,BIOS.WIN_RESTORE ;[x] 29/9/23 diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 6982b17..e183381 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -266,6 +266,10 @@ INTx38_Handler: PUSH AF POP AF RET ; + ;BLOCK #FD-$,#FF +BANKTBL: BLOCK (USING_MEMPAGES + 2),#FF +.Size EQU $-BANKTBL + ASSERT (high(BANKTBL + USING_MEMPAGES + 2) == high(BANKTBL)), "Error! Memory leak" _mInfoALIGN 256,0 @@ -362,10 +366,10 @@ MASKARE: BLOCK 8,0 ; -BANKTBL EQU ($ & #FF00) + (1 > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < -CLEAR_ZONE.start EQU BANKTBL + BANKTBL.Size +CLEAR_ZONE.start EQU $ ;BANKTBL + BANKTBL.Size MODULE CORE_BUFFERS BUFFERSplace _sBuffers = CLEAR_ZONE.start TMPNAME EQU BUFFERSplace.TMPNAME ; +- diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index 4b6a5b3..07fe018 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -146,16 +146,16 @@ SEARCH: ;!TEST 9/11/23 record index ; оптимизация для индекса записи в списке каталога. ; Понадобится вернуть для перебора каталога > #4000 байт - ; EXX - ; LD DE,0 - ; EXX + EXX + LD DE,0 + EXX ; .loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены JR Z,.next_record - LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT) LD D,A AND C JR NZ,.next_record @@ -184,33 +184,34 @@ SEARCH: ; LD D,XH LD E,XL + ;!FIXIT может на выходе просто EXX? ;!TEST 9/11/23 record index - ; EXX - ; PUSH DE - ; EXX - PUSH IX + EXX + PUSH DE ; record index + EXX + ;PUSH IX ; LD HL,CORE_BUFFERS.HANDBUF EX DE,HL LD BC,CORE_BUFFERS.HANDBUF.SIZE LDIR - ;!TEST 9/11/23 record index - POP DE - ; + ; record index + POP DE EX AF,AF' OUT (SLOT3),A EX AF,AF' AND A RET ; -.next_record: LD DE,FAT_DIRECTORY_RECORD - ;!TEST 9/11/23 record index - ; EXX - ; INC DE - ; EXX +.next_record: ;!TEST 9/11/23 record index + EXX + INC DE + EXX ; - ADD IX,DE + LD DE,FAT_DIRECTORY_RECORD + ADD IX,DE ; [ ] big dir JR NC,.loop + ; .error_too_many_files: EX AF,AF' OUT (SLOT3),A @@ -501,8 +502,8 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF EX DE,HL LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32 LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32 - LD HL,#4000 ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL + ;LD HL,#4000 ;!HARDCODE + ;LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL ;-------------; EX DE,HL ; JP LOADDIR @@ -512,7 +513,8 @@ LOADDIR: ;!TODO optimize CALL LOAD_SAVE_DIR_PREPARE PUSH AF EX AF,AF' - JR NZ,.read_dir + JR NZ,.read_dir ; root dir or not + ; root dir LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.LoadRootDir @@ -541,16 +543,16 @@ LOADDIR: ;!TODO optimize LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 + ; LD B,A ; число секторов -.RTD1: PUSH AF ; 21/04/2025 fix мусор в странице каталога, если каталог меньше страницы - LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска +.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV ; !FIXIT нет проверки на ошибку ; 21/04/2025 fix мусор в странице каталога, если каталог меньше страницы - POP AF - JR NC,.exit + BIT 7,D + JR Z,.exit XOR A LD (DE),A ; @@ -564,42 +566,124 @@ LOADDIR: ;!TODO optimize ;----------------------------------------------------------------------; LOAD_SAVE_DIR_PREPARE: - ;!TODO optimize + ;!TODO optimize XOR A ; FILE MANIPULATOR = 0 LD H,A LD L,A LD IX,0 LD B,A ; от начала файла CALL MOVE_FP - ; + SET_PAGE_X DIRPAGE AND A - EX AF,AF' + PUSH AF ; LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) - LD (IY+_sFM.DRIVE),A - ;!FIXIT переделать на работу без IY - LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) + LD (CORE_BUFFERS.FM_BUF.DRIVE),A + ;;;;;;;; + ;LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) + ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) + ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) ; + XOR A + LD D,#40 + LD E,A + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) + EXX + LD D,A + LD E,A + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) + OR H + OR L + EXX + OR H + OR L + ;;;;;;;; + PUSH AF + CALL NZ,.CalcDirSize + ; + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE + EXX + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE + POP AF EX AF,AF' + POP AF + RET + ; +.CalcDirSize: ; calc dir size in clusters + LD DE,0 + ;LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) + ;EXX + ; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) +.loop: ; ; + ;EXX + INC DE ; Надеемся тут на то, что спецификация выполняется и переполнения не будет + PUSH DE + CALL READ_FROM_FAT + EX DE,HL + POP DE + EXX + EX DE,HL + EXX + JR NC,.loop + ; DE - размер директории в кластерах + ; + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) + ; + ; DE':DE - кол-во кластеров + ; A - размер кластера в секторах + ; BC - размер сектора в байтах + ; --> DE*BC*A = DE':DE для ответа хватит, походу, 4х регистров + EXX + LD DE,0 + EXX + SRL B + RR C + RRCA + JR C,.loop2 + ; +.loop1: ; + SLA E + RL D + EXX + RL E + RL D + ;RL C + EXX + ; + RRCA + JR NC,.loop1 + ; +.loop2: ; + SLA E + RL D + EXX + RL E + RL D + ;RL C + EXX + ; + SRL B + RR C + JR NC,.loop2 + ; <-- DE*BC*A = DE':DE RET - ;----------------------------------------------------------------------; ; скопировать запись в список диска (каталога) de ix iy ; и сбросить кеш каталога на диск -; вход: (HANDBUF) - запись каталога +; вход: (HANDBUF) - запись каталога +; выход: DE - record index WRT_HND: SET_PAGE_X DIRPAGE EX AF,AF' LD HL,DIRPAGE.buffer ;!TEST 9/11/23 record index - ; EXX - ; LD DE,0 - ; EXX + EXX + LD DE,0 + EXX ; LD BC,FAT_DIRECTORY_RECORD .loop: ;LD A,(IX+00) @@ -626,23 +710,30 @@ WRT_HND: LDIR EX AF,AF' OUT (SLOT3),A + ; проверяем, увеличился ли размер данных директории LD HL,DIRPAGE.buffer LD BC,(SAVEDIR.DIRSIZE) DEC BC ADD HL,BC AND A SBC HL,DE - JR NC,SAVEDIR + JR NC,.SAVEDIR + ; + ; размер данных директории увеличился LD HL,(SAVEDIR.DIRSIZE) LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ADD HL,BC LD (SAVEDIR.DIRSIZE),HL AND A - ;JP SAVEDIR +.SAVEDIR: EXX + PUSH DE + EXX + CALL SAVEDIR + POP DE + RET ;----------------------------------------------------------------------; ; Сбросить кеш каталога на диск. ; вход: iy=структура дескриптора -; [x] fat32 ;!TEST SAVEDIR: ;!TODO optimize CALL LOAD_SAVE_DIR_PREPARE PUSH AF @@ -920,7 +1011,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD H,A LD D,H LD E,L - ;EX DE,HL EXX LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) LD D,H @@ -930,14 +1020,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) DEC A LD B,A -; JR Z,.loop_mul_end -; ; .Number_of_FATs * .SectorsPerFAT -; .loop_mul: ADD HL,HL -; EX DE,HL -; ADC HL,HL -; EX DE,HL -; DJNZ .loop_mul - ; CALL NZ,ALL_SECTORS_PER_FATs EXX PUSH HL @@ -983,7 +1065,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD HL,65524 SBC HL,BC JR C,.its_FAT32 - ; ; It's FAT16 LD A,(.UsesVarsFAT32) AND A @@ -1021,16 +1102,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) AND #0F - ; -; JR Z,.first_FAT_active -; LD B,A -; ; -; .fat_calc_loop: ADD HL,DE -; EXX -; ADC HL,DE -; EXX -; DJNZ .fat_calc_loop - ; LD B,A CALL NZ,ALL_SECTORS_PER_FATs ; @@ -2071,118 +2142,114 @@ WRITE_FAT_TABLE: ;[x] fat32 ;!TEST ;вход: HL':HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE -GET_FAT32_CELL: - ; двигаем влево 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 ; 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 ; [x] fat32 сохраняем на случай, если READ_FAT_TABLE испортит - AND A - ; - EXX - EX DE,HL - LD HL,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; 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 -;----------------------------------------------------------------------- -;вход: HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE -GET_FAT16_CELL: - LD A,H - LD B,H - ;AND #0F - AND FAT_CACHE.Size_Mask_16 - LD H,A - LD A,B - ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) - DUP FAT_CACHE.Degree_16 - RRCA - EDUP - ;AND #0F - AND FAT_CACHE.Part_Mask_16 - ; - ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH - ; CP C - LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH - CP E - LD E,A - ; - CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT - LD DE,FATPAGE.cache ; начало кеша FAT-а - ADD HL,DE ; на ячейку FAT - RET -;----------------------------------------------------------------------- -;вход: HL - номер кластера -;выход: HL - адрес нужной ячейки в странице FATPAGE -; CF - чётный/нечётный адрес кластера -GET_FAT12_CELL: - LD D,H - LD E,L - SRL H - RR L ; сдвиг вправо через CF - PUSH AF ; сохр. флаг - ADD HL,DE ; CLUSTER * 1.5 - ; - IF FAT_CACHE.Size_12 < #1800 - ;!FIXIT оптимизировать +GET_FAT32_CELL: ; двигаем влево 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 ; 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 ; [x] fat32 сохраняем на случай, если READ_FAT_TABLE испортит + AND A + ; + EXX + EX DE,HL + LD HL,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; 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 +;----------------------------------------------------------------------- +;вход: HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +GET_FAT16_CELL: LD A,H LD B,H - ; - AND #1F - ;AND FAT_CACHE.Size_Mask_16 - ; + ;AND #0F + AND FAT_CACHE.Size_Mask_16 LD H,A LD A,B + ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + DUP FAT_CACHE.Degree_16 + RRCA + EDUP + ;AND #0F + AND FAT_CACHE.Part_Mask_16 ; - RLCA - RLCA - RLCA - ;DUP FAT_CACHE.Degree_16 - ; RRCA - ;EDUP - AND #07 - ;AND FAT_CACHE.Part_Mask_16 - ; - ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ADD HL,HL ; HL - FAT OFFSET (FROM CASH) + ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; - CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а - ENDIF - ; - LD DE,FATPAGE.cache - ADD HL,DE - POP AF - RET + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + RET +;----------------------------------------------------------------------- +;вход: HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +; CF - чётный/нечётный адрес кластера +GET_FAT12_CELL: LD D,H + LD E,L + SRL H + RR L ; сдвиг вправо через CF + PUSH AF ; сохр. флаг + ADD HL,DE ; CLUSTER * 1.5 + ; + IF FAT_CACHE.Size_12 < #1800 + ;!FIXIT оптимизировать + LD A,H + LD B,H + ; + AND #1F + ;AND FAT_CACHE.Size_Mask_16 + ; + LD H,A + LD A,B + ; + RLCA + RLCA + RLCA + ;DUP FAT_CACHE.Degree_16 + ; RRCA + ;EDUP + AND #07 + ;AND FAT_CACHE.Part_Mask_16 + ; + ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; CP C + LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH + CP E + LD E,A + ; + CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а + ENDIF + ; + LD DE,FATPAGE.cache + ADD HL,DE + POP AF + RET ;----------------------------------------------------------------------- diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 332a346..9149bf2 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -302,7 +302,7 @@ SETUP_CURSORS: ; in a,(SLOT3) push af ; сохр. порт - ld a,(BANKTBL + TXTPAGE) ; 2-й лог. номер страницы расш. ДОС + ld a,((#FF00 & BANKTBL) + TXTPAGE) ; 2-й лог. номер страницы расш. ДОС out (SLOT3),a ; ; получить сист. знакоген. diff --git a/DSS/Structures.inc b/DSS/Structures.inc index de54b83..51a6aa8 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -24,8 +24,10 @@ ;File Manipulator (FM) ;[ ] fat32 +; !!!!! из-за всяких оптимизаций сраных не менять местами ничего, только добавлять в конец STRUCT _sFM ; 54 bytes ; from FAT +.FS_REC FAT_DIRECTORY_RECORD ; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME ; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT ; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT @@ -39,7 +41,6 @@ ; .DATE: WORD #0000 ;+ #18 +24 DATE ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE -.FS_REC FAT_DIRECTORY_RECORD ; from Core .F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW diff --git a/DSS/defines.inc b/DSS/defines.inc index 46e755c..802ea96 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -1,33 +1,101 @@ -; - DEFINE TEST_FEATURE 0 -; +; Если define закомментирован, то в коде он тоже также + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; ОБЩЕЕ +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + DEFINE TEST_FEATURE 0 + DEFINE MINIMUM_EXE_VERSION 1 + DEFINE COMPILE_UNUSED_CODE 0 +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; MOUSE +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) + DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B + DEFINE MOUSE_READ_PORT_TIMEOUT 5*512 ; Костыльный тайм-аут на ожидание байта от мышки. Если = 0, то лишний код не компилится +;----------------------------------------------------; + IF MOUSE_COM_BAUD = 1 +MOUSE_BAUD: +.multiplier_1 EQU %0100'0000 ; первый множитель = 16. +.multiplier_2 EQU 22 ; второй множитель = 22. 875000/Мн1*Мн2=2485 + ELSEIF MOUSE_COM_BAUD = 2 +MOUSE_BAUD: +.multiplier_1 EQU %0000'0000 ; первый множитель = 1. +.multiplier_2 EQU 182 ; второй множитель = 182. 875000/Мн1*Мн2=4807 + ELSE +MOUSE_BAUD: +.multiplier_1 EQU %0100'0000 ; первый множитель = 16. +.multiplier_2 EQU 45 ; второй множитель = 45. 875000/Мн1*Мн2=1215 + ENDIF +;----------------------------------------------------; +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; KEYBOARD +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A + DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift. + DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C + DEFINE USE_E1_SCANCODE 0 + ;DEFINE CLASSIC_CURSOR 0 +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; DSS +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + DEFINE NeedSafePort_Y 1 + DEFINE NON_REMOVABLE_FDD 0 +;-----------------------------------------------[VERSION] +DSS_MAX_SECTOR_SIZE EQU 512 +DSS_MAX_DRIVES_AMOUNT EQU 26 +MAX_RAMDRIVES EQU 16 +MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 3.06 + DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10 + ;DEFINE TABisSPACES 0 + ;DEFINE EnoughtOnly_LF 0 +;-----------------------------------------------[^^^^^^^] +; +;-----------------------------------------------[MEMORY] + DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 + ;DEFINE OLD_SET_BANK 0 +;-----------------------------------------------[^^^^^^] + +;-----------------------------------------------[лог.номера страниц] + DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц +; кэш списка каталога +DIRPAGE EQU 0 + (low BANKTBL) +.buffer EQU #C000 +FATPAGE EQU 1 + (low BANKTBL) +.cache EQU #C000 +TXTPAGE EQU 2 + (low BANKTBL) +.ADDR EQU #C000 +ENVPAGE EQU TXTPAGE +.PATH_PNT_ARRAY EQU #FC80 +.ENVTEMP EQU #FE00 +.ADDR EQU #E400 +DRVPAGE EQU 3 + (low BANKTBL) ; - DEFINE MINIMUM_EXE_VERSION 1 +COREPAGE EQU 4 + (low BANKTBL) ; она отдельно и не с блоком выше. +;-----------------------------------------------[^^^^^^^^^^^^^^^^^^] + +DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0 +ENVIRONMENT_STRING_LENGTH EQU 255 +FMCOUNT EQU 10 ; Количество файловых манипуляторов ; +SUBLOAD_SIZE EQU 2 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; -; - DEFINE COMPILE_UNUSED_CODE 0 -; -; MOUSE - DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) - DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B - DEFINE MOUSE_READ_PORT_TIMEOUT 5*512 ; Костыльный тайм-аут на ожидание байта от мышки. Если = 0, то лишний код не компилится - -; KEYBOARD - DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A - DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift. - DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C - DEFINE USE_E1_SCANCODE 0 -; DEFINE CLASSIC_CURSOR 0 -; - -;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе - -///////////////////////////////////////////////////////////////////////////////////////////////////////////// - DEFINE CHANGE_FREE_CLU_AFTER_DEL 1 +//////////////////////////////////////////////////////////////////////// SERVICE_SECTORS: .FAT12 EQU #0FEF .FAT16 EQU #FFEF @@ -90,70 +158,4 @@ FAT_CACHE: ;.Degree_12 EQU _shift ;.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1) ;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1 -///////////////////////////////////////////////////////////////////////////////////////////////////////////// - DEFINE NeedSafePort_Y 1 -; DEFINE TABisSPACES 0 -; DEFINE EnoughtOnly_LF 0 - DEFINE NON_REMOVABLE_FDD 0 -; -DSS_MAX_SECTOR_SIZE EQU 512 -DSS_MAX_DRIVES_AMOUNT EQU 26 -MAX_RAMDRIVES EQU 16 -MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 2.55 - DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10 - -; -;-------------------[MEMORY]-------------------------; - DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 -; DEFINE OLD_SET_BANK 0 - -;---------------------[ лог.номера страниц памяти ]--------------------- - DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц -; кэш списка каталога -DIRPAGE EQU 0 -.buffer EQU #C000 -FATPAGE EQU 1 -.cache EQU #C000 -TXTPAGE EQU 2 -ENVPAGE EQU TXTPAGE -.PATH_PNT_ARRAY EQU #FC80 -.ENVTEMP EQU #FE00 -DRVPAGE EQU 3 -; -COREPAGE EQU 4 ; она отдельно и не с блоком выше. -;----------------------------------------------------------------------- -DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0 -ENVIRONMENT_STRING_LENGTH EQU 255 - -TXTADDR EQU #C000 -ENVADDR EQU #E400 -;DIR EQU #C000 -;FAT_CACHE EQU #C000 - -FMCOUNT EQU 10 ; Количество файловых манипуляторов -;HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD -;----------------------------------------------------; -; - -; -;----------------------------------------------------; - IF MOUSE_COM_BAUD = 1 -MOUSE_BAUD: -.multiplier_1 EQU %0100'0000 ; первый множитель = 16. -.multiplier_2 EQU 22 ; второй множитель = 22. 875000/Мн1*Мн2=2485 - ELSEIF MOUSE_COM_BAUD = 2 -MOUSE_BAUD: -.multiplier_1 EQU %0000'0000 ; первый множитель = 1. -.multiplier_2 EQU 182 ; второй множитель = 182. 875000/Мн1*Мн2=4807 - ELSE -MOUSE_BAUD: -.multiplier_1 EQU %0100'0000 ; первый множитель = 16. -.multiplier_2 EQU 45 ; второй множитель = 45. 875000/Мн1*Мн2=1215 - ENDIF -;----------------------------------------------------; -; - -; -;----------------------------------------------------; -SUBLOAD_SIZE EQU 2 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу -;----------------------------------------------------; +//////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/first_init.asm b/DSS/first_init.asm index 45bc434..ce017bd 100644 --- a/DSS/first_init.asm +++ b/DSS/first_init.asm @@ -78,12 +78,12 @@ DEPLOY: ;Allocate memory RST ToBIOS ; должна идти после GetMemBlkPages, чтоб вместо ; закрывашки #FF поставить страницу COREPAGE - LD HL,BANKTBL + COREPAGE + LD HL,COREPAGE + (#FF00 & BANKTBL) IN A,(SLOT0) LD (HL),A ; для API драйвера мышки LD (DRIVES_DRIVER.MOUSE_HANDLER.CorePage),A - LD A,(BANKTBL + DRVPAGE) + LD A,((#FF00 & BANKTBL) + DRVPAGE) LD (RST_0x30.drv_page),A ; POP AF @@ -113,4 +113,5 @@ DEPLOY: ;Allocate memory OUT (SLOT3),A AND A RET +.Size: EQU DEPLOY ;-----------------------------------------------------------------------; \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 4da18d5..97d5ea8 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4da18d54c12e0f2ff4183be7a1cbf5882da1bd4f +Subproject commit 97d5ea8a4b1359d49fb706f24aae6af6bb4eef66