From 59a72bf0847200a6ab8edcf7f5a04f24fa0308c3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 11 Nov 2023 00:26:36 +1000 Subject: [PATCH] ... --- DSS/DOS5.ASM | 118 +++++++++++++++++++++++++++------------------ DSS/DOS_FM.ASM | 91 ++++++++++++++++++++-------------- DSS/EXECUTE.ASM | 56 ++++++++++++--------- DSS/Structures.inc | 27 +++++++---- DSS/build.txt | 2 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 7 files changed, 181 insertions(+), 117 deletions(-) diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index d7f66e3..028aa57 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -78,7 +78,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET ;R02 .OPENATR: - LD (F_FIRST.ACCESS),A ; раб. ячейка (здесь атрибут записи) + LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME @@ -130,7 +130,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 LD BC,11 LDIR EX DE,HL - LD A,(F_FIRST.ACCESS) +.TMP+1: LD A,0 LD (HL),A INC HL LD BC,#0A00 ;!HARDCODE @@ -165,7 +165,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 JP OPEN ;R08 .Prepare: AND #E7 ;R04 %76A00SHR = !FAT_ATTR - LD (F_FIRST.ACCESS),A + LD (.TMP),A LD (.PATH0),HL CALL GETWORD RET C @@ -318,17 +318,17 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD A,C ; ;R08 -OPEN: LD (F_FIRST.ACCESS),A +OPEN: LD (.TMP),A ; enter point for CREATE CALL GETWORD RET C LD HL,TMPNAME LD DE,MASKARE CALL MASK RET C -.FILE: CALL SEARCH +.FILE: CALL SEARCH ; enter point for EXEC RET C ;R02 -.FM: CALL GET_FM +.FM: CALL GET_FM ; enter point for ATTRIB RET C LD A,C EX AF,AF' @@ -341,11 +341,17 @@ OPEN: LD (F_FIRST.ACCESS),A LD HL,HANDBUF LD BC,HANDBUF.SIZE LDIR - LD A,(F_FIRST.ACCESS) +.TMP+1: LD A,0 LD (IY+_sFM.ACCESS_MODE),A LD A,(TASK) LD (IY+_sFM.TASK_NUM),A XOR A + ; + LD (IY+_sFM.KnownCluster_L),A + LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownOffset_L),A + LD (IY+_sFM.KnownOffset_H),A + ; LD (IY+_sFM.F_POSITION),A LD (IY+_sFM.F_POSITION+1),A LD (IY+_sFM.F_POSITION+2),A @@ -371,7 +377,7 @@ OPEN: LD (F_FIRST.ACCESS),A //////////////////////////////////////////////////////////////////////// CLOSE_FN: ;R08 -CLOSE: LD (F_FIRST.ACCESS),A +CLOSE: LD (.TMP),A CALL SET_FM RET C LD A,(TASK) @@ -390,20 +396,25 @@ CLOSE: LD (F_FIRST.ACCESS),A LD (IY+_sFM.DIR_CLUSTER),D LD (IY+_sFM.DIR_CLUSTER+1),E CALL LOADDIR - LD A,(F_FIRST.ACCESS) +.TMP+1: LD A,0 CALL SET_FM - LD HL,DIR - LD DE,#0020 - LD C,(IY+_sFM.HANDLE) - LD B,(IY+_sFM.HANDLE+1) - JR .CLOSE2 -.CLOSE1: - ADD HL,DE - DEC BC -.CLOSE2: - LD A,B - OR C - JR NZ,.CLOSE1 + ; + ;TEST 9/11/23 + ; LD HL,DIR + ; LD DE,#0020 + ; LD C,(IY+_sFM.HANDLE) + ; LD B,(IY+_sFM.HANDLE+1) + ; JR .CLOSE2 + ; .CLOSE1: + ; ADD HL,DE + ; DEC BC + ; .CLOSE2: + ; LD A,B + ; OR C + ; JR NZ,.CLOSE1 + LD L,(IY+_sFM.HANDLE) + LD H,(IY+_sFM.HANDLE+1) + ; LD D,YH LD E,YL EX DE,HL @@ -417,7 +428,7 @@ CLOSE: LD (F_FIRST.ACCESS),A OUT (SLOT3),A CALL SAVEDIR .NOTMODF: - LD A,(F_FIRST.ACCESS) + LD A,(.TMP) CALL RES_FM RET @@ -445,7 +456,7 @@ F_FIRST: ; RET C ; LD A,C ; ; - LD (.ACCESS),A + LD (.TMP),A LD (.DTABUF),DE LD A,B LD (.FNDMODE),A @@ -461,8 +472,7 @@ F_FIRST: LD DE,MASKARE CALL MASK RET C -.ACCESS+1: - LD A,0 + LD A,(.TMP) CALL SEARCH.ASEARCH RET C LD HL,MASKARE @@ -470,7 +480,7 @@ F_FIRST: LD DE,0 LD BC,11 ;!HARDCODE LDIR - LD A,(.ACCESS) +.TMP+1: LD A,0 LD (DE),A .FIND_S: INC DE @@ -538,10 +548,11 @@ F_NEXT: EX AF,AF' CPL LD C,A - - EXX - LD DE,0 - EXX + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; .CURHND+2: LD IX,0 LD A,XH @@ -1339,10 +1350,11 @@ WRT_HND: PUSH AF LD IX,DIR - EXX - LD DE,0 - EXX - ; + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; .loop: LD A,(IX+00) OR A JR Z,.WRT_HN2 @@ -1430,20 +1442,23 @@ DSEARCH: ;----------------------------------------------------------------------; +;OUT: DE' - порядковый номер FM SEARCH: LD A,FAT_ATTR.NoDIRnoVolID .ASEARCH: - EX AF,AF' ; 76ADLSHR - + ; A = 76ADLSHR + EX AF,AF' SET_PAGE_X DIRPAGE - PUSH AF EX AF,AF' + ; CPL LD C,A LD IX,DIR - EXX - LD DE,0 - EXX + ;TEST 9/11/23 + ; EXX + ; LD DE,0 + ; EXX + ; .SEARCH1: LD A,(IX+00) OR A @@ -1468,8 +1483,16 @@ SEARCH: LD A,FAT_ATTR.NoDIRnoVolID INC HL INC DE DJNZ .SEARCH2 - LD D,XH - LD E,XL + ;!TEST 9/11/23 + ; LD D,XH + ; LD E,XL + LD D,XH + LD E,XL + EXX + LD D,XH + LD E,XL + EXX + ; LD HL,HANDBUF EX DE,HL LD BC,HANDBUF.SIZE @@ -1479,12 +1502,14 @@ SEARCH: LD A,FAT_ATTR.NoDIRnoVolID AND A RET .SEARCH3: - EXX - INC DE - EXX + ;!TEST 9/11/23 + ; EXX + ; INC DE + ; EXX + ; LD DE,#0020 ;!HARDCODE ADD IX,DE - JR NC,SEARCH.SEARCH1 + JR NC,.SEARCH1 .error: POP AF OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR @@ -2143,6 +2168,7 @@ HANDBUF: BLOCK HANDBUF.SIZE,0 MASKARE: BLOCK 8,0 ; имя файла BLOCK 3,0 ; расш. BLOCK 21,0 ; 11+21=32 +;TMP_BYTE: DB 0 ; ACCESS: ; ;PATH0: DW #0000 diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 95debd3..bbd5489 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -59,19 +59,18 @@ FM_BUF: _sFM ; A=0 OR (IY) ;+00 NAME ENDM +//////////////////////////////////////////////////////////////////////// -SET_FM: - _mFM_FIND - LD A,DSS_Error.sys.NO_ERROR +SET_FM: _mFM_FIND + LD A,DSS_Error.sys.NO_ERROR RET NZ ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE SCF RET -RES_FM: - _mFM_FIND +RES_FM: _mFM_FIND LD A,DSS_Error.sys.INVALID_HANDLE ;EXX SCF @@ -79,7 +78,7 @@ RES_FM: XOR A LD (IY+0),A RET - +; GET_FM: LD B,FMCOUNT LD C,#FF LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size @@ -93,6 +92,29 @@ GET_FM: LD B,FMCOUNT LD A,DSS_Error.sys.NO_HANDLES SCF RET +/* + ;!TEST CHECK LOCKING 10/11/2023 +GET_FM: LD IY,0 + LD (.freeHandle),IY + ; + LD B,FMCOUNT + LD C,#FF + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size +.loop: ADD IY,DE + INC C + ; CHECK LOCKING + + ; +.cont: LD A,(IY+0) + OR A + RET Z + DJNZ .loop + LD A,DSS_Error.sys.NO_HANDLES + SCF + RET +*/ + ; HL:IX - OFFSET POINTER ; A - FILE MANIPULATOR @@ -157,7 +179,7 @@ MOVE_CP: ;-------------------- ECL2: - ;!TEST SAVE CLUSTER AFTER READ + ;[x] SAVE CLUSTER AFTER READ ;!TEST POP BC ; POP BC @@ -188,15 +210,15 @@ BLOK_RD: PUSH BC LD H,(IY+_sFM.ST_CLUSTER+1) LD A,H OR L - ;!TEST SAVE CLUSTER AFTER READ + ;[x] SAVE CLUSTER AFTER READ ;!TEST ;JR NZ,BLOKRD2 PUSH BC - JR NZ,.testFunc + JR NZ,.saveClustersOffset ; JP ECL2 ;R01 JR BLOKRD0 -.testFunc: - ;!TEST SAVE CLUSTER AFTER READ +.saveClustersOffset: + ;[x] SAVE CLUSTER AFTER READ ;!TEST LD E,(IY+_sFM.KnownCluster_L) LD D,(IY+_sFM.KnownCluster_H) LD A,D @@ -225,14 +247,14 @@ BLOK_RD: PUSH BC EX DE,HL JP BLOKRD2 - ; .noOptimization_1: - POP BC + POP BC .noOptimization_2: - POP HL - POP DE - JP BLOKRD2 - + POP HL + POP DE + JP BLOKRD2 + ; + BLOKRD1: PUSH BC CALL R_F_FAT @@ -245,7 +267,7 @@ BLOKRD2: OR C JR NZ,BLOKRD1 - ;!TEST SAVE CLUSTER AFTER READ + ;[x] SAVE CLUSTER AFTER READ ;!TEST LD (IY+_sFM.KnownCluster_L),L LD (IY+_sFM.KnownCluster_H),H POP BC @@ -332,7 +354,7 @@ ECL1 AND A BLOKWRC: POP BC - ;!TEST SAVE CLUSTER AFTER WRITE + ;[x] SAVE CLUSTER AFTER WRITE ;!TEST POP BC ; BLOKWR0 POP BC @@ -358,10 +380,10 @@ BLOK_WR PUSH BC LD H,(IY+_sFM.ST_CLUSTER+1) LD A,H OR L - ;!TEST SAVE CLUSTER AFTER WRITE + ;[x] SAVE CLUSTER AFTER WRITE ;!TEST ;JR NZ,BLOKWR2 PUSH BC - JR NZ,.testFunc + JR NZ,.saveClustersOffset ; PUSH BC CALL G_CLUST @@ -376,14 +398,14 @@ BLOK_WR PUSH BC POP BC JP BLOKWR2 -.testFunc: - ;!TEST SAVE CLUSTER AFTER WRITE +.saveClustersOffset: + ;[x] SAVE CLUSTER AFTER WRITE ;!TEST LD E,(IY+_sFM.KnownCluster_L) LD D,(IY+_sFM.KnownCluster_H) LD A,D OR E JR Z,BLOKWR2 - + ; PUSH DE PUSH HL PUSH BC @@ -392,27 +414,26 @@ BLOK_WR PUSH BC LD A,D OR E JR Z,.noOptimization_1 - + ; POP HL AND A SBC HL,DE JR C,.noOptimization_2 - + ; LD C,L LD B,H POP HL POP DE - - + ; EX DE,HL JP BLOKWR2 - ; .noOptimization_1: - POP BC + POP BC .noOptimization_2: - POP HL - POP DE - JP BLOKWR2 + POP HL + POP DE + JP BLOKWR2 + ; BLOKWR1 PUSH BC @@ -430,7 +451,7 @@ BLOKWR2 LD A,B OR C JR NZ,BLOKWR1 - ;!TEST SAVE CLUSTER AFTER WRITE + ;[x] SAVE CLUSTER AFTER WRITE ;!TEST LD (IY+_sFM.KnownCluster_L),L LD (IY+_sFM.KnownCluster_H),H POP BC @@ -735,7 +756,7 @@ WRITE: LD (R_POINT),HL CALL SET_FM JP C,PWERR1 LD A,(IY+_sFM.ACCESS_MODE) - AND #01 + AND FAT_ATTR.READ_ONLY JR NZ,RD_ONLY SET 7,(IY+_sFM.ACCESS_MODE) SET 5,(IY+_sFM.ATTRIBUT) diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 8cbc0b5..c14bcca 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -822,7 +822,8 @@ ENVTEMP EQU #FE00 ; +00 1 db ? ; Длина ком-строки ; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем ;///////////////////////////////////////////////////////////////////// -EXEC: INC B ;R03 +EXEC: LD (CMDLINE),HL + INC B ;R03 DEC B ;R03 JR Z,.VAR_1 ;R03 DEC B ;R03 @@ -831,19 +832,19 @@ EXEC: INC B ;R03 SCF ;R03 RET ;R03 ; -.VAR_1: LD (CMDLINE),HL +.VAR_1: ;LD (CMDLINE),HL CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME - LD HL,(CMDLINE) + ;LD HL,(CMDLINE) JR C,EXEC0_SHORT .VAR_2: CALL EXEC_1 SCF RET ; File not found - exit - ; при выходе с ошибкой, в регистре А - код ошибки -EXEC_1: LD (CMDLINE),HL - LD A,#01 ; %7600000R = !FAT_ATTR ;!HARDCODE - LD (F_FIRST.ACCESS),A +EXEC_1: ;LD (CMDLINE),HL + LD HL,(CMDLINE) + LD A,FAT_ATTR.READ_ONLY + LD (OPEN.TMP),A CALL GETWORD RET C LD HL,TMPNAME @@ -853,16 +854,22 @@ EXEC_1: LD (CMDLINE),HL CALL TST_EXT LD A,DSS_Error.sys.FILE_NOT_FOUND RET C - _mINCTASK ;R08 + _mINCTASK ;R08 CALL OPEN.FILE - JR NC,.noError - _mDECTASK ;R08 - AND A - RET - ; -.noError: + JR C,.Error POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM +.Error: _mDECTASK ;R08 + AND A + RET +; JR NC,.noError +; _mDECTASK ;R08 +; AND A +; RET +; ; +; .noError: +; POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру +; JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM ;SHORT NAME @@ -871,7 +878,7 @@ EXEC0_SHORT: CALL EXEC_1 RET C - ;FILE NO FOUND, SEARCHING IN PATH + ;FILE NOT FOUND, SEARCHING IN PATH ; GET PATH AND ETC. LD HL,ENVPATH LD DE,ENVTEMP @@ -960,8 +967,10 @@ _RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла - LD A,(EXE_FM) ; дескр. файла - CALL CLOSE ; закрыть файл + ;!TEST ;[x] no close source EXE file before start 08/11/23 + ; LD A,(EXE_FM) ; дескр. файла + ; CALL CLOSE ; закрыть файл + ; JP _TST_PROC_2 RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN @@ -997,7 +1006,7 @@ ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY ERREXE: PUSH AF LD A,(EXE_FM) CALL CLOSE - _mDECTASK + _mDECTASK POP AF RET @@ -1111,7 +1120,7 @@ FRC000: LD A,(DE) LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) - LD B,Dss.Move_FP.FrStart + LD B,high Dss.Move_FP.FrStart LD A,(EXE_FM) CALL MOVE_FP ;R02 @@ -1162,8 +1171,9 @@ LEAVE: LD A,B LD SP,(EXSTACK) ;[x] 25/10/23 close EXE FM POP AF - CALL RES_FM - _mDECTASK + ;CALL RES_FM + CALL CLOSE + _mDECTASK ; POP AF POP HL @@ -1198,9 +1208,7 @@ WAIT: LD A,(ERLEVEL) RET ;///////////////////////////////////////////////////////////////////// - - -;!TODO заменить тут CALL CURRDIR и CALL CURRDSK на другое, когда будет сохраняться current dir +; M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) DEC H LD D,H diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 520fab2..fcf1d4d 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -21,28 +21,37 @@ RESERVED2 BLOCK 490,0 ; ;File Manipulator (FM) - STRUCT _sFM ; 44 bytes + STRUCT _sFM ; 47 bytes + ; from FAT .NAME: TEXT 8,{". "," "} ;+00 NAME .EXT: TEXT 3,{" "," "} ;+08 EXT .ATTRIBUT: BYTE #10 ;+11 ATTRIBUT -.KnownCluster_L: BYTE 0 ;+12 Младший байт номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: BYTE 0 ;+13 Старший байт номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: BYTE 0 ;+14 Младший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: BYTE 0 ;+15 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.RESERVED_X: BLOCK 6,0 ;+16 RESERVED +.RESERVED_NT: BYTE #00 ;+12 RESERVED +.RESERVED_FAT32: BYTE #00 ;+13 RESERVED +.CREATE_TIME_FAT32: WORD #0000 ;+14 RESERVED +.CREATE_DATE_FAT32: WORD #0000 ;+16 RESERVED +.RESERVED_FAT32_1: WORD #0000 ;+18 RESERVED +.RESERVED_FAT32_2: WORD #0000 ;+20 RESERVED .TIME: WORD #0000 ;+22 TIME .DATE: WORD #0000 ;+24 DATE .ST_CLUSTER: WORD #0000 ;+26 START CLUSTER -.F_SIZE: DWORD #0000 ;+28 SIZE FILE -.F_POSITION: DWORD #0000 ;+32 FILE POSITION (FP) +.F_SIZE: DWORD #00000000 ;+28 SIZE FILE + ; from Core +.F_POSITION: DWORD #00000000 ;+32 FILE POSITION (FP) .DIR_CLUSTER: WORD #0000 ;+36 DIRECTORY CLUSTER .HANDLE: WORD #0000 ;+38 HANDLE NUMBER .DRIVE: BYTE #00 ;+40 DRIVE OR CURRENT .ACCESS_MODE: BYTE #00 ;+41 ACCESS MODE признак изменения файла .TASK_NUM: BYTE #00 ;+42 TASK -.EMPTY: BYTE #00 ;+43 EMPTY +;.EMPTY: BYTE #00 ;+43 EMPTY +.KnownCluster_L: BYTE 0 ;+43 Младший байт номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: BYTE 0 ;+44 Старший байт номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: BYTE 0 ;+45 Младший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: BYTE 0 ;+46 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS ; + +; ; NAM EQU 0 ; LEN4 EQU 31 ; EXT EQU 8 ; POS1 EQU 32 ; ATR EQU 11 ; POS2 EQU 33 diff --git a/DSS/build.txt b/DSS/build.txt index 8db1e5f..d759b56 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -522 \ No newline at end of file +537 \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index bd753cc..56749c8 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -94 \ No newline at end of file +96 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 4c835d3..8641b77 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4c835d305fd5d1bc296039706d5e163c1f2224ca +Subproject commit 8641b77d8ebe42ae042bb8df3902300e678048eb