Hallo Besucher, der Thread wurde 6,4k mal aufgerufen und enthält 37 Antworten

letzter Beitrag von JeeK am

C64: Ausführung eigener BASIC-Befehl nach einem "then" = Syntax Error

  • Meine kleine BASIC Erweiterung mit 20 zusätzlichen Befehl ist eigentlich fertig.

    Alle Befehlserweiterungen funktionieren. Keine "Wedges", sondern richtige Befehle über eigenen Tokenizer/Detokenizer.

    Ich beschränke mich nun aufs Bugfixing. Dabei bin ich auf einen generellen Fehler gestoßen der zwar sofort erklärbar ist aber bisher ohne Lösung.

    Alle neuen Befehl werden nach dem "then" Statement nicht tokenisiert. Sie stehen also als Klartext im Speicher, was dann natürlich zum Syntax Error führt.


    Der Interpreter arbeitet nach diesem Schema:

    192173-pasted-from-clipboard-png


    Hier ist auch schnell der Grund zu erkennen. Da nach dem "IF" (Token 8B) wird die IF Routine ($A928) angesprungen und dann auf ein "then" reagiert. Mein Tokenizer springt auf auf den original CBM Tokenizer, sobald ein Tken >= $80 erkannt wird. Das nach dem "then" (Token A7) folgende eigene Token wird gar nicht erkannt und umgewandelt. Blöd!

    Irgendwelche Vorschläge wie ich das in den Griff kriegen könnte?(? Ich bin für jeden Hinweis dankbar :thumbsup:.

  • Vorweg: kenne mich mit dem Thema "Basic Erweiterungen selber schreiben" überhaupt nicht aus...

    Ich meine mich aber zu erinnern das in einem "englischen C64 Magazin" mal über mehrere Ausgaben hinweg eine BASIC Erweiterung programmiert wurde.
    Weiß aber leider nicht mehr welches Magazin das war ?!?!
    ___________________________________________

    Aber ich vermute mal das du den "IF" Befehl auch neu schreiben musst... damit du nach dem zu prüfenden Ausdruck ( z.B. A = 10 ) dann sofern der Ausdruck "wahr" ist nach dem THEN erneut prüfen musst ob ein "neues/ für den C64 unbekanntes Kommando von Deiner Basic Erweiterung kommt" oder z.B. eine Zeilennummer oder ein interner C64 Befehl.

    Das wird dir wahrscheinlich überhaupt nicht weiterhelfen...


    ciao Dirk

    P.S. Planst du vielleicht Deine Basic Erweiterung als eine Art "Howto" publik zu machen... mich würde das ganze auf jeden Fall interessieren ( auch wenn ich mich mit Assembler nur rudimentär auskenne )

  • Nee, der Tokenizer arbeitet, wenn eine BASIC Zeile eingegeben (gespeichert) wird. Und zwar völlig unabhängig davon, ob da ein THEN ist oder ein IF oder sonst was.

    Der Interpreter arbeitet die Tokens ab.


    Und das was zwischen IF und THEN steht, wird von der Formelevaluation ausgewertet, und das muss selbstverständlich auch bereits in Token umgewandelt worden sein.

  • Nee, der Tokenizer arbeitet, wenn eine BASIC Zeile eingegeben (gespeichert) wird. Und zwar völlig unabhängig davon, ob da ein THEN ist oder ein IF oder sonst was.

    Der Interpreter arbeitet die Tokens ab.


    Und das was zwischen IF und THEN steht, wird von der Formelevaluation ausgewertet, und das muss selbstverständlich auch bereits in Token umgewandelt worden sein.

    Ja, das ist im Ursprungsposting etwas unglücklich formuliert worden.


    Die THEN-Problematik ist ein bekanntes, was man daran sieht, das bei vielen Erweiterungen, die z.B. ein ELSE implementieren, ein explizites ":" davor brauchen.

    Wie schon erkannt wurde, liegt es daran, dass das, was im THEN-Zweig interpretiert wird eigentlich zum IF-Kommando gehört. Wenn die Bedingung nicht erfüllt wird, verhält sich der THEN-Zweig wie ein REM, sonst springt der Interpreter unmittelbar nach "$A7ED/42989: Perform BASIC Keyword", ohne dass ein Hook das noch abfangen könnte und da kennt er nur seine eigenen Tokens! Abhilfe schafft ein ":" nach dem THEN, wo dann wieder über "$A7E1/42977: Prepare to execute statement" gegangen wird und ein Hook etwaige neue Tokens abfangen kann.

    D.h. man müsste sein eigenes IF machen, was aber nicht so schlimm sein dürfte, da es ja recht kompakt ist und nur "fertige" Komponenten aufruft ...

  • Vielen Dank JeeK. Das mit dem ": " ist ein genialer Trick. Und Zack, schon funktioniert es :thumbsup:

    Ich habe mir die IF-Routine angeschaut und ist in der Tat recht kurz. Somit werde ich ein eigenes "IF"/"THEN"-Token anlegen und die Routine nachbauen und für mich nutzen. Daran habe ich im Vorfeld auch schon dran gedacht.

    Deine voran gegange Erklärung trifft da auch meine Erkenntnis. Da war ich halt nur ein wenig ratlos welche Lösung es da geben könnte.


    Merci an alle :thumbup:

  • P.S. Planst du vielleicht Deine Basic Erweiterung als eine Art "Howto" publik zu machen... mich würde das ganze auf jeden Fall interessieren ( auch wenn ich mich mit Assembler nur rudimentär auskenne )

    Wenn ich all meinen Mut aufgebracht habe mein Herzblut offen zu legen tue ich das. Ich habe ein wenig Angst davor das dann mein Code von den Spezialisten, Berufsbesserwisser und Lustigmacher zerlegt wird.
    Ich habe zwar mitte der 80er mal 6502 Programmiert, aber das ist lange her. Eine weitere BASIC Extension zu schreiben lag nicht daran das es an sowas mangelt, sondern es ist die beste Möglichkeit Assembler wieder aufzufrischen und die internen Routine des C64 gut kennenzulernen. Die Erweiterung umfasst fertig compilert ca. 11KB und hat etwas über 4000Zeilen.



  • Wenn ich all meinen Mut aufgebracht habe mein Herzblut offen zu legen tue ich das. Ich habe ein wenig Angst davor das dann mein Code von den Spezialisten, Berufsbesserwisser und Lustigmacher zerlegt wird.

    Die Berufsbesserwisser müssen erstmal selber so eine Basic-Erweiterung zustandebringen, bevor sie sich trauen dürfen, deinen Code zu zerlegen. :D

    Und wenn sowas tatsächlich passieren sollte (was ich nicht glaube), bekommst du sicherlich viel Unterstützung von Leuten wie mir, die sich über jeden freuen, der seine Projekte veröffentlicht. Es kochen alle nur mit Wasser. ;)

  • Ich schließe mich da an. Das sieht super aus. Ich würde das gerne mal ausprobieren.

    ___________________________________________________________________________
    Ultimate64, TAPunio, SD2IEC, ZX Spectrum 48k, 1581 Replik, C64 Laptop, C64 MK II, C116, SX64,
    MiSTer FPGA, TI99/4A mit PEB, Atari 800 XL, Anycubic I3 Mega, Mega65, C64 Modular, Uniprom64

  • Ich werde das PRG-File hier mal hochladen.
    Wo bzw. in welchem Unterforum wäre das Programm und der Sourcecode für eine Veröffentlichung am besten geeignet?

  • sehr schoen dg5kr hatte auch mal eine eigene basic erweiterung versucht zu schreiben, bei mir haperte es dann am formelauswerter.
    ich finde es klasse das du dich dazu entschieden hast keine wedge sondern eine "echte" erweiterung zu schreiben. 'weiter so' :)


    interessant finde ich, das if then problem, bis dahin bin ich garnich vorgestossen. gut zu wissen fals ich meine BE mal weiter schreibe.
    (den source hab ich ja zum glueck noch) *puh schwitz*


    salute :thumbsup:

  • Wenn ich all meinen Mut aufgebracht habe mein Herzblut offen zu legen tue ich das. Ich habe ein wenig Angst davor das dann mein Code von den Spezialisten, Berufsbesserwisser und Lustigmacher zerlegt wird.

    So siehst du also das Forum? Schade!

    Es gibt halt immer so ein paar Leute, die den Gesamteindruck maßgeblich verderben können. Aber ich glaub, wenn man nicht verzerrt aufs Forum blickt, dann dürfte man nicht zu diesem Schluss kommen. Ich glaube sehr wohl, dass es viele gäbe, die dg5kr beistehen würden, den Respekt und das Verständnis für das Geschaffene aufbringen und möchte ihn hiermit ermuntern den Mut zu fassen, es zu veröffentlichen.
    Zu einem gewissen Grad verstehe ich es auch, wenn man Bedenken hat. Diese Offenlegung des Sources, über den sich quasi jeder hermachen kann und wo dann ungefragt "Verbesserungsvorschläge" entstehen, können einem ganz schön die innere Zufriedenheit mit dem Projekt nehmen. Um diese innere Ruhe zu wahren, könnte ich mir so eine Vorgangsweise schon vorstellen. ;)

  • Ich denke, das Robert das nicht ohne Grund geschrieben hat. Auf jeden Fall vielen Dank für den Upload. Ich freue mich drauf, das Programm zu testen.

    ___________________________________________________________________________
    Ultimate64, TAPunio, SD2IEC, ZX Spectrum 48k, 1581 Replik, C64 Laptop, C64 MK II, C116, SX64,
    MiSTer FPGA, TI99/4A mit PEB, Atari 800 XL, Anycubic I3 Mega, Mega65, C64 Modular, Uniprom64

  • Guten Abend zusammen. Vielen Dank für den Mutmachendenbeistand. Ich werde den Source in diesem Thread mal hochladen. Ich bitte zu berücksichtigen, das Bugs vorhanden sind. Ein paar habe ich schon selber gefunden. Andere werden sich noch finden.

    Weiter ist das Programm auf reine Funktionalität ausgelegt, das heisst ich habe kaum auf Speicheroptimierungen geachtet. Mir gings hauptsächlich um den Fun, den Fingerübungen und was über den C64 zu lernen.

    Bin jetzt gerade an meinem iPad und nicht am PC. Die ZIP mit den Sourcecode (ACME als Crosscompiler) gibts morgen. Entwickelt habe ich das Ganze im C64Studio mit VICE Emulator. Auf einen echten C64 lief die Erweiterung bisher nicht. Bin mal auf mögliche Inkompatibilitäten gespannt.

  • Ich habe mir das exbasic mal angesehen. Also, ich finde es echt gut. Durch einige Funktionen muss ich noch mal durchfuchsen. Toll umgesetzt. Ich freue mich schon auf den Source.

    ___________________________________________________________________________
    Ultimate64, TAPunio, SD2IEC, ZX Spectrum 48k, 1581 Replik, C64 Laptop, C64 MK II, C116, SX64,
    MiSTer FPGA, TI99/4A mit PEB, Atari 800 XL, Anycubic I3 Mega, Mega65, C64 Modular, Uniprom64

  • Sowas wie GitHub wäre auch ein guter Platz für den Quellcode. Wenn er nur hier im Forum rumliegt, findet ihn bald niemand mehr. Und keine Angst vor negativem Feedback. Meistens kommt da genau gar nichts, weder hier noch auf GitHub und Co. Die Leute sind eher froh, dass jemand was gemacht hat, was ihnen evtl. hilft oder es ist ihnen egal, weil sie nur das Endprodukt interessiert. Ist ja nicht so, als würdest du den Schaltplan eines neues Netzteils posten. Dann stehst du natürlich voll im Feuer...;)

  • Es wäre toll, wenn man an dieser Stelle vielleicht Ideen sammelt, welche Befehle noch sinnvoll wären. Z.B. analog dem Basic 3.5 Befehle für die Umschaltung in den Grafikmodus oder Spritebefehle. Wow, da ist echt was möglich.


    Was mir besonders gut gefällt, ist der Monitorbefehl.

    ___________________________________________________________________________
    Ultimate64, TAPunio, SD2IEC, ZX Spectrum 48k, 1581 Replik, C64 Laptop, C64 MK II, C116, SX64,
    MiSTer FPGA, TI99/4A mit PEB, Atari 800 XL, Anycubic I3 Mega, Mega65, C64 Modular, Uniprom64

  • Morgen Coder....Hier ist der unfertige Source zum "Extended Basic V2+".
    Naja, solche Hobbyprojekte werde eigentlich nie fertig. Irgendeine "Optimierung" wird da immer eingebaut.


    Enwickelt mit dem C64Studio von Georg Rottensteiner.


    Bin im Büro und muß jetzt meine Brötchen verdienen :cry:

  • Es wäre toll, wenn man an dieser Stelle vielleicht Ideen sammelt, welche Befehle noch sinnvoll wären. Z.B. analog dem Basic 3.5 Befehle für die Umschaltung in den Grafikmodus oder Spritebefehle. Wow, da ist echt was möglich.


    Was mir besonders gut gefällt, ist der Monitorbefehl.

    Die Idee find ich gut :thumbsup:
    Aber: Es gibt beits ein BASIC 3.5 was auf einem C64 einen PLUS/4 macht. Sogar der Basicspeicher beginnt dann bei $1000 so das PLUS/4 Basicprogramm ladbar sind. Was ich also nicht machen möchte ist ein BASIC 3.5 nachmachen. Das gibts bereits für den C64. Freue mich dennoch über jeden Vorschlag.

    P.S.: Die Datei ist als ROM-Modul in VICE ladbar.