Frage zu SIO-Hispeed und "Speed Byte"


Frage zu SIO-Hispeed und "Speed Byte"

von mp-one » Mi 3. Feb 2010, 10:33
Hallo Fachleute,

kennt jemand einen Artikel oder Link, der mal in groben Zügen erklärt, wie eine HiSpeed-SIO-Routine gestrickt ist und was es mit dem Speed Byte, Pokey Divisor etc. auf sich hat?

Gruß,

Michael

Re: Frage zu SIO-Hispeed und "Speed Byte"

von dl7ukk » Mi 3. Feb 2010, 13:10
Hi,

da ist Hias voll in seinem Element. Frag ihn doch mal Besten. Schick 'ne E-Mail, ich bin nicht sicher ob er alles mitliest.

Re: Frage zu SIO-Hispeed und "Speed Byte"

von HiassofT » Mi 3. Feb 2010, 16:27
Hallo Michael!

Im April 2002 hatte Stefan Dorndorf im ABBUC Forum einige sehr interessante Infos dazu gepostet. Leider sind die Artikel nicht mehr verfügbar (dürften wohl bei irgendeiner der -zig Foren-Umstellungen verlorengegangen sein), aber zum Glück habe ich sie auf meinem Rechner archiviert:

Abgeschickt von Stefan Dorndorf am 17 April, 2002 um 19:28:09:

Antwort auf: Re: HighSpeed SIO-Routine von Tobias Arnold am 16 April, 2002 um
08:11:39:

Hallo,

sorry, ich kannte Deinen Kenntnisstand nicht, Du bist also Profi ;-)

OK, das Ultra-Speed-Protokoll ist ganz einfach. Es entspricht genau dem
Normal-Speed-Protokoll, die Bytes werden lediglich mit einer höheren
Übertragungsrate über das SIO-Kabel gejagt. Die für das Standard-SIO-Protokoll
vorgesehenen Pausen zwischen den einzelnen Frames und ACK- bzw. COMPLETE-Bytes
dürfen jedoch nicht (alle) verringert werden, sonst kann es hier und da zu
Overruns/Timeouts auf dem SIO-Bus kommen. Bei einer Festplatte spielt das für
die Geschwindigkeit sowieso kaum eine Rolle.

Ein Programm mit einer Ultra-Speed-Routine geht meist so vor:

- Kommando $3F an den Controller schicken (Längenbytes $30A/B auf 1 und $303
auf $40 setzen). Der Controller antwortet wie beim $53-Kommando, schickt jedoch
nicht 4 sondern nur 1 Byte zurück. Dieses sog. SIO-Speed-Byte enthält den
Teiler für die Baudrateneinstellung des Pokey. Bei der Speedy ist das Byte = 9,
bei der Happy ist es 10.
Das Ergebnis des $3F-Kommandos merkt sich die Ultra-Speed-Routine für spätere
Kommandos, um nicht nochmal ein $3F-Kommando abschicken zu müssen.

- SIO-Kommunikation für das eigentliche Kommando starten (so wie im ATARI-OS)
einziger Unterschied ist, dass das SIO-Speed-Byte in $D204 eingetragen wird.
Siehe die SIO-Routine im ATARI-OS ab $E992:

LDA #x
STA $D204
LDA #0
STA $D206

Hierbei ist x das SIO-Speed-Byte (bei Normal-Speed ist dies = 40)
Die vom SIO benutzte Übertragungsrate f (in bps) berechnet sich auf PAL-ATARIs
wie folgt:

f = 886723,5/(x+7)

Bei x = 40 ergibt sich also 18866 bps und bei x = 9 sind es 55420 bps.
Die 1050 Turbo arbeitet mit x = 6, also 68209 bps (allerdings wird hier ein
etwas anderes SIO-Protokoll benutzt). Unter x = 4 (80611 bps) wird die
Kommunikation unstabil.

Das ist auf der ATARI-Seite schon alles. Man kann die SIO-Routine auch ohne I/
O-Interrupts schreiben, aber das wird hier jetzt etwas viel, zumal ich auch
keine kommentierte Version habe.

Auf der Controllerseite ist es ein wenig schwieriger, da der Controller nicht
weiß, ob der ATARI in Normal- oder Ultra-Speed arbeiten will:

- Command-Frame einlesen. Sollten die Stop-Bits nicht an den richtigen Stellen
kommen, auf andere Übertragungsrate (Normal Ultra) umschalten, und (nach der
nächsten fallenden Flanke der -Command-Leitung) den Command-Frame nochmal
einlesen. Sollte während des Empfangs des Commandframe die -Command-Leitung
wieder auf High gehen, empfiehlt es sich, den Empfang des Commandframe sofort
abzubrechen und auf einen neuen Commandframe zu warten. Das erspart dem ATARI
das mehrfache vergebliche Senden des Command-Frames.

- Nun ACK/COMPLETE-Bytes bzw. Datenframes wie im Standard-SIO-Protokoll
empfangen/senden und zwar mit der beim Einlesen des Commandframes
festgestellten Rate (Normal bzw. Ultra).

- Für weitere vom ATARI kommende Kommandos immer zuerst die im letzten Kommando
verwendete Übertragungsrate benutzen.

Noch ein Hinweis: Beim Senden von Bytes zum ATARI sollte zwischen den Stop- und
Start-Bits eine Pause eingelegt werden, da sonst nicht alle
Ultra-Speed-Routinen mithalten können. Die Pause muss so berechnet sein, dass
das Senden eines Bytes zusammen mit Start-, Stop-Bit und Pause mind. 190 us,
besser 210 us dauert. Daher ist es wenig sinnvoll, das SIO-Speed-Byte unter 9
anzusetzen, wenn der Controller mit beliebigen Ultra-Speed-Routinen
zusammenarbeiten soll.
Außerdem braucht man eine kleine Pause auch zur Synchronisation fürs nächste
Start-Bit.

Das war's dann
Stefan


Abgeschickt von Stefan Dorndorf am 26 April, 2002 um 21:36:11:

Antwort auf: Re: HighSpeed SIO-Routine von Mathy van Nisselroy am 25 April,
2002 um 13:17:34:

Hallo Mathy,

na dann versuch ich es mal mal mit einer kurzen Erklärung:

Eine High-Speed-Routine sollte mindestens Ultra-Speed und XF-High-Speed
unterstützen. Zusätzlich gibt es zwar noch Turbodrive (1050 Turbo) und
Warp-Speed (Happy), diese Protokolle sind jedoch veraltet und sind mittlerweile
von der Speedy verdrängt worden, Warp-Speed ist praktisch ausgestorben (wird
auch vom QMEG+OS nicht mehr unterstützt). Lediglich in Polen wird noch häufiger
das Turbodrive-Protokoll benutzt, weswegen das QMEG+OS Turbodrive auch noch
unterstützt.
Schließlich gibt es noch Hyper-Speed, das von der Hyper-XF (Marke Eigenbau)
verwendet wird. Da die Hyper-XF jedoch zusätzlich Ultra-Speed unterstützt, ist
Hyper-Speed für eine universelle High-Speed-Routine nicht erforderlich.

Wie kannst Du feststellen, welches Protokoll von der Floppy unterstützt wird ?

1) Ultra-Speed:
Siehe dazu mein weiter oben stehendes Posting...
Wenn das $3F-Kommando mit einem Error 139 zurückkommt, kann das Laufwerk kein
Ultra-Speed.

2) XF-High-Speed:
Kommando $53 an die Floppy schicken. (Falls gerade das DOS gebootet wurde und
die ab $706 beginnende Boot-Rootine durchlaufen wird, brauchst Du das Kommando
$53 nicht an die Floppy zu schicken, da dies bereits das vom OS vor dem Booten
erledigt wurde).
Steht nun in 748 der Wert $FE, handelt es sich um eine XF, die XF-High-Speed
unterstützt.

3) Turbo-Drive:
Am besten beim ersten Lese-Zugriff auf das Laufwerk das Lese-Kommando mit
gesetztem Bit 7 in AUX2 abschicken. Gibt's einen Fehler, kann das Laufwerk kein
Turbo-Drive
Achtung: Nach dem Senden des Command-Frames und VOR dem Empfang des ACK-Bytes
auf Turbodrive-Bitrate umschalten (LDA #6, STA $D204)

Nun zu den Protokollen:

1) Ultra-Speed-Protokoll:
Siehe dazu mein weiter oben stehendes Posting...

2) XF-High-Speed-Protokoll:
Kommando normal mit gesetztem Bit 7 in $302 abschicken. Nach Empfang des
ACK-Bytes für den Command-Frame auf XF-High-Speed-Bitrate umschalten (LDA #16,
STA $D204)
Fürs Formatieren ebenfalls Bit 7 in $302 setzen, aber NICHT auf High-Speed
umschalten.

3) Turbo-Drive:
Kommando normal mit gesetztem Bit 7 in $30B abschicken. VOR Empfang des
ACK-Bytes für den Command-Frame auf Turbo-Drive-Bitrate umschalten (LDA #6, STA
$D204).

Das ist schon alles.

Tschüss
Stefan


Wenn Du noch weitere Infos brauchst gib' einfach Bescheid.

so long,

Hias

Re: Frage zu SIO-Hispeed und "Speed Byte"

von mp-one » Do 4. Feb 2010, 11:25
Hallo Hias,

super, der Beitrag hilft schon mal. Ich konnte mit Hilfe des Disassemblers, den Jürgen vorgeschlagen hat, schon mal die Stellen in einem "bestimmten DOS" finden, wo die Speedbytes gesetzt werden. Dazu werde ich dann evtl. noch mal Fragen haben...

Beste Grüße,

Michael