Estex-DSS/DSS/DOS5.ASM
Anatoliy Belyanskiy 91774c8b23 Initial commit
Estex DSS
2023-06-14 19:09:19 +10:00

1749 lines
24 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: DOS5
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;-------------------------------------------------------------
;Rev Date Name Description
;-------------------------------------------------------------
;R11 17-04-2023 BAO ‚६¥­­ë© ª®áâë«ì ¤«ï ­¥¤®¯ã᪠­¨ï ¯¥à¥¯®«­¥­¨ï ¡ãä¥à  ¯ã⨠ª â «®£ 
;R10 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH ;!FIXIT ¯®ª  ¢ ¢¨¤¥ § ¯« âª¨ ¯®«ã­¥à ¡®â î饩
;R09 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
;R08 15-04-2003 DNS SAVE AND RESTORE CURñPATH MACROS
;R07 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN
; FROM "." ".NAM"
;R06 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME
;R05 26-11-2002 DNS FIX ERROR IN CHDIR, DON'T ALLOWED "." FOR ROOT
;R04 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES
;R03 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT
;R02 19-11-2002 DNS FIX GET/SET ATTRIBUTES
;R01 16-12-1999 DNS Y2K fix
;-------------------------------------------------------------
; 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
INC B
DEC B
JP Z,RATTRIB
DEC B
JP Z,WATTRIB
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
RATTRIB XOR A
CALL OPENATR ;R02
RET C
LD B,(IY+_sFM.ATTRIBUT)
PUSH BC
CALL CLOSE
POP BC
RET C
LD A,B
AND A
RET
WATTRIB PUSH AF
XOR A
CALL OPENATR ;R02
POP BC
RET C
SET 7,(IY+_sFM.ACCESS_MODE)
RES 3,B ;CLEAR LABEL ATTR ;R03
LD (IY+_sFM.ATTRIBUT),B
PUSH BC
CALL CLOSE
POP BC
RET C
LD A,B
AND A
RET
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; OUTPUT: A - FM
CREATE
_mSavePath
AND #E7 ;R04
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
JR CREAT
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; OUTPUT: A - FM
CREAT_N
_mSavePath
AND #E7 ;R04 %76A00SHR
LD (ACCESS),A
LD (PATH0),HL
CALL GETWORD
RET C
LD HL,TMPNAME
LD DE,MASKARE
CALL MASK
RET C
CALL SEARCH
LD A,7
CCF
RET C
CREAT LD HL,MASKARE
LD DE,HANDBUF
LD BC,11
LDIR
EX DE,HL
LD A,(ACCESS)
LD (HL),A
INC HL
LD BC,#0A00
FIHND LD (HL),C
INC HL
DJNZ FIHND
PUSH HL
CALL SYSTIME
CALL MK_TIME
POP HL
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
INC HL
LD BC,#0600
FIHND1 LD (HL),C
INC HL
DJNZ FIHND1
CALL WRT_HND
CALL SAVEDIR
LD HL,(PATH0)
XOR A
JP OPEN ;R08
; INPUT: HL - "filename.ext",#00 without simbols * ?
DELETE LD DE,MASKARE
CALL MASK
RET C
LD HL,MASKARE
LD BC,11
LD A,"?"
CPIR
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET Z
CALL LOADDIR
CALL SEARCH
RET C
DELFILE LD A,DIRPAGE
CALL BANK
PUSH AF
LD (IX+_sFM.NAME),#E5
LD E,(IX+_sFM.ST_CLUSTER)
LD D,(IX+_sFM.ST_CLUSTER+1)
POP AF
OUT (SLOT3),A
LD A,E
OR D
JR Z,SMALDEL
DEL01 EX DE,HL
CALL R_F_FAT
PUSH DE
PUSH AF
LD DE,#0000
CALL W_T_FAT
POP AF
POP DE
JP NC,DEL01
CALL WR_FAT
SMALDEL CALL SAVEDIR
AND A
RET
; INPUT: HL - "old_name.ext",#00 without simbols * ?
; DE - "new_name.ext",#00 without simbols * ?
RENAME PUSH DE
LD DE,MASKARE
CALL MASK
POP DE
RET C
LD HL,MASKARE
LD BC,11
LD A,"?"
CPIR
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET Z
PUSH DE
CALL LOADDIR
LD A,#33
CALL ASEARCH
POP HL
RET C
LD DE,MASKARE
CALL MASK
RET C
LD HL,MASKARE
LD BC,11
LD A,"?"
CPIR
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET Z
PUSH IX
LD A,#33
CALL ASEARCH
POP IX
LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET C
LD A,DIRPAGE
CALL BANK
LD HL,MASKARE
LD D,XH
LD E,XL
LD BC,11
LDIR
OUT (SLOT3),A
CALL SAVEDIR
AND A
RET
;R02
OPENATR LD (ACCESS),A
CALL GETWORD
RET C
LD HL,TMPNAME
LD DE,MASKARE
CALL MASK
RET C
LD A,#37 ;%00AD0SHR
CALL ASEARCH
JR NC,OPENAT
RET
;R02
OPEN_FN:
_mSavePath
OPEN ;R08
LD (ACCESS),A
CALL GETWORD
RET C
LD HL,TMPNAME
LD DE,MASKARE
CALL MASK
RET C
OPENEXE CALL SEARCH
RET C
OPENAT ;R02
CALL GET_FM
RET C
LD A,C
EX AF,AF'
EXX
LD (IY+_sFM.HANDLE),E
LD (IY+_sFM.HANDLE+1),D
EXX
LD D,YH
LD E,YL
LD HL,HANDBUF
LD BC,HANDBUF.SIZE
LDIR
LD A,(ACCESS)
LD (IY+_sFM.ACCESS_MODE),A
LD A,(TASK)
LD (IY+_sFM.TASK_NUM),A
XOR A
LD (IY+_sFM.F_POSITION),A
LD (IY+_sFM.F_POSITION+1),A
LD (IY+_sFM.F_POSITION+2),A
LD (IY+_sFM.F_POSITION+3),A
LD A,(FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A
LD HL,FM_BUF+_sFM.ST_CLUSTER
LD E,(HL)
INC HL
LD D,(HL)
LD (IY+_sFM.DIR_CLUSTER),E
LD (IY+_sFM.DIR_CLUSTER+1),D
EX AF,AF'
AND A
RET
CLOSE_FN
_mSavePath
CLOSE: ;R08
LD (ACCESS),A
CALL SET_FM
RET C
LD A,(TASK)
CP (IY+_sFM.TASK_NUM)
LD A,DSS_Error.sys.ACCESS_DENIED
SCF
RET NZ
BIT 7,(IY+_sFM.ACCESS_MODE)
JR Z,NOTMODF
LD D,(IY+_sFM.DIR_CLUSTER)
LD E,(IY+_sFM.DIR_CLUSTER+1)
PUSH DE
XOR A
CALL SET_FM
POP DE
LD (IY+_sFM.DIR_CLUSTER),D
LD (IY+_sFM.DIR_CLUSTER+1),E
CALL LOADDIR
LD A,(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
DEC BC
CLOSE2 LD A,B
OR C
JR NZ,CLOSE1
LD D,YH
LD E,YL
EX DE,HL
PUSH HL
LD A,DIRPAGE
CALL BANK
POP HL
LD BC,#0020
LDIR
OUT (SLOT3),A
CALL SAVEDIR
NOTMODF LD A,(ACCESS)
CALL RES_FM
RET
PATH0: DW #0000
ACCESS: DB #00
HANDBUF: BLOCK HANDBUF.SIZE,0
WRT_HND LD A,DIRPAGE
CALL BANK
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
FNDMODE DB #00
F_FIRST LD (ACCESS),A
LD (DTABUF),DE
LD A,B
LD (FNDMODE),A
PUSH HL
CALL LOADDIR
POP HL
CALL GETWORD
RET C
LD HL,TMPNAME
LD DE,MASKARE
CALL MASK
RET C
LD A,(ACCESS)
CALL ASEARCH
RET C
LD HL,MASKARE
LD DE,(DTABUF)
LD BC,11
LDIR
LD A,(ACCESS)
LD (DE),A
INC DE
FIND_S LD BC,#0020
ADD IX,BC
LD (CURHND),IX
LD HL,HANDBUF+12
LD BC,HANDBUF.SIZE-12 ;????? ¬¥âªã ¢¬¥áâ® ç¨á« ?
LDIR
LD A,(HANDBUF+11)
LD (DE),A
INC DE
LD HL,HANDBUF
LD A,(FNDMODE)
OR A
JR NZ,FIND_M2
LD BC,11
LDIR
LD A,#FF
LD (NO_NEXT),A
XOR A
RET
FIND_M2 CALL GETNAME
LD A,#FF
LD (NO_NEXT),A
XOR A
RET
F_NEXT LD A,(NO_NEXT)
OR A
LD A,DSS_Error.sys.INVALID_ACCESS
SCF
RET Z
LD (DTABUF),DE
LD DE,MASKARE
LD HL,(DTABUF)
LD BC,11
LDIR
LD A,(HL)
PUSH HL
CALL NSEARCH
POP DE
EX AF,AF'
XOR A
LD (NO_NEXT),A
EX AF,AF'
RET C
INC DE
JP FIND_S
NSEARCH EX AF,AF'
LD A,DIRPAGE
CALL BANK
PUSH AF
EX AF,AF'
CPL
LD C,A
LD IX,(CURHND)
EXX
LD DE,0
EXX
JP SEARCH1
DSEARCH LD A,#10
CALL ASEARCH
RET NC
LD A,4
RET
SEARCH LD A,#23 ;%00100011
ASEARCH EX AF,AF' ; 76ADLSHR
LD A,DIRPAGE
CALL BANK
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
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
ADD IX,DE
JR NC,SEARCH1
SEARCH4 POP AF
OUT (SLOT3),A
LD A,DSS_Error.sys.FILE_NOT_FOUND
SCF
RET
GETWORD:
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 '!'
CCF
RET NC
DJNZ .loop
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
.DIR_NAME:
LD A,#00
LD (DE),A
PUSH HL
LD HL,TMPNAME
CALL OPENDIR
POP HL
JR NC,GETWORD
RET
.DRV_NAME:
LD A,(TMPNAME)
CP 'a'
JR C,.next
CP '{'
JR NC,.next
SUB #20
.next: SUB 'A'
PUSH HL
CALL OPENDSK
POP HL
JP NC,GETWORD
RET
TMPNAME: DB ' ',#00 ; 12 ¯à®¡¥«®¢ ¨ 0
;
CHNDISK:
;R10
; CALL OPENDSK
; RET C
; LD HL,DIRSPEC+1
; LD (HL),0
; PUSH AF
; CALL OPENDIR
; POP BC
; RET C
; LD A,B
; RET
;R10
OPENDSK:
PUSH AF
LD C,1
RST #18
POP BC
JP C,.error
LD A,B
LD (FatBuffer.DRIVE),A
CALL RD_BPB
RET C
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
JP 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
OR (IY+_sFM.ST_CLUSTER+1) ;R05
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
LD (HL),#20
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 LD A,DIRPAGE
CALL BANK
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
JR 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
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
CURRDIR: EX DE,HL
LD HL,DIRSPEC
CURDIR1 LD A,(HL)
OR A
LDI
JR NZ,CURDIR1
RET
LOADDIR:
XOR A
LD HL,0
LD IX,0
LD B,0
CALL MOVE_FP
LD A,DIRPAGE
CALL BANK
PUSH AF
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)
LD E,(IY+_sFM.ST_CLUSTER+1)
LD A,D
OR E
JP Z,LROTDIR
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
SUB B
JR NC,RTD1
ADD A,B
LD B,A
RTD1 LD A,(FatBuffer.DRIVE)
LD C,5
LD DE,DIR
RST #18
POP AF
OUT (SLOT3),A
AND A
RET
SAVEDIR XOR A
LD HL,0
LD IX,0
LD B,0
CALL MOVE_FP
LD A,DIRPAGE
CALL BANK
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 C,6
LD DE,DIR
RST #18
POP AF
OUT (SLOT3),A
AND A
RET
DIRSIZE DW 0
;!FIXIT <20>¥à¥¤¥« âì ¯à®áâ® ­  áâàãªâãàã, ç⮡ ¯®«ãç âì ­®¬¥à  áâà ­¨æ ¡¥§ í⮣® £¥¬®à 
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
;G_HAND1 POP IX
; POP HL
; POP DE
; RET
;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
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; EXX
; OUT (SLOT3),A
; LD HL,HANDTA
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; LDI
; EXX
; POP BC
; DEC BC
; LD A,B
; OR C
; RET Z
; PUSH BC
; JP G_HAND4
;HANDTA DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
; DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
MASKARE
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
; 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),#20
LD BC,10
LDIR
POP DE
POP HL
LD A,(HL)
CP '.' ;R07
SCF ;R07
JR Z,MASKB ;R07
CP '!'
MASKB LD A,DSS_Error.sys.INVALID_NAME
RET C
LD BC,#0902
MASK1 LD A,(HL)
CP '!'
CCF
RET NC
CP '"'
JR Z,MASK7
CP '*'
JR Z,MASK3
CP '+'
JR Z,MASK7
CP ','
JR Z,MASK7
CP '.'
JR Z,MASK5
CP '/'
JR Z,MASK7
CP ':'
JR Z,MASK7
CP ';'
JR Z,MASK7
CP '<'
JR Z,MASK7
CP '='
JR Z,MASK7
CP '>'
JR Z,MASK7
CP '['
JR Z,MASK7
CP '\'
JR Z,MASK7
CP ']'
JR Z,MASK7
CP '|'
JR Z,MASK7
; CP 'a' ;?????
; JR C,MASK2
; CP '{'
; JR NC,MASK2
; SUB #20
CALL UPPER
MASK2 LD (DE),A
INC HL
INC DE
DJNZ MASK1
MASK7 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
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
SYSTIME LD C,#F5
RST ToBIOS
JP C,NOCMOS
LD D,7 ;DAY
CALL RCMOS
PUSH AF
LD D,8 ;MONTH
CALL RCMOS
POP DE
LD E,A
PUSH DE
LD D,4 ;HOUR
CALL RCMOS
PUSH AF
LD D,2 ;MINUTE
CALL RCMOS
POP DE
LD E,A
PUSH DE
LD D,0 ;SECOND
CALL RCMOS
PUSH AF
LD D,6 ;WEEK DAY
LD C,#F6
RST ToBIOS
POP DE
LD E,A
PUSH DE
LD D,9 ;YEAR
CALL RCMOS ;READ AND CONVERT TO DECIMAL
PUSH AF
LD D,#32 ;CENTURY
LD C,#F6
RST ToBIOS
LD XH,A
POP AF
CP 80 ;R01, TEST DECIMAL FIX
PUSH AF
JR C,XXIAGE
LD A,#19
CP XH
JR Z,GOODAGE
JR BADAGE
XXIAGE LD A,#20
CP XH
JR Z,GOODAGE
BADAGE PUSH AF
LD D,#32 ;CENTURY
LD C,#F7
RST ToBIOS
POP AF
LD XH,A
GOODAGE POP AF
LD XL,A
LD A,XH
CALL BCD2HEX
LD L,A
LD H,0
LD C,L
LD B,H
LD XH,B
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL ;*10
LD B,H
LD C,L
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL ;*10(100)
EX DE,HL
ADD IX,DE
POP BC
POP HL
POP DE
AND A
RET
RCMOS LD C,#F6
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
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
SETTIME PUSH IX
PUSH BC
PUSH HL
PUSH DE
LD C,#F5
RST ToBIOS
JP C,NOCMOS2
POP AF
PUSH AF
LD D,7 ;DAY
CALL WCMOS
POP BC
LD A,C
LD D,8 ;MONTH
CALL WCMOS
POP AF
PUSH AF
LD D,4 ;HOUR
CALL WCMOS
POP BC
LD A,C
LD D,2 ;MINUTE
CALL WCMOS
POP AF
PUSH AF
LD D,0 ;SECOND
CALL WCMOS
POP BC
LD A,C
LD D,6 ;WEEK DAY
LD C,#F7
RST ToBIOS
POP HL
XOR A
LD DE,100
YR INC A
SBC HL,DE
JR NC,YR
ADD HL,DE
DEC A
PUSH HL
LD D,#32 ;CENTURY
CALL WCMOS
POP BC
LD A,C
LD D,9 ;YEAR
CALL WCMOS
AND A
RET
WCMOS CALL HEX2BCD
LD C,#F7
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
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
GET_D_T
CALL SET_FM
RET C
LD E,(IY+_sFM.TIME)
LD D,(IY+_sFM.TIME+1)
LD C,(IY+_sFM.DATE)
LD B,(IY+_sFM.DATE+1)
CALL RMKTIME
AND A
RET
PUT_D_T PUSH AF
CALL MK_TIME
POP AF
PUSH DE
PUSH BC
CALL SET_FM
POP BC
POP DE
RET C
LD (IY+_sFM.TIME),E
LD (IY+_sFM.TIME+1),D
LD (IY+_sFM.DATE),C
LD (IY+_sFM.DATE+1),B
SET 7,(IY+_sFM.ACCESS_MODE) ;R06
AND A
RET
;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
;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
; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0
CHDIR: CALL GETWORD
RET C
LD HL,TMPNAME
LD A,(HL)
OR A
CALL NZ,OPENDIR
RET
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
MKDIR:
_mSavePath
CALL GETWORD
RET C
LD HL,TMPNAME
LD DE,MASKARE
CALL MASK
RET C
CALL LOADDIR
CALL DSEARCH
LD A,15
CCF
RET C
CALL G_CLUST
RET C
PUSH HL
LD DE,(FatBuffer.ENDCLUS)
CALL W_T_FAT
CALL WR_FAT
LD HL,MASKARE
LD DE,HANDBUF
LD BC,11
LDIR
EX DE,HL
LD A,#10
LD (HL),A
INC HL
LD BC,#0A00
FIHND0 LD (HL),C
INC HL
DJNZ FIHND0
PUSH HL
CALL SYSTIME
CALL MK_TIME
POP HL
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
INC HL
POP DE
PUSH DE
LD (HL),E
INC HL
LD (HL),D
INC HL
LD BC,#0400
FIHND2 LD (HL),C
INC HL
DJNZ FIHND2
CALL WRT_HND
CALL SAVEDIR
LD HL,SECBUF
LD (HL),"."
LD B,10
MKD02 INC HL
LD A,' '
LD (HL),A
DJNZ MKD02
INC HL
LD DE,HANDBUF+11
EX DE,HL
LD BC,21
LDIR
EX DE,HL
LD (HL),"."
INC HL
LD (HL),"."
LD B,9
MKD03 INC HL
LD A,#20
LD (HL),A
DJNZ MKD03
INC HL
PUSH HL
LD A,DIRPAGE
CALL BANK
POP HL
PUSH AF
LD A,(DIR)
CP "."
LD DE,DIR+11
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
LD BC,HANDBUF.SIZE-11
LDIR
POP AF
OUT (SLOT3),A
EX DE,HL
LD D,H
LD E,L
INC DE
LD (HL),0
LD BC,512-65
LDIR
POP HL
CALL NSECTOR
LD A,(BootSector.S_P_C)
MKD12 PUSH AF
PUSH HL
PUSH IX
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
;
LD DE,SECBUF+#C000
LD B,1
LD A,(FatBuffer.DRIVE)
LD C,6
RST #18
;
POP AF
OUT (SLOT3),A
LD HL,SECBUF
LD DE,SECBUF+1
LD BC,511
LD (HL),0
LDIR
POP IX
POP HL
INC IX
LD A,XH
OR XL
JR NZ,MKD11
INC HL
MKD11 POP AF
DEC A
JR NZ,MKD12
AND A
RET
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
RMDIR: _mSavePath
CALL GETWORD
RET C
LD HL,TMPNAME
LD DE,MASKARE
CALL MASK
RET C
LD HL,MASKARE
LD BC,11
LD A,"?"
CPIR
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET Z
CALL LOADDIR
CALL DSEARCH
RET C
LD HL,(HANDBUF+_sFM.ST_CLUSTER)
PUSH IX
RMD17 PUSH HL
CALL NSECTOR
LD A,(BootSector.S_P_C)
RMD12 PUSH AF
PUSH HL
PUSH IX
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
LD DE,SECBUF+#C000
LD BC,#0105
LD A,(FatBuffer.DRIVE)
RST #18
POP AF
OUT (SLOT3),A
LD B,16
LD HL,SECBUF
RMD10 LD A,(HL)
OR A
JP Z,RMD15 ;DIR EMPTY
CP "."
JR Z,RMD14
CP #E5
JR Z,RMD14
LD DE,11
ADD HL,DE
LD A,(HL)
SBC HL,DE
BIT 3,A
JP Z,RMD16 ;DIR NOT EMPTY
RMD14 LD DE,#0020
ADD HL,DE
DJNZ RMD10
POP IX
POP HL
INC IX
LD A,XH
OR XL
JR NZ,RMD11
INC HL
RMD11 POP AF
DEC A
JR NZ,RMD12
POP HL
CALL R_F_FAT
EX DE,HL
JR NC,RMD17
RMD18 POP IX
JP DELFILE
RMD15 POP IX
POP HL
POP AF
POP HL
JR RMD18
RMD16 POP IX
POP HL
POP AF
POP HL
POP IX
LD A,DSS_Error.sys.DIR_NOT_EMPTY
SCF
RET
;//MODULE: DOS5
;[END]