USR

Table Of Contents
hide

Die BASIC-Funktion USR() ruft aus einem BASIC-Programm ein Maschinensprache-Routine auf, wobei ein Argument verarbeitet wird, dessen Typ (wenn überhaupt) erst entsprechend der aufgerufenen Routine festgelegt ist. Als Ergebnis wird immer eine Fließkommazahl erwartet, die dann an das BASIC-Programm retourniert wird.

Die Startadresse des Maschinenprogramms muss vor dem Aufruf von USR() im Vektor mit den Speicheradressen 785 und 786 (USR-Vektor an den hexadez. Adressen $311/$312) abgelegt werden, typischerweise mit Hilfe des BASIC-Befehls POKE. Der Rückgabewert wird im Fließkomma-Akkumulator #1 beginnend bei der Speicheradresse 97 ($61) erwartet, welcher vom BASIC-Programm als Funktionswert weiter verarbeitet werden kann.

Nach einem Systemneustart des C64 ist die Startadresse mit $B248 initialisiert, welche auf die Ausgaberoutine der BASIC-Fehlermeldung ?ILLEGAL QUANTITY ERROR verzweigt. Dieser Fehler wird bei USR()-Aufruf auch geliefert, bis eine andere Adresse gesetzt wird.

Fehler in Bezug auf die Argumentsyntax, wenn kein Argument oder mehr als ein Argument vorhanden ist, werden mit ?SYNTAX ERROR angezeigt. Sofern der Typ des Ausdrucks von der aufgerufenen Maschinenprogramm-Routine überprüft wird, kann es bei einer Abweichung auch zur Ausgabe der BASIC-Fehlermeldung ?TYPE MISMATCH ERROR kommen. Tatsächlich nicht im erwarteten Wertebereich befindliche Werte können ein ?ILLEGAL QUANTITY ERROR, aber auch andere Fehlermeldungen hervorrufen.

Adressen der Funktion in anderen BASIC-Varianten:

BASICUSR-VektorAdresse nach NeustartAnmerkung
BASIC V2 (C64)785/786
$0311/$0312
45640
$B248
-
BASIC 3.5 (264-Serie)1281/1282
$0501/$0502
39196
$991C
-
BASIC 7.0 (C128)4633/4634
$1219/$121A
32040
$7D28
bezogen auf Bank 15

Beispiele

Schnelle Multiplikation mit 10:

10 REM MULTIPLY BY 10 - $BAE2 ROUTINE
20 POKE 786,186: POKE 785,226
30 FOR I=1 TO 10
40 PRINT USR(1/I)
50 NEXT I

Die Ausgabe zeigt dann

 10
 5
 3.33333334
 2.5
 2
 1.66666667
 1.42857143
 1.25
 1.11111111
 1

Im Vergleich zu einer Multiplikation mit dem Ausdruck 1/I*10 ist die USR()-Variante deutlich (rund 40 %) schneller.

Mit den Zeilen

10 REM DIVIDE BY 10 - $BAFE ROUTINE
20 POKE 786,186: POKE 785,254

in obigem Beispiel hat man statt einer Mal-10-Funktion eine Durch-10-Funktion.

Beispiel für eine Zeichenkette als Argument

10 REM LEN()-FUNKTION - $B77C ROUTINE
20 POKE 786,183: POKE 785,124
30 PRINT USR("123")
3

Variante der FRE()-Funktion, die dabei nicht die Garbage Collection auslöst:

10 POKE 786,179:POKE 785,135
20 PRINT USR(0),FRE(0)
-26665    -26665

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Datenschutz
Ich, Andreas Hoever (Wohnort: Deutschland), verarbeite zum Betrieb dieser Website personenbezogene Daten nur im technisch unbedingt notwendigen Umfang. Alle Details dazu in meiner Datenschutzerklärung.
Datenschutz
Ich, Andreas Hoever (Wohnort: Deutschland), verarbeite zum Betrieb dieser Website personenbezogene Daten nur im technisch unbedingt notwendigen Umfang. Alle Details dazu in meiner Datenschutzerklärung.