Topic : TOS - das Betriebssystem Author : Version : tos.hyp (5. März 2013) Subject : Programmieren/Atari Nodes : 3001 Index Size : 93602 HCP-Version : 5 Compiled on : Atari @charset : atarist @lang : @default : Titel @help : @options : +g -i -s +x +zz -t4 @width : 70 View Ref-File8.2.9 AES-Bindings TOS Das AES wird über ein einziges Unterprogramm aufgerufen, dem 6 Parameter übergeben werden; es handelt sich dabei um Adressen verschiedener Arrays, die zur Ein-/Ausgabe-Kommunikation benutzt werden. Um eine AES-Funktion aufzurufen, muß der folgende Parameterblock mit den Adressen der unten beschriebenen Arrays bestückt werden: typedef struct { int16_t *cb_pcontrol; /* Zeiger auf control-Array */ int16_t *cb_pglobal; /* Zeiger auf global-Array */ int16_t *cb_pintin; /* Zeiger auf int_in-Array */ int16_t *cb_pintout; /* Zeiger auf int_out-Array */ int16_t *cb_padrin; /* Zeiger auf adr_in-Array */ int16_t *cb_padrout; /* Zeiger auf adr_out-Array */ } AESPB; Die Adresse dieses Parameterblocks (der sich auf dem Stack befindet), muß dann im Register d1 vermerkt, und zusätzlich Register d0.w mit dem Wert 0xc8 (200) gefüllt werden. Durch einen TRAP #2 Systemaufruf kann dann das AES direkt aufgerufen werden. Für den Pure-Assembler könnte das z.B. so aussehen: .EXPORT aes ; Funktion exportieren .CODE ; Beginn des Code-Segments aes: MOVE.L 4(sp),D1 ; Adresse des Parameterblocks MOVE.W #200,D0 ; Opcode des AES TRAP #2 ; GEM aufrufen RTS ; raus hier .END ; Ende des Moduls Darüber, welche Register verändert werden dürfen, gibt es keine klaren Informationen. Tatsache ist jedoch, daß die entsprechenden Routinen im ROM alle Register retten. Nun zu den einzelnen Arrays. Über jedes Feld können bestimmte Ein- bzw. Ausgaben getätigt werden; es gilt: int16_t control[5] Über dieses Feld werden Informationen über die aufgerufene Funktion und ihre Parameter festgelegt. Es gilt: control[0] = Funktionsnummer control[1] = Anzahl der Werte im int_in-Array control[2] = Anzahl der Werte im int_out-Array control[3] = Anzahl der Werte im addr_in-Array control[4] = Anzahl der Werte im addr_out-Array Darüber, welche Informationen vor einem AES- Aufruf gesetzt werden müssen, gibt es keine klaren Informationen. Nötig ist es auf jeden Fall für die Elemente [0],[1] und [3]. Wenig sinnvoll erscheint es für die Elemente [2] und [4] zu sein - schließlich wissen die AES- Funktionen ja selbst, wie viele Werte sie in den Ausgabefeldern zurückliefern. int16_t global[15] Dieses Feld enthält globale Daten für die Applikation und wird teils von appl_init, teils von anderen AES-Funktionen benutzt, und automatisch gefüllt. Es gilt: global[0] Versionsnummer der AES global[1] Anzahl der Applikationen, die gleichzeitig laufen können. Bei einem Wert von -1 gibt es keine Beschränkung. global[2] Kennung (ID) der Applikation global[3,4] Beliebige Information, die nur für die Applikation von Bedeutung ist und von dieser gesetzt und gelesen werden kann. global[5,6] Zeiger auf eine Liste von Zeigern auf die Objektbäume der Applikation (wird von rsrc_load gesetzt). global[7,8] Adresse des für die Resource- Datei reservierten Speichers. Nur von Digital Research und nicht von Atari dokumentiert. global[9] Länge des reservierten Speichers. Nur von Digital Research und nicht von Atari dokumentiert. global[10] Anzahl der Farbebenen. Nur von Digital Research und nicht von Atari dokumentiert. global[11,12] reserviert global[13] Maximale Höhe eines Zeichens, die vom AES für den vst_height- Aufruf benutzt wird. Dieser Eintrag ist erst ab AES-Version 4.0, und auch nur von Atari dokumentiert. Ab PC-GEM Version 2.0 wird dieser Wert als Bitvektor mit den auf dem Desktop angemeldeten Laufwerken interpretiert (Bit-15 = Laufwerk-A). global[14] Minimale Höhe eines Zeichens, die vom AES für den vst_height- Aufruf benutzt wird. Dieser Eintrag ist erst ab AES-Version 4.0, und auch nur von Atari dokumentiert. Ab PC-GEM Version 2.0 wird dieser Wert als Bitvektor interpretiert, der angibt, welche der in global[13] angegebenen Laufwerke als Festplatten betrachtet werden können. int16_t int_in[16] Über dieses Feld werden alle 16-Bit großen Eingabeparameter übergeben. int16_t int_out[10] Über dieses Feld liefert das AES alle 16-Bit großen Rückgabewerte. int32_t addr_in[8] Dieses Feld dient zur Übermittlung von Zeigern (z.B. Zeiger auf Zeichenketten) an AES Funktionen. int32_t addr_out[2] Über dieses Feld werden 32-Bit große Werte vom AES zurückgeliefert. Achtung: Wenn das Betriebssystem Threads unterstützt, muss unbedingt darauf geachtet werden, eine Multithread-sichere Bibliothek zu verwenden. Insbesondere muss sichergestellt werden, daß jeder Thread sein eigenes global-Feld (s.o) erhält. Querverweis: Beispiel-Binding VDI-Bindings TOS Liste