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