USR |
Utilisateur |
---|---|
DISK BASIC |
Syntaxe
USR[n](nmexp) |
Paramètres
Nom | Description |
---|---|
n | Ce paramètre permet d'indiquer l'un des dix appels USR disponibles, n=0, 1, 2, ...,9. Si n est omis, zéro est supposé. |
nmexp | Ce paramètre permet d'indiquer un nombre dans l'intervalle +32768 à -32767 et est passé comme paramètre entier à la routine. |
Description
Cette fonction permet d'appeler la routine externe (n=0, 1, 2,..., 9).
Ces fonctions (USR0 à USR9) transfèrent le contrôle à des routines en langage machine préalablement définies avec des instructions DEFUSRn.
Lorsqu'un appel USR est rencontré dans une instruction, le contrôle passe à l'adresse spécifiée dans l'instruction DEFUSRn. Cette adresse spécifie le point d'entrée de votre routine en langage machine. Une instruction RET ou JP 0A9A dans la routine rend le contrôle à l'appel USR dans votre programme BASIC.
Remarque : Si vous appelez une routine USRn avant de définir le point d'entrée de la routine avec DEFUSRn, une erreur d'appel de fonction illégale se produira.
Vous pouvez passer un paramètre et récupérer une valeur de sortie directement via le paramètre USR ; ou vous pouvez transmettre et récupérer des paramètres indirectement via des instructions POKE et PEEK.
Exemple :
10 DEFUSR1=&H7D00
20 REM... PLUS DE LIGNE DE PROGRAMME ICI
100 A=USR1(X)
L'effet de cette séquence est de :
- Définir USR1 comme une routine avec un point d'entrée à l'hexadécimal 7D00 (ligne 10)
- Transférer le contrôle à la routine ; la valeur X peut être passée à la routine si la routine fait le CALL décrit ci-dessous (ligne 100)
- Lorsque la routine revient en BASIC, la variable A peut contenir la valeur renvoyée par la routine (si votre routine fait le JUMP décrit ci-dessous); sinon A se verra attribuer la valeur de X (ligne 100).
Passage de paramètres vers et depuis les routines USR
Il existe plusieurs façons de passer des paramètres entre votre programme principal BASIC et vos routines USR : les deux principales sont répertoriées ci-dessous :
- POKE le(s) paramètre(s) dans des emplacements RAM fixes. La routine en langage machine peut alors accéder à ces valeurs et placer les résultats dans d'autres emplacements RAM. Lorsque la routine rend le contrôle au BASIC, votre programme peut PEEK dans ces adresses pour récupérer les valeurs de "sortie". C'est le seul moyen de passer deux ou plusieurs paramètres dans les deux sens.
- Passez un paramètre à la routine comme paramètre dans l'appel USRn, puis utilisez des appels ROM spéciaux pour accéder à ce paramètre et renvoyer une valeur à BASIC. Cette méthode se limite à envoyer un paramètre et à renvoyer une valeur (les deux sont des entiers).
Appels ROM
- CALL 0A7Fh
Place le paramètre USR dans la paire de registres HL ; H contient msb, L contient lsb. Ce CALL devrait être la première instruction de votre routine USR.
- JP 0A9Ah
Utilisez ce JUMP pour revenir au BASIC ; l'entier dans HL devient la sortie de l'appel USR. Si vous ne vous souciez pas de retourner HL, alors exécutez une simple instruction RETURN au lieu de ce JUMP.
Exemples
Vous trouverez ci-dessous une routine assemblée en langage machine acceptant le paramètre de l'appel USR en BASIC, le décalera d'une position vers la gauche et renverra le résultat en BASIC.
- 00100 ;
- 00110 ; FONCTION DE DECALAGE
- 00120 ;
- 00130 ; PROGRAMME DE CODE MACHINE POUR DECALER A GAUCHE UN
- 00140 ; PARAMETRE ENVOYE DE BASE ET RENVOYER LE RESULTAT
- 00150 ; A BASIC
- 00160 ;
- 7D00 00170 ORG 7D00h
- 00180 ;
- 00190 ; EQUATES ET POINTS D'ENTREE
- 00200 ;
- 0A7F 00210 ; GETARG EQU 0A7Fh ; DEMANDE UN PARAMETRE DU BASIC
- 0A9A 00220 ; PUTANS EQU 0A9Ah ; RETOURNE UNE REPONSE DU BASIC
- 00230 ;
- 7D00 CD7F0A 00240 SHIFT CALL GETARG ; DEMANDE LE NOMBRE Du BASIC
- 7D03 CB15 00250 RL L ; DECALAGE L
- 7D05 CB14 00260 RL H ; DECALAGE H - REPONSE DANS HL
- 7D07 C39A0A 00270 JP PUTANS ; RETOURNE A BASIC W/ REPONSE
- 00280 ;
- 7D00 00290 END SHIFT
Le programme suivant inclut le code décimal pour la routine SHIFT. Le code est placé dans la RAM puis accessible en tant que routine USR. Exécutez le programme (RUN); pour arrêter, entrez une valeur de zéro.
Remarque : Les deux programmes BASIC suivants nécessitent que vous réserviez des adresses mémoire supérieures à 31999 pour le code USR. (Répondre MEMORY SIZE? avec 31999).
100 ' PROGRAMME : SHIFT
110 ' FONCTION UTILISATEUR EN LANGAGE MACHINE DE DECALAGE VERS LA GAUCHE
120 '
130 ' ***** CODE MACHINE A 7D00 HEXADECIMAL ******
140 '
150 DEFUSR5=&H7D00
160 '
170 ' ****** INTRODUIRE LE PROGRAMME UTILISATEUR DANS LA MEMOIRE ******
180 '
190 FOR X=32000 TO 32009 '7D00 HEXADECIMAL EGALE 32000 DECIMAL
200 READ A
210 POKE X,A
220 NEXT X
230 '
240 ' ****** DEMANDE LA VALEUR DE L'UTILISATEUR ******
250 '
260 CLS:PRINT TAB(15);"FONCTION DE DECALAGE VERS LA GAUCHE USR5"
270 PRINT:INPUT"ENTRER UNE VALEUR ENTIERE";V
280 IF V=0 THEN END
290 PRINT"DECALAGE DE VALEUR VERS LA GAUCHE = ";TAB(32);USR5(V)
300 GOTO 270
310 '
320 ' ****** DONNNES EST UN CODE DECIMAL POUR LE PROGRAMME HEXADECIMAL *****
330 '
340 DATA 205,127,10,203,21,203,20,195,154,10
Vous tapez la commande suivante :
RUNENTER |
on obtiendra un résultat ressemblant à ceci :
FONCTION DE DECALAGE VERS LA GAUCHE USR5ENTRER UNE VALEUR ENTIERE? 7ENTER
DECALAGE DE VALEUR VERS LA GAUCHE = 14
ENTRER UNE VALEUR ENTIERE? -7ENTER
DECALAGE DE VALEUR VERS LA GAUCHE = -13
ENTRER UNE VALEUR ENTIERE? 32767ENTER
DECALAGE DE VALEUR VERS LA GAUCHE = -2
ENTRER UNE VALEUR ENTIERE? 0ENTER
READY
>_
Vous trouverez ci-dessous un programme assemblé pour blanchir l'affichage (une touche CLEAR "inverse"!).
- 00100 ;
- 00110 ; ZAP L'ECRAN DE SORTIE AVEC LA FONCTION USR
- 00120 ;
- 7D00 00130 ORG 7D00H
- 00140 ;
- 00150 ; EQUATES
- 00160 ;
- 3C00 00170 VIDEO EQU 3C00H ; DEBUT DE LA RAM VIDEO
- 00BF 00180 WHITE EQU 0BFH ; OCTET GRAPHIQUE TOUS BLANC
- 03FF 00190 COUNT EQU 3FFH ; NOMBRE D'OCTETS A DEPLACER
- 00200 ;
- 00210 ; DEPLACEMENT DE CHAINE DE PROGRAMME X'BF' DANS LA MEMOIRE VIDEO
- 7D00 21003C 00230 ZAP LD HL,VIDEO ; ADRESSE SOURCE
- 7D03 36BF 00240 LD (HL),WHITE ; METTRE EN SORTIE LE PREMIER OCTET
- 7D05 11013C 00250 LD DE,VIDEO+1 ; ADRESSE DE DESTINATION
- 7D08 01FF03 00260 LD BC,COUNT ; NOMBRE D'ITERATIONS
- 7D0B EDB0 00270 LDIR ; EFFECTUE L'ACTION
- 00280 ;
- 7D0D C9 00290 RET ; RETOURNE AU BASIC
- 7D00 00300 END ZAP
Cette routine peut être POKE dans la RAM et accessible en tant que routine USR, comme suit.
100 ' PROGRAMME : USR1
110 ' EXEMPLE DE FONCTION LANGAGE MACHINE UTILISATEUR
115 ' APPUYEZ SUR LA TOUCHE '@' PENDANT L'AFFICHAGE DES CHIFFRES POUR ARRETER
120 '
130 ' ****** POKE MACHINE PROGRAMME EN MÉMOIRE *****
140 '
150 DEFUSR1 = &H7D00
160 FOR X = 32000 TO 32013 ' 7D00 HEXADECIMAL EGAL 32000 DECIMAL
170 READ A
180 POKE X,A
190 NEXT X
192 '
194 ' ***** EFFACE L'ECRAN ET NOMBRE D'AFFICHAGE 1 JUSQU'A 100 *****
196 '
200 CLS
205 PRINT TAB(15);"ROUTINE UTILISATEUR DE SORTIE BLANCHE":PRINT
210 FOR X = 1 TO 100
220 PRINT X;
225 A$=INKEY$:IF A$="@"THEN END
230 NEXT X
240 '
250 ' ***** SAUTE VERS LA SOUS-ROUTINE DE SORTIE BLANCHE *****
260 '
270 X=USR1(0)
280 FOR X=1 TO 1000:NEXT X 'BOUCLE DE DELAI
290 GOTO 200
300 '
310 ' ****** DONNEES EST CODE DECIMAL POUR LE PROGRAMME HEXADECIMAL ******
320 '
330 DATA 33,0,60,54,255,17,1,60,1,255,3,237,176,201
Exécutez (RUN) le programme. Une routine BASIC équivalente prend beaucoup de temps en comparaison !