fixed BLOCK_READ, BLOCK_WR

This commit is contained in:
Anatoliy Belyanskiy 2024-03-22 04:06:17 +10:00
parent f13fdf4eab
commit 87c74c1ee7
5 changed files with 555 additions and 507 deletions

View File

@ -50,11 +50,16 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23
LD A,(TASK) LD A,(TASK)
LD (IY+_sFM.TASK_NUM),A LD (IY+_sFM.TASK_NUM),A
XOR A XOR A
; [ ] fat32
LD (IY+_sFM.KnownCluster_L),A LD (IY+_sFM.KnownCluster_L),A
LD (IY+_sFM.KnownCluster_L+1),A LD (IY+_sFM.KnownCluster_L+1),A
LD (IY+_sFM.KnownOffset_L),A LD (IY+_sFM.KnownOffset_L),A
LD (IY+_sFM.KnownOffset_L+1),A LD (IY+_sFM.KnownOffset_L+1),A
LD (IY+_sFM.OptimizedClusters),A
; [x] 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),A
LD (IY+_sFM.F_POSITION+1),A LD (IY+_sFM.F_POSITION+1),A

View File

@ -75,36 +75,46 @@ INC_FAT:
;----------------------------------------------------------- ;-----------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à  ; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl = ­®¬¥à ª« áâ¥à  ; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; de = <E28099>˜…… á«®¢® ­®¬¥à  ª« áâ¥à  (⮫쪮 ¤«ï FAT32) ; hl' - ­®¬¥à  ª« áâ¥à  (áâ à襥 á«®¢®. ⮫쪮 ¤«ï FAT32)
; ¢ë室: hl = ­®¬¥à ª« áâ¥à  ; ¢ë室: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; de = ­®¬¥à á«¥¤. ª« áâ¥à  (¥á«¨ 0, â® ª« áâ¥à hl ᢮¡®¤¥­) ; hl' - ­®¬¥à  ª« áâ¥à  (áâ à襥 á«®¢®)
; de - ­®¬¥à á«¥¤. ª« áâ¥à  (¬« ¤è¥¥ á«®¢®. ¥á«¨ 0, â® ª« áâ¥à hl ᢮¡®¤¥­)
; de' - ­®¬¥à á«¥¤. ª« áâ¥à  (áâ à襥 á«®¢®. ¥á«¨ 0, â® ª« áâ¥à hl' ᢮¡®¤¥­)
; CF - ª®­¥æ 楯®çª¨ ; CF - ª®­¥æ 楯®çª¨
;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb ;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb
;----------------------------------------------------------- ;-----------------------------------------------------------
;[ ] fat32 ;[ ] fat32
READ_FROM_FAT: READ_FROM_FAT:
;[x] fat32 ;[x] fat32
PUSH DE
LD A,(FatBuffer.FAT_TYPE) LD A,(FatBuffer.FAT_TYPE)
XOR 32 XOR 32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD HL,(FAT_Max_Cluster_H) ; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
JP .high ; !FIXIT fat32 ¯à®¢¥àïâì ®¡  á«®¢  FAT_Max_Cluster
EXX
EX DE,HL
LD HL,(FAT_Max_Cluster_H)
; CF = 0
SBC HL,DE
EX DE,HL
EXX
LD A,DSS_Error.sys.DISK_FULL
RET C
JP NZ,.correct_cluster ; ¥á«¨ FAT_Max_Cluster_H - IX != 0, â® ª« áâ¥à ª®à४â­ë©
; ;
; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL .low: EX DE,HL
LD HL,(FAT_Max_Cluster_L) LD HL,(FAT_Max_Cluster_L)
.high: ; CF = 0 ; CF = 0
SBC HL,DE SBC HL,DE
EX DE,HL EX DE,HL
LD A,DSS_Error.sys.DISK_FULL LD A,DSS_Error.sys.DISK_FULL
;[x] fat32
POP DE
;
RET C RET C
;
.correct_cluster:
SET_PAGE_X FATPAGE SET_PAGE_X FATPAGE
;
PUSH HL PUSH HL
PUSH AF PUSH AF
LD A,(FatBuffer.FAT_TYPE) LD A,(FatBuffer.FAT_TYPE)
@ -116,13 +126,20 @@ READ_FROM_FAT:
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à  LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL INC HL
LD D,(HL) LD D,(HL)
;
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
;!TODO #FFF7 - ª« áâ¥à á ª®áïç­ë¬¨ ᥪâ®à ¬¨
LD HL,#FFEF ;!HARDCODE LD HL,#FFEF ;!HARDCODE
XOR A ; DssErr.sys.NO_ERROR .exit: XOR A ; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL POP HL
; [x] fat32
EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
RET RET
; ;
.FAT12: CALL GET_FAT12_CELL .FAT12: CALL GET_FAT12_CELL
@ -147,10 +164,8 @@ READ_FROM_FAT:
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
LD HL,#0FEF LD HL,#0FEF
XOR A ; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = ­ã«î JR .exit
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë ;
POP HL
RET
.FAT32: ; [ ] fat32 .FAT32: ; [ ] fat32
CALL GET_FAT32_CELL CALL GET_FAT32_CELL
DI DI
@ -556,115 +571,81 @@ NSECTOR:;[ ] fat32
RET RET
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
;[ ] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
MACRO _GetSavedCluster exit_to
LD E,(IY+_sFM.KnownCluster_L)
LD D,(IY+_sFM.KnownCluster_L+1)
LD A,D
INC B
OR E
JR Z,exit_to
DEC B
;
PUSH DE
PUSH HL
PUSH BC
LD E,(IY+_sFM.KnownOffset_L)
LD D,(IY+_sFM.KnownOffset_L+1)
LD A,D
OR E
JR Z,.noOptimization_1
;
POP HL
SBC HL,DE
JR C,.noOptimization_2
;
LD C,L
LD B,H
POP DE
POP HL
;
INC B
JP exit_to
.noOptimization_1:
POP BC
.noOptimization_2:
POP HL
POP DE
INC B
JP exit_to
ENDM
;
;[ ] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
MACRO _SaveGetedCluster
LD (IY+_sFM.KnownCluster_L),L
LD (IY+_sFM.KnownCluster_L+1),H
POP BC
LD (IY+_sFM.KnownOffset_L),C
LD (IY+_sFM.KnownOffset_L+1),B
ENDM
;;
BLOCK_READ.ECL2:
;POP DE ; [ ] áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  (à ­ìè¥ ¨£­®à¨à®¢ «®áì) ; 225ÿ937ÿ408 / 512 = 0x6BBC4 / 4 = 0x1AEF1
POP BC ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP BC
POP DE
AND A
RET
; ;
;READ SECTORS OF FILE ;READ SECTORS OF FILE
;HL:DE - FP (in sectors) ;HL:DE - FP (in sectors)
; B - Amount sectors ; B - Amount sectors
; IX - buffer in RAM ; IX - buffer in RAM
; 225ÿ937ÿ408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 ; [ ] fat32
BLOCK_READ: BLOCK_READ: PUSH BC
PUSH BC
LD (READ.PointerOnBuffer),IX LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER
LD C,A ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV_for_SPC CALL DIV_for_SPC
; [ ] fat32. ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb. ˆá¯®«ì§®¢ âì DE
LD B,XH
LD C,XL
PUSH HL ; ®áâ â®ª DIV_for_SPC PUSH HL ; ®áâ â®ª DIV_for_SPC
; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) PUSH DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
;
EXX
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
LD A,L LD A,L
OR H OR H
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) EXX
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER Low
;JR NZ,BLOKRD2 LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
PUSH BC OR L
;PUSH DE ; [ ] áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  (à ­ìè¥ ¨£­®à¨à®¢ «®áì) OR H
JR Z,.ECL2 JR Z,.fast_exit_4
;JP ECL2 ;RY01 JR BLOKRD0 CALL GetSavedCluster
_GetSavedCluster .enter_loop1 ;HL': HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ 
;DE : BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (D=D+1, B=B+1)
; ;
.loop1: PUSH BC PUSH DE ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
JP .enter_loop1
;
.fast_exit_5: POP DE
.fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
POP BC
;
POP BC
POP DE
AND A
RET
; [x] fat32
.loop1_big: PUSH BC
LD BC,0
.loop1_small: PUSH BC
CALL READ_FROM_FAT CALL READ_FROM_FAT
POP BC POP BC
JR C,.ECL2 ;RY01 JR C,.fast_exit_5 ;RY01
EX DE,HL EX DE,HL
; DEC BC EXX
.enter_loop1: EX DE,HL
; LD A,B ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å EXX
; OR C .enter_loop1: INC B
; JR NZ,.loop1 DEC BC ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
DJNZ .loop1_small
POP BC ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
INC B INC B
DEC BC DEC BC
DJNZ .loop1 DJNZ .loop1_big
;POP DE ; [ ] áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  (à ­ìè¥ ¨£­®à¨à®¢ «®áì) ;;;;
;
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
_SaveGetedCluster POP DE
POP BC
CALL SaveGotCluster
; ;
POP DE ; ®áâ â®ª DIV_for_SPC POP DE ; ®áâ â®ª DIV_for_SPC
POP BC ; HL:DE - FP (in sectors) POP BC ; HL:DE - FP (in sectors)
; (SP) = (RET)
;
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
SUB E SUB E
LD C,A ;\ LD C,A ;\
@ -716,8 +697,8 @@ BLOCK_READ:
LD C,A LD C,A
OR A ;CLEAR CF OR A ;CLEAR CF
RET Z RET Z
.BLOKRD7: ;
EX DE,HL .BLOKRD7: EX DE,HL
PUSH BC PUSH BC
CALL READ_FROM_FAT CALL READ_FROM_FAT
POP BC POP BC
@ -763,73 +744,114 @@ BLOCK_READ:
; SCF ; SCF
; RET ; RET
; ;
;WRITE SECTORS OF FILE ;WRITE SECTORS OF FILE
;HL:DE - FP (in sectors), IX - data in RAM ;HL:DE - FP (in sectors), IX - data in RAM
; B - Amount sectors ; B - Amount sectors
BLOK_WR: ; [ ] fat32
PUSH BC BLOK_WR: PUSH BC
LD (READ.PointerOnBuffer),IX LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER
LD C,A ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV_for_SPC CALL DIV_for_SPC
; [ ] fat32. ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb PUSH HL ; ®áâ â®ª DIV_for_SPC
LD B,XH ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
LD C,XL PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
PUSH HL ;RESIDUE PUSH DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
;
EXX
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
LD A,L
OR H
EXX
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
LD A,H
OR L OR L
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE OR H
;JR NZ,BLOKWR2 JR NZ,.FindCluster
PUSH BC
JR NZ,.GetSavedCluster
; ;
PUSH BC PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
PUSH DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
; [ ] fat32
CALL G_CLUST CALL G_CLUST
JP C,.Error JP C,.Error_6
;
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H
; [ ] fat32
EXX
LD HL,0 ;!FIXIT
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),L ; START CLUSTER High
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H
EXX
;
LD DE,(FatBuffer.ENDCLUS_LOW) LD DE,(FatBuffer.ENDCLUS_LOW)
CALL WRITE_TO_FAT CALL WRITE_TO_FAT
PUSH HL ;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;!TEST ;!TODO 2/12/23 [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE? ;PUSH HL
;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª ;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
;POP HL
;
POP DE ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
POP BC ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
; ;
POP HL
POP BC
INC B INC B
JP .WR2 INC D ; [x] fat32
PUSH DE
JP .enter_loop
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
.GetSavedCluster: .FindCluster: CALL GetSavedCluster
_GetSavedCluster .WR2 ;HL': HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ 
;DE : BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (D=D+1, B=B+1)
; ;
PUSH DE ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
JP .enter_loop
;
; [x] fat32
.loop_big: PUSH BC
LD BC,0
.loop: PUSH BC .loop: PUSH BC
CALL READ_FROM_FAT CALL READ_FROM_FAT
JR NC,.WRB JR NC,.next
; end of chain - get new cluster
; [ ] fat32
PUSH HL PUSH HL
EXX
PUSH HL
EXX
CALL INC_FAT CALL INC_FAT
EXX
POP HL POP HL
JP C,.Error EXX
POP HL
JP C,.Error_6
;
CALL READ_FROM_FAT CALL READ_FROM_FAT
.WRB: POP BC .next: POP BC
EX DE,HL EX DE,HL
; DEC BC EXX
.WR2: EX DE,HL
; LD A,B EXX
; OR C .enter_loop: INC B
; JR NZ,.loop
INC B
DEC BC DEC BC
DJNZ .loop DJNZ .loop
POP BC ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
INC B
DEC BC
DJNZ .loop_big
;;;;
;
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
_SaveGetedCluster POP DE
POP BC
CALL SaveGotCluster
; ;
POP DE POP DE
POP BC POP BC
; (SP) = (RET)
;
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
SUB E SUB E
LD C,A LD C,A
@ -869,8 +891,7 @@ BLOK_WR:
OR A OR A
RET Z RET Z
; ;
.big_loop: .big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster
LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster
LD A,B LD A,B
SUB (HL) SUB (HL)
LD B,A LD B,A
@ -913,20 +934,161 @@ BLOK_WR:
; ;
JP .big_loop JP .big_loop
; ;
.Error: POP BC .Error_6: POP BC
POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
.ErrorWrite:
POP BC POP BC
.Error_4: POP BC
POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
.ErrorWrite: POP BC
POP DE POP DE
LD A,DSS_Error.sys.WRITE_ERROR LD A,DSS_Error.sys.WRITE_ERROR
;SCF ;SCF
RET RET
; ;
.ErrorFull: .ErrorFull: POP BC
POP BC
LD A,DSS_Error.sys.DISK_FULL LD A,DSS_Error.sys.DISK_FULL
;SCF ;SCF
RET RET
/*
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; ‚室: HL - ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
; BC - ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
; ‚ë室: HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ  (¬« ¤è¥¥ á«®¢®)
; BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
GetSavedCluster:
INC B
;PUSH DE ; ¯¥à¢ë© ª« áâ¥à ä ©«  (áâ à襥 á«®¢®)
LD E,(IY+_sFM.KnownCluster_L)
LD D,(IY+_sFM.KnownCluster_L+1)
LD A,E
OR D
RET Z
;
DEC B
PUSH DE ; KnownCluster_H
PUSH HL ; ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
PUSH BC ; ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
LD E,(IY+_sFM.KnownOffset_L)
LD D,(IY+_sFM.KnownOffset_L+1)
LD A,D
OR E
JR Z,.noOptimization_3
;
POP HL ; ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
SBC HL,DE
JR C,.noOptimization_2
LD C,L
LD B,H
POP DE ; ¡ « ­á á⥪ 
POP HL
; ®¯â¨¬¨§ æ¨ï: HL - ­¥ ¯¥à¢ë© ª« áâ¥à ä ©« ,   KnownCluster
; BC - à ááâ®ï­¨¥ ¤® âॡ㥬®£® ᬥ饭¨ï ®â KnownCluster
;
INC B
RET
;
.noOptimization_3:
POP BC
.noOptimization_2:
POP HL
.noOptimization_1:
POP DE
INC B
RET
*/
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; ‚室: DE - ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
; BC - ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
; HL - ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
; HL' - ¯¥à¢ë© ª« áâ¥à ä ©«  (áâ à襥 á«®¢®)
; ‚ë室: HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ  (¬« ¤è¥¥ á«®¢®)
; HL' - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ  (áâ à襥 á«®¢®)
; DE - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®, D=D+1)
; BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®, B=B+1)
; ­¥ ¯®àâ¨â HL, HL' ¨ DE:BC ¥á«¨ ®¯â¨¬¨§ æ¨ï ­¥ áà ¡®â « 
GetSavedCluster:
XOR A
CP (IY+_sFM.OptimizedClusters)
JR Z,.noOptimization_0
;
PUSH DE
PUSH HL ; ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
; ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
EX DE,HL
LD E,(IY+_sFM.KnownOffset_H)
LD D,(IY+_sFM.KnownOffset_H+1)
; ¯à®¢¥àª  áâ à襣® á«®¢ 
AND A
SBC HL,DE
JR C,.noOptimization_2
;
PUSH BC
EX DE,HL
LD H,B
LD L,C
LD C,(IY+_sFM.KnownOffset_L)
LD B,(IY+_sFM.KnownOffset_L+1)
; ¯à®¢¥àª  ¬« ¤è¥£® á«®¢ 
SBC HL,BC
LD BC,0
EX DE,HL
SBC HL,BC
JR C,.noOptimization_3
EX DE,HL
LD B,H
LD C,L
; DE:BC ­®¢®¥ ᬥ饭¨¥ ®â ¨§¢¥áâ­®£® ª« áâ¥à  ä ©«  (¢ ª« áâ¥à å)
;
LD L,(IY+_sFM.KnownCluster_L)
LD H,(IY+_sFM.KnownCluster_L+1)
EXX
LD L,(IY+_sFM.KnownCluster_H)
LD H,(IY+_sFM.KnownCluster_H+1)
EXX
; ¡ « ­á á⥪ 
POP AF
POP AF
POP AF
; ¤«ï 横«  DJNZ
INC B
INC D
RET
;
.noOptimization_3:
POP BC
.noOptimization_2:
POP HL
.noOptimization_1:
POP DE
.noOptimization_0:
INC B
INC D
RET
;[x] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
SaveGotCluster: LD A,C
OR B
OR E
OR D
RET Z
;
LD (IY+_sFM.KnownOffset_L),C
LD (IY+_sFM.KnownOffset_L+1),B
LD (IY+_sFM.KnownOffset_H),E
LD (IY+_sFM.KnownOffset_H+1),D
;
LD (IY+_sFM.KnownCluster_L),L
LD (IY+_sFM.KnownCluster_L+1),H
EXX
LD (IY+_sFM.KnownCluster_H),L
LD (IY+_sFM.KnownCluster_H+1),H
EXX
;
LD A,1
LD (IY+_sFM.OptimizedClusters),A
RET
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////

View File

@ -320,11 +320,10 @@ BC_Div_DE:
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ;
; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). ‹¥£ª® ¯¥à¥¤¥« âì ¯®¤ HL:DE / A => HL:DE.A
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
DIV_for_SPC: DIV_for_SPC:
LD A,C LD C,A
DEC A DEC A
JR Z,.exit JR Z,.exit
; ;
@ -333,135 +332,17 @@ DIV_for_SPC:
LD A,C LD A,C
RRCA RRCA
; ;
.loop: SRL H : RR L .loop: SRL H
RR D : RR E RR L
RR D
RR E
RRCA RRCA
JP NC,.loop JP NC,.loop
LD A,B LD A,B
; .exit: LD B,D
.exit: LD XH,D LD C,E
LD XL,E
EX DE,HL EX DE,HL
LD H,0 LD H,0
LD L,A LD L,A
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; DIV32: LD A,#FF
; LD B,E
; .loop: SRL C
; JR C,.exitLoop
; SRL H : RR L : RR D : RR E : SLA A
; JP .loop
; .exitLoop:
; CPL
; AND B
; LD XH,D
; LD XL,E
; EX DE,HL
; LD H,0
; LD L,A
; RET
; DEFINE NEW_DIV 1
; DIV32: LD XH,D
; LD XL,E
; IFN NEW_DIV
; EX DE,HL
; LD HL,0
; LD A,#20
; DIV001: ADD IX,IX
; EX DE,HL
; ADC HL,HL
; EX DE,HL
; ADC HL,HL
; SBC HL,BC
; JR NC,DIV002
; ADD HL,BC
; DEC A
; JR NZ,DIV001
; RET
; DIV002: INC IX
; DEC A
; JR NZ,DIV001
; RET
; ELSE
; div32_16:
; ;HLIX/BC -> HLIX remainder DE
; ;174+4*div32_16_sub8
; ;min: 2186cc
; ;max: 2794cc
; ;avg: 2466cc
; ;61 bytes
; ex de,hl ; 4
; ; Negate BC to allow add instead of sbc
; xor a ; 4
; ; Need to set HL to 0 anyways, so save 2cc and a byte
; ld h,a ; 4
; ld l,a ; 4
; sub c ; 4
; ld c,a ; 4
; sbc a,a ; 4
; sub b ; 4
; ld b,a ; 4
; ld a,d ; 4
; call div32_16_sub8 ; 17
; rla ; 4
; ld d,a ; 4
; ld a,e ; 4
; call div32_16_sub8 ; 17
; rla ; 4
; ld e,a ; 4
; ld a,ixh ; 8
; call div32_16_sub8 ; 17
; rla ; 4
; ld ixh,a ; 8
; ld a,ixl ; 8
; call div32_16_sub8 ; 17
; rla ; 4
; ld ixl,a ; 8
; ;ex de,hl ; 4
; ret ; 10
; div32_16_sub8:
; ;119+8*div32_16_sub
; ;min: 503cc
; ;max: 655cc
; ;avg: 573cc
; call 1F
; 1:
; ;17+2(17+2(div32_16_sub)))
; call 1F
; 1:
; ;17+2(div32_16_sub)
; call div32_16_sub
; div32_16_sub:
; ;48+{8,0+{0,19}}
; ;min: 48cc
; ;max: 67cc
; ;avg: 56.75cc
; rla ; 4
; adc hl,hl ; 15
; jr c,1F ;12/7
; add hl,bc ; 11
; ret c ;11/5
; sbc hl,bc ; 15
; ret ; 10
; 1:
; add hl,bc ; 11
; scf ; 4
; ret ; 10
; ENDIF
;

View File

@ -45,11 +45,11 @@
.DRIVE: BYTE #00 ;+ #28 +40 DRIVE OR CURRENT .DRIVE: BYTE #00 ;+ #28 +40 DRIVE OR CURRENT
.ACCESS_MODE: BYTE #00 ;+ #29 +41 ACCESS MODE ¯à¨§­ ª ¨§¬¥­¥­¨ï ä ©«  .ACCESS_MODE: BYTE #00 ;+ #29 +41 ACCESS MODE ¯à¨§­ ª ¨§¬¥­¥­¨ï ä ©« 
.TASK_NUM: BYTE #00 ;+ #2A +42 TASK .TASK_NUM: BYTE #00 ;+ #2A +42 TASK
;.EMPTY: BYTE #00 ;+ #2B +43 EMPTY .OptimizedClusters BYTE #00 ;+ #2B +43
.KnownCluster_L: WORD #0000 ;+ #2B +43 Œ« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩«  .KnownCluster_L: WORD #0000 ;+ #2C +44 Œ« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩« 
.KnownCluster_H: WORD #0000 ;+ #2C +44 ‘â à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩«  .KnownCluster_H: WORD #0000 ;+ #2E +46 ‘â à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩« 
.KnownOffset_L: WORD #0000 ;+ #2D +45 Œ« ¤è¥¥ á«®¢® ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à . .KnownOffset_L: WORD #0000 ;+ #30 +48 Œ« ¤è¥¥ á«®¢® ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à .
.KnownOffset_H: WORD #0000 ;+ #2E +46 ‘â à襥 á«®¢® ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à . .KnownOffset_H: WORD #0000 ;+ #32 +50 ‘â à襥 á«®¢® ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à .
ENDS ENDS
; ;

@ -1 +1 @@
Subproject commit 42dfec072030351eb386205ead32983bbc1c4909 Subproject commit 68681fbc50da463f1debae860e6db64603886d39