| Zeile 262: | Zeile 262: | ||
|} | |} | ||
| − | === | + | |
| + | |||
| + | === 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: || | + | | #6: || Sektor |
|- | |- | ||
| #7: || Sektorgröße N | | #7: || Sektorgröße N | ||
| Zeile 304: | Zeile 399: | ||
Anmerkungen: | Anmerkungen: | ||
| − | * | + | * Nach dem Schreibvorgang wird ein IRQ 6 gesendet. |
| − | |||
| − | === | + | === 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: || 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 | ||
|- | |- | ||
| − | | # | + | | #8: || colspan=8 | GAP3 |
|- | |- | ||
| − | | # | + | | #9: || colspan=8 | DTL |
|} | |} | ||
Result Phase: | Result Phase: | ||
| − | + | {| {{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. | ||
| − | |||
| − | |||
| − | |||
| − | === | + | === 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 || | + | | #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 | ||
| − | | | + | | #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. | ||
| − | === | + | === Andere === |
| − | + | Der FDC kennt noch weitere Befehle, auf die hier nicht weiter eingegangen wird. Diese sind: | |
| − | + | * Gelöschten Sektor lesen / schreiben | |
| − | + | * Track formatieren | |
| − | + | * Sektor ID einlesen | |
| − | + | Darüber hinaus gibt es noch erweiterte Befehle. Man kann sich aber nicht darauf verlassen, dass der eingebaute FDC diese unterstützt: | |
| − | + | * Register Zusammenfassung | |
| − | + | * Controller Version lesen | |
| − | + | * Bestätigen | |
| + | * Relatives Positionieren des Schreib-/Lesekopfes | ||
== Beispielcode == | == Beispielcode == | ||