Estex-DSS/DSS/DOS_Proc.asm
Anatoliy Belyanskiy b515b2429f FAT_X done
2024-04-01 02:49:38 +10:00

545 lines
9.6 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[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"
;---------------------------------------------------------------
;[BEGIN]
;//MODULE: FAT_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;RX01 10-02-1999 DNS UPGRADE FAT CASH
;---------------------------------------------------------------
;----------------------------------------------------------------------;
; 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_extension
XOR A
.copy_extension:
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
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; ¢å®¤: HL - ¨¬ï ¤¨à¥ªâ®à¨¨
OPENDIR:;[x] some optimizations
;XOR A
;CALL SET_FM
LD IY,CORE_BUFFERS.FM_BUF
;
LD A,(HL)
OR A
JR NZ,.SUBDIR
.REROOT1:
LD DE,0
;[x] some optimizations
; LD (IY+_sFM.FIRST_CLUSTER_L),E
; LD (IY+_sFM.FIRST_CLUSTER_L+1),D
; [ ] fat32
EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL
EX DE,HL
;
CALL LOADDIR
LD HL,WorkDirectory
LD (HL),'\'
INC HL
LD (HL),#00
; CF=0
;AND A
RET
.SUBDIR:
CP "."
JR NZ,.SUBDIR2
;!TEST ;[x] some optimizations
;LD A,(IY+_sFM.FIRST_CLUSTER_L) ;R005
; [ ] fat32
LD A,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005
;
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) ;R005
JR NZ,.SUDI1 ;R005
INC HL ;R005
LD A,(HL) ;R005
OR A ;R005
DEC HL ;R005
JR Z,.REROOT1 ;R005
.SUDI1: EXX
LD HL,MASKARE
LD DE,MASKARE+1
LD BC,10 ;!HARDCODE
LD (HL),' '
LDIR
EXX
LD DE,MASKARE
.loop: LDI
LD A,(HL)
OR A
JR NZ,.loop
JR .SUBDIR3
.SUBDIR2:
CALL MASK.name
RET C
.SUBDIR3:
CALL FINDDIR
RET C
;!TEST ;[x] some optimizations
;LD (IY+_sFM.FIRST_CLUSTER_L),E
;LD (IY+_sFM.FIRST_CLUSTER_L+1),D
;LD DE,#4000 ;!HARDCODE
;LD (IY+_sFM.F_SIZE),E
;LD (IY+_sFM.F_SIZE+1),D
EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32
LD HL,#4000 ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL
EX DE,HL
;
JP LOADDIR
; CF=0
;AND A
;RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; <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
;----------------------------------------------------------------------;