home_cursor:
; Cursor an den Bildschirmanfang setzen
; ($d3 und $d6 auf null setzen)
E566 LDY #00
E568 STY D3 ; pos_of_cursor_in_line
E56A STY D6 ; row_of_cursor
; weiter bei $e56c
set_screen_pointers:
; Bildschirmzeiger anhand der aktuellen Zeile setzen
E56C LDX D6 ; row_of_cursor
E56E LDA D3 ; pos_of_cursor_in_line
...
; ab hier neue Kernal-Version
; ($e57c bis $e587 aus der alten Kernal-Version
; zum Setzen von $d1/$d2 ist entfallen und druch
; den Aufruf von $e9f0 ersetzt worden)
E57C JSR E9F0 ; set_start_of_line
E57F LDA #27
...
E58C STA D5 ; current_scr_line_length
E58E JMP EA24 ; sync_color_ptr
setup_screen_print:
; Ausgabe eines Zeichens vorbereiten und durchfuehren
; (Einsprung auch bei $e693, $e697 und $e6a8)
advance_cursor:
; Cursor ein Zeichen weiter bewegen
; (Wenn die logische Zeilenlaenge von 80 Zeichen noch
; nicht erreicht ist, erfolgt wohl eine Erweiterung
; auf eine Doppelzeile; $d3 wird erhoeht.)
retreat_cursor2:
; Wechsel in neue Zeile
; ($d6 wird verringert, da es bereits in
; check_line_increment erhoeht wurde, und
; in go_to_next_line wieder erhoeht wird.)
E6F7 DEC D6 ; row_of_cursor
E6F9 JSR E87C ; go_to_next_line
E6FC LDA #00
E6FE STA D3 ; pos_of_cursor_in_line
E700 RTS
back_into_prev_line:
; Cursor in die vorangegangene Zeile bewegen
; ($d3 und $d6 werden entsprechend gesetzt)
unshifted_chars:
; Gibt den im A-Register enthaltenen ASCII-Wert
; (Zeichens ohne Umschalttaste) aus. Das Y-Register
; muss den Wert aus $d3 enthalten.
check_line_decrement:
; Prueft ob der Zeilenzaehler verringert werden muss
; und verringert ihn ggf.
; (Es sieht so aus, als ob diese Funktion nur fuer
; Doppelzeilen relevant ist, da die aufrufenden
; Funktionen den Fall, dass $d3 gleich null ist,
; vorher abfangen und back_into_prev_line aufrufen.)
check_line_increment:
; Prueft, ob der Zeilenzaehler erhoeht werden muss
; und erhoeht ihn ggf.
; (Die Funktion macht nur in Zusammenhang mit Doppelzeilen
; Sinn, da die aufrufenden Funktionen $d6 spaeter wieder
; reduzieren und danach durch den Aufruf von go_to_next_line
; wieder erhoehen.)
; Tabelle mit Farbcode (color code table
E8DA: 90 05 1C 9F 9C 1E 1F 9E
E8E2: 81 95 96 97 98 99 9A 9B
scroll_screen:
; Scrollt den Bildschirm
E8EA LDA AC
E8EC PHA
E8ED LDA AD
E8EF PHA
E8F0 LDA AE
E8F2 PHA
E8F3 LDA AF
E8F5 PHA
E8F6 LDX #FF
E8F8 DEC D6 ; row_of_cursor
E8FA DEC C9 ; inp_cursor_log_row
E8FC DEC 02A5 ; screen_row_marker
E8FF INX
E900 JSR E9F0 ; set_start_of_line
E903 CPX #18
E905 BCS E913
E907 LDA ECF1,X
E90A STA AC
E90C LDA DA,X
E90E JSR E9C8 ; move_a_screen_line
E911 BMI E8FF
E913 JSR E9FF ; clear_screen_line
...
; CTRL-Taste abfragen und, falls gedrueckt, eine
; Verzoegerung durchlaufen (geschaetzt 1/30 sek.)
E938 LDA #7F
E93A STA DC00
E93D LDA DC01
E940 CMP #FB
E942 PHP
E943 LDA #7F
E945 STA DC00
E948 PLP
E949 BNE E956
E94B LDY #00
E94D NOP
E94E DEX
E94F BNE E94D
E951 DEY
E952 BNE E94D
E954 STY C6 ; chars_in_keyb_buf
; Zeiger wieder herstellen
E956 LDX D6 ; row_of_cursor
E958 PLA
E959 STA AF
E95B PLA
E95C STA AE
E95E PLA
E95F STA AD
E961 PLA
E962 STA AC
E964 RTS
move_a_screen_line:
; Kopiert eine Bildschirmzeile, auf die $ac/$ad
; zeigt, in die Bildschirmzeile, auf die $d1/$d2
; zeigt ($ac muss gesetzt sein und das high byte
; dazu im A-Register stehen)
E9C8 AND #03
E9CA ORA 0288 ; screen_mem_page
E9CD STA AD
E9CF JSR E9E0 ; synchronize_color_transfer
E9D2 LDY #27
E9D4 LDA (AC),Y
E9D6 STA (D1),Y
E9D8 LDA (AE),Y
E9DA STA (F3),Y
E9DC DEY
E9DD BPL E9D4
E9DF RTS
synchronize_color_transfer:
; Aktualisiert $f3/$f4 und setzt $ae/$af fuer
; das Farb-RAM ($ac muss gesetzt sein)
E9E0 JSR EA24 ; sync_color_ptr
E9E3 LDA AC
E9E5 STA AE
E9E7 LDA AD
E9E9 AND #03
E9EB ORA #D8
E9ED STA AF
E9EF RTS
set_start_of_line:
; Setzt $d1/$d2 auf die im X-Register angegebene
; Bildschirmzeile
E9F0 LDA ECF0,X ; scr_line_adr_low
E9F3 STA D1 ; ptr_to_screen_line
E9F5 LDA D9,X ; scr_line_link_table
E9F7 AND #03
E9F9 ORA 0288 ; screen_mem_page
E9FC STA D2
E9FE RTS
clear_screen_line:
; Die im X-Register angegebene Bildschirmzeile mit
; Lerrzeichen fuellen