diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 41343d6..a06e1cc 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -1,9 +1,9 @@ //////////////////////////////////////////////////////////////////////// -; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 +; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; A - ATTRIB -; B - MODE -; B = #00 GET ATTRIB -; B = #01 SET ATTRIB +; B - MODE: +; 0 GET ATTRIB +; 1 SET ATTRIB ; OUTPUT: A - ATTRIB //////////////////////////////////////////////////////////////////////// ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 @@ -15,6 +15,10 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 POP BC POP HL RET C + ; на случай чтения для обхода проверки CHECK_64kb_CLUSTER + LD A,1 + LD (OPEN_FN.TMP),A + ; LD A,C ; ; @@ -27,7 +31,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 CALL .OPENATR ;R002 RET C ;!TEST ;[x] 16/11/23 optimize get attribute - LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) ;LD B,(IY+_sFM.ATTRIBUT) ;PUSH BC ;CALL CLOSE @@ -36,9 +40,9 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 ;LD A,B ; RET - ; + ; .B_1: DJNZ .B_2 - ; + ; .WRITE_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 фикс для volume ID .WRITE: PUSH AF XOR A @@ -46,8 +50,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 LD (OPEN_FN.TMP),A ; CALL .OPENATR ;R002 - ;!TEST ;[x] 16/11/23 optimize get attribute - CALL NC,OPEN_FN.FM + CALL NC,OPEN_FN.FM ; POP BC RET C @@ -60,34 +63,29 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET C LD A,B RET - ;R002 + ; + ; ; выход: если CF = 0, то DE = record index ;!TEST 9/11/23 record index -.OPENATR: ;!TEST ;[x] 16/11/23 optimize get attribute - ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) - ; - CALL SetPath_GetName ; тест на допуст. имя и настр. на диск +.OPENATR: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск + RET C + ; если это не чтение, то проверяем размер кластера + LD A,(OPEN_FN.TMP) + AND A + CALL Z,CHECK_64kb_CLUSTER RET C - ; [ ] 26/06/2024 - CALL CHECK_64kb_CLUSTER - RET C ; CALL MASK RET C LD A,FAT_ATTR.NoVolID - ;!TEST ;[x] 16/11/23 optimize get attribute - JP SEARCH.Custom - ;CALL SEARCH.Custom - ;RET C ; запись не найдена - ;JP OPEN.FM ; на поиск своб. дескриптора - ; + JP SEARCH.Custom ; ; [ ] ; !TODO для команды LABEL в Shell ; 1. проверить что в HL указана только метка в кавычках ; 2. если метка без недопустимых символов, то делаем её не ; только в BPB, но и на корневом разделе, иначе удаляем на корневом ; 3. открываем требуемый диск через .force, чтоб сбросить кэши -.B_2: DJNZ .error_fn +.B_2: DJNZ .error_fn ; .error_fn: LD A,DSS_Error.sys.INVALID_FUNCTION SCF diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm index 68a61d9..11f2596 100644 --- a/DSS/API/ChDir.asm +++ b/DSS/API/ChDir.asm @@ -28,7 +28,7 @@ CHDIR_FN: ; CHDIR: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск RET C - LD HL,TMPNAME + LD HL,CORE_BUFFERS.TMPNAME LD A,(HL) OR A RET Z diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index acf7260..21fa9a5 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -57,8 +57,8 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN: ; ;no_file_found .DO: ; FAT_DIRECTORY_RECORD.NAME + .EXT - LD HL,MASKARE - LD DE,HANDBUF + LD HL,CORE_BUFFERS.MASKARE + LD DE,CORE_BUFFERS.HANDBUF LD BC,11 LDIR EX DE,HL diff --git a/DSS/API/Ex_Path.asm b/DSS/API/Ex_Path.asm index aab7a8b..71142b5 100644 --- a/DSS/API/Ex_Path.asm +++ b/DSS/API/Ex_Path.asm @@ -56,7 +56,7 @@ EX_PATH: EXX .EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET - ; Выделить имя диска + ; Выделить имя диска .GET_DRIVE: LD (NM_DRIVE),DE CALL .FULL RET C @@ -76,18 +76,18 @@ EX_PATH: EXX SCF RET - ; Выделить директорию + ; Выделить директорию .GET_PATH: LD (NM_PATH),DE JR .FULL - ; Выделить имя файла + ; Выделить имя файла .GET_NAME: LD (NM_NAME),DE JR .FULL - ; Выделить расширение файла + ; Выделить расширение файла .GET_TYPE: LD (NM_EXTN),DE JR .FULL - ; Выделить диск, путь, файл и расш. + ; Выделить диск, путь, файл и расш. .GET_ALL_EX: EX DE,HL LD C,(HL) INC HL @@ -110,7 +110,7 @@ EX_PATH: EXX LD (NM_EXTN),BC EX DE,HL ;JR EX_FULL - ; Разобрать строку + ; Разобрать строку .FULL: EX AF,AF' EXX XOR A @@ -125,7 +125,7 @@ EX_PATH: EXX EXX EX AF,AF' .PAT0: LD DE,TMPBUF - LD BC,#0D01 ;!HARDCODE счетчики + LD BC,256*TMPBUF.Size + 1 ; счетчики .PAT1: LD A,(HL) CALL UPPER ; a..z -> A..Z LD (DE),A @@ -146,12 +146,12 @@ EX_PATH: EXX LD A,DSS_Error.sys.INVALID_NAME SCF RET - ; + ; .GLOBP1: EX AF,AF' SET GLOB_PR,A EX AF,AF' JR .PAT2 - ; + ; .NAME_YEP: LD A,2 CP C JR Z,.NOFNAME @@ -194,7 +194,7 @@ EX_PATH: EXX .NOFNAME: EX AF,AF' AND A RET - ; + ; .DRIVE_YEP: XOR A LD (DE),A PUSH HL @@ -207,7 +207,7 @@ EX_PATH: EXX SET DRIV_PR,A ; указано имя диска EX AF,AF' JP .PAT0 - ; + ; .PATH_YEP: XOR A LD (DE),A PUSH HL @@ -226,12 +226,17 @@ EX_PATH: EXX SET PATH_PR,A EX AF,AF' JP .PAT0 -;!TODO перенести/заменить на общий -TMPBUF: DB " ",#00 ; 12 пробелов +; + +;TMPBUF: DB " ",#00 ; 13 пробелов + 0 +;TMPBUF: DB " ",#00 ; 12 пробелов + 0 +TMPBUF EQU CORE_BUFFERS.TMPNAME +.Size EQU CORE_BUFFERS.TMPNAME.Size NM_DRIVE: DW NM_DRIVE_A NM_NAME: DW NM_NAME_A NM_EXTN: DW NM_EXTN_A NM_PATH: DW NM_PATH_A +;!TODO перенести/заменить на общий буфер NM_DRIVE_A: BLOCK 9,0 NM_NAME_A: DB " ",#00 ; 12 пробелов NM_EXTN_A: DB " ",0 diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index b830d56..cc7d871 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -235,7 +235,7 @@ RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN ; Если расш. файла задано, сравнить его с "exe". ;------------------------------------------------- TST_EXT: LD HL,EXE_EXT ; "EXE" - LD DE,MASKARE+8 + LD DE,CORE_BUFFERS.MASKARE.Ext LD B,3 LD A,(DE) CP ' ' @@ -478,7 +478,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD (HL),A INC HL .YP_ESLA: EX DE,HL - LD HL,TMPNAME + LD HL,CORE_BUFFERS.TMPNAME .loop: LD A,(HL) LDI CP ' '+1 diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm index 50ba524..1d1d9f1 100644 --- a/DSS/API/Find.asm +++ b/DSS/API/Find.asm @@ -31,7 +31,7 @@ F_FIRST: CALL .INIT_VARS LD A,(.SEARCH_ATTRIBUT) CALL SEARCH.Custom RET C - LD HL,MASKARE + LD HL,CORE_BUFFERS.MASKARE .DTABUF+1: LD DE,0 LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; копируем .NAME и .EXT LDIR @@ -43,13 +43,13 @@ F_FIRST: CALL .INIT_VARS LD BC,FAT_DIRECTORY_RECORD ADD IX,BC LD (F_NEXT.CURHND),IX - LD HL,HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT - LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT + LD HL,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT + LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT LDIR - LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) + LD A,(CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT) LD (DE),A INC DE - LD HL,HANDBUF + LD HL,CORE_BUFFERS.HANDBUF .FNDMODE+1: LD A,0 OR A JR NZ,.FIND_M2 @@ -87,7 +87,7 @@ F_NEXT: RET Z LD (F_FIRST.DTABUF),DE EX DE,HL - LD DE,MASKARE + LD DE,CORE_BUFFERS.MASKARE LD BC,11 ;!HARDCODE LDIR diff --git a/DSS/API/GSwitch.asm b/DSS/API/GSwitch.asm index 0d5ce7b..51557a6 100644 --- a/DSS/API/GSwitch.asm +++ b/DSS/API/GSwitch.asm @@ -11,21 +11,21 @@ ; DE - SWITCH BUFFER ;EXIT: BUFFER ////////////////////////////////////////////////////////////////////// -GSWITCH: XOR A - LD (DE),A -.loop1: LD A,(HL) - INC HL - CP " " - RET C - JR Z,.loop1 -.loop2: LD (DE),A - LD A,(HL) - INC HL - INC DE - CP " "+1 - JR NC,.loop2 - CP " " - LD A,0 - LD (DE),A - RET +GSWITCH: XOR A + LD (DE),A +.loop1: LD A,(HL) + INC HL + CP " " + RET C + JR Z,.loop1 +.loop2: LD (DE),A + LD A,(HL) + INC HL + INC DE + CP " "+1 + JR NC,.loop2 + CP " " + LD A,0 + LD (DE),A + RET ; \ No newline at end of file diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 6bf4046..6959be3 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -13,17 +13,18 @@ MKDIR: CCF RET ; -; Entry point ;!TEST Current Dir ;[x] 15/10/23 -.B: PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - CALL .START - PUSH AF - LD HL,CORE_BUFFERS.CurrentDirectory - CALL CHDIR - POP AF - RET +; Entry point +.B: PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL .START + PUSH AF + ;Current Dir + LD HL,CORE_BUFFERS.CurrentDirectory + CALL CHDIR + POP AF + RET ; .START: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск RET C @@ -36,6 +37,7 @@ MKDIR: ;!TEST optimization ранее SetPath_GetName уже загрузил директорию ;CALL LOADDIR ; прочитать список каталога ; + ;[ ] cdfs CALL SEARCH.Dir ; поиск записи каталога в списке диска ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 ; LD A,DSS_Error.sys.DIR_EXISTS @@ -59,8 +61,8 @@ MKDIR: ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - LD HL,MASKARE - LD DE,HANDBUF + LD HL,CORE_BUFFERS.MASKARE + LD DE,CORE_BUFFERS.HANDBUF LD BC,11 LDIR EX DE,HL @@ -113,7 +115,7 @@ MKDIR: DJNZ .loop3 ; скопировать байты 11..31 FAT_DIRECTORY_RECORD INC HL - LD DE,HANDBUF+FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + LD DE,CORE_BUFFERS.HANDBUF+FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла EX DE,HL LD BC,21 ; !HARDCODE LDIR @@ -139,14 +141,14 @@ MKDIR: ; ;LD IX,HANDBUF XOR A - LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A - LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A - LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A - LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A - LD DE,HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A + LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A + LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A + LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A + LD DE,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .copy_dir_record: EX DE,HL - LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.ATTRIBUT ; 21 + LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_DIRECTORY_RECORD.ATTRIBUT ; 21 LDIR POP AF OUT (SLOT3),A diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 02bac41..ed6c7e8 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -44,8 +44,8 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 ; LD D,YH LD E,YL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE + LD HL,CORE_BUFFERS.HANDBUF + LD BC,CORE_BUFFERS.HANDBUF.SIZE LDIR .TMP+1: LD A,0 LD (IY+_sFM.ACCESS_MODE),A diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm index 928356c..30597b6 100644 --- a/DSS/API/Rename.asm +++ b/DSS/API/Rename.asm @@ -71,7 +71,7 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 SET_PAGE_X DIRPAGE EX AF,AF' ; - LD HL,MASKARE + LD HL,CORE_BUFFERS.MASKARE LD D,XH LD E,XL LD BC,11 diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 906f904..1bc9517 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -42,10 +42,10 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 CALL LOADDIR CALL SEARCH.Dir RET C - ; fat32 - LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + ; fat32 ; [ ] CDFS + LD HL,(CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) EXX - LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + LD HL,(CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы ; ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах diff --git a/DSS/API/SetVMod.asm b/DSS/API/SetVMod.asm index da58ae6..945202d 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,(BANKTBL + TXTPAGE) LD B,A LD C,BIOS.WIN_COPY @@ -216,7 +216,6 @@ SAVETXT: PUSH AF .NOSAVET: POP AF RET ;----------------------------------------------------------------------- - BACKTXT: PUSH AF .VMODE+1: LD A,#00 ;BIT 7,A @@ -230,7 +229,7 @@ BACKTXT: PUSH AF LD IX,#C000 .WinMax+1: LD HL,#2050 LD DE,#0000 - LD A,(BANKTBL+TXTPAGE) + LD A,(BANKTBL + TXTPAGE) LD B,A LD C,BIOS.WIN_RESTORE ;[x] 29/9/23 diff --git a/DSS/DOS_FS.ASM b/DSS/DOS_FS.ASM index 1c1f007..7fbafa4 100644 --- a/DSS/DOS_FS.ASM +++ b/DSS/DOS_FS.ASM @@ -70,7 +70,7 @@ SetPath_GetName: RET NZ INC HL ; -.dir_loop: LD DE,TMPNAME +.dir_loop: LD DE,CORE_BUFFERS.TMPNAME LD BC,#0DFF .loop: LD A,(HL) INC HL @@ -88,20 +88,20 @@ SetPath_GetName: RET ; .done: XOR A - LD (TMPNAME),A + LD (CORE_BUFFERS.TMPNAME),A RET ; .DIR_NAME: XOR A LD (DE),A PUSH HL - LD HL,TMPNAME + LD HL,CORE_BUFFERS.TMPNAME CALL OPENDIR POP HL RET C JR .dir_loop ; ; Буфер имени 8.3 формата -TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!FIXIT к буферам +;TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!FIXIT к буферам ;----------------------------------------------------------------------; @@ -218,8 +218,8 @@ OPENDSK: ;!TEST DRV.Open ; DE - 11 bytes filename ; RET: C=2 FILE WITHOUT EXTENTION ; C=1 FILE WITH EXTENTION -MASK: LD HL,TMPNAME -.name: LD DE,MASKARE +MASK: LD HL,CORE_BUFFERS.TMPNAME +.name: LD DE,CORE_BUFFERS.MASKARE .custom: PUSH HL PUSH DE LD H,D @@ -399,7 +399,7 @@ DIR_PATH_CHECK: LD A,(HL) ;----------------------------------------------------------------------; -CHECK_NAME: LD HL,MASKARE +CHECK_NAME: LD HL,CORE_BUFFERS.MASKARE .custom: LD BC,11 ;!HARDCODE LD A,"?" CPIR diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index b4c1be4..af5c4ab 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -69,26 +69,20 @@ RST_0x10: JP RST_10 RST_0x18: PUSH AF PUSH BC DRV_PG_NUMBER+2: - LD BC,0*256+SLOT0 + LD BC,SLOT0 + 0*256 JP PORTAL.out_MAIN //////////////////////////////////////////////////////////////////////// -;NOT USED +;FS API //////////////////////////////////////////////////////////////////////// _mInfoBLOCK #20-$,#FF -RST_0x20: JP RST_20 -//////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////// -RST_20: -RST_28: -NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET +RST_0x20: PUSH AF + PUSH BC +FS_PG_NUMBER+2: LD BC,SLOT0 + 0*256 + JP PORTAL.out_MAIN //////////////////////////////////////////////////////////////////////// @@ -101,6 +95,15 @@ RST_0x28: JP RST_28 +//////////////////////////////////////////////////////////////////////// +RST_28: +NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +//////////////////////////////////////////////////////////////////////// + + + ;MOUSE API //////////////////////////////////////////////////////////////////////// _mInfoBLOCK #30-$,#FF @@ -171,6 +174,20 @@ RST_10: PUSH HL +//////////////////////////////////////////////////////////////////////// +; in: C - страница для подключения +; out: A - страница которая была подключена +SET_PAGE_X: LD B,high BANKTBL + LD A,(BC) + LD B,A + LD C,SLOT3 + IN A,(SLOT3) + OUT (C),B + RET +//////////////////////////////////////////////////////////////////////// + + + ;DRIVE PAGE SWITCH //////////////////////////////////////////////////////////////////////// _mInfoBLOCK #80-$,0 @@ -190,10 +207,18 @@ PORTAL.out_MAIN: CLEAR_BUFFER_AND_INIT_PROC: XOR A LD HL,CLEAR_ZONE.start - LD DE,CLEAR_ZONE.start+1 - LD BC,CLEAR_ZONE.size-1 + LD DE,CLEAR_ZONE.start + 1 + LD BC,CLEAR_ZONE.size - 1 LD (HL),A LDIR + ;!TODO перенести в _sBuffers в начало ещё буферы с пробелами в начале работы + LD HL,CORE_BUFFERS.TMPNAME + LD DE,CORE_BUFFERS.TMPNAME + 1 + LD BC,CORE_BUFFERS.TMPNAME.Size - 1 + LD A," " + LD (HL),A + LDIR + ; LD HL,':'*256 + 'X' LD (CORE_BUFFERS.CurrentPath),HL LD A,'\' ; @@ -321,11 +346,11 @@ DSS_API_TABLE: - +/* ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS -BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE -HANDBUF: BLOCK HANDBUF.SIZE,0 +BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE +HANDBUF: BLOCK HANDBUF.SIZE,0 ; ;!FIXIT к буферам @@ -333,31 +358,39 @@ MASKARE: BLOCK 8,0 ; BLOCK 3,0 ; расш. BLOCK 21,0 ; 11+21=32 ; +*/ DISPLAY "DOS-MAIN end address: ",/H,$-1 +BANKTBL EQU ($ & #FF00) + (1 > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < -CLEAR_ZONE.start EQU $ +CLEAR_ZONE.start EQU BANKTBL + BANKTBL.Size MODULE CORE_BUFFERS -BUFFERSplace _sBuffers=$ -FM_BUF _sFM = BUFFERSplace.FileManipulator -.Size EQU _sFM -.FullSize EQU FMCOUNT*FM_BUF.Size -FS_Buffer _sFS_Buffer = BUFFERSplace.FS_Buffer -EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header -XSTACK _sStack = BUFFERSplace.Stack -.Spoint EQU XSTACK + _sStack -BUFFER EQU BUFFERSplace.Buffer -SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER -MemoryTable EQU BUFFERSplace.MemoryTable -CurrentPath EQU BUFFERSplace.CurrentPath -CurrentDirectory EQU BUFFERSplace.CurrentDirectory -.DEPTH EQU DIRECTORY_PATH_LENGTH -WorkDirectory EQU BUFFERSplace.WorkDirectory -.DEPTH EQU DIRECTORY_PATH_LENGTH +BUFFERSplace _sBuffers = CLEAR_ZONE.start +TMPNAME EQU BUFFERSplace.TMPNAME +.Size EQU 8+1+3+1 ; Буфер имени 8.3 + 0 +HANDBUF EQU BUFFERSplace.HANDBUF +.SIZE EQU FAT_DIRECTORY_RECORD +MASKARE _sMASKARE = BUFFERSplace.MASKARE +FM_BUF _sFM = BUFFERSplace.FileManipulator +.Size EQU _sFM +.FullSize EQU FMCOUNT*FM_BUF.Size +FS_Buffer _sFS_Buffer = BUFFERSplace.FS_Buffer +EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header +XSTACK _sStack = BUFFERSplace.Stack +.Spoint EQU XSTACK + _sStack +BUFFER EQU BUFFERSplace.Buffer +SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER +MemoryTable EQU BUFFERSplace.MemoryTable +CurrentPath EQU BUFFERSplace.CurrentPath +CurrentDirectory EQU BUFFERSplace.CurrentDirectory +.DEPTH EQU DIRECTORY_PATH_LENGTH +WorkDirectory EQU BUFFERSplace.WorkDirectory +.DEPTH EQU DIRECTORY_PATH_LENGTH ENDMODULE CLEAR_ZONE.size EQU _sBuffers ASSERT (CLEAR_ZONE.start + _sBuffers)<#4000, "Warning!!! OUT OF SLOT0" @@ -387,17 +420,30 @@ CLEAR_ZONE.size EQU _sBuffers DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size DISPLAY "--- --- --- --- --- --- --- ---" + + EXPORT BANKTBL + EXPORT CLEAR_ZONE.start + EXPORT CLEAR_ZONE.size EXPORT CORE_BUFFERS.BUFFERSplace + EXPORT CORE_BUFFERS.HANDBUF + EXPORT CORE_BUFFERS.HANDBUF.SIZE + EXPORT CORE_BUFFERS.MASKARE + EXPORT CORE_BUFFERS.TMPNAME EXPORT CORE_BUFFERS.FM_BUF + EXPORT CORE_BUFFERS.FM_BUF.Size + EXPORT CORE_BUFFERS.FM_BUF.FullSize EXPORT CORE_BUFFERS.FS_Buffer EXPORT CORE_BUFFERS.EXEBUFF EXPORT CORE_BUFFERS.XSTACK + EXPORT CORE_BUFFERS.XSTACK.Spoint EXPORT CORE_BUFFERS.BUFFER EXPORT CORE_BUFFERS.SECTOR_BUFFER EXPORT CORE_BUFFERS.MemoryTable + EXPORT CORE_BUFFERS.CurrentPath EXPORT CORE_BUFFERS.CurrentDirectory + EXPORT CORE_BUFFERS.CurrentDirectory.DEPTH EXPORT CORE_BUFFERS.WorkDirectory -; + EXPORT CORE_BUFFERS.WorkDirectory.DEPTH ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < @@ -413,7 +459,7 @@ CLEAR_ZONE.size EQU _sBuffers ASSERT "Warning! ENVVALUE != BUFFER" ENDIF - DISPLAY "FAT MODULE SIZE: ",/A,FAT_MODULE_SIZE + DISPLAY "MODULE SIZE: ",/A,MODULE_SIZE DISPLAY "DEPLOY end address: ",/H,$ DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes." diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index fc5f8b9..6a6a81f 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -30,18 +30,25 @@ ENDM ; +; ; +; MACRO SET_PAGE_X new_page +; LD A,(BANKTBL + new_page) +; LD B,A +; LD C,SLOT3 +; IN A,(SLOT3) +; OUT (C),B +; ENDM +; ; + + ; MACRO SET_PAGE_X new_page - LD A,(BANKTBL+new_page) - LD B,A - LD C,SLOT3 - IN A,(SLOT3) - OUT (C),B + LD C,new_page + CALL SET_PAGE_X ENDM ; - ; ; MACRO BUFFER_KEYINTER ; _mInfoALIGN 256,0 diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index f25ec6d..216f09f 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -1,18 +1,8 @@ -;[BEGIN] -;//MODULE: FAT -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION -;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET -;RY01 16-11-1999 DNS ERROR READING FAT CHAIN -;RX01 10-02-1999 DNS UPGRADE FAT CASH -;--------------------------------------------------------------- ; [ ] RST_FS ;----------------------------------------------------------------------; -FAT_MODULE_START EQU $ +;███████████████████████████████████████████████████████████████████████████████████████████████████████; +; MODULE FAT_FS +MODULE_START EQU $ SET_FSInfo: LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) @@ -65,6 +55,7 @@ READ_BPB: LD C,Dss.DRV.GetBPB WRITE_FSinfo: LD IX,(CORE_BUFFERS.FS_Buffer.FSINFO_Sector) LD HL,0 ;JR WRITE_SECTOR + ; ; Записать сектор из SECTOR_BUFFER ; Вход: HL:IX = Logical Block (sector) WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write @@ -176,7 +167,7 @@ SEARCH: OR D JR NZ,.next_record ; -.found_attr: LD HL,MASKARE +.found_attr: LD HL,CORE_BUFFERS.MASKARE LD D,XH LD E,XL LD B,11 @@ -199,9 +190,9 @@ SEARCH: ; EXX PUSH IX ; - LD HL,HANDBUF + LD HL,CORE_BUFFERS.HANDBUF EX DE,HL - LD BC,HANDBUF.SIZE + LD BC,CORE_BUFFERS.HANDBUF.SIZE LDIR ;!TEST 9/11/23 record index POP DE @@ -308,7 +299,7 @@ FINDDIR: SET_PAGE_X DIRPAGE LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT) AND FAT_ATTR.DIRECTORY JR Z,.next_step - LD HL,MASKARE + LD HL,CORE_BUFFERS.MASKARE LD D,XH LD E,XL EX DE,HL @@ -489,13 +480,13 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF JR Z,.REROOT ; .no_root: EXX - LD HL,MASKARE - LD DE,MASKARE+1 + LD HL,CORE_BUFFERS.MASKARE + LD DE,CORE_BUFFERS.MASKARE+1 LD BC,10 ;!HARDCODE LD (HL),' ' LDIR EXX - LD DE,MASKARE + LD DE,CORE_BUFFERS.MASKARE .loop: LDI LD A,(HL) OR A @@ -630,8 +621,8 @@ WRT_HND: .WRT_HN2: ;LD D,XH ;LD E,XL EX DE,HL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE + LD HL,CORE_BUFFERS.HANDBUF + LD BC,CORE_BUFFERS.HANDBUF.SIZE LDIR EX AF,AF' OUT (SLOT3),A @@ -2784,6 +2775,6 @@ CHECK_64kb_CLUSTER: ; ;----------------------------------------------------------------------; -FAT_MODULE_SIZE EQU $-FAT_MODULE_START -;//MODULE: FAT -;[END] \ No newline at end of file +MODULE_SIZE EQU $ - MODULE_START +; ENDMODULE +;███████████████████████████████████████████████████████████████████████████████████████████████████████; \ No newline at end of file diff --git a/DSS/FS/FS.ASM b/DSS/FS/FS.ASM index c17764d..5222613 100644 --- a/DSS/FS/FS.ASM +++ b/DSS/FS/FS.ASM @@ -20,6 +20,12 @@ RD_BPB: CALL READ_BPB ; [ ] cdfs +;███████████████████████████████████████████████████████████████████████████████████████████████████████; + + + + + INCLUDE "FAT.ASM" INCLUDE "CDFS.ASM" diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 76c73f3..4ee0e3a 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -288,7 +288,7 @@ cursor_interrupt: LD A,(Cursor_Off.Flag) OR A RET Z -.timer+1: LD A,1 ; пауза мигания +.timer+1: LD A,1 ; пауза мигания DEC A CALL Z,Cursor LD (.timer),A @@ -300,27 +300,27 @@ SETUP_CURSORS: .buffer.size EQU 2048 ; in a,(SLOT3) - push af ; сохр. порт - ld a,(BANKTBL+TXTPAGE) ; 2-й лог. номер страницы расш. ДОС + push af ; сохр. порт + ld a,(BANKTBL + TXTPAGE) ; 2-й лог. номер страницы расш. ДОС out (SLOT3),a ; ; получить сист. знакоген. -; ld de,.buffer ;!HARDCODE буфер для 2048 байт данных +; ld de,.buffer ;!HARDCODE буфер для 2048 байт данных ; push de -; ld c,BIOS.WIN_GET_ZG ; получить знакоген. +; ld c,BIOS.WIN_GET_ZG ; получить знакоген. ; rst ToBIOS ; ; заполнить кодом #FF 2 нижние линии -; ld hl,.buffer+(2048-(2*256)) ;!HARDCODE последние 512 байт +; ld hl,.buffer+(2048-(2*256)) ;!HARDCODE последние 512 байт ; ld bc,511 -; ld a,CURSOR_ZG; ; номер знакоген. "черточка" +; ld a,CURSOR_ZG; ; номер знакоген. "черточка" ; call .fill_data_font ; pop hl ; ; заполнить остальные 6 линий (полный блок) -; ld bc,2048-513 ;!HARDCODE -; ld a,INS_CUR_ZG ; номер знакоген. "блок" +; ld bc,2048-513 ;!HARDCODE +; ld a,INS_CUR_ZG ; номер знакоген. "блок" ; call .fill_data_font ; pop af -; out (SLOT3),a ; восст. порт +; out (SLOT3),a ; восст. порт ; ret ; ; Настройка знакоген. и его регистрация ; ; вход: a=номер знакоген. @@ -332,8 +332,8 @@ SETUP_CURSORS: ; ld (hl),#FF ; inc de ; ldir -; .set: ld de,.buffer ; знакоген. -; ld c,BIOS.WIN_SET_ZG ; уст. знакоген. +; .set: ld de,.buffer ; знакоген. +; ld c,BIOS.WIN_SET_ZG ; уст. знакоген. ; jp ToBIOS ; ; [ ] 31/03/2025 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index fdabc66..9a0b26f 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -117,8 +117,18 @@ ENDS ; + STRUCT _sMASKARE +.Name BLOCK 8,0 ; имя файла +.Ext BLOCK 3,0 ; расш. +.Data BLOCK 21,0 ; 11+21=32 + ENDS + +; Буфер имени 8.3 формата ; STRUCT _sBuffers +.TMPNAME BLOCK 8+4+1,0 ; Буфер имени 8.3 + 0 +.HANDBUF BLOCK FAT_DIRECTORY_RECORD,0 +.MASKARE _sMASKARE .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; .FS_Buffer _sFS_Buffer diff --git a/DSS/defines.inc b/DSS/defines.inc index 8e97679..46e755c 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -131,7 +131,7 @@ ENVADDR EQU #E400 ;FAT_CACHE EQU #C000 FMCOUNT EQU 10 ; Количество файловых манипуляторов -HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD +;HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD ;----------------------------------------------------; ; diff --git a/DSS/first_init.asm b/DSS/first_init.asm index b9d918a..ecf373d 100644 --- a/DSS/first_init.asm +++ b/DSS/first_init.asm @@ -60,45 +60,57 @@ F_START: DI ;-----------------------------------------------------------------------; -DEPLOY: ;Allocate memory - LD BC,USING_MEMPAGES*256 + BIOS.GetMem - RST ToBIOS - RET C - LD C,A - ; - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - LD (DRV_CONTENT + DRV_PAGE.MAIN_PAGE_NUMBER),A ;!TEST - OUT (SLOT3),A - ; - LD A,C - LD HL,BANKTBL + #C000 - LD C,BIOS.GetMemBlkPages - RST ToBIOS - ; должна идти после GetMemBlkPages, чтоб вместо - ; закрывашки #FF поставить страницу COREPAGE - LD HL,BANKTBL + COREPAGE - IN A,(SLOT0) - LD (HL),A - ; для API драйвера мышки - LD (MOUSE_HANDLER.CorePage),A - LD A,(BANKTBL + DRVPAGE) - LD (RST_0x30.drv_page),A - ; - POP AF - OUT (SLOT3),A - SET_PAGE_X DRVPAGE - PUSH AF - ; - LD HL,DRV_CONTENT - LD DE,#C000 - LD BC,DRV_CONTENT.SIZE - LDIR - IN A,(SLOT3) - LD (DRV_PG_NUMBER),A - POP AF - OUT (SLOT3),A - AND A - RET +DEPLOY: ;Allocate memory + LD BC,USING_MEMPAGES*256 + BIOS.GetMem + RST ToBIOS + RET C + LD C,A + ; + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + LD (DRV_CONTENT + DRV_PAGE.MAIN_PAGE_NUMBER),A + OUT (SLOT3),A + ; + LD A,C + LD HL,BANKTBL + #C000 + LD C,BIOS.GetMemBlkPages + RST ToBIOS + ; должна идти после GetMemBlkPages, чтоб вместо + ; закрывашки #FF поставить страницу COREPAGE + LD HL,BANKTBL + COREPAGE + IN A,(SLOT0) + LD (HL),A + ; для API драйвера мышки + LD (MOUSE_HANDLER.CorePage),A + LD A,(BANKTBL + DRVPAGE) + LD (RST_0x30.drv_page),A + ; + POP AF + OUT (SLOT3),A + SET_PAGE_X DRVPAGE + PUSH AF + ; + LD HL,DRV_CONTENT + LD DE,#C000 + LD BC,DRV_CONTENT.SIZE + LDIR + IN A,(SLOT3) + LD (DRV_PG_NUMBER),A + ; [ ] CDFS prepare + /* + SET_PAGE_X FSPAGE + ; + LD HL,FS_CONTENT + LD DE,#C000 + LD BC,FS_CONTENT.SIZE + LDIR + IN A,(SLOT3) + LD (FS_PG_NUMBER),A + */ + ; + POP AF + OUT (SLOT3),A + AND A + RET ;-----------------------------------------------------------------------; \ No newline at end of file