diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM index f9cfc19..0abef18 100755 --- a/DOS/DOS.ASM +++ b/DOS/DOS.ASM @@ -3845,7 +3845,7 @@ A227F: ;ld (hl),'\' ; ; ; выход: A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// Func_1E:ex de,hl ; de=куда - ld hl,T1510 ; откуда ; DIRSPEC + ld hl,T1510 ; откуда ; CurrentDirectory ld a,(hl) or a ldi diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index fcd9064..0778594 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -21,26 +21,27 @@ ;------------------------------------------------------------- - +//////////////////////////////////////////////////////////////////////// ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; A - ATTRIB ; B - MODE ; B = 0 GET ATTRIB ; B = 1 SET ATTRIB ; OUTPUT: A - ATTRIB +//////////////////////////////////////////////////////////////////////// ATTRIB: _mSavePath 1 INC B DEC B - JP Z,RATTRIB + JP Z,.RATTRIB DEC B - JP Z,WATTRIB + JP Z,.WATTRIB LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET - -RATTRIB XOR A - CALL OPENATR ;R02 +.RATTRIB: + XOR A + CALL .OPENATR ;R02 RET C LD B,(IY+_sFM.ATTRIBUT) PUSH BC @@ -50,10 +51,10 @@ RATTRIB XOR A LD A,B ;AND A RET - -WATTRIB PUSH AF +.WATTRIB: + PUSH AF XOR A - CALL OPENATR ;R02 + CALL .OPENATR ;R02 POP BC RET C SET 7,(IY+_sFM.ACCESS_MODE) @@ -66,15 +67,33 @@ WATTRIB PUSH AF LD A,B ;AND A RET +;R02 +.OPENATR: + LD (F_FIRST.ACCESS),A ; раб. ячейка (здесь атрибут записи) + CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + LD A,FAT_ATTR.NoVolID + CALL SEARCH.ASEARCH + ; JR NC,OPENAT ; на поиск своб. дескриптора + ; ; запись не найдена + ; RET + RET C ; запись не найдена + JP OPEN.FM ; на поиск своб. дескриптора +;R02 - +//////////////////////////////////////////////////////////////////////// ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM +//////////////////////////////////////////////////////////////////////// CREATE: _mSavePath 0 CALL .Prepare RET C CALL SEARCH - CALL NC,DELFILE ;FILE EXIST RECREAT + CALL NC,DELETE ;FILE EXIST RECREAT JR .DO ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM @@ -91,7 +110,7 @@ CREATE: _mSavePath 0 LD BC,11 LDIR EX DE,HL - LD A,(ACCESS) + LD A,(F_FIRST.ACCESS) LD (HL),A INC HL LD BC,#0A00 ;!HARDCODE @@ -120,13 +139,14 @@ CREATE: _mSavePath 0 ; CALL WRT_HND CALL SAVEDIR - LD HL,(PATH0) +.PATH0+1: + LD HL,0 XOR A JP OPEN ;R08 .Prepare: AND #E7 ;R04 %76A00SHR = !FAT_ATTR - LD (ACCESS),A - LD (PATH0),HL + LD (F_FIRST.ACCESS),A + LD (.PATH0),HL CALL GETWORD RET C LD HL,TMPNAME @@ -134,10 +154,10 @@ CREATE: _mSavePath 0 JP MASK CREAT_N EQU CREATE.NEW - -; INPUT: HL - "filename.ext",#00 without simbols * ? -DELETE: - ;!TEST +//////////////////////////////////////////////////////////////////////// +; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? +//////////////////////////////////////////////////////////////////////// +DEL_FN: ;!TEST _mSavePath 1 CALL GETWORD ; тест на допуст. имя и настр. на диск RET C @@ -159,19 +179,18 @@ DELETE: CALL LOADDIR CALL SEARCH RET C + ;JP DELETE ; пометить запись как "удаленная" -DELFILE: - SET_PAGE_X DIRPAGE - +DELETE: SET_PAGE_X DIRPAGE LD (IX+_sFM.NAME),#E5 ; признак удаления файла LD E,(IX+_sFM.ST_CLUSTER) ; № первого кластера LD D,(IX+_sFM.ST_CLUSTER+1) - + ; OUT (SLOT3),A LD A,E OR D JP Z,SAVEDIR ; сбросить кеш каталога на диск -DEL01 EX DE,HL ; hl=номер кластера +.loop: EX DE,HL ; hl=номер кластера CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера PUSH DE ; номер след. кластера PUSH AF @@ -179,11 +198,11 @@ DEL01 EX DE,HL ; hl= CALL W_T_FAT ; записать в кеш FAT-а номер кластера POP AF POP DE - JP NC,DEL01 + JP NC,.loop CALL WR_FAT JP SAVEDIR ; сбросить кеш каталога на диск -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #10. Переименование файла. ; Глобальные символы * и ? в именах файлов не допускаются. ; @@ -193,7 +212,7 @@ DEL01 EX DE,HL ; hl= ; ; INPUT: HL - "old_name.ext",#00 without simbols * ? ; DE - "new_name.ext",#00 without simbols * ? -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// RENAME: PUSH DE LD DE,MASKARE CALL MASK @@ -210,7 +229,7 @@ RENAME: PUSH DE CALL LOADDIR ; прочитать список каталога ;LD A,#33 LD A,FAT_ATTR.NoSYSnoVolID - CALL ASEARCH ; поиск записи в списке диска + CALL SEARCH.ASEARCH ; поиск записи в списке диска POP HL RET C LD DE,MASKARE @@ -225,7 +244,7 @@ RENAME: PUSH DE RET Z PUSH IX LD A,FAT_ATTR.NoSYSnoVolID - CALL ASEARCH ; поиск записи в списке диска + CALL SEARCH.ASEARCH ; поиск записи в списке диска POP IX LD A,DSS_Error.sys.FILE_EXISTS CCF @@ -241,24 +260,7 @@ RENAME: PUSH DE OUT (SLOT3),A JP SAVEDIR -;R02 -OPENATR: - LD (ACCESS),A ; раб. ячейка (здесь атрибут записи) - CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - LD HL,TMPNAME - LD DE,MASKARE - CALL MASK - RET C - LD A,FAT_ATTR.NoVolID - CALL ASEARCH - JR NC,OPENAT ; на поиск своб. дескриптора - ; запись не найдена - RET -;R02 - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #11. Открытие файла. ; ; вход: HL - указатель на имя файла @@ -268,22 +270,21 @@ OPENATR: ; A=2 запись ; выход: A - дескриптор файла, если CF=0 ; код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// OPEN_FN: _mSavePath 1 ;R08 -OPEN: LD (ACCESS),A +OPEN: LD (F_FIRST.ACCESS),A CALL GETWORD RET C LD HL,TMPNAME LD DE,MASKARE CALL MASK RET C -OPENEXE: - CALL SEARCH +.FILE: CALL SEARCH RET C -OPENAT: ;R02 - CALL GET_FM +;R02 +.FM: CALL GET_FM RET C LD A,C EX AF,AF' @@ -296,7 +297,7 @@ OPENAT: ;R02 LD HL,HANDBUF LD BC,HANDBUF.SIZE LDIR - LD A,(ACCESS) + LD A,(F_FIRST.ACCESS) LD (IY+_sFM.ACCESS_MODE),A LD A,(TASK) LD (IY+_sFM.TASK_NUM),A @@ -317,10 +318,14 @@ OPENAT: ;R02 AND A RET +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// CLOSE_FN: _mSavePath 1 ;R08 -CLOSE: LD (ACCESS),A +CLOSE: LD (F_FIRST.ACCESS),A CALL SET_FM RET C LD A,(TASK) @@ -329,7 +334,7 @@ CLOSE: LD (ACCESS),A SCF RET NZ BIT 7,(IY+_sFM.ACCESS_MODE) - JR Z,NOTMODF + JR Z,.NOTMODF LD D,(IY+_sFM.DIR_CLUSTER) LD E,(IY+_sFM.DIR_CLUSTER+1) PUSH DE @@ -339,18 +344,20 @@ CLOSE: LD (ACCESS),A LD (IY+_sFM.DIR_CLUSTER),D LD (IY+_sFM.DIR_CLUSTER+1),E CALL LOADDIR - LD A,(ACCESS) + LD A,(F_FIRST.ACCESS) 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 + JR .CLOSE2 +.CLOSE1: + ADD HL,DE DEC BC -CLOSE2: LD A,B +.CLOSE2: + LD A,B OR C - JR NZ,CLOSE1 + JR NZ,.CLOSE1 LD D,YH LD E,YL EX DE,HL @@ -363,115 +370,20 @@ CLOSE2: LD A,B LDIR OUT (SLOT3),A CALL SAVEDIR -NOTMODF: - LD A,(ACCESS) +.NOTMODF: + LD A,(F_FIRST.ACCESS) CALL RES_FM RET -PATH0: DW #0000 - -ACCESS: DB #00 - -HANDBUF: BLOCK HANDBUF.SIZE,0 - - -WRT_HND: - SET_PAGE_X DIRPAGE - - PUSH AF - LD IX,DIR - EXX - LD DE,0 - EXX -WRT_HN1: - LD A,(IX+00) - OR A - JR Z,WRT_HN2 - CP #E5 - JR Z,WRT_HN2 - LD BC,#0020 - ADD IX,BC - JR NC,WRT_HN1 - 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,(DIRSIZE) - DEC BC - ADD HL,BC - AND A - SBC HL,DE - RET NC - LD HL,(DIRSIZE) - LD BC,(FatBuffer.B_P_C) - ADD HL,BC - LD (DIRSIZE),HL - AND A - RET - -DOSNAME: - INC B - DEC B - JP Z,GETNAME - DEC B - JP Z,MASK - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET - -; HL - 11 bytes filename "FILENAMEEXT" -; DE - DOS filename "FILENAME.EXT",0 -GETNAME: - LD BC,#08FF -GETN1: LD A,(HL) - CP " " - JR NZ,GETN3 -GETN2: INC HL - DJNZ GETN2 - JR GETN4 -GETN3: LDI - DJNZ GETN1 -GETN4: LD A,(HL) - CP " " - LD A,"." - JR NZ,GETN5 - LD A,#00 -GETN5: LD (DE),A - INC DE - RET Z - LD B,#03 -GETN6: LD A,(HL) - CP " " - RET Z - LDI - XOR A - LD (DE),A - DJNZ GETN6 - RET - -DTABUF: DW #0000 -CURHND: DW #0000 -NO_NEXT: DB #00 -.YES EQU 0 -.NO EQU #FF -FNDMODE: DB #00 - +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// F_FIRST: - LD (ACCESS),A - LD (DTABUF),DE + LD (.ACCESS),A + LD (.DTABUF),DE LD A,B - LD (FNDMODE),A + LD (.FNDMODE),A PUSH HL CALL LOADDIR POP HL @@ -481,64 +393,75 @@ F_FIRST: LD DE,MASKARE CALL MASK RET C - LD A,(ACCESS) - CALL ASEARCH +.ACCESS+1: + LD A,0 + CALL SEARCH.ASEARCH RET C LD HL,MASKARE - LD DE,(DTABUF) +.DTABUF+1: + LD DE,0 LD BC,11 ;!HARDCODE LDIR - LD A,(ACCESS) + LD A,(.ACCESS) LD (DE),A -FIND_S: INC DE +.FIND_S: + INC DE LD BC,#0020 ADD IX,BC - LD (CURHND),IX - LD HL,HANDBUF+12 + LD (F_NEXT.CURHND),IX + LD HL,HANDBUF+12 ;!HARDCODE LD BC,HANDBUF.SIZE-12 ;????? метку вместо числа? LDIR LD A,(HANDBUF+11) LD (DE),A INC DE LD HL,HANDBUF - LD A,(FNDMODE) +.FNDMODE+1: + LD A,0 OR A - JR NZ,FIND_M2 + JR NZ,.FIND_M2 LD BC,11 ;!HARDCODE LDIR - LD A,NO_NEXT.NO - LD (NO_NEXT),A + LD A,F_NEXT.NO_NEXT.NO + LD (F_NEXT.NO_NEXT),A XOR A RET -FIND_M2: +.FIND_M2: CALL GETNAME - LD A,NO_NEXT.NO - LD (NO_NEXT),A + LD A,F_NEXT.NO_NEXT.NO + LD (F_NEXT.NO_NEXT),A XOR A RET -F_NEXT: LD A,(NO_NEXT) +//////////////////////////////////////////////////////////////////////// +; +; +//////////////////////////////////////////////////////////////////////// +F_NEXT: +.NO_NEXT.YES EQU 0 +.NO_NEXT.NO EQU #FF +.NO_NEXT+1: + LD A,0 OR A LD A,DSS_Error.sys.INVALID_ACCESS SCF RET Z - LD (DTABUF),DE + LD (F_FIRST.DTABUF),DE EX DE,HL LD DE,MASKARE LD BC,11 ;!HARDCODE LDIR - XOR A - LD (NO_NEXT),A + XOR A ; F_NEXT.NO_NEXT.YES + LD (F_NEXT.NO_NEXT),A LD A,(HL) PUSH HL - CALL NSEARCH + CALL .NSEARCH POP DE RET C - JP FIND_S - -NSEARCH: + JP F_FIRST.FIND_S +.NSEARCH: EX AF,AF' SET_PAGE_X DIRPAGE @@ -551,201 +474,17 @@ NSEARCH: EXX LD DE,0 EXX - LD IX,(CURHND) +.CURHND+2: + LD IX,0 LD A,XH OR XL - JR Z,SEARCH3.error - JP SEARCH1 + JP Z,SEARCH.error + JP SEARCH.SEARCH1 -;------------------------------------------------- -; Поиск записи каталога в списке каталога +//////////////////////////////////////////////////////////////////////// ; -; вход: a=атрибут записи -; выход: de'=индекс записи в списке каталога -; CF - каталог не найден -;------------------------------------------------- -DSEARCH: - LD A,FAT_ATTR.DIRECTORY - CALL ASEARCH - RET NC - LD A,DSS_Error.sys.PATH_NOT_FOUND - RET - -SEARCH: LD A,FAT_ATTR.NoDIRnoVolID -ASEARCH: - EX AF,AF' ; 76ADLSHR - - SET_PAGE_X DIRPAGE - - PUSH AF - EX AF,AF' - CPL - LD C,A - LD IX,DIR - EXX - LD DE,0 - EXX -SEARCH1: - LD A,(IX+00) - OR A - JR Z,SEARCH4 - CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,SEARCH3 - LD A,(IX+11) - AND C - JR NZ,SEARCH3 - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 - EX DE,HL -SEARCH2: - LD A,(DE) - CP '?' - JR Z,SEARCH5 - CP (HL) - JR NZ,SEARCH3 -SEARCH5: - INC HL - INC DE - DJNZ SEARCH2 - LD D,XH - LD E,XL - LD HL,HANDBUF - EX DE,HL - LD BC,HANDBUF.SIZE - LDIR - POP AF - OUT (SLOT3),A - AND A - RET -SEARCH3: - EXX - INC DE - EXX - LD DE,#0020 ;!HARDCODE - ADD IX,DE - JR NC,SEARCH1 -.error: POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR - SCF - RET -SEARCH4: - POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.FILE_NOT_FOUND - 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 - 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 - -.DIR_NAME: - XOR A - LD (DE),A - PUSH HL - LD HL,TMPNAME - CALL OPENDIR - POP HL - 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 -; RET C -; JR .loop -; Буфер имени 8.3 формата -TMPNAME: DZ ' ' ; 12 пробелов и 0 - +; +//////////////////////////////////////////////////////////////////////// ;!TODO сделать для каждого драйва запоминание текущей дирректории, пока тут заглушка ; RestoreDIR: CHNDISK: @@ -755,8 +494,9 @@ CHNDISK: ; ;????? R10 RET C - ;LD HL,DIRSPEC+1 - LD HL,DIRSPEC + ;LD HL,CurrentDirectory+1 + ;LD HL,CurrentDirectory + LD HL,WorkDirectory LD (HL),0 PUSH AF CALL OPENDIR @@ -768,236 +508,16 @@ CHNDISK: ; CALL LOADDIR ; POP AF RET - ; - ;????? R10 -OPENDSK: - ;!TEST DRV.Open обход - LD C,A - LD A,(FatBuffer.DRIVE) - CP C - JR Z,.exit - LD A,C - ; -.force: PUSH AF - LD C,Dss.DRV.Open - RST ToDSS.DRV - POP BC - JP C,.error - LD A,B - LD (FatBuffer.DRIVE),A - CALL RD_BPB - RET C -.exit: LD A,(LDRIVE) - AND A - RET -.error: CP DSS_Error.sys.INVALID_DRIVE - SCF - RET Z - LD A,DSS_Error.sys.NOT_READY - RET -; -OPENDIR: - XOR A - CALL SET_FM - LD A,(HL) - OR A - JR NZ,SUBDIR -REROOT1: - LD DE,0 - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D - CALL LOADDIR - LD HL,DIRSPEC - LD (HL),'\' - INC HL - LD (HL),#00 - AND A - RET - -SUBDIR: CP "." - JR NZ,SUBDIR2 - LD A,(IY+_sFM.ST_CLUSTER) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY - OR (IY+_sFM.ST_CLUSTER+1) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY - JR NZ,SUDI1 ;R05 - INC HL ;R05 - LD A,(HL) ;R05 - OR A ;R05 - DEC HL ;R05 - JR Z,REROOT1 ;R05 -SUDI1: EXX - LD HL,MASKARE - LD DE,MASKARE+1 - LD BC,10 ;!HARDCODE - LD (HL),' ' - LDIR - EXX - LD DE,MASKARE -SUBDIR0: - LDI - LD A,(HL) - OR A - JR NZ,SUBDIR0 - JR SUBDIR3 - -SUBDIR2: - LD DE,MASKARE - CALL MASK - RET C -SUBDIR3: - CALL FINDDIR - RET C - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D - LD DE,#4000 - LD (IY+_sFM.F_SIZE),E - LD (IY+_sFM.F_SIZE+1),D - CALL LOADDIR - AND A - RET - - -; FIND "MASKAREA" IN DIRECTORY -FINDDIR: - SET_PAGE_X DIRPAGE - - PUSH AF - LD IX,DIR -.F_01: LD A,(IX+00) - OR A - JR Z,.error - CP #E5 - JR Z,.F_03 - LD A,(IX+11) - AND #10 - JR Z,.F_03 - LD HL,MASKARE - LD D,XH - LD E,XL - EX DE,HL - LD B,11 -.loop: LD A,(DE) - CP "?" - JR Z,.F_05 - CP (HL) - JR NZ,.F_03 -.F_05: INC HL - INC DE - DJNZ .loop - LD A,(IX+0) - CP "." - JP NZ,ADDSPEC - LD A,(IX+1) - CP "." - JP NZ,IT_DIR - LD HL,DIRSPEC - LD D,H - LD E,L - INC HL - LD BC,DIRSPEC.DEPTH - XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 - DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога - DEC HL - LD BC,DIRSPEC.DEPTH - LD A,'\' - CPDR - INC HL - AND A - EX DE,HL - SBC HL,DE - EX DE,HL -; JR NZ,ROTZ - JR NZ,MM3 - JP MM2_5 -; INC HL -; ROTZ LD (HL),0 -; JP IT_DIR -; IT_DIR LD E,(IX+_sFM.ST_CLUSTER) -; LD D,(IX+_sFM.ST_CLUSTER+1) -; POP AF -; OUT (SLOT3),A -; AND A -; RET -.F_03: LD BC,#0020 - ADD IX,BC - JR NC,.F_01 -.error: POP AF - OUT (SLOT3),A - LD A,DSS_Error.sys.PATH_NOT_FOUND - SCF - RET - -ADDSPEC LD E,XL - LD D,XH - LD HL,DIRSPEC+1 - LD BC,DIRSPEC.DEPTH-1 - XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 - DEC HL - DEC HL - LD A,'\' ; #5C - CP (HL) - INC HL - JR Z,ADDSPE0 - LD (HL),A - INC HL -ADDSPE0: - ;R11 - LD A,B - AND A - JR NZ,MM1 - LD A,C - CP 8 - JR C,FINDDIR.error - ;R11 - LD BC,#0820 -MM1 LD A,(DE) - INC DE - CP C - JR Z,MM2 - LD (HL),A ;!FIXIT вот тут может вылезать за пределы буфера при длинном пути и грохать код и данные. R11 времено лечит костылём - INC HL -MM2 DJNZ MM1 - LD A,(DE) - INC DE - CP C - JR Z,MM3 - LD (HL),"." - INC HL - LD (HL),A - INC HL - LD A,(DE) - INC DE - CP C - JR Z,MM3 - LD (HL),A - INC HL - LD A,(DE) - CP C - JR Z,MM3 - LD (HL),A - -MM2_5: INC HL -MM3: LD (HL),0 -; JP IT_DIR -IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) - LD D,(IX+_sFM.ST_CLUSTER+1) - POP AF - OUT (SLOT3),A - AND A - RET - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #1E. Информация о текущем каталоге. ; ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 ; !FIXIT может выйти за пределы буфера? -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// CURRDIR: EX DE,HL - LD HL,DIRSPEC + LD HL,CurrentDirectory XOR A .loop: ;LD A,(HL) ;OR A @@ -1006,328 +526,7 @@ CURRDIR: EX DE,HL JR NZ,.loop RET - -;------------------------------------------------- -; Прочитать список каталога -;------------------------------------------------- -LOADDIR: - XOR A - LD H,A - LD L,A - LD IX,0 - LD B,A ; от начала файла - CALL MOVE_FP - - SET_PAGE_X DIRPAGE - - PUSH AF - ;!TEST no ldir - ; очистить кеш каталога - ;LD HL,#C000 - ;LD DE,#C001 - ;LD BC,#3FFF - ;LD (HL),L - ;LDIR - ; - LD A,(FatBuffer.DRIVE) ; номер диска - LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор - LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера - LD E,(IY+_sFM.ST_CLUSTER+1) - LD A,D - OR E - JP Z,LROTDIR ; root ?? - LD HL,DIR ; куда - LD DE,#4000 ; сколько - XOR A ; дескриптор - CALL READ ; чтение из файла - LD (DIRSIZE),DE ; число прочит. байтов - POP AF - OUT (SLOT3),A - AND A - RET - -LROTDIR LD HL,(FatBuffer.DIR_FRH) ; ст. разряд - LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора - LD A,(FatBuffer.DIR_S_S) - LD B,32 ; !HARDCODE размер root-каталога - SUB B - JR NC,RTD1 - ADD A,B - LD B,A ; число секторов -RTD1 LD A,(FatBuffer.DRIVE) ; номер диска - LD DE,DIR ; буфер - LD C,Dss.DRV.Read ; чтение секторов - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - AND A - RET - -;------------------------------------------------- -; Сбросить кеш каталога на диск. -; вход: iy=структура дескриптора -;------------------------------------------------- -SAVEDIR XOR A - LD HL,0 - 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) - LD E,(IY+_sFM.ST_CLUSTER+1) - LD A,D - OR E - JP Z,SROTDIR - LD HL,DIR - LD DE,(DIRSIZE) - XOR A - CALL WRITE - POP AF - OUT (SLOT3),A - AND A - RET - -SROTDIR LD HL,(FatBuffer.DIR_FRH) - LD IX,(FatBuffer.DIR_FRL) - LD A,(FatBuffer.DIR_S_S) - LD B,32 - SUB B - JR NC,RTD1S - ADD A,B - LD B,A -RTD1S LD A,(FatBuffer.DRIVE) - LD DE,DIR - LD C,Dss.DRV.Write - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - AND A - RET - -DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory - -;!TEST - ;BANK: - ; LD C,A - ; LD B,0 - ; LD HL,BANKTBL - ; ADD HL,BC - ; IN A,(SLOT3) - ; LD C,SLOT3 - ; OUTI - ; RET -; - - -; Массив лог. номеров банок расширения ДОС -BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE - - - -;!TODO -GHANDLE: -; PUSH DE -; PUSH HL -; PUSH IX -; CALL TESTDSK -; JP C,G_HAND1 -; CALL LOADDIR -; POP DE -; LD HL,DIR -; LD BC,#0020 -;G_HAND2: -; LD A,D -; OR E -; JP Z,G_HAND3 -; ADD HL,BC -; DEC DE -; JP G_HAND2 -;G_HAND3: -; EXX -; POP DE -; EXX -;G_HAND4: -; EX DE,HL -; LD A,DIRPAGE -; CALL BANK -; EX DE,HL -; LD DE,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; OUT (SLOT3),A -; LD HL,HANDTA -; -; DUP 32 -; LDI -; EDUP -; -; EXX -; POP BC -; DEC BC -; LD A,B -; OR C -; RET Z -; PUSH BC -; JP G_HAND4 -;G_HAND1 POP IX -; POP HL -; POP DE -; RET -;HANDTA BLOCK 32,0 - - -MASKARE: BLOCK 8,0 ; имя файла - BLOCK 3,0 ; расш. - BLOCK 21,0 ; 11+21=32 -;------------------------------------------------- -; Преобразовать имя 8.3 -> 11 формат -; вход: hl = 8.3 имя -; de = буфер имени 11 симв. формата -; при ошибке CF - недоп. имя -; -; HL - MASK "file*.t??" -; DE - 11 bytes filename -; RET: C=2 FILE WITHOUT EXTENTION -; C=1 FILE WITH EXTENTION -;------------------------------------------------- -MASK: PUSH HL - PUSH DE - LD H,D - LD L,E - INC DE - LD (HL),' ' - LD BC,10 ;!HARDCODE = size (FileName + Extension - 1) - LDIR - POP DE - POP HL - LD A,(HL) - CP '.' ;R07 - SCF ;R07 - JR Z,.MASKB ;R07 - CP ' '+1 -.MASKB: LD A,DSS_Error.sys.INVALID_NAME - RET C - LD BC,#0902 ; B - счетчик -MASK1: LD A,(HL) - CP ' '+1 - CCF - RET NC - CP '"' - JR Z,MASK_ERR - CP '*' - JR Z,MASK3 - CP '+' - JR Z,MASK_ERR - CP ',' - JR Z,MASK_ERR - CP '.' - JR Z,MASK5 - CP '/' - JR Z,MASK_ERR - CP ':' - JR Z,MASK_ERR - CP ';' - JR Z,MASK_ERR - CP '<' - JR Z,MASK_ERR - CP '=' - JR Z,MASK_ERR - CP '>' - JR Z,MASK_ERR - CP '[' - JR Z,MASK_ERR - CP '\' - JR Z,MASK_ERR - CP ']' - JR Z,MASK_ERR - CP '|' - JR Z,MASK_ERR -; CP 'a' ;????? -; JR C,MASK2 -; CP '{' -; JR NC,MASK2 -; SUB #20 - CALL UPPER ; a..z -> A..Z -MASK2 LD (DE),A - INC HL - INC DE - DJNZ MASK1 -MASK_ERR: - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -MASK3: LD A,'?' - INC HL - DJNZ MASK6 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -MASK6: LD (DE),A - INC DE - DJNZ MASK6 - LD B,1 - JR MASK1 - -MASK5: LD A,' ' - INC HL - DJNZ MASK4 - LD B,4 - DEC C - JP NZ,MASK1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -MASK4: LD (DE),A - INC DE - DJNZ MASK4 - LD B,4 - DEC C - JP NZ,MASK1 - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - -; a..z -> A..Z -UPPER: CP 'a' - RET C - CP '{' - JR NC,MDUPPER - SUB #20 -NOUPPER RET - -MDUPPER CP 'а' ; русская буква а, код #A0 - JR C,NOUPPER - CP 'п' ; русская буква п, код #B0 - JR NC,BGUPPER - SUB #20 - RET - -BGUPPER CP 'р' ; русская буква р, код #E0 - JR C,NOUPPER - CP 'Ё' ; русская буква Ё, код #F0 - JR NC,HGUPPER - SUB #50 - RET - -HGUPPER CP 'ё' ; русская буква ё, код #F1 - RET NZ - DEC A - RET - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #21. Текущая дата и время. ; ; вход: нет @@ -1338,10 +537,11 @@ HGUPPER CP ' ; L - минуты ; B - секунды ; C - день недели -////////////////////////////////////////////////////////////////////// -SYSTIME LD C,BIOS.CMOS_TEST +//////////////////////////////////////////////////////////////////////// +SYSTIME: + LD C,BIOS.CMOS_TEST RST ToBIOS - JP C,NOCMOS + JP C,.NOCMOS LD D,7 ;DAY CALL RCMOS PUSH AF @@ -1378,22 +578,24 @@ SYSTIME LD C,BIOS.CMOS_TEST POP AF CP 80 ;R01, TEST DECIMAL FIX PUSH AF - JR C,XXIAGE + JR C,.XXIAGE LD A,#19 CP XH - JR Z,GOODAGE - JR BADAGE - -XXIAGE LD A,#20 + JR Z,.GOODAGE + JR .BADAGE +.XXIAGE: + LD A,#20 CP XH - JR Z,GOODAGE -BADAGE PUSH AF + JR Z,.GOODAGE +.BADAGE: + PUSH AF LD D,#32 ;CENTURY LD C,BIOS.CMOS_WR RST ToBIOS POP AF LD XH,A -GOODAGE POP AF +.GOODAGE: + POP AF LD XL,A LD A,XH CALL BCD2HEX @@ -1419,49 +621,19 @@ GOODAGE POP AF POP DE AND A RET - -; Чтение регистров CMOS -; вход: d=номер регистра - -RCMOS LD C,BIOS.CMOS_RD - RST ToBIOS -; INPUT : A - BCD -; OUTPUT: A - HEX -BCD2HEX - LD E,A - RRCA - RRCA - RRCA - RRCA - AND #0F - LD D,A - ADD A,A - ADD A,A - ADD A,D - ADD A,A - LD D,A - LD A,E - AND #0F - ADD A,D - RET - -NOCMOS LD DE,(NC_DAY) ;DAY/MONTH - LD HL,(NC_HOUR) ;HOUR/MINUTE - LD BC,(NC_SEC) ;SECOND/WEEKDAY - LD IX,(NC_YEAR) ;YEAR +.NOCMOS: +.NC_DAY+1: + LD DE,DAY*256+MONTH ;DAY/MONTH +.NC_HOUR+1: + LD HL,0 ;HOUR/MINUTE +.NC_SEC+1: + LD BC,1 ;SECOND/WEEKDAY +.NC_YEAR+2: + LD IX,YEAR ;YEAR AND A RET -; !FIXIT новый биос выставляет время, если с ним что-то не так. -NOCMOS2 LD C,0 - LD (NC_DAY),DE ;DAY/MONTH - LD (NC_HOUR),HL ;HOUR/MINUTE - LD (NC_SEC),BC ;SECOND/WEEKDAY - LD (NC_YEAR),IX ;YEAR - AND A - RET - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #22. Установить текущую дату и время. ; ; вход: D - день @@ -1471,14 +643,15 @@ NOCMOS2 LD C,0 ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -SETTIME PUSH IX +//////////////////////////////////////////////////////////////////////// +SETTIME: + PUSH IX PUSH BC PUSH HL PUSH DE LD C,BIOS.CMOS_TEST RST ToBIOS - JP C,NOCMOS2 + JP C,.NOCMOS2 POP AF PUSH AF LD D,7 ;DAY @@ -1504,13 +677,13 @@ SETTIME PUSH IX LD D,6 ;WEEK DAY LD C,BIOS.CMOS_WR RST ToBIOS - + ; POP HL XOR A LD DE,100 -YR INC A +.YR: INC A SBC HL,DE - JR NC,YR + JR NC,.YR ADD HL,DE DEC A PUSH HL @@ -1522,42 +695,23 @@ YR INC A CALL WCMOS AND A RET - -;!FIXIT переделать по доке на Даллас и заись в ячейки часов -; Запись регистров CMOS -; вход: d=номер регистра -WCMOS CALL HEX2BCD - LD C,BIOS.CMOS_WR - RST ToBIOS - RET - -; INPUT : A - HEX -; OUTPUT: A - BCD -HEX2BCD - LD BC,#0AFF -H2B INC C - SUB B - JR NC,H2B - ADD A,B - LD B,A - LD A,C - RLCA - RLCA - RLCA - RLCA - AND #F0 - OR B +; !FIXIT новый биос выставляет время, если с ним что-то не так. +.NOCMOS2: + LD C,0 + LD (SYSTIME.NC_DAY),DE ;DAY/MONTH + LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE + LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY + LD (SYSTIME.NC_YEAR),IX ;YEAR + AND A RET ; Дата по-умолчанию -NC_DAY DW DAY*256+MONTH ;DAY/MONTH -NC_HOUR DW #0000 ;HOUR/MINUTE -NC_SEC DW #0001 ;SECOND/WEEKDAY -NC_YEAR DW YEAR ;YEAR +; NC_DAY DW DAY*256+MONTH ;DAY/MONTH +; NC_HOUR DW #0000 ;HOUR/MINUTE +; NC_SEC DW #0001 ;SECOND/WEEKDAY +; NC_YEAR DW YEAR ;YEAR - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #17. Информация о дате и времени файла. ; ; вход: A - дескриптор файла @@ -1568,8 +722,8 @@ NC_YEAR DW YEAR ;YEAR ; L - минуты ; B - секунды ; A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -GET_D_T +//////////////////////////////////////////////////////////////////////// +GET_D_T: CALL SET_FM RET C ; время/дату из структуры дескр. @@ -1581,7 +735,7 @@ GET_D_T AND A RET -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #18. Изменение даты и времени файла. ; ; вход: A - дескриптор файла @@ -1592,8 +746,9 @@ GET_D_T ; L - минуты ; B - секунды ; выход: A - код ошибки, если CF=1 -////////////////////////////////////////////////////////////////////// -PUT_D_T PUSH AF +//////////////////////////////////////////////////////////////////////// +PUT_D_T: + PUSH AF CALL MK_TIME ; закодировать время/дату POP AF ; дескриптор PUSH DE @@ -1610,106 +765,7 @@ PUT_D_T PUSH AF AND A RET -;------------------------------------------------- -; Закодировать время/дату -; вход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -; выход: de - время -; bc - месяц/день -; ix - год -; -;INPUT: D - DAY; E - MONTH -; H - HOUR; L - MINUTE -; B - SECOND (0...59) -; IX- YEAR (0...65535) -;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 -; BC - yyyyyyymmmmddddd y - year, m - month, d - day -; (1980-2108) -;------------------------------------------------- -MK_TIME LD A,L - RLCA - RLCA - SLA A - RL H - SLA A - RL H - SLA A - RL H - SRL B - OR B - LD L,A - - LD BC,#F844 ;(-1980) - ADD IX,BC - LD A,E - RLCA - RLCA - RLCA - RLCA - AND #F0 - LD B,XL - SLA A - RL B - OR D - LD C,A - EX DE,HL - AND A - RET - -;------------------------------------------------- -; Раскодировать время/дату -; вход: de - время -; bc - месяц/день -; ix - год -; выход: de - день/месяц -; hl - часы/минуты -; b - секунды -; ix - год -; -;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 -; BC - yyyyyyymmmmddddd y - year, m - month, d - day -; (1980-2108) -;OUTPUT: D - DAY; E - MONTH -; H - HOUR; L - MINUTE -; B - SECOND (0...59) -; IX- YEAR (0...65535) -;------------------------------------------------- -RMKTIME EX DE,HL - LD A,C - AND #1F - LD D,A - SRL B - RR C - LD A,C - RRCA - RRCA - RRCA - RRCA - AND #0F - LD E,A - LD C,B - LD B,0 - LD IX,1980 - ADD IX,BC - LD A,L - AND #1F - ADD A,A - LD B,A - SRL H - RR L - SRL H - RR L - SRL H - RR L - SRL L - SRL L - AND A - RET - - -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #1D. Смена текущего каталога. ; Меняет текущий каталог и текущий диск, если он указан в файловой ; спецификации. Если путь начинается с "\" - это означает путь от @@ -1719,10 +775,16 @@ RMKTIME EX DE,HL ; выход: нет ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0 -////////////////////////////////////////////////////////////////////// -CHDIR: +//////////////////////////////////////////////////////////////////////// +CHDIR_FN: _mSavePath 0 -.tmp: CALL GETWORD ; тест на допуст. имя и настр. на диск + ; EX DE,HL + ; LD HL,OPENDIR.dir + ; LD (HL),CurrentDirectory + ; CALL CHDIR + ; RET +; +CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME LD A,(HL) @@ -1730,16 +792,15 @@ CHDIR: CALL NZ,OPENDIR RET -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; ; вход: HL - указатель на имя каталога ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -////////////////////////////////////////////////////////////////////// -MKDIR: - _mSavePath 1 +//////////////////////////////////////////////////////////////////////// +MKDIR: _mSavePath 1 CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME ; 8.3 имя @@ -1816,9 +877,9 @@ MKDIR: INC HL LD (HL),"." LD BC,9*256 + ' ' ; b=счетчик, c=пробел -MKD03 INC HL +.MKD03: INC HL LD (HL),C - DJNZ MKD03 + DJNZ .MKD03 INC HL @@ -1836,13 +897,13 @@ MKD03 INC HL LD A,(DIR) CP "." LD DE,DIR+11 ; атрибуты записи - JP Z,MKD04 + JP Z,.MKD04 LD IX,HANDBUF XOR A LD (IX+_sFM.ST_CLUSTER),A LD (IX+_sFM.ST_CLUSTER+1),A LD DE,HANDBUF+11 ; ячейка атрибутов файла -MKD04 EX DE,HL +.MKD04: EX DE,HL LD BC,HANDBUF.SIZE-11 LDIR POP AF @@ -1859,7 +920,7 @@ MKD04 EX DE,HL POP HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер -MKD12 PUSH AF +.MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора IN A,(SLOT3) @@ -1886,15 +947,15 @@ MKD12 PUSH AF INC IX LD A,XH OR XL - JR NZ,MKD11 + JR NZ,.MKD11 INC HL -MKD11 POP AF +.MKD11 POP AF DEC A - JR NZ,MKD12 + JR NZ,.MKD12 AND A RET -////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. ; @@ -1902,9 +963,8 @@ MKD11 POP AF ; выход: A - код ошибки, если CF=1 ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 -////////////////////////////////////////////////////////////////////// -RMDIR: - _mSavePath 1 +//////////////////////////////////////////////////////////////////////// +RMDIR: _mSavePath 1 CALL GETWORD RET C LD HL,TMPNAME @@ -1923,10 +983,10 @@ RMDIR: RET C LD HL,(HANDBUF+_sFM.ST_CLUSTER) PUSH IX -RMD17 PUSH HL +.RMD17: PUSH HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) -RMD12 PUSH AF +.RMD12: PUSH AF PUSH HL PUSH IX IN A,(SLOT3) @@ -1944,48 +1004,46 @@ RMD12 PUSH AF LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD HL,CORE_BUFFERS.SECBUF -RMD10 LD A,(HL) +.RMD10: LD A,(HL) OR A - JP Z,RMD15 ;DIR EMPTY + JP Z,.RMD15 ;DIR EMPTY CP "." - JR Z,RMD14 + JR Z,.RMD14 CP #E5 ;!HARDCODE байт удаления файла - JR Z,RMD14 + JR Z,.RMD14 LD DE,11 ;!HARDCODE смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE ;BIT 3,A AND %0000'1000 - JP Z,RMD16 ;DIR NOT EMPTY -RMD14 LD DE,#0020 + JP Z,.error ;DIR NOT EMPTY +.RMD14: LD DE,#0020 ADD HL,DE - DJNZ RMD10 + DJNZ .RMD10 POP IX POP HL INC IX LD A,XH OR XL - JR NZ,RMD11 + JR NZ,.RMD11 INC HL -RMD11 POP AF +.RMD11: POP AF DEC A - JR NZ,RMD12 + JR NZ,.RMD12 POP HL ; номер кластера CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера - JR NC,RMD17 ; не конец цепочки -RMD18 POP IX - JP DELFILE ; пометить запись как "удаленная" - -RMD15 POP IX + JR NC,.RMD17 ; не конец цепочки +.RMD18: POP IX + JP DELETE ; пометить запись как "удаленная" +.RMD15: POP IX POP HL POP AF POP HL - JR RMD18 - -RMD16 POP IX + JR .RMD18 +.error: POP IX POP HL POP AF POP HL @@ -1993,7 +1051,1003 @@ RMD16 POP IX LD A,DSS_Error.sys.DIR_NOT_EMPTY SCF RET +//////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// + +;----------------------------------------------------------------------; +; Чтение регистров CMOS +; вход: d=номер регистра +RCMOS: LD C,BIOS.CMOS_RD + RST ToBIOS + ;JP BCD2HEX +; INPUT : A - BCD +; OUTPUT: A - HEX +BCD2HEX: + LD E,A + RRCA + RRCA + RRCA + RRCA + AND #0F + LD D,A + ADD A,A + ADD A,A + ADD A,D + ADD A,A + LD D,A + LD A,E + AND #0F + ADD A,D + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +;!FIXIT переделать по доке на Даллас и заись в ячейки часов +; Запись регистров CMOS +; вход: d=номер регистра +WCMOS: CALL HEX2BCD + LD C,BIOS.CMOS_WR + JP ToBIOS + +; INPUT : A - HEX +; OUTPUT: A - BCD +HEX2BCD: + LD BC,#0AFF +.loop: INC C + SUB B + JR NC,.loop + ADD A,B + LD B,A + LD A,C + RLCA + RLCA + RLCA + RLCA + AND #F0 + OR B + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Закодировать время/дату +; вход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; выход: de - время +; bc - месяц/день +; ix - год +; +;INPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) + +MK_TIME: + LD A,L + RLCA + RLCA + SLA A + RL H + SLA A + RL H + SLA A + RL H + SRL B + OR B + LD L,A + + LD BC,#F844 ;(-1980) + ADD IX,BC + LD A,E + RLCA + RLCA + RLCA + RLCA + AND #F0 + LD B,XL + SLA A + RL B + OR D + LD C,A + EX DE,HL + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Раскодировать время/дату +; вход: de - время +; bc - месяц/день +; ix - год +; выход: de - день/месяц +; hl - часы/минуты +; b - секунды +; ix - год +; +;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2 +; BC - yyyyyyymmmmddddd y - year, m - month, d - day +; (1980-2108) +;OUTPUT: D - DAY; E - MONTH +; H - HOUR; L - MINUTE +; B - SECOND (0...59) +; IX- YEAR (0...65535) +RMKTIME: + EX DE,HL + LD A,C + AND #1F + LD D,A + SRL B + RR C + LD A,C + RRCA + RRCA + RRCA + RRCA + AND #0F + LD E,A + LD C,B + LD B,0 + LD IX,1980 + ADD IX,BC + LD A,L + AND #1F + ADD A,A + LD B,A + SRL H + RR L + SRL H + RR L + SRL H + RR L + SRL L + SRL L + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; скопировать запись в список диска (каталога) +WRT_HND: + SET_PAGE_X DIRPAGE + + PUSH AF + LD IX,DIR + 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 +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +DOSNAME: + INC B + DEC B + JP Z,GETNAME + DEC B + JP Z,MASK + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; HL - 11 bytes filename "FILENAMEEXT" +; DE - DOS filename "FILENAME.EXT",0 +GETNAME: + LD BC,#08FF +.GETN1: LD A,(HL) + CP " " + JR NZ,.GETN3 +.GETN2: INC HL + DJNZ .GETN2 + JR .GETN4 +.GETN3: LDI + DJNZ .GETN1 +.GETN4: LD A,(HL) + CP " " + LD A,"." + JR NZ,.GETN5 + LD A,#00 +.GETN5: LD (DE),A + INC DE + RET Z + LD B,#03 +.GETN6: LD A,(HL) + CP " " + RET Z + LDI + XOR A + LD (DE),A + DJNZ .GETN6 + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Поиск записи каталога в списке каталога +; +; вход: a=атрибут записи +; выход: de'=индекс записи в списке каталога +; CF - каталог не найден +DSEARCH: + LD A,FAT_ATTR.DIRECTORY + CALL SEARCH.ASEARCH + RET NC + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +SEARCH: LD A,FAT_ATTR.NoDIRnoVolID +.ASEARCH: + EX AF,AF' ; 76ADLSHR + + SET_PAGE_X DIRPAGE + + PUSH AF + EX AF,AF' + CPL + LD C,A + LD IX,DIR + EXX + LD DE,0 + EXX +.SEARCH1: + LD A,(IX+00) + OR A + JR Z,.SEARCH4 + CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены + JR Z,.SEARCH3 + LD A,(IX+11) + AND C + JR NZ,.SEARCH3 + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 + EX DE,HL +.SEARCH2: + LD A,(DE) + CP '?' + JR Z,.SEARCH5 + CP (HL) + JR NZ,.SEARCH3 +.SEARCH5: + INC HL + INC DE + DJNZ .SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,HANDBUF.SIZE + LDIR + POP AF + OUT (SLOT3),A + AND A + RET +.SEARCH3: + EXX + INC DE + EXX + LD DE,#0020 ;!HARDCODE + ADD IX,DE + JR NC,SEARCH.SEARCH1 +.error: POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR + SCF + RET +.SEARCH4: + POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.FILE_NOT_FOUND + SCF + 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 + LD (DE),A + INC DE + CP ' '+1 + CCF + RET NC + DJNZ .loop + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.DIR_NAME: + XOR A + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + 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 +; RET C +; JR .loop +; + +; Буфер имени 8.3 формата +TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!FIXIT к буферам +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; + ;????? R10 +OPENDSK: + ;!TEST DRV.Open обход + LD C,A + LD A,(FatBuffer.DRIVE) + CP C + JR Z,.exit + LD A,C + ; +.force: PUSH AF + LD C,Dss.DRV.Open + RST ToDSS.DRV + POP BC + JP C,.error + LD A,B + LD (FatBuffer.DRIVE),A + CALL RD_BPB + RET C +.exit: LD A,(LDRIVE) + AND A + RET +.error: CP DSS_Error.sys.INVALID_DRIVE + SCF + RET Z + LD A,DSS_Error.sys.NOT_READY + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +OPENDIR: + XOR A + CALL SET_FM + LD A,(HL) + OR A + JR NZ,.SUBDIR +.REROOT1: + LD DE,0 + LD (IY+_sFM.ST_CLUSTER),E + LD (IY+_sFM.ST_CLUSTER+1),D + CALL LOADDIR + ;LD HL,CurrentDirectory +.dir+1: LD HL,WorkDirectory + LD (HL),'\' + INC HL + LD (HL),#00 + AND A + RET +.SUBDIR: + CP "." + JR NZ,.SUBDIR2 + LD A,(IY+_sFM.ST_CLUSTER) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY + OR (IY+_sFM.ST_CLUSTER+1) ;R05 ;!FIXIT можно переделать на прямые ссылки без IY + JR NZ,.SUDI1 ;R05 + INC HL ;R05 + LD A,(HL) ;R05 + OR A ;R05 + DEC HL ;R05 + JR Z,.REROOT1 ;R05 +.SUDI1: EXX + LD HL,MASKARE + LD DE,MASKARE+1 + LD BC,10 ;!HARDCODE + LD (HL),' ' + LDIR + EXX + LD DE,MASKARE +.SUBDIR0: + LDI + LD A,(HL) + OR A + JR NZ,.SUBDIR0 + JR .SUBDIR3 +.SUBDIR2: + LD DE,MASKARE + CALL MASK + RET C +.SUBDIR3: + CALL FINDDIR + RET C + LD (IY+_sFM.ST_CLUSTER),E + LD (IY+_sFM.ST_CLUSTER+1),D + LD DE,#4000 + LD (IY+_sFM.F_SIZE),E + LD (IY+_sFM.F_SIZE+1),D + CALL LOADDIR + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; FIND "MASKAREA" IN DIRECTORY +FINDDIR: + SET_PAGE_X DIRPAGE + ; + PUSH AF + LD IX,DIR +.F_01: LD A,(IX+00) + OR A + JR Z,.error + CP #E5 + JR Z,.F_03 + LD A,(IX+11) + AND #10 + JR Z,.F_03 + LD HL,MASKARE + LD D,XH + LD E,XL + EX DE,HL + LD B,11 +.loop: LD A,(DE) + CP "?" + JR Z,.F_05 + CP (HL) + JR NZ,.F_03 +.F_05: INC HL + INC DE + DJNZ .loop + LD A,(IX+0) + CP "." + JP NZ,.ADDSPEC + LD A,(IX+1) + CP "." + JP NZ,.IT_DIR + LD HL,CurrentDirectory + LD D,H + LD E,L + INC HL + LD BC,CurrentDirectory.DEPTH + XOR A + CPIR ;!FIXIT нет проверки на завершение по BC=0 + DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога + DEC HL + LD BC,CurrentDirectory.DEPTH + LD A,'\' + CPDR + INC HL + ;AND A + ; CF = 0 + EX DE,HL + SBC HL,DE + EX DE,HL + JR NZ,.MM3 + JP .MM2_5 +.F_03: LD BC,#0020 + ADD IX,BC + JR NC,.F_01 +.error: POP AF + OUT (SLOT3),A + LD A,DSS_Error.sys.PATH_NOT_FOUND + SCF + RET +.ADDSPEC: + LD E,XL + LD D,XH + LD HL,CurrentDirectory+1 + LD BC,CurrentDirectory.DEPTH-1 + XOR A + CPIR ;!FIXIT нет проверки на завершение по BC=0 + DEC HL + DEC HL + LD A,'\' ; #5C + CP (HL) + INC HL + JR Z,.ADDSPE0 + LD (HL),A + INC HL +.ADDSPE0: + ;R11 + LD A,B + AND A + JR NZ,.MM1 + LD A,C + CP 8 + JR C,FINDDIR.error + ;R11 + LD BC,#0820 +.MM1: LD A,(DE) + INC DE + CP C + JR Z,.MM2 + LD (HL),A ;!FIXIT вот тут может вылезать за пределы буфера при длинном пути и грохать код и данные. R11 времено лечит костылём + INC HL +.MM2 DJNZ .MM1 + LD A,(DE) + INC DE + CP C + JR Z,.MM3 + LD (HL),"." + INC HL + LD (HL),A + INC HL + LD A,(DE) + INC DE + CP C + JR Z,.MM3 + LD (HL),A + INC HL + LD A,(DE) + CP C + JR Z,.MM3 + LD (HL),A +.MM2_5: INC HL +.MM3: LD (HL),0 +; JP IT_DIR +.IT_DIR: + LD E,(IX+_sFM.ST_CLUSTER) + LD D,(IX+_sFM.ST_CLUSTER+1) + POP AF + OUT (SLOT3),A + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Преобразовать имя 8.3 -> 11 формат +; вход: hl = 8.3 имя +; de = буфер имени 11 симв. формата +; при ошибке CF - недоп. имя +; +; HL - MASK "file*.t??" +; DE - 11 bytes filename +; RET: C=2 FILE WITHOUT EXTENTION +; C=1 FILE WITH EXTENTION +MASK: PUSH HL + PUSH DE + LD H,D + LD L,E + INC DE + LD (HL),' ' + LD BC,10 ;!HARDCODE = size (FileName + Extension - 1) + LDIR + POP DE + POP HL + LD A,(HL) + CP '.' ;R07 + SCF ;R07 + JR Z,.MASKB ;R07 + CP ' '+1 +.MASKB: LD A,DSS_Error.sys.INVALID_NAME + RET C + LD BC,#0902 ; B - счетчик +.MASK1: LD A,(HL) + CP ' '+1 + CCF + RET NC + CP '"' + JR Z,.MASK_ERR + CP '*' + JR Z,.MASK3 + CP '+' + JR Z,.MASK_ERR + CP ',' + JR Z,.MASK_ERR + CP '.' + JR Z,.MASK5 + CP '/' + JR Z,.MASK_ERR + CP ':' + JR Z,.MASK_ERR + CP ';' + JR Z,.MASK_ERR + CP '<' + JR Z,.MASK_ERR + CP '=' + JR Z,.MASK_ERR + CP '>' + JR Z,.MASK_ERR + CP '[' + JR Z,.MASK_ERR + CP '\' + JR Z,.MASK_ERR + CP ']' + JR Z,.MASK_ERR + CP '|' + JR Z,.MASK_ERR +; CP 'a' ;????? +; JR C,.MASK2 +; CP 'z' + 1 +; JR NC,.MASK2 +; SUB #20 + CALL UPPER ; a..z -> A..Z +.MASK2: LD (DE),A + INC HL + INC DE + DJNZ .MASK1 +.MASK_ERR: + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK3: LD A,'?' + INC HL + DJNZ .MASK6 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK6: LD (DE),A + INC DE + DJNZ .MASK6 + LD B,1 + JR .MASK1 +.MASK5: LD A,' ' + INC HL + DJNZ .MASK4 + LD B,4 + DEC C + JP NZ,.MASK1 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +.MASK4: LD (DE),A + INC DE + DJNZ .MASK4 + LD B,4 + DEC C + JP NZ,.MASK1 + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; a..z -> A..Z +UPPER: CP 'a' + RET C + CP 'z' + 1 + JR NC,.MDUPPER + SUB #20 +.NOUPPER: + RET +.MDUPPER: + CP 'а' ; русская буква а, код #A0 + JR C,.NOUPPER + CP 'п' ; русская буква п, код #B0 + JR NC,.BGUPPER + SUB #20 + RET +.BGUPPER: + CP 'р' ; русская буква р, код #E0 + JR C,.NOUPPER + CP 'Ё' ; русская буква Ё, код #F0 + JR NC,.HGUPPER + SUB #50 + RET +.HGUPPER: CP 'ё' ; русская буква ё, код #F1 + RET NZ + DEC A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Прочитать список каталога +LOADDIR: + XOR A + LD H,A + LD L,A + LD IX,0 + LD B,A ; от начала файла + CALL MOVE_FP + + SET_PAGE_X DIRPAGE + + PUSH AF + ;!TEST no ldir + ; очистить кеш каталога + ;LD HL,#C000 + ;LD DE,#C001 + ;LD BC,#3FFF + ;LD (HL),L + ;LDIR + ; + LD A,(FatBuffer.DRIVE) ; номер диска + LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор + LD D,(IY+_sFM.ST_CLUSTER) ; de=номер первого кластера + LD E,(IY+_sFM.ST_CLUSTER+1) + LD A,D + OR E + JP Z,.LROTDIR ; root ?? + LD HL,DIR ; куда + LD DE,#4000 ; сколько + XOR A ; дескриптор + CALL READ ; чтение из файла + LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов + POP AF + OUT (SLOT3),A + AND A + RET +.LROTDIR: + LD HL,(FatBuffer.DIR_FRH) ; ст. разряд + LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора + LD A,(FatBuffer.DIR_S_S) + LD B,32 ; !HARDCODE размер root-каталога + SUB B + JR NC,.RTD1 + ADD A,B + LD B,A ; число секторов +.RTD1: LD A,(FatBuffer.DRIVE) ; номер диска + LD DE,DIR ; буфер + LD C,Dss.DRV.Read ; чтение секторов + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + AND A + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +; Сбросить кеш каталога на диск. +; вход: iy=структура дескриптора +SAVEDIR: + XOR A + LD HL,0 + 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) + LD E,(IY+_sFM.ST_CLUSTER+1) + LD A,D + OR E + JP Z,.SROTDIR + LD HL,DIR +; размер списка каталога size_cash_directory +.DIRSIZE+1: + LD DE,0 + XOR A + CALL WRITE + POP AF + OUT (SLOT3),A + AND A + RET +.SROTDIR: + LD HL,(FatBuffer.DIR_FRH) + LD IX,(FatBuffer.DIR_FRL) + LD A,(FatBuffer.DIR_S_S) + LD B,32 + SUB B + JR NC,.RTD1S + ADD A,B + LD B,A +.RTD1S: LD A,(FatBuffer.DRIVE) + LD DE,DIR + LD C,Dss.DRV.Write + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + AND A + RET +;----------------------------------------------------------------------; +;DIRSIZE: WORD 0 ; размер списка каталога size_cash_directory + + + +;!FIXIT к буферам +; Массив лог. номеров банок расширения DSS +BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE +HANDBUF: BLOCK HANDBUF.SIZE,0 +MASKARE: BLOCK 8,0 ; имя файла + BLOCK 3,0 ; расш. + BLOCK 21,0 ; 11+21=32 +; + +;PATH0: DW #0000 +;ACCESS: DB #00 +;DTABUF: DW #0000 +;CURHND: DW #0000 +;NO_NEXT: DB #00 +;.YES EQU 0 +;.NO EQU #FF +;FNDMODE: DB #00 ;//MODULE: DOS5 ;[END] + + +;!TODO ? +GHANDLE: +; PUSH DE +; PUSH HL +; PUSH IX +; CALL TESTDSK +; JP C,G_HAND1 +; CALL LOADDIR +; POP DE +; LD HL,DIR +; LD BC,#0020 +;G_HAND2: +; LD A,D +; OR E +; JP Z,G_HAND3 +; ADD HL,BC +; DEC DE +; JP G_HAND2 +;G_HAND3: +; EXX +; POP DE +; EXX +;G_HAND4: +; EX DE,HL +; LD A,DIRPAGE +; CALL BANK +; EX DE,HL +; LD DE,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; OUT (SLOT3),A +; LD HL,HANDTA +; +; DUP 32 +; LDI +; EDUP +; +; EXX +; POP BC +; DEC BC +; LD A,B +; OR C +; RET Z +; PUSH BC +; JP G_HAND4 +;G_HAND1 POP IX +; POP HL +; POP DE +; RET +;HANDTA BLOCK 32,0 +;----------------------------------------------------------------------; +; ;!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 +; ; +;----------------------------------------------------------------------; +;!TEST + ;BANK: + ; LD C,A + ; LD B,0 + ; LD HL,BANKTBL + ; ADD HL,BC + ; IN A,(SLOT3) + ; LD C,SLOT3 + ; OUTI + ; RET +; diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index dfe28a6..367b81e 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -548,6 +548,11 @@ TSTSIZE XOR A LD (READ.COD),A RET +; HL - ADDRESS +; DE - SIZE +; A - FM +READ_FN: +; _mSavePath 1 ; HL - ADDRESS ; DE - SIZE ; A - FM diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 102336c..f4a79af 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -159,7 +159,7 @@ CURRDSK: LD A,(FatBuffer.DRIVE) ; A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// DISKINF: - CP #FF + CP #FF ; !FIXIT WorkDirectory JR Z,CURRDS ;R06 CALL CHNDISK ;R06 RET C ;R06 @@ -562,9 +562,18 @@ FatBuffer: ; ;!TODO к буферам! -DIRSPEC: DB '\' - BLOCK DIRSPEC.DEPTH -; +CurrentDirectory: DB '\' +.DEPTH: EQU DIRECTORY_PATH_LENGTH + BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце + + IF SAVE_PATH_MACRO +WorkDirectory: DB '\' +.DEPTH: EQU DIRECTORY_PATH_LENGTH + BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце + ELSE +WorkDirectory EQU CurrentDirectory +.DEPTH EQU CurrentDirectory.DEPTH + ENDIF ;R11 ; !TODO починить @@ -620,7 +629,7 @@ BACK_CUR_PATH: PUSH AF LD HL,TMP_CURDIR_AUTO - CALL CHDIR.tmp + CALL CHDIR ; почему не POP AF : OUT (SLOT3),A //POP BC diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index f5332f4..981510c 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -378,8 +378,8 @@ ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK, low CURRDSK, low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DELETE, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 - DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR ; 2 14..1D + DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ_FN ; 1 0A..13 + DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR, low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B @@ -405,8 +405,8 @@ ADRST10: ;DS 512 ;,0 ENDIF ;...............................................[HIGH ADDRESS]: DB high F_START,high CHNDISK,high CURRDSK,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE, high CREAT_N,high NOPS, high NOPS, high DELETE, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ - DB high WRITE, high MOVE_FP,high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR + DB high CREATE, high CREAT_N,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high WRITE, high MOVE_FP,high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN DB high CURRDIR,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY DB high ECHOKEY,high CTRLKEY,high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 5f0161d..2786eb6 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -23,6 +23,7 @@ ////////////////////////////////////////////////////////////////////// +; !FIXIT тут одни затупы и дебилизм ; Функция #47. Получение информации приложения. ; ; вход: HL - буфер данных @@ -40,11 +41,12 @@ ////////////////////////////////////////////////////////////////////// ;LAST_PSP_PTR: DW 0 APPINFO: INC B -APPINF0: DJNZ APPINF1 - EX DE,HL + ; + DJNZ .FN1 + ; получение параметров командной строки EX DE,HL XOR A LD (DE),A - LD HL,(LAST_PSP_PTR) + LD HL,(.LAST_PSP_PTR) LD C,(HL) INC C RET Z @@ -53,13 +55,11 @@ APPINF0: DJNZ APPINF1 AND A RET -; Получение параметров командной строки -APPINF1: - DJNZ APPINF2 +.FN1: DJNZ .FN2 + ; получение полного пути к каталогу программы EX DE,HL -LAST_PSP_PTR+1: +.LAST_PSP_PTR+1: LD HL,0 - LD C,(HL) INC HL ADD HL,BC @@ -69,9 +69,9 @@ LAST_PSP_PTR+1: LD BC,#100 ;!HARDCODE длина коммандной строки XOR A CPIR - DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога - DEC HL ;R10,5 - не тестил ;!!!!! - LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки + DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога + DEC HL ;R10,5 - не тестил ;!!!!! + LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки LD A,'\' CPDR INC HL @@ -79,6 +79,10 @@ LAST_PSP_PTR+1: POP BC AND A SBC HL,BC + ;R10 ;[x] могло всё в космос улететь + LD A,DSS_Error.sys.COMMON_ERROR + JR C,.error + ; LD A,B ;EX HL,A,BC LD B,H LD H,A @@ -89,25 +93,29 @@ LAST_PSP_PTR+1: XOR A LD (DE),A RET - -; Получение полного пути к каталогу программы -APPINF2: - DJNZ APPINF3 + ; +.FN2: DJNZ .FN3 + ; получение полного пути и имени файла EX DE,HL - LD HL,(LAST_PSP_PTR) + LD HL,(.LAST_PSP_PTR) LD C,(HL) INC HL ADD HL,BC INC HL INC HL -APINF2 LD A,(HL) + ; +.loop LD A,(HL) LDI OR A - JR NZ,APINF2 + JR NZ,.loop + ; RET - -APPINF3 LD A,DSS_Error.sys.INVALID_FUNCTION - SCF + ; +.FN3: + ; + ; ошибка + LD A,DSS_Error.sys.INVALID_FUNCTION +.error: SCF RET ////////////////////////////////////////////////////////////////////// @@ -337,7 +345,7 @@ PATH_YEP: XOR A PUSH HL PUSH BC LD HL,(NM_PATH) - LD BC,#00FF ; !FIXIT глубина буфера не зависит от DIRSPEC.DEPTH + LD BC,#00FF ; !FIXIT глубина буфера не зависит от CurrentDirectory.DEPTH CPIR DEC HL EX DE,HL @@ -687,7 +695,7 @@ FINDPATH: PUSH BC EX DE,HL CALL Z,GOTO_CURDIR - CALL CHDIR.tmp + CALL CHDIR JR C,.BADPATH LD HL,CORE_BUFFERS.EXEBUFF LD DE,MASKARE @@ -712,7 +720,7 @@ FINDPATH: GOTO_CURDIR: PUSH HL LD HL,TMP_CURDIR - CALL CHDIR.tmp + CALL CHDIR POP HL RET @@ -828,7 +836,7 @@ EXEC: _mSavePath 1 ; при выходе с ошибкой, в регистре А - код ошибки EXEC_1: LD (CMDLINE),HL LD A,#01 ; %7600000R = !FAT_ATTR ;!HARDCODE - LD (ACCESS),A + LD (F_FIRST.ACCESS),A CALL GETWORD RET C LD HL,TMPNAME @@ -839,7 +847,7 @@ EXEC_1: LD (CMDLINE),HL LD A,DSS_Error.sys.FILE_NOT_FOUND RET C CALL INCTASK ;R08 - CALL OPENEXE + CALL OPEN.FILE JR NC,.noError CALL DECTASK ;R08 AND A @@ -903,7 +911,7 @@ EXEC02: LD (EXE_FM),A ; ;R09 _mRestorStackAfterRestorePath - _mRestorePath + ;_mRestorePath ;R09 ; LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) @@ -1017,7 +1025,6 @@ FRC000: LD A,(DE) OUT (SLOT3),A CALL M_PSP - LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2) LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1) LD B,Dss.Move_FP.FrStart @@ -1041,7 +1048,7 @@ FRC000: LD A,(DE) ;!FIXIT double 2 ;R09 - _mRestorePath + ;_mRestorePath ; LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) @@ -1055,6 +1062,9 @@ FRC000: LD A,(DE) LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса" PUSH DE PUSH HL + + _mRestorePath + RET ; ;[ ] @@ -1205,7 +1215,7 @@ FRC000H: LD A,(DE) ;!FIXIT double 2 ;R09 - _mRestorePath + ;_mRestorePath ; LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG) LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) @@ -1219,6 +1229,9 @@ FRC000H: LD A,(DE) LD DE,RETFAR PUSH DE PUSH HL + + _mRestorePath + RET ; @@ -1308,6 +1321,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) INC HL LD (HL),B INC HL + ;!FIXIT тут восстанавливать правильный каталог CALL CURRDSK ADD A,'A' LD (HL),A @@ -1317,9 +1331,10 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) INC HL PUSH HL CALL CURRDIR + ; POP HL XOR A - LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH + LD BC,#0100 ;!FIXIT нет привязки к CurrentDirectory.DEPTH CPIR ;!FIXIT нет проверки на выход по BC=0 DEC HL DEC HL @@ -1338,7 +1353,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) DEC DE XOR A LD (DE),A - LD (LAST_PSP_PTR),IX + LD (APPINFO.LAST_PSP_PTR),IX ; RET diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ef955db..520fab2 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -38,7 +38,7 @@ RESERVED2 BLOCK 490,0 .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 +.ACCESS_MODE: BYTE #00 ;+41 ACCESS MODE признак изменения файла .TASK_NUM: BYTE #00 ;+42 TASK .EMPTY: BYTE #00 ;+43 EMPTY ENDS diff --git a/DSS/build.txt b/DSS/build.txt index a21cae3..6a5426c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -454 \ No newline at end of file +474 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 2c2a1bf..a28e102 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 1 + DEFINE SAVE_PATH_MACRO 0 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; @@ -32,8 +32,7 @@ DRVPAGE EQU 3 DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц COREPAGE EQU 4 ; она отдельно и не с блоком выше. ;----------------------------------------------------------------------- - -DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 +DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 1..255 ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000 diff --git a/SHELL/build.txt b/SHELL/build.txt index 3ca9062..615be70 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -84 \ No newline at end of file +85 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 1b02533..a7128fd 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 1b025338c449183aa1cfbe595994fd9ddf7feb8e +Subproject commit a7128fd1547d624249d95fdcbbb3aaa090f90357