Hallo Besucher, der Thread wurde 3,3k mal aufgerufen und enthält 13 Antworten

letzter Beitrag von wolfgang72 am

user befehl

  • Zitat aus c64-wiki:
    Der BASIC-Befehl USR dient zum Aufruf eines Maschinensprache-Unterprogramms aus einem BASIC-Programm. Die Startadresse dieses aufgerufenen Maschinenspracheprogramms muss sich in den Speicheradressen 785 und 786 befinden. Falls die Startadresse sich nicht dort befindet, muss sie vor dem USR-Aufruf mit dem BASIC-Befehl POKE dort hinein geschrieben werden. Weiterhin kann mit dem BASIC-Befehl USR ein Zahlenwert in einer Gleitpunktvariable von dem Maschinenspracheprogramm an das BASIC-Programm übergeben werden. Der Rückgabewert wird im Gleitpunkt-Akkumulator bei der Speicheradresse 97 gespeichert, bevor er an das BASIC-Programm übergeben wird.


    Am besten beschreibt man USR im Vergleich zu SYS.
    * Beim SYS-Befehl gibt man die Startadresse jeweils nachfolgend an: "SYS Adresse" - das entspricht in Assembler einem JMP Adresse
    * Beim der USR-Funktion ergibt sich die Adresse aus den oben zitierten Speicherstellen 785 / 786 im Lo/Hi-Format. Es ist also ein indirekter Sprung vergleichbar wie bei JMP (Adresse).
    * Der SYS-Befehl übergibt keine Parameter und er übernimmt keine Parameter.
    * Die USR-Funktion übergibt einen numerischen (!) Parameter und übernimmt als Ergebnis wieder einen numerischen Parameter. Die Syntax lautet "USR (Wert)"


    Was passiert im Rechner?
    Der Funktionsaufruf B=USR(A) übergibt den Wert der Variablen A in FAC#1. Danach wird aus den Speicherstellen 785/786 das Sprungziel ermittelt und angesprungen. Nach Ausführung der Routine, die z.B. eine Berechnung ausführt, die einen Ergebniswert im FAC#1 ergibt, wird das Assemblerprogramm verlassen [Ende mit RTS, wie bei SYS]. Der Wert aus dem FAC#1 wird dann als Ergebnis an die Variable B zurückübergeben (wurde nichts neuberechnet, ist das der Wert in Klammern) Stringvariable sind bei USR nicht zulässig.


    Sowohl bei USR als auch bei SYS kann man in der aufgerufenen Routine eigene Parameterauswertungen durchführen. Die Syntax wäre dann z.B.
    SYS Adresse,A,X%,A$
    B=USR(A),A,X%,A$
    Wie man sieht, sind jetzt auch Strings möglich. Das erste Komma hinter der USR-Funktion kann auch entfallen, da die Klammer als Trennzeichen genügt. Das muss man dann aber in der Auswerteroutine entsprechend programmieren.


    Reicht das?
    Gruß WTE

  • Ich habe den USR-Befehl bisher einmal verwendet.
    Das war erstaunlich einfach. Wenn du ohne Parameter arbeitest, ist das fast nur wie ein SYS Befehl, wobei du denn Startpunkt vorher über POKEs festlegst.
    Ich hatte den Parameter über eine Kernel-Routine in ein Integer umgewandelt und dann weiterverwendet. War einfacher, als einen Komma-getrennten Paramter nach einem SYS zu analysieren.


    Nervig war aber etwas anderes: Ich habe keinen Rückgabewert gebraucht. BASIC verlangt das aber.
    Man kann also keinen USR(4) Befehl eintippen. Man muss beispielswese PRINT USR(4) schreiben, auch wenn er dann einen Fantasiewert ausgibt.

  • Zitat

    Original von hoogo
    Aber der Rückgabewert ans Basic ist doch gerade das nützliche an dem Befehl?

    Der USR-Befehl hat zwei Vorteile gegenüber dem SYS-Befehl: Die einfache Parameterübergabe und der einfache Rückgabewert.


    Ich habe halt nur die Hälfte der Vorteile des Befehls genutzt. Na und? War mir immer noch lieber, als die Kommawerte nach dem SYS zu analysieren oder die Parameter zu POKEen, wie es sonst beim SYS notwendig gewesen wäre.


    Aber richtig, das ist ein Grenzfall. Geschmackssache. Aber ich habe in dem BASIC-Teil des geladenen Programms die POKEs durchgeführt, und die Befehlsaufrufe danach interaktiv durchgeführt.
    Und mal ehrlich, mir ist ein "PRINT USR(60)" allemal lieber als mir ein "SYS 47364,60" merken zu müssen.

  • Naja, für einene Befehl mit einem Parameter ists ja schon ne Möglichkeit. Aber ich glaub, so Befehlserweiterungen a la Turbotape mit <-L, <-S und so sind da vom Aufwand her auch nicht mehr fern und aus Basic-Sicht noch bequemer. Muß mal raussuchen, wie ich das früher gemacht hab.

  • Zitat

    Original von super_castle
    die Speicherstellen 785/786 muss ich mit der asm-routine-adresse als lo und hi füllen (poken), finde ich schwieriger, ich musste die 49152 erst umrechnen in lo und hi oder eine formel schreiben.


    Bevor ich an meinem CeVi das FC3 oder RR hatte, habe ich für Hex-/Dezimalumwandlungen einfach am Windows PC immer den Rechner CALC.EXE genommen.
    49152 in Hex -> c000 -> hi c0, lo 00 (bleibt) -> c0 in Dez -> 192 -> Tadaa!

  • Zitat

    Original von super_castle
    die Speicherstellen 785/786 muss ich mit der asm-routine-adresse als lo und hi füllen (poken), finde ich schwieriger, ich musste die 49152 erst umrechnen in lo und hi oder eine formel schreiben.

    Ja, aber wie gesagt, ich benutze meinen USR interaktiv. Die Umrechnung in lo und hi musste ich nur einmal machen und in das BASIC-Programm eintragen. Die SYS-Adresse hingegen muss ich mir bis in alle Ewigkeit merken. Keine Lust dazu.


    Davon abgesehen schien es mir aber auch einiges leichter, den Maschinensprache-Teil zu programmieren, weil der Kernel mir ja die Parameter schon auf dem Tablett serviert, anstatt dass ich ihn selbst aus dem BASIC-Befehl extrahierenn muss. Schien mir erheblich einfacher.


    Aber wenn man weder Parameter übergibt, noch Rückgabewerte liefert, dann ist SYS ganz eindeutig das Werkzeug erster Wahl.

  • ...Naja, für einene Befehl mit einem Parameter ists ja schon ne Möglichkeit. Aber ich glaub, so Befehlserweiterungen a la Turbotape mit <-L, <-S und so sind da vom Aufwand her auch nicht mehr fern und aus Basic-Sicht noch bequemer. Muß mal raussuchen, wie ich das früher gemacht habe.....




    hallo, mach das mal.
    danke.


    mfg peter