mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 01:11:48 +03:00
438 lines
7.7 KiB
NASM
438 lines
7.7 KiB
NASM
;[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
|
||
;
|
||
|
||
|
||
; <20>ãä¥à ¨¬¥¨ 8.3 ä®à¬ â
|
||
TMPNAME: DZ ' ' ; 12 ¯à®¡¥«®¢ ¨ 0 ;!FIXIT ª ¡ãä¥à ¬
|
||
;----------------------------------------------------------------------;
|
||
|
||
|
||
|
||
;----------------------------------------------------------------------;
|
||
; IN: A - drive number
|
||
OPENDSK:;!TEST DRV.Open ®¡å®¤ R10
|
||
LD C,A
|
||
LD A,(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,(FatBuffer.DRIVE)
|
||
LD D,A
|
||
PUSH DE
|
||
;
|
||
LD A,B
|
||
LD (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
|
||
;----------------------------------------------------------------------;
|
||
|
||
|
||
;----------------------------------------------------------------------;
|
||
; <20>८¡à §®¢ âì ¨¬ï 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,(FatBuffer.DRIVE)
|
||
ADD 'A'
|
||
LD (CurrentPath),A
|
||
;
|
||
.Current: LD HL,CurrentDirectory
|
||
JP CURRDIR
|
||
;
|
||
.FullWork: LD A,(CurrentPath)
|
||
SUB 'A'
|
||
LD (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,(FatBuffer.DRIVE)
|
||
ADD 'A'
|
||
CP (HL)
|
||
JR NZ,.gotoPath
|
||
;
|
||
.checkDir: LD HL,CurrentDirectory+1
|
||
LD DE,WorkDirectory+1
|
||
;
|
||
.loop: LD A,(DE)
|
||
AND A
|
||
JR Z,.end
|
||
CP (HL)
|
||
INC HL
|
||
INC DE
|
||
JR Z,.loop
|
||
JP .gotoPath
|
||
;
|
||
.end: CP (HL)
|
||
RET Z
|
||
JR .gotoPath
|
||
;
|
||
.checkDrive: LD HL,CurrentPath
|
||
LD A,(FatBuffer.DRIVE)
|
||
ADD 'A'
|
||
CP (HL)
|
||
RET
|
||
.gotoPath: CALL FINDDIR.CHECK_SLASH
|
||
LD A,DSS_Error.sys.PATH_NOT_FOUND
|
||
RET C
|
||
LD HL,CurrentPath
|
||
JP GETWORD
|
||
;----------------------------------------------------------------------;
|
||
|
||
|
||
;----------------------------------------------------------------------;
|
||
CHECK_NAME:
|
||
LD HL,MASKARE
|
||
.custom: LD BC,11 ;!HARDCODE
|
||
LD A,"?"
|
||
CPIR
|
||
LD A,DSS_Error.sys.INVALID_NAME
|
||
SCF
|
||
RET
|
||
;----------------------------------------------------------------------;
|