HomeEmulatorenEmulatorenMagiC PC-Schnittstelle

14.1 MagiC Mac-Spezifika

MagiC Mac ist eine Implementation des im Atari-Bereich bekannten MagiC auf die Hardware der Apple (Power-) Macintosh Computer. Dieser Abschnitt beschreibt die folgenden Punkte:

Wer Fragen hat oder wer bestimmte Features für die Atari-Mac-Schnittstelle vermißt, wende sich bitte an den Autor des MagiC Mac-Kernels, bevor er an Internas herumbastelt, die bei der nächsten MagiC Mac-Version dann vielleicht nicht mehr funktionieren.

Querverweis: GEMDOS   BIOS   XBIOS   GEM

14.1.1 Allgemeines zu MagiC Mac

Der Kern der 'Emulation' der Atari-Umgebung auf dem Macintosh liegt in der Umprogrammierung der PMMU. Sowohl Atari- als auch Macintosh-Programme gehen davon aus, daß sie in den untersten 2 KB des Adreßraums bestimmte Variablen (die sog. Systemvariablen) vorfinden. Wenn nun ein Atari-Programm läuft, erwartet es aber dort andere Werte als z.B. das Mac-Betriebssystem. Der sog. Kernel von MagiC Mac sorgt nun dafür, daß je nachdem, ob gerade eine Mac- oder eine Atari-Routine läuft, die passenden Systemvariablen im unteren Adreßbereich vorliegen. Dies geschieht durch entsprechende Programmierung der PMMU, einem Coprozessor für die Speicherverwaltung.

So gibt es also zwei MMU-Modi: Den Mac- und den Atari-Modus. Zwischen ihnen kann mittels zweier Routinen hin- und hergeschaltet werden. Ausgehend davon, daß der Mac-Modus der normale Modus ist, gibt es folgende Veränderungen beim Übergang in den Atari-Modus:

Querverweis: Programmstart und TPA

14.1.2 MagiC Mac und Power-Macs

MagiC Mac läuft natürlich auch auf den neuen PCI-Maschinen von Apple (Power Macintosh 7600, 8200, 8500 und 9500). Beim Einsatz auf dieser Hardware sollten die folgenden Punkte beachtet werden:

Querverweis: Programmstart und TPA

14.1.3 Cookies unter MagiC Mac

MagiC Mac unterstützt natürlich auch den Cookie-Jar, und legt die folgenden Cookies an:

Cookie Bedeutung in MagiC Mac
   
_CPU enthält den Wert 20, 30 oder 40. Auf 68000-Rechnern läuft MM nicht; bei PowerPC-Maschinen wird eine 68020 angezeigt.
_FDC $014D6163 - Die 3 letzten Bytes ergeben den Text 'Mac'
_FPU die üblichen Werte. Bei 68040 steht hier nur dann 8 drin, wenn auch die zugehörige FPU-Software installiert ist.
_MCH keine Atari-kompatible Hardware vorhanden (-1).
_SND 0
_VDO keine Atari-kompatible Video-Hardware vorhanden (-1).
MagX Analog zu MagiC.
MgMc Zeigt auf eine MgMcCookie-Struktur.
MNAM Zeiger auf Null-terminierten String mit dem Namen des Rechners. Dieser dient nur zur Information für den Benutzer.
PMMU Null. Zeigt an, daß die MMU belegt ist und nicht von anderen Programmen benutzt werden darf.

Querverweis: Cookie- und XBRA-Liste

14.1.4 Dateisysteme unter MagiC Mac

MagiC Mac erlaubt wie MagiC die Einbindung alternativer Dateisysteme. Zur Zeit werden die folgenden Systeme unterstützt:

Das Mac-Dateisystem unter MagiC Mac:

Da die GEMDOS-Funktionen meist direkt auf die Mac-Dateisystemfunktionen abgebildet sind, können alle unter MacOS benutzbaren Dateiformate auch unter MagiC Mac benutzt werden, d.h., sobald man ein Laufwerk auf dem Mac 'mounten' kann, ist es oder ein Ordnerinhalt davon auch als Laufwerk unter MM anmeldbar. Damit können in der Regel auch CD-ROMs oder Netzwerklaufwerke ohne weitere Treiber in MagiC Mac benutzt werden. MagiC Mac erlaubt z.B. auch das Mac-typische Auswerfen von Diskette.

Querverweis: XFS-Konzept in MagiC   Dpathconf

14.1.5 Einschränkungen von MagiC Mac

MagiC Mac implementiert nicht alle Funktionen, die MagiC für ATARIs bietet. AES, VDI & GEMDOS sind vollständig implementiert, beim BIOS & XBIOS gibt es aber Einschränkungen. Es ist jedoch möglich, daß durch Zusätze, wie McSTout oder einen Sound-Treiber, einige der Funktionalitäten wiederhergestellt werden.

Außerdem gibt es Einschränkungen bei einigen Funktionen, hauptsächlich in Verbindung mit dem Dateisystem und den Devices:

Querverweis: GEMDOS   BIOS   XBIOS   GEM

14.1.6 Exceptions unter MagiC Mac

Ein Atari-Programm kann, wie auf einem echten Atari, die Exceptionvektoren benutzen, sprich: umlenken. Allerdings darf das Programm dabei nur die Exception-Vektoren im Adreßbereich zw. $0 und $400 benutzen, nicht etwa die, auf die das VBR zeigt (denn es zeigt woanders hin!). Wer sich daran nicht hält, kann Schwierigkeiten mit späteren Versionen von MagiC Mac bekommen. Programme, die die PMMU benutzen, z.B. OUTSIDE, können unter MagiC Mac nicht laufen.

Folgende Atari-Interrupts werden z.Zt. vom Kernel simuliert:

Die Interrupts treten bedingt durch die Mac-Hardware jedoch evtl. mit anderen Prioritäten auf; die Interrupt-Maske des SR hat somit u.U. andere Werte als beim Atari. Der Vektor bei $400 (etv_timer) wird natürlich vom MagiC OS auch angesprungen, als Unterroutine vom Interrupt-Handler für MFP Intr. 5, ganz wie beim Original-Atari auch. Ebenso kann sich ein Programm, das Maus- oder Tastenereignisse erfahren möchte, über die XBIOS-Funktion Kbdvbase() in die Ereignisvektoren ganz wie beim Atari einhängen.

Noch ein wichtiger Hinweis zu Interrupts: Beim Mac muß, damit Tastatur, Maus und Timer funktionieren, die Interrupt-Maske (im CPU-Register SR) stets auf Null stehen. Beim Atari dagegen steht sie normalerweise auf drei. Programme, die nun Code, wie z.B. MOVE #$2300,SR enthalten, werden einen Macintosh in einen Schlafzustand versetzen, bei dem nur noch ein Reset hilft. Wer also die Interrupt-Maske nur zeitweise verändert sollte dies so machen (funktioniert auf Atari und Mac gleichermaßen):

  MOVE SR,-(A7)    ; altes SR merken
  ORI  #$0700,SR   ; alle Interrupts für einen kritischen Zugriff sperren
  ...
  MOVE (A7)+,SR    ; am Ende altes SR wiederherstellen

Wer unbedingt den Rechner wieder in einen Grundzustand bringen will, sollte nicht MOVE #$2300,SR sondern besser MOVE #$2000,SR benutzen. Auf dem Atari wird dann in kürzester Zeit von der HBL-Interrupt-Routine das SR auf $2300 hochgesetzt. So kommt man auf beiden Maschinen mit dem selben Code zum Ziel.

Werden Interrupt- oder andere asynchrone Routinen mittels MacOS-Funktionen installiert und sollen dann diese Funktionen vom Mac- in den Atari-Modus schalten, sind einige Dinge zu beachten, die weiter unten genauer beschrieben sind:

Querverweis: Programmstart und TPA   Reset-Vektor   Systemvariablen

14.1.7 Sauberes Programmieren

Wenn auch die spezifische Implementation von MagiC Mac nicht für jeden ATARI-Programmierer von Interesse ist, so gibt es doch einige Grundregeln, die man auch auf ATARI-Ebene einhalten sollte, um weitgehend sicher zu sein, daß die Programme auch auf MagiC Mac laufen können. Hier sind u.a. die folgenden Punkte zu nennen:

Querverweis:
Programmier-Guidelines   Style-Guidelines   XBRA-Verfahren

14.1.8 Der Shutdown in MagiC Mac

Unter MagiC Mac wird der Shutdown vom Programm 'shutdown.prg' übernommen; sofern sich dabei alle z.Zt. aktiven (Atari-) Programme beenden ließen, wird auch MagiC Mac selbst beendet. Für einige Programmierer dürfte interessant sein, wie man MagiC Mac ohne Nachfrage beenden kann. Dies kann in zwei Schritten erfolgen:

In Pure-C könnte dies z.B. folgendermaßen aussehen:

  static pascal void ExitToShell (void) 0xA9F4;
  MgMcCookie *mgmc;
  ...
  ...
  get_cookie ("MgMc", &mgmc);  /* Zeiger auf MgMc-Cookie-Struktur  */
  mgmc->modeMac ();            /* zum Mac-Modus wechseln           */
  ExitToShell ();              /* Beendet MM sofort ohne Nachfrage */

Wichtig könnten diese Informationen etwa bei der Programmierung eines eigenen shutdown.prg werden.

Querverweis:
Allgemeines zum Shutdown   shel_write   Shutdown in MultiTOS   Shutdown in MagiC   Shutdown beim Empfänger   Shutdown beim Initiator  

14.1.9 XCMDs unter MagiC Mac

XCMDs sind kleine externe Code-Module für Macintosh-Applikationen. Sie können in der Regel ziemlich einfach mit den Entwicklungswerkzeugen unter MacOS erzeugt werden (z.B. mit Metrowerks CodeWarrior oder Symantec C). Ab Version 1.2.2 erlaubt MagiC Mac auch die einfache Benutzung solcher CODE-Module von Programmen aus, die unter MagiC laufen. Dies erleichtert die Entwicklung von Programmen oder Treibern, die Funktionen vom Macintosh nutzen wollen, weil diese Teile dann mit einem Macintosh-Compiler erstellt werden können, anstatt umständlich die Interfaces unter einem Atari-Entwicklungssystem noch einmal nachbilden zu müssen.

Ein Beispiel für ein solches XCMD befindet sich im Ordner 'Demo XCMD' der original MagiC Mac-Dokumentation. Das erzeugte Modul kann dann einfach in den Ordner 'MagiC Mac XCMDs' gelegt werden. Dieser Ordner muß sich im selben Verzeichnis wie die MagiC Mac-Applikation befinden. Beim Start von MagiC Mac wird dieser Ordner nach Dateien mit dem Dateityp 'xCmd' durchsucht und die darin enthaltenen XCMD Resourcen geladen und ausgeführt. Diese XCMDs können sich dabei bei MagiC Mac registrieren und stehen damit MagiC-Programmen zur Verfügung.

Eine Anwendung zeigt das Pure C-Programm im Ordner 'MGMC_API' der original MagiC Mac-Dokumentation. Es zeigt, wie einfach ein installiertes XCMD geöffnet und aufgerufen werden kann. Die dazu über den Cookie (xcmdMgrPtr) angebotenen Funktionen gehen dabei automatisch ggf. in den Supervisor-Modus und schalten auf die Mac-Umgebung (per callMacContext) um und regeln auch die Parameterübergabe. Der Aufruf der XCMD-Funktionen auf diese Weise ist also nur erlaubt, wenn der Atari-Modus aktiv ist und wenn der Aufruf nicht von einem Interrupt aus erfolgt.

Wenn die XCMD-Funktionen aus Interrupts oder im Mac-Modus aufgerufen werden sollen, kann über "xcmdMgrPtr->getAdr" die Einsprungadresse des XCMD-Dispatchers ermittelt werden und dann direkt angesprungen werden.

Weitere Informationen zu XCMDs befinden sich im Quelltext 'Demo XCMD.c' der original MagiC Mac-Dokumentation.

14.1.10 Die Zusammenarbeit von MagiC und MacOS

MagiC Mac hängt sich direkt in alle Interrupt-Vektoren, die der Macintosh benutzt. Wenn MagiC läuft und ein Hardware-Interrupt auftritt, schaltet MagiC Mac die MMU zurück in den normalen Macintosh-Modus. Am Ende der IntrRoutine wird zurück in den Atari-Modus gewechselt und das unter MagiC laufende Programm fortgeführt. Solange der Mac-Modus aktiv ist, mischt sich MagiC Mac nicht weiter in die Intr-Bearbeitung ein, sondern nur, solange der Atari-Modus aktiv ist.

Immer dann, wenn vom Mac-Modus zurück in den Atari-Modus gewechselt wird, wird noch überprüft, ob eine bestimmte Zeit verstrichen ist (in Ticks gemessen; ein Tick ist ca. 1/60s), um dann ggf. periodische Aufgaben zu erledigen. Diese werden hier Mac-Tasks genannt.

Mac-Tasks erledigen u.a. folgende Dinge:

Die Entscheidung, ob zum Pollen der Events GetOSEvent oder WaitNextEvent (WNE) benutzt wird, kann über die Preferences und auch eine Cookie-Funktion eingestellt werden. Nur, wenn WNE benutzt wird, wird auch Rechenzeit an andere Mac-Applikationen abgegeben.

Mac-Tasks dürfen nur ausgeführt werden, wenn sicher ist, daß gerade keine andere MacOS-Funktion bearbeitet wird, denn das MacOS ist nicht reentrant. Mac-Tasks werden deshalb nur dann ausgeführt, wenn alle folg. Bedingungen zutreffen:

14.1.11 Der Cookie von MagiC Mac

Das Betriebssystem MagiC Mac [eine Portierung von MagiC auf die Hardware des Apple (Power) Macintosh] legt einen Cookie MgMc an, der auf die folgende Struktur zeigt:

typedef struct
{
  SHORT   vers;                 /* Versionskennung im BCD-Format       */
  SHORT   size;                 /* Größe der Struktur in Bytes         */
  LONG    flags1;               /* verschiedene Flags:                 */
                                /*                                     */
                                /* Bit-0: 640*400-Emulation aktiv      */
                                /* Bit-1: Rechts-Shift möglich         */
                                /* Bit-2: 2-Tasten-Maus                */
                                /* Bit-3: 68K-Emulation auf Power-PC   */
                                /* Bit-4: u. I/O-Bereich nicht vorh.   */
                                /* Bit-5: o. I/O-Bereich nicht vorh.   */
                                /*                                     */
                                /* Hinweis: Bit-2 steht erst ab        */
                                /* der Version 1.01, Bit-3 ab Version  */
                                /* 1.05 und die folgenden erst ab Ver- */
                                /* sion 1.10 zur Verfügung.            */
  PixMap  *scrnPMPtr;           /* Zeiger auf Screen-Beschreibung      */
  BOOLEAN *updatePalette;       /* Ist zu setzen, um Farbtabellen      */
                                /* zu restaurieren                     */
  ProcPtr modeMac;              /* MMU-Umschaltung auf Mac-Modus       */
  ProcPtr modeAtari;            /* MMU-Umschaltung auf Atari-Modus     */
  ProcPtr getBaseMode;          /* Liefert in D0.W den MMU-Modus.      */
                                /* Es gilt:                            */
                                /*                                     */
                                /*    0 = Macintosh                    */
                                /* <> 0 = Atari                        */
  ProcPtr getIntrCount;         /* Liefert in D0.L Intr-Semaphore-     */
                                /* Zähler (0 = frei)                   */
  ProcPtr intrLock;             /* Erhöht Interrupt-Semaphore-Zähler   */
  ProcPtr intrUnlock;           /* Erniedrigt Inter.-Semaphore-Zähler  */
  ProcPtr callMacContext;       /* Führt Routine im Mac-Kontext aus;   */
                                /* Proc-Adr auf Stack.                 */
                                /*                                     */
                                /* Achtung: Die RegisterD0-D2/A0/A1    */
                                /* A5 und A7 werden zerstört.          */
  Ptr     atariZeroPage;        /* Zeiger auf Atari-Speicherbereich    */
                                /* $0-$800 im Macintosh-Adreßraum      */
  Ptr     macA5;                /* Wert des A5-Regist. im Mac-Kontext  */
  ProcPtr macAppSwitch;         /* Aufruf durch MagiC-Kernel (D0/4(A7).*/
                                /* Es gilt:                            */
                                /*                                     */
                                /*   0 = Suspend                       */
                                /*   1 = Resume                        */
                                /*   2 = Quit                          */
                                /* 3/4 = atariModePossbile wechselt    */
  ProcPtr controlSwitch;        /* Aufruf durch MagiC-Kernel (D0/4(A7) */
                                /* Es gilt:                            */
                                /*                                     */
                                /* 0 = Atari-Screen verstecken         */
                                /* 1 = Atari-Screen zeigen             */
  LONG    hardwareAttr1;        /* z.Zt. undefiniert.                  */
  LONG    hardwareAttr2;        /* z.Zt. undefiniert.                  */
  Ptr     magiC_BP;             /* BASEPAGE des MagiC OS.              */
  Ptr     auxOutName;           /* Pascal-String für AUX-Ausg.-Device  */
  Ptr     auxInName;            /* Pascal-String für AUX-Eing.-Device  */
  ProcPtr auxControl;           /* Aufruf durch MagiC-Kernel (D0/4(A7) */
                                /* Es gilt:                            */
                                /*                                     */
                                /* 0 = Suspend                         */
                                /* 1 = Resume                          */
                                /* 2 = Quit                            */
  PrintDesc *printDescPtr;
  GenProc   configKernel;       /* Aufruf (C-Konvention) Atari-Modus   */
  BOOLEAN   *atariModePossible; /* Zeiger auf ein Flag das anzeigt, ob */
                                /* der Aufruf von modeAtari z.Zt. er-  */
                                /* laubt ist.                          */
  MacVersion *versionOfMacAppl; /* Version der MagiC Mac-Applikation   */
                                /* (ab Version 1.06)                   */
  VOID       *hwEmulSupport;    /* interner Gebrauch (ab Version 1.07) */
  FlpDrvInfo *floppyDrvInfoPtr; /* zeigt auf Infos für Laufwerke A und */
                                /* B (ab Version 1.07)                 */
  XCMDgrRec *xcmdMgrPtr;        /* XCMD-Interface (ab Version 1.08)    */
  ProcPtr   giveTimeToMac;      /* Aufrufen im Mac-Kontext falls idle  */
  LONG      minStackSize;       /* Mindest-Supervisor-Stackgröße       */
  GenProc   ext;                /* Hilfsroutinen, Aufr. aus Atari-Mode */
  GenProc   extMac;             /* analog 'ext'; Aufruf aus Mac-Modus  */
  ProcPtr   stackLoad;          /* (ab 1.11 / MagiC Mac 2.0)           */
  ProcPtr   stackUnload;        /* (ab 1.11 / MagiC Mac 2.0)           */
  LONG      reserved[3];        /* z.Zt. undefiniert                   */
} MgMcCookie;

Hinweise:

Querverweis:
MagiC Mac-Typvereinbarungen   Cookie- und XBRA-Liste

14.1.11.1 MagiC Mac-Typvereinbarungen

Im folgenden eine Liste von Typvereinbarungen, die im Zusammenhang mit MagiC Mac eine Rolle spielen:

typedef char Boolean;
typedef char *Ptr, **Handle;
typedef unsigned char *StringPtr;
typedef void PixMap;
typedef Handle THPrint;
typedef void (*ProcPtr)(void);

typedef long cdecl (*GenProc) (short function, void *data);
typedef Boolean cdecl (*PrSetupProc) (Boolean alwaysInteractively);

Hinweis: Die XCMD-Strukturen sind im File 'MgMc_API.h' der Original-Dokumentation von MagiC Mac enthalten.

Querverweis: Typdefinitionen in MagiC

14.1.11.2 mmc_flg1_bit4

Der untere I/O-Bereich ($00FF8000-$00FFFFFF) ist nicht als solcher vorhanden, d.h., dort kann sich ganz normales RAM, wie an jeder anderen Stelle auch, befinden. In diesem Fall wird auch keine Unterscheidung zw. ST- und TT-RAM gemacht - das ganze von MagiC Mac benutzte RAM, auch das oberhalb von 16MB, wird als ST-RAM verfügbar gemacht.

Das bedeutet natürlich, daß in diesem Fall Programme keine I/O-Zugriffe auf diesem Bereich machen dürfen! Ist dieses Bit gelöscht, kann ein Programm jedoch dort Zugriffe machen und mit einem Bus-Error rechnen, wenn keine Atari-kompatible Hardware (wie z.B. McSTout) dort installiert ist.

14.1.11.3 mmc_flg1_bit5

Der obere I/O-Bereich ($FFFF8000-$FFFFFFFF) ist nicht als solcher zugänglich (siehe Besonderheiten bei Power-Macs); bei Zugriff erhält man keinen Bus-Error sondern Daten aus dem Macintosh-ROM.

14.1.11.4 auxControl

... ist für den HSMODEM-Treiber gedacht: Der Word-Parameter auf dem Stack bestimmt, ob die Ports freigegeben werden sollen (2 = ganz schließen, 0 = schließen, aber ggf. DTR halten) oder eine Wiederbelegung des Ports erlaubt ist (Wert = 1). Zwischen Wert-0 und Wert-1 können sich die Namen (auxInPort, auxOutPort) geändert haben.

Hinweis: Der Aufruf sollte im Atari-Supervisor-Modus stattfinden, der USP ist undefiniert.

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.5 callMacContext

... dient dazu, die notwendige Macintosh-Umgebung zum Aufruf beliebiger MacOS-Routinen herzustellen. Die Routine muß im Mac-Modus aufgerufen werden, im Supervisor-Modus und nicht aus einem Interrupt heraus.

Dazu ist auf dem Stack die Adresse der Routine zu übergeben, die als Subroutine im Mac-Kontext aufzurufen ist. Für die aufgerufene Routine wird der normale User-Stack von MagiC Mac verwendet, zudem wird das Register A5 mit macA5 geladen und im Falle, daß Virtual Memory aktiv ist, auch in den User-Modus geschaltet. Da diese Funktion den Stack wechselt, ist keine Parameterübergabe über den Stack möglich. Die Register D0-D2/A0/A1/A5/A7 werden sowohl beim Aufruf als auch bei der Rückkehr der Subroutine verändert (jedoch haben A5/A7 nach Rückkehr von 'callMacContext' die selben Werte wie vor dem Aufruf). Die anderen Register werden nicht verändert und können zur Parameterübergabe und -rückgabe benutzt werden.

Die Ausführung dieser Subroutine bringt implizit den Aufruf von intrLock und intrUnlock mit sich, das heißt, währenddessen werden keine Mac-Tasks bearbeitet, auch wenn dabei zeitweise in den Atari-Modus gewechselt wird. Um trotzdem die Bearbeitung von Mac-Tasks zu ermöglichen, kann die Funktion 'giveTimeToMac' aufgerufen werden.

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.6 configKernel

... bietet Zugriff auf einige der Einstellungen, die sonst nur über die Macintosh-Seite interaktiv zugänglich sind. Dazu wird in der Regel im 'function'-Parameter eine Funktionsnummer und im 'data'-Parameter ein Zeiger auf eine Variable übergeben, die vor dem Aufruf den zu setzenden Wert enthalten muß oder -1 für den Fall, daß kein neuer Wert gesetzt werden soll.

Nach dem Aufruf enthält die Variable den aktuellen Wert. Die Einstellungen werden in die "Preferences" übernommen, wenn nichts anderes angegeben ist. Die Funktionen:

Wert Beschreibung
   
1 data zeigt auf ein Byte, das bestimmt, ob der 200Hz-Timer durch den MacOS-Timer simuliert werden soll. Es gilt:
0 = nein
1 = ja (default)
2 Bestimmt, ob Mac-Hintergrundprozesse aufgerufen werden sollen. Es gilt:
0 = nein
1 = ja
3 Bestimmt, ob IDLE-Zustand bei Powerbooks erlaubt ist. Es gilt:
0 = nein
1 = ja
4 Analog (1), für das Flag 'UnlockMemOnMacSide' (siehe auch unter atariModePossible): Ist es ungleich Null, wird der von MagiC Mac belegte Speicher für die TPA zum Auslagern freigegeben, falls Virtual Memory aktiv ist. Andernfalls läßt er sich nicht auslagern. Wird z.Zt. nicht in den Prefs gesichert.

Querverweis: Programmstart und TPA   Cookie von MagiC Mac

14.1.11.7 controlSwitch

Hier können sich Atari-Routinen per XBRA-Verfahren einhängen. Sie werden dann im Atari-Modus (Supervisor-Modus) aufgerufen, wenn eines der angegebenen Ereignisse eintritt. Dies ist z.B. nötig, wenn ein Atari-Programm sich bestimmter Macintosh-Routinen bedient. So kann sich z.B. ein Programm, das die Sound-Routinen des Mac benutzt, hierüber informieren lassen, wenn MagiC Mac beendet wird, um dann die Sound-Kanäle zu schließen und Speicher freizugeben.

Folgende Werte werden in D0.W und auf dem Stack übergeben (und müssen dort auch bleiben):

Wert Beschreibung
   
0 Hide
Maus- und Tastaturkontrolle für MagiC setzen aus, weil z.B. ein Mac-Dialog geöffnet ist. Es sollten dann auch keine Ausgaben auf den Bildschirm geschehen (z.B. bei Interruptroutinen), weil damit sonst der Macintosh-Dialog überschrieben werden könnte.
1 Show
Gegenteil von Hide.

Hinweis: Die Routine muß im Atari-Supervisor-Modus aufgerufen werden, der USP ist undefiniert.

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.8 getBaseMode

Falls getBaseMode in einem Interrupt aufgerufen wird, liefert die Funktion den Modus, der zum Zeitpunkt vor der Interrupt-Bearbeitung bestand.

14.1.11.9 intrLock

... muß aufgerufen werden, bevor von einer Macintosh-Routine, die im Interrupt laufen könnte, eine Umschaltung in den Atari-Modus erfolgt. Zusätzlich muß vor der Umschaltung damit gerechnet werden, daß ein fremder Stack aktiv ist, der nicht zum Adreßraum des Atari-Modus gehört.

Deshalb muß zuvor auf einen Stack (siehe minStackSize) aus dem Atari-Adreßraum gewechselt werden. Nach der Rückschaltung in den Macintosh-Modus muß selbstverständlich intrUnlock aufgerufen werden.

Mit Hilfe dieser Intr-Semaphore wird erkannt, wann die CPU Befehle unter MagiC im Nicht-Interrupt-Zustand ausführt. Dieser Zustand muß erkannt werden, weil nur dann die Macintosh-Hintergrundprozesse und sonstige Macintosh-Routinen gefahrlos vom MagiC Mac-Kernel durch seine Interrupt-Kontrollroutinen aufgerufen werden können. (Während Interrupt-Routinen oder Macintosh-Routinen abgearbeitet werden, darf keine Mac-Routine vom MagiC Mac-Kernel aufgerufen werden, weil das MacOS nicht reentrant ist. Während dieser Zeit werden keine Mac-Events bearbeitet; auch Befehl-W/-Q funktionieren dann nicht).

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.10 macAppSwitch

Hier können sich Atari-Routinen per XBRA-Verfahren einhängen. Sie werden dann im Atari-Modus (Supervisor-Modus) aufgerufen, wenn eines der angegebenen Ereignisse eintritt. Dies ist z.B. nötig, wenn ein Atari-Programm sich bestimmter Macintosh-Routinen bedient. So kann sich z.B. ein Programm, das die Sound-Routinen des Mac benutzt, hierüber informieren lassen, wenn MagiC Mac beendet wird, um dann die Sound-Kanäle zu schließen und Speicher freizugeben.

Folgende Werte werden in D0.W und auf dem Stack übergeben (und müssen dort auch bleiben):

Wert Beschreibung
   
0 Suspend
MagiC Mac tritt in den Hintergrund - eine andere Macintosh-Applikation kommt in den Vordergrund (z.B. der Finder).
1 Resume
MagiC Mac ist wieder die Vordergrundapplikation auf Macintosh-Seite.
2 Quit
MagiC Mac wird beendet.
3 Flag atariModePossible wird danach FALSE
4 Flag atariModePossible ist wieder TRUE

Hinweis: Die Routine muß im Atari-Supervisor-Modus aufgerufen werden, der USP ist undefiniert.

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.11 atariModePossible

... zeigt auf ein Byte, das anzeigt, ob augenblicklich ein Wechsel vom Mac- in den Atari-MMU-Modus möglich ist (0=verboten, 1=erlaubt). Solange der Macintosh ohne Virtual Memory (auch RAM-Doubler) läuft, ist der Aufruf von 'modeAtari' immer möglich, wenn jedoch VM aktiv ist und das Flag "UnlockMemOnMacSide" auch ungleich Null ist, wird beim Wechsel vom MagiC- zum Mac-Bildschirm der von MM für die TPA belegte Speicher zum Auslagern freigegeben.

Sobald die VM-Verwaltung jedoch einen Block auslagert, sind die von MM berechneten MMU-Tabellen nicht mehr gültig und müßten vor der nächsten Umschaltung in den Atari-Modus erst neu berechnet werden. Dies wird jedoch nicht automatisch getan, sondern erst, wenn zurück zum Atari-Bildschirm gewechselt wird. Aus diesem Grund dürfen Interrupt- und andere asynchrone Routinen, die unter MagiC Mac mittels MacOS-Funktionen installiert sind, unter den beschriebenen Umständen keine Atari-Modusumschaltung vornehmen.

Atari-Programme, die sich in die Atari-Vektoren einhängen (z.B. den VBL-Vektor bei $70), müssen dies alles nicht beachten, weil im Fall, daß die MMU-Tabellen ungültig werden, die Atari-Interrupts erst gar nicht mehr simuliert werden. Für den Fall, daß weitere Maßnahmen ergriffen werden sollen, bevor bzw. nachdem sich der Status des Flags ändert, kann auch eine Routine über macAppSwitch installiert werden, die dann mit den Werten 3 und 4 in D0.W dieses Ereignis anzeigt).

Querverweis: Programmstart und TPA   Cookie von MagiC Mac

14.1.11.12 modeAtari

Bevor diese Funktion aufgerufen werden kann, müssen folgende Bedingungen zutreffen:

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.13 modeMac

... kann jederzeit aufgerufen werden, auch in Interrupt-Routinen, sofern sich das Programm z.Zt. im Atari-Modus und im Supervisor-Modus befindet. Danach kann auf den gesamten Mac-Adreßraum zugegriffen werden.

Der Speicher, der im Atari-Modus bei Adresse Null beginnt, beginnt im Mac-Modus dort, wohin atariZeroPage zeigt. Wurde von einer normalen Atari-Anwendung aus mittels modeMac in den Mac-Modus gewechselt, dürfen nur solche MacOS-Routinen aufgerufen werden, die auch im Interrupt aufgerufen werden dürfen (siehe 'Inside Macintosh'), ggf. muß dazu noch das Register A5 mit dem Wert aus macA5 belegt werden. Andere Routinen sollten nur über callMacContext aufgerufen werden, insbesondere solche, die QuitDraw-Routinen benutzen – ggf. ist das auszuprobieren. Falls ein Aufruf von callMacContext nötig ist, erkannt man es oft daran, daß sonst Busfehler auftreten oder keine Texte in Dialogboxen usw. erscheinen.

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.14 versionOfMacAppl

Hierüber kann die Versionskennung von der laufenden MagiC Mac-Applikation ermittelt werden (also die Kennung, die auch imFinder angezeigt werden kann). Damit können Programme sich endlich auf die MM-Versionen einstellen.

14.1.11.15 giveTimeToMac

... dient dazu, Zeit an die Mac-Event-Bearbeitung von MagiC Mac abzugeben, wenn sich der Rechner längere Zeit (sinnvoll ab 1/60s) im Mac-Modus befindet, z.B., während auf Beendigung von asynchronen Bearbeitungen gewartet wird.

'giveTimeToMac' kann dann beliebig oft aufgerufen werden; die Mac-Events werden trotzdem nur so oft gepollt, wie in den Prefs eingestellt ist (normal: jede 1/60s, dies ist auch die maximale Frequenz). Um die Routine aufzurufen, muß der vollständige Mac-Context hergestellt sein, d.h., der Applikations-Stack aktiv und A5 entspr. gesetzt sein (dies wird z.B. durch callMacContext erreicht. Die Routine macht keine sonstigen Aktionen, die nicht auch sonst passieren, wenn der Atari-Modus aktiv ist und dabei automatisch zyklisch die Mac-Events gepollt werden. Als Besonderheit gilt, daß die Routine nicht ein anstehendes Quit-Kommando auswertet, damit die Routine, die 'giveTimeToMac' aufruft, davon ausgehen kann, daß sie gleich wieder drankommt (sofern nicht ein fataler Fehler auftritt).

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.16 minStackSize

... gibt die Mindestgröße für Supervisor-Stacks an, falls ein Programm selbst so einen Stack reservieren muß (beispielsweise dann, wenn eine Callback-Routine vom MacOS aufgerufen wird und diese dann eine Routine im Atari-Modus aufrufen will, weil dazu sichergestellt werden muß, daß sich der SP beim Umschalten in den Atari-Modus innerhalb des Atari-Adreßraums befindet und dies nur durch einen eigenen, lokalen Stack zu bewerkstelligen ist).

Achtung: Man sollte sich unbedingt an diesen Wert halten, da z.B. zwar auf den 68K-Maschinen in der Regel 5KB reichen, auf den neueren PCI-PowerMacs jedoch schon über 12KB nötig sind, wenn das Netzwerk (Ether-Talk) aktiv ist! Am Besten ist es jedoch, wenn man völlig darauf verzichtet, einen eigenen Supervisor-Stack anzulegen, um solche Schwierigkeiten in Zukunft zu vermeiden. Im Zweifel sollte mit dem Autor des MagiC Mac-Kernels Kontakt aufgenommen werden!

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.17 ext

... bietet diverse Hilfsfunktionen des MagiC Mac-Kernels. Aufruf muß aus dem Atari-Modus (User- oder Supervisor-Modus) geschehen. Aufrufe aus Interrupts sind nicht erlaubt.

Dazu wird im "function"-Parameter eine Funktionsnummer und im "data"-Par. ein Zeiger auf evtl. zusätzlich benötigte Daten übergeben. Bei Aufruf nicht definierter Funktionsnummern wird immer als Funktionsergebnis -1 zurückgegeben. Die Funktionen:

Wert Beschreibung
   
0 extMax
"data" ist unbenutzt (Null übergeben!), zurückgeliefert wird die höchste implementierte Funktionsnummer.
1 extAlert
Zeigt einen generischen Mac-Dialog (Alert) an. "data" zeigt auf einen Null-terminierten String (maximal 255 Zeichen lang!), der in dem Dialog angezeigt wird. Achtung: Umlaute müssen Mac-Codes haben. Zum Zeilentrennen einfach ein CR einfügen. Rückgabe: Immer Null.
2 extAUXOpenErr
Zeigt einen Mac-Alert an mit dem (entspr. der Sprache angepaßten) Text, daß der serielle Port nicht geöffnet werden kann, weil er belegt ist (wird von HSMODEM/MACM1 benötigt). "data" ist unbenutzt. Rückgabe: Immer Null.
3 extFSSpecToPath
Konvertiert einen Macintosh-Dateipfad in einen GEMDOS-konformen Pfad. "data" zeigt auf folg. Struktur: Zuerst ein FSSpec (siehe Mac-Doku), dahinter ein Puffer mit Platz für 256 Zeichen. Dieser Puffer wird mit einem C-String gefüllt, der einen vollständigen Pfadnamen beschreibt, mit dem über GEMDOS-Dateifunktionen auf die Datei zugegriffen werden kann. Es kann später auch gut sein, daß dies ein Pfad über das Pseudo-Laufwerk "u:\" ist, in dem dann alle z.Zt. vorhandenen Mac-Laufwerke verfügbar sind. Dabei muß auch damit gerechnet werden, daß es sich um Datei- und Ordnernamen handelt, die nicht ins 8.3-Schema passen.
Handelt es sich um einen Ordner, ist der Pfad auf jeden Fall mit "\" abgeschlossen. Wenn kein Pfad nicht ermittelt werden kann, weil z.B. keines der konfigurierten MagiC-Laufwerke den betreffenden Ordner sichtet, gibt die Funktion den Wert -2 zurück. Im Erfolgsfall wird 0 geliefert.

Achtung: Diese Funktion kostet u.U. viel Zeit, da die von MM benutzten Verzeichnisse ggf. durchsucht werden müssen, daher nicht sorglos dauernd aufrufen, wenn es vermeidbar ist.

Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste

14.1.11.18 extMac

Entspricht 'ext', jedoch muß Aufruf aus dem Mac-Kontext (siehe 'callMacContext') geschehen. Ist vorteilhaft, wenn sich das Programm wg. Aufruf anderer Mac-Funktionen bereits im Mac-Modus befindet. Aufrufe aus Interrupts sind i.d.R. nicht erlaubt.

14.1.11.19 stackLoad

stackLoad aktiviert einen neuen CPU-Stack (A7).

Dies ist dann nötig, wenn aus einem Mac-Kontext, bei dem ein beliebiger CPU-Stack aktiv ist, eine Routine im ATARI-Kontext aufgerufen werden soll, also, bevor ein Modus-Wechsel mit "modeAtari" erfolgt. Das Wechseln auf einen anderen Stack ist dann nötig, weil evtl. der Bereich, den A7 gerade benutzt, durch den Wechsel zum Atari-Modus ausgeblendet wird und es dann zu einem CPU-Stillstand käme (siehe auch Kap. "Interrupt-Handler unter MagiC Mac").

Anstatt einfach selbst den A7 azf den neuen Stack zu setzen, sollte 'stackLoad' benutzt werden. Diese Funktion tut im Grunde das selbe, jedoch informiert sie zusaetzlich das MacOS davon (durch Setzen weniger globaler Variablen). Damit wird erreicht, dass das MacOS waehrenddessen nicht den A7 periodisch überprüft. Denn sonst könnte es auf bestimmten MacOS-Versionen (vor 7.5 und wieder ab 7.5.3) zur Meldung eines Stack-Überlaufs durch das MacOS kommen, obwohl dies gar nicht der Fall ist.

Falls Virtual Memory aktiviert ist, wird hiermit außerdem erreicht, daß dieser Stack-Bereich nicht ausgelagert werden kann, was sonst u.U. einen Rechnerstillstand zur Folge haben kann.

Benutzung: In A0 ist ein Zeiger auf ein MemArea-Struktur (s.o.) zu übergeben. Darin muß der Zeiger auf den Beginn (niedrigste Adresse) des Stacks sowie seine Länge (beachte 'minStackSize'!) enthalten sein. Die Routine zerstört die Register A0 und A1 und setzt A7 auf den Wert von .

14.1.11.20 stackUnload

Dioe Umkehrung zu 'stackLoad'. Aufzurufen, wenn der zuvor aktiv gewesene Stack wieder benutzt werden soll.

Die Routine zerstört das Register A0 (A7 erhält wieder den Wert von vor dem stackLoad-Aufruf).


HomeEmulatorenEmulatorenMagiC PC-Schnittstelle