Section courante

A propos

Section administrative du site

Améliorations apportées au LEVEL II BASIC

Le DISK BASIC ajoute de nombreuses fonctionnalités à LEVEL II n'étant pas liées au disque. Ils sont énumérés ci-dessous avec des descriptions abrégées. Les détails suivent par ordre alphabétique :

Fonctionnalité Description
&H Préfixe hexadécimal constant
&O Préfixe octal constant
CMD"D" Activer et charger le programme de débogage en temps réel.
CMD"R" Activer les interruptions (démarrer l'horloge en temps réel)
CMD"S" Retour normal à TRSDOS (saut à la routine EXIT)
DEF FN Définir une fonction d'instruction BASIC implicite.
DEF USR Définir le point d'entrée d'une routine externe en langage machine
INSTR Fonction InString; trouver la sous-chaîne de caractères dans la chaîne de caractères cible.
LINE INPUT Saisir une ligne à partir du clavier
MID$= Remplacer la partie de la chaîne cible (utilisée à gauche du signe égal)
TIME$ Obtenez l'heure et la date de l'horloge en temps réel
USRn Appeler la routine externe (n=0, 1, 2,..., 9)

Opérations sur les cassettes

Avant toute opération d'entrée ou de sortie de cassette BASIC, vous devez désactiver les interruptions avec la commande CMD"T". En effet, ces opérations de cassette sont sensibles au temps et ne peuvent pas fonctionner si elles sont interrompues toutes les 25 millisecondes. Lorsque le fonctionnement de la cassette est terminé, vous pouvez réactiver les interruptions en exécutant l'instruction CMD"R".

Le CLOAD n'autorise aucun nom de fichier dans DISK BASIC. Par conséquent, vous ne pouvez pas utiliser un tel nom de fichier pour trier plusieurs fichiers de bande magnétique. CLOAD chargera toujours le premier fichier rencontré sur la bande magnétique. CSAVE, cependant, nécessite toujours le nom de fichier. De cette façon, les programmes CSAVE sous DISK BASIC peuvent être chargés et triés via la commande CLOAD"filename" du LEVEL II.

Le CLOAD? (CLOAD-vérifie), utilisé au LEVEL II pour comparer un programme BASIC en RAM avec un programme sur bande magnétique, ne fonctionnera pas avec les programmes enregistrés sur bande magnétique sous LEVEL II. Il fonctionnera avec les programmes enregistrés sous DISK BASIC.

Messages d'erreur

Lorsqu'une erreur se produit, le DISK BASIC épelle le message d'erreur complet, pas seulement l'abréviation. Cela vous évite d'avoir à le chercher.

Exemple :

ERROR(14)ENTER

Le DISK BASIC répond avec le message suivant :

OUT OF STRING SPACE

Remarque : La fonction ERROR, utilisée pour simuler des conditions d'erreur, fonctionnera uniquement avec des codes d'erreur non liés au disque.

&H et &O

Constante hexadécimal et octal
DISK BASIC

Il est souvent pratique d'utiliser des constantes hexadécimales (base 16) ou octales (base 8) plutôt que leurs homologues décimaux. Par exemple, les adresses mémoire et les valeurs d'octets sont plus faciles à manipuler sous forme hexadécimale. &H et &O vous permettent d'introduire une telle constante dans votre programme.

&H et &O sont utilisés comme préfixes pour les chiffres les suivant immédiatement :

&Hdddd

Paramètre Description
dddd Ce paramètre permet d'indiquer une séquence de 1 à 4 chiffres composée de nombres hexadécimaux 0, 1,...9, A, B,..., F.

et

&Oddddd

Paramètre Description
ddddd Ce paramètre permet d'indiquer une suite de chiffres octaux 0, 1,...,7. et &Odddd<= 177777 décimal. Remarque : Le O peut être omis du préfixe &O. Donc &Oddddd=&ddddd.

Les constantes représentent toujours des entiers signés. Par conséquent, tout nombre hexadécimal supérieur à &H7FFF, ou tout nombre octal supérieur à &O77777, sera interprété comme une quantité négative. Le tableau suivant illustre cela :

Octal Hexadécimal Décimal
&1 &H1 1
&2 &H2 2
&77777 &H7FFF 32767
&100000 &H8000 -32768
&100001 &H8001 -32767
&100002 &H8002 -32766
&177776 &HFFFE -2
&177777 &HFFFF -1

Les constantes hexadécimales et octales ne peuvent pas être saisies en tant que réponses à un prompt INPUT ou être contenues dans une instruction DATA. Souvent, la constante hexadécimale ou octale doit être placée entre parenthèses pour éviter qu'une erreur de syntaxe ne se produise.

Exemples :

PRINT &H5200,&O51000

affiche l'équivalent décimal des deux constantes (toutes deux égales à 20992).

POKE &H3C00,42

place la décimale 42 (code ASCII pour un astérisque) dans l'adresse de mémoire vidéo 3C00 en hexadécimal.

100 FOR I=(&H3C00) TO (&H3FFF) STEP (&H40)
200 IF A=(&H37E8) THEN A=A+1
300 POKE A%, (X% AND &HFF)

Masque l'octet le plus significatif de X% et POKE le résultat à l'emplacement A%.

CMD"D"

Exécute le programme DEBUG
DISK BASIC

Syntaxe

CMD"D"

Description

L'exécution de cette instruction entraîne le chargement et l'exécution du programme de débogage TRSDOS. (Voir la commande DEBUG de TRSDOS) Votre programme BASIC n'est pas affecté, car DEBUG se charge sous DISK BASIC.

Pour revenir au BASIC sans réinitialisation, tapez :

GENTER

Le message READY apparaîtra et vous pourrez continuer en BASIC.

Une fois que CMD"D" a été exécuté, DEBUG prendra le relais chaque fois que vous appuierez sur la touche BREAK. Appuyez sur GENTER pour revenir au BASIC. Tapez CONT pour continuer tout programme étant en cours d'exécution lorsque vous avez tapé BREAK.

Pour revenir de DEBUG à la séquence d'initialisation BASIC, tapez G5200ENTER. Vous perdrez tout texte de programme BASIC ou toute valeur de variable.

Exemples

100 ' PROGRAMME: DEBUG
110 ' EXEMPLE D'EXECUTION AVEC DEBUG DANS UN PROGRAMME
120 '
130 CLS:PRINT TAB(15):"EXEMPLE DEBUG":PRINT
140 PRINT"ENTRER DANS DEBUG"
150 FOR I=1 TO 500:NEXT I ' RETARDER UN PEU
160 '
170 '*** ENTRE DANS LE PAQUET DE DEBUG ***
180 '
190 CMD"D"
200 '
210 '*** RETOURNE ICI QUAND "G" EST ENTREE DANS DEBUG ***
220 '
230 CLS:PRINT:"VOUS ETES RETOURNE DU DEBUG"
240 END

Vous lancez le programme en tapant :

RUNENTER

on obtiendra un résultat ressemblant à ceci :

               EXEMPLE DEBUG

ENTRER DANS DEBUG

AF = 44 42 -Z----N-
BC = 69 01 =>  57 49 54 48 49 4E 20 41  20 50 52 4F 47 52 41 4D
DE = 69 B8 =>  44 22 00 C3 69 C8 00 3A  93 FB 00 FD 69 D2 00 3A
HL = 40 B7 =>  69 55 FF FF FF FF FF FF  FF 00 00 00 00 00 00 54
AF'= FF FF SZ1H1PNC
BC'= 4D BE =>  51 51 CD FC 51 7E 23 18  EC 02 02 00 4E 03 32 E7
DE'= 01 07 =>  4D 4F 52 59 20 53 49 5A  45 00 52 41 44 49 4F 20
HL'= 4D 00 =>  F2 51 06 10 CD 65 51 3A  5D 40 FE 41 20 13 CD F2
IX = 40 15 =>  01 E3 03 00 00 00 4B 49  07 58 04 31 3E 00 44 4F
IY = FF FF =>  FF F3 AF C3 73 06 C3 00  40 C3 00 40 E1 E9 C3 9F
SP = DB 6C =>  BA 69 1E 1D 00 00 04 04  20 00 00 00 00 00 00 00
PC = 57 08 =>  E1 C9 3A 29 5B F6 C0 CD  09 44 E1 C9 D7 E5 3E 11
      1000 =>  28 10 RE 44 28 0C FE 30  28 F0 FE 2C 28 EC FE 2E
      1020 =>  20 03 2B 36 30 7B E6 10  28 03 2B 36 24 7B E6 04
      1030 =>  C0 2B 70 C9 32 D8 40 21  30 41 36 20 C9 FE 05 E5
GENTER1040 =>  DE 00 17 57 14 CD 01 12  01 00 03 82 FA 57 10 14
VOUS ETES RETOURNE DU DEBUG
READY
>_

CMD"R"

Début de l'horloge (active l'interruption)
DISK BASIC

Syntaxe

CMD"R"

Description

Exécutez cette commande immédiatement après la fin d'une opération d'entrée/sortie de cassette pour redémarrer l'horloge en temps réel. Voir CMD "T".

CMD"S"

Retourne vers TRSDOS
DISK BASIC

Syntaxe

CMD"S"

Description

Exécutez cette commande pour initier un retour normal au mode de commande du système d'exploitation. Cela ne réinitialisera pas le système, mais vous sortira simplement du BASIC.

Assurez-vous de sauvegarder tout programme BASIC sur disque ou sur bande avant d'utiliser CMD"S", car votre programme BASIC résident sera perdu.


CMD"T"

Arrête l'horloge (désactive l'interruption)
DISK BASIC

Syntaxe

CMD"T"

Description

Vous devez exécuter cette commande immédiatement avant toute opération d'entrée/sortie de bande magnétique BASIC. De telles opérations sont sensibles au timing et ne peuvent pas permettre aux tâches pilotées par des interruptions telles que l'horloge en temps réel, TRACE et affichage CLOCK) de "voler" le temps.

Voici les commandes devant être précédées par l'exécution de CMD"T" :

CLOAD
INPUT#-1
INPUT#-2
SYSTEM
CLOAD?
CSAVE
PRINT#-1
PRINT#-2

Une fois ces opérations terminées, vous pouvez exécuter un CMD"R" pour réactiver les interruptions.

Exemple

10 OPEN"I",1,"TEST/BAS"
20 CMD"T":INPUT#1,A,B,C
30 CMD"R"

Remarque : Après CMD"D", vous pouvez utiliser CMD"T" pour empêcher BASIC de transférer le contrôle au programme DEBUG lorsque vous appuyez sur BREAK.


DEF FN:

Définition de fonction
DISK BASIC

Syntaxe

DEF FN var1(var2[,var...])=exp

Paramètres

Nom Description
var1 Ce paramètre permet d'indiquer le nom de la fonction, et n'importe quel nom de variable de LEVEL II valide.
var2 Ce paramètre permet d'indiquer les var-items suivants sont utilisés pour définir ce que fait la fonction.
exp Ce paramètre permet d'indiquer une expression impliquant généralement la ou les variables passées à gauche du signe égal.

Description

Cette instruction vous permet de créer vos propres fonctions implicites. Autrement dit, vous n'avez qu'à l'appeler par son nom et la fonction implicite que vous avez définie sera automatiquement exécutée. Une fois qu'une fonction a été définie avec l'instruction DEF FN, vous pouvez l'appeler simplement en référençant le nom de la fonction préfixé par FN. Vous pouvez l'utiliser exactement comme vous utiliseriez l'une des fonctions intrinsèques, par exemple, SIN, ABS, STRING$.

Le type de variable utilisé pour nommer la fonction détermine le type de valeur que la fonction renverra. Par exemple, si le nom de la fonction a l'attribut simple précision, cette fonction renverra une valeur simple précision, quelle que soit la précision des paramètres.

Exemples

DEFFNA$(TITLE$,GRAPHICS%)=STRING$(LEN(TITLE$),GRAPHICS%)

La fonction A$ nécessitera deux paramètres - un entier, une chaîne ; et il renverra une valeur de chaîne de caractères.

DEFFNRC!(A)=1/(A*A)

La fonction RC! nécessite un paramètre et renvoie une valeur simple précision, quelle que soit la précision de le paramètre.

Les noms de variable particuliers que vous utilisez comme paramètres dans l'instruction DEF FN ne sont pas affectés à la fonction; lorsque vous appelez la fonction ultérieurement, n'importe quel nom de variable valide du même type peut être utilisé. De plus, l'utilisation d'une variable comme paramètre dans une instruction DEF FN n'a aucun effet sur la valeur de cette variable.

La fonction doit être définie avec au moins un paramètre - même si cet paramètre n'est pas réellement utilisé pour transmettre une valeur à la fonction. Par exemple :

DEF FNR(A)=RND(0)

Exemples :

10 DEFFNMLT(A,B)=A*B
20 INPUT"ENTRER LE PARAMETRE",X,Y
30 PRINT"LE PRODUIT EST";FNMLT(X,Y)

Notez que FNMLT est défini avec les paramètres A, B, mais que lorsque la fonction est appelée à la ligne 30, les variables X et Y sont utilisées. Deux noms de variables valides peuvent être utilisés pour transmettre des valeurs à la fonction.

DEF FNRR(A,B)=A+INT(B*RND(0))

Renvoie un nombre aléatoire entre A et B.

DEF FNL8$(A$)=LEFT$(A$,8)

Renvoie les 8 premiers caractères du paramètre de chaîne de caractères.

DEF FNX#(A#,B#)=(A#-B#)*(A#-B#)

Renvoie la valeur double précision du "carré de la différence".

100 'PROGRAMME : STRING
110 'EXEMPLE D'UNE FONCTION DE CHAINE DE CARACTERES DEFFN
120 '
130 '****** FONCTION POUR CONCATENER DES CHAINES DE CARACTERES *******
140 DEF FNADD$(A$,B$)=A$+" "+B$
150 CLS:PRINT TAB(15);"EXEMPLE DE CHAINE DE CARACTERES DEFFN"
160 PRINT:F$="":INPUT"ENTRER LE PRENOM :";F$
165 IF F$=""THEN END
170 INPUT"ENTRER LE NOM DE FAMILLE :";L$
180 '
190 '****** AJOUT DE F$ VERS L$ AVEC 1 BLANC ENTRE ******
200 '
210 Z$=FNADD$(F$,L$)
220 PRINT TAB(6);"NOM COMPLET : ";Z$
230 GOTO 160

Vous tapez la commande suivante :

RUNENTER

on obtiendra un résultat ressemblant à ceci :

               EXEMPLE DE CHAINE DE CARACTERES DEFFN

ENTRER LE PRENOM : JEANENTER
ENTRER LE NOM DE FAMILLE : TREMBLAYENTER
      NOM COMPLET : JEAN TREMBLAY

Voici maintenant un exemple d'un programme MINMAX :

100 'PROGRAMME : MINMAX
110 'EXEMPLE DE FONCTION DEFFN
120 '
130 '****** DEFINIE LES FONCTIONS MIN ET MAX *******
135 '
140 DEF FNMIN(A,B)=(A+B-ABS(A-B))/2
150 DEF FNMAX(A,B)=(A+B+ABS(A-B))/2
160 '
170 '****** LECTURE DE LA PREMIERE VALEUR - APPELEZ-LE LE MIN ET LE MAX *******
180 'MN EST LA VALEUR MINIMUM
190 'MX EST LA VALEUR MAXIMUM
200 '
210 READ MN:MX=MN
220 '
230 '****** DEMANDE LA PROCHAINE VALEUR ET RECHERCHE LE NOUVEAU MIN/MAX *******
240 '
250 READ V:IF V=99999 THEN 320 'V=99999 SIGNIFIE TOUT FAIT
260 MN=FNMIN(MN,V) 'DEMANDE LE NOUVEAU MINIMUM
270 MX=FNMAX(MN,V) 'DEMANDE LE NOUVEAU MAXIMUM
280 GOTO 250
290 '
300 '****** AFFICHE LES RESULTATS ******
310 '
320 PRINT"VALEUR MINIMUM = ",MN
330 PRINT"VALEUR MAXIMUM = ",MX
340 '
350 '****** LES DONNÉES SUIVENT - LA DERNIÈRE VALEUR DOIT ÊTRE 99999 ******
360 '
370 DATA 1.2, 2, 3, 4.7, 5.332, 0.314, 6, 7, 8.3, 9.57, 99999

Vous tapez ensuite :

>RUNENTER
VALEUR MINIMUM = .314
VALEUR MAXIMUM = 9.57
READY
>370 DATA -1, 9, 0, 8, 1, 7, 2, 6, 3, 5, 4, 99999ENTER
>RUNENTER
VALEUR MINIMUM = -1
VALEUR MAXIMUM =  9
READY
>_

DEFUSR

Définition une adresse d'entrée pour la routine USR
DISK BASIC

Syntaxe

DEFUSRn=nmexp

Paramètres

Nom Description
n Ce paramètre permet d'indiquer une égalité à l'un des chiffres 0, 1,..., 9 ; si non est omis, 0 est supposé
nmexp Ce paramètre permet d'indiquer l'adresse d'entrée d'une routine en langage machine.

Description

Cette instruction vous permet de définir les points d'entrée pour jusqu'à 10 routines en langage machine. (Au LEVEL II, où une seule routine USR est disponible, l'adresse du point d'entrée est POKE dans RAM).

Exemple

100 DEFUSR3=&H7D00

Affecte le point d'entrée 7D00 hexadécimal, 32000 décimal, à l'appel USR3. Lorsque votre programme appelle USR3, le contrôle passera à votre sous-programme commençant à l'hexadécimal 7D00.

Voici trois façons d'obtenir un programme en langage machine dans la RAM afin qu'il soit accessible via un appel USRn :

INSTR

Recherche d'une fonction de chaîne de caractères
DISK BASIC

Syntaxe

INSTR([n,]exp1$,exp2$)

Paramètres

Nom Description
n Ce paramètre permet d'indiquer une position dans exp1$ où la recherche doit commencer ; si n n'est pas fourni, 1 est supposé. (La position 1 est définie comme le premier caractère de la chaîne de caractères.)
exp1$ Ce paramètre permet d'indiquer une chaîne de caractères à rechercher.
exp2$ Ce paramètre permet d'indiquer la sous-chaîne de caractères que vous voulez rechercher.

Cette fonction vous permet de rechercher dans une chaîne de caractères pour voir si elle contient une autre chaîne de caractères. Si c'est le cas, INSTR renvoie la position de départ de la sous-chaîne de caractères dans la chaîne de caractères cible ; sinon zéro est renvoyé. Notez que la sous-chaîne de caractères entière doit être contenue dans la chaîne de recherche, sinon zéro est renvoyé. Notez également que INSTR ne trouve que la première occurrence d'une sous-chaîne de caractères, en commençant à la position que vous spécifiez.

Exemples (si A$="ABCDEFG") :

Expression Résultat
INSTR(A$,"BCD") 2
INSTR(A$,"12") 0
INSTR(A$,"ABCDEFGH") 0
INSTR(3,"1232123","12") 5

Voir le programme EDIT sous MID$= pour un exemple d'utilisation de INSTR.

LINE INPUT

Entrée une ligne d'un clavier
DISK BASIC

Syntaxe

LINE INPUT["prompt"];var$

Paramètres

Nom Description
prompt Ce paramètre permet d'indiquer de message de prompt.
var$ Ce paramètre permet d'indiquer le nom étant attribué à la ligne que vous saisissez.

LINE INPUT (ou LINEINPUT - l'espace est facultatif) est similaire à INPUT, sauf :

LINE INPUT est un moyen pratique d'entrer des données de chaîne de caractères sans avoir à se soucier de la saisie accidentelle de délimiteurs - car seule la touche ENTER sert de délimiteur. Si vous voulez que n'importe puissant entrer des informations dans un programme sans instructions spéciales, utilisez LINE INPUT puis analysez la chaîne de caractères résultante.

Certaines situations nécessitent que vous saisissiez des virgules, des guillemets et des blancs de début dans le cadre des données. LINE INPUT convient bien dans de tels cas.

Exemples :

LINE INPUT A$

Saisissez A$ sans afficher aucun prompt.

LINE INPUT"NOM DE FAMILLE, PRENOM ?";N$

Affiche un message de prompt et entre des données. Les virgules ne termineront pas la chaîne de caractères d'entrée.

Essayez le programme suivant pour vous faire une idée de LINE INPUT :

100 ' PROGRAMME: LNINPUT
110 ' EXEMPLE D'UN INSTRUCTION LINEINPUT
120 '
130 CLEAR 300:CLS
140 PRINT TAB(15);"INSTRUCTION LINE INPUT":PRINT
150 PRINT:PRINT "*** ENTRER LE TEXTE ***"
151 '
152 ' ** DEMANDE LA CHAINE DE CARACTERES, L'AFFICHE ALORS ***
153 '
155 A$="" ' FIXE A$ A LA VALEUR NULLE
160 LINEINPUT "==>";A$
165 IF A$=""THEN END ' SI CHAINE DE CARACTERES TOUJOURS NULLE, ARRETEZ !
170 PRINT A$
180 GOTO 155

Ensuite, exécutez le programme :

RUNENTER

on obtiendra le résultat suivant :

               INSTRUCTION LINE INPUT

*** ENTRER LE TEXTE ***
==>                  TEXTE D'EXEMPLE
CE TEXTE A INTEGRE DES SAUTS DE LIGNE 
ET       DES    TABULATIONS. LINEINPUT PERMET AUSSI DELIMITER (,:"') ETC.ENTER
                  TEXTE D'EXEMPLE
CE TEXTE A INTEGRE DES SAUTS DE LIGNE 
ET       DES    TABULATIONS. LINEINPUT PERMET AUSSI DELIMITER (,:"') ETC.
==>ENTER
READY
>_

MID$=

Milieu
DISK BASIC

Syntaxe

MID$(var$,n1[,n2])=exp$

Paramètres

Nom Description
var$ Ce paramètre permet d'indiquer le nom de la chaîne de caractères à modifier.
n1 Ce paramètre permet d'indiquer la position de départ pour le remplacement
n2 Ce paramètre permet d'indiquer combien de caractères doivent être remplacés ; si n2 est omis, LEN(exp$) ou LEN(var$)-n1+1 est utilisé, selon la valeur la plus petite.

Description

L'instruction vous permet de remplacer n'importe quelle partie d'une chaîne par une sous-chaîne de caractères spécifiée, ce qui vous donne une puissante capacité d'édition de chaîne de caractères.

Notez que la longueur de la chaîne de caractères cible (var$) n'est jamais modifiée par l'instruction MID$=. Si la chaîne de caractères de remplacement, exp$, est trop longue pour tenir dans la portion spécifiée de var$, alors les caractères supplémentaires à droite de exp$ sont ignorés.

Cependant, si vous spécifiez le nombre de caractères à remplacer et que ce nombre est supérieur à la chaîne de caractères de remplacement, alors la longueur de la chaîne de caractères de remplacement, alors la longueur de la chaîne de caractères remplacement remplace la longueur que vous avez spécifiée.

Exemples

A$="ABCDEFG" au début de chaque exemple ci-dessous :

Numéro d'exemple Expression Résultant de A$
1 MID$(A$,3,4)="12345" AB1234G
2 MID$(A$,1,2)="" ABCDEFG
3 MID$(A$,5)="12345" ABCD123
4 MID$(A$,1,3)="***" ***DEFG

Dans l'exemple 2, la longueur de remplacement spécifiée dépasse la longueur de la chaîne de caractères de remplacement (étant zéro) ; par conséquent, la longueur de la chaîne de remplacement est utilisée. En effet, aucun caractère n'est remplacé.

Exemple de programme : EDIT

Ce programme accepte une chaîne de caractères initiale, demande une position de remplacement et une chaîne de remplacement. Ensuite, il effectue le remplacement MID$= et affiche la nouvelle chaîne de caractères. Tapez dans une position égale à zéro pour arrêter le programme.

100 ' PROGRAMME: EDIT
110 ' EXEMPLE DE FONCTION INSTR POUR L'EDITION DE TEXTE
115 '
120 CLEAR 800:CLS
130 PRINT TAB(15);"EDITEUR DE FONCTION DE CHAINE DE CARACTERES"
135 '
140 ' ****** DEMANDE LE TEXTE INITIAL ******
145 '
150 PRINT:PRINT"ENTRER LA CHAINE DE CARACTERES DE TEXTE"
160 S$="":LINE INPUT S$:IF S$=""THEN END
165 '
170 ' ****** DEMANDE LA DESTINATION ET LE REMPLACEMENT DE CHAINE DE CARACTERES *****
175 '
180 T$="":PRINT:LINE INPUT"CHAINE DE CARACTERES DE DESTINATION";T$
185 IF T$=""THEN END
190 LINE INPUT "CHAINE DE CARACTERES DE REMPLACEMENT";R$
195 IF LEN(T$)<>LEN(R$)THEN PRINT"NE PEUT PAS CHANGER LA LONGUEUR DE CHAINE DE CARACTERES":GOTO 180
200 ' ****** FABRIQUE LE REMPLACEMENT(S) ET AFFICHE LA NOUVELLE CHAINE DE CARACTERES
210 I=1 ' VARIABLE I POSITIONS AU POINT DE DÉBUT DE LA RECHERCHE
220 I=INSTR(I,S$,T$):IF I=0 THEN 150 'I=0 SI PAS TROUVE
230 MID$(S$,I)=R$ ' FABRIQUE LE REMPLACEMENT
240 PRINT"POSITION - ";I:PRINT S$
250 I=I+LEN(R$):GOTO 220 'POSITION AVANCE

Ensuite, exécutez le programme :

RUNENTER

on obtiendra le résultat suivant :

               EDITEUR DE FONCTION DE CHAINE DE CARACTERES

ENTRER LA CHAINE DE CARACTERES DE TEXTE
CHANGEZ "DISC" EN "DISK" CHAQUE FOIS QUE CELA SE PRODUIT... (DISC=>DISK)

DESTINATION DE CHAINE DE CARACTERES DISCENTER
REMPLACEMENT DE CHAINE DE CARACTERES DISKENTER
POSITION - 9
CHANGEZ "DISC" EN "DISK" CHAQUE FOIS QUE CELA SE PRODUIT... (DISC=>DISK)
POSITION - 48
CHANGEZ "DISC" EN "DISK" CHAQUE FOIS QUE CELA SE PRODUIT... (DISC=>DISK)

ENTRER LA CHAINE DE CARACTERES DE TEXTE INITIALEENTER
READY
>_

TIME$

Heure
DISK BASIC

Syntaxe

TIME$

TIME$ est une fonction sans paramètres - lorsqu'elle est exécutée, elle renvoie une valeur de chaîne de caractères composée de la date et de l'heure actuellement entreposées dans la zone de mémoire de l'horloge en temps réel. La chaîne de caractères comporte toujours 17 caractères et a le format suivant (mois/jour/année heure:minute:seconde) :

MM/DD/YY HH:MM:SS

L'heure apparaît au format 24 heures, par exemple, 13h30 apparaît sous la forme 13h30.

Pour régler l'heure et la date, passez en mode DOS READY et utilisez les commandes TIME et DATE du TRSDOS, comme suit (en supposant qu'il soit 15h30 le 1er juin 1979) :

TIME 15:30:00ENTER
DATE 01/01/79ENTER

Ou, vous pouvez définir l'heure et la date sous DISK BASIC, en introduisant les valeurs d'heure et de date dans les adresses appropriées.

TIME$ peut être imprimé ou utilisé en interne par votre programme dans des applications dédiées.

Exemples

1000 IF LEFT$(TIME$,15)="07/04/79 20:00"THEN 2000
1010 GOTO 1000
2000 REM ... C'EST 8PM LE 4 JUILLET 1979
2010 REM ... DÉMARRER LE FEU D'ARTIFICE

Le programme suivant, CLOCK, affichera l'heure et la date jusqu'à ce que vous appuyiez sur la touche @.

100 ' PROGRAMME: CLOCK
110 'EXEMPLE DE TIME$
120 '
130 CLS:PRINT CHR$(23) ' DEMANDE D:ANS 32 MODE DE CARACTERE
140 '
150 ' ***** AFFICHE L'HEURE ET LA DATE
160 '
170 PRINT @ 264,"L'HEURE TRS-80 EST ";
180 PRINT @ 458,"DATE :"; LEFT$(TIME$,8);
190 PRINT @ 586,"HEURE: "; RIGHT$(TIME$,8);
200 '
210 ' ****** ARRETE SI LA TOUCHE "@" N'EST PLUS ENFONCE ******
220 '
230 A$=INKEY$:IF A$="@"THEN END ELSE 180

USRn

Appel une sous-routine utilisateur externe
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

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 : Jeudi, le 23 février 2023