Erklaerungen zum Projekt 'Call68KLib.¶' -------------------------------------- Das Programm 'Call68KLib' demonstriert, wie 68K shared library Functionen aufgerufen werden. Natuerlich kann der PPC nicht direkt in die Funktion springen, da diese nicht in PPC-Code vorliegt. Stattdessen wird ein sogenannter Kontextwechsel benoetigt, d.h. der PPC-Prozessor spielt den Ball dem 68K-Prozessor zu, welcher fuer ihn den Call macht und dann die Resultat wieder zurueckgibt. Es werden Funktionen der exec.library, dos.library und intuition.library aufgerufen. Zwei dieser Libraries werden schon beim Start des Programms geoeffnet (exec und dos), die intuition.library muss im Programm manuell geoeffnet werden. Es bleibt noch abzuklaeren, wie denn die Parameter uebergeben werden und wie der Aufruf im Detail funktioniert. Zu diesem Zweck existieren einige Makros (in der Include-Datei 'powerpc/powerpc.i'), welche diese Kontextwechsel stark vereinfachen und deswegen auch immer benuetzt werden sollten. Die Makros RUN68K und RUN68K_XL erlauben es, 68K-Funktionen auszufuehren. Sie koennen sowohl fuer konventionelle 68K-Funktionen wie auch fuer 68K Shared Library Funktionen benuetzt werden. Wir behandeln jetzt nur letzteren Fall. Als ersten Parameter gibt man die LibraryBase der Library an, welche man aufrufen moechte. Als zweiten Parameter gibt man dann die Funktion an, welche aufgerufen werden soll. Die Parameter werden in Registern uebergeben. Die Zuordnung der Register sieht wie folgt aus (diese Zuordnung ist auch im PowerASM-Manual und in den Autodocs zur powerpc.library beschrieben): d0 <-> r3 fp0 <-> f1 d1 <-> r4 fp1 <-> f2 d2 <-> r22 fp2 <-> f3 d3 <-> r23 fp3 <-> f4 d4 <-> r24 fp4 <-> f5 d5 <-> r25 fp5 <-> f6 d6 <-> r26 fp6 <-> f7 d7 <-> r27 fp7 <-> f8 a0 <-> r5 a1 <-> r6 a2 <-> r28 a3 <-> r29 a4 <-> r2 a5 <-> r30 a6 <-> r31 In unserem Beispiel sollte im Register a1 der Library-Namen und im Register d0 die Versionsnummer liegen. Deswegen wird der Namen ins PPC-Register r6 und die Versionsnummer nach r3 kopiert, bevor mit dem Makro RUN68K der Aufruf von exec/OpenLibrary vollzogen wird. Mit dem Makro RUN68K duerfen nur Scratch-Register uebergeben werden (d0/d1/a0/a1/fp0/fp1). Es gibt allerdings Library-Funktionen, welche Parameter in anderen Registern erwarten. In unserem Beispiel-Source ist das die Funktion 'VPrintf' der dos.library, welchen in d2 einen Wert erwartet. Hier muss RUN68K_XL verwendet werden. --------------------------------------------------------------------- Regel 15: Wenn 68K-Funktionen vom PPC ausgefuehrt werden und Nicht-Scratch- Register (aus der Sicht der 68K-CPU) uebergeben werden, muss unbedingt RUN68K_XL benuetzt werden, ansonsten genuegt RUN68K. --------------------------------------------------------------------- Man kann natuerlich immer RUN68K_XL verwenden. Bei Benuetzung von RUN68K wird die gesamte Codegroesse etwas kleiner und die Abarbeitung des Makros geht ein wenig schneller. An dieser Stelle sei darauf hingewiesen, dass es viele Betriebssystem- Funktionen gibt, welche vom PPC nicht angesprungen werden sollten, d.h. der Programmierer sollte sich immer ueberlegen, ob der Aufruf ueberhaupt sinnvoll ist. Man sollte z.B. nicht Forbid, Disable aufrufen, da diese dann gar keinen Effekt mehr haetten. Dies sollte von einem 68K-Quelltext gemacht werden. Zusaetzlich gibt es noch Probleme, wenn der PPC schreibend auf Speicher zugreift, welcher nicht korrekt ausgerichtet ist bzw. dessen Adresse nicht durch 32 teilbar ist. In diesem Fall besteht die Gefahr, dass der 68K- und der PPC-Prozessor sich gegenseitig Variablen zerstoeren. Am heikelsten sind die Aufrufe von Library-Funktionen, welche intern Speicher allozieren ohne dass der Programmierer etwas davon merkt. --------------------------------------------------------------------- Regel 16: Man sollte moeglichst wenige 68K-Funktionen ausfuehren, welche eventuell nicht korrekt ausgerichteten Speicher allozieren, und welche vom PPC beschrieben werden. Speicherallozierungen sollten mit den Funktionen der powerpc.library vollzogen werden, da diese das noetige Alignment garantieren. Jede kritische Funktion, welche trotzdem aufgerufen wird, erhoeht das Risiko, dass das PPC-Programm auf unreproduzierbare Art und Weise hin und wieder abstuerzt. Dies ist eines der groessten Probleme bei der Portierung von bestehender 68K-Software und muss ernstgenommen werden! --------------------------------------------------------------------- © 1997 HAAGE&PARTNER Computer GmbH