mirror of
https://github.com/Tolik-Trek/Sprinter-BIOS.git
synced 2026-06-15 01:11:47 +03:00
Оптимизация FDD_DRIVER
This commit is contained in:
parent
648c089108
commit
0beb007b9d
@ -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
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user