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