Eingabepuffer

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Gibt man beim C64 im Direktmodus Zeichen ein, so werden diese im Eingabepuffer abgelegt, dem Speicherbereich $0200-$0258 (512-600) in der erweiterten Zeropage. Nachdem die Eingabe mit RETURN  abgeschlossen wurde, wandelt der Tokenizer die eingegebenen Zeichen in das BASIC-Programmformat und speichert sie entweder als Programmzeile oder führt sie direkt aus. Im Falle des Abspeicherns werden auch noch die 4 Bytes der Speicherstellen $01FC bis $01FF (507 bis 511) für einen Chain-Link-Pointer und Zeilennummer verwendet (und stehen so auch dem Prozessorstapel nicht zur Verfügung), um eine vollständige Zeile für das Einfügen in den BASIC-Code vorbereiten zu können (und so einen "Zeilenpuffer" darstellt).

Der Eingabepuffer wird auch von den Befehlen INPUT und GET benutzt, wobei im Falle von INPUT auch die Speicherstelle $01FF mitbenutzt wird. Deshalb dürfen diese beiden Befehle nicht im Direktmodus, sondern nur im Programm-Modus verwendet werden.

Die Länge des Eingabepuffers ist mit 89 Zeichen größer als die logische Zeilenlänge 80 des C64. Sie entspricht der Länge einer logischen Zeile des VC20. Von dessen Betriebssystem wurde dies ungeändert in den C64 übernommen. Da bei einem Eingabebefehl wie INPUT der Puffer mit dem Endekennzeichen 0 abgeschlossen wird, kann er 88 Eingabezeichen aufnehmen.


Speicherstellen, die den Eingabepuffer benutzen:

Speicherstelle Bedeutung
hex dez
$0B 11 Eingabepufferzeiger, Länge der Token-Zeile
$F7-$F8 247-248 Zeiger auf Eingabepuffer RS-232
$F9-$FA 249-250 Zeiger auf Ausgabepuffer RS-232
$029B 667 RS232: Zeiger auf Ende des Eingabepuffers
$029C 668 RS-232: Zeiger auf Start des Eingabepuffers

Nutzung im BASIC-ROM:

* $A483 => $A560: Zeichen nach Eingabepuffer (Teil der Eingabewarteschleife)
  $A569 9D 00 02 STA $0200,X	;Zeichen nach Eingabepuffer, prüfen auf <89
  
* Umwandlung einer Zeile in Interpretercode
  $A579 JMP ($0304) => $A57C
  $A5B8 BD 00 02 LDA $0200,X	;Zeichen aus Puffer laden
  $A609 99 FD 01 STA $01FD,Y	;im Eingabepuffer speichern
  
* PRINT
  $AACC 9D 00 02 STA $0200,X	;Eingabepuffer mit 0 abschließen
  
* GET von RS-232
  $F086 AD 97 02 LDA $0297
  
* $A4ED: Programmzeile einfügen
  $A511 8D FE 01 STA $01FE		;BASIC-Eingabepuffer setzen
  $A522 B9 FC 01 LDA $01FC,Y		;Zeile aus Eingabepuffer (ins Programm kopieren)

Weitere Nutzung für RS-232 im Kernal.

Weblinks[Bearbeiten | Quelltext bearbeiten]