diff --git a/DSS/API.asm b/DSS/API.asm index 5cb89d0..b5e5b61 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -96,7 +96,7 @@ ; POP BC ; JP C,NDISK11 ; LD A,B - ; LD (CORE_BUFFERS.FatBuffer.DRIVE),A + ; LD (CORE_BUFFERS.FS_Buffer.DRIVE),A ; CALL RD_BPB ; RET C ; LD A,(LDRIVE) diff --git a/DSS/API/Clear.asm b/DSS/API/Clear.asm index 85b994d..fe801f7 100644 --- a/DSS/API/Clear.asm +++ b/DSS/API/Clear.asm @@ -9,6 +9,12 @@ ; B - атрибут заполнитель ; выход: нет ;/////////////////////////////////////////////////////////////////////// -CLEAR: LD C,BIOS.LP_CLS_WIN2 - JP ToBIOS +CLEAR: LD C,A + LD A,B + LD (.shell_color),A + LD A,C + LD C,BIOS.LP_CLS_WIN2 + JP ToBIOS + ; +.shell_color: DB COLORS.CGA.INK.LGRAY ;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index def5b39..1371678 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -363,11 +363,11 @@ _TST_PROC: CALL GETMEM ; ; LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 + LD DE,CORE_BUFFERS.BUFFER+1 CALL SCOPYS LD A,#80 ;!HARDCODE cmd line size SUB B - LD (CORE_BUFFERS.SECTOR_BUFFER),A + LD (CORE_BUFFERS.BUFFER),A ; LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER ;R02 ; ! Далее стек в нулевой странице! BIOS и не DSS-MAIN не вызывать @@ -445,7 +445,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) EX DE,HL LD XH,D LD XL,E - LD HL,CORE_BUFFERS.SECTOR_BUFFER + LD HL,CORE_BUFFERS.BUFFER LD C,(HL) INC C LDIR diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index f10fdca..bd3c466 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -163,7 +163,7 @@ MKDIR: EXX POP HL ; младший номер сектора CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; секторов на кластер + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора @@ -173,7 +173,7 @@ MKDIR: ; IN A,(SLOT0) ; OUT (SLOT3),A ; ; - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ; LD BC,1*256 + Dss.DRV.Write ; RST ToDSS.DRV diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index f077c71..02bac41 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -68,7 +68,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 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.FatBuffer.DRIVE) + 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 diff --git a/DSS/API/PChars.asm b/DSS/API/PChars.asm index abad0f8..a9c3bbe 100644 --- a/DSS/API/PChars.asm +++ b/DSS/API/PChars.asm @@ -5,10 +5,26 @@ ; выход: HL - указатель на следующую строку символов ; PRINT NULL-TERMINATED CHARS STRING ;/////////////////////////////////////////////////////////////////////// -PCHARS: LD A,(HL) - INC HL - OR A - RET Z - CALL PUTCHAR - JP PCHARS -;/////////////////////////////////////////////////////////////////////// \ No newline at end of file +; PCHARS: LD A,(HL) +; INC HL +; OR A +; RET Z +; CALL PUTCHAR +; JP PCHARS +;/////////////////////////////////////////////////////////////////////// +PCHARS: XOR A ; no attr-mode + LD A,(CLEAR.shell_color) + LD B,A + EX AF,AF' + XOR A ; no XY-mode + LD C,BIOS.LP_PR_LINE_DIR + LD IY,0 ; YH = YL = B + JP ToBIOS +;/////////////////////////////////////////////////////////////////////// +; A - атрибуты выводимого символа если CF' +; CF - XY-mode +; DE - место символа в окне, если CF=1 +; HL - адрес с выводимой строкой +; B - цвет консоли (используется при скролле и очистке окна) +; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны +; CF' - выводить символ с атрибутами \ No newline at end of file diff --git a/DSS/API/PutChar.asm b/DSS/API/PutChar.asm index 13cf58b..49e9f79 100644 --- a/DSS/API/PutChar.asm +++ b/DSS/API/PutChar.asm @@ -4,95 +4,124 @@ ; вход: A - символ ; выход: нет ;/////////////////////////////////////////////////////////////////////// -PUTCHAR: ;CALL .NO_SCROLL - CP #0E - JR C,.control_characters +; PUTCHAR: ;CALL .NO_SCROLL +; CP #0E +; JR C,.control_characters +; ; +; LD BC,1*256 + BIOS.LP_PRINT_SYM +; ;[x] CR+LF+SCROLL +; RST ToBIOS +; ; +; ; проверка на переход курсора в самое начало (X:Y == 0:0) +; CALL CURSOR +; LD A,D +; OR E +; RET NZ +; ; +; .LFF: PUSH HL +; LD BC,1*256 + BIOS.LP_SCROLL_UD +; LD DE,#0020 +; RST ToBIOS +; LD DE,#1F00 +; CALL LOCATE +; LD A,' ' +; LD BC,#50*256 + BIOS.LP_PRINT_SYM +; RST ToBIOS +; LD DE,#1F00 +; CALL LOCATE +; POP HL +; RET +; .TB_: CALL CURSOR +; IF TABisSPACES +; LD B,E +; LD A,E +; AND #F8 +; ADD A,8 +; SUB B +; LD B,A +; LD A,' ' +; LD C,BIOS.LP_PRINT_SYM +; JP ToBIOS +; ELSE +; LD A,E +; ADD A,8 +; AND #78 ;????? глянуть, что будет если координаты курсора в конце строки почти +; LD E,A +; JP LOCATE +; ENDIF +; .BK_: CALL CURSOR +; XOR A +; CP E +; RET Z +; DEC E +; JP LOCATE +; ; +; .LF_: CALL CURSOR +; LD A,D +; CP #1F +; JR NC,.LFF +; INC D +; IFN EnoughtOnly_LF +; JP LOCATE +; ELSE +; CALL LOCATE +; ; !!!! НЕ разрывать LF_ и CR_ !!!! +; ENDIF +; .CR_: CALL CURSOR +; LD E,0 +; JP LOCATE +; ; +; .control_characters: +; CP "\r" +; JR Z,.CR_ +; CP "\n" +; JR Z,.LF_ +; CP "\t" ; tab +; JR Z,.TB_ +; CP "\b" ; backspace +; JR Z,.BK_ +; CP "\a" ; [x] Beep in PChars/PUTCHAR +; RET NZ +; ; [x] Beep in PChars/PUTCHAR +; .BELL: LD DE,1200 +; PUSH HL +; LD HL,4 +; CALL BEEP +; POP HL +; RET +; ; +; ; [x] -bug with Vasil's version of cursor +; .NO_SCROLL: CP #0E +; JR C,.control_characters +; LD BC,1*256 + BIOS.LP_PRINT_SYM +; JP ToBIOS +;/////////////////////////////////////////////////////////////////////// + + + +;/////////////////////////////////////////////////////////////////////// +PUTCHAR: PUSH HL ; - LD BC,1*256 + BIOS.LP_PRINT_SYM - ;[x] CR+LF+SCROLL - RST ToBIOS - ; - ; проверка на переход курсора в самое начало (X:Y == 0:0) - CALL CURSOR - LD A,D - OR E - RET NZ + LD L,A + XOR A ; no attr-mode + LD H,A + PUSH HL ; кладём на стек печатаемый символ + LD L,A + ADD HL,SP ; -.LFF: PUSH HL - LD BC,1*256 + BIOS.LP_SCROLL_UD - LD DE,#0020 + LD A,(CLEAR.shell_color) + LD B,A + EX AF,AF' + XOR A ; no XY-mode + LD C,BIOS.LP_PR_LINE_DIR + LD IY,0 ; YH = YL = B RST ToBIOS - LD DE,#1F00 - CALL LOCATE - LD A,' ' - LD BC,#50*256 + BIOS.LP_PRINT_SYM - RST ToBIOS - LD DE,#1F00 - CALL LOCATE + POP HL ; восстанавливаем стек + ; POP HL RET -.TB_: CALL CURSOR - IF TABisSPACES - LD B,E - LD A,E - AND #F8 - ADD A,8 - SUB B - LD B,A - LD A,' ' - LD C,BIOS.LP_PRINT_SYM - JP ToBIOS - ELSE - LD A,E - ADD A,8 - AND #78 ;????? глянуть, что будет если координаты курсора в конце строки почти - LD E,A - JP LOCATE - ENDIF -.BK_: CALL CURSOR - XOR A - CP E - RET Z - DEC E - JP LOCATE - ; -.LF_: CALL CURSOR - LD A,D - CP #1F - JR NC,.LFF - INC D - IFN EnoughtOnly_LF - JP LOCATE - ELSE - CALL LOCATE - ; !!!! НЕ разрывать LF_ и CR_ !!!! - ENDIF -.CR_: CALL CURSOR - LD E,0 - JP LOCATE - ; -.control_characters: - CP "\r" - JR Z,.CR_ - CP "\n" - JR Z,.LF_ - CP "\t" ; tab - JR Z,.TB_ - CP "\b" ; backspace - JR Z,.BK_ - CP "\a" ; [x] Beep in PChars/PUTCHAR - RET NZ - ; [x] Beep in PChars/PUTCHAR -.BELL: LD DE,1200 - PUSH HL - LD HL,4 - CALL BEEP - POP HL - RET - ; -; [x] -bug with Vasil's version of cursor -.NO_SCROLL: CP #0E - JR C,.control_characters -._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - JP ToBIOS + +; .NO_SCROLL: + +; .CHAR: DZ "X" ;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 1c40407..d85e693 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -55,7 +55,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL EXX CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) LD B,A ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: ;PUSH AF @@ -70,7 +70,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 ; ; ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ; LD BC,1*256 + Dss.DRV.Read - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; RST ToDSS.DRV ; POP AF ; OUT (SLOT3),A diff --git a/DSS/API/WrChar.asm b/DSS/API/WrChar.asm index 3aeb172..63d71f9 100644 --- a/DSS/API/WrChar.asm +++ b/DSS/API/WrChar.asm @@ -9,15 +9,17 @@ ; выход: нет ;!FIXIT slow как без WIN_GET_SYM тут обойтись? ;/////////////////////////////////////////////////////////////////////// -WRCHAR: LD C,A - PUSH BC - PUSH DE +WRCHAR: ;LD C,A + ;PUSH BC + ;PUSH DE + ;XOR A + ;LD C,BIOS.WIN_GET_SYM + ;RST ToBIOS + ;POP DE + ;POP HL + LD L,A + LD H,B XOR A - LD C,BIOS.WIN_GET_SYM - RST ToBIOS - POP DE - POP HL - XOR A - LD C,BIOS.WIN_PUT_SYM + LD BC,BIOS.WIN_PUT_SYM.NoChangeZG JP ToBIOS ;/////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 966b006..e6c2888 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -18,7 +18,7 @@ WRITE.RD_ONLY: WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE CALL .Start PUSH AF - LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск POP AF diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index 3eb0638..70d838e 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -16,7 +16,7 @@ CURDISK_FN: CURDISK: LD A,(LDRIVE) LD C,A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) AND A RET ; \ No newline at end of file diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 12e9bc9..5ddf0bd 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -63,7 +63,7 @@ DISKINF: LD C,B LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; 12, 16 or 32 - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.next_prm ; @@ -77,7 +77,7 @@ DISKINF: LD C,B .put_char: LD (DE),A POP DE ; -.next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER +.next_prm: LD HL,CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; @@ -86,7 +86,7 @@ DISKINF: LD C,B PUSH DE PUSH HL EXX - ;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + ;LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL PUSH IX CALL GET_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL @@ -132,7 +132,7 @@ DISKINF: LD C,B ;JR Z,CURRDS ;R06 .CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' - LD HL,CORE_BUFFERS.FatBuffer.DRIVE + LD HL,CORE_BUFFERS.FS_Buffer.DRIVE CP (HL) JR Z,.CheckFreeSpace ; @@ -144,9 +144,9 @@ DISKINF: LD C,B .CheckFreeSpace:; если GetFreeSpace не вызывается XOR A OR B - LD BC,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L) EXX - LD BC,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H) EXX CALL NZ,GetFreeSpace ; @@ -155,24 +155,24 @@ DISKINF: LD C,B ; LD H,B LD L,C - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL EX DE,HL EXX LD H,B LD L,C - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL EX DE,HL EXX - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow) DEC HL ; fat 32 EXX - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh) JR NC,.skip_dec_hl DEC HL .skip_dec_hl: EXX - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) AND A RET ; @@ -187,7 +187,7 @@ DISKINF: LD C,B ; ; GetFreeSpace: LD A,1 - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A LD HL,2 ; fat32 номер кластера от которого считать XOR A ; fat32 @@ -246,7 +246,7 @@ GET_LABEL: PUSH DE LD B,high Dss.F_First.FATname CALL F_FIRST POP DE - LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL RET C ; [ ] 07/03/2025 костыль для атрибута 0. Настоял Савелий)) LD HL,BUFFER_FIND.REC_Attr diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 191715f..21dc66b 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -184,7 +184,7 @@ TMPNAME: DZ ' ' ; 12 ; IN: A - drive number OPENDSK: ;!TEST DRV.Open обход R10 LD C,A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) CP C JR NZ,.open PUSH BC @@ -202,12 +202,12 @@ OPENDSK: ;!TEST DRV.Open POP BC JP C,.error ;[x] 29/02/2024 fix "open drive error" -.skip_open: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.skip_open: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD D,A PUSH DE ; LD A,B - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A ; CALL RD_BPB ;[x] 29/02/2024 fix "open drive error" @@ -236,7 +236,7 @@ OPENDSK: ;!TEST DRV.Open ; ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed .error_bpb: PUSH AF ; сохраняем номер ошибки - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) CP D JR Z,.next_check ; @@ -245,15 +245,15 @@ OPENDSK: ;!TEST DRV.Open SCF JR Z,.set_panic ; - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A CALL OPENDSK.force JR NC,.err_exit ; LD A,(BOOTDSK.NUM) - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A CALL OPENDSK.force ; -.err_exit: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.err_exit: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' LD (CORE_BUFFERS.CurrentPath),A POP AF @@ -384,7 +384,7 @@ MASK: LD HL,TMPNAME ;----------------------------------------------------------------------; ;!TEST Current Dir ;[x] 15/10/23 DIR_PATH_CHANGE: -.FullCurrent: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.FullCurrent: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' LD (CORE_BUFFERS.CurrentPath),A ; @@ -393,7 +393,7 @@ DIR_PATH_CHANGE: ; .FullWork: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A ; .Work: LD HL,CORE_BUFFERS.WorkDirectory JP CURRDIR_FN @@ -419,7 +419,7 @@ DIR_PATH_CHECK: LD A,(HL) JR Z,.checkDir ; LD HL,CORE_BUFFERS.CurrentPath - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' CP (HL) JR NZ,.gotoPath @@ -459,7 +459,7 @@ DIR_PATH_CHECK: LD A,(HL) JR .gotoPath ; .checkDrive: LD HL,CORE_BUFFERS.CurrentPath - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ADD 'A' CP (HL) RET @@ -587,4 +587,23 @@ MOVE_CP: SBC HL,DE RET ; +;----------------------------------------------------------------------; +; [x] fat32 ; [ ] CDFS +; !TODO перенести потом в FS module +RD_BPB: CALL READ_BPB + RET C + ; + LD DE,#AA55 ; сигнатура ;R05 + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + ; + AND A + SBC HL,DE + JP Z,FAT_BPB + ; + ; CDFS check + ; + ; +.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET ;----------------------------------------------------------------------; \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 0b896b7..af5b6c7 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -72,7 +72,7 @@ RST_0x00: JP RETFAR ; ;EXECUTE.ASM R12 ; <[BIOS API]> ; _mInfoBLOCK 8-$,#FF ; RST_0x08: PUSH AF ; - LD A,SYS_PORT.PAGE8; + LD A,SYS_PORT.BIOS ; OUT (SYS_PORT.ON),A ; POP AF ; RET ; @@ -190,14 +190,14 @@ RST_10: PUSH HL IF SHORT_RSTx10_TABLE ;[ ] R09 LD H,A - LD A,#5F + LD A,+(DSS_API_TABLE.low_short) SUB C JR C,.error LD A,H ;[ ] R09 ENDIF - LD H,high ADRST10 + LD H,high DSS_API_TABLE LD C,(HL) INC H LD H,(HL) @@ -254,7 +254,7 @@ CLEAR_BUFFER_AND_INIT_PROC: LD (CORE_BUFFERS.WorkDirectory),A ; LD A,#FF - LD (CORE_BUFFERS.FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FS_Buffer.DRIVE),A ; ;R07 ;R11 ;R11 @@ -265,9 +265,9 @@ CLEAR_BUFFER_AND_INIT_PROC: ;R02 ;LD B,#FF ;INIT ENVIRONMENT CALL INITENV - IFN CLASSIC_CURSOR +; IFN CLASSIC_CURSOR CALL SETUP_CURSORS - ENDIF +; ENDIF ;R02 JP VERSION @@ -289,9 +289,9 @@ INTx38_Handler: PUSH AF LD C,Dss.Mouse.GetPackets RST ToDSS.Mouse ;CALL M_INT - IFN CLASSIC_CURSOR +; IFN CLASSIC_CURSOR CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL - ENDIF +; ENDIF POP IY POP IX POP HL @@ -335,7 +335,7 @@ INTx38_Handler: PUSH AF ;------------------------------------------------------------------------------------------------------------------------; GO_ZERO EQU #0000 ;FUNCTION ADDRESS ARRAY -ADRST10: ;DS 512 ;,0 +DSS_API_TABLE: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 @@ -347,21 +347,23 @@ ADRST10: ;DS 512 ;,0 DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45 DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59 - DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F + DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F +;[ ] R09 +.low_short EQU $ - DSS_API_TABLE IFN SHORT_RSTx10_TABLE - ;[ ] R09 - DB low NOPS, low NOPS, low NOPS, low NOPS ; 9 60..63 - DB low NOPS, low NOPS, low NOPS, low NOPS, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 10 64..6D + ; + DB low NOPS, low NOPS, low NOPS, low NOPS ; 9 60..63 + DB low NOPS, low NOPS, low NOPS, low NOPS, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 10 64..6D DUP 13 - DB low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO; 110-239 6E-EF + DB low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 110-239 6E-EF EDUP - DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 24 F0..F9 - DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; END ; 25 FA..FF - + DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 24 F0..F9 + DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; END ; 25 FA..FF + ; ELSE ;!TODO free space - _mInfoBLOCK ADRST10+#100 - $,0 + _mInfoBLOCK DSS_API_TABLE+#100 - $,0 ;[ ] R09 ENDIF ;...............................................[HIGH ADDRESS]: @@ -376,19 +378,21 @@ ADRST10: ;DS 512 ;,0 DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT +;[ ] R09 +.high_short EQU $ - DSS_API_TABLE - .low_short IFN SHORT_RSTx10_TABLE - ;[ ] R09 - DB high NOPS, high NOPS, high NOPS, high NOPS - DB high NOPS, high NOPS, high NOPS, high NOPS, high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO + ; + DB high NOPS, high NOPS, high NOPS, high NOPS + DB high NOPS, high NOPS, high NOPS, high NOPS, high GO_ZERO,high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO DUP 13 - DB high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO + DB high GO_ZERO, high GO_ZERO, high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO EDUP - DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS - DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS ; END - + DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS + DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS ; END + ; ELSE ;!TODO free space - ;_mInfoBLOCK ADRST10+#200 - $,0 + ;_mInfoBLOCK DSS_API_TABLE+#200 - $,0 ;[ ] R09 ENDIF ; DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT, low NOPS, low NOPS, low NOPS, low NOPS ; 9 5A..63 @@ -405,7 +409,7 @@ ADRST10: ;DS 512 ;,0 ; [ ] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb CHECK_64kb_CLUSTER: - LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) + LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; CF=0 ADC HL,HL LD A,DSS_Error.sys.WRITE_PROTECT @@ -458,7 +462,7 @@ BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size -FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer +FS_Buffer _sFS_Buffer = BUFFERSplace.FS_Buffer EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK _sStack = BUFFERSplace.Stack .Spoint EQU XSTACK + _sStack @@ -492,8 +496,8 @@ CLEAR_ZONE.size EQU _sBuffers DISPLAY " FM_BUF ", /H, CORE_BUFFERS.FM_BUF DISPLAY " FM_BUF.Size: ", /H, CORE_BUFFERS.FM_BUF.Size DISPLAY " FM_BUF.FullSize ", /H, CORE_BUFFERS.FM_BUF.FullSize - DISPLAY " FatBuffer ", /H, CORE_BUFFERS.FatBuffer - DISPLAY " FatBuffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer + DISPLAY " FS_Buffer ", /H, CORE_BUFFERS.FS_Buffer + DISPLAY " FS_Buffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FS_Buffer DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF DISPLAY " XSTACK ", /H, CORE_BUFFERS.XSTACK @@ -508,7 +512,7 @@ CLEAR_ZONE.size EQU _sBuffers EXPORT CORE_BUFFERS.BUFFERSplace EXPORT CORE_BUFFERS.FM_BUF - EXPORT CORE_BUFFERS.FatBuffer + EXPORT CORE_BUFFERS.FS_Buffer EXPORT CORE_BUFFERS.EXEBUFF EXPORT CORE_BUFFERS.XSTACK EXPORT CORE_BUFFERS.BUFFER @@ -567,18 +571,19 @@ F_START: DI ; ;R12 - LD C,BIOS.DRV_VERSION + LD HL,0 ; писать в никуда + LD C,BIOS.FN_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 ;!!!!!! + JR C,.err_oldBIOS + ; 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 ;эта процедура затрётся после исполнения @@ -608,7 +613,7 @@ F_START: DI ; EI ;Set new address fn. VERSION - LD HL,ADRST10 + LD HL,DSS_API_TABLE LD (HL),low VERSION ;R03 INC H LD (HL),high VERSION ;R03 @@ -616,14 +621,18 @@ F_START: DI ; ;R12 .err_oldBIOS: - LD HL,.err_oldBIOS_message + IN A,(SLOT0) + OUT (SLOT3),A + LD HL,.err_oldBIOS_message + SLOT3.MEM_ADDR ;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." + DB "\r\nWARNING! This version of DSS requires BIOS v" + DB STR_MINIMUM_BIOS_VERSION + DZ " or later to boot from IDE." ; DEPLOY: ;Allocate memory @@ -678,6 +687,7 @@ DEPLOY: ;Allocate memory ; C_OSTYPE ;--- --- --- --- --- --- --- --- --- --- --- ---; + DISPLAY "FAT MODULE SIZE: ",/A,FAT_MODULE_SIZE DISPLAY "DEPLOY end address: ",/H,$ ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." @@ -689,7 +699,6 @@ DRV_CONTENT.SIZE EQU $-DRV_CONTENT BIN_END_ADDRESS EQU $ - DISPLAY "END ADDRESS: ",/H,BIN_END_ADDRESS DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512 ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!'; diff --git a/DSS/FS/CDFS.ASM b/DSS/FS/CDFS.ASM index 9a75097..bd1cc34 100644 --- a/DSS/FS/CDFS.ASM +++ b/DSS/FS/CDFS.ASM @@ -1,4 +1,4 @@ -; INITDISK - инициализация буквы диска +; INITDISK - инициализация буквы диска - перенести кусок в RD_BPB ; LOADDIR - загрузка с CDFS директории и адаптация под FAT ; /* @@ -6,7 +6,8 @@ CHECK_ROOT_CLUSTER -NEW RST: +-= RST ToDSS.FS =- +RD_BPB - shared_fs.asm - брать сигнатуру #AA55 или из CDFS.RD_BPB и далее уже RST_FS LOADDIR */ \ No newline at end of file diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index f353292..bcaa5d0 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -12,12 +12,14 @@ ;--------------------------------------------------------------- ; [ ] RST_FS ;----------------------------------------------------------------------; +FAT_MODULE_START EQU $ -SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + +SET_FSInfo: LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 RET NZ ; - LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO) + LD A,(CORE_BUFFERS.FS_Buffer.UPD_FSINFO) OR A RET Z ; @@ -42,9 +44,9 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) LD HL,#AA55 LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL ; FREE_CLUSTERS_COUNT - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2),HL ; FIRST_FREE_CLUSTER LD HL,(G_CLUST.low) @@ -53,14 +55,14 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL ; Пишем его на винт XOR A - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A JR WRITE_FSinfo ; ; ; Прочитать BPB в SECTOR_BUFFER READ_BPB: LD C,Dss.DRV.GetBPB JR RW_SECTOR ; Записать FSinfo из SECTOR_BUFFER -WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) +WRITE_FSinfo: LD IX,(CORE_BUFFERS.FS_Buffer.FSINFO_Sector) LD HL,0 ;JR WRITE_SECTOR ; Записать сектор из SECTOR_BUFFER @@ -68,7 +70,7 @@ WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write JR RW_SECTOR ; Прочитать FSinfo в SECTOR_BUFFER -READ_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) +READ_FSinfo: LD IX,(CORE_BUFFERS.FS_Buffer.FSINFO_Sector) LD HL,0 ; Прочитать сектор в SECTOR_BUFFER ; Вход: HL:IX = Logical Block (sector) @@ -79,7 +81,7 @@ RW_SECTOR: IN A,(SLOT3) IN A,(SLOT0) OUT (SLOT3),A ; - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 RST ToDSS.DRV EX AF,AF' @@ -458,7 +460,7 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF OR A JR NZ,.SUBDIR ; -.REROOT: LD DE,0 +.REROOT: LD DE,0 ; !FIXIT ; [ ] CDFS - брать первый кластер из переменной LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE CALL LOADDIR @@ -517,16 +519,16 @@ LOADDIR: ;!TODO optimize PUSH AF EX AF,AF' JR NZ,.read_dir - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.LoadRootDir ; fat32 - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - ;LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог + ;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог LD HL,#4000 ; размер директории ;!HARDCODE LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL ; @@ -539,14 +541,14 @@ LOADDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 - LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) +.LoadRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 + LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L) ; номер лог. сектора + LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 LD B,A ; число секторов -.RTD1: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска +.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV @@ -572,7 +574,7 @@ LOAD_SAVE_DIR_PREPARE: AND A EX AF,AF' ; - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD (IY+_sFM.DRIVE),A ;!FIXIT переделать на работу без IY LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) @@ -630,7 +632,7 @@ WRT_HND: SBC HL,DE JR NC,SAVEDIR LD HL,(SAVEDIR.DIRSIZE) - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ADD HL,BC LD (SAVEDIR.DIRSIZE),HL AND A @@ -645,13 +647,13 @@ SAVEDIR: ;!TODO optimize EX AF,AF' JR NZ,.save_dir ; - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.SaveRootDir ; fat32 - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) + LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL ; .save_dir: LD HL,DIRPAGE.buffer @@ -665,15 +667,15 @@ SAVEDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 - LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) +.SaveRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 + LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L) + LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors SUB B JR NC,.RTD1S ADD A,B LD B,A -.RTD1S: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.RTD1S: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD DE,DIRPAGE.buffer LD C,Dss.DRV.Write RST ToDSS.DRV @@ -683,29 +685,17 @@ SAVEDIR: ;!TODO optimize ;----------------------------------------------------------------------; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -; [x] fat32 ;!TEST -RD_BPB: ; LD C,SLOT3 - ; IN B,(C) - ; PUSH BC - ; IN A,(SLOT0) - ; OUT (SLOT3),A - ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ;R08 - ; LD C,Dss.DRV.GetBPB - ; RST ToDSS.DRV - ; POP BC - ; OUT (C),B - CALL READ_BPB - ;JP C,DOS_X_Error.Not_ready - RET C - ; - LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 - ;[ ] CDFS - ;R05 - AND A - SBC HL,DE - JP NZ,DOS_X_Error.UnknownBPB +; [x] fat32 +; RD_BPB: CALL READ_BPB +; RET C +; ; +; LD DE,#AA55 ; сигнатура ;R05 +; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 +; ;[ ] CDFS +; ;R05 +; AND A +; SBC HL,DE +; JP NZ,DOS_X_Error.UnknownBPB ; ; ;R08 ; [x] fat32 ; LD HL,CORE_BUFFERS.SECTOR_BUFFER @@ -713,27 +703,27 @@ RD_BPB: ; LD C,SLOT3 ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LDIR ; - LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) +FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) CP #F0 - JP C,DOS_X_Error.UnknownBPB + JP C,RD_BPB.UnknownBPB ; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector) - LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL + LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster) - LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A + LD (CORE_BUFFERS.FS_Buffer.SectorsPerCluster),A ; calc. first sector FAT LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL ; low word first sector FAT #2 ;[ ] fat32 XOR A LD B,A LD C,A - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC - LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 - ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 + LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),BC + LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A ; [ ] fat32 + ;LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables ; ; EXX @@ -752,24 +742,24 @@ RD_BPB: ; LD C,SLOT3 LD A,E EXX ; - LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A + LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) ; -.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE +.skip_high: LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L),DE LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs - LD (CORE_BUFFERS.FatBuffer.Number_Of_FATs),A + LD (CORE_BUFFERS.FS_Buffer.Number_Of_FATs),A CP 1 JR Z,.one_FAT DEC A ADD HL,DE - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL EXX ADC HL,DE - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),HL EXX ;JR NC,.no_inc_BC ;INC BC -.no_inc_BC:;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC +.no_inc_BC:;LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC .one_FAT: ; .loop1: ADD HL,DE ;JR NC,.loop1_1 @@ -780,14 +770,14 @@ RD_BPB: ; LD C,SLOT3 .loop1_1: DEC A JR NZ,.loop1 ; - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L),HL ; first sector DIR EXX ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. - LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),HL + LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_H),HL EXX - ;LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC + ;LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_H),BC ; - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) LD A,B AND A ; @@ -802,7 +792,7 @@ RD_BPB: ; LD C,SLOT3 LD B,0 ; BC - File handels per sector ;;;; IF COMPILE_UNUSED_CODE - LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A + LD (CORE_BUFFERS.FS_Buffer.FilesPerSector),A ENDIF ; EX DE,HL @@ -816,21 +806,21 @@ RD_BPB: ; LD C,SLOT3 XOR A ;NEXTAD2 .loop2: INC A - JP Z,DOS_X_Error.UnknownBPB + JP Z,RD_BPB.UnknownBPB SBC HL,BC JR NC,.loop2 ; .skip_loop2: EX DE,HL LD C,A ; A - sectors in DIR LD B,0 - LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A + LD (CORE_BUFFERS.FS_Buffer.DirSizeInSectors),A ADD HL,BC ; Start DATA area - LD (CORE_BUFFERS.FatBuffer.FirstDataSector_L),HL + LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_L),HL ; B = 0 ; - LD HL,(CORE_BUFFERS.FatBuffer.BytesPerSector) - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerSector) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;!TODO FATcacheSize ; calc. cluster size XOR 1 @@ -840,13 +830,13 @@ RD_BPB: ; LD C,SLOT3 RRA JP NC,.loop3 .loop3.end: ; - LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL + LD (CORE_BUFFERS.FS_Buffer.BytesPerCluster),HL ;LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO ;AND A ;SBC HL,DE ;JP NC,DOS_X_Error.UnknownBPB ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) //////////////////////////////////////////////////////////////////////// -;!TODO не используется значения вычисляемые и сохраняемые в FatBuffer +;!TODO не используется значения вычисляемые и сохраняемые в FS_Buffer ; EX DE,HL ; LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize ; XOR A @@ -855,7 +845,7 @@ RD_BPB: ; LD C,SLOT3 ; JP Z,DOS_X_Error.UnknownBPB ; SBC HL,DE ; JR NC,.loop4 -; LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) +; LD (CORE_BUFFERS.FS_Buffer.ClustersPerBank),A ; A - Clusters per bank (16k) ; ; LD HL,0 ; LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track @@ -864,19 +854,19 @@ RD_BPB: ; LD C,SLOT3 ; ADD HL,BC ; DEC A ; JR NZ,.BPB_L1 -; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL +; LD (CORE_BUFFERS.FS_Buffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// ; [ ] fat32 LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD A,H OR L - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_L) JP NZ,.HDDSMAL ; EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) PUSH HL ; Total Sectors high - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_H) EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) PUSH HL ; Total Sectors low @@ -898,7 +888,7 @@ RD_BPB: ; LD C,SLOT3 SBC HL,DE ; .HDDBIG: CALL SectorToCluster -; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) +; LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; SCF ; .loop7: RRA ; JR C,.loop7_exit @@ -909,23 +899,23 @@ RD_BPB: ; LD C,SLOT3 ; JP .loop7 ; .loop7_exit: INC HL - LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL + LD (CORE_BUFFERS.FS_Buffer.MaxClusterLow),HL LD A,L OR H JR NZ,.no_inc_bc INC BC -.no_inc_bc: LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC +.no_inc_bc: LD (CORE_BUFFERS.FS_Buffer.MaxClusterHigh),BC ; XOR A LD H,A LD L,A - LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FS_Buffer.CacheBlock),HL + LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A ; A = 0 - LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD H,A EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) ; DE:HL = SectorsPerFAT ; LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) @@ -940,7 +930,7 @@ RD_BPB: ; LD C,SLOT3 DJNZ .loop_mul .loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT LD B,0 - LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) + LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) LD C,A ADD HL,BC JR NC,.no_inc_DE @@ -962,7 +952,7 @@ RD_BPB: ; LD C,SLOT3 POP DE ; Total Sectors low ; HL:DE = DataSec ; - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; HL:DE / A => DE:BC, H=0, L - остаток CALL DIV_by_Shifts ; выясняем разрядность FAT @@ -983,9 +973,9 @@ RD_BPB: ; LD C,SLOT3 LD A,FAT_TYPE.x16 .set_vars: EXX LD HL,0 - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),HL + LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),HL + LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L),HL + LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H),HL LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.LABEL EXX LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) @@ -1000,12 +990,12 @@ RD_BPB: ; LD C,SLOT3 CP #80 JR C,.mirrored_FATs ;если все копии FAT используются ; используется только одна копия FAT - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD D,0 EXX - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + 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 @@ -1017,40 +1007,40 @@ RD_BPB: ; LD C,SLOT3 DJNZ .fat_calc_loop ; .first_FAT_active: - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL EXX - LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL - LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),HL ; .mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL ; EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL + LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L),HL LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),DE + LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H),DE ; CALL CLUSTER_TO_SECTOR.no_prepare - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),IX - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),HL + LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L),IX + LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),HL ; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) - LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL + LD (CORE_BUFFERS.FS_Buffer.FSINFO_Sector),HL ; LD A,FAT_TYPE.x32 LD HL,#0FFF - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),HL LD H,L LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) ; -.SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A - LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE - LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC +.SET_VARS: LD (CORE_BUFFERS.FS_Buffer.FAT_TYPE),A + LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L),HL + LD (CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER),DE + LD (CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER+2),BC EXX - LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL + LD DE,CORE_BUFFERS.FS_Buffer.BPB_LABEL LD BC,11 ;!HARDCODE LDIR ; @@ -1062,7 +1052,7 @@ RD_BPB: ; LD C,SLOT3 OUT (SLOT3),A ; ; Установить начальный кластер для чтения - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR Z,.set_FSinfo ; @@ -1072,8 +1062,8 @@ RD_BPB: ; LD C,SLOT3 LD (G_CLUST.high),HL ; DEC HL - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL XOR A RET ; @@ -1102,8 +1092,8 @@ RD_BPB: ; LD C,SLOT3 LD D,B LD E,B ; -.skip_FFFF: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),BC - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),DE +.skip_FFFF: LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),BC + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),DE ; ; FIRST_FREE_CLUSTER LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) @@ -1115,12 +1105,12 @@ RD_BPB: ; LD C,SLOT3 LD (G_CLUST.high),DE LD (G_CLUST.low),BC XOR A -.error: LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A +.error: LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A RET Z ;!TODO FREE_CLUSTERS_COUNT ;LD HL,#FFFF - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL - ;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + ;LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL + ;LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL ; XOR A LD H,A @@ -1131,9 +1121,9 @@ RD_BPB: ; LD C,SLOT3 RET ; ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? -.check_cluster: LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) +.check_cluster: LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow) SBC HL,BC - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh) SBC HL,DE RET ;;;;;;;; @@ -1144,7 +1134,7 @@ SectorToCluster: LD A,B AND #0F LD B,A - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) SCF .loop: RRA RET C @@ -1155,10 +1145,10 @@ SectorToCluster: JP .loop ; -DOS_X_Error: -.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT - SCF - RET +; DOS_X_Error: +; .UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT +; SCF +; RET ; ; .Not_ready: LD A,DSS_Error.sys.NOT_READY ; ; CF = 1 @@ -1167,7 +1157,7 @@ DOS_X_Error: ; ;!TODO к буферам! /* -FatBuffer: +FS_Buffer: ;.MSG: DB 'FAT' .DRIVE: DB #FF .FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 @@ -1298,7 +1288,7 @@ SET_NEW_FREE_CLUSTER: ; EXX ; XOR A ; INC A - ; LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + ; LD (CORE_BUFFERS.FS_Buffer.RESET_FSINFO),A ; RET ; @@ -1338,7 +1328,7 @@ G_CLUST: ; LD (G_CLUST.high),HL EXX INC A - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A RET ; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров @@ -1349,11 +1339,11 @@ SET_NEW_FREE_CLUSTERS: EXX PUSH HL PUSH DE - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H) LD A,H AND L EXX - LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L) AND H AND L INC A @@ -1374,11 +1364,11 @@ SET_NEW_FREE_CLUSTERS: EXX ; .set_new: LD A,1 - LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A + LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A ; - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL EXX - LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL .no_change: POP DE POP HL EXX @@ -1453,13 +1443,13 @@ INC_FAT: PUSH HL ; тек ; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster ; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) CHECK_CLUSTER_IS_SMALLER: - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) XOR FAT_TYPE.x32 JR NZ,.low ; Z=0 проверяем младшее слово номера кластера ; проверяем старшее слово номера кластера EXX EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh) ; CF = 0 SBC HL,DE EX DE,HL @@ -1469,7 +1459,7 @@ CHECK_CLUSTER_IS_SMALLER: RET NZ ; проверяем младшее слово номера кластера .low: EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) + LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow) SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL @@ -1496,7 +1486,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; PUSH HL PUSH AF - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 @@ -1588,7 +1578,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; Портить только HL и A SET_FAT32_CACHE_BLOCK_CHANGED_REGION: ;DEC HL - ;LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + ;LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) ;CP FAT_TYPE.x16 + 1 ;JR C,.start ;DEC HL @@ -1604,16 +1594,16 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: SUB L JR NZ,.loop ; -.set_region: LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) +.set_region: LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated) OR H - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A RET ; ; [x] fat32 ;!TEST ; ; !TODO optimize -; при записи в кэш значения отмечать через OR в ячейке FatBuffer.SectorOfCacheBlock +; при записи в кэш значения отмечать через OR в ячейке FS_Buffer.SectorOfCacheBlock ; бит соответствующий куску в странице кэша, который был изменён и потом скидывать на диск ; только те куски, которые были изменены. ; |--------------------| @@ -1640,9 +1630,9 @@ SET_FAT32_CACHE_BLOCK_CHANGED_REGION: ; .Custom: ; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ -WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; номер кластера +WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L) ; номер кластера EXX - LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H) ; номер кластера + LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H) ; номер кластера EXX .Custom: PUSH DE EXX @@ -1664,9 +1654,9 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; PUSH DE ; младший номер кластера который вписать ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,1 - ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ;LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A ; - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 @@ -1685,7 +1675,7 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,#FF - ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ;LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A ; ; CF = 0 RET @@ -1755,7 +1745,7 @@ WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; ; out: C:HL - logical number ; B = 0 GET_SECTOR_OF_FAT: - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную XOR FAT_TYPE.x32 JR Z,.next @@ -1778,7 +1768,7 @@ GET_SECTOR_OF_FAT: ; ADC A,C ; EDUP ; LD C,A -; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) +; LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) ; CP FAT_TYPE.x32 ; RET NZ ; ADD HL,HL ;x2 @@ -1795,34 +1785,34 @@ GET_SECTOR_OF_FAT: ; DE - NEW FAT BLOCK READ_FAT_TABLE: PUSH HL PUSH DE - LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE.Start POP DE ; EX DE,HL - LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL + LD (CORE_BUFFERS.FS_Buffer.CacheBlock),HL ; CALL GET_SECTOR_OF_FAT ; ; BC:HL - номер лог.сектора - LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) ADD HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H) ; JR NC,.no_inc ; INC HL .no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) XOR FAT_TYPE.x32 LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE JR NZ,.next LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE .next: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска RST ToDSS.DRV POP HL RET @@ -1839,13 +1829,13 @@ WRITE_FAT_TABLE: RET ; Запись кеша FAT-а на диск .Start: CALL SET_FSInfo - LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) + LD HL,(CORE_BUFFERS.FS_Buffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока LD (.pop_offset_HL),HL LD DE,FAT_CACHE.Sectors_32 - LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR Z,.next LD DE,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде @@ -1857,9 +1847,9 @@ WRITE_FAT_TABLE: ; ; конец блока выходит за пределы таблицы? LD B,E ; MAX число секторов для чтения в кэш - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD (.sub_A),A - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) AND A LD A,C SBC HL,DE @@ -1880,8 +1870,8 @@ WRITE_FAT_TABLE: .pop_offset_HL+1: LD HL,0 ; B = число секторов - LD IX,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) + LD IX,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) PUSH BC ; сохраняем первую копию FAT. Вход IX:DE - начало таблицы FAT ; C:HL - смещение внутри таблицы @@ -1889,31 +1879,31 @@ WRITE_FAT_TABLE: CALL .SAVE_FAT_XX ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 POP BC ; B = число секторов, C = старший байт смещения в секторах - LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H) AND A SBC HL,DE JR NZ,.not_one_FAT - LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) - LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) ; CF = 0 SBC HL,DE JR Z,.only_one_FAT ; -.not_one_FAT: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) +.not_one_FAT: LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.fat_num_2 ; - LD A,(CORE_BUFFERS.FatBuffer.Number_Of_FATs) + LD A,(CORE_BUFFERS.FS_Buffer.Number_Of_FATs) CP 2 JR Z,.fat_num_2 ; сохраняем больше двух копий FAT - LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD D,0 EXX - LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) DEC A .many_fat_loop: EXX PUSH HL @@ -1928,10 +1918,10 @@ WRITE_FAT_TABLE: POP BC POP HL ; - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) ADD HL,DE EXX - LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) POP HL ADC HL,DE EXX @@ -1940,14 +1930,14 @@ WRITE_FAT_TABLE: JR .norm_exit ; ; сохраняем вторую копию FAT -.fat_num_2: LD IX,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) - LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) +.fat_num_2: LD IX,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L) LD HL,(.pop_offset_HL) CALL .SAVE_FAT_XX .norm_exit: AND A ;!TODO нет контроля ошибок .only_one_FAT: ; .ERR: LD A,0 - LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A RET ; Вход: IX:DE - начало таблицы FAT в секторах ; C:HL - смещение в таблице в секторах @@ -1965,17 +1955,17 @@ WRITE_FAT_TABLE: LD XH,D LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT - LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated) CP #FF JR NZ,.SAVE_NOT_ALL_BLOCK ; LD DE,FATPAGE.cache ; откуда - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV ; .SAVE_NOT_ALL_BLOCK: - ; A = CORE_BUFFERS.FatBuffer.CacheUpdated + ; A = CORE_BUFFERS.FS_Buffer.CacheUpdated ; HL:IX - смещение внутри раздела на начало нужного блока FAT ; B = максимальное число блоков для записи EXX @@ -2019,7 +2009,7 @@ WRITE_FAT_TABLE: EXX LD B,E ; кол-во секторов POP DE ; Адрес в странице КЭШа - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска LD C,Dss.DRV.Write RST ToDSS.DRV ; HL:IX = Sector + Sector counter @@ -2070,7 +2060,7 @@ GET_FAT32_CELL: ; EXX EX DE,HL - LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + 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 @@ -2096,9 +2086,9 @@ GET_FAT16_CELL: ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -2139,9 +2129,9 @@ GET_FAT12_CELL: ;AND FAT_CACHE.Part_Mask_16 ; ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -2174,7 +2164,7 @@ CLUSTER_TO_SECTOR: DEC DE .no_dec_de: ; cluster = cluster - 2 ; - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -2189,13 +2179,13 @@ CLUSTER_TO_SECTOR: .skip: EX DE,HL LD XL,E LD XH,D - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_L) ; [x] fat32 ;XOR A ; ADD IX,DE ; [x] fat32 - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_H) ;LD D,A ;LD E,A ; @@ -2212,7 +2202,7 @@ CLUSTER_TO_SECTOR: ; IX - buffer in RAM ; B - количество секторов для чтения BLOCK_READ: LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток @@ -2301,7 +2291,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX JR NC,.skip2 INC HL .skip2: LD DE,(READ.PointerOnBuffer) - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV @@ -2309,7 +2299,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX JR C,.Error POP BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector) ;!TEST LD A,B LD B,C @@ -2325,7 +2315,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX RET Z ; количество секторов на дочитку = 0? LD B,A ; -.loop4: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster +.loop4: LD HL,CORE_BUFFERS.FS_Buffer.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -2353,7 +2343,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX PUSH BC CALL CLUSTER_TO_SECTOR LD DE,(READ.PointerOnBuffer) - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV @@ -2361,7 +2351,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX ; POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -2406,7 +2396,7 @@ CHECK_FIRST_CLUSTER: ; IY - FM ; B - количество секторов для записи BLOK_WRITE: LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток @@ -2525,7 +2515,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX INC HL ; DOUBLE 1 .skip2: LD DE,(READ.PointerOnBuffer) - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV @@ -2534,7 +2524,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector) ; LD A,B LD B,C @@ -2551,7 +2541,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX RET Z ; количество секторов на дочитку = 0? LD B,A ; -.big_loop: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster +.big_loop: LD HL,CORE_BUFFERS.FS_Buffer.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -2584,7 +2574,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX CALL CLUSTER_TO_SECTOR ; DOUBLE 1 LD DE,(READ.PointerOnBuffer) - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV @@ -2592,7 +2582,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -2758,5 +2748,6 @@ GET_OFFSET_IN_SECTORS: RET ;----------------------------------------------------------------------; -;//MODULE: FAT_X +FAT_MODULE_SIZE EQU $-FAT_MODULE_START +;//MODULE: FAT ;[END] \ No newline at end of file diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index c3efc03..a36feed 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -129,60 +129,60 @@ SCANKEY LD HL,HOST ; ; - IF CLASSIC_CURSOR ;------------------------------; +; IF CLASSIC_CURSOR ;------------------------------; -ECHOKEY: ;R01 -.CURCOUNT+1: LD A,#FF - INC A - LD (.CURCOUNT),A - AND #FF - JR NZ,.NOTUR -.CURSYM+1: LD A,#00 - XOR #01 - LD (.CURSYM),A +; ECHOKEY: ;R01 +; .CURCOUNT+1: LD A,#FF +; INC A +; LD (.CURCOUNT),A +; AND #FF +; JR NZ,.NOTUR +; .CURSYM+1: LD A,#00 +; XOR #01 +; LD (.CURSYM),A - CALL CURSOR - PUSH DE +; CALL CURSOR +; PUSH DE - LD A," " - JR Z,.CURSKI - LD A,"_" -.CURSKI: CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor +; LD A," " +; JR Z,.CURSKI +; LD A,"_" +; .CURSKI: CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor - POP DE - CALL LOCATE - ;LD A,8 ; BACKSPACE - ;CALL PUTCHAR -.NOTUR: CALL SCANKEY - JR Z,ECHOKEY - PUSH DE - PUSH BC - PUSH AF +; POP DE +; CALL LOCATE +; ;LD A,8 ; BACKSPACE +; ;CALL PUTCHAR +; .NOTUR: CALL SCANKEY +; JR Z,ECHOKEY +; PUSH DE +; PUSH BC +; PUSH AF - CALL CURSOR - PUSH DE +; CALL CURSOR +; PUSH DE - LD A," " - CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor +; LD A," " +; CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor - ;LD A,8 ; BACKSPACE - ;CALL PUTCHAR - POP DE - POP AF - PUSH DE - ;R01 [v] - CALL PUTCHAR.NO_SCROLL ; [x] -bug with Vasil's version of cursor +; ;LD A,8 ; BACKSPACE +; ;CALL PUTCHAR +; POP DE +; POP AF +; PUSH DE +; ;R01 [v] +; CALL PUTCHAR.NO_SCROLL ; [x] -bug with Vasil's version of cursor - POP DE - CALL LOCATE +; POP DE +; CALL LOCATE - POP BC - POP DE - LD A,E - AND A - RET +; POP BC +; POP DE +; LD A,E +; AND A +; RET - ELSE ;------------------------------; +; ELSE ;------------------------------; ;------; !FIXIT брать значения для знакогенератора из биоса? @@ -203,7 +203,7 @@ ECHOKEY: CALL Cursor_On ; POP AF OR A ; [x] -bug with Vasil's version of cursor - CALL NZ,PUTCHAR.NO_SCROLL ; добавил вывод "a" на экран + CALL NZ,PUTCHAR;.NO_SCROLL ; добавил вывод "a" на экран POP BC POP DE LD A,E @@ -294,46 +294,87 @@ cursor_interrupt: ; Настройка знакогенератора курсора черточкой SETUP_CURSORS: -.buffer EQU #C000 - ; - in a,(SLOT3) - push af ; сохр. порт - ld a,(BANKTBL+TXTPAGE) ; 2-й лог. номер страницы расш. ДОС - out (SLOT3),a - ; получить сист. знакоген. - ld de,.buffer ;!HARDCODE буфер для 2048 байт данных - push de - ld c,BIOS.WIN_GET_ZG ; получить знакоген. - rst ToBIOS - ; заполнить кодом #FF 2 нижние линии - ld hl,.buffer+(2048-(2*256)) ;!HARDCODE последние 512 байт - ld bc,511 - ld a,CURSOR_ZG; ; номер знакоген. "черточка" - call .fill_data_font - pop hl - ; заполнить остальные 6 линий (полный блок) - ld bc,2048-513 ;!HARDCODE - ld a,INS_CUR_ZG ; номер знакоген. "блок" - call .fill_data_font - pop af - out (SLOT3),a ; восст. порт - ret -; Настройка знакоген. и его регистрация -; вход: a=номер знакоген. -; hl=данные -; bc=размер данных -.fill_data_font: - ld e,l - ld d,h - ld (hl),#FF - inc de - ldir - ld de,.buffer ; знакоген. - ld c,BIOS.WIN_SET_ZG ; уст. знакоген. - jp ToBIOS - ;ret +.buffer EQU #C000 +.buffer.size EQU 2048 + ; + in a,(SLOT3) + push af ; сохр. порт + ld a,(BANKTBL+TXTPAGE) ; 2-й лог. номер страницы расш. ДОС + out (SLOT3),a + +; ; получить сист. знакоген. +; ld de,.buffer ;!HARDCODE буфер для 2048 байт данных +; push de +; ld c,BIOS.WIN_GET_ZG ; получить знакоген. +; rst ToBIOS +; ; заполнить кодом #FF 2 нижние линии +; ld hl,.buffer+(2048-(2*256)) ;!HARDCODE последние 512 байт +; ld bc,511 +; ld a,CURSOR_ZG; ; номер знакоген. "черточка" +; call .fill_data_font +; pop hl +; ; заполнить остальные 6 линий (полный блок) +; ld bc,2048-513 ;!HARDCODE +; ld a,INS_CUR_ZG ; номер знакоген. "блок" +; call .fill_data_font +; pop af +; out (SLOT3),a ; восст. порт +; ret +; ; Настройка знакоген. и его регистрация +; ; вход: a=номер знакоген. +; ; hl=данные +; ; bc=размер данных +; .fill_data_font: +; ld e,l +; ld d,h +; ld (hl),#FF +; inc de +; ldir +; .set: ld de,.buffer ; знакоген. +; ld c,BIOS.WIN_SET_ZG ; уст. знакоген. +; jp ToBIOS ; - ENDIF ;------------------------------; + ; [ ] 31/03/2025 + ; получить сист. знакоген. + call .get_font + ; заполнить кодом #FF 2 нижние линии + ld hl,.buffer+(.buffer.size - (2*256)) ; последние 512 байт + ld e,l + ld d,h + ld bc,512-1 + ld (hl),#FF + inc de + ldir + ld a,CURSOR_ZG; ; номер знакоген. "черточка" + call .set_font + ; получить сист. знакоген. + call .get_font + ; инвертируем фонт + ld hl,.buffer + ld bc,.buffer.size +.loop_font: ld a,(hl) + cpl + ld (hl),a + cpi + jp pe,.loop_font + ; + ld a,INS_CUR_ZG ; номер знакоген. "блок" + call .set_font + ; + pop af + out (SLOT3),a ; восст. порт + ret + ; +.set_font: ld c,BIOS.WIN_SET_ZG ; уст. знакоген. + jr ._font + ; +.get_font: ld c,BIOS.WIN_GET_ZG ; получить знакоген. +._font: ld de,.buffer ; буфер для 2048 байт данных + jp ToBIOS + + +; +; ENDIF ;------------------------------; diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 7d09fd0..fdabc66 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -26,7 +26,7 @@ ;[ ] fat32 STRUCT _sFM ; 54 bytes ; from FAT -; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME +; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME ; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT ; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT ; .RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED @@ -35,8 +35,8 @@ ; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED ; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED -; .TIME: WORD #0000 ;+ #16 +22 TIME -; .DATE: WORD #0000 ;+ #18 +24 DATE +; .TIME: WORD #0000 ;+ #16 +22 TIME +; .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 @@ -77,7 +77,7 @@ ; LEN3 EQU 30 ; FTASK EQU 42 ; - STRUCT _sFatBuffer + STRUCT _sFS_Buffer .DRIVE: BYTE #FF .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32 .CacheBlock: WORD #0000 @@ -121,7 +121,7 @@ STRUCT _sBuffers .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; -.FatBuffer _sFatBuffer +.FS_Buffer _sFS_Buffer ;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 .EXE_Header _sEXE_HEADER ; 512 bytes .Stack _sStack ; 256 bytes diff --git a/DSS/build.txt b/DSS/build.txt index 368f89c..d99e90e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -28 \ No newline at end of file +29 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index aec6456..7ffd5d8 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -21,7 +21,7 @@ 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 +; DEFINE CLASSIC_CURSOR 0 ; ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе @@ -92,16 +92,16 @@ FAT_CACHE: ;.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 ; - DEFINE DSS_MAX_SECTOR_SIZE 512 - +DSS_MAX_SECTOR_SIZE EQU 512 DSS_MAX_DRIVES_AMOUNT EQU 26 - DEFINE MAX_RAMDRIVES 16 - DEFINE NeedSafePort_Y 1 - DEFINE TABisSPACES 0 - DEFINE EnoughtOnly_LF 0 - DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 - DEFINE NON_REMOVABLE_FDD 0 +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]-------------------------; diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM index 11e9c0c..432fc70 100644 --- a/SHELL/Commands/CLS.ASM +++ b/SHELL/Commands/CLS.ASM @@ -39,9 +39,10 @@ cmd_cls: ex de,hl ; hl= cls_clear: ld a,b ld (color_screen),a ; атрибут ld de,0 ; Y/X полож. - ld hl,#2050 ; Y/X размер - ld c,BIOS.LP_CLS_WIN ; очистить окно (выводом пробелов) - RST ToBIOS + ld hl,#2050 ; Y/X размер ;!HARDCODE win size + ld a," " + ld c,Dss.Clear ; очистить окно + RST ToDSS ; уст. курсор в Home ld de,0 ; Y/X полож. ld c,Dss.Locate diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM index b6e2535..df431b4 100644 --- a/SHELL/Commands/HELP.ASM +++ b/SHELL/Commands/HELP.ASM @@ -4,14 +4,17 @@ ; ;/////////////////////////////////////////////////// cmd_help: LD HL,.help_txt - LD A,(color_screen) - EX AF,AF' - XOR A - LD BC,BIOS.LP_PR_LINE_DIR - JP ToBIOS ;!FIXIT тестовый вариант, переделать на DSS + JP PRINTZ + ; LD A,(color_screen) + ; AND A ; no attr-mode + ; EX AF,AF' + ; XOR A ; no XY-mode + ; LD BC,BIOS.LP_PR_LINE_DIR + ; LD IY,0 ; YH = YL = B + ; JP ToBIOS ;JP ECHO_MESSAGE -; 1 2 3 4 5 6 7 8 +; 1 2\ 3 4 5 6 7 8 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789; .help_txt: DB "COMMANDS:\r\n" DB "SET INFO REN = RENAME PATH CLS [ink]\r\n" @@ -19,4 +22,13 @@ cmd_help: LD HL,.help_txt DB "MD = MKDIR TIME ECHO EXIT\r\n" DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f]\r\n\n" ; ; ; ; ; ; ; ; ; ; ; ; ; -; \ No newline at end of file +; +;LP_PR_LINE_DIR: +; A - атрибуты выводимого символа если ZF=0 +; CF - XY-mode +; DE - место символа в окне, если CF=1 +; HL - адрес с выводимой строкой +; B - разделитель +; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны +; A' - цвет консоли (используется при скролле и очистке окна) +; CF' - выводить символ с атрибутами \ No newline at end of file diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index e22a51a..fc778ee 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -83,12 +83,12 @@ print_compath: ; очистить экран. строку ld de,(cursor_position) ; Y/X полож. ld e,0 - ld hl,#0150 ; Y/X размер + ld hl,#0150 ; Y/X размер ;!HARDCODE win size ld a,(color_screen) ; атрибут ld b,a ld a," " ; символ очистки - ld c,BIOS.LP_CLS_WIN2 ; очистить окно - RST ToBIOS + ld c,Dss.Clear ; очистить окно + RST ToDSS pop bc ; вывести экран. путь ld hl,Buffers.screen_path ; экран. путь diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index a28b21f..28a686b 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -19,7 +19,6 @@ MAIN_MSG: .DIR_2 EQU .DIR_2_ .DIR_3 EQU .DIR_3_ .DIR_4 EQU .DIR_4_ -;.HELP EQU .HELP_ .CALCULATING EQU .CALC_ .CRLF EQU .CRLF_ .INFO_1 EQU .INFO_1_ @@ -51,12 +50,6 @@ MAIN_MSG: DZ " %4 Dir(s)\r %5 byte(s) capacity\r\n" stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n" stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT -; ;!TODO печатать не через ECHO_MESSAGE -; stN .HELP_ : db "COMMANDS:\r\n" -; db "SET INFO REN = RENAME PATH CLS [ink] " -; db "CD = CHDIR DEL = ERASE HELP VER = VERSION " -; db "MD = MKDIR TIME ECHO EXIT " -; DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f] \r\n\n" stN .CALC_ : DZ "Calculating free space...\r" stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n" stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5\r\n" diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM index fc1d8a2..d843bd9 100644 --- a/SHELL/Procedures/Print.ASM +++ b/SHELL/Procedures/Print.ASM @@ -56,6 +56,48 @@ LCPIR: xor a .no_mess: INC HL RET + +;----------------------------------------------------------------------; +; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 +; вход: hl=буфер строки +;----------------------------------------------------------------------; +PRINTZ: ld a,(hl) + inc hl + or a + ret z + ; + cp '%' + jr z,.check_PRM +.char: ld c,Dss.PutChar + RST ToDSS + jp PRINTZ + ; +.bad_PRM: ld a,'%' + jp .char + ; +.check_PRM: ld a,(hl) + cp '9'+1 + jr nc,.bad_PRM + ; + inc hl + sub '1' + push hl + ADD A + ADD A + ADD A + ADD A + LD L,A + LD H,0 + ; + ld bc,Buffers.bat_params.PRM1 + add hl,bc + ld c,Dss.PChars ; вывод строки + RST ToDSS + pop hl + jp PRINTZ + + +/* ;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована ;----------------------------------------------------------------------; ; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 @@ -100,7 +142,7 @@ PRINTZ: ld a,(hl) RST ToDSS pop hl jp PRINTZ - +*/ ; буферы аргументов командной строки ; PRM1: BLOCK 16,0 ; аргумент %1 diff --git a/SHELL/build.txt b/SHELL/build.txt index 941d0e5..e1170b6 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -479 \ No newline at end of file +489 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 9143dcb..a9f5915 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9143dcb7f8fd9cd3ae0bc179b94fced5efd8667f +Subproject commit a9f5915a3275f5ffbafa0994bb97c5846aab826c