FDD driver 5x работает с разными буферами для каждого из FDD

This commit is contained in:
Tolik 2026-01-26 21:15:40 +10:00
parent 67c829e788
commit 2a4e06db96
4 changed files with 103 additions and 83 deletions

@ -1 +1 @@
Subproject commit 2fec6202f716cfa3ed48fb9bfd79d1081cc2721b Subproject commit 5a2e8b02b384c515510798a2b94537211dfaa310

View File

@ -30,16 +30,22 @@
;[]===========================================================[] ;[]===========================================================[]
;!FIXIT ¢á¥£¤  ¨¤¥â à ¡®â  á ¤ ­­ë¬¨ ¤«ï ¤¨áª  € ;!FIXIT ¢á¥£¤  ¨¤¥â à ¡®â  á ¤ ­­ë¬¨ ¤«ï ¤¨áª  €
;!FIXIT ç¨â âì ¤ ­­ë¥ á ­ã«¥¢®© ¤®à®¦ª¨? <20>ਤ㬠âì çâ® ¤¥« âì á £¥®¬¥âਥ© ä«®¯ à¥© ;!FIXIT ç¨â âì ¤ ­­ë¥ á ­ã«¥¢®© ¤®à®¦ª¨? <20>ਤ㬠âì çâ® ¤¥« âì á £¥®¬¥âਥ© ä«®¯ à¥©
FDD_5x_GET_PAR: IN A,(SLOT3) FDD_5x_GET_PAR: CALL SELECT_FDD
RET C
;
IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
; LD L,(IY + FDD_TABLE_s.SECTORS)
LD HL,(SYS_PAGE.FDD_TABLE.SECTORS) ; L - Sectors, H - Heads LD H,(IY + FDD_TABLE_s.HEADS)
LD DE,(SYS_PAGE.FDD_TABLE.CYLINDL) LD E,(IY + FDD_TABLE_s.BytesPerSector)
LD IX,(SYS_PAGE.FDD_TABLE.BytesPerSector) LD D,(IY + FDD_TABLE_s.BytesPerSector + 1)
LD A,(SYS_PAGE.FDD_TABLE.DISK) PUSH DE
LD B,A POP IX
LD E,(IY + FDD_TABLE_s.CYLINDL)
LD D,(IY + FDD_TABLE_s.CYLINDH)
LD B,(IY + FDD_TABLE_s.DISK)
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
XOR A XOR A
@ -57,21 +63,24 @@ FDD_5x_GET_PAR: IN A,(SLOT3)
; D7 - "1" - High Density, "0" - Double Density ; D7 - "1" - High Density, "0" - Double Density
;Return: None ;Return: None
;[]===========================================================[] ;[]===========================================================[]
FDD_5x_SET_PAR: ;!TEST FDD 720/1440 FDD_5x_SET_PAR: CALL SELECT_FDD
RET C
;
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,B
LD (SYS_PAGE.FDD_TABLE.SECTORS),HL
LD (SYS_PAGE.FDD_TABLE.CYLINDL),DE
LD (SYS_PAGE.FDD_TABLE.BytesPerSector),IX
LD (SYS_PAGE.FDD_TABLE.DISK),A
;
EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
LD (IY + FDD_TABLE_s.SECTORS),L
LD (IY + FDD_TABLE_s.HEADS),H
LD (IY + FDD_TABLE_s.CYLINDL),E
LD (IY + FDD_TABLE_s.CYLINDH),D
PUSH IX
POP DE
LD (IY + FDD_TABLE_s.BytesPerSector),E
LD (IY + FDD_TABLE_s.BytesPerSector + 1),D
LD (IY + FDD_TABLE_s.DISK),B
EX AF,AF' EX AF,AF'
OUT (SLOT3),A
AND A AND A
RET RET
@ -84,7 +93,8 @@ FDD_5x_SET_PAR: ;!TEST FDD 720/1440
;[]===========================================================[] ;[]===========================================================[]
FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON CALL SET_DOS_ON
CALL DISK_ID CALL SELECT_FDD
CALL NC,DISK_ID
PUSH AF PUSH AF
CALL SET_DOS_OFF CALL SET_DOS_OFF
POP AF POP AF
@ -99,17 +109,21 @@ FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
;[]===========================================================[] ;[]===========================================================[]
FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON CALL SET_DOS_ON
CALL SET_FDD CALL SELECT_FDD
CALL DISK_ID CALL NC,DISK_ID
JR C,.int JR C,.int
; [ ] à §¬¥à  ᥪâ®à  ; [ ] à §¬¥à  ᥪâ®à 
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD H,B XOR A
LD L,0 CP B
LD (SYS_PAGE.FDD_TABLE.BytesPerSector),HL JR NZ,.SetSectorSize
;
LD A,#80
.SetSectorSize: LD (IY + FDD_TABLE_s.BytesPerSector),A
LD (IY + FDD_TABLE_s.BytesPerSector + 1),B
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
; ;
@ -133,12 +147,12 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off
OUT (FDC_93.DrvCTRL),A OUT (FDC_93.DrvCTRL),A
LD A,#3C LD A,#3C
OUT (FDC_93.DrvCTRL),A OUT (FDC_93.DrvCTRL),A
CALL SET_DOS_OFF JP SET_DOS_OFF
; CF=1 ; CF=1
LD A,BIOS.Error.NotReady ;LD A,BIOS.Error.NotReady
;POP AF ;POP AF
;JP SAVE_INTERRUPTS.restore ;JP SAVE_INTERRUPTS.restore
RET ;RET
;[]===========================================================[] ;[]===========================================================[]
;Function: Read Sectors ;Function: Read Sectors
; A - Disk ; A - Disk
@ -172,18 +186,20 @@ FDD_5x_LONG_READ:
CALL .Start CALL .Start
JP SAVE_INTERRUPTS.restore JP SAVE_INTERRUPTS.restore
; ;
.Start: PUSH IY .Start: ;PUSH IY
PUSH BC
PUSH HL
PUSH IX
;
EX AF,AF' EX AF,AF'
LD C,A ; Memory Page Number LD C,A ; Memory Page Number
EX AF,AF' EX AF,AF'
PUSH BC
CALL SET_DOS_ON CALL SET_DOS_ON
CALL SET_FDD CALL SELECT_FDD
CALL C,SET_DOS_OFF
RET C
;
PUSH BC
PUSH HL
PUSH IX
CALL SET_SPEED CALL SET_SPEED
PUSH BC
CALL NTRACK CALL NTRACK
POP BC POP BC
EX DE,HL EX DE,HL
@ -192,8 +208,7 @@ FDD_5x_LONG_READ:
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD XH,C ; Memory Page Number LD XH,C ; Memory Page Number
LD A,(SYS_PAGE.FDD_TABLE.SECTORS) LD C,(IY + FDD_TABLE_s.SECTORS)
LD C,A
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
; ;
@ -241,7 +256,7 @@ FDD_5x_LONG_READ:
POP IX POP IX
POP HL POP HL
POP BC POP BC
POP IY ;POP IY
LD A,B LD A,B
LD C,B LD C,B
INC B INC B
@ -277,7 +292,7 @@ FDD_5x_LONG_READ:
POP IX POP IX
POP HL POP HL
POP BC POP BC
POP IY ;POP IY
PUSH AF PUSH AF
LD C,A LD C,A
LD A,B LD A,B
@ -510,24 +525,29 @@ SET_DOS_OFF: EX AF,AF'
; RET ; RET
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
SET_FDD: PUSH BC SELECT_FDD: PUSH BC
AND 1 OR A
LD B,A LD IY,SYS_PAGE.FDD_TABLE.A
JR Z,.IY_Selected
;
LD IY,SYS_PAGE.FDD_TABLE.B
.IY_Selected: ;LD B,A
OR #3C OR #3C
OUT (FDC_93.DrvCTRL),A OUT (FDC_93.DrvCTRL),A
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.DISK) LD B,(IY + FDD_TABLE_s.ID)
AND #FE
OR B
LD (SYS_PAGE.FDD_TABLE.DISK),A
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
INC B
POP BC POP BC
RET RET NZ
; no drive
LD A,BIOS.Error.BadNumber
SCF
RET
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@ -563,20 +583,22 @@ SET_FDD: PUSH BC
; FDD.SET720: LD A,FDD_Density.SET_720 ; FDD.SET720: LD A,FDD_Density.SET_720
; OUT (FDD_Density),A ; OUT (FDD_Density),A
; RET ; RET
;
; ‚室: IY - “ª § â¥«ì ­  â ¡«¨æã ¢ë¡à ­­®£® FDD
CHANGE_SPEED: IN A,(SLOT3) CHANGE_SPEED: IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.DISK) LD A,(IY + FDD_TABLE_s.DISK)
XOR #80 XOR #80
LD (SYS_PAGE.FDD_TABLE.DISK),A LD (IY + FDD_TABLE_s.DISK),A
JR SET_SPEED.set JR SET_SPEED.set
; ;
SET_SPEED: IN A,(SLOT3) SET_SPEED: IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.DISK) LD A,(IY + FDD_TABLE_s.DISK)
.set: AND #80 .set: AND #80
RRA RRA
RRA RRA
@ -591,6 +613,7 @@ SET_SPEED: IN A,(SLOT3)
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; ‚室: BC - ¢­ãâ७­¨© ¨ ¢­¥è­¨© áçñâ稪¨ ; ‚室: BC - ¢­ãâ७­¨© ¨ ¢­¥è­¨© áçñâ稪¨
; IY - “ª § â¥«ì ­  â ¡«¨æã ¢ë¡à ­­®£® FDD
WAIT_FDD_FOR_SEARCH_TRACK: WAIT_FDD_FOR_SEARCH_TRACK:
LD A,#C0 ;!HARDCODE CMD Š<>1818ƒ93 LD A,#C0 ;!HARDCODE CMD Š<>1818ƒ93
OUT (FDC_93.Command),A OUT (FDC_93.Command),A
@ -624,7 +647,8 @@ WAIT_FDD_FOR_SEARCH_TRACK:
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë ; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë
; ¢ë室: A - FDD_INIT_TABLE.DISK, B - sector size high byte ; ‚室: IY - “ª § â¥«ì ­  â ¡«¨æã ¢ë¡à ­­®£® FDD
; ‚ë室: A - bit7 - 720/1440, B - sector size high byte
DISK_ID: EXX DISK_ID: EXX
CALL SET_SPEED CALL SET_SPEED
IN A,(FDC_93.Track) IN A,(FDC_93.Track)
@ -640,7 +664,8 @@ DISK_ID: EXX
CALL WAIT_FDD_FOR_SEARCH_TRACK CALL WAIT_FDD_FOR_SEARCH_TRACK
JR NC,.Read_Index JR NC,.Read_Index
EXX EXX
;SCF ;SCF
LD A,BIOS.Error.NotReady
RET RET
; ;
.Read_Index: ; .Read_Index: ;
@ -666,7 +691,7 @@ DISK_ID: EXX
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.DISK) LD A,(IY + FDD_TABLE_s.DISK)
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
EX AF,AF' EX AF,AF'
@ -681,7 +706,7 @@ SEEK: LD XL,A
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.DISK) LD A,(IY + FDD_TABLE_s.DISK)
AND 1 AND 1
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
@ -709,27 +734,22 @@ SEEK: LD XL,A
RET Z RET Z
.STOL: CALL P50ms .STOL: CALL P50ms
RET RET
;
P50ms: PUSH BC
LD B,12
.P1ms: LD C,255
.PMS: DEC C
JR NZ,.PMS
DJNZ .P1ms
POP BC
RET
;
; ;
;P750ms LD B,3 ;P750ms LD B,3
;PMS2 LD A,255 ;PMS2 LD A,255
; CALL P1ms ; CALL P1ms
; DJNZ PMS2 ; DJNZ PMS2
; RET ; RET
P50ms: PUSH BC
;LD A,12
LD B,12
.P1ms: LD C,255
.PMS: DEC C
JR NZ,.PMS
;
;DEC A
;JR NZ,.P1ms
DJNZ .P1ms
;
POP BC
RET
;
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
;RESWG: LD A,8 ;RESWG: LD A,8
@ -753,12 +773,10 @@ EXECOM: OUT (FDC_93.Command),A
LD HL,#0000 ; áçñâ稪 LD HL,#0000 ; áçñâ稪
PUSH BC PUSH BC
LD B,3 ; áçñâ稪 LD B,3 ; áçñâ稪
;
.WREST: DEC HL .WREST: DEC HL
LD A,H LD A,H
OR L OR L
JR NZ,.get_state JR NZ,.get_state
;
DJNZ .WREST DJNZ .WREST
; ;
POP BC POP BC
@ -784,8 +802,7 @@ NTRACK: PUSH HL
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.SECTORS) LD C,(IY + FDD_TABLE_s.SECTORS)
LD C,A
LD B,0 LD B,0
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
@ -793,13 +810,16 @@ NTRACK: PUSH HL
.NTRK: INC A .NTRK: INC A
SBC HL,BC SBC HL,BC
JR NC,.NTRK JR NC,.NTRK
;
EX AF,AF' EX AF,AF'
LD A,XL LD A,XL
OR XH OR XH
JR Z,.NTRK3 JR Z,.NTRK3
;
EX AF,AF' EX AF,AF'
DEC IX DEC IX
JR .NTRK JR .NTRK
;
.NTRK3: EX AF,AF' .NTRK3: EX AF,AF'
ADD HL,BC ADD HL,BC
DEC A DEC A

View File

@ -1210,25 +1210,25 @@ FDD_INIT_TABLE_35: FDD_TABLE_s {
#50, ;.CYLINDL #50, ;.CYLINDL
#00, ;.CYLINDH #00, ;.CYLINDH
#0200, ;.BytesPerSector #0200, ;.BytesPerSector
#03 ;.ID #01 ;.ID 3.5"
} }
; ;
FDD_INIT_TABLE_525: FDD_TABLE_s { FDD_INIT_TABLE_525: FDD_TABLE_s {
#00 ;.DISK #01 ;.DISK
#09 ;.SECTORS #09 ;.SECTORS
#02 ;.HEADS #02 ;.HEADS
#50 ;.CYLINDL #50 ;.CYLINDL
#00 ;.CYLINDH #00 ;.CYLINDH
#0200 ;.BytesPerSector #0200 ;.BytesPerSector
#03 ;.ID #02 ;.ID 5.25"
} }
FDD_INSTAL: IN A,(SLOT3) FDD_INSTAL: IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD HL,SYS_PAGE.FDD_TABLE LD HL,SYS_PAGE.FDD_TABLE.A
LD BC,2*(SYS_PAGE.FDD_TABLE.Size*256) + #FF ; table_size*256 + fill_byte LD BC,+(2*FDD_TABLE_s)*256 + #FF ; table_size*256 + fill_byte
.FILLFDD: LD (HL),C .FILLFDD: LD (HL),C
INC HL INC HL
DJNZ .FILLFDD DJNZ .FILLFDD
@ -1238,15 +1238,15 @@ FDD_INSTAL: IN A,(SLOT3)
CALL .Choose_FDD_Type CALL .Choose_FDD_Type
JR NZ,.next_FDD JR NZ,.next_FDD
; ;
LD DE,SYS_PAGE.FDD_TABLE LD DE,SYS_PAGE.FDD_TABLE.A
LD BC,SYS_PAGE.FDD_TABLE.Size LD BC,SYS_PAGE.FDD_TABLE.A.Size
LDIR LDIR
.next_FDD: LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11 .next_FDD: LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11
CALL .Choose_FDD_Type CALL .Choose_FDD_Type
JR NZ,.NOFDD1 JR NZ,.NOFDD1
; ;
LD DE,SYS_PAGE.FDD_1_TABLE LD DE,SYS_PAGE.FDD_TABLE.B
LD BC,SYS_PAGE.FDD_1_TABLE.Size LD BC,SYS_PAGE.FDD_TABLE.B.Size
LDIR LDIR
.NOFDD1: EX AF,AF' .NOFDD1: EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A

Binary file not shown.