Estex-DSS/DSS/API/MkDir.asm
2024-04-06 04:27:47 +10:00

212 lines
4.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.

; [x] fat32 ;!TEST
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1B. ‘®§¤ ­¨¥ ª â «®£ .
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
////////////////////////////////////////////////////////////////////////
MKDIR:
;error
.DIR_EXISTS: LD A,DSS_Error.sys.DIR_EXISTS
CCF
RET
;
; Entry point ;!TEST Current Dir ;[x] 15/10/23
.B: PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
CALL .START
PUSH AF
LD HL,CurrentDirectory
CALL CHDIR
POP AF
RET
;
.START: CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
;LD HL,TMPNAME ; 8.3 ¨¬ï
;LD DE,MASKARE ; ¡ãä¥à ¨¬¥­¨ 11 ᨬ¢. ä®à¬ â 
CALL MASK ; ¯à¥®¡à. ¨¬ï 8.3 -> 11 ä®à¬ â
RET C
;!TEST optimization à ­¥¥ GETWORD 㦥 § £à㧨« ¤¨à¥ªâ®à¨î
;CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;
CALL SEARCH.Dir ; ¯®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ¤¨áª 
; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
; LD A,DSS_Error.sys.DIR_EXISTS
; CCF
; RET C ; ª â «®£ ­ ©¤¥­
JR NC,.DIR_EXISTS
CP DSS_Error.sys.FILE_NOT_FOUND
SCF
RET NZ
;
CALL G_CLUST
RET C
; fat32
PUSH HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
EXX
PUSH HL ; áâ à訩 ­®¬¥à ᥪâ®à 
EXX
;
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
LD HL,MASKARE
LD DE,HANDBUF
LD BC,11
LDIR
EX DE,HL
LD A,FAT_ATTR.DIRECTORY ;  âਡãâ § ¯¨á¨ ª â «®£ 
; _sFAT_DIRECTORY_RECORD.ATTRIBUT
LD (HL),A
INC HL
LD BC,#0800 ; b=áç¥â稪
;
.loop1: LD (HL),C
INC HL
DJNZ .loop1
; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H
; fat32 § ¯¨áì áâ à襣® ­®¬¥à  ª« áâ¥à  .FIRST_CLUSTER_H
POP DE
PUSH DE ; áâ à訩 ­®¬¥à ᥪâ®à 
LD (HL),E
INC HL
LD (HL),D
INC HL
;
CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD
; § ¯¨áì ¬« ¤è¥£® ­®¬¥à  ª« áâ¥à  .FIRST_CLUSTER_L
POP BC ; áâ à訩 ­®¬¥à ᥪâ®à 
POP DE ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
PUSH DE
PUSH BC
; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L
LD (HL),E
INC HL
LD (HL),D
INC HL
; _sFAT_DIRECTORY_RECORD.F_SIZE
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 + ' ' ; !HARDCODE b=áç¥â稪, c=¯à®¡¥«
;
.loop3: INC HL
LD (HL),C
DJNZ .loop3
; ᪮¯¨à®¢ âì ¡ ©âë 11..31 _sFAT_DIRECTORY_RECORD
INC HL
LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ï祩ª   âਡã⮢ ä ©« 
EX DE,HL
LD BC,21 ; !HARDCODE
LDIR
; Š€’€‹Žƒ ".."
EX DE,HL
LD (HL),"." ; § ¯¨áì த¨â. ª â «®£ 
INC HL
LD (HL),"."
LD BC,9*256 + ' ' ; b=áç¥â稪, c=¯à®¡¥«
.loop4: INC HL
LD (HL),C
DJNZ .loop4
;
INC HL
SET_PAGE_X DIRPAGE
PUSH AF
;
LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ;  âਡãâë § ¯¨á¨
;
LD A,(DIRPAGE.buffer)
CP "."
JR Z,.copy_dir_record
; fat32
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
JR NZ,.fat16_root_dir
; fat 32
EX DE,HL
LD HL,(FatBuffer.RootDirStartCluster_L)
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL
LD HL,(FatBuffer.RootDirStartCluster_H)
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL
EX DE,HL
JR .set_rec
;
.fat16_root_dir:; fat 12/16
;LD IX,HANDBUF
XOR A
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A
.set_rec: LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ï祩ª   âਡã⮢ ä ©« 
.copy_dir_record:
EX DE,HL
LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21
LDIR
POP AF
OUT (SLOT3),A
;
EX DE,HL
LD D,H
LD E,L
INC DE
LD (HL),0
LD BC,512-65 ;!HARDCODE
LDIR
;
POP HL ; áâ à訩 ­®¬¥à ᥪâ®à 
EXX
POP HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
.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
; [x] optimization
LD A,(HL)
OR A
JR Z,.skip_clean
;
LD DE,CORE_BUFFERS.SECBUF+1
LD BC,511 ;!HARDCODE
LD (HL),0
LDIR
.skip_clean: ;
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
;