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 (IY+_sFM.TASK_NUM),A
XOR A
; [ ] fat32
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
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+1),A

View File

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

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