Basic Code in eine PRG-File schreiben

Es gibt 36 Antworten in diesem Thema, welches 5.883 mal aufgerufen wurde. Der letzte Beitrag (13. Dezember 2021 um 14:04) ist von GoDot.

  • Es bringt doch nichts, jetzt einen C64-Tokenizer zu schreiben, der z.B. eine FOR-Schleife mit "S TO P" bilden kann. Dann lädst du das in einen C64, drückst dort noch mal die Eingabetaste, und schon hast du Müll.

    Genau das habe ich doch geschrieben. In meinem ersten Beitrag zum Tokenizer. Bevor Mike den Inhalt meines Beitrags verdreht hat.

    Na ja, das mag schon sein, aber deswegen ist es eben IMO sinnlos, hier von Fehlern oder selbst von "unerwarteten Ergebnissen" zu sprechen, und das war eigentlich der Kern meiner Aussage.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Meine Kernaussage war, dass ein selbstgeschriebener Tokenizer das Verhalten des Commdore-Tokenizers exakt nachbilden muss und dass das eben kniffelig ist.

    Dass man den Begriff "Fehler" nicht in einem Satz zusammen mit "Commdore" verwenden darf, ohne dass das gleich fundamentalistische Grundsatzdiskussionen auslöst, war mir nicht klar. Eigentlich hatte das gar keine Relevanz.

    Bitte melde dich an, um diesen Link zu sehen.

    2 Mal editiert, zuletzt von detlef (12. Dezember 2021 um 15:08)

  • goloMAK,

    dieser "Knoten" läßt sich allerdings auflösen, wenn man auf die (einfache) Editierbarkeit im C64 verzichtet und den Hauptaugenmerk auf die Ausführbarkeit legt.

    Dann hätten wir einen Präprozessor für BASIC-Quelltext und von dem könnte man durchaus auch mehr verlangen, eben z.B., daß längere Variablennamen erlaubt sind. Diese längeren Namen könnte der Präprozessor dann auf 1- oder 2-buchstabige Variablennamen abbilden. Leerzeichen im Quelltext wären außerhalb von Anführungszeichen egal, da man sie problemlos beim Tokenisieren wegstrippen kann (bei der Ausführung werden sie übersprungen) und damit bleibt der Speicherverbrauch auch unten.

    Das oben beschriebene geht übrigens mit Einschränkungen auch schon "ab Werk" - schreibst Du statt "...:FORT=STOP:..." die FOR-Anweisung wie folgt: "...:FORT=S{SHIFT-Z}TO{SHIFT-Z}P:..." erhältst Du nach dem LISTen tatsächlich wieder "...:FORT=STOP:...", was aber tatsächlich als "S TO P" tokenisiert ist! Die geshifteten Zeichen werden als ungültige Abkürzung erkannt und dann vom Tokenizer eliminiert. Heißt, im tokenisierten Programmtext tauchen die geshifteten Zeichen nicht auf.

    Welchen geshifteten Buchstaben man da hernimmt ist erstmal egal, Hauptsache er bildet mit dem vorherigen Teil nicht zufällig doch ein Schlüsselwort. "Z" kommt aber in keinem V2 Schlüsselwort vor und ist darum für diesen Zweck ideal geeignet.

    Diese Technik macht dann auch Variablennamen wie "IF", "TO", "ON" oder "OR" zugänglich, indem man das {SHIFT-Z} zwischen dem ersten und zweiten Buchstaben hinschreibt.

    Viele Grüße,

    Michael

    P.S. ich nehme mal an der OP sucht einfach nach bereits vorhandenem Quelltext für einen Tokenizer in C#. Nicht mehr und nicht weniger. Daß das Original im ROM nicht so ganz die einfache Nummer zum rausrippen und portieren ist, hat Endurion ja schon geschrieben.

  • Meine Kernaussage war, dass ein selbstgeschriebener Tokenizer das Verhalten des Commdore-Tokenizers exakt nachbilden muss und dass das eben kniffelig ist.

    Zweifellos richtig.

    Dass man den Begriff "Fehler" nicht in einem Satz zusammen mit "Commdore" verwenden darf, ohne dass das gleich fundamentalistische Grundsatzdiskussionen auslöst, war mir nicht klar.

    Darf man schon, es muss dann aber auch einen gewissen Sinn haben.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Dass man den Begriff "Fehler" nicht in einem Satz zusammen mit "Comm[o]dore" verwenden darf, ohne dass das gleich fundamentalistische Grundsatzdiskussionen auslöst, war mir nicht klar.

    Nochmal: das einzige, was ich gemacht habe war, genauer nachzufragen was Du mit "Fehlern" meinst.

    Wir haben offensichtlich unterschiedliche Vorstellungen, ob das beobachtete Verhalten ein Fehler ist oder nicht. Ein eindeutiger Fehler liegt meiner Ansicht nach vor, wenn die Spezifikation nicht eingehalten wird.

    Jetzt kann und darf man durchaus die Frage stellen ob die Spezifikation das hergibt, bzw. ob überhaupt was existiert, was sich Spezifikation nennen darf. Die Frage kann ich dir jetzt nicht beantworten, die Beschränkung auf maximal zwei signifikante Zeichen in Variablennamen ist aber ein starker Hinweis für mich, daß der Tokenizer genau so implementiert wurde wie vorgesehen.

    Davon ab gibt es richtige, *dicke* Fehler im BASIC-Interpreter zuhauf. Der mögliche Stacktrash bei gemischten String- und Zahlausdrücken, der mögliche Stringstapelüberlauf bei IF, die kaputte Multiplikation und RND()-Funktion seien nur mal so als Beispiel genannt. Das heißt, ich bin der letzte, der es nötig hat "zur Verteidigung" eine Grundsatzdiskussion vom Zaun zu brechen.

  • kiri008,

    ja und dann gilt immer noch das, was ich in meinem Beitrag Bitte melde dich an, um diesen Link zu sehen. geschrieben habe: vorbehaltlich dessen, daß zufällig noch wer anders mit einer für dich maßgefertigten Lösung in C# daherkommt, wird dir nichts anderes übrig bleiben als eine bereits bestehende Lösung (von Endurion z.B.) nach C# umzusetzen oder dich selbst mit der Originalroutine im ROM vertraut zu machen und dann selbst davon eine C#-Version zu implementieren.

    Viele Grüße,

    Michael

  • Wie im C64 Studio wollte ich ein Basic File als PRG speichern und im Emulator starten.
    Entwickle gerade ein Game Maker für den C64.

    Copy und Paste des Basic-Programms als ASCII-Code nach Vice ist keine Option?

    Oder soll der Game Maker selbst in C# geschrieben werden?

    Mir ist leider immer noch nicht klar, was du genau vor hast.

  • Um mal die Diskussion in hilfreichere Gegenden zu leiten:

    Eine PRG-Datei mit einem BASIC-Programm sieht beim C64 folgendermassen aus:

    1. Zwei Byte mit der Ladeadresse, beim C64 typischerweise 0x01 0x08 für Adresse 0x0801 in Little Endian
    2. so viele BASIC-Zeilen (siehe unten) wie nötig, aber nicht mehr als in den Speicher passen
    3. Zwei 0-Byte Byte als Endmarkierung (0x00 0x00

    Eine BASIC-Zeile sieht in einer PRG-Datei so aus:

    1. Zwei Byte als Zeiger auf die Startadresse der nächsten Zeile - der wird beim Laden vom Interpreter neu berechnet, man kann also problemlos 0x01 0x01 reinschreiben (0x00 0x00 würde als Endmarkierung interpretiert werden)
    2. Zwei Byte mit der Zeilennummer, z.B. 0x0a 0x00 für Zeile 10 oder 0xe8 0x03 für Zeile 1000 (wie üblich Little Endian)
    3. der Inhalt der BASIC-Zeile, in tokenisierter Form
    4. ein Nullbyte als Ende-Markierung (0x00)

    Zeilen werden tokenisiert, indem in ihrer Stringdarstellung jedes erkannte Schlüsselwort durch sein Bitte melde dich an, um diesen Link zu sehen. ersetzt wird, ausser bei Texten, die in Anführungszeichen eingeschlossen sind. Der Tokenisierer des C64 ist doof und hat abgesehen von den Anführungszeichen keine Ahnung von BASIC-Syntax. Kleine Falle: Manche Token von Funktionen enthalten auch die öffnende Klammer, andere nicht.

    Ein Simpel-Programm

    Code
    10 PRINT "A PRINT B"

    würde also zu einem PRG mit diesem Inhalt (alles in Hex)

    01 08 Ladeadresse

    01 01 Zeiger auf nächste Zeile

    0a 00 Zeilennummer

    99 PRINT-Token

    20 Leerzeichen dahinter

    22 41 20 50 52 49 4e 54 20 42 der String hinter PRINT, wobei der Tokenisierer hier das PRINT nicht zum Token wandelt weil es in Anführungszeichen steht

    00 Zeilenende-Markierung

    00 00 Programmende-Markierung

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Zeilen werden tokenisiert, indem in ihrer Stringdarstellung jedes erkannte Schlüsselwort durch sein Token ersetzt wird, ausser bei Texten, die in Anführungszeichen eingeschlossen sind. Der Tokenisierer des C64 ist doof und hat abgesehen von den Anführungszeichen keine Ahnung von BASIC-Syntax.

    Fast keine. Hinter REM und hinter DATA wird auch nicht tokenisiert.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • Hinter REM und hinter DATA wird auch nicht tokenisiert.

    Das hatte ich ursprünglich sogar drin, ist aber wieder rausgeflogen weil ich mir nicht ganz sicher war und keine Zeit+Lust hatte um im ROM-Listing zu wühlen =)

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • weil ich mir nicht ganz sicher war und keine Zeit+Lust hatte um im ROM-Listing zu wühlen

    Ich war mir auch nicht sicher, ich habs einfach in VICE eingegeben und dann mit dem Monitor nachgesehen, was daraus geworden ist. :D

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • weil ich mir nicht ganz sicher war und keine Zeit+Lust hatte um im ROM-Listing zu wühlen

    Ich war mir auch nicht sicher, ich habs einfach in VICE eingegeben und dann mit dem Monitor nachgesehen, was daraus geworden ist. :D

    Dazu fällt mir ein älteres Zitat aus einem anderen Forum ein:

    "Wieso vorher überprüfen? Ich schreib es einfach rein und wenn niemand widerspricht, dann stimmt es schon." :D

  • Ich finde, deine Erklärung sollte auch so ins C 64-Wiki.

    Steht da schon: Bitte melde dich an, um diesen Link zu sehen..

    Arndt

    GoDot C64 Image Processing
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.