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' - ­®¬¥à  ª« áâ¥à  (áâ à襥 á«®¢®)
; CF - ª®­¥æ 楯®çª¨ ; de - ­®¬¥à á«¥¤. ª« áâ¥à  (¬« ¤è¥¥ á«®¢®. ¥á«¨ 0, â® ª« áâ¥à hl ᢮¡®¤¥­)
;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb ; de' - ­®¬¥à á«¥¤. ª« áâ¥à  (áâ à襥 á«®¢®. ¥á«¨ 0, â® ª« áâ¥à hl' ᢮¡®¤¥­)
; CF - ª®­¥æ 楯®çª¨
;!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
;
SET_PAGE_X FATPAGE .correct_cluster:
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,199 +571,165 @@ 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 ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
LD C,A CALL DIV_for_SPC
LD B,0 PUSH HL ; ®áâ â®ª DIV_for_SPC
;HL:DE / BC => DE:IX HL-OSTATOK ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
CALL DIV_for_SPC PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
; [ ] fat32. ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb. ˆá¯®«ì§®¢ âì DE PUSH DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
LD B,XH ;
LD C,XL EXX
PUSH HL ; ®áâ â®ª DIV_for_SPC LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER LD A,L
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) OR H
LD A,L EXX
OR H LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER Low
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE OR L
;JR NZ,BLOKRD2 OR H
PUSH BC JR Z,.fast_exit_4
;PUSH DE ; [ ] áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  (à ­ìè¥ ¨£­®à¨à®¢ «®áì) CALL GetSavedCluster
JR Z,.ECL2 ;HL': HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ 
;JP ECL2 ;RY01 JR BLOKRD0 ;DE : BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (D=D+1, B=B+1)
_GetSavedCluster .enter_loop1 ;
; PUSH DE ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
.loop1: PUSH BC JP .enter_loop1
CALL READ_FROM_FAT ;
POP BC .fast_exit_5: POP DE
JR C,.ECL2 ;RY01 .fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
EX DE,HL POP DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
; DEC BC POP BC
.enter_loop1: ;
; LD A,B ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å POP BC
; OR C POP DE
; JR NZ,.loop1 AND A
INC B RET
DEC BC ; [x] fat32
DJNZ .loop1 .loop1_big: PUSH BC
;POP DE ; [ ] áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  (à ­ìè¥ ¨£­®à¨à®¢ «®áì) LD BC,0
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE .loop1_small: PUSH BC
_SaveGetedCluster CALL READ_FROM_FAT
; POP BC
POP DE ; ®áâ â®ª DIV_for_SPC JR C,.fast_exit_5 ;RY01
POP BC ; HL:DE - FP (in sectors) EX DE,HL
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) EXX
SUB E EX DE,HL
LD C,A ;\ EXX
CP B ; \ .enter_loop1: INC B
JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \ DEC BC ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO à §®¡à âìáï DJNZ .loop1_small
.skip1: LD A,B ; / POP BC ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
SUB C ; / INC B
LD B,A ;/ DEC BC
PUSH HL DJNZ .loop1_big
PUSH BC ;;;;
PUSH DE ;
CALL NSECTOR ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP DE POP DE
ADD IX,DE POP BC
JR NC,.skip2 CALL SaveGotCluster
INC HL ;
.skip2: LD DE,(READ.PointerOnBuffer) POP DE ; ®áâ â®ª DIV_for_SPC
LD A,(FatBuffer.DRIVE) POP BC ; HL:DE - FP (in sectors)
LD B,C ; (SP) = (RET)
LD C,Dss.DRV.Read ;
RST ToDSS.DRV LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
JR C,.Error SUB E
POP BC LD C,A ;\
LD HL,(READ.PointerOnBuffer) CP B ; \
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \
;!TEST LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO à §®¡à âìáï
LD A,B .skip1: LD A,B ; /
LD B,C SUB C ; /
.loop2: ADD HL,DE LD B,A ;/
;DEC C PUSH HL
;JR NZ,.loop2 PUSH BC
DJNZ .loop2 PUSH DE
LD (READ.PointerOnBuffer),HL CALL NSECTOR
POP DE POP DE
;LD A,B ADD IX,DE
OR A JR NC,.skip2
RET Z INC HL
LD B,A .skip2: LD DE,(READ.PointerOnBuffer)
; LD A,(FatBuffer.DRIVE)
.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD B,C
LD A,B LD C,Dss.DRV.Read
SUB (HL) RST ToDSS.DRV
LD B,A JR C,.Error
LD C,(HL) POP BC
JR NC,.BLOKRD7 LD HL,(READ.PointerOnBuffer)
LD B,0 LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
ADD A,(HL) ;0 AND CF ;!TEST
LD C,A LD A,B
OR A ;CLEAR CF LD B,C
RET Z .loop2: ADD HL,DE
.BLOKRD7: ;DEC C
EX DE,HL ;JR NZ,.loop2
PUSH BC DJNZ .loop2
CALL READ_FROM_FAT LD (READ.PointerOnBuffer),HL
POP BC POP DE
JR C,.ECL1 ;RY01 ;LD A,B
EX DE,HL OR A
PUSH HL RET Z
PUSH BC LD B,A
CALL NSECTOR ;
LD DE,(READ.PointerOnBuffer) .loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster
LD A,(FatBuffer.DRIVE) LD A,B
LD B,C SUB (HL)
LD C,Dss.DRV.Read LD B,A
RST ToDSS.DRV LD C,(HL)
JR C,.Error JR NC,.BLOKRD7
POP BC LD B,0
LD HL,(READ.PointerOnBuffer) ADD A,(HL) ;0 AND CF
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) LD C,A
.loop3: ADD HL,DE OR A ;CLEAR CF
DEC C RET Z
JR NZ,.loop3 ;
LD (READ.PointerOnBuffer),HL .BLOKRD7: EX DE,HL
POP DE PUSH BC
JP .loop4 CALL READ_FROM_FAT
; POP BC
.Error: POP BC JR C,.ECL1 ;RY01
POP DE EX DE,HL
;SCF PUSH HL
RET PUSH BC
; CALL NSECTOR
.ECL1: AND A LD DE,(READ.PointerOnBuffer)
RET LD A,(FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Read
RST ToDSS.DRV
JR C,.Error
POP BC
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
.loop3: ADD HL,DE
DEC C
JR NZ,.loop3
LD (READ.PointerOnBuffer),HL
POP DE
JP .loop4
;
.Error: POP BC
POP DE
;SCF
RET
;
.ECL1: AND A
RET
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
; BLOK_WR.Error: ; BLOK_WR.Error:
@ -763,170 +744,351 @@ 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 CALL DIV_for_SPC
;HL:DE / BC => DE:IX HL-OSTATOK PUSH HL ; ®áâ â®ª DIV_for_SPC
CALL DIV_for_SPC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; [ ] fat32. ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD B,XH PUSH DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
LD C,XL ;
PUSH HL ;RESIDUE EXX
LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
LD A,H LD A,L
OR L OR H
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE EXX
;JR NZ,BLOKWR2 LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER
PUSH BC LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
JR NZ,.GetSavedCluster OR L
; OR H
PUSH BC JR NZ,.FindCluster
CALL G_CLUST ;
JP C,.Error PUSH BC ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L PUSH DE ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H ; [ ] fat32
LD DE,(FatBuffer.ENDCLUS_LOW) CALL G_CLUST
CALL WRITE_TO_FAT JP C,.Error_6
PUSH HL ;
;!TEST ;!TODO 2/12/23 [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE? LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L
;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H
; ; [ ] fat32
POP HL EXX
POP BC LD HL,0 ;!FIXIT
INC B LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),L ; START CLUSTER High
JP .WR2 LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE EXX
.GetSavedCluster: ;
_GetSavedCluster .WR2 LD DE,(FatBuffer.ENDCLUS_LOW)
; CALL WRITE_TO_FAT
.loop: PUSH BC ;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
CALL READ_FROM_FAT ;PUSH HL
JR NC,.WRB ;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
PUSH HL ;POP HL
CALL INC_FAT ;
POP HL POP DE ; ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
JP C,.Error POP BC ; [x] fat32 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
CALL READ_FROM_FAT ;
.WRB: POP BC INC B
EX DE,HL INC D ; [x] fat32
; DEC BC PUSH DE
.WR2: JP .enter_loop
; LD A,B ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; OR C .FindCluster: CALL GetSavedCluster
; JR NZ,.loop ;HL': HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ 
INC B ;DE : BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (D=D+1, B=B+1)
DEC BC ;
DJNZ .loop PUSH DE ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
JP .enter_loop
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;
_SaveGetedCluster ; [x] fat32
; .loop_big: PUSH BC
POP DE LD BC,0
POP BC .loop: PUSH BC
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) CALL READ_FROM_FAT
SUB E JR NC,.next
LD C,A ; end of chain - get new cluster
CP B ; [ ] fat32
JR C,.WR3 ;SIZE > RESIDUE CLUSTER PUSH HL
LD C,B ;SIZE < CLUSTER EXX
.WR3: LD A,B PUSH HL
SUB C EXX
LD B,A CALL INC_FAT
PUSH HL EXX
PUSH BC POP HL
PUSH DE EXX
CALL NSECTOR POP HL
POP DE JP C,.Error_6
ADD IX,DE ;
JR NC,.WR4 CALL READ_FROM_FAT
INC HL .next: POP BC
; DOUBLE 1 EX DE,HL
.WR4: LD DE,(READ.PointerOnBuffer) EXX
LD A,(FatBuffer.DRIVE) EX DE,HL
LD B,C EXX
LD C,Dss.DRV.Write .enter_loop: INC B
RST ToDSS.DRV DEC BC
JR C,.ErrorWrite DJNZ .loop
POP BC POP BC ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
LD HL,(READ.PointerOnBuffer) INC B
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) DEC BC
; DJNZ .loop_big
.loop2: ADD HL,DE ;;;;
DEC C ;
JR NZ,.loop2 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; POP DE
LD (READ.PointerOnBuffer),HL POP BC
POP DE CALL SaveGotCluster
; ;
LD A,B POP DE
OR A POP BC
RET Z ; (SP) = (RET)
; ;
.big_loop: LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster SUB E
LD A,B LD C,A
SUB (HL) CP B
LD B,A JR C,.WR3 ;SIZE > RESIDUE CLUSTER
LD C,(HL) LD C,B ;SIZE < CLUSTER
JR NC,.WR7 .WR3: LD A,B
LD B,0 SUB C
ADD A,(HL) ;0 AND CF LD B,A
LD C,A PUSH HL
OR A ;CLEAR CF PUSH BC
RET Z PUSH DE
.WR7: EX DE,HL CALL NSECTOR
PUSH BC POP DE
CALL READ_FROM_FAT ADD IX,DE
JR NC,.WR9 JR NC,.WR4
PUSH HL INC HL
CALL INC_FAT ; DOUBLE 1
POP HL .WR4: LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Write
RST ToDSS.DRV
JR C,.ErrorWrite
POP BC
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
;
.loop2: ADD HL,DE
DEC C
JR NZ,.loop2
;
LD (READ.PointerOnBuffer),HL
POP DE
;
LD A,B
OR A
RET Z
;
.big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster
LD A,B
SUB (HL)
LD B,A
LD C,(HL)
JR NC,.WR7
LD B,0
ADD A,(HL) ;0 AND CF
LD C,A
OR A ;CLEAR CF
RET Z
.WR7: EX DE,HL
PUSH BC
CALL READ_FROM_FAT
JR NC,.WR9
PUSH HL
CALL INC_FAT
POP HL
JR C,.ErrorFull JR C,.ErrorFull
CALL READ_FROM_FAT CALL READ_FROM_FAT
.WR9: POP BC .WR9: POP BC
EX DE,HL EX DE,HL
PUSH HL PUSH HL
PUSH BC PUSH BC
CALL NSECTOR CALL NSECTOR
; DOUBLE 1 ; DOUBLE 1
LD DE,(READ.PointerOnBuffer) LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE) LD A,(FatBuffer.DRIVE)
LD B,C LD B,C
LD C,Dss.DRV.Write LD C,Dss.DRV.Write
RST ToDSS.DRV RST ToDSS.DRV
JR C,.ErrorWrite JR C,.ErrorWrite
POP BC POP BC
LD HL,(READ.PointerOnBuffer) LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
.loop3: ADD HL,DE .loop3: ADD HL,DE
DEC C DEC C
JR NZ,.loop3 JR NZ,.loop3
LD (READ.PointerOnBuffer),HL LD (READ.PointerOnBuffer),HL
POP DE POP DE
; ;
JP .big_loop JP .big_loop
; ;
.Error: POP BC .Error_6: POP BC
POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP BC
.ErrorWrite: .Error_4: POP BC
POP BC POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP DE .ErrorWrite: POP BC
LD A,DSS_Error.sys.WRITE_ERROR POP DE
;SCF LD A,DSS_Error.sys.WRITE_ERROR
RET ;SCF
; RET
.ErrorFull: ;
POP BC .ErrorFull: 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,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: DIV_for_SPC:
LD A,C LD C,A
DEC A DEC A
JR Z,.exit JR Z,.exit
; ;
AND E AND E
LD B,A ; ®áâ â®ª LD B,A ; ®áâ â®ª
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