SIO Highspeed
SIO Highspeed
von Sven » Sa 29. Dez 2012, 15:18
Hallo zusammen,
ich bin auf der Suche nach Informationen zum Ablauf für die Initialisierung der HighSpeed-Kommunikation über die SIO.
Soweit ich bisher in Erfahrung bringen konnte wird zunächst über das CommandByte $3F ein "High Speed Index" abgefragt. Hier wird nur mit einem Byte geantwortet (Speedy, SIO2USB antworten mit $09, Happy und einige andere mit $0A).
Wie geht es dann weiter? Diese Kommunikation läuft noch in der Standard-Geschwindigkeit ab (19.2kBit).
Kennt jemand vielleicht eine etwas detailiertere Beschreibung?
Lieben Dank und Gruß,
Sven
Re: SIO Highspeed
von Bernd » Sa 29. Dez 2012, 16:16
Hallo Sven,
ist zwar nicht direkt eine Beschreibung jedoch sind alle SIO-Befehle aufgelistet.
http://www.abbuc.de/wwwmirror/jao/asio.htmViele Grüße,
Bernd
Re: SIO Highspeed
von Sven » Sa 29. Dez 2012, 16:22
Hi Bernd,
lieben Dank für den Link. Ähnliche Beschreibungen habe ich nun einige gesehen. Allerdings geht daraus nicht hervor, was nach der Antwort passiert.
Wenn eine Speedy $09 zurückmeldet, wird dann sofort auf eine höhere Übertragung geschaltet? Wie wird die Übertragungsrate festgelegt? Es gibt ja nun einige verschiedene Übertragungsraten...
Gruß,
Sven
Re: SIO Highspeed
von Bernd » Sa 29. Dez 2012, 18:16
Ich habe auf Hias Webseite einen Speedtest gefunden, der liegt beim Hipatch 1.30 bei.
; Highspeed SIO test
;
DBUF = $0304
DBYT = $0308
DSEC = $030A
START = $2000
HIGHSIO = $4000
* = START
; set SIO parameters for D2:
LDA #$31
STA $300
LDA #3
STA $301
LDA #7
STA $306
; read sectors 256-511 in a loop forever
DOTEST LDA #$52
STA $302
LDA #1
STA DSEC+1
LDA #0
STA DSEC
STA DBYT+1
LDA #128
STA DBYT
LDA #<BUF
STA DBUF
LDA #>BUF
STA DBUF+1
TLOOP LDA #$40
STA $303
JSR $E459
; JSR HIGHSIO
INC DSEC
JMP TLOOP
BUF = *
* = $2e0
.WORD START
Re: SIO Highspeed
von cas » Sa 29. Dez 2012, 21:19
Sven hat geschrieben:Hi Bernd,
lieben Dank für den Link. Ähnliche Beschreibungen habe ich nun einige gesehen. Allerdings geht daraus nicht hervor, was nach der Antwort passiert.
Wenn eine Speedy $09 zurückmeldet, wird dann sofort auf eine höhere Übertragung geschaltet? Wie wird die Übertragungsrate festgelegt? Es gibt ja nun einige verschiedene Übertragungsraten...
Gruß,
Sven
Hallo Sven,
meines Wissens musst Du dann aus dem Laufwerk die SIO High-Speed Routine laden, und dann in Deinem Programm anstatt der normalen SIO Routine die geladene SIO Routine verwenden. Im Compy-Shop Technik Handbuch Kapitel 7.1.18 "SIO-Routine zum Rechner senden":
7.1.17 Länge der SIO-Routine ermitteln
KOMMANDO: $68
AUX1: Nicht benutzt
AUX2: Nicht benutzt
BESCHREIBUNG: Mit diesem Befehl wird die Länge der SIO-Routine ermittelt, die mit dem Befehl $69 aus dem Laufwerk in den Computer geladen wird. Das Laufwerk sendet 2 Bytes, die die Länge (low/high) beinhalten.
7.1.18 SIO-Routine zum Computer senden
KOMMANDO: $69
AUX1: Relokator - Adresse low-Byte
AUX2: Relokator - Adresse high-Byte
BESCHREIBUNG: Dieser Befehl sendet die High-Speed SIO-Routine in der vom Befehl $68 ermittelten Länge zum Computer. Diese Routine wird bereits im Laufwerk zur Startadresse hin relokiert, die sich in AUX1 und AUX2 befindet.
Beste Grüsse
Carsten
Re: SIO Highspeed
von Sven » So 30. Dez 2012, 01:34
Danke euch beiden!
Ich entnehme jetzt mal für mich als "Erkenntnis", dass die jeweilige SIO-Routine im ATARI die Steuerung übernimmt und vermutlich über den POKEY-Divisor entscheidet, wann und wie schnell die SIO-Kommunikation laufen soll?
Ich hätte jetzt erwartet einen gewissen Standard anzutreffen. In vielen Beiträgen konnte ich von diversen Implementierungen lesen, aber da fehlt mir etwas der rote Faden, bzw. ein Standard.
Notfalls muss ich wirklich mal HIAS HighSpeed-Code genauer anschauen. Das Beispiel von Bernd liest ja "nur" die Sektoren, der eigentlich interessantere Teil beginnt mit "JSR HIGHSIO".
Re: SIO Highspeed
von Mathy » So 30. Dez 2012, 02:02
Hallo Leute
Wenn ich mich nicht irre, gibt es mindestens drei verschiedene "Standards". XF und Turbo 1050 machen was anders (Bit 7 soll gesetzt werden) als der Rest. Und dann gab's bei den Anderen auch wenn ich mich nicht irre 'nen Unterschied in wann genau der HighSpeed anfängt. Genaueres weis ich aber leider auch nicht.
Tschüß
Mathy
Re: SIO Highspeed
von HiassofT » So 30. Dez 2012, 18:12
Hallo Sven!
Sven hat geschrieben:Ich hätte jetzt erwartet einen gewissen Standard anzutreffen. In vielen Beiträgen konnte ich von diversen Implementierungen lesen, aber da fehlt mir etwas der rote Faden, bzw. ein Standard.
Tja, das schöne an Standards ist, daß es so viele davon gibt :-)
Kurz zusammegefasst: Die SIO Routine im OS kennt nur die Standard Geschwindigkeit von ~19kBit/sec (den Kassettenrekorder lassen wir jetzt mal aussen vor). Für Highspeed SIO braucht man i.A. einen speziellen, Highspeed-fähigen Code.
Ausnahme ist die 1050 Turbo, das Protokoll wurde dabei so gewählt, daß mit einem kleinen Trick weiterhin die OS SIO Routine verwendet werden kann - das spart einiges an RAM. Es wird nur ein recht kurzer Interrupt-Handler installiert, der nach dem Senden des Command Frames die Geschwindigkeit von ~19kBit auf ~70kBit hochschraubt.
Alle anderen Varianten (Happy Ultraspeed/Speedy, XF551/Happy Warp) benötigen eine eigene, komplette, highspeed-fähige SIO Routine.
Die Protokolle unterscheiden sich im wesentlichen darin, an welcher Stelle der Übertragung auf Highspeed geschaltet wird. Ultraspeed/Speedy senden gleich von Beginn an in Highspeed, 1050 Turbo und XF551 nach dem Command Frame bzw. nach dem Command-Frame-ACK.
Notfalls muss ich wirklich mal HIAS HighSpeed-Code genauer anschauen. Das Beispiel von Bernd liest ja "nur" die Sektoren, der eigentlich interessantere Teil beginnt mit "JSR HIGHSIO".
Du musst Dir nicht den ganzen Code im Detail antun, bei meinem Highspeed Code hab' ich im README.txt den grundsätzlichen Ablauf der SIO Übertragung und die verschiedenen Highspeed Protokolle beschrieben. Schau da mal rein und wenn Dir was unklar ist frag einfach nochmal nach!
so long,
Hias
Re: SIO Highspeed
von Sven » So 30. Dez 2012, 18:49
Hi Hias,
ich denke, die Beantwortung meiner Frage steht in deiner Readme:
First, the code tries to send a $3F command (get speed byte) to the
drive. All ultra-speed capable devices support this command and will
return the pokey-divisor byte. If this command succeeds, the byte is
stored in the table. Then it's checked if the byte is $0A. If this
is the case, the drive is most certainly a Happy 1050 and a $48 command
with DAUX=$0020 is sent. This enables fast writes and is needed
by the Happy drives, otherwise they might write corrupted data to
the disk when writing in highspeed mode (thanks to ijor for this info!).
Then, the code tries to send a $53 command (get status) in 1050 Turbo
and XF551 mode. If it's a 1050 Turbo, $80 is stored in the speed table,
if it's a XF551 $40 is stored.
At last the code tries to send a $48 command ("Happy command") in
warp mode. Note: the Happy 810 didn't support ultra speed, only warp
speed. The Happy 1050 supports both ultra and warp speed.
If this command succeeded, a $41 is stored in the speed table.
If none of the highspeed SIO variants worked, the SIO detection code
assumes it is a stock drive that only operates at standard SIO speed
and stores a $28 (pokey divisor for ~19kbps) in the speed table.
Once the SIO speed and type as been determined, only the code in
hisiocode.src is used.
Damit kann ich weiterarbeiten, vielen Dank!
Liebe Grüße,
Sven
Re: SIO Highspeed
von Sven » Fr 4. Jan 2013, 15:32
Vielleicht muss ich doch noch einmal nachhören...
Bei den bestehenden Implementationen wird meist als Speed-Byte ein $09 (=Speedy) zurückgegeben, was einer Übertragungsgeschwindigkeit von 55931bps entsprechen müsste.
Somit stellt sich mir (noch immer) die Frage, ob z.B. myPicoDos nach der Antwort auf das SpeedByte ebenfalls sofort auf die 56k umschaltet oder es noch einen weiteren Command gibt.
Für die Speedy ist in der Readme nichts explizit aufgeführt. Ich möchte eigentlich vermeiden, nun einen Speedscan implementieren zu müssen um eine mögliche Änderung der Übertragungsrate zu erkennen.
Auch interessant (und nicht wirklich dokumentiert), ob die Delays zwischen den Sequenzen (Command, ACK, CPL...) trotz höherer Baudrate gleich bleiben oder ebenfalls um einen Faktor reduziert werden.
Danke und Gruß
Sven
Re: SIO Highspeed
von Sven » Do 10. Jan 2013, 21:09
Vielleicht hier mal die Antworten auf meine Fragen:
* Speedbyte:
Das Speedbyte gibt den Pokey-Divisor zurück (Speedy / SIO2USB $09 z.B.)
Dieses Speedbyte wird auf ATARI-Seite von div. Software genutzt um den Pokey-Divisor zu setzen. Nach der Rückmeldung wird in der Regel (wenn nicht gerade Happy oder Turbo1050) direkt auf die höhere Geschwindigkeit geschaltet.
* Timeouts
Die Timeouts sind "hard-coded" - auch bei höheren Übertragungen sind die Timeouts immer gleich.
Damit nicht der Nächste auch noch suchen muss
