reset_char_color:
; Farbe fuer das aktuelle Zeichen auf den
; aktuellen Wert setzen

 E4DA:  LDA 0286 ; current_color_code
 E4DD:  STA (F3),Y
 E4DF:  RTS

put_row_col:
get_row_col:
; Spalte/Zeile holen bzw. setzen

 E50A  BCS E513
 E50C  STX D6 ; row_of_cursor
 E50E  STY D3 ; pos_of_cursor_in_line
 E510  JSR E56C ; set_screen_pointers
 E513  LDX D6 ; row_of_cursor
 E515  LDY D3 ; pos_of_cursor_in_line
 E517  RTS

clear_screen:
; Bildschirm loeschen
; (und dabei die Zeiger-Tabelle zuruecksetzen)

 E544  LDA 0288 ; screen_mem_page
 E547  ORA #80
 E549  TAY
 E54A  LDA #00
 E54C  TAX
 E54D  STY D9,X ; scr_line_link_table
 E54F  CLC
 E550  ADC #28
 E552  BCC E555
 E554  INY
 E555  INX
 E556  CPX #1A
 E558  BNE E54D
 E55A  LDA #FF
 E55C  STA D9,X ; scr_line_link_table
 E55E  LDX #18
 E560  JSR E9FF ; clear_screen_line
 E563  DEX
 E564  BPL E560
 ; weiter bei $e566

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)

 E691  ORA #40
 E693  LDX C7 ; scr_reverse_flag
 E695  BEQ E699
 E697  ORA #80
 E699  LDX D8 ; num_of_outstanding_ins
 E69B  BEQ E69F
 E69D  DEC D8 ; num_of_outstanding_ins
 E69F  LDX 0286 ; current_color_code
 E6A2  JSR EA13 ; print_to_scr
 E6A5  JSR E6B6 ; advance_cursor

 ; Ruecksprung aus den Ausgaberoutinen,
 ; u.a. zur Wiederherstellung der Register

 E6A8  PLA
 E6A9  TAY
 E6AA  LDA D8 ; num_of_outstanding_ins
 E6AC  BEQ E6B0
 E6AE  LSR D4 ; direct_cursor
 E6B0  PLA
 E6B1  TAX
 E6B2  PLA
 E6B3  CLC
 E6B4  CLI
 E6B5  RTS


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.)

 E6B6  JSR E8B3 ; check_line_increment
 E6B9  INC D3 ; pos_of_cursor_in_line
 E6BB  LDA D5 ; current_scr_line_length
 E6BD  CMP D3 ; pos_of_cursor_in_line
 E6BF  BCS E700 ; (rts)
 E6C1  CMP #4F ; (Zeile kann nicht mehr erweitert werden)
 E6C3  BEQ E6F7
 ...

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)

 E701  LDX D6 ; row_of_cursor
 E703  BNE E70B
 E705  STX D3 ; pos_of_cursor_in_line
 E707  PLA    ; (Ruecksprungadresse verwerfen)
 E708  PLA
 E709  BNE E6A8 ; (setup_screen_print)
 E70B  DEX
 E70C  STX D6 ; row_of_cursor
 E70E  JSR E56C ; set_screen_pointers
 E711  LDY D5 ; current_scr_line_length
 E713  STY D3 ; pos_of_cursor_in_line
 E715  RTS


output_to_screen:
; Gibt den im A-Register enthaltenen ASCII-Wert aus

 E716  PHA
 E717  STA D7 ; last_inkey_or_buf
 E719  TXA
 E71A  PHA
 E71B  TYA
 E71C  PHA
 E71D  LDA #00
 E71F  STA D0
 E721  LDY D3 ; pos_of_cursor_in_line
 E723  LDA D7 ; last_inkey_or_buf
 E725  BPL E72A ; (unshifted_chars)
 E727  JMP E7D4 ; shifted_chars


unshifted_chars:
; Gibt den im A-Register enthaltenen ASCII-Wert
; (Zeichens ohne Umschalttaste) aus. Das Y-Register
; muss den Wert aus $d3 enthalten.

 ; Return (ASCII 13)
 E72A  CMP #0D
 E72C  BNE E731
 E72E  JMP E891 ; perform_return

 ; normale Zeichen (ASCII 32-127)
 E731  CMP #20
 E733  BCC E745
 E735  CMP #60
 E737  BCC E73D
 E739  AND #DF
 E73B  BNE E73F
 E73D  AND #3F
 E73F  JSR E684 ; quote_test
 E742  JMP E693 ; (setup_screen_print)

 E745  LDX D8 ; num_of_outstanding_ins
 E747  BEQ E74C
 E749  JMP E697 ; (setup_screen_print)

 ; Delete (ASCII 20)
 E74C  CMP #14
 E74E  BNE E77E
 E750  TYA
 E751  BNE E759
 E753  JSR E701 ; back_into_prev_line
 E756  JMP E773
 E759  JSR E8A1 ; check_line_decrement
 E75C  DEY
 E75D  STY D3 ; pos_of_cursor_in_line
 E75F  JSR EA24 ; sync_color_ptr
 E762  INY
 E763  LDA (D1),Y
 E765  DEY
 E766  STA (D1),Y
 E768  INY
 E769  LDA (F3),Y
 E76B  DEY
 E76C  STA (F3),Y
 E76E  INY
 E76F  CPY D5 ; current_scr_line_length
 E771  BNE E762
 E773  LDA #20
 E775  STA (D1),Y
 E777  LDA 0286 ; current_color_code
 E77A  STA (F3),Y
 E77C  BPL E7CB ; (jmp $e6a8)

 E77E  LDX D4 ; direct_cursor
 E780  BEQ E785
 E782  JMP E697 ; (setup_screen_print)

 ; Reverse on (ASCII 18)
 E785  CMP #12
 E787  BNE E78B
 E789  STA C7 ; scr_reverse_flag

 ; Home (ASCII 19)
 E78B  CMP #13
 E78D  BNE E792
 E78F  JSR E566 ; home_cursor

 ; Cursor right (ASCII 29)
 ; (Praktisch identisch mit advance_cursor und
 ; retreat_cursor2, wenn man die Behandlung von
 ; Doppelzeilen ausser acht laesst.)
 E792  CMP #1D
 E794  BNE E7AD
 E796  INY
 E797  JSR E8B3 ; check_line_increment
 E79A  STY D3 ; pos_of_cursor_in_line
 E79C  DEY
 E79D  CPY D5 ; current_scr_line_length
 E79F  BCC E7AA
 E7A1  DEC D6 ; row_of_cursor
 E7A3  JSR E87C ; go_to_next_line
 E7A6  LDY #00
 E7A8  STY D3 ; pos_of_cursor_in_line
 E7AA  JMP E6A8

 ;Cursor down (ASCII 17)
 E7AD  CMP #11
 E7AF  BNE E7CE
 ...
 E7C8  JSR E87C ; go_to_next_line
 E7CB  JMP E6A8 ; (setup screen print)

 ; set color
 E7CE  JSR E8CB ; set_color_code

 ; switch font
 ; ASCII 14: Zeichensatz 2
 ; ASCII  8: Umschaltung mit Shift/Commodore blockieren
 ; ASCII  9: Umschaltung mit Shift/Commodore freigeben
 E7D1  JMP EC44 ; graphics_text_control


shifted_chars:
; Gibt den im A-Register enthaltenen ASCII-Wert
; (Zeichens mit Umschalttaste) aus. Das Y-Register
; muss den Wert aus $d3 enthalten.

 E7D4  AND #7F

 E7D6  CMP #7F
 E7D8  BNE E7DC
 E7DA  LDA #5E

 ; normale Zeichen (ASCII 160-191; ab 192 keine weiteren
 ; Zeichen, sondern Ueberschneidung mit bestehenden Zeichen))
 E7DC  CMP #20
 E7DE  BCC E7E3
 E7E0  JMP E691 ; setup_screen_print

 ; Shift-Return (ASCII 141)
 E7E3  CMP #0D
 E7E5  BNE E7EA
 E7E7  JMP E891 ; perform_return

 E7EA  LDX D4 ; direct_cursor
 E7EC  BNE E82D

 ; Insert (ASCII 148)
 E7EE  CMP #14
 E7F0  BNE E829
 ...
 E805  LDY D5 ; current_scr_line_length
 E807  JSR EA24 ; sync_color_ptr
 E80A  DEY
 E80B  LDA (D1),Y
 E80D  INY
 E80E  STA (D1),Y
 E810  DEY
 E811  LDA (F3),Y
 E813  INY
 E814  STA (F3),Y
 E816  DEY
 E817  CPY D3 ; pos_of_cursor_in_line
 E819  BNE E80A
 E81B  LDA #20
 E81D  STA (D1),Y
 E81F  LDA 0286 ; current_color_code
 E822  STA (F3),Y
 E824  INC D8 ; num_of_outstanding_ins
 E826  JMP E6A8

 E829  LDX D8 ; num_of_outstanding_ins
 E82B  BEQ E832
 E82D  ORA #40
 E82F  JMP E697

 ; Cursor up (ASCII 145)
 E832  CMP #11
 E834  BNE E84C
 E836  LDX D6 ; row_of_cursor
 E838  BEQ E871 ; (jmp $e6a8)
 E83A  DEC D6 ; row_of_cursor
 ...
 E847  JSR E56C ; set_screen_pointers
 E84A  BNE E871 ; (jmp $e6a8)

 ; Reverse off (ASCII 146)
 E84C  CMP #12
 E84E  BNE E854
 E850  LDA #00
 E852  STA C7 ; scr_reverse_flag

 ; Cursor left (ASCII 157)
 E854  CMP #1D
 E856  BNE E86A
 E858  TYA
 E859  BEQ E864
 E85B  JSR E8A1 ; check_line_decrement
 E85E  DEY
 E85F  STY D3 ; pos_of_cursor_in_line
 E861  JMP E6A8
 E864  JSR E701 ; back_into_prev_line
 E867  JMP E6A8

 ; Clear (ASCII 147)
 E86A  CMP #13
 E86C  BNE E874
 E86E  JSR E544 ; clear_screen
 E871  JMP E6A8

 ; set color
 E874  ORA #80
 E876  JSR E8CB ; set_color_code

 ; switch font
 ; ASCII 142: Zeichensatz 1
 E879  JMP EC4F ; set_graphics_text_mode


go_to_next_line:
; Cursor um eine Zeile nach unten bewegen
; (bei Bedarf wird der Bildschirm gescrollt)

 E87C  LSR C9 ; inp_cursor_log_row
 E87E  LDX D6 ; row_of_cursor
 E880  INX
 E881  CPX #19
 E883  BNE E888
 E885  JSR E8EA ; scroll_screen
 E888  LDA D9,X ; scr_line_link_table
 E88A  BPL E880
 E88C  STX D6 ; row_of_cursor
 E88E  JMP E56C ; set_screen_pointers


perform_return:
; Zeilenumbruch durchfuehren

 E891  LDX #00
 E893  STX D8 ; num_of_outstanding_ins
 E895  STX C7 ; scr_reverse_flag
 E897  STX D4 ; direct_cursor
 E899  STX D3 ; pos_of_cursor_in_line
 E89B  JSR E87C ; go_to_next_line
 E89E  JMP E6A8 ; (setup_screen_print)


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.)

 E8A1  LDX #02 ; (fuer Doppelzeilen )
 E8A3  LDA #00
 E8A5  CMP D3 ; pos_of_cursor_in_line
 E8A7  BEQ E8B0
 ...
 E8AF  RTS
 E8B0  DEC D6 ; row_of_cursor
 E8B2  RTS


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.)

 E8B3  LDX #02 ; (fuer Doppelzeilen )
 E8B5  LDA #27
 E8B7  CMP D3 ; pos_of_cursor_in_line
 E8B9  BEQ E8C2
 ...
 E8C1  RTS
 E8C2  LDX D6 ; row_of_cursor
 E8C4  CPX #19
 E8C6  BEQ E8CA
 E8C8  INC D6 ; row_of_cursor
 E8CA  RTS


set_color_code:
; Farbcode aus im A-Register enthaltenen ASCII-Wert
; ermitteln

 E8CB  LDX #0F
 E8CD  CMP E8DA,X
 E8D0  BEQ E8D6
 E8D2  DEX
 E8D3  BPL E8CD
 E8D5  RTS
 E8D6  STX 0286 ; current_color_code
 E8D9  RTS

 ; 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

 E9FF  LDY #27
 EA01  JSR E9F0 ; set_start_of_line
 EA04  JSR EA24 ; sync_color_ptr
 EA07  JSR E4DA ; reset_char_color
 EA0A  LDA #20
 EA0C  STA (D1),Y
 EA0E  DEY
 EA0F  BPL EA07
 EA11  RTS


print_to_scr:
; Gibt den im A-Register enthaltenen Bildschirmcode
; mit der im X-Register gesetzten Farbe aus

 EA13  TAY
 EA14  LDA #02
 EA16  STA CD ; cursor_timing_countdown
 EA18  JSR EA24 ; sync_color_ptr
 EA1B  TYA
 EA1C  LDY D3 ; pos_of_cursor_in_line
 EA1E  STA (D1),Y
 EA20  TXA
 EA21  STA (F3),Y
 EA23  RTS


sync_color_ptr:
; Setzt den Zeiger im Farb-RAM passend zu $d1/$d2

 EA24  LDA D1 ; ptr_to_screen_line
 EA26  STA F3 ; ptr_to_color_ram
 EA28  LDA D2
 EA2A  AND #03
 EA2C  ORA #D8
 EA2E  STA F4
 EA30  RTS