From 34ee5a9db84e9eacd2fd2ab18570dae66465e63a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 15 Nov 2023 02:43:58 +1000 Subject: [PATCH] =?UTF-8?q?-bug:=20CLOSE=5FFN=20=D0=BC=D0=BE=D0=B3=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BE=D1=82=D0=B5=D1=80=D1=8F=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BB=D0=B0=D1=81=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D1=8B=20=D0=B8=20=D0=B7=D0=B0=D0=BF=D0=B0=D1=80=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B.=20=D0=98?= =?UTF-8?q?=20=D0=BA=D1=83=D1=87=D0=B0=20=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8?= =?UTF-8?q?=D1=85=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=BA=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/CHANGES.LOG | 11 +- DSS/DOS5.ASM | 400 +++++++++++++++++++------------------------ DSS/DOS_FM.ASM | 8 +- DSS/DOS_X.ASM | 140 +++++++-------- DSS/DSS_MACROSES.Z80 | 51 +++--- DSS/EXECUTE.ASM | 33 ++-- DSS/FAT_X.ASM | 14 +- DSS/INTMOUSE.ASM | 9 +- DSS/KEYINTER.ASM | 50 +++--- DSS/build.txt | 2 +- DSS/defines.inc | 18 +- 11 files changed, 340 insertions(+), 396 deletions(-) diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index 2256ee4..0b235c9 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -1,3 +1,12 @@ +!FIXIT +[ ] D:\>copy dss\system.dos c:\system.dos + Can't open source file +[ ] E:\BIN\MENU>c:\dss + что-то про заполненность директории +[ ] C:\????? или ????? + исполняется как команда + +----------------------------------------------------------------------------------------------------------------------------------------------- !TODO Важное: [ ] перед началом работы любой процедуры записи/чтения драйва устанавливать флаг, чтоб не было повторного вызова (из прерывания, например) @@ -8,7 +17,7 @@ Вообще не важное: [ ] исправить выход из функции #41 при возможном увеличении номера таски на 1 при 255 -------------------------------- +----------------------------------------------------------------------------------------------------------------------------------------------- DSS 1.70.2 Изменения после версии 1.70 diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index f2ebd7c..dc0721a 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -81,12 +81,12 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C LD A,FAT_ATTR.NoVolID - CALL SEARCH.ASEARCH + CALL SEARCH.Custom ; JR NC,OPENAT ; на поиск своб. дескриптора ; ; запись не найдена ; RET @@ -106,7 +106,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; CALL .Prepare RET C - CALL SEARCH + CALL SEARCH.File CALL NC,DELETE ;FILE EXIST RECREAT JR .DO ; @@ -120,7 +120,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; CALL .Prepare RET C - CALL SEARCH + CALL SEARCH.File LD A,DSS_Error.sys.FILE_EXISTS CCF RET C @@ -158,19 +158,21 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 DJNZ .loop2 ; CALL WRT_HND - CALL SAVEDIR + RET C + ;CALL SAVEDIR .PATH0+1: LD HL,0 XOR A - JP OPEN ;R08 + LD (OPEN.TMP),A + JP OPEN.FILE ;R08 .Prepare: - AND #E7 ;R04 %76A00SHR = !FAT_ATTR + AND #E7 ;R04 %76A00SHR = !FAT_ATTR ;!HARDCODE LD (.TMP),A LD (.PATH0),HL CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE JP MASK CREAT_N EQU CREATE.NEW @@ -187,8 +189,8 @@ DEL_FN: ;!TEST ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C ; @@ -203,7 +205,7 @@ DEL_FN: ;!TEST SCF RET Z CALL LOADDIR - CALL SEARCH + CALL SEARCH.File RET C ;JP DELETE ; пометить запись как "удаленная" @@ -239,19 +241,17 @@ DELETE: SET_PAGE_X DIRPAGE ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// -RENAME: - ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - PUSH DE - CALL DIR_PATH_CHECK.forceCheck - POP DE - POP HL - RET C - ; - +RENAME: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + PUSH DE + CALL DIR_PATH_CHECK.forceCheck + POP DE + POP HL + RET C + ; PUSH DE - LD DE,MASKARE - CALL MASK + ;LD DE,MASKARE + CALL MASK.name POP DE RET C LD HL,MASKARE @@ -265,11 +265,11 @@ RENAME: CALL LOADDIR ; прочитать список каталога ;LD A,#33 LD A,FAT_ATTR.NoSYSnoVolID - CALL SEARCH.ASEARCH ; поиск записи в списке диска + CALL SEARCH.Custom ; поиск записи в списке диска POP HL RET C - LD DE,MASKARE - CALL MASK + ;LD DE,MASKARE + CALL MASK.name RET C LD HL,MASKARE LD BC,11 @@ -280,7 +280,7 @@ RENAME: RET Z PUSH IX LD A,FAT_ATTR.NoSYSnoVolID - CALL SEARCH.ASEARCH ; поиск записи в списке диска + CALL SEARCH.Custom ; поиск записи в списке диска POP IX LD A,DSS_Error.sys.FILE_EXISTS CCF @@ -304,8 +304,8 @@ RENAME: ; A=0 чтение/запись ; A=1 чтение ; A=2 запись -; выход: A - дескриптор файла, если CF=0 -; код ошибки, если CF=1 +; выход: CF=0, A - дескриптор файла. +; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD C,A @@ -322,22 +322,14 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 OPEN: LD (.TMP),A ; enter point for CREATE CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C -.FILE: CALL SEARCH ; enter point for EXEC +.FILE: CALL SEARCH.File ; enter point for EXEC RET C ;R02 -.FM: ; enter point for ATTRIB - ; [ ] 13/11/2023 -bug with bad clusters ;!TEST - ; XOR A - ; CALL SET_FM - ; LD C,(IY+_sFM.ST_CLUSTER) - ; LD B,(IY+_sFM.ST_CLUSTER+1) - ; PUSH BC - ; - CALL GET_FM +.FM: CALL GET_FM ; enter point for ATTRIB RET C LD A,C EX AF,AF' @@ -396,25 +388,28 @@ CLOSE: LD (.TMP),A RET NZ BIT 7,(IY+_sFM.ACCESS_MODE) JR Z,.NOTMODF - LD D,(IY+_sFM.DIR_CLUSTER) - LD E,(IY+_sFM.DIR_CLUSTER+1) + LD E,(IY+_sFM.DIR_CLUSTER) + LD D,(IY+_sFM.DIR_CLUSTER+1) PUSH DE - ; [ ] 13/11/2023 -bug with bad clusters ;!TEST + ; [ ] 15/11/2023 -bug with bad clusters ;!TEST LD A,(IY+_sFM.DRIVE) CALL OPENDSK - IF TEST_FEATURE - CALL SET_DIR - ENDIF ; XOR A CALL SET_FM POP DE - LD (IY+_sFM.DIR_CLUSTER),D - LD (IY+_sFM.DIR_CLUSTER+1),E + LD (IY+_sFM.DIR_CLUSTER),E + LD (IY+_sFM.DIR_CLUSTER+1),D + ; [ ] 15/11/2023 -bug with bad clusters ;!TEST + LD (IY+_sFM.ST_CLUSTER),E + LD (IY+_sFM.ST_CLUSTER+1),D + ; CALL LOADDIR .TMP+1: LD A,0 CALL SET_FM ; + SET_PAGE_X DIRPAGE + ; ;TEST 9/11/23 ; LD HL,DIR ; LD DE,#0020 @@ -434,12 +429,10 @@ CLOSE: LD (.TMP),A LD D,YH LD E,YL EX DE,HL - PUSH HL - - SET_PAGE_X DIRPAGE - - POP HL - LD BC,#0020 + ;PUSH HL + ;SET_PAGE_X DIRPAGE + ;POP HL + LD BC,#0020 ;!HARDCODE LDIR OUT (SLOT3),A CALL SAVEDIR @@ -484,12 +477,12 @@ F_FIRST: POP HL CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C LD A,(.TMP) - CALL SEARCH.ASEARCH + CALL SEARCH.Custom RET C LD HL,MASKARE .DTABUF+1: @@ -573,8 +566,8 @@ F_NEXT: LD IX,0 LD A,XH OR XL - JP Z,SEARCH.error - JP SEARCH.SEARCH1 + JP Z,SEARCH.error_too_many_files + JP SEARCH.loop //////////////////////////////////////////////////////////////////////// ; @@ -926,18 +919,18 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; .START: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - LD HL,TMPNAME ; 8.3 имя - LD DE,MASKARE ; буфер имени 11 симв. формата + ;LD HL,TMPNAME ; 8.3 имя + ;LD DE,MASKARE ; буфер имени 11 симв. формата CALL MASK ; преобр. имя 8.3 -> 11 формат RET C ;!TEST optimization ранее GETWORD уже загрузил директорию ;CALL LOADDIR ; прочитать список каталога ; - CALL DSEARCH ; поиск записи каталога в списке диска + CALL SEARCH.Dir ; поиск записи каталога в списке диска LD A,DSS_Error.sys.DIR_EXISTS CCF RET C ; каталог найден - + ; CALL G_CLUST RET C PUSH HL @@ -953,11 +946,11 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD (HL),A INC HL LD BC,#0A00 ; b=счетчик - + ; .loop1: LD (HL),C INC HL DJNZ .loop1 - + ; PUSH HL CALL SYSTIME ; узнать тек. дату и время CALL MK_TIME ; закодировать время/дату @@ -977,21 +970,21 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD (HL),D INC HL LD BC,#0400 ; b=счетчик - + ; .loop2: LD (HL),C INC HL DJNZ .loop2 - + ; CALL WRT_HND ; скопир. новую запись в список диска (каталога) - CALL SAVEDIR ; сбросить кеш каталога на диск + ;CALL SAVEDIR ; и сбросить кеш каталога на диск LD HL,CORE_BUFFERS.SECBUF ; буфер LD (HL),"." ; запись тек. каталога LD BC,10*256 + ' ' ; b=счетчик, c=пробел - + ; .loop3: INC HL LD (HL),C DJNZ .loop3 - + ; INC HL LD DE,HANDBUF+11 ; ячейка атрибутов файла EX DE,HL @@ -1005,23 +998,14 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 .MKD03: INC HL LD (HL),C DJNZ .MKD03 - + ; INC HL - - ; IF OLD_SET_BANK - ; PUSH HL - ; ENDIF - SET_PAGE_X DIRPAGE - - ; IF OLD_SET_BANK - ; POP HL - ; ENDIF - PUSH AF - LD A,(DIR) + ; + LD A,(DIRPAGE.buffer) CP "." - LD DE,DIR+11 ; атрибуты записи + LD DE,DIRPAGE.buffer+11 ; атрибуты записи ;!HARDCODE JP Z,.MKD04 LD IX,HANDBUF XOR A @@ -1033,7 +1017,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LDIR POP AF OUT (SLOT3),A - + ; EX DE,HL LD D,H LD E,L @@ -1041,7 +1025,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 LD (HL),0 LD BC,512-65 LDIR ;!FIXIT нужно ли так много грохать? - + ; POP HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер @@ -1052,21 +1036,21 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH AF IN A,(SLOT0) OUT (SLOT3),A -; + ; LD A,(FatBuffer.DRIVE) LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Write RST ToDSS.DRV -; + ; POP AF OUT (SLOT3),A - + ; LD HL,CORE_BUFFERS.SECBUF LD DE,CORE_BUFFERS.SECBUF+1 LD BC,511 LD (HL),0 LDIR ;!FIXIT нужно ли так много грохать? - + ; POP IX POP HL INC IX @@ -1109,8 +1093,8 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 ; .START: CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C LD HL,MASKARE @@ -1121,7 +1105,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 SCF RET Z CALL LOADDIR - CALL DSEARCH + CALL SEARCH.Dir RET C LD HL,(HANDBUF+_sFM.ST_CLUSTER) PUSH IX @@ -1211,7 +1195,7 @@ DOSNAME: DEC B JP Z,GETNAME DEC B - JP Z,MASK + JP Z,MASK.custom LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET @@ -1382,56 +1366,6 @@ RMKTIME: ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -; скопировать запись в список диска (каталога) -WRT_HND: - SET_PAGE_X DIRPAGE - - PUSH AF - LD IX,DIR - ;TEST 9/11/23 - ; EXX - ; LD DE,0 - ; EXX - ; -.loop: LD A,(IX+00) - OR A - JR Z,.WRT_HN2 - CP #E5 - JR Z,.WRT_HN2 - LD BC,#0020 - ADD IX,BC - JR NC,.loop - ; - POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.ROOT_OVERFLOW - SCF - RET -.WRT_HN2: - LD D,XH - LD E,XL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR - POP AF - OUT (SLOT3),A - LD HL,DIR - LD BC,(SAVEDIR.DIRSIZE) - DEC BC - ADD HL,BC - AND A - SBC HL,DE - RET NC - LD HL,(SAVEDIR.DIRSIZE) - LD BC,(FatBuffer.B_P_C) - ADD HL,BC - LD (SAVEDIR.DIRSIZE),HL - AND A - RET -;----------------------------------------------------------------------; - - ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 @@ -1471,57 +1405,54 @@ GETNAME: ; вход: a=атрибут записи ; выход: de'=индекс записи в списке каталога ; CF - каталог не найден -DSEARCH: - LD A,FAT_ATTR.DIRECTORY - CALL SEARCH.ASEARCH +SEARCH: +.Dir: LD A,FAT_ATTR.DIRECTORY + CALL SEARCH.Custom RET NC - LD A,DSS_Error.sys.PATH_NOT_FOUND + CP DSS_Error.sys.PATH_NOT_FOUND + 1 + RET C + ; + SCF + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR RET -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -;OUT: DE' - порядковый номер FM -SEARCH: LD A,FAT_ATTR.NoDIRnoVolID -.ASEARCH: - ; A = 76ADLSHR - EX AF,AF' + ; +.File: LD A,FAT_ATTR.NoDIRnoVolID +.Custom: EX AF,AF' ; A = 76ADLSHR SET_PAGE_X DIRPAGE PUSH AF EX AF,AF' ; CPL LD C,A - LD IX,DIR + LD IX,DIRPAGE.buffer ;TEST 9/11/23 ; EXX ; LD DE,0 ; EXX ; -.SEARCH1: - LD A,(IX+00) +.loop: LD A,(IX+00) OR A - JR Z,.SEARCH4 + JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,.SEARCH3 + JR Z,.next_record LD A,(IX+11) AND C - JR NZ,.SEARCH3 + JR NZ,.next_record LD HL,MASKARE LD D,XH LD E,XL LD B,11 EX DE,HL -.SEARCH2: +.loop_compare: LD A,(DE) CP '?' - JR Z,.SEARCH5 + JR Z,.next_char CP (HL) - JR NZ,.SEARCH3 -.SEARCH5: + JR NZ,.next_record +.next_char: INC HL INC DE - DJNZ .SEARCH2 + DJNZ .loop_compare ;!TEST 9/11/23 ; LD D,XH ; LD E,XL @@ -1540,7 +1471,7 @@ SEARCH: LD A,FAT_ATTR.NoDIRnoVolID OUT (SLOT3),A AND A RET -.SEARCH3: +.next_record: ;!TEST 9/11/23 ; EXX ; INC DE @@ -1548,13 +1479,15 @@ SEARCH: LD A,FAT_ATTR.NoDIRnoVolID ; LD DE,#0020 ;!HARDCODE ADD IX,DE - JR NC,.SEARCH1 -.error: POP AF + JR NC,.loop +.error_too_many_files: + POP AF OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR SCF RET -.SEARCH4: + ; +.error_file_not_found: POP AF OUT (SLOT3),A LD A,DSS_Error.sys.FILE_NOT_FOUND @@ -1657,13 +1590,6 @@ OPENDSK: LD A,C ; .force: PUSH AF - ; [ ] 13/11/2023 -bug with bad clusters ;!TEST - ;PUSH AF - ;LD A,(FATCASH.Update) - ;OR A - ;CALL NZ,WR_FAT - ;POP AF - ; LD C,Dss.DRV.Open RST ToDSS.DRV POP BC @@ -1727,8 +1653,8 @@ OPENDIR: JR NZ,.loop JR .SUBDIR3 .SUBDIR2: - LD DE,MASKARE - CALL MASK + ;LD DE,MASKARE + CALL MASK.name RET C .SUBDIR3: CALL FINDDIR @@ -1750,7 +1676,7 @@ FINDDIR: SET_PAGE_X DIRPAGE ; PUSH AF - LD IX,DIR + LD IX,DIRPAGE.buffer .F_01: LD A,(IX+00) OR A JR Z,.error @@ -1888,6 +1814,7 @@ FINDDIR: ;----------------------------------------------------------------------; +; .custom: ; Преобразовать имя 8.3 -> 11 формат ; вход: hl = 8.3 имя ; de = буфер имени 11 симв. формата @@ -1897,7 +1824,9 @@ FINDDIR: ; DE - 11 bytes filename ; RET: C=2 FILE WITHOUT EXTENTION ; C=1 FILE WITH EXTENTION -MASK: PUSH HL +MASK: LD HL,TMPNAME +.name: LD DE,MASKARE +.custom: PUSH HL PUSH DE LD H,D LD L,E @@ -2053,10 +1982,11 @@ LOADDIR: LD A,D OR E JP Z,.LROTDIR ; root ?? - LD HL,DIR ; куда + LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько XOR A ; дескриптор CALL READ ; чтение из файла + ;!FIXIT проверка на ошибку LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов POP AF OUT (SLOT3),A @@ -2078,7 +2008,7 @@ LOADDIR: ;LD B,A ; число секторов ; .RTD1: LD A,(FatBuffer.DRIVE) ; номер диска - LD DE,DIR ; буфер + LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV POP AF @@ -2088,6 +2018,56 @@ LOADDIR: ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +; скопировать запись в список диска (каталога) +; и сбросить кеш каталога на диск +WRT_HND: SET_PAGE_X DIRPAGE + EX AF,AF' + ; + LD IX,DIRPAGE.buffer + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; +.loop: LD A,(IX+00) + OR A + JR Z,.WRT_HN2 + CP #E5 + JR Z,.WRT_HN2 + LD BC,#0020 + ADD IX,BC + JR NC,.loop + ; + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.ROOT_OVERFLOW + SCF + RET +.WRT_HN2: + LD D,XH + LD E,XL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR + EX AF,AF' + OUT (SLOT3),A + LD HL,DIRPAGE.buffer + LD BC,(SAVEDIR.DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + JR NC,SAVEDIR + LD HL,(SAVEDIR.DIRSIZE) + LD BC,(FatBuffer.B_P_C) + ADD HL,BC + LD (SAVEDIR.DIRSIZE),HL + AND A + JP SAVEDIR +;----------------------------------------------------------------------; + + ;----------------------------------------------------------------------; ; Сбросить кеш каталога на диск. ; вход: iy=структура дескриптора @@ -2097,10 +2077,10 @@ SAVEDIR: LD IX,0 LD B,0 CALL MOVE_FP - + ; SET_PAGE_X DIRPAGE - PUSH AF + ; LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A LD D,(IY+_sFM.ST_CLUSTER) @@ -2108,7 +2088,7 @@ SAVEDIR: LD A,D OR E JP Z,.SROTDIR - LD HL,DIR + LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory .DIRSIZE+1: LD DE,0 @@ -2128,7 +2108,7 @@ SAVEDIR: ADD A,B LD B,A .RTD1S: LD A,(FatBuffer.DRIVE) - LD DE,DIR + LD DE,DIRPAGE.buffer LD C,Dss.DRV.Write RST ToDSS.DRV POP AF @@ -2219,47 +2199,11 @@ DIR_PATH_CHECK: LD A,(HL) JP GETWORD ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; - IF TEST_FEATURE - -; [ ] 13/11/2023 -bug with bad clusters ;!TEST -; in: IY - FM для файла дирректорию которого грузим -SET_DIR: - LD L,(IY+_sFM.DIR_CLUSTER) - LD H,(IY+_sFM.DIR_CLUSTER+1) - ; - PUSH IY - XOR A - CALL SET_FM - EX DE,HL - LD L,(IY+_sFM.ST_CLUSTER) - LD H,(IY+_sFM.ST_CLUSTER+1) - AND A - SBC HL,DE - JR Z,.exit - LD HL,#4000 ;!HARDCODE - ;LD A,D - ;OR E - ;JR Z,.ROOT - - EX DE,HL - LD (IY+_sFM.F_SIZE),E - LD (IY+_sFM.F_SIZE+1),D - LD (IY+_sFM.ST_CLUSTER),L - LD (IY+_sFM.ST_CLUSTER+1),H - CALL LOADDIR - ; -.exit: POP IY - RET - - ENDIF -;----------------------------------------------------------------------; - - ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE +; HANDBUF: BLOCK HANDBUF.SIZE,0 MASKARE: BLOCK 8,0 ; имя файла BLOCK 3,0 ; расш. diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e653c66..c454f1c 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -770,12 +770,7 @@ WRITE: LD (.R_POINT),HL LD A,(IY+_sFM.DRIVE) CALL OPENDSK JR C,PWERR1 - ; [ ] 13/11/2023 -bug with bad clusters ;!TEST - ; IF TEST_FEATURE - ; CALL SET_DIR - ; JR C,PWERR1 - ; ENDIF - ; + ; LD C,(IY+_sFM.F_POSITION) LD A,(IY+_sFM.F_POSITION+1) LD E,A @@ -882,6 +877,7 @@ WRITE: LD (.R_POINT),HL LD (IY+_sFM.F_SIZE+3),B AND A RET + ; .WOV1: PUSH BC PUSH HL PUSH DE diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 97816e7..7ce405b 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -8,7 +8,7 @@ ;--------------------------------------------------------------- ;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) ;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 -;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;!FIXIT работает криво +;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;R10 03-04-2003 DNS IMPROVED FN. VERSION ;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. ;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION @@ -593,79 +593,6 @@ WorkDirectory EQU CurrentDirectory .DEPTH EQU CurrentDirectory.DEPTH ENDIF -;R11 -; !TODO починить - IF SAVE_PATH_MACRO -SAVE_CUR_PATH - PUSH IX - PUSH IY - PUSH HL - PUSH DE - PUSH BC - PUSH AF - - SET_PAGE_X ENVPAGE - PUSH AF - - CALL CURRDSK - ADD A,"A" - LD HL,TMP_CURDIR_AUTO - LD (HL),A - INC HL - LD A,":" - LD (HL),A - INC HL - CALL CURRDIR_FN - - ; почему не POP AF : OUT (SLOT3),A - //POP BC - //LD A,B - //OUT (SLOT3),A - POP AF - OUT (SLOT3),A - ; -; - POP AF - POP BC - POP DE - POP HL - POP IY - POP IX - RET - -; !TODO починить -BACK_CUR_PATH: - RET NC -.force: PUSH IY - PUSH IX - PUSH HL - PUSH DE - PUSH BC - PUSH AF - - SET_PAGE_X ENVPAGE - PUSH AF - - LD HL,TMP_CURDIR_AUTO - CALL CHDIR - - ; почему не POP AF : OUT (SLOT3),A - //POP BC - //LD A,B - //OUT (SLOT3),A - POP AF - OUT (SLOT3),A -; - POP AF - POP BC - POP DE - POP HL - POP IX - POP IY - RET - ENDIF -;R11 - ;R12 ;/////////////////////////////////////////////////////////////////////// ; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы. @@ -705,10 +632,6 @@ SCANDRV: ;/////////////////////////////////////////////////////////////////////// ; - -;R12 - - ;GOD EQU 1999-1980*512 ;FHAND DB " " @@ -723,3 +646,64 @@ SCANDRV: ;//MODULE: DOS_X ;[END] +;R11 + ; IF SAVE_PATH_MACRO + ; SAVE_CUR_PATH + ; PUSH IX + ; PUSH IY + ; PUSH HL + ; PUSH DE + ; PUSH BC + ; PUSH AF + ; + ; SET_PAGE_X ENVPAGE + ; PUSH AF + ; + ; CALL CURRDSK + ; ADD A,"A" + ; LD HL,TMP_CURDIR_AUTO + ; LD (HL),A + ; INC HL + ; LD A,":" + ; LD (HL),A + ; INC HL + ; CALL CURRDIR_FN + ; + ; POP AF + ; OUT (SLOT3),A + ; + ; POP AF + ; POP BC + ; POP DE + ; POP HL + ; POP IY + ; POP IX + ; RET + ; + ; BACK_CUR_PATH: + ; RET NC + ; .force: PUSH IY + ; PUSH IX + ; PUSH HL + ; PUSH DE + ; PUSH BC + ; PUSH AF + ; + ; SET_PAGE_X ENVPAGE + ; PUSH AF + ; + ; LD HL,TMP_CURDIR_AUTO + ; CALL CHDIR + ; + ; POP AF + ; OUT (SLOT3),A + ; + ; POP AF + ; POP BC + ; POP DE + ; POP HL + ; POP IX + ; POP IY + ; RET + ; ENDIF +; diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 40e3f84..0c4f187 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -148,31 +148,6 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ENDM ; -; - MACRO _mSavePath force - IF SAVE_PATH_MACRO - PUSH HL - IF force==1 - LD HL,BACK_CUR_PATH.force - ELSE - LD HL,BACK_CUR_PATH - ENDIF - EX (SP),HL - CALL SAVE_CUR_PATH - ENDIF - ENDM - MACRO _mRestorePath - IF SAVE_PATH_MACRO - CALL BACK_CUR_PATH.force - ENDIF - ENDM - MACRO _mRestorStackAfterRestorePath - IF SAVE_PATH_MACRO - POP HL ;CLEAR STACK "BACK_CUR_PATH" - ENDIF - ENDM -; - ; MACRO _mDSS_Version DB 'DSS_' @@ -224,4 +199,30 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 MACRO C_OSRELEASE DB "Estex DSS",0 ENDM +; + +//////////////////////////////////////////////////////////////////////// +; +; MACRO _mSavePath force +; IF SAVE_PATH_MACRO +; PUSH HL +; IF force==1 +; LD HL,BACK_CUR_PATH.force +; ELSE +; LD HL,BACK_CUR_PATH +; ENDIF +; EX (SP),HL +; CALL SAVE_CUR_PATH +; ENDIF +; ENDM +; MACRO _mRestorePath +; IF SAVE_PATH_MACRO +; CALL BACK_CUR_PATH.force +; ENDIF +; ENDM +; MACRO _mRestorStackAfterRestorePath +; IF SAVE_PATH_MACRO +; POP HL ;CLEAR STACK "BACK_CUR_PATH" +; ENDIF +; ENDM ; \ No newline at end of file diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 37d66eb..4210567 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -182,7 +182,7 @@ EX_PATH: EXX DEC B JP Z,GETNAME ;8 ; преобр. имя 11 -> 8.3 формат DEC B - JP Z,MASK ;9 ; преобр. имя 8.3 -> 11 формат + JP Z,MASK.custom ;9 ; преобр. имя 8.3 -> 11 формат EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET @@ -692,7 +692,7 @@ FINDPATH: ;CALL CURRDIR_FN ; CALL .MAKE_PATH_ARRAY - LD HL,PATH_PNT_ARRAY + LD HL,ENVPAGE.PATH_PNT_ARRAY .NEXTPATHI: LD E,(HL) INC HL @@ -707,12 +707,12 @@ FINDPATH: CALL NZ,CHDIR JR C,.BADPATH LD HL,CORE_BUFFERS.EXEBUFF - LD DE,MASKARE - CALL MASK + ;LD DE,MASKARE + CALL MASK.name JR C,.BADPATH CALL TST_EXT JR C,.BADPATH - CALL SEARCH + CALL SEARCH.File .BADPATH: POP BC POP HL @@ -728,15 +728,14 @@ FINDPATH: .GOTO_CURDIR: PUSH AF PUSH HL - ;LD HL,TMP_CURDIR LD HL,CurrentDirectory CALL CHDIR POP HL POP AF RET .MAKE_PATH_ARRAY: - LD HL,PATH_PNT_ARRAY-1 ;R04 -1 - LD DE,ENVTEMP-1 + LD HL,ENVPAGE.PATH_PNT_ARRAY-1 ;R04 -1 + LD DE,ENVPAGE.ENVTEMP-1 LD B,#00 .NEXTAR: LD (HL),C ;R04 @@ -778,15 +777,12 @@ FINDPATH: LD (HL),A RET -ENVPATH DB "PATH=",0 +ENVPATH: DB "PATH=",0 ;;; -; !TODO СДЕЛАТЬ СТРУКТУРОЙ и обозначить страницу -TMP_CURDIR_AUTO EQU #FB00 -PATH_PNT_ARRAY EQU #FC80 -; !FIXIT не нужно если SAVE_PATH_MACRO = 1 -TMP_CURDIR EQU #FD00 -ENVTEMP EQU #FE00 +;TMP_CURDIR_AUTO EQU #FB00 +; не нужно если SAVE_PATH_MACRO = 1 +; TMP_CURDIR EQU #FD00 ;///////////////////////////////////////////////////////////////////// @@ -847,8 +843,8 @@ EXEC_1: ;LD (CMDLINE),HL LD (OPEN.TMP),A CALL GETWORD RET C - LD HL,TMPNAME - LD DE,MASKARE + ; LD HL,TMPNAME + ; LD DE,MASKARE CALL MASK RET C CALL TST_EXT @@ -877,11 +873,10 @@ EXEC_1: ;LD (CMDLINE),HL EXEC0_SHORT: CALL EXEC_1 RET C - ;FILE NOT FOUND, SEARCHING IN PATH ; GET PATH AND ETC. LD HL,ENVPATH - LD DE,ENVTEMP + LD DE,ENVPAGE.ENVTEMP LD B,high Dss.Environ.Get CALL ENVIRON diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 42c7ee9..debb81d 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -94,7 +94,7 @@ R_F_F16: LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FAT_CACHE ; начало кеша FAT-а + LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT LD E,(HL) ; прочитать номер кластера INC HL @@ -196,7 +196,7 @@ R_F_F12: CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а ENDIF ; - LD DE,FAT_CACHE ; начало кеша FAT-а + LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT POP AF ; восст. флаг LD E,(HL) @@ -286,7 +286,7 @@ W_T_F16: LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FAT_CACHE + LD DE,FATPAGE.cache ADD HL,DE ; на ячейку FAT POP DE LD (HL),E ; сохр. в кеше FAT-а @@ -329,7 +329,7 @@ W_T_F12: CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а ENDIF ; - LD DE,FAT_CACHE + LD DE,FATPAGE.cache ADD HL,DE POP AF POP DE @@ -403,7 +403,7 @@ RE_FAT: PUSH HL LD IX,0 ADD IX,DE ; номер лог. сектора LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING - LD DE,FAT_CACHE ; куда ; DE - FAT ADDRESS + LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize RST ToDSS.DRV @@ -452,7 +452,7 @@ WR_FAT: SET_PAGE_X FATPAGE ;HL:IX - SECTOR OF FAT FOR SAVE ADD IX,DE ; номер лог. сектора LD HL,0 ; ст. разряд - LD DE,FAT_CACHE ; откуда + LD DE,FATPAGE.cache ; откуда LD B,A ; число секторов LD C,Dss.DRV.Write ; запись секторов LD A,(FatBuffer.DRIVE) ; номер диска @@ -465,7 +465,7 @@ WR_FAT: SET_PAGE_X FATPAGE EX DE,HL LD IX,0 ADD IX,DE - LD DE,FAT_CACHE + LD DE,FATPAGE.cache LD HL,0 LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.Write diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 896e980..05f0ec5 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -657,8 +657,9 @@ TST_01: IN A,(CMOUSE) LD A,B OR C JR NZ,TST_01 - ;JR NC,TST_01 + SCF RET + ;JR NC,TST_01 ; .NXT: IN A,(DMOUSE) @@ -667,19 +668,19 @@ TST_01: IN A,(CMOUSE) CCF RET NZ - ;!TEST mouse freeeeezzzz + ;[x] mouse freeeeezzzz !TEST LD BC,#2000 ; TST_02: IN A,(CMOUSE) RRCA - ;!TEST mouse freeeeezzzz + ;[x] mouse freeeeezzzz !TEST JR C,.NXT DEC BC LD A,B OR C JR NZ,TST_02 - ;JR NC,TST_02 RET + ;JR NC,TST_02 ; .NXT: IN A,(DMOUSE) LD D,A diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 392f7e8..4673c3d 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -302,7 +302,8 @@ SETUP_CURSORS: -CTRLKEY LD HL,HOST +CTRLKEY: + LD HL,HOST LD A,(HEAD) CP (HL) LD BC,(KEYFLAG) @@ -311,7 +312,8 @@ CTRLKEY LD HL,HOST DEC A RET -TESTKEY LD HL,HOST +TESTKEY: + LD HL,HOST LD A,(HEAD) CP (HL) RET Z @@ -348,7 +350,8 @@ TESTKEY LD HL,HOST ; RET ;small optimization -K_CLEAR LD A,(HOST) +K_CLEAR: + LD A,(HOST) LD (HEAD),A LD A,#2F CP B @@ -363,7 +366,7 @@ K_CLEAR LD A,(HOST) RET ; -PUTSYM LD HL,HEAD +PUTSYM: LD HL,HEAD LD A,(HOST) SUB 4 AND #3F @@ -386,7 +389,7 @@ PUTSYM LD HL,HEAD LD (HL),C RET -GETSYM LD HL,HOST +GETSYM: LD HL,HOST LD A,(HEAD) CP (HL) RET Z @@ -407,38 +410,41 @@ GETSYM LD HL,HOST LD C,(HL) RET -FULL_BF EX AF,AF' +FULL_BF: + EX AF,AF' BIT SF_BUFF,(IX+SOUND_K) - JR Z,FBF + JR Z,.FBF EXX LD DE,230 LD HL,50 CALL BEEP EXX -FBF EX AF,AF' +.FBF: EX AF,AF' RET +.E0_KEY: + SET FLAG_E0,(IX+KEYFLG) + JR KEYSCAN.RESCAN +.F0_KEY: + SET FLAG_F0,(IX+KEYFLG) + JR KEYSCAN.RESCAN +.E1_KEY: + SET FLAG_E1,(IX+KEYFLG) + JR KEYSCAN.RESCAN -E0_KEY SET FLAG_E0,(IX+KEYFLG) - JR RESCAN -F0_KEY SET FLAG_F0,(IX+KEYFLG) - JR RESCAN - -E1_KEY SET FLAG_E1,(IX+KEYFLG) - JR RESCAN - -KEYSCAN LD IX,KEYFLAG - -RESCAN IN A,(COM_A) +KEYSCAN: + LD IX,KEYFLAG +.RESCAN: + IN A,(COM_A) BIT 0,A RET Z IN A,(DAT_A) CP #F0 - JR Z,F0_KEY + JR Z,FULL_BF.F0_KEY CP #E0 - JR Z,E0_KEY + JR Z,FULL_BF.E0_KEY CP #E1 - JR Z,E1_KEY + JR Z,FULL_BF.E1_KEY BIT FLAG_F0,(IX+KEYFLG) JR NZ,UN_KEY LD L,A diff --git a/DSS/build.txt b/DSS/build.txt index 2bf5aee..72b67e0 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -567 \ No newline at end of file +579 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 9bba147..d0a96f5 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,8 +15,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE TABisSPACES 0 DEFINE EnoughtOnly_LF 0 DEFINE CLASSIC_CURSOR 0 - DEFINE SAVE_PATH_MACRO 0 ;\____ либо то, либо то - DEFINE SAVE_PATH_CODE 1 ;/ + DEFINE SAVE_PATH_CODE 1 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; @@ -24,13 +23,22 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 ; DEFINE OLD_SET_BANK 0 ;---------------------[ лог.номера страниц памяти ]--------------------- + DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц ; кэш списка каталога DIRPAGE EQU 0 +.buffer EQU #C000 +; FATPAGE EQU 1 +.cache EQU #C000 +; TXTPAGE EQU 2 +; ENVPAGE EQU TXTPAGE +.PATH_PNT_ARRAY EQU #FC80 +.ENVTEMP EQU #FE00 +; DRVPAGE EQU 3 - DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц +; COREPAGE EQU 4 ; она отдельно и не с блоком выше. ;----------------------------------------------------------------------- DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0 @@ -38,8 +46,8 @@ ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000 ENVADDR EQU #E400 -DIR EQU #C000 -FAT_CACHE EQU #C000 +;DIR EQU #C000 +;FAT_CACHE EQU #C000 FMCOUNT EQU 10 ; Количество файловых манипуляторов HANDBUF.SIZE EQU 32