Philippe Bayvejiel
= =, Edimicro
RS SL a de. A É S ,
GUIDE DE L'ORIC
Philippe BAY VEJIEL est le pseudonyme des quatre auteurs de l’ouvrage : Michel BIRADES, Dominique JOLY, Philippe LE BITOUX, Jean-Marie VALLADE.
Cet ouvrage a été réalisé sous la direction de Benoît de MERLY.
© F.D.S./Edimicro 1983 Première édition
Imprimé en France. Droits mondiaux réservés.
« La loi du 11 mars 1957 n'autorisant. aux termes des alinéas 2 et 3 de l'article 41, d'une part, que les « copies ou reproductions strictement réservées à l'usage privé du copiste et non destinées à une utili- sation collective » et, d'autre part, que les analyses et les courtes citations dans un but d'exemple et d'il- lustration. « toute représentation ou reproduction intégrale, ou partielle. faite sans le consentement de l'auteur ou de ses ayants droit ou ayants cause, est illicite » (alinéa 1°" de l'article 40) ».
« Cette représentation ou reproduction, par quelque procédé que ce soit, constituerait une contrefaçon sanctionnée par les articles 425 et suivants du Code pénal ».
ISBN : 2-904457-02-X
EDIMICRO DÉPARTEMENT ÉDITIONS DE F.D.S. SARL
121-127, avenue d'Italie, 75013 Paris. Tél. 585.00.00
GUIDE DE L'ORIC
par
Philippe BAYVEJIEL
= = = Edimicro
Préface
Vous êtes ou vous serez bientôt, en possession d'un microordinateur Oric. Votre achat est justifié par des besoins personnels (curiosité, besoin de développer l'in- formatique familiale) ou professionnels (problèmes de paye, de comptabilité, de gestion de stocks).
Vous désirez maintenant apprendre à vous servir de votre machine, c'est-à-dire découvrir et utiliser au mieux toutes ses possibilités, et ainsi rentabiliser votre nouvelle acquisition. C'est 1à le but de ce guide.
A qui s'adresse le GUIDE DE L'ORIC ? Principalement à ceux qui n'ont que des connaissances très restreintes en informatique ou en programmation. Il s'agit donc avant tout d'une initiation, mais d'une initiation suffisamment poussée, pour vous permettre de programmer correctement.
Toutes les notions dont vous avez besoin sont abor- dées progressivement. A l'aide de programmes simples et commentés, vous assimilerez sans peine le maniement de la machine et vous maîtriserez le vocabulaire de base pour converser avec votre Oric. Ce vocabulaire sera ensuite approfondi pour vous permettre de faire des gra- phiques, de la musique ou des mathématiques.
Nous vous engageons, lors de votre apprentissage, à faire exécuter par Oric les exemples commentés, puis les modifier au gré de votre imagination. En effet, la pratique de l'ordinateur est, avant tout, expérimentale. Seule une utilisation effective vous permettra de pro- gresser rapidement et d'acquérir les quelques règles simples qui feront de vous un bon utilisateur.
A l'issue de la lecture de ce livre, vous aurez constaté que l'ensemble des possibilités de votre Oric n'a pas d'autres limites que celles de votre imagina- tion...
Table des matières
Chapitre 1 : Présentation générale de l'Oric
1.1
1.2
1.3
1.4
1.5
1.6
1.7
Introduction
Le clavier
L'unité centrale La sortie vidéo
La sortie cassette Les extensions
Mise en route
Chapitre 2 : Initiation à la programmation
2.1
2.2
Introduction 2.1.1 Stockage de l'information 2.1.2 Notion de langage - Le Basic
Mode direct - Mode différé
2.2.1 Introduction 2.2.2 Fonctionnement en mode direct - Les opérations élémentaires * addition * soustraction * multiplication * division * puissance
- Les ordres de priorité des opérateurs
—- Notion de variable
Les bases de la programmation - Découverte du langage Basic
2.3.1 Le premier programme 2.3.2 L'instruction GOTO 2.3.3 La commande LIST
— V -
11
11
13 15
16
16 18
26
26
30
2.3.4 CTRL-C, CONT 31 2.3.5 RESET 32 2.3.6 L'instruction INPUT 33 2.3.7 L'instruction PRINT 34 2.4 Commandes fondamentales 36
2.4.1 Connaître le contenu d'un programme -
La commande LIST 36 2.4.2 Effacement d'un programme -
La commande NEW 38 2.4.3 Lancement d'un programme -
La commande RUN 39 2.4.4 Fin d'un programme -
Les instructions STOP/END 40 2.4.5 Corrections et modifications
de programmes 40
- insertion d'une ligne
- suppression d'une ligne
— modification complète d'une ligne
- modification de quelques caractères sur
une ligne
2.5 Créez votre jeu en Basic 42 2.5.1 Présentation du jeu 42 2.5.2 Instruction IF ... THEN ... ELSE 43 2.5.3 Première version du jeu 46 2.5.4 Fonction RND 47 2.5.5 Fonction INT 48 2.5.6 L'instruction REPEAT ... UNTIL 49 2.5.7 Seconde version du jeu 50 2.5.8 L'instruction WAIT 50 2.5.9 L'instruction EXPLODE 50 2.5.10 Notion de boucle - FOR ... NEXT 51
2.6 Conclusion 52 Chapitre 3 : Le langage Basic de l'Oric 53 3.1 Généralités 53 3.2 Constantes - Variables - Indices 54 3.2.1 Les constantes 54
- les constantes numériques - les constantes alphanumériques
SANT =
3.4
3.5
3.7
3.2.2 Les variables simples — les chaînes de caractères - les variables entières — les variables réelles 3.2.3 Les tableaux — les tableaux de variables entières
- les tableaux de chaînes de caractères
— les tableaux de variables réelles Les opérateurs
Les opérateurs arithmétiques
Les opérateurs relationnels
Les opérateurs logiques
— action de AND
— action de OR
- action de NOT
3.3.4 Règles d'évaluation des expressions
3 3% 3
œ © S D
Les instructions Basic facultatives
3.4.1 CLEAR
3.4.2 DIM
3.4.3 END
3.4.4 Fonction FRE 3.4.5 Instruction LET 3.4.6 Arrêt STOP
3.4.7 Commentaires REM
Les instructions de transfert 3.5.1 Branchement inconditionnel — GOTO — ON ... GOTO 3.5.2 Transferts conditionnels — IF ... THEN ... ELSE Les boucles
3.6.1 Boucle FOR ... NEXT 3.6.2 Boucle REPEAT ... UNTIL
Les sous-programmes
3.7.1 Présentation -— GOSUB - RETURN 3.7.2 ON ... GOSUB
— VIT —
58
64
71 71
72 73
74
79
82
83
84 88
89
89 91
3.7.3 Appel de sous-programmes assembleurs - CALL 3.7.4 Fonctions assembleurs DEF ... USR
3.8 Les fonctions
3.8.1 Fonctions numériques internes
- génération d'un nombre aléatoire
- fonctions mathématiques simples
- fonctions mathématiques complexes 3.8.2 Fonctions de traitement des chaînes de
caractères
- conversion code ASCII/caractère
- conversion chiffre/lettre
- extraction/traitement de chaînes 3.8.3 Création de fonctions utilisateurs
3.9 Les entrées - sorties
3.9.1 Entrées de données - L'instruction INPUT 3.9.2 Saisie d'un caractère - L'instruction GET 3.9.3 Saisie au vol d'un caractère - la fonction KEYS 3.9.4 Lecture des données dans le programme READ ... DATA 3.9.5 L'instruction RESTORE
3.10 Conclusions
Chapitre 4 : Possibilités graphiques de l'Oric 4.1 Introduction 4.2 Les modes graphiques 4.2.1 Les modes basse-résolution TEXT, LORES O0, LORES 1 4.2.2 Le mode haute-résolution HIRES 4.3 Les commandes graphiques 4.3.1 Commandes graphiques basse-résolution - affichage d'un caractère PLOT
- lecture du caractère affiché SCRN
- VIII -
92 92
92
92
93
95
97
97
98
98
99
100
101
101
102
102
106
108
108
4.3.2
Commandes graphiques haute-résolution — positionnement du curseur CURSET
- déplacement du curseur CURMOV
— tracé d'une droite DRAW
- utilisation de pointillés PATTERN
- affichage d'un caractère CHAR
- tracé d'un cercle CIRCLE — obtention de la couleur
d'un point POINT — remplissage de lignes FILL
- effets spéciaux
4.4 Graphiques avancés
Chapitre 5
: Les sons et l'Oric
5.1 Introduction
5.2 Les sons prédéfinis
5.3 Les commandes de sons
5.3.1
5.3.3
SOUND (canal, période, volume)
— le canal
- la période
— le volume
MUSIC (canal, octave, note, volume) — le canal
— l'octave
- la note
- le volume
PLAY (combinaison des canaux,
du bruit, mode de sortie, période) — combinaison des canaux de sons purs — combinaison de bruits
- mode de sortie
- la durée du son
= TX —
114
127
135
135
136
136
137
138
141
ANNEXES
A) Récapitulation des fonctions et commandes du basic
B) Les messages d'erreur
C) Utilisation d'un magnétophone à cassettes
D) Utilisation d'une imprimante
E) Numérotation hexadécimale - représentation des nombres
F) Tableau des codes ASCII
G) Carte mémoire de l'Oric
H) Rôle des attributs graphiques
144
145
178
181
183
187
188
189
CHAPITRE 1
Présentation
générale de l'oric
1.1 INTRODUCTION
L'Oric est un microordinateur : il est extrêmement petit par rapport aux premiers ordinateurs et son “coeur” est un microprocesseur. Ainsi que vous pouvez le voir sur la photo A, l'Oric a un clavier utilisé pour “entrer” des données et de nombreuses prises pour relier la télévision et les extensions. À l'intérieur sont placés les circuits intégrés parmi lesquels figurent le microprocesseur, les mémoires... (voir paragraphe 1.3). Au début, vous n'avez besoin d'aucune connaissance en électronique pour utili- ser votre Oric.
La sortie vidéo est présente à l'arrière de l'appa- reil et délivre des signaux RVB que l'on transmet à la télévision par l'intermédiaire de la prise Péritel, four- nie avec l'Oric (voir paragraphe 1.4) et qui est instal- lée obligatoirement sur tous les téléviseurs en couleurs produits depuis 1980, en France.
La photo A montre un Oric 1 avec un gros plan sur le clavier.
ASSSSSSSSSssn
Lo Lo rar Lord
x EU
PHOTO À : LE SYSTEME ORIC
Votre microordinateur Oric offre de nombreuses pos- sibilités graphiques et sonores. Avec un affichage gra- phique haute-résolution de 200 x 240 points sur l'écran, plusieurs couleurs, vous pourrez utiliser des jeux graphiques, tracer des courbes sur l'écran.... Avec la sortie sonore en connexion avec une chaîne hi-fi, vous pourrez composer de la musique...
Avec l'Oric, vous pouvez vous contenter de programmes tout faits (jeux, gestion familiale...), mais vous pouvez aussi composer vos programmes, utiliser des cassettes, communiquer avec d'autres Oric.... Votre microordinateur s'avérera bientôt indispensable.
1.2 LE CLAVIER DE L'ORIC
Le clavier incorporé sur la face avant du boîtier comporte cinquante-sept touches. Il permettra de générer
les lettres majuscules et minuscules, les touches fonc- tions utilitaires (ESC, RETURN, DEL...), les caractères spéciaux (ponctuation, opérations...). Il comporte en outre une barre centrale permettant de générer des blancs, quatre touches situées de part et d'autre de la barre centrale et permettant de se déplacer sur l'écran (gauche/droite/bas/haut). Toutes les touches sont à répé- tition automatique, c'est-à-dire qu'il suffit de laisser le doigt appuyé sur la touche pour répéter le caractère plusieurs fois.
Les touches du clavier de l'Oric sont tactiles. Vous sentirez avec votre doigt qu'une touche sera enfoncée, et vous entendrez de plus un léger bruit caractéristique. Cela permet par exemple de compter à l'oreille le nombre de caractères, sans regarder le clavier.
L'Oric ayant été créé en Angleterre, la disposition des touches sur le clavier est identique à celle des machines à écrire anglaises (QWERTY). Toutefois, ceci ne doit pas vous gêner si vous connaissez les machines à écrire françaises, la différence étant limitée aux let- tres À, Z, Q, W, et M.
Le clavier de l'Oric est simple d'emploi et vous se- rez vite familiarisé avec lui.
PHOTO B : VUE DU CLAVIER
— 3 -
1.3 UNITE CENTRALE
L'Oric est avant tout une machine à traiter l'infor- mation. Elle reçoit, stocke, traite et communique des données avec le clavier, un téléviseur couleur, ou avec un magnétophone à cassettes.
UNITE Clavier
Magnétophone à cassettes
CENTRALE
Téléviseur couleur
FIGURE 1 : STRUCTURE DE L'ORIC
Le coeur de votre microordinateur est appelé unité centrale (en anglais Central Processor Unit, ou CPU en abrégé). Cette unité centrale supervise le fonctionnement du système Oric tout entier.
Elle décide quand aller chercher les données au cla- vier ou en envoyer sur l'écran, sur la cassette... Elle exécute les programmes que vous lui demandez.
L'unité centrale est organisée autour d'un simple circuit intégré (boîtier noir muni de pattes) appelé microprocesseur. Ce boîtier fait les calculs, va chercher les données et les range. Pour pouvoir travailler assez rapidement, le microprocesseur ne va pas demander une à une les données au clavier ; il a besoin pour cela d'au- tres circuits, appelés mémoires, qui contiennent le pro- gramme et la plupart des données utiles au programme.
Mémoire RAM Entrées - Interface Microprocesseur ——— Sorties
Mémoire ROM
FIGURE 2 : UNITE CENTRALE
Deux types de mémoire existent et sont représentées sur la figure 2 :
- mémoire ROM (Read Only Memory) ou mémoire morte ; - mémoire RAM (Random Access Memory) ou mémoire vive.
Une mémoire morte est un stock d'instructions, de données... dont le contenu est permanent, n'est pas effa- cé lorsque l'on coupe le courant, et qui contient, par exemple, des programmes de communication avec le clavier. Le contenu d'une mémoire morte de l'Oric est défini par le constructeur de la machine et vous ne pourrez y tou- cher.
- 5 -
Dans une mémoire RAM (ou vive), on peut écrire, lire ou effacer de l'information aussi souvent qu'on le sou- haite ; elle contiendra, par exemple, les programmes que vous taperez, mais elle sera effacée par toute coupure du courant.
Le microprocesseur de l'Oric est le même que celui de l'Apple II ou du Vic 20. La taille des mémoires de l'Oric
«
peut varier de 16 000 à 48 000 caractères en mémoire vive.
La mémoire morte contient l'équivalent de 16 000 ca- ractères pour stocker le langage de programmation Basic auquel nous vous initierons aux chapitres 2 et 3.
Dans la suite de ce livre, nous utiliserons le symbo- le K pour représenter le chiffre 1024 (= 2 ).
Ainsi, par exemple, 16 k = 16.384 soit 16.000 envi- ron.
La photo C, ci-dessous, montre l'intérieur de votre Oric. Le microprocesseur, les mémoires RAM, les mémoires ROM ainsi que le haut-parleur y sont clairement visibles.
ns
4
È
4!
;
sonne nnaennr
55: Li
s. +
ë
PHOTO C : STRUCTURE INTERNE DE L'ORIC
— 6 —
1.4 SORTIE VIDEO
Deux prises existent sur la face arrière de l'Oric pour le relier à un téléviseur couleur :
Prise’ d'antenne pour téléviseur Pal Secam anglais
Prise Péritel pour téléviseur
Vous disposez donc de deux options :
a. branchement sur l'entrée Péritel pour téléviseur couleur
b. branchement sur l'entrée Prise d'antenne pour téléviseur anglais.
La première solution vous donnera une qualité net- tement meilleure que la seconde (couleurs, netteté...).
Si vous n'avez pas de prise Péritel sur votre télévi- seur, il est tout à fait possible de la faire installer par un revendeur spécialisé,
1.5 SORTIE CASSETTE
La connection se fait par l'intermédiaire d'une prise DIN. C'est le format classique Tangerine qui est utilisé.
Les vitesses d'enregistrement vont de 40 à 300 caractères par seconde. Un circuit spécial de l'Oric élimine les bruits parasites. Tous les types d'informations peuvent
être sauvegardés (programmes, données, blocs mémoire...).
Il serait prématuré d'énumérer ici les commandes spé- cifiques à l'interface cassette, attendu que vous n'avez encore aucun programme ou exécution de programme à sauve- garder sur cassette. Une annexe sera consacrée à ces com- mandes (de même pour la sortie imprimante), et vous vous y reporterez. Pour l'heure, nous nous contenterons d'une description technique.
1.6 EXTENSIONS
Reportez-vous à la figure 1 de la page suivante. Vous pouvez y voir, à côté du branchement imprimante, un branchement pour extensions. Ces possibilités d'extension sont des connexions de cartouches ROM par exemple, c'est- à-dire que vous pouvez brancher une ligne pour étendre les mémoires. Vous pouvez aussi connecter des cartouches de jeux, un lecteur de disques, et bien sûr un modem (mo- dulateur-démodulateur) qui transformera les signaux codés constituant votre programme pour les rendre aptes au transport par ligne téléphonique. C'est le système Prestel Mailbox qui est utilisé.
1.7 MISE EN ROUTE
Oric n'est déjà plus un inconnu, mais il reste à le mettre en route.
Vous vous trouvez devant :
— l'ordinateur, avec son clavier ;
- deux adaptateurs . le plus gros sert à l'alimentation, . le plus petit fournit un voltage indispensable pour permuter la prise Péritel en mode vidéo. L'a- limentation Péritel permet de sélectionner l'entrée RVB parmi les trois entrées possible.
- une prise Péritel. Selon l'importateur d'Oric, la prise Péritel peut intégrer le petit adaptateur précédent.
Port d'extension
Branchement téléviseur sur prise
d'antenne Alimentation
Branchement de l'imprimante
Prise 5 broches Prise 7 broches Péritel pour cassette téléviseur ou moniteur FIGURE ll
Sur l'extrémité de la prise Péritel correspondant au
récepteur, vous enfichez la prise en croix reliée au plus petit des deux adaptateurs.
Oric n'a pas de touche ARRET/MARCHE.
Il faut couper l'alimentation pour l'arrêter.
Vos branchements faits,
vous devez voir apparaître sur l'écran :
ORIC EXTENDED BASIC VI1.C (C) 1983 TANGERINE
..+. BYTES FREE
Ready
FIGURE 2
— 9 —
Voilà, vous êtes prêt à découvrir le monde de l'in- formatique.
Que vos goûts vous conduisent vers les mathématiques,
la gestion, le dessin, la musique ou l'informatique en elle-même, vous allez devenir plus efficace.
_— 10 -
CHAPITRE 2
Initiation
à la programmation
2.1 INTRODUCTION
Si vous avez suivi les instructions du chapitre con- cernant la mise en route, vous savez maintenant effectuer rapidement les branchements nécessaires.
Voici donc l'appareil sous tension, convenablement relié à votre récepteur de télévision. Si vous n'avez pas fait d'erreur de branchement, vous voyez apparaître sur l'écran, en noir sur fond blanc
ORIC EXTENDED BASIC VI1.0 (C) 1983 TANGERINE 47870(*) BYTES FREE Ready
Si tel n'était pas le cas, reportez-vous au chapitre 1.
Le rectangle noir clignotant, qui apparaît sur le bord supérieur gauche de l'écran, sous le mot Ready, s'appelle le curseur. Il détermine l'emplacement du ca- ractère que l'on veut écrire, et se déplace au fur et à mesure sur la ligne.
(*) Ce nombre peut être inférieur, selon la version
d'Oric en présence. — 11 -
Essayons par exemple de taper au clavier
BONJOUR
Le mot BONJOUR s'écrit sur l'écran au fur et à mesure que nous le tapons. Oric va-t-il nous répondre ?
Nous avons terminé, et... il ne se passe apparemment rien. En fait, pour qu'Oric prenne en compte une ligne que l'on vient de taper, il faut le lui demander en ap- puyant sur la touche marquée [RETURN].
Oric répond alors ? SYNTAX ERROR Ready
Que s'est-il passé ? L'ordinateur a lu notre message, a constaté qu'il n'était pas écrit suivant la “bonne” syntaxe et nous a signalé le fait par un message d'er- reur.
Tapons maintenant PRINT "BONJOUR"
Pour taper les guillemets il faut enfoncer l'une des touches [SHIFT]J, la maintenir, et appuyer en même temps sur la touche marquée [,"]. De manière générale, il faut procéder de la même façon pour obtenir le caractère du haut sur les touches à double fonction.
Appuyons ensuite sur [RETURN].
En principe, tout message que vous taperez devra être suivi de la touche [RETURN] ; nous vous le rappellerons d'abord systématiquement puis, peu à peu, nous l'omet- trons. Elle sera sous-entendue mais devra toujours être tapée.
Si vous avez composé exactement les lettres ci-des- sus, sans oublier les guillemets, vous obtenez immédiate- ment sur l'écran
BONJOUR
Ready — 12 -
Oric a imprimé BONJOUR et nous informe, en affichant Ready, qu'il est prêt à enregistrer d'autres messages.
Nous voyons donc que pour communiquer avec Oric, il faudra toujours taper nos messages en respectant rigou- reusement une certaine syntaxe, qui fonde en fait un vé- ritable langage.
Avant de voir plus précisément ce qu'est ce langage, il faut introduire un certain nombre de notions :
2.1.1 Stockage de l'information - Bit - Octet
Oric est un microordinateur, dérivé des grands ordi- nateurs qui fonctionnent actuellement dans le monde in- dustriel. Mais ne nous y trompons pas : s'il a une taille très réduite, son principe de fonctionnement est en tout point semblable à celui de ses "aînés". Comme eux, c'est une machine de traitement automatique de données.
Et une des opérations essentielles qu'Oric — comme tout ordinateur -— doit pouvoir effectuer sur l'informa- tion, est sa mémorisation.
A un autre niveau, c'est ce qui se passe lorsque vous mettez un nombre en mémoire dans votre calculatrice de poche.
La meilleure méthode que l'on connaisse actuellement pour mémoriser une information est un codage binaire, c'est-à-dire qui réduit tout élément à deux états bien distincts. Ce peut être par exemple l'absence ou la présence de trou dans une carte perforée, un élément aimanté dans un sens ou dans l'autre.
Oric, lui, utilise des éléments de circuits électro- niques qui peuvent être portés à une tension de 5V, ou bien rester à O.
L'information contenue dans un tel élément s'appelle BIT (abréviation de l'expression anglaise BINARY DIGIT, qui signifie chiffre binaire) et contient en quelque sorte la réponse par oui ou par non à une certai- ne question.
Mais un seul BIT contient une information trop “petite pour être manipulée aisément. C'est pourquoi on les regroupe généralement par paquets de 8, ou OCTETS.
11 y a une remarque intéressante à faire ici. On se souvient qu'Oric, dès qu'on le met sous tension, affiche:
47870 BYTES FREE
Or en anglais OCTET se dit BYTE. Si l'on sait que FREE signifie LIBRE, on voit que la mémoire d'Oric a une capacité de 47870 octets.
En pratique, sachez que sur un octet il est possible de représenter les nombres inférieurs à 256 ou les carac- tères du clavier. Les autres nombres seront représentés sur plusieurs octets.
Les lecteurs intéressés par ce codage peuvent lire la suite de ce paragraphe. Les autres personnes passeront au paragraphe 2.1.2.
Un octet étant un paquet de 8 bits, supposons que l'on représente les deux états que peut prendre un bit par O et 1. Un octet pourra alors s'écrire comme une succession de huit O0 ou 1 ; par exemple 00100010, ou 11101001... En fait, comme il y a deux possibili- tés pour chaque bit, on a 256 possibilités différen- tes pour un octet.
On peut maintenant comprendre comment un OCTET pourra représenter un nombre : il suffit de considérer que la suite de huit O0 ou 1 qui constitue un octet est un nombre écrit dans le système de numérotation binaire.
Ainsi 00100010 représentera 5
0 207-000 de fre 27 40
x 2 + 0 x 2. 002 Le DE Ox20 0137: 2e
2
Cela n'a absolument rien de mystérieux. Nous faisons chaque jour la même chose lorsque nous écri- vos un nombre en base dix. Par exemple 534 vaut 5 x
1024 3% l0 HAE 107
= JA =
Mais avec notre convention, on s'aperçoit que le nombre le plus grand qu'on puisse écrire est 11111111 = 255. Pour pouvoir représenter des nombres plus grands que 255, il faudra qu'un nombre occupe plus d'un octet, mais le principe reste le même.
Stocker des nombres est donc finalement relative- ment facile. Mais comment faire pour stocker des lettres ou des caractères ? Là encore, rien de plus simple. Il suffit de considérer par exemple les codes ASCII où À = 01000001, B = 01000010, et ainsi de sui- te pour toutes les lettres. Comme il y a 256 possi- bilités dans un octet, on peut avoir un jeu de 256 caractères différents, ce qui permet de représenter toutes les lettres, minuscules et majuscules, les chiffres, les caractères de ponctuation, etc.
2.1.2 Notion de langage — Le Basic
Comme on peut le penser d'après la façon de stocker l'information, le seul langage qu'Oric “comprenne” vrai- ment est le langage binaire, composé d'une succession de BITS, et qu'on appelle encore “langage machine".
Cela signifie-t-il que nous sommes obligés d'intro- duire toutes nos commandes et instructions sous la forme d'une succession de 0 et de 1 ? Heureusement non ! Ce se- rait beaucoup trop compliqué à écrire et à comprendre (du moins pour nous, mais pas pour la machine, qui est litté- ralement infatigable).
Pour nous éviter cette peine, il existe ce que l'on appelle des langages évolués. Ce sont d'autres langages de programmation que le langage machine, mais qui sont beaucoup plus proches du langage humain et des notations mathématiques usuelles. Par suite, ils sont beaucoup plus aisés d'emploi.
Il existe un certain nombre de tels langages, chacun étant plus ou moins adapté à un usage spécifique. Parmi les plus connus, on peut citer FORTRAN, COBOL, PASCAL, PL1, ... et BASIC, qui est le langage employé par Oric.
BASIC est le langage actuellement le plus répandu sur
- 15 -
s
les microordinateurs. Sa très grande diffusion tient à sa facilité d'apprentissage : BASIC est en effet le langage le plus facile à apprendre et à utiliser par les débu- tants.
Il a été créé en 1964 pour permettre l'apprentissage facile de la programmation, et son nom est l'abréviation de Beginner's All purpose Symbolic Instruction Code, ce qui signifie : codage symbolique des instructions
d'usage général pour les débutants.
Nous savons donc qu'Oric “comprend” le BASIC ; ïil nous reste maintenant à apprendre nous-même ce langage, pour pouvoir utiliser notre microordinateur. C'est le but des chapitres qui suivent. Nous verrons que ce n'est pas très difficile, car BASIC est un langage bien plus facile à apprendre qu'une langue étrangère : il ne comprend en effet qu'une centaine de mots !
Remarquons que BASIC est susceptible de varier légè- rement d'un microordinateur à l'autre, un peu de la même façon, par exemple, qu'une langue est susceptible d'avoir des variantes locales d'une région à l'autre.
Ce n'est pas grave dans la mesure où l'on programme toujours sur le mêm microordinateur. Mais on peut être amené à changer de machine. (Attention : tous les Orics “parlent” bien le même BASIC ; les différences sont sen- sibles entre des machines de constructeurs différents). Aussi ce chapitre présente-t-il les instructions de base communes à toutes les versions de BASIC. Les instructions plus élaborées, ainsi que les instructions BASIC spécifi- ques à Oric sont présentées dans le chapitre suivant.
2.2 MODE DIRECT -— MODE DIFFERE -— NOTION DE PROGRAMME 2.2.1 Introduction
Nous avons déjà rencontré une instruction BASIC, c'est l'instruction PRINT. Comme son nom l'indique (en anglais, PRINT signifie imprimer) elle permet d'écrire sur l'écran. Son emploi est très simple. De la même façon que nous avons su faire écrire BONJOUR, nous pourrons écrire une ligne de texte quelconque en tapant cette li- gne après PRINT, sans oublier de mettre des guillemets (") de part et d'autre de la ligne de texte, comme dans l'exemple suivant
_- 16 -
PRINT "CECI EST UNE LIGNE DE TEXTE" Tapons maintenant : PRINT 2 + 3
(Pour taper + il faut appuyer simultanément sur [SHIFT] et sur la touche [+=]).
Appuyons sur [RETURN]
11 s'affiche alors immédiatement sur l'écran 5 Ready
Oric a effectué le calcul et a immédiatement imprimé le résultat.
Ce mode de fonctionnement, dans lequel une instruc- tion est exécutée immédiatement après avoir été tapée, est dit “mode immédiat", ou “mode d'exécution immédiate”, ou encore ‘mode direct".
C'est très proche du fonctionnement de votre calcula- trice de poche où les calculs se font au fur et à mesure que vous les rentrez. La seul différence, c'est qu'il faut d'abord taper PRINT.
Nous y reviendrons. Avant cela, il faut voir le se- cond mode de fonctionnement.
Tapons 20 PRINT 2 + 3
Appuyons sur [RETURN] ... cette fois, il ne se passe rien !
Tapons encore 10 PRINT "BONJOUR" Appuyons sur [RETURN] : toujours rien. Serait-ce une
panne ?
17
Mais tapons maintenant : RUN et appuyons sur [RETURN]. Il apparaît alors à l'écran :
BONJOUR 5
Ready
Expliquons ce qui s'est passé. Oric, au lieu d'exécu- ter immédiatement les instructions, les a mises en mémoi- re où elles constituent ce que l'on appelle un PROGRAMME.
En tapant RUN, nous avons signalé à Oric qu'il pou- vait exécuter ce programme, c'est-à-dire exécuter les instructions les unes après les autres. On dit qu'il a
un
fonctionné suivant le “mode différé”, ou “mode program-
mé", son second mode de fonctionnement.
Ce mode se caractérise par la présence d'un numéro en tête de chaque ligne. C'est ce qui permet de déterminer le mode dans lequel on se trouve, car, avec quelques ex- ceptions, toutes les instructions utilisables en mode programmé le sont aussi en mode direct.
Le numéro en tête de ligne a aussi une autre utilité. I1 fixe l'ordre dans lequel seront exécutées les instruc- tions. Nous avons pu remarquer en effet que la ligne 10 a été exécutée avant la ligne 20, bien qu'elle ait été ta- pée après. En mode programmé, l'ordre dans lequel on tape les lignes n'a donc aucune importance ; Oric exécutera de toute façon les instructions par ordre de numéros de li- gne croissants.
Nous verrons bien vite que le mode de fonctionnement le plus intéressant d'Oric est le mode programmé. Néanmoins, pour mieux nous familiariser avec son fonc- tionnement, nous allons nous intéresser d'abord au mode direct.
2.2.2 Fonctionnement en mode direct Nous allons, en fait, apprendre d'abord à nous servir d'Oric comme d'une calculatrice de poche, en apprenant à
évaluer les expressions arithmétiques.
sA8"=
- Les opérations élémentaires + ADDITION
Nous savons déjà additionner : pour ajouter 12 à 27, nous avons compris qu'il suffit de taper
PRINT 12 + 27
N'oublions pas d'appuyer sur [RETURN] (ce sera désor- mais sous-entendu). Oric affiche aussitôt le résultat
39 Ready
Rappelons que READY (mot anglais pour PRET) si- gnifie qu'Oric a terminé d'exécuter les instructions que nous lui avions fournies et qu'il se tient prêt à enre- gistrer de nouvelles commandes.
SOUSTRACTION
La soustraction ne fait pas plus de difficulté ; es- sayons par exemple
PRINT 8 - 2.5
On obtient 5.5. Notons le point à la place de la vir- gule. Oric, comme tous les ordinateurs, utilise la nota- tion arithmétique anglo-saxonne, dans laquelle on écrit 12.25 au lieu de 12,25.
Supposons qu'à la ligne précédente, nous nous soyons trompés et ayons tapé : PRINT 8 - 2,5
Nous obtenons alors 6 5
Oric a considéré la virgule comme un séparateur entre deux valeurs. Il comprend qu'il faut imprimer 8 - 2, soit 6, puis la valeur 5. Ce n'est pas du tout ce que nous voulions obtenir, et cela nous montre combien il faut être précis dans ce que nous tapons Oric obéit à la lettre à ce que nous lui commandons.
_- 19 —-
Néanmoins, malgré tout le soin que nous apportons en tapant nos messages, une erreur est toujours possible. Comment faire pour la corriger ? Reprenons cet exemple :
PRINT 8 - 2,5
mais nous n'avons pas encore appuyé sur la touche [RETURN ].
Pour corriger notre erreur, et remplacer la virgule par un point, il faut utiliser la touche [DEL] : elle permet de faire reculer le curseur.
Dans notre exemple, appuyons une fois sur [DEL] : le curseur recule d'un cran et 5 disparaît. Appuyons une au- tre fois, et la virgule disparaît. Nous pouvons alors ta- per un point et retaper le 5 : notre erreur est réparée.
ATTENTION : Il ne faut pas utiliser la touche [e-| ; le curseur recule bien aussi, comme avec la touche [DEL] ; on pourra même remplacer la virgule par un point, et cela sans que le 5 s'efface ; mais en fait ces modifications n'auront eu lieu que sur l'écran : Oric ne les aura pas prises en compte.
L'usage de la touche [é—] et des touches analogues sera abordé ultérieurement.
Si nous avons fait beaucoup d'erreurs dans la même ligne et que nous préférons la retaper entièrement, nous pouvons appuyer simultanément sur [CTRL] et sur [X]. Le caractère \ apparaît au bout de la ligne, dont il ne sera plus tenu compte : bien qu'elle soit toujours imprimée sur l'écran, Oric considère la ligne comme effacée.
Nous pouvons alors la retaper car, simultanément avec l'apparition du caractère \ , le curseur a sauté au début de la ligne suivante.
+ MULTIPLICATION
Le symbole de la multiplication est * (qu'on obtient en appuyant simultanément sur les touches [SHIFT] et
[8]). PRINT 4 * 16 donne 64
— 20 -
Peut-être trouvez-vous un peu fastidieux de taper les cinq lettres du mot PRINT avant chaque opération ? En fait, il suffit de taper [?] au lieu de PRINT. C'en est en quelque sorte une abréviation qui accélère la frappe. Oric comprend les deux termes de la même façon. Dans la suite, nous utiliserons indifféremment ? ou PRINT.
+ DIVISION
Pour effectuer une division, le symbole est / qui se prononce SLASH.
Essayons % 2/3
N'oublions pas d'appuyer sur [RETURN] ! On obtient : .666666667 Le zéro avant le point décimal est omis, mais on pourra remarquer qu'il est barré pour ne pas le confondre avec la lettre O. + PUISSANCE Il reste une dernière opération élémentaire, très utile, l'élévation à la puissance. Son symbole est T (que l'on obtient par [SHIFT] [6]). PRINT 4 1 3 3 donne 64 (= 4°). On peut ainsi obtenir par exemple la racine carrée par : ? 25 1 0.5 qui donne 5
Signalons qu'il existe une autre possibilité : la fonction SQR. On l'utilise de la façon suivante :
? SQR (25)
Elle donne aussi la racine carrée, mais le calcul en est plus rapide.
— 21 -
- Les ordres de priorité des opérateurs
Nous avons donc découvert les 5 opérations mathémati- ques fondamentales :
LE nr ue 6 À
Mais nous n'avons vu que des exemples très simples. On peut calculer des expressions plus compliquées conte- nant plusieurs opérateurs. Essayons les quelques exemples suivants :
?25+3*%24 28:26:02 2 5% 68 /-& 22*37T2
Le premier a pour résultat 17 (= 5 + 12) et non pas 32 (= 8 * 4) car Oric évalue d'abord la multiplication. On dit que la multiplication est prioritaire sur l'addi- tion.
De même, la deuxième expression donne 5 : on évalue d'abord la division.
Pour la troisième, on obtient 10 : les calculs sont effectués dans l'ordre où ils se présentent, car * et / ont même priorité.
Enfin le quatrième exemple a pour résultat 18 : l'élévation à la puissance est effectuée en premier car elle est prioritaire sur la multiplication.
Pour nous résumer, il faut retenir que les calculs sont effectués de gauche à droite, sauf s'il y a des priorités à respecter entre les divers opérateurs. Ces priorités sont les suivantes :
est toujours effectué en premier, puis qui ont la même priorité, et enfin qui sont aussi “ex aequo".
+ + —
à
Pour changer l'ordre de priorité, on emploie des parenthèses, car une expression entre parenthèses est toujours évaluée la première. Par exemple :
— 22 —
(4 + 3) * 2 donne 14 alors que 4 + 3 * 2 donne 10 (2 * 3) T 2 donne 36 alors que 2 * 3 T 2 donne 18 7 - (3 + 2) donne 2 alors que 7 - 3 + 2 donne 6
Il peut y avoir des parenthèses emboîtées, mais alors il faut veiller à ce qu'il y ait bien autant de pa- renthèses ouvrantes “(" que de parenthèses fermantes "“})", pour que l'expression ait un sens.
Les parenthèses emboîtées suivent la règle de la plus
intérieure vers la plus extérieure, et de la gauche vers la droite.
Ainsi, (& +2) #37 (7 - (3 + 2)) est correct. Mais ((8 - 6) * ((3 - 2) T 6) / 2 provoquera un
? SYNTAX ERROR
- Notion de variable
Au stade où nous en sommes, nous savons évaluer des expressions, même très compliquées, mais tout ce que nous pouvons en faire, c'est faire imprimer leur valeur sur l'écran.
En fait, il est possible de mettre ces valeurs en mé- moire pour les utiliser ultérieurement. Comment faire ? Eh bien, il suffit de donner un nom à l'expression que l'on veut mettre en mémoire, comme sur cet exemple :
B=2+3 Même après avoir appuyé sur [RETURN], il n'apparaît rien d'autre que Ready sur l'écran. Oric a calculé l'expression et lui a attribué automatiquement un emplacement en mémoire qu'il a nommé B.
On dit que l'on a constitué une variable de nom B.
On peut maintenant utiliser cette variable dans d'au- tres expressions ; tapons
_- 23 -
PRINT B
nous obtenons
Tapons PRINT 3 * B nous obtenons
15
Nous pourrions imaginer ainsi un grand nombre d'ex- pressions, utilisant la variable B, mais sa valeur ne sera jamais détruite (c'est-à-dire qu'elle ne sera jamais effacée de la mémoire) sauf lors d'une nouvelle instruc- tion d'affectation ; si nous tapons
B = 3 alors PRINT B + 1 donne 4
REMARQUE : Au lieu de taper B = 3 nous aurions pu écrire LET B = 3 (ce qui signifie “affecter à B la valeur 3"). Ces deux formes sont absolument équiva- lentes, Oric ne fera pas de différence. En fait, il est plus simple de taper B = 3 ; si nous signalons l'instruction LET c'est que, avec certains BASIC implantés sur d'autres microordinateurs, cette ins- truction est obligatoire, ce qui n'est pas le cas pour Oric.
Nous avons considéré la variable B, mais nous aurions pu aussi l'appeler C, ou A, ou NOMBRE.... En fait les noms des variables sont pratiquement arbitraires. Il suf- fit de respecter les 3 règles suivantes
- Le premier caractère doit être une lettre : A, B ... Z - Les caractères suivants peuvent être des lettres ou des
chiffres (Ex : B2, NOMBRE, K12J4...).
a 94 =
- Le nom de la variable ne doit pas contenir un des mots particuliers au langage BASIC, qu'on appelle MOTS-CLES. Appeler une variable LETTRE est interdit, car il y a LET, mot-clé que nous venons de voir. De même CHIFFRE n'est pas utilisable, car il contient IF, mot-clé que nous verrons par la suite.
La liste complète de ces mots-clés est donnée en annexe A.
Une précision importante à retenir, car elle peut être la source de nombreuses erreurs, est la suivante
Quel que soit le nombre de caractères que comporte le nom d'une variable, Oric ne prend en compte que les deux premiers.
Des variables distinctes comme NOMBRE et NOM sont considérées comme identiques, car les 2 premières lettres sont semblables.
Alors, si nous tapons
NOMBRE = 2 NOM = 10
et si ensuite nous faisons PRINT NOMBRE nous obtenons 10
et non pas 2. En faisant NOM = 10, Oric a remplacé la va- leur 2 qu'avait la variable "NO" (seules lettres qu'a “vues” Oric) par la valeur 10. En faisant écrire NOMBRE (c'est-à-dire pour Oric, toujours la variable “NO") nous avons naturellement obtenu la dernière valeur entrée.
Nous sommes maintenant armés pour aborder le mode programmé, ce qui devrait se révéler plus intéressant que ce qui précède, peut-être un peu rébarbatif, mais absolu- ment nécessaire.
_- 25 -
2.3 LES BASES DE LA PROGRAMMATION — DECOUVERTE DU LANGAGE BASIC
2.3.1 Le premier programme
Nous savons déjà ce qu'est un programme ; nous avons vu que c'est un ensemble d'instructions, dont chaque li- gne comporte un numéro en tête, et qui sont mises en mé- moire.
On lance l'exécution en tapant RUN ; les instructions sont alors exécutées les unes après les autres, par ordre de numéros de ligne croissants.
Notre premier programme va être très simple. Il a simplement pour but de calculer la circonférence C d'un cercle de diamètre D (C = D).
10 INPUT D 20 C= PI * D 30 PRINT C
Malgré sa simplicité, ce petit programme comporte les étapes fondamentales de tout traitement d'information :
. L'ACQUISITION DES DONNEES à la ligne 10. Nous y dé- couvrons un nouveau mot de BASIC : INPUT. Son effet est le suivant : lorsque nous lancerons le programme en ta- pant RUN, Oric affichera un ?, suivi du curseur cligno- tant. Il attendra ensuite que nous tapions un nombre (qui sera le diamètre du cercle). Supposons que nous tapions la valeur 2 (suivie comme toujours de [RETURN]). Oric af- fectera cette valeur à D, puis passera à la ligne suivan- te où sera effectué :
+ LE TRAITEMENT DES DONNEES à la ligne 20. Il est évidemment très réduit ici ; on effectue simplement la multiplication de D (qui vaut maintenant 2) par PI (=). Cette dernière valeur est “connue” par Oric. Nous pour-
rons nous en assurer en tapant ultérieurement, en mode direct :
PRINT PI et nous obtiendrons : 3.14159265
_— 26 -
Après le traitement des données, c'est-à-dire le cal- cul des résultats, vient la dernière étape
+ LA SORTIE DES RESULTATS à la ligne 30 où l'on affi- che la valeur de la circonférence (ici 6.2831853) grâce à l'instruction PRINT, que nous connaissons bien mainte- nant.
Si vous avez bien suivi ces trois étapes du fonction- nement d'un programme, le reste ne posera pas de problè- me, car pratiquement toute la méthode de la programmation est contenue dans ces quelques lignes.
Notre petit programme est susceptible d'être amélio- ré, bien qu'il fonctionne parfaitement : pour connaître la circonférence d'un cercle de diamètre donné il suffit de taper RUN, puis, après le point d'interrogation qui apparaît alors, de taper le diamètre du cercle ; la cir- conférence s'affiche immédiatement après qu'on a enfoncé la touche [RETURN].
Si l'on veut la circonférence d'un cercle de diamètre différent, il suffit de retaper RUN et le programme est réexécuté. Et il le sera autant de fois qu'on retapera RUN : cela n'usera pas le programme de le faire exécuter, il restera toujours en mémoire (sauf si on débranche Oric)!
Quelles sont les améliorations que l'on aïmerait ap- porter ? Tout d'abord, il y a un problème à l'entrée des données. En effet, l'instruction INPUT provoque l'affi- chage d'un ? seul. Nous savons qu'il faut alors taper la valeur du diamètre du cercle, mais nous le savons unique- ment parce que nous avons écrit le programme... Autre- ment, rien ne nous l'indique, et une personne qui ne con- naîtrait pas le programme ne saurait pas quoi taper après le ?.
11 faudrait qu'Oric indique, par un message avant le ?, que c'est le diamètre du cercle qu'il faut taper et pas autre chose.
Cela peut sembler inutile ici, car le programme est simple, mais imaginons un très gros programme qui compor- terait de nombreux INPUT. Même si nous l'avions nous-même écrit, il ne serait pas inutile qu'il nous rappelle dans quel ordre entrer les données.
- 27 -
Cela s'obtient très facilement, car l'instruction INPUT peut aussi s'employer sous la forme suivante
INPUT “texte” ; variable
Le texte entre guillemets apparaît alors, suivi d'un point d'interrogation. Il suffit ensuite de taper la va- leur demandée, qui est affectée à la variable.
Dans notre programme, nous aurons résolu notre pro- blème en remplaçant la ligne 10 par :
10 INPUT "QUEL EST LE DIAMETRE DU CERCLE" ; D
La syntaxe doit être scrupuleusement observée ; en particulier les guillemets de part et d'autre du texte, ainsi que le point-virgule entre ce dernier et la varia- ble sont absolument obligatoires.
Mais nous n'avons résolu un problème que ‘pour en fai- re surgir un autre. Car comment remplacer la ligne 10 dans notre programme ? En fait, c'est tout simple, il suffit de taper la nouvelle ligne 10, sans oublier le nu- méro. L'ancienne ligne 10 sera alors effacée de la mémoi- re d'Oric où se trouve le programme, et remplacée par la nouvelle ligne.
Cette remarque est très générale : pour remplacer une ligne dans un programme, il suffit simplement de la reta- per, sans oublier son numéro au début.
Le problème à l'entrée des données est donc résolu, mais la situation est analogue lors de l'impression des résultats : on obtient un nombre, mais rien n'indique qu'il s'agit de la circonférence du cercle dont nous avons entré le diamètre. Là encore, ce n'est pas très grave, puisque nous savons ce dont il s'agit ; mais si notre programme imprimait de nombreux résultats, il se- rait absolument indispensable de les identifier.
Comment, donc, faire imprimer un message indiquant la nature du nombre affiché ? Cela se fait très simplement grâce à l'instruction PRINT. Nous savions déjà faire af- ficher un texte, en l'entourant par des guillemets ; en faisant suivre le texte entre guillemets par une virgule,
— 28 -
elle-même suivie de la variable, nous obtiendrons le ré- sultat voulu.
Dans notre cas, on pourra taper par exemple
30 PRINT “LA CIRCONFERENCE DU CERCLE EST ", C
Dès lors notre programme est beaucoup plus aisé à utiliser : tapons RUN.
Il apparaît QUEL EST LE DIAMETRE DU CERCLE ? Tapons un diamètre de 10 ; Appuyons sur [RETURN] ; on obtient LA CIRCONFERENCE DU CERCLE EST 31.4159265 Ready Si nous voulons déterminer la circonférence d'un au- tre cercle, il suffit de retaper RUN et le programme se réexécutera. 2.3.2 Instruction GOTO
Néanmoins, si nous avions beaucoup de circonférences à calculer, ce serait plus agréable de ne pas avoir à ta-
per RUN à chaque fois. Une nouvelle instruction BASIC va nous offrir cette possibilité : l'instruction GOTO.
Tapons 40 GOTO 10 L'effet de cette ligne, ajoutée en fin de programme,
est de dire à Oric : “va à la ligne numéro 10" (en an- glais “go to" signifie “allez à").
_ 29 -
Que va-t-il alors se passer ? Après avoir calculé la circonférence et avoir imprimé le résultat, Oric arrive à cette ligne 40, qui lui dit de retourner à la ligne 10, ce qu'il fait. Il se retrouve donc en début de programme et recommence à l'exécuter, c'est-à-dire qu'il affiche à nouveau :
QUEL EST LE DIAMETRE DU CERCLE ? C'est exactement ce que nous voulions obtenir !
Une telle structure, où un groupe d'instructions est répété plusieurs fois, s'appelle une boucle. C'est une notion très importante, dont nous verrons d'autres va- riantes, et qui permet à l'ordinateur d'effectuer des calculs itératifs.
2.3.3 Commande LIST
Notre programme ne comporte que 4 lignes, et il est donc aisé de s'en souvenir. Mais pour des programmes plus longs il sera indispensable de pouvoir faire imprimer les instructions telles qu'elles sont stockées en mémoire. C'est ce que permet la commande LIST, qui fait “lister” le programme en mémoire. Essayons et tapons
LIST Au stade où nous sommes nous obtenons 10 INPUT "QUEL EST LE DIAMETRE DU CERCLE" ; D 20C=PI*D 30 PRINT "LA CIRCONFERENCE DU CERCLE EST ", C 4O GOTO 10 Ready Cette commande LIST sera revue ultérieurement et com- plétée. Pour le moment, revenons à notre programme. IL a encore un très gros défaut, il ne s'arrête jamais ! Indé- finiment il affichera QUEL EST LE DIAMETRE DU CERCLE ?
En fait , notre programme est un “mauvais programme”,
- 30 -
car il comporte une boucle indéfinie, ce qui ne devrait jamais se produire. Un bon programme doit être prévu pour se terminer de lui-même au bout d'un temps fini.
Nous verrons par la suite comment mettre en place des boucles dont on soit sûr qu'elles se terminent.
2.3.4 CTRL C -— CONT
En attendant, il nous faut savoir comment arrêter no- tre programme. Supposons que l'exécution soit en cours et qu'Oric demande :
QUEL EST LE DIAMETRE DU CERCLE ?
Si à ce moment là, nous avons terminé avec le calcul des circonférences, il suffira, pour stopper l'exécution, d'appuyer simultanément sur la touche [CTRL] et la touche
[C]: Oric affiche alors Ready
Nous avons réussi à stopper l'exécution !
[CTRL] [C] est utile dans tous les cas où un pro- gramme ne s'arrête pas de lui-même ; mais son effet est légèrement différent lorsqu'on l'emploie alors que le programme n'est pas en attente sur INPUT (par exemple si le programme est en train d'effectuer de longs calculs). On obtient
BREAK IN numéro de ligne Ready
Le numéro de ligne qui apparaît après BREAK IN est
celui de la ligne où en était le programme lorsqu'on a
tapé [CTRL] [C].
Pour relancer l'exécution, on peut bien sûr taper RUN, mais aussi :
CONT (abréviation de CONTINUER)
_— 31 —
Le programme redémarre alors à partir de la ligne où a eu lieu le BREAK et non pas, comme avec RUN, depuis le début.
Une autre différence avec RUN est que les valeurs des variables sont conservées. On peut donc, par exemple, après un BREAK, faire afficher les variables en mode di- rect pour connaître l'état du programme, puis reprendre l'exécution où elle en était par CONT.
ATTENTION : Si l'on apporte une modification au programme, la reprise de l'exécution devra impérati- vement se faire par RUN (et on recommencera donc de- puis le début). Si on tape CONT, on aura le message d'erreur :
? CAN'T CONTINUE ERROR
2.3.5 RESET
Dans certains cas, pourtant, [CTRL] [C] se révèle inopérant ; on n'arrive plus à reprendre la main.
On peut alors bien sûr débrancher Oric, puis le re- brancher, mais tout ce qui était en mémoire est perdu, et en particulier le programme, qu'il faut alors retaper.
Une solution moins brutale consiste à appuyer sur la touche RESET. Vous ne la trouverez pas sur le clavier : c'est un petit bouton carré, noir, situé sur l'autre face d'Oric. Pour y appuyer, il faut un crayon ou tout autre objet effilé, car ce bouton est en renfoncement.
Son effet est le suivant : toute exécution en cours est arrêtée, toutes les variables sont remises à zéro ; l'appareil est ramené à son état initial, l'état où il se trouve lorsqu'on vient de le brancher, avec la différen- ce, néanmoins, que le programme est toujours en mémoire.
Avant de poursuivre et découvrir de nouvelles ins- tructions et commandes, nous allons récapituler ce que nous avons appris sur les instructions INPUT et PRINT, en ajoutant quelques compléments, car ces deux instructions sont fondamentales. Ce sont les commandes d'entrées-sor- ties par excellence, celles qui permettent le mieux de communiquer avec l'ordinateur, et à l'ordinateur de nous répondre.
— 32 -
2.3.6 Instruction INPUT
. Une ligne d'instruction de la forme : numéro de ligne INPUT variable provoque l'apparition d'un point d'interrogation, avec mise en attente du programme jusqu'à ce qu'on tape un
nombre. La valeur tapée sera alors affectée à la va- riable.
. Pour préciser la nature du nombre à entrer, on peut ajouter un texte :
numéro de ligne INPUT “texte” ; variable
Le texte s'imprime alors, suivi d'un point d'interroga- tion.
. Il est possible d'entrer plusieurs variables dans un même INPUT, avec la syntaxe suivante :
numéro de ligne INPUT "texte" ; variable 1, variable 2 Exemple : Imaginons un programme qui nécessiterait
l'entrée d'une date (par exemple pour calculer le nombre
de jours entre deux dates). Il pourrait comporter l'ins-
truction suivante :
numéro de ligne INPUT "ANNEE, MOIS, JOUR" ; A, M, J
Notons les virgules entre les variables, et le point- virgule qui sépare le texte des variables.
A l'exécution, on obtiendra : ANNEE, MOIS, JOUR ?
Il faudra alors taper 3 nombres, séparés par une vir- gule :
ANNEE, MOIS, JOUR ? 1789, 7, 14 et ne pas oublier d'appuyer sur [RETURN], comme d'habi-
tude.
— 33 -
. Que se passe-t-il si au lieu de taper trois nom- bres, nous n'en tapons que deux et appuyons sur [RETURN] en oubliant le troisième ? Eh bien, Oric va prendre en compte les deux valeurs, s'apercevoir qu'il lui en faut encore une, et afficher un double point d'interrogation pour signaler qu'il manque des données.
ANNEE, MOIS, JOUR ? 1789, 14 [RETURN] 27.7
On peut donc rentrer les données groupées comme l'on veut car, tant qu'Oric n'aura pas le nombre de données nécessaire, il affichera ??.
. Si au contraire nous tapons plus de données que né- cessaire, Oric ne prendra en compte que les n premières (s'il attend n données) et ignorera les suivantes (super- flues) en signalant le fait par le message EXTRA IGNORED.
ANNEE, MOIS, JOUR ? 1789, 14, 7, 18, 2 EXTRA IGNORED
Si nous ne tapons aucune donnée et faisons directe- ment [RETURN], Oric, s'apercevant qu'aucune donnée n'a été tapée, nous demandera d'entrer une valeur, en affi- chant un point d'interrogation.
ANNEE, MOIS, JOUR ? [RETURN] ?
Si nous refaisons [RETURN], nous aurons un nouveau ? jusqu'à ce que nous tapions un nombre.
ATTENTION : Si nous faisons [RETURN] après un ??,
Oric considérera que nous avons tapé 0.
2.3.7 Instruction PRINT Pour imprimer une variable : PRINT B
Pour imprimer un texte :
PRINT “texte”
— 34 —
Pour imprimer une variable en précisant sa nature PRINT "texte", B
On peut faire imprimer plusieurs variables par un mê- me ordre PRINT, mais on a deux possibilités : on peut sé- parer les variables soit par des virgules, soit par des points-virgules. Quelle est la différence ?
Si l'on sépare deux variables par une virgule, la deuxième sera imprimée séparée de quatre blancs de la première variable. Si on utilise un point-virgule les deux variables seront imprimées côte à côte, séparées par un seul blanc.
Essayons et tapons :
B = 7
C = 13 PRINT B, C 7 13 PRINT B; C 7 13
Le principe est le même avec des chaînes de caractè- res ; la seule différence est que deux chaînes de carac- tères séparées par un point-virgule seront imprimées jointivement.
Par exemple :
PRINT "BON" ; "JOUR"
donne
BONJOUR mais
PRINT "BON", "JOUR" donne
BON JOUR
De plus, il est possible de préciser le nombre de blancs entre deux chaînes de caractères.
_— 35 -
Si l'on veut par exemple que BON et JOUR soient sépa- rés par douze blancs, on écrira :
PRINT "BON" SPC(12) "JOUR"
I1 suffit donc d'intercaler SPC(N) entre deux chaînes de caractères pour qu'elles soient séparées par N blancs. N doit être un nombre compris entre 0 et 255.
Pour en finir avec l'ordre PRINT, rappelons que l'on peut utiliser ? comm abréviation et signalons enfin que l'on peut terminer un ordre PRINT par un point-virgule, alors qu'il n'y a rien à séparer. Le prochain PRINT écri- ra alors sur la même ligne, comme le montre l'exemple suivant
10 PRINT “BON"'; 20 PRINT "JOUR" RUN
donne BONJOUR
Ready
2.4 COMMANDES FONDAMENTALES
Avant de découvrir d'autres programmes, de tailles plus importantes, il est indispensable d'aborder les dif- férentes commandes qui permettent la manipulation de ces programmes.
Nous avons déjà vu la commande LIST, qui permet de "lister" un programme, et sur laquelle nous allons reve- nir. Mais un programme doit aussi pouvoir être corrigé, modifié ; on doit pouvoir en chercher les erreurs... etc. Nous verrons les commandes qui permettent tout cela.
2.4.1 Connaître le contenu d'un programme : la commande LIST Cette commande, que nous avons déjà rencontrée, four- nit sur l'écran la copie du programme en mémoire, qu'on appelle la liste, ou en franglais le listing.
+ 96.=
Si le programme est très long et ne tient pas tout entier sur l'écran, le “listing” va défiler, une ligne dispa- raissant en haut de l'écran, une nouvelle apparaissant en bas. La vitesse de défilement étant assez rapide, la lecture est assez difficile.
Aussi peut-on stopper le défilement en appuyant sur la barre d'espacement du clavier. Ensuite en appuyant sur n'importe quelle touche, le défilement reprend. Vous pou- vez essayer, mais les programmes que nous avons écrits jusqu'à maintenant sont un peu courts pour que cela se voie bien.
En ‘“listant"” un programme, on constate que les ins- tructions apparaissent dans l'ordre des numéros crois- sants, c'est-à-dire dans le même ordre que pour l'exécu- tion, quel que soit l'ordre dans lequel elles ont été tapées. De plus, si en tapant nos instructions nous avons utilisé ? à la place de PRINT, sur le listing c'est le mot PRINT qui apparaît.
Au lieu de lister un programme d'un seul coup, il est possible de n'en visualiser que certaines parties :
Ainsi, pour lister une ligne x donnée, il suffit de préciser ce numéro après LIST. Exemple (nous supposons notre programme de calcul de circonférence toujours en mémoire) :
LIST 20 20 C=PI*D
Pour lister toutes les instructions comprises entre deux numéros x et y, il suffit de taper LIST x-y :
LIST 20-30 20 C=PI*D 30 PRINT "LA CIRCONFERENCE DU CERCLE EST ", C
Si l'on avait tapé LIST 25-38 on aurait obtenu la même chose, car, dans notre exemple, il n'y a aucune ligne
entre 25 et 20, ni 30 et 38.
Pour lister toutes les lignes du début jusqu'à la li- gne x il faut taper LIST -x :
AT
LIST -20 10 INPUT “QUEL EST LE DIAMETRE DU CERCLE"; D 20 C= PI * D
De la même façon LIST x- liste toutes les lignes de la ligne x jusqu'à la fin
LIST 30- 30 PRINT "LA CIRCONFERENCE DU CERCLE EST ", C 4O GOTO 10
Si l'on veut arrêter définitivement de lister un pro- gramme en train de défiler sur l'écran, il faut appuyer simultanément sur [CTRL] et [C], comme pour arrêter l'exécution d'un programme. Il apparaît alors
BREAK Ready 2.4.2 Pour effacer un programme : commande NEW
Supposons qu'un programme soit en mémoire. Si nous tapons NEW en mode direct, tout le contenu de la mémoire sera effacé. Nous pouvons nous en assurer en utilisant la commande LIST : si après NEW nous tapons LIST, nous obte- nons simplement
Ready preuve qu'aucun programme ne se trouve plus en mémoire.
Il est conseillé d'utiliser la commande NEW avant de taper un nouveau programme, pour effacer l'ancien.
En effet, imaginons que nous commencions à taper un nouveau programme sans avoir effacé l'ancien ; deux cho- ses peuvent alors se produire : soit le numéro de la ligne que nous tapons existait déjà dans l'ancien pro- gramme, auquel cas la ligne que nous tapons ira remplacer l'ancienne, qui sera par là même effacée, soit ce numéro n'était pas dans l'ancien programme. Dans ce cas la ligne ira s'intercaler à la place impliquée par son numéro.
Nous comprenons donc que si les numéros des lignes que nous tapons ne correspondent pas un à un à ceux de l'ancien programme, il restera des instructions anciennes
= 48e
non effacées, qui perturberont l'exécution du programme. D'où l'intérêt de la commande NEW, qui supprime cet in- convénient.
2.4.3 Pour lancer l'exécution d'un programme : commande RUN
Nous avons déjà rencontré la commande RUN qui permet de lancer l'exécution d'un programme. Il est possible d'utiliser cette commande sous la forme RUN x où x est un numéro de ligne, le programme s'exécutant à partir de cette ligne numéro x.
11 existe une autre façon d'obtenir le même résultat: on peut taper, en mode direct
GOTO x
et là aussi le programme commencera à partir de la ligne Xe
Il y a pourtant une différence : avec RUN, toutes les variables sont automatiquement mises à zéro, ce qui n'est pas le cas avec GOTO.
Exemples : tapons
10 B = 45 20 PRINT B Alors | RUN RUN 20 ( B }) B = 7 ( B ) ( est ) GOTO 20 (reste) (mis à) ( à ) ( 0 ) C7) donne| 45 donne |O donne |7
Il est possible de remettre les variables à zéro en tapant CLEAR.
Dans l'exemple précédent, B = 7 CLEAR (B est mis à 0) GOTO 20
donne 0
= age
2.4.4 Pour terminer un programme : instructions STOP et END
Jusqu'à maintenant nos programmes (du moins ceux qui n'avaient pas de boucles indéfinies) se terminaient en arrivant à leur dernière ligne.
Mais supposons que notre programme comporte plusieurs parties et que nous voulions lancer tantôt l'une tantôt l'autre, grâce par exemple à RUN x ; si nous lançons la première partie, rien ne signale à ORIC la fin de cette partie. Il va donc continuer en exécutant la deuxième partie.
Pour éviter cela, il faut terminer chaque partie par STOP ou END.
Ces deux instructions ont un effet sensiblement iden- tique : en arrivant sur END ou STOP, le programme se ter- mine et revient en mode direct. La seule différence est qu'avec END il s'affiche simplement
Ready
alors qu'avec STOP il s'affiche BREAK IN numéro de ligne Ready
Le numéro est celui de la ligne où se trouve le STOP. S'il y a plusieurs STOP dans le programme, on peut ainsi
,
savoir où il s'est arrêté.
Traditionnellement, l'instruction END est plutôt pla- cée à la toute dernière ligne de programme. Le END n'a pas plus de raison d'être à la fin qu'au début d'un pro- gramme. Cela dépend uniquement de la structure organique du programme.
2.4.5 Corrections et modifications de programmes — INSERTION D'UNE LIGNE
Si nous voulons insérer une instruction entre les li- gnes 50 et 60 par exemple, il suffit de taper
55 instruction
40
L'instruction viendra s'insérer à la ligne 55, entre les lignes 50 et 60. Mais nous voyons que cela n'est pos- sible que parce que les numéros des lignes ne sont pas consécutifs. C'est pour cela qu'on a l'habitude (et c'est une bonne habitude à prendre !) de taper un programme en numérotant les lignes de 10 en 10 ; cela permet les in- sertions ultérieures. Naturellement, on pourrait aussi numéroter de 20 en 20 ou de 100 en 100, mais l'expérience montre que la numérotation de 10 en 10 est la plus prati- que.
— SUPPRESSION D'UNE LIGNE
Comme nous l'avons déjà vu, il suffit de taper son numéro, suivi de [RETURN].
- MODIFICATION COMPLETE D'UNE LIGNE
Nous savons aussi que pour modifier complètement une ligne, il suffit de la retaper, précédée de son numéro. L'ancienne version est effacée et remplacée par la nou- velle.
— MODIFICATION DE QUELQUES CARACTERES SUR UNE LIGNE
Supposons qu'en faisant lister notre programme nous nous apercevions que nous avons fait une erreur dans une ligne, par exemple
30 PRINT "LA CIRCONGERENCE DU CERCLE EST ", C
Une première solution consiste à retaper entièrement la ligne, mais c'est fastidieux si la ligne est un peu longue.
La bonne solution est la suivante : il faut d'abord faire lister la ligne défectueuse sur l'écran, par exem- ple ici par
LIST 30 BH 30 PRINT "LA CIRCONGERENCE DU CERCLE EST ", C
11 faut ensuite amener le curseur au début de la li-
gne comme indiqué ci-dessus, grâce aux touches de mouve- ment du curseur :
[æ] [41 LŸ1 [—+]
_- 41 —
On appuie simultanément sur [CTRL] [A]. Le curseur avance alors vers la droite ; on l'amène ainsi jusqu'au caractère erroné, ici le G :
30 PRINT "LA CIRCONSERENCE DU CERCLE EST ", C
(Pour cela on maintient la touche [CTRL] enfoncée et l'on appuie sur [A] autant de fois que nécessaire pour placer le curseur).
On tape alors un F, puis on réappuie sur [CTRL] [A] pour faire parcourir au curseur le reste de la ligne
30 PRINT "LA CIRCONFERENCE DU CERCLE EST ", C8
On appuie ensuite sur [RETURN] : la modification est alors prise en compte.
ATTENTION : L'effet de la touche [CTRL] [A] est de placer dans une petite mémoire intermédiaire les caractères rencontrés sur l'écran par le curseur. Si nous avions fait [RETURN] après avoir tapé le F, les caractères suivants n'auraient pas été pris en com- pte. En faisant
LIST 30 nous aurions obtenu 30 PRINT "LA CIRCONF
S'il y a plusieurs caractères erronés sur la même li- gne, il suffit de les corriger de la même façon, au
fur et à mesure que le curseur se positionne sur ces caractères.
2.5 CREEZ VOTRE JEU EN BASIC
2.5.1 Présentation du jeu
Jusqu'à maintenant nous avons vu quelques instruc- tions fondamentales du BASIC, et les commandes indispen- sables à l'élaboration des programmes. Néanmoins, nous ne
sommes pas capables d'écrire des programmes très élabo- rés, car notre vocabulaire BASIC est encore assez limité.
SAT
Dans cette partie nous allons découvrir les instruc- tions BASIC supplémentaires qui, avec celles que nous connaissons déjà, forment véritablement les bases de la programmation. Pour cela, nous allons programmer un jeu qui nous permettra d'introduire de manière plus attrayan- te de nouvelles instructions BASIC.
Au départ, notre jeu sera bien sûr un peu simple, mais nous l'améliorerons progressivement. A quoi allons- nous donc jouer ? Eh bien, nous allons essayer de pro- grammer le jeu de la “roulette russe"... ou tout au mins sa simulation.
Rappelons le principe de ce jeu (si dangereux dans la réalité) : un revolver à six coups contient une seule cartouche ; on fait tourner le barillet au hasard une fois, puis chacun des joueurs à tour de rôle braque l'ar- me contre sa tempe et appuie sur la détente, jusqu'à ce que l'un d'eux renonce, auquel cas il a perdu, ou jusqu'à ce que le coup parte...
Pour simuler le coup de feu, nous pourrons par exem- ple faire écrire BANG. Pour repérer la balle dans le barillet, nous pourrons utiliser une variable qu'on ap- pellera par exemple BALLE, et qui vaudra un nombre de 1 à 6. On affichera alors BANG au premier coup si BALLE vaut 1 (c'est-à-dire si la balle est dans le premier logement du barillet}), au deuxième coup si BALLE = 2, au troisième si BALLE = 3, etc... Il nous faudra donc compter les coups ; pour cela nous introduirons une variable COUP qui vaudra 1 au premier coup et que nous augmenterons de 1 à chaque coup.
Mais il faudra aussi que nous puissions tester si BALLE = COUP ; il existe pour cela une instruction BASIC, l'instruction IF, que nous allons détailler :
2.5.2 Instruction IF
Sa forme générale est la suivante :
IF condition THEN instruction l ELSE instruction 2
AY
Si la condition est vraie (IF signifie SI), on exécute l'instruction 1 qui suit le THEN (THEN signi- fie ALORS). Si la condition est fausse on effectuera l'instruction 2 qui suit ELSE (ELSE veut dire SINON).
Puis on passe à la ligne suivante du programme.
Précisons que l'instruction ELSE n'est pas obliga- toire ; on peut écrire simplement :
IF condition THEN instruction 1
Si la condition est fausse, on passe à la ligne sui- vante, sans effectuer l'instruction 1.
Exemple
50 IF A = B THEN PRINT "A EGALE B" ELSE PRINT "A EST DIFFERENT DE B"
La condition qui est testée ici est À = B. La machine compare les valeurs de A et B ; si ces deux valeurs sont égales, l'instruction qui suit THEN est effectuée : Oric écrit A EGALE B. Sinon, il effectue l'instruction 2, c'est-à-dire qu'il écrit A EST DIFFERENT DE B.
Lorsque l'instruction qui suit THEN est GOTO, la syn- taxe est susceptible de se simplifier : on peut toujours écrire :
70 IF À > B THEN GOTO 110 mais aussi simplifier par
70 IF A> B THEN 110 ou encore
70 IF A> B GOTO 110
On comprend aisément la signification de cet exemple. Si la valeur de À est supérieure à la valeur de B, on va
à la ligne 110, sinon on passe à la ligne 80, suivante.
L'instruction IF est peut-être la plus importante des
Es
instructions BASIC ; aussi, avant de poursuivre, exami-— nons en détail les types de condition qui peuvent suivre le IF.
— Un premier type de condition est de la forme :
Expression Opérateur de Expression arithmétique comparaison arithmétique Exemples : À = B A > B 3 * A -2 > 4x B T2 Expression Opérateur de Expression arithmétique comparaison arithmétique
Les opérateurs de comparaison sont les suivants
égal
supérieur inférieur différent supérieur ou égal inférieur ou égal
SNMRA NY v
ll
— Un deuxième type de condition combine des condi- tions du premier type à l'aide des trois opérateurs logi- ques suivants
AND : et OR : où NOT : non
La syntaxe est la suivante (condition A et condition B sont des conditions du premier type) :
condition A AND condition B
est vrai si, et seulement si, condition À et condition B sont vraies toutes les deux.
= 45 —
condition À OR condition B
est vraie si l'une au moins des deux condi- tions À ou B est vraie (elles peuvent aussi, naturellement, être vraies toutes les deux).
NOT condition A
est vraie si condition À est fausse et fausse si condition À est vraie.
Exemple 70 IF 2 * A> 4&+3TC OR B< 8 THEN 30
Cette instruction enverra à la ligne 30 si 2 * A est strictement supérieur à 4+31C ou si B est strictement plus petit que 8. Si aucune de ces deux conditions n'est
vérifiée, on passera à la ligne suivante.
Nous avons dit que IF est une des plus importantes instruction BASIC. En effet, c'est elle qui permet à Oric de prendre des décisions, c'est-à-dire d'exécuter une instruction plutôt qu'une autre, en fonction des diffé- rentes situations résultant des données ou des calculs.
Nous sommes donc, maintenant, en mesure de taper une première version de notre jeu.
2.5.3 Première version du jeu
10 CLS
20 BALLE = 4
30 COUP = 1
4O PRINT "CLIC..."
50 IF COUP = BALLE THEN PRINT "BANG" ELSE PRINT "SAUVE !"
60 INPUT "TAPEZ 1 POUR TIRER O POUR ABANDONNER"; REP
70 IF REP = O THEN END
80 COUP = COUP + 1
90 GOTO 40
Nous découvrons à la ligne 10 une nouvelle instruc- tion, l'instruction CLS. Elle a simplement pour but de
nettoyer l'écran de tout le texte qui peut s'y trouver et
46. =
de ramener le curseur en haut à gauche de l'écran. On peut aussi la taper en mode direct, mais il est alors plus simple de taper [CTRL] [L] qui a le même effet.
La suite du programme se comprend aisémnt ; au dé- part COUP = 1 : c'est le premier coup ! On affiche CLIC... pour suggérer que l'on commence à appuyer sur la détente. Puis, grâce à l'instruction IF, on teste si la balle est dans le logement du barillet face au canon, c'est-à-dire pour nous si BALLE = COUP. Si c'est le cas on imprime BANG : le coup est parti ; sinon on imprime SAUVE !
On demande ensuite si l'on veut tirer à nouveau. Si l'on tape 0 le jeu s'arrête, si l'on tape 1 (en fait tout nombre autre que 0), le jeu continue : on va tirer une nouvelle fois et donc passer au coup suivant. Pour cela on augmente COUP de 1, à la ligne 80. Cette instruction ne doit pas surprendre. En mathématique, bien sûr, elle serait fausse, mais ici elle signale simplement que l'on ajoute 1 à la variable COUP, puis que cette nouvelle va- leur est affectée à la même variable COUP.
Ensuite, on repart à la ligne 40 où l'on recommence à "tirer".
Une première objection vient tout de suite à l'es- prit. À la ligne 20 il y a BALLE = 4. Nous savons donc où
se trouve la balle : dans le quatrième logement du ba- rillet. Le jeu serait satisfaisant pour quelqu'un qui n'aurait pas écrit le programme et qui ignorerait donc combien vaut BALLE. Mais il est toujours possible de le découvrir en listant le programme.
11 existe un moyen d'éviter cet inconvénient : faire tirer un nombre au hasard par l'ordinateur lui-même. 2.5.4 Fonction RND
Cela est possible grâce à la fonction RND (abrévia- tion du mot anglais RANDOM, qui signifie hasard).
Si nous tapons :
PRINT RND(1)
DAT
nous obtenons un nombre aléatoire compris entre 0 et 1.
Cela peut surprendre : comment un ordinateur dont le comportement est parfaitement déterminé, peut-il donner des nombres au hasard ?
En fait ces nombres ne sont pas vraiment tirés au ha- sard. Ils sont calculés par des algorithmes précis, mais qui, paradoxalement, donnent des suites de nombres, dits pseudo-aléatoires, et qui sont tels que, statistiquement, tout se passe comm s'ils avaient été tirés au hasard.
Un appel à RND est de la forme RND (X) avec X> O : on obtient alors un nombre entre 0 et 1. Des appels suc- cessifs avec la même valeur de X donnent les éléments successifs d'une même suite pseudo-aléatoire (le nombre obtenu changeant à chaque fois). En changeant la valeur de X on change de suite, mais généralement on utilise RND
(1).
2.5.5 Fonction INT
Néanmoins notre problème n'est pas encore résolu, car nous voulons un nombre entier entre 1 et 6. Pour cela, nous allons utiliser la fonction INT qui donne la valeur entière immédiatement inférieure.
Ainsi : PRINT INT (3.1416) donne 3 PRINT INT (127.4387) donne 127
Attention : pour les nombres négatifs, on obtient
INT (-3.1416) = -4 INT (-127.4387) = -128
Comme nous voulons un nombre entier de 1 à 6, nous taperons
s. 48. =
20 BALLE = INT (6 * RND(1)) + 1
RND(1) est compris entre 0 et 1, O et 1 exclus, donc 6 * RND(1) est compris entre 0 et 6, O et 6 exclus, d'où INT (6 * RND(1)) est compris entre 0 et 5, O0 et 5 inclus. En ajoutant 1, on a bien un nombre entier de 1 à 6.
Notre programme n'est pas encore parfaitement satis- faisant, car une fois que le coup est parti, c'est-à-dire qu'on a imprimé BANG, il demande encore si l'on veut ti- rer, alors que, normalement, le jeu est terminé.
Pour éviter cet inconvénient nous pourrions, bien sûr, mettre à la place de PRINT "BANG" un GOTO vers une instruction faisant imprimer BANG, suivie de l'instruc- tion END. Mais il existe une meilleure façon de faire l'utilisation de l'instruction REPEAT ... UNTIL.
2.5.6 REPEAT ... UNTIL Cette instruction s'emploie de la façon suivante :
REPEAT
instructions
UNTIL condition
REPEAT signifie “répéter”, UNTIL signifie “jusqu'à ce que". Toutes les lignes d'instructions com- prises entre REPEAT et UNTIL sont répétées, c'est-à-dire réexécutées jusqu'à ce que la condition suivant UNTIL soit vraie. Cette condition est du même type que celles qui peuvent suivre un IF que nous avons déjà vu.
Cette structure pourrait être remplacée par IF NOT condition GOTO x à la place de UNTIL, x étant le numéro de la première ligne des instructions à répéter, mais le programme serait beaucoup moins clair à lire et à com- prendre. Aussi l'instruction REPEAT ... UNTIL est-elle à utiliser partout où c'est possible.
— 49 —
2.5.7 Seconde version du jeu
Nous allons donc pouvoir modifier notre programme de la façon suivante :
10 CLS
20 BALLE = INT (6 * RND(1)) + 1 30 REPEAT
4&O WAIT 100
50 INPUT "TAPEZ 1 POUR TIRER O POUR ABANDONNER"; REP
60 IF REP = O THEN END
70 PRINT "CLIC..."
80 WAIT 200
85 COUP = COUP + 1
90 IF BALLE <> COUP THEN PRINT "SAUVE !"
100 UNTIL BALLE = COUP
110 PRINT "BANG"
120 EXPLODE
130 END
Nous avons aussi ajouté deux instructions nouvelles, l'instruction WAIT et l'instruction EXPLODE.
2.5.8 L'instruction WAIT
En anglais, WAIT signifie ATTENDRE ; WAIT 100 au- ra pour effet d'arrêter l'exécution pendant 100 fois 10 millisecondes, soit 1 seconde, WAIT 200 pendant 200 fois 10 millisecondes, soit 2 secondes... ; de manière généra- le, une ligne d'instruction WAIT N provoquera un arrêt de l'exécution de N fois 10 millisecondes.
Nous avons ajouté cette instruction pour laisser un intervalle de temps entre 2 impressions sur l'écran, et aussi pour ajouter au suspense, par l'attente du BANG ou du SAUVE ! après le CLIC... !
2.5.9 L'instruction EXPLODE
Cette instruction provoque un bruit d'explosion, qui donne beaucoup plus d'effet au jeu. Vous pouvez essayer de la taper en mode direct.
Il existe d'autres instructions provoquant des bruits
- 50 -—
divers, tels SHOOT, ZAP, PING ; ces instructions sont vues plus en détail dans le chapitre réservé aux possibi- lités sonores d'Oric.
Avant de conclure, nous allons présenter une instruc- tion assez semblable à REPEAT ... UNTIL, et elle aussi très fondamentale : la boucle FOR ... NEXT.
2.5.10 Boucle FOR ... NEXT
REPEAT ... UNTIL nous permet de répéter une action jusqu'à ce qu'une condition soit vérifiée, mais, a prio- ri, nous ne savons pas combien de fois les instructions seront répétées.
Aussi, pour pouvoir répéter une suite d'instruction N fois, il existe l'instruction FOR ... NEXT, qui s'emploie de la façon suivante
FOR I = 1 TO N
instructions
NEXT I
Son fonctionnement est le suivant : au départ I = 1, et les instructions sont exécutées. On arrive à l'ins- truction NEXT I (qui signifie I suivant), où l'on doit tester si I est égal ou non à N. Si IL est plus petit que N, I est augmenté de 1 et l'on réexécute les instruc- tions, puis l'on compare à nouveau I et N.
Les instructions sont ainsi répétées jusqu'à ce que I = N, auquel cas on passe à la ligne suivant le NEXT.
Cette instruction FOR ... NEXT sera revue et complé- tée dans le chapitre suivant, aussi contentons-nous de donner ici un exemple simple : faire imprimer les nombres de 1 à 1000.
10 FOR I = 1 TO 1000
20 PRINT I 30 NEXT I
- 51 -
REMARQUE : Le nom de la variable, qui ici est I, peut bien sûr être différent.
2.6 CONCLUSION
Nous avons pu, dans ce chapitre, découvrir un premier jeu sur Oric, jeu assez simple, mais qui nous laisse en- trevoir que les possibilités n'ont de limites que celles de notre imagination.
Parvenus à la fin de ce livre, vous serez capables d'écrire vous-même vos programmes de jeux. Dans cette perspective, le chapitre suivant va nous permettre d'ap- profondir encore notre connaissance du BASIC, en récapi- tulant les instructions que nous avons déjà vues et en nous en présentant de nouvelles.
— 52
CHAPITRE 3
Le langage
Basic de l'oric
3.1 GENERALITES
L'objet de ce chapitre est de développer et de pré- ciser les notions dont vous avez eu un aperçu au chapitre précédent.
Nous allons examiner successivement les instructions constituant le langage évolué, compréhensible par votre microordinateur, qui vous permettront de réaliser tous vos programmes.
— LE SYSTEME DE CARACTERES EMPLOYE :
Le but d'un programme est, en général, de calculer des “valeurs”. En fait, un ordinateur ne “connaît” ces valeurs que sous forme de représentations. Celles-ci sont, comme nous l'avons vu au chapitre précédent, des configurations physiques constituées de bits, d'octets,
de "paquets" d'octets. Pour représenter les caractères qu'il comprend, votre
Oric utilise le code de représentation ASCII (initiales d'American Standard Code of Information Interchange).
_- 53 —
Vous trouverez la liste des caractères et leur code ASCII correspondant dans l'annexe F.
Vous pouvez noter que votre ordinateur utilise 1 oc-
tet (8 bits) pour représenter chaque caractère. Le mode de représentation est globalement le suivant :
les valeurs
0 à 31 caractérisent les caractères de con- trôle (CTRL T ... CTRL N etc...)
32 à 127 caractérisent les caractères alphanumé- riques et les caractères spéciaux du code ASCII.
128 à 255 caractérisent les mots constituant le vocabulaire BASIC compréhensible par votre Oric.
— LES CARACTERES ALPHANUMERIQUES SONT :
. caractères alphabétiques : A, B, ..., Z (alphabet majuscule)
D] # . caractères numériques : 0, 1, ..., 9
— LES CARACTERES SPECIAUX SONT : PR TC) EST blanc SL OH La, D 0) 4e, 2 (alphabet minuscule) etc... 3.2 CONSTANTES -— VARIABLES - INDICES 3.2.1 Les constantes
Votre microordinateur distingue deux grands types de constantes : les constantes numériques et les constantes alphanumériques (ou chaînes de caractères). — LES CONSTANTES NUMERIQUES
Celles-ci sont des nombres décimaux, de signe quel- conque, qui peuvent s'écrire de trois façons distinctes :
_- 54 —
. une série de chiffres sans point décimal (nombre entier).
exemple : PRINT 7653
. une série de chiffres avec point décimal (nombre réel dit en virgule fixe).
exemple : PRINT 76.535
. un entier ou un réel en virgule fixe suivi de la lettre E, d'un signe - éventuellement - et d'un entier (nombre
réel dit en virgule flottante). exemple : PRINT 76.535 E+23
Le symbole E s'énonce “dix puissance, et signifie ci- dessus que 76.535 est multiplié par 10 3 soit
10:50 23 zeros
Toutes ces constantes sont considérées par votre Oric comme des nombres réels. La représentation de ces réels s'effectue dans la machine à l'aide de 5 octets.
1 octet est utilisé par l'exposant (dans l'exemple précédent +24)
& octets sont utilisés pour la mantisse (dans l'exemple précédent 7.653500)
Vous trouverez des renseignements complémentaires sur la représentation interne des réels en annexe E.
Ce type de représentation, ,vous imposera de, limiter vos réels entre -1.70141 10 bo 1.70141 10 ; 16
réels compris entre -2.93874 10 et +2.93274 10 sont assimilés à O.
3811 est à noter qu'une constante -gupérieure à 1.70141 10 ou inférieure à -1.70141 10 provoque l'appa- rition du message d'erreur ? OVERFLOW ERROR (dépassement de capacité de la machine). De même l'écriture d'une constante dont la mantisse possède plus de 38 chiffres entraîne l'affichage du même message d'erreur.
- 55 —
Considérons maintenant
PRINT 11.123456789012345 [RETURN] 11.123456789
Observez qu'Oric n'édite que 9 chiffres après le point décimal, ceci s'appelle une troncature.
En outre, compte tenu de la représentation interne des réels, la machine a une précision de l'ordre de 9 chiffres sur la mantisse.
Pour nous convaincre, réalisons le programme suivant.
5 INPUT"A";A
10 INPUT"B";E
15 C=(A=B)
20 PRINT"'A=";A,"B=";B
25 IF C=0 THEN PRINT “ORIC CONSIDERE QUE";A; "EST DIFFERENT DE";B
30 IF C=-1 THEN PRINT “ORIC CONSIDERE QUE";A; "EST EGAL A'";B
35 END
Vous pouvez prendre, par exemple, dans un premier temps
A=1.123456789 et B=1.123456790 puis A=1.1234567890 et B=1.1234567891
Il est important que vous gardiez en mémoire que la précision de calcul de votre Oric est de 9 chiffres après la virgule sur la mantisse.
La conclusion que l'on peut tirer de cet exemple est que si la machine accepte des mantisses de 38 chiffres, seuls les dix premiers sont significatifs. Donc, lors de l'entrée des données, il est inutile de taper des mantis- ses de plus de 9 chiffres.
Oric admet aussi une écriture des constantes entières en numération en base 16 (numération hexadé-
cimale).
exemple : #10, # -E100
— 56 -
C'est le symbole # qui indique à la machine que les caractères qui suivent figurent un nombre hexa- décimal. (Ce nombre doit évidemment être écrit à l'aide de chiffres hexadécimaux).
Ainsi : 5 A =Ë#G
10 PRINT A
RUN provoque l'affichage du message d'erreur ? SYNTAX ERROR IN 5 (G n'est pas un chiffre hexadécimal).
Vous trouverez des renseignements complémentaires sur la numération hexadécimale en annexe E.
Si vous tapez par exemple, PRINT # 1EFA [RETURN], vous noterez qu'Oric écrira directement ce nombre en base décimale. La conversion inverse, c'est-à-dire l'expression en base hexadécimale d'un nombre déci- mal, s'effectue à l'aide de la fonction HEXS.
Exemple : PRINT HEXS$(16)
Notez que la conversion de la base 16 à la base 10 est limitée à des entiers variant entre - HFFFF et + AFFFF (-65535 et +65535).
Ainsi PRINT # 10000 provoque l'affichage du mes- sage OVERFLOW ERROR.
— LES CONSTANTES ALPHANUMERIQUES
Celles-ci sont constituées d'une suite de n caractè- res du code ASCII, situés entre cotes “doubles”.
Exemple : PRINT “je m'appelle Oric”
Notez que la double cote servant à délimiter une chaîne de caractères ne peut pas être un caractère appar- tenant à cette chaîne.
Si la chaîne de caractères est la dernière donnée écrite sur une ligne, en mode direct ou différé, la dou- ble cote “ finale peut être oubliée sans inconvénient, puisque l'action sur la touche [RETURN] s'y substitue. Toutefois l'emploi de cette solution pour écrire une
chaîne de caractères n'est pas à conseiller.
— 57 -
La longueur minimale d'une constante alphanumérique est zéro (chaîne vide) ; sa longueur maximale est de 255 caractères.
La représentation interne d'une chaîne s'effectue par le codage de chaque caractère, un à un, par le code ASCII donc elle nécessite un octet par caractère de chaîne.
3.2.2 Les variables simples
Une variable est une entité mathématique à laquelle on peut affecter diverses valeurs "variables". Pour défi- nir une variable, il suffit de lui donner un nom.
Ce nom doit entrer dans une syntaxe bien précise à laquelle vous devez vous conformer strictement.
. Le nom de la variable doit commencer par un carac- tère alphabétique (A, B, ..., Z) et peut être suivi par des caractères alphanumériques (A, ..., Z, 0, ..., 9). Les caractères $ et % peuvent aussi être utilisés, mais ils ont un rôle précis : ils caractérisent le type de la variable (variable alphanumérique ou entière). Ces deux caractères se placent toujours à la fin du nom de la variable.
. Le nom d'une variable doit comprendre au maximum 238 caractères. En fait, l'interpréteur basic de votre Oric représente chaque variable par les deux premiers caractères de son nom, et par son type. Ainsi, les deux variables POIRE et POIDS sont considérées comme identi- ques pour la machine.
Toutefois, ce n'est pas une raison pour que vous limitiez, dans vos programmes, les noms de vos variables à 2 caractères. En effet, il est intéressant, pour amé- liorer la lisibilité de vos programmes, de prendre comme nom de variable le nom du résultat du calcul qu'on lui affecte, ou bien le nom de ce que la variable représente.
Expliquons ceci plus clairement sur un exemple simple.
Construisons un programme calculant l'aire d'un cer- cle connaissant son rayon.
_- 58 —
5 REM CALCUL DE L'AIRE D'UN CERCLE CONNAISSANT SON RAYON 10 INPUT "QUEL EST LE RAYON DU CERCLE"; RAYO 15 AIRE = PI * RAYO * RAYO 20 PRINT "L'AIRE DU CERCLE DE RAYON ” ; RAYO 3; "VAUT" ; AIRE 25 END
Ainsi la variable qui représente le rayon du cercle s'appelle RAYO, et celle à laquelle on affecte le calcul de la surface du cercle s'appelle AIRE.
Notez que PI est une constante stockée par Oric ; cette constante vaut 3.14159265.
. En dernier lieu le nom d'une variable ne doit, en aucun cas, contenir de mot appartenant au vocabulaire basic de la machine (la liste de ces mots “réservés” figure dans l'annexe A).
Ainsi, des noms de variable aussi anodins que PRUNE, VALEUR, FORCE, LETTRE, NEUTRON, etc ne doivent pas être employés.
L'emploi d'un mot réservé dans un nom de variable provoque généralement l'apparition du message d'erreur SYNTAX ERROR. Sinon l'interpréteur exécutera sans réac- tion immédiate le mot réservé, ce qui aura des conséquen- ces aussi imprévisibles que variées.
Vous pouvez utiliser trois types de variables dans vos programmes : les variables alphanumériques, entières,
ou réelles.
— LES VARIABLES ALPHANUMERIQUES OÙ CHAINES DE CARACTERES
Une variable est alphanumérique si le dernier carac- tère de son nom est le symbole $. Le “contenu” d'une telle variable doit obligatoirement être une constante alphanumérique.
Exemple : AAS$= "A=l + BCDXY 56" Si vous essayez AA$=1234567890, l'interpréteur basic vous signalera l'erreur par le message TYPE MISMATCH
ERROR (les cotes sont fondamentales puisque ce sont elles
_- 59 -
qui indiquent que la constante est une chaîne de carac- tères).
Il est à noter que la représentation interne de cette variable AA$S s'effectue de la façon suivante : Oric stocke dans cet ordre
. le nom de la variable (AA$), ce qui occupe 2 octets (les deux premiers caractères du nom sont seuls concernés, le symbole $ est pris en compte dans la manière de stocker la variable) ;
. la longueur de la chaîne de caractères, ce qui occupe L octet (ceci vous explique pourquoi une chaî- ne comprend au plus 255 caratères 255 = 2°-1) ;
+ l'adresse de la zone où est stockée la chaîne de caractères, ce qui occupe 2 octets ;
. deux octets “"séparateurs".
Donc finalement, une variable alphanumérique occupe 7 octets + le nombre d'octets correspondant au nombre de caractères composant la chaîne. En conclu- sion, vous devez retenir que l'emploi de variables alphanumériques est coûteux en place mémoire.
— LES VARIABLES ENTIERES
Une variable est entière si le dernier caractère du nom de celle-ci est le symbole %. Le “contenu” d'une telle variable doit obligatoirement être une constante non alphanumérique.
Exemple : 5 CA%=123 10 PRINT CAZ RUN
Remarquez que CA% est un nombre entier (absence de point décimal).
A présent, modifiez la ligne 5 5 CA%=1535.428 RUN
— 60 -—
Avec cet exemple vous pouvez voir que lorsque l'on affecte à CA% une valeur réelle, la machine stocke en fait le plus grand nombre entier inférieur à la valeur réelle que vous avez affectée à CA%. (D'un point de vue mathématique, Oric prend la partie entière de ce nombre
réel).
Afin d'améliorer la lisibilité de vos programmes futurs, il est souhaitable que, dès à présent, vous preniez l'habitude d'affecter à une variable entière une constante mathématiquement de même type.
Ainsi, plutôt que de taper : CA%=13.22,
il est préférable d'utiliser : CA%=INT(13.22)
(la fonction INT est la fonction partie entière, ces deux lignes sont donc équivalentes).
REMARQUE : CA%=#FAB est bien entendu licite puis- que #FAB est un entier en numération hexadécimale. Notez que PRINT CA% écrit CA% en numération décimale (en base 10).
Si vous essayez CA%="123", l'interpréteur basic vous signalera l'erreur par le message TYPE MISMATCH ERROR, puisque la présence de ” “ signifie que vous affectez à CA% une constante alphanumérique.
La représentation interne de la variable CA% s'effectue de la façon suivante.
Oric stocke dans cet ordre :
. le nom de la variable (CA%) ce qui occupe 2 octets (les 2 premiers caractères du nom sont seuls conservés, le symbole % est pris en compte dans la façon de stocker la variable) ;
. la valeur affectée à la variable, ce qui occupe 2 octets.
Donc, le stockage d'une variable entière n'occupe que 4 octets. Etant donné que la valeur de la varia- ble est stockée sur 2 octets seulement, vous ne pour- rez utiliser que les entiers compris entre -32768 et +32767.
Vous trouverez des renseignements complémentaires sur la représentation des entiers en annexe.
=ÉL'=
— LES VARIABLES REELLES
C'est l'option par défaut que prend la machine lors- que le nom de la variable ne possède comme dernier carac- tère ni $, ni %. Le contenu de cette variable doit être une constante non alphanumérique.
Exemple : DA=1.23 E23 DA=3452.34.
La représentation interne de la variable réelle DA s'effectue de la façon suivante
Oric stocke dans cette ordre
le nom de la variable, ce qui occupe 2 octets (les 2 premiers caractères du nom sont seuls conser- vés) ;
. la valeur affectée à la variable, ce qui, vous l'avez vu au paragraphe précédent, nécessite 5 oc- tets.
Le stockage d'une variable réelle n'occupe donc que 7 octets.
Pour mémoire, les réels, que vous devez ypiliser sont compris entre -1.70141 10 et 1./70141 10 . Bien en- tendu, l'écriture d'une ligne du type CA="123" entraîne l'affichage du message suivant : TYPE MISMATCH ERROR.
En conclusion, vous pouvez remarquer que suivant le type de variable que vous considérez, telle ou telle représentation physique sera adoptée par la machine. C'est pourquoi les variables A, A$ et A%, de noms pour- tant peu différents sont, en fait, fondamentalement distinctes.
Il est donc capital de préciser à la machine, au mo- ment de la programmation, le type de chaque variable que vous voudrez utiliser. Cette gymnastique se révèlera profitable à la longue, car elle vous conduira à définir tous les “objets” que vous voudrez employer et, donc, à mieux les contrôler.
A présent, étudiez le petit exercice suivant
— 62 —
Une personne de vos amis peut effectuer ses achats dans 5 magasins différents. Mais elle veut connaître celui qui est, en moyenne, le meilleur marché. Pour ce faire, elle se constitue un panier de référence de 26 articles tests tous disponibles dans chaque magasin et regarde le prix de chaque “panier de la ménagère".
En outre, inquiète de l'évolution des prix, elle veut faire des essais tous les mois. Elle sait que vous possé- dez un ordinateur et elle fait appel à vous pour élaborer un programme permettant d'effectuer chaque mois les cal- culs nécessaires à la réalisation de son enquête.
Soucieux d'utiliser les conseils prodigués précédem- ment, vous définissez logiquement les variables qui vont contenir les prix de chaque objet de chaque magasin. Vous appelez les objets A, B, ..., Z (26 objets) et les magasins 1, ..., 5 (5 magasins), les noms des variables prix seront constitués du nom de l'objet auquel elles se rapportent et du nom du magasin où a été acheté l'objet, elles auront donc pour nom Al, Bl, ..., Zl, A2..., 22, ses 25e
Les prix de chaque panier seront les variables AA, BB, ..., EE (il faut se garder de donner le même nom à deux variables différentes) ; par exemple le prix du panier 3 sera CC = A3 + B3 + ... + 73.
Mais avant de faire ce calcul, il faut affecter à chaque objet son prix dans chaque magasin (cette opé- ration porte le nom générique de “saisie de données").
Votre programme débute par :
5 REM CALCUL DU MAGASIN LE MEILLEUR MARCHE
10 INPUT “PRIX DE L'ARTICLE 1 DU MAGASIN l";Al
15 INPUT “PRIX DE L'ARTICLE 2 DU MAGASIN 1”;BL
Vous vous rendez compte à ce moment que vous allez taper cette ligne pour chaque article de chaque magasin, soit 130 fois, ce qui est extrêmement fastidieux. Or chaque variable Al, Bl, ... Z5 a les mêmes propriétés.
En fait, votre Oric permet de résoudre et d'écrire beaucoup plus élégamment ce genre de problèmes constitués
= 63 =
de travaux, comme ici, très répétitifs, c'est-à-dire la construction de variables de mêmes caractéristiques et leur emploi dans les calculs.
Dans le paragraphe suivant, nous allons justement voir comment construire simplement un groupe de variables de mêmes propriétés.
3.2.3 Les variables indicées ou tableaux
Votre ami étant une personne organisée, vous a en fait remis le document suivant pour vous faciliter la saisie des données.
Tableau des prix des articles dans chaque magasin.
(Tableau 1)
; article : À : B : sl : Z
: magasin : : : : : : He de Mae Hs +4 O2 iMiBi Ji +2 cs iBiBi IH: 12: A | Éd de he D édite, dan di.
Votre Oric est pratiquemment capable de construire et d'utiliser un tel document. D'un point de vue informa- tique ce document s'appelle un tableau, et les éléments de ce tableau s'appellent des variables indicées.
Voyons comment construire ce tableau.
Pour que Oric puisse connaître le tableau précédent, il suffit de lui donner un nom et de définir la structure et la taille de ce tableau. Ceci peut se réaliser par le mot DIM de la façon suivante :
5 DIM PRIX(4,25)
— 64 -
Explication : PRIX est le nom que nous avons décidé de donner au tableau contenant le prix de chaque article de chaque magasin.
Les règles de formation des noms de tableaux sont stric- tement les mêmes que celles concernant la formation des noms de variables “simples” vues au paragraphe précédent et que nous pouvons rappeler brièvement :
- le premier caractère du nom du tableau doit être exclusivement alphabétique (A, ..., Z majuscule).
- les autres caractères du nom sont alphanumériques : (A, ..., Z, Q;, ce. 9).
- les noms de tableaux doivent comporter au plus 238 caractères, mais en fait Oric n'utilise que les deux premiers pour caractériser le nom.
— le nom du tableau ne doit pas contenir de mots “réservés” du vocabulaire basic de la machine.
Voyons à présent pourquoi le nom PRIX est suivi par deux nombres entre parenthèses. Le document remis par votre ami est un tableau qui comporte des lignes et des colonnes, c'est ce que l'on appelle un tableau à deux dimensions :
. une dimension “horizontale” puisqu'il y a des lignes. . une dimension “verticale” puisqu'il y a des colonnes.
Physiquement cette notion de dimension se traduit par le nombre minimal d'informations qu'il faut fournir pour retrouver un élément du tableau. Par exemble, l'élément J3 du tableau est à l'intersection de la troisième ligne et de la dixième colonne, donc 2 renseignements.
Le nombre de dimensions d'un tableau est ce que nous avons appelé structure du tableau.
Les parenthèses qui suivent le mot PRIX sont en fait les deux caractères qui indiquent à votre Oric qu'il est en présence d'un élément de tableau. Et il y a autant de nombres dans les parenthèses qu'il y a de dimensions dans le tableau.
s/65=
Votre Oric vous permet de construire des tableaux possédant entre une seule et 88 dimensions. La seule limitation est en fait due à la taille de la mémoire de votre ordinateur.
Ceci nous amène tout naturellement à parler de la taille des tableaux et de la façon de repérer un élément
dans son tableau.
Lorsque nous avons écrit DIM PRIX(4,25), Oric a réservé la place nécessaire pour stocker le tableau PRIX, et pour lui le tableau a la structure suivante :
article SON sur, Fe ÿ 95 5725: : magasin : : : : ; ; : SU ire de de à NN MES Fe liée au. di, à
Les éléments de la ligne “article” qui se substituent aux lettres A, ..., Z du tableau I sont appelés indices de colonne.
Les éléments de la colonne “magasin” qui se substi- tuent aux numéros des magasins du tableau sont appelés indices de ligne.
Chaque indice de colonne repère une colonne différen- te et chaque indice de ligne une ligne différente.
Pour repérer la “case” dans ce tableau PRIX où est rangé J3, il suffit de donner le nom du tableau, puis le numéro de la ligne où se trouve J3 , c'est-à-dire l'indi- ce de ligne, ici 2,et le numéro de la ligne où se trouve J3 , c'est-à-dire l'indice de colonne, ici 9.
Donc la case du tableau PRIX contenant J3 est la va- riable indicée PRIX(2,9).
_ 66 -
Notez, et ceci est fondamental, que votre Oric fait commencer les indices à 0.
En fait, lors de l'écriture DIM PRIX(4,25), on donne à Oric la variable indicée, c'est-à-dire l'élément du tableau PRIX, qui possède les numéros d'indices les plus grands.
Ceci nous amène à dire que votre microordinateur ne connaît finalement le tableau PRIX que par l'intermédiai- re de ses éléments, les variables indicées.
À la limite, une variable indicée peut être interprê- tée comme une variable “simple” ou “élémentaire”, et de la même façon qu'il admet des variables entières, alpha- numériques ou réelles, Oric admet des tableaux de varia- bles indicées entières, alphanumériques, ou réelles.
— TABLEAUX DE VARIABLES ENTIERES
Oric reconnaît que toutes les variables indicées d'un même tableau sont entières lorsque le dernier caractère du nom du tableau est le symbole %.
Exemple : 5 DIM A%(50)
Toutes les variables indicées de A%(0) à A%(50) doi- vent être entières et comprises entre -32768 et +32767.
Si vous écrivez :
10 A%(0)=1.255 15 PRINT A%(0)
vous constaterez qu'Oric écrira 1, c'est-à-dire qu'il donne le plus grand entier inférieur à 1.255 (comme pour les variables entières, il prend la partie entière).
Bien que la machine accepte l'écriture précédente, il est préférable de toujours affecter à une variable indi- cée entière, un entier ; ceci peut être réalisé à l'aide de la fonction INT (partie entière) éventuellement.
Pour stocker dans ses mémoires un tableau d'entiers, Oric utilise :
. deux octets contenant les 2 premiers caractères du nom du tableau ;
67 =
. deux octets contenant l'adresse du tableau suivant ;
. un octet contenant le nombre de dimensions du tableau ;
. deux octets par dimension contenant la valeur du plus grand indice dans la dimension ;
. deux octets par variables indicées entières. Voyons ceci sur un exemple. Le tableau B%(10,10,10,10) nécessite
pour stocker ses caractéristiques
2:+ 24 1 +2.x 4 = 13: octets (4 dimensions)
pour stocker la valeur de chaque élément.
(11 x 11 x 11 x 11) x 2 = 29282 octets nombre d'éléments dans le tableau
Notez en comparaison que votre Oric dispose au maximum de 49.152 octets de RAM en code machine, et de 39.421 pour l'usage de la RAM en BASIC.
— TABLEAUX DE CHAINES DE CARACTERES
Oric reconnaît que toutes les variables indicées d'un même tableau sont alphanumériques lorsque le dernier
caractère du nom du tableau est le symbole $. Exemple : 5 DIM B1$(50,50)
Toutes les variables indicées de B1$(0,0) à B1$(50,50) doivent contenir des chaînes de caractères.
Si vous tapez 10 B1$(25,10)=23.4 l'interpréteur basic vous signalera l'erreur par le message TYPE MISMATCH ERROR.
Pour stocker dans ses mémoires un tableau de chaînes de caractères, Oric utilisera :
— 68 -—
. deux octets contenant les 2 premiers caractères du nom du tableau ;
. deux octets contenant l'adresse du tableau suivant ;
. un octet contenant le nombre de dimensions du tableau ;
. deux octets par dimension contenant la valeur du plus grand indice dans la dimension ;
. trois octets contenant les paramètres d'iden- tification de chaque variable indicée (adresse en zone mémoire et longueur de la chaîne de caractères affectée à la variable).
Si chaque élément du tableau B1$ contient une chaîne de 10 caractères, votre microordinateur a be- soin de 2+2+1+2x2+3x(51x51)=7812 octets pour stocker les caractéristiques du tableau BIS.
11 ne faut pas oublier que pour chaque chaîne de caractères, Oric utilise, pour la stocker, un nombre d'octets égal au nombre de caractères de cette chaî- ne, donc il a besoin de 51x51x10=26010 octets pour stocker chaque chaîne de caractères affectée au ta- bleau B1l$.
Donc Oric utilise 33822 octets pour stocker BIS.
Vous devez retenir de cet exemple que l'emploi de tableaux de variables alphanumériques peut nécessiter une place mémoire très importante même si ceux-ci ne comportent qu'un petit nombre de variables.
— TABLEAUX DE VARIABLES REELLES
C'est l'option par défaut que la machine prend lors-
que le nom du tableau ne possède pas comme dernier carac- tère $ ou 4.
Exemple : 5 DIM BA(100,50)
Toutes les variables indicées de BA(0,0) à BA(100,5Q}
devront être ,géelles et comprises entre -1.70141 10 et 1.70141 107 .
— 69 -
Pour stocker dans ses mémoires un tableau de réels, Oric utilise :
. deux octets contenant les 2 premiers caractères du nom du tableau ;
. deux octets contenant l'adresse du tableau suivant ;
. un octet contenant le nombre de dimensions du tableau ;
. deux octets par dimension contenant la valeur du plus grand indice dans la dimension ;
. cinq octets par variable indicée réelle. Donc le tableau BA(100,50) nécessite
- pour stocker ses caractéristique 2+2+1+2x2=9 octets — pour stocker la valeur de chaque variable réelle 101x51x5=25755 octets.
Soit en tout 25764 octets.
A noter en comparaison que le tableau BA%(100,50) de mêmes dimensions utilise 10311 octets. Ceci de- vrait achever de vous convaincre de la nécessité qu'il y a de préciser exactement à la machine le type des variables et des tableaux de variables que vous voulez utiliser.
Avant de passer au paragraphe suivant qui va vous rappeler l'utilisation des opérations arithmétiques vues au chapitre précédent, il reste un dernier point
«
à préciser à propos des variables indicées.
Les indices doivent être entiers et strictement positifs ou nuls.
En utilisant les notions vues au chapitre précé- dent et les notions sur les variables indicées, vous êtes en mesure de réaliser le programme “calcul du magasin le meilleur marché".
Essayez !
«0e
3.3 LES OPERATEURS
Un opérateur est un outil qui permet d'éxécuter des opérations mathématiques ou logiques. Oric distingue trois types d'opérateurs, ainsi que vous l'avez vu, les opérateurs arithmétiques, relationnels et logiques (ou booléens).
3.3.1 Les opérateurs arithmétiques
. l'opérateur d'addition noté + . l'opérateur de multiplication noté * l'opérateur de soustraction noté - l'opérateur de division noté / . l'opérateur d'élévation à la puissance noté T
Nous vous rappelons que "A élevé à la puissance B", qui s'écrit ATB signifie que l'on multiplie A par lui- même B fois.
Ainsi écrivons
? 513 [RETURN] 125
B n'est pas nécessairement entier mais A est néces- sairement un nombre réel strictement positif.
Si vous tapez
5 A=-2 10 PRINT AT1.2 RUN
Le basic vous signalera l'erreur par le message ILLEGAL QUANTITY ERROR IN 10.
Bien entendu, les opérateurs arithmétiques n'agissent que sur des nombres entiers ou réels, le résultat étant un nombre qu'Oric considère comme réel.
= 7U.=
3.3.2 Les opérateurs relationnels
. l'opérateur de stricte supériorité noté > (A>B À strictement supérieur à B)
. l'opérateur de stricte infériorité noté « (A<B A strictement inférieur à B)
. l'opérateur d'égalité noté = (A=B À est égal à B)
. l'opérateur de supériorité noté >= (A >B À supérieur ou égal à B) ou = ?
. l'opérateur d'infériorité noté « = (A£B À inférieur ou égal à B) ou = €
. l'opérateur de non égalité noté > « (A ZB A différent de B) ou <>
Vous pouvez remarquer à cet égard la différence fon- damentale de nature entre le signe = opérateur d'égalité et le signe = qui signifie que l'on affecte à une varia- ble le résultat d'une opération arithmétique. Le basic de votre Oric possède une instruction qui permet de ‘“mar- quer” cette différence : c'est l'ordre LET.
Exemple : LET A=1.5+5%4.23
L'ordre LET assigne à A le résultat de l'opération 1.5+5%4.23. Il est facultatif, aussi LET A=5 et A=5 signifient la même chose. Cette signification du signe = vous permet de comprendre pourquoi l'expression
5 A=A+l
est licite, et ce qu'elle signifie ; à la variable A on affecte le résultat du calcul de l'addition A+.
Rappelons que l'instruction 10 C=A=B
signifie qu'à la variable C on affecte le résultat du "test" A=B.
= Por
Dans un test réalisé avec n'importe lequel des opérateurs relationnels,
ce test est positive C vaut -1, ce test est négative à C est affectée la
si la réponse si la réponse valeur 0.
à : à
Donc le résultat d'un test (c'est ainsi que nous appellerons désormais une expression relationnelle) est un entier qui vaut O0 ou -1.
REMARQUE : Pour améliorer la lisibilité de la ligne 10 précédente, c'est-à-dire au niveau de
l'écriture, bien différencier les deux rôles du signe =, vous pouvez adjoindre des parenthèses.
10 C=(A=B)
Le rôle des parenthèses utilisées dans des expres- sions arithmétiques ou logiques sera reprécisé plus loin.
3.3.3 Les opérateurs logiques
. l'opérateur AND qui signifie ET
. l'opérateur OR qui signifie OU
. l'opérateur NOT qui prend la négation.
Les opérateurs logiques, aussi appelés booléens, agissent sur des tests (ou expressions logiques ou rela- tionnelles).
— ACTION DE AND
AND s'utilise ainsi : A AND B, avec A et B expres- sions relationnelles ; l'expression globale A AND B constitue elle aussi un test. Le résultat du test À AND B est positif si la réponse à chacun des deux tests A et B est positive.
— ACTION DE OR
OR s'utilise ainsi : A OR B, avec À et B tests ; l'expression globale A OR B constitue elle aussi un test.
=-73
Le résultat du test A OR B est positif si l'une au moins des réponses, à l'un des deux tests À ou B, est positive.
— ACTION DE NOT
NOT s'utilise ainsi : NOT A, avec À test. L'expres- sion globale NOT A constitue elle aussi une expression logique. Le résultat du test NOT A est l'opposé du résul- tat du test A.
Ainsi, si la réponse au test A est "vrai", alors la réponse au test NOT À est "faux" et réciproquement.
3.3.4 Règles d'évaluation des expressions arithmétiques
et logiques
L'expression 2+3*4 peut s'interpréter de deux façons, soit (2+3)x4=20, soit 2+(3x4)=14.
Pour lever cette ambiguïté Oric utilise des règles d'évaluation, c'est-à-dire que certaines opérations seront exécutées avant d'autres : cela signifie qu'il y a une hiérarchie naturelle des opérateurs.
L'ordre de priorité décroissant des opérateurs est le suivant
T, NOT, * /, + —-, tous les opérateurs relationnels, AND, OR.
Exemple : PRINT 273+2%3 [RETURN] 14
Oric a effectué cette opération de la façon suivante: Calcul de 273(=8) puis de 2*3 (-=6) puis finalement de (273}+(2%3)=-14.
Mais si vous, vous vouliez qu'Oric calcule (27(3+2))*3, il suffit d'afficher cette opération sur l'écran de télévision comme elle est écrite sur cette feuille. Ce sont les parenthèses qui permettent de modi- fier à volonté l'ordre des opérateurs.
Lorsque vous utiliserez des parenthèses dans les opérations arithmétiques ou logiques, les opérations situées à l'intérieur des parenthèses seront effectuées avant celles qui sont à l'extérieur des parenthèses.
= 74 =
Si vous avez plusieurs niveaux de parenthèse (parenthèses imbriquées) ce sont les opérations situées dans les parenthèses les plus “intérieures” qui seront effectuées les premières, et ainsi de suite. Vérifiez toujours que vous avez autant de parenthèses ouvrantes “(" que de
parenthèses fermantes ; Sinon votre Oric vous signa- lera l'erreur par le message SYNTAX ERROR.
Sur l'exemple précédent (27(3+2))*3, il y a deux niveaux de parenthèses :
(2 TT (3+2))*3 2ème niveau ler niveau
Maintenant que nous avons défini les "objets" qui seront manipulés dans vos programmes, il ne nous reste plus qu'à voir les ordres basic qui vont constituer la charpente de ceux-ci.
3.4 LES INSTRUCTIONS BASIC FACULTATIVES
Nous avons choisi d'appeler ainsi certaines instruc- tions basic qui, si elles sont employées, ne sont pas prises en compte, ou bien si elles sont absentes, amènent la machine à prendre une option par défaut. Leur emploi est tout de même fondamental puisqu'elles améliorent de façon considérable la lisibilité du programme.
3.4.1 CLEAR
Cet ordre permet de remettre toutes les variables numériques à zéro et les variables alphanumériques à la chaîne “vide”. Cette instruction n'a pas d'utilité en début de programme, puisque l'ordre RUN que vous utilisez poour lancer le programme initialise automatiquement tou- tes les variables à zéro ou au vide.
Avant d'utiliser cette instruction vérifiez que tou- tes les valeurs calculées dans les instructions précédant CLEAR ne vous sont plus d'aucune utilité après cet ordre. (Ne pas mettre CLEAR dans les boucles FOR ... NEXT et REPEAT ... UNTIL par exemple).
— 75 —
3.4.2 DIM
Cette instruction que nous avons déjà rencontrée permet de dimensionner un tableau. Elle est facultative. En effet si vous écrivez comme première instruction :
5 BEC(1,1,1) = 7
Oric considère que BEC est un tableau de réels et que la variable indicée de BEC qui possède les indices les plus grands est BEC(10,10,10).
BEC possède donc 11xllx11=1331 éléments.
Donc, si vous n'utilisez pas DIM, à la première variable indicée qu'il trouvera, Oric allouera un tableau dont la variable de plus haut niveau d'indice sera 10 dans chaque dimension.
Lorsqu'un tableau est dimensionné, il ne peut être redimensionné dans la suite du programme.
Ainsi : 5 DIM A(30) 10 DIM A(35) RUN
provoque l'affichage du message REDIM'D ARRAY ERROR. De même
5 A(1)=0
10 DIM A(35)
provoque l'affichage du même message.
Ceci s'explique parce qu'Oric, rencontrant la varia- ble indicée A(1) à la première ligne du programme, consi- dère par défaut que À est un tableau de 11 éléments. La ligne suivante est alors considérée comme une tentative de redimensionnement du tableau A.
L'ordre DIM doit précéder toute instruction où un élément du tableau dimensionné par DIM est utilisé, pour être licite.
Vous devez vous souvenir que lorsque vous écrivez DIM A(35), cela signifie que A(35) est l'élément du plus haut indice du tableau A, et que le tableau A possède 36 éléments A(0), ..., A(35).
— 76 -
3.4.3 END
Cette instruction provoque l'arrêt du programme, mais contrairement à l'ordre STOP que nous verrons ultérieure- ment, n'indique pas le numéro de la ligne où s'est effec-
tué l'arrêt du programme.
Cette instruction n'est pas obligatoire, car l'exécu- tion s'arrête lorsque la dernière instruction physique du programme est rencontrée (sauf si cette instruction est un ordre de transfert, ordre que nous verrons au paragra-—
phe suivant).
3.4.4 FRE
Cette instruction permet de connaître en mode direct ou différé, le nombre d'octets encore disponibles dans la mémoire de votre microordinateur.
Exemple : ? FRE (0)
En mode différé elle a un autre avantage qui peut être très intéressant.
Considérons 5 A$="ABCDE" 10 A$="123456" 15 PRINT AS$
Pour exécuter ce programme, votre Oric stockera :
à la ligne 5 : A, B, C, D, E, l'adresse du premier caractère À, la longueur de la chaîne A$.
à la ligne 10 : As: BC; D:. EE, 1, 2% 3, 4,5; 6,
l'adresse du premier caractère de la chaîne A$, c'est-à-dire 1 et la longueur de la chaîne AS.
Cet exemple vous montre que lors du maniement de chaînes de caractères Oric stocke toutes les chaînes in- termédiaires de calculs, ce qui occupe beaucoup de place. Justement l'ordre FRE permet de remédier à ce problème, car il permet à votre Oric de libérer ses mémoires de ces
bouts de chaînes inutiles et encombrants.
71 =
11 s'utilise sous la forme 1030 A = FRE (" ‘“)
Il permet, lors du maniement de chaînes de caractè- res, de “purger” le contenu des mémoires.
REMARQUE : Cet ordre est évidemment indispensable lors du maniement de grandes chaînes de caractères ou lorsqu'il y a beaucoup d'opérations effectuées sur ces chaînes. Par contre cet ordre demande un certain temps d'exécution.
3.4.5 LET
Cette instruction qui est facultative assigne une valeur à une variable.
Exemple : 5 LET A=3
Bien entendu, la variable et la constante doivent être de même type. (Si la variable est entière, la cons- tante étant réelle, la valeur effective assignée à la variable est l'entier immédiatement inférieur.
3.4.6 STOP
Cette instruction provoque l'arrêt de l'exécution du programme.
Si vous tapez
10 A=10
15 STOP
20 PRINT A RUN
Oric répond
BREAK IN 15 C'est-à-dire que, lors de l'utilisation du mot STOP, le programme s'arrête là où cet ordre est interprêté et il y a affichage du numéro de la ligne où se situe l'ordre qui
a provoqué l'arrêt du programme.
— 78 -
3.4.7 REM
Cette instruction a pour seul but de vous permettre d'insérer des commentaires dans vos programmes.
Lorsque l'interpréteur basic rencontre cette instruc- tion en début de ligne, celle-ci est considérée comme inexistante. Ainsi, si vous mettez plusieurs instructions basic sur la même ligne (ce qui est permis par le carac- tère :) où REM est le premier ordre, ces instructions ne seront pas prises en compte.
Exemple : 5 REM PROGRAMME D'ESSAI : A=1 : PRINT A 10 STOP RUN
Sur l'écran vous voyez s'afficher : BREAK IN 10
Cette instruction est fondamentale car il ne faut pas oublier que la principale qualité d'un programme est, outre sa justesse bien entendu, sa lisibilité. Celle-ci permet aux utilisateurs et à l'auteur... de comprendre pas à pas ce qu'effectue le programme lors de sa lecture.
Toutes les instructions que nous venons de voir sont "facultatives". Elles ont un autre point commun dans la mesure où l'interpréteur basic les prend en compte sui- vant l'ordre croissant du numéro de la ligne dans laquel- le elles se trouvent. Nous allons voir à présent des instructions qui permettent de modifier l'ordre de dérou- lement d'un programme, c'est ce que l'on appelle des ordres de transfert.
3.5 LES INSTRUCTIONS DE TRANSFERT
Le basic de votre microordinateur distingue deux types d'instruction de transfert.
3.5.1 Les ordres de transfert inconditionnels — GOTO Cet ordre indique, à l'interpréteur, d'aller exécuter
_- 79 -
4
les instructions à partir d'une ligne donnée du program- me.
Exemple : 5 I=I+l 10 GOTO 5 15 END RUN
Sur cet exemple vous pouvez voir que le nombre qui suit l'ordre GOTO (5) est entier, c'est le numéro de la ligne où l'on veut se brancher. Ce nombre est exprimé explici- tement mais peut aussi être calculé comme dans l'exemple suivant
5 I = 20
10 GOTO I
15 STOP
20 PRINT I 251 =1-35 28 GOTO I
L'entier qui suit GOTO doit effectivement correspon- dre à un numéro de ligne existant dans le programme.
Eliminez les modifications précédentes et écrivez
10 GOTO 30 RUN
Il n'y a pas de ligne 30 dans le programme, le message d'erreur UNDEF'D STATEMENT ERROR s'affiche sur l'écran.
Si vous revenez à l'exécution du programme initial, vous vous rendez compte qu'effectivement le programme se rebranche toujours à la ligne 5... et vous ne passez jamais par la ligne 15. Autrement dit ce programme ne peut pas s'arrêter de lui-même. Pour ‘reprendre la main” vous êtes obligé de taper [CTRL] [C] ou d'appuyer sur [RESET], touche située à l'opposé du clavier.
Cet exemple vous montre donc ce qu'est une boucle sans fin.
C'est en fait la chose dont il faut se méfier avec cette instruction GOTO. En général on remédie à ce pro- blème en utilisant un ordre de transfert conditionnel (voir plus loin).
— 80 -
Loa ON .…. GOTO
Cette instruction est, elle aussi, un ordre de trans- fert inconditionnel, mais elle s'emploie un peu différem- ment de GOTO.
Voyons ceci sur l'exemple suivant :
5 REM EXEMPLE D'UTILISATION DE L'£INSTRUCTION ON ... GOTO
10 INPUT "I=";I
15 ON I GOTO 25, 30
20 STOP
25 PRINT "LORSQUE I=1 LE TRANSFERT S'EFFECTUE SUR"
26 PRINT "LA PREMIERE ETIQUETTE DU GOTO"
27 GOTO 10
30 PRINT “LORSQUE I=2 LE TRANSFERT S'EFFECTUE SUR"
31 PRINT "LA DEUXIEME ETIQUETTE DU GOTO"
35 GOTO 10
Pour I entrez successivement 1, 2, 3 et observez ce qui se produit, puis relancez le programme et entrez O0, 255, 256, -1.
Vous voyez donc que lorsque vous tapez ON I GOTO 25, 30, I se rapporte à la position du numéro de ligne sur laquelle on veut se brancher : I doit donc être un en- tier. Si vous entrez un réel, Oric effectuera l'opération qui vous est maintenant familière : il affecte à I le plus grand entier inférieur à ce réel.
Lorsque vous avez entré 256 ou -1, la machine répond ILLEGAL QUANTITY ERROR. Ceci vous prouve que I doit tou- jours être positif, d'une part, et d'autre part que vous n'avez droit qu'à 255 numéros de lignes derrière le GOTO.
Lorsque vous avez tapé O0 ou 3, vous vous êtes rendu compte que la machine s'arrêtait à la ligne 30, c'est-à- dire que si I est nul ou si I est plus grand que le nom- bre d'étiquettes derrière le GOTO (I1£<255), l'instruction ON ... GOTO est ignorée et l'interpréteur passe à la li- gne suivante. Bien entendu, les numéros de lignes situés derrière le GOTO sont entiers et explicités. Ils doivent correspondre à des numéros de lignes existants.
- 81 -
3.5.2 Les ordres de test ou de comparaison Ka IF . THEN . ELSE
Cet ordre que vous avez vu au chapitre précédent appartient au deuxième type d'instruction de transfert : c'est un ordre de transfert conditionnel.
Rappelons, sur l'exemple vu pour l'instruction GOTO, le fonctionnement de IF ... THEN ... ELSE.
5 I=I+1
10 PRINT I
15 IF (I > 1000) THEN STOP ELSE GOTO 5 RUN
Lors de l'exécution vous voyez défiler sur l'écran tous les nombres entiers de 1 à 1000 puis BREAK IN 15 ; que s'est-il passé ?
La ligne 15 se traduit littéralement par :
Si I > 1000 alors l'exécution s'arrête, sinon le program- me se branche à la ligne 5 et c'est ce que permet de fai- re cette instruction.
Sa syntaxe est IF A THEN B ELSE C. À est un test (ex- pression logique) B et C étant des instructions basic. Si la réponse au test A est “vrai”, l'ordre B est exécuté sinon c'est l'ordre C qui est exécuté.
L'ordre ELSE est facultatif. S'il est absent et que le test À est faux le programme passe à la ligne suivan- te. Si le test A est vrai, l'ordre B et exécuté comme précédemment.
Si vous écrivez IF A THEN cette instruction de trans- fert n'a aucune action.
Si ELSE est utilisé, B ne devra pas comporter d'opé- rations arithmétiques, sinon il apparaîtra le message SYNTAX ERROR IN lorsque B sera exécuté.
Le programme suivant vous montre un exemple simple d'utilisation de l'instruction IF ... THEN ... ELSE.
— 82 —
10 REM SAISIE DE DONNEES
20 REM
30 INPUT "NOM DE L'ARTICLE";NS
40 INPUT "PRIX";PX
50 PRINT NS, PX
60 INPUT “VALIDEZ-VOUS CES DONNEES ‘"; AS
70 IF ((A$<>"O") AND (A$<>"N")) THEN 60 ELSE IF (A$="O") THEN PRINT "DONNEES ENTREES" ELSE 30
80 END
Faites exécuter ce programme plusieurs fois en tapant par exemple :
DRAP puis 70. puis N (non) puis O (oui)
à la question VALIDEZ-VOUS CES DONNEES ?
REMARQUE : Il ne peut y avoir dans une instruc- tion basic plus de deux tests IF consécutifs. Par exemple, la ligne 70 du programme ci-dessus serait refusée, si vous remplaciez l'instruction PRINT "DONNEES ENREGISTREES" par l'instruction nouvelle IF (PX=0) THEN 40.
Nous avons donc vu les instructions basic qui permet- tent d'exécuter des instructions d'une ligne de program- me, à partir d'une autre. Par ailleurs vous avez vu un exemple de “boucle” que l'on peut effectuer à l'aide de l'ordre IF ... THEN ... ELSE GOTO. En fait le basic de votre Oric a des commandes qui sont spécifiques à ce genre de cas ; ce sont ces instructions que nous allon examiner maintenant. :
3.6 LES BOUCLES Le basic de votre microordinateur possède deux ins- tructions spécifiques et distinctes pour faire du calcul
répétitif qu'on appelle boucles
L'instruction FOR ... TO ... STEP ... NEXT ...
et l'instruction REPEAT UNTIL
— 83 -
Ces deux groupes d'ordres permettent de faire répéter autant de fois que l'on veut les instructions situées entre les deux lignes qui constituent la syntaxe des deux groupes d'instruction.
3.6.1 FOR ... TO ... STEP ... NEXT ..e
Voyons l'utilisation de cette instruction sur un exemple
5 REM CALCUL DU MAGASIN LE MEILLEUR MARCHE 10 DIM PRIX(4,25) : DIM PANIER(4) 15 REM ENTREE DES DONNEES ET CALCUL DU PRIX DE CHAQUE PANIER 20 FOR I=0 TO 4 STEP l|
22 IPI1=I+l
25: FOR J=0 TO 25 STEP !
27: JP1=J+1
30: PRINT “QUEL EST LE PRIX DU PRODUIT No";JP1; "DANS LE MAGASIN";IP1
33: INPUT PRIX(I,J)
35: PANTER(I)=PANIER(I)+PRIX(I,J)
40: NEXT J
45: NEXT I
50 REM RECHERCHE DU MAGASIN LE MEILLEUR MARCHE
55 K=PANIER(O) : L=0
60 FOR I=1 TO 4
65 IF (K> PANIER(I)) THEN L=I
70 IF (K> PANIER(I)) THEN K=PANIER(I)
72 NEXT I
73 LP1=L+1
75 PRINT "LE MAGASIN No";LP1;"EST LE MEILLEUR MARCHE CE MOIS-CI"
80 END
Examinons la syntaxe de cette instruction de boucle.
À la ligne 20, nous avons FOR I=0 TO 4 STEPI et en 45 NEXT I. Ceci signifie que toutes les instructions situées entre les lignes 20 et 45 seront exécutées tant que le réel I (qui est appelé indice de la boucle) sera infé- rieur à 4. Ici O0 est la valeur initiale de I et 4 la borne supérieure de I. l est le nombre qui est ajouté à I chaque fois que l'instruction de la ligne 45 est exécutée (on dit que l'on incrémente I de 1 lorsque NEXT I est exécuté).
— 84 —
Le test de comparaison de I et de sa borne supérieure n'est effectué qu'à l'instruction NEXT I, ce qui signifie que, quelle que soit la valeur de I, les instructions qui sont dans la boucle seront effectuées au moins une fois.
Dans la ligne 60 vous voyez que STEP n'a pas été utilisé. En fait ce mot est facultatif ; lorsqu'il n'est pas employé la machine prend par défaut un pas égal à 1.
En résumé la syntaxe de l'instruction s'écrit :
FOR I=A TO B STEP C
NEXT I
A, Bet C sont des nombres réels quelconques (ç peut être négatif), ce sont les paramètres de la boucle. Lors- que I est supérieur ou égal à B (si C est positif) ou I inférieur ou égal à B (si C est négatif), la boucle est "désactivée"; c'est l'instruction qui est après NEXT I dans le programme qui est alors exécutée. Il est forte- ment déconseillé de modifier les paramètres de la boucle à l'intérieur de celle-ci.
Dans les lignes qui sont situées dans la boucle peut figurer n'importe quel ordre basic. Vous pouvez utiliser un ordre GOTO pour sortir d'une boucle. Mais ceci n'est pas recommandé car le basic, n'ayant jamais exécuté le test (I supérieur ou égal à B ou L inférieur ou égal à B) avec une réponse positive, considère que la boucle est toujours active bien que, physiquement, ce ne soit pas le cas.
Vous pouvez, bien entendu, mettre une instruction FOR +. TO ... STEP ... NEXT ... dans une boucle (voir ligne 25 à ligne 40 de l'exemple précédent) ; dans ces condi- tions on dit que l'on est en présence de boucles imbri- quées. La syntaxe des boucles imbriquées est :
10 FOR I=Al TO Bl STEP C1 100 FOR J=A2 TO B2 STEP C2 | 200 NEXT J 300 NEXT I
_- 85 -
Les indices des deux boucles doivent avoir un nom différent, sinon la boucle extérieure est rendue inacti- ve. Il n'y a aucun inconvénient à ce que deux boucles non imbriquées aient le même indice (cf exemple précédent). Il y a incrémentation sur l'indice extérieur à chaque fois que la boucle intérieure est “désactivée”. On ne peut pas imbriquer plus de 10 boucles les unes dans les autres, sans obtenir le message NEXT WITHOUT FOR ERROR. Si vous laissez plus de dix boucles “actives” parce que vous “sortez” de celles-ci par l'ordre GOTO, le même message s'affichera.
La syntaxe 10 FOR I=A1 TO B1l STEP C1
100 FOR J=A2 TO B2 STEP C2
200 NEXT I
300 NEXT J
où, vous le remarquez, deux boucles se "croisent", est
erronée. En présence de telles boucles, il y a affichage du message d'erreur NEXT WITHOUT FOR ERROR.
Considérons le problème suivant : on se propose de trouver des triplets de nombres 2 2 (As B, C) À, B, C compris entre Ll et N tels que =ç? (côtés d'un
triangle rectangle). Une solution classique de ce problè- me est le triplet (3, 4, 5). On peut écrire le programme suivant : 5 REM RECHERCHE DES CARRES DE PYTHAGORE JUSQU'A UN CERTAIN RANG
8 CLS 10 INPUT “VEUILLEZ ENTRER LA BORNE SUPERIEURE N';N
15 FOR A=L TO N 17 AX=INT(A) 20: FOR B=1 TO N 23: BX=INT(B)
25: FOR C=1 TO N
27: CY=INT(C)
30: IF ((A%%A%+B%XB%-CXkC%)=0) THEN PRINT A,B, C
35: NEXT C
40: NEXT B
45 NEXT A
50 END
— 86 -—
Vous remarquerez que l'exécution de ce programme est longue, surtout lorsque N est grand. La question que l'on peut se poser est : peut-on remédier à ce problème ?
Dans ce programme, on peut observer quelques points “"litigieux".
Dans le test de la ligne 30 vous constatez que l'on calcule dans la boucle la plus intérieure les produits AX*A% et B%*B% à chaque incrémentation sur C. Or les deux variables A% et B% sont indépendantes de C. Par consé- quent dans la boucle
25 FOR C=1 TO N 35 NEXT C
AX%*A% et BX*B% sont des constantes ; il est inutile de les recalculer dans cette boucle. Ces produits doivent donc être évalués à l'extérieur de la boucle.
Il faut donc retenir pour vos programmes futurs que lorsque vous utiliserez des boucles, il faut vérifier si à l'intérieur de celles-ci vous n'effectuez pas des opé- rations sur des variables indépendantes de l'indice de la
boucle.
Pour ce programme spécifique, il est encore possible d'améliorer la vitesse d'exécution. En effet, il est inutile de faire jouer à À et B le même rôle puisque, par exemple, les triplets (3, 4, 5) et (4, 3, 5) sont en fait igensiques. On décide que A sera inférieur à B, et A +B =C montre que À et B sont strictement inférieurs à C (d'ailleurs A est alors strictement inférieur à B). Ceci permet de modifier les paramètres des diverses boucles, afin de diminuer le nombre d'itérations.
Ainsi : C variera de L à N B variera de L à C-1 À variera de INT (SQR(2*C-1)) à B-1
Il faut en fait retenir de cette dernière série de modifications que lorsque l'on utilise des boucles, jil faut, en fonction du problèm que l'on veut résoudre, choisir avec une très grande minutie les valeurs des bornes des boucles.
ST
Le programme modifié s'écrit :
REM RECHERCHE DES CARRES DE PYTHAGORE JUSQU'A UN CERTAIN RANG CLS INPUT "VEUILLEZ ENTRER LA BORNE SUPERIEURE N" 3; N FOR C=1 TO N CX=INT(C) C14=CX*CZ N1=C-1 N2=INT (SQR(2*C-1)) FOR B=1 TO N1 BX=INT(B) RX=C17-BX*BX N3=B-1 FOR A=N2 TO N3 AY=INT(A) IF(R%-A%%*A%=0) THEN PRINT À, B, C NEXT A NEXT B NEXT C END
- Remarquez l'utilisation du caractère : qui permet
d'améliorer la
3.6.2 REPEAT
lisibilité.
.<.. UNTIL
Voyons un exemple de cet autre type de boucle
90 100 110 120 130 140
REM DEVINETTE D'UN CHIFFRE CHOISI PAR ORIC NB#%=INT(9*RND(1))
REPEAT
INPUT "ENTREZ UN CHIFFRE"; C#
NCX=NCZ+1
UNTIL (NB%=C#)
PRINT “VOUS AVEZ TROUVE EN";NC#;" COUPS" ON NC% GOTO 90, 90, 90, 110, 110, 110, 130, 130, 130
PRINT “CHANCE EXCELLENTE"
END
PRINT “CHANCE MOYENNE"
END
PRINT “PAS DE CHANCE"
END
— 88 -
Ce qui peut se traduire littéralement par
“Répéter les instructions situées entre REPEAT et UNTIL jusqu'à ce que la réponse au test soit positive".
La fonction de cette boucle est donc un peu différen- te de FOR ... TO ... NEXT ... car c'est à vous de prévoir les itérations successives et les incrémentations sur la variable testée. Cette possibilité d'incrémenter à l'aide d'une fonction quelconque apporte plus de souplesse, mais il se peut que l'on ne puisse sortir de la boucle.
Exemple : 5 REPEAT 10 PRINT “JE BOUCLE SANS FIN, SANS FIN..." 15 UNTIL (I=1)
Vous voyez dans ce cas extrême que si vous n'incrémentez pas suffisamment sur la “variable de boucle” qui est testée, la boucle REPEAT ... UNTIL est sans fin (par ana- logie avec la boucle FOR ... NEXT, on appelle variable de boucle la variable sur laquelle s'effectue le test).
Pour reprendre la main faire [CTRL] [C] ou [RESET].
3.7 SOUS-PROGRAMMES
3.7.1 Présentation
La notion de sous-programme n'est pas évidente a priori. Présentons-la dans un exemple.
10 X=0 : y=0
20 GOSUB 70
30 PRINT A
40 X=5 : Y=15
50 GOSUB 70
55 PRINT A
60 END
70 REM SOUS-PROGRAMME
80 IF (X=5) THEN PRINT X ELSE A=Y-X 90 IF (X=0) THEN PRINT X ELSE A=X-Y 100 RETURN
— 89 -
Un sous-programme est utile pour éviter de répéter plusieurs fois des lignes d'instructions identiques, dès que l'on utilise deux fois une même séquence basic.
La structure d'un programme utilisant un sous- programme est la suivante
: a 150 GOSUB 1000 :
160 : 2000 RETURN
250 GOSUB 1000 260 : Rs
L'utilisation d'un sous-programme permet aussi de décomposer un programme en parties simples à mettre au
point.
Sur cet exemple nous voyons que l'ordre GOSUB sert à appeler le sous-programme. L'entier qui se trouve der- rière ce mot est le numéro de ligne de la première instruction du sous-programme. Cet entier doit être explicité et non calculé. Cet entier doit bien entendu correspondre à un numéro de ligne existant, sinon Oric affichera le message d'erreur UNDEF'D STATEMENT IN (numé- ro de ligne où figure le GOSUB erroné). Le mot RETURN signifie au basic que le sous-programme est terminé. Donc Oric ne reconnaît qu'une partie de programme est un sous- programme que s'il y a un GOSUB indiquant le numéro de ligne où commence le sous-programme, et un RETURN indiquant sa fin. Les capacités de la machine sont telles que l'on ne peut pas appeler plus de vingt-cinq sous- programmes en même temps (ceci se réalise en construisant des sous-programmes qui font appel à d'autres sous- programmes). Si on le tente il y a affichage du message
OUT OF MEMORY C'est pourquoi le programme suivant
1 GOSUB 100 5 END 100 I=1+1 [110 GOSUB 100 120 RETURN
est interdit puisque le sous-programme écrit sur les lignes 100, 110 et 120 s'appelle lui-même.
00e
Dans ce cas précis, la machine considèrera, après la 25ème “itération” (appel du sous-programme par le sous- programme) qu'il y a plus de 25 appels à des sous-pro- grammes en même temps, et elle affichera donc le message d'erreur ci-dessus.
Pour la cohérence des programmes, il est vivement conseillé d'entrer dans un sous-programme par un GOSUB et d'en sortir par l'ordre RETURN ; et non d'utiliser l'or- dre GOTO.
3.7.2 ON ... GOSUB
Cet ordre est similaire à l'ordre ON ... GOTO, dans une certaine mesure, ainsi que nous allons nous en rendre compte avec l'exemple qui suit
5 FOR I=1 TO 2 10 ON I GOSUB 100,200 : NEXT I 15 END 100 PRINT "LORSQUE I=1 LE SOUS-PROGRAMME DE LA LIGNE 100 EST APPELE" 110 RETURN 200 PRINT “LORSQUE I=2 LE SOUS-PROGRAMME DE LA LIGNE 200 EST APPELE"
210 RETURN Vous voyez donc que ON ... GOSUB fait la même chose que ON ... GOTO, à ceci près que GOTO provoque un trans-
fert inconditionnel alors que GOSUB est un appel à un sous-programme. Nous vous rappelons donc les règles de syntaxe à respecter
1, qui correspond à la position des étiquettes der- rière GOSUB, doit être entier (en fait non alphanuméri- que), et compris entre 0 et 255.
Si I est nul, ou si I est plus grand que le nombre de numéros de ligne situés derrière GOSUB, alors l'ordre ON ... GOSUB est ignoré (ne provoquera pas d'appel à un sous-programme). Bien entendu, les numéros de ligne sont entiers et explicités, ils correspondent à des numéros de ligne existant dans le programme.
_— 91 -
3.7.3 CALL Exemple : CALL A
Cet ordre est un appel à un sous-programme écrit en code machine (aussi appelé langage machine).
A est un entier en base hexadécimale qui indique l'adresse, en mémoire de la machine, de la première ins- truction du sous-programme.
L'utilisation du langage machine demande beaucoup de précaution dans la mesure où l'interpréteur basic de votre Oric ne peut pas en contrôler la validité.
De plus, vous devez être absolument certain que les instructions que vous allez utiliser ne vont pas “pol- luer"” les zones mémoires réservées au basic de l'Oric. Dans le cas où vous modifiez le contenu de ces mémoires, il se pourrait que vous ne puissiez même pas revenir au programme basic qui appelait le sous-programme en langage machine.
3.7.4 DEF USR Exemple : DEF USR=A avec À entier en base hexadécimale.
Cette instruction permet de définir l'adresse en mémoire de la première ligne d'un programme écrit en lan- gage machine.
3.8 LES FONCTIONS 3.8.1 Fonctions numériques internes
Plusieurs fonctions numériques existent dans le basic de l'Oric. Ces fonctions sont monovariables, c'est-à-dire qu'elles n'agissent que sur UNE seule variable.
Nous donnons ci-dessous une liste de ces fonctions sans les expliquer en détail, car elles ont été déjà uti-
lisées précédemment, ou bien elles demandent d'importan- tes connaissances mathématiques.
— GENERATION D'UN NOMBRE ALEATOIRE RND(X) retourne un nombre aléatoire compris entre 0 et 1.
_- 92 -
,
si X est positif, un nouveau nombre est généré à chaque appel,
si X est nul, le dernier nombre est généré à nouveau,
si X est négatif, le nombre correspondant à X est PR RP TT fa ED. S. , — » générée (table de nombres en mémoire).
— FONCTIONS MATHEMATIQUES SIMPLES ABS(X) valeur absolue de X
INT(X) partie entière de X (plus grand entier infé- rieur à X
SGN(X) signe de X SQR(X) racine carrée de X
— FONCTIONS MATHEMATIQUES COMPLEXES ATN(X) arctangente de X COS(X) cosinus de X EXP(X) exponentielle de X LN(X) logarithme népérien de X LOG(X) logarithme décimal de X SIN(X) sinus de X TAN(X) tangente de X
Ces fonctions sont décrites avec plus de détails en annexe A.
3.8.2 Fonctions traitant les chaînes de caractères
Oric offre plusieurs fonctions à une seule variable permettant de manipuler les chaînes de caractères. Cel- les-ci peuvent se classer en trois groupes
- conversion code ASCII/caractère et réciproque
- conversion chiffre/caractère et réciproque
- manipulation, extraction de chaînes de caractères
— 93 —
- FONCTIONS DE CONVERSION CODE ASCII/CARACTERE
Ces fonctions sont utiles pour avoir accès à des caractères spéciaux, ou pour accéder directement à la représentation des chaînes de caractères en mémoire.
CHR$S(X) génère le caractère de code ASCII égal à X 0 £<X< 31 caractères spéciaux 32<X <128 lettres et chiffres
ASC(X$) fournit le code ASCII du premier caractère de la chaîne XS.
Exemple : 10 PRINT CHR$S(65) donne le caractère A
10 PRINT ASC("A") donne la valeur 65 - FONCTIONS DE CONVERSION CHAINE DE CARACTERES /NOMBRE
Ces fonctions sont utiles si l'on veut par exemple demander dans un programme l'entrée d'une donnée qui peut être une lettre (A-Z), ou un chiffre (0-9).
STRS(X) crée une chaîne contenant les chiffres X
Exemple : 10 AS=STRS(45) Après exécution de cette instruction, la va- riable alphanumérique A$ contiendra les ca- ractères "45".
VAL(XS) est l'entier correspondant à la valeur numé- rique de la chaîne
Exemple : 10 B$="1579ABC" 20 C=VAL(B$) Après exécution des instructions 10 et 20, la variable numérique contiendra la valeur 1579.
— FONCTIONS DE TRAITEMENT DE CHAINES DE CARACTERES
Plusieurs fonctions du basic de l'Oric permettent d'extraire des caractères ou des sous-chaînes d'une grande chaîne.
LEFTS(AS,X) crée la chaîne constituée des X premiers caractères de A$.
Exemple : 10 CS=LEFTS("ABCDEFGHIJ",3) La variable alphanumérique C$ contiendra ABC. — 94 —
La fonction RIGHTS joue le même rôle que LEFTS, mais en extrayant les caractères à partir de la droite.
Exemple : RIGHTS$("0123456",4)="3456"
Il est possible d'extraire des caractères situés au milieu d'une chaîne de caractères.
La fonction MIDS(A$,D,X) a un argument supplémentaire qui est le rang, dans la chaîne, du caractère à partir duquel on désire effectuer l'extraction.
Exemple : MIDS("0123456",3,4)="2345"
Deux autres fonctions encore existent, qui traitent les chaînes de caractères.
LEN(AS$) fournit la longueur de la chaîne A$ Exemple : LEN("0123456")=7
+ est un opérateur de concaténation (mise bout à bout) de chaînes de caractères.
Exemple : "01"+"23456"="0123456"
3.8.3 Création de fonctions utilisateurs
Supposez que dans un programme vous ayez besoin - à de nombreuses reprises et sans possibilité d'utiliser des boucles - d'une fonction du type :
sin(5x)+3x2exp(xt3)+ABS(L/xtcosx)
Vous vous rendez bien compte qu'il serait vite fasti- dieux de réécrire à chaque fois cette expression numéri- que. C'est pourquoi votre Oric dispose d'instructions permettant de construire vos fonctions et de vous en servir comm de fonctions internes de la machine.
Ces instructions sont
DEF FN ... pour la construction de la fonction
FN ... pour son appel
_- 95 -
Exemple d'utilisation :
— construction de la fonction “explicite” : 1000 DEF FNA(X)=SIN(5*X)+3*X#*X#EXP (X+3 )+ABS((1/X)+COS(X))
La syntaxe est donc DEF FN nom de la fonction = expression numérique ou alphanumérique. Le nom de la fonction suit les règles de formation des noms de varia- bles, c'est-à-dire :
. le premier caractère du nom est alphabétique (A, +, Z majuscule) ;
. les autres caractères du nom sont alphanumériques (A, cc, Z, O0, ..., 9) 3
. seuls les deux premiers caractères sont pris en compte par la machine pour caractériser la fonction ;
. pas de mots réservés dans les noms de fonctions.
Les fonctions peuvent être numériques ou alphanumériques. Ainsi
DEF FNA(X) définit une fonction numérique (réelle). DEF FNA$(X) définit une fonction alphanumérique.
Bien entendu l'expression derrière le signe = doit être du même type que la fonction.
Ce sont les caractères FN placés devant le nom de la fonction qui indiquent à l'interpréteur basic qu'il n'est pas en présence d'une variable indicée.
Les “appels” à la fonction utilisateur s'effectuent de la façon suivante.
Sur l'exemple précédent : 2005 PRINT FNA(5) En fait vous devez faire comme si (FN nom de la fonc- tion) était le nom de votre fonction et vous en servir comme d'une fonction interne à la machine. De plus sa
définition doit précéder son utilisation.
= 96 -
Bien entendu ces fonctions dites explicites sont, ainsi que les fonctions internes, dépendantes d'une seule variable. Si vous avez besoin de fonctions agissant sur plusieurs variables vous ferez appel à ce qui a été vu au paragraphe précédent : les “sous-programmes"”.
3.9 LES ORDRES D'ENTREES/SORTIES
Les instructions que nous allons voir permettent d'échanger des informations entre l'extérieur (c'est-à-
dire vous) et le microordinateur. Certaines de celles-ci vous sont déjà familières.
3.9.1 INPUT Exemple d'utilisation :
5 INPUT "ENTREZ LES DONNEES" ,1l;I,,1$ RUN
Lorsque l'interpréteur basic rencontre cet ordre, il écrit le commentaire suivant
ENTREZ LES DONNEES ?
et il attend que vous entriez les données (tant qu'elles ne sont pas entrées, le programme est stoppé). Pour en- trer les données vous pouvez faire ainsi :
1.23,4.50 E3,"TOTO" [RETURN]
les trois données sur la même ligne séparées par une LL LL 22
Ou bien ? 1.23 [RETURN] 2? 4.50 E3 [RETURN] 22 “TOTO" [RETURN]
et toutes solutions intermédiaires entre ces deux extréê- mes.
Les données ne sont prises en compte que si vous
tapez sur [RETURN], donc toute donnée peut être corrigée avant d'actionner cette touche. Par contre les données ne
- 97 -
sont pas conservées d'une exécution sur l'autre, ce qui oblige à les retaper toutes à chaque exécution. Bien entendu, vous devez entrer autant de données qu'il y a de variables derrière INPUT, et les données doivent être du même type que les variables auxquelles elles sont affec- tées.
3.9.2 GET Exemple d'utilisation
5 GET A 10 PRINT A RUN
Lorsque vous utilisez cette instruction, le basic attend une donnée constituée d'un seul caractère, qui est soit numérique (0-9) si la variable est réelle, ou quel- conque si la variable est alphanumérique (le caractère est tout de même différent de “). L'exécution est arrêtée tant que le caractère n'est pas tapé sur le clavier. Le basic prend en compte le caractère dès que vous le tapez sur le clavier (pas besoin de [RETURN] pour enregistrer la donnée). Le caractère tapé n'apparaît pas sur l'écran (aucun moyen de correction possible par l'opérateur. Correction par le programme).
3.9.3 KEYS Exemple d'utilisation
5 REPEAT
10 PRINT “TAPEZ SUR + POUR ARRETER" 15 UNTIL (KEY$="+")
20 END
KEY$ effectue grosso modo la même chose que GET, dans la mesure où on rentre un caractère du clavier ; mais la différence fondamentale est que le programme n'est pas stoppé si vous ne répondez pas (si vous n'entrez pas de données). Cet ordre est donc essentiel pour les jeux (graphiques en particulier), qui seront abordés au pro- chain chapitre.
— 98 -
3.9.4 READ -— DATA Exemple d'utilisation :
5 READ A,B,C$
20 PRINT A,B,C$
50 DATA 1.253,454,"TOTO" 60 END
READ assigne aux variables A, B, C$ des valeurs sto- ckées pour une instruction DATA. READ joue à peu près le même rôle que INPUT, sinon qu'au lieu de rentrer les don- nées en cours d'exécution, elles sont entrées dans le programme grâce à des instructions DATA. Les caractères séparant les données dans les instructions DATA sont des virgules. La syntaxe est :
READ variable 1, variable 2, ...
Si variable 1 est la nifæ variable rencontrée depuis le début du programme dans un ordre READ, elle recevra la valeur de la n°" donnée stockée dans un ordre DATA ou dans des ordres successifs. Bien entendu la valeur de la n donnée et n variable doivent être, de même type. Cette assignation n°°% variable - n donnée est rendue possible grâce à un “pointeur de liste de données" qui passe d'une donnée à une autre au fur et à mesure de leur lecture.
3.9.5 RESTORE
Cet ordre permet de remettre le “pointeur de données" à sa position initiale.
Exemple d'utilisation :
5 READ A,B,A$
10 RESTORE
15 READ A1,B1,A1S
20 PRINT A,B,AS$,A1,B1,A1S
25 DATA 1,0,"LE CHAPITRE EST FINI" 30 END
2.902
3.10 CONCLUSIONS
Au cours de ce long chapitre nous avons vu les ordres basic qui constitueront la charpente de vos programmes.
Nous avons essayé de vous sensibiliser à certains aspects de la programmation et à certaines méthodes per- mettant d'améliorer vos programmes. Pour bien saisir toutes les possibilités de ces instructions, vous devrez vous armer d'un peu de patience et surtout vous entraîner à faire vos propres programmes.
Dans les prochains chapitres vous allez apprendre à vous servir d'instructions plus distrayantes, permettant d'utiliser les possibilités graphiques et sonores de votre Oric.
— 100 -
CHAPITRE 4
Possibilités
graphiques de l'oric
4.1 INTRODUCTION
Au moment où vous entamez la lecture de ce chapitre, vous avez déjà amplement fait connaissance avec votre mi- croordinateur. Vous avez, en effet, appris à jouer et à converser avec votre machine ; vous avez également com- mencé à programmer, en utilisant le langage BASIC, ce qui vous permet d'ores et déjà de concevoir des programmes relativement élaborés.
Pourtant il vous reste encore à découvrir toute la gamme de possibilités mise à votre disposition par Oric, et à compléter l'ensemble des commandes basic rencontrées jusqu'à présent.
Votre microordinateur va en effet vous permettre de réaliser des graphiques simples, complexes, colorés, immobiles, mouvants, ou encore clignotants si vous le désirez. Il vous permettra également de construire des sons, ou même des morceaux de musique si vous êtes passionné de solfège.
Inutile de préciser le parti que vous pouvez tirer de ces capacités sonores et graphiques pour améliorer la richesse et la variété de vos jeux, ou simplement agré- menter vos programmes par des couleurs ou des sons.
— 101 -
Nous commencerons par présenter les possibilités graphiques en définissant tout d'abord les divers modes graphiques que vous utiliserez, puis en passant en revue les commandes de chaque mode.
4.2 LES MODES GRAPHIQUES On peut classer ces modes en deux groupes :
Le premier est constitué par les modes graphiques basse résolution.
le second groupe comprend le mode unique correspon- dant aux graphiques haute résolution.
Nous allons préciser, dans les paragraphes suivants, les notions de mode,;et de haute ou basse résolution.
4.2.1 Les modes basse résolution
TEXT, LORES O0, LORES 1, sont les noms des trois modes graphiques composant le premier groupe. Vous connaissez très bien le premier d'entre eux : TEXT, puisque c'est celui que vous avez utilisé jusque là.
Qu'est-ce qu'un mode graphique ?
Un mode graphique, avec l'ensemble des commandes qu'il comprend, constitue une option qui conditionne la manière d'écrire ou de faire imprimer un point ou un ca- ractère sur l'écran.
Décrivons le mode TEXT pour préciser davantage. Lors- que vous mettez Oric en marche, c'est ce mode qui appa- raît automatiquement. Comme vous l'avez remarqué, vous disposez, en mode TEXT, de la totalité de l'écran pour écrire vos programmes ou lancer vos ordres, hormis la première colonne sur laquelle vous ne pouvez pas écrire. Lorsque toutes les vingt-sept lignes de l'écran ont été utilisées, celles-ci défilent vers le haut, jusqu'à lais- ser apparaître une ligne libre en bas de l'écran.
Jusqu'à présent, vous n'avez utilisé le mode TEXT que
— 102 -
pour des besoins d'écriture. Vous allez maintenant ap- prendre à vous en servir pour réaliser vos premiers des- sins, grâce aux commandes qui seront détaillées dans les paragraphes suivants.
Mais auparavant, présentons les deux autres modes graphiques basse résolution : LORES 0 et LORES 1.
On passe du mode TEXT au mode LORES O0 ou LORES 1 en tapant LORES O ou LORES 1 ; on repasse au mode TEXT en tapant TEXT. Le nom du mode peut donc être considéré com-
me une commande permettant d'accéder à ce mode, commande qu'on peut utiliser dans un programme.
Après avoir tapé : LORES 0, vous voyez l'écran se transformer. Vous constatez alors que le fond de l'écran devient noir à l'exception de la ligne du bas et des deux premières colonnes. Le curseur se trouve dans cette der- nière ligne. Si vous y écrivez, vous verrez la surface en fond noir diminuer au fur et à mesure que vous introdui- sez de nouvelles lignes. Les premières colonnes à gauche
sont inaccessibles à l'écriture.
Vous avez peut-être déjà tapé LORES 1. Là encore, l'écran se transforme de la même façon que pour LORES O0. Mais quoi que vous essayiez de taper, vous verrez appa- raître à la place des caractères attendus (et habituels) des blocs aux formes étranges. Vous venez de prendre contact avec la “forme alternée des caractères", et en même temps de mettre en évidence la seule différence entre les modes LORES O0 et LORES 1.
Vous n'aviez jusqu'ici utilisé que la “form stan- dard” des caractères, à laquelle nous sommes tous habi- tués ; c'est celle que nous rencontrons en mode TEXT ou en mode LORES O0.
Mais quelle que soit la représentation choisie : forme standard en mode TEXT ou LORES 0, ou forme alternée en mode LORES 1, les caractères ont toujours la même signification. Ainsi, l'ordre "PRINT", commun aux trois modes, exerce la même action en mode LORES 0 ou en mode LORES 1.
En mode TEXT, la première colonne de gauche abrite un
— 103 -
paramètre contrôlant la couleur du fond de l'écran ; la seconde abrite un paramètre contrôlant la couleur de l'avant-plan, des caractères. En mode LORES (0 ou 1) apparaît un paramètre supplémentaire - contrôlant les formes standard ou alternées des caractères - qui est placé dans la première colonne de gauche.
Il y a près d'une centaine de caractères (A, , ,S$, etc...). À chacun d'eux on peut associer une forme étran- ge, qui est la forme alternée du caractère. Le nombre et la variété de ces nouveaux caractères vous permettront de construire des dessins originaux en associant les blocs les uns aux autres.
Comment obtenir la forme alternée d'un caractère standard, d'une manière simple et rapide ? L'instruction suivante vous le montre.
PRINT 65, CHR$S(27);"1";CHR$S(65)
Vous verrez alors s'imprimer 65 et plus loin un bloc correspondant au caractère alterné de A. En effet, 65 représente le nombre code ASCII du caractère A. (ASCII pour American Standard Code for Information Interchange). Vous trouverez en annexe la liste des codes ASCII de tous les caractères ; ce sont des nombres compris entre 32 et 125. La commande permettant d'obtenir le caractère cor- respondant à son nombre code est CHR$ ; ainsi CHR$(65 )=A.
Vérifiez-le en tapant PRINT CHRS(65)
La commande réciproque permettant d'obtenir le code ASCII d'un caractère est ASC :
ASC("A")=65
Mais 27 est inférieur à 32 : il ne représente donc pas un nombre code ASCII. Ici, 27 est un attribut, c'est- à-dire qu'on peut lui faire jouer un rôle particulier. Par exemple ici l'ensemble CHR$(2/7);"I" a pour action de sélectionner la forme alternée de CHR$S(65). Si vous sup- primez CHR$(27);"l"; et tapez : PRINT 65, CHR$(65), vous verrez À s'imprimer après 65.
- 104 -
Vous pouvez bien sûr remplacer 65 par tout autre nom- bre compris entre 32 et 125, mais vous devrez garder CHR$S(27);"1l".
Exemple : PRINT 100, CHR$S(27);"I";CHR$(100)
27 n'est pas le seul attribut pouvant être utilisé après CHR$. Les nombres entre 0 et 31 peuvent être consi- dérés comm attributs.
Employés avec CHR$, ils ont surtout un intérêt pour les sorties sur imprimante. Ils permettent entre autre de choisir la grandeur des lettres, ou de faire avancer le papier, etc... Certains ont cependant une action sur les sorties écran ; tapez
PRINT CHR$(12)
Vous obtiendrez un résultat équivalent à celui de l'ordre CLS.
Nous utiliserons par la suite CHR$ avec d'autres attributs en particulier 8 et 9.
Nous n'avons fait, pour l'instant, que présenter les trois modes graphiques basse résolution. Il est temps d'entrer plus avant dans les détails.
Commençons par expliciter le terme basse résolution.
En mode LORES O0, et LORES L ou TEXT, l'écran est divisé en un certain nombre d'unités élémentaires : des cellules, qui constituent un quadrillage de cet écran. Ces cellules sont de petits carrés : il y en a 39 colon- nes verticales, et 27 lignes horizontales.
26 IE
Ces cellules, comme on peut le voir sur le schéma, sont numérotées de O à 38 dans le sens horizontal et de 0 à 26 dans le sens vertical.
— 105 -
En fait, ce quadrillage peut servir à constituer un repère formé d'une origine et de deux axes. L'origine sera, par définition, le coin en haut et à gauche de l'écran, les deux axes seront x et y définis par le schéma
x horizontal de gauche à droite ; y vertical de haut en bas.
La cellule de coordonnées x et y dans ce repère est donc repérée par le couple (x,y) comme l'indique l'exem- ple sur le schéma. O<x <38, O<y <26, x et y sont comptés à partir de l'origine.
La taille des cellules est telle qu'un caractère, quel qu'il soit, occupe exactement une cellule.
Cette division de l'écran constitue ce que l'on ap- pelle la basse résolution. En effet il est possible de diviser l'écran beaucoup plus finement encore : c'est l'objet du mode haute résolution.
4.2.2 Le mode haute résolution
Il se nomme HIRES ; son nom, comme celui des autres modes, constitue une commande qui permet d'accéder à ce mode.
Ayant tapé HIRES vous voyez alors le fond de l'écran devenir noir, mais constatez aussi qu'il reste au bas de l'écran trois lignes de mode TEXT. Ces trois lignes cons- tituent une fenêtre qui vous permet de formuler des com- mandes (et surtout de voir ce que vous écrivez), tout en ayant sous les yeux les dessins que vous êtes en train de tracer.
Nous sommes en haute résolution : la division de l'écran en unités élémentaires est donc beaucoup plus fine qu'en basse résolution. Les cellules des modes TEXT et LORES sont devenues des pixels, c'est-à-dire des points, constituant l'élément graphique de base.
Tapez : CURSET 120,100,1 (en mode HIRES) Vous verrez apparaître un point au centre de l'écran qui vous montrera ce qu'est un pixel. (Nous reviendrons bien
sûr sur la commande CURSET tout-à-l'heure).
— 106 -
Horizontalement, l'écran est divisé en 240 pixels, tandis que verticalement, il est divisé en 200 pixels. En mode HIRES, tout l'écran est disponible en largeur pour l'impression des pixels.
On peut là encore élaborer un repère à partir du maillage constitué par les pixels. L'origine est toujours le coin haut à gauche de l'écran, un axe x horizontal va de gauche à droite, un axe y vertical va de haut en bas.
o4t3 239 “..
Lignes en mode TEXT
Les pixels sont numérotés de O0 à 239 horizontalement, et de O0 à 199 verticalement.
Voici donc présenté ce mode haute résolution graphi- que.
Si vous cherchez à comparer les divers modes graphi- ques, vous constaterez que TEXT et LORES O sont très proches l'un de l'autre. Nous avons vu ce qui différen- ciait LORES 1 de LORES O0.
Quant au mode HIRES, nous pouvons dire qu'il n'a rien de commun avec les trois premiers, si ce n'est les trois lignes de mode TEXT. Nous verrons qu'également, au niveau des commandes, LORES O0, LORES 1 et TEXT sont assez voi- sins l'un de l'autre (les commandes diffèrent peu ou pas d'un mode à l'autre).
Par contre le mode HIRES a des commandes qui lui sont spécifiques.
Les premières commandes graphiques que l'on va intro- duire sont des commandes communes aux quatre modes TEXT, LORES O0, LORES 1 et HIRES. Elles concernent les couleurs.
— 107 -
On distingue les couleurs d'arrière-plan ou “papier” et les couleurs d'avant-plan : l'encre". Il y a donc deux commandes qui sont
PAPER N et INK N
où N est un nombre variable compris entre 0 et 7, qui contrôle la couleur, suivant le tableau suivant
noir rouge vert jaune bleu nagenta cyan blanc
YOU 5 &w ND ©
Essayez ces deux commandes, jusqu'à trouver les cou- leurs du fond d'écran, et les caractères qui vous con- viennent le mieux. Bien sûr, si l'encre et le papier sont de même couleur vous ne voyez plus rien.
Tapez : 10 FOR A = O TO 7 20 FOR B = 7 TO O STEP -1 30 INK À : PAPER B 40 WAIT 100 50 NEXT B 60 NEXT À
4.3 LES COMMANDES GRAPHIQUES
4.3.1 Commandes graphiques basse résolution
La première commande rencontrée sera PLOT X,Y,A$. Utilisons-la tout de suite.
Vous êtes en mode TEXT ou LORES O (ou LORES 1)
Tapez PLOT 15,10,"BONJOUR"
— 108 -
En mode TEXT et LORES 0, BONJOUR va aller s'imprimer au milieu de l'écran, le caractère B occupant la cellule (15,10). En LORES 1, le résultat sera le même, mais BOUJOUR (comme d'ailleurs votre commande) sera écrit sous forme alternée.
PLOT x,y,A$ placera donc le premier caractère de la chaîne A$ dans la cellule de coordonnées x, y. Attention à ne pas sortir de l'écran en donnant un x ou un y trop grand. Si vous tapez
PLOT 10,10,"H"
vous verrez apparaître un H sur l'écran. À la place d'une chaîne alphanumérique, on peut aussi mettre un nombre, pour le troisième argument de PLOT. Ainsi, tapez :
H=65 PLOT 15,10,H
La caractère A apparaît, car 65 est le code ASCII de A.
Voici un programme utilisant les formes alternées des caractères et la commande PLOT. Il s'agit d'un balayage horizontal de l'écran par des caractères de forme alter- née. Ceci montre l'importance de la commande PLOT, qui vous permet de placer facilement un caractère et de le faire évoluer sur l'écran, ce qui peut avoir un grand intérêt pour les jeux.
1 REM *%** BALAYAGE *%% 5 LORES 1 6 A=0:C$=" " 10 A$="61" 20 REPEAT 30 FOR B=0 TO 35 40 PLOT B,A,A$ 50 PLOT B,A,C$ 60 NEXT B 70 A=A+1 80 FOR C=35 TO O STEP-1 90 PLOT C,A,A$ 100 PLOT C,A,C$ 110 NEXT C 120 A=A+1 130 UNTIL A=26
— 109 -
Ce programme vous montre comment créer l'illusion du mouvement : voir les lignes 40 et 50, ou les lignes 90 et 100.
Si vous voulez avoir les caractères standard, rempla- cez en ligne 5 LORES 1 par LORES O.
Si vous êtes exigeant au point de vouloir mélanger les deux types de caractères, vous en avez la possibili- té. Voyons comment.
On utilise deux expressions qui ont une action réci- proque l'une sur l'autre. L'expression CHR$S(8) permet, lorsqu'on est en mode LORES 1, de faire apparaître des caractères standard.
L'expression CHR$(9) permet, réciproquement, lors- qu'on se trouve en mode LORES 0, d'obtenir des caractères de type alterné. De plus, CHR$(9) peut servir, en LORES 1, à revenir aux caractères de type alterné, après utili- sation de CHR$(8).
De même, CHR$S(8) sert, en LORES 0, à retrouver les caractères de type standard après utilisation de CHR$(9). (Souvenez-vous que pour x< 31, CHR$(x) exerce une action particulière, et ne donne un caractère que pour x >32, x étant le nombre code ASCII de ce caractère).
Comment utilise-t-on CHR$S(8) et CHR$(9) dans la pra- tique ?
Les manipulations suivantes fournissent la réponse.
Tapez : 10 LORES 1 20 A$=CHR$(8)+"BONJOUR"+CHRS(9) 30 B$="LORES 1" 40 PLOT 15,10,B$ 50 PLOT 15,12 ,A$
puis : 10 LORES 0 20 A$=CHR$S(9)+"BONJOUR"+CHRS(8) 30 B$="LORES 0" 40 PLOT 15,10,B$ 50 PLOT 15,12,A$
— 110 -
La concaténation (opération rencontrée aux lignes 20), permet, lorsque l'on est en LORES 1 par exemple, de considérer à l'exécution de la commande PLOT 15,12,A$, la chaîne de caractères : BONJOUR, comme filtrée par CHR$(8) ce qui va la faire imprimer en caractères standard. L'im- pression de BONJOUR une fois réalisée, CHR$S(9) fait reve- nir à la forme originale.
La seconde commande est SCRN(x,y). SCRN vient de SCREEN (écran en anglais). Son but est d'aider l'utilisa- teur à connaître le caractère qui occupe la cellule de coordonnées x, y sur l'écran.
Ainsi, après avoir tapé CLS pour nettoyer l'écran, si vous effectuez la commande PLOT 10,15,"H", vous verrez bien sûr apparaître la lettre H dans la cellule de coor- données 10, 15. Tapez alors :
PRINT SCRN(10,15)
Le nombre 72 vous sera alors fourni ; c'est en effet le code ASCII du caractère H.
Peut-être vous demandez-vous comment on peut utiliser cette commande. L'exemple qui suit vous montre les servi- ces qu'elle peut rendre dans un jeu.
1 TEXT 5 C$=" " 10 FOR N=1 TO 8 12 M=N+8 20 PLOT 10,M,"O" 30 NEXT N 40 C=2 50 A=INT(RND(1)*26) 60 REPEAT 70 PLOT C,A,"X" 80 WAIT 4 90 PLOT C,A,C$ 100 IF SCRN(C+1,A)=79 THEN C=34 110 C=C+1 120 UNTIL C=35 130 GOTO 40
- 111 -
A la ligne 100, 79 représente le code ASCII de O0. On utilise alors le résultat numérique fourni par SCRN pour tester si au coup suivant le "X" atteindra le "O0".
Terminons ce paragraphe sur les commandes basse réso- lution par l'utilisation des couleurs, et des attributs.
Tapez : 10 LORES O0 : F=0 20 C=0:A=10:B=10 30 R=10:D=2*P1/50 40 REPEAT 50 PLOT A+R*SIN(C) ,B+R*COS(C) ,18+F 60 C=C+D:IF C >2%*PI THEN F=1 70 UNTIL C >4%PI
Commentaires :
La ligne 30 définit D comme l'incrément de l'angle dont on tourne pour placer les cellules les unes après les autres. La ligne 20 définit le centre du cercle par À et B, et le rayon par R. La ligne 50 choisit les couleurs
des diverses cellules ; nous reviendrons sur ce point.
D doit être suffisamment grand pour qu'on puisse passer d'une cellule à la suivante assez rapidement.
cellule
centre D
Mais surtout, il ne doit pas être trop grand, sinon les cellules ne seront plus jointives.
cellule centre cellule
D'autre part, x=A+R*sin(C) a peu de chances d'être en- tier. Comment la commande PLOT va-t-elle interprêter ces coordonnées non entières ? Elle va simplement choisir la cellule correspondant à INT(x),INT(y). C'est-à-dire que PLOT x,y,'A" est équivalent à PLOT INT(x),INT(y),"A". Vérifiez-le sur plusieurs exemples.
— 112 -
Parlons maintenant des couleurs et attributs. Vous le constatez : grâce à ce programme, on peut faire interve- nir la couleur après la commande PLOT, par le choix des attributs de couleur. Les attributs considérés dans le programme contrôlent la couleur du papier (de la cellu- le). Ils sont alors compris entre 16 et 23, c'est-à-dire qu'ils valent 16+N, N variant de O0 à 7. Les attributs
D
correspondant à l'encre varient de O à 7.
En mode LORES, la commande PLOT suivie d'un ordre de couleur, ne colorie qu'une cellule : tapez
LORES O PLOT 10,15,20
Si par les commandes INK ou PAPER vous changez l'encre ou le papier, vous ne changerez pas la couleur de cette cellule, et le fond - en LORES - restera toujours noir.
Mais en mode TEXT, PLOT suivi d'un attribut de cou- leur, colore la cellule choisie, mais également toute la
4
ligne ou partie de ligne à droite de cette cellule.
Tapez : TEXT : PAPER 7 PLOT 15,15,17 PLOT 20,15,23
Vous pouvez ainsi obtenir des surfaces quelconques colorées comme vous le voulez. Ici encore les ordres PAPER ou INK ne changent pas la couleur des cellules que vous avez colorées. Mais d'autres commandes PLOT sur ces cellules en changent bien sûr la couleur.
Les attributs de couleur sont donc les nombres de 0 à 7 pour l'encre, et de 16 à 23 pour le papier. Tous les attributs sont compris entre O0 et 31. Vous trouverez en annexe H leur liste et leur action. Mais montrons le rôle de l'attribut 12 tout de suite à titre d'exemple.
Tapez : 1 TEXT 5 FOR N=1 TO 24 10 PRINT “TEXTE POUR REMPLIR L'ECRAN" 20 NEXT N 30 PLOT 10,10,5 40 PLOT 11,11,18 50 PLOT 12,12,12
- 113 -
Vous constatez que l'attribut 12 produit un clignote- ment. Vous constatez également que les attributs n'affec- tent que les cellules situées à leur droite, et qu'une cellule est affectée par la commande PLOT + ATTRIBUT,
située la première à sa gauche. Enfin si vous tapez
LORES 0 PLOT 10,10,19.1
Bien que 19.1 ne soit pas entier, la commande fonction- nera néanmoins 3; là encore, elle équivaudra à PLOT 10,10,INT(19.1).
4.3.2 Commandes du mode HIRES Pour obtenir ce mode, il suffit de taper : HIRES.
La première commande va nous faire découvrir le curseur HIRES. Cette commande est CURSET X,Y,FB. En tapant CURSET 120,100,1 vous verrez alors apparaître un point au centre de l'écran : c'est le curseur HIRES. X,Y sont les coordonnées du pixel, du point de l'image repé- rant le curseur. Pour la commande CURSET, elles seront toujours repérées par rapport au coin haut et gauche de l'écran.
Le troisième paramètre intervenant dans l'ordre CUR- SET est le nombre code FB (pour Foreground, Background). 11 a quatre valeurs, c'est-à-dire :
FB = O0 couleur du fond (ou du papier des lignes TEXT de la fenêtre) 1 couleur de l'encre 2 inversion des couleurs 3 sans effet
FB conditionne la manière dont sera imprimé le cur- seur sur l'écran. Pour voir l'effet de ce nombre code, tapez :
HIRES
CURSET 120,100,1 CURSET 120,150,2 CURSET 120,50,3 CURSET 100,100,0
- 114 -
A cette commande CURSET, on peut associer une comman- de de même type : CURMOV X,Y,FB. La seule différence avec CURSET, c'est que pour CURMOV, X et Y sont les coordon- nées relatives à la dernière position du curseur.
Tapez : HIRES CURSET 120,100,1 CURMOV 10,10,1
pour obtenir confirmation.
Attention à ne pas sortir de l'écran (Oric vous enverrait un message d'erreur) : si À et B sont les coor- données de la dernière position du curseur, on doit respecter
0 £& X+A < 239 0 < Y+B < 199
On peut bien sûr tracer des traits avec CURSET ou CURMOV mais cela oblige à placer le curseur successive- ment sur tous les points du trait.
Il existe une commande simple permettant de tracer un segment de droite : c'est l'ordre DRAW X,Y,FB. Il permet de tracer un trait à partir de la dernière position du curseur, jusqu'au point A+X, B+Y (si A et B étaient les coordonnées de la dernière position du curseur). DRAW déplace le curseur qui occupe désormais la position AK, B+Y.
Exemple d'utilisation :
10 HIRES
20 CURSET 120,50,3 30 DRAW -50,50,1 40 DRAW 50,50, 1
50 DRAW 50,-50,1 60 DRAW -50,-50,1
Améliorons encore nos possibilités en passant à la commande PATTERN.
PATTERN est un mot anglais signifiant modèle, ce qui va prendre tout son sens.
= 115
Nous venons d'utiliser la commande DRAW, en ne tra- çant que des traits continus. Vous voulez tracer facile- ment et rapidement des traits mixtes ou pointillés ? Rien de plus facile.
Avant tout, nous devons nous souvenir qu'Oric “pense” en binaire, c'est-à-dire uniquement avec des 0 ou des 1 groupés par huit, formant alors un octet.
Un octet peut donc représenter des nombres allant de:
00000000 11111111 (binaire)
pe
0 255 (décimal)
C'est cette disposition de 0 ou de 1 à la suite les uns des autres qui permet d'obtenir des traits interrom- pus. Vous pouvez utiliser pour cela tout nombre entre 0 et 255 ; le trait obtenu sera interrompu selon la repré- sentation binaire de ce nombre. Ainsi si vous tapez :
1 HIRES
5 CURSET 60,30,1 10 PATTERN 15 20 DRAW 120,0,1
15 en binaire s'écrit 00001111
Examinons le résultat obtenu. Vous constatez que les quatre premiers points du trait ne sont pas imprimés, que les quatre suivants le sont, et ainsi de suite.
Les quatre premiers points correspondent aux quatre 0 par lesquels commence le nombre 15 en binaire.
Les quatre suivants, vous l'avez compris, correspon- dent aux quatre L par lesquels finit le nombre 15 en binaire.
Si vous remplacez 15 par 170 - qui en binaire s'écrit 10101010, - vous obtiendrez des pointillés plus serrés.
Lorsque vous mettez Oric en marche, c'est le nombre
modèle 255 qui est sélectionné ; c'est pourquoi vous tra- cez des traits pleins avec DRAVW.
— 116 -
Pour le moment, en mode HIRES, vous n'avez pu faire imprimer des caractères que dans les trois lignes de mode TEXT du bas de l'écran. Or, il existe une commande qui va vous permettre de placer un caractère (ou plusieurs) sur la partie haute résolution de l'écran, à l'endroit qui vous plaît.
Cette commande est CHAR X,S,FB.
Vous êtes en mode HIRES. En tapant encore HIRES, vous enlevez de l'écran tous les dessins qui s'y trouvaient. Tapez alors CURSET 120,100,1 : vous voyez le curseur HIRES se placer au centre de l'écran. Tapez maintenant CHAR 65,0,1 : vous voyez alors la lettre "A" s'imprimer au milieu de l'écran, là où se trouve le curseur HIRES.
Avant d'employer CHAR, vous devez donc choisir, par la commande CURSET, l'endroit de l'écran où vous désirez faire afficher un caractère. Puis, vous déterminez les trois paramètres X,A,FB qui suivent l'ordre CHAR.
X est le code ASCII du caractère que vous voulez fai- re imprimer ; ASC("A")=65.
S vaut O0 ou 1. Le O0 correspond à la forme standard des caractères, le 1 à la forme alternée.
FB est le nombre paramètre déjà rencontré dans les commandes CURSET, CURMOV ou DRAW, qui contrôle les cou- leurs.
Voici un programme, qui vous montre comment utiliser la commande CHAR.
10 HIRES
20 A$="BONJOUR"
30 CURSET 30,30,3
40 FOR N=1 TO 3
50 READ X,Y
60 FOR A=1 TO LEN(A$)
70 CHAR ASC(MIDS(AS,A,1),0,1) 80 CURMOV X,Y,0
90 NEXT A
100 NEXT N
110 DATA 10,10,0,10,10,-10
OUPS
LEN est une fonction donnant la longueur d'une chaîne de caractères : LEN(AS).
MID$S(A$,A,L) ne considère les caractères de la chaîne A$ qu'à partir du Aième et au nombre de L. Si A$= "BONJOUR" MIDS(A$,3,2) équivaut à : NJ.
La commande que nous allons maintenant étudier va vous permettre de tracer des cercles très facilement.
Elle se présente comme suit : CIRCLE R,FB. R est un paramètre correspondant au rayon du cercle.
FB est le nombre paramètre contrôlant les couleurs déjà rencontré. Pour tracer un cercle, vous devez con- naître l'emplacement de son centre, et la valeur de son rayon.
Vous pouvez déterminer la position du centre par la commande CURSET.
Ainsi, si vous tapez
HIRES CURSET 120,100,3 CIRCLE 50,1
Vous obtiendrez un cercle de rayon 60, dont le centre a pour coordonnées 120 et 100. Attention à bien choisir la position du centre et la valeur du rayon, afin de ne pas sortir de l'écran.
Vos cercles sont tracés en trait plein. Mais comme pour la commande DRAW, vous pouvez faire intervenir la commande PATTERN pour obtenir des cercles en traits interrompus.
10 HIRES 20 CURSET 120,100,3
30 FOR X=49 TO 1 STEP-2 40 CIRCLE X, 1
50 INK INT(X/7)
60 PATTERN 50-X
70 NEXT X
— 118 -
La commande suivante : POINT permet de déterminer si un point, un pixel de l'écran est imprimé dans la couleur de l'encre de l'arrière-plan, du papier, ou dans celle de l'avant plan.
Si vous êtes passé du mode HIRES en mode TEXT, vos dessins haute résolution ont bien sûr disparu, mais ils sont cependant conservés dans la mémoire de l'écran.
Pour les enlever de la mémoire, vous devez taper NEW. Revenons au mode HIRES. Tapez :
HIRES CURSET 50,50,0
Tapez maintenant
TEXT PRINT POINT(50,50)
Oric vous répond O0 puisqu'en effet le curseur était imprimé dans la couleur du fond de l'écran (ou du pa- pier). Si en mode HIRES, vous aviez tapé CURSET 50,50,1
c'est-à-dire si vous aviez fait imprimer le curseur dans la couleur de l'encre, alors une fois revenu en mode TEXT
PRINT POINT(50,50) vous aurait fourni comme réponse : -l (et non pas 1).
Passons maintenant à la commande la plus riche, sans doute la plus performante, mais aussi la plus complexe. 11 s'agit de la commande FILL A,B,X.
Elle vous permet de remplir une portion de l'écran (déterminée par vous) dans la couleur que vous avez choi- sie. Ou encore, elle vous permet de faire clignoter les dessins se trouvant dans une certaine région de l'écran. Elle peut encore faire bien d'autres choses, et vous découvrirez l'ensemble de ses innombrables possibilités à l'usage.
FILL est suivi de trois paramètres A,B,X. À correspond au nombre de lignes horizontales. En
mode HIRES, il y a 200 lignes de pixels.
= 119%
À est un paramètre qui contrôle le nombre de lignes sur lequel FILL va agir. De même B est un paramètre con- trôlant le nombre de colonnes sur lequel va agir cette commande.
Quant à X, c'est le paramètre qui sert à obtenir la nature de l'effet cherché : couleur, clignotement, etc...
Voici un petit programme qui dispose des couleurs à l'aide de cette commande.
5 HIRES 10 FOR N=1 TO 22 20 FILL 3,1,17 21 FILL 3,1,18 22 FILL 3,1,19 24 NEXT N
Montrons d'abord le rôle du paramètre A.
Tapez : HIRES FILL 10,1,17 FILL 30,1,18
Vous constatez deux choses
10 lignes se remplissent de rouge à la première com- mande FILL ;
30 lignes se remplissent de vert à la seconde comman- de FILL.
À contrôle donc bien le nombre de lignes sur lesquelles va agir FILL.
Vous remarquez ensuite que le curseur HIRES se dépla- ce lorsque vous donnez l'ordre FILL. En effet initiale- ment, il était en (0,0) puis après le ler ordre FILL, il est venu se positionner en (0,10), pour alors remplir les lignes 10 à 40 de vert.
Tapez : CURSET 60,50,1 FILL 30,1,22 FILL 10,1,21
Cette fois, l'ordre FILL n'agit qu'à partir de la position du curseur qui vient se repositionner sur la
même verticale lorsque l'ordre FILL est accompli, mais en
— 120 -
se décalant vers le bas du nombre de lignes modifiées par l'ordre FILL.
Cependant, si vous tapez
CURSET 120,50,1 CURSET 123,50,1 FILL 10,1,17
vous constaterez que la commande FILL n'affecte l'écran qu'à partir de la première position du curseur. Cette remarque nous permet d'introduire le rôle du paramètre B.
Il faut considérer que, sur une ligne, il y a 240 points (ou pixels) rangés par blocs de 6 ; il y a donc 40 de ces blocs. La commande FILL n'agit pas sur un pixel isolé ; en fait elle exerce son action par blocs de 6 pixels.
Pour cela, si vous positionnez votre curseur au hasard sur l'écran, l'ordre FILL agira à partir de la coordonnée horizontale, multiple de 6, qui précède la position réelle du curseur. C'est ce que vous a montré le dernier exemple proposé.
Pour confirmation, tapez :
10 HIRES 20 CURSET 120,100, 1
30 FOR N = 1 TO 25 STEP 1 40 FILL 1,1,18
50 CURSET 120-N, 100+N, 1 60 NEXT N
Ainsi, au lieu d'apparaître sur une oblique, l'impression des couleurs va être disposée en escalier. Nous verrons tout à l'heure comment obtenir une oblique.
Tapez : HIRES FILL 10,1,63 FILL 10,2,63 FILL 10,5,63
Vous voyez apparaître, suivant l'ordre FILL considéré, 1, 2 ou 5 blocs (occupant 6 pixels en largeur). C'est bien sûr le paramètre B qui sert à changer le nombre de ces
blocs.
- 121
Cependant, pour les couleurs, B ne joue aucun rôle.
HIRES FILL 10,2,22 FILL 10,15,19
Toute la ligne se colore à partir du curseur.
Les deux premiers paramètres ont donc été présentés. Attention à ne pas choisir A trop grand (vous sortiriez de l'écran), et à 1e pas prendre non plus des valeurs de B trop importantes : si vous êtes à l'extrême gauche de l'écran, B peut valoir au maximum 40 (il y a 240 = 6x40 pixels sur une ligne).
Passons maintenant au dernier paramètre : X.
Pour O0 £X $<127, vous obtiendrez toute la gamme de
possibilités mise à votre disposition par la commande FILL.
Entre 128 et 255 vous retrouverez les mêmes possibi- lités. Nous n'aurons besoin que de X <127 pour ce para- graphe. En effet Oric, par la commande FILL, ne tient compte que des 6 premiers chiffres de X (en représenta- tion binaire). Or de 128 à 255, il faut 7 bits (Ooul) pour représenter X en binaire.
Entre O0 et 31,X est un attribut. De O0 à 7, il contrôle la couleur de l'encre
HIRES
CURSET 120,100,1 CIRCLE 95,1
FILL 95,1,1
Vous voyez alors un quart du cercle devenir rouge.
De 8 à 15, X permet de passer aux caractères de forme alternée (s'il y a des caractères sur l'écran en partie haute résolution), ou bien de faire clignoter, ou encore d'imprimer les caractères en les doublant sur une verti- cale. Par exemple X = 12 fait clignoter.
— 122 -
Tapez : HIRES CURSET 120,100,0 CIRCLE 95,1 CURSET 0,0,0 FILL 198,1,12
De 16 à 23, X contrôle la couleur du papier :
HIRES FILL 10,1,21
De 24 à 31, X dérègle la synchronisation du balayage de l'écran. Vous retrouverez l'action des attributs en annexe.
Si X >32, X n'est plus un attribut, il devient un modèle (PATTERN) et ce jusqu'à 127.
Tapez : HIRES FILL 10,1,100 FILL 10,1,42
En binaire 100 s'écrit 1100100 42 s'écrit 0101010
FILL imprime les pixels correspondant aux L et non ceux correspondant aux 0. Mais comme le travail s'effectue par blocs de 6 pixels, seuls les 6 premiers bits à partir de la droite composant le nombre seront pris en compte. Ainsi pour 100, FILL lira 100100.
C'est précisément cette notion de modèle qui va nous permettre d'obtenir la disposition en oblique des régions affectées par la commande FILL.
HIRES
CURSET 120,100,1 FILL 1,1,65
FILL 1,1,67
FILL: 1, 1,71
FILL 1,1,79
FILL 1,1,95
FILL 1,1,127
puis CURSET 120,100,1 FILL 10,1,1
— 123 -
11 est impossible de passer en revue toutes les caractéristiques offertes par cette commande, mais voici un aperçu de quelques propriétés que vous complèterez, par expérimentation, selon vos besoins.
Les commandes PAPER ou INK annulent l'action des attributs contrôlant le papier ou l'encre.
HIRES FILL 20,10,20 PAPER 4
Un FILL colorant le papier (16 XK<23) est effacé par
un ordre FILL ayant un paramètre X compris entre 0 et 127.
HIRES
CURSET 0,0, 1 FILL. 10, 1,22 CURSET 0,0,1 FILL 10,3,63
Pour X compris entre 32 et 127, vous obtenez des blocs de pixels sur lesquels vous pouvez effectuer des changements d'encre :
HIRES FILL 10,5,100 INK 4 : PAPER 1
Vous constatez que le premier bloc ne change pas de
couleur, que le second disparaît et que c'est seulement à partir du 3ème bloc que la couleur de l'encre change.
De plus le changement de couleur de papier supprime le premier bloc. Maintenant si vous tapez
HIRES CURSET 0,0,1 FILL 10,5,63 CURSET 0,0,1 FILL 10,1,22
Vous voyez que seul le premier bloc (issu de la première commande FILL) se colore sous l'action d'un ordre FILL comportant un attribut de couleur de papier. Les autres blocs ne changent pas.
- 124 -
Voici un programme, montrant à la fois l'action des divers paramètres X, qui concluera ce paragraphe sur la commande FILL.
10 HIRES
20 FOR À = 1 TO 128
30 IF A>23 AND A < 32 THEN60
40 CURSET RND(1)*100+1,RDN(1)*100 +1,1 50 FILL RND(1)%60+1,1,A
60 NEXT A
Cela vous montre d'ailleurs, qu'il n'est pas nécessaire de fournir des paramètres entiers. CURSET, comm FILL, travailleront avec la partie entière.
A vous maintenant d'entreprendre vos propres manipu- lations pour maîtriser et comprendre l'action des diver- ses commandes du mode HIRES.
Pour terminer cette partie sur les commandes, indi- quons comment on peut obtenir certains effets spéciaux en mode LORES ou TEXT. -
Par exemple, on peut faire imprimer les caractères en double hauteur. Faites [CTRL] [D]. Tout ce que vous écri- rez sera désormais doublé en hauteur. Pour annuler cet effet, tapez [CTRL] [D]. Vous pouvez obtenir le même ef- fet en tapant
PRINT CHR$(4)
Vous trouverez en annexe la liste des caractères de contrôle et de leur action (nous venons de voir celle du caractère de contrôle D) Vous pouvez également faire cli- gnoter des caractères en utilisant le petit programme suivant
5 INK 1
10 PRINT CHRS(12) 20 PRINT CHRS(27);"N BONJOUR" 30 PRINT CHR$(27);'"N BONJOUR"
La ligne 20 comporte l'instruction produisant le cligno- tement. On retrouve l'expression CHR$(27) rencontrée dans un paragraphe précédent. Cette fois elle est couplée à la lettre N, comme l'indique la ligne 20.
La ligne 10 est équivalente à CLS ; elle est indispen- sable pour la bonne exécution du programme. Vérifiez-le
en la supprimant. — 125 -
Nous avons vait également
Tapez : l 2 5
10
20
30
déjà vu que par la commande PLOT on pou- obtenir un clignotement.
CLS
TEXT
FOR N=1 TO 24 PRINT "TEXTE CLIGNOTANT" NEXT N
PLOT 5,12,12
Voici un programme qui va faire intervenir quelques- unes des commandes étudiées précédemment et qui va clore
en le résumant consacrée aux c
10 20
270 500 510 520
par un dessin, cette partie du chapitre ommandes.
HIRES X=40
CURSET 80,100 ,3
PAPER 6 : INK 1
STP =2*PI/40
F = 0
REPEAT
DRAW X#*COS(F),-X*SIN(F), 1
DRAW -X*SIN(F),-X*XCOS(F),1 DRAW -X#COS(F),X*SIN(F), 1
DRAW X*SIN(F),X*COS(F), 1 F=F+STP
X = Xx-1
UNTIL F >2*PI
CURSET 120,80,1
REPEAT
READ A,B
DRAW A,B,1
UNTIL B=0
CURSET 170,40,3
DRAW 10,-10,1
CURSET 160,20 ,3
FOR N=1 TO 10
READ L
CHAR L,0,1
CURMOV 7,0,3
NEXT N
DATA 50,10,-20,-20,-100,-20,60 DATA -40,20,10,70,10,-20,0 DATA 69,78,32,65,86,65,78,84,32,33
— 126 -
GRAPHIQUES AVANCES
Si vous vous reportez à l'annexe G décrivant la carte mémoire d'Oric, vous vous apercevrez que les caractères standard ou alternés sont stockés dans la mémoire vive
(ou RAM) d'Oric. On peut donc accéder à l'endroit de la mémoire où sont rangés ces caractères.
En fait toutes les informations servant à définir un caractère sont rangées par octet (groupe de 8 bits 0 ou 1). Il faut 8 octets pour décrire le caractère. À chacun de ces octets correspond un nombre, qui est l'adresse de l'octet et qui permet de le repérer dans la mémoire.
Un caractère occupera donc 8 adresses dans la mémoi- re. L'ensemble des adresses est compris entre les nombres 46080 et 47104, soit 1024 adresses, ce qui correspond bien à 128 caractères 128 x 8 = 1024.
Les 8 octets définissant un même caractère ont des adresses successives. Ainsi À est contenu dans les octets ayant les adresses :
46600 00001000 )
46601 00010100 )
46602 00100010)
46603 00100010) 8 octets définissant A 46604 00111110 )
46605 00100010)
46606 00100010 )
46607 00000000 )
adresses
Vous voyez que la disposition des 1 parmi les 0 forme l'image d'un A. A l'impression, Oric fera correspondre les 1 à de l'encre et les O0 à du blanc.
Les caractères sont rangés dans l'ordre de leur code ASCII. Ainsi le caractère @ dont le code ASCII est 64 est stocké entre les adresses 46080 + (64 * 8) et 46599 = 46080 + (64 * 8) + 7. A, dont le code ASCII est 65, est stocké aux adresses suivant 46599, soit de 46600 à 46607 (ou de 46080 + (65 * 8) à 46080 + (65 * 8) +7).
- 127 -
Nous allons maintenant prendre connaissance de deux commandes, qui permettent pour la première, de voir ce qu'il y a en mémoire à telle ou telle adresse, et pour la seconde de modifier ce qu'il y a en mémoire.
À l'adresse 46600 est rangé le premier octet définis- sant le caractère À ; il vaut en binaire 00001000, soit 8 en décimal. C'est pourquoi, si vous tapez PRINT PEEK (46600), vous obtiendrez : 8.
PEEK, suivi du nombre adresse de l'octet, vous four- nit donc le contenu de cet octet (en décimal), et peut donc vous permettre de savoir quels sont les octets stockés à n'importe quelle adresse.
POKE vous permet de modifier l'octet rangé à une cer- taine adresse K.
Si vous tapez POKE 46600,15 vous vous apercevrez que vous avez modifié la forme géométrique du caractère A, en modifiant la valeur d'un octet définissant ce caractère.
46600 : 00001000 est devenu 46600 : 00001111
et la variation géométrique de A correspond à la varia- tion de la disposition des 1 dans l'octet 46600.
Vous avez donc maintenant la possibilité de trans- former tous les caractères à votre guise. Si vous avez de la patience et du talent vous pourrez même obtenir un alphabet gothique ou russe. Et si la fantaisie vous en prend, vous pouvez même supprimer tous les caractères en tapant POKE K,0 pour K allant de 46080 à 47104.
Précisons, cependant, qu'après POKE la valeur décima- le de l'octet que vous introduisez doit être comprise entre 0 et 63, ce qui correspond en binaire aux nombres de 6 bits au plus (de O0 à 111111).
En effet, pour tous les caractères, seuls les six derniers bits de chaque octet définissant le caractère, contiennent les informations géométriques servant à dessiner ce caractère.
— 128 -
Voici maintenant un programme qui va vous être très utile pour redéfinir le caractère de votre choix comme
vous le désirez.
l 10 20 30
40 50 60 70 90
REM *** MODIFICATIONS DE CARACTERES *** CLS
DIM X(8):DIM Y(8,8):DIM L(8)
PRINT "ENTREZ LE CARACTERE QUE”,
"VOUS SOUHAITEZ MODIFIER"
GET A$
PRINT A$
C = ASC (AS)
A = 46080 : D = C * 8
GOSUB 1000
100 PRINT “ENTREZ HUIT NOMBRES"
110 PRINT “(UN PAR LIGNE)"
120 PRINT “COMPOSES CHACUN DE"
122 PRINT "SIX ZEROS OU UNS"
130 FOR N = O TO 7
150 INPUT X(N)
160 FOR P = 6 TO 1 STEP -1
170 LA = INT(X(N)/(10T(P-1)))
180 X(N) = X(N)-(10T(P-1)) * LA
190 L(N) = L(N)+LA*(2T(P-1))
200 NEXT P
210 X(N) = L(N)
220 POKE(A+D+N),X(N)
230 NEXT N
240 GOSUB 1000
250 STOP
1000 REM *** SUB.MODIF.CARAC. ***
1010 FOR N = O TO 7
1020 X(N) = PEEK (A+D+N) 1030 FOR M = O TO 7
1040 Y(N,M) = INT(X(N)/27(7-M)) 1050 Z = ((X(N)Î2 (7-M))-Y(N,M))*21(7-M) 1060 X(N) = Z+0.0001 1080 IFY(N,M)= O THEN POKE 48220+(N*40)+M, 32 1090 IFY(N,M)= 1 THEN POKE 48220+(N*40 )M,128 1100 NEXT M
1110 NEXT N 1120 RETURN
Commentaires : Le tableau à deux dimensions : Y(8,8) va stocker un
caractère (sous forme de 8 octets).
— 129 -
Le tableau à une dimension X(8) va décrire successi- vement chaque octet.
On demande tout d'abord de rentrer un caractère (celui que vous souhaitez modifier). On cherche alors l'adresse mémoire de ce caractère grâce à son code ASCII.
Vous introduisez ensuite 8 nombres binaires repré- sentant (écrits les uns au dessus des autres) par la disposition des l1, la nouvelle géométrie du caractère.
Ces nombres binaires seront alors traduits en déci- mal, avant d'aller modifier (par POKE) les anciens oc- tets.
Les lignes 1080 et 1090 font afficher le nouveau caractère (à grande échelle) sur l'écran.
32 (caractère blanc) correspondant ici
0 et 128 (bloc plein) correspondant ici 1
à | à
Mais les adresses mémoire ne concernent pas unique- ment les caractères. Elles concernent aussi les adresses
liées à l'écran ; chaque région de l'écran correspond à une adresse mémoire.
Si vous vous reportez à la carte mémoire d'Oric, vous trouverez les adresses mémoires concernant les lieux géo- métriques de l'écran, en mode TEXT et en mode HIRES. Il y en a beaucoup plus en mode HIRES, parce que la résolution est plus fine dans ce mode et que l'on a besoin de davan- tage d'adresses pour se repérer.
Nous allons utiliser ces adresses tout-à-l'heure.
Auparavant, il est nécessaire de reparler des attri- buts que nous avons déjà rencontrés pour les commandes PLOT (en mode TEXT ou LORES) et FILL (en mode HIRES).
Ces attributs, dont le rôle est défini en annexe, sont toujours compris entre O0 et 31 et ont les mêms actions, utilisés avec la commande POKE, ou avec les
commandes PLOT et FILL.
Tapez par exemple
— 130 -
10 FOR N + 1 TO 24
20 PRINT "TEXTE POUR REMPLIR L'ECRAN" 30 NEXT N
50 POKE 48162,12
Vous voyez alors une ligne clignoter. 48162 est une adresse mémoire correspondant au lieu de l'écran où le clignotement apparaît, et 12 est l'attribut qui provoque le clignotement.
Dans le programme ci-dessus, vous pouvez changer cet attribut et vérifier que son action, lorsqu'il varie de 0 à 31, concorde avec celle décrite par les annexes.
Si dans la ligne 50 vous changez 48162 en 48200, vous constaterez que l'action de l'attribut se décale d'une
ligne vers le bas.
En effet, en mode TEXT ou LORES, il y a 40 cellules par ligne et à chacune d'elle correspond une adresse. Pour changer de ligne il faut donc ajouter 40 à l'adresse mémoire.
adresse J —+ ligne I
+ ligne I +1
adresse J + 40
De même, en mode HIRES, nous avons vu avec FILL que
les pixels (les points) n'étaient pas pris en compte individuellement, mais qu'Oric les considérait groupés
par bloc de six.
Comme il y a 240 pixels par ligne, il y a 40 de ces blocs, et à chacun de ces blocs correspondra une adresse mémoire.
Il y a donc, en mode HIRES, comme en mode LORES ou TEXT, 40 adresses mémoire par ligne.
Tapez : HIRES
POKE 41000,21 POKE 41040, 22
“131 :=
Mais les attributs ne constituent pas les seuls para- mêtres pouvant être placés après l'ordre POKE.
En fait, un octet, de par la façon dont les 0 ou les 1 qui le composent sont disposés, conditionne la manière de faire imprimer un caractère ou afficher une couleur sur l'écran.
Suivant la forme binaire de ces octets, on a affaire à un attribut ou à un modèle (PATTERN) qui peut servir,
4
comme on l'a vu, à construire des traits interrompus.
bit 7 | bit 6 | bit 5 se 4 Joue à | 2 se 2] 0
Si les bits 5 et 6 sont tous les deux égaux à O0, alors l'octet sera lu comme un attribut.
La valeur de cet attribut est donnée par les cinq derniers bits (4 à O0), c'est-à-dire qu'en binaire, les attributs sont compris entre 00000 et 11111, soit en décimal entre 0 et 31.
Si par contre l'un des deux bits (5 ou 6) n'est pas nul, l'octet sera lu comme un modèle : le nombre modèle ayant pour valeur les six derniers bits (5 à 0) soit en décimal les valeurs 32 à 63.
Ce sont ces nombres modèle que nous avons utilisés pour construire des traits interrompus avec DRAW, ou des- siner des blocs grâce à FILL. Nous avions utilisé des modèles supérieurs à 63, mais en fait ces nombres supé- rieurs à 63 ont plus de 6 chiffres en représentation binaire.
Pour FILL, par exemple, seuls comptaient les six pre- miers O ou 1 du nombre (en binaire). Et avec six O ou 1, on ne peut dépasser 63.
Les sept premiers bits permettent de construire des nombres binaires allant jusqu'à 127, soit 01111111 en
binaire.
Le bit 7 est resté égal à O0 jusque là. Si on le prend
= 132:-
égal à l, on passe alors à des nombres supérieurs à 127, allant jusqu'à 255. Le bit 7 égal à 1 va produire une inversion des caractères, comme vous allez le voir maintenant.
Les petits programmes suivants vont nous montrer quelle est l'action des divers octets après l'ordre POKE, qu'ils soient considérés comme attributs ou non.
10 FOR N = 1 TO 24
20 PRINT "TEXTE POUR REMPLIR L'ECRAN" 30 NEXT N
40 FOR X = O TO 31
50 POKE 48202,X
55 WAIT 25
60 NEXT X
Attention, les attributs 24 à 31 dérèglent la syn- chronisation de l'écran.
Passez maintenant aux octets suivants, en remplaçant la ligne 40 par :
FOR X = 32 TO 127 puis faites exécuter à nouveau le programme.
Enfin remplaçons, pour terminer la démonstration, la ligne 40 par :
FOR X = 128 TO 255
Par POKE, vous pouvez affecter un attribut à un endroit particulier de l'écran.
Il exerce alors son action sur toutes les cellules situées à sa droite. Et une cellule est affectée par l'attribut situé à sa gauche : c'est le premier attribut rencontré à sa gauche qui prédomine.
Que ce soit en mode TEXT ou HIRES, vous devez donc placer l'attribut à la gauche de la cellule dont vous voulez modifier la couleur de l'encre, du papier, ou dont vous voulez faire clignoter le caractère qui s'y trouve.
— 133 -
Tapez : HIRES POKE 48039,1 POKE 48040,64 POKE 48039,12
Le programme suivant vous montre une utilisation de POKE pour séparer l'écran en deux : une zone choisie par avance peut avoir une couleur d'encre fixe et bien déter- minée, alors que l'autre zone peut avoir une couleur d'encre variable.
On choisit des attributs de couleur d'encre au hasard qu'on place par POKE aux adresses 40960 + K*40, K allant de O0 à 200. Ces adresses correspondent à l'extrême gauche de toutes les lignes disponibles en haute résolution.
Pour chacune de ces adresses, on place un attribut de couleur d'encre bien déterminé l'adresse en question augmentée de 100, c'est-à-dire la moitié de l'écran, deux lignes plus bas.
à « à
adresse adresse + 40
adresse + 80
adresse + 100
gauche de droite de l'écran l'écran 1 HIRES
10 FOR X = 40960 TO 49079 STEP 40 30 POKE X, INT (RND(2)*7+1)
40 POKE X + 100,2
50 NEXT X
60 CURSET 120,100,0
70 FOR N = 96 TO 1 STEP -5
80 CIRCLE N,1
90 NEXT N
- 134 -
CHAPITRE D
Les sons
et l'oric
5.1 INTRODUCTION
Votre Oric contient quelques commandes sonores parti- culièrement sophistiquées utilisant un circuit spécial qui peut synthétiser trois sons différents, qu'ils soient purs ou mélangés à un bruit.
Vous avez déjà fait l'expérience de quelques-uns des sons disponibles sur Oric. Chaque fois que vous pressez une touche, Oric produit un bip sonore aigu. Si vous pressez sur [RETURN] ou n'importe quelle touche de con- trôle, vous entendrez un bip plus grave. Si vous voulez supprimer les sons produits par les touches du clavier, il vous suffit d'appuyer en même temps sur les touches [CTRL] et [F]. Ces sons seront restitués si vous appuyez à nouveau simultanément sur [CTRL] et [F].
Oric offre des sons prédéfinis pour les jeux (guerre de l'espace...). Il permet aussi de simuler un modèle réduit de clavier de piano, etc... Etudions maintenant toutes ses possibilités sonores.
— 135 -
5.2 LES SONS PREDEFINIS
Quatre sons sont préenregistrés. Il s'agit de ZAP, PING, SHOOT et EXPLODE, lesquels peuvent être obtenus très facilement. Ecrivez ZAP sur le clavier, puis appuyez sur la touche [RETURN], vous entendrez une décharge sif- flante qui reproduit le son d'un pistolet galactique à laser. Maintenant, entrez de la même façon PING, vous obtiendrez une sonnerie qui peut d'ailleurs être directe- ment produite en appuyant à la fois sur [CTRL] et [G]. SHOOT, quant à elle, est une commande simulant le tir d'un pistolet terrien à poudre. Enfin EXPLODE produit... une explosion.
Ces quatre sons prédéfinis vous seront très utiles pour le bruitage des jeux d'action que vous programmerez. Ils peuvent être inclus dans des programmes comme n'im- porte quelle autre commande basic.
Par exemple :
10 FOR N = 1 TO 10 20 ZAP
30 WAIT 5
40 NEXT N
produira une salve de ZAP, imitant une mitrailleuse ga- lactique.
Vous pouvez remarquer qu'à la ligne 30, on a intro- duit une pause grâce à l'instruction WAIT 5. Ceci permet au son de finir avant qu'un autre ZAP ne débute. La durée du silence à mettre dépend en fait de celle du son. Un
temps de pause inférieur à la durée d'exécution du son n'a aucun effet et le son produit sera continu.
Mais passons aux principales commandes de son.
5.3 LES COMMANDES DE SON
Les commandes de son sont au nombre de trois. Il s'a- git de SOUND, MUSIC et PLAY. Les deux premières servent à définir la nature du son (son pur ou mélangé à un bruit) et sa hauteur, tandis que la troisième contrôle l'exécu- tion sonore (timbre, durée d'exécution, volume).
— 136 -
Ces commandes nécessiteront un certain temps avant de vous devenir familières, mais elles vous donneront la possibilité de composer de la musique comme sur n'importe quel instrument existant. De plus, du bruit peut être ajouté pour imiter le son des bombes, des avions... etc. Vous verrez que les possibilités de sonorisation ne sont en fait limitées que par votre imagination et ne sont pas aussi compliquées qu'elles peuvent apparaître à première vue.
Mais avant de passer au détail des commandes de son, je vous propose ce petit programme de musique aléatoire qui vous donnera une idée des sons que l'on peut obtenir sur Oric. Pour arrêter son exécution, il vous suffira d'appuyer simultanément sur les touches [CTRL] et [C].
5 REM ** MUSIQUE ALEATOIRE ** 10 MUSIC 1, RND(1) * 6, RND(1) * 12 + 1, 7 + RND(1) * 8 20 WAIT RND(1) * 20 + 5 30 GOTO 10
Pour comprendre l'exécution de ce programme, il vous suffit de vous reporter aux explications concernant la
commande MUSIC.
Mais examinons maintenant le détail des trois comman- des sonores SOUND, MUSIC et PLAY.
5.3.1 SOUND (canal, période, volume)
Cette commande vous permet d'obtenir un son dont vous fixerez la période et le volume et qui sera exécuté tel quel ou bien mélangé à un bruit suivant le canal choisi. La commande comporte trois paramètres qui doivent être numériques (sinon la commande ne pourra être exécutée). Regardons-les en détail :
— LE CANAL