diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 9609242..fcd9064 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -29,7 +29,7 @@ ; B = 1 SET ATTRIB ; OUTPUT: A - ATTRIB ATTRIB: - _mSavePath + _mSavePath 1 INC B DEC B JP Z,RATTRIB @@ -48,7 +48,7 @@ RATTRIB XOR A POP BC RET C LD A,B - AND A + ;AND A RET WATTRIB PUSH AF @@ -64,47 +64,29 @@ WATTRIB PUSH AF POP BC RET C LD A,B - AND A + ;AND A RET -; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 -; OUTPUT: A - FM -CREATE: - _mSavePath - AND #E7 ;R04 %76A00SHR = !FAT_ATTR - LD (ACCESS),A - LD (PATH0),HL - CALL GETWORD - RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK - RET C - CALL SEARCH - - JR C,CREAT ;NO FILE, CREAT NEW. - CALL DELFILE ;FILE EXIST RECREAT - JP CREAT ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM -CREAT_N: - _mSavePath - AND #E7 ;R04 %76A00SHR = !FAT_ATTR - LD (ACCESS),A - LD (PATH0),HL - CALL GETWORD - RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK +CREATE: _mSavePath 0 + CALL .Prepare + RET C + CALL SEARCH + CALL NC,DELFILE ;FILE EXIST RECREAT + JR .DO +; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 +; OUTPUT: A - FM +.NEW: _mSavePath 0 + CALL .Prepare RET C CALL SEARCH - LD A,DSS_Error.sys.FILE_EXISTS CCF RET C -CREAT LD HL,MASKARE + ; +.DO: LD HL,MASKARE LD DE,HANDBUF LD BC,11 LDIR @@ -112,10 +94,12 @@ CREAT LD HL,MASKARE LD A,(ACCESS) LD (HL),A INC HL - LD BC,#0A00 -FIHND LD (HL),C + LD BC,#0A00 ;!HARDCODE + ; +.loop1: LD (HL),C INC HL - DJNZ FIHND + DJNZ .loop1 + ; PUSH HL CALL SYSTIME CALL MK_TIME @@ -129,19 +113,42 @@ FIHND LD (HL),C LD (HL),B INC HL LD BC,#0600 -FIHND1 LD (HL),C + ; +.loop2: LD (HL),C INC HL - DJNZ FIHND1 + DJNZ .loop2 + ; CALL WRT_HND CALL SAVEDIR LD HL,(PATH0) XOR A JP OPEN ;R08 +.Prepare: + AND #E7 ;R04 %76A00SHR = !FAT_ATTR + LD (ACCESS),A + LD (PATH0),HL + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + JP MASK +CREAT_N EQU CREATE.NEW + ; INPUT: HL - "filename.ext",#00 without simbols * ? -DELETE: LD DE,MASKARE - CALL MASK - RET C +DELETE: + ;!TEST + _mSavePath 1 + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + ; + ; LD DE,MASKARE + ; CALL MASK + ; RET C LD HL,MASKARE LD BC,11 LD A,"?" @@ -263,9 +270,9 @@ OPENATR: ; код ошибки, если CF=1 ////////////////////////////////////////////////////////////////////// OPEN_FN: - _mSavePath -OPEN: ;R08 - LD (ACCESS),A + _mSavePath 1 +;R08 +OPEN: LD (ACCESS),A CALL GETWORD RET C LD HL,TMPNAME @@ -300,7 +307,7 @@ OPENAT: ;R02 LD (IY+_sFM.F_POSITION+3),A LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A - LD HL,FM_BUF+_sFM.ST_CLUSTER + LD HL,CORE_BUFFERS.FM_BUF+_sFM.ST_CLUSTER LD E,(HL) INC HL LD D,(HL) @@ -311,9 +318,9 @@ OPENAT: ;R02 RET CLOSE_FN: - _mSavePath -CLOSE: ;R08 - LD (ACCESS),A + _mSavePath 1 +;R08 +CLOSE: LD (ACCESS),A CALL SET_FM RET C LD A,(TASK) @@ -631,25 +638,81 @@ SEARCH4: SCF RET + +; ;!TEST +; SAVE_CURRENT_PATH: +; SET_PAGE_X ENVPAGE +; PUSH AF +; CALL CURRDSK +; ADD A,"A" +; LD HL,TMP_CURDIR +; LD (HL),A +; INC HL +; LD A,":" +; LD (HL),A +; INC HL +; CALL CURRDIR +; POP AF +; OUT (SLOT3),A +; RET +; BACK_CURRENT_PATH: +; SET_PAGE_X ENVPAGE +; PUSH AF +; LD HL,TMP_CURDIR +; CALL CHDIR +; POP AF +; OUT (SLOT3),A +; RET +; ; ;------------------------------------------------- ; Тест на допустимое имя и настроиться на диск. ; вход: hl=строка имени ;------------------------------------------------- GETWORD: + ; !TEST + INC HL + LD A,(HL) + DEC HL + CP ':' + JR NZ,.dir_loop + + LD A,(HL) + CP 'a' + JR C,.next + CP '{' + JR NC,.next + SUB #20 +.next: SUB 'A' + INC HL + INC HL + PUSH HL + ;!TEST CHNDISK OPENDSK + ;CALL OPENDSK + CALL CHNDISK + ; + POP HL + RET C + ; +.dir_loop: LD DE,TMPNAME LD BC,#0DFF + ; .loop: LD A,(HL) INC HL CP '\' JR Z,.DIR_NAME - CP ':' - JR Z,.DRV_NAME + ;CP ':' + ;JR Z,.DRV_NAME LD (DE),A INC DE CP ' '+1 CCF RET NC DJNZ .loop + ; + ; ;!TEST + ; CALL BACK_CURRENT_PATH + ; LD A,DSS_Error.sys.INVALID_NAME SCF RET @@ -661,25 +724,25 @@ GETWORD: LD HL,TMPNAME CALL OPENDIR POP HL - JR NC,GETWORD - RET + RET C + JR .dir_loop -.DRV_NAME: - LD A,(TMPNAME) - CP 'a' - JR C,.next - CP '{' - JR NC,.next - SUB #20 -.next: SUB 'A' - PUSH HL - ;!TEST CHNDISK OPENDSK - CALL OPENDSK - ;CALL CHNDISK - ; - POP HL - JP NC,GETWORD - RET +; .DRV_NAME: +; LD A,(TMPNAME) +; CP 'a' +; JR C,.next +; CP '{' +; JR NC,.next +; SUB #20 +; .next: SUB 'A' +; PUSH HL +; ;!TEST CHNDISK OPENDSK +; ;CALL OPENDSK +; CALL CHNDISK +; ; +; POP HL +; RET C +; JR .loop ; Буфер имени 8.3 формата TMPNAME: DZ ' ' ; 12 пробелов и 0 @@ -687,8 +750,8 @@ TMPNAME: DZ ' ' ; 12 ; RestoreDIR: CHNDISK: ;!TEST - ;CALL OPENDSK - CALL OPENDSK.force + CALL OPENDSK + ;CALL OPENDSK.force ; ;????? R10 RET C @@ -700,8 +763,6 @@ CHNDISK: POP BC RET C LD A,B - RET - ; RET C ; PUSH AF ; CALL LOADDIR @@ -741,7 +802,7 @@ OPENDIR: CALL SET_FM LD A,(HL) OR A - JP NZ,SUBDIR + JR NZ,SUBDIR REROOT1: LD DE,0 LD (IY+_sFM.ST_CLUSTER),E @@ -1659,7 +1720,9 @@ RMKTIME EX DE,HL ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 ////////////////////////////////////////////////////////////////////// -CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск +CHDIR: + _mSavePath 0 +.tmp: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME LD A,(HL) @@ -1676,7 +1739,7 @@ CHDIR: CALL GETWORD ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 ////////////////////////////////////////////////////////////////////// MKDIR: - _mSavePath + _mSavePath 1 CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME ; 8.3 имя @@ -1735,7 +1798,7 @@ MKDIR: CALL WRT_HND ; скопир. новую запись в список диска (каталога) CALL SAVEDIR ; сбросить кеш каталога на диск - LD HL,SECBUF ; буфер + LD HL,CORE_BUFFERS.SECBUF ; буфер LD (HL),"." ; запись тек. каталога LD BC,10*256 + ' ' ; b=счетчик, c=пробел @@ -1795,7 +1858,7 @@ MKD04 EX DE,HL POP HL CALL NSECTOR - LD A,(BootSector.S_P_C) ; секторов на кластер + LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер MKD12 PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора @@ -1805,15 +1868,15 @@ MKD12 PUSH AF OUT (SLOT3),A ; LD A,(FatBuffer.DRIVE) - LD DE,SECBUF+#C000 + LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Write RST ToDSS.DRV ; POP AF OUT (SLOT3),A - LD HL,SECBUF - LD DE,SECBUF+1 + LD HL,CORE_BUFFERS.SECBUF + LD DE,CORE_BUFFERS.SECBUF+1 LD BC,511 LD (HL),0 LDIR ;!FIXIT нужно ли так много грохать? @@ -1841,7 +1904,7 @@ MKD11 POP AF ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 ////////////////////////////////////////////////////////////////////// RMDIR: - _mSavePath + _mSavePath 1 CALL GETWORD RET C LD HL,TMPNAME @@ -1862,7 +1925,7 @@ RMDIR: PUSH IX RMD17 PUSH HL CALL NSECTOR - LD A,(BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.S_P_C) RMD12 PUSH AF PUSH HL PUSH IX @@ -1871,7 +1934,7 @@ RMD12 PUSH AF IN A,(SLOT0) OUT (SLOT3),A - LD DE,SECBUF+#C000 + LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Read LD A,(FatBuffer.DRIVE) RST ToDSS.DRV @@ -1880,7 +1943,7 @@ RMD12 PUSH AF OUT (SLOT3),A LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора - LD HL,SECBUF + LD HL,CORE_BUFFERS.SECBUF RMD10 LD A,(HL) OR A JP Z,RMD15 ;DIR EMPTY diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index f0de378..dfe28a6 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -47,8 +47,8 @@ FM_BUF: _sFM JR NC,ABS_FM PUSH DE - LD IY,FM_BUF - LD DE,FM_BUF.Size + LD IY,CORE_BUFFERS.FM_BUF + LD DE,CORE_BUFFERS.FM_BUF.Size AND A JR Z,.endLoop .loop: ADD IY,DE @@ -82,8 +82,8 @@ RES_FM: GET_FM: LD B,FMCOUNT LD C,#FF - LD IY,FM_BUF-FM_BUF.Size - LD DE,FM_BUF.Size + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size .loop: ADD IY,DE INC C LD A,(IY+0) @@ -175,7 +175,7 @@ BLOKRD0 POP BC ; B - Amount sectors BLOK_RD: PUSH BC LD (READ.MEM),IX - LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 ;!FIXIT ;HL:DE / BC => DE:IX HL-OSTATOK @@ -255,7 +255,7 @@ BLOKRD2: POP DE POP BC - LD A,(BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.S_P_C) SUB E LD C,A ;\ CP B ; \ @@ -280,7 +280,7 @@ BLOKRD4 LD DE,(READ.MEM) JP C,BLOKRD0 POP BC LD HL,(READ.MEM) - LD DE,(BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) BLOKRD5 ADD HL,DE DEC C JR NZ,BLOKRD5 @@ -289,7 +289,7 @@ BLOKRD5 ADD HL,DE LD A,B OR A RET Z -BLOKRD6 LD HL,BootSector.S_P_C +BLOKRD6 LD HL,CORE_BUFFERS.BootSector.S_P_C LD A,B SUB (HL) LD B,A @@ -317,7 +317,7 @@ BLOKRD7 EX DE,HL JP C,BLOKRD0 POP BC LD HL,(READ.MEM) - LD DE,(BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) BLOKRD8 ADD HL,DE DEC C JR NZ,BLOKRD8 @@ -345,7 +345,7 @@ BLOKWR0 POP BC ; B - Amount sectors BLOK_WR PUSH BC LD (READ.MEM),IX - LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK @@ -440,7 +440,7 @@ BLOKWR2 LD A,B POP DE POP BC - LD A,(BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.S_P_C) SUB E LD C,A CP B @@ -465,7 +465,7 @@ BLOKWR4 LD DE,(READ.MEM) JP C,BLOKWR0 POP BC LD HL,(READ.MEM) - LD DE,(BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) BLOKWR5 ADD HL,DE DEC C JR NZ,BLOKWR5 @@ -474,7 +474,7 @@ BLOKWR5 ADD HL,DE LD A,B OR A RET Z -BLOKWR6 LD HL,BootSector.S_P_C +BLOKWR6 LD HL,CORE_BUFFERS.BootSector.S_P_C LD A,B SUB (HL) LD B,A @@ -507,7 +507,7 @@ BLOKWR9 POP BC JP C,BLOKWR0 POP BC LD HL,(READ.MEM) - LD DE,(BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) BLOKWR8 ADD HL,DE DEC C JR NZ,BLOKWR8 @@ -556,9 +556,11 @@ READ: LD (R_POINT),HL CALL SET_FM RET C CALL TSTSIZE - LD A,D - OR E - JP Z,.NOREAD ;!FIXIT можно перенести в начало процедуры + ;!FIXIT можно перенести в начало процедуры + LD A,D + OR E + JP Z,.NOREAD + ; PUSH DE LD A,(IY+_sFM.DRIVE) CALL OPENDSK @@ -625,7 +627,7 @@ READ: LD (R_POINT),HL OR C JP Z,.ROV6 PUSH BC - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -636,7 +638,7 @@ READ: LD (R_POINT),HL LD C,SLOT3 OUT (C),B JP C,.ERR_1 - LD HL,BUFFER + LD HL,CORE_BUFFERS.BUFFER LD DE,(R_POINT) POP BC LDIR @@ -661,7 +663,7 @@ READ: LD (R_POINT),HL .ROV1: PUSH BC PUSH HL PUSH DE - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -695,7 +697,7 @@ READ: LD (R_POINT),HL LD C,L LD HL,0 .ROV3: PUSH HL - LD HL,BUFFER + LD HL,CORE_BUFFERS.BUFFER ADD HL,DE LD DE,(R_POINT) LDIR @@ -786,7 +788,7 @@ WOV2: POP BC PUSH HL PUSH DE PUSH BC - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -796,7 +798,7 @@ WOV2: POP BC POP BC LD C,SLOT3 OUT (C),B - LD DE,BUFFER + LD DE,CORE_BUFFERS.BUFFER LD HL,(R_POINT) POP BC JP C,PWERR2 @@ -804,7 +806,7 @@ WOV2: POP BC LD (R_POINT),HL POP DE POP HL - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -841,7 +843,7 @@ WOV6: LD DE,(READ.S_POINT) WOV1: PUSH BC PUSH HL PUSH DE - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -870,7 +872,7 @@ WOV1: PUSH BC LD C,L LD HL,0 WOV3: PUSH HL - LD HL,BUFFER + LD HL,CORE_BUFFERS.BUFFER ADD HL,DE LD DE,(R_POINT) EX DE,HL @@ -879,7 +881,7 @@ WOV3: PUSH HL EXX PUSH HL PUSH DE - LD IX,BUFFER+#C000 + LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF @@ -905,7 +907,7 @@ WOV3: PUSH HL ; NSECTOR: DEC HL ; DEC HL ; EX DE,HL -; LD A,(BootSector.S_P_C) +; LD A,(CORE_BUFFERS.BootSector.S_P_C) ; LD B,A ; LD HL,0 ; LD IX,0 @@ -924,7 +926,7 @@ WOV3: PUSH HL NSECTOR: DEC HL DEC HL LD DE,0 - LD A,(BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.S_P_C) XOR 1 JR Z,.skip ; diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index a127d51..102336c 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -182,8 +182,8 @@ FRESP2: LD D,B LD E,C LD HL,(MAX_CLU) DEC HL - LD BC,(BootSector.B_P_S) - LD A,(BootSector.S_P_C) + LD BC,(CORE_BUFFERS.BootSector.B_P_S) + LD A,(CORE_BUFFERS.BootSector.S_P_C) AND A RET @@ -232,7 +232,7 @@ RD_BPB: LD C,SLOT3 OUT (SLOT3),A ;R08 ;LD DE,BOOT+#C000 - LD DE,SECBUF+#C000 + LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE @@ -245,21 +245,21 @@ RD_BPB: LD C,SLOT3 //PUSH IY ; пока без индексного, но может пригодиться LD DE,#AA55 ; сигнатура ;R05 - LD HL,(SECBUF+510) ;R08 ;R07 + LD HL,(CORE_BUFFERS.SECBUF+510) ;R08 ;R07 ;R05 AND A SBC HL,DE JP NZ,DOS_X_Error.UnknownBPB ;R08 - LD HL,SECBUF - LD DE,BootSector + LD HL,CORE_BUFFERS.SECBUF + LD DE,CORE_BUFFERS.BootSector LD BC,_sBOOT_SEC ; size LDIR ; //LD IY,BootSector ; пока без индексного, но может пригодиться //LD A,(IY+_sBOOT_SEC.ID_FORM) - LD A,(BootSector.ID_FORM) + LD A,(CORE_BUFFERS.BootSector.ID_FORM) CP #F0 JP C,DOS_X_Error.UnknownBPB @@ -272,7 +272,7 @@ RD_BPB: LD C,SLOT3 //LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec //LD H,(IY+_sBOOT_SEC.RESERVE+1) - LD HL,(BootSector.RESERVE) + LD HL,(CORE_BUFFERS.BootSector.RESERVE) ; ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec @@ -285,10 +285,10 @@ RD_BPB: LD C,SLOT3 //LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT //LD D,(IY+_sBOOT_SEC.S_P_F+1) - LD DE,(BootSector.S_P_F) + LD DE,(CORE_BUFFERS.BootSector.S_P_F) - LD A,(BootSector.FAT_NUM) ; amount FATs + LD A,(CORE_BUFFERS.BootSector.FAT_NUM) ; amount FATs CP 1 JR Z,.loop1 DEC A @@ -305,7 +305,7 @@ RD_BPB: LD C,SLOT3 //LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors //LD B,(IY+_sBOOT_SEC.B_P_S+1) - LD BC,(BootSector.B_P_S) + LD BC,(CORE_BUFFERS.BootSector.B_P_S) ; RL C ; RL B ; RL C @@ -330,7 +330,7 @@ RD_BPB: LD C,SLOT3 //LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel //LD D,(IY+_sBOOT_SEC.F_P_DIR+1) - LD DE,(BootSector.F_P_DIR) + LD DE,(CORE_BUFFERS.BootSector.F_P_DIR) EX DE,HL DEC HL @@ -359,9 +359,9 @@ RD_BPB: LD C,SLOT3 //LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector //LD H,(IY+_sBOOT_SEC.B_P_S+1) - LD HL,(BootSector.B_P_S) ; Size sector + LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector - LD A,(BootSector.S_P_C) ;!TODO FATcacheSize + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!TODO FATcacheSize ;NEXTAD3 ; .loop3: ADD HL,BC ; calc. cluster size ; DEC A @@ -389,7 +389,7 @@ RD_BPB: LD C,SLOT3 ENDIF //////////////////////////////////////////////////////////////////////// - LD HL,BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага + LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага LD DE,FatBuffer.MSG LD B,3 ;R_BPBL1 @@ -426,9 +426,9 @@ RD_BPB: LD C,SLOT3 //LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track //LD B,(IY+_sBOOT_SEC.S_P_T+1) - LD BC,(BootSector.S_P_T) ; Sector per track + LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track - LD A,(BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага + LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага .BPB_L1: ; calc. sector per cylinder ADD HL,BC DEC A @@ -446,7 +446,7 @@ RD_BPB: LD C,SLOT3 //LD L,(IY+_sBOOT_SEC.S_P_D) //LD H,(IY+_sBOOT_SEC.S_P_D+1) - LD HL,(BootSector.S_P_D) + LD HL,(CORE_BUFFERS.BootSector.S_P_D) LD A,H OR L @@ -454,11 +454,11 @@ RD_BPB: LD C,SLOT3 ; //LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) //LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) - LD HL,(BootSector.BPB_BIG_TOTAL_SECTORS) + LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS) //LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) //LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) - LD BC,(BootSector.BPB_BIG_TOTAL_SECTORS+2) + LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS+2) AND A SBC HL,DE @@ -469,7 +469,7 @@ RD_BPB: LD C,SLOT3 ;AND A ;тут CF полюбас сброшен должен быть SBC HL,DE LD BC,0 -.HDDBIG: LD A,(BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага +.HDDBIG: LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага SCF .S4C01: RRA JR C,.S4C02 @@ -506,7 +506,7 @@ RD_BPB: LD C,SLOT3 RET .IBM_DOS: - LD A,(BootSector.ID_FORM) + LD A,(CORE_BUFFERS.BootSector.ID_FORM) CP #F0 JR C,DOS_X_Error.UnknownBPB ;????? надо ли изменить? @@ -582,7 +582,7 @@ SAVE_CUR_PATH CALL CURRDSK ADD A,"A" - LD HL,TMP_CURDIR + LD HL,TMP_CURDIR_AUTO LD (HL),A INC HL LD A,":" @@ -608,7 +608,8 @@ SAVE_CUR_PATH ; !TODO починить BACK_CUR_PATH: - PUSH IY + RET NC +.force: PUSH IY PUSH IX PUSH HL PUSH DE @@ -618,8 +619,8 @@ BACK_CUR_PATH: SET_PAGE_X ENVPAGE PUSH AF - LD HL,TMP_CURDIR - CALL CHDIR + LD HL,TMP_CURDIR_AUTO + CALL CHDIR.tmp ; почему не POP AF : OUT (SLOT3),A //POP BC diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index e5fff67..f5332f4 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -320,7 +320,7 @@ F_START: DI LDIR ;R07 ;R11 ;R11 - LD HL,FM_BUF + LD HL,CORE_BUFFERS.FM_BUF LD (HL),'.' ;R11 ;---------------------------; @@ -456,6 +456,7 @@ ADRST10: ;DS 512 ;,0 ; CLEAR_ZONE.start EQU $ + MODULE CORE_BUFFERS BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM @@ -465,15 +466,15 @@ EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER - + ENDMODULE CLEAR_ZONE.size EQU _sBuffers - ASSERT (BUFFERSplace+_sBuffers)<#3FFF, "Warning!!! OUT OF SLOT0" + ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" - DISPLAY "BUFFERSplace.BootSector ",/H,BUFFERSplace.BootSector - DISPLAY "BootSector ", /H, BootSector - DISPLAY "EXEBUFF ", /H, EXEBUFF - DISPLAY "Size ", /H, EXEBUFF-BootSector + DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector + DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector + DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF + DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector DISPLAY "--- --- --- --- --- --- --- ---" @@ -508,12 +509,12 @@ BUFFER EQU XSTACK+1 SECBUF EQU BUFFER ;R11 //////////////////////////////// */ - DISPLAY "FM_BUF addr: ",/H,FM_BUF - DISPLAY "FM_BUF.Size: ",/H,FM_BUF.Size - DISPLAY "FM_BUF.FullSize: ",/H,FM_BUF.FullSize - DISPLAY "EXEBUFF: ",/H,EXEBUFF - DISPLAY "XSTACK: ",/H,XSTACK - DISPLAY "BUFFER: ",/H,BUFFER + DISPLAY "FM_BUF addr: ",/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 "EXEBUFF: ",/H,CORE_BUFFERS.EXEBUFF + DISPLAY "XSTACK: ",/H,CORE_BUFFERS.XSTACK + DISPLAY "BUFFER: ",/H,CORE_BUFFERS.BUFFER ; ; ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < @@ -523,8 +524,7 @@ SECBUF EQU BUFFER ;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||; ; !!!!! эта процедура затрётся после исполнения -DEPLOY: - ;Allocate memory +DEPLOY: ;Allocate memory LD BC,USING_MEMPAGES*256 + BIOS.GetMem RST ToBIOS RET C ;R10 @@ -550,7 +550,7 @@ DEPLOY: OUT (SLOT3),A SET_PAGE_X DRVPAGE - +\ PUSH AF LD HL,DRV_CONTENT LD DE,#C000 @@ -562,14 +562,8 @@ DEPLOY: OUT (SLOT3),A AND A ;R10 RET -; .halt: POP HL ;снимаем лишнее со стека -; ; LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY -; ; SCF -; RET - - ; defb 0 - IF ENVVALUE != BUFFER + IF ENVVALUE != CORE_BUFFERS.BUFFER ASSERT "Warning! ENVVALUE != BUFFER" //BLOCK 1000,0 ENDIF diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 0d476d4..40e3f84 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -149,17 +149,21 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ; ; - MACRO _mSavePath + MACRO _mSavePath force IF SAVE_PATH_MACRO PUSH HL - LD HL,BACK_CUR_PATH + 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 + CALL BACK_CUR_PATH.force ENDIF ENDM MACRO _mRestorStackAfterRestorePath diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM index 15d2eb9..410ed0f 100644 --- a/DSS/ENVIRON.ASM +++ b/DSS/ENVIRON.ASM @@ -4,7 +4,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;R02 13-05-2023 BAO Инициализация переменной BOOTDSK при старте ;!TODO проверить как у Саймана сделано +;R02 13-05-2023 BAO Инициализация переменной BOOTDSK при старте ;R03 09-03-2007 VAS Функция ENV_EX теперь обрезает слишком длинную строку перед выходом ;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV ;--------------------------------------------------------------- @@ -13,6 +13,7 @@ ; Функция #46. Системное окружение. ; ; вход: B - номер подфункции: +; B=#FF, инициализация ; B=0, получение системного окружения. ; HL - буфер ; B=1, получить переменную окружения. @@ -47,6 +48,7 @@ ENVIRON: INITENV: SET_PAGE_X ENVPAGE PUSH AF + ; ;R02 LD A,(BOOTDRV) ADD A,'A' @@ -65,6 +67,7 @@ INITENV: AND A SBC HL,DE LD (ENVSIZE),HL + ; POP AF OUT (SLOT3),A AND A @@ -82,6 +85,7 @@ READENV: LD C,SLOT3 IN L,(C) EXX + LD HL,ENVIRONMENT INC HL POP DE @@ -265,8 +269,8 @@ ENV_E2 LD A,(HL) SCF RET -ENVNAME EQU EXEBUFF ;DS 32 -ENVVALUE EQU BUFFER //#3800 ; BUFFER ;DS 128 +ENVNAME EQU CORE_BUFFERS.EXEBUFF ;DS 32 +ENVVALUE EQU CORE_BUFFERS.BUFFER //#3800 ; BUFFER ;DS 128 ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 5dd5b66..5f0161d 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -6,7 +6,7 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;R12 20-07-2023 BAO При завершении приложения через функцию #41 или "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 +//;R12 20-07-2023 BAO При завершении приложения через функцию #41 или "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1 ;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE ;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER ;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR @@ -135,7 +135,7 @@ EXTN_PR EQU 1 ;%00000010 NAM_PR EQU 0 ;%00000001 EX_PATH: EXX - LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!FIXIT не чё, что используется общий буфер? + LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер LD (NM_PATH),HL LD HL,NM_NAME_A LD (NM_NAME),HL @@ -364,7 +364,7 @@ NM_NAME_A: DB " ",#00 NM_EXTN_A: DB " ",0 -NM_PATH_A EQU BUFFER ;DS 256 +NM_PATH_A EQU CORE_BUFFERS.BUFFER ;DS 256 ;!!!!! shared buffer ////////////////////////////////////////////////////////////////////// @@ -646,27 +646,6 @@ SETWIN2 LD C,BIOS.GetMemPage ; // SLOT0 - #C2 %1100'0010 ; // SLOT0 - #E2 %1110'0010 - -;///////////////////////////////////////////////////////////////////// -; Функция #40. Выполнить файл. -; -; вход: HL - указатель на имя файла -; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы) -; B=1 - загрузить и выполнить программу с полным путём до программы -; выход: A - код завершения, если CF=0 -; код ошибки, если CF=1 -;///////////////////////////////////////////////////////////////////// -EXEC: - _mSavePath - INC B ;R03 - DEC B ;R03 - JP Z,EXEC0 ;R03 - DEC B ;R03 - JP Z,EXEC1 ;R03 - LD A,DSS_Error.sys.INVALID_FUNCTION ;R03 - SCF ;R03 - RET ;R03 - CHECKPATH: ; !TODO сделать проверку на количество циклов LD A,(HL) INC HL @@ -697,7 +676,7 @@ FINDPATH: CALL MAKE_PATH_ARRAY LD HL,PATH_PNT_ARRAY -NEXTPATHI: +.NEXTPATHI: LD E,(HL) INC HL LD D,(HL) @@ -708,22 +687,22 @@ NEXTPATHI: PUSH BC EX DE,HL CALL Z,GOTO_CURDIR - CALL CHDIR - JR C,BADPATH - LD HL,EXEBUFF + CALL CHDIR.tmp + JR C,.BADPATH + LD HL,CORE_BUFFERS.EXEBUFF LD DE,MASKARE CALL MASK - JR C,BADPATH + JR C,.BADPATH CALL TST_EXT - JR C,BADPATH + JR C,.BADPATH CALL SEARCH -BADPATH: +.BADPATH: POP BC POP HL - JR NC,PATHFOUND - DJNZ NEXTPATHI + JR NC,.PATHFOUND + DJNZ .NEXTPATHI SCF -PATHFOUND: +.PATHFOUND: POP BC LD A,B OUT (SLOT3),A @@ -733,7 +712,7 @@ PATHFOUND: GOTO_CURDIR: PUSH HL LD HL,TMP_CURDIR - CALL CHDIR + CALL CHDIR.tmp POP HL RET @@ -779,7 +758,8 @@ NEXTCH: LD A,(DE) ENVPATH DB "PATH=",0 ;;; -; !TODO СДЕЛАТЬ СТРУКТУРОЙ +; !TODO СДЕЛАТЬ СТРУКТУРОЙ и обозначить страницу +TMP_CURDIR_AUTO EQU #FB00 PATH_PNT_ARRAY EQU #FC80 TMP_CURDIR EQU #FD00 ENVTEMP EQU #FE00 @@ -792,9 +772,18 @@ DECTASK: LD HL,TASK ;R08 DEC (HL) ;R08 RET ;R08 -;------------------------------------------------------------------------ + +;///////////////////////////////////////////////////////////////////// +; Функция #40. Выполнить файл. +; +; вход: HL - указатель на имя файла +; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы) +; B=1 - загрузить и выполнить программу с полным путём до программы +; выход: A - код завершения, если CF=0 +; код ошибки, если CF=1 +;--------------------------------------------------------------------- ; Загрузить и выполнить программу. -; функ. 40h, B=0. +; функ. #40, B=0. ; ; 1) Открывает exe-файл на чтение; ; 2) Считывает в рабочую область префикс exe-файла; @@ -816,13 +805,22 @@ DECTASK: LD HL,TASK ;R08 ; -01 1 db ? ; Уровень текущей программы ; +00 1 db ? ; Длина ком-строки ; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем -;------------------------------------------------------------------------ -EXEC0: LD (CMDLINE),HL +;///////////////////////////////////////////////////////////////////// +EXEC: _mSavePath 1 + INC B ;R03 + DEC B ;R03 + JR Z,.VAR_1 ;R03 + DEC B ;R03 + JR Z,.VAR_2 ;R03 + LD A,DSS_Error.sys.INVALID_FUNCTION ;R03 + SCF ;R03 + RET ;R03 + ; +.VAR_1: LD (CMDLINE),HL CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME LD HL,(CMDLINE) JR C,EXEC0_SHORT - -EXEC1: CALL EXEC_1 +.VAR_2: CALL EXEC_1 SCF RET ; File not found - exit @@ -846,6 +844,7 @@ EXEC_1: LD (CMDLINE),HL CALL DECTASK ;R08 AND A RET + ; .noError: POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM @@ -865,7 +864,7 @@ EXEC0_SHORT: CALL ENVIRON LD HL,(CMDLINE) - LD DE,EXEBUFF + LD DE,CORE_BUFFERS.EXEBUFF COPYEXN: LD A,(HL) LDI OR A @@ -876,16 +875,16 @@ COPYEXN: LD A,(HL) RET C ; LD HL,(CMDLINE) - JR EXEC1 + JR EXEC.VAR_2 EXEC02: LD (EXE_FM),A - LD HL,EXEBUFF + LD HL,CORE_BUFFERS.EXEBUFF LD DE,#0080 ;!#0200(512) ;R02 LD A,(EXE_FM) CALL READ JP C,ERREXE - LD IX,EXEBUFF - LD HL,(EXEBUFF) + LD IX,CORE_BUFFERS.EXEBUFF + LD HL,(CORE_BUFFERS.EXEBUFF) LD DE,'E'+'X'*256 ;AND A ; не нужно, если бы был CF=1, то чуть выше мы бы ушли на JP C,ERREXE SBC HL,DE @@ -900,13 +899,14 @@ EXEC02: LD (EXE_FM),A ; LD HL,TASK ; INC (HL) ; -; HERE TO DO: BACK TO CURRDIR +; !TODO: BACK TO CURRDIR ; ;R09 _mRestorStackAfterRestorePath + _mRestorePath ;R09 ; - LD DE,(EXEBUFF.LOADER) + LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) LD A,E OR D JP NZ,PRELOAD @@ -919,7 +919,7 @@ EXEC02: LD (EXE_FM),A LD B,#02 LD A,(EXE_FM) CALL MOVE_FP - LD DE,(EXEBUFF.LD_ADDR) + LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD A,D AND #3F LD D,A @@ -985,19 +985,19 @@ NOINK: LD A,H LD (DE),A ;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; LD HL,(CMDLINE) - LD DE,SECBUF+1 + LD DE,CORE_BUFFERS.SECBUF+1 CALL SCOPYS - LD A,#80 + LD A,#80 ;!HARDCODE cmd line size SUB B - LD (SECBUF),A + LD (CORE_BUFFERS.SECBUF),A ;R02 - LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE + LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE ; LD A,SHARED_PAGE OUT (SLOT1),A OUT (SLOT2),A OUT (SLOT3),A - LD HL,(EXEBUFF.LD_ADDR) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD DE,RAMMAP LD A,H AND #C0 @@ -1016,8 +1016,10 @@ FR8000: LD A,(DE) FRC000: LD A,(DE) OUT (SLOT3),A CALL M_PSP - LD HL,(EXEBUFF.OFFCOD2) - LD IX,(EXEBUFF.OFFCOD1) + + + LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) + LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) LD B,Dss.Move_FP.FrStart LD A,(EXE_FM) CALL MOVE_FP @@ -1025,13 +1027,13 @@ FRC000: LD A,(DE) LD SP,#403F ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты DSS_PAGE ; ; - LD DE,(EXEBUFF.LD_ADDR) + LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) XOR A LD H,A LD L,A SBC HL,DE EX DE,HL ; de=число чит. байт - LD HL,(EXEBUFF.LD_ADDR) ; буфер + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла LD A,(EXE_FM) ; дескр. файла @@ -1041,15 +1043,15 @@ FRC000: LD A,(DE) ;R09 _mRestorePath ; - LD SP,(EXEBUFF.SP_REG) - LD HL,(EXEBUFF.LD_ADDR) + LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD DE,#0080 AND A SBC HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,(EXEBUFF.PC_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE PUSH HL @@ -1094,7 +1096,7 @@ ERREXE: PUSH AF RET PRELOAD: EX DE,HL - LD DE,(EXEBUFF.LD_ADDR) + LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD A,D AND #3F LD D,A @@ -1131,7 +1133,7 @@ NOINK2: LD (EXSTACK),SP LD SP,HL EXX -;...... ;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; + ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит LD A,(EXE_MEM) LD DE,RAMMAP LD BC,#00*256 + BIOS.GetMemPage @@ -1154,19 +1156,19 @@ NOINK2: LD (DE),A ;^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; LD HL,(CMDLINE) - LD DE,SECBUF+1 + LD DE,CORE_BUFFERS.SECBUF+1 CALL SCOPYS LD A,#80 SUB B - LD (SECBUF),A + LD (CORE_BUFFERS.SECBUF),A ;R02 - LD SP,EXEBUFF+510 ;Вставляется в DSS_PAGE + LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE ; LD A,SHARED_PAGE OUT (SLOT1),A OUT (SLOT2),A OUT (SLOT3),A - LD HL,(EXEBUFF.LD_ADDR) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD DE,RAMMAP LD A,H AND #C0 @@ -1185,8 +1187,9 @@ FR8000H: LD A,(DE) FRC000H: LD A,(DE) OUT (SLOT3),A CALL M_PSP - LD HL,(EXEBUFF.OFFCOD2) - LD IX,(EXEBUFF.OFFCOD1) + + LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) + LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) LD B,Dss.Move_FP.FrStart LD A,(EXE_FM) CALL MOVE_FP @@ -1195,8 +1198,8 @@ FRC000H: LD A,(DE) ; ; - LD HL,(EXEBUFF.LD_ADDR) ; буфер - LD DE,(EXEBUFF.LOADER) ; число чит. байт + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер + LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт LD A,(EXE_FM) ; дескр. файла CALL READ ; чтение из файла @@ -1204,15 +1207,15 @@ FRC000H: LD A,(DE) ;R09 _mRestorePath ; - LD SP,(EXEBUFF.SP_REG) - LD HL,(EXEBUFF.LD_ADDR) + LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD DE,#0080 AND A SBC HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,(EXEBUFF.PC_REG) + LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG) LD DE,RETFAR PUSH DE PUSH HL @@ -1251,12 +1254,14 @@ LEAVE: LD A,B LD SP,HL EX DE,HL LD A,(ERLEVEL) - AND A ;R12 - JR Z,.exit + CP DSS_Error.sys.UNEXPECTED_APP_TRMN + JR NZ,.exit SCF + JP (HL) ; -.exit: JP (HL) +.exit: AND A + JP (HL) ;///////////////////////////////////////////////////////////////////// ; Функция #42. Получить код завершения программы. @@ -1267,13 +1272,17 @@ LEAVE: LD A,B WAIT: LD A,(ERLEVEL) AND A RET +;///////////////////////////////////////////////////////////////////// -M_PSP: LD HL,(EXEBUFF.LD_ADDR) + + +;!TODO заменить тут CALL CURRDIR и CALL CURRDSK на другое, когда будет сохраняться current dir +M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) DEC H LD D,H LD E,L INC DE - LD BC,#00FF + LD BC,#00FF ;!HARDCODE LD (HL),B LDIR EX DE,HL @@ -1283,7 +1292,7 @@ M_PSP: LD HL,(EXEBUFF.LD_ADDR) EX DE,HL LD XH,D LD XL,E - LD HL,SECBUF + LD HL,CORE_BUFFERS.SECBUF LD C,(HL) INC C LDIR @@ -1333,7 +1342,7 @@ M_PSP: LD HL,(EXEBUFF.LD_ADDR) ; RET -SCOPYS: LD BC,#80*256 + ' '+1 +SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size .loop: LD A,(HL) CP C JR C,.copy @@ -1343,7 +1352,7 @@ SCOPYS: LD BC,#80*256 + ' '+1 LD (DE),A LD B,#80 RET -.copy: LD BC,#80*256 + ' ' +.copy: LD BC,#80*256 + ' ' ;!HARDCODE cmd line size .loop2: LD A,(HL) LD (DE),A INC HL @@ -1367,7 +1376,7 @@ EXE_MEM: DB #00 ; CMDLINE: DW #0000 -EXSTACK: DW XSTACK ; адрес стека +EXSTACK: DW CORE_BUFFERS.XSTACK ; адрес стека ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;; diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 31ed55d..65a9cc6 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -427,7 +427,7 @@ WR_FAT: SET_PAGE_X FATPAGE LD DE,16 ;!HARDCODE ;!TODO FATcacheSize ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD DE,(BootSector.S_P_F) ; секторов на FAT + LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; секторов на FAT LD A,16 ;!HARDCODE ; MAX число секторов для чтения в кэш ;!TODO FATcacheSize AND A SBC HL,DE diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index 2498532..dd97687 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -423,9 +423,9 @@ KILL_FM: POP BC PUSH AF ; Шерстим манипуляторы на наличие в них грохнутого драйва - LD IY,FM_BUF-FM_BUF.Size + #C000 + LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size + #C000 LD B,FMCOUNT - LD DE,FM_BUF.Size + LD DE,CORE_BUFFERS.FM_BUF.Size .loop_fm: ADD IY,DE LD A,(IY+_sFM.DRIVE) diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index db56665..8a769bc 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -412,6 +412,8 @@ REMOV_H: AND A RET + + RESE_H: XOR A RET @@ -419,13 +421,12 @@ STAT_H: XOR A RET CHEK_H: - ;!TEST - LD A,#FF - ;XOR A - ; - AND A + LD A,#FF + ;XOR A + ;AND A RET + ;HL:IX - SECTOR ; DE - ADDRESS GBPB_H: PUSH IY @@ -444,8 +445,8 @@ GBPB_H: PUSH IY POP DE POP IY LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - RET + JP ToBIOS + ;RET ;HL:IX - SECTOR ; DE - ADDRESS diff --git a/DSS/build.txt b/DSS/build.txt index c0220a2..a21cae3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -397 \ No newline at end of file +454 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index e74f3cd..2c2a1bf 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,7 +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_MACRO 1 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; diff --git a/SHELL/Commands/DEL.ASM b/SHELL/Commands/DEL.ASM index 320b4cd..25f16b6 100644 --- a/SHELL/Commands/DEL.ASM +++ b/SHELL/Commands/DEL.ASM @@ -3,14 +3,13 @@ ; DEL, ERASE. Удалить файл ; ;/////////////////////////////////////////////////// -cmd_del:ex de,hl - ;ld de,T9186 +cmd_del: ex de,hl ld de,work_buffer1; ld c,Dss.GSwitch RST ToDSS - ;ld hl,T9186 ld hl,work_buffer1; ld c,Dss.Delete RST ToDSS call c,print_err_message ; вывод сообщения ret +;/////////////////////////////////////////////////// \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 971c6ee..9d1e598 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -4,7 +4,7 @@ ; ;/////////////////////////////////////////////////// cmd_dir: push de - ld c,Dss.CurDisk ; узнать тек. диск + ld c,Dss.CurDisk ; узнать тек. диск RST ToDSS ld (disk+1),a ; номер диска call read_disk_info ; прочитать метку и серийный номер диска @@ -16,12 +16,15 @@ cmd_dir: push de ex de,hl ld a,(hl) or a - jr nz,$+5 ; задана маска имен + jr nz,1F ; задана маска имен ld hl,mask_fname ; "*.*" ;ld de,T9186 ; буфер - ld de,work_buffer1 ; 80 +1: ld de,work_buffer1 ; 80 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS + ; [ ] 1/10/23 + + ; ;ld hl,T9186 ; имя файла ;ld de,T9186 ; буфер ld hl,work_buffer1 ; имя файла diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM index 3d919ae..0d6bcdb 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/SHELL_EXEC.ASM @@ -120,6 +120,7 @@ NOUP: sub "A" ; ld (hl),0 dec hl ld (hl),'\' + ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) IFDEF MANY_SYS_PATHES ld c,Dss.ChDir ; уст. тек. путь @@ -155,10 +156,10 @@ A839D: ld bc,0*256 + Dss.Exec ; ;R10 ret nc ; Ok ld hl,(D8374) - cp 3 ; код ошибки "файл не обнаружен" + cp DSS_Error.sys.FILE_NOT_FOUND jr nz,A83DD push hl - ;ld a,(D96AD) ;; длина строки (inline.asm) + ;ld a,(D96AD) ; длина строки (inline.asm) ld a,(struct_input_line+4) ; длина строки ld b,a A83AF: ld a,(hl) @@ -199,6 +200,6 @@ A83D7: ld bc,0*256 + Dss.Exec ; ;R10 ret nc A83DD: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" - jp nc,print_err_message ; вывод сообщения - xor a ; индекс "Bad command or file name" + jp nc,print_err_message ; вывод сообщения + xor a ; индекс "Bad command or file name" jp print_err_message diff --git a/SHELL/build.txt b/SHELL/build.txt index e3f1e9b..3ca9062 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -80 \ No newline at end of file +84 \ No newline at end of file