===========================================================================
= Handbuch für Caruh - den Multitasking-Manager für FutureOS - 2021.12.17 =
===========================================================================

----------------------
- Inhalteverzeichnis -
----------------------

   I. Übersicht
   I.1. Allgemeine Informationen
   I.2. Typen von Tasks
Vordergrund-Tasks
Hintergrund-Tasks
Zusammenfassung

  II. Benutzen des Taskers Caruh
  II.1. Submenue <D>atei
  II.2. Submenue <B>earbeiten
  II.3. Submenue <O>ptionen
  II.4. Submenue <T>asks
  II.5. Submenue <H>ilfe

 III.   Aufbau von Caruh
 III.1. Speicherbelegung der Applikation Caruh im unteren RAM
Variablen in Caruh
Einsprünge in Caruh
 III.2. Speicherbelegung der Applikation Caruh im zentralen RAM
Task-Variablen
Aufbau der Speicheradresse &BE02(CCON2)
Die Task-Tabelle
Die VRAM / Multi-Bildschirm Tabelle

  IV. Aufbau eines Tasks
Aufbau eines beliebigen Tasks innerhalb seines 16 KB Block
Die Aktions- und Konfigurations-Bits

   V. Programmierung eines Tasks
Task Konventionen: Anforderungen an Tasks

  VI. OS Funktionen für Tasks
GUI und OS Funktionen von Caruh

 VII. Beispiele
Einen regulären Hingergrund-Task zum Vordergrund-Task schalten
Wie kann nun ein Vordergrund-Task die Kontrolle an Caruh zurückgeben?
Reservieren von Teilen des gemeinsamen Bildschirms



----------------
- I. Übersicht -
----------------

I.1. Allgemeine Informationen
-----------------------------
Die Applikation 'Caruh' ist ein Teil des Betriebsystems FutureOS.
Caruh ist ein Tasker, das ist ein Multitasking-Manager. Oder besser gesagt ein
Programm um mehrere Applikationen (Tasks) gleichzeitig am CPC laufen zu lassen.
Die einzelnen 'Tasks' können sich dabei kooperativ verhalten.

Welche Eigenschaften hat Caruh, bzw. haben die Tasks?

- Die Applikation Caruh befindet sich im unteren RAM zwischen &0000 und &37FF.
  Der Bereich von &4000 bis &7FFF wird ebenfalls verwendet (Puffer, Tabellen)

- Caruh arbeitet in Bildschirm MODE 2, im 80 Zeichen x 25 Zeilen Modus

- Als Benutzerschnittstelle wird CBM benutzt: Caruh lässt sich also so wie die
  meisten anderen FutureOS Applikationen bedienen.

- Zusätzlich zu den Pull-Down Menüs am oberen Bildschirmrand kommt noch eine 
  Task-Zeile am unteren Ende des Bildschirms.
  Dort werden mittig die Namen vierer Tasks angezeigt. Mit den Pfeilen ganz 
  links und ganz rechts kann man sich horizontal durch die Namen der Tasks
  rollen.

- Die Oberfläche von Caruh bietet Funktionen um einen oder mehrere Tasks zu
  laden, speichern, löschen oder seine Priorität einzustellen.

- Die maximale Anzahl verschiedener Tasks beträgt 255 (bei 4 MB RAM Ausbau)

- Ein Task kann eine maximale Größe von 15,75 KB erreichen

- Die Tasks werden dynamisch verwaltet. Task-Nummern können sich also ändern.
  Beim Löschen eines Tasks beispielsweise werden die höheren Nummern angepasst

- Jede Task hat sein eigenes 16 KB großes Erweiterungs-RAM (E-RAM).
  Diese E-RAMs werden zwischen &4000 und &7FFF eingeblendet, dementsprechend
  wird ein Task immer an die Startadresse &4000 assembliert.


I.2. Typen von Tasks
--------------------
Es gibt Vordergrund und Hintergrund Tasks. Ein Hintergrund-Task kann durch den
Anwender als Vordergrund-Task geschalten werden - falls der Task dies erlaubt.

Vordergrund-Tasks
-----------------
Ein Vordergrund-Task ist in der Lage den gesamten Bildschirm zu übernehmen und
z.B. darauf zu schreiben. Weiterhin darf er auch die Tastatur abfragen.

Er muss auf die Taste 'ESCape' reagieren und die Kontrolle dann wieder zurück
an Caruh geben.

Jeder Vordergrund-Task ist immer auch ein Hintergrund-Task (solange er die Aus-
gabe auf den Bildschirm nicht übernommen hat).

Nur der Anwender kann einen Hintergrund-Task in den Vordergrund schalten!
Es kann nur einen Vordergrund-Task zu einer Zeit geben!

Hintergrund-Tasks
-----------------
Ein Hintergrund-Task ist lediglich dazu in der Lage auf Teile des Allgemeinen
Bildschirms zu schreiben. Dort kann er sich Bereiche reservieren.

Zusammenfassung:
----------------
1. Ein Task kann ein (reiner) Hintergrund-Task sein.
   - Er darf Teile des Allgemeinen Bildschirms reservieren und darauf schreiben
   - Er darf den kompletten Bildschirm nicht übernehmen
   - Er ist dadurch gekennzeichnet, dass in seinem E-RAM Bit 0 an Adresse &7FF8
     (TCON8) gelöscht ist

2. Ein Task kann von Caruh in den 'Vordergrund' geschalten werden.
   - Es gibt immer nur einen Vordergrund Task
   - Beim Start von Caruh ist Caruh selbst der Vordergrund-Task
   - Wird ein anderer Task zum Vordergrund-Task so darf er den gesamten
     Bildschirm nutzen. Und die Tastatur und die Joysticks.
   - Er muss allerdings auch die Kontrolle zurück geben können bei 'ESC'
   - Er ist dadurch gekennzeichnet, dass in seinem E-RAM Bit 0 an Adresse &7FF8
     (TCON8) gesetzt ist

Achtung: Um einen Task auf Vordergrund schalten zu können muss Bit 1 an Adresse
-------- &7FF8 (TCON8) gesetzt sein. Dies wird vom Task selbst erledigt.

Der Druck auf die 'ESC' Taste muss den Task wieder in den Hintergrund schalten!
Dabei wird von Caruh selbst auf ESC geprüft. Aber auch der Task muss/sollte das



----------------------------------
- II. Benutzen des Taskers Caruh -
----------------------------------

II.1. Submenue <D>atei
----------------------
<T>ask laden Hotkey: t oder T - Einen Task laden
---------------------------------------------------
Diese Funktion läd und startet einen Task. Seine Datei darf maximal 16 KB groß
sein (inklusive des Headers).

Task s<p>ei. Hotkey: p oder P - Speichern eines Tasks
--------------------------------------------------------
Diese Funktion dient dazu einen Task zu speichern, das sind immer 16 KB E-RAM.
Das Speichern auf ein beliebiges Medium erfolgt in Kooperation mit dem Task,
dadurch kann sich ein Task auf sein Abgespeichert-werden vorbereiten.
Ein gespeicherter Task kann später oder auf einem anderen Computer fortgesetzt
werden. Diese Funktion kann auch zur Fehlersuche verwendet werden.

<A>lle laden Hotkey: a oder A - Startet alle markierten Dateien als Tasks
----------------------------------------------------------------------------
Diese Funktion läd und started mehrere markierte Dateien auf einmal. Sie werden
als Tasks eingebunden.
Normalerweise würde man die entsprechenden Dateien zuerst im FutureOS Turbo
Destiop markieren. Anschließend können sie alle mit dieser Funktion geladen und
gestartet werden.
Auf diese Art kann man seine persönliche Auswahl an Tasks direkt starten.

<S>pei. Tab. Hotkey: s oder S - Speichert die 16 KB Task-Tabelle
-------------------------------------------------------------------
Diese Funktion speichert die 16 KB des Hauptspeichers (&4000 bis &7FFF).
Dieser Bereich enthält die Task-Variablen, die Task-Tabelle und die VRAM
Tabelle.
Ja, diese Funktion dient der Fehlersuche ;-) :-)

DIRs lese<n> Hotkey: n oder N - Lesen aller DIRs von markierten Medien
-------------------------------------------------------------------------
Hier kann man Laufwerke / Medien / Geräte auswählen und anschließend ihre DIRs
(Inhaltsverzeichnisse) einlesen. Dadurch kann von diesen Medien geladen und auf
sie gespeichert werden.

S<c>hließen Hotkey: c oder C - Beende alle Tasks und Caruh selbst
---------------------------------------------------------------------
Diese Funktion beendet und löscht alle Tasks, die zuvor benutzten E-RAMs werden
frei gegeben. Die Applikation Caruh wird beendet.

<V>ersion Hotkey: v oder V - Zeigt die Versionsnummer von Caruh
---------------------------------------------------------------------
Hier wird die Version von Caruh angezeigt, und das Datum der letzten Änderung.

<B>eenden Hotkey: b oder B - Beende alles Tasks. Beende die Applikation
-----------------------------------------------------------------------------
Siehe 'S<c>hließen' zuvor


II.2. Submenue <B>earbeiten
---------------------------
<L>oeschen Hotkey: l oder L - Lösche Task = '<B>eende Task' (siehe unten)
------------------------------------------------------------------------------
Diese Funktion beendet einen Task. Das von ihm genutzte E-RAM wird freigegeben

Gehe zu <o> Hotkey: o oder L - Gehe zu Task = 'Schalte <a>uf' (siehe unten)
-------------------------------------------------------------------------------
Diese Funktion schaltet einen Task in den Vordergrund, wenn dies dem Task auch
möglich ist.

<A>ufruf OS Hotkey: a oder A - Desktop aufrufen, Rückkehr mit OK Icon
-------------------------------------------------------------------------
Mit dieser Funktion kann der Anwender das Turbo Desktop des FutureOS temporär
aufrufen.
Im Desktop können nun beliebige Aufgaben erfüllt werden, z.B. Dateien markieren
Aber man muß das 'OK' Icon benutzen um zum Task Manager Caruh zurück zu kehren!


II.3. Submenue <O>ptionen
-------------------------
<M>ode Hotkey: m oder M - Selektiere den MODE 0-3 für Tasks
--------------------------------------------------------------------
Hier kann der User den Bildschirm-Modus (0-3) für die Tasks auswählen.
Ja, auch MODE 3 wird unterstützt, der wohl kaum Anwendung finden wird.
Allerdings wird Caruh selbst immer in MODE 2 arbeiten.

<F>arben Hotkey: f oder F - Wähle Farben für BORDER, PAPER und PENs
--------------------------------------------------------------------------
Die Farbe für BORDER, PAPER und die PENs 0-15 kann hier gewählt werden.
Diese Auswahl gilt für Caruh und alle aktiven Tasks.

F<o>rmat Hotkey: o oder O - Wähle das Bildschirm-Format (80x25, 64x32)
-----------------------------------------------------------------------------
Für aktive Tasks kann hier ein Bildschirm-Format ausgewählt werden.
Diese Auswahl hat jedoch keinen Einfluß auf das Interface von Caruh's selbst.

<S>prache Hotkey: s oder S - Selektiere eine Sprache für die Tasks
------------------------------------------------------------------------
Dieser Punkt erlaubt es die Sprache von FutureOS einzustellen. Die so gewählte
Sprache findet sich in der Konfigurations-Variable KF_CPC (&B976) in den Bits:
5,4,3 = 000 ==> OS Anwender spricht Deutsch
      = 001 ==> Franzoesich
      = 010 ==> Englisch
      = 011 ==> Griechisch
      = 100 ==> Spanisch
      = 101 ==> Hollaendisch
Jeder Task kann lesen welche Sprache selektiert wurde. Caruh selbst jedoch wird
seine Sprache nicht ändern, denn das würde zu viel Speicher kosten.
Statt dessen existieren Versionen von Caruh in jeder der obigen Sprachen.


II.4. Submenue <T>asks
----------------------
<S>tarte Task Hotkey: s oder S - Task laden und starten
---------------------------------------------------------
Siehe '<T>ask laden' zuvor

<B>eende Task Hotkey: b oder B - Task beenden, E-RAM freigeben
----------------------------------------------------------------
Siehe '<L>oeschen' zuvor

<P>rioritaet Hotkey: p oder P - Setze die Priorität eines Task auf 1-255
---------------------------------------------------------------------------
Diese Funktion setzt die Priorität eines Tasks auf einen Wert von 1 bis 255.
Je kleiner die Nummer ist, desto höher ist die Priorität des Tasks, sie
entspricht in etwas 1/300 Sekunde Wartezeit.

Schalte <a>uf Hotkey: a oder A - Schalte Task in den Vordergrund
------------------------------------------------------------------
Siehe 'Gehe zu <o>' zuvor


II.5. Submenue <H>ilfe
----------------------
<H>ilfe Hotkey: h oder H - Zeigt einen Hilfsbildschirm
--------------------------------------------------------------
Nur eine Hilfsbildschirm zur Benutzung.

<I>nfo Hotkey: i oder I - Zeigt (momentan noch) die Versionsnummer
---------------------------------------------------------------------------
Siehe '<V>ersion' zuvor

<N>eues Hotkey: n oder N - Zeigt (momentan noch) die Versionsnummer
---------------------------------------------------------------------------
Siehe '<V>ersion' zuvor

<M>enue Hotkey: m oder M - Informationen zum CBM Menue-System
---------------------------------------------------------------------
Hier werden Informationen zum CBM Menue-System gezeigt, welches Caruh als
Rahmen dient.

-$<$>$- Hotkey: $ oder 4 - Geld für dieses Projekt spenden
------------------------------------------------------------------
Niemand hat auch nur einen Pfennig für meine Arbeit gespendet.
Also lassen wir das ... ;-)

.w<w>w. Hotkey: w oder W - Wo man Unterstützung im Internet findet
--------------------------------------------------------------------------
Dies ist Dein Weg zur FutuerOS Heimseit und damit auch zur Hilfe für Caruh :-)



-------------------------
- III. Aufbau von Caruh -
-------------------------

III.1. Speicherbelegung der Applikation Caruh im unteren RAM
------------------------------------------------------------
Der Programm-Kode von Caruh befindet sich ab &0000 im RAM und erstreckt sich
momentan bis etwas &2000.
Ab Adresse &3800 befindet sich (wie üblich) der Zeichensatz bis zu &3FFF.
Es stehen also noch etwa 5-6 KB für zukünftige Erweiterungen von Caruh zur
Verfügung.
Im unteren RAM befinden sich relativ wenig Variablen, da es geplant ist Caruh
eventuell eines Tages als Lower ROM zu integrieren.
Es existieren jedoch einige für den Programmierer und seine Tasks interessanten
Einsprünge.

Variablen in Caruh
------------------
- Speicheradresse &000E enthält den Bildschirm Modus (0-3) der vom Benutzer mit
  Hilfe von Caruh eingestellt wurde.
  Jeder Task kann den gewünschten Bildschirm-Modus aus diesem Byte lesen, falls
  der Task in den Vordergrund geschalten wird.

- Speicheradresse &000F enthält das Bildschirm Format, das der Anwender mittels
  Caruh eingestellt hat (0 für 80x25, 1 für 68x30 und 3 für 64x32 Format).
  Jeder Task kann das gewünschte Bildschirm-Format aus diesem Byte lesen, falls
  der Task in den Vordergrund geschalten wird.

Einsprünge in Caruh
-------------------
- An der RAM Adresse &0003 kann die Funktion 'SAOMS' aufgerufen werden.
  Sie erlaubt es dem Anwender ein Stück des Multi-Bilschirms (normale Ansicht)
  zu reservieren.

- An Adresse &0008 kann das von CBM her bekannte Menu-System 'M_DISP2' durch
  den Befehl 'RST 1' aufgerufen werden.

- An Adresse &000B kann der von CBM her bekannte Fenster-Rahmen-Zeichner
  'DR_WIN' durch 'CALL &000B' aufgerufen werden.

- An Adresse &0010 ruft man die Funktion 'SEPRI' mittels des Z80 Befehls
  'RST 2' auf. Mit 'SEPRI' kann ein Task seine Priorität ändern.
  Jeder Task wird nach dem Laden mit der höchsten Priorität '1' gestartet.
  Es sind Werte von 1 bis 255 zulässig. Kleinere Werte haben höhere Priorität.

- An Adresse &0013 ruft man die Funktion 'RFMSA' mittels des Befehls
  'CALL &0013' auf. 'RFMSA' dient dazu einem Task ein Stück des gemeinsamen
  Bildschirms zu reservieren. Damit ist die Ansicht gemeint, die nach dem Start
  von Caruh zu sehen ist. Der Task darf dann in diesen Bereich schreiben.


III.2. Speicherbelegung der Applikation Caruh im zentralen RAM
--------------------------------------------------------------
Das zentrale RAM (Hauptspeicher, I/O: &7FC0) wird von &4000 bis &7FFF wie folgt
belegt. Es existieren drei RAM Abschnitte die zur Task-Verwaltung dienen:

- Task Variablen (diese sind im ersten Element der Task-Tabelle enthalten)
 (beziehungsweise im oberen RAM)

- Task Tabelle   (diese enthält ein Element für jeden Task von 1-255)

- VRAM Tabelle   (diese definiert welcher Task welchen Teil des Bildes nutzt)


Task-Variablen
--------------
Die Task-Variablen dienen Caruh zur Verwaltung der einzelnen Tasks, sie zeigen
was sich aktuell abspielt.

- &4000(TASK_AKT): Dieses Byte zeigt auf die Nummer des gerade aktiven Tasks

- &4001(TASK_NUM): Dieses Byte enthält die Anzahl aller vorhandenen Tasks

- &4002(DIS_A_T): Dies Byte enthält die Nummer des ersten Tasks der Task-Zeile
  Damit ist die unterste Zeile von Caruh gemeint (Task links)

- &400C/D(TA_ESEL): Diese 16 Bit enthalten den I/O E-RAM Select, wenn ein neuer
    Task ins E-RAM geladen wird

- &400E/F(TA_OSEV): Diese 16 Bit enthalten einen Zeiger auf eine der XRAM_??
    Variablen, wenn ein neuer Task ins E-RAM geladen wird

- &4010: Hier beginnt das erste Element von Task#1 (16 Bytes)
         In Source-Code von Caruh wäre das 'TT_START + T_T_E_L'.
 Wobei sich TT_START(=&4000) + T_T_E_L(=&0010) = &4010 ergibt!


- &7FE4-&7FFF: Dieser Bereich wird für Caruh selbst (als Task #1) benötigt!


Im oberen RAM werden zwei weitere Bytes von Caruh benutzt!
Sie dienen der Kommunikation zwischen Caruh und den Tasks:

- &BE02 (CCON2): Zentrales Kommunikations-Byte zwischen Caruh und den Tasks

Aufbau der Speicheradresse &BE02(CCON2)
---------------------------------------
- Bit 0: = 0 -> Alle Tasks sind im Hintergrund (das ist der Normalzustand)
In diesem Fall fungiert Caruh als Vordergrund-Task
 = 1 -> Ein Task ist im Vordergrund aktiv, d.h. übernimmt Bildschirm,
                Tastaturabfrage etc.
Dieses Bit wird vom Task selbst eingeschalten, sobald der aktiv
die Kontrolle über den Bildschirm etc. übernommen hat.
Dieses Bit MUSS aber auch vom dem Task selbst wieder gelöscht
werden, sobald der die Kontrolle über den Bildschirm wieder an
Caruh zurückgibt. 
Beim Drück auf die ESC-Taste muss der Task den Bildschirm etc.
wieder an Caruh zurückgeben. Dazu wird Bit 0 an &BE02 gelöscht.

- Bit 1: -> reserviert
- Bit 2: -> reserviert
- Bit 3: -> reserviert
- Bit 4: -> reserviert
- Bit 5: -> reserviert
- Bit 6: -> reserviert

- Bit 7: = 0 -> Caruh gibt momentan keine Zeichen aus. -> Tasks laufen Normal
 = 1 -> Caruh gibt gerade Text auf dem Bildschirm aus. Beispielsweise
werden Menüs dargestellt, Dateien oder Optionen ausgewählt etc.
-> Die Tasks dürfen NICHTS am Bildschirm darstellen!

- &BE03 (TTNS3): Tempörärer Task-Nummern-Speicher an &BE03
 Speichert die Nummer eines Tasks (2-255) für Unterprogramme


Die Task-Tabelle
----------------
Die Task-Tabelle beginnt rechnerisch ab &4000 im Hauptspeicher.
Ein Eintrag der Task-Tabelle ist 16 Bytes lang.
Dementsprechend reicht sie also von &4000 bis &4FFF im zentralen RAM (&7FC0).

Das erste Element der Task-Tabelle mit Nummer '0' ist jedoch speziell belegt:
Da es keinen Task mit der Nummer &00 gibt stehen die Bytes &4000-&400F für die
Task Variablen (Siehe oben unter 'Task-Variablen') zur Verfügung.

Das erste reale Element beginnt also ab &4010 für den ersten Task (#1).

Jedes Element besteht aus 16 Bytes:

0...: Task-Nummer (= Nummer des Tasks der durch diesen Eintrag verwalted wird)
1...: Priörität: Wie viele 1/300 Sekunden wird gewartet bis der Task erneut
      aufgerufen wird. Der Wert 0 wird hierbei als 256 interpretiert.
      Je kleiner der Wert ist, desto höher ist die Task-Priorität.
2...: Wiederlade-Wert für das Prioritäts-Byte, sobald das Prioritäts-Byte den
      Wert &00 erreicht hat (siehe Byte 1)
3- 4: Diese 16 Bit enthalten das E-RAM in dem sich der Task befindet
      (16 Bit, physikalische I/O-Adresse: &7FC4-&78FF, deckt 4 MB ab)
5-15: Der Namen des Tasks, er entspricht dem Dateinamen (11 Buchstaben)

Ab Adresse &4020 folgen die Daten für Task #2, am &4030 für Task #3, an &4040
für Task #4 und so weiter...


Die VRAM / Multi-Bildschirm Tabelle
-----------------------------------
Solange Caruh als Vordergrund Task aktiv ist können andere Tasks lediglich
Teile des Allgemeinen Bildschirms nutzen. Das ist der Bildschirm, der nach dem
Start von Caruh mit seinem Menüsystem angezeigt wird.
Solange der 'Allgemeine Bildschirm' genutzt wird ist folgendes möglich:

- Jeder Task kann sich Teile des VRAMs / Allgemeinen Bildschirms reservieren
- Jeder Task darf auf für ihn reservierte Teile des Allgemeinen Bildschirms
  schreiben, zeichnen oder auf andere Weise Daten ausgeben
- Dabei werden keine chaotischen, überlappenden Fenster genutzt!

So ist es also möglich, dass alle Tasks auf dem Hauptbildschirm Daten ausgeben.
Das ist der Multi-Bildschirm-Modus.

Um den Bildschirm (80 Zeichen auf 25 Zeilen) aufzuteilen gibt es die VRAM- bzw.
Multi-Bildschirm-Tabelle. Diese Tabelle umfasst 2000 Bytes (= 80 * 25).

Die Tabelle liegt im Hauptspeicher von &7800 bis zu &7FCF.
Die Bytes von &7FD0 bis &7FFF sind dementsprechend NICHT Teil der Tabelle.

Jedes Byte der VRAM (Multi-Bildschirm) Tabelle entspricht einem Zeichen auf dem
Bildschirm.

Dabei beginnt die Tabelle beim ersten Zeichen in der obersten Zeile ganz links.
Es folgen Zeichen um Zeichen der ersten Zeile von Links nach Rechts.
Anschließend folgen Zeile für Zeile von oben nach unten.

Welche Bedeutung haben die Bytes in der VRAM Tabelle?
-----------------------------------------------------
Ein Null-Byte in der Tabelle definiert dabei eine verfügbare Bildschirmposition
und ist somit für Tasks verfügbar.

Ist ein Byte der Tabelle von einem Wert(1-255) belegt, so ist die entsprechende
Position auf dem Bildschirm bereits von einem Task belegt.

Caruh belegt dabei die obersten vier Zeilen und die unterste Zeile für sein
Menü-System und die untere Task-Bar.



--------------------------
- IV. Aufbau eines Tasks -
--------------------------
Die Einsprung / Start / Ladeadresse eines jeden Tasks ist immer Adresse &4000
Die Dateilänge darf maximal 16 KB betragen (inclusive eines Headers!)

Jeder Task belegt einen 16 KB Block (E-RAM Block) von &4000 bis &7EFF.
Aktuell werden dafür die ersten 512 KB Erweiterungs-Speicher genutzt.
Es sollen jedoch schon bald die vollen 4 MB E-RAM genutzt werden (->Update2025)


Aufbau eines beliebigen Tasks innerhalb seines 16 KB Block:
-------------------------------------------------------------------------------
- &4000-&7EFF: Programm-Bereich - --> Applikationslänge maximal 15,75 KB
-------------------------------------------------------------------------------
- &7F00-&7FF7: Stack (jeder Task hat seinen eigenen Stack). 124 Elemente.
-------------------------------------------------------------------------------
- &7FF8-&7FF9: (TCON8 und TCON9) 16 Aktions- und Konfigurations-Bits
       Bitte sehen Sie sich dazu den folgenden Abschnitt an :-)
-------------------------------------------------------------------------------
- &7FFA-&7FFB: (TER16) 16 Bit E-RAM Auswahl des Tasks (&7FC4-&78FF)
-------------------------------------------------------------------------------
- &7FFC......: (TAPRI) Wert der aus der Teilzeit-/Prioritäts Variable der Task-
       Tabelle kopiert wird (bei Änderung der Priörität)
               (Also wie viele 1/300 Sekunden vor Task-Aufruf gewartet wird)
               Es handelt sich um das Prioritäts-Byte
-------------------------------------------------------------------------------
- &7FFD......: (TNUME) Nummer des Tasks &01-&FF (255 mögliche Tasks).
       Die Tasks sind dynamisch! (Variablen-Name in Caruh: TNUME)
-------------------------------------------------------------------------------
- &7FFE-&7FFF: (TSPSE) Puffer für den Stack-Pointer SP dieses Tasks.
       Beim Umschalten der Tasks wird auch SP gesichert.
  -> Das zu ladende Programm (ohne Header) ist also maximal &3F00 Bytes lang.
  -> Das zu ladende Programm (mit  Header) ist also maximal &3F80 Bytes lang.
-------------------------------------------------------------------------------

Beim ersten Start eines Tasks wird sein Spackpointer (SP) auf &7FF8 gesetzt.
-> So wird das erste 16 Bit Stack-Element in die Adressen &7FF6 und &7FF7
   geschrieben.
   Dies ist üblicherweise die Rücksprung-Adresse bei der Task-Umschaltung.


Die Aktions- und Konfigurations-Bits
------------------------------------
Die Speicherstellen &7FF8 und &7FF9 eines jeden Tasks enthalten 16 Aktions- und
Konfigurations-Bits. Dazu kommen Reaktions-Bits, die vom Task gesetzt werden:

Speicheradresse &7FF8 (TCON8)
-----------------------------
Bits die mit einem '=' gekennzeichnet sind werden vom Task gesetzt und 
Bits die mit einem '-' gekennzeichnet sind werden von Caruh gesetzt.
Bits die mit einem '*' gekennzeichnet sind werden sowohl von Caruh als auch vom
Task selbst manipuliert. Siehe gesonderte Abschnitte.


* Bit 0: = 0 -> Task ist im Hintergrund (das ist der Normalzustand)
 = 1 -> Task ist im Vordergrund aktiv, d.h. übernimmt Bildschirm,
                Tastaturabfrage etc. Dieses Bit wird von Caruh eingeschalten.
Es wird/kann aber vom Task gelöscht werden.
(Foreground-Bit)

= Bit 1: = 0 -> Task kann kein Vordergrund-Task werden
 = 1 -> Task kann als Vordergrund-Task geschalten werden
Dieses Bit muss vom Task selbst gesetzt werden!
(Switch-Bit)

- Bit 2: -> reserviert

= Bit 3: = 0 -> Normale Funktion -> Task arbeitet normal weiter...
 = 1 -> Setzen dieses Bits bestimmt den Task zur Löschung!
Dieses Bit wird von dem Task selbst gesetzt!
(Kill-Bit)

= Bit 4: = 0 -> Der Task kann nicht gespeichert werden bzw. muss nicht extra
mittels dem 'Save-Bit 7' darauf vorbereiter werden.
 = 1 -> Dieser Task kann gesichert werden und sollte mittels des Bits 7
darauf vorbereitet werden.
Dieses Bit wird von dem Task selbst gesetzt!
(Storable-Bit)

* Bit 5: = 0 -> Der Task wurde bisher nicht gespeichert
 = 1 -> Der Task wurde gespeichert, nachdem das Save-Bit gesetzt wurde.
Dieses Bit 5 wird vom System Caruh gesetzt, nach dem Sichern.
(Das Hold-Bit 6 wurde zuvor vom Task selbst gesetzt)
Dieses Bit 5 muss von dem Task selbst zurück gesetzt werden,
wenn der Task mehrmals gesichert werden soll.
(Secured-Bit)

= Bit 6: = 0 -> Task ist weiterhin in Arbeit -> nicht abspeichern! Warten!
 = 1 -> Task kann jetzt vom System jederzeit gespeichert werden
Dieses Bit muss von dem Task selbst gesetzt werden!
(Hold-Bit)

- Bit 7: = 0 -> Normaler Ablauf. Der Task läuft...
 = 1 -> Das System verlangt vom Task sich auf sein Abspeichern 
vorzubereiten. Sein Neustart erfolgt dann wieder an &4000
(Save-Bit)

-------------------------------------------------------------------------------

Speicheradresse &7FF9 (TCON9)
-----------------------------
- Bit 0: -> reserviert für zukünftige Erweiterungen
- Bit 1: -> reserviert
- Bit 2: -> reserviert
- Bit 3: -> reserviert
- Bit 4: -> reserviert
- Bit 5: -> reserviert
- Bit 6: -> reserviert
- Bit 7: -> reserviert

-------------------------------------------------------------------------------



---------------------------------
- V. Programmierung eines Tasks -
---------------------------------

Um einen Task zu programmieren sind bestimmte Konventionen einzuhalten. Hierbei
gelten strikte Regeln, die in jedem Falle einzuhalten sind.

Jedoch stellt Caruh den Tasks auch hilfreiche Funktionen zur Seite.
Dazu siehe später unter VI.


Task Konventionen: Anforderungen an Tasks
-----------------------------------------
- Tasks müssen ihre Erweiterungs-RAM (E-RAM) Konfiguration beibehalten
  Jeder Task kann seinen eigenen RAM-Banking-Status aus den Adressen &7FFA und
  &7FFB lesen. Z.B. durch einen LD BC,(TER16). Solle trozdem illegales Banking
  durchgeführt werden, so sind hierfür die Interrupts abzuschalten.

- Tasks müssen den ROM/RAM Status beibehalten (Das obere ROM ist immer ein).
  Müssen z.B. Daten aus dem Bildschirmspeicher gelesen werden, so sind hierfür
  die Interrupts zeitweilig auszuschalten. Status des unteren ROMs beachten!

- Ein Task darf maximal 15,75 KB lang sein, denn oberhalb befinden sich Stack
  und Task-Variablen (siehe oben: 'Aufbau eines Tasks')

- Tasks benötigen keinen Header, das sie immer an Adresse &4000 geladen werden
  Tasks, die einen Header besitzen dürfen inclusive des Headers nicht größer
  als 16 KB sein.

- Tasks / Dateien größer als 16 KB werden von Caruh NICHT geladen / gestartet

- Ein Task darf nur auf den Bildschirm ausgeben, wenn in Caruh-Variable CCON2
  (an Adresse &BE02) die Bits 0 und 7 beide gelöscht sind.
  Ausnahme: Ein Task hat selbst das Bit 0 gesetzt und ist so im Vordergrund.

- Während des Aufruf von OS Funktionen die auf die Hardware zugreifen müssen
  die Interrupts AUS und anschließend wieder EINgeschaltern werden.
  Selbiges gilt auch für den direkten Zugriff auf I/O Adressen.

- Während des Aufruf von OS Funktionen die den Stackpointer SP nutzen müssen
  die Interrupts AUS und anschließend wieder EINgeschaltern werden. Beispiel:

DI ;Interrupts ausschalten
CALL CUR_CPY ;OS Funktion aufrufen, die SP verändert
EI ;Anschließend Interrupts einschalten

  Entsprechende OS Funktionen sind in ROM A:
  - CUR_CPY
  - B8DIN
  - B16DIN
  - und alle TERM_2(?) OS Funktionen (wegen der Steuerzeichen!)
    -> Siehe dazu folgendes...

- Die Zeichenausgabe nutzt die OS Variable C_POS um die Cursor-POSition zu
  definieren. Will ein Task nun Text ausgeben, so ist diese Variable zuerst zu
  sichern, dann für die aktuelle Textausgabe zu setzen (dann Text ausgeben) und
  anschließend ist C_POS wieder zu restaurieren. Während dieser Zeit müssen die
  Interrupts natürlich ausgeschalten werden. Hier ein Beispiel

C_POS EQU &B848
;
DI ;Interrupts ausschalten
;
LD HL,(C_POS) ; / Alte Cursor-POSition sichern
        LD (Puffer),HL ;/
;
LD HL,&BFFF + (Zeile * 80) + Spalten ; / Cursor-POSition setzen
LD (C_POS),HL ;/
;
LD   HL,Text ;Zeiger auf den auszugebenden Text
CALL TERM_2 ;OS Funktion aufrufen, die Zeichen ausgibt
;
LD HL,(Puffer) ; / Alte Cursor-POSition restaurieren
        LD (C_POS),HL ;/
;
EI ;Anschließend Interrupts einschalten

- Das OS ROM A muss immer eingeblendet bleiben!
  Wird das ROM geändert oder eine OS Funktion in den anderen OS ROMs B, C, D
  aufgerufen so müssen die Interrupts AUS und anschließend wieder
  EINgeschaltern werden. Siehe Beispiel:

DI ;Interrupts ausschalten
LD   IX,LESC ;OS Funktion liegt in ROM C -> Namen in IX laden
CALL ROM_A2C ;OS Funktion in ROM C aufrufen
EI ;Anschließend Interrupts einschalten

- Kooperative Tasks können zum nächsten Task weiterschalten, solange sie keine
  Aufgaben haben (z.B. Warten auf ein Ereignis etc.)
  Dies geschieht durch die Befehle:

DI ;Interrupts ausschalen
RST 7 ;Interrupt-Eingang aufrufen

  Dabei ist der 'DI' Befehl nötig, um einem zeitgleich auftretendem Interrupt
  entgegen zu wirken. Ohne 'DI' könnte es zu fatalen Folgen kommen.
  Nach der Abarbeitung des 'RST 7' werden die Interrupts wieder eingeschalten.
  Die Befehlsfolge 'DI:RST 7' entspricht somit einem System-Interrupt.

- Jeder Task muss einige Bit der Aktions- & Konfigurations-Bits selbst setzen.
  Diese befinden sich in den Speicherstellen &7FF8 und &7FF9 (siehe oben!).

- Vollschirm-fähige Tasks sind fähig, den gesamten Bildschirm nutzen können.
  Solche Tasks haben in ihrem E-RAM selbst das Bit 1 (Switch-Bit) der Adresse
  &7FF8 gesetzt.
  Alle anderen Tasks (z.B. ohne Bildschirmausgabe) sollen dieses Switch-Bit
  löschen.
  Jeder Vollschirm-Task sollte das Bit 0 (Foreground-Bit) an der Adresse &7FF8
  regelmäßig lesen. Denn wenn es gesetzt ist, dann steht dem Task der gesamte
  Bildschirm zur Verfügung.
  Sollte die Taste 'ESC' gedrückt werden, dann sollte sich der Task wieder in
  den Hintergrund schalten. Dies geschieht durch das Löschen des Bits 0 an der
  Adresse &7FF8 im Task E-RAM.

- Will sich ein Task selbst beenden und aus dem System entfernen so setzt er
  das Bit 3 (Kill-Bit). Das System wird den Task bei Zeiten löschen.
  --> Konkret heißt das der Task schreibt den Wert &08 an Adresse &7FF8 und
      kann denn den Task Manger aufrufen mittels 'DI:RST 7'.
      Anschließend solle ein Sprung auf den vorigen 'DI' Befehl folgen:

      LOOP DI ;Interrupts aus, das ist vor JEDEM RST 7 nötig!
RST 7 ;Caruh (bzw. nächsten Task) aufrufen...
JR  LOOP ;Warten auf Terminierung des Tasks durch Caruh

- Speicherbare Tasks sind Tasks die mit dem System zusammenarbeiten um eine
  Kopie von ihnen abzuspeichern. Um dem System anzuzeigen, dass es sich um
  einen Speicherbaren Task handelt setzt der Task selbstständig das Bit 4
  (Storable-Bit) an der Adresse &7FF8 in seinem eigenen E-RAM.
  Tasks die keinen Wert darauf legen gespeicher werden zu können sollten bei
  ihrem Aufruf einmal dieses Bit 4 löschen.
  Ein Speicherbarer Task sollte regelmäßig überprüfen, ob das System ihn jetzt
  speichern will. Dies ist der Fall wenn Caruh das Bit 0 (Save-Bit) setzt.
  Sobald also das Save-Bit an Adresse &7FF8 gesetzt wurde sollte der Task alle
  nötigen Schritte unternehmen um sich auf das Speichern vorzubereiten.
  Ist das Task bereit gesichert zu werden, dann muss der das Bit 6 (Hold-Bit)
  an Adresse &7FF8 setzen.
  Anschließend findet das Speichern des Tasks statt, darüm kümmert sich Caruh
  selbst.
  Sobald der Task erfolgreich von Caruh gesichert wurde, setzt Caruh das Bit 5
  (Secured-Bit) an E-RAM Adresse &7FF8.
  Dem Task ist nun bekannt, das er erfolgreich gespeichert wurden, das sollte
  nun das 'Secured-Bit' zurücksetzten und nach Adresse &4000 springen.
  Vom System Caruh gesicherte Tasks werden (wie jeder andere auch) an Adresse
  &4000 geladen und auch dort gestartet



-------------------------------
- VI. OS Funktionen für Tasks -
-------------------------------
Der Tasker Caruh stellt Tasks mehrere OS Funktionen zur Verfügung.
Weiterhin können gewisse Parameter in RAM Variablen abgefragt werden.
Bitte sehen Sie sich dazu das obige Kapitel über Variablen an.

GUI und OS Funktionen von Caruh
-------------------------------
Sowohl Bildschirm Modus als auch Bildschirm Format können durch den Anwender in
Caruh eingestellt werden. Dies geschieht unter Optionen. Diese Einstellungen
können aus folgenden RAM-Variablen gelesen werden:

- Speicheradresse &000E enthält den Bildschirm Modus (0-3) der vom Benutzer
  eingestellt wurde.
  Jeder Task kann den gewünschten Bildschirm-Modus aus diesem Byte lesen, falls
  der Task in den Vordergrund geschalten wird.

- Speicheradresse &000F enthält das Bildschirm Format (0 für 80x25, 1 für 68x30
  und 3 für 64x32 Format) das vom Benutzer eingestellt wurde.
  Jeder Task kann das gewünschte Bildschirm-Format aus diesem Byte lesen, falls
  der Task in den Vordergrund geschalten wird.

- MENÜ AUFRUFEN
  Das von CBM her bekannte Menu-System 'M_DISP2' kann durch den Befehl 'RST 1'
  aufgerufen werden. Parameterübergabe siehe Source Code. #######

- RAHMEN / FENSTER ZEICHNEN
  Der von CBM her bekannte Fenster-Zeichner 'DR_WIN' kann durch 'CALL &000B'
  aufgerufen werden.
  Parameterübergabe beim Aufruf:
  HL = Zeiger auf Start des Parameter- und Text-Blocks
       Aufbau eines derartigen Blocks:

 DB LOCATE_YY ;Oberste Zeile
 DB LOCATE_XX ;Erste Spalte links
;
 DB ZEILEN  ;Anzahl der Zeilen innerhalb des Rahmens/Fensters
 DB SPALTEN ;Anzahl der Spalten nebeneinander
;
 DB "Beispiel Text",&00 ;Text der ersten Zeile, mit Byte &00 abgeschlossen
;
;... Nun folgt der Text der weiteren Zeilen...
;    Jede Zeile muss mit Byte &00 beendet werden!
;    Der Text darf Kontrollkodes für Bildschirm MODE 2 enthalten
;    Zum Beispiel den LOCATE Kontrollkode für das 80x25 Format:
;    DB &1F,YY,XX,"Text Probe",&00

ACHTUNG: DR_WIN an &000B schaltet die Interrupts AUS.
-------- Der aufrufende Task muss die Interrupts selbst wieder einschalten.

- BELIEBIGES BILDSCHIRM-AREAL RESERVIEREN
  Der Aufruf der Funktion 'SAOMS' an Adresse &0003 erlaubt es dem Anwender ein
  Stück des Allgemeinen Multi-Bilschirms (normale Ansicht) zu reservieren.
  Aufgerufen muss diese OS Funktion dabei von einem Task werden.
  Parameterübergabe siehe 'CAR-SUB2.MAX':
  - Task-Nummer in TTNS3 = &BE03
    (Ein Task kann seine Nummer aus Adresse TNUME = &7FFD lesen)
  - YL = Anzahl aller Spalten der zu reservierenden Fläche (Breite, MODE 2)
  - YH = Anzahl aller Zeilen  der zu reservierenden Fläche (Höhe)
  Rücksprung der Funktion:
  Return from function:
  Zuerst sollte man das Z-Flag analysieren, dann in Register XL und XH schauen:
  - Z-Flag gesetzt -> OS Funktion wurde durch Druck auf ESC abgebrochen!
      Die Werte in IX sind ohne Bedeutung!
  - Z-Flag geleert -> Alles ist gut!
   -> Siehe Daten in den Registern XL und XH:
  - XL = Oberste Zeile / Y Position des Rahmens (0-24)
  - XH = Spalte links / X Position des Rahmens (0-79)

- DEFINIERTES BILDSCHIRM-AREAL BEANTRAGEN
  Ruft man die Funktion 'RFMSA' mittels des Befehls 'CALL &0013' an Adresse
  &0013 auf so kann sich ein Task damit ein Stück des gemeinsamen Bildschirms
  reservieren.
  Die benötigten Parameter sind dabei folgende:
  Rücksprung der Funktion:
  - XL = Oberste Zeile / Y Position des Rahmens (0-24)
  - XH = Spalte links / X Position des Rahmens (0-79)
  - YL = Anzahl aller Spalten des Bereichs (1-80)
  - YH = Anzahl aller Zeilen des Bereichs (1-25)
  - Adresse (TTNS3=&BE03) = Nummer des beantragenden Tasks
  Beim Rücksprung gibt das Zero-Flag über den Erfolg Auskunft:
  - Z-Flag auf '0' gelöscht -> Bereiche überlappen! Kann nicht genutzt werden!
  - Z-Flag auf '1' gesetzt --> Bereich ist frei und kann genutzt werden!



####### Beide folgenden Funktionen bitte noch einbauen, sowohl in Caruh-RSTs als auch in die Doku hier #######

- VON TASK BELEGTEN BILDSCHIRMBEREICH WIEDER FREIGEBEN
  Die Funktion 'COAST' wird genutzt, um einen Teil des Multi-Bildschirms wieder
  frei zu geben. Die Funktion kann jedoch auch genutzt werden, um einen Teil
  des Bildschirms für einen Task mit definierter Nummer zu reservieren.
  Parameter:
  XL = Oberste Zeile / Y Position des Rahmens (0-24)
  XH = Spalte links / X Position des Rahmens (0-79)
  YL = Spaltenanzahl des Rahmens (1-80)
  YH = Zeilenanzahl  des Rahmens (1-25)
  RAM Variable TTNS3 an Adresse &BE03 = Nummer des anfordernden Tasks

- TASK AUS VRAM TABELLE LÖSCHEN
  Die Funktion 'DTFMT' löscht alle belegten Bereiche eines Tasks in der VRAM /
  Multi-Bildschirm Tabelle. Dabei wird die zu löschende Task-Nummer im Register
  E übergeben.



- PRIORITÄT EINES TASKS ÄNDERRN
  Ruft man die Funktion 'SEPRI' mittels des Z80 Befehls 'RST 2' an Adresse
  &0010 auf so kann ein Task seine Priorität ändern (Neue Priorität in A).
  Jeder Task wird nach dem Laden mit der höchsten Priorität '1' gestartet.
  Oft muss ein Task allerdings nicht so oft aufgerufen werden (z.B Uhrzeit oder
  Temperatur anzeigen, Daten zum Drucker schicken etc.). In so einem Fall kann
  die Priorität herabgesetzt werden. Die neue Priorität wird im Akku übergeben,
  es sind Werte von 1 bis 255 zulässig. Kleinere Werte haben höhere Priorität.

- Hat ein Task aktuell nichts zu tun, so kann er aktiv zum nächsten Task weiter
  schalten. Die geschieht mittels der Befehle:

  DI ;Interrupts ausschalen (Befehl vor jedem 'RST 7' zwingend nötig!)
  RST 7 ;Task-Manager bzw. nächsten Task aufrufen

- Das Testen des Inhalts von Adresse &7FFB auf &7x erlaubt Integritätstest
  Da hier der E-RAM Status (High-Byte) gelesen wird muss das obere Nibble '7'
  sein. Ist es ungleich der '7', so wurde das Task E-RAM korrumpiert!



------------------
- VII. Beispiele -
------------------

Einen regulären Hingergrund-Task zum Vordergrund-Task schalten
--------------------------------------------------------------
Wenn ein beliebiger Hintergrund-Task zum einzigen Vordergrund-Task geschalgen
wird, dann wird die Kontrolle über den Bildschirm und die Tastatur an diesen
Task übergeben.

Dies geschieht entweder mittels der Task-Funktion 'Schalten <a>uf' oder durch
Anklicken eines der vier Task Namen in der Task-Zeile (ganz unten auf dem 
Bildschirm).

Dieser Vorgang kann vom Task selbst nicht angestoßen werden. Will der Anwender
jedoch einen Task in den Vordergrund schalten, so muss dieser Task auch darauf
reagieren können!

Ablauf-Protokoll: Ein Hintergrund-Task wird ein Vordergrund-Task
----------------------------------------------------------------
-> Caruh liest und wertet Byte an Speicherstelle &7FF8 (TCON8) des Tasks aus:
   - Ist das Bit 1 gelöscht, dann kann der Task kein Vordergrund-Task werden!
   - Ist das Bit 1 allerdings gesetzt, so darf der Task als Vordergrund-Task
     geschalten werden

-> Nun wird von Caruh das Bit 0 der Speicherstelle &7FF8 (TCON8) im Task E-RAM
   auf '1' gesetzt. 
   Dadurch wird dem Task mitgeteilt, dass er jetzt der Vordergrund-Task ist.
   -> Der Task muss nun die Kontrolle über den Bildschirm und die Tastatur
      übernehmen.

-> Um Caruh mitzuteilen, daß der Task die Bildschirm-Kontrolle übernommen hat,
   muß der Task das Bit 0 in der Speicherstelle &BE02 (CCON2) setzen.
   Sobald dieses Bit gesetzt ist wird Caruh die Bildschirm-Kontrolle abgeben.


=> An dieser Stelle wartet Caruh nun darauf, dass an Adresse &BE02 (CCON2) das
   Bit 0 auf '1' gesetzt wird!
   Sollte das nicht passieren, dann wird Caruh nach einiger Zeit (90* DI:RST 7)
   die Kontrolle wieder übernehmen, da der Task unfähig dazu erscheint.

=> Sobald das Bit 0 an Adresse &BE02 (CCON2) auf '1' gesetzt ist wartet Caruh
   darauf, dass es zurück gesetzt wird um die Kontrolle von neuem zu übernehmen
   => Siehe nächsten Absatz


-> Dem neu gebackenen Vordergrund-Task stehen jetzt Bildschirm und Tastatur zur
   Verfügung!
   -> Sinnvoll ist es den Bildschirm erst mal zu löschen, den Bildschirm-MODE
      einzustellen und eventuell das Bildschirm-Format.

-> Der Vordergrund-Task nimmt seinen Verlauf...
   Dabei ist es essenziell auf die Taste 'ESCape' zu testen und bei Druck von
   'ESCape' die Kontrolle an Caruh zurück zu geben.
   Wie geht das?
   Weiterlesen ... ;-)


Wie kann nun ein Vordergrund-Task die Kontrolle an Caruh zurückgeben?
---------------------------------------------------------------------
Wenn ein Task die Kontrolle über Bildschirm und Tastatur übernommen hat, dann
muss er auch testen ob die ESC Taste gedrückt wird. Ist dies der Fall, so ist
die Kontrolle wieder an Caruh zurück zu geben.
Das selbe gilt auch falls der Task die Kontrolle einfach so zurückgeben will.

-> Der Task löscht das Bit 0 an Adresse &7FF8 (TCON8) in seinem eigenen E-RAM.
   Dadurch wird der Task zum Hintergrund-Task (Normalzustand).
   Aber der Task muss das ebenfalls Caruh mitteilen! Dies geschieht so...

-> Der Vordergrund-Task löscht ebenfalls das Bit 0 an Adresse &BE02 (CCON2)!

-> Sobald das Bit 0 an Adresse &BE02 (CCON2) gelöscht ist übernimmt Caruh die
   Kontrolle von Bildschirm und Tastatur (wie zuvor gehabt). 
   Der ehemalige Vordergrund-Task ist nun wieder im Hintergrund tätig.

-> Caruh ist wieder im Vordergrund :-)


Beachte: Wenn der neu ernannte Fordergrund-Task nicht in der Lage ist das Bit 0 
-------- der Speicheradresse &BE02 (CCON2) auf 1 zu setzen, dann wird ihm nach
 192 Zyklen (192 mal 'DI:RST 7') der Vordergrund-Status entzogen!
 Das heißt nichts anderes als daß Caruh wieder die Kontrolle übernimmt.


Reservieren von Teilen des gemeinsamen Bildschirms
--------------------------------------------------
Es ist einem jeden Task möglich bestimmte Teile des Allgemeinen Bildschirms zu
beanspruchen. Dabei werden Position und Ausdehnung des beanspruchten Bereichs
übergeben. Dieses Ansinnen kann genehmigt oder abgelehnt werden, jeh nachdem ob
der beanspruchte Bereich zur Verfügung steht.
Auf diese Weise ist es möglich, dass jeder Task immer die selben Abschnitte für
sich reserviert, da er sich die Koordinaten der ersten Auswahl merken kann.
Entweder durch Sichern des Tasks, mittels nvRAM oder Konfigurations-Datei.


Der Bildschirm ist in 80 Spalten (0-79) und 25 Zeilen (0-24) eingeteilt.
Die Tabelle beginnt mit dem Zeichen ganz links in der obersten Zeile.

Beim System-Start von Caruh reserviert sich Caruh die ersten vier Zeilen (0-3)
und die unterste Zeile (24).


So kann sich ein Task einen Teil des Allgemeinen Bildschirms reservieren:

Einsprung (vom Task aus) an Adresse &0003
Parameter:
- Die Nummer des reservierenden Tasks ist in TTNS3 = Adresse &BE03 abgelegt
- Die Anzahl der MODE 2 Spalten wird in Register YL übergeben
- Die Anzahl der Zeilen wird in Register YH übergeben
  Der Befehl 'LD IY,&0309' würde also 3 Zeilen und 9 Spalten anzeigen

-> Nun wird die aktuelle Tabelle grafisch auf dem Bildschirm angezeigt
   Dabei kann jeder 'leere' Positon nur belegt werden
   Ein Kästchen - bestehend aus Linien - kann nun mittels der Cursor-Tasten
   bewegt werden und der Drück auf Copy reserviert den entsprechenden Bereich
   des Bildschirms und trägt die Position in die Multi-Bildschirm-Tabelle ein.

-> Wenn der Rahmen nicht an der aktueller Position gesetzt werden kann, so wird
   der BORDER in Orange (15) dargestellt. Entweder es wird ein gültiger Bereich
   gefunden oder durch 'ESC' abgebrochen.

-> Dem Task wird schließlich mitgeteilt, ob das Absetzen des Rahmens von
   Erfolg war.
   - Weiterhin werden X (0-79 in XL) und Y (4-23 in XH) Koordinaten übergeben,
     diese entsprechen der linken(XL), oberen(XH) Ecke im Bildschirm.
     Register IX enthält diese beiden Werte.
   - Zusätzlich wird die entsprechende Adresse der linken oberen Ecke innerhalb
     des Bildschirmes übergeben (in RAM-Variable C_POS).