Hallo zusammen,
hier kommt der offizielle Thread zum neuen Checksummer, der für BASIC-Weihnachten entstanden ist.
Der F64Summer unterstützt bis jetzt folgende Systeme: VC-20, C64, C16/116/+4 und C128. Dazu gehört ein Tool für den PC, das aus einem .PRG eine Liste der Prüfsummen zu den Zeilennummern generiert.
In Aktion (auf dem C64):
Verwendung:
Den Checksummer nach abtippen speichern, dann mit RUN starten und danach NEW eingeben, dann ist der Rechner bereit für die Eingabe eines BASIC Programms mit Prüfsummen. Nach dem Abtippen eines Programms mit Checksummer empfiehlt es sich, das abgetippte Programm zunächst auf Diskette zu speichern (die Verwendung der Datasette ist, außer in der C128-Version, tabu!) und den Rechner anschließend zu resetten bzw auszuschalten. In der Regel gibt es keine Probleme, wenn ein Programm sofort gestartet wird, allerdings verwenden manche Programme die gleichen Speicherbereiche wie der Checksummer, in diesem Fall wären Abstürze unvermeidbar.
Code/Download:
... wird zu gegebener Zeit hier im Thread veröffentlicht
Technische Beschreibung:
Der Checksummer hängt sich in zwei BASIC Routinen ein: IDLE (Vektor $302/303) und TOKENIZE (Vektor $304/305).
In IDLE wird einfach #$ff (255) in $15 (C128: $17) geschrieben, bevor die originale IDLE Routine angesprungen wird. Das ist nötig, um später erkennen zu können, ob TOKENIZE für einen Direktmodus-Befehl oder für eine Programmzeile aufgerufen wurde -- in letzterem Fall schreibt der BASIC Interpreter zunächst die Zeilennummer nach $14/$15 (C128: $16/$17) -- Da Zeilennummern mit einem Highbyte #$ff nicht erlaubt sind, kann man so einfach feststellen, ob eine BASIC Programmzeile eingegeben wurde oder nicht.
Die TOKENIZE Routine des Checksummers ruft zunächst die originale BASIC TOKENIZE Routine auf -- die arbeitet auf dem Eingabepuffer ab $200, danach liegt dort der tokenisierte BASIC Text der eingegebenen Zeile. Als nächstes wird geprüft, ob $200 nur ein 0-Byte enthält, dann war die Eingabe leer und es wird zurück zum BASIC Interpreter gesprungen. Dann kommt der oben erklärte Check von $15 bzw $17; wenn da immer noch #$ff (255) steht, wurde ein Befehl im Direktmodus eingegeben und es wird ebenfalls direkt zurückgesprungen.
Ansonsten wird ein 16bit Galois LFSR* mit der invertierten Zeilennummer initialisiert. Invertiert deshalb, weil Zeile 0 erlaubt ist, und das LFSR mit nur 0-bits nicht funktionieren würde. Eine Schleife liest dann Zeichen für Zeichen aus dem Puffer bei $200. Ab BASIC 3.5 (C16/116/+4 und C128) steht auch die Zeilennummer noch als Text im Eingabepuffer, in diesen Versionen werden die Textzeichen der Zeilennummer zunächst überlesen und dann erst zu der Hauptschleife übergegangen. Die Schleife merkt sich, ob gerade innerhalb eines Strings gelesen wird (pro Vorkommen von einem Anführungszeichen wird ein Flag umgelegt) und wenn sie sich gerade außerhalb eines Strings befindet, werden Leerzeichen überlesen, da sie die Logik des BASIC-Programms nicht ändern.
Pro gelesenem Zeichen iteriert dann eine innere Schleife über alle 8 bits. Pro Bit wird das LFSR einmal mit Feedback geschoben, allerdings wird das Ausgabebit vor dem Feedback zusätzlich mit dem jeweiligen Bit des gerade bearbeiteten Zeichens ver-XOR-t.
Wird ein 0-Byte gefunden ist die Zeile zuende, der aktuelle Status des LFSR wird ausgegeben (direkt in den Bildschirmspeicher), danach folgt der Rücksprung zu BASIC. Auf dem C128 muss für diese Ausgabe noch geprüft werden, welcher Bildschirm gerade aktiv ist, je nachdem erfolgt die Ausgabe in den Bildschirmspeicher das VIC-II oder den des VDC.
Diese Vorgehensweise führt dazu, dass der Checksummer bei vertauschten Zeichen eine andere Prüfsumme ausgibt. Leerzeichen innerhalb von Strings sind ebenfalls relevant für die Prüfsumme, die außerhalb eines Strings allerdings nicht. Da die Prüfsumme erst nach der Tokenisierung gebildet wird ist es auch egal, in welcher Schreibweise BASIC-Befehle eingegeben werden (z.B. PRINT oder einfach ?).
Der Code des Checksummers wird auf allen Systemen in den Datasettenpuffer geschrieben, außer auf dem C128, dort wird der RS-232 Puffer verwendet.
---
*) Erklärung auf Wikipedia: https://en.wikipedia.org/wiki/…ift_register#Galois_LFSRs