MICRO- orne

DC =] à LA CON ÊTE DES JEUX

ORIC-1

A LA CONQUËÊTE DES JEUX

SCHOMBERG SCHOMBERG HERNANDEZ NOLLET PELLIER LADEVIE QUEINNEC PELLIER ASTIER

MONTEIL L'EPAPE Oros et PERBOST

PERBOST

Dax

NOLLET

BICKING

TEJA

MONTEIL

PLOUIN

SAGUEZ

P ELLIER

ORos et PERBOST Gros

HARWOOD HARTNELL

H ARTNELL et JONES VULDY BOUQUEROD PINSON

WILLARD

CEYRAT D'ELANNOY AUBERT PErRBosTet MASSE TERRAL

ASTIER

MONTEIL MONTEIL

OrRos W/ILLARD KRUTCH ASTIER PELLIER

DANS LA MÊME COLLECTION

Le Basic Universel.

Micro-ordinateurs : Comment ça marche ? Pascal par l'exemple.

La conduite du ZX 81.

La conduite du TRS 80.

Votre gestion avec BASIC sur micro-ordinateur. Langage d'un autre type : LISP.

Programmez vos jeux d'action rapide sur TRS 80. La conduite de l'APPLE II.

Tome 1 : le Basic de l'APPLE II.

Tome 2 : le système graphique et l'assembleur de l'APPLE II L'assembleur facile du 6502 et du 6510. L'assembleur facile du Z 80.

ZX 81 à la conquête des jeux.

CASSETTE - ZX 81 à la conquête des jeux. CASSETTE 2 - 13 jeux 1 K.

CP/M et sa famille.

Langage machine, trucs et astuces sur ZX 81. La conduite du PC 1212 (ou TRS 80 pocket). Apprenez à parler à votre ordinateur.

La conduite du VIC 20.

La conduite de l'IBM-PC.

Télécommande avec votre micro-ordinateur. Tout sur les disques du TRS 80 modèles l et Ill. La conduite du FX-702 P.

La conduite du PC 1500.

Jeux et applications pour ZX SPECTRUM.

Le grand livre du ZX SPECTRUM.

La conduite du ZX SPECTRUM.

Graphisme 3 D sur votre micro-ordinateur.

Des extensions à construire pour votre ZX 81. Le Basic en gestion sur Apple II.

La conduite du TI 99.

Mon TI 99/4A.

Les fichiers en Basic sur micro-ordinateur. Pratiquez l'intelligence artificielle.

VIC 20 à la conquête des jeux.

La conduite du T O7.

La conduite de l'ORIC-1.

Premiers pas en LOGO.

La conduite du COMMODORE 64.

Tome 1 : Basic, graphisme et son.

Tome 2 : Langage-machine entrées/sorties et périphériques. La conduite de l'ATARI 400/800.

TI 99 à la conquête des jeux.

Expériences d'intelligence artificielle en Basic . ORIC-1 à la conquête des jeux.

Langage machine, trucs et astuces sur ZX SPECTRUM.

LOGILIVRES EYROLLES (logiciels sur cassettes)

PELLIER

PELLIER

PELLIER

PELLIER PERBOST et MASSE HADDADI

Kamikaze (jeu pour ZX Spectrum).

Astéroïdes (jeu pour ZX Spectrum). Othello/Isola (jeux pour ZX Spectrum). Éditeur/Assembleur pour ZX Spectrum.

VIC 20 version de base à la conquête des jeux. Calcul des structures sur PC 1500/PC 2.

ORIC-1 A LA CONQUETE DES JEUX

par

Jean-Yves ASTIER

Collection animée par Richard SCHOMBERG

61, boulevard Saint-Germain 75005 PARIS

EYROLLES 1984

Si vous désirez être tenu au courant de nos publications, il vous suffit d'aaresser votre carte de visite au :

Service «Presse», Éditions EYROLLES 61, Boulevard Saint-Germain, 75240 PARIS CEDEX 05,

en précisant les domaines qui vous intéressent. Vous recevrez régulièrement un avis de parution des nouveautés en vente chez votre libraire habituel.

«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 utilisation collective» et, d'autre part, que les analyses et les courtes citations dans un but d'exemple et d'illustration, «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 de l'article 40)».

«Cette représentation reproduction, par quelque procédé que ce soit, constituerait une contrefaçon sanctionnée par les articles 425 et suivants du Code pénal».

© Éditions EYROLLES, 1984

Avant-propos

Grâce à ses incroyables capacités graphiques et sonores, votre ORIC est particulièrement doué pour conquérir le monde des jeux sur micro-ordinateurs. “ORIC à la conquête des jeux” se propose de vous guider dans cette jungle peuplée d'insectes voraces, de vais- seaux spatiaux, de couleurs et de sons étranges.

La première partie de cet ouvrage contient quinze jeux pour ORIC-1, jeux de réflexion ou d'action, qui bien sûr utilisent les dons musicaux et graphiques de votre micro-ordinateur préféré. Tous ces jeux fonctionnent sur n'importe quel ORIC-1 standard, il n'est pas nécessaire de posséder un joy-stick.

La seconde partie contient des renseignements qui vous seront fort utiles pour programmer vos propres jeux, les trucs et les ficelles des modes graphiques, les adresses correspondantes. Vous saurez aussi comment est organisée la mémoire de l'ORIC-1, comment écrire un programme basic qui fabrique des lignes de programme basic, comment accélérer vos programmes et utiliser le langage machine.

Pour en savoir plus sur l'ORIC, je ne saurais vous recommander assez la lecture des livres La conduite de l'ORIC-1 (même collec- tion) qui vous assurera la maîtrise de votre ORIC et de son basic, tandis que “L'assembleur facile du 65@2' vous livrera tous les secrets du microprocesseur 6502, cerveau de votre micro-ordinateur.

VII

Table des matières

AVaAnT-DrOPOS* tr 222 enculer Te 0 I VII 1. Quelques jeux pour ORIC ............................... 1 IMG IOUt ON RE Re ares 1 A ETS TRS RP TT IR TS IE RG De $ SO RME OS EE PR A A ERA SE 7

Li A MC ACRELAMPORS EE AS IR de ele 12 SM Tour HANOI Seront di Ne eat 16 6 *Solutioncdelatour Han Er in emule cu 20 l720Chute d'étoiles PR TT en in ane ce 24 1:82 Voyage dans l'espace 2 Re Me near ect 28 PO ME NeNTIER ES Re AT Te RTS dose ete 31 TO MENCIUMES re ne om ren neue om eee ie 37 PAM UrIde DrIQUES M ie ein pacs ee 41 125 Bataillenavalé En PS NN 0 TA race ion igtee 46 PSS MASTER MIN PR tone a notes ee ere 50 1145 Beatles enr re EN Eten nid seine este ei 55 TAIS APRES ET RE RE NT Re lan tete en le PR st 59

2. Quelques renseignements utiles pour programmer vos jeux ....... 66 21: Gestion la-memoirede l'ORIC: 222. 66 2.2. Comment redéfinir les caractères ...................... 76

2.3. Trucs et ficelles des modes TEXT et LORES ............. 2.45-Trucs et ficelles du:mode HIRES EE mano es 2.5. Fabriquer des lignes de programme par programme :....... 2.6 Comment accélérer un programme Basic-................ 2.7. Un petit exemple de sous-programme assembleur ..........

SPANNÉXES 2 a nn

3.1. Table ASCII de l'ORIC 3.2. Table des attributs vidéo 3.3. Le microprocesseur 6592

107

107 114 118

1

Quelques jeux pour ORIC

1.1 GLOUTON

Le glouton est un petit insecte extrêmement vorace, que l’on trouve généralement dans les mémoires des micro-ordinateurs. Il se nourrit exclusivement de chiffres, qu’il avale goulûment. Pour ce jeu, le glouton se déplace sur votre écran, vous le dirigez grâce aux quatre touches flèches. Il faut amener l’insecte sur les chiffres qui apparaissent, en prenant bien soin d’éviter les étoiles, car le glouton ne les apprécie pas du tout.

Chaque chiffre dévoré vous donne autant de points, il faut bien sûr accumuler le plus de points possibles.

Au début du jeu, un nombre entre 1 et 29 vous est demandé. Il règle la vitesse d’apparition des chiffres et des étoiles. Frappez ce nombre, puis RETURN. A la fin, on vous demande si vous désirez rejouer. Frappez alors la touche O0” ou N”.

Avant que vous ne tapiez le programme, voici quelques explica- tions sur son fonctionnement. Les lignes 19 à 129 sont des initiali- sations :

49 S est l'adresse-mémoire de la définition du caractère @, qui a 64 pour code ASCII. Pour faire apparaître le glouton, on va redéfinir @ pour qu'il figure l'insècte.

59 Ces huit nombres sont les valeurs des huit octets nécessaires pour redéfinir @ en glouton.

69 On place en mémoire les valeurs précédentes. Le caractère @ “est remplacé par le caractère ‘’glouton‘.

89 On fait passer l'écran en mode texte, s'il n'y était pas déjà, la couleur de l'écran est verte tandis que celle de l'encre est noire. Le nombre 64, qui est rangé dans la variable G, est le code ASCII du caractère “’glouton”. Ce code servira dans la suite du programme.

99 On lit un nombre compris entre 1 et 29, qui est rangé dans F, puis on efface l'écran.

199 Ceci élimine le ‘’plop” qui retentit à chaque fois que l'on enfonce une touche. Le programme utilise les ordres PING et EXPLODE, aussi le “plop” est supprimé afin qu'il n'interrompe pas les bruits de clochette et d'explosion, lorsque vous frappez une touche.

Le jeu lui-même est constitué des lignes 139 à 329. Ce bloc de programme est contenu dans une boucle qui débute à la ligne 149 et se termine en 329. La boucle est exécutée 19 fois, après quoi le jeu est fini. Nous allons maintenant détailler ce qui se produit à l’intérieur de cette boucle.

159 260+RND(1) est un nombre aléatoire compris entre @ et 19.999999. Si ce nombre est plus petit que 2@-F, on se branche en 199, sinon les lignes 160 à 180 seront exécutées. Si par exemple F vaut 1, 29-F vaut 19 et le test est en moyenne vérifié 19 fois sur 29. Si F vaut 19, 29-F vaut 1 et le test sera vérifié 1 fois sur 29 en moyenne. En modi- fiant la valeur de F, on peut donc changer le nombre moyen de fois ou le test est vérifié.

Les lignes 169 à 189 font apparaître un chiffre ou une étoile en un point quelconque de l’écran.

169 Q est un nombre compris entre 1 et 37.9999999 tandis que R est lui compris entre @ et 26.9999999. Le chiffre ou l'étoile apparaîtra à la position (Q,R) de l'écran, qui se trouve en mode texte.

179 Cest compris entre 49 et 57.9999999, Puis, si RND(1)>.5, ce qui se produit en moyenne une fois sur deux, on place 179 dans C.

180 Il faut se rappeler que les fonctions SCRN et PLOT utilisent la partie entière de leurs arguments. Ainsi:

Q donne un entier compris entre 1 et 37

R donne un entier compris entre @ et 26

C donne un entier qui est: * soit compris entre 49 et 57 (code ASCII des chiffres 1 à 9) + soit égal à 179 (étoile en inverse vidéo).

G contient le code ASCII du glouton. Aussi, si le glouton ne se

trouve pas en (Q, R), on y place le caractère qui a C pour code ASCII, c’est-à-dire un chiffre ou une étoile.

199

On se préoccupe de savoir si vous avez frappé une touche, on exé- cute la lecture du clavier A$—KEY$. Si aucune touche n'a été frappée, A$ est une chaîne vide et l'on va en 320.

Si vous avez frappé une touche, normalement une flèche, on

exécute les lignes 299 à 319 qui déplacent le glouton suivant la touche.

200

219

220

230

249

260

270

289

299 300

On place dans A le code ASCII de la touche frappée.

Si le code ASCII est celui de la touche ‘flèche à gauche” et si l'abscisse X du glouton est supérieure à 1, on décrémente cette dernière.

Si le code ASCII est celui de la touche ‘flèche à droite” et si l'abscisse X du glouton est inférieure à 38, on incrémente.

Si le code ASCII est celui de la touche ‘flèche en bas” et si l'ordonnée du glouton est inférieure à 26, on incrémente Y.

Si le code ASCII est celui de la touche ‘flèche en haut” et si l'ordonnée Y du glouton est supérieure à @, on décrémente Y.

On met dans V le code du caractère qui est en (X, Y) puis on place le glouton en (X, Y).

(X1,Y1) est la position précédente du glouton, l'on place un blanc pour effacer le glouton précédent.

Si V est supérieur à 128, on a un caractère en inverse vidéo. On ôte 128 pour obtenir un code ASCII compris entre @ et 127.

Si V vaut 42, on a rencontré une étoile et on se branche en 340.

Si l'on n'a pas rencontré un chiffre, de code ASCII compris entre 49 et 57, on va en 32.

319 “1"a 57. Ai

pour code ASCII 49, "2" est codé par 59, 9" est codé par nsi V-48 vaut-il 1 si l'on a rencontré ‘1’ sur l'écran, 2 si l'on a

rencontré "2".

Après

avoir exécuté le jeu, @ a été remplacé par le glouton. La

ligne 410 réinitialise lORIC comme lorsque vous frappez reset”.

10

20

50

40

50

60

70

80

90

100 1410 120 150 140 150 160 170 180 190 200 #10 ei) 250 240 250 #60 270 280 290 F00 310 FE0 550

40

REM GLOUTONX #XK XX OK HR OHONHOKOKKACKK HOKOKOKK

REM DEFINITION HESTIOLE-----——————

G=48080+8%é64

DATA SS, 189, 12,12,12,12,19,255

FOR IsS TO S+7:READV:FOKRET, Vs NEXT

TEXT: CLS: FAFER Z3INE Oo: Gé: Fze0

FRINTAINEUT Force. (1-20) "hs CLUS FRINT CHKS# (6): X=l:Y=lsXi=X:Vi=Ys PLOT X,Y,6G

REM JEU----- FOR COUF=1 TO 1000

IF SOKRND(1)220-F THEN 190

Ge 1+57KRND (1) : R=Z7XRND (1) C=49+9KXRND (1) : IFRND (1) +. STHENC=170 IF SCRN(G,R)2G THEN FLOT GR,C A$=HEYS:1F A$="" THEN 220

A=ASC (AS)

IF A=BANDX:1 THEN X=X-1:GOTO 260 IF A=GANDX{28 THEN X=X+1:G0OT0 260 IFA=1O0ANDY£26 THEN Y=Y+1:G0T0 260 IFA=11ANDY:O THEN Y=Y-1:GOTO 260 GOTO 220

V=SCRN(X,Y):PLOT X,Y,G

FLOT X1,Y1,32:X1=X:Yi=V

IF V5128 THEN V=V-128

IF V=42 THEN 340

IF V£49 OR V:57 THEN 220 ZAF:F=P+V-48:GOTO 320

NEXT COUF:WAIT 200:G0T0 250

EXFLODE:WAIT 300

F50 CLS: PRINT: PRINT: PRINT: PRINT :FRINT 360 FRINT SFC(17)s "Score: ":Fs:CHRS# (6) 270 FRINT:FRINT

380 FRINT'Voulerz-vous rejouer (O/N) " 390 GET A$:IF A$="0" THEN 80

400 IF ASEE'N" THEN FING:GOTO 390

410 CALL DEEF CKFFFA)

Attention à ne pas oublier le ; de la ligne 19.

1.2 RÉFLEXE

Connaissez-vous bien la configuration du clavier de votre ORIC ? Ce petit jeu va permettre de le vérifier.

Au début du jeu, on vous demande le délai d’attente maximum. Tapez 2.5 puis RETURN. A chaque fois que Z AP retentit, un caractère apparaît quelque part sur l'écran. Il faut frapper la touche correspon- dante avant que le délai maximum ne soit écoulé. Vour remarquez que pendant le jeu le mot CAPS situé habituellement en haut à droite de l'écran a disparu. En effet, le clavier est en mode minuscules”, les touches alphabétiques donnent des lettres minuscules. Pour obtenir une lettre majuscule, il faut utiliser SHIFT, tout comme avec une machine à écrire. Lorsque vous serez familiarisé avec ce jeu, vous pourrez utiliser un délai plus court, par exemple 1.7.

Voyons maintenant comment fonctionne ce programme. Les lignes 19 à 170 servent à initialiser le jeu.

159 32 est le code ASCII du caractère blanc. B$ est donc une chaîne constituée de trois caractères blancs, qui sera utilisée en 230.

169 CHR$(17) supprime le curseur tandis que CHR$(20) fait passer en minuscules.

Les lignes 189 à 249 ont pour but de tirer au hasard un caractère, et de l'afficher n’importe sur l’écran.

199 On obtient l'abscisse X%, qui est un entier compris entre 2 et 35.

209 219 220

230

249

On obtient ensuite l'ordonnée Y%, entier compris entre 3 et 23. C% est le code ASCII du caractère, compris entre 33 et 125.

La valeur 96 correspond au caractère (©, qui ne figure pas sur le clavier. On tire donc un nouveau code.

Cette boucle est exécutée trois fois, et remplit de blancs un carré de 3 x 3 caractères centré en (X%, Y%). En effet, la chaîne B$ contient 3 blancs.

Le caractère tiré au sort est affiché, en (X%, Y%). Comme l'on a effacé un carré autour de cette position à la ligne précédente, le caractère ne peut apparaître collé à un autre qui se trouvait déjà sur l'écran, ce qui simplifie le jeu.

De 269 à 289 on boucle en attendant que vous frappiez le caractère

qui a été tiré. Si vous ne faites rien, on passe alors à la fin du programme, de 39% à 419, qui affiche le nombre de caractères trouvés.

320

339

349 369

370

389

Le caractère CHR$(10) permet d'obtenir des caractères double hauteur.

convertit le score S en une chaîne de caractères précédée de CHRS(2).

On élimine le caractère CHR$(2) situé en tête de la chaîne.

On calcule l'abscisse X il faut afficher la chaîne pour qu'elle soit placée au milieu de l'écran.

On affiche deux fois la chaîne A$ pour obtenir des caractères double hauteur.

On rétablit le curseur et CAPS qui avaient été supprimés en 160.

19 REM KREFLEXE XX XX OHOK KR ACOKHOK KO KOKOK AONC NOK K PAT

30 FAFER Zs1INE 0

40 CLS: FRINT: PRINT: FRINT

30 FRINT" Des caracteres &80 FRINT'apparaissent"

70 FRINT'au hasard sur l'ecran."

80 FRINT" Il faut frapper le plus" 90 FRINT'vite possible sur la touche" 100 FRINT'correspondante.,"

(D b)

110 FRINT

120 FRINT" --ïles lettres majuscules" LEO PRINT ! s'obtiennent avec SHIFT" 140 FRINT: INPUT "Del ai maximum "3 DELAI 150 Bei: BS=CHRS CE) +CHRS CE) +CHRS (EH) 1640 Seûs CLS: PRINT CHARS (17) ; CHKS (270) d70R:

180 FING:WAIT 100

190 Xe TNT CEA XRND 1) 5

OO NARI+INT CE KRND (1) )

210 CheHi+ TNT CGEXRND (15)

ï TE G4 THEN 219

FORTE 1 TOI: PLOTX 4-1, YA+I, RH: NEXT FLOT XX, V7, C#3:Z4FP

FOR lsi TO DELAI STEF ,002 IFÉEY#=CHRS CC) THENS=S+ 1: GOTOI80 NEXT TI

EXFLODE: WAIT Z00

CLS: PAFER 13:INE 7

BBeCHES (10) SCORE: M+CHRS (ED BeSTRS (5)

ee LENCSCS) 15

X=18- INT (LEN (A) /2) FLUT Hull esFLOT K, 12,48 RINT CHR (17 ) : CHRS$ (70)

400 F FINT "IL fallait frapper !": 410 FRINT CHKS (C0)

1.3 CAMÉLÉONS

Comme chacun le sait, les caméléons sont de petits animaux qui ont horreur de se déplacer. Pour se nourrir, ils se contentent d’attendre qu’un insecte passe devant eux, il n’y a plus alors qu’à déplier sa longue, longue langue pour happer l’insecte et en faire son repas.

L’ORIC vous demande tout d’abord: Force(1-20)? Frappez par exemple 2 puis RETURN. Il apparaît alors 7 caméléons rangés à droite de votre écran. Il y a aussi un insecte. Le caméléon situé en face de l’insecte (qui est en fait un glouton) doit l’attraper. Vous devez frapper deux touches : le numéro du caméléon qui est situé face à l’insecte, puis la distance glouton-caméléon. Le numéro du caméléon est un numéro compris entre 1 et 7, 1 pour le caméléon rouge, 2 pour le vert, …, 7 pour le blanc. La distance glouton-caméléon est comprise entre 1 et 9.

Ayant précisé qu’il ne faut pas frapper la touche RETURN après les deux chiffres, il ne me reste plus qu’à vous souhaiter un bon appétit !

Voici maintenant quelques explications sur la structure du programme. Tout d’abord, quelques initialisations, de 19 à 129.

79 MAX est le délai d'attente maximum pour la frappe d'une touche. Cette valeur est utilisée en 190 et 220.

89 On affiche les caméléons. Un caméléon est formé 4 x 2 caractères. Les quatre caractères supérieurs sont dans H$, que l'on affiche. On a affiché devant le caractère dont le code est |, qui définit la couleur.

90 On affiche comme précédemment le caractère de code ASCIII, qui définit la couleur. Puis les quatre caractères inférieurs du caméléon, qui sont dans P$, sont affichés.

Le jeu lui-même est une boucle exécutée quarante fois qui s’étend des lignes 149 à 430.

En 159-169, on calcule la position (X, Y) de l’insecte, que l’on affiche à la ligne 179.

De 199 à 219, on attend que vous frappiez le numéro du caméléon, alors que de 229 à 249, on attend la frappe de la distance insecte- caméléon.

De 269 à 280, on vérifie que le numéro est bien compris entre 1 et 7, que la distance est bien comprise entre 1 et 9, puis ces deux quantités sont placées dans les variables A et B.

De 394 à 399, on déplie et on replie la langue du caméléon. 309 Y1 est l'ordonnée de la langue, qui est horizontale.

8

319 La lan

gue va se déplier de la droite vers la gauche, depuis X1=32

jusqu'à X1—32—3+B.

329 Produit une note.

339 L$ contient un caractère qui forme un élément de la langue.

34@ La langue est dépliée. On note dans V le code ASCII du caractère situé juste à gauche de l'extrémité de la langue. Ce caractère est soit un blanc soit l'insecte.

359 La langue va se replier de X1—=32—3+B à 32. 36% Identique à 320. 379 On affiche V et un blanc, de code 32.

De 49 à 429, on regarde si le caractère attrapé est 115, c’est-à-dire l’insecte. Si oui, on incrémente le score. En 424, on efface la position (X, Y), au cas le caméléon n’aie pas capturé l’insecte, et on fait cesser

tout bruit.

10 20 50 40 0 &0 70 80 90 100 110 120 150 140 150 160 170 180 190 200 210 220

250

a ect

Puis, on continue.

REM CAMELEONS XX Kkk HHOHHOKHK AK KO K

TEXT:FAPER O:INÉ 1:CLS:GOSUE 1000

REM TRACE CAMELEONS ET INITS------

CLS: INPUT'"'Force (1-20) ":;F:CLS

MAX=2000/ (F+5) : FOR I=i TO 7

PLOT HS, ZXI, I: FPLOT 34,3X1,H$

FLOT ZE, 3KkI+1,1:FPLOT 34,3XI+1,F# NEXT I:SC=0

REM JEU eee one nee 2 a om FOR COUF=1 TO 40: Z=FRE("") X=1+INT(OXRND (1) ): X=TKX+1 Yel+INT C7ZXRND (1) ) 3 Y=EXY

FÉOTEXAMS LE

FOR Izi TQ MAX

AS=HEYS:IF A$S<:"" THEN 220

NEXT I:GQOTO 4%0

FOR Jz=i TO MAX

H=HEYS#: IF H$<:"" THEN 260

10

240 250 260 270 280 290 AC) 310 RU)

AE5O

540 350 360 370 F0 390 400 410 4£0 450 440 450 480 #70 480 490 Ter) 910 1000 1010 100 1070 1040 1950 1060

NEXT J:GOTO 420

IF A$<"i" OR Â#:"7" THEN 420 IF B$<"1" OR BS:"OG" THEN 420 A=VAL CAS) : HE VAL (R#)

Yi TxA

FÜR X1=#22 TO Z2-TXxE STEF —1

SOUND 1, 1000 C(X1+24), 0: FLAYI, 0,7, 0 FLOTTE NEXTEX 1

VeSCRN CX1, Y1)

FOR X1=T2-TXER TO ZE

SOUND 1,1000/ €X1+7),0:FLAYI,0,7, 0 FLOTEXTISMNE Ve LOTEXI EMA

NEXT X1

IF VEr11S THEN 420

FLOT EE, Y1,72:SCeSC+l: ZAF:WAIT 70 FLOTEXS NS SPP LANLO SOC

NEXT COLUF FPÉONMET2-1Scores rt ESTR# CSC)

FLOT &,15, "On recommence (O/N)i GET AS:1F A$="0" THEN 60

IF ASESUN" THEN FING:GOTO 470 CLS: FAFER Z:INE O:CALL K#F89H

END

REM DEFINITION CARACTERESXKX# HR X DATA: 35.18, 12, 09,12, 12 10,55 DATA 0,0,0,0,0,63%,0,0

DATA 0,0,5%,14,63,63,15,3

DATA Q,0,48, 24, 60, 60, 25, 6%

DATA 0,020, 0407400607 D0

DATA 6,15,11,10,8,8.8,8

1070 DATA 215 %7:14,28,56,48

1080 1090 1100 LEE 1120

DATA 55,6%,29,55,20,7,0,0 DATA 63,45,55,21,67,56,0,0

DATA 8,40,56,56,28,14,7,% S=46080+1154k8:F-S+104K8-—1

FOR 1=8 TO F:READ V:FPOKEI, ViNEXT

11:50 1140 1150 1160 1170 1180

TSECHRS (115) :L$S=CHRS#E (116) H$=CHKS (117) +CHRS (118) +CHRS (119) HÉ=HS+CHKS (120)

FHECHRS (121) +CHRS (122) +CHRS# (125) F$=Pé$+CHKRS# (124)

RETURN

Voici l’aspect du caméléon et de l’insecte:

—+

1.4 CACHE-TAMPON

Je suis très fier de vous présenter CACHE-TAMPON, un jeu tout à fait original, comme vous allez pouvoir en juger :

Pas de caméléon, de glouton, il n’y a rien à manger. Ce jeu est reposant pour l'estomac.

12

Aucun dessin. On peut jouer sans regarder l’écran, vous pouvez même l’éteindre. Ce jeu est reposant pour les yeux.

Aucune stratégie, tactique ou méthode, il n’y a pas à réfléchir. Ce jeu est reposant pour l’esprit.

Le jeu utilise le générateur programmable de sons de l’ORIC, qui est capable de produire simultanément trois notes. Imaginez que trois objets sont cachés derrière l’écran. A chacun de ces objets est associé une note, plus le curseur est proche de l’un des objets et plus la note asso- ciée est aiguë. Vous pouvez déplacer le curseur avec les touches flèches, il faut l’amener sur les objets cachés.

Tout d’abord, des lignes 19 à 99, on trouve quelques initialisations.

39 CHR$(6) supprime le bruit produit par le clavier lorsque l'on enfonce une touche. En effet, ce bruit est aussi produit par le générateur programmable, il interromprait les trois notes.

40 8 et 9 sont les codes ASCII des touches ‘flèche à gauche” et ‘’flèche à droite”. On les range dans les chaînes G$ et D$.

59 De même les codes ASCII des touches ‘flèche en bas” et ‘flèche en haut” sont placés dans les chaînes B$ et HS.

69 X et contiennent la position du curseur sur l'écran. X(3) et Y(3) servent à stocker la position des trois objets, tandis que F(3) est utilisé pour indiquer si les objets ont été trouvés ou non.

70 à 80 Les coordonnées des trois objets à découvrir sont tirées au hasard et stockées dans les deux tableaux.

La boucle de jeu s’étend des lignes 199 à 280. Il faut déplacer le curseur suivant la flèche qui a été enfoncée, regarder si le curseur ne se trouve pas sur l’un des objets, calculer la distance du curseur aux objets non trouvés, et produire les notes correspondantes.

119 On affiche le compteur, qui sera vert car STR$ fabrique une chaîne qui débute par un caractère CHRS$(2). CHR$(32) est un caractère blanc, qui sert à effacer le dernier chiffre affiché lorsque l'on passe de 1009 à 999, de 199 à 99 et de 19 à 9.

129 On lit le clavier et l'on place le caractère lu dans K$. 139 Si l'on a frappé ‘flèche à gauche”, on décrémente l'abscisse du

curseur.

13

149

159

169

189

199

200

219 229

239

259

269

270

Si l'on a frappé ‘flèche à droite”, on incrémente l'abscisse du curseur.

Si l'on a frappé ‘flèche en bas”, on incrémente l'ordonnée du curseur.

Si l'on a frappé ‘flèche en haut'’, on décrémente l'ordonnée du curseur.

La touche lue est affichée, ce qui provoque le déplacement du curseur. || ne faut surtout pas oublier le ; à la fin de l'ordre PRINT, qui empêche le renvoi du curseur au début de la ligne suivante.

Si F(1) vaut 1, cela signifie que l’objet numéro | a été découvert, on saute donc en 276, il n'y a rien à faire.

On calcule la distance du curseur à l'objet numéro I. La dernière instruction pourrait aussi s'écrire DX—SQR(A"2+B"2). Cette écriture est, de façon générale, à éviter. En effet, A+A et B+B sont calculés plus rapidement que A°2 et B°2. De plus, on obtient des résultats plus précis avec AA et B+B, bien que dans le cas de ce programme cela soit sans importance.

Si la distance n'est pas nulle, l'objet n'est pas trouvé, on va en 250.

D% est nul, on vient de trouver l'objet I. On l'indique avec F(1}=1 et on incrémente le nombre N d'objets déjà trouvés.

L'expression logique F(1) AND F(2) AND F(3) est vraie si les nombres F(1), F(2) et F(3) sont tous les trois non nuls, c'est-à-dire si l'on a trouvé les trois objets. Dans ce cas, on va en 410.

SOUND définit la hauteur de la note |. La période de cette note est proportionnelle à D%, on obtiendra une note d'autant plus aiguë que D% est petit. Le paramètre volume’ de SOUND est à zéro: l'instruc- tion définit la hauteur de la note sans la jouer.

MS% est le minimum des distances curseur-objet. Ce nombre servira à déterminer la fréquence de répétition du son, en 270.

Pour jouer la note du canal 1, il faut exécuter PLAY 1, Pour la note du canal 2, on exécute PLAY 2, tandis que PLAY 4, active le canal 3. Si l'on désire obtenir simultanément les canaux 1 et 3, on emploie PLAY 1+4,.. tandis que PLAY 1+2,…. active les canaux 1 et 2 et PLAY 1+2+4, joue les 3 canaux.

A la ligne 180, on a exécuté PX—@. Puis on a, en 259, ajouté 1 s'il faut jouer le canal 1, on ajoute 2 s'il faut jouer le canal 2 et 4 s'il faut

jouer le canal 3. Ainsi, en 270, P% contient la valeur adéquate pour que seuls les notes correspondants aux objets non trouvés soient jouées.

Les lignes 399 à 499 sont exécutées à la fin du jeu.

320 Illne seron

faut pas oublier le ;. Ainsi les messages des lignes 329 et 339 t-ils sur la même ligne.

340 à 389 On reconnaît l'indicatif de Rencontres du type”.

399 CHRS(6) rétablit le bruit produit par le clavier, qui avait été supprimé

à la |

igne 309.

Lorsque vous avez découvert les trois objets, on exécute les lignes

419 à 450

10 20 50 40 GT) Te) 70 80 90 100 110 120 150 140 150 160 170 180 190 200 Fe) 220 &30 240

240

et l’on recommence le jeu.

REM CACHE-TAMEUONX OK OK OH HOMOK KM HONONK HE NON HOK

FAFER LsINE O: PRINT CHR#(6):CLS

W=1000:GS$=CHRS (6) : D$=CHRS (9)

HH=CHRS (10) : HB=CHRS (1 1)

X=O:Y=O0: DIM XCH),Y CH) ,F CS)

FOR Teil TO %:X CT) = INT (4OXKRND C1) )

YCI)Æ=INT (27KRND CL) D): NEXT

FOR TeW TO © STEF-I

FLOT 16,15, STR# CT) +CHRS$ CIE ESekEYS$: IFE&=""THENWAIT10: GOTO280 IF KS=G#ANDX:0 THEN X=X-1:GOTO180 IF KÉ#=D#ANDX£39 THENX=X+1:G0OT0180 IF ÉH=R#ANDY<26 THENY=Y+1: GOTO180 IF EÉSeH#ANDY:0 THEN Y=Y-1:G0OTOi80 GOTO 280

PRINT Et; :Fe0:M%eæ1000 FORI=3STOISTEF-1:1F F(I)=1 THEN270 A=X-X (I): ER=Y-Y CI) : DA=SGR (AKÉ+EKE) IF DX£:0 THEN 250

EXFLODE :F(T)=1l: NEeN+I

IF F(1) AND F(2) AND F(C3) THEN4I0 GOTO 280

SOUND I, 80XD%, Os FPreFA+ CT-1)

260 TA 280 290 F00 510 320

ECO

340 350 560 370 380 390 400 410 470 450 440 450

IF DÉ£EMX THEN MX=D%

NEXT:FLAY FX 0,23, 1OO0KMX

NEXT T

CLS: FAFER Z:INE 0

FOR Iæl TO S:PRINT:NEXT FRINTSFC (4): "Vous avez trouve FRINTN:s"bhidules":FLAY 1,0,7,10 MUSIC 1,5,3,12:WAIT @0

MUSIC 1,5,5,155WAIT 80

MUSIC 1,3,1,1%:WAIT 80

MUS CAL STATS NAT A0

MUSIC 1,2,89,1S:WAIT 80

FLAY 0,0,0,0: PRINT CHRS& (6) : END

FOR I=i TO %:F(1)=0:NEXT

W== INT (2XW/%)

MUSIC 1,3,10,0:PLAY 1,0,%,1500 WAIT 400:PFLAY O0,0,0,0

GOTO 70

Wu Êl

Attention à ne pas oublier le ; de la ligne 189.

Voici maintenant un jeu de réflexion. Le principe en est simple: on dispose d’un support comportant trois tiges verticales et de disques de couleurs et de tailles variées. Ces disques sont percés en leur centre, et peuvent s’enfiler sur les tiges. Au début du jeu, on empile tous les disques sur l’une des tiges, dans l’ordre des tailles décroissantes. Ainsi, le plus grand disque est au-dessous de la pile de disques tandis que le plus petit est au sommet. Le but du jeu est de transférer toute cette pile sur l’une des deux autres tiges. Cela n’est pas si simple, car vous ne pouvez trans- férer d’une tige à une autre qu’un seul disque à la fois. De plus, à aucun moment, on ne peut avoir un disque enfilé au-dessus d’un plus petit.

1.5 TOUR DE HANOÏ

Voici un exemple avec deux disques:

Au départ, on a deux disques sur la tige de gauche. Il faut les amener sur la tige de droite.

coup: On déplace le petit disque de la tige de gauche à celle du milieu.

coup: On déplace le grand disque de la tige de gauche à celle de droite.

coup et dernier coup: On déplace le petit disque de la tige du milieu à celle de droite.

Le programme vous demande tout d’abord:

Nombre de disques ?

Tapez 2 puis RETURN. On vous demande alors:

Tige de départ (9, 1,2)?

Tapez @ puis RETURN. On vous demande encore:

Tige d’arrivée (9, 1, 2) ?

117

Tapez 2 puis RETURN. L'écran passe en mode haute résolution et le support est dessiné. Les tiges sont numérotées de Ÿ à 2. Deux dis- ques sont enfilés sur la tige ©. On vous demande:

Départ, arrivée (9, 1,2)?

Tapez, dans l’ordre:

ÿ,1 return 9,2 return 1,2 return

Vous pouvez recommencer avec plus de disques, le jeu se complique à partir de 5 disques. Vous pouvez, au début, partir d’une autre tige que celle de gauche, pour arriver sur une autre que celle de droite. |

Voici quelques explications sur le fonctionnement de ce programme. Les lignes 19 à 129 servent à demander le nombre de disques N, le numéro de la tige de départ DE ainsi que celui AR de la tige d’arrivée.

60 Les disques sont numérotés de 1 à N, N est celui de diamètre le plus grand. Le tableau TIGE sert à stocker pour chaque tige, les numéros des disques qui y sont enfilés. Le tableau T sert à stocker, pour chaque tige, le nombre de disques qui y sont enfilés.

Les lignes 219 à 299 servent à tracer le support et placer les disques sur la tige de départ.

239 On trace une tige verticale.

249 On trace le numéro de la tige. Pour 1=1, 1+47 vaut 48, ce qui est le code ASCII du chiffre ’@'"’. De même, 49 est le code ASCII de 1" et 50 est celui de 2”.

270 Le sous-programme 1919 empile le disque numéro A2 sur la tige numéro A1. La boucle 264-289 empile donc tous les disques sur la tige de départ DE, en commençant par le plus grand.

Le jeu lui-même est constitué des lignes 319 à 430.

35% Si la tige de départ A1 est vide, s'il n'y a pas de disque, il y a erreur, on va en 380.

360

370

399

409

410

Si la tige d'arrivée A3 est vide, pas de problème, on peut prendre le dernier disque de la tige A1 pour le mettre sur la tige A3, ce qui est fait en 390.

On vérifie que le dernier disque enfilé sur A1, celui que l'on va dépla- cer, est bien plus petit que le dernier disque enfilé sur A2. Si tel est le cas, on va en 390.

Le sous-programme 241% dépile un disque de la tige A1. Après l'exécution du sous-programme, A2 contient le numéro du disque qui a été dépilé.

Le sous-programme 1919 empile le disque numéro A2 sur la tige de numéro A1. Le numéro de la tige d'arrivée, A3, a été placé dans A1 à la ligne précédente.

Si il a moins de N disques sur la tige de numéro AR, ce n'est pas terminé, on va donc en 31@ pour continuer.

19 REM TOUR DE HANOÏI XX XX KR KOKOKHCKKOHK HO K Ces

50 TEXT: CLS: FRINT:FRINT

40 INFUT'Nombre de disques ";N

SO IF Nii OR N:10 THEN FING:GOTO 40 60 DIM TIGE(Z,N-1),T (2)

70 INFUT'Tige de depart (0,1,2) "MiDE 80 IF DE<O OR DE: THEN FING:G0OTO 70 90 INFUT"'Tige d'arrivee (0,1,2) "AR 100 IF ARIO OR ARFE THEN FING:GOTO 90 110 IF AR=DE THEN FRINT'F$$ 1": GOTO70 leo

210 HIRES

220 FOR I=1i TO à

220 CURSETHOkXI-40,199,7%:DRAW 0,-150,1 240 CURMOV -5,-15,3: CHAR I+47,0,1

240 NEXT I

260 FOR I=N TO 1 STEF —1

270 A1=DE: AË=I:GOSUR 1010

280 NEXT I

290 :

ELOSREMNDEEUTOTRAITEMENTESSS ESS SS RSS 320 INFUT'"Depart,arrivee (0,1,2) "sA1,AS

FO IF AS<O OR AGE THEN FING:GOTOSE0Q 40 IF A120 OR ALSFZ THEN FING:GOTOS20Q 3980 IF T(Al)£=0 THEN 580 360 IF T(AS)E=O THEN 590

3270 IF TIGE (AL, T(AL)-L)ETIGE (AS,T(AZ)-1) THEN 390

3280 ZAP:WAIT FO: EXFLODE:GOTOQ #10

390 GOGSUR 2010: A1EA%

400 GOSUER 1010

410 IF TCARIEN THEN 510

420 END

FO à

1010 REM S-FROG EMFILE DISQUE XX XX XX XX 1020 Lie190-1OXT (AL): C1=0OXAl+T9

1050 CURSET-7RX (A1 :0)-84X (ALI) ,LI,TZ 1040 FILL 10, 1,AZ-7XINT((CAZ-1) /7) 10850 CURSET72-84X (A1:0)-78X (ALI) ,LI1,Z LOSOIFE TUTO NLSTZ

1070 GOSUR 2060

1080 TIGE (A1, T(AL)) AE: T CAL)IET (A1) +1 1090 RETURN

TOUS

2010 KREN S-FROG LTYILE DISQUEXXKXXXXXxX*X 2020 T(AIY ‘(Al)-1: AZ=TIGE(AI,T(A1)) 8050 Lisz190-10XT (A1) :C1=ROKkA1+E

2040 CURSET-78X (A1:0)-84X (ALT) LI, SOSONEDPEBIONLE7

2060 FOR J=0 TO 9

2070 CURSET C1-FXxA2,LI+I,Z

2080 DRAW 6KxA2+1,0,7%

2090 NEXT J

2100 RETURN

1.6 SOLUTION DE LA TOUR DE HANOÏ

Ce programme, qui résoud le problème de la tour de Hanoï, se trouve dans tous les manuels d’informatique, car il illustre la notion de sous-programme récursif, c’est-à-dire un sous-programme capable de s'appeler lui-même. Il peut être intéressant de voir comment ceci peut être programmé sur ORIC.

20

Le transfert de N disques d’une tige de départ DE à une tige d’arrivée AR peut se décomposer en trois étapes.

1) On transfère N—1 disques de la tige DE sur la tige restante.

2) Il reste un disque, le plus grand, sur la tige DE. II n’y a rien sur la tige AR, les autres disques sont empilés sur la troisième tige. On trans- fère le grand disque de la tige DE à AR. :

3) Il ne reste plus qu’à transférer les N—1 disques restants de la tige ils sont vers la tige AR, et le tour est joué!

On veut transférer quatre disques sur la tige de droite.

On transfère trois disques sur la tige restante, ici celle du milieu.

On fait passer le grand disque de gauche à droite.

On transfère les trois disques sur la tige de droite.

Le programme correspondant peut être décrit comme suit:

21

Programme solution de la tour de Hanoï: lire le nombre de disques N lire le numéro de la tige de départ DE lire le numéro de la tige d'arrivée AR exécuter Hanoï (N,DE,AR)

Sous-programme Hanoï (B1,B2,B3): si B1 vaut 1 alors: dépiler le disque du dessus de la tige B2 empiler ce disque sur la tige B3 sinon : calculer B4=numéro de la tige restante, ni B2, ni B3 exécuter Hanoï (B1—1,B2,B4) exécuter Hanoï (1, B2, B3) exécuter Hanoï (B1—1,B4, B3) Retour

Le sous-programme Hanoï est récursif, ce qui signifie que les para- mètres locaux B1, B2, B3 et B4 ainsi que l’adresse de retour L doivent être empilées lorsque l’on entre dans le sous-programme. Ce qui est fait en 420-459. Il faut aussi dépiler ces quantités en sortie du sous- programme, ce qui est fait en 569-580.

10 REM SOLUTION TOUR DE HANOTIXXXX XX XX 20 3:

30 TEXT: CLS: FRINT: FRINT

40 INFUT'"'Nombre de disques ":#N

30 IF N£l OK N*10 THEN FING:GOTOQ 40 60 DIM TIGECZ,N-I) TZ), FYLE (100): FF=0Q 70 INFUT'"Tige de depart (0,1,2%) "MS DE 80 IF DE£O OR DE*2 THEN FING:GO0OTO 70 90 INFUT'Tige d'arrivee (0,1,#) "3: AK 100 IF AR£O OK AR:2 THEN FING:GOTO 96 110 IF AR=DE THEN FRINT'F£$ 1": GOTO70 120 :

210 HIRES

220 FOR I=i TO S

250 CURSET8OXI-40,199,3:DRAW O0,-150,1 240 CURMOV -2,-15,3%: CHAR I1+47,0,1

22

ele) 2860 FATA) 280 290 SEC 520 330 340 410 420 450 440 450 4é0 470 480 490 500 10 320 30 40 50) 60 70 580 390 1810) 1910 1020 1050 1040 1950 1060 1970 1080 1090 1100 2010 2020

NEXT IT

FORTENMTOMMAMSTER El

Al=DE: A2=I:GOSUR 1010

NEXT I RÉMPSDEEUTETRAITEMENTSSSS ES ESS Hi=N: H2SDE: RIeAR:Lel: GOTO 410

END

REM S-PROG HANO I X XX HCK NM NHOKOK ACKX FYLE (FF) &L.: PYLE (PF+1)=E1

FYLE (PF+2) 2h23: PYLE (PP+4H) HT

FYLE (FF+4) =B4: FPePP+s

IF Hi£ïl THEN 510

Al=B2:GOSUR 2010

Al=R%: GOSUER 1010

GOTO 560

H4=s-R2-H5

Hi=Hi-1i:H3eB4:Le?2:GO0TO 410

Bi=i: HePYLE(PF-2) :Le3: GOTO 410 Bi=PYLE (FF-4) -1: HP=H4: Led: GOTO 410 PFePP-5 : R4=PYLE (PF+4) REePYLE CPP4H) 5 RPePYLE (FF+2) Bl=PYLE (FF+1) :LePYLE (FF)

ON L GOTO 250,520, S540, 550

REM G-FROG EMFILE DISQUEXKXXKXXXx L1=190-1OXT (AL): C1=BOXAl+ES CURSET-78X (A1:0)-84X CALEI) LIT FILL 10,1,482-7XINT((A2-1)/7) CURGSET72-84% (A1 %#0)-78X (ALI) , LI, ÉFCERTO LS

GOSUER, 2060

TIGE (AL, T(AL))=AS:T (AL) ET (A1) +1 RETURN

REM S-FROG DEPFILE DISQUEXXXXK#Xx x TA) =ET (AL) —-15 ASSTIGE(CAL, T (A1) )

23

2020 Lis190-10XT (A1) :C1=B0kA1+50 2040 CURSET-7E (A1 0) -84X CALE) LA, 2060 FILL 10,1,7

2060 FOR J=0 TO 9

2070 CURSET Ci-3xA2,L1+4J,%

2080 DRAW 6KA7+1,0,2

2090 NEXT J

2100 RETURN

1.7 CHUTES D'ÉTOILES

Aprés ces deux programmes sur la tour de Hanoï, nous entrons maintenant dans le monde des jeux intersidéraux. Vous êtes maintenant le commandant d’un vaisseau intersidéral. Vous traversez un champ d'étoiles énergétiques, il faut essayer d’avaler ces particules en plaçant votre vaisseau devant, vous disposez des deux touches flèche à gauche” et flèche à droite” pour vous diriger. Attention : certaines de ces étoiles clignotent, elles sont en fin de leur existence et risquent d’exploser. Il convient donc de les éviter. Une particule rouge vous rapporte un point, une verte deux points, une jaune trois points, une bleue quatre points, une mauve cinq points et une bleu ciel vaut six points. Et maintenant, bonne chance!

Ce jeu utilise le mode LORES 1, qui rappelons-le, est un mode TEXT, l’ordre LORES 1 place simplement un caractère CHRS$(9) au début de chacune des 27 lignes de l'écran. Ce caractère impose au système vidéo de l’'ORIC utilisation du jeu de caractères semi- graphiques. Chaque étoile est un caractère semi-graphique de code ASCII 35, le vaisseau est lui constitué des caractères de codes 33 et 34.

Le début du programme, de 19 à 160, sert à redéfinir ies caractères semi-graphiques employés, ainsi que quelques constantes.

39 B% est le code ASCII du “blanc”, T% et Q% sont les codes ASCII de la tête et de la queue du vaisseau, alors que A% est celui de l'étoile.

99 X% et Y%X sont les coordonnées sur l'écran du vaisseau. CHR$(17) et CHR$(29) suppriment le curseur et le mot CAPS.

24

199 G$ et D$ contiennent les codes ASCII des touches ‘flèche à gauche” et ‘’flèche à droite”. H$ contient celui de ‘’flèche en haut‘.

119 à 149 Le vaisseau est obtenu en affichant trois chaînes T$(@), T$(1)

et T$(2). T$(@) CHRS$(9) rerk Hi B$ | | 11 El T$(2)

Les CHR$(9) forcent l’utilisation des caractères semi-graphiques non clignotants, ainsi le vaisseau ne clignotera pas lorsqu’une étoile clignotante se trouvera à sa gauche. Le CHRS$(7) détermine la couleur du vaisseau, blanc.

Lorsque l’on déplace le vaisseau à gauche, les deux blancs B$ situés à droite effacent le vaisseau précédent. Lorsque l’on se déplace à droite, le vaisseau précédent est remplacé, effacé par les deux CHRS$(7). Enfin les quatre blancs de la chaine T$(2) effacent le bas du vaisseau précédent après chaque déplacement vers le bas du champ d'étoiles.

150 S est l'adresse-mémoire de l'octet qui correspond au caractère de gauche de la première ligne de l'écran, elle servira à la ligne 220. Les constantes L et M seront aussi utilisées à la ligne 220.

La boucle de jeu s'étend de 179 à 34. 199 On tire au hasard un nombre Z% compris entre 1 et 37.

209 En Z%X on place un caractère dont le code ASCII est aléatoire et compris entre 1 et 6. C'est un code de couleur, qui détermine la teinte

25

210

229

230 249

259 260 270 289

26

des caractères situés après lui sur la ligne. En Z%+1, on met une étoile, qui a la couleur définie par le caractère précédent.

H$ contient un caractère CHR$(11). Lorsqu'il est émis par un ordre PRINT, il déplace le curseur vers le haut, comme la touche ‘flèche en haut”. L'ordre LORES 1 de la ligne 40 a effacé l'écran et placé le curseur dans le coin supérieur gauche.

Aussi, comme l'ORIC ne peut pas dans ce cas déplacer le curseur vers le haut, il déplace tout l'écran en sens inverse, vers le bas, ce qui est ce que l'on recherche ici. Il ne faut pas oublier le ; à la fin de l'ordre, il empêche le curseur de revenir au début de la ligne suivante, ce curseur reste donc dans le coin supérieur gauche.

On place soit un CHR$(9) soit un CHR$(13) au début de la première ligne de l'écran. L'étoile qui a été placé sur cette même ligne écran en 200 sera donc clignotante avec CHR$(13) et fixe avec CHRS$(9).

Lit le clavier.

Si la touche frappée est ‘’flèche à gauche’ et si X% est supérieur à @ l'expression (C$—G$ AND X%>0) est vraie et vaut —1, on décré- mente X%. Si on a frappé ‘flèche à droite’, c'est (C$—=D$ AND X%X<36) qui vaut —1 et on incrémente X%.

On trace le vaisseau. On regarde si l'on est en face d'une étoile. On regarde si l'étoile clignote.

SCRNIX%+1,Y%—1) donne le code ASCII du code de couleur de l'étoile, c'est un nombre compris entre 1 et 6 que l'on ajoute au score U%.

10 REM ETOILES X XX XX XX OIOK KOHOK HACK OHOKOKACK NOK K 20 :

FO HAT: Test: QAer4: AYeTE

40 FAFER O:INE O:LORES 1:S=#BB800+8XxT% 20 FORI=STOS+E%: READV: POKHET, Vs: NEXT

60 DATA 12,12,12,:5:0,45,45,45,45

70 DATA 45,45,45, 6%, 45,38, SE

80 DATA 0,0,12,20,230,12,0,0

90 Xl: YAe20: FRINTEHRS (17) : CHKS (20) 100 Gé=CHRS (8) : DÉECHRS (9) s H$ECHRSE (11) 110 DIM TH(2) : BH=CHRS# (E2)

120 150 140 150 160 170 180 190 200 seu) 220 HAT) 240 Ale) 260 270 240 290 F00 F10 FE FE0 540 550 60 370 380 90 400 410 420 450 UT] 450 4860 470 440 490 #00 ee) AR)

TH CO) CHARS (9) +CHRS (7) +CHRS (TA) +8 TH CL) CHARS (9) +CHRS (7) +CHRS COZ) +E THE) =R$+RÉ+ERH+ES GeHBROO+4 1: Les: Mel

REM DEBUT DU FROGRAMNME- FOR Tæ1 TO 400

L'AsE7 KRND (1) +1

FLOTZ 4 On 1 +6XRND C1) 8 FLOTZ A+ 1 4 Ou FRINT H#: |

FOEE Sil:IF KND(1)<,.STHEN FOKHES,M CHEKEYS

XX At (CHEGBANDXZ 50) (CHE=DBANDX4E T6) FOR Ie0OTOS: PLOTX a Vatls TH CI): NEXT IF SCRNEX AH, V1) HA% THEN 290 IF SCRNCO, Vé-liels THEN 550

LAF'e UE A+SCRN OX 1, VA 1)

ZEFRE (0)

NEXT TeWAIT 200:G0OT0 350

REM FIN DU FROGRAMME eee nee FORIS=OTOZ: PLOT K44+1, VA+I, Le NEXT EXPLODE:WAIT 300€ /0c

TEXT: PAPER Z:INE ©: CLS

FRINT: PRINT: FRINT: PRINT: FRINT PRINT SPCCIG) "Vous avez gagne" FEAINT: PRINT: FRINT

PRINT -SPECLIS):CHRS C27) 8 "Aile

FRINT CHARS (27) x N'a UT

PRINT SPC CLS) 5; CHARS C27) 3 "Al

FRINT CHARS C7) 3 Nas LI: FRINT PRINT: PRINT: PRINTSPC (15) s "pointe" BeINT OX / 20) 2 FRINT: FRINT: FRINT

IF BeQ THEN SHOOT:GOTO 500

IF KR THEN EXPFLODE: GOT 560

ON E GOTO 510,880, 250, 840, 550

FRINT'"'Vous etes nul. !":GOTO 580 FRINT'Fas terrible. !":GOTO 580 FRENCH Sr GOT 0

27

30 FRINT'Fas mal.'":G0OTO 580

540 FRINT'Felicitations!":GOTO 580 0 FRINT'GQuel score !!'":GOTO 580 160 FRINT'Fantastique ! Formidable !" 57 Cine

390 FRINT CHRS# (17) 5 CHR# (20)

Ne pas oublier les ; des lignes 219, 394 et 419.

1.8 VOYAGE DANS L'ESPACE

Après CHUTE D’ÉTOILES, nous poursuivons notre voyage dans l’espace. Le vide intersidéral est décidément très peuplé, car vous traver- sez de nouveau un champ d’étoiles. Mais attention: cette fois-ci, ce sont des étoiles très dures, qu’il faut absolument éviter. Vous disposez toujours des flèches à gauche et droite pour manœuvrer. Au départ, vous avez un crédit de 9, ce qui signifie que vous pouvez percuter neuf étoiles au maximum. Il ne me reste plus qu’à vous souhaiter bon voyage!

28

30

49

59

69

89 99

100

119

140

159

169 219

On efface l'écran, on efface le curseur, le mot CAPS, on supprime le “’plop"” produit par les touches du clavier:

Bien qu'il ne soit plus affiché, le curseur existe toujours dans l'ORIC, il indique l'endroit sera affiché le prochain message. L'écran comporte 27 lignes, on envoie le curseur sur la dernière ligne de l'écran.

S est l'adresse-mémoire de la première ligne de l'écan. (On ne compte pas la ligne se trouve CAPS).

H%=—42 est le code ASCII de l'étoile. G$ et D$ contiennent les codes ASCII des touches ‘flèche à gauche” et ‘flèche à droite”.

On place trois étoiles sur la dernière ligne de l'écran.

Comme le curseur est en bas de l'écran, PRINT décale tout le contenu de l'écran vers le haut. Puis on lit le clavier.

Ceci, comme dans le jeu précédent, incrémente décrémente X selon la touche frappée.

à 130 On regarde si l’on a rencontré une étoile. Si oui, on décrémente le crédit V.

On fabrique le vaisseau. V est un nombre compris entre 1 et 9. V+48 est compris entre 49 et 57, ce qui correspond aux codes ASCII des caractères “1” à "9".

On affiche le vaisseau et on incrémente le score. On modifie la couleur de façon aléatoire.

La chaîne STR$(N%), c'est une particularité de l'ORIC, débute par un caractère CHR$(2) qui donne au nombre la couleur verte. Pour que les mots année lumière...” qui sont à la suite ne soient pas verts eux aussi, on affiche CHR$(3), ces mots seront donc jaunes.

19 REM VOYAGE DANS L'ESPACE X X XX XX XX X PRE

30 CLS: FRINTOEHRS (17) 3 CHARS (20) : CHERS Cé) 46 FOR Ii TO E7:FRINT:NEXT: FAPER © MO Xelde Yetés VeGs SeHBREAAS: Le Te

8 Némos Hs GeCHRS (6) : DÉeCHRSE (9) FAN

80 FORI=1TOË: FLOTI+RND C1) KL, Ya Hs NEXT

29

90 FRINT:ES=EEYS

100 110 120 1:50 140

50 180 170 120 190 200 210 220

230

KeX+ (Eee GSANDX 1) (E$=DSANDX< 56) FOR I=9 TO

IF PEÉEE (S+X+I1)=H% THEN VeV-1:FING NEXT:IF V£1 THEN 180

PLOT K,0, VS: N4=N%X+1 INF 1+7XKRND (1): GOTCO 80

EXFLODE: WAIT Z200:FAFER O:INE FLOT 9,125, '"Vous avez vayage dans” FLOT 11,15,"1"espace pendant” FLOT 9,17, STRS8 (NA) +CHRS& C3) FLOT 14,17, "annees lumiere... PRINT CHKS# (17): CHR$# (20) ; CHRS (6)

30

1.9 CHENILLE

Voici maintenant un classique” des jeux sur micro-ordinateurs : Le jeu de la chenille. Une pauvre petite chenille affamée se promène sur votre écran, cherchant sa nourriture. Elle mange des punaises, des araignées et des gros scarabées. Votre rôle consiste à guider la petite chenille avec les quatre touches fléchées. À chaque fois qu’elle mange une punaise, elle grandit d’un anneau. Une araignée la fait grandir de trois anneaux, et un scarabée lui donne dix anneaux de plus. Le but du jeu est de faire grandir le plus possible la petite chenille.

Attention : cet animal est très vorace, il avale vraiment tout ce qui se présente à ses mâchoires. Il ne faut pas que sa tête passe sur son corps, car il se dévore immédiatement et en meurt. De plus, les gros scarabées sont très lourds à digérer, la chenille ne peut en manger qu’après avoir avalé une araignée, qui contient des sucs digestifs.

La difficulté du jeu commence à se manifester lorsque l’on atteint une longueur d’environ deux cents anneaux: Il faut soigneusement choisir son chemin pour éviter d’être pris dans les replis du corps qui occupe une bonne partie de l’écran. Pour vous aider, le nombre de scarabées que vous pouvez avaler sans risquer l’indigestion est inscrit en rouge en bas de l'écran.

La tête de la chenille, chacun de ses anneaux, la punaise, l’araignée et le scarabée sont bien sûr des caractères que l’on a redéfini.

! l l | I ! [

rep anneau

anneau araignée

anneau

RE

+ | l | l l | l | + | ! | l l | l LE ! ! Û | | [

sp me

== + l | punaise |

31

La difficulté de ce programme réside dans le déplacement de la chenille. On ne peut pas déplacer sur l’écran toute la chenille lorsque vous frappez une touche, car cela serait beaucoup trop long. Prenons un exemple pour montrer comment l’on procède :

On veut déplacer vers la droite la chenille:

position 1

position 2

On pourrait bien sûr déplacer vers la droite les quatre caractères qui représentent la chenille. En fait, partant de la position 1, il suffit de:

déplacer la tête vers la droite,

mettre un anneau à l’endroit se trouvait la tête avant son déplacement,

effacer le dernier anneau.

On arrive ainsi à la position 2 en trois étapes, et ceci quelle que soit la longueur de la chenille.

Dans la mémoire de l’ORIC, chaque élément I, anneau ou tête, de la chenille, est représenté par trois nombres: son abscisse sur l’écran S%(T, 9), son ordonnée S%(I, 1) et un pointeur P%(T). Le pointeur P%(I) contient le numéro de l’élément précédent dans la chenille. Au début du jeu, on a:

32

P%(1)=2 P%(2)=3 P%(3)=1

S%(1,9)=1 S%(2, 9)=2

S%(3,0)=3

S%(2, 1)=1 S%(3, 1)=1

S%(1, 1)=1

élément 1 (queue) élément 2 (milieu) élément 3 (tête)

On a de plus deux variables TÊTE et QUEUE qui contiennent le numéro de l’élément qui est la tête et celui de l’élément en queue respecti- vement. Au début du jeu, TÊTE=3 et QUEUE=1. Si l’on déplace la chenille vers la droite:

On fait progresser en suivant le chaînage les contenus de TÊTE et QUEUE en exécutant TÊTE-P%X(TÊTE) et QUEUE=P%(QUEUE).

On place les nouvelles coordonnées de la tête dans l’élément de numéro TÊTE.

P%(1)=2 P%(2)=3 P%(3)=1

S%(3, 9)=3

S%(1,0)—4 S%(2,9)=2

S%(3,1)=1

S%(2,1)=1

S%(1, 1)=1

élément 1 (tête) élément 2 (queue) élément 3 (milieu)

TÊTE vaut 1 et QUEUE vaut 2.

Pour déplacer la chenille, on peut seulement modifier le contenu de S%(1, 0), S%(1, 1), TÊTE et QUEUE. De façon plus générale, n'importe quel déplacement ne modifie que quatre quantités, TÊTE, QUEUE, SH(TÊTE, Ÿ) et SH(QUEUE, 1), quelle que soit la taille de la chenille.

Pour allonger la chenille d’un élément, on incrémente la variable L, qui contient la longueur de l’animal, puis on ajoute l’élément L en queue.

33

10 0 EE 40 0 6 70 80 90 100 110 120 1:30 140 150 160 170 180 190

200

34

élément à ajouter

[fe

REM CHEN TELLE XOKOK HCOXOK HOKOK HONOR HONOR HONOK NOK K GOSUR 1000 GÜSUER 1200

REMIDECEUREZTCLAVTIERTS- Sens Tees esse

AS=ÉEVS: IF Ag="" THEN 440

XE=GSZUTETE, 0) : YeSXTET, 1) : A=ASC (AS) IF A=SANDXS1 THEN X=X-1:GOTO 150 IF A=GANDXE58 THEN X=X+1:G0TO0 150 IF AZ=IOANDYEES THENY=Y+1:G0T0 150 IF A=ILIANDY:O THEN YeY-1: GOTO 150 GOTO 70

REM DEPFLACEMENT CHENILLE See PLOT -SÉCTETE, 0) S/2CTETE, 1,02 PLOT S%(QUELE, 0),S7% (QUEUE, 1) ,32 TETESFYA (TETE) : QUEUESFX (QUEUE ) SLITETE, O0) EX: SLTETE, 1) =Y V=SCRN(X,Y):FPLOT X,Y,CI

210 220 2:30 Z40 250 240 270 280 290 500 310 320 S50 340 350 560 370 380 590 400 41 0 40 450 440 450 Ta LA) 470 480 490 OU ss Le R e TA) ETS) Eur PL) 360 a70 380 590 800 610

IF Vr128 THEN VaV-128

IF VeCl OR Vz C2 THEN 550

IF VESC4 THEN 280

REMNPUNAISESSS ESS ESS ST See ZAF:LlLels GOSUR 680: GOT 440

IF VESCS THEN 540

REM ARBIGNEE--- eee ZAFilLeËs: GOSUR 480: :FeF4+1

MOST ES Or PLANS 2 00)

GOTOQ 590

IF VE CS THEN 440

REM GROS SCARAREE ----- FeF-1l:IF F£0 THEN 550 MUSTEMISERT ON OR PLAYA AL 5000 LLe10:GOSUR 450

FLOT 10,%46,'"Je peux avaler"

FLOT 25,26, STK$(F) 2 FLOT2S. 26,32 PÉDALE

IF RND(1):.08 THEN 70

Ve INT CEA XEND (1) )

Xe 1 4 EEK RND (1) 5 Ye GRAND (15

IF SCRNX YIESHES THEN 70

Ve INT CE 1 XFRND 1) )

IF Vidà THEN CeCs

IF V:10 AND VE47 THEN Cats

IF VEI1 THEN CxC4

FLOTXSYR ESA TA 70

nd E M F: E F4 D LJ ann rene venus comte oo canne santé sante tte 1060 vatus ones c000e onto vebee one 0006 00009 sans eme cute on606 00008 one EXPLODE:FLOTI16,15, "Score:" LHE=STRSE (LL) LHERIGHTS (LS, LENCLS)—-1)

FLOT 228,15, L#: PRINT CHRS# (6): FLOT 10,1%, "On rejoue (O/N) +" GET A$:IF A$="0Q" THEN 40

IF ASSSUNU THEN FING:GOTO 400

35

36

620 620 640 650 éé0 870 880 690 700 710 720 1000 1910 1920 1050 1040 1050 1060 1970 1080 1990 1100 LAAO 12700 210 1220 1250 1240 1250 1260 1270 1280 1290 1500

CLS: END

REM ALLONGER LA CHENILLE FOR J=i TO LL:ileL+i

FA CL) “QUEUE : FX (TETE) =L SA (Ls 0) =S% (QUEUE, 0) SAiL, 1) =6% (QUEUE, 1) QUEUE=L

NEXT J

RETURN

REM DEFINITION CARACTERESXXXXXXX DATA ZE, ST, TO, 18, 18,30, SR, 25 DATA 240,51,2%,45,45,23,51, 30 DATA 25,19,12,12,12,12,18,55 DATA 0,0,18,12,12,18,0,0

DATA 12,12,45,65,65,45,12,12 S=44080+122%8

FOR I=STOS+29: READV: POKET, Vs: NEXT Ci=172:CPe12%: Ce124: C4=175 C5=126: DIM S4(600, 1),F4 (600) RETURN

REM INITIALISATIONS XX XX OK NX OK KX TEXT:FAFER Z3INE O:CLS

Le: FeO0s FRINT CHRS$ (6):

FOR I=i TO L

SACI,O0)=I:S%(I.1)=1

PLA(CI)=I+i: PLOT I,1,C25NEXT I FAiL)=1: TETE=L: QUEUE =1

PLOT L,1,0Ct: PLOTO TL, 26,41

FLOT 10,%6,'"Je peux avaler"

FLOT 25,26.,48:PLOT %29,26,05 RETURN

1.10 ENCLUMES

A la suite d’une dispute avec l’un de vos voisins, vous décidez de lancer sur sa maison des projectiles à l’aide d’une catapulte. Mais que lancer ? Il faut en effet des objets assez lourds, capables de produire en tombant suffisamment de dégâts. Votre choix se porte sur un stock d’enclumes, acheté d’occasion.

Avant chaque tir, il faut régler la catapulte, pour fixer d’une part la vitesse de départ de l’enclume et d’autre part l’angle de départ par rapport à l'horizontale. Le tir est compliqué par la présence d’une montagne et par du vent, qui dévie la trajectoire.

A chaque tir, il faut donner la vitesse initiale exprimée en mêtres/- seconde, l’angle de départ en degrés. La vitesse du vent est positive s’il va vers la droite de l’écran, négative s’il va vers la gauche.

Voici quelques explications sur le fonctionnement de ce programme. Les lignes 39 à 69 servent à définir le caractère qui représen- tera l’enclume. 46592 vaut 46989+8*64, ce qui signifie que l’on a redé- fini le caractère de code ASCII 64.

37

Les lignes 89 à 199 servent à tracer la montagne de pente H. De 119 à 149 on trace le versant gauche tandis que le versant droit est dessiné de 159 à 189. A la ligne 189, on place en bas à droite de l’écran un caractère CHR$(17) sur neuf lignes. Ce caractère donne à l’écran la couleur rouge.

Le bloc 299 à 329 sert à initialiser la position (X, Y) du projectile ainsi que sa vitesse (VX, VY). On tire aussi au hasard la vitesse V du vent. G—9.81 est l’accélération de la pesanteur.

La trajectoire est calculée point par point, en utilisant une méthode d'intégration numérique d’ordre deux. Le projectile est soumis à l’accé- lération de la pesanteur et à une traînée aérodynamique proportionnelle au carré de sa vitesse VI par rapport à l’air.

De 339 à 399 on calcule un point. 349 V1 est la vitesse de l'enclume par rapport à l'air, tandis que G1 est la décélération due au frottement aérodynamique. 359 DT est le pas de calcul. 369 On calcule les composantes GX et GY de l'accélération du corps. 379 On calcule les composantes VX et VY de la vitesse. 384 On obtient alors la nouvelle position (X, Y)

Les lignes 499 à 549 affichent l’enclume, en vérifiant qu’elle n’est pas sortie de l’écran et qu’elle n’a pas percuté la montagne.

38

Enfin, les lignes 519 à 559 terminent le programme.

10 REM JEU D'ENCLUMES %X XX OK OK OK OKON HO K KOKOKK 2: GÈNSS

50 REM DEFINITION FORME ENCLUME 40 DATA 0,50, 65,20, 12, 50,0, 0

50 TEXT:FOR Is44502 T0 44599

READ ViFORE TV: NEXT

RO REM TRACE MONTAGNE eee eee ie 90 PAFER 23INE 4: HeRND CL) KI, E+,

100 HIRES:FAFER Z:INE ©

110 FOR 1=40 TO 119

30 JeINT CCI-40) KH4+LEXKRND C1) 2 +1

LEO CCURSET. 99: Er DRAN TO ETS

140 NEXT I

LEOCEURSTET 204 TENTE?

160 JeINTÉ(199-T) KH+LESXKRND 1) ) +1

170 CURSET 1,199,3:DRAW O,-—-I,1 LACONENTMT ES CURSETESES LOUE ETES, A7 ÉOUMES

200 REM INITIALISATIONS----- 210 Xe0:Ve0ske, OO: G=0,01

280 Ve (RND(1)-.5) Kk5 BEOMPRINTUVENTE EU

240 FRINT'DONNER L VITESSE INITIALE" 240 INEUT VO

260 PRINTUVENT:S Vs tt VOs ts No

270 FRINT'DONNER L'ANGLE DE DEFART" 280 INPUT A: FRINT

290 PFRINT'VENTs "Vs" VOs"aVOst Ass A = AzA/1E0OXxFPTI VX=VOXCOS CA) : VYÆ=VOXSTN (A) REMICALCULNTRATEETOTRE===SSSSSÉSS VI=SCR CVX-V) D4UVES) 2 GisEXVI"2 DT=15/Vi+, 1: D2=DT"2/E

GX: (VX-V) /VIXGI:GYe-VY/VIiXxG1-6 VXE=VX+HEGX DT: VYeUY+GYXDT

39

SP

400 REM AFFICHAGE ---- 410 Z2=199-Y:2IF 7192 THEN 440

420 IF X:220 AND X2257 THEN 510

#50 FING:WAIT 2300:G0OTQ 100

440 IF X£4 OR X:237 OK Z£O THEN 740 450 IF FOINT(X,2)=0 THEN 470

480 EXFLODE:WAIT 5300:GOTO 100

470 CURSET X,2Z,0:CHAR 64,0,1

480 SOUND 1,10000/(200-7),0

490 FLAY 1,0,4,100:GOTQ 340

SOO

510 REM COUF AU BUT----———

920 PAPER 1:CURSET X,192,25

330 CHAR 64,0,1:ZAP:WAIT 40:EXPFLODE 540 PRINT:PRINTSPC(27) 3; "Sprotch I 990 WAIT 400:SHOOT

1.11 MUR DE BRIQUES

Chapeau bas. J’ai l'honneur et l’avantage de vous présenter l’un des ancêtres, l’un des pionniers des jeux vidéos, le jeu de mur de briques. En face de vous se trouve un mur de 490 briques. Vous avez une raquette, et vous devez sans cesse renvoyer une petite balle qui casse les briques sur lesquelles elle rebondit. Le but est bien sûr de casser les 499 briques.

Les touches ”flèche à gauche” et ”’ flèche à droite” déplacent la raquette, tandis que flèche en bas” incline cette raquette vers la gauche et flèche en haut” l’incline vers la droite. Ainsi, la raquette peut avoir cinq inclinaisons différentes, et l’on peut renvoyer la balle dans une autre direction.

La tactique consiste à percer le mur de part en part, puis d'envoyer la balle dans le trou, pour qu’elle arrive entre le haut du mur et le haut de l'écran. Elle rebondit alors sur le haut de l’écran et sur le mur, en détrui- sant une brique à chaque fois.

Ce jeu utilise le mode haute résolution HIRES. Les principales variables utilisées sont :

X, Y: position de la balle sur l’écran. VX, VY: vitesse de la balle.

XR, YR: position de la raquette.

R : angle de la raquette.

MG, MD, MB et MH sont les marges gauche, droite, basse et haute de l’écran.

A$, B$, C$ et D$ contiennent les codes ASCII des touches flèches.

Le fonctionnement du programme est le suivant:

30 Lesinitialisations sont laissées à la responsabilité du sous-programme

500. La boucle de jeu est constituée des lignes 59 à 254.

59 On lit le clavier. Si une touche flèche n'a pas été frappée, il n'y a pas à modifier la position ou l'angle de la raquette et on va en 190.

41

60

70

89 99

100

119

149

179

Les lignes 69 à 189 modifient la position ou l’angle de la raquette.

On commence par effacer l'ancienne raquette en y plaçant le carac- tère B.

Si on a frappé ‘flèche en haut”, il faut incliner la raquette à droite, J1 est l'incrément angulaire que l’on va ajouter en 119 à l'angle R.

Si on a frappé ‘flèche en bas”, il faut incliner la raquette à gauche.

Si on a frappé ‘flèche à droite”, il faut déplacer à droite la raquette. 11 est l’incrément que l'on va ajouter en 149 à XR.

Si on a frappé ‘flèche à gauche”, il faut déplacer à gauche la raquette.

à 130 On modifie l'angle R de la raquette en vérifiant que l'on ne sort pas des limites —-RM, +RM.

à 169 On modifie la position XR de la raquette en vérifiant que l'on ne sort pas de l'écran.

On affiche la raquette. INT(R/J2) vaut —2, —1,@, 1 ou 2 selon l'angle de la raquette.

Les lignes 199 à 259 déplacent la balle.

199 On calcule les nouvelles coordonnées XA et YA. 200 Si l'on sort de l'écran par la gauche ou la droite, on va rebondir en 350. 219 Si l'on sort de l'écran par le haut, on va aussi rebondir en 359. 220 Si l'on sort de l'écran par le bas, on va en 320. 230 Si l'on a rencontré une brique, on va en 27%. 249 On efface l’ancienne balle en X, Ÿ on trace la nouvelle en XA, YA. 25% Après avoir transféré (XA, YA) dans (X, Y), on recommence. Les lignes 279 à 319 sont exécutées lorsque l’on rencontre une brique. 279 On calcule les coordonnées X1, Y1 de l'angle supérieur gauche de la

280

42

brique rencontrée.

On efface cette brique.

299 On incrémente le nombre NB de briques cassées et on regarde s’il est égal au nombre total NT de briques.

309 On affiche NB. 319 On nettoie la mémoire et on va rebondir sur la brique en 350.

329 On arrive à cette ligne lorsque l'on sort de l'écran par le bas. Si de plus la balle n'est pas dans la raquette, on va en 1500.

Les lignes 359 à 424 servent à calculer les nouvelles vitesses VX et VY après un rebond sur un plan faisant un angle A avec l’horizontale.

Le sous-programme 59-99ÿ réalise toutes les initialisations néces- saires, variables, constantes et caractères.

Les lignes 1999 à 1199 sont exécutées lorsque l’on a détruit toutes les briques, tandis que les lignes 1599 à 1580 servent lorsque la balle est passée à côté de la raquette.

19 REM MUR DE BRIQUES X XX XX XX KOKOK OKON NN K BOL

30 GOSUR 500

40 :

SO TH=<ÉEYSs: IF T#EDS OR TH:A$ THEN 190 60 CURSET XR,YR, 23: CHAR KH,0,0

70 IF T#é=A$ THEN Ji=J2:G0OTQ 110

80 IF T$é=kR$ THEN Ji=-J2:G0OT0 110

90 IF TH=C$ THEN Iiz12:GO0OT0 140

100 IF T$=D$ THEN Ii=-I12:G0OT0 140

110 ReR+JIs IF KR£-RM THEN K=-RM

120 IF R:RM THEN REKRNM

150 GOTOQ 170

140 XR=XR+II:IF XREMG THEN XK=MG

150 IF XR:MD-7 THEN XR=MD-7

160 CURSET XR,YR,E

170 CHAR 125+INT(R/J2),0,1

180 :

190 XA=X+VXXDT:YA=Y+VYXDT

200 IF XAEMG OR XA:MD THEN A=PI:GOTOSEO 210 IF YASMH THEN A=0O:GOTO 350

220 IF YA:MER THEN 5320

250 IF FOINT(XA, YA)=-1ANDYAËM THENZ70

43

44

240 240 260 270 280 290 300 310 20

550

540 350 560 AO) 80 390 400 410 420 #50 500 510 sine Te) 140 er er 0) 60 370 340 90 TRI e) 610 20 4350 640 [EL a C) 470 680 690 700 10

CURSET X,Y,O:CURSET XA,YA, 1!

XæX As: YeYA: GOTO 50 X1=6XINT(XA/6) : YI=GXINT(YA/6) CURSET X1,Y1.3:FILL 6,1,64 NE=NE+ 1: FRINT:IF NRENT THEN 1000 FRINT'EBriques casseess !"sNER:EXPLODE A=Qz: ZeFRE CM") 3: GOTO 750

IF XAËXR-1 OK KA:XR+7 THEN 1500

Az

U=VXXCOS (A) +VYXSIN (A) VVYE=VXKSIN CA) -VYXCOS CA) : VX) XA=XA+VXXDT: YA=YA+VYXDT: FING IF XASMG THEN XA=MG

IF XA:MD THEN XA=MD

IF YAËSMH THEN YA=MH

IF YAS:ME THEN YA=ME

GOTO 240

REM INITIALISATIONSXXKXKXKXEXEXXX TEXT: PAPER 23: INK © HIRES : RESTORE

A$=CHKRS#& (11) FLECHE EN HAUT R&=CHRS (10) FLECHE EN BAS CH=CHKS& (9) FLECHE 4 DROITE D&=CHRS& (6)? FLECHE 4 GAUCHE PRINTAINEUT Force, c(CI=5) LEDT

IF DT£1 OK DT:S THEN FING:GOTOS590 X=120:Y=195" POSITION HALLE

Az CRND (1) 5/2) XFI/2

VX=COS (A): VYESTIN (A) VITESSE HALLE XR=120:YK=1923" POSTTION RAQUETTE

MG=0:MD=259* LIMITES DE MR=199: MHx0Q? L'ECRAN M=1007 MILIEU DE L'ECKHAN

R=Q? ANGLE RAGQUETTE

720 750 740 2Ejt) F0 770 790 790 800 810 8E0 RFO 840 LS Hart) 860 870 980 290 QU 910 920 PART 4}Q GEO 970 GRO 90 1900 1010 1020 1050 1940 1050 1060 1070 1080 1990 1100

J2=PI/36" INCREMENT ANGLE RAQUETTE 2e INCREMENT FOSITION RAQUETTE RM=J2X2" ANGLE MAXIMAL RAGUETTE NT=40Kk10" NOMBRE TOTAL DE BRIQUES NE=O" NOMBRE DE BRIQUES CASSEES REM DEFINITION RAQUETTES---——————— DATA 000.0:3%:17:48.0,0 DATA 0,0,0,0,7,56,0,0 DATA 0.0,0,0,0,6%,0,0 DATA 0,0.0,0,56,7,0,0 DATA 0,0,0,48,12,3.0,0 G=#9800 FOR A=S+12EX8 TO S+177X8+7 READ U:FPOHE AU NEXT A REM DEFINITION CARACTERE BLANC E=64 FOR A=SG+64Kx8 TO S+64Kk8+7 FPOEE 4,6% NEXT A CURSET O,6,2%:FILL 60,40,6% CURSET XR,YR, 3: CHAR 125,0,1 RETURN REM._ GAGNEZ XOK X KK KO K TEXT: CLS: PRINT: PRINT FRINT CHRé# (4) PRINT SPC (12); CHRS (27) 5 "N": PRINT CHR$(27):; "AR R À V O" PRINT: PRINT: PRINT PRINT SPC (10): CHRS CE7) "9"; PRINT CHR$ (27); "EFLUS DE BRIGUE" PRINT CHARS (4) : PRINT: PRINT GOTO 1530

ACKNE NOK OK NC ONCKK

45

1500 REM FERDUX X 4CK XOK OK NOK KM NOK MC HOKOK HOME NON 1910 FRINT'SCORE FINAL: "3: CHRS#(27)s "A"; 1920 FRINT NR:;CHRS (27) ; "9"; "RRIQUES" 1550 FRINT'Voulerz-vous rejouer (O/N) " 1540 INFUT T$

1550 IF T$="0" THEN 10

1560 IF T$£S "NT THEN FING:GOTO 1570 1570 TEXT:END

1580 :

1.12 BATAILLE NAVALE

Ce jeu vous permet de jouer à la bataille navale en solitaire, l'ORIC se charge de placer les bateaux. Pour tirer, il vous suffit de frapper les coordonnées de l’endroit visé. D’abord, taper une lettre comprise entre A et J, puis un chiffre compris entre Ÿ et 9.

L’ORIC a placé dans la grille un porte-avion (4 cases), deux croi- seurs (trois cases), trois torpilleurs (deux cases) et quatre sous-marins (une case).

Les bateaux ne peuvent se toucher. Après chaque tir, l'ORIC vous

indique ”’ à l’eau”, ”’touché” ou ”’ coulé”. Voici quelques explications sur le fonctionnement de ce programme. Tout d’abord, quelques initialisations, de 19 à 69.

49 CLEAR sert lorsque l'on rejoue, il efface toutes les variables, ce qui est un moyen de les remettre à zéro. Le tableau JEU% sert à y placer les bateaux. Bien que la grille fasse 19x10, ce tableau fait 12x12. Ceci pour simplifier la programmation du jeu. Le tableau COULE®% sera progressivement rempli de ‘’@'’ au fur et à mesure que des bateaux seront coulés.

De 89 à 159, on dessine la grille de jeu.

109 On place en (9,l) un caractère 16 qui donne à l'écran la couleur noire, jusqu'à ce que l’on rencontre le caractère 29 placé par l'instruction suivante, qui redonne à l'écran la couleur bleue.

46

139

200

219 220 230 249 259

300

350

419

429

430

449

Lorsque | varie de 2 à 11,1+46 varie de 48 à 57, on obtient donc les codes ASCII des caractères ‘’O'"’ à "9". 1+63 donne lui les codes ASCII des caractères A à J.

Le bloc 169-389 place les dix bateaux dans la grille.

La variable H permet de décider si le bateau sera horizontal (H=—1) ou vertical (H=—).

X est l’abscisse de la case supérieure gauche du bateau à placer. Y est l'ordonnée de cette case.

XF est l'abscisse de l'autre extrémité du bateau.

YF est l'ordonnée de l'autre extrémité du bateau.

à 290 On vérifie que les cases situées autour du bâtiment sont bien vides, que le bâtiment n'en touche pas un autre. Si tel n'est pas le cas, on va en 200, il faut placer ailleurs le bâtiment.

à 340 On place le bateau dans la grille. Le chiffre des dizaines de 1@+TYPE+N est TYPE et indique le type du bâtiment tandis que le chiffre des unités est N et indique le numéro du bâtiment. On peut ainsi stocker deux données dans une même variable.

On stocke dans COULES% la longueur du bâtiment. Les lignes 399 à 449 lisent le tir.

On lit un caractère. Si ce n’est pas une lettre comprise entre A et K, on recommence.

On affiche la lettre, et l’on calcule l'abscisse X du tir, comprise entre 1 et 19.

On lit un caractère. Si ce n’est pas un chiffre compris entre @ et 9, on recommence.

On affiche le chiffre, et l’on calcule l'ordonnée Y du tir, comprise entre 1 et 10.

De 469 à 499, on regarde si le tir a touché quelque chose. Si non,

on place un point sur l'écran.

519 529

Le bloc 519 à 559 est exécuté lorsqu'un bateau est touché.

On détermine le type du bateau touché.

On détermine le numéro du bateau touché.

47

530 On fait disparaître de la grille la case touchée. 549 On décrémente la longueur du bateau.

559 On fait apparaître sur l'écran un chiffre compris entre 1 et 4, qui indique la taille du bateau touché.

De 560 à 599, on affiche le message approprié à la situation. Si la longueur du bateau est réduite à zéro, ce bâtiment vient d’être coulé.

De 619 à 659, on regarde s’il reste des bateaux à flot.

10 REM BATAILLE NAVALE X X 40K k HCOKOK OK HCNOK OK K ua

30 REM INITIALISATIONS----——————————— 40 CLEAR: DIM JEUX (11,11), COULEY% (4, 4) 30 FAFER 4:1INE 7

60 CLS

ZOIS

80 REM DESSIN DE LA GRILLE---------—- 90 FOR I=Z TO 23

FOULPÉUTS ETES FÉOMEO NI E0)

110 NEXT I

120 FOR I=Z TO 11

150 FLOT 7,2X1,1+46:PFLOT 6+2XI,1,1+67% 140 NEXT I

1502

160 REM ON FLACE LES HATIMENTS---——-—— 170 FLOT 9,25, "Je place les bateaux" 180 FOR TYFE=4 TO 1 STEF-1:VeTYFE-1 190 FOR N=1 TO 5-TYPE

200 H=-1s IF RND(1)5%,5 THEN H=O

210 X&1+INT CCLO+VKH) XRND C1) )

220 Vel+INT((C1O+VX (NOT H)) XKND (1) ) 250 KF=X-HXV

240 YFæeY— (NOT H) KV

250 FOR I=X-1 TO XF+1

260 FOR Jev-1 TO YF+1

270 IF JEUX(I,J)45:0 THEN 200

20 NEXT J

2POUNEXTINT

48

500 510 320 HEO 340 550 560 #70 390 590 400 410 #50 450 440 450 440 470 4890 430 500 10 de Te) 340 Dit) se KT 1) 70 580 yo 800 10 820 850 840 850

FOR I=X TO XF FOR J=Y TO YF JEUX CI,4J) =TYFEXI1O+N

NEXT JM NEXT I COULEX (TYPE, N) = TYPE NEXT N

NEXT TYFE REMNDERUNTEDUMIEUSSSTSSESTS SSSR FLOT 9,25,'"Que jouez-vous: GET A$:IF A$:"A"ORASENE" THEN 400 FLOT 27,25, 4%: X=AGSC (AS) -64

GET ÂA$:IF A$:"O"ORAS:"9" THEN 400 FLOT 28,25, A8: Y=ASC (AS) -47

IF JEUX (X,Y)55:0 THEN 510

FLOTUAR ENS ER VER NES

FLOTTE, À l'eau. 1 WAIT 200:G0OTQ 400 TYFEZINT (JEUX CX, Y) /10) N=JEUTX CX, Y)—-1OXTYFE

JEUX (X, Y)=0Q

COULE' (TYPE, N) &COULEX (TYPE, ND —1 FLOT ZxX+6,2XxY+2, TYPE+48

EXPLODE : IFCOULEYX (TYPE, No =OTHENS90O PÉGT T2," Touche. g GATO 410

FLOTTE Coule !! {

WAIT 200

FOR Is1l TO 4:FOR Jæi TO 4

IF COULEYX(I1,J)2:0 THEN 400

NEXT JsNEXT I

PLOT 9,25," GAGNE !!! À

49

1.13 MASTER MIND

Le master mind est un jeu de réflexion auquel vous allez pouvoir jouer avec votre ORIC. La règle du jeu est la suivante: L’ORIC choisit une combinaison de quatre pions qu’il vous faut découvrir.

Chacun de ces pions peut être rouge, vert, jaune, bleu, mauve ou cyan. Il vous faut découvrir la couleur et la position de chacun des quatre pions. À chaque coup, vous proposez une combinaison. L’'ORIC vous répond en plaçant sur l’écran une petite marque noire pour chaque pion de la bonne couleur à la bonne place. Puis l’ORIC ajoute une petite marque blanche pour chaque pion de la bonne couleur qui n’est pas à la bonne place. A l’aide de ces indications, il faut trouver la combinaison cachée en le moins de coups possible.

A chaque coup, les touches flèche à gauche et flèche à droite” vous permettent de déplacer le curseur, qui a quatre positions possibles, celles des pions. Les touches R, V, J, B, M et C font apparaître un pion à l'emplacement du curseur. Lorsque vous avez placé dans la grille vos quatre pions, frappez RETURN. Si vous abandonnez, frappez ESC.

Voici quelques précisions sur la structure du programme. Des lignes 39 à 49, on trouve les initialisations nécessaires au jeu.

De 49 à 99, on définit les deux caractères représentant le pion et la marque.

De 139 à 149, on définit le grand rectangle noir qui servira de grille de jeu.

De 169 à 199, on trace le petit rectangle sur lequel le mot master mind” est inscrit.

De 219 à 239, on définit les différentes couleurs.

De 259 à 319, on trace un rectangle noir dans lequel on affiche les couleurs possibles.

339 L est le numéro de la ligne se trouve le curseur.

359. NC est le nombre de coups joués.

50

De 379 à 490, on remplit le tableau S avec quatre nombres compris entre 1 et 6, qui représentent la combinaison à trouver. Ces nombres sont les couleurs des pions.

Le jeu lui-même est constitué des lignes 599 à 1919.

529 On déplace de 16 positions vers la droite le curseur pour le placer sur la première colonne de la grille de jeu.

Les lignes 5% à 619 lisent une touche T$ et effectuent le branche- ment adéquat.

574 Si on a frappé ESC, on abandonne, on va en 1170.

580 Si on a frappé RETURN, il faut analyser la combinaison proposée, ce que l'on va faire en 700.

594 Si l'on a frappé ‘flèche à gauche’ ‘flèche à droite”, on va en 63Q pour déplacer le curseur.

699 Si l'on a frappé R, V, J, B, M ou C, on va placer un pion en 676.

619 Sinon, on ne fait rien de particulier ou on recommence la lecture.

De 639 à 654, on déplace le curseur, à condition de ne pas sortir de la grille. On affiche deux fois T$ en 659: ainsi le curseur se déplace de deux crans.

De 679 à 689, on affiche un pion à l’endroit désigné par le curseur. La couleur du pion est I.

De 7% à 999, on analyse la proposition. On compte d’abord le nombre N de marques noires, puis ensuite le nombre B de marques blanches.

De 929 à 989, on affiche la réponse de l’ORIC. Si on a quatre marques noires, la combinaison a été découverte et l’on va en 1199.

Si vous n’avez pas trouvé la combinaison et que la grille est pleine, ce n’est pas très brillant et on exécute le bloc 1939-1999.

Si vous avez trouvé, on va en 111, on affiche en double hauteur le mot BRAVO”.

Puis, si vous avez trouvé, ou si vous avez frappé ESC, les lignes 1179 à 1229 découvrent la combinaison cachée.

51

52

Couleurs possibles

10 20 F0 40 0) ét 70 80 90 100 110 120 150 140 150 160 170 180 190

200

REM MASTER MIND x % 4 4H HN KOKOKOK NOK KNOKKK REM INITIALISATIONS--- Pal: ReP+l FOR I=HR4OO+6XF TO HARA4OO+BXKR+7 READ V:POHE I, V NEXT I DATA 0,28,67,67,62,62,28,0 DATA 0,0,12,350,20,12,0,0 IN=O: PA? INF IN: FAFER FA:CLS FOR Isi TO 22: FLOT25,1I, 16+PFA:NEXT FOR I=i TO 22:FLOT 14,1,16:NEXT FOR Iz24 TO25:FLOTES, 1, 16+FA:NEXT FOR I=24 TO25:FLOTI4,I,17+IN:NEXT FLOT 17,24, "Master" Le PE OS RCE EE A Va

210 220

230

240 Ea0 260 270 240 290 300 310 520

ET

340 350 560 370 380 390 400 00 510 520 si 540 550 560 710) 580 590 600 610 620 8E0 640 850 660 670 680 690 700,

DIM C#(é)s:CSC1)et Rs CS (CE) =N y

CH Ces CS (4) = Rs CS CE) "M" C$(é)æ"0"

FÉOTÉ2 4 CeuleUurs

FLOT 2,2, "possibles"

FOR Ted TO 11: FLOT9,1, 16+PFA:NEXT FOR Ie4 TO 11: FLOT 4,17, lés NEXT FOR I TO 10

PLOT S,1,1-4:PFLOT 6,1,C#(I-4) NEXT

PRINT: PRINT: L=2

NC= 1 DIM S(4),F(4),FS (4)

FOR Iæi TO 4

STI ÆINT CSKRND (1) +1

NEXT TI

REM DERUT DU PROGRAME ee ae ee ve FOR COUP&=1 TO 20

FORI&OTO1Ss FRINTCHRS C9) 3 : NEXT FLOT 4,17,"Votre"

FLOT 1,18, "proposition?"

LEFRE C0) |

GET T$sIF TéeCHRS (27) THEN 1170 IF THECHAS (15) THEN 700

IF OTÉECHRS (9) ORTSECHRS (9) THEN6GEO FOR Izi TO G:IF TéeC$(I) THEN 670 NEXT:GOTO 570

TFFQS (00 EL OANDTSECHRS (9) THEN 570 TFFOS (O0) HASANDT#E=CHRS# (9) THEN 570 FRINT T$aT#s: GOTO 570

BLOTFOS COLE SPA LOTÉOS(0) =? LT GOTQ 570

FLOT 4,17," "

53

54

710 720 7:50 740 740 740 770 780 790 800 810 220 Le: BTE) 840 850 860 470 880 890 900 910 9E0 950 40 950 960 970 9890 990 1000 1010 1080 1050 1940 1050 10460 1070 1080 1090 1160

PLOT 1,18, "Voyons... M:WAIT 120 FOR Izi TQ 4:F(I)=0:FS(I)#O0:NEXT RENM COMRIEN DE NOIRS ©

Nz0

FOR I=zil TO 4

IF S{I)<i: SCRNCILZE+ZXI,L) THEN 790 FiI)=lsFS(I) els: NENt+I

NEXT I

REM COMRIEN DE BLANCS 7?

EH=0Q

FOR Izl TO 4

IF F(l)æl THEN 960

FOR Jx1i TO 4

IF FS(J)=i THEN 890

IF SJ)ESSCRNCIZ+2XI,L) THEN 890 FlT)=1ls:FS(J)=ls BeR+1: GOTO 900 NEXT J

NEXT I

IF Ne THEN 950

1 DEL QC IE

FORI=1TON: FLOT26+I,L,R:NEXT

IF EBzO THEN 9680

PÉQTSR9 TEST

FORI=1TOR: PLOTEQ+I,L,R:NEXT

IF Ne4 THEN 1100

FRINT3:LeL.+1

NEXT CQUF

CLS: FAFER 1:INE 7

FRINT: FRINT: FRINT: FRINT:FRINT FREINER CSRÉCIESI A MVOUSZETES" FRINT:FRINT: PRINT CHRS (4)

PRINT SRG 'CL EN):

FRINT CHR$ (27) 3; "NNUL "3: CHRS& (4) END

11,46 1120 1150 1140 1150 1160 1170 1180 1190 1200 1210

1220

CALE,

REM TROUVE-- ne PLOT 3,17,CHR$(10)+"ERAVO !" FLOT 1,18,CHR#(10)+" ERAVO :!" PLOT 12,17,8:PLOT 12,18,8

FING

FLOT 14,24,16:FLOT 25,24,16+PA FLOT 14,25," "

FOR I=1i TO 4

FLOT 13+2%41,24,S(1)

FLOT 14+2%1,24,P

NEXT I

1.14 BEATLES

Ce programme n’est pas un jeu, il a simplement pour but celui de vous distraire avec quelques notes de musique, empruntées aux Beatles. Il peut aussi vous montrer comment programmer vos propres morceaux.

Chaque mesure correspond à quatre lignes de DATA. Les doubles zéros que l’on a placé dans les DATA ne sont pas joués, mais sont des points de repère pour pouvoir jouer les reprises.

Les ordres RESTORE permettent de se replacer au début de la partition, tandis que les lectures ”bidon des lignes 2949, 2060 et 2994 permettent respectivement de sauter 1, 1 et 2 mesures.

En modifiant les ordres PLAY et WAÏT de la ligne 2549, vous pourrez obtenir d’autres sonorités et tempo.

2000 2010 2020 20E:0 2040 20850 2060 2070

REM MUSTQUE X XX OK OK OKOKOKOKOK HONOR NOK KO HOKONK DU=5000:GOSUR 2510

GOSUR 2510

RESTORE : GOSUR 2510

FOR I=1 TO 25:READ E,N:NEXT GOSUR 2510

FOR I=i TO 24:READ E,N:NEXT GOSUR 2510

55

56

2080 2090 2100 2110 2120 2500 2310 en) 5 Lr la)

PE70

PAM ENLE

2540

10)

25 540 FO000 FO01 FO FOOZ HO04 FOOS FO06 F007 5006 500% 5010 3011 FO1Z FOI1Z 014 FOIS 5016 3017 5018 5019 3020

SOLS FO0T4

5075 FO6 3027 F028A

RESTORE: GOSUB 2510 FOR 1=1 TO 49:READ K,N:NEXT GOSUE 2510

WAIT 200:PLAY 0,0,0,0z:END

RENM-- ee ee ee ee ee FOR Ii TO Z:READ EN

IF N=Q THEN RETURN

MUSIC T'ES Ns O:NEXT

FLAY 7,0,1,DU:WAIT 153: G0T0 2510 REN With À Little Help From REM My Friends

DATA 5,5%, 1: £ 4 Gael est DATA Tibaïals 2,8.3,8.%,1,2,.8 DATA 5,8,2,12,2.08,5.9,2,12,2,8 DATA Glen ie ones les ere DATA RS TUE Grues LOTS DATA RSS D 0 Die 010 cb DATADERÉ SE ATOS EN ET bee LOS PS DATA er LOT 2e Sa Ogee LORS DATA Sir es 10 26 tits rs Os es 6 DATA SSP TO EG Tr se NO TE DATA 2

DATA E, DATA %, DATA

Ne hd CS Re 2e ep ie lébacteder tes ds

ef 1

PRET LISTET 1 DATA le ace Route DATA ae ee ERA

on]

DATA HS LP BI Set. 1,2 DATA Son. Le PA De DATA 3,8,7,12,7,8.3,8.2,12,2,8 ii M OO ee ee DA mie 100 Ga iv l0 ee DATA 3,5,2,10,2,6,7,6,2,10,2,6 DATA TE GE NON diet ne DATA 26,2,10, 2,3 4:6: 2, 10,0,

DATA 2,5,2,10,7,6,2%,5,2,10,2,6

3029 FOEO AOF SORT FOGE FO54 FOSSES 506 3057 FO FOE9 3040 3041 5042 SO4S 3044 OS 5046 3047 3048 3049 3050 FO 1 5052

SOS 3054 5055 31056 3057 FOSSES 3059 3060 35061 FO6E HO 3064 3065 31066 3087 3068 506%

DATA DATA DATA DATA DATA

DATA : DATA :

DATA DATA DATA DATA DATA DATA DATA

DATA 2

DATA DATA DATA DATA DATA

DATA :

DATA DATA DATA DATA DATA DATA DATA

DATA 3

DATA

DATA £

DATA DATA

DATA DATA 3

DATA DATA DATA DATA

M ne

SR Ta Da La On 2 Ô Se 2s85 231

1 0 "1 Dress RCE D:

= eo =

uacesvas ÉA &4 19 19 F9

-s = ET eo

cn CO CH CM me Ed LA

LA LA LA La LA LA 4

ERSRSRCRCRCRE

-= E] s

"#

Sas dilué s ous lacs ll 0 Sylnrallu2s6s do tars dl 2,6 Sn Las Os Dnbsds 1,2,10,2,6 las LORS O as le: 110,240 se CR PR PE Sylorn On 20 9 an tanins Las erÉlane Que 0,2 Biol e,1,2,1 ee aa end ia ne Sa et el ae se RE D EE D ee NE Mi nc Dre D Sn oi ec ae Re OR RO als nent ia cn Mas naar BL Pas Solo 2583295 PAL PR © PR ER Gen PES PA

CS A r ag on da a du NE a tiens Vas a

Re OPA De ii en Poe ie OR D Aloe tds r 10 ot lan 10 ee A D mr AAA OR © 3,1.:2,8,2,5.5.1,2,8,2,5 DS 2)S er l,28ee LOTO: 10, 2102210 2,10,2,12,2,12,2,12,2,17 to Laos Se 0,7, St 22,88 2,5 Mo lose do 10 TOO

3,1.2,8,2,5.3,1,2.8,2,5

57

58

5070 3071 5072 5073 5074 FO7S 5076 3077 7078 5079 F080 3081 5087 FORT 3084 3085 5086 5087 3088 5089 5090 FO91 7092 FOQE 5094 2095 F096 3097 F7098 5090 3100 F101 5107 FO 5104 F105

35106

DATA

DATA 35

DATA DATA DATA DATA DATA

DATA

DATA

DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA DATA

DATA

DATA DATA DATA DATA DATA DATA DATA DATA BATA DATA DATA

S1,2:0,2,5:3:1,2,8,2,5 3,1.2.8,2,5,3%,1,2,8,;2,5 DO OS 0 000200010070: 0 A1, 35e ds td tata, 2, HS EAN ad lit set 4,125 354,108: %5 4,1,3.5,%5,4,1.3,5,3,5 NE A EE En PE 7 AR EST TE Re 6 A te LE ES De rt REP DE Dre Dr No as le sud dois

E co

3,5,5%,.1,2,8.2%.5.3. SERRE ETL-PEIETETE EEE Homo tle és oo LS 0 EDR E SAR De SR es DEA Mr RAP MO PL tel, 2 de de LR LOMME NASA 20 ES PROD ET - MS DL SU SA 02 es Sr 10 2 20 RC NN A OR lent

Fe QE DE cr EC LE. AS EE Pie A PE à

PR PESTE RTC TE TR ERTE TETE

bb J

œ

dits sas sa du los os do

A RS GS re AE Te NN PA EE Vo Ed

DOS 7e mere M) RD

fans Bose ses sos ras Sas os la css pds lsest Sans lari ts soda lscs Dada iles os ds das less Samacedde es oasis 10 Solar lo Os lara O2 Dsl: 1026533 1,2:10,2: False 10120658 nln28 10121 6 Salam lo 6 osdlssl0 2e Q, 0

1.15 PENDU

Le but de ce jeu est de deviner un mot, que l’ORIC tire au sort. A chaque coup, vous proposez une lettre. Si cette lettre n’est pas contenue dans le mot, un membre du pendu est ajouté. Vous avez le droit à six erreurs.

Tout d’abord, le programme vous demande le nom de la rubrique d’où il va tirer le mot à chercher. Les trois premières rubriques, MUSI- CIENS, SPORTIFS et HISTOIRE contiennent des noms d’hommes célèbres. La rubrique BOISSONS contient des noms de boissons, géné- ralement alcolisées. La rubrique ACTEURS contient aussi des noms de personnages célèbres. Enfin, STOP permet de sortir du programme.

Si vous ajoutez des noms à une rubrique, n’oubliez pas de modifier en conséquence la ligne 39 ou 35. En effet, S(@) contient le nombre de noms de la première rubrique, S(1) contient le nombre de noms de la seconde rubrique, etc.

Voici quelques explications sur ce programme. Tout d’abord, de la ligne 5 à la ligne 35, quelques initialisations :

15 L$ sera utilisé pour stocker, dans l'ordre alphabétique, les lettres déjà proposées par le joueur. P$ contiendra les caractères qui figurent les membres du pendu, D$ contient la définition du pendu, MOTS contient les lettres du mot découvertes et S contient le nombre de mots de chaque rubrique.

20 On range dans D$ les caractères qui figureront les membres du pendu. 39 à 35 On place dans S le nombre de mots de chaque rubrique.

De 45 à 135, on demande au joueur la rubrique qu’il choisit, on lit sa réponse, et l’on se branche en fonction de sa réponse.

De 149 à 179, l'ORIC tire le mot que vous allez chercher.

169 à 165 On saute tous les mots correspondants aux sujets situés avant le sujet choisi.

179 On lit N mots du sujet choisi. A la sortie de cette boucle, MOTS contient le dernier mot lu.

59

180 185 199 200

220

225 330

335

355

365

399

495

410

415 420

De 175 à 229, on effectue quelques initialisations.

On remplit de blancs le tableau des lettres déjà proposées. On remplit de blancs le tableau des membres du pendu. Idem avec le tableau qui représente le mot sur l'écran.

à 215 Dans le tableau MOTS, on place un tiret à la place de chaque lettre du mot à chercher. Les caractères qui ne sont pas des lettres (blancs, tirets, etc...) sont placés tels quels.

On construit une chaîne d'étoiles égale à la longueur du mot à cher- cher plus 4.

La boucle de jeu est formée par le bloc 225 à 425. à 330 On affiche le jeu.

Si F=1, le jeu est terminé. On lit une touche quelconque et l'on se branche au début pour recommencer.

à 345 On lit un caractère proposé, en vérifiant qu'il s’agit bien d'une lettre.

De 359 à 425, c’est l'ORIC qui travaille.

On vérifie que la lettre L$ n’a pas déjà été proposée. Si c'est le cas, on va en 4265.

à 385 La lettre L$ est insérée dans la liste des lettres déjà proposée, de façon à ce que cette liste soit classée dans l'ordre alphabétique.

à 405 Les lettres du mot égales à la lettre proposée sont placées dans le tableau MOTS. En sortie de cette boucle, OK vaut 1 si la lettre proposée était bien dans le mot.

Si le mot a été trouvé, on positionne F à 1.

Si la lettre proposée était bonne, on efface le message précédent s'il y en avait un.

La lettre proposée n'était pas bonne, on ajoute un membre au pendu. Là, vous êtes très mal!

Les mots sont stockés dans une liste DATA, en 199 pour la

première rubrique, en 29 pour la seconde, en 3% pour la troisième,

etc.

60

* * # # * * : #

ÉHHHHHK

* * *& * * * *

3 REN INITIALISATIONSEIINNISENNNNNNY

10 CLESR

15 DIM L$i25),P$18),D$t4),MOT#(20),S15) 25 D$i0i="0":D$(1)=" 1": D$(2)= "I: D$(3)=" 7" 35 D$i4)="\tiD$t5i2"/":D$té)=" 1"

30 510)=29:5(1}=25:5(2)=25:5(3)=25

35 5(4)=25:6(5)=100

40 REN CHOIX DU SUJET----------------

45 TEXT:CLS:PAPER2: INKO: PRINT: L20:F=û: J=û 39 PRINTSPC (10); *JEU DU PENDU*: PRINT

35 FRINT'Les sujets sont -MUSICIENS"

ëÿ PRINT SPORTIFS"

85 PRINT" -HISTOIRE®

76 PRINT* BOISSONS"

75 FRINT® CAPITALES"

8ÿ PRINT ACTEURS"

85 PRINT" SEXE"

GG FRINT* -STOP*

33 PRINT: PRINT: INPUTVOTRE CHOIX *:CH$ 160 IF CH$="MUSICIENS® THEN CH=0:6010 145

61

62

105 IF CH$="SPORTIFS®" THEN CH=:G0TO 145 iiû IF CHS="HISTOIRE" THEN CH=2:60T0 145 1i3 IF CHS="BOIGSONS* THEN CH=S: GOT 145 120 IF CH$="CAPITALES THEN CH=4:G0TO 15 23 IF CHS="ACTEURS" THEN CH=5: 6070 145 37 IF CHSSSSENE" THER 10090 130 IF CH6=*STOP THEN PRINT'AU REVOIR. ":END 139 PRIAT'RATE DIR GOTO #5 146 REN CHOIX D MOT À TROUVER-----—- 145 N=INTIRNDCSH ES ICH) +] 156 RESTORE 155 IF CH=û THEN 176 186 FOR si TO CH:FOR Jei 70 S(1- loë RESD MOTS: NET GI 155 FOR Tai TO NeREAD MOTS: NET 135 REN PREPARATION GE L'AFFICHAGE-—- 186 FOR Led 70 ZHsLSITI=CHRS SZ): NET 185 FOR Let T0 &B$(Ii=CHRS (ZI: NET 190 FOR Feû T6 SO: MOTS (TI2CHRS (TDi NET :FINSLERCHOTS) si TO FINIVS=NIDS(HOTÉ, 25 SI" THEN MOTHEI-ji=t- 6070 i5

= à 235 PRINT 345 et AU NS (8i;'i ÿ PRINT Hétiditititt à DEJA PROPOSEES à

235 PRINT" CARE LPS CHTT IFR L

260 FRINT® à --—— OCR PE PAIE 1 :

62 PRINT Ste" "lis" iléiéist

265 PRINT® OH 1 OL 4 pigpt(lés"p

270 PRINT" HO D OU OH OH "il#i7);" "iLé(B)s" iLé(9)s" sLé(

gi" 272 PRINILS UD" iL8 (Dig "3LS(T)" 4

275 PRINT # "PSI" & 4';SPO(éijrt"

2RO PRINT" D! M:P#OPSDIsP#iAE" D D M;Léitdhs" "LS (5

ie |

282 FRINTL#(éi;" "iL#(17)5" sLé(i)s" sLé(ies" sLé2O) se à

285 PRINT" OO! "sPéO2ii" Of f"iGPC(Ié)E"h"

290 PRINT" D OL "ip#lShi" "iPétgii" Of À ";Lé{21);" ";Lé(22); 3

292 PRINTLS123);" "ilL#(Zd)s" 5Lé(25i"

295 PRINT" # t H';SPC(lb) "te"

300 PRINT" à ONTITICITIIIITI LIN

305 PRINT" $ Ji t" 310 PRINT* 4 ------ à "ic 315 PRINT" à tr";

320 FOR I=1 TO FIN:PRINT MOT#{I-1H5:NEXT

325 PRINT" à°

330 PRINT" HNHANNNNRNNNR "iCS:IF F=1 THEN GET A$:G0TC 5

335 PRINT:PRINT: PRINTCHR# (14); "Quelle lettre proposez-vous "; 340 GET L$:IFLS<"A"DRLS:"7"THENTAO

345 PRINT L$

350 REM TRAITEMENT

355 FÜR Ieû TO 25:1F L$(1isié$ THEN 425

380 NEÂT:DK=û

365 FOX Isû TD 29:IF LééLéil} THEN 540

370 IF L$(}i=" " THEN 380

373 NEXT

380 FOR 3223 T0 [+1 STEP-LiL#{J}=L$i-L):NEXT

JE5 L#(P)=L8iTR=i

290 FOR I=1 TD FIN:V$=MID# (MOTS, 1,1)

395 IF V$=L$ THEN MOT$(I-1)=L$:0K=1:LeL+#i:G0TO 40

406 TR=È

405 NEXT:IF LeLEN(MOTS} THEN PRINT'ERAVO !°:F=1:G0T0 235

410 IF OK THEN PRINT GPC(21):G0T0 225

415 P$iK}=D${R):K=K+I:IF K&7 THEN PRINT SPCI21;:60T0 225

420 PRINT'Le aot etait ";MOT$:F=1:60T0 2235

425 PRINT “CEJA PROPOSE": 6010 225

1000 DATA BERLIOZ, BACH, BEETHOVEN, BIZET, BRAHMS

1001 DATA CHOPIN, BUXEHUDE ,HUMMEL, MOUSSORGEKY, FACHELHEL

1002 DATA JOSQUIN DES PRES, WAGNER, MENDELSSOHM, SCARLATTI, NOLLEMHAUPT 1003 DATA CZERNY, BRAUNGARDT,RAMEAU, ROSSINT, SCHBERT

1064 DATA SCHUMANN, HEBER, MATART, VIVALDI, OFFENBACH

ZG00 DATA TABARLY,PROST,FLATINI, KILL, BORG

2001 DATA RUSSEL, "CASSIUS CLAY", "MADAME CLAUDES, DARNICHE, “NIKT LAUD

63

64

2902 DATA CAN, PIRONI,LAFFITE, ZITRONE, CHICHESTER 2002 DATA JAZV,MIMOUN, SN*UETIL, BOBET,HINAULT 2004 DATA POLENTIER,HOSER, POULIDOR, COFI,RAAS 3000 DATA "DE GAULLE®, CHARLEMAGNE*, VERCINGETORIK", ATTILA, NAPOLEON 3001 DATA HITLER, WAGHINGTON, CHURCHILL, PASTEUR, FLEMNINE 3002 DATA PETAIN,"HIRO HITO,"PEPIN LE BREF*,CLOVIS 3003 DATABERTHE AU GRAND FIED, “BLANCHE DE CASTILLE",ROOSVELT, KENNED Y,DESCHANEL 3608 DATA*LA FOMPADOUR*, "MUSTAPHA KEMAL*,POMFIDOU, NIKON, BREJNEV 4606 DATA CONTREXEVILLE, ARMAGNAC, WHISKY, VODEA, BEN 4601 DATA FRAMBOISE, GENEPI, CHARTREUSE, SAUTERNES, JULIENAS 4002 DATA*CHATEAU PETRUS", CHAMPAGNE, COGNAC, RIESLINE, GENÜRSTRAMINER 4603 DATA FOIRE, GNOLE, SCHNAFS, PEIKTURE, TRICHLORETYLENE a0û4 DATA BRANDY, MADERE, PREFONTAINES, CIDRE, SAkE a000 DATA PARIS, LONDRES, BONN, ROME MADRID 5001 DATA HASHINGTON, TRIPOLI, RAD, LE CAIRE®,RARAT 2602 DATA TANARARIVE, AOSCOU, ANKARA, PEKIN, BANGKOK 2007 DATA TEHERAN, BAGDAD, MONTREAL, RANBOON, TOKIO 5004 DATA BRASILIA, MEXICO, GECRGETOWN, CANBERRA, BAMAKO 8000 DATA HEPEURN, BOGART, BRANDO, GIRARDOT, MASTROTANNI ä00i DATA CASSEL, DELON, SINATRA, CECCALDE, GALABRU 8002 DATA MEURISSE, FERREOL, NOIRET, MONTANT, BURTON 8603 DATA DARC,WELLS, DENEUVE, BELMONDO, WINDHARK 8604 DATA FIAT, DARRAS, NEMMAN, SELLERS, VANNECK 8905 DATA LOREK, MOREAU, FLYNN, DEFARDIEU, BRYNNER 8006 DATA LOLLOBRIDG1D4, COMSTANTIN, ANDRESS, MARIELLE, KEATON 8607 DATA CHAPLIN, LAUREL, HARDY, JOBERT, BLANCHE 8008 DATé DIFILHO,BLIER, MONRDE,POIRET, BOURVIL 600% DATA FERNANDEL, LEUIS, YANNE, DAUPHIN, DEREK &G15 DATA DUTRONC, MANFREDI ,MAYNE, USTINOV, CURTIS sû1i DATA SERRAULT, BALASKD, DENAERE, BALUTIN, TOGNAZET BUiZ DATA PICCOLI,PACOME, HUPPERT, ASTAIRE, PRESLEY 313 DATA ADAMD, HOLDEN, GABIN, BRIALY, SIGNORET di DATA ADJANT, CARREL, VENTURA, HANIN, SCHNEIDER 6015 DATA LAFONT,GLASER,TRINTIGHANT, TAYLOR, GASSMAN £ÜÏS DATA FONDA, SHARIF, SEBERG, ROCHEFORT, LANVIN 8017 MITCHUM, HESTON, FOGSEY, AUCLAIR, BUINN 8018 DATA JOUVET, BRASSEUR, MARAIS, HORGAN, HOFFHAN 8019 DATA CARNET, HARDOT, NEVILLE,KELLER, CHAKIRIS

16*06 REM COMMENTAIRE FOUR SEXE------

16008 CLS: PRINT: PRINT

8016 PRINTSJE NE JOUE PAS AVEC VOUS” 100i5 FRINT'ESFECE DE SATYRE iii" 10020 PAPER 6:EXPLODE:HAIT 250

10025 FRINT:PRIAT

16030 FRINT'JE REFUSE DE JOUER AVEC" 1635 PRINTUN TEL ORSEDE.*

1040 PAFER

6945 FOR 12! TO 1G:SHOOT:HAITIG: NET 10080 PRINT: PRINT: PRINT

0055 PAPER |

10660 PRINT'FOUR QUI ME PRENEZ-VOUS

16076 FOR I<1 TO 7

10075 ZAP:WAIT IO:EXPLODE: NAIT 5 iüü80 NEXT

I00ES FOR I=iT0

1606G SHOGT:NAÎT 8

10095 NEXT:PRINTCHRS (6)

65

2

Quelques

renseignements utiles pour programmer vos jeux

2.1 GESTION DE LA MÉMOIRE DE L'ORIC-1

Lorsque l’on programme en basic, on n’a pas à se préoccuper de la façon dont la mémoire est gérée, utilisée. Par contre, dès que l’on intro- duit quelques instructions de langage machine, ou même plus simple- ment, dès que l’on utilise PEEK, DEEK, POKE ou DOKE, il faut malheureusement entrer dans ces détails sordides que sont une gestion mémoire.

Tout d’abord, voici la carte mémoire de l’ORIC:

66

en mode HIRES en mode TEXT

FFFF-65535 FFFF-65535 C099-49152 C00ÿ-49152 D BFE9-49129 BFE9-49129 BB89-48900 A090-40969 B800-47104 9C00-39936 B490-46080 98099-38912 9F04-49704 programme Basic programme Basic (début en 4591) (début en #51) 500-1280 590-1289 de 499 à 420: rien 400-1924 400-1924 adresses d'entrées/sorties 300-768 300-768 209-512 209-512 190-256 190-256 page Ÿ utilisée 9-0 9-9

Les adresses sont données en hexadécimal puis en décimal.

67

a) La page zéro. #0 à #FF

Par construction du microprocesseur 6592, qui équipe votre ORIC, les octets d’adresse @ à 255 peuvent être lus ou écrits plus rapidement que les autres. Dans un souci d’efficacité, il est conseillé de placer dans cette zone les quantités auxquelles le microprocesseur accède le plus souvent. Le Basic utilise la plupart de ces octets. Si vous écrivez un sous- programme en langage machine utilisé depuis un programme Basic, il est conseillé d'employer les octets inutilisés par le Basic. C’est le cas de la zone d’adresse Ÿ à 11 (49 à #B).

b) La pile du microprocesseur. #10 à #1FF

A chaque fois qu’une instruction JSR, PHA ou PHP est exécutée par le 6502, l’adresse de retour ou l’accumulateur ou le registre d’état est empilé dans cette zone. Il est très fortement déconseillé d’écrire dans cette zone, sauf si vous aimez vivre dangereusement.

c) Zone de travail du Basic. #200 à #2FF

Le Basic a besoin de mémoire pour travailler. Il utilise la page zéro, la zone #2090 à #2FF et la zone #421 à 4FF.

d) Les adresses d’entrées/sorties. #30 à #3FF

Il n’y a pas de mémoire à ces adresses, mais tous les dispositifs externes à l’ensemble microprocesseur-mémoire. On y trouve entre autres le clavier, le magnétophone, le synthétiseur, etc...

e) Zone de travail du Basic. #421 à #4FF

Il est à noter que la zone #49-#420 est inutilisée. Vous pouvez l’employer pour y placer des sous-programmes en langage machine.

f) La zone programme Basic. #50 à #97FF

On y trouve d’une part le programme Basic lui-même, d’autre part les variables. Plus précisément, on a dans cette zone, l’organisation suivante :

68

adresses hautes «— A6-A7 HIMEM

Chaînes «— A2-A3

Zone vide «— Aÿ-A1

Tableaux «— 9E-9F

Variables simples

«— 9C-9D

Programme Basic

adresses basses «— 9A-9B, normalement 591

En partant des adresses basses, on trouve d’abord le programme Basic lui-même. L’adresse-mémoire du début du programme est rangée en 9A-9B, elle vaut normalement 591. En tapant PRINT HEXS$(DEEK(#9A)) vous obtenez cette valeur.

Ensuite on trouve mélangées les variables entières, les variables réelles et les noms des variables chaînes. L’adresse-mémoire du début de cette zone est rangée en 9C-9D, on peut la lire en exécutant PRINT HEXS(DEEK(#9C)).

Comme les zones programme et variables simples sont contiguës, on peut considérer que cette adresse est aussi celle de la fin du programme.

Chaque variable simple occupe sept octets de mémoire. Les variables sont placées en mémoire au fur et à mesure qu’elles sont rencontrées, tous types mélangés.

* Variable réelle: nombre flottant à 5 octets

EXP M

69

P1 et P2 sont les deux premiers caractères du nom de la variable, en code ASCII positif (P1<128 et P2<128). Si le nom n’a qu’une lettre, P2 vaut (.

Le troisième octet contient l’exposant plus 128, les quatre derniers octets constituent la mantisse, qui est comprise entre 1 et 1/2. Le nombre stocké vaut M.2(EXP—128),

* Variable entière: nombre à deux octets en complément à 2

N1 et N2 sont les deux premiers caractères du nom de la variable, en code ASCII négatif (N1>128 et N2>128).

* Variable chaîne: chaîne de @ à 255 caractères

CALE Leone Lu Lu]

Le premier caractère du nom de la variable est stocké en code ASCII positif, tandis que le second est stocké en code ASCII négatif (P1<128 et N2>128). Le troisième octet contient la longueur de la chaîne, Ÿ si elle est vide. Puis l’on trouve, sur deux octets, l’adresse- mémoire de la chaîne. On a d’abord l’octet de poids faible, puis l’octet de poids fort de cette adresse.

La chaîne elle-même peut se trouver soit dans la zone de stockage des chaînes, en haut de la mémoire, soit tout simplement à l’intérieur du programme Basic.

Exemples : Si l’on a:

199 A$-B$+C$

Lorsque cette ligne sera exécutée, la chaîne correspondant à A$ sera stockée en haut de la mémoire. Par contre, si l’on a:

299 A$=-"123456789

la chaîne correspondant à A$ est la suite de caractères 123456789, elle existe à l’intérieur du programme, il est inutile d’aller la recopier en haut de la mémoire.

Après les variables simples, on trouve les tableaux. L’adresse de début de cette zone est stockée en 9E-9F. Pour la lire, exécutez PRINT HEXS$(DEEK(#9E)). On peut aussi considérer que cette adresse est celle de la fin des variables simples, car les zones correspondant aux variables simples et aux tableaux sont contiguës.

* Tableau réel

p1 P2 Valeur max +1 du dernier indice Valeur max +1 de l'avant-dernier indice Valeur max +1 du premier indice 1" élément , élément

dernier élément

On trouve d’abord les deux premiers caractères du nom du tableau P1 et P2, en code ASCII positif. Ensuite on trouve sur deux octets, la taille du tableau, c’est-à-dire le nombre total d’octets utilisés pour stoc- ker le tableau. On trouve d’abord l’octet de poids faible, puis l’octet de poids fort de ce nombre. Sur un octet, on trouve ensuite le nombre de dimensions, c’est-à-dire le nombre d’indices du tableau. On trouve

Taille du tableau nb. dimensions

71

ensuite pour chaque indice, en partant du dernier jusqu’au premier, la valeur maximale plus un de l’indice. Chacun de ces nombres est codé sur deux octets, l’octet de poids fort étant le premier. Les éléments du tableau, les réels eux-mêmes sont ensuite rangés en faisant d’abord varier l’indice le plus à gauche.

Exemple :

DIM AB(1,2)

définit un tableau à six éléments et deux dimensions, qui est stocké sous la forme:

Tous ces nombres sont donnés en hexadécimal.

41 et 42 sont les codes ASCII des lettres A et B (65 et 66 en base 19).

9927 est la taille du tableau (39 en base 19).

(3 est la valeur maximale plus un du deuxième indice.

(992 est la valeur maximale plus un du premier indice.

72

* Tableau entier

La structure est analogue à celle d’un tableau réel, sauf qu’un élément occupe deux octets seulement contre 5 pour un réel.

N1 N2 Taille du tableau

Valeur max +1 du dernier indice

Les deux premiers caractères du nom du

tableau N1 et N2 sont en code ASCII négatif.

Valeur max +1 de l'avant dernier indice Pour chaque élément, on stocke l'octet de poids

É ! fort, puis celui de poids faible. !

Valeur max +1 du premier indice

1°" élément

1 ' ! 1 ! û

dernier élément

* Tableau chaîne

La structure est aussi analogue à celle d’un tableau réel sauf qu’un

élément occupe trois octets seulement. Taille du tableau

Le premier caractère du nom du tableau, P1, est stocké en code ASCII positif, tandis que le second est en code ASCII négatif.

Valeur max +1 du dernier indice

Valeur max +1 de l'avant dernier indice Pour chaque chaîne on stocke sa longueur, l'octet de poids faible puis l'octet de poids fort de

Vo mar To l'adresse de la chaîne. premier indice 1°" élément

dernier élément | 73

L'adresse de la fin de la zone des tableaux est stockée en AŸ-A1. En exécutant PRINT HEXS$(DEEK(ÆA)), on peut lire cette adresse en hexadécimal.

Les chaînes sont-elles stockées en partant de HIMEM, qui est en A6-A7, puis en descendant. A2-A3 contient l’adresse de l’autre extré- mité de cette zone.

Entre la zone des tableaux et celle des chaines, on a une zone vide, inoccupée. Au fur et à mesure qu’un programme s’exécute, des variables, des tableaux et des chaînes sont créés, et cette zone vide rétré- cit par les deux bouts.

Si donc vous désirez utiliser de la mémoire, soit pour y placer des sous-programmes assembleurs ou des données structurées par vous- même, sans risquer de détruire le Basic ou d’être détruit par lui, vous avec plusieurs possibilités.

* Utiliser la zone 499 à 420.

* Si cela ne suffit pas on peut, avant que le programme Basic ne crée une chaîne, exécuter une instruction HIMEM qui abaisse le contenu de A6- A7. Les octets situés au-dessus de ce plafond sont alors disponibles.

* On peut aussi, avant que le programme n’ait créé une variable ou un tableau, exécuter un ordre DOKE en 9C pour augmenter l’adresse qui y est contenue, puis utiliser les octets situés entre la fin du programme Basic et cette nouvelle adresse. Ceci a un avantage: comme l’ordre CSAVE recopie sur cassette la zone dont l’adresse de début est en 9A- 9B, dont l’adresse de fin est en 9C-9D, un seul ordre CSAVE permet de sauvegarder en même temps le programme Basic, et par exemple, des sous-programmes machine placés à sa suite. Mais attention, la médaille a un revers: Il devient impossible de modifier le programme Basic. En effet, lorsque vous modifiez un programme, vous lui ajoutez ou vous lui retirez des caractères. Aussi, l’'ORIC se doit de déplacer dans la mémoire une partie du programme Basic, depuis l’endroit s’est produite la modification, jusqu’à sa fin. Or, il se trouve que chaque ligne de programme Basic en mémoire contient l’adresse de la ligne suivante. Dans tout le bloc qui a été déplacé, l’ORIC doit recalculer ces adresses. Et en faisant cela, il se plante lorsque 9C-9D ne contient pas véritable- ment l’adresse de fin du programme Basic.

74

g) La zone de stockage des caractères

Pour chacun des deux jeux de caractères de l’'ORIC, une zone de 1 Koctet est réservée, ces deux zones sont contiguës. Deux choses sont à remarquer :

Les caractères ne sont pas situés au même endroit en mode TEXT et en mode HIRES, à chaque fois que vous passez d’un mode à l’autre, l'ORIC les déplace. Aussi, il faut prendre garde à ceci lorsque l’on redéfinit un caractère :

La définition du caractère normal de code ASCII A” débute à l’adresse 46980+8*xA en mode TEXT (ou LORES), tandis qu’elle se trouve en 38912+8*A en mode HIRES.

Chaque définition de caractère occupe 8 octets. Comme un code ASCII est compris entre @ et 127, on a donc à priori 128x8—1924=—1 Koctet occupé par chacun des jeux de caractères. Mais en réalité, il n’y a pas de caractères correspondant aux codes Q à 31. Les 32x8—256 premiers octets des deux zones sont donc inutilisés.

h) La zone écran

Elle est, bien entendu, plus grande en mode HIRES qu’en mode TEXT. En mode texte, on a 28 lignes de 40 caractères, comme un carac- tère occupe un octet mémoire, l’écran en mode TEXT utilise 28x49=—1129 octets, des adresses 4890 à 49119. II est à noter que la première ligne de l’écran, celle est située le mot CAPS correspond aux octets d'adresses 480 à 48039, et peut-être accédée grâce à PEEK, DEEK, POKE et DOKE.

En mode HIRES, on a 249 lignes de 249 points plus trois lignes de texte de 49 caractères. Comme chaque octet correspond à six points, une ligne HIRES utilise 249/6—49 octets.

L'écran HIRES utilise donc en tout (2%9+3)x49—8129 octets, qui sont situés aux adresses 49969 à 49979.

i) La ROM #C000 à #FFFF

On y trouve l’interpréteur Basic, appelé aussi plus simplement le Basic. Il est impossible d’écrire dans cette mémoire qui, par construc-

75

tion, ne peut être que lue. Par construction du microprocesseur 6592, on trouve en FFFE, FFEC et FFFA les adresses il se branche en cas de irq (interrupt request), de reset et de nmi (non masquable interrupt) respectivement. Ainsi, CALL DEEK(#FFFA) produit le même effet que lorsque l’on enfonce la touche ”’reset” et CALL DEEK(ZFFFC) produit le même effet que lorsque l’on branche l’ORIC.

2.2 COMMENT REDÉFINIR LES CARACTÈRES

Chaque caractère, normal ou semi-graphique, est formé dans une matrice de 6 colonnes x 8 lignes.

20 34 34 62 34 34

Chaque caractère est codé par 8 octets contigus en mémoire, il y a un octet par ligne de la matrice. Le caractère A” ci-dessus est codé par les 8 octets suivants:

32168421

O+ 9+8+0+0+0= 8 0+16+9+4+9+9—-29 32+ @+9+9+2+0—-34 32+ 9+9+0+2+49—34 32+16+8+4+2+9-62 32+ @+9+9+2+9-34 32+ 9+9+0+2+9—34 O+ D+0+0+0+0= 9

76

c’est-à-dire qu’à chaque point du caractère correspond un 1”. Les deux bits de gauche de chaque octet sont inutilisés et valent 4.

Les paquets de huit octets correspondant aux caractères sont rangés dans la mémoire en suivant l’ordre des codes ASCII des carac- tères. Par exemple, la zone de stockage des caractères standards débute en 46989 en mode TEXT. Le premier des huit octets codant la lettre A”, dont le code ASCII est 65, est à l’adresse 46089+8+65—466090. On trouve donc:

8 en 46699 20 en 46691 34 en 46692 34 en 46693 62 en 46694 34 en 46695 34 en 46606

O0 en 46697

Le premier des huit octets codant la lettre B”, de code ASCII 66, se trouve lui à l’adresse 46080+8+66—46608.

Le programme:

19 INPUT ”’Donner un caractère’; CAR$ 29 TEXT :S—46980+8+ASC(CAR$)

39 FOR I=S TO S+7

49 PRINT I,PEEK(I)

59 NEXT I

vous permet d’afficher les octets définissant un caractère standard.

Le programme:

19 S—46989+8+ASC('’A"') :TEXT 29 FOR I=S TO S+7

39 POKE 1+8,PEEK(1)

4ÿ NEXT I

recopie la définition du caractère A” dans celle de ”B”. Après avoir exécuté ce programme, un À apparaîtra sur l’écran lorsque vous frap- perez la touche B”’, car le caractère de code ASCII 66 a maintenant la forme du A” au lieu du ”B”.

77

Comme exemple, nous allons transformer le caractère @ en nr.

00000010

32-116:8:472 1

O+ O+9+9+2+9=— 2 32+16+8+4+0+0-60 0+16+9+4+9+9-209 0+16+9+4+9+9-209 0+16+9+4+9+0-20 0+16+0+4+9+9—-209 0+16+0+4+9+9-209 O+ D+0+0+0+0— @

En exécutant le programme:

19 TEXT :S—46989+ASC(' @ ‘’)*x8 24 FOR I=S TO S+7:READ V':POKE I,V:NEXT 39 DATA 2,69,20,20,20,20,20,0

LE] LE

on redéfinit @. Chaque fois que vous frapperez la touche @ ”, un ”r est affiché.

Le petit insecte du jeu GLOUTON est un caractère redéfini:

32168421

32+ 0+0+9+9+1=-33 0+16+0+9+2+9—-18 O+ 9+8+4+9+9—12 O+ 0+8+4+9+9—12 O+ 9+8+4+0+9=—12 O+ 9+8+4+9+0=12 0+16+9+9+2+0=18 32+0+0+0+0+0+1=33

19 TEXT :S—46989+ASC(" @ ‘’)X8 28 FOR I=S TO S+7:READ V:POKE I,V :NEXT 39 DATA 33,18,12,12,12,12,18,33

redéfinit le @ en glouton.

78

On peut, exactement de la même façon, redéfinir les caractères semi-graphiques. En mode TEXT, ces caractères sont stockés à partir de l'adresse 47194, le premier octet d’un caractère semi-graphique de code ASCII a se trouve à l’adresse 47194+8%a.

Si vous désirez redéfinir un caractère tout en étant en mode HIRES, il faut utiliser l’adresse 38912 au lieu de 46980 pour les carac- tères standards, et 39936 au lieu de 47194 pour les caractères semi- graphiques. En effet, l'ORIC déplace dans sa mémoire les définitions des deux jeux de caractère à chaque fois que l’on passe d’un mode graphique à l’autre (TEXT et HIRES).

Pour retrouver le jeu de caractères normal, vous pouvez enfoncer la touche reset, ou exécuter CALL DEEK(#FFFA), qui a la même action

que reset. Vous pouvez aussi exécuter CALL #F89B qui a le seul effet de recharger les caractères initiaux.

Pour terminer, voici un programme qui vous permettra de redéfinir n'importe quel caractère.

10 REM KEDEFINITION DES CARACTERESXXX 200:

30 TEXT: CLS: FAPFER ZsINE O: PRINT: PRINT 46 PKRINT'Donnez le code ASCII "s SONPRINTMCRD=1 27):

60 INFUT CQD%X

70 IF CODXESE OR CODX+1#7 THEN 40

80 FRINT'Quel jeu "3

90 PRINT" (Os:normal,i:graphique) ": 100 INFUT JEUX

110 IF JEUXEO OK JEUX+1 THEN 80 120 ADe46080+1024XIEUX+8XCODX 130%

LAON REMMODE DYEMRLOIS=S SSSR 150 CLSsFRINT

160 FRINT'Dessinez le caractere ":

179 FRINT'dans La grille’

180 PFRINT:FRINT'"'Four marquer un pointes" 190 FRINT'"'-On deplace le curseur"

200 FRINT'" avec les fleches”

210 FRINT'-On frappe X"

79

80

220 230 240 230 260 270 280 290 500 310 #20

350

40 ES 360 570 580 390 400 410 420 #30 440 450 460 470 480 490 500 310 20 HEO 40 He) 60 20 360 7€ 600 610 620

FRINT

FRINT'Four effacer un point:" FRINT'"'-On amene 1e curseur" PRINT" sur le point"

FRINT'-On frappe la barre"

FRINT

FRINT'Lorsque le dessin est fini’ PRINT'frappez la touche ESC"

RÉMADESS INR AMGRILÉESSSSSRSSSSSS FOR C=15 TO 22:PFLOT C, 16, '"K":NEXT FOR L=17 TO 24:PFLOT 15,L, "x"

FLOT 224 LS EAU NEXT.

FOR C=isS TO 22:PLOT C,25, "X'":NEXT

REM FLACE CURSEUR DANS GRILLE---- FPRINT:FRINT:FOR Izi TO 17

FRINT CHR#&(9):

NEXT:X=i: Ye

REM DESSIN DU CARACTERE -- GET ÀS:IIF AS=CHR#S (27) THEN 540

IF A$="X"ANDX<7THEN XeX+1: GOTOSE0 IF ÀA$=" "ANDXE7THEN X=X+1:GOTOSE0 A=ASC(AHSI:IF À<S OR ÂAr11 THEN 420 IF 4=68 AND X5:1 THEN XeX-1:GOTOS20 IF À=9 AND X<é6 THEN X=X+1:GOTOS20 IF A=IOAND Y£6 THEN Y=Y+1:GOTOSE20 IF ASIIAND Yi THEN YeY-1:GOTOSE0 GQOTO 420

FRINT A$::GOTO 420

REM RANGE CETTE DEFINITION DANS T DIM T(7): PAPER 1

FOR I=0O TO 7

FOR Csié TO Zi

IF SCRN(CS 17+T) 2 ASC C"X") THEN6OO MÉTIETOT42S (21-06)

NEXT

NEXT I: PAPER 2:CLS

450 REM KANGE EN MEMOIRE ORIC---—-—-—-— 840 FRINT:PARINT

650 FOR I=0 TO 7

660 FFE AD+I,T(I) ODAOMPRINTRIFOREMESADET M SMERTE ET")

880 NEXT I

690 PRINT:FRINT'"On obtient:'":

700 FRINT CHK&#(E7) ; CHARS (72+JEUS)

710 FRINT CHK#&(COD%)

720

750 REM ENCORE Po eo von 740 PRINT:FRINT

750 FRINT'Encore (Q/N) M": :GET ÀA$&

760 IF A$="0" THEN KUN

770 IF A$="N" THEN END

780 FING:GOTG 750

2.3 TRUCS ET FICELLES DES MODES TEXT ET LORES

En mode TEXT ou LORES, l'écran est divisé en 28 lignes de 49 caractères chacune. À chacun de ces 49ÿx28—1129 caractères corres- pond un octet bien particulier de la mémoire de l’'ORIC. Par exemple, le premier caractère de la première ligne correspond à l’octet 4809 (#BB380 en hexadécimal). Pour faire apparaître un caractère sur l’écran, l'ORIC place son code ASCII dans l’octet correspondant. Vous pouvez faire de même avec la fonction POKE. Par exemple, pour placer la lettre A”, dont le code ASCII est 65, dans le premier caractère de la pre- mière ligne, exécutez :

POKE 48999,65

Si l’on numérote les lignes de Q à 27, la ligne @ étant la ligne supé- rieure, et les caractères de @ à 39, l’adresse de l’octet correspondant au caractère X de la ligne Y vaut 489+49+Y +X.

De ce qui précède, on peut déduire un premier ”’ truc”, qui permet d'écrire sur la première ligne de l’écran, celle se trouve le mot CAPS.

81

19 A$—'’Et voila le travail! !”’

29 GOSUB 199

39 END

49 :

199 REM ECRITURE A$ SUR LA 1 LIGNE 119 FOR 1-1 TO LEN(AS)

129 POKE 47999+1,ASC(MID$(A$,1,1)) 139 NEXT I

149 RETURN

Comme on l’a dit, à chaque position de l’écran correspond un octet en mémoire, pour faire apparaître un caractère à un endroit déterminé, on place son code ASCII dans l’octet correspondant. Or un code ASCII est un nombre compris entre @ et 127, qui s’exprime sur 7 bits. Comme un octet contient 8 bits, il reste donc a priori un bit inutilisé, le bit de poids fort. En fait, ce bit est utilisé lorsque l’on affiche le caractère en vidéo inverse.

JREGL Ib: 4 3027150)

|| code ASCII Un octet de la zone écran

9: Le caractère est normalement affiché 1: Le caractère est affiché en vidéo inverse

Pour faire passer à 1” le bit de poids fort, il suffit d’ajouter 14000 (binaire) au code ASCII, ce qui vaut encore 128 en base dix ou 89 en hexadécimal.

Ceci va nous permettre d’écrire en vidéo inverse, tout d’abord en reprenant le petit programme précédent :

19 A$—'’Et voila le travail”

29 GOSUB 199

39 END

49 :

199 REM ECRITURE A$ SUR LA 1 LIGNE 119 FOR 1-1 TO LEN(A$)

129 POKE 47999+1,ASC(MID$(A$,1,1))+128 139 NEXT |

149 RETURN

82

On a simplement ajouté +128 à la ligne 124.

On peut aussi utiliser la fonction PLOT pour écrire en vidéo inverse, comme dans l’exemple suivant :

19 TEXT:CLS

29 X-9:Y=-19:A$—""Ceci est un message” 39 GOSUB 199

49 X=-14:Y=-13:A$—"'ecrit en”

59 GOSUB 199

69 X=12:Y=-16 :A$="" video inverse”

79 GOSUB 199

WAIT 5ÿ:GOTO 1ÿ

9ÿ :

199 REM PLOT EN VIDEO INVERSE

119 MUSIC 1,4,1,9

129 FOR 1-1 TO LEN(A$)

139 PLOT X+1+1,Y,ASC(MIDS$(A$, 1, 1))+128 149 PLAY 1,9,9,25 :WAIT 15

159 NEXT I

169 PING :WAIT 5ÿ

179 RETURN

L'affichage se fait à la ligne 139. MIDS$(A$, I, 1) donne le caractère I de la chaîne A$. ASC(MIDS$(AS$, I, 1)) donne le code ASCII de ce caractère, auquel on ajoute 128 pour obtenir un effet de vidéo inverse.

Les codes ASCII Ÿ à 31 ont un rôle un peu particulier. Lorsqu’on les place dans un octet de la zone écran, aucun caractère n’apparaît. En revanche, la ligne ils se trouvent change d’aspect, à partir de l’endroit ils se trouvent. Ils permettent de choisir la couleur de l’encre, de l’écran, de sélectionner le jeu de caractère, la taille des caractères et de faire clignoter des caractères. Comme ils modifient l’aspect d’une ligne ils se trouvent, on les appelle parfois attributs”. L’annexe 3.2 donne la liste de ces caractères.

Par exemple, 18 donne à l’écran la couleur verte. Tapez POKE 48029, 18.

L’octet 48020 correspond au milieu de la première ligne de l’écran qui maintenant est verte. Si vous tapez maintenant:

POKE 48929,17 . on obtient du rouge. Tapez: POKE 48929,12 et le mot CAPS se met à clignoter.

83

Ces codes peuvent aussi être employés avec PLOT, comme le montre l’exemple suivant :

19 TEXT :PAPER SZ:INK 1:CLS

28 PLOT 11,1,CHR$(14)+’’ DEMONSTRATION ’’ 7 PLOT 11,2,CHR$(14)+' DEMONSTRATION 4ÿ :

59 PLOT 15,12,CHR$(1)+'’ ROUGE”

69 PLOT 15,13, CHR$(2)+'’ VERT’

79 PLOT 15,14,CHR$(3)+'’JAUNE”’

89 PLOT 15,15(,CHR$(4)+'’ BLEU ”’

98 PLOT 15,16,CHR$(5)+'’ MAUVE" 199 PLOT 15,17 ,CHRS$(6)+'’ CYAN Le PLOT 15,18,CHR$(7)+'’ BLANC’ 129 : 139 FOR 1-1 TO 7 :WAIT 289 :PING

149 FOR J-11 TO 19 159 PLOT 14,],1+16 :PLOT 23,]J,16 169 NEXT } 179 NEXT I

Le code 14 donne des lettres clignotantes double hauteur, les codes 1 à 7 fixent la couleur de l’encre. A la ligne 150, 1+16 varie de 17 à 23 et fixe la couleur de l’écran.

Pour afficher ces codes @ à 31 avec un ordre PRINT, il faut exécuter PRINT CHR$(27); CHRS$(code+64), voir l’annexe 3.2.

En effet, si vous exécutez PRINT CHRS(code) et que le code est compris entre Ÿ et 31, l'ORIC n’affiche pas ce code. A la place, il exécute un sous-programme de sa mémoire ROM. Par exemple, si vous exécutez PRINT CHRS$(12), l'ORIC ne placera pas ce code dans la mémoire- écran, ne l’affichera pas, mais exécutera un sous-programme qui efface l'écran, en remplissant la mémoire-écran de codes 32 (blanc). L’effet de PRINT CHRS(code) pour les valeurs @ à 31 est décrit au début de l’annexe 3.1.

Voici un petit programme démontrant quelques-unes des possibili- tés de ces codes avec PRINT, que l’on appelle caractères de contrôle, car ils permettent en majorité de contrôler le curseur.

il PRINT CHR$(12) :REM EFFACE ECRAN 29 : 39 PRINT SPC(14);'' COUCOU"

49 FOR 1-1 TO 26 59 PRINT CHR$(11); :REM VERS LE HAUT

84

69 WAIT 2ÿ

74 NEXT |

84 :

99 FOR 1-1 TO 59 198 PRINT CHR$(1) : :REM VERS LE BAS 114 WAIT 29

124 NEXT

134 :

149 PRINT CHR$(39) ; :REM RETOUR

154 :

169 FOR 1-26 TO 2 STEP -2

179 FOR J-1 TO I':PRINT CHR$(9); :NEXT 189 FOR J-1 TO I :PRINT CHR$(19) ; :NEXT 199 FOR J-1 TO 1-1:PRINT CHR$(8); :NEXT 299 FOR J-1 TO 1-1:PRINT CHR$(11); :NEXT 219 NEXT

228 :

239 GOTO 14ÿ

Les codes 8, 9, 19 et 11 sont les codes ASCII des touches flèches à gauche, à droite, en bas et en haut. On peut grâce à eux déplacer le curseur, à condition de ne pas oublier le ;” à la fin de l’ordre PRINT. Ce ”;” empêche PRINT d’envoyer le curseur au début de la ligne

suivante.

Pour terminer, voici quelques adresses qui vous assureront la maîtrise totale de l’écran de l’ORIC.

18ou #12 : |

19ou #13 : adresse-mémoire de l'octet se trouve le curseur. 616ou#268 : numéro de la ligne est le curseur (Q à 27). 617 ou#269 : marge gauche pour l'ordre PRINT suivant (9 à 39). 618 ou #26A : bascules CTRL-D, CTRL-], CTRL-[, CTRL-F, CTRL-S et

CTRL-Q

619 ou #26B : code pour PAPER (16 à 23). 629 ou #26C : code pour INK (9 à 7). 621ou#26D : adresse du début de l'écran (#BB80 en TEXT et 4#BF49 622 ou#26E : enHIRES. 623 ou#26F : nombre de lignes de l'écran (27 en TEXT, 3 en HIRES).

Ces adresses sont à séparer en quatre groupes :

Celles qui servent au curseur: 18, 19, 616 et 617.

85

Le curseur est en réalité un caractère qui est affiché normalement, puis en vidéo inverse, puis normalement, à nouveau en vidéo inverse, etc. L’adresse-mémoire de l’octet correspondant à ce caractère est stockée en 18-19.

En 616 est stocké le numéro de la ligne courante, sera affichée le prochain caractère. Normalement, ceci correspond à la ligne se trouve le curseur. En 617 est stockée la marge gauche pour PRINT: avant d’exécuter tout ordre PRINT, l’ORIC ajoute ce nombre à l’adresse du curseur.

Cette adresse peut servir à remplacer la fonction TAB. Tapez:

POKE 617,19:PRINT ‘COUCOU

Nous allons maintenant utiliser les adresses 18, 19 et 616 pour simuler une instruction PRINT X, Y, A$. Cette instruction a le même effet que PLOT X, Y, A$, mais déplace le curseur, ce que PLOT ne fait pas. Considérons le programme suivant:

10 PRINT CHK$ (30) 3: INPUT'X,Y "sx. Y

20 INFUT'CHAINE ":A4#

30 GOSUR 100

40 GET A$:IF A#::"A" THEN 10

30 END

(+10

100 REM PRINT AT XV Ah 110 ACUR=DEEF (18)

115 DOFE #400,#607€: CALL #400

120 CARSFEER CACUR)

130 IF CARSY127 THEN FOFE ACUR,CAR-158 140 ACUR&DEER (621) +YXx404+X

1890 FOFE 616, Y

160 DOFE 18, ACUR

165 DOFE #400,#H#6058:CALL #400

170 FRINT 4%

190 RETURN

Nous allons expliquer le fonctionnement du sous-programme 14. Comme on l’a dit, le curseur est en fait un caractère que l’ORIC fait passer en vidéo inverse, en vidéo normale, en vidéo inverse, etc... Comme ce sous-programme va déplacer le curseur, pour le mettre à la position

86

X, YŸ, la première chose à faire est d’effacer le curseur de l’endroit il se trouve, ce qui est fait par les lignes 119 à 134.

119 On place dans ACUR l'adresse-mémoire de l'octet sur lequel se trouve le curseur.

115 Nous laissons de côté cette ligne pour l'instant. 129 On place dans CAR la valeur de l'octet sur lequel est le curseur.

139 Si CAR est supérieur à 127, il est affiché en vidéo inverse et on le fait passer en vidéo normale.

De 149 à 169, on place le curseur en X, Y.

149 DEEK(621) est l'adresse du début de l'écran. Comme une ligne comporte 4@ caractères, ACUR contient maintenant l'adresse du nouvel octet sur lequel on désire placer le curseur.

159 On place en 616 le numéro Y de la ligne. 169 On place en 18 la nouvelle adresse du curseur.

179 On imprime la chaîne Af.

Nous allons maintenant nous pencher sur les lignes 115 et 165. Pour faire clignoter le curseur, l'ORIC agit ainsi: A l’intérieur de l'ORIC se trouve une sorte de réveil-matin, appelé TIMER, qui sonne toutes les demi-secondes environ. À chaque fois que le réveil sonne, l'ORIC laisse tomber purement et simplement ce qu’il était en train de faire, exécuter votre programme Basic ou attendre que vous frappiez quelque chose, pour se précipiter en 18-19. Il lit l’adresse qui se trouve en 18-19, et va à cette adresse. Là, il trouve l’octet sur lequel est le curseur. Si cet octet est supérieur à 128, il donne un caractère en vidéo inverse, alors l’ORIC retranche 128 à cet octet pour obtenir le même caractère, mais en vidéo normale. Au contraire, si l’octet est inférieur à 128, l'ORIC lui ajoute 128 pour obtenir l’effet de vidéo inverse. Ceci fait, lORIC retourne au travail qu’il avait abandonné. Et cela recommence toutes les demi-secondes, l’ORIC fait passer en vidéo inverse, puis normale, puis inverse, etc. l’octet dont l’adresse est stockée en 18-19.

Maintenant, supposons que le réveil sonne pendant que l’'ORIC exécute la ligne 149 ou 154. A la ligne 139, on avait veillé à faire passer le caractère sur lequel est le curseur en vidéo normale. Puis, par exemple,

87

vers le milieu de la ligne 149, le réveil retentit. Aussitôt, l’'ORIC laisse tomber mon programme et va faire passer en vidéo inverse ce caractère, dont l’adresse est en 18-19. Puis il revient à mon programme, qui à la ligne 169 modifie le contenu de 18-19. Lors de la prochaine sonnerie, PORIC ira donc modifier l’octet dont l’adresse est la nouvelle valeur est en 18-19. Ainsi, le caractère dont l’adresse était l’ancienne valeur stockée en 18-19 se trouve toujours, le pauvre, en vidéo inverse. On a donc sur l'écran un caractère qui reste en vidéo inverse, du plus mauvais effet. Pour parer à cela, c’est très simple, il suffit de rendre l’ORIC sourd à la sonnerie, ce qui est fait en 115. En effet, on place en #400 un #78, qui est le code d’une instruction SEI et en #491 on met #60, RTS. Puis on exécute ce sous-programme machine de deux instructions. C’est l'instruction SEI qui rend sourd l’ORIC. Puis en 165, on lui rend l’ouie, en exécutant le sous-programme constitué de #58 et #60, soit CLI et RTS. L’instruction CLI à l’effet inverse de SEI.

Si vous voulez mieux voir ce qui se passe, ajoutez la ligne:

117 FOR 1-1 TO 4gÿ8:NEXT I

Puis tapez: CLS :RUN return L’'ORIC vous demande: X,Y? Tapez: 19,14 return L'ORIC demande alors: CHAINE? Tapez :

ABCD return

Vous observez alors que pendant que la ligne 117 s’exécute, le curseur se trouve au début de la troisième ligne, et qu’il ne clignote plus. En effet, la ligne 115 a masqué les interruptions, a rendu sourd l’ORIC, qui ne va plus faire changer d’état son curseur.

Nous passons maintenant au second groupe, les adresses 621, 622 et 623 qui servent à définir la taille de l’écran pour PRINT. On trouve en 621-622 l’adresse du début de l’écran, qui vaut normalement #BB80 en mode TEXT et #BF49 en mode HIRES. En 623, on a le nombre de lignes de l’écran, normalement 27 en mode TEXT et 3 en mode HIRES.

88

Les ordres PRINT, CLS utilisent la zone dont l’adresse de début vaut DEEK(621)+49, et comportant PEEK(623) lignes de 49 caractères. En modifiant ces valeurs, vous pouvez modifier la partie utilisable de l'écran. Tapez:

CLS :POKE 623,8 return

Ceci restreint à huit lignes la zone utilisable de l’écran. Déplacez le curseur avec flèche en bas: il ne peut dépasser la ligne.

Tapez maintenant :

DOKE 621;#BB89-49:POKE 623,28 return

PRINT peut maintenant écrire depuis #BB89 sur 28 lignes. C’est- à-dire que vous pouvez maintenant utiliser la ligne du haut de l’écran, celle se trouve CAPS. Tapez et exécutez :

19 DOKE 621,#BB89-49 :POKE 623,28

28 CLS

39 PRINT SPC(12):’’ZONE PROTEGEE”’

49 FOR 1- #BB89+49+5 TO # BB89+49%5 +39 5g POKE I,ASC(’’=")

68 NEXT I

74 :

89 DOKE 621, # BB89+4ÿ%x5 :POKE 626,22

Vous pouvez déplacer le curseur, exécuter CLS ou CTRL-L sans atteindre les deux lignes supérieures de l’écran. La ligne 19 définit un écran de 28 lignes, tandis que 89 définit un écran de 22 lignes.

Le troisième groupe d’adresses est formé de 619 et 629. On y trouve respectivement les attributs utilisés pour définir la couleur de l'écran et de l’encre lorsque CLS ou CTRL-L est exécuté. Ces deux commandes agissent comme suit : Pour chaque ligne, on place dans le premier octet la valeur qui est en 619, on place dans le second octet la valeur qui est en 629, et on met un code 32 (blanc) dans les 38 octets restants de la ligne.

Reprenons le petit programme précédent, on modifie la ligne 29 et on ajoute la ligne 99 pour obtenir :

89

19 DOKE 621,#BB89-—49 :POKE 623,28

29 POKE 619,16 :POKE 629,7 :CLS

39 PRINT SPC(12);'’ZONE PROTEGEE”’

49 FOR I1=-#BB89+49+5 TO # BB89+49+5+39 59 POKE I,ASC('’="")

68 NEXT I

74 :

89 POKE 621,#BB89+49+5 :POKE 623,22

99 POKE 619,18 :POKE 628,8 :CLS

En 619, on doit placer un attribut qui détermine la couleur de l'écran, c’est-à-dire un nombre de 16 à 23, tandis qu’en 629 on met un attribut qui détermine la couleur de l’encre, un nombre compris entre et 7. A la ligne 29, on choisit un écran noir (16 en 619) ‘avec de l’encre blanche (7 en 629). A la ligne 99, on fixe un écran vert (18 en 619) et de l'encre noire (9 en 629).

Pour terminer, le quatrième groupe qui ne comporte qu’une adresse 618, les 7 bits de poids faible de cet octet ont chacun une signifi- cation particulière, que nous donnons dans le tableau ci-dessous.

Numéro du bit EE

Poids du bit

action du : Affichage She clavier

bit à @ simple sonore : d'affichage | pas affiché

colonnes

Action du Affichage acge clavier ? affichage curseur bit à 1 double élonnes été détecté [silencieux j affiché Touche faisant CTRL-Z

changer d'état| aucune| CTRL-D CTRL-| 5 CTRL-F | CTRL-P CTRL-S CTRL-Q le bit ESC

Caractère de contrôle CHRS(26)

een aucun | CHRS$(4) | CHRS$(29) CHR$(27) CHR$(6) |CHR$(16)| CHRS(19) | CHRSIMMI d'état le bit

90

Lorsque l’ORIC est branché, ou lorsque l’on enfonce reset”, l'ORIC place en 618 la valeur:

OS ES ANS EN RMIES SRE

Ce qui vaut 9+9+9+9+9+2+1—3. Ceci correspond à: * Affichage simple

* Affichage sur 38 colonnes

* La touche précédente n’était pas ESC

* Le clavier est sonore

* Les caractères sont affichés

* Le curseur est affiché.

Les touches CTRL et les caractères de contrôle font changer d’état lun de ces bits, s’il était à @, on obtient 1, et réciproquement. En exécutant un ordre POKE à l’adresse 618, vous pouvez initialiser tous ces bits aux valeurs de votre choix. Par exemple, après avoir frappé un nombre quelconque de touches de contrôle, POKE 618,3 vous ramène bien dans l’état auquel vous êtes habitué, celui de la mise en marche.

Si vous désirez maintenant être en affichage simple, sur 4ÿ colonnes, avec un clavier silencieux et que le curseur ne soit pas affiché, il faut placer en 618 la valeur:

poids

128 64 32 16 8 ä 2 1 RSR ENIENIEN en

Affichage pas ESC | Affichage | simple | Affichage clavier curseur 49 colonnes silencieux pas affiché

Ce qui vaut 9+9+32+9+8+%+2+—42. On exécute donc:

POKE 618,42

91

2.4 TRUCS ET FICELLES DU MODE HIRES

L'écran HIRES est divisé en 293 lignes de 49 caractères chacune, 200 lignes de graphique suivies de trois lignes de texte. Exactement comme en mode texte, à chacun de ces 293 x49—8129 caractères corres- pond un octet de la mémoire de l’'ORIC, de 49969 à 49979 (ÆAW0 à #BFB7).

Si l’on numérote les lignes graphiques de @ à 199, la ligne @ étant la ligne supérieure, et les caractères de Ÿ à 39, l’adresse de l’octet corres- pondant au caractère X de la ligne Y vaut 49960+4ÿ+Y+X.

Comme en mode TEXT, une ligne est constituée de 49 octets, et le bit de poids fort de chacun de ses octets sélectionne le mode vidéo normale ou inverse.

TOC DO AE Er 20 1 (0)

il code compris entre @ et 127

9: Vidéo normale

1: Vidéo inverse

Les 7 bits restants peuvent donner un nombre compris entre Ÿ et 127. Comme en mode TEXT, les valeurs @ à 31 sont des attributs vidéos (voir annexe 3.2). Par contre, les valeurs 32 à 127 ne sont pas des codes ASCII de caractères. A la place, chacun des six bits 5 à Ÿ correspond à un point de l’écran. Ainsi, tout octet compris entre 32 et 127 donne six points. Comme on a 49 caractères par ligne, on peut donc avoir 6x49—24ÿ points par ligne. Chaque bit à zéro donne un point éteint, tandis qu’un bit à un donne un point allumé, visible.

Ainsi, l’octet :

92

128 64 32 1 1

6 8 4 2 9 1 6 0 9 6 0 9 (De LE

Le bit à 1 a un poids de 64, il assure donc que l'octet est supérieur à 31, que ce n'est pas un attribut vidéo, et que les bits 5 à @ représentent donc chacun un point.

9+64+0+0+0+9+9+0—64

@: On aura donc des points en vidéo normale.

correspond-il à six points éteints. Lorsque vous exécutez HIRES, lORIC place cette valeur, soit 64, dans les 299x49 octets qui consti- tuent la zone graphique, on a donc un écran dont tous les points sont éteints. Prenons un second exemple, avec l’octet :

128 64 32 16 8 4 2 1 DATE ON TES DATI TION tit}

CE 0+64+9+16+9+4+2+1—-87

Assure que l'octet est supérieur à 32

Y On aura six points en vidéo normale.

Cet octet vaut 87 et donne un point éteint, un point allumé, un point éteint et trois points allumés. Tapez:

HIRES return Puis : POKE #A999,87 return

#A000 est l’adresse du premier octet de la zone HIRES, on voit donc apparaître les six points correspondant à la valeur 87 dans le coin supérieur gauche de l'écran. Tapez maintenant:

FOR 1- #A999 TO # A927:POKE 1,87:NEXT return

93

Ceci place la valeur 87 dans les 49 premiers octets de la zone écran HIRES, qui correspondent à la première ligne de l'écran. Tapez maintenant :

FOR I-# AŸ99 TO # BF3F:POKE 1,87 :NEXT return

Ceci remplit les 299 lignes graphiques avec ce nombre 87.

Comme il n’est pas possible de placer dans un même octet à la fois une valeur inférieure à 32 et une valeur supérieure à 32, à chaque fois que vous placez un attribut vidéo dans la mémoire HIRES, les six points correspondant à cet octet seront toujours éteints, comme l’illustre l'exemple suivant. Tapez:

HIRES return FOR I-#AFAQ TO # AFC7 :POKE 1,127 :NEXT return

Ce qui trace une ligne au milieu de l’écran, 127 correspond à 7 bits à 1”. Nous allons maintenant placer au milieu de cette ligne l’attribut ”encre rouge” qui a pour code 1. Tapez:

POKE #AFB4,1 return La fin de la ligne est bien rouge, et six points sont éteints. Tapez : POKE # AFB4,127 return

Les six points sont revenus, mais la couleur rouge a disparu.

Lorsque l’on désire remplir une zone rectangulaire de la mémoire écran HIRES avec un code, l’ordre FILL est très pratique. Les para- mètres de cet ordre sont la hauteur du rectangle en nombre de lignes, la largeur du rectangle en nombre d’octets et le code à placer dans toute cette zone.

FILL nombre de lignes, nombre d'octets, code.

Avant d'employer FILL, il faut préciser à l’'ORIC les coordonnées du coin supérieur gauche du rectangle, par exemple avec CURSET.

94

Exemples : Tapez:

HIRES return CURSET 69,59,3:FILL 199,29,127 return

On place sur 199 lignes x 29 octets le code 127 qui correspond à six points allumés, on obtient donc un rectangle de 199x 129 points. Tapez :

CURSET 54,59,3 :FILL 199,1,2 return

On place devant chacune des lignes du rectangle un code 2, qui est l’attribut ”’encre verte”. Le rectangle est donc vert. Tapez maintenant :

CURSET 129,59,3 :FILL 199,1,4 return

Ceci place 4, qui est l’attribut ”’encre bleue au milieu du rectangle. Les points sont les attributs sont éteints, tandis que les points à droite de ces attributs sont bleus.

Comme le montre l’exemple précédent, l’utilisation des attributs vidéo ne permettent pas d’avoir sur une même ligne des points voisins de couleurs différentes. Cela est possible en utilisant la vidéo inverse. Tapez: |

HIRES return CURSET 69,59,3 :FILL 199,7,127 return

On obtient un rectangle blanc que nous allons colorier en vert en exécutant :

CURSET 54,59,3 :FILL 190,1,2 return

Tapez maintenant:

CURSET 192,59,3 :FILL 199,7,127+128 return

127+128-255 donne six points allumés en inverse vidéo.

Comme l'inverse vidéo du vert est le mauve, on obtient un rectangle mauve contigu au rectangle vert précédent. Tapez:

CURSET 144,59,3:FILL 199,7,127 return

On obtient un nouveau rectangle vert contigu au rectangle mauve.

95

2.5 FABRIQUER DES LIGNES DE PROGRAMME PAR PROGRAMME

Lorsque l’on tape de longues listes de DATA, ou de grands textes après des ordres PRINT, il devient rapidement fastidieux de devoir à chaque ligne taper un numéro, le mot DATA ou PRINT. Il est préfé- rable de ne taper que les données, et de laisser le soin à un programme d’ajouter les détails que sont le numéro de la ligne ou le mot DATA. Cela est possible lorsque l’on sait que:

Chaque ligne de programme est stockée en mémoire selon ie format suivant :

a adresse du début numéro de la instructions marque de

de la ligne suivante ligne fin de ligne

On a d’abord sur deux octets l’adresse-mémoire de la ligne suivante. puis encore sur deux octets, le numéro de la ligne. Ensuite les caractères qui constituent les instructions, terminés par un octet nul qui indique la fin de la ligne.

Les instructions sont elles-mêmes stockées de façon simple: tous les mots réservés, comme Z AP, FOR, PRINT, etc. sont codés par un octet supérieur à 128. Tous les autres caractères (noms de variables, constantes numériques et chaînes de caractères) sont codés par leur code ASCII, compris entre 32 et 125.

Les lignes sont classées en mémoire selon l’ordre de leurs numéros. Il n’y a pas de place perdue, de trou entre deux lignes succes- sives. En #9A-#98B se trouve l’adresse du premier octet du programme, cette adresse vaut normalement #591. Juste après le @ terminant la dernière ligne du programme, on trouve deux autres octets nuls, on a donc en tout trois octets nuls. En #9C-#9D se trouve l’adresse de l’octet qui suit immédiatement ces trois octets nuls.

96

DORE NC EC RES Es UE EE AE 2

Es qe 1" ligne ligne dernière ligne #9A-#9B contient l'adresse contient l'adresse #9C-#9D du 1 octet du de l'octet suivant programme, #591 les trois octets nuls.

normalement

Supposons que vous désiriez trouver l’adresse de début d’une ligne de programme, par exemple la ligne 59. Comme l’adresse de début de programme est stockée en #9A-#9B et que chaque ligne débute par l'adresse de la ligne suivante suivie de numéro, il suffit de taper en mode immédiat.

A=DEEK(# 9A) :N=599 return

REPEAT : A=DEEK (A) :UNTIL DEEK(A+2)=N return PRINT A return

Les deux points qui précèdent nous suffisent par écrire un programme qui fabrique des lignes de DATA:

1 GOTO 1000

10 REM CES RENM FIGURENT LE

20 REM FROGRAMME AUIQUEL.

30 REM ON DESIRE AJQUTER DES

40 KEM ORDRES DATA.

Ta Ne

1000 DOKHE #90, DEEK (#90) 45000: CLEAR 1010 A=DEEE (HK9C) -5000-2: Ne7O000 1020 L$e"ts ZePRE ("M"): PRINT" 1050 GET AS:IF AS=CHRS(1Z) THEN 1050 1040 LéeL$+A$6: PRINT A$:;:GOTO 1070 1050 IF L$="" THEN 1150

1060 DOFE À, A+LEN(LS#)+6:DOHE A+Z,N 1070 FOFE Â+4,145

1080 FOR Ii TO LEN(LS#)

97

1090 POKHE Â+4+I, ASC (MID# (LS, I, 1)) 1100 NEXT I

1110 POHE A+S+LEN(L#), O0: A=A+LEN (LS) +6 1120 FRINT:NEN+10:GOTO 1020

1150 DOFE ASO:DOFE H9C, A+2: CLEAR

Avant d’exécuter ce programme, vérifiez soigneusement que les lignes 1990 à 1139 sont bien correctes. A chaque fois que le programme affiche >”, tapez une ligne suivie de RETURN. Pour sortir du programme, tapez RETURN immédiatement après le >”.

Exemples :

RUN return

> 1,2,3,4,5 return >6,7,8,9,18 return > return

Ready

LIST return

L’ORIC a ajouté les deux lignes:

2998 DATA 1,2,3,4,5 2919 DATA 6,7,8,9,19

Vous pouvez changer le numéro de la première ligne, défini par l'instruction N—2999 de la ligne 1919. On peut changer l’incrément des numéros de lignes, en modifiant l’instruction N=N+19 de la ligne 1129. Vous pouvez aussi ajouter la ligne:

1935 1F A$—-CHR$(24) THEN PRINT” \ ”:GOTO 1928

qui, en cas d’erreur, permet d’annuler la ligne en cours de frappe en utili- sant la touche CTRL-X.

Le bloc 1999 à 1139 fonctionne de la façon suivante : Le nombre stocké en #9C-#9D est l’adresse de la fin du programme Basic mais aussi celle du début de la zone des variables simples. Pour que les lignes de DATA que le programme va ajouter à sa suite ne détruisent pas ses variables, on commencée donc, en 19, par repousser de 59% l’adresse contenue en #9C. On dispose donc maintenant de 599 octets entre la fin du programme et le début des variables. L'ordre CLEAR qui suit

98

remet à jour les adresses stockées en #9E-#9F et #AŸ-ÆA 1 (début et fin de la zone de stockage des tableaux).

1919 On va placer dans A l'adresse de la première ligne que l'on va ajou- ter. On met dans N le numéro de cette première ligne.

1029 L$ va contenir la ligne que vous allez taper. Ne pas oublier le ”’;" à la fin de la ligne.

1930 On lit un caractère. Si c'est RETURN, on va en 1054.

1949 On ajoute le caractère lu à la chaîne A$ et on l'affiche. Ne pas oublier le ‘’:"" de l'ordre PRINT. Puis on va relire un autre caractère.

Lorsqu'un RETURN a été rencontré, on arrive en 1959.

1654 Si la ligne est vide, on sort du programme, on va en 1130.

1069 On place à l'adresse A, qui correspond au début de la ligne, l'adresse du début de la ligne suivante. Puis l'on place en A+2 le numéro de la ligne.

1970 On place 145, qui est le code du mot réservé DATA.

1089 à 1199 On place les codes ASCII des caractères que vous avez tapés.

1119 On ajoute à la fin de la ligne un octet nul, puis l'on calcule l'adresse de début de la prochaine ligne.

1129 On incrémente le numéro de la ligne, et l'on va lire une autre ligne en 1929.

1139 Cette ligne est exécutée lorsque l'on sort. DOKE A, ajoute deux octets nuls à la suite de la dernière ligne, puis on met en #9C l'adresse de l'octet suivant.

2.6. COMMENT ACCÉLÉRER UN PROGRAMME BASIC

Dans tous les jeux d’action, il est souvent souhaitable d’accélérer au maximum les programmes. Voici donc quelques moyens d’accélérer l'exécution d’un programme Basic. Ces conseils sont valables pour la majorité des Basics, et donc en particulier pour celui de l'ORIC:

99

Tout d’abord, et ceci est le plus important, remplacer toutes les constantes par des variables.

Exemples : 199 X-COS(9.9174532925%T) peut être remplacé par:

19 CDR-O.#174532925

198 X=-COS(CDR+T)

Il est en effet beaucoup plus rapide de rechercher en mémoire la valeur d’une variable que de convertir une chaine de chiffres en un réel.

À chaque fois que l’on utilise une variable, celle-ci est cherchée en mémoire en partant de l’adresse stockée en #9C-#9D. Pour diminuer ce temps de recherche, on peut:

* diminuer le nombre total des variables, en réutilisant au maxi- mum les mêmes noms. Par exemple, utiliser autant que possible la même variable pour toutes les boucles FOR NEXT.

* placer au début de la zone des variables celles qui sont utilisées le plus fréquemment, par exemple celles qui sont utilisées à l’intérieur des boucles. Pour cela, utiliser une fois ces variables au début du programme. Si vous ajoutez par exemple la ligne:

1 1=D:J=1:K=1:L=I

La variable I sera la prémière dans la zone des variables simples et sera donc retrouvée instantanément à chaque fois que l’on voudra l’utili- ser. On trouvera ensuite la variable J, puis K, puis L.

Se méfier des GOTO et GOSUB. En effet, cela prend du temps de retrouver un numéro de ligne dans un programme. Si un sous- programme est utilisé fréquemment, on a intérêt à le placer au début du programme.

100

1 GOTO 1999 REM VERS PROGRAMME 19 REM S-PROGRAMME

Dans la mesure du possible, remplacer les GOTO par des boucles FOR NEXT ou REPEAT UNTILL.

Lorsque cela est possible, simplifiez ou supprimez les tests.

Exemples : 39 IFV<> f THEN 199

peut être remplacé par:

39 IF V THEN 199

19 IF A$=-CHRS$(8) THEN X=X-—1 28 IF A$-CHR$(9) THEN X=X+1

peut être remplacé par la seule ligne: 19 X=X+(A$-CHR$(8))-(A$=-CHR$(9))

En effet, (A$—CHRS(8)) est une expression logique qui vaut —1 si elle est vraie, Ÿ sinon. De même (A$—CHRS$(9)) vaut —1 si elle est vraie et @ sinon.

Diminuez le nombre de lignes en mettant plusieurs instructions par ligne. Pour pouvoir mettre plus d’instructions par ligne, supprimez tous les blancs, ne conservez que les deux premiers caractères des noms de variables.

Utilisez les variables entières. Évitez les tableaux. Supprimez les REM.

Enfin, réécrivez en assembleur les parties critiques du jeu. C’est difficile, mais cela donne des résultats bien plus spectaculaires que tout ce qui précède.

101

2.7 UN PETIT EXEMPLE DE SOUS-PROGRAMME ASSEMBLEUR

Ce programme ne fait pas grand-chose, excepté montrer comment ajouter un sous-programme assembleur simple à un programme Basic. On trace un petit dessin au bas de l’écran HIRES, et on le déplace ensuite vers le haut de l’écran à l’aide du sous-programme assembleur.

On trouve un programme principal, de 19 à 149, puis en 1999 un sous-programme qui trace un petit dessin, puis en 294 un sous- programme qui sert à amener en mémoire les instructions 6592. Nous allons d’abord regarder ces instructions machine.

Le sous-programme 6592 déplace d’une ligne vers le haut une partie rectangulaire de l’écran HIRES. Comme chaque ligne est consti- tuée de 49 octets, il suffit de déplacer de 49 les octets qui correspondent au rectangle.

En entrée du sous-programme, on a:

en 1-2, l’adresse-mémoire de l’octet qui correspond au coin supérieur gauche du rectangle à déplacer.

en 3, le nombre de lignes du rectangle. en 4, le nombre d’octets de chacune des lignes du rectangle.

En sortie du sous-programme, on a déplacé vers le haut d’une ligne le rectangle et:

en 1-2, l’adresse-mémoire qui correspond au coin supérieur gauche du rectangle qui a été déplacé. C’est-à-dire l’adresse que l’on avait en entrée moins 44.

en 3, ce nombre n’a pas été modifié. en 4, ce nombre n’a pas été modifié. 5 et 6 sont modifiés.

Ce sous-programme DHAUT appelle lui-même deux sous- programmes NXLIG et PLIG qui ajoutent et retranchent respectivement 49 à l’adresse contenue en 1-2. Ce nombre 49 est celui des octets consti- tuant une ligne écran, ils permettent donc de passer respectivement à la ligne suivante (NXLIG) et à la ligne précédente (PLIG).

102

A5

69 85 99 E6 68

A5

E9 85 Bÿ C6 68

93 XX #1

92 #4 #1 5 #2 #6 XX 91 95 F9 E9 92

#1

#1 28 #1

92 92

91

28 91

#2

XX

XX

DHAUT

TLIGNE

TRCARA

NXTLIG

RTS 1

PLIG

RTS 2

LDX JSR LDA PHA LDA PHA

LDA CLE ADC STA

INC RTS

LDA SEC SBC

BCS DEC RTS

TRCARA TLIGNE 2

|

#49

RTS 1

# 4ÿ

RTS 2

Init. compteur de lignes.

Oter 49 à (1-2).

Sauvegarder 1

dans la pile.

Sauvegarder 2

dans la pile.

Init. compteur d’octets par ligne. Recopier 1

en 5, puis

recopier 2en

6.

Ajouter 4ÿ à (1-2).

Prendre un octet et

le recopier, 49 octets avant. Décrémenter compteur d’octets. Si compteur positif, continuer ligne Sinon, décrémenter compteur lignes Si compteur positif, continuer. Terminé. Récupérer

2et

récupérer

1 puis

retour au programme Basic.

Prendre octet de poid faible en 1 préparer une addition

ajouter 4fet

ranger le résultat.

Si pas de retenue, retour

Sinon, propager la retenue

Fin.

Prendre octet de poids faible en 1 préparer une soustraction retrancher 48 et

ranger le résultat.

Siil y a retenue, retour

Sinon, décrémenter poids fort Fin.

Ce sous-programme est mis en mémoire par les lignes 2909 à 2070.

201% A est l'adresse-mémoire l'on va placer les codes. #9C009 corres- pond au début de la zone de stockage des caractères semi- graphiques en mode HIRES. Comme le programme n'utilise pas les

103

2920

2059

2069

caractères semi-graphiques, on n'hésite pas à les écraser, car on a entre #9C00 et #A000, 1 Koctet de mémoire dans lequel le Basic ne va pas écrire, tant que l'on ne frappe pas reset.

à 2040 Les 65 octets sont placés en mémoire à partir de l'adresse A.

Le sous-programme DHAUT est le premier, son adresse DH est égale à A. Comme DHAUT fait 41 octets, le second sous- programme NXTLIG débute à l'adresse NX=DH+41. Et comme NXTLIG fait 12 octets, le troisième, PLIG, débute donc à l'adresse PL=NX+12.

Après avoir calculé les adresses DH, NX et PL des sous- programmes, on peut ajouter au sous-programme les adresses de PLIG et NXTLIG, en DH+3 et DH+22 respectivement.

Pour utiliser DHAUT, on commence par placer en (1-2) l’adresse de l’octet qui correspond au coin supérieur gauche du rectangle à dépla- cer, ce qui est fait en 69. En 7, on place en 3 le nombre de lignes du rectangle, 41, et on place en 4 le nombre d’octets par ligne de ce rectangle, soit 9. Le sous-programme est appelé à la ligne 119 par CALL DH. Cet ordre est situé dans une boucle, le sous-programme est appelé 159 fois de suite, on déplace donc de 154 lignes vers le haut le dessin.

104

Pour finir, voici le listing du programme:

10 REM FACE DE LUNEX%XX XX 4 XX XX 4H KCXK ACNCKX 20 HIRES 30 GOSUER 2000

40 =:

50 X=50+150OXRND (1) :Y=170

60 DOEE 1, HA000+(V-20) X40+X/6-—5 70 PFOHE S,4i1:FOKE 4,9

80 MUSIC 1,1,1,0:PLAY 1,0,5,100 90 GOSUR 1000

100 FOR Izi TO 150

110 CALL DH: SOUND 1,200-T7T,15 120 NEXT

140

1000 1010 1020 1050 1040 1050 1040 1070 1980 1090 1100 1110 1120 1150 1140 2000 2010 2020 F050 2040 2050 2060 2070 2080 2090

REM DESSIN CURSET X,Y,5

FOR R=1i TO 2O:CIRCLE R,1:NEXT FOR I=-1 TO 1 STEF 2

CURSET X+I*X8,Y-10,0

FOR J=1 TO S:CIRCLE J,O:NEXT J CURSET X+I47,Y-10, 1

FOR J=0 TO 6

CURSET X+I4KJ,Y-J"2/6+10,0 CURSET X+IKJ,Y-J"2/6+11,0

NEXT J

NEXT I

CURSET X-26,Y-20,3

FILL 40,1,1+7XRND (1)

RETURN

REM SOUS-PROGRAMMES 6502 A=#9CO0

FOR I=A TO A+64

READ V:POKE I,V

NEXT I

DH=A: NX=DH+41: FL=NX+12

DOHE DH+3,PL:DOKE DH+22,NX RETURN

REM DHAUT. ss ssumnsumomuuse sunssus

105

106

2100 2110 2120 2150 2140 2150 2160 2170 2180 2190 sen

210

Le a din 2230

Se 5 et

DATAHA6, #03, H2O,H#FF, #FF, HAS, #O1 DATA#49, HAS, #02, #48, #A4, #04, HAS DATA#O1,#85, 405, #05, #02, #85, #O6 DATA#?20,HFF,HFF. HE, #O1,#91,#05 DATA#BS, #10,HF9, HCA, #10, #E9, #66 DATA#BS, #02, #68, #05, #01, #60

REM NXTLIGeeesoscoceceneuse Ne DATA#AS, #01,#16, #69, #28, #05,#01 DATAH9O, HO2, HE6, #02, #60

REM PLIG....... PS ES DATAHAS, 401,428, #E9, #28, H85, #01 DATAHEO, #02,4#C6, #02, #60

Annexes

3.1 TABLE ASCII DE L'ORIC

Effet de la touche ou

Touche de PRINT CHR${code)

pas de touche Aucun

CTRL-A relit un caractère sur l'écran.

Aucun

CTRL-C interrompt un programme basic.

Provoque un affichage double. Les caractères suivants seront affichés deux fois chacun. Pour annuler, utiliser de nou- veau CHR${(4) ou CTRL-D

Aucun

Effet de PLOT X,Y,code

Tous les caractères affichés sur la ligne Y et situés après la colonne X sont noirs.

Tous les caractères affichés sur la ligne Ÿ et situés après la colonne X sont rouges.

Tous les caractères affichés sur la ligne Y et situés après la colonne X sont verts.

Tous les caractères affichés sur la ligne Y et situés après la colonne X sont jaunes.

Tous les caractères affichés sur la ligne Y et situés après la colonne X sont bleus.

Tous les caractères affichés sur la ligne Y et situés après la colonne X sont violets.

107

Code ASCII

19

11

12

108

Touche

CTRL-F

CTRL-G

CTRL-H ou +

CTRL-I ou +

CTRL-J ou À

CTRL-K ou T

CTRL-L

Effet de la touche ou de PRINT CHR${code)

Supprime le ‘’plop” que l'on entend lorsque l'on frappe une touche. Pour retrouver le bruit, réutili- ser CHR$(6) ou CTRL-F.

Fait retentir PING.

Déplace le curseur un cran à gauche.

Déplace le curseur un cran à droite.

Déplace le curseur un cran vers le bas.

Déplace le curseur un cran vers le haut.

Efface l'écran. .

Effet de PLOT X,Y,code

Tous les caractères affichés sur la ligne Y et situés après la colonne X sont bleus ciels (cyan).

Tous les caractères affichés sur la ligne Y et situés après la colonne X sont blancs.

Tous les caractères affichés sur la ligne Y et situés après la colonne X seront :

en hauteur simple,

en affichage fixe,

jeu de caractères standard.

Tous les caractères affichés sur la ligne Y et situés après la colonne Y seront:

en hauteur simple,

en affichage fixe,

jeu de caractères semi- graphique.

Tous les caractères affichés sur la ligne Y et situés après la colonne X seront:

en double hauteur,

en affichage fixe,

jeu de caractères standard.

Tous les caractères affichés sur la ligne Y et situés après la colonne X seront:

en double hauteur,

en affichage fixe,

jeu de caractères semi- graphique.

Tous les caractères affichés sur la ligne Y et situés après la colonne X seront:

en simple hauteur,

en affichage clignotant, jeu de caractères standard.

Code ASCII

13

16

17

18

19

29

21

Touche

CTRL-M ou RETURN

CTRL-N

CTRL-0

CTRL-P

CTRL-Q

CTRL-R

CTRL-S

CTRL-T

CTRL-U

Effet de la touche ou

de PRINT CHR${code)

Envoie le curseur au début de la ligne suivante.

Efface la ligne ou se trouve le curseur.

Aucun.

Aucun.

Supprime le curseur. Pour le retrouver, réutiliser CHRS(17) ou CTRL-Q.

Aucun.

Supprime l'affichage. Pour le rétablir, réutiliser CHR$(17) ou CTRL-S.

Passage en minuscules. Pour obtenir une majus- cule, utilisez SHIFT. Pour revenir en majuscules, réutilisez CHR$(20) ou CTRL-T.

Aucun.

Effet de PLOT X,Y,code

Tous les caractères affichés sur la ligne Y et situés après la colonne X seront:

en simple hauteur,

en affichage clignotant, jeu de caractères semi- graphique.

Tous les caractères affichés sur la ligne Y et situés après la colonne X seront:

en double hauteur,

en affichage clignotant, jeu de caractères standard.

Tous les caractères affichés sur la ligne Y et situés après la colonne X seront :

en double hauteur,

en affichage clignotant, jeu de caractère semi- graphique.

Le fond (PAPER) de la ligne

Y, à partir de la colonne X, sera noir.

Le fond (PAPER) de la ligne Y, à partir de la colonne X, sera rouge.

Le fond (PAPER) de la ligne Y, à partir de la colonne X, sera vert.

Le fond (PAPER) de la ligne Y, à partir de la colonne X, sera jaune.

Le fond (PAPER) de la ligne Y, à partir de la colonne X, sera bleu.

Le fond (PAPER) de la ligne Y, à partir de la colonne X, sera violet.

109

Code ASCII

22

23

24

25

26

27

28

29

110

Touche

CTRL-V

CTRL-W

CTRL-X

CTRL-Y

CTRL-Z

CTRL-{ ou ESC

CTRL-/

CTRL-]

Effet de la touche ou

de PRINT CHR${code)

Aucun. Aucun.

CTRL-X annule la ligne en train d'être frappée.

Aucun.

A la même action que ESC. Voir ci-dessous.

Ce caractère n'est pas

affiché, et ne déplace pas le curseur. Par contre, le caractère suivant sera af- fiché après que ses bits b, et b4 aient été mis à zéro.

Aucun.

Normalement, lorsque l'on frappe sur une touche ou que l'on exécute PRINT, aucun caractère n'est affiché dans les deux premières colonnes de l'écran. Le caractère per- met d'utiliser ces colon- nes. Mais alors les textes sont blancs sur fond noir, car les caractères com- mandant la couleur de l'écran et du texte, qui se trouvent normalement dans ces deux colonnes, sont écrasés. Réutilisez CHR$(29) ou CTRL-] pour revenir comme avant.

Effet de PLOT X,Y,code

Le fond (PAPER) de la ligne Y, à partir de la colonne X, sera cyan.

Le fond (PAPER) de la ligne Y, à partir de la colonne Y, sera blanc.

Passage en texte 60 Hz. Ne pas utiliser, perturbe l'affi- chage.

Passage en texte 60 Hz. Ne pas utiliser.

Passage en texte 50 Hz, rend l'affichage normal.

Passage en texte 50 Hz, rend l'affichage normal.

Passage en graphique 60 Hz. Ne pas utiliser, perturbe l'affichage.

Passage en graphique 60 Hz. Ne pas utiliser, perturber l'affichage.

Code ASCII

30

31

32 33 34 35 36 37 38 39 49 a1 42 43 44 45 46 47 48 49 59 51 52 53 54 55 56

CTRL-DEL

barre d'espacement

_

DO OO À À N

Pas de touche

Effet de la touche ou de PRINT CHR${(code)

Effet de PLOT X,Y,code

CHR$(30) renvoie le

curseur dans le coin supé- rieur gauche de l'écran, qui n'est pas effacé.

Passage en graphique 50 Hz. Affichage normal.

Aucun.

Passage en graphique 50 Hz. Affichage normal.

Affiche un espace, un blanc Affiche un !

Affiche un (guillemet) Affiche un # (dièse) Affiche un $ (dollar) Affiche un %

Affiche un &

Affiche un” (apostrophe) Affiche un (

Affiche un )

Affiche un * (signe de multiplication) Affiche un +

Affiche un,

Affiche un

Affiche un.

Affiche un / (signe de division, slash) Affiche un @

Affiche un 1

Affiche un 2

Affiche un 3

Affiche un 4

Affiche un 5

Affiche un 6

Affiche un 7

Affiche un 8

111

Code

ASCII Touche Effet 57 9 Affiche un 9 58 : Affiche un : (colon) 59 ; Affiche un ; (semi-colon) 69 < Affiche un < 61 = Affiche un = 62 > Affiche un > 63 ? Affiche un ? 64 @ Affiche un @ 65 A Affiche un A 66 B Affiche un B 67 C Affiche un C 68 D Affiche un D 69 E Affiche un E 70 F Affiche un F 71 G Affiche un G 72 H Affiche un H 73 [ Affiche un | 74 J Affiche un J 75 K Affiche un K 76 L Affiche un L 77 M Affiche un M 78 N Affiche un N 79 O Affiche un O 80 P Affiche un P 81 a Affiche un Q 82 R Affiche un R 83 S Affiche un S 84 je Affiche un T 85 U Affiche un U 86 V Affiche un V 87 W Affiche un W

112

Code ASCII

88 89 99 91 92 93 94 95 96 97 98 99 199 191 192 193 194 195 196 197 198 199 119

112 113 114 115 116 117

Touche

NPCEX

TT

Dre

pas de touche

T'ON eOUEOUTUE

CHOC OUT 'O 2 EL CURE

Affiche un X Affiche un Y Affiche un Z Affiche un l Affiche un \ Affiche un | Affiche un Affiche un £ Affiche un (©) Affiche un a Affiche un b Affiche un c Affiche un d Affiche un e Affiche un f Affiche un g Affiche un h Affiche un i Affiche un) Affiche un k Affiche un | Affiche un m Affiche un n Affiche un o Affiche un p Affiche un q Affiche un r Affiche un s Affiche un t Affiche un u

Effet

(crochet ouvrant) (backslash) (crochet fermant)

L

(livre)

Pour obtenir les minuscules au clavier, frapper d'abord CTRL-T

113

Code

ASCII Touche Effet 118 V Affiche un v

119 W Affiche un w

120 X Affiche un x

121 Ÿ. Affiche un y

122 Z Affiche un z

123 { Affiche un

124 I Affiche un |

125 | Affiche un

126 pas de touche Affiche un carré clair 127 DEL DEL annule un caractère

CHR$(127) affiche un carré sombre.

Les codes 128 à 255 provoquent les mêmes effets que les codes de @ à 127. Avec deux petites diffé- rences :

les codes 128 à 159 sont affichés, alors que les codes @ à 31 ne le sont pas. CHR$(128) a le effet que ESC , CHR$(129) a le même effet que ESCA, …, etc.

les caractères correspondant aux codes de 128 à 255 sont affichés en vidéo inverse, lorsqu'on les utilise avec PLOT.

3.2 TABLE DES ATTRIBUTS VIDÉO

Les codes ASCII 9 à 31 ont une action spéciale lorsqu’on les place

dans la zone mémoire correspondant à l’écran TEXT ou HIRES.

Ils permettent de choisir la couleur de l’encre, du fond, le jeu de

caractère, normal ou semi-graphique, la taille des caractères et le clignotement.

114

Pour placer un code dans la mémoire-écran, vous pouvez:

Exécuter POKE adresse, code

Exécuter PLOT X,Y,CHRS$(code) ou PLOT X,Y,code Exécuter PRINT CHR$(27); CHR$(code+64)

Frapper la touche ESC puis la touche dont le code ASCII vaut code +64.

Par exemple, pour code=ÿ, code+64 vaut 64 et CHRS$(code+64) vaut @ ”. Pour code=1, code+64 vaut 65 et CHRS$(code+64) vaut 29; AC:

Chacun de ces codes est actif depuis l’endroit il se trouve jusqu’à la fin de sa ligne.

Attributs de @ à 15

Action

Avec PRINT de sur le système vidéo

Depuis le clavier

PRINT CHRS(27);" encre noire

PRINT CHRS(27);"A" encre rouge

PRINT CHR$(27);"B" encre verte

PRINT CHR$(27);"C" encre jaune

PRINT CHR$(27);" D" encre bleue

PRINT CHR$(27);"E" encre magenta

PRINT CHR$(27);"F" encre cyan

PRINT CHRS$(27);"G" encre blanche

PRINT CHRS(27);"H" simple hauteur, fixe,

normal

PRINT CHR$(27);"1" simple hauteur, fixe,

semi-graphique

115

PRINT CHRS(27);"J" ESCJ double hauteur, fixe, normal

PRINT.CHRS(27);"K" ESC K double hauteur, fixe, semi-graphique

PRINT CHR$(27);"L" ESCL simple hauteur, clignotant,

normal- PRINT CHRS$(27);"M" ESC M simple hauteur, clignotant,

semi-graphique

PRINT CHRS$(27);"N" ESCN double hauteur, clignotant, normal PRINT CHR$(27);"O0" ESC O double hauteur, clignotant,

semi-graphique

Les codes de Ÿ à 7 permettent de fixer la couleur de l’encre, tandis que les codes 8 à 15 sélectionnent le type de caractère employé, un caractère peut en effet être:

normal ou semi-graphique simple hauteur ou double hauteur fixe ou clignotant

Attributs de 16 à 31

Avec POKE ou PLOT Avec PRINT Depuis le clavier code

Action sur le système vidéo

PRINT CHR$(27);"P" écran noir

PRINT CHR$(27);"Q" écran rouge

PRINT CHRS$(27);"R" écran vert

116

19 PRINT CHR$(27);"S" ESCS écran jaune

29 PRINT CHRS(27);"T" ESCT écran bleu

21 PRINT CHR$(27);"U" ESC U écran magenta

22 PRINT CHR$(27);"V" ESC V écran cyan

23 PRINT CHRS$(27);"W" ESCW écran blanc

24 PRINT CHRS$(27);"X" ESC X mode texte en 60 Hz

25 PRINT CHR$(27);"Y" ESC Y mode texte en 60 Hz

26 PRINT CHR$(27);"Z" ESCZ mode texte en 50 Hz

|

27 PRINT CHRS(27):" { ESC | mode texte en 50 Hz

28 PRINT CHRS(27);" | ESC | mode graphique en 60 Hz

29 PRINT CHR$(27):" | ESC | mode graphique en 60 Hz

30 PRINT CHRS$(27); pas de touche |mode graphique

CHR$(39) en 50 Hz 31 PRINT CHRS(27); ESC DEL mode graphique CHRS$(31) en 50 Hz

Les codes de 16 à 23 permettent de fixer la couleur de l’encre, tandis que les codes 24 à 31 commandent le mode vidéo. On peut:

être en mode texte (TEXT et LORES) ou en mode graphique (HIRES)

balayer l’écran 50 fois ou 60 fois par seconde. En France, le balayage se fait en 50 Hz.

117

3.3 LE MICROPROCESSEUR 6502

Le microprocesseur 6592, qui équipe votre ORIC, est capable de

manipuler,

de traiter des données de 8 bits (octets), et engendre des

adresses de 16 bits. Il dispose de 7 registres:

PCH

* X et Y :

accumulateur À

index X

index Y

il

PCL compteur ordinal PC

pointeur de pile S

INIVIS[D[1[ZTC] étatP

: Ce registre de 8 bits contient le résultat de toutes les opéra-

tions, logiques ou arithmétiques.

Ces deux registres de 8 bits peuvent servir de compteur ou servent à construire une adresse.

: Ce registre de 16 bits contient l’adresse de la prochaine ins-

truction à exécuter.

: Ce registre de 8 bits contient l’octet de poids faible du poin-

teur de pile. L’octet de poids fort vaut 1, car par construction du 6592, la pile est située entre 199 et 1FF (adresses hexa- décimales).

: Ce registre de 7 bits contient 7 indicateurs.

N Indicateur de résultat négatif. V Indicateur de débordement (Overflow). B Indicateur de BREAK.

D Indicateur de mode de calcul décimal.

I Indicateur d’interruptions masquées.

Z Indicateur de résultat nul (Zéro).

Retenue (Carry).

Le 6592 dispose de 13 modes d’adressage qui sont :

ADC

AND

ASL

BCC

Immédiat

Page zéro

Page zéro indexé par X Absolu

Absolu indexé par X Absolu indexé par Y Indirect pré-indexé par X Indirect post-indexé par Y Accumulateur

Implicite

Relatif

Indirect

Page zéro indexé par Y

ex : LDA #FF

LDA 1 LDA 1,X

LDA 1990 LDA 1999,x LDA 1409,Y LDA (1909,X) LDA (14946),Y ROL

TAX

BNE 1909 JMP (1990) LDX 1,Y

Le 6592 dispose de 56 instructions qui sont :

L'opérande est ajouté au bit C de retenue et à l'accumulateur, le

résultat est dans l'accumulateur.

On effectue le ET logique bit à bit de l’accumulateur et de l’opé- rande, le résultat est dans l'accumulateur.

L'opérande est décalé d'un bit vers la gauche.

7

o

ee

Branchement relatif lorsque C = @ (pas de retenue).

119

BCS BEQ BIT

BMI BNE BPL BRK BVC BVS CLC CLD CLI CLV CMP

CPX CPY DEC DEX DEY EOR

INC INX INY JMP JSR LDA

120

Branchement relatif lorsque C = 1 (retenue). Branchement relatif lorsque Z = 1 (résultat nul).

Positionne les indicateurs suivant le résultat de la comparaison bit à bit de l'opérande et de l'accumulateur.

Branchement relatif lorsque N = 1 (résultat négatif). Branchement relatif lorsque Z = @ (résultat non nul). Branchement relatif lorsque N = @ (résultat positif). Break, déroutement software.

Branchement relatif lorsque V = @ (pas d'overflow). Branchement relatif lorsque V = 1 (overflow). Positionne à @ l'indicateur C (carry).

Positionne à @ l'indicateur D (mode décimal). Positionne à @ l'indicateur | (interruptions démasquées). Positionne à @ l'indicateur V (overflow).

Compare l'accumulateur t l'opérande et positionne en consé- quence les indicateurs.

Compare le registre X et l'opérande, positionne les indicateurs. Compare le registre Y et l'opérande, positionne les indicateurs. Décrémente d'une unité l'opérande.

Décrémente d'une unité le registre X.

Décrémente d'une unité le registre Y.

“OU” exclusif bit à bit de l’opérande et l'accumulateur, le résultat est dans l'accumulateur.

Incrémente l'opérande d'une unité. Incrémente le registre X d'une unité. Incrémente le registre Y d'une unité. Branchement absolu inconditionnel. Appel d'un sous-programme.

Charge l'opérande dans l'accumulateur.

LDX LDY LSR

NOP ORA

PHA PHP PLA PLP ROL

ROR

RTI RTS SBC SEC SED SEI

Charge l'opérande dans le registre X. Charge l'opérande dans le registre Y.

L'opérande est décalé d'un bit vers la droite.

7 ( rs EC

Pas d'opération. Ne fait rien.

"OU" bit à bit de l'opérande et l'accumulateur, le résultat est dans l'accumulateur.

Empile l'accumulateur. Empile les indicateurs (registre P). Dépile l'accumulateur. Dépile les indicateurs (registre P).

Rotation d'un bit vers la gauche au travers de C de l'opérande.

7 ()

opérande :

Rotation d'un bit vers la droite au travers de C de l'opérande.

7 (

CE

Retour de sous-programme de traitement d'interrruption. Retour de sous-programme.

Retranche à l'accumulateur l'opérande et la carry. Positionne à 1 l'indicateur C (carry).

Positionne à 1 l'indicateur D (mode décimal).

Positionne à 1 l'indicateur | (masque les interruptions).

121

STA STX STY TAX TAY TSX TXA TXS TYA

122

Range l'accumulateur en mémoire. Range le registre X en mémoire. Range le registre Y en mémoire. Recopie À dans X.

Recopie A dans Y.

Recopie S (pointeur de pile) dans X. Recopie X dans A.

Recopie X dansS.

Recopie Ÿ dans A.

NNNMMMANN NNNMMMANN rNNmm

NO" 9 CZ UN SayIpou S1N9189/PUJ

S2920,p 21/QUON

x'1edo Sv x'njosge 4940 Sy njosqe x'19d0 Sy x'019z eBed 48d0 SV 019z oBed

SV | inejepnuwunose

A'(8d0) aNv A'(19811pul)

(X'18d0) GNv (x'9011put) A‘12d0 ON A'njosqe x'18d0 GNvY x'njosqe

4ed0 GNY njosqe x'12d0 GNY X'019z eBed 12d0 AGNY 019z eBed sed0# GNV Jelpauul

A'18d0) 3qv A'(9811pul) (X'18d0) 3qv (xX'19811pui) A‘12d0 5qv A'njosqe x'10d0 5qv x'njosqe 4ed0 5qv njosqe x'18d0 95qv X'019z e6ed 4ed0 5qv 0197 eBed sedo# 3qv elpauuuul

1n9/quesse axeJuAS

sebessaipe p SSpOW

uone12dO

euyonef e eBeje99p

1qae3q,13,

V+-OI+W+v

9 = 2 is eyoueiq

vVEW'v

1Sv

av

9qav

enbiuowauy

es)

123

jnejes

jnee1

ey1o1duul

ee

1840 -4g

A 28 4ed0 11g njosqge 74 4edo 11g o19z eBed

S19320,P | YX3H 2/QUON | 2po3

EC me le) ECS

NAME OLSZEN Sapou SIN9)82/PUJ

1n9/quiasse sebessaipe p

aexe]uAS SIPOW

L = AIS eyoueiq

Q = As euoueiq

jueuia}no12p

@ = NS eyoueiq

@ = z Is euoueiq

L=NIS euoueiq

AN NW W'v

L = Z IS euoueiq

L = 9 !S euyoueiq

uoneodO

919

SAS

9A8

x4u8

148

3Ng

IWg

118

038

S9a

enbuoweuy

124

NEO SglHpou sINn8}89/PUJ

1840 149 1840 149 iedo# Ad9

49d0 Xd9 4ed0 xd9 1edo# xXd9

A‘(18d0) 4W9 (x'18d0) 4W9

A‘18d0 4W9

x'19d0 4W9 4ed0 4W9 x'1ed0 4W9 19d0 4W9 do# 4W9

S29]20,p 1N8/QUW8SSE 91/QUON axeJuAS

njosge 019z eBed Jelpauuuul

njosqge 019z o6ed Jepeuul

À'(9811pul) (xX'81/pui) A'njosqe x'njosqge njosqe x'019z eBed 019z e6ed le/pauiuui

sebessaeipe p

Sepoy

sineze2ipul

sine}e9lpul

Ssine}e9pu!

N—A lueains sa] euuorisod

W—Xx jueains se| euuoriIsod

N—v iueains sa] euuorisod

| |

uone19dO

nu

125

LE XNI e}o1duul

X'18d0 AN Jedo 5NI

x'1ed0 5N] 48d0 5NI

x'njosqge

njosqe x'019z eBed o19z eBed

A'18d0) 403 A‘(39811puI)

(xX'18d0) 403 (x'9811pui) A'18d0 H03 A'nlosqe x'18d0 403 x'njosqe

48d0 403 nosqe x'18d0 403 x'019z eBed 48d0 403 0192 Bed 18d0# 403 1elpguuul

eoljduut

eyoijduul

x'18d0 53q x'njosqe 48d0 53q njosqe x'18d0 93q x'019z eBed e. ee ee © Z NN 1940 953q 0192 eBed Pa No Z N | se00,p Jna/quesse sebesselpe,p SIN9189/puJ 8/QUION exejuAS sapoy

XEL+X

WeIL+W

uge11q

HSn|9xe ,, no k. vV+W © v

uone1240

Jo au

XSLEX

Wei—W

XNI

ONI

403

A3Q

3

_f

93q

anbluouauy

126

NNNMM © om

. 0. 0 0 Z NN

NNNMMMANN Q [re]

99 9+

89

NS QI SglJIPOUI

s1N8]29/pu/ 2/QUON | 8p0]

A'(18d0) ya7 (xX‘12d0) y q7

S19120,P | VX3H 1nejquesse

axeJuAS

A'12d0 xq7 Jedo xa7 A'1d0 xgq7 4ed0 xq7 Jedo# xq7

A'10d0 yg7 x'18d0 y q7 4ed0 \q7 x'18d0 yq7 18d0 \g7 1edo# \q71

(1edo) 4Wr 18d0 4Wr

ANI

AnIosqe njosqe ÀA'019z eBed 019z Bed ielpauiuul

A'(081/pul) (x‘19811put) A‘nlosqe x'njosqe njosge x'019z eBed 019z eBed jelpauiuil

19811puI njosqe

sabesseipe,p

SepOW

X-W

V+W

H9d+{(Z+9d) 19d+(1+9d) +94 eliduse

H9d+(T+9d) 19d+(1+9d)

AFLTA

uonei9d0O

127

xa71

va

usr

dr

ANI

,

enbluoweuy

J_ veu)

A'{8do0) yvO A‘(eupui) {(xX'18d0) y4O (xX'10e11pui) A'18d0 YHO Anjosqe x'18d0 vHO x'njosqe 18d0 YHO njosqe x'18d0 yyO x'019z eBed 1edo yHO 0187 eBed uqe1q,.1nO. 18d0# YHO Jelpauuuul VWNAV

- NNNMMMANN -

39 x'18d0 4s7 x'njosqe

£ 3ÿ 4ed0 4s7 njosqe

2 x'18d0 yS7 x'019z eBed

t 9+ 4edo 4s7 019z eBed e}loip e e. ee à Zz ÿ L vt #S71 | 1neje/nwnose 11q un,p e6e/e99p

x'18d0 1g7 x'njosge

48d0 1g7 njosqe x'18d0 4g7 x'019z eBed 4edo 1g7 o19z eBed Jodo# 1 7 lelpauuuui

vo dON Le nr Jna/quesse sebessaipe p : ° ss Joue

ÉD ZAN seypou SIN9)89/PUJ

\ gq

S19120,P 9/QUION

Nan 9177 SalJIPOu S1N8}29/PUJ

S2920,p 91/QUON

ewuweiBoid-snos 8p 1n0191 uoljdn118}uI p 1n091

x'1ed0 HO x'njosqge

4ed0 HOH njosqe

x'12d0 HO x'019z eBed Jed0 HOH 019z ebed 2}01p e HO | 1neje/nuwunose 11q un,p uolje]oH

x'18d0 104 x'njosqe

4edo 704 njosge

x'‘12d0 104 x'019z e6ed 12d0 104 019z e6ed eyonef e 7104 | ineje/nwunose 11q un, p uolje]oy

d elidep v elidep

d elidus

1najquiesse sebesseipe p

exejuAS Sepow HOA81000

104 Um ner

enbIuougun

129

t4 A'(8d0) y1s A'(19811puI) rA (x'18d0) y1s (x'9811put) A'18d0 Y1S A'nIosqe £ x'10d0 y1S x'njosqe £ 1240 Y1S njosqge t x'18d0 y1S x'019z eBed VA 42d0 15 0197 eBed A A'(18d0) gs A'(19811put) (x'18d0) gs (xX'19811put) A'18d0 9gs AnIosSqe x'18d0 9gsS x'njosqe £ 1840 5gsS njosqe t x'‘19d0 9gs x'019z eBed t 4ed0 5gs 019z eBed NIET: ZEN CA sedo# 9gs jelpeuuuil

NOMME INZEN

SgyIpou S1N929/PU)

S19]20,p Jna/quesse sabesseipe,p 8/QUON sexeuAS SapOW

W+v vis

[Xi 13S Gt a3s 21 93S

V+I9-W—v

uoneiad0 anbIuUouauny

130

IPROUEZLN SayIpou SIN8J89/pU/

S29]20,p 91/QUON

e}l91duul

eyoijduul

eyoiduul

eyolduul

njosqe X'019z eBed 019z e6ed

4edo X1S njosqe A18d0 XIS ÀA'019z eBed 4edo X1S 019z e6ed

In8Jq esse sebessae/pe p SaxejuAS SS2pOW

uoneisdO

131

Imprimerie de la Manutention à Mayenne Dépôt légal: avril 1984 d’Éditeur: 4085

Bien sûr, votre ORIC sait compter à une vitesse vertigineuse, calculer sans erreur des courbes mathématiques complexes, il sait comment extraire des racines carrées en un clin d'œil, et bien d'autres choses encore.

Mais cela, tous les ordinateurs, du plus gros au plus petit, savent le faire. (ORIC-1 à la conquête des jeux » se propose de vous entraîner dans un tout autre univers de programmes, celui des jeux, des dessins en couleur, des sonorités synthétiques in- formatiques. Vous y rencontrerez une gentille petite chenille, six caméléons et quelques gloutons. Vous voyagerez dansl'espace intersidéral. Vous verrez la tour de Hanoï, un grand mur de briques. Vous vous mesurerez au Master-Mind.

Nul doute qu'après tout cela, vous désiriez mieux connaître

_ votre ORIC-1 et, pourquoi pas, programmer vos jeux. Pour vous

aider et vous guider dans ce labyrinthe aux 65536 adresses, «ORIC-1 à la conquête des jeux» vous révèle le contenu de la mémoire de l'ORIC-1, comment redéfinir les caractères, tous les trucs des modes HIRES et TEXT, et même, mais oui, comment fabriquer des lignes de programme Basic avec un autre program- me...

Bon amusement |

EYROLLES 8673

A tif

(CA vusvat XNf S10 ALNÔNOD NI VI-INO rl