CORE: начал делать FSinfo free clusters count

SHELL: команда DIR правильно определяет размеры
This commit is contained in:
Anatoliy Belyanskiy 2024-04-29 06:14:56 +10:00
parent ebeb859eb1
commit a904026a45
11 changed files with 880 additions and 722 deletions

View File

@ -130,28 +130,48 @@ DISKINF: LD C,B
POP BC POP BC
RET C RET C
; ;
.CheckFreeSpace: .CheckFreeSpace:; ¥á«¨ GetFreeSpace ­¥ ¢ë§ë¢ ¥âáï
XOR A XOR A
OR B OR B
LD A,#FF
LD B,A
LD C,A
EXX
LD B,A
LD C,A
EXX
CALL NZ,.GetFreeSpace CALL NZ,.GetFreeSpace
; ;
;.FRESP2: ;.FRESP2:
LD D,B ; A = 0 if B != 0 before .GetFreeSpace
LD E,C ;
LD H,B
LD L,C
; LD DE,2
; SBC HL,DE
EX DE,HL
EXX
LD H,B
LD L,C
; LD DE,2
; SBC HL,DE
EX DE,HL
EXX
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
DEC HL DEC HL
; fat 32 ; fat 32
EXX EXX
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh)
JR NC,.skip_dec_hl
DEC HL DEC HL
EXX .skip_dec_hl: EXX
LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
AND A AND A
RET RET
; ;
.GetFreeSpace: XOR A .GetFreeSpace: XOR A
LD HL,2 ; [ ] fat32 ? ­®¬¥à ª« áâ¥à  ®â ª®â®à®£® áç¨â âì LD HL,2 ; fat32 ­®¬¥à ª« áâ¥à  ®â ª®â®à®£® áç¨â âì
; fat32 ; fat32
EXX EXX
LD H,A LD H,A
@ -181,6 +201,7 @@ DISKINF: LD C,B
OR E OR E
OR D OR D
JR NZ,.skip JR NZ,.skip
;
INC BC INC BC
LD A,B LD A,B
OR C OR C
@ -188,6 +209,7 @@ DISKINF: LD C,B
EXX EXX
INC BC INC BC
EXX EXX
;
.skip: INC HL .skip: INC HL
LD A,L LD A,L
OR H OR H
@ -195,7 +217,7 @@ DISKINF: LD C,B
EXX EXX
INC HL INC HL
EXX EXX
JR .loop_free_space JP .loop_free_space
; ;
; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®© ; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
.mCOPY_LOOP: LD B,0 .mCOPY_LOOP: LD B,0

View File

@ -12,16 +12,22 @@
; á¡à á뢠¥â §­ ç¥­¨¥ ᢮¡®¤­ëå ª« áâ¥à®¢ ­  "­¥®¯à¥¤¥«¥­®" ; á¡à á뢠¥â §­ ç¥­¨¥ ᢮¡®¤­ëå ª« áâ¥à®¢ ­  "­¥®¯à¥¤¥«¥­®"
; ¬¥­ï¥â §­ ç¥­¨¥ ¯¥à¢®£® ᢮¡®¤­®£® ª« áâ¥à  ; ¬¥­ï¥â §­ ç¥­¨¥ ¯¥à¢®£® ᢮¡®¤­®£® ª« áâ¥à 
SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
RET NZ
;
LD A,(CORE_BUFFERS.FatBuffer.UPD_FSINFO)
OR A OR A
RET Z RET Z
; ;
;!TODO ä®à¬¨à®¢ âì á ¬®¬ã ¢ ¡ãä¥à
CALL READ_FSinfo CALL READ_FSinfo
; ;
;!TODO FREE_CLUSTERS_COUNT ;!TODO FREE_CLUSTERS_COUNT
LD HL,#FFFF LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L)
LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL
LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H)
LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2),HL
; FIRST_FREE_CLUSTER ; FIRST_FREE_CLUSTER
LD HL,(G_CLUST.low) LD HL,(G_CLUST.low)
LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL
@ -29,7 +35,7 @@ SET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO)
LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL
; ;
XOR A XOR A
LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A
JR WRITE_FSinfo JR WRITE_FSinfo
; ; ; ;
; <20>à®ç¨â âì BPB ¢ SECTOR_BUFFER ; <20>à®ç¨â âì BPB ¢ SECTOR_BUFFER
@ -831,7 +837,7 @@ RD_BPB: ; LD C,SLOT3
PUSH HL ; Total Sectors low PUSH HL ; Total Sectors low
SBC HL,DE SBC HL,DE
; ;
.HDDBIG: CALL ClusterToSector .HDDBIG: CALL SectorToCluster
; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
; SCF ; SCF
; .loop7: RRA ; .loop7: RRA
@ -938,8 +944,8 @@ RD_BPB: ; LD C,SLOT3
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL
LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC
;
CALL ClusterToSector CALL CLUSTER_TO_SECTOR
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC
; ;
@ -1007,7 +1013,7 @@ RD_BPB: ; LD C,SLOT3
DJNZ .fsinfo_loop DJNZ .fsinfo_loop
; ;
.error_sig: XOR #FF .error_sig: XOR #FF
LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A
; ;
XOR A XOR A
LD H,A LD H,A
@ -1030,27 +1036,32 @@ RD_BPB: ; LD C,SLOT3
LD DE,#6141 LD DE,#6141
SBC HL,DE SBC HL,DE
JR NZ,.error JR NZ,.error
; FIRST_FREE_CLUSTER ;!TODO FREE_CLUSTERS_COUNT
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT)
LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2)
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
; CF = 0 ; CF = 0
;!TODO MaxCluster - ¬ ªá¨¬ «ì­® ¤®¯ãáâ¨¬ë© ¨«¨ ­  1 ¡®«ìè¥ ¬ ªá¨¬ «ì­® ¤®¯ãá⨬®£®? CALL .check_cluster
SBC HL,BC JR NC,.skip_FFFF
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) ;
SBC HL,DE LD B,#FF
LD C,B
LD D,B
LD E,B
;
.skip_FFFF: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),BC
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),DE
;
; FIRST_FREE_CLUSTER
LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER)
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2)
; CF = 0
CALL .check_cluster
JR C,.error JR C,.error
; ;
LD (G_CLUST.high),DE LD (G_CLUST.high),DE
LD (G_CLUST.low),BC LD (G_CLUST.low),BC
;!TODO FREE_CLUSTERS_COUNT
;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT)
;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL
;LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2)
;LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL
;
XOR A XOR A
.error: LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A .error: LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A
RET Z RET Z
;!TODO FREE_CLUSTERS_COUNT ;!TODO FREE_CLUSTERS_COUNT
;LD HL,#FFFF ;LD HL,#FFFF
@ -1064,12 +1075,19 @@ RD_BPB: ; LD C,SLOT3
LD L,H LD L,H
LD (G_CLUST.high),HL LD (G_CLUST.high),HL
RET RET
;
;!TODO MaxCluster - ¬ ªá¨¬ «ì­® ¤®¯ãáâ¨¬ë© ¨«¨ ­  1 ¡®«ìè¥ ¬ ªá¨¬ «ì­® ¤®¯ãá⨬®£®?
.check_cluster: LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
SBC HL,BC
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh)
SBC HL,DE
RET
ENDIF ENDIF
;;;;;;;; ;;;;;;;;
; --> BC:HL - Cluster ; --> BC:HL - Sector
; <-- BC:HL - Sector ; <-- BC:HL - Cluster
ClusterToSector: SectorToCluster:
LD A,B LD A,B
AND #0F AND #0F
LD B,A LD B,A

View File

@ -16,7 +16,7 @@
; “¤ «ï¥â § ¯¨áì ¢ ª â «®£¥ ¨ ®á¢®¡®¦¤ ¥â § ­ïâãî æ¥¯®çªã ª« áâ¥à®¢ ; “¤ «ï¥â § ¯¨áì ¢ ª â «®£¥ ¨ ®á¢®¡®¦¤ ¥â § ­ïâãî æ¥¯®çªã ª« áâ¥à®¢
; ‚室: IX - 㪠§ â¥«ì ­  㤠«ï¥¬ãî § ¯¨áì ¢ DIRPAGE ; ‚室: IX - 㪠§ â¥«ì ­  㤠«ï¥¬ãî § ¯¨áì ¢ DIRPAGE
;!TODO record index. ¢®§¬®¦­®, çâ® ¬®¦¥â á«®¬ âìáï, ¥á«¨ ¡®«ìè¥ áâà ­¨æë ;!TODO record index. ¢®§¬®¦­®, çâ® ¬®¦¥â á«®¬ âìáï, ¥á«¨ ¡®«ìè¥ áâà ­¨æë
DELETE_REC_FAT: SET_PAGE_X DIRPAGE: DELETE_REC_FAT: SET_PAGE_X DIRPAGE
EX AF,AF' EX AF,AF'
CALL DELETE_LFN_RECORDS ; [x] 㤠«¥­¨¥ § ¯¨á¨ LFN CALL DELETE_LFN_RECORDS ; [x] 㤠«¥­¨¥ § ¯¨á¨ LFN
LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©«  LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©« 
@ -68,6 +68,7 @@ DELETE_REC_FAT: SET_PAGE_X DIRPAGE:
; ‚室: HL':HL - cluster ; ‚室: HL':HL - cluster
; ¯®àâ¨â DE, BC' ¨ A ; ¯®àâ¨â DE, BC' ¨ A
; [x] à ­ìè¥ ¡ë« è ­á 㯥à¥âìáï ¢ "DISK FULL" ¥á«¨ G_CLUST 㪠§ë¢ « ­  ª« áâ¥à ¤ «ìè¥, 祬 ¤à㣮© ᢮¡®¤­ë© ; [x] à ­ìè¥ ¡ë« è ­á 㯥à¥âìáï ¢ "DISK FULL" ¥á«¨ G_CLUST 㪠§ë¢ « ­  ª« áâ¥à ¤ «ìè¥, 祬 ¤à㣮© ᢮¡®¤­ë©
; [ ] free clusters for FSInfo
SET_NEW_FREE_CLUSTER: SET_NEW_FREE_CLUSTER:
XOR A XOR A
;LD B,D ;LD B,D
@ -138,16 +139,62 @@ G_CLUST: ;
LD (G_CLUST.high),HL LD (G_CLUST.high),HL
EXX EXX
INC A INC A
LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A
; [ ] free clusters for FSInfo
; XOR A ; 㬥­ìè¨âì
; CALL SET_NEW_FREE_CLUSTERS
RET RET
; ‚室: A - 㬥­ìè¨âì (0) ¨«¨ 㢥«¨ç¨âì (!0) ç¨á«® ᢮¡®¤­ëå ª« áâ¥à®¢
SET_NEW_FREE_CLUSTERS:
PUSH HL
EXX
PUSH HL
LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H)
EXX
LD HL,(CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L)
;
OR A
JR Z,.dec_clusters
; inc clusters
INC HL
LD A,H
OR L
JR NZ,.set_new
EXX
INC HL
EXX
;
.set_new: LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL
EXX
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL
POP HL
EXX
POP HL
LD A,1
LD (CORE_BUFFERS.FatBuffer.UPD_FSINFO),A
RET
;
.dec_clusters: LD A,H
OR L
DEC HL
JR NZ,.set_new
EXX
DEC HL
EXX
JP .set_new
; ;
; ;
; [x] fat32 ;!TEST ; [x] fat32 ;!TEST
; <20>ਪ९¨âì ª ¯®á«¥¤­¥¬ã ª« áâ¥àã æ¥¯®çª¨ ­®¢ë© ¯ãá⮩ ª« áâ¥à ; <20>ਪ९¨âì ª ¯®á«¥¤­¥¬ã ª« áâ¥àã æ¥¯®çª¨ ­®¢ë© ¯ãá⮩ ª« áâ¥à
; ‚室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨âì ¯ãá⮩ ; ‚室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨âì ¯ãá⮩
; ‚ë室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨«áï ¯ãá⮩ ; ‚ë室: HL':HL - ­®¬¥à ª« áâ¥à  ª ª®â®à®¬ã ¯à¨ªà¥¯¨«áï ¯ãá⮩
; DE':DE - ­®¬¥à ¯ãá⮣® ª« áâ¥à  ; DE':DE - ­®¬¥à ¯ãá⮣® ª« áâ¥à 
INC_FAT: PUSH HL ; ⥪ã騩 ª« áâ¥à INC_FAT: ; [ ] free clusters for FSInfo
;
;
PUSH HL ; ⥪ã騩 ª« áâ¥à
EXX EXX
PUSH HL ; ⥪ã騩 ª« áâ¥à PUSH HL ; ⥪ã騩 ª« áâ¥à
EXX EXX
@ -210,7 +257,7 @@ CHECK_CLUSTER_IS_SMALLER:
LD A,DSS_Error.sys.DISK_FULL LD A,DSS_Error.sys.DISK_FULL
RET C RET C
RET NZ RET NZ
; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à  ; ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL .low: EX DE,HL
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
SBC HL,DE SBC HL,DE
@ -585,9 +632,7 @@ WRITE_FAT_TABLE:
OUT (SLOT3),A OUT (SLOT3),A
RET RET
; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª ; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª
.Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) .Start: CALL SET_FSInfo
CP FAT_TYPE.x32
CALL Z,SET_FSInfo
LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock)
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
CALL GET_SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT

View File

@ -172,9 +172,14 @@ FDDRIVE:
.STAT: XOR A .STAT: XOR A
RET RET
;!FIXIT ¯à®¢¥àïâì ƒ93 ª®£¤  íâ® áâ ­¥â ¢®§¬®¦­ë¬
.CHEK: LD A,#FF .CHEK: ;!FIXIT ¯à®¢¥àïâì ƒ93 ª®£¤  íâ® áâ ­¥â ¢®§¬®¦­ë¬
AND A IF NON_REMOVABLE_FDD
XOR A
ELSE
LD A,#FF
OR A
ENDIF
RET RET
;DE - ADDRESS ;DE - ADDRESS

View File

@ -103,7 +103,7 @@
.FSINFO_Sector WORD #01 .FSINFO_Sector WORD #01
.BPB_SERIAL_NUMBER DWORD #00000000 .BPB_SERIAL_NUMBER DWORD #00000000
.BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS .BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
.RESET_FSINFO BYTE 0 .UPD_FSINFO BYTE 0
; IF USE_FSINFO_FAT32 ; IF USE_FSINFO_FAT32
;.FREE_CLUSTERS_COUNT_L WORD #FFFF ;.FREE_CLUSTERS_COUNT_L WORD #FFFF
;.FREE_CLUSTERS_COUNT_H WORD #FFFF ;.FREE_CLUSTERS_COUNT_H WORD #FFFF

View File

@ -1 +1 @@
982 978

View File

@ -102,6 +102,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26
DEFINE EnoughtOnly_LF 0 DEFINE EnoughtOnly_LF 0
DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55
DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - â®à¬®§­¥¥, ­® ¡¥§®¯ á­¥¥ DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - â®à¬®§­¥¥, ­® ¡¥§®¯ á­¥¥
DEFINE NON_REMOVABLE_FDD 0
; ;
;-------------------[MEMORY]-------------------------; ;-------------------[MEMORY]-------------------------;
DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82

View File

@ -3,22 +3,19 @@
; DIR. ‚뢮¤ ᯨ᪠ ä ©«®¢ ¨ ¯ ¯®ª ; DIR. ‚뢮¤ ᯨ᪠ ä ©«®¢ ¨ ¯ ¯®ª
; ;
;/////////////////////////////////////////////////// ;///////////////////////////////////////////////////
cmd_dir: cmd_dir: push de
push de
;;;; [ ] ¯®¤¤¥à¦ª  ¯ à ¬¥â஢ ;;;; [ ] ¯®¤¤¥à¦ª  ¯ à ¬¥â஢
; § ­ã«ï¥¬ ¢á¥ ¯ à ¬¥âàë ­  áâ à⥠; § ­ã«ï¥¬ ¢á¥ ¯ à ¬¥âàë ­  áâ àâ¥
xor a xor a
ld (read_disk_info.full),a ld (read_disk_info.full),a
ld (.key_p),a ld (.key_p),a
; ¢ë¯®«­ï¥¬/­ áâà ¨¢ ¥¬ ¢á¥ ­ ©¤¥­­ë¥ ¯ à ¬¥âàë ¢ áâப¥ ; ¢ë¯®«­ï¥¬/­ áâà ¨¢ ¥¬ ¢á¥ ­ ©¤¥­­ë¥ ¯ à ¬¥âàë ¢ áâப¥
LD C,256-3 ;!HARDCODE ¤«¨­  áâப¨ á ª®¬ ­¤®© LD C,256-3 ;!HARDCODE ¤«¨­  áâப¨ á ª®¬ ­¤®©
.parse: ld hl,cmd_dir_options .parse: ld hl,cmd_dir_options
call RUN_OPTION call RUN_OPTION
jr nc,.end_opt jr nc,.end_opt
jp (hl) jp (hl)
.end_opt: .end_opt: ; ¢ë¢®¤¨¬ áâப㠮 à áçñ⥠᢮¡®¤­®£® ¬¥áâ  â ª, ç⮡ ®­  § âñà« áì
; ¢ë¢®¤¨¬ áâப㠮 à áçñ⥠᢮¡®¤­®£® ¬¥áâ  â ª, ç⮡ ®­  § âñà« áì
ld a,(read_disk_info.full) ld a,(read_disk_info.full)
and a and a
jr z,.skip jr z,.skip
@ -32,12 +29,15 @@ cmd_dir:
call read_disk_info ; ¯à®ç¨â âì ¬¥âªã ¨ á¥à¨©­ë© ­®¬¥à ¤¨áª  call read_disk_info ; ¯à®ç¨â âì ¬¥âªã ¨ á¥à¨©­ë© ­®¬¥à ¤¨áª 
; ;
pop de pop de
ld hl,0 xor a
ld (D88DC),hl ld h,a
ld (D88DE),hl ld l,a
ld (D88E0),hl ld (FILES),hl
ld (dir_number),hl ld (dir_number),hl
ld (S_LOW),hl
ld (S_MED),hl
ld (S_HIGH),a
;
ex de,hl ex de,hl
ld de,work_buffer1 ; 80 ld de,work_buffer1 ; 80
ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨ ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
@ -45,19 +45,19 @@ cmd_dir:
; ;
ld a,(work_buffer1) ld a,(work_buffer1)
or a or a
jr nz,1F ; § ¤ ­  ¬ áª  ¨¬¥­ jr nz,.skipMask ; § ¤ ­  ¬ áª  ¨¬¥­
; ;
ld hl,mask_fname ; "*.*" ld hl,mask_fname ; "*.*"
ld de,work_buffer1 ld de,work_buffer1
call copy_string call copy_string
; [ ] 1/10/23 ; [ ] 1/10/23
1: ld hl,work_buffer1 ; ¨¬ï ä ©«  .skipMask: ld hl,work_buffer1 ; ¨¬ï ä ©« 
ld de,work_buffer1 ; 80 ¡ãä¥à ld de,work_buffer1 ; 80 ¡ãä¥à
ld a,FAT_ATTR.NoVolID ;  âਡãâ (¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ ) ld a,FAT_ATTR.NoVolID ;  âਡãâ (¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ )
ld bc,Dss.F_First.FATname ; f_first (ä®à¬ â 11) ld bc,Dss.F_First.FATname ; f_first (ä®à¬ â 11)
RST ToDSS RST ToDSS
JR C,.dir_empty ;R14 JR C,.Dir_Empty ;R14
CALL .Print_Header CALL Print_Header
; ;
LD A,32-5 ; ª®«¨ç¥á⢮ áâப ¤® ®¦¨¤ ­¨ï ª« ¢¨è¨ (á ¢ëç¥â®¬ § £®«®¢ª ) ;!HARDCODE LD A,32-5 ; ª®«¨ç¥á⢮ áâப ¤® ®¦¨¤ ­¨ï ª« ¢¨è¨ (á ¢ëç¥â®¬ § £®«®¢ª ) ;!HARDCODE
PUSH AF PUSH AF
@ -76,21 +76,18 @@ cmd_dir:
;jr nz,.skip_esc ;jr nz,.skip_esc
;xor a ;xor a
;ld (.key_p),a ; ®â¬¥­ï¥¬ ESC ;ld (.key_p),a ; ®â¬¥­ï¥¬ ESC
.skip_esc: .skip_esc: ld a,32-1
ld a,32-1 .skip_wait: PUSH AF
.skip_wait:
PUSH AF
;
ld hl,work_buffer1+33 ; 80 ld hl,work_buffer1+33 ; 80
;push af ;push af
;ld de,33 ;ld de,33
;add hl,de ;add hl,de
call A88E2 call PRNNAME
; ;
ld ix,work_buffer1 ; 80 ld ix,work_buffer1 ; 80
ld a,(ix+32) ;  âਡãâ ⥪. § ¯¨á¨ ld a,(ix+32) ;  âਡãâ ⥪. § ¯¨á¨
and FAT_ATTR.DIRECTORY ; ¯ ¯ª  ? and FAT_ATTR.DIRECTORY ; ¯ ¯ª  ?
jr z,.calc_size ; ­¥â jr z,.Calc_Size ; ­¥â
; áç¨â ¥¬ ¯ ¯ª¨ ; áç¨â ¥¬ ¯ ¯ª¨
; ­¥ áç¨â ¥¬ ¯ ¯ª®© á«ã¦¥¡­ë¥ "." ¨ ".." ; ­¥ áç¨â ¥¬ ¯ ¯ª®© á«ã¦¥¡­ë¥ "." ¨ ".."
ld d,(ix+33) ld d,(ix+33)
@ -110,59 +107,59 @@ cmd_dir:
inc hl inc hl
ld (dir_number),hl ld (dir_number),hl
jr .next jr .next
;;R14 ;;R14
.dir_empty: .Dir_Empty: push af
push af CALL Print_Header
CALL .Print_Header
pop af pop af
CALL print_err_message CALL print_err_message
jr .print jr .print
;;R14 ;;R14
; ¯à¨¡ ¢¨âì à §¬¥à ⥪. ä ©«  ; ¯à¨¡ ¢¨âì à §¬¥à ⥪. ä ©« 
.calc_size: .Calc_Size: ld hl,(FILES)
ld hl,(D88DC)
inc hl inc hl
ld (D88DC),hl ld (FILES),hl
ld e,(ix+30) ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2)
ld d,(ix+31) ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3)
ld hl,(D88E0) ld hl,(S_MED)
ld a,(S_HIGH)
exx exx
ld e,(ix+28) ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE)
ld d,(ix+29) ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1)
ld hl,(D88DE) ld hl,(S_LOW)
add hl,de add hl,de
ld (S_LOW),hl
exx exx
adc hl,de adc hl,de
exx ld (S_MED),hl
ld (D88DE),hl ;exx
exx adc a,0
ld (D88E0),hl ld (S_HIGH),a
;exx
.next: ld de,work_buffer1 ; 80 ¡ãä¥à .next: ld de,work_buffer1 ; 80 ¡ãä¥à
ld c,Dss.F_Next ; ¯®¨áª á«¥¤. ld c,Dss.F_Next ; ¯®¨áª á«¥¤.
RST ToDSS RST ToDSS
jp nc,.loop ; ­ § ¤ ¢ 横«, ¥á«¨ ­¥ ª®­¥æ ᯨ᪠ jp nc,.loop ; ­ § ¤ ¢ 横«, ¥á«¨ ­¥ ª®­¥æ ᯨ᪠
;
pop af ; ¡ « ­á á⥪  pop af ; ¡ « ­á á⥪ 
; „¥áïâ¨ç­ë© ¢ë¢®¤ ; „¥áïâ¨ç­ë© ¢ë¢®¤
.print: ld hl,(D88DC) .print: ld hl,(FILES)
ld ix,PRM1 ; ¡ãä¥à ld ix,PRM3 ; ª®«¨ç¥á⢮ ä ©«®¢
call PDIGIT call PDIGIT
; ;
ld hl,(D88DE) ; ¬«. à §àï¤ ld a,(S_HIGH)
exx ld hl,(S_MED) ; áâ. à §àï¤
ld hl,(D88E0) ; áâ. à §àï¤
exx exx
ld hl,(S_LOW) ; ¬«. à §àï¤
;exx
; ;
CALL Size2Char ;CALL PRINT_DWORD
;;;;;;;;;;;;; CALL PRINT_5BYTES
; ;
; [ ] ¢ë¢®¤ ª®«¨ç¥á⢠ ¯ ¯®ª ; [ ] ¢ë¢®¤ ª®«¨ç¥á⢠ ¯ ¯®ª
; [ ] ¢ë¢®¤ ®¡é¥£® ª®«¨ç¥á⢠ ᢮¡®¤­®£® ¬¥áâ  ; [x] ¢ë¢®¤ ®¡é¥£® ª®«¨ç¥á⢠ ᢮¡®¤­®£® ¬¥áâ 
ld hl,T8B46 ; "0 000 000 000" ld hl,SIZE_BUFFER.high ; "000 000 000 000"
ld de,PRM2 ; ªã¤  ld de,PRM1; + PRM2 ; à §¬¥à ä ©«®¢ ¢ ª â «®£¥
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢. ld bc,SIZE_BUFFER.bytes
call ncopy_string.start ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá. SIZE_BUFFER.bytes ᨬ¢.
; ;
;!TEST ;!TEST
;ld hl,(dir_number) ;ld hl,(dir_number)
@ -170,7 +167,7 @@ cmd_dir:
;call hex2dec_ascii_16bit.n10000 ;call hex2dec_ascii_16bit.n10000
; „¥áïâ¨ç­ë© ¢ë¢®¤ ; „¥áïâ¨ç­ë© ¢ë¢®¤
ld hl,(dir_number) ld hl,(dir_number)
ld ix,PRM3 ; ¡ãä¥à ld ix,PRM4 ; ª®«-¢® ª â «®£®¢ ¢ ª â «®£¥
call PDIGIT call PDIGIT
;xor a ;xor a
;ld (de),a ;ld (de),a
@ -181,31 +178,28 @@ cmd_dir:
;ld hl,has_not_full_info ;ld hl,has_not_full_info
;JR Z,.skip_full_space ;JR Z,.skip_full_space
; ;
ld hl,(free_space_low) ; ¬«. à §àï¤ ld de,MAIN_MSG.DIR_2 ; ¨­¤¥ªá " %1 file(s), %2 bytes, %3 Dir(s)"
exx
ld hl,(free_space_medium) ; áâ. à §àï¤
;!FIXIT ¨á¯®«ì§®¢ âì áâ à訩 à §àï¤! free_space_high
exx
CALL Size2Char
ld hl,T8B46 ; "0 000 000 000"
;
;.skip_full_space:
ld de,PRM4 ; ªã¤ 
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
;
;
ld de,MAIN_MSG.DIR_2 ; ¨­¤¥ªá " %1 file(s) %2 bytes"
CALL MESSAGE ; ¢ë¢¥á⨠áâபã CALL MESSAGE ; ¢ë¢¥á⨠áâபã
;
ld a,(read_disk_info.full) ld a,(read_disk_info.full)
and a and a
ld de,MAIN_MSG.DIR_4 ; ld de,MAIN_MSG.CRLF
jp nz,MESSAGE jp z,MESSAGE
ld de,MAIN_MSG.CRLF ; ;
ld a,(free_space_high)
ld hl,(free_space_medium) ; áâ. à §àï¤
exx
ld hl,(free_space_low) ; ¬«. à §àï¤
;exx
call PRINT_5BYTES
ld hl,SIZE_BUFFER.high ; "000 000 000 000"
ld de,PRM1 ; and PRM2 ; ªã¤ 
ld bc,SIZE_BUFFER.bytes
call ncopy_string.start ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá. SIZE_BUFFER.bytes ᨬ¢.
ld de,MAIN_MSG.DIR_4 ; ¨­¤¥ªá " %6 bytes free"
jp MESSAGE jp MESSAGE
;
Print_Header: ; %1
.Print_Header:
; %1
ld hl,PRM1 ld hl,PRM1
ld a,'"' ld a,'"'
ld (hl),a ld (hl),a
@ -230,11 +224,9 @@ cmd_dir:
ld de,MAIN_MSG.DIR_1 ; ¨­¤¥ªá "Volume in drive %1..." ld de,MAIN_MSG.DIR_1 ; ¨­¤¥ªá "Volume in drive %1..."
JP MESSAGE ; ¢ë¢¥á⨠áâபã JP MESSAGE ; ¢ë¢¥á⨠áâபã
; ;
;
; <20>®¤£®â®¢¨âì áâபã ᯨ᪠ ä ©«®¢/¯ ¯®ª ; <20>®¤£®â®¢¨âì áâபã ᯨ᪠ ä ©«®¢/¯ ¯®ª
A88E2: PRNNAME: dec hl
dec hl
ld a,(hl) ld a,(hl)
and FAT_ATTR.DIRECTORY and FAT_ATTR.DIRECTORY
call z,.set_small call z,.set_small
@ -251,9 +243,9 @@ A88E2:
ldi ldi
ld (de),a ld (de),a
ld ix,work_buffer1 ld ix,work_buffer1
call A89A4 ; ¢ë¢¥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>) call PRNSIZE ; ¢ë¢¥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>)
call A89FA ; ¢ë¢¥á⨠¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨ call PRNDATE ; ¢ë¢¥á⨠¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
call A8A19 ; ¢ë¢¥á⨠¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨ call PRNTIME ; ¢ë¢¥á⨠¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
ld de,MAIN_MSG.DIR_3 ; ¨­¤¥ªá "%1 %2 %3 %4 %5" ld de,MAIN_MSG.DIR_3 ; ¨­¤¥ªá "%1 %2 %3 %4 %5"
jp MESSAGE ; ¢ë¢®¤ áâப¨ jp MESSAGE ; ¢ë¢®¤ áâப¨
; ;
@ -272,33 +264,33 @@ A88E2:
jr c,.next jr c,.next
cp 'Ÿ'+1 ;#9F + 1 cp 'Ÿ'+1 ;#9F + 1
jr nc,.next jr nc,.next
.letter: ;
or %0010'0000 .letter: or %0010'0000
ld (hl),a ld (hl),a
.next: djnz .loop .next: djnz .loop
ex de,hl ex de,hl
ret ret
; ‚뢥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>) ; ‚뢥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>)
A89A4: ld a,(ix+32) PRNSIZE: ld a,(ix+32)
ld hl,T8B38 ; "<DIR> " ld hl,DIRIDD ; "<DIR> "
and FAT_ATTR.DIRECTORY ; ¯ ¯ª  ? and FAT_ATTR.DIRECTORY ; ¯ ¯ª  ?
jr nz,A89F4 ; ¤  jr nz,.PRZ ; ¤ 
ld l,(ix+28) ; ¬«. à §àï¤ ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE) ; ¬«. à §àï¤
ld h,(ix+29) ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1)
exx exx
ld l,(ix+30) ; áâ. à §àï¤ ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2) ; áâ. à §àï¤
ld h,(ix+31) ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3)
exx exx
push ix push ix
call MAKE_LN ; ¤¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤ call MAKE_LN ; ¤¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
ld hl,T8B37 ld hl,L32BIT_.end
ld a,(hl) ld a,(hl)
cp " " cp " "
jr nz,A89CD jr nz,.not_zero
ld a,"0" ld a,"0"
ld (hl),a ld (hl),a
A89CD: ld de,T8B46 ; "0 000 000 000" .not_zero: ld de,SIZE_BUFFER.low ; "0 000 000 000"
ld hl,L32BIT_ ; "0000000000" ld hl,L32BIT_ ; "0000000000"
ldi ldi
ld a," " ld a," "
@ -317,46 +309,43 @@ A89CD: ld de,T8B46 ; "0 000 000 000"
ldi ldi
ldi ldi
ldi ldi
ld hl,T8B46 ; "0 000 000 000" ld hl,SIZE_BUFFER.low ; "0 000 000 000"
pop ix pop ix
A89F4: ld de,PRM3 ; 16 ¡ãä¥à .PRZ: ld de,PRM3 ; 16 ¡ãä¥à
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢. jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨ ; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
A89FA: ld b,(ix+25) PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE)
ld c,(ix+24) ld b,(ix+FAT_DIRECTORY_RECORD.DATE+1)
ld hl,T8B46 ; "0 000 000 000" ld hl,SIZE_BUFFER.low ; "0 000 000 000"
call A8A53 ; ¢ë¢®¤ ¢ ¡ãä¥à ¤ âë call MAKE_DATE ; ¢ë¢®¤ ¢ ¡ãä¥à ¤ âë
ld (hl),0 ld (hl),0
ld hl,T8B46 ; "0 000 000 000" ld hl,SIZE_BUFFER.low ; "0 000 000 000"
ld de,PRM4 ; 16 ªã¤  ld de,PRM4 ; 16 ªã¤ 
ld a,(hl) ; ld a,(hl)
cp "0" ; cp "0"
jr nz,$+4 ; jr nz,$+4
ld (hl)," " ; ld (hl)," "
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢. jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨ ; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
A8A19: ld b,(ix+22) PRNTIME: ld b,(ix+22)
ld c,(ix+23) ld c,(ix+23)
ld hl,T8B46 ; "0 000 000 000" ld hl,SIZE_BUFFER.low ; "0 000 000 000"
call A8A38 ; ᪮¯¨à. ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨ call MAKE_TIME ; ᪮¯¨à. ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
ld (hl),0 ld (hl),0
ld hl,T8B46 ; "0 000 000 000" ld hl,SIZE_BUFFER.low ; "0 000 000 000"
ld de,PRM5 ; 80 ¡ãä¥à áâப¨ ld de,PRM5 ; 80 ¡ãä¥à áâப¨
ld a,(hl) ; ld a,(hl)
cp "0" ; cp "0"
jr nz,$+4 ; jr nz,$+4
ld (hl)," " ; ld (hl)," "
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢. jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨ ; ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
A8A38: srl c MAKE_TIME: srl c
rr b rr b
srl c srl c
rr b rr b
@ -365,18 +354,17 @@ A8A38: srl c
srl b srl b
srl b srl b
ld a,c ld a,c
call A8A7E call toNumber
ld (hl),":" ; à §¤¥«. ¢à¥¬¥­¨ ld (hl),":" ; à §¤¥«. ¢à¥¬¥­¨
inc hl inc hl
ld a,b ld a,b
jr A8A7E jr toNumber
; ¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨ ; ¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
A8A53: ld a,c MAKE_DATE: ld a,c
and 1Fh and #1F
push bc push bc
call A8A7E call toNumber
ld (hl),"." ; à §¤¥«. ¤ âë ld (hl),"." ; à §¤¥«. ¤ âë
inc hl inc hl
pop bc pop bc
@ -386,21 +374,22 @@ A8A53: ld a,c
rla rla
rla rla
rla rla
and 0Fh and #0F
call A8A7E call toNumber
ld (hl),"." ; à §¤¥«. ¤ âë ld (hl),"." ; à §¤¥«. ¤ âë
inc hl inc hl
ld a,b ld a,b
add a,80 add a,80
cp 100 cp 100
jr c,A8A7E jr c,toNumber
A8A75: sub 100 .loop: sub 100
cp 100 cp 100
jr nc,A8A75 jr nc,.loop
A8A7E: ld c,2Fh ;
inc c toNumber: ld c,#2F
.loop: inc c
sub 10 sub 10
jr nc,$-3 jr nc,.loop
add a,10 add a,10
add a,"0" add a,"0"
ld (hl),c ld (hl),c
@ -412,6 +401,7 @@ A8A7E: ld c,2Fh
;!TODO ¯¥à¥â é¨âì ¢ procedures/math.asm ;!TODO ¯¥à¥â é¨âì ¢ procedures/math.asm
; „¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤ ; „¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
; HL':HL - ç¨á«® ¤«ï ¯¥à¥¢®¤  ; HL':HL - ç¨á«® ¤«ï ¯¥à¥¢®¤ 
; !FIXIT ¬®¦­® ®¡ê¥¤¥­¨âì á PDIGIT
MAKE_LN: ld ix,L32BIT_ ; "0000000000" MAKE_LN: ld ix,L32BIT_ ; "0000000000"
exx exx
ld de,#3B9A ld de,#3B9A
@ -419,7 +409,7 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000"
ld de,#CA00 ld de,#CA00
; DE':DE = 1,000,000,000 ; DE':DE = 1,000,000,000
call GET_DIG call GET_DIG
exx .skip_1: exx
ld de,#05F5 ld de,#05F5
exx exx
ld de,#E100 ld de,#E100
@ -456,7 +446,7 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000"
; DE':DE = 1,000 ; DE':DE = 1,000
call GET_DIG ; 1,000...9,999 call GET_DIG ; 1,000...9,999
exx exx
ld de#00 ld de,#00
exx exx
ld de,#64 ld de,#64
; DE':DE = 100 ; DE':DE = 100
@ -480,14 +470,13 @@ MAKE_LN: ld ix,L32BIT_ ; "0000000000"
inc hl inc hl
jr .KILLZ jr .KILLZ
; ;
.KILLZ2: ld hl,T8B37 ; "0" .KILLZ2: ld hl,L32BIT_.end ; "0"
ld a,(hl) ld a,(hl)
cp d cp d
ret nz ret nz
ld (hl),e ld (hl),e
ret ret
GET_DIG: xor a GET_DIG: xor a
.loop: inc a .loop: inc a
sbc hl,de sbc hl,de
@ -507,20 +496,26 @@ GET_DIG: xor a
ret ret
; ;
D88DC: WORD 0 FILES: WORD 0
D88DE: WORD 0 S_LOW: WORD 0
D88E0: WORD 0 S_MED: WORD 0
S_HIGH: BYTE 0
dir_number: WORD 0 dir_number: WORD 0
free_space_low: WORD 0 free_space_low: WORD 0
free_space_medium: WORD 0 free_space_medium: WORD 0
free_space_high: BYTE 0 free_space_high: BYTE 0
; ;
L40BIT_ db "00"
L32BIT_: db "000000000" L32BIT_: db "000000000"
T8B37: db "0" .end: db "0"
T8B38: db "<DIR> ",0 ;
T8B46: db "0 000 000 000",0 DIRIDD: db "<DIR> ",0
db 0 ;
SIZE_BUFFER:
.high db "00"
.low: db "0 000 000 000",0,0
.bytes equ SIZE_BUFFER - $
; ;
; [x] ⥯¥àì ­¥ «¥§¥â ­ ¯àï¬ãî, ¤¥« ¥â ç¥à¥§ ­®¢ë© ¯ à ¬¥âà ä㭪樨 DskInfo ; [x] ⥯¥àì ­¥ «¥§¥â ­ ¯àï¬ãî, ¤¥« ¥â ç¥à¥§ ­®¢ë© ¯ à ¬¥âà ä㭪樨 DskInfo
@ -545,55 +540,61 @@ read_disk_info: OR #80
LD A,(.full) LD A,(.full)
OR A OR A
JR Z,.no_full_space_option JR Z,.no_full_space_option
;
PUSH BC ; à §¬¥à ᥪâ®à  ¢ ¡ ©â å
EX AF,AF' EX AF,AF'
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; ;
; free_clu_L * clu_size_in_sect ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE
LD C,A
EX AF,AF'
CALL Mult16X8 ; DE*C = A:HL
; A:HL = DE*C
;
; free_clu_H * clu_size_in_sect
EX AF,AF'
EXX EXX
LD C,A LD BC,0
CALL Mult16X8 ; DE*C = A:HL EXX
; A:HL = DE*C SRL B
; max #0FFF'FFFF sectors for LBA28 RR C
EX AF,AF' RRCA
LD D,0 JR C,.loop2
LD E,A ;
ADD HL,DE .loop1: SLA L
RL H
EXX
RL L
RL H
RL B
EXX EXX
; ;
EX DE,HL SLA E
; HL':DE - ᢮¡®¤­ëå ᥪâ®à®¢ RL D
EXX
RL E
RL D
RL C
EXX
; ;
POP BC ; à §¬¥à ᥪâ®à  ¢ ¡ ©â å RRCA
PUSH BC JP NC,.loop1
CALL Mult_16x16 ; DE*BC = HL:DE. ;
.loop2: SLA L
RL H
EXX EXX
POP BC RL L
EX DE,HL RL H
CALL Mult_16x16 ; DE*BC = HL:DE. RL B
LD XH,D
LD XL,E
EXX EXX
EX DE,HL ;
ADD IX,DE SLA E
EX DE,HL RL D
EXX EXX
JR NC,.no_inc_HL RL E
INC L RL D
; ¯®â®¬ã çâ® ­¥ ¤®«¦­® ¡ëâì ¡®«ìè¥ #001F'FFFF'FE00 RL C
; ¯à¨ ᥪâ®à¥ ¢ 512 ¡ ©â®¢ EXX
.no_inc_HL: ; ;
LD A,L SRL B
RR C
JP NC,.loop2
; <-- B':HL'HL, C':DE':DE
;!TODO ¢ë¢®¤¨âì ¯®«­ë© à §¬¥à ¤¨áª 
EXX
LD A,C
LD (free_space_high),A LD (free_space_high),A
LD (free_space_medium),IX LD (free_space_medium),DE
EXX EXX
LD (free_space_low),DE LD (free_space_low),DE
; ;
@ -641,8 +642,7 @@ read_disk_info: OR #80
; cp 2 ; ¬¥­ìè¥ "C:" ? ; cp 2 ; ¬¥­ìè¥ "C:" ?
; jr nc,get_inf_data1 ; ¬¥âª  ¢ BPB ; jr nc,get_inf_data1 ; ¬¥âª  ¢ BPB
.get_label: .get_label: ; ¨é¥¬ ¬¥âªã ¢ ª®à­¥ ”‘ à §¤¥« 
; ¨é¥¬ ¬¥âªã ¢ ª®à­¥ ”‘ à §¤¥« 
; ãáâ. ª®à¥­ì ¤¨áª  ; ãáâ. ª®à¥­ì ¤¨áª 
ld hl,root_path ; "x:\",0 ld hl,root_path ; "x:\",0
ld c,Dss.ChDir ld c,Dss.ChDir
@ -675,21 +675,18 @@ read_disk_info: OR #80
INC HL INC HL
DJNZ .loop DJNZ .loop
POP HL ; á­¨¬ ¥¬ «¨è­¥¥ POP HL ; á­¨¬ ¥¬ «¨è­¥¥
; ­¥â ¬¥âª¨ ; ­¥â ¬¥âª¨
.no_volume_label: .no_volume_label:; %4
; %4
ld hl,volume_string_no ; áâப  ld hl,volume_string_no ; áâப 
ld de,PRM4 ; ªã¤  ld de,PRM4 ; ªã¤ 
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬) call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
XOR A XOR A
LD (PRM5),A LD (PRM5),A
ret ret
.good_label: .good_label: POP HL
POP HL
PUSH HL ; «¨è­¥¥ PUSH HL ; «¨è­¥¥
; ¥áâì ¬¥âª  ; ¥áâì ¬¥âª 
volume_label: volume_label: pop DE ; «¨è­¥¥
pop DE ; «¨è­¥¥
; %5 ; %5
ld de,PRM5 ld de,PRM5
ld bc,11 ;!HARDCODE ¤«¨­  ¬¥âª¨ ld bc,11 ;!HARDCODE ¤«¨­  ¬¥âª¨
@ -703,8 +700,7 @@ volume_label:
ret ret
; ;
; ¥á«¨ ­¥ 㤠«®áì ¯à®ç¨â âì á¥à¨©­ë© ­®¬¥à ¤¨áª  ¨«¨ ä®à¬ â ­¥¨§¢¥á⥭ ; ¥á«¨ ­¥ 㤠«®áì ¯à®ç¨â âì á¥à¨©­ë© ­®¬¥à ¤¨áª  ¨«¨ ä®à¬ â ­¥¨§¢¥á⥭
unknown_serial: unknown_serial: ; á¥à¨©­ë© ­®¬¥à ¤¨áª  - ­¥¨§¢¥á⥭ ;!HARDCODE ­¨¦¥
; á¥à¨©­ë© ­®¬¥à ¤¨áª  - ­¥¨§¢¥á⥭ ;!HARDCODE ­¨¦¥
LD HL,serial_string LD HL,serial_string
LD A,'?' LD A,'?'
LD B,serial_string.Size LD B,serial_string.Size
@ -719,16 +715,13 @@ unknown_serial:
; ¬ áª  ä ©«®¢ ; ¬ áª  ä ©«®¢
mask_fname: mask_fname: db "*.*",0
db "*.*",0
; ª®à¥­ì ¤¨áª  ; ª®à¥­ì ¤¨áª 
root_path: root_path: db 'X:\',0
db 'X:\',0
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª  ; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
serial_string: serial_string: db "xxxx-xxxx"
db "xxxx-xxxx"
.Size equ $-serial_string .Size equ $-serial_string
db 0 ; § ªà뢠誠 db 0 ; § ªà뢠誠
@ -739,8 +732,7 @@ volume_string_yes:
; has_not_full_info: ; has_not_full_info:
; db ' (?)',0 ; db ' (?)',0
; ;
cmd_dir_options: cmd_dir_options:; [ ] ¯ à ¬¥âà /F - ¢ë¢®¤ ª®«¨ç¥á⢠ ᢮¡®¤­®£® ¬¥áâ  ­  ¤¨áª¥ (â®à¬®§¨â, ¯®í⮬㠯 à ¬¥â஬)
; [ ] ¯ à ¬¥âà /F - ¢ë¢®¤ ª®«¨ç¥á⢠ ᢮¡®¤­®£® ¬¥áâ  ­  ¤¨áª¥ (â®à¬®§¨â, ¯®í⮬㠯 à ¬¥â஬)
DB 'f' : DW cmd_dir_freeSpace DB 'f' : DW cmd_dir_freeSpace
DB 'p' : DW cmd_dir_pause DB 'p' : DW cmd_dir_pause
.Size EQU ($-cmd_dir_options)/3 .Size EQU ($-cmd_dir_options)/3
@ -760,7 +752,7 @@ cmd_dir_freeSpace:
; ld (hl),' ' ; ld (hl),' '
; inc hl ; inc hl
; ld (hl),' ' ; ld (hl),' '
;
; áâ ¢¨¬ ®¯æ¨î ¤«ï API DSS DskInfo ; áâ ¢¨¬ ®¯æ¨î ¤«ï API DSS DskInfo
ld a,1 ld a,1
ld (read_disk_info.full),a ld (read_disk_info.full),a
@ -772,22 +764,90 @@ cmd_dir_freeSpace:
;POP DE ;POP DE
jp cmd_dir.parse jp cmd_dir.parse
; ;
cmd_dir_pause: cmd_dir_pause: ld a,#ff
ld a,#ff
ld (cmd_dir.key_p),a ld (cmd_dir.key_p),a
jp cmd_dir.parse jp cmd_dir.parse
/////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////
Size2Char: GET_BIG_DIG: ld b,0
call MAKE_LN ; ¤¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤ and a
ld hl,T8B37 ; "0" .loop: inc b
sbc hl,de
exx
sbc hl,de
exx
sbc a,c
jp nc,.loop
;
exx
rr b
exx
adc hl,de
;
exx
adc hl,de
exx
adc a,c
;
ex af,af'
dec b
ld a,b
add a,"0"
ld (ix+0),a
ex af,af'
inc ix
ret
; stop
PRINT_5BYTES: ld ix,L40BIT_ ; "00"
ld c,#17
exx
ld de,#4876
exx
ld de,#E800
; C:DE':DE = 100,000,000,000
call GET_BIG_DIG
;
ld c,#02
exx
ld de,#540B
exx
ld de,#E400
; C:DE':DE = 10,000,000,000
CALL GET_BIG_DIG
;
ld c,#00
exx
ld de,#3B9A
exx
ld de,#CA00
; C:DE':DE = 1,000,000,000
CALL GET_BIG_DIG
;
; DE':DE = 100,000,000
; HL':HL ¥éñ ­ã¦­ë
PUSH HL
LD HL,L40BIT_
LD B,2 ;!HARDCODE 2 §­ ª 
.loop: LD A,(HL)
CP "0"
jr nz,.not_zero
LD (HL)," "
.not_zero: INC HL
DJNZ .loop
POP HL
CALL MAKE_LN.skip_1
JR PRINT_DWORD.skip_LN
;
PRINT_DWORD: call MAKE_LN ; ¤¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
.skip_LN: ld hl,L32BIT_.end ; "0"
ld a,(hl) ld a,(hl)
cp " " cp " "
jr nz,.not_zero jr nz,.not_zero
ld a,"0" ld a,"0"
ld (hl),a ld (hl),a
.not_zero: .not_zero: ld de,SIZE_BUFFER.high ; "0 000 000 000"
ld de,T8B46 ; "0 000 000 000" ld hl,L40BIT_ ; "0000000000"
ld hl,L32BIT_ ; "0000000000" ldi
ldi
ld a,(hl) ld a,(hl)
ldi ldi
cp " " cp " "
@ -816,6 +876,7 @@ Size2Char:
ldi ldi
ldi ldi
ldi ldi
scf
ret ret
/////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////
@ -825,6 +886,7 @@ Size2Char:
;<3B>à®æ¥¤ãà  ã¬­®¦¥­¨ï (16*8bit) ;<3B>à®æ¥¤ãà  ã¬­®¦¥­¨ï (16*8bit)
;<3B>  ¢å®¤: DE * C ;<3B>  ¢å®¤: DE * C
;<3B>  ¢ë室:A:HL = १ã«ìâ â ;<3B>  ¢ë室:A:HL = १ã«ìâ â
IFUSED Mult32
Mult16X8: SUB A Mult16X8: SUB A
LD L,A LD L,A
LD H,A LD H,A
@ -843,6 +905,7 @@ Mult16X8: SUB A
ADC A,C ADC A,C
.next: DJNZ .loop .next: DJNZ .loop
RET RET
ENDIF
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;<3B>à®æ¥¤ãà  ã¬­®¦¥­¨ï (32bit) ;<3B>à®æ¥¤ãà  ã¬­®¦¥­¨ï (32bit)
@ -871,6 +934,7 @@ Mult32: PUSH IX
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;INPUT : DE * BC ;INPUT : DE * BC
;OUTPUT: HL:DE ;OUTPUT: HL:DE
IFUSED Mult32
Mult_16x16: LD IX,0 Mult_16x16: LD IX,0
LD HL,0 LD HL,0
; ;
@ -898,4 +962,5 @@ Mult_16x16: LD IX,0
.exit: LD D,XH .exit: LD D,XH
LD E,XL LD E,XL
RET RET
ENDIF
/////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////

View File

@ -29,30 +29,34 @@ MAIN_MSG:
stN .CRLF_ : db CR,LF,0; | stN .CRLF_ : db CR,LF,0; |
;________________/ ;________________/
; ;
stN .DIR_1_ : db "Volume in drive %1 %4 %5",CR,LF ; 1 2 3 4 5 6 7
db "Volume Serial Number is %2",CR,LF ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789;
db CR,LF,"Directory of %3",CR,LF,LF,0 stN .DIR_1_ : db "Volume in drive %1 %4 %5\r\n"
stN .VERS_ : db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 db "Volume Serial Number is %2\r\n"
stN .DATE_ : db "Current date: %1, %2",CR,LF,0 ; [x] ¢ë¢®¤ ¤­ï ­¥¤¥«¨ 26/01/2023 DZ "\r\nDirectory of %3\r\n\n"
stN .TIME_ : db "Current time: %1",CR,LF,0 stN .VERS_ : DZ "Estex DSS version %1. Shell version %2.\r\n" ;R13
stN .PAUSE_ : db "Press any key to continue . . .",CR,0 stN .DATE_ : DZ "Current date: %1, %2\r\n" ; [x] ¢ë¢®¤ ¤­ï ­¥¤¥«¨ 26/01/2023
stN .DIR_ESC_ : db 'Command "DIR" aborted by user ',CR,LF,CR,LF,0 stN .TIME_ : DZ "Current time: %1\r\n"
stN .INV_ : db "Invalid parametr",CR,LF,0 stN .PAUSE_ : DZ "Press any key to continue . . .\r"
stN .ECHO_ : db "Echo is %1",CR,LF,0 stN .DIR_ESC_ : DZ "Command 'DIR' aborted by user \r\n\n"
stN .ON_ : db "on",0 stN .INV_ : DZ "Invalid parametr\r\n"
stN .OFF_ : db "off",0 stN .ECHO_ : DZ "Echo is %1\r\n"
stN .DIR_2_ : db " %1 File(s) %2 bytes",CR,LF stN .ON_ : DZ "on"
db " %3 Dir(s) ",0 stN .OFF_ : DZ "off"
stN .DIR_4_ : db "%4 bytes free",CR,LF,0 ; stN .DIR_2_ : db " %3 File(s) %1 byte(s)\r\n"
; db " %3 Dir(s) %4 bytes free",CR,LF,LF,0 ; DZ " %4 Dir(s) "
; : db " %3 Dir(s)",CR,LF,LF,0 ; stN .DIR_4_ : DZ "%1 bytes free\r\n"
stN .DIR_3_ : db "%1 %2 %3 %4 - %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME stN .DIR_2_ : db " %3 File(s)\r %1 byte(s)\r\n"
stN .HELP_ : db "COMMANDS:",CR,LF,CR,LF DZ " %4 Dir(s)"
db "DIR REN | RENAME PATH HELP ",CR,LF stN .DIR_4_ : DZ "\r %1 bytes free\r\n"
db "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF ; stN .DIR_3_ : DZ "%1 %2 %3 %4 - %5\r\n" ;FILENAME EXT SIZE DATE TIME
db "MD | MKDIR TIME ECHO EXIT ",CR,LF stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT
db "RD | RMDIR DATE CLS REBOOT ",CR,LF,LF,0 stN .HELP_ : db "COMMANDS:\r\n"
stN .CALC_ : db "Calculating free space...",CR,0 db "DIR REN | RENAME PATH HELP \r\n"
db "CD | CHDIR DEL | ERASE SET VER | VERSION \r\n"
db "MD | MKDIR TIME ECHO EXIT \r\n"
DZ "RD | RMDIR DATE CLS REBOOT \r\n\n"
stN .CALC_ : DZ "Calculating free space...\r"
; ;R11 ; ;R11
db 0 db 0
DZ "Unknown command" DZ "Unknown command"
@ -61,3 +65,4 @@ MAIN_MSG:
; ;
!txtCounter=0 !txtCounter=0
; ;
;

View File

@ -42,7 +42,7 @@
include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/bios_equ.inc'
include 'shared_includes/constants/dss_equ.inc' include 'shared_includes/constants/dss_equ.inc'
include 'SHELL/version.inc' include 'SHELL/version.inc'
include 'shared_includes/structures/FileSystem.inc'
; ;
; Program EQU section ; Program EQU section
;---------------------------------------------------------------------[] ;---------------------------------------------------------------------[]
@ -379,7 +379,7 @@ COMPARE:
; (hl) -> (de) ; (hl) -> (de)
ncopy_string: ncopy_string:
ld bc,15 ; ¬ ªá. ¤«¨­  áâப¨ ld bc,15 ; ¬ ªá. ¤«¨­  áâப¨
ld a,(hl) .start: ld a,(hl)
ldi ldi
ret po ret po
or a or a
@ -457,7 +457,7 @@ STR2DEC:
;!FIXIT ¥áâì ¤ã¡« hex2dec_ascii_16bit ;!FIXIT ¥áâì ¤ã¡« hex2dec_ascii_16bit
PDIGIT: ld de,10000 PDIGIT: ld de,10000
ld a,#C8 ; ret z ld a,#C8 ; ret z
ld (.patch),a ld (.RET_Z),a
call .DIG call .DIG
ld de,1000 ld de,1000
call .DIG call .DIG
@ -467,7 +467,7 @@ PDIGIT: ld de,10000
call .DIG call .DIG
ld a,l ld a,l
add a,"0" add a,"0"
;!TEST ;!TEST ¯®ª  ­¥ âॡã¥âáï ¯¥à¥¤ ¢ âì á«¥¤ãî騩 IX ¤ «ìè¥
;ld (ix+0),a ;ld (ix+0),a
;inc ix ;inc ix
;ld (ix+0),0 ;ld (ix+0),0
@ -476,22 +476,19 @@ PDIGIT: ld de,10000
; ;
ret ret
.DIG: xor a .DIG: xor a
inc a .loop: inc a
sbc hl,de sbc hl,de
jr nc,$-3 jr nc,.loop
add hl,de add hl,de
dec a dec a
.patch: ret z .RET_Z: ret z
add a,"0" add a,"0"
ld (ix+0),a ld (ix+0),a
inc ix inc ix
xor a ; nop xor a ; nop
ld (.patch),a ld (.RET_Z),a
ret ret
Restore_Screen: Restore_Screen:
PUSH AF PUSH AF
LD C,Dss.GetVMod LD C,Dss.GetVMod

View File

@ -1 +1 @@
323 342