mirror of
https://github.com/Tolik-Trek/Sprinter-BIOS.git
synced 2026-06-15 17:31:46 +03:00
Оптимизация FDD_DRIVER
This commit is contained in:
parent
648c089108
commit
0beb007b9d
@ -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,88 +348,74 @@ 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
|
||||
@ -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
|
||||
;
|
||||
;ÛÛÛÛÛÛÛÛÛÛ Š<>ˆ’ˆ—<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
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user