Estex-DSS/DSS/API/MkDir.asm
2025-07-05 03:01:44 +10:00

199 lines
4.4 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
.B: PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
CALL .START
PUSH AF
;Current Dir
LD HL,CORE_BUFFERS.CurrentDirectory
CALL CHDIR
POP AF
RET
;
.START: CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER
RET C
;
CALL MASK
RET C
;!TEST optimization à ­¥¥ SetPath_GetName 㦥 § £à㧨« ¤¨à¥ªâ®à¨î
;CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;
;[ ] cdfs
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
;
XOR A ; 㬥­ìè¨âì
CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo
;
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
LD HL,CORE_BUFFERS.MASKARE
LD DE,CORE_BUFFERS.HANDBUF
LD BC,11
LDIR
EX DE,HL
LD A,FAT_ATTR.DIRECTORY ;  âਡãâ § ¯¨á¨ ª â «®£ 
; FAT_DIRECTORY_RECORD.ATTRIBUT
LD (HL),A
INC HL
LD BC,#0800 ; b=áç¥â稪
;
.loop1: LD (HL),C
INC HL
DJNZ .loop1
; FAT_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
; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L
LD (HL),E
INC HL
LD (HL),D
INC HL
; FAT_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.SECTOR_BUFFER ; ¡ãä¥à
LD (HL),"." ; § ¯¨áì ⥪. ª â «®£ 
LD BC,10*256 + ' ' ; !HARDCODE b=áç¥â稪, c=¯à®¡¥«
;
.loop3: INC HL
LD (HL),C
DJNZ .loop3
; ᪮¯¨à®¢ âì ¡ ©âë 11..31 FAT_DIRECTORY_RECORD
INC HL
LD DE,CORE_BUFFERS.HANDBUF+FAT_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 + FAT_DIRECTORY_RECORD.ATTRIBUT ;  âਡãâë § ¯¨á¨
;
LD A,(DIRPAGE.buffer)
CP "."
JR Z,.copy_dir_record
;
;LD IX,HANDBUF
XOR A
LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A
LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A
LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A
LD (CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A
LD DE,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT ; ï祩ª   âਡã⮢ ä ©« 
.copy_dir_record:
EX DE,HL
LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_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 ;!FIXIT ; [ ] sector size
LDIR
;
POP HL ; áâ à訩 ­®¬¥à ᥪâ®à 
EXX
POP HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
.MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤
PUSH IX ; ­®¬¥à «®£. ᥪâ®à 
;
CALL WRITE_SECTOR
; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã
;
LD HL,CORE_BUFFERS.SECTOR_BUFFER
; [x] optimization
LD A,(HL)
OR A
JR Z,.skip_clean
;
LD DE,CORE_BUFFERS.SECTOR_BUFFER+1
LD BC,511 ;!HARDCODE ;!FIXIT ; [ ] sector size
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
;