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

View File

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

Binary file not shown.