BASIC Befehle nicht als token speichern

On Wednesday the 03.07.2019 the forum will have a longer downtime due to the software conversion. Thanks for your understanding

  • Ich möchte erreichen, daß BASIC Befehle nicht als token gespeichert werden. Die einzige Möglichkeit bei einer PET einzugreifen ist die Routine bei $0070. Das Problem ist jedoch, daß die Routine bei $0070 auch für andere Sachen verwendet wird. Ich suche eine saubere Lösung.

  • Ich glaube es würde extrem helfen, wenn Du erklärst warum und wozu. Denn Möglichkeiten, einen Text ohne Tokenisierung in den Speicher zu bekommen gibt es zuhauf (z.B. ein einfaches Basicprogramm, das Tastendrücke in einer Schleife einliest).


    EDIT: gab es da nicht erst neulich einen Thread mit X/Y-Problem?

    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────

  • Wäre da nicht ein richtiger Assembler/Editor für den PET besser geeignet? Ich kenne mich mit dem PET nicht aus, aber da gibt es doch sicher etwas?

    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────

  • Mein Assembler ist ain Maschinenprogramm, das im BASIC Speicher nach Assemblerbefehlen sucht.

    Man könnte bei problematischen Mnemonics (das sind nur ORA, AND, EOR und ROR, richtig?) als erstes Zeichen der Zeile ein Doublequote setzen; in Strings wird ja nicht tokenisiert. Aber das bringt ja nichts, wenn der Assembler dann nicht damit klarkommt. Daher: Was sagt denn die Doku dieses Assemblers zu dem Thema?

  • Ich würde annehmen, dass solch ein Assembler auch mal genutzt und getestet wurde. Dem Programmierer von dem Ding sollte dann das Token-Problem aufgefallen und entsprechend behandelt worden sein.


    Ansonsten kann man am C64 Shift-Space an passender Stelle einfügen. Das wird nicht mit abgespeichert, aber es verhindert das Erkennen der Befehle ungemein.

  • Die Sache um die es mir eigentlich geht ist folgende:


    ich ersetze die Routine bei $0070 durch eine Routine, die in eine selbstgeschriebene Routine springt, welche nicht tokenisiert.


    muß ich da beachten, woher die Routine bei $0070 aufgerufen wurde, und gegebenenfalls in eine andere Routine als die selbstgeschriebene Routine ohne Tokenisieren verzweigen?


    Eine solche Unterscheidung verkompliziert die ganze Sache ungeheuerlich.

  • ich nehme an MOS moechte asm code im basic code schreiben und ablegen.
    soweit ich weis ist da der ansatz mit einer eigenen chrget routine die einzige moeglichkeit bei PET maschienen.
    da da einige vectoren garnicht vorhanden sind.


    ich denke man muesste die chrget routine umkopieren und evtl patchen und an der adresse wo chrget vorher war
    eine eigene kleine routine schreiben. etwa sowas hier


    Code
    1. jsr chrget
    2. cmp #$'@' ;pruefen ob ein selbst programierter befehl eingegeben wurde
    3. bne + ;nein dann weiter
    4. jmp at_handling ;ja dann eigene routine anspringen
    5. + rts


    soweit ich mich erinner machen das viele basic erweiterungen auf diese art und weise
    und meist wird da auch ein @ benutzt um eigene befehle zu implementieren, zumindest beim PET maschinen.
    fraglich waere natuerlich in wieweit das schnell genug ist und wieweit man das treiben kann.
    naechste frage waere naturlich auch wie man damit einen "ASM parser" basteln kann.


    salute


    edit: hier giebet ein bsp fuer eine sogenante basic-wegde. Basic-Wedge hoffe das hilft etwas weiter.
    edit2: normalerweise wuerde ich da jetzt ein @ASM befehl implementieren der ein flag setzt
    ist dieses gesetzt wird standartmaessig in den ASM-Parser gesprungen ansonsten in den normalen
    Basic-Parser. wird @ASM nochmals im code gefunden wird das flag geloescht.
    PseudoCode

    Code
    1. lda $flag
    2. beq + ;flag ist null, also weiter im basic
    3. jmp asm_parser
    4. + jsr chrget
    5. cmp #$'@'
    6. bne + ;kein user token also weiter im basic
    7. lda flag ;setze flag
    8. eor #$ff
    9. sta flag
    10. +jmp basic_parser
  • Ohne jetzt groß nachgeguckt zu haben, müsste doch aber eher das BASIC gepatcht werden, als die CHRGET-Routine, oder? Geht das beim PET so ohne Weiteres (keine Ahnung...)?


    Nachtrag:


    Evtl. Hypra-Ass am C64 nutzen? -> Profi-Ass-Source -> .txt : Petcat oder was?

  • ja Hexworx soweit ich das bsp auf der codebase verstehe wird wohl einiges in der sprungtabelle vom basic
    auf eigene routine/n verbogen und eigener code ausgefuehrt, chrget bleibt aber da wo es ist. ergo ist das erste drittel
    meines posts wohl nich ganz richtig. siehe link im edit oben ;)


    salute

  • Ich stand vor kurzem vor dem Problem, dass ich per Assembler-Routine Bytes in hex Darstellung aus dem BASIC Code in den Speicher laden wollte. Dabei bin ich dann darüber gestolpert, dass z.B. die Zeichenfolge DEF tokenisiert wurde. Einfache Lösung: alles in Quotes packen -- die Assembler-Routine war leicht angepasst. Falls DAS das Problem sein sollte kann ich die gerne mal zeigen, ist halt für den C64, ruft aber nur CHRGET auf und passt bei Bedarf die aktuelle BASIC Zeilennummer in der ZP an -- ich nehme mal an etwas entsprechendes gibt es auch auf dem Rechner, um den es hier geht.

  • Ich möchte erreichen, daß BASIC Befehle nicht als token gespeichert werden. Die einzige Möglichkeit bei einer PET einzugreifen ist die Routine bei $0070. Das Problem ist jedoch, daß die Routine bei $0070 auch für andere Sachen verwendet wird. Ich suche eine saubere Lösung.

    Die Routine $70 wird immer verwendet, wenn Befehle aus dem Speicher gelesen werden, ob beim Editieren, bei Programmausführung oder im Direktmodus.
    Wenn man $70 verbiegt, kann man über Flags abfragen, in welchem Modus man sich befindet und in der eigenen Routine entsprechend reagieren.


    Auf welchen PETs bzw. unter welchem Basic solle das denn laufen? Basic 1, 3 oder 8?


    Es gibt übrigens einen PET Assembler, der das so ähnlich macht, den MAE. Der verwendet auch Zeilennummern und enien Basic-ähnlichen Editor. Allerdings wurde beim MAE alles neu geschrieben und das Format entspricht nicht dem von Basic (z. B. werden die Zeilennummern im BCD-Format gespeichert und gegen daher nur bei 9999).

  • Es gibt da so ungefähr drei Ansätze:


    - jede Zeile vor dem Assemblieren mittels LIST-Routine de-tokenisieren. Da es Dein eigener Assembler ist, hast Du hoffenmtlich den Sourcecode dafür.
    - CHRGET manipulieren, daß bei jedem gelesenen Byte das Quote-Modus-Flag gesetzt wird. Da zwischen Anführungszeichen nicht tokenisiert wird, hast Duv den gewünschten Effekt. Problem: LOAD, SAVE und SYS funktionieren auch nicht mehr... dafür muß also eine andere Möglichkeit geschaffen werden.
    - das 'ganz gro0e Kino': die BASIC-Eingabeschleife wird komplett nachprogrammiert, ohne Tokenizer, und wandert als Editor mit ins Assemblerpaket.