Ab MagiC 3 ist das gesamte DOS einschließlich der Zugriffe auf DOS Dateisysteme reentrant und läuft im Hintergrund ab. So ist es möglich, auf Laufwerk A Dateien zu bearbeiten, ohne den Rechner bei den Diskettenzugriffen merklich zu bremsen. Voraussetzung hierfür sind jedoch Disketten- und Festplattenroutinen, die im Hintergrund arbeiten.
Damit der Plattentreiber diese Funktionen nicht zur Verfügung zu stellen braucht, enthält das BIOS von MagiC alle notwendigen Funktionen. Über den MagX-Cookie (Komponente hddrv_functions) erhält man Zugriff auf die folgende Struktur, die Zeiger auf wichtige Routinen des Hintergrund-DMAs enthält:
typedef struct { LONG dma_begin ( VOID); LONG dma_end ( VOID ); LONG dma_wait ( d0 = LONG ticks_200hz ); LONG ncr_begin ( VOID ); LONG ncr_end ( VOID ); LONG ncr_wait ( d0 = LONG ticks_200hz ); } HDFUNCS;
Hinweis: Direkt vor der Struktur (2 Bytes vorher) liegt ein WORD, das die Tabellenlänge in LONGs angibt (in diesem Fall 6). Alle 6 Zeiger liegen im Systemvariablenbereich und dürfen notfalls verändert werden. Die internen Funktionen für die Floppy springen ebenfalls über die 6 Zeiger. Wichtig: Der Zeiger hddrv_functions im MagX-Cookie darf nicht verändert werden.
Zur Bootzeit ist das präemptive Multitasking abgeschaltet (eigentlich ist auch das Multitasking abgeschaltet), aber die Routinen funktionieren auch vor Installation des AES, wobei die Warteroutinen dann ein 'busy waiting' machen (wie auch beim Abschalten des präemptiven Multitasking), und die Semaphorenroutinen machen (bis auf das Setzen und Löschen von flock) einfach nichts.
Dieser Hypertext enthält Auszüge aus dem BIOS von MagiC, die demonstrieren sollen, wie das ganze funktioniert; dazu einige Worte:
die Routinen acsi_xxx sind gleichzeitig für ACSI und FDC, d.h.
dma_begin setzt flock, dma_end löscht es wieder.
die Routinen ncr_xxx sind für TT-SCSI.
die Funktionen xxx_begin reservieren die jeweilige Semaphore.
Für die Rückgabwerte gilt:
Wert | Bedeutung |
-1 | Semaphore ist bereits im Besitz |
0 | Ok |
die Funktionen xxx_end geben die Semaphore wieder frei; auch
hier wird kein Register verändert.
dma_wait wartet auf einen Interrupt des ACSI-DMA (bzw. FDC)
Controllers; ncr_wait ist für den SCSI-Bus des Atari-TT. Für die
Rückgabewerte gilt:
Wert | Bedeutung |
-2 | Busfehler (Interrupt vom TT-SCSI) |
-1 | Timeout |
0 | Ok |
Querverweis: BIOS GEMDOS XFS-Konzept in MagiC