Section courante

A propos

Section administrative du site

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 :

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 :

Appels ROM

  1. 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.

  1. 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.

  1.              00100 ;
  2.              00110 ; FONCTION DE DECALAGE
  3.              00120 ;
  4.              00130 ; PROGRAMME DE CODE MACHINE POUR DECALER A GAUCHE UN 
  5.              00140 ; PARAMETRE ENVOYE DE BASE ET RENVOYER LE RESULTAT 
  6.              00150 ; A BASIC
  7.              00160 
  8. 7D00         00170   ORG   7D00h
  9.              00180 ;
  10.              00190 ; EQUATES ET POINTS D'ENTREE
  11.              00200 ;
  12. 0A7F         00210 ; GETARG  EQU    0A7Fh   ; DEMANDE UN PARAMETRE DU BASIC
  13. 0A9A         00220 ; PUTANS  EQU    0A9Ah   ; RETOURNE UNE REPONSE DU BASIC
  14.              00230 ;
  15. 7D00 CD7F0A  00240 SHIFT     CALL   GETARG  ; DEMANDE LE NOMBRE Du BASIC
  16. 7D03 CB15    00250           RL     L       ; DECALAGE L
  17. 7D05 CB14    00260           RL     H       ; DECALAGE H - REPONSE DANS HL
  18. 7D07 C39A0A  00270           JP     PUTANS  ; RETOURNE A BASIC W/ REPONSE
  19.              00280 ;
  20. 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 USR5

ENTRER 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"!).

  1.              00100 ;        
  2.              00110 ; ZAP L'ECRAN DE SORTIE AVEC LA FONCTION USR
  3.              00120 ;
  4. 7D00         00130        ORG 7D00H
  5.              00140 ;
  6.              00150 ; EQUATES
  7.              00160 ;
  8. 3C00         00170 VIDEO  EQU 3C00H       ; DEBUT DE LA RAM VIDEO
  9. 00BF         00180 WHITE  EQU 0BFH        ; OCTET GRAPHIQUE TOUS BLANC
  10. 03FF         00190 COUNT  EQU 3FFH        ; NOMBRE D'OCTETS A DEPLACER
  11.              00200 ;
  12.              00210 ; DEPLACEMENT DE CHAINE DE PROGRAMME X'BF' DANS LA MEMOIRE VIDEO
  13. 7D00 21003C  00230 ZAP    LD  HL,VIDEO    ; ADRESSE SOURCE
  14. 7D03 36BF    00240        LD  (HL),WHITE  ; METTRE EN SORTIE LE PREMIER OCTET
  15. 7D05 11013C  00250        LD  DE,VIDEO+1  ; ADRESSE DE DESTINATION
  16. 7D08 01FF03  00260        LD  BC,COUNT    ; NOMBRE D'ITERATIONS
  17. 7D0B EDB0    00270        LDIR            ; EFFECTUE L'ACTION
  18.              00280 ;
  19. 7D0D C9      00290        RET             ; RETOURNE AU BASIC
  20. 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 !



Dernière mise à jour : Vendredi, le 3 Mars 2023