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-File14.2.1 mec0 (MPS) Schnittstelle TOS0. AllgemeinesMPS = Magic_Programmier_Schnittstelle
Dateien des Demobeispieles:
mps_base.def Die Exportliste der DLL, NICHT ÄNDERN
mps_base.h Definition der MPS_Schnittstelle, NICHT ÄNDERN
mps_base.cpp Basis-Funktionen der DLL, NICHT ÄNDERN
mps_demo.h Definitionen für die Demo-DLL
mps_demo.cpp Die MPS_Funktionen der Demo-DLL
testmps.s Motorola - Beispiel zum Aufruf der MPS-Funktionen des
Demo-Beispieles
Um eigene MPS_DLLs zu entwickeln, verwenden Sie bitte mps_base.def,
mps_base.h und mps_base.cpp unverändert. Zu ändern/ergänzen sind
mps_demo.h und mps_demo.cpp. Insbesondere wählen Sie bitte eine eigene
DLL_ID in mps_demo.h zur Unterscheidung von anderen MPS_DLLs.
I. KonzeptWindowsseitig können über dynamische Bibliotheken (DLLs) beliebig
viele Funktionen (im folgenden MPS_Funktionen genannt) eingerichtet
werden, die innerhalb von MagiC_PC (motorolaseitig) aufgerufen werden
können.
In der Startphase versucht MagiC_PC, alle DLLs im Unterverzeichnis MPS
zu laden und zu starten. Dazu ruft MagiC PC drei von der DLL zu
exportierende Funktionen auf (in dieser Reihenfolge):
1. mps_get_type(): muß 0x4701 liefern!
2. mps_get_functionlist(...): ermittelt DLL_ID und
MPS_Funktionsliste der DLL.
3. mps_magicinfo: teilt MagiC PC-eigene Daten/Funktionen mit, die
die DLL bei Bedarf verwenden kann.
Alle in 2) angemeldeten Funktionen können über spezielle Opcodes
motorola-seitig aufgerufen werden. Näheres zum Aufruf siehe IV.
II. Zu exportierende Funktionen der DLL ("Basisfunktionen")Eine MPS-DLL muß genau 3 C-Funktionen unter fester Ordinalzahl
exportieren: (auch Basisfunktionen genannt) (siehe mfp_base.def,
mfp_base.cpp, mfp_base.h)
∙ @101: int mps_get_type()
Zweck: Dient der Rückversicherung, ob tatsächlich MPS_DLL
erwischt. !! Rückgabewert: 0x4701 !!
∙ @102: int mps_get_functionlist(DWORD *mps_dll_id,MPS_fuptr
**p_funktionsliste);
Zweck: MagiC PC möchte DLL_ID und MPS_Funktionsliste wissen.
Rückgabewerte:
*mps_ddl_id: DLL_ID (4 Bytes, DLL_spezifisch zu wählen!)
*p_funktionsliste: Zeiger auf Liste der MPS_Funktionen.
return: 1: alles klar
∙ @103: void mps_magicinfo(MPS_magicinfo *is);
Zweck: MagiC PC teilt eigene Infos / Funktionspointer mit, die
die DLL verwenden darf:
typedef struct {
DWORD sizeof_str; // Größe von MPS_magicinfo
DWORD magic_version; // z.B. 0x010001
DWORD magic_date; // z.B. 19960815 (aufsteigend)
BYTE is_demo; // Ist demoversion?
BYTE uu1, uu2, uu3; // noch unbenutzt, 0
BYTE *(*intel_adr)(DWORD motadr); // Adressumrechnung Motorola -> Intel
BYTE *(*intel_ptr)(DWORD motptr); // Pointer-Umrechnung Motorola -> Intel (NULL bleibt NULL!)
WORD (*swap_word)(WORD w); // Ein Word swappen
DWORD (*swap_long)(DWORD dw); // Ein Langwort swappen
} MPS_magicinfo;
Die Adressumrechnungen ergeben NULL, falls motadr bzw motptr
ungültig ist.
III. Die frei definierbaren MPS_Funktionen einer DLL:MPS_Funktionen haben grundsätzlich die Form
void funktion_blabla( MPS_motregs *motregs )
motregs zeigt dabei auf die Liste der Motorola-Register d0-a7. Der
Inhalt der Register ist schon im richtigen Intel-ByteSex. Die
Motorola-Register dürfen auch mit neuen Werten beschrieben werden.
Die DLL übergibt mit mps_get_functionlist die Liste der Adressen aller
solcher MPS_Funktionen. Die Funktionsnummern entsprechen der Position
der Funktion innerhalb der Liste. Soll eine Nummer freibleiben, ist
als Adresse 0xffffffff (= -1) zu übergeben. Siehe auch mps_demo.cpp.
IV. Motorola-seitiger AufrufMPS_Funktionen werden durch einen 8-Byte-Opcode motorola-seitig
aufgerufen:
dc.w $4fbf * 2 Bytes: nicht ändern
dc.l DLL_ID * 4 Bytes: DLL-spezifische DLL_ID
dc.w Fkt_Nr. * 2 Bytes: Funktionsnummer.
Die DLL_ID ist die über mps_get_functionlist mitgeteilte DLL_ID (4
Bytes!). Funktionsnummer ist die Position der Funktion in der über
mps_get_functionlist mitgeteilten Funktionsliste (Zählung beginnt bei
0).
V. Sonstiges 1. Jede DLL sollte eine individuelle DLL_ID verwenden, um Konflikte
zwischen mehreren DLLs zu vermeiden (siehe mps_demo.h). DLL_IDs
mit gesetztem Bit 31 sind für uns (Application Systems) bzw. für
zugeteilte IDs reserviert. Bitte wählen Sie deshalb keine DLL_ID
mit gesetztem Bit 31! Falls wir Ihnen eine reservierte DLL_ID
zuteilen sollen, setzen Sie sich bitte mit Herrn Hoffmann von
Application Systems in Verbindung.
Folgende DLL IDs sind vergeben:
DLL ID Programmname Author
0x003f5c66 MPCTime Robert Weiß
0x2053434B MPCSTiK Dan Ackerman
0x21342812 Draconis Windows Sockets
0x44594a01 In2Cat Dimitri Junker
0x44594a02 Win_Lnk Dimitri Junker
0x50475752 MPC_POWR Emanuel Welter
2. Achten Sie auf die Verschiebung des Adressraumes!!
Wollen Sie eine Motorola-Adresse DLL-seitig verwenden, ist zur
Konvertierung intel_adr(..) bzw. intel_ptr(..) aufzurufen (siehe
MPS_magicinfo in mps_base.h). Adressen aus dem DLL-Adressraum
können motorola-seitig NICHT verwendet werden!
3. Achten Sie auf den unterschiedlichen Byte-Sex zwischen Motorola-
und Intel-Prozessor. Worte und Langworte aus dem Motorola-
Adressraum müssen geswappt werden, damit sie in der DLL richtig
vorliegen. Beim eventuellen zurückschreiben ist wieder zu
swappen. Sie können dazu die Funktionen swap_word(..) bzw.
swap_long(..) aufrufen (siehe MPS_magicinfo in mps_base.h). Aber:
Die Elemente von MPS_motregs (d0-a7) liegen schon intelmäßig vor
und müssen nicht mehr geswappt werden.