Estex-DSS/DSS/DOS5.ASM
Anatoliy Belyanskiy 2df0b56e56 Current Directory
2023-10-15 03:34:27 +10:00

2267 lines
40 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 1
;!Test Current Dir
LD C,A
PUSH HL
PUSH BC
CALL DIR_PATH_CHECK
POP BC
POP HL
RET C
LD A,C
;
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 ;!HARDCODE attribute bit
LD (IY+_sFM.ATTRIBUT),B
PUSH BC
CALL CLOSE
POP BC
RET C
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
;!Test Current Dir
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
;
CALL .Prepare
RET C
CALL SEARCH
CALL NC,DELETE ;FILE EXIST RECREAT
JR .DO
;
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; OUTPUT: A - FM
.NEW: _mSavePath 0
;!Test Current Dir
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
;
CALL .Prepare
RET C
CALL SEARCH
LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET C
;
.DO: LD HL,MASKARE
LD DE,HANDBUF
LD BC,11
LDIR
EX DE,HL
LD A,(F_FIRST.ACCESS)
LD (HL),A
INC HL
LD BC,#0A00 ;!HARDCODE
;
.loop1: LD (HL),C
INC HL
DJNZ .loop1
;
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
;
.loop2: LD (HL),C
INC HL
DJNZ .loop2
;
CALL WRT_HND
CALL SAVEDIR
.PATH0+1:
LD HL,0
XOR A
JP OPEN ;R08
.Prepare:
AND #E7 ;R04 %76A00SHR = !FAT_ATTR
LD (F_FIRST.ACCESS),A
LD (.PATH0),HL
CALL GETWORD
RET C
LD HL,TMPNAME
LD DE,MASKARE
JP MASK
CREAT_N EQU CREATE.NEW
////////////////////////////////////////////////////////////////////////
; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ?
////////////////////////////////////////////////////////////////////////
DEL_FN: ;!TEST
_mSavePath 1
;!Test Current Dir
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
;
CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
LD HL,TMPNAME
LD DE,MASKARE
CALL MASK
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
CALL LOADDIR
CALL SEARCH
RET C
;JP DELETE
; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
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 ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
.loop: EX DE,HL ; hl=­®¬¥à ª« áâ¥à 
CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
PUSH DE ; ­®¬¥à á«¥¤. ª« áâ¥à 
PUSH AF
LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP AF
POP DE
JP NC,.loop
CALL WR_FAT
JP SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #10. <20>¥à¥¨¬¥­®¢ ­¨¥ ä ©« .
; ƒ«®¡ «ì­ë¥ ᨬ¢®«ë * ¨ ? ¢ ¨¬¥­ å ä ©«®¢ ­¥ ¤®¯ã᪠îâáï.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  áâ à®¥ ¨¬ï ä ©« 
; DE - 㪠§ â¥«ì ­  ­®¢®¥ ¨¬ï ä ©« 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "old_name.ext",#00 without simbols * ?
; DE - "new_name.ext",#00 without simbols * ?
////////////////////////////////////////////////////////////////////////
RENAME:
;!Test Current Dir
PUSH HL
PUSH DE
CALL DIR_PATH_CHECK.forceCheck
POP DE
POP HL
RET C
;
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
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.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,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.ASEARCH ; ¯®¨áª § ¯¨á¨ ¢ ᯨ᪥ ¤¨áª 
POP IX
LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET C
SET_PAGE_X DIRPAGE
LD HL,MASKARE
LD D,XH
LD E,XL
LD BC,11
LDIR
OUT (SLOT3),A
JP SAVEDIR
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #11. Žâªàë⨥ ä ©« .
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ä ©« 
; A - ०¨¬ ¤®áâ㯠:
; A=0 ç⥭¨¥/§ ¯¨áì
; A=1 ç⥭¨¥
; A=2 § ¯¨áì
; ¢ë室: A - ¤¥áªà¨¯â®à ä ©« , ¥á«¨ CF=0
; ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
OPEN_FN:
_mSavePath 1
;!Test Current Dir
LD C,A
PUSH HL
PUSH BC
CALL DIR_PATH_CHECK.forceCheck
POP BC
POP HL
RET C
LD A,C
;
;R08
OPEN: LD (F_FIRST.ACCESS),A
CALL GETWORD
RET C
LD HL,TMPNAME
LD DE,MASKARE
CALL MASK
RET C
.FILE: CALL SEARCH
RET C
;R02
.FM: 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,(F_FIRST.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,CORE_BUFFERS.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
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #12
; A - ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
CLOSE_FN:
_mSavePath 1
;R08
CLOSE: LD (F_FIRST.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,(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
DEC BC
.CLOSE2:
LD A,B
OR C
JR NZ,.CLOSE1
LD D,YH
LD E,YL
EX DE,HL
PUSH HL
SET_PAGE_X DIRPAGE
POP HL
LD BC,#0020
LDIR
OUT (SLOT3),A
CALL SAVEDIR
.NOTMODF:
LD A,(F_FIRST.ACCESS)
CALL RES_FM
RET
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #19
; HL - 㪠§ â¥«ì ­  ä ©«®¢ãî ᯥæ¨ä¨ª æ¨î
; DE - à ¡®ç¨© ¡ãä¥à 44 ¡ ©â , ¥á«¨ B=0, ¨­ ç¥ 256 ¡ ©â
; A -  âਡãâë, ¨á¯®«ì§ã¥¬ë¥ ¯à¨ ¯®¨áª¥
; B = 0 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ 11 ¡ ©â "FilenameExt"
; B = 1 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ DOS "filename.ext",0
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
F_FIRST:
;!Test Current Dir
LD C,A
PUSH HL
PUSH DE
PUSH BC
CALL DIR_PATH_CHECK
POP BC
POP DE
POP HL
RET C
LD A,C
;
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
.ACCESS+1:
LD A,0
CALL SEARCH.ASEARCH
RET C
LD HL,MASKARE
.DTABUF+1:
LD DE,0
LD BC,11 ;!HARDCODE
LDIR
LD A,(.ACCESS)
LD (DE),A
.FIND_S:
INC DE
LD BC,#0020
ADD IX,BC
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
.FNDMODE+1:
LD A,0
OR A
JR NZ,.FIND_M2
LD BC,11 ;!HARDCODE
LDIR
LD A,F_NEXT.NO_NEXT.NO
LD (F_NEXT.NO_NEXT),A
XOR A
RET
.FIND_M2:
CALL GETNAME
LD A,F_NEXT.NO_NEXT.NO
LD (F_NEXT.NO_NEXT),A
XOR A
RET
////////////////////////////////////////////////////////////////////////
;
;
////////////////////////////////////////////////////////////////////////
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 (F_FIRST.DTABUF),DE
EX DE,HL
LD DE,MASKARE
LD BC,11 ;!HARDCODE
LDIR
XOR A ; F_NEXT.NO_NEXT.YES
LD (F_NEXT.NO_NEXT),A
LD A,(HL)
PUSH HL
CALL .NSEARCH
POP DE
RET C
JP F_FIRST.FIND_S
.NSEARCH:
EX AF,AF'
SET_PAGE_X DIRPAGE
PUSH AF
EX AF,AF'
CPL
LD C,A
EXX
LD DE,0
EXX
.CURHND+2:
LD IX,0
LD A,XH
OR XL
JP Z,SEARCH.error
JP SEARCH.SEARCH1
////////////////////////////////////////////////////////////////////////
;
;
////////////////////////////////////////////////////////////////////////
CHNDISK_FN:
CALL CHNDISK
RET C
PUSH AF
CALL DIR_PATH_CHANGE.FullCurrent
POP AF
RET
CHNDISK:
;!TEST
CALL OPENDSK
;CALL OPENDSK.force
;
;????? R10
RET C
LD HL,WorkDirectory
LD (HL),0
PUSH AF
CALL OPENDIR
POP BC
RET C
LD A,B
; RET C
; PUSH AF
; CALL LOADDIR
; POP AF
RET
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1E. ˆ­ä®à¬ æ¨ï ® ⥪ã饬 ª â «®£¥.
;
; ¢å®¤: HL - ¡ãä¥à ¢ ¯ ¬ï⨠256 ¡ ©â
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
; !FIXIT ¬®¦¥â ¢ë©â¨ §  ¯à¥¤¥«ë ¡ãä¥à ?
////////////////////////////////////////////////////////////////////////
CURRDIR: LD DE,WorkDirectory
JR CURRDIR_FN.skip
CURRDIR_FN:
LD DE,CurrentDirectory
.skip: EX DE,HL
XOR A
.loop: CP (HL)
LDI
JR NZ,.loop
RET
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #21. ’¥ªãé ï ¤ â  ¨ ¢à¥¬ï.
;
; ¢å®¤: ­¥â
; ¢ë室: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; C - ¤¥­ì ­¥¤¥«¨
////////////////////////////////////////////////////////////////////////
SYSTIME:
LD C,BIOS.CMOS_TEST
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,BIOS.CMOS_RD
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,BIOS.CMOS_RD
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,BIOS.CMOS_WR
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
.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
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #22. “áâ ­®¢¨âì ⥪ãéãî ¤ âã ¨ ¢à¥¬ï.
;
; ¢å®¤: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
SETTIME:
PUSH IX
PUSH BC
PUSH HL
PUSH DE
LD C,BIOS.CMOS_TEST
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,BIOS.CMOS_WR
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
; !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
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #17. ˆ­ä®à¬ æ¨ï ® ¤ â¥ ¨ ¢à¥¬¥­¨ ä ©« .
;
; ¢å®¤: A - ¤¥áªà¨¯â®à ä ©« 
; ¢ë室: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
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
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #18. ˆ§¬¥­¥­¨¥ ¤ âë ¨ ¢à¥¬¥­¨ ä ©« .
;
; ¢å®¤: A - ¤¥áªà¨¯â®à ä ©« 
; D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
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
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1D. ‘¬¥­  ⥪ã饣® ª â «®£ .
; Œ¥­ï¥â ⥪ã騩 ª â «®£ ¨ ⥪ã騩 ¤¨áª, ¥á«¨ ®­ 㪠§ ­ ¢ ä ©«®¢®©
; ᯥæ¨ä¨ª æ¨¨. …᫨ ¯ãâì ­ ç¨­ ¥âáï á "\" - íâ® ®§­ ç ¥â ¯ãâì ®â
; ª®à­¥¢®£® ª â «®£ , ¨­ ç¥ ®â ⥪ã饣®.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: ­¥â
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0
////////////////////////////////////////////////////////////////////////
CHDIR_FN:
_mSavePath 0
;!Test Current Dir
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
;
CALL CHDIR
JP DIR_PATH_CHANGE.FullCurrent
; RET
;
CHDIR: CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
LD HL,TMPNAME
LD A,(HL)
OR A
CALL NZ,OPENDIR
RET
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1B. ‘®§¤ ­¨¥ ª â «®£ .
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
////////////////////////////////////////////////////////////////////////
MKDIR: _mSavePath 1
;!Test Current Dir
LD C,A
PUSH HL
PUSH BC
CALL DIR_PATH_CHECK
POP BC
POP HL
RET C
LD A,C
;
CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
LD HL,TMPNAME ; 8.3 ¨¬ï
LD DE,MASKARE ; ¡ãä¥à ¨¬¥­¨ 11 ᨬ¢. ä®à¬ â 
CALL MASK ; ¯à¥®¡à. ¨¬ï 8.3 -> 11 ä®à¬ â
RET C
CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
CALL DSEARCH ; ¯®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ¤¨áª 
LD A,DSS_Error.sys.DIR_EXISTS
CCF
RET C ; ª â «®£ ­ ©¤¥­
CALL G_CLUST
RET C
PUSH HL
LD DE,(FatBuffer.ENDCLUS) ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WR_FAT ; ¯®¤ª«. ¡ ­ªã ª¥è  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 ; b=áç¥â稪
.loop1: LD (HL),C
INC HL
DJNZ .loop1
PUSH HL
CALL SYSTIME ; ã§­ âì ⥪. ¤ âã ¨ ¢à¥¬ï
CALL MK_TIME ; § ª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
POP HL
LD (HL),E ; de=¢à¥¬ï
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 ; b=áç¥â稪
.loop2: LD (HL),C
INC HL
DJNZ .loop2
CALL WRT_HND ; ᪮¯¨à. ­®¢ãî § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ )
CALL SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
LD HL,CORE_BUFFERS.SECBUF ; ¡ãä¥à
LD (HL),"." ; § ¯¨áì ⥪. ª â «®£ 
LD BC,10*256 + ' ' ; b=áç¥â稪, c=¯à®¡¥«
.loop3: INC HL
LD (HL),C
DJNZ .loop3
INC HL
LD DE,HANDBUF+11 ; ï祩ª   âਡã⮢ ä ©« 
EX DE,HL
LD BC,21
LDIR
EX DE,HL
LD (HL),"." ; § ¯¨áì த¨â. ª â «®£ 
INC HL
LD (HL),"."
LD BC,9*256 + ' ' ; b=áç¥â稪, c=¯à®¡¥«
.MKD03: INC HL
LD (HL),C
DJNZ .MKD03
INC HL
; IF OLD_SET_BANK
; PUSH HL
; ENDIF
SET_PAGE_X DIRPAGE
; IF OLD_SET_BANK
; POP HL
; ENDIF
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 ;!FIXIT ­ã¦­® «¨ â ª ¬­®£® £à®å âì?
POP HL
CALL NSECTOR
LD A,(CORE_BUFFERS.BootSector.S_P_C) ; ᥪâ®à®¢ ­  ª« áâ¥à
.MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤
PUSH IX ; ­®¬¥à «®£. ᥪâ®à 
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
;
LD A,(FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000
LD BC,1*256 + Dss.DRV.Write
RST ToDSS.DRV
;
POP AF
OUT (SLOT3),A
LD HL,CORE_BUFFERS.SECBUF
LD DE,CORE_BUFFERS.SECBUF+1
LD BC,511
LD (HL),0
LDIR ;!FIXIT ­ã¦­® «¨ â ª ¬­®£® £à®å âì?
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
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1C. “¤ «¥­¨¥ ª â «®£ .
; Œ®¦­® 㤠«¨âì ⮫쪮 ¯ãá⮩ ª â «®£.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
////////////////////////////////////////////////////////////////////////
RMDIR: _mSavePath 1
;!Test Current Dir
LD C,A
PUSH HL
PUSH BC
CALL DIR_PATH_CHECK
POP BC
POP HL
RET C
LD A,C
;
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,(CORE_BUFFERS.BootSector.S_P_C)
.RMD12: PUSH AF
PUSH HL
PUSH IX
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
LD DE,CORE_BUFFERS.SECBUF+#C000
LD BC,1*256 + Dss.DRV.Read
LD A,(FatBuffer.DRIVE)
RST ToDSS.DRV
POP AF
OUT (SLOT3),A
LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - à §¬¥à § ¯¨á¨, 512 - à §¬¥à áç¨â ­­®£® ᥪâ®à 
LD HL,CORE_BUFFERS.SECBUF
.RMD10: LD A,(HL)
OR A
JP Z,.RMD15 ;DIR EMPTY
CP "."
JR Z,.RMD14
CP #E5 ;!HARDCODE ¡ ©â 㤠«¥­¨ï ä ©« 
JR Z,.RMD14
LD DE,11 ;!HARDCODE ᬥé. ¤® ¡ ©â   âਡã⮢
ADD HL,DE
LD A,(HL)
SBC HL,DE
;BIT 3,A
AND %0000'1000
JP Z,.error ;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 ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
EX DE,HL ; hl=­®¬¥à á«¥¤. ª« áâ¥à 
JR NC,.RMD17 ; ­¥ ª®­¥æ 楯®çª¨
.RMD18: POP IX
JP DELETE ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
.RMD15: POP IX
POP HL
POP AF
POP HL
JR .RMD18
.error: POP IX
POP HL
POP AF
POP HL
POP IX
LD A,DSS_Error.sys.DIR_NOT_EMPTY
SCF
RET
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #44
; B = 0, ¯à¥®¡à §®¢ âì ¨§ 11 ᨬ¢®«ì­®£® ä®à¬ â  ¢ ä®à¬ â „Ž‘
; HL - 11 ᨬ¢®«®¢ ¨¬¥­¨ ä ©« 
; DE - ¡ãä¥à ¤«ï ¨¬¥­¨ ¢ ä®à¬ â¥ „Ž‘
; B = 1, ¯à¥®¡à §®¢ âì ¨§ ä®à¬ â  „Ž‘ ¢ 11 ᨬ¢®«ì­ë© ä®à¬ â
; HL - ¨¬ï ä ©«  ¢ ä®à¬ â¥ „Ž‘
; DE - 11 ᨬ¢®«®¢ ¨¬¥­¨ ä ©« 
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
DOSNAME:
INC B
DEC B
JP Z,GETNAME
DEC B
JP Z,MASK
LD A,DSS_Error.sys.INVALID_FUNCTION
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
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; <20> áª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
; ¢å®¤: 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
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; 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
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; <20>®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ª â «®£ 
;
; ¢å®¤: 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
; 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
.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 ª ¡ãä¥à ¬
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;????? 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 HL,WorkDirectory
LD D,H
LD E,L
INC HL
;LD BC,CurrentDirectory.DEPTH
LD BC,WorkDirectory.DEPTH
XOR A
CPIR ;!FIXIT ­¥â ¯à®¢¥àª¨ ­  § ¢¥à襭¨¥ ¯® BC=0
DEC HL ;R09 ;[x] ¨á¯à ¢«¥­ ¡ £ á ¯ àᨭ£®¬ ¡ãä¥à  ª â «®£ 
DEC HL
;LD BC,CurrentDirectory.DEPTH
LD BC,WorkDirectory.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
LD HL,WorkDirectory+1
LD BC,WorkDirectory.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:
CALL .CHECK_SLASH
;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
.CHECK_SLASH:
XOR A
CPIR ;!FIXIT ­¥â ¯à®¢¥àª¨ ­  § ¢¥à襭¨¥ ¯® BC=0
DEC HL
DEC HL
LD A,'\' ; #5C
CP (HL)
INC HL
RET Z
LD (HL),A
INC HL
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: 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
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
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
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
DIR_PATH_CHANGE:
.FullCurrent: LD A,(FatBuffer.DRIVE)
ADD 'A'
LD (CurrentPath),A
;
.Current: LD HL,WorkDirectory
LD DE,CurrentDirectory
LD BC,DIRECTORY_PATH_LENGTH
LDIR
RET
;
.FullWork: LD A,(CurrentPath)
SUB 'A'
LD (FatBuffer.DRIVE),A
;
.Work: LD HL,CurrentDirectory
LD DE,WorkDirectory
LD BC,DIRECTORY_PATH_LENGTH
LDIR
RET
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 FINDDIR.CHECK_SLASH
CALL .checkDrive
JR Z,.checkDir
;
LD HL,CurrentPath
LD A,(FatBuffer.DRIVE)
ADD 'A'
CP (HL)
JP NZ,GETWORD
;
.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
;
JR .ReDir
.end: CP (HL)
RET Z
.ReDir: LD HL,CurrentPath
JP GETWORD
;
.checkDrive: LD HL,CurrentPath
LD A,(FatBuffer.DRIVE)
ADD 'A'
CP (HL)
RET
;----------------------------------------------------------------------;
;!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]
;DIRSIZE: WORD 0 ; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory
;!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
;