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
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:
Ein Speicherbereich, der irgendwo auf dem Macintosh-Heap
alloziert wurde, wird ab Adresse $0 im Atari-Adreßraum eingeblendet.
Dieser Bereich ist zwischen 4 und 32KB lang und enthält garantiert
ausschließlich die Exception-Vektortabelle und die dokumentierten
Systemvariablen.
Der Adreßraum von $00FF8000 bis $00FFFFFF (und entsprechend
$FFFF8000 bis $FFFFFFFF) wird ausgeblendet. Dies ist beim Atari der
I/O-Adreßraum der normalerweise beim Macintosh nicht zur Verfügung
steht (dort ist beim Macintosh höchstens RAM).
Damit Programme nicht irrtümlich diesen Adreßraum als RAM
ansprechen, falls beim Macintosh dort solches vorliegt, wird durch
diese Ausblendung jeder Zugriff zu einem Bus-Fehler führen.
Allerdings ist es möglich, daß spezielle Atari-kompatible Hardware
im Macintosh installiert wird, woraufhin dieser Adreßraum dann diese
Harware an den entsprechenden Stellen einblendet. Das heißt:
Ein Programm, das erkennt, daß es unter MagiC auf dem Mac läuft,
sollte nicht automatisch davon ausgehen, daß keine
Atari-Hardware im I/O-Bereich vorhanden ist, sondern sollte weiterhin
mit einem Testzugriff (durch Umlenken des Bus-Fehler-Vektors) prüfen,
ob Zugriffe auf die Bausteine möglich sind.
RAM, das weder zur TPA von MagiC, noch zum MagiC OS oder den
Kernel-Daten und -Routinen gehört, ist im Atari-Adreßraum nicht
vorhanden, d.h. Zugriffe außerhalb des speziell für Atari-Programme
reservierten Bereichs führen zu einem Bus-Fehler. Dies schützt
andere Macintosh-Applikationen besser vor fehlerhaften
Atari-Programmen. Dieser Schutz funktioniert allerdings nur
bei 68K-Rechnern, nicht bei PowerPCs!
Querverweis: Programmstart und TPA
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:
Die von MagiC nicht benutzten, aber im Mac-Adreßraum
vorhandenen Adreßbereiche können nicht ausgeblendet und
damit auch nicht zugriffsgeschützt werden. D.h., daß bei
Zugriffen außerhalb der TPA und dem Programm- und Heap-Bereich von
MagiC Mac keine Bus-Errors gemeldet werden, wie es bei den
68K-Rechnern der Fall ist.
Bei den PowerMac-Modellen seit Mitte 1995 wird der obere
Adreßbereich für PCI- Karten und/oder ROM verwendet. So erhält man
beim Zugriff auf den Atari-I/O-Bereich bei $FFFF8000-$FFFFFFFF
keinen Bus-Error sondern undefinierte Daten. Dies ist
leider nicht zu ändern. Es wird daher empfohlen, daß Programme nur
auf den I/O-Bereich bei $00FF8000-$00FFFFFF zugreifen, um entweder das
Vorhandensein von Bausteinen zu prüfen (indem ein Zugriff darauf
gemacht wird und geprüft wird, ob dabei ein Bus-Error auftritt) oder
mit der Hardware-Erweiterung McSTout arbeiten zu können für
den Fall, daß sie auch für die PCI-Macs verfügbar gemacht wird.
Programme können diesen Umstand ggf. an Bit 5 in Cookie.flags1 erkennen.
Querverweis: Programmstart und TPA
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
MagiC Mac erlaubt wie MagiC die Einbindung alternativer Dateisysteme. Zur Zeit werden die folgenden Systeme unterstützt:
FAT-Dateisysteme nach TOS-Konventionen: So können
Floppy-Disks sowie Hard-Disks im Atari-üblichen Format mit allen
TOS-Funktionen (GEMDOS, aber auch z.B. Rwabs) angesprochen werden.
Mac-Dateisysteme: Da diese keine FAT haben, ist der
Zugriff auf diese Laufwerke nur über GEMDOS, nicht jedoch über BIOS,
möglich.
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
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.
Nicht implementierte bzw. ignorierte Funktionen beim XBIOS:
Initmouse, Mfpint, Ikbdws, Jdisint, Jenabint, Giaccess, Offgibit, Ongibit,
Xbtimer, Dosound.
Außerdem gibt es Einschränkungen bei einigen Funktionen, hauptsächlich in Verbindung mit dem Dateisystem und den Devices:
Das MIDI-Device ist z.Zt. nicht benutzbar, es sei denn, die
Hardware-Erweiterung McSTout mit MIDI-Option ist installiert.
Es kann auch sein, daß MIDI später über eine der seriellen
Schnittstellen des Macs realisiert wird, so daß man lediglich sagen
kann: Ob MIDI benutzbar ist, muß der Benutzer festlegen - ein
Programm kann das praktisch nicht selbst erkennen! Für Midiws() gilt
das gleiche.
Das IKBD-Device ist nicht vorhanden.
Liefert Getbpb() Null, kann es sein, daß eine Mac-formatierte
Disk einliegt, die sich dennoch mit den Dateifunktionen über
Laufwerk A: ansprechen läßt.
Liegt eine Mac-formatierte Disk im Floppy-Laufwerk, liefert
Rwabs() einen Fehler ("drive not ready"). Die Dateien auf
der Disk können ggf. dennoch mit den GEMDOS-Dateifunktionen
angesprochen werden.
Drvmap() liefert auch gesetzte Bits bei den Laufwerken, die
Mac-formatiert sind und somit nur über GEMDOS und nicht mit Rwabs()
ansprechbar sind.
Getrez() liefert immer 2 (ST-High), ist also unbrauchbar.
Setscreen() kann die phys. Adresse nur ändern, wenn der Benutzer
MagiC Mac im ST-Auflösungsemulationsmodus (z.B. ST-High) gestartet
hat. Um zu erkennen, ob dies der Fall ist, sollte man zuerst die Adr.
mit Setscreen() zu ändern versuchen und dann mit Physbase() ermitteln, ob
sich die Adresse ändern ließ.
Floprd(), Flopwr(), und Flopver() funktionieren nicht, wenn
Mac-formatierte Disks eingelegt sind (erst ab MM 1.2.2 implementiert).
Die Bad-Sector-Liste bei Flopver() meldet im Fehlerfall alle Sektoren
der Spur als defekt, da die genaue Spur nicht ermittelt werden kann.
Flopfmt() kann seit MM 1.2.2 Disks formatieren, aber nur 80
Spuren, 2 Seiten und je nach eingelegter Disk 9 bzw. 18 Sektoren pro
Spur. Über den MgMc-Cookie kann hierzu ermittelt werden, was für
eine Disk (DD oder HD) sich im Laufwerk befindet. Nicht
wundern: Der Mac bietet nur eine Funktion, um alle Spuren auf
einmal zu formatieren. Deswegen wird das bei MM so gelöst, daß
bei Aufruf von Flopfmt() für Spur 0 (bzw. 79, je nachdem, wo
angefangen wird) gleich die ganze Disk formatiert wird und bei Aufruf
von Flopfmt für die restlichen Spuren nichts passiert, die Funktion
also sofort mit Fehlercode Null zurückkehrt. Auch ist es so, daß im
Fall eines Formatierproblems für alle Spuren ein Fehler gemeldet
wird. Die zu formatierende Disk muß folglich völlig in Ordnung sein.
Rsconf(): Die MPF-spezifischen Parameter werden ignoriert.
Puntaes() kennt mehrere Modi, MagiC Mac wird ggf. beendet.
Querverweis: GEMDOS BIOS XBIOS GEM
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:
$070: Autovektor-Interupt Level 4 (VBL).
$114: MFP-Interrupt 5 (200 Hz System-Timer).
$118: MFP-Interrupt 6 (IKBD). Allerdings wird hier nur das
Ereignis von Tastendrücken und Mausbewegungen simuliert, d.h., der
Interrupt-Handler erfährt die spezifische Art des Ereignisses auf
eine andere Art als beim Atari.
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:
Setzen eines Semaphores (s. intrLock/intrUnlock).
Abfrage, ob zu dem Zeitpunkt eine Atari-Modusumschaltung
überhaupt möglich ist (s. atariModePossible).
Deinstallation der Routine beim Beenden von MagiC Mac (s.
macAppSwitch).
Vor der Umschaltung in den Atari-Modus muß sichergestellt
sein, daß der Stack Pointer (SP) innerhalb des Atari-Adreßraums
befindet, weil es sonst zum doppelten Bus-Error kommt und die CPU
stehen bleibt.
Merke: 1. Es kann sein, daß der Aufruf der Routine
durch das MacOS dann erfolgt, wenn eine andere Mac-Applikation läuft
und dann ist der aktuelle Stack nicht der von MagiC Mac. 2.
Bei den 68K-Maschinen ist im Atari-Modus nur der Adreßraum der 2
TPAs, den untersten 32KB, ggf. der I/O-Bereich sowie der Bereich der
MagiC Mac-Applikation sichtbar, anderer Speicher vom MacOS und anderen
Mac-Applikationen wird ausgeblendet, dort gibt's dann nur Bus-Errors.
Fazit: Um sicherzustellen, daß beim Schalten in den Atari
MMU-Modus der SP im Atari-Adreßraum liegt, muß vorher ein
Stack-Bereich dafür reserviert werden und dieser dann benutzt werden.
Um sicherzustellen, daß der Stack groß genug ist (1-2 KB sind
deutlich zu wenig!), ist der Cookie-Wert minStackSize zu
beachten!
Immer in den Supervisor-Modus wechseln, bevor 'modeAtari'
aufgerufen wird (sonst läuft's nicht unter Virtual Memory). Dazu wird
folgender Code vorgeschlagen:
clr d0 move sr,d0 btst #13,d0 bne ok1 moveq #8,D0 ; EnterSupervisorMode dc.w $A08D ; _DebugUtil ok1: move d0,-(a7) ; Sichern des alten Modus ; hier nun modeAtari ... modeMac usw. aufrufen. move.w (a7)+,sr ; alten Modus wiederherstellen
Mac-Subroutinen dürfen in der Regel nur die Register
D0-D2/A0/A1 verändern, jedoch nicht, wie beim Atari oft üblich, A2!
Querverweis: Programmstart und TPA Reset-Vektor Systemvariablen
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:
Selbstmodifizierender Code
Wenn Code (gilt auch für XBRA-Vektoren) verändert wird, muß
unbedingt der CPU-Cache gelöscht werden. Zwar kann man durch
Ausprobieren feststellen, daß dies auf einer 68020 mit ihrem kleinen
Cache nicht nötig ist, jedoch kann man nie sicher sein: Auf dem Mac
gibt es einen 68K-Emulator für die PowerPC-Maschinen, der eine 68020
simuliert, jedoch erstens einen größeren Cache als die echte 68020
hat (incl. Datencache, der sonst erst bei der 68030 vorhanden ist) und
zweitens auch noch den Code in PowerPC-Code kompiliert.
Wird dann der Code vom ATARI-Programm verändert, kann der
Emulator das nur erkennen, wenn ein Befehl zum Cache-Löschen
ausgeführt wird. Ebenso ist ein Cache-Löschen bei den 68040/60-CPUs
in der Regel vonnöten! Hier ist der Code, mit dem in solchen Fällen
der gesamte Cache zu löschen ist:
Prozessor | Code |
68020/30 |
MOVE CACR,D ORI.W #$0808,D0 MOVE D0,CACR oder auch so: DC.W $4E7A,$0002,$0040,$0808,$4E7B,$0002 |
68040/60 |
NOP CPUSHA DC/IC oder: DC.W $4E71,$F4F8 |
Interrupts sperren
Falls kurzzeitig die Interrupts gesperrt werden müssen, dann
danach niemals das SR auf den festen Wert $2300 setzen,
sondern möglichst vor dem Sperren das alte SR sichern (z.B. auf dem
Stack) und hinterher wieder zurückladen. Wenn unbedingt ein
Rücksetzen des SR, unabhängig vom alten SR, erfolgen soll, dann die
Interrupt-Maske auf Null und nicht auf Drei setzen, also z.B.
MOVE #$2000,SR statt MOVE #$2300,SR. Das ATARI-Betriebssystem sorgt
dann automatisch für das Umsetzen auf Maskenwert 3, während beim Mac
die Maske auf 0 bleibt, sonst geht nämlich nix mehr.
Hardware-Zugriffe
Bevor man bestimmte Hardware-Register direkt programmieren will
(z.B. den Centronics-Port zum Drucken), sollte man den _MCH -Cookie
prüfen. Ist sein Wert $FFFFFFFF (dez. -1), dann heißt das, daß
keine ATARI-Hardware vorhanden ist (das PRG also z.B. auf dem
Macintosh läuft) und deswegen auch erst gar nicht versucht werden
sollte, auf die Hardware zuzugreifen, weil dort dann RAM sein könnte,
was natürlich nicht durch solche Zugriffe verändert werden
darf.
Supervisor-Modus
Seit den Multitasking-Betriebssystemen, wie MultiTOS und MagiC,
sollte kein Programm mehr den Supervisor-Stackpointer eigenmächtig
umsetzen, z.B., um einen größeren Stack zu haben, weil sonst
unabsehbare Abstürze passieren können (auf den PCI-Macs ist z.B. ein
sehr großer Supervisor-Stack notwendig, mind. 8MB, u.U. aber auch
24MB - dies kann nur das Betriebssystem wissen und korrekt
installieren). Wichtig: Um in den Supervisor-Modus zu
gelangen, keinesfalls die GEMDOS-Funktion Super() verwenden,
sondern Supexec() aus dem XBIOS. Nur Supexec() kann sicherstellen,
daß ein ausreichend großer Supervisor-Stack verwendet wird.
Querverweis:
Programmier-Guidelines Style-Guidelines XBRA-Verfahren
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
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.
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:
Pollen der Mac-Events (Funktionen GetOSEvent bzw.
WaitNextEvent).
Auswerten von Befehl-Q und Befehl-W.
Auswerten externer Apple-Events, z.B. Suspend/Resume (MagiC Mac
in den Hintergrund schalten) und externes Beenden.
Rechenzeitabgabe an andere Mac-Applikationen (durch
WaitNextEvent).
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:
Nach der Unterbrechung (Interrupt oder Aufruf von mode_atari)
wird der Atari-Modus aktiv sein und die Interrupt-Level-Maske ist
Null, d.h, es ist kein anderer Interrupt in Bearbeitung (um
dies sicherzustellen, muß in Intr-Handlern, die vom Mac-Modus in den
Atari-Modus wechseln, intrLock korrekt benutzt werden, s.u.).
Es wird gerade keine Routine im Mac-Kontext ausgeführt
(callMacContext).
MagiC Mac ist nicht dabei, sich zu beenden.
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:
Die Komponenten giveTimeToMac und minStackSize stehen erst
ab Version 1.09 zur Verfügung; alle weiteren Komponenten erst ab
Version 1.10.
Unbenutzte Bits und undefinierte Werte sind stets Null!
Alle Zeiger bleiben konstant, d.h., es ist erlaubt, sich einmal
die Zeigerinhalte zu kopieren und damit dann zu arbeiten.
Aufruf nach C-Konvention bedeutet, daß Parameter auf dem Stack
übergeben werden und daß Register D0-D2/A0-A2 zerstört werden
können.
Querverweis:
MagiC Mac-Typvereinbarungen Cookie- und XBRA-Liste
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
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.
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.
... 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
... 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
... 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:
| ||||||
2 | Bestimmt, ob Mac-Hintergrundprozesse aufgerufen werden sollen.
Es gilt:
| ||||||
3 | Bestimmt, ob IDLE-Zustand bei Powerbooks erlaubt ist.
Es gilt:
| ||||||
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
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
Falls getBaseMode in einem Interrupt aufgerufen wird, liefert die Funktion den Modus, der zum Zeitpunkt vor der Interrupt-Bearbeitung bestand.
... 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
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
... 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
Bevor diese Funktion aufgerufen werden kann, müssen folgende Bedingungen zutreffen:
Der Mac-Modus muß aktiv sein.
Die CPU muß sich im Supervisor-Modus befinden. Unter Virtual
Memory laufen Mac-Programme und auch die Mac-Interrupt-Routinen im
User-Modus. Falls von dort heraus zeitweise in den Atari-Modus
gewechselt werden soll, muß zuvor in den Supervisor-Modus gewechselt
werden. Siehe dazu 'EnterSupervisorMode'.
Der aktuelle Stack muß im Atari-Adreßraum liegen, sonst
bleibt CPU sofort wg. doppeltem Bus-Error stehen, sofern das Programm
auf einem 68K-Rechner läuft, weil dann andere Bereiche, also auch der
Stack-Bereich, nicht mehr ansprechbar sind. Beachte hierzu auch
minStackSize.
atariModePossible muß anzeigen, daß der MMU-Switch erlaubt
ist. Andernfalls erscheint bei installiertem MacsBug die Meldung:
"Fatal Error: Atari-Mode currently not available (MMU-Tables
invalid)".
Querverweis: Cookie von MagiC Mac Cookie- und XBRA-Liste
... 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
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.
... 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
... 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
... 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
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.
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 <MemArea.start+MemArea.length>.
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).