Оптимизация FDD_DRIVER

This commit is contained in:
Tolik 2026-05-04 22:35:43 +10:00
parent 648c089108
commit 0beb007b9d

View File

@ -6,8 +6,8 @@
; AND A ; AND A
; RET ; RET
FDD_COUNTERS: FDD_COUNTERS:
.RW_Retries EQU 30;5 .RW_Retries EQU 5
.INTRQorDRQ EQU 4
;[]===========================================================[] ;[]===========================================================[]
;Function: Get Current Media Parameters ;Function: Get Current Media Parameters
@ -348,89 +348,75 @@ FDD_5x_LONG_WRITE:
;WRITE SECTOR ;WRITE SECTOR
;------------------------------- ;-------------------------------
FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries
.RETRY: ;DI .RETRY: PUSH HL
PUSH HL
PUSH DE PUSH DE
IN A,(SLOT3)
PUSH AF ; á®å࠭塞 ⥪ãéãî áâà ­¨æã
LD A,E LD A,E
INC A INC A
OUT (FDC_93.Sector),A OUT (FDC_93.Sector),A
;
LD B,4
LD C,FDC_93.Data
EXX
LD A,B ; COMMAND read or write
EXX
OUT (FDC_93.Command),A
;
; [ ] 15/04/25 à §¬¥à ᥪâ®à  ¡®«ìè¥, 祬 ãáâ ­®¢«¥­® ¢ SYS_PAGE.FDD_TABLE.BytesPerSector ¢ë§®¢¥â ®è¨¡ªã
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
EXX EXX
; [ ] 15/04/25 à §¬¥à ᥪâ®à  ¡®«ìè¥, 祬 ãáâ ­®¢«¥­® ¢ SYS_PAGE.FDD_TABLE.BytesPerSector ¢ë§®¢¥â ®è¨¡ªã
LD E,(IY + FDD_TABLE_s.BytesPerSector) LD E,(IY + FDD_TABLE_s.BytesPerSector)
LD D,(IY + FDD_TABLE_s.BytesPerSector + 1) LD D,(IY + FDD_TABLE_s.BytesPerSector + 1)
INC DE INC DE
;
BIT 5,B ; Set Z flag for read or NZ for write
EX AF,AF
LD A,B ; COMMAND read or write
EXX EXX
LD C,A
LD A,XH LD A,XH
OUT (SLOT3),A OUT (SLOT3),A
LD A,C ; COMMAND read or write
LD BC,FDD_COUNTERS.INTRQorDRQ*256 + FDC_93.Data
;ÛÛÛÛÛÛÛÛÛÛ Š<>ˆˆ<CB86>‰ Š ŠŽ<C5A0>Žˆ Š“‘ŽŠ <20>Ž… “<E28099>ŽŠˆ ŠŽŒ€<C592> „Ž <>ŸˆŸ <20>…‡“œ€ ÛÛÛÛÛÛÛÛÛÛ
OUT (FDC_93.Command),A
; ;
.wait_loop: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ .wait_loop: IN A,(FDC_93.DrvCTRL) ; 11 ;WAIT INTRQ or DRQ
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0). AND %1100'0000 ; 7 ;b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0), b6: DRQ (§ ¯à®á ¤ ­­ëå = 1).
JR NZ,.RW_PROC JR Z,.wait_loop_next ; 12 + 34 (.wait_loop_next)
; ; âãâ ¬ ªá¨¬ã¬ 64 â ªâ 
INC DE
LD A,E
OR D
JR NZ,.wait_loop
;
DJNZ .wait_loop
SCF
;JR .after_rw ; error
JR .after_rw_end ; error
;
.RW_PROC: IN A,(SLOT3)
EX AF,AF' EX AF,AF'
; [ ] 15/04/25 à §¬¥à ᥪâ®à  ¡®«ìè¥, 祬 ãáâ ­®¢«¥­® ¢ SYS_PAGE.FDD_TABLE.BytesPerSector ¢ë§®¢¥â ®è¨¡ªã JR NZ,.write_loop ; १ã«ìâ â BIT 5,B'
; LD A,SYS_PAGE ;
; OUT (SLOT3),A ;EX AF,AF'
; LD E,(IY + FDD_TABLE_s.BytesPerSector) ;READ BYTE. ¬¥¦¤ã .wait_loop ¨ .read_loop (INI) 64+11=75 ⠪⮢
; LD D,(IY + FDD_TABLE_s.BytesPerSector + 1)
; LD A,XH
; OUT (SLOT3),A
; INC DE
EXX
BIT 5,B
EXX
JR NZ,.write_loop ; १ã«ìâ â BIT 5,B
;READ BYTE
.read_loop: EXX .read_loop: EXX
DEC DE DEC DE
LD A,D LD A,D
OR E OR E
EXX EXX
JR Z,.SectorSizeError JR Z,.SectorSizeError
; ; ®â .wait_loop ¤®á 75+29=104 ⠪⮢
; ¯à¨¬¥à­® 10,4 ¬ªá ¯à¨ ãá«®¢­ëå á।­¨å 10 Œ£æ
; ¯à¨¬¥à­® 30 ¬ªá ¯à¨ 3,5 Œ£æ
; „®«¦­® ¡ëâì ­¥ ¡®«ìè¥ 16 ¬ªá ¤«ï 1.44 ¨«¨ 32 ¬ªá ¤«ï 720
INI INI
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
.wait_data_r: IN A,(FDC_93.DrvCTRL) .wait_data_r: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0). AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wait_data_r JR Z,.wait_data_r
JP P,.read_loop ; JUMP if "¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0" JP P,.read_loop ; JUMP if "¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0"
.rw_return: ; ;
;
.after_rw: EX AF,AF' .after_rw: EX AF,AF'
POP AF ; ¢®§¢à é ¥¬ ⥪ãéãî áâà ­¨æã
OUT (SLOT3),A OUT (SLOT3),A
EX AF,AF' EX AF,AF'
; ;
.after_rw_end: POP DE POP DE
POP HL POP HL
;EI
LD A,BIOS.Error.NotReady LD A,BIOS.Error.NotReady
JR C,.CMD_ERROR JR C,.CMD_ERROR
; ;
IN A,(FDC_93.Command) IN A,(FDC_93.Command)
LD C,A LD C,A
AND #7F AND #7F
; NORMAL EXIT RET Z ; NORMAL EXIT
RET Z ;
;
BIT 6,C BIT 6,C
LD A,BIOS.Error.WriteProtect LD A,BIOS.Error.WriteProtect
JR NZ,.error_exit JR NZ,.error_exit
@ -453,6 +439,16 @@ FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries
POP DE POP DE
JR .RETRY JR .RETRY
; ;
.wait_loop_next:
INC DE
LD A,E
OR D
JR NZ,.wait_loop
;
DJNZ .wait_loop
SCF
JR .after_rw ; error
;
.data_lost: DEC D ; ¯®â¥àï ¤ ­­ëå .data_lost: DEC D ; ¯®â¥àï ¤ ­­ëå
JR NZ,.RETRY JR NZ,.RETRY
; ;
@ -463,7 +459,6 @@ FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries
JR Z,.error_exit JR Z,.error_exit
; ;
LD A,BIOS.Error.Write ; Error Write LD A,BIOS.Error.Write ; Error Write
;
.error_exit: EX AF,AF' .error_exit: EX AF,AF'
LD A,#D0 ;!HARDCODE CMD Š<>1818ƒ93 LD A,#D0 ;!HARDCODE CMD Š<>1818ƒ93
OUT (FDC_93.Command),A ;STOP OPERATION OUT (FDC_93.Command),A ;STOP OPERATION
@ -474,7 +469,9 @@ FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries
LD A,BIOS.Error.SectorNotFound LD A,BIOS.Error.SectorNotFound
RET RET
; ;
;WRITE BYTE ;ÛÛÛÛÛÛÛÛÛÛ Š<>ˆˆ<CB86>‰ Š ŠŽ<C5A0>Žˆ Š“‘ŽŠ <20>Ž… “<E28099>ŽŠˆ ŠŽŒ€<C592> „Ž <>ŸˆŸ <20>…‡“œ€ ÛÛÛÛÛÛÛÛÛÛ
;WRITE BYTE
;.go_write: EX AF,AF'
.write_loop: EXX .write_loop: EXX
DEC DE DEC DE
LD A,D LD A,D
@ -483,21 +480,20 @@ FDD_RW_SECTOR: LD D,FDD_COUNTERS.RW_Retries
JR Z,.SectorSizeError JR Z,.SectorSizeError
; ;
OUTI OUTI
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
.wait_data_w: IN A,(FDC_93.DrvCTRL) .wait_data_w: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0). AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wait_data_w JR Z,.wait_data_w
JP P,.write_loop JP P,.write_loop
JP .rw_return JP .after_rw
; ;
.SectorSizeError: .SectorSizeError:
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
POP DE
POP HL
;EI
; A = 0 ; A = 0
LD C,A LD C,A
POP AF ; ¢®§¢à é ¥¬ ⥪ãéãî áâà ­¨æã
OUT (SLOT3),A
POP DE
POP HL
LD A,BIOS.Error.UnknownDevice LD A,BIOS.Error.UnknownDevice
JR .error_exit JR .error_exit