Dokumentation
-------------

Die zentrale Ausgaberoutine des C64 wird mit jsr $ffd2 aufgerufen.
Durch die Aenderung der Adresse in den Speicherstellen $0326/$0327
kann die Augabe auf eine eigene Routine umgeleitet werden, wovon
in screen.a Gebrauch gemacht wird.

Um weitgehend kompatibel zum Betriebssystem des C64 zu sein - was
insbesondere fuer die Verwendung innerhalb von BASIC oder G-Pascal
wichtig ist - wird in screen.a (weitgehend) der gleiche Aufbau und
die gleichen Funktionsnamen verwendet, wie im Original des C64.

Eine wesentliche Einschraenkung/Abweichung ist die, dass in
screen.a keine logischen Doppelzeilen unterstuetzt werden. Der
C64 fasst zwei physische Bildschirmzeilen zu je 40 Zeichen zu
einer logischen Zeile mit 80 Zeichen zusammen. Dies macht aber
mehr oder weniger komplizierte Ablaeufe im Betriebssystem
erforderlich. Hierauf verzichtet screen.a komplett und
unterstuetzt nur Zeilen mit 40 Zeichen.

Dafuer kann screen.a jedoch auch rueckwaerts scrollen, wenn der
Cursor am oberen Bildschirmrand nach oben bewegt wird.

Zum tieferen Verstaendnis der Bildschirmausgabe gibt es hier
ein kommentiertes ROM-Listing und eine Simulation der Original-
Bildschirmausgabe in G-Pascal. Hierbei wurden jedoch alle Teile,
die die Handhabung logischer Doppelzeilen betreffen, ausgespart.


Ablauf einer Bildschirmausgabe
------------------------------

Die Ausgaberoutine prueft zuerst, auf welches Geraet die Ausgabe
erfolgen soll, und wenn dies der Bildschirm ist, wird die Haupt-
routine fuer die Beilschirmausgabe output_to_screen aufgerufen.
Dort wird danach unterschieden, ob die Umschalttaste gedrueckt
(ASCII-Code >= 128) oder nicht gedrueckt (ASCII-Code < 128)
wurde und entsprechend in die Routinen shifted_chars bzw.
unshifted_chars verzweigt. Diese beiden Routinen haben einen
simultanen Aufbau in der Verarbeitung des ASCII-Codes:

unshifted_chars                shifted_chars
ASCII                          ASCII
---------------------------------------------------------------
13    Zeilenumbruch            128+13=141 Zeilenumbruch
17    Cursor nach unten        128+17=145 Cursor nach oben
18    Inversdarstellung an     128+18=146 Inversdarstellung aus
19    Cursor oben links        128+19=147 Bildschirm loeschen
20    Zeichen loeschen         128+20=148 Leerzeichen einfuegen
29    Cursor nach rechts       128+29=157 Cursor nach links
>= 32 Zeichen ausgeben         >= 160     Zeichen ausgeben

In screen.a wird bei Shift-Return (ASCII 141) ein Zeilenumbruch
nach oben mit ggf. rueckwaertigem Scrolling durchgefuehrt.


ASCII | Verwendete Kernalroutinen
------+--------------------------------------------------------
  13 | perform_return
 141 |     go_to_next_line
     |         set_screen_pointers (siehe ASCII 19)
     |         scroll_screen
     |             set_start_of_line
     |             move_a_screen_line
     |                 sync_color_transfer
     |             clear_screen_line (siehe ASCII 147)
------+--------------------------------------------------------
  17 | go_to_next_line (siehe ASCII 13/141)
------+--------------------------------------------------------
  19 | home_cursor
     | set_screen_pointers
     |     set_start_of_line
     |     sync_color_ptr
------+--------------------------------------------------------
  20 | check_line_decrement
     | back_into_prev_line
     |   set_screen_pointers (siehe ASCII 19)
------+--------------------------------------------------------
  29 | check_line_increment
     | go_to_next_line (siehe ASCII 13/141)
------+--------------------------------------------------------
 147 | clear_screen
     |     clear_screen_line
     |         set_start_of_line
     |         sync_color_ptr
     |         reset_char_color
     | (weiter mit home_cursor, siehe ASCII 19)
------+--------------------------------------------------------
 148 | sync_color_ptr


Kernalroutine       |  ROM  | Beschreibung
--------------------+-------+------------------------------------------
reset_char_color    | $e4da | Setzt die Farbe fuer das aktuelle Zeichen
                   |       | auf den aktuellen Wert
--------------------+-------+------------------------------------------
get_row_col         | $e50a | Liest bzw. setzt die Zeile und Spalte
put_row_col         |       | (Zeile im X-Reg, Spalte im Y-Reg)
--------------------+-------+------------------------------------------
clear_screen        | $e544 | Loescht das Fenster
home_cursor         | $e566 | Setzt den Cursor nach oben/links
set_screen_pointers | $e56c | Aktualisiert die Zeiger fuer den Bild-
                   |       | schirmspeicher und Farb-RAM auf die
                   |       | aktuelle Zeile
--------------------+-------+------------------------------------------
setup_screen_print  | $e693 | Bildschirmausgabe durchfuehren
--------------------+-------+------------------------------------------
advance_cursor      | $e6b6 | Cursor ein Zeichen weiter bewegen
retreat_cursor      | $e6f7 | Cursor zuruecksetzen (wird nicht direkt,
                   |       | sondern ueber advance_cursor aufgerufen)
--------------------+-------+------------------------------------------
back_into_prev_line | $e701 | Cursor in die vorangegangene Zeile
                   |       | bewegen
--------------------+-------+------------------------------------------
output_to_screen    | $e716 | Bildschirmausgabe
unshifted_chars     | $e72a | Zeichen ohne Umschalttaste
shifted_chars       | $e7d4 | Zeichen mit Umschalttaste
--------------------+-------+------------------------------------------
go_to_next_line     | $e87c | Cursor eine Zeile weiter bewegen
perform_return      | $e891 | Zeilenumbruch durchfuehren
--------------------+-------+------------------------------------------
check_line_decrement| $e8a1 | Prueft ob der Zeilenzaehler verringert
                   |       | werden muss und verringert ihn ggf.
check_line_increment| $e8b3 | Prueft, ob der Zeilenzaehler erhoeht
                   |       | werden muss und erhoeht ihn ggf.
--------------------+-------+------------------------------------------
set_color_code      | $e8cb | Farbwert auswaehlen
--------------------+-------+------------------------------------------
scroll_screen       | $e8ea | Fensterinhalt nach oben verschieben
move_a_screen_line  | $e9c8 | Kopiert eine Fensterzeile
--------------------+-------+------------------------------------------
sync_color_transfer | $e9e0 | Aktualisiert temporaeren Zeiger fuer das
                   |       | Farb-RAM
--------------------+-------+------------------------------------------
set_start_of_line   | $e9f0 | Setzt den Zeiger fuer den Bildschirm-
                   |       | auf auf die aktuelle Zeile
--------------------+-------+------------------------------------------
clear_screen_line   | $e9ff | Loescht die aktuelle Bildschirmzeile
--------------------+-------+------------------------------------------
print_to_scr        | $ea13 | Gibt den den Bildschirmcode (A-Reg) mit
                   |       | der Farbe (X-Reg) aus
--------------------+-------+------------------------------------------
sync_color_ptr      | $ea24 | Setzt den Zeiger fuer das Farb-RAM
--------------------+-------+------------------------------------------
output_one_chr      | $f1ca | Zeichen auf dem Ausgabegeraet ausgeben
                   |       | (Aufruf durch CHROUT/$ffd2)