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.
Hallo Besucher, der Thread wurde 4,6k mal aufgerufen und enthält 30 Antworten
letzter Beitrag von alexko am
-
-
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?
-
-
Ich möchte Assemblerprogramme im BASIC Speicher speichern
100 MARKE LDA #$08
-
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?
-
Wenn irgendwo im Speicher als ASCII Text „lda“ steht, dann versteht die CPU das nicht als Assemblerbefehl, ich denke da sind sich alle einig.
-
Mein Assembler ist ain Maschinenprogramm, das im BASIC Speicher nach Assemblerbefehlen sucht.
-
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?
-
Die Doku sagt nichts zu diesem 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.
-
Die Routine bei $0070 ist die CHRGET Routine.
-
welche ja kaum genutzt wird...
Die liegt ja nicht ohne Grund in der ZeropageAber was du eigentlich willst?
Einen ASM-Source im Basic-Ram ablegen und mit List anzeigen lassen? -
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
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 -
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 obensalute
-
Mein Assembler ist ain Maschinenprogramm, das im BASIC Speicher nach Assemblerbefehlen sucht.
Ist das Aigenfrickel (;-) ? Oder warum bringt der Assembler nichts taugliches bei?
-
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.