von Erhard » So 7. Sep 2008, 14:57
Hallo,
hier eine Zusammenfassung, die ich offline erstellt habe und jetzt mal hier zur Verfügung stelle:
die SIO sendet ein 4-Byte langes Kommando zum (intelligenten) Peripherigerät und das Gerät führt diesen Befehl aus (wenn es ür dieses Gerät bestimmt ist) und meldet das Ergebnis zurück an den Rechner.
Die SIO wird vom Rechner durch einen Sprung nach $E459 aufgerufen.
Damit die SIO weiß was zu tun ist gibt es den DCB (Device Control Block), der vorher konfiguriert werden muß.
Dies sind die Speicherzellen $300 bis $30F, welche wie folgt definiert sind:
DDEVIC = $0300
DUNIT = $0301
DCOMND = $0302
DSTATS = $0303
DBUFLO = $0304
DBUFHI = $0305
DTIMLO = $0306
DUNUSE = $0307
DBYTLO = $0308
DBYTHI = $0309
DAUX1 = $030A
DAUX2 = $030B
TIMER1 = $030C
ADDCOR = $030E
CASFLG = $030F
Zumindest für die Kommunikation mit Disklaufwerken werden $30C-$30F nicht verwendet.
DDEVIC muß die Kennung des Gerätes beinhalten, welches angesprochen werden soll, bei Disklaufwerken $31.
DUNIT muß die Laufwerksnummer beinhalten, normalerweise 1-8 oder 1-9.
DCOMND muß das auszuführende Kommando beinhalten, z.B. $52 bei Sektor lesen. Nicht alle Geräte können alle Kommandos, so kann eine 1050 ohne Erweiterung kein PERCOM-Kommando.
DSTATS enthalt Angaben über die Richtung, in die Daten übertragen werden sollen: $40 beim Lesen vom Peripheriegerät, $80 beim Schreiben zum Peripheriegerät und $00, wenn das Kommanod keine Datenübertragung erfordert.
DBUFLO/DBUFHI muß die Speicheradresse (des Puffers) beinhalten, wo die Daten abgelegt werden sollen bzw. wo die Daten stehen, die gesendet werden sollen, wenn es sich um ein Schreibkommando handelt.
DTIMLO enthält den Wert in Sekunden, die die Operation normalerweise maximal dauern darf. Dauert sie länger, wird sie abgebrochen und es gibt einen Timeout-Fehler.
DBYTLO/DBYTHI enthält die Menge der zu übertragenden Daten. Dies sind bei einem SD-Sektor 128, bei einem DD-Sektor 256, bei dem Percom-Block 12, bei dem Statusbefehl 4 oder andere Werte je nach Kommando.
DAUX1/DAUX2 enthält Parameter zum Kommando, beim Lesen oder Schreiben eines Sektors eben die Sektornummer. Es gibt Kommandos, die keine Parameter brauchen, wie z.B. die Statusabfrage, das Percom- Kommando oder der Formatierbefehl. Dann sollte man die Werte auf Null setzen.
Nach dem Aufruf der SIO über $E459 wird das Kommando an das Gerät gesendet. Dabei werden nur 5 Bytes übertragen. Dies sind (bei einem Diskettenlaufwerk):
1) Geräte-ID + Laufwerksnummer -1 (Floppy 1 = $31, Floppy 2 = $32 usw)
2) Kommando (z.B. $52 bei Sektor lesen)
3) DAUX1 (unteren 8 Bit der Sektornummer)
4) DAUX2 (oberen 8 Bit der Sektornummer)
5) Prüfsumme
Die länge der zu übertragenden Daten braucht dem Peripheriegerät nicht mitgeteilt werden, da es das ja selbst weiß und die Pufferadresse braucht das Peripheriegerät nicht wissen, da ja der Atari die Daten selbst im Speicher ablegt oder daraus liest.
Ein Puffer muß auch nicht mit irgendwelchen Werten aufgefüllt werden, außer beim Format-Custom Befehl, da dort immer 128 Byte übertragen werden. Dieser Befehl wird selten verwendet und nur bestimmte Laufwerkserweiterungen beherrschen ihn.
Nach dem SIO-Aufruf muß man anhand von Speicherstelle $303 überprüfen, ob das Kommando erfolgreich war. Normalerweise ist 1 = OK, dazu gibt es Geräteabhängige Fehlerlisten.
Bezüglich des PERCOM-Blocks hier einige Beispiele für die Standardformate:
- Code: Alles auswählen
TR SR SH SL DS FM BH BL OL na na na
------------------------------------------------------------------------------
0090 28 01 00 12 00 00 00 80 FF 00 00 00 SD, 720 sectors of 128 bytes
0130 28 01 00 1A 00 04 00 80 FF 00 00 00 MD, 1040 sectors of 128 bytes
0180 28 01 00 12 00 04 01 00 FF 00 00 00 DD, 720 sectors of 256 bytes
0360 28 01 00 12 01 04 01 00 FF 00 00 00 QD, 1440 sectors of 256 bytes
0720 50 01 00 12 01 04 01 00 FF 00 00 00 2880 sectors of 256 bytes
1440 50 01 00 24 01 04 01 00 FF 00 00 00 HD, 5760 sectors of 256 bytes
2880 50 01 00 48 01 04 01 00 FF 00 00 00 ED, 11520 sectors of 256 bytes
HDD/RD 01 01 xx yy 00 04 01 00 FF 00 00 00 any other sectors of 256 bytes
TR Tracks per disk *1)
SR Step rate timing
SH Number of sectors/track high *1)
SL Number of sectors/track low *1)
DS Disk is double sided
FM FM / MFM encoding, FM =$00, MFM =$04
BH Bytes per sector high
BL Bytes per sector low
OL Drive online
na reserved
na reserved
na reserved
Dazu gibt es folgende Anmerkungen:
FM/MFM
======
SD (singe density) ist das einzige Format bei einer Atari 1050, bei der der Controller die Diskette in der Aufzeichnungsart FM formatiert.
Floppy oder Harddisk/Ramdisk/Emulatoren
=======================================
Es gibt zwei Arten des Percom-Blocks. Entweder wird eine echte Diskettengeometrie mit Tracks, Sektoren pro Spur und Seiten beschrieben oder ein Datenträger mit einfach durchgehender Sektornummer. Im zweiten Fall ist die Anzahl der Spuren 1, (bei einer RAMDISK manchmal Null), die Zahl der Seiten ist 0 und die Gesamtzahl der Sektoren steht in SH/SL.
Beispiel für einen Formatierbefehl an D2:
=========================================
DDEVIC : $31
DUNIT : $02
DCOMND : $21
DSTATS : $40
DBUFLO : $00
DBUFHI : $40
DTIMLO : $E0
DUNUSE : $00
DBYTLO : $80
DBYTHI : $00
DAUX1 : $00
DAUX2 : $00
TIMER1 : $00
ADDCOR : $00
CASFLG : $00
Hier gibt es eine kleine Besonderheit: Nach dem Formatieren sendet eine 1050 einen Block von 128 Byte Daten an den Rechner. Angeblich soll dieser Block genauere Informationen über eventuelle defekte Sektoren beinhalten, dies ist aber offenbar vom Hersteller nie wirklich implementiert worden. Dieser Datenblock wird dann im Speicher ab Adresse $4000 abgelegt.
Wann man was wo ablegt oder ablegen kann, muß man natürlich selber wissen, oder natürlich das Programm, welches man verwendet.
Ach ja, der Formatierbefehl bei einer 1050 in der SIO ist ein echtes "low level format". Die magnetische Aufzeichnung des Datenträgers wird neu erzeugt. Und das ist alles, was der Befehl tut. Mit dem Formatier- befehl aus dem DOS heraus hat er nur soviel zu tun, als daß er ein Teil dessen ist, was das DOS beim Formatieren tut. Nach dem "low level" Formatieren bringt ein DOS üblicherweise Bootsektoren, eine Sektor- belegungstabelle und ein Inhaltsverzeichnis auf der Disk unter.
Viele Grüße
Erhard