USR

Aus C64-Wiki
Wechseln zu: Navigation, Suche
Begriffsklärung Der Titel dieses Artikels ist mehrdeutig. Weitere Bedeutungen finden sich unter USR (Begriffsklärung).
USR
Format: USR(<Ausdruck>)
Parameter
<Ausdruck>: Ausdruck (Zeichenkette oder Zahl)
Einordnung
Typ: numerische Funktion
Kontext: System
Aufgabe: ruft eine Maschinensprache-Routine als Funktion auf
Abkürzung: uS
Verwandte Befehle
SYS

Anmerkung: Dieser Artikel beschreibt die numerische BASIC-Funktion USR unter BASIC V2 des Commodore 64.


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:

BASIC USR-Vektor Adresse nach Neustart Anmerkung
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

[Bearbeiten] 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


[Bearbeiten] Weblinks


In anderen Sprachen