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