prepare for FAT "big dir" support

This commit is contained in:
Tolik 2025-10-30 23:25:12 +10:00
parent 02fb3ddb32
commit 4da5e6c350
14 changed files with 571 additions and 424 deletions

View File

@ -37,6 +37,7 @@ ATTRIB: ; Current Dir ;[x] 15/10/23
XOR A
LD (OPEN_FN.TMP),A
CALL .OPENATR ;R002
; DE = record index
CALL NC,OPEN_FN.FM
;
POP BC

View File

@ -6,10 +6,8 @@
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
CLOSE_FN:
;R008 ;
;CLOSE: ;
LD (.TMP),A
;CLOSE:
CLOSE_FN: LD (.TMP),A
CALL SET_FM
RET C
LD A,(TASK)
@ -20,10 +18,10 @@ CLOSE_FN:
BIT 7,(IY+_sFM.ACCESS_MODE)
JR Z,.NOTMODF
;
; ä ©« ¨§¬¥­ñ­
LD E,(IY+_sFM.DIR_CLUSTER_L)
LD D,(IY+_sFM.DIR_CLUSTER_L+1)
PUSH DE
; [x] fat32
LD E,(IY+_sFM.DIR_CLUSTER_H)
LD D,(IY+_sFM.DIR_CLUSTER_H+1)
PUSH DE
@ -50,27 +48,30 @@ CLOSE_FN:
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D
;
CALL LOADDIR
; [ ] big dir
;!TODO ®â¬®â âì ªíè ¤® ­ã¦­®£® record index?
;
.TMP+1: LD A,0
CALL SET_FM
;
SET_PAGE_X DIRPAGE
;
EX AF,AF'
; [ ] big dir
;!TEST 9/11/23 record index
; LD HL,DIR
; LD DE,FAT_DIRECTORY_RECORD
; 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 L,(IY+_sFM.HANDLE)
LD H,(IY+_sFM.HANDLE+1)
LD HL,DIRPAGE.buffer
LD DE,FAT_DIRECTORY_RECORD
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 L,(IY+_sFM.HANDLE)
;LD H,(IY+_sFM.HANDLE+1)
;;;;;;;;;
LD D,YH
LD E,YL
EX DE,HL
@ -79,10 +80,10 @@ CLOSE_FN:
;POP HL
LD BC,FAT_DIRECTORY_RECORD
LDIR
EX AF,AF'
OUT (SLOT3),A
CALL SAVEDIR
.NOTMODF:
LD A,(.TMP)
.NOTMODF: LD A,(.TMP)
JP RES_FM
;
.error: POP DE

View File

@ -86,7 +86,10 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
.PATH0+1: LD HL,0
XOR A
LD (OPEN_FN.TMP),A
JP OPEN_FN.FILE ;R008
; DE - record index ¨§ WRT_HND
; !FIXIT ¬®¦­® ®¯â¨¬¨§­ãâì ¯¥à¥å®¤®¬ áà §ã ­ 
; ¢ë¤¥«¥­¨¥ FM (GET_FM)
JP OPEN_FN.FILE
;
.Prepare: ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE
AND FAT_ATTR.NoDIRnoVolID

View File

@ -274,7 +274,7 @@ ENVVALUE EQU CORE_BUFFERS.BUFFER //#3800 ; BUFFER ;DS 128
ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160
ENVIRONMENT EQU ENVADDR
ENVIRONMENT EQU ENVPAGE.ADDR
DEFAULT_ENV: DB 'BOOTDSK=' ;R02
.boot_disk: DB 'X:',0 ;R02

View File

@ -31,6 +31,7 @@ F_FIRST: CALL .INIT_VARS
LD A,(.SEARCH_ATTRIBUT)
CALL SEARCH.Custom
RET C
PUSH DE ; record index ¬®¦¥â ¨ ­¥ ­ã¦­®
LD HL,CORE_BUFFERS.MASKARE
.DTABUF+1: LD DE,0
LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; ª®¯¨à㥬 .NAME ¨ .EXT
@ -38,11 +39,19 @@ F_FIRST: CALL .INIT_VARS
.SEARCH_ATTRIBUT+1:
LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT
LD (DE),A
; ¯à¨ ¯à릪¥ á ­  á⥪¥ ¤®«¦¥­ «¥¦ âì record index
.FIND_S: INC DE
;!TODO «ãçè¥ âã⠨ᯮ«ì§®¢ âì ª ª ¢ record index ¤«ï ¯¥à¥¡®à  ª â «®£  > #4000 bytes
LD BC,FAT_DIRECTORY_RECORD
ADD IX,BC
LD (F_NEXT.CURHND),IX
; record index ¬®¦¥â ¨ ­¥ ­ã¦­®
POP HL
;!FIXIT ­¥â ¯à®¢¥àª¨ ­  ¯¥à¥¯®«­¥­¨¥
; ­ ¤¥¥¬áï, çâ® FAT ¡¥§ ª®á类¢
INC HL
LD (F_NEXT.RecordIndex),HL
;
LD HL,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT
LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT
LDIR
@ -79,43 +88,44 @@ F_FIRST: CALL .INIT_VARS
F_NEXT:
.NO_NEXT.YES EQU 0
.NO_NEXT.NO EQU #FF
.NO_NEXT+1:
LD A,0
.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,CORE_BUFFERS.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
POP HL
RET C
;
PUSH DE
EX DE,HL
JP F_FIRST.FIND_S
.NSEARCH:
EX AF,AF'
;
.NSEARCH: EX AF,AF'
SET_PAGE_X DIRPAGE
;PUSH AF
EX AF,AF'
CPL
LD C,A
;!TEST 9/11/23 record index
; EXX
; LD DE,0
; EXX
EXX
.RecordIndex+1: LD DE,0 ; record index ¬®¦¥â ¨ ­¥ ­ã¦­®
EXX
;
.CURHND+2:
LD IX,0
.CURHND+2: LD IX,0 ;  ¤à¥á á«¥¤ãî饩 § ¯¨á¨ ¢ ªíè¥ ¤¨à¥ªâ®à¨¨
LD A,XH
OR XL
JP Z,SEARCH.error_too_many_files
JP Z,SEARCH.error_too_many_files ; [ ] big dir
JP SEARCH.loop
;

View File

@ -28,15 +28,20 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
RET C
.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE
RET C
;R002 ;!TEST 9/11/23 record index
.FM: PUSH DE ; á®å࠭塞 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS (¯®«ã祭 ¨§ SEARCH)
;
CALL GET_FM ; enter point from ATTRIB
RET C
LD A,C
EX AF,AF'
.FM: ; enter point from ATTRIB
;R002 ;!TEST 9/11/23 record index
PUSH DE ; á®å࠭塞 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS (¯®«ã祭 ¨§ SEARCH)
;
CALL GET_FM
;!TEST 9/11/23 record index 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS
POP DE
;
RET C
LD A,C ; ¤¥áªà¨¯â®à ä ©« 
EX AF,AF'
;!TEST 9/11/23 record index 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS
;POP DE
; EXX
LD (IY+_sFM.HANDLE),E
LD (IY+_sFM.HANDLE+1),D
@ -49,42 +54,94 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
LDIR
.TMP+1: LD A,0
LD (IY+_sFM.ACCESS_MODE),A
LD A,(TASK)
LD (IY+_sFM.TASK_NUM),A
;!FIXIT ®¯â¨¬¨§­ãâì âãâ § ­ã«¥­¨¥
; ®¯â¨¬¨§­ã« âãâ
;LD A,(TASK)
;LD (IY+_sFM.TASK_NUM),A
;XOR A
;LD (IY+_sFM.OptimizedClusters),A
;LD (IY+_sFM.KnownCluster_L),A
;LD (IY+_sFM.KnownCluster_L+1),A
;LD (IY+_sFM.KnownOffset_L),A
;LD (IY+_sFM.KnownOffset_L+1),A
;; fat32
; LD (IY+_sFM.KnownCluster_H),A
; LD (IY+_sFM.KnownCluster_H+1),A
; LD (IY+_sFM.KnownOffset_H),A
; LD (IY+_sFM.KnownOffset_H+1),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,(CORE_BUFFERS.FS_Buffer.DRIVE)
;LD (IY+_sFM.DRIVE),A
;; fat32
;LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H
;LD E,(HL)
;INC HL
;LD D,(HL)
;LD (IY+_sFM.DIR_CLUSTER_H),E
;LD (IY+_sFM.DIR_CLUSTER_H+1),D
;;
;LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM
;LD E,(HL)
;INC HL
;LD D,(HL)
;LD (IY+_sFM.DIR_CLUSTER_L),E
;LD (IY+_sFM.DIR_CLUSTER_L+1),D
;
PUSH IY
POP HL
LD DE,_sFM.F_POSITION
ADD HL,DE
XOR A
LD (IY+_sFM.OptimizedClusters),A
LD (IY+_sFM.KnownCluster_L),A
LD (IY+_sFM.KnownCluster_L+1),A
LD (IY+_sFM.KnownOffset_L),A
LD (IY+_sFM.KnownOffset_L+1),A
; fat32
LD (IY+_sFM.KnownCluster_H),A
LD (IY+_sFM.KnownCluster_H+1),A
LD (IY+_sFM.KnownOffset_H),A
LD (IY+_sFM.KnownOffset_H+1),A
LD (HL),A ; _sFM.F_POSITION
INC HL
LD (HL),A ; _sFM.F_POSITION + 1
INC HL
LD (HL),A ; _sFM.F_POSITION + 2
INC HL
LD (HL),A ; _sFM.F_POSITION + 3
INC HL
;
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
EX DE,HL
LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L
LDI ; _sFM.DIR_CLUSTER_L
LDI ; _sFM.DIR_CLUSTER_L + 1
LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H
LDI ; _sFM.DIR_CLUSTER_H
LDI ; _sFM.DIR_CLUSTER_H + 1
EX DE,HL
;
INC HL
INC HL
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (IY+_sFM.DRIVE),A
; fat32
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H
LD E,(HL)
LD (HL),A ; _sFM.DRIVE
INC HL
LD D,(HL)
LD (IY+_sFM.DIR_CLUSTER_H),E
LD (IY+_sFM.DIR_CLUSTER_H+1),D
;
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM
LD E,(HL)
INC HL
LD D,(HL)
LD (IY+_sFM.DIR_CLUSTER_L),E
LD (IY+_sFM.DIR_CLUSTER_L+1),D
LD A,(TASK)
LD (HL),A ; _sFM.TASK_NUM
INC HL
;
XOR A
LD (HL),A ; _sFM.OptimizedClusters
INC HL
LD (HL),A ; _sFM.KnownCluster_L
INC HL
LD (HL),A ; _sFM.KnownCluster_L + 1
INC HL
LD (HL),A ; _sFM.KnownCluster_H
INC HL
LD (HL),A ; _sFM.KnownCluster_H + 1
INC HL
LD (HL),A ; _sFM.KnownOffset_L
INC HL
LD (HL),A ; _sFM.KnownOffset_L + 1
INC HL
LD (HL),A ; _sFM.KnownOffset_H
INC HL
LD (HL),A ; _sFM.KnownOffset_H + 1
; ;
EX AF,AF'
AND A
RET

View File

@ -193,7 +193,7 @@ SAVETXT: PUSH AF
LD L,#28
.SVTEXT1: LD (BACKTXT.WinMax),HL
LD DE,#0000
LD A,(BANKTBL + TXTPAGE)
LD A,((#FF00 & BANKTBL) + TXTPAGE)
LD B,A
LD C,BIOS.WIN_COPY
@ -229,7 +229,7 @@ BACKTXT: PUSH AF
LD IX,#C000
.WinMax+1: LD HL,#2050
LD DE,#0000
LD A,(BANKTBL + TXTPAGE)
LD A,((#FF00 & BANKTBL) + TXTPAGE)
LD B,A
LD C,BIOS.WIN_RESTORE
;[x] 29/9/23

View File

@ -266,6 +266,10 @@ INTx38_Handler: PUSH AF
POP AF
RET
;
;BLOCK #FD-$,#FF
BANKTBL: BLOCK (USING_MEMPAGES + 2),#FF
.Size EQU $-BANKTBL
ASSERT (high(BANKTBL + USING_MEMPAGES + 2) == high(BANKTBL)), "Error! Memory leak"
_mInfoALIGN 256,0
@ -362,10 +366,10 @@ MASKARE: BLOCK 8,0 ;
BANKTBL EQU ($ & #FF00) + (1<?($ & #FF)) * #100
.Size EQU USING_MEMPAGES + 2
; BANKTBL EQU ($ & #FF00) + (1<?($ & #FF)) * #100
; .Size EQU USING_MEMPAGES + 2
;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
CLEAR_ZONE.start EQU BANKTBL + BANKTBL.Size
CLEAR_ZONE.start EQU $ ;BANKTBL + BANKTBL.Size
MODULE CORE_BUFFERS
BUFFERSplace _sBuffers = CLEAR_ZONE.start
TMPNAME EQU BUFFERSplace.TMPNAME ; +-

View File

@ -146,16 +146,16 @@ SEARCH:
;!TEST 9/11/23 record index
; ®¯â¨¬¨§ æ¨ï ¤«ï ¨­¤¥ªá  § ¯¨á¨ ¢ ᯨ᪥ ª â «®£ .
; <09>®­ ¤®¡¨âáï ¢¥à­ãâì ¤«ï ¯¥à¥¡®à  ª â «®£  > #4000 ¡ ©â
; EXX
; LD DE,0
; EXX
EXX
LD DE,0
EXX
;
.loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME)
OR A
JR Z,.error_file_not_found
CP #E5 ;!HARDCODE #E5 - § ¯¨áì ¢ ¤¨à¥ªâ®à¨¨ ᢮¡®¤­ , â ª ª ª ä ©«/¤¨à¥ªâ®à¨ï ¡ë«¨ 㤠«¥­ë
JR Z,.next_record
LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT)
LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT)
LD D,A
AND C
JR NZ,.next_record
@ -184,33 +184,34 @@ SEARCH:
;
LD D,XH
LD E,XL
;!FIXIT ¬®¦¥â ­  ¢ë室¥ ¯à®áâ® EXX?
;!TEST 9/11/23 record index
; EXX
; PUSH DE
; EXX
PUSH IX
EXX
PUSH DE ; record index
EXX
;PUSH IX
;
LD HL,CORE_BUFFERS.HANDBUF
EX DE,HL
LD BC,CORE_BUFFERS.HANDBUF.SIZE
LDIR
;!TEST 9/11/23 record index
; record index
POP DE
;
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND A
RET
;
.next_record: LD DE,FAT_DIRECTORY_RECORD
;!TEST 9/11/23 record index
; EXX
; INC DE
; EXX
.next_record: ;!TEST 9/11/23 record index
EXX
INC DE
EXX
;
ADD IX,DE
LD DE,FAT_DIRECTORY_RECORD
ADD IX,DE ; [ ] big dir
JR NC,.loop
;
.error_too_many_files:
EX AF,AF'
OUT (SLOT3),A
@ -501,8 +502,8 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
EX DE,HL
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32
LD HL,#4000 ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
;LD HL,#4000 ;!HARDCODE
;LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
;-------------; EX DE,HL
; JP LOADDIR
@ -512,7 +513,8 @@ LOADDIR: ;!TODO optimize
CALL LOAD_SAVE_DIR_PREPARE
PUSH AF
EX AF,AF'
JR NZ,.read_dir
JR NZ,.read_dir ; root dir or not
; root dir
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
CP FAT_TYPE.x32
JR NZ,.LoadRootDir
@ -541,16 +543,16 @@ LOADDIR: ;!TODO optimize
LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£ 
CP B
JR NC,.RTD1
;
LD B,A ; ç¨á«® ᥪâ®à®¢
.RTD1: PUSH AF ; 21/04/2025 fix ¬ãá®à ¢ áâà ­¨æ¥ ª â «®£ , ¥á«¨ ª â «®£ ¬¥­ìè¥ áâà ­¨æë
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ­®¬¥à ¤¨áª 
.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
RST ToDSS.DRV
; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã
; 21/04/2025 fix ¬ãá®à ¢ áâà ­¨æ¥ ª â «®£ , ¥á«¨ ª â «®£ ¬¥­ìè¥ áâà ­¨æë
POP AF
JR NC,.exit
BIT 7,D
JR Z,.exit
XOR A
LD (DE),A
;
@ -571,35 +573,117 @@ LOAD_SAVE_DIR_PREPARE:
LD IX,0
LD B,A ; ®â ­ ç «  ä ©« 
CALL MOVE_FP
;
SET_PAGE_X DIRPAGE
AND A
EX AF,AF'
PUSH AF
;
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (IY+_sFM.DRIVE),A
;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H)
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
LD (CORE_BUFFERS.FM_BUF.DRIVE),A
;;;;;;;;
;LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H)
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
;
XOR A
LD D,#40
LD E,A
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
EXX
LD D,A
LD E,A
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
OR H
OR L
EXX
OR H
OR L
;;;;;;;;
PUSH AF
CALL NZ,.CalcDirSize
;
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE
EXX
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE
POP AF
EX AF,AF'
POP AF
RET
;
.CalcDirSize: ; calc dir size in clusters
LD DE,0
;LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
;EXX
; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
.loop: ; ;
;EXX
INC DE ; <20> ¤¥¥¬áï âãâ ­  â®, ç⮠ᯥæ¨ä¨ª æ¨ï ¢ë¯®«­ï¥âáï ¨ ¯¥à¥¯®«­¥­¨ï ­¥ ¡ã¤¥â
PUSH DE
CALL READ_FROM_FAT
EX DE,HL
POP DE
EXX
EX DE,HL
EXX
JR NC,.loop
; DE - à §¬¥à ¤¨à¥ªâ®à¨¨ ¢ ª« áâ¥à å
;
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
;
; DE':DE - ª®«-¢® ª« áâ¥à®¢
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; --> DE*BC*A = DE':DE ¤«ï ®â¢¥â  墠â¨â, ¯®å®¤ã, 4å ॣ¨áâ஢
EXX
LD DE,0
EXX
SRL B
RR C
RRCA
JR C,.loop2
;
.loop1: ;
SLA E
RL D
EXX
RL E
RL D
;RL C
EXX
;
RRCA
JR NC,.loop1
;
.loop2: ;
SLA E
RL D
EXX
RL E
RL D
;RL C
EXX
;
SRL B
RR C
JR NC,.loop2
; <-- DE*BC*A = DE':DE
RET
;----------------------------------------------------------------------;
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£ 
; ¢ë室: DE - record index
WRT_HND:
SET_PAGE_X DIRPAGE
EX AF,AF'
LD HL,DIRPAGE.buffer
;!TEST 9/11/23 record index
; EXX
; LD DE,0
; EXX
EXX
LD DE,0
EXX
;
LD BC,FAT_DIRECTORY_RECORD
.loop: ;LD A,(IX+00)
@ -626,23 +710,30 @@ WRT_HND:
LDIR
EX AF,AF'
OUT (SLOT3),A
; ¯à®¢¥à塞, 㢥«¨ç¨«áï «¨ à §¬¥à ¤ ­­ëå ¤¨à¥ªâ®à¨¨
LD HL,DIRPAGE.buffer
LD BC,(SAVEDIR.DIRSIZE)
DEC BC
ADD HL,BC
AND A
SBC HL,DE
JR NC,SAVEDIR
JR NC,.SAVEDIR
;
; à §¬¥à ¤ ­­ëå ¤¨à¥ªâ®à¨¨ 㢥«¨ç¨«áï
LD HL,(SAVEDIR.DIRSIZE)
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster)
ADD HL,BC
LD (SAVEDIR.DIRSIZE),HL
AND A
;JP SAVEDIR
.SAVEDIR: EXX
PUSH DE
EXX
CALL SAVEDIR
POP DE
RET
;----------------------------------------------------------------------;
; ‘¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª.
; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à 
; [x] fat32 ;!TEST
SAVEDIR: ;!TODO optimize
CALL LOAD_SAVE_DIR_PREPARE
PUSH AF
@ -920,7 +1011,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD H,A
LD D,H
LD E,L
;EX DE,HL
EXX
LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
LD D,H
@ -930,14 +1020,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs)
DEC A
LD B,A
; JR Z,.loop_mul_end
; ; .Number_of_FATs * .SectorsPerFAT
; .loop_mul: ADD HL,HL
; EX DE,HL
; ADC HL,HL
; EX DE,HL
; DJNZ .loop_mul
;
CALL NZ,ALL_SECTORS_PER_FATs
EXX
PUSH HL
@ -983,7 +1065,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD HL,65524
SBC HL,BC
JR C,.its_FAT32
;
; It's FAT16
LD A,(.UsesVarsFAT32)
AND A
@ -1021,16 +1102,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L)
LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
AND #0F
;
; JR Z,.first_FAT_active
; LD B,A
; ;
; .fat_calc_loop: ADD HL,DE
; EXX
; ADC HL,DE
; EXX
; DJNZ .fat_calc_loop
;
LD B,A
CALL NZ,ALL_SECTORS_PER_FATs
;
@ -2071,8 +2142,7 @@ WRITE_FAT_TABLE:
;[x] fat32 ;!TEST
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL:
; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
GET_FAT32_CELL: ; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
LD A,H
EXX
LD C,A
@ -2082,8 +2152,7 @@ GET_FAT32_CELL:
LD A,C
;
LD B,FAT_CACHE.Degree ; 4 ᤢ¨£ 
.loop_block:
RLCA ; << H
.loop_block: RLCA ; << H
RL L ; << L'
RL H ; << H'
DJNZ .loop_block
@ -2111,8 +2180,7 @@ GET_FAT32_CELL:
;-----------------------------------------------------------------------
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT16_CELL:
LD A,H
GET_FAT16_CELL: LD A,H
LD B,H
;AND #0F
AND FAT_CACHE.Size_Mask_16
@ -2141,8 +2209,7 @@ GET_FAT16_CELL:
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
; CF - çñâ­ë©/­¥çñâ­ë©  ¤à¥á ª« áâ¥à 
GET_FAT12_CELL:
LD D,H
GET_FAT12_CELL: LD D,H
LD E,L
SRL H
RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF

View File

@ -302,7 +302,7 @@ SETUP_CURSORS:
;
in a,(SLOT3)
push af ; 甌縲. <20>
ld a,(BANKTBL + TXTPAGE) ; 2-© «®£. ­®¬¥à áâà ­¨æë à áè. „Ž‘
ld a,((#FF00 & BANKTBL) + TXTPAGE) ; 2-© «®£. ­®¬¥à áâà ­¨æë à áè. „Ž‘
out (SLOT3),a
; ; <20><>腮碎 瓱痰. Л<><D09B><EFBFBD><EFBFBD>.

View File

@ -24,8 +24,10 @@
;File Manipulator (FM)
;[ ] fat32
; !!!!! ¨§-§  ¢áïª¨å ®¯â¨¬¨§ æ¨© áà ­ëå ­¥ ¬¥­ïâì ¬¥áâ ¬¨ ­¨ç¥£®, ⮫쪮 ¤®¡ ¢«ïâì ¢ ª®­¥æ
STRUCT _sFM ; 54 bytes
; from FAT
.FS_REC FAT_DIRECTORY_RECORD
; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME
; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT
; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT
@ -39,7 +41,6 @@
; .DATE: WORD #0000 ;+ #18 +24 DATE
; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32
; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE
.FS_REC FAT_DIRECTORY_RECORD
; from Core
.F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP)
.DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW

View File

@ -1,33 +1,101 @@
;
; …᫨ define § ª®¬¬¥­â¨à®¢ ­, â® ¢ ª®¤¥ ®­ ⮦¥ â ª¦¥
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; Ž<EFBFBD>™……
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DEFINE TEST_FEATURE 0
;
;
DEFINE MINIMUM_EXE_VERSION 1
;
;
DEFINE COMPILE_UNUSED_CODE 0
;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; MOUSE
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default)
DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B
DEFINE MOUSE_READ_PORT_TIMEOUT 5*512 ; Š®áâë«ì­ë© â ©¬- ãâ ­  ®¦¨¤ ­¨¥ ¡ ©â  ®â ¬ë誨. …᫨ = 0, â® «¨è­¨© ª®¤ ­¥ ª®¬¯¨«¨âáï
;----------------------------------------------------;
IF MOUSE_COM_BAUD = 1
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 22 ; ¢â®à®© ¬­®¦¨â¥«ì = 22. 875000/Œ­1*Œ­2=2485
ELSEIF MOUSE_COM_BAUD = 2
MOUSE_BAUD:
.multiplier_1 EQU %0000'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 1.
.multiplier_2 EQU 182 ; ¢â®à®© ¬­®¦¨â¥«ì = 182. 875000/Œ­1*Œ­2=4807
ELSE
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 45 ; ¢â®à®© ¬­®¦¨â¥«ì = 45. 875000/Œ­1*Œ­2=1215
ENDIF
;----------------------------------------------------;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; KEYBOARD
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A
DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift.
DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C
DEFINE USE_E1_SCANCODE 0
; DEFINE CLASSIC_CURSOR 0
;DEFINE CLASSIC_CURSOR 0
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; DSS
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DEFINE NeedSafePort_Y 1
DEFINE NON_REMOVABLE_FDD 0
;-----------------------------------------------[VERSION]
DSS_MAX_SECTOR_SIZE EQU 512
DSS_MAX_DRIVES_AMOUNT EQU 26
MAX_RAMDRIVES EQU 16
MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 3.06
DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10
;DEFINE TABisSPACES 0
;DEFINE EnoughtOnly_LF 0
;-----------------------------------------------[^^^^^^^]
;
;-----------------------------------------------[MEMORY]
DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82
;DEFINE OLD_SET_BANK 0
;-----------------------------------------------[^^^^^^]
;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥
;-----------------------------------------------[«®£.­®¬¥à  áâà ­¨æ]
DEFINE USING_MEMPAGES 4 ; à §¬¥à ¡«®ª  ¤®¯®«­¨â¥«ì­ëå áâà ­¨æ
; ªíè ᯨ᪠ ª â «®£ 
DIRPAGE EQU 0 + (low BANKTBL)
.buffer EQU #C000
FATPAGE EQU 1 + (low BANKTBL)
.cache EQU #C000
TXTPAGE EQU 2 + (low BANKTBL)
.ADDR EQU #C000
ENVPAGE EQU TXTPAGE
.PATH_PNT_ARRAY EQU #FC80
.ENVTEMP EQU #FE00
.ADDR EQU #E400
DRVPAGE EQU 3 + (low BANKTBL)
;
COREPAGE EQU 4 + (low BANKTBL) ; ®­  ®â¤¥«ì­® ¨ ­¥ á ¡«®ª®¬ ¢ëè¥.
;-----------------------------------------------[^^^^^^^^^^^^^^^^^^]
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFINE CHANGE_FREE_CLU_AFTER_DEL 1
DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0
ENVIRONMENT_STRING_LENGTH EQU 255
FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
;
SUBLOAD_SIZE EQU 2 ; ª®«-¢® ᥪâ®à®¢ ª®â®à®¥ ­ ¤® ¯®¤£à㧨âì ¯®á«¥ § £à㧪¨ system.dos ¢ áâà ­¨æã
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
////////////////////////////////////////////////////////////////////////
SERVICE_SECTORS:
.FAT12 EQU #0FEF
.FAT16 EQU #FFEF
@ -90,70 +158,4 @@ FAT_CACHE:
;.Degree_12 EQU _shift
;.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1)
;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFINE NeedSafePort_Y 1
; DEFINE TABisSPACES 0
; DEFINE EnoughtOnly_LF 0
DEFINE NON_REMOVABLE_FDD 0
;
DSS_MAX_SECTOR_SIZE EQU 512
DSS_MAX_DRIVES_AMOUNT EQU 26
MAX_RAMDRIVES EQU 16
MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 2.55
DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10
;
;-------------------[MEMORY]-------------------------;
DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82
; DEFINE OLD_SET_BANK 0
;---------------------[ «®£.­®¬¥à  áâà ­¨æ ¯ ¬ï⨠]---------------------
DEFINE USING_MEMPAGES 4 ; à §¬¥à ¡«®ª  ¤®¯®«­¨â¥«ì­ëå áâà ­¨æ
; ªíè ᯨ᪠ ª â «®£ 
DIRPAGE EQU 0
.buffer EQU #C000
FATPAGE EQU 1
.cache EQU #C000
TXTPAGE EQU 2
ENVPAGE EQU TXTPAGE
.PATH_PNT_ARRAY EQU #FC80
.ENVTEMP EQU #FE00
DRVPAGE EQU 3
;
COREPAGE EQU 4 ; ®­  ®â¤¥«ì­® ¨ ­¥ á ¡«®ª®¬ ¢ëè¥.
;-----------------------------------------------------------------------
DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0
ENVIRONMENT_STRING_LENGTH EQU 255
TXTADDR EQU #C000
ENVADDR EQU #E400
;DIR EQU #C000
;FAT_CACHE EQU #C000
FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
;HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD
;----------------------------------------------------;
;
;
;----------------------------------------------------;
IF MOUSE_COM_BAUD = 1
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 22 ; ¢â®à®© ¬­®¦¨â¥«ì = 22. 875000/Œ­1*Œ­2=2485
ELSEIF MOUSE_COM_BAUD = 2
MOUSE_BAUD:
.multiplier_1 EQU %0000'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 1.
.multiplier_2 EQU 182 ; ¢â®à®© ¬­®¦¨â¥«ì = 182. 875000/Œ­1*Œ­2=4807
ELSE
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 45 ; ¢â®à®© ¬­®¦¨â¥«ì = 45. 875000/Œ­1*Œ­2=1215
ENDIF
;----------------------------------------------------;
;
;
;----------------------------------------------------;
SUBLOAD_SIZE EQU 2 ; ª®«-¢® ᥪâ®à®¢ ª®â®à®¥ ­ ¤® ¯®¤£à㧨âì ¯®á«¥ § £à㧪¨ system.dos ¢ áâà ­¨æã
;----------------------------------------------------;
////////////////////////////////////////////////////////////////////////

View File

@ -78,12 +78,12 @@ DEPLOY: ;Allocate memory
RST ToBIOS
; ¤®«¦­  ¨¤â¨ ¯®á«¥ GetMemBlkPages, ç⮡ ¢¬¥áâ®
; § ªà뢠誨 #FF ¯®áâ ¢¨âì áâà ­¨æã COREPAGE
LD HL,BANKTBL + COREPAGE
LD HL,COREPAGE + (#FF00 & BANKTBL)
IN A,(SLOT0)
LD (HL),A
; ¤«ï API ¤à ©¢¥à  ¬ë誨
LD (DRIVES_DRIVER.MOUSE_HANDLER.CorePage),A
LD A,(BANKTBL + DRVPAGE)
LD A,((#FF00 & BANKTBL) + DRVPAGE)
LD (RST_0x30.drv_page),A
;
POP AF
@ -113,4 +113,5 @@ DEPLOY: ;Allocate memory
OUT (SLOT3),A
AND A
RET
.Size: EQU DEPLOY
;-----------------------------------------------------------------------;

@ -1 +1 @@
Subproject commit 4da18d54c12e0f2ff4183be7a1cbf5882da1bd4f
Subproject commit 97d5ea8a4b1359d49fb706f24aae6af6bb4eef66