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)