Optimized NSECTOR and RD_BPB

This commit is contained in:
Anatoliy Belyanskiy 2023-09-15 04:28:18 +10:00
parent 6224d9fcb6
commit 8a1abd44ab
7 changed files with 171 additions and 145 deletions

View File

@ -179,7 +179,7 @@ BLOK_RD: PUSH BC
LD C,A
LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV32 ;!FIXIT § ¬¥­¨âì ¢ë§®¢ HLDE/BC ­  HLDE/C
CALL DIV_for_SPC ;!FIXIT § ¬¥­¨âì ¢ë§®¢ HLDE/BC ­  HLDE/C
;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb
LD B,XH
LD C,XL
@ -349,7 +349,7 @@ BLOK_WR PUSH BC
LD C,A
LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV32
CALL DIV_for_SPC
LD B,XH
LD C,XL
@ -565,22 +565,34 @@ READ: LD (R_POINT),HL
;
JP C,RPERR1
;<3B> áçñâ ᬥ饭¨ï ¢ ᥪâ®à å
LD C,(IY+_sFM.F_POSITION)
; LD C,(IY+_sFM.F_POSITION)
; LD E,(IY+_sFM.F_POSITION+1)
; LD A,E
; AND #01
; LD B,A
; LD D,(IY+_sFM.F_POSITION+2)
; LD L,(IY+_sFM.F_POSITION+3)
; LD H,0
; OR A
; RR L
; RR D
; RR E
LD H,0
LD L,(IY+_sFM.F_POSITION+3)
LD D,(IY+_sFM.F_POSITION+2)
LD E,(IY+_sFM.F_POSITION+1)
LD A,E
AND #01
LD B,A
LD D,(IY+_sFM.F_POSITION+2)
LD L,(IY+_sFM.F_POSITION+3)
LD H,0
OR A
LD C,(IY+_sFM.F_POSITION)
;OR A
RR L
RR D
RR E
;HL:DE FP (in sectors)
;BC FP residue (in bytes)
;
LD A,B
;LD A,B
OR C
JP NZ,ROV1
ROV4: POP BC
@ -890,28 +902,58 @@ WOV3: PUSH HL
ADC HL,BC
JP WOV4
////////////// OLD ////////////////
; HL - CLUSTER
; HL:IX - SECTOR
; NSECTOR: DEC HL
; DEC HL
; EX DE,HL
; LD A,(BootSector.S_P_C)
; LD B,A
; LD HL,0
; LD IX,0
; ADD_DE1: ADD IX,DE
; JR NC,ADD_DE2
; INC HL
; ADD_DE2: DJNZ ADD_DE1
; LD DE,(FatBuffer.DAT_FRM) ;first data sector
; ADD IX,DE
; LD DE,#0000
; ADC HL,DE
; RET
/////////////////////////////////////
; HL - CLUSTER
; HL:IX - SECTOR
NSECTOR: DEC HL
DEC HL
EX DE,HL
LD DE,0
LD A,(BootSector.S_P_C)
LD B,A
LD HL,0
LD IX,0
ADD_DE1: ADD IX,DE
JR NC,ADD_DE2
INC HL
ADD_DE2: DJNZ ADD_DE1
LD DE,(FatBuffer.DAT_FRM)
XOR 1
JR Z,.skip
;
RRA
.loop: ADD HL,HL
RL E
RL D
RRCA
JP NC,.loop
;
.skip: EX DE,HL
LD XL,E
LD XH,D
LD DE,(FatBuffer.DAT_FRM) ;first data sector
ADD IX,DE
LD DE,#0000
; A=0
LD D,A
LD E,A
ADC HL,DE
RET
/////////////////////////////////////
; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). ‹¥£ª® ¯¥à¥¤¥« âì ¯®¤ HL:DE / A => HL:DE.A
DIV32: LD A,C
DIV_for_SPC:
LD A,C
DEC A
JR Z,.exit
;
@ -923,7 +965,7 @@ DIV32: LD A,C
.loop: SRL H : RR L
RR D : RR E
RRCA
JR NC,.loop
JP NC,.loop
LD A,B
;
.exit: LD XH,D

View File

@ -210,25 +210,25 @@ RD_BPB: LD C,SLOT3
RST ToDSS.DRV
POP BC
OUT (C),B
JP C,RDERR1
JP C,DOS_X_Error.Not_ready
PUSH IY
LD DE,#AA55 ;R05
;R08 LD HL,(BOOT+510) ;R07
LD HL,(SECBUF+510) ;R08
AND A ;R05
SBC HL,DE ;R05
JP NZ,ERR_BPB ;R05
;R08
LD HL,SECBUF ;R08
LD DE,BootSector ;R08
LD BC,_sBOOT_SEC ;R08 size
LD HL,(SECBUF+510) ;R08 ;R07
;R05
AND A
SBC HL,DE
JP NZ,DOS_X_Error.UnknownBPB
;R08
LD HL,SECBUF
LD DE,BootSector
LD BC,_sBOOT_SEC ; size
LDIR
;R08
;
LD IY,BootSector
LD A,(IY+_sBOOT_SEC.ID_FORM)
CP #F0
JP C,ERR_BPB
JP C,DOS_X_Error.UnknownBPB
;!TEST
;LD HL,0 ; calc. first sector FAT
@ -250,17 +250,18 @@ RD_BPB: LD C,SLOT3
LD D,(IY+_sBOOT_SEC.S_P_F+1)
LD A,(BootSector.FAT_NUM) ; amount FATs
CP 1
JR Z,C_DATA1
JR Z,.loop1
DEC A
ADD HL,DE
LD (FatBuffer.FAT2_XX),HL
C_DATA1 ADD HL,DE
;C_DATA1
.loop1: ADD HL,DE
DEC A
JR NZ,C_DATA1
LD (FatBuffer.DIR_FRM),HL ; first sector DIR
JR NZ,.loop1
LD C,(IY+#0B) ; Size sectors
LD B,(IY+#0C)
LD (FatBuffer.DIR_FRM),HL ; first sector DIR
LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors
LD B,(IY+_sBOOT_SEC.B_P_S+1)
RL C
RL B
RL C
@ -276,11 +277,12 @@ C_DATA1 ADD HL,DE
EX DE,HL
DEC HL
XOR A
NEXTAD2
INC A
JP Z,ERR_BPB
;NEXTAD2
.loop2: INC A
JP Z,DOS_X_Error.UnknownBPB
SBC HL,BC
JR NC,NEXTAD2
JR NC,.loop2
EX DE,HL
LD C,A ; A - sectors in DIR
LD B,0
@ -290,58 +292,68 @@ NEXTAD2
;LD HL,0
LD H,B ; âãâ ¢ B ­®«ì ¤®«¦¥­ ¡ëâì
LD L,B
LD C,(IY+#0B) ; Size sector
LD B,(IY+#0C)
LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector
LD B,(IY+_sBOOT_SEC.B_P_S+1)
LD A,(BootSector.S_P_C)
NEXTAD3
ADD HL,BC ; calc. cluster size
////////////////////////////////////////////////////////////////////////
IF COMPILE_UNUSED_CODE
;!TODO ­¥ ¨á¯®«ì§ãîâáï §­ ç¥­¨ï ¢ëç¨á«ï¥¬ë¥ ¨ á®åà ­ï¥¬ë¥ ¢ FatBuffer
;NEXTAD3
.loop3: ADD HL,BC ; calc. cluster size
DEC A
JR NZ,NEXTAD3
JR NZ,.loop3
LD (FatBuffer.CLU_LEN),HL
EX DE,HL
LD HL,#3FFF
LD HL,#3FFF ;!TODO FATcacheSize
XOR A
NEXTAD4
INC A
JP Z,ERR_BPB
;NEXTAD4
.loop4: INC A
JP Z,DOS_X_Error.UnknownBPB
SBC HL,DE
JR NC,NEXTAD4
JR NC,.loop4
LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k)
ENDIF
////////////////////////////////////////////////////////////////////////
LD HL,BootSector.ID_FAT
LD DE,FatBuffer.MSG
LD B,3
R_BPBL1
LD A,(DE)
;R_BPBL1
.loop5: LD A,(DE)
CP (HL)
JP NZ,IBMDOS_
JP NZ,.IBM_DOS
INC HL
INC DE
DJNZ R_BPBL1
FID: LD A,(HL)
DJNZ .loop5
;FID
.loop6: LD A,(HL)
INC HL
CP ' '
JR Z,FID
JR Z,.loop6
CP '1'
JP NZ,ERR_BPB
JP NZ,DOS_X_Error.UnknownBPB
LD A,(HL)
CP '6' ; FAT16
LD HL,#FFFF
JR Z,BPB_FAT
JR Z,.BPB_FAT
CP '2' ; FAT12
JP NZ,ERR_BPB
JP NZ,DOS_X_Error.UnknownBPB
LD HL,#0FFF
BPB_FAT:
.BPB_FAT:
LD (FatBuffer.FAT_TYP),A
LD (FatBuffer.ENDCLUS),HL
LD HL,0
LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track
LD B,(IY+_sBOOT_SEC.S_P_T+1)
LD A,(BootSector.HEADS)
BPB_L1: ; calc. sector per cylinder
.BPB_L1: ; calc. sector per cylinder
ADD HL,BC
DEC A
JR NZ,BPB_L1
JR NZ,.BPB_L1
LD (FatBuffer.S_X_H),HL
LD DE,(FatBuffer.DAT_FRM)
@ -354,30 +366,30 @@ BPB_L1: ; calc. sector per cylinder
LD H,(IY+_sBOOT_SEC.S_P_D+1)
LD A,H
OR L
JP NZ,HDDSMAL
JP NZ,.HDDSMAL
LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS)
LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1)
LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2)
LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3)
AND A
SBC HL,DE
JP NC,HDDBIG
JP NC,.HDDBIG
DEC BC
JP HDDBIG
HDDSMAL:
JP .HDDBIG
.HDDSMAL:
;AND A ;âãâ CF ¯®«î¡ á á¡à®è¥­ ¤®«¦¥­ ¡ëâì
SBC HL,DE
LD BC,0
HDDBIG LD A,(BootSector.S_P_C)
.HDDBIG: LD A,(BootSector.S_P_C)
SCF
S4C01 RRA
JR C,S4C02
.S4C01: RRA
JR C,.S4C02
RR B
RR C
RR H
RR L
JP S4C01
S4C02 INC HL
JP .S4C01
.S4C02: INC HL
LD (MAX_CLU),HL
POP IY
; LD DE,FAT
@ -402,9 +414,10 @@ S4C02 INC HL
XOR A
RET
IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM)
.IBM_DOS:
LD A,(IY+_sBOOT_SEC.ID_FORM)
CP #F0
JR C,ERR_BPB
JR C,DOS_X_Error.UnknownBPB
;????? ­ ¤® «¨ ¨§¬¥­¨âì?
// OR 2
// CP #FA ; ID ram-¤¨áª 
@ -412,22 +425,24 @@ IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM)
;?????
LD A,'6'
LD HL,#FFFF
JP Z,BPB_FAT
JP Z,.BPB_FAT
LD A,'2'
LD HL,#0FFF
JP BPB_FAT
JP .BPB_FAT
ERR_BPB:
DOS_X_Error:
.UnknownBPB:
POP IY
LD A,DSS_Error.sys.UNKNOWN_FORMAT
SCF
RET
RDERR1: LD A,DSS_Error.sys.NOT_READY
.Not_ready:
LD A,DSS_Error.sys.NOT_READY
;SCF
RET
;!FIXIT ª ¡ãä¥à ¬!
;!TODO ª ¡ãä¥à ¬!
FatBuffer:
.MSG: DB 'FAT'
.READ_PG: DB #00
@ -451,7 +466,7 @@ FatBuffer:
.ENDCLUS: DW #FFFF
;
;
;!TODO ª ¡ãä¥à ¬!
DIRSPEC: DB '\'
;BLOCK DIRSPEC.DEPTH,0 ;????? <20>ë«® 255, ã ‘ ©¬ ­  256
BLOCK DIRSPEC.DEPTH-1,0 ;????? <20>ë«® 255, ã ‘ ©¬ ­  256
@ -459,6 +474,7 @@ DIRSPEC: DB '\'
;R11
; !TODO ¯®ç¨­¨âì
IF SAVE_PATH_MACRO
SAVE_CUR_PATH
PUSH IX
PUSH IY
@ -525,6 +541,7 @@ BACK_CUR_PATH:
POP IX
POP IY
RET
ENDIF
;R11
;R12
@ -624,11 +641,11 @@ SCANDRV:
EI
RET
.ERROR_BOOTDRV_DIES:
LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_OPEN_S
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S
LD E,0
RST ToBIOS
LD BC,256*COLORS.PAPER.BLUE + BIOS.LP_CLS_WIN
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
LD DE,0
LD HL,#2050
RST ToBIOS
@ -647,12 +664,15 @@ SCANDRV:
RST ToBIOS
LD HL,#A000
LD DE,0*256 + COLORS.FLASH + COLORS.PAPER.BLUE + COLORS.INC.WHITE
LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
.loop: DI
; .loop: LD A,R
; AND 7
; OUT (BorderColor),A
HALT
JR .loop
@ -663,45 +683,7 @@ SCANDRV:
RET
;
.TMP_BUFFER: BLOCK 3,#FF
MODULE COLORS
;
INC:
.BLACK EQU #00
.BLUE EQU #01
.GREEN EQU #02
.CYAN EQU #03
.RED EQU #04
.MAGENTA EQU #05
.BROWN EQU #06
.LGRAY EQU #07
.DGRAY EQU #08
.LBLUE EQU #09
.LGREEN EQU #0A
.LCYAN EQU #0B
.LRED EQU #0C
.LMAGENT EQU #0D
.YELLOW EQU #0E
.WHITE EQU #0F
PAPER:
.BLACK EQU 16*INC.BLACK
.BLUE EQU 16*INC.BLUE
.GREEN EQU 16*INC.GREEN
.CYAN EQU 16*INC.CYAN
.RED EQU 16*INC.RED
.MAGENTA EQU 16*INC.MAGENTA
.BROWN EQU 16*INC.BROWN
.LGRAY EQU 16*INC.LGRAY
.DGRAY EQU 16*INC.DGRAY
.LBLUE EQU 16*INC.LBLUE
.LGREEN EQU 16*INC.LGREEN
.LCYAN EQU 16*INC.LCYAN
.LRED EQU 16*INC.LRED
.LMAGENT EQU 16*INC.LMAGENT
.YELLOW EQU 16*INC.YELLOW
.WHITE EQU 16*INC.WHITE
FLASH EQU #80
ENDMODULE
; .old_letter: DB #FF
; .old_DRIVE_ID: DB #FF
; .new_letter: DB #FF

View File

@ -30,6 +30,7 @@
includelua 'Shared_includes/lua/Functions.lua'
INCLUDE 'defines.inc'
include 'shared_includes/constants/sp2000.inc'
include 'shared_includes/constants/standart_colors.inc'
include 'shared_includes/constants/bios_equ.inc'
include 'shared_includes/constants/dss_equ.inc'
include 'shared_includes/structures/FileSystem.inc'

View File

@ -61,11 +61,11 @@ R_F_FAT:
EX DE,HL
LD A,DSS_Error.sys.DISK_FULL
RET C
EXX
EXX ;!TODO optimize
SET_PAGE_X FATPAGE
EXX ;!TODO optimize
EXX
PUSH HL
PUSH AF
LD A,(FatBuffer.FAT_TYP)
@ -77,17 +77,17 @@ R_F_F16:
AND #0F
LD H,A
LD A,B
; A/16
; swap bit7..4 and bit3..0.
RRCA
RRCA
RRCA
RRCA
;
AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT
LD DE,FAT
ADD HL,DE
LD E,(HL)
@ -247,7 +247,8 @@ W_T_F16:
AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
CP C
CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT
LD DE,FAT
ADD HL,DE
POP DE
@ -323,7 +324,7 @@ RE_FAT: PUSH HL
PUSH AF
LD A,(FATCASH.Update)
OR A
CALL NZ,WR_FAT_
CALL NZ,WR_FAT.Start
POP AF
LD L,A
LD H,0
@ -340,7 +341,7 @@ RE_FAT: PUSH HL
LD HL,0 ;HL:IX - SECTOR FAT FOR READING
LD DE,FAT ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE)
LD BC,16*256 + Dss.DRV.Read ;ॣ B: 16 * 512 = 8192 (CASH SIZE)
LD BC,16*256 + Dss.DRV.Read ;ॣ B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize
RST ToDSS.DRV
POP HL
RET
@ -350,13 +351,12 @@ WR_FAT: EXX
EXX
PUSH AF
CALL WR_FAT_
CALL .Start
POP AF
OUT (SLOT3),A
RET
WR_FAT_:
LD HL,(FATCASH)
;
.Start: LD HL,(FATCASH)
LD H,0
LD (FATCASH),HL
ADD HL,HL
@ -374,14 +374,14 @@ WR_FAT_:
LD A,16
AND A
SBC HL,DE
JR C,WALLFAT
JR C,.WALLFAT
EX DE,HL
LD HL,16
; AND A ;âãâ â®ç­® CF ­¥ ¢§¢¥¤ñ­
SBC HL,DE
JP C,FATERR
LD A,L
WALLFAT:
.WALLFAT:
LD H,B
LD L,C
LD DE,(FatBuffer.FAT_FRM)

View File

@ -1 +1 @@
255
275

View File

@ -4,6 +4,7 @@
;
DEFINE SHORT_RSTx10_TABLE 0 ; 㪮à®ç¥­­ ï â ¡«¨æ  ä㭪権 rst #10. 96 ä㭪権.
DEFINE COMPILE_UNUSED_CODE 0
;
;

@ -1 +1 @@
Subproject commit 7f4046e7fabff85738efcf2a7aa1dbbeca7af906
Subproject commit cf19a287a2cfe1946de5c1d50a255c43ae4fc390