Hallo Leute
hat jemand eine Ahnung, we es prinzipiell funktioniert, zusätzliche Basic Befehle zu definieren?
Ein Link zu Infos oder Buch wäre toll.
Ich denk es ist etwas kompliziert, um es mit 3 Sätzen zu beschreiben....
Micha.
Du bist in Begriff, Forum64 zu verlassen, um auf die folgende Adresse weitergeleitet zu werden:
Bitte beachte, dass wir für den Inhalt der Zielseite nicht verantwortlich sind und unsere Datenschutzbestimmungen dort keine Anwendung finden.
letzter Beitrag von syshack am
Hallo Leute
hat jemand eine Ahnung, we es prinzipiell funktioniert, zusätzliche Basic Befehle zu definieren?
Ein Link zu Infos oder Buch wäre toll.
Ich denk es ist etwas kompliziert, um es mit 3 Sätzen zu beschreiben....
Micha.
Welches System? Aufm CPC wäre es ein Kindernspiel sowas umzusetzen.
Sorry, C64 oder C128.
Wenn es Assembler für den C64 sein darf:
https://www.c64-wiki.de/wiki/basic_erweiterung.asm
Edit: Via BASIC ginge auch https://www.c64-wiki.de/wiki/FN
Danke für den Link, das hab ich gesucht...
So wie es dort dargestellt ist kannte ich das auch. Wie bewerkstelligt man es, Befehle ohne Token vorneweg zu realisieren? Also wie macht das das eigentliche Basic? Ich habe im memory dump gesehen, das alle Befehle direkt hintereinander im BasicRom stehen. Gleichlang sind die ja auch nicht. Ich habe dann "SAVE" mal durch "MIKE" ersetzt. und tatsächlich funktionierte dann "MIKE "PROGRAMM",8,1". Kann das jemand kurz umreissen?
Danke. Das ist mal ein Ansatzpunkt! "Wedge" war mir neu!
ewtl hilft dir ja diese leicht buggy source.
Sorry, C64 oder C128.
Auf dem 128er gibt es spezielle Systemvektoren für "Tokenisieren", "De-Tokenisieren", "Anweisung ausführen" und "Funktion aufrufen", da kann man relativ leicht eigene Befehle nachrüsten. Für einen Beispielsource such mal hier im Forum nach "VDC-Basic".
EDIT: hier.
Ohne tiefere Einsicht in den Basic-Kernal und Assemblerkenntnisse fast unmöglich. Ich hab meine kleinen Basicerweitungen immer per SYS aufgerufen.
z. b.:
SYS 49152,zeile,spalte,a$
SYS 49152,zeile,spalte,a$
Das wäre auch ok, aber wie funktioniert das mit der Übergabe der Parameter?
SYS erzeugt doch mMn einen CALL zur Adresse (in Deinem Fall 49152).
Die sich dort befindende routine endet mit RTS.
Wie kommt sie an die Parameter, die hinter dem SYS 49152 folgen?
Dafür gibt es diverse Routinen im Kernal:
GETBYT, CHKCOM, FRMEVL, GETPAR
Google mal danach. Die nehmen aus dem Basicquelltext die parameter nach dem Sys an und reichen sie an die Register weiter bzw. werfen Fehler aus wenn der unpassende Typ gefunden wurde.
Edit:
Zitat von WikiPassing parameters through BASIC
In order to pass parameters from BASIC to the machine code routine, one can also exploit the “mechanisms” in BASIC ROM that handles parameters in other BASIC commands, using routines like e.g.
Ich habe im memory dump gesehen, das alle Befehle direkt hintereinander im BasicRom stehen. Gleichlang sind die ja auch nicht.
Das sind ja nur die Strings, die bei der Eingabe (Tokenisierung) und beim Auflisten (De-Tokenisierung) benutzt werden. Zur Laufzeit des Basic-Programms werden die gar nicht benutzt, da wird einfach das aktuelle Token in einen Tabellen-Offset umgerechnet und über eine Sprungtabelle die richtige Routine angesprungen.
Ein Basic-Erweiterung ersetzt diesen Code entweder komplett oder sie benutzt für die neuen Befehle eigene Tabellen und verzweigt nur zum Original-Code, wenn der aktuelle Befehl eben keiner der neuen ist.
Echt ein komplexes Thema!
Ich glaube das Thema wurde schon mal hier im Forum angerissen, finde den Link gerade nicht (ist nicht der von Mantillo).
Im Transactor Artikel July 1986, ab Seite 58 hat es zu dem Thema was:
Command Wedge: Modifying BASIC's Commands (Zimmers JPG)
PDF Ausgabe: http://csbruce.com/cbm/transactor/pdfs/trans_v7_i01.pdf
Blog Artikel zum Thema: https://lawlessguy.wordpress.c…nding-commodore-64-basic/
Hier noch ein Thread im Forum: Basic-Erweiterungen selbermachen?
Hier noch einmal ein theoretischer Verweis, wie man Funktionen als Programm-Container umprogrammieren kann.
Das Basic-Fan Beispiel zeigt, wie man mit einer Funktion, ähnlich wie in C den Cursor setzen kann.
Quellcode:
Schönen Gruß.