;[BEGIN] ;//MODULE: DOS_X ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) ;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 ;R11 - 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;R10 - 03-04-2003 DNS IMPROVED FN. VERSION ;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. ;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION ;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS ;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR ;R04 08-11-1999 DNS KILL OLD FUNCTIONS ;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28) ;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT" ;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" ;--------------------------------------------------------------- ;----------------------------------------------------------------------; ; 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 ;---------------;---------------;--------------- GetName: LD BC,#08FF ;!HARDCODE длина имени + счётчик LD A,' ' .loop: CP (HL) JR Z,.skip LDI DJNZ .loop JP .extension ; .skip: LD C,B LD B,0 ; CF=0 ADC HL,BC .extension: CP (HL) LD A,"." JR NZ,.copy_ext XOR A .copy_ext: LD (DE),A INC DE RET Z ;no copy extension ; copy extension LD BC,#03FF ;!HARDCODE длина расширения + счётчик LD A,' ' .loop2: CP (HL) JR Z,.exit LDI DJNZ .loop2 .exit: XOR A LD (DE),A RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; Тест на допустимое имя и настроиться на диск. ; вход: hl=строка имени ; выход: (TMPNAME) GETWORD: ; !TEST INC HL LD A,(HL) DEC HL CP ':' JR NZ,.dir_loop LD A,(HL) CP 'a' JR C,.next CP 'z'+1 JR NC,.next SUB #20 .next: SUB 'A' INC HL INC HL PUSH HL CALL CHNDISK ;CALL OPENDSK POP HL RET C LD A,(HL) OR A JR Z,.done CP ' ' ; JR Z,.done CP '\' ; SCF LD A,DSS_Error.sys.PATH_NOT_FOUND RET NZ INC HL ; .dir_loop: LD DE,TMPNAME LD BC,#0DFF .loop: LD A,(HL) INC HL CP '\' ; JR Z,.DIR_NAME ; AND A ; 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 ; .done: XOR A LD (TMPNAME),A 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 к буферам ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; IN: A - drive number OPENDSK:;!TEST DRV.Open обход R10 LD C,A LD A,(CORE_BUFFERS.FatBuffer.DRIVE) CP C IF CHECK_DRIVE_CHANGE JR NZ,.open PUSH BC LD C,Dss.DRV.MediaCheck RST ToDSS.DRV POP BC ENDIF JR Z,.exit .open: LD A,C ; .force: PUSH AF LD C,Dss.DRV.Open RST ToDSS.DRV POP BC JP C,.error ;[x] 29/02/2024 fix "open drive error" LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD D,A PUSH DE ; LD A,B LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; CALL RD_BPB ;[x] 29/02/2024 fix "open drive error" POP DE LD A,D JR C,.error_disk ; 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 ;[x] 29/02/2024 fix "open drive error" .error_disk: CALL OPENDSK.force LD A,(BOOTDSK.NUM) CALL C,OPENDSK.force ; проверка на ошибку LD HL,.NOT_READY LD E, +(80-.NOT_READY.size)/2 ; coord X LD BC,.NOT_READY.size JP C,KERNEL_PANIC ; LD A,DSS_Error.sys.NOT_READY SCF RET ; .NOT_READY: DZ "Boot drive not ready..." .NOT_READY.size EQU $-.NOT_READY ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; Преобразовать имя 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: LD HL,TMPNAME .name: LD DE,MASKARE .custom: 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 '.' ;R007 SCF ;R007 JR Z,.MASKB ;R007 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 ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ;!TEST Current Dir ;[x] 15/10/23 DIR_PATH_CHANGE: .FullCurrent: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' LD (CurrentPath),A ; .Current: LD HL,CurrentDirectory JP CURRDIR ; .FullWork: LD A,(CurrentPath) SUB 'A' LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; .Work: LD HL,WorkDirectory JP CURRDIR_FN ; DIR_PATH_CHECK: LD A,(HL) CP '\' JR NZ,.notRootDir ; CALL .checkDrive RET Z LD A,(CurrentPath) SUB 'A' JP OPENDSK ; .notRootDir: INC HL LD A,(HL) CP ':' RET Z ; .forceCheck: ;LD HL,CurrentDirectory+1 LD BC,CurrentDirectory.DEPTH-1 CALL .checkDrive JR Z,.checkDir ; LD HL,CurrentPath LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) JR NZ,.gotoPath ; .checkDir: LD HL,CurrentDirectory+1 LD DE,WorkDirectory+1 ; счётчик LD A,B LD B,C EX AF,AF' ; .loop: LD A,(DE) AND A JR Z,.end CP (HL) INC HL INC DE JR NZ,.gotoPath DJNZ .loop EX AF,AF' SUB 1 RET C EX AF,AF' DJNZ .loop ; .gotoPath: LD C,B EX AF,AF' LD B,A CALL FINDDIR.CHECK_SLASH LD A,DSS_Error.sys.PATH_NOT_FOUND RET C LD HL,CurrentPath JP GETWORD ; .end: CP (HL) RET Z JR .gotoPath ; .checkDrive: LD HL,CurrentPath LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; CHECK_NAME: LD HL,MASKARE .custom: LD BC,11 ;!HARDCODE LD A,"?" CPIR LD A,DSS_Error.sys.INVALID_NAME SCF RET ;----------------------------------------------------------------------;