Floppy Disk Controller — Änderungen 7739 → 7740

Zeile 262: Zeile 262:
 
|}
 
|}
  
−
=== Kompletten Track lesen (2h) ===
+
 
 +
 
 +
=== Technische Laufweksdaten einstellen (3h) ===
 +
Command Phase:
 +
{| {{prettytable}} cellpadding=8
 +
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 +
|-
 +
| #1: || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 1
 +
|-
 +
| #2: || colspan=4 | Step Rate || colspan=4 | Head Unload Time
 +
|-
 +
| #3 || colspan=7 | Head Load Time || Kein DMA
 +
|}
 +
Result Phase:
 +
''keine''
 +
 
 +
 
 +
Anmerkungen:
 +
* Die benötigten Daten sollten vom BIOS abgefragt werden (siehe unten)
 +
* Im MSR kann eingestellt werden, ob DMA/IRQ oder keins von beidem, hier wird dann noch einmal explizit zwischen DMA (Bit gelöscht) und kein DMA (Bit gesetzt) entschieden.
 +
 
 +
 
 +
 
 +
=== Laufwerk kalibrieren (7h) ===
 +
Command Phase:
 +
{| {{prettytable}} cellpadding=8
 +
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 +
|-
 +
| #1: || 0 || 0 || 0 || 0 || 0 || 1 || 1 || 1
 +
|-
 +
| #2: || 0 || 0 || 0 || 0 || 0 || Head || colspan=2 | Drive
 +
|}
 +
Result Phase:
 +
''keine''
 +
 
 +
 
 +
Anmerkungen:
 +
* Nach der Kalibrierung wird ein IRQ6 gesendet
 +
* Es kann passieren, dass der Befehl nicht funktioniert. Desshalb sollte mit "Interrput Status überprüfen" (8h) überprüft werden, ob der aktuelle Zylinder wirklich Null ist.
 +
 
 +
 
 +
 
 +
 
 +
=== Laufwerksstatus überprüfen (4h) ===
 +
Command Phase:
 +
{| {{prettytable}} cellpadding=8
 +
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 +
|-
 +
| #1: || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0
 +
|-
 +
| #2: || 0 || 0 || 0 || 0 || 0 || Head || colspan=2 | Drive
 +
|}
 +
Result Phase:
 +
{| {{prettytable}} cellpadding=8
 +
| ST3
 +
|}
 +
 
 +
 
 +
=== Interrupt Status überprüfen (8h) ===
 +
Command Phase:
 +
{| {{prettytable}} cellpadding=8
 +
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 +
|-
 +
| #1: || 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0
 +
|}
 +
Result Phase:
 +
{| {{prettytable}} cellpadding=8
 +
| #1: || ST0
 +
|-
 +
| #2: || Aktueller Zylinder
 +
|}
 +
Anmerkungen:
 +
* Dieser Befehl sollte immer gesendet werden, wenn der FDC einen IRQ 6 gesendet hat.
 +
 
 +
 
 +
 
 +
=== Schreib- /Lesekopf positionieren (fh) ===
 +
Command Phase:
 +
{| {{prettytable}} cellpadding=8
 +
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 +
|-
 +
| #1: || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0
 +
|-
 +
| #2: || 0 || 0 || 0 || 0 || 0 || Head || colspan=2 | Drive
 +
|-
 +
| #3: || colspan=8| Cylinder
 +
|}
 +
Result Phase:
 +
''Keine''
 +
 
 +
 
 +
Anmerkungen:
 +
* Es kann passieren, dass der Befehl nicht funktioniert. Desshalb sollte mit "Interrput Status überprüfen" (8h) überprüft werden, ob der aktuelle Zylinder wirklich Null ist.
 +
* Nach Beendigung wird ein IRQ 6 gesendet.
 +
 
 +
=== Sektor schreiben (5h) ===
 
Command Phase:
 
Command Phase:
 
{| {{prettytable}} cellpadding=8
 
{| {{prettytable}} cellpadding=8
Zeile 298: Zeile 393:
 
| #5: || Head
 
| #5: || Head
 
|-
 
|-
−
| #6: || 0
+
| #6: || Sektor
 
|-
 
|-
 
| #7: || Sektorgröße N
 
| #7: || Sektorgröße N
Zeile 304: Zeile 399:
  
 
Anmerkungen:
 
Anmerkungen:
−
* Dieser Befehl ließt alle Sektoren eines Tracks hintereinander ein
+
* Nach dem Schreibvorgang wird ein IRQ 6 gesendet.
−
* Der Befehl funktioniert nur für eine Seite der Diskette, für beide Seiten muss der Befehl mehrmals gesendet werden
 
  
−
=== Diskettendaten einstellen (3h) ===
+
=== Sektor lesen (6h) ===
 
Command Phase:
 
Command Phase:
 
{| {{prettytable}} cellpadding=8
 
{| {{prettytable}} cellpadding=8
 
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 
|-
 
|-
−
| #1: || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 1
+
| #1: || 0 || MFM || SK || 0 || 0 || 0 || 1 || 0
 +
|-
 +
| #2: || 0 || 0 || 0 || 0 || 0 || Head || colspan=2 | Drive
 +
|-
 +
| #3: || colspan=8 | Cylinder
 +
|-
 +
| #4: || colspan=8 | Head
 +
|-
 +
| #5: || colspan=8 | Sektor
 +
|-
 +
| #6: || colspan=8 | Sektorgröße N
 +
|-
 +
| #7: || colspan=8 | Track-Größe
 
|-
 
|-
−
| #2: || colspan=4 | Step Rate || colspan=4 | Head Unload Time
+
| #8: || colspan=8 | GAP3
 
|-
 
|-
−
| #3 || colspan=7 | Head Load Time || Kein DMA
+
| #9: || colspan=8 | DTL
 
|}
 
|}
  
 
Result Phase:
 
Result Phase:
−
''keine''
+
{| {{prettytable}} cellpadding=8
 +
| #1: || ST0
 +
|-
 +
| #2: || ST1
 +
|-
 +
| #3: || ST2
 +
|-
 +
| #4: || Cylinder
 +
|-
 +
| #5: || Head
 +
|-
 +
| #6: || Sektor
 +
|-
 +
| #7: || Sektorgröße N
 +
|}
 +
Anmerkungen:
 +
* Nach dem Lesevorgang wird ein IRQ 6 gesendet.
  
−
Anmerkungen:
 
−
* Die benötigten Daten sollten vom BIOS abgefragt werden (siehe unten)
 
−
* Im MSR kann eingestellt werden, ob DMA/IRQ oder keins von beidem, hier wird dann noch einmal explizit zwischen DMA (Bit gelöscht) und kein DMA (Bit gesetzt) entschieden.
 
  
−
=== Laufwerksstatus überprüfen (4h) ===
+
=== Kompletten Track lesen (2h) ===
 
Command Phase:
 
Command Phase:
 
{| {{prettytable}} cellpadding=8
 
{| {{prettytable}} cellpadding=8
 
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 
! Bit: || 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
 
|-
 
|-
−
| #1: || 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0
+
| #1: || 0 || MFM || SK || 0 || 0 || 0 || 1 || 0
 
|-
 
|-
 
| #2: || 0 || 0 || 0 || 0 || 0 || Head || colspan=2 | Drive
 
| #2: || 0 || 0 || 0 || 0 || 0 || Head || colspan=2 | Drive
 +
|-
 +
| #3: || colspan=8 | Cylinder
 +
|-
 +
| #4: || colspan=8 | Head
 +
|-
 +
| #5: || colspan=8 | 0
 +
|-
 +
| #6: || colspan=8 | Sektorgröße N
 +
|-
 +
| #7: || colspan=8 | Track-Größe
 +
|-
 +
| #8: || colspan=8 | GAP3
 +
|-
 +
| #9: || colspan=8 | DTL
 
|}
 
|}
  
 
Result Phase:
 
Result Phase:
 
{| {{prettytable}} cellpadding=8
 
{| {{prettytable}} cellpadding=8
−
| ST3
+
| #1: || ST0
 +
|-
 +
| #2: || ST1
 +
|-
 +
| #3: || ST2
 +
|-
 +
| #4: || Cylinder
 +
|-
 +
| #5: || Head
 +
|-
 +
| #6: || Sektor
 +
|-
 +
| #7: || Sektorgröße N
 
|}
 
|}
  
 +
Anmerkungen:
 +
* Dieser Befehl ließt alle Sektoren eines Tracks hintereinander ein
 +
* Der Befehl funktioniert nur für eine Seite der Diskette, für beide Seiten muss der Befehl mehrmals gesendet werden
 +
* Es ist immer schneller einen gesamten Track zu lesen anstatt einzeln jeden Sektor des Tracks.
  
−
=== write sector ===
+
=== Andere ===
−
=== calibrate drive ===
+
Der FDC kennt noch weitere Befehle, auf die hier nicht weiter eingegangen wird. Diese sind:
−
=== check interrupt status ===
+
* Gelöschten Sektor lesen / schreiben
−
=== write deleted sector ===
+
* Track formatieren
−
=== read sector ID ===
+
* Sektor ID einlesen
−
=== read deleted sector ===
+
Darüber hinaus gibt es noch erweiterte Befehle. Man kann sich aber nicht darauf verlassen, dass der eingebaute FDC diese unterstützt:
−
=== format track ===
+
* Register Zusammenfassung
−
=== seek head ===
+
* Controller Version lesen
−
 
+
* Bestätigen
 +
* Relatives Positionieren des Schreib-/Lesekopfes
  
 
== Beispielcode ==
 
== Beispielcode ==