MICRO-ORDINATEURS

ALMOS a La | d AONQUÈTE DES JEUX

Jean Yves QU

EYROLLES

ATMOS

A LA CONQUËTE DES JEUX

«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 de ses ayants droit ou ayants cause, est illicite» (alinéa 1°’ de l'article 40)».

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

© Éditions EYROLLES, 1984

ATMOS A LA CONQUETE DES JEUX

par

Jean-Yves ASTIER

Collection animée par Richard SCHOMBERG

61, boulevard Saint-Germain 75005 PARIS

EYROLLES 1984

SCHOMBERG SCHOMBERG HERNANDEZ NOLLET PELLIER LADEVIE QUEINNEC PELLIER ASTIER

MONTEIL LEPAPE OROS et PERBOST

PERBOST

Dax

NOLLET

BICKING

TEJA MONTEIL

PLOUIN

SAGUEZ

PELLIER

ORoS et PERBOST GROS

HARWOOD HARTNELL HARTNELL et JONES VULDY BOUQUEROD PINSON

WILLARD

CEYRAT DELANNOY AUBERT

PERBOST et MASSE TERRAL

ASTIER

MONTEIL MONTEIL

ORos WILLARD KRUTCH ASTIER PELLIER

SAGUEZ et ANDRIEUX

DE GEETER ASTIER

CROWTHERet HARTLEY -

MONTEIL

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 N°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 | et lil. 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 Il.

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.

T1 99 à la conquête des jeux.

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

Langage machine, trucs et astuces sur ZX SPECTRUM. Maîtrisez les interfaces de votre micro-ordinateur. Forth par micros.

ATMOS à la conquête des jeux.

MO5 et TO7 à la conquête des jeux. Introduction à l'IBM-PC Junior.

LOGILIVRES EYROLLES (logiciels sur cassettes)

P ELLIER

PELLIER

PELLIER

P ELLIER PERBOST et MASSE H ADDADI

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.

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

Service «Presse », Éditions EYROLLES 61, Boulevard Saint-Germain,

75240 PARIS CEDEX O5,

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.

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/ATMOS à la conquête des jeux’ se pro- pose de vous guider dans cette jungle peuplée d'insectes voraces, de vaisseaux spatiaux, de couleurs et de sons étranges. |

La première partie de cet ouvrage contient quinze jeux pour ORIC/ATMOS, 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/ATMOS 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/ATMOS, com- ment écrire un programme basic qui fabrique des lignes de pro- gramme 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 du livre “L'assembleur facile du 6502”, qui vous livrera tous les secret du micro-ordinateur 6502, cerveau de votre micro-ordinateur.

VII

Table des matières

ANANEDIODOS 2e UV RES ES Mn era el Ra das SNS VII 1. Quelques jeux pour ORIC/ATMOS ....................... ] ROGUE ARR Se nue ou at aan a l RO ROTIBRRS a ie cn ane Ne D NI SUR Re 5 1 CO AMÉICONS Li au ina td Rte NU Rare 7 LC aChe AMDON: re Muni horde hais iu 12 1592 “TOUT AE MONO 5:54: La dur EN AR M Ra dues ent 16 É0> -Solutionde MHtour HANOL ir sait in is ua une 20 Li CHE ELONOS LE RNA nn Pr Nat a teue 24 HS: :VOoyase dans l'ÉSDACÉ ss rm iii a ie did éiduee 30 F0 ONE 4 ne Dual au na te dote Ta edh idtaia 33 LAID ENCMES 0 2. ile induit silos 39 LP MU de OPIQUES Le A Radiateur ei 45 LA DA Ie HAN MR RL Le dd did ee ua 48 1:13: Master MIN 55 ia dire aa delai ions 52 L'IAS PDEAUÉS nds roc amo se troie ec 57 EDS PET IR UN di een ia mi te bi D ouae 61 2. Quelques renseignements utiles pour programmer vos jeux ....... 66 2.1. Gestion de la mémoire de l'ORIC/ATMOS .............. 66 2.2. Comment redéfinir les caractères ..................... 76

3.

2.3. Trucs et ficelles des modes TEXT et LORES ............. 2.4. Trucs et hicelles du mode HIRES: 53:52 eue 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 ..........

ARE en dd aa ali ee idee ailes de

3:1: Tab: ASCH lORIC/ATMOS: 3 els. sinus 3.2, Tabledes attributs VIdéO ::2::.13 heures auta 3.3 LetieroprocessEur OM Li ris didier r ie rte

107

107 114 118

1

Quelques jeux pour ORIC/ATMOS

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. À la fin, on vous demande si vous désirez rejouer. Frappez alors la touche O” 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'insecte.

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.

109 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 1999 fois, après quoi le jeu est fini. Nous allons maintenant détailler ce qui se produit à l’intérieur de cette boucle.

159 2@»RND(1) est un nombre aléatoire compris entre @ et 19.9999999. Si ce nombre est plus petit que 29-F, on se branche en 199, sinon les lignes 169 à 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, 20-F vaut 1 et le test sera vérifié 1 fois sur 20 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 2 et 39.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 C est compris entre 49 et 57.9999999, Puis, si RND(1)2>.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 2 et 39

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

210

220

230

249

260

270

280

290 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 à 2, 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 à 39, 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 Ÿ 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 34.

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

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

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

ligne 410 10

340

Note :

réinitialise l’'ORIC comme lorsque vous frappez reset ”.

REM GLOUT ON % 2 36 26 3636 36 36 36 36 DE DE DE DE DE DE EE

REM DEFINITION BESTIOLE----------- S=46080+8*64

DATA 33,18,12,12,12,12,18,33

FOR 1=S TO S+7:READV : POKEI ,V:NEXT

TEXT:CLS:PAPER 2:INK 0:G=64:P=0

PRINT :INPUT'"Force (1-20) "3;F:CLS PRINT CHRé&(é); X=2:Y=2:X1=X:YI=Y:PLOT X,Y,G

REM JEU------———— FOR COUP=1 TO 1000

IF 20xRND(1)€20-F THEN 190 G=2+38XxRND( 1) :R=27#RND( 1) C=49+9xRND C1 > : IFRND( 12 >. STHENC=1 70 IF SCRN(G,R)D<>G THEN PLOT G,R,C AS=KEYS:IF A$="" THEN 320 A=ASC(AS)

IF A=SANDX)2 THEN X=X-1:GOTO 260 IF A=SANDX<39 THEN X=X+1:GO0T0 260 IFA=10ANDY {26 THEN Y=Y+1:GOTO Z60 IFA=11ANDY>0 THEN Y=Y-1:GOTO 260 GOTO 320

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

PLOT X1,Y1,22:Xi=X:Y1=Y

IF V>128 THEN V=U-128

IF V=42 THEN 340

IF V<49 OR U>57 THEN 320 2AP:P=P+V-48:GOTO 320

NEXT COUP:WAIT 300:GOT0 350

EXPLODE :WAIT 300

le caractère ”£” est à remplacer par #7.

350 CLS:PRINT :PRINT :PRINT :PRINT :PRINT 360 PRINT SPC(13) ;"Score:"3:P:;CHR$&(6G) 370 PRINT :PRINT |

380 PRINT"'Voulez-vous rejouer CO/N) " 390 GET ÀAS$:IF ÀAS="0" THEN 80

400 IF AS<>"N" THEN PING:GOTO 390

410 CALL DEEK(£FFFA)

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

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

150 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%X, qui est un entier compris entre 3 et 36.

200 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 à 410, qui affiche le nombre de caractères trouvés.

320

330

349 360

370

380

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$(32).

On élimine le caractère CHR$(32) 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.

10 REM REFLEXEXxXxX xxx xxx xxx XXE EEE EX Æ 20 :

30 PAPER 2Z:INK O0

40 CLS: PRINT :PRINT:PRINT

J0 PRINT" Des caracteres ":

60 PRINT'"'apparaissent"

#0 PRINT'"'au hasard sur l‘’ecran."

80 PRINT" I1 faut frapper le plus" 70 PRINT'vuite possible sur la touche" 100 PRINT'correspondante."

110 1 20 1:30 140 150 1 60 1 70 1eû 170 200 210 220 230 240 290 260 2/70 280 290 300 310 320 330 340

410

PRINT

PRINT" --dles lettres majuscules" PRINT" sS‘’obtiennent avec SHIFT" PRINT :INPUT'"'Delai maximum " ; DELAI B=32:B$S=CHRS(B) +CHR$SCB) +CHRS(E) S=0 CLS: PRINT CHR$&(17) : CHR$&(ZO)

PING:WAIT 100 X4=2+ INT (34#RND( 1) YA=3+INTE21#RNDC 13) CX=33+ INT (93X#RND( 1 ))

IF C#=96 THEN 210 FORI=-1TO01:PLOTXA-1,Y%+1,B$:NEXT PLOT XX2,YX,C%:2ZAP

FÜR I=i TO DELAI STEP .002 IFKEY#=CHRS (C2 THENS=S#+ 1 : GOTO1 80 NEXT I

EXPLODE:WAIT 200

CLS:PAPER 1:INK 7 AS=CHRS(10)+"SCORE:"+CHRS(B) SCHE=STRÉ(S) SCH=RIGHTÉCSCE , LEN(SCH)D-1) A=AŸ+SCE X=18-INT(LEN(ASE)/2)

PLOT X,11,4$:PLOT X,12,A$ PRINT CHR$#(17):CHR$(20) PRINT

PRINT'II fallait frapper ": PRINT CHR$(C)

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.

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

99 On affiche comme précédemment le caractère de code ASCII , 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 309 à 399, on déplie et on replie la langue du caméléon.

300 Y1 est l’ordonnée de la langue, qui est horizontale.

319 La langue va se déplier de la droite vers la gauche, depuis X1=32 jusqu'à X1=32—3+B.

320 Produit une note.

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

340 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. 369 Identique à 320.

379 On affiche V et un blanc, de code 32.

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

En 494, l'instruction CALL #F8D0 recharge les deux jeux de caractères auxquels vous êtes habitué.

REM CAMELEONSXXXXXEXXEXEEEXREMXXRXEX

TEXT : PAPER 0 :1INK 1:CLS:GOSUB 1000

REM TRACE CAMELEONS ET INITS------ CLS : INPUT" Force (1-20) ":F:CLS MAX=S3000/(F+5):FOR I1=1 TO 7

PLOT 33,3%I,1:PLOT 34,3%1I ,H$

PLOT 33,3%*1+1,1:PLOT 34,3*x1+1,P$#

NEXT I:SC=0

REM JEU---—— FOR COUP=1 TO 40:Z=FRE("") X=1+INTÉP#RNDC 13) :X=3#X4+1 Y=1+INTC7#RNDC 12): Y=3%Y

PLOT X,Y,1$%

FOR I=i TO MAX A$S=KEYS:IF AS<>"" THEN 220 NEXT I1:GOTO 420

10

220

2930

450

910

1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 110û 1110 1120

FOR J=1i TO MAX B$=KEYS:IF B$<)>"" THEN 260

NEXT J:GOTO 420

IF A$<"1" OR A$>"7" IF B$<"1" OR B$>"9" =VAL (AS) : B=VAL (ES) Yi=3%A

FOR X1=32 TO 32-3xB STEP -1

SOUND 1,1000/€(X1+3),0:PLAY1,0,7,0 PLOT X1,Y1,L#:NEXT X1

V=SCRN(X1 ,Y1)

FOR Xi=32-3*xB TO 32

SOUND 1,1000/€(X1+3),0:PLAY1,0,7,0 PLOT X1,Y1,V:PLOT X1-1,Y1,32 NEXT Xi

THEN 420 THEN 420

IF V<>115 THEN 420

PLOT 32,Y1,32:SC=SC+1:2ZAP:WAIT 70 PLOT X,Y,32:PLAY 0,0,0,0

NEXT COUP

PLUT 12,12," Score: "#+5STRSCSC)

PLOT 6,15,"On recommence (O/N) ?" GET ÂA$:IF A$="0" THEN 60

IF 4$S<)>"N" THEN PING:GOTO 470 CLS:PAPER 2:INK O:CALL £F8D0

END

REM DEFINITION CARACTERESxxxxxxxX

DATA 33,18,12,12,12,12,18,33 DATA 0,0,0,0,0,63,0,0

DATA 0,0,3,14,63,63,15,3 DATA 0,0,48,24,60,40,25,643 DATA 0,0,0,0,0,0,60,26

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

DATA 2,3,3,7,14,28,56,48 DATA 55,63,29,55,30,7,0,0 DATA 63,45,55,31,62,56,0,0 DATA 8,40,56,56,28,14,7,3

S=46080+115*8:F=S+10*8-1 FOR I1=S TO F:REÂD V:POKEI ,V:NEXT

1130 1140 1150 1160 1170 1180

IB=CHRS (115) :LE=CHRE( 1 1 6) H$=CHRS (117)+CHR#Ç118) +CHR&( 119) H$=H$+CHRSE ( 1 20 ) PS=CHR$(121)+CHR$&C 122) +CHR$& (125) P$=P#$+CHRSE( 124)

RETURN

Note: le caractère ”£” est à remplacer par ”#”.

11

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

ed L Ge E.

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

30 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 pro- grammable, il interromprait les trois notes.

49 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 DS.

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 H$.

69 X et Y 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 à 289. 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 on ajoute un caractère CHR$(2). CHR$(32) est un caractère blanc, qui sert à effacer le der- nier chiffre affiché lorsque l'on passe de 1 400 à 999, de 109 à 99 et de 19 à 9.

120 On lit le clavier et l’on place le caractère lu dans K$.

130 Si l'on a frappé ‘flèche à gauche”, on décrémente l'abscisse du curseur.

13

149

159

160

180

190

209

219 229

230

259

260

279

14

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. Il 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(l) 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—SQOR(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 A+A 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 25%.

D% est nul, on vient de trouver l'objet I. On l'indique avec F{l)}=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 I. 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.

M% 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=—0. Puis on a, en 250, 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 279, P% contient la valeur adéquate pour que seuls les notes correspondants aux objets non trouvés soient jouées.

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

329 Il ne faut pas oublier le ;. Ainsi les messages des lignes 320 et 330 seront-ils sur la même ligne.

349 à 389 On reconnaît l'indicatif de ‘’ Rencontres du type”.

399 CHR$(6) rétablit le bruit produit par le clavier, qui avait été supprimé à la ligne 30.

. Lorsque vous avez découvert les trois objets, on exécute les lignes 419 à 450 et l’on recommence le jeu.

10 REM CACHE-TAMPON x x 3% 2% 2-2 26 DEEE NE NE NE EEE

30 PAPER 1:INK O:PRINT CHR$#(é6):CLS

40 W=1000 : GH=CHRS ES) : DÉ=CHRE( 7)

50 B$=CHRSE (10) : H$=CHRE CS 1 1 )

60 X=2:Y=0:DIM X(3),YC3),F(3)

70 FOR I=i TO 3:XCI1)=INT(38xRND(1))+2 80 YCI)D=INT(É27#RND 1 ) ) :=NEXT

70 :

100 FOR T=W TO 0 STEP-I

110 PLOTIS6,13,CHR$SC2Z) +STRSCT) +CHR&( 32) 120 K$=KEYS:1FK$=""THENUWAITI10 :GOTO280 130 IF K$S=G#SANDX>2 THEN X=X-1 : GOTO1 80 140 IF K$S=DSANDX<39 THENX=X+1 :GOTO180 150 IF K$S=B$SANDY<26 THENY=Y+1 :GOTOI80 160 IF K$=H$SANDY>0 THEN Y=Y-1 : GOTO180 170 GOTO 280

180 PRINT K$::P#=0:M#=1000

190 FORI=3STOISTEP-1:I1F F(I1)=1 THEN270 200 A=X-X(1):B=Y-YCI) :DA=SGR A *XA+BEXE) 210 IF D<>0 THEN 250

220 EXPLODE:F(CI1)=1:N=NtI

230 IF F1) AND F2) AND FC3)THENAID 240 GOTO 280

250 SOUND 1,80*xD7%,0:PA=P4+27(I-1)

15

260 IF DÆ<M4 THEN MA=D%

2/70 NEXT:PLAY P%,0,3,100xM%

280 NEXT T

290 :

300 CLS:PAPER 2:INK 0

310 FOR I=i TO S:PRINT:NEXT

320 PRINTSPC(4);"Vous avez trouve ": 330 PRINTN:'"bidules":PLAY 1,0,7,10 340 MUSIC 1,3,3,15S:WAIT 80

330 MUSIC 1,3,5,15:WAIT 80

360 MUSIC 1,3,1,15:WAIT 80

3/0 MUSIC 1,2,1,15:WAIT 80

380 MUSIC 1,2,8,15:WAIT 80

390 PLAY 0,0,0,0:PRINT CHR$#(é) : END 400 :

410 FOR I=i TO 3:F(I1)=0:NEXT

420 W=INT(2*%W/3)

430 MUSIC 1,3,10,0:PLAY 1,0,3,1500 440 WAIT 400:PLAY 0,0,0,0

450 GOTO 70

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

1.5 TOUR DE HANOÏ

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 ést 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.

Voici un exemple avec deux disques:

16

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

1°" 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 (0, 1,2)? Tapez O puis RETURN. On vous demande encore: Tige d’arrivée (9, 1,2)?

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:

9,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.

69 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 ÿ sont enfilés.

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

230 On trace une tige verticale.

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

279 Le sous-programme 1919 empile le disque numéro A2 sur la tige numéro A1. La boucle 269-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. 350 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.

18

360 Si la tige d'arrivée A3 est vide, pas de problème, on peut prendre le

370

390

400

410

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

Le sous-programme 2919 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.

10 REM TOUR DE HANOI##XXxHXXEXXKKEEREÉEX 20 ?

30 TEXT:CLS:PRINT:PRINT

40 INPUT'Nombre de disques ";N

50 IF N<1i OR N>i0 THEN PING:GOTO 60 DIM TIGE(2,N-1)9,7T(C2)

70 INPUT'"'Tige de depart (0,1,2) "3DE 80 IF DE<{0 OR DE>2 THEN PING:GOTO 70 9Q INPUT"'Tige d’arrivee (0,1,29 ";3AkR 100 IF AR<O OR AR>I2 THEN PING:GOTO 90 110 IF AR=DE THEN PRINT'P#$f !":GOTO/70

210 HIRES

220 FOR I=i TO 3

220 CURSET&Ox1-40,199,3:DRAW 0,-150,1 240 CURMOV -2,-15,3:CHAR 1+47,0,1

Z50 NEXT I

260 FOR I=N TO 1 STEP -1

270 ÀAI=DE:A2Z=I:GOSUE 1010

280 NEXT I

270 :

310 REM DEBUT TRAITEMENT ---------———- 320 INPUT'"Depart,arrivee (0,1,2) ";A1l,A3

19

430

1010 1020 1030 1040 10Sû 1060 1070 1080 1090 1100 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100

IF ÀAS<O OR À3>2 THEN PING:GOTO320

IF A1<0 OR À1>2 THEN PING:GO0OTO320

IF T{A1)<=0 THEN 360

IF T(A3)<=0 THEN 390

IF TIGE(AI,T(A1)-1)<TIGE(AS,T(AG)-1) THEN 39 £AP:WAIT 30:EXPLODE:GOTO 310

GOSUB 2010 :A1=ÀA3

GOSUB 1010

IF TÉAR)D<N THEN 310

END

REM S-PROG EMPILE DISQUEXxxxxxXxxx Li=190-10%*T A1) :C1=80x*41+39 CURSET-/8*%x(A120)-84#x(A12>1),L1,3 FILL 10,1,42-/*xINTC(A2-1)/7)

CURSET?72-84#(A120)-78x(A12>1) ,L1,3 FILL 10,1,7

GOSUB 2060 TIGE(A1,T(A1))=A2:T(A1)=T(A1) +1 RETURN

REM S-PROG DEPILE DISQUExx*xx*x*#x#2x%x T(A1D=T(A1)-1:42=TIGE(AI ,T(A1)) Li=190-10%T(A1) :Ci=80xA1 +39 CURSET-78*%(A1>0)-84%x(412>1) ,L1,3 FILL 10,1,7

FOR J=0 TO 9?

CURSET Ci-3xA2,L1+J,3

DRAW 6x%A2+1,0,2

NEXT J

RETURN

1.6 SOLUTION DE LA TOUR DE HANOÏ

Ce programme, qui résoud le problème de la tour de Hanoi, 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. Il 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)

Fin

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 429-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 HANOIXX*x#XxxXxXx%x

30 TEXT:CLS:PRINT:FRINT

40 INPUT'"'Nombre de disques ":iN

50 IF N<i OR N>10 THEN FING:GOTO 60 DIM TIGEC2.N-1),TC2),PYLEG100) :PP=0 70 INPUT'Tige de depart (0,1,29 ";DE 80 IF DE<O OR DE>2 THEN PING:GOTO 70 90 INPUT'"'Tige d’arrivee (0,1,29 ";AR 100 IF AR<O OR ÀAR>2 THEN PING:G0OTO 90 110 IF AR=DE THEN PRINT'P#$f#f !":GOTO/O 120 :

210 HIRES

220 FOR I=i TO 3

230 CURSETS80*1-40,199,3:DRAW 0,-150,1 240 CURMOU -2,-15,3:CHAR 1+47,0,1

7

250 260 270 280 270 310 320 330 340 410 420 430 440 450 460 470 480 490 900 910 520 930 940 900 960 9/0 980 990 600 {1Gi10 1020 1030 1040 1050 10460 10 70 1080 1090 1100 2010 2020

NEXT I

FOR I=N TO 1 STEP -1 A1=DE :A2=I :GOSUB 1010 NEXT I

RE DÉBUT. TRAETEMENE ESS BIi=N:B2=DE:B3=AR:L=1:GO0OTO 410

END

REM S-PROG HANOIXKEHEEXKEERXEXEXEXEX PYLE(PP)=L:PYLE(PP+1)=B1 PYLE(PP+2)=B2:PYLE(PP+3)=B3 PYLE(PP+4)=B4:PP=PP+5

IF Bi<>1 THEN 510 Ai=B2:GOSUB 2û010

A1=B3:GOSUB 1010

GÜTO Séû

B4=5-B2-Eb53

Bi=Bi-1:B3=B4:L=2:GOTO 410 Bi=1:R3=PYLECPP-2) :L=S3: GOTO 410 Bi=PYLE(PP-4-1:B2=B4:L=4:G6G0OTO 410

PP=PP-5 : B4=PYLE(PP+4) B3=PYLE(PP+3) : B2=PYLE(PP+2) Bi=PYLE(PP+1) :L=PYLE(PP)

ON L GOTO 330,530 ,540,550

REM S-PROG EMPILE DISQUExx*x##x%#%x Li=190-10%T(A1) :C1=80*xA1+39 CURSET-78*(A1>0)-84x(A12>1),L1,3 FILL 10,1,42-7*INT((42-19/7) CURSET72-84#(A1>0)-78*x(A12519,L1,3 FILL 10,1,7

GOSUB 2060 TIGE(AI,T(A1D)=A2:T(A1)=T(A1) +1 RETURN

REM S-PROG DEPILE DISQUEXxxx*Xxxx xx TCALI=T( A1) -1:A2=TIGEC AI ,TCA1))

23

2030 Li=190-10#T(A1) :C1=80*xA1+39 2040 CURSET-78*#(41>0)-84#(A12>1),L1,3 2050 FILL 10,1,7

2060 FOR J=0 TO 9

2070 CURSET Ci-3*A2,L1+J,3

2080 DRAW 6*%A2+1,0,2

2090 NEXT J

2100 RETURN

1.7 CHUTES D'ÉTOILES

Après ces deux programmes sur la tour de Hanoi, 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. II 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 CHR$(9) au début de chacune des 27 lignes de l’écran. Ce caractère impose au système vidéo de l’ORIC l'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 à 169, sert à redéfinir les caractères semi-graphiques employés, ainsi que quelques constantes.

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

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

24

109 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 à 140 Le vaisseau est obtenu en affichant trois chaînes T$(@), T$(1) et T$(2).

_ ft Le L Du :

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 CHR$(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 CHR$(7). Enfin les quatre blancs de la chaîne 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 229. 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 2 et 38.

299 En Z% 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

219

229

239 249

259 269 270 289

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.

On appelle un sous-programme en langage machine qui déplace l'écran d'une ligne vers le bas.

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%>6) 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.

SCRN(X%+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%.

A la ligne 30, on réserve 69 octets pour placer le sous-programme

machine, ce qui est fait en 1990.

1910 En #A6-#A7 se trouve la valeur de HIMEM, que l'on range en A. 1029-1939 On place 55 octets en mémoire à partir de A.

1940 Le sous-programme situé en À appelle lui-même un sous-pro-

gramme débutant en A+43. PL contient donc l'adresse de ce second sous-programme. En A+26, on trouve une instruction JSR vers ce second sous-programme. On place donc en A+21 l'adresse de ce second sous-programme.

* Décalage vers le bas de l'écran en mode TEXT ou LORES:

A21A A LDX #26 Initialise compteur de lignes. A9B8 LDA #5B8 L'adresse mémoire $BFB8 du 8500 STA Q premier octet de la dernière ligne A9BF LDA #$BF de l'écran TEXT est rangée en 8501 STA 1 Q-1.

AQ27 Tligne LDY #39 Initialise compteur de caractères.

26

A5QQ LDA 8592 STA A591 LDA 8503 STA 2O0XXXX JSR B1900 Treara LDA 9192 LDA 88 DEY 10F9 BPL CA DEX 19E9 BPL AQ27 Ligne@ LDY A920 LDA 9109 boucle STA CA DEY 10FB BPL 69 RTS

* Oter 49, nombre d A5QQ PL LDA 38 SEC E928 SBÈ 85909 STA B992 BCS C691 DEC 69 Retour RTS

TO = ND © es

n S

< <

Treara

Tligne

#39 #32 (@), Y

boucle

o

#40 o

Retour

(0)

L'adresse rangée en (9-1) est recopiée.

en (2-3)

puis

on retranche 40 à (9-1).

Prendre un octet et

le recopier à la ligne du dessous. décrémenter compteur de carac- tères

Si pas nul, continuer la ligne. Sinon, décrémenter compteur de lignes.

Si pas nul, passer à la ligne sui- vante.

La 1'° ligne de l'écran va être remplie de blancs (code 32).

‘octet par ligne, à (@-1):

Prendre l'octet de poids faible. Préparer la soustraction.

Oter 40.

Ranger l'octet de poids faible. Si retenue, retour.

Sinon décrémenter octet poids fort.

10 REM ETOILESX2x xx 26x66 262 XX XXE EEE EX

30 HIMEM €£9800-50:GOSUB 1000

40 B2=32:7/=33:0/%=34 :A4=3S 90 PAPER O:INK O:LORES 1:S=£fB800+8xTx

60 S=£BS00+8xTXx

#0 GOSUB 2000

80 XX=15:Y/=20

90 PRINT CHR#(1/7) ; CHR 20) 100 GS=CHRS (SG) : DE=CHRE( 7) 110 DIM T#&(C2) : B$=CHR#&(B/)

</

28

1 20

270 300 310 320 330 340 390 360 37/0 360 390 400 410 420 430 440 450 460 470 480 450 20 0 910 220

THCO)=CHRS( 93 +CHRE EC 7) +CHRECT A) +BF THCI)I=CHRE( 7) +CHRS C7) +CHRÉ CG) +5 TH(2)=B$+B$+BS+BS S=£BBSG+41:L=7:M=13

REM DEBUT DU PROGRAMME FOR T=i TO 400

£=3 7 #RND( 1 +2 PLOT2%,0,i1+6xRND(1) :PLOTZ2/+1,0,À% CALL À

POKE S,L:IF RND{1)<.STHEN POKES,M CS=KEYS

XA=X et CH=CGHANDXZ > 0) CH=DEANDXE < ) FOR I=CTO2:PLOTXA ,YA+I ,T$&CI) :NEXT IF SCRN(XA+2,Y/#-1)<247 THEN 290 IF SCRN(1,Y/-19=13 THEN 330

LAPS UZ=UX + SCRNCXZ + 1, Ye 1) Ê=FRE("")

NEXT T:WAIT 200:G0OT0 350

REM FIN DU PROGRAMME ----------——- FORI=OTO2:PLOT X2+1,Y/+I,1:NEXT EXPLODE :WAIT 300

TEXTSPAPER 2:INK 0:CLS

PRINT : PRINT : PRINT : PRINT : PRINT PRINT SPC(10):"Vous avez aqagne” PRINT : PRINT :PRINT

PRINT SPC(C15): CHR&(27)3:"A";:;

PRINT CHR#(27):"N"'sU%

PRINT SPC(15) ;: CHR&(27):"Â";:

PRINT CHR#(27) 53 "N"sU%: PRINT FRINTFSPRINTIEPRINISPOC(SIi97s: "points"

B= INT CUZ/20) : PRINT : PRINT : PRINT IF B=0 THEN SHOOT:GOTO 500

IF B>5 THEN EXPLODE:GOTO 5é0 ON B GOTO 510,520,530,540,550

PRINT'VUous etes nul.":GO0OTG 5680 PRINT'Pas terrible.":GOTO 580 PRINT'Bof ...":GOTO 580

930

990

J60

9/0

980

990

1000 1010 1020 1030 1040 1050 1060 1070 1080 10970 1100 1110 1120 1130 1140 1150 2090 2010 2020 2030 204û 2050

PRINT'"'Pas mal.":G0OTO 580

PRINT'Felicitations":G0OTO PRINT'Quel

280

score !!":GOTO 580

PRINT'Fantastique ! Formidable !"

PRINT CHR&(17) ; CHR#( 20) : END

REM SOUS PROGRAMME MACHINE x* # x xxx A=DEEK(£A6)

FOR I=û TO A+S54:READ V

POKE I ,V:NEXT

PL=4+43:DOKE A+21,PL

RETURN DATASAZ,f1A.£A7,€6B8,£85,£€00 ,£A9 DATA£BF ,£85,£01,€A0,£27,£A5,£00 DATAL8SS,£02,fA5,€601,£85,£03,£20 DATA£FF,£FF,£B1,£00,£91,£02,£88 DATA£10,fF9,£CA,£10,£E7,£A0,€27 DATA£AY,£20,£91,£00 ,£CA,£10,£FB DATA£ 60

DATA£AS ,€00,£38,£E9,£28,£85,f00 DATA£BO,£f02,£Cé,£f01,f£f60

REM CARACTERESR#KEXREEELEXELXXHEXEX FORI=STOS+23 : READV : POKEI ,V:NEXT DATA 12,12,12,30,45,45,45,45 DATA 45,45,45,63,45,33,33,33 DATÉ 0,0,12,30,30,12,0,0

RETURN

Note: le caractère ”£” est à remplacer par #”. Ne pas oublier les ; des lignes 399 et 419.

29

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!

30 On efface l'écran, on efface le curseur, le mot CAPS, on supprime le ‘’plop” produit par les touches du clavier;

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

30

59

60

89 99

100

119

149

159

169 219

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 ies 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 ou décrémente X selon la touche frappée.

à 139 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 facon aléatoire.

Le caractère CHR$(2) 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 CHRS$(3), ces mots seront donc jaunes.

10 REM VOYAGE DANS L'ESPACEXRXXEXEXREEX :

30 CLS:PRINTCHRE( 17): CHR 20) ; CHRE( 6) 40 FOR I=1 TO 27:PRINT:NEXT : PAPER 0 O0 X=14:Y=26:V=9:S=£fBBAB:L=S8

60 NA=0 :H7=492 : G$=CHRSE 8) : DÉ=CHREE 9) 70 :

80 FORI=1TOZ:PLOTZ+RNDE 10 #L,Y HA :NEXT 90 PRINT:K#S=KEYS

100 X=X+CKS=GEANDX D 1 ) -CKE=DEANDX< 34) 110 FOR I=0 TO 2

120 IF PEEK(S+X+I1)=H4 THEN V=U-1{:PING 130 NEXT:IF LVéi THEN 180

140 V&="H"+CHRSCV+48)+"H"

150 PLOT X,0,U#:N2=NZ+ 1

160 INK 1+7#xRND& 1) : GOTO 8

31

32

1 70 180 190 200 210 220 230

EXPLODE :WAIT 200:PAPER C:INK 3 PLOT 9,13,"Vous avez voyage dans” PLOT 11,15,"1l'espace pendant"

PLOT 8,17,CHR#(2) +STR$S (NY) + CHR#( 3) PLOT 13,17,"annees lumiere..." PRINT-CHRS (17) : CHR$ 20) ;: CHR C6)

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. A 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 séarabé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.

| | | | | |

anneau

anneau

sen est

| | | | | | | | | | |

_—— + = = = —_——

+ = + | punaise |

33

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%(I, 9), son ordonnée S%X(I, 1) et un pointeur PX(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:

34

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

S%(1,9)=1 S%(2, @)=2 S%(3, D)=3

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

SX(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=I. 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=PX(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.

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

S%(3, D)=3

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

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

SX(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, 9), SH(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 SXH(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.

35

REM CHENILLE xx 222 2% 3 36 26 36 36 26 36 3 3 x x x à x à x

GOSUE 1000 GOSUB 1200

REM LECTURE CLAVIER----------- _——- A$=KEYS:IF A$="" THEN 440 X=SACTETE,0) :Y=SXCTET, 1) :4=ASC(A#) IF A=S8ANDX>2 THEN X=X-1:GOTO 150

IF A=SANDX<39 THEN X=X+1:G0OTO 150 IF A=IO0OANDY<25 THENY=Y+1:G0OTO 150 IF A=11ANDY>O THEN Y=Y-1:GOTO 150 GOTO 70

REM DEPLACEMENT CHENILLE--------- PLOT SX(TETE,0) ,SXCTETE,1) ,C2 PLOT SX(QUEUE,0) ,S%(CQUEUE , 1) ,32 TETE=PÆ(TETE) : QUEUE=P%( QUEUE ) SXCTETE,0)=X:SXCTETE, 1)=Y VESCRN(X,Y):PLOT X,Y,Ci

210 220 230 z40 290 260 2/70 230 270 300 310 320 330 340 320 360 370 3380 370 400 410 420 450 440 450 460 470 480 450 900 910 920 230 54 0 9 90 J60 9/0 180 970 éü 0 610

IF V>128 THEN V=U-128

IF V=Ci OR V= C2 THEN 550

IF V<>C4 THEN 280

REM PUNAISE-----——————— ZAP:LL=1:GOSUB 450:G60T0 440

IF Vé>C3 THEN 340

REM ARAIGNEE----————————— ZAP:LL=3:GOSUB 650::F=F+1

MUSIC 1,5,1,0:PLAY 1,1,3,200

GOTO 390

IF V<ÿ CS THEN 440

REM: GROS SCARABEE-------- mme F=P-13:1F F0 THEN S50

MUSIC 1,3,8,0:PLAY 1,1,1,50060 LL=10:GOSUB 45û |

PLOT 10,26,"Je peux avaler”

PLOT 25,26.,STR$(F)2:PLOT 29,26,52 PLOT 247,268.,09

REM GENERATION INSECTES---------- IF RND(1)2>.08 THEN 70 V=INT(S1#RND (1 )) X=2+38XRND( 1) :Y=26#RNDE 1 )

IF SCRN(X,Y)€>32 THEN 70

V=INT(51 #RNDC 1 3)

IF Vidé THEN C=C3

IF V>10 AND V<47 THEN C=CS5

IF Véii THEN C=Ca

PLOT X,Y,C:GOTO 70

REP FERDLI = SSSR Rens ee mr nine EXPLODE:PLOTI6,13."Score:" LE=STRSE(L) LH=RIGHTS(LS,LENCLS)-1)

PLOT 22,13,L$H:PRINT CHR#<(6G) :

PLOT 10,15,"On rejoue (O/N) 7?" GET A$:IF A$S="0" THEN 460

IF A$S<2>"N" THEN PING:GOTO 600

37

38

620 630 640 6930 660 670 680 690 7/00 710 720 ioüû 1010 120 1030 1040 1050 1060 1070 1080 1090 1100 1110 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300

CLS: CALL £F8D0 : END

REM ALLONGER LA CHENILLE FOR J=1i TO LL:l=L+i PACL)=QUEUE : PACTETE)=L 92(L,0)=S/(QUEUE,0) SA(L,1)=SZCQUEUE, 1)

QUEUE=L NEXT J RETURN REM DEFINITION CARACTERES%*xXx3x2%2%%x DATA 33,33,30,18,18,30,33,33 DATA 30,51,33,45,45,33,51,30 DATA 33,18,12,12,12,12,18.33 DATA 0,0,18,12,12,18,0,0 DATA 12,12,45,63,63,45,12,12 5=46080+122%e FOR I=ST0S+39 :READV:POKEI ,V:NEXT Ci=122:C2=123:C3=124:C4=125 CS=126:DIM S4(600,1),P%<600) RETURN REM INITIALISATIONSEXX#EXXXHEXNRXX TEXT:PAPER 2:INK O:CLS L=S3:F=0:PRINT CHR (6): FOR I=i TO L SACI,0)=1+1:S2CI1,1)=1 PACID=I+1:PLOT 1+1,1,C2:NEXT I FA(L)=1i:TETE=L : QUEUE=1I PLOT L#E ft: CIIPLOT 152651 PLOT 10,26,"Je peux avaler" PLOT 25,26,48:PLOT 29,26,05 RETURN

Note: le caractère ”£” est à remplacer par #”.

L'ordre CALL #F8D0 de la ligne 620 recharge les deux jeux de caractères de l’'ORIC/ATMOS.

1.10 ENCLUMES

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

À 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 46080+8*64, ce qui signifie que l’on a redé- fini le caractère de code ASCII 64.

39

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 déssiné 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 trainée aérodynamique proportionnelle au carré de sa vitesse V1 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. 370 On calcule les composantes VX et VY de la vitesse. 389 On obtient alors la nouvelle position (X, Y)

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

40

Enfin, les lignes 519 à 559 terminent le programme.

10 REM JEU D'’ENCLUMESX##X#HEHXEXERXXR XX 20 :

30 REM DEFINITION FORME ENCLUME------ 40 DATA 0,30,63,30,12,30,0,0

O0 TEXT:FOR 1=46592 TO 44599

60 READ L':POKE I ,V:NEXT

80 REM TRACE MONTAGNE ----———————————— 90 PAPER 2Z2:INK 4: H=RNDI 10 #1.5+,.2

100 HIRES:P4PER 2Z:INK à

110 FOR 1=40 TO 117

120 J=INT(CI-40)*H+15SERNDC1))+1

130 (CURSET 1:177,32:DRAW''0:;,;-9.,1

140 NEXT I

150 FOR I=120 TO 199

160 J=INTC(199-1)#H+1S5xRNDC1))+1

170 CURSET 1,199,3:DRAU 0 ,-J,1

16D NEXT TiCURSET222-170,S:FILET:F.17 190 :

200 REM INITIALISATIONS-------———————— 210 X=0:Y=0:K=.005:6=9,.81

220 V=(RND(1)-,5)%5

230 PRINT'UENT:":U | 240 PRINT'"'DONNER LA VITESSE INITIALE" 250 INPUT VO

2OÙ0 PFRINT"'VENT: "AVS" VOST UD

270 PRINT'"'DONNER L'ANGLE DE DEPART" 280 INPUT À:PRINT

LU: PRINT VENTES SUR" VOD" SU0DErE" Ar" A 300 A=4/180xPI

310 VX=VO0OXCOS( A) :UY=UDXSIN(A)

so0 RKEM CALCUL TRAJECTOIRE-=--e-e-SS 340 VI=SQR(EUX-U)T24+UY" 2) :GI=K&VI "2 390 DT=15/V1+.1:D2=DT" 2/2

360 GX=-(UX-U)/UIXG1 : GY=-VY/U1#6G1-6G 370 VX=UX+GXX#DT :UYEUY + GYxDT

380 X=X+UXEDT+GXE#D2:Y=Y+UYXDT+GY*#D2

41

370

400 REM. AFFICHÂGE----———————————————— 410 2=199-Y:1F 2192 THEN 440

420 IF X>220 AND X<233 THEN Siû

430 PING:WAIT 200:GO0OT0 100

440 IF X<6 OR X>233 OR Z<0 THEN 340 450 IF POINTEIX,2)=0 THEN 470

460 EXPLODE:WAIT 300:GOTQ0 100

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

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

490 PLAY 1,0,4,100:GOT0 340

o0Q :

910 REM COUP AU BUT ---—-———————— mm 920 PAPER 1:CURSET X,192,3

JS0 CHAR 64,0,1:2ZAP:WAIT 40:EXPLODE 9540 PRINT:PRINTSPC(27):"Sprotch !!" 550 WAIT 400 :SHOCT

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

AS, 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 à 259.

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.

43

69

79

89 99

199

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

à 139 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.

209 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 35.

229 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 2760.

249 On efface l'ancienne balle en X, Y on trace la nouvelle en XA, YA.

259 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 brique rencontrée.

289 On efface cette brique.

di

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 à 429 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%-99f réalise toutes les initialisations néces- saires, variables, constantes et caractères.

Les lignes 1990 à 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.

REM MUR DE BRIQUESXX#xX2%xX32 3x2 XX EX XX GOSUB 50û

TH=KEYS:IF TÉ<D$S OR TE)AS THEN 170 CURSET XR,YR,3:CHAR B,0,0

IF T$=A$ THEN Ji=J2:GO0OT0 110

IF T$=B$ THEN Ji=-J2:GO0OT0 110

IF T$=C$ THEN I11=12:G0OT0 140

IF T$=D$ THEN Ii=-I12:GOT0 140 R=R+JI1:1F R<-RM THEN R=-RM

IF R>RM THEN R=RM

GOTO 170

XR=XR+11:I1F XR<MG THEN XR=MG IF XR>MD-7 THEN XR=MD-7 CURSET XR,YR,3

CHAR 12S+INT(R/J2),0,1

XA=X+UX DT : YA=Y+UY DT

IF XA<MG OR XA>MD THEN À=PI : GOTO3SO IF YA<MH THEN À=0:G0OTO 350

IF, YA>MB THEN 320

IF POINT(IXA,YA)=-1ANDYA<M THEN270

45

46

240 250 260 270 280 290 300 310 320 330 340 390 360 3/0 380 3970 400 410 420 430 90 0 9310 920 9330 940 990 J 60 9/0 980 990 600 610 620 630 640 650 660 670 680 6TÛ 700 71üû

CURSET X,Y,0:CURSET XA,YA, 1 X=XA:Y=YA:GOTO 50

XI=6kINT(XA/6) :YI=ékINT(I YA 6) CURSET X1,Y1,3:FILL 6,1,64 NEB=NB+1:PRINT:IF NB=NT THEN 1000 PRINT'Briques cassees: ":NB:EXPLODE A=Û0 :;: Z=FREC""):GOÜTO 3Sû

IF XA<XR-1 OR XA>XR+7 THEN 1500

A=R

=UX#COSCA) +UY#SINCA) UY=UX#SINCA)-UY#COSC A) : VX=U XA=XA+UXXDT : YA=YA+UY YDT : PING IF XA<MG THEN XA=MG

IF XA>MD THEN XA=MD

IF YA<MH THEN YA=MH

IF YA>MB THEN YA=MB

GOTO 240

REM INITIALISATIONSXRXxxXxXxXxXERXEXRXE TEXT:PAPER 2:INK 0 HIRES :RESTORE

A$=CHR$S( 11) FLECHE EN HAUT B$=CHR$S(10)’ FLECHE EN BAS C$=CHR$(T)' FLECHE À DROITE DÉ=CHR$S(S)’ FLECHE à GAUCHE PRINT : INPUT"Force (1-5) ":DT

IF DT<i OR DT>S5 THEN PING:GOT0590

X=120:Y=195" POSITION BALLE A=C(RND(1)-3/2) *PI/2

VX=COS (A) :UY=SIN(AD VITESSE BALLE XR=120 :YR=192" POSITION RAQUETTE

MG=0 :MD=239° LIMITES DE MB=199:MH=0" L'ECRAN M=100° MILIEU DE L'ECRAN

R=0” ANGLE RAGUETTE

720 730

700

780

990

1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100

J2=PI1/36’ INCREMENT ANGLE RAGUETTE 12=3*INCREMENT POSITION RAQUETTE RM=J2*%2"ANGLE MAXIMAL RAGQUETTE

NT=40*10’NOMBRE TOTAL DE BRIQUES NB=0 NOMBRE DE BRIQUES CASSEES REM DEFINITION RAGUETTES--------- DATA 0,0,0,3,12,48,0,0

DATA 0,0,0,0,7,56,0,0

DATA 0,0,0,0,0,63,0,0

DATA 0,0,0,0,56,7,0,0

DATA 0,0,0,48,12,3,0,0

S=f9800

FOR A=5+123*8 TO S+127*x8+7

READ U:POKE A,Ù

NEXT À

REM DEFINITION CARACTERE BLANC--- B=é4 FOR A=S+é4x8 TO S+é4x5+/

POKE À,63

NEXT À

CURSET 9,6,3:FILL 60,40 ,63 CURSET XR,YR,3:CHAR 125,0,1

RETURN

REM GAGNEXKEXXEXERERRERERENREXÉXX TEXT : CLS : PRINT : PRINT

PRINT CHR 4)

PRINT SPC(12) ; CHR$&( 27); "N°: PRINT CHR$(27)93:; "AB R À V O0" PRINT : PRINT : PRINT

PRINT SPC(10):CHRS(27)3:"J"; PRINT CHR$#(27)3;"EPLUS DE BRIQUE" PRINT CHR#(4) : PRINT: PRINT

GOTO 1530

47

1500 REM PERDUXXXXXXXEXEXEXXXAEXEXXX XX 1510 PRINT'SCORE FINAL:":;CHR$(27);"A": 1520 PRINT NB; CHR#$(27):;"à"3:"BRIQUES" 1530 PRINT'"'VUoulez-vous rejouer <CO/N) " 1540 INPUT T$

1550 IF T$="0" THEN 10

1560 IF T$<>"N" THEN PING:GOTO 1530 1570 TEXT:CALL £F8D0 :END

1580 :

Note: le caractère ”£” est à remplacer par ”#”.

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 JEUS% sert à y placer les bateaux. Bien que la grille fasse 19x19, ce tableau fait 12x12. Ceci pour simplifier la programmation du jeu. Le tableau COULES%S sera progressivement rempli de ‘’@'’ au fur et à mesure que des bateaux seront coulés.

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

199 On place en (19,1) un caractère 16 qui donne à l'écran la couleur noire, jusqu'à ce que l’on rencontre le caractère 29 placé par l'instruc- tion suivante, qui redonne à l'écran la couleur bleue.

48

130

200

210 229 230 249 259

300

350

419 429 430

440

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 À à 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 À 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 O et 9, on recommence.

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

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

on place un point sur l'écran.

519 520

Le bloc 519 à 550 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é.

49

539 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 569 à 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 à 650, on regarde s’il reste des bateaux à flot.

10 REM BATAILLE NAVALE x*x%3#32#32% 3263263232 X 2% XX XX 20 :

30 REM INITIALISATIONS-------------—- 40 CLEAR:DIM JEUX 11,11) ,COULEZ(4,4) PAPER 4:INK 7

60 CLS

80 REM DESSIN DE LA GRILLE----------- 90 FOR 1=3 TO 23

100 PLOT 10,1,16:PLOT 31,1,20

110 NEXT 1!

120 FOR I1=2 TO 11

130 PLOT 8,2*%I1,1+46:PLOT 7+2%1,1,1+63 140 NEXT 1

160 REM ON PLACE LES BATIMENTS-----—- 170 PLOT 10,25,"Je place les bateaux" 180 FOR TYPE=4 TO 1 STEP-1:UV=TYPE-I 1790 FOR N=i TO 5-TYPE

200 H=-ji:I1F RND(1)>,.5 THEN H=0

210 X=1+INTCC10+U#H) xRNDÉ 1 2)

220 Y=I1+INTÉCIO0O+UXC(NOT H))#RND( 10) 230 XF=X-Hxl

240 YF=Y-CNOT H)æxt

250 FOR I=X-1 TO XF+1

260 FOR J=Y-1 TO YF+1

2/0 IF JEUX(I,J)<>0 THEN 200

280 NEXT J

290 NEXT I

50

300 310 320 330 340 350 360 3/0 380 390 400 410 420 430 440 450 460 470 480 490 900 910 920 930 540 990 J99 960 3/0 380 9390 600 610 620 630 640 690

FOR I=X TO XF

FOR J=Y TO YF JEUX(I ,J)=TYPE#10+N NEXT J

NEXT I

COULEZX(TYPE ,N)=TYPE NEXT N

NEXT TYPE

REM DÉBUT DL JE PLOT 10,25,"Que jouez-vous: : GET AS:IF AS<"A"ORAS)>"K" THEN 400 PLOT 28,25,A$:X=ASC(AS) -64 GET AS:I1F ÀAS<"CO"ORAS:" 7" THEN 400 PLOT 29,25,A$H:Y=ASCCAS) -47

IF JEUZ(X,Y)€>0 THEN 510

PLOT 2xX+9,2#%Y+2,",."

PLOT 10,25," À l’eau. " WAIT 200:GOT0 400 TYPE=INT(JEUZ(X,Y)/10) N=JEUZ(X,Y)-10xTYPE

JEUZ&X ,Y)=0

COULECTYPE ,N)=COULEZCTYPE ,N)-1 PLOT 2xX+9,2xY+2,TYPE+48

EXPLODE : IFCOULEXCTYPE ,N)=0THENS9G

PLOT 10,25," Touche. » GOTO 610

PLOT 10,25," Coule !! " WAIT 200

FOR I=1i TO 4:FOR J=1 TO 4

IF COULEX(I1,J)<>0 THEN 400 NEXT J:NEXT I | PLOT 10,25," GAGNE !'!: :

1

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

Au début du jeu, on vous demande le nombre de pions à découvrir. Tapez 4, 5 ou 6 puis frappez RETURN.

À 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 pions, frappez RETURN. Si vous abandonnez, frappez ESC.

Tout autre touche efface le pion sur lequel se trouve le curseur.

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

De 49 à 90, 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 à 230, 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.

52

De 370 à 449, on remplit le tableau S avec X 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 5% à 1910.

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

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

570 Si on a frappé ESC, on abandonne, on va en 117.

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

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

690 Si l'on a frappé R, V, J, B, M ou C, on va placer un pion en 670. 619 Sinon, on place deux blancs pour effacer le pion et son code de cou- leur. De 639 à 650, 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% à 99, on analyse la proposition. On compte d’abord le nombre N de marques noires, puis ensuite le nombre B de marques blanches.

De 92ÿ à 980, on affiche la réponse de l’ORIC. Si on a X marques noires, la combinaison a été découverte et l’on va en 1109.

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

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

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

53

30 40 30 60 7üû G 0 70 100 110 1 20 1 560 1 40 150 1 60 1 70 150 190 zZûüG

ot À eur possibles

LL 1 I CL I TT

n +

REM MASTER MIND x 332613263202 1X6 Xe 26 26 26 36 JE Xe

REM INITIALISATIONS---——————--- P=125:R=P+1

FOR I1=£B400+8%xP TO £6400+8*xR+7 READ LV:POKE 1,4

NEXT 1

DATA 0,28,62,62,62,62,28,0

DATA 0,0,12,30,30,12,0,0

IN=Q : PA=2: INKIN : PAPERPA: CLS: FRINT

INPUT'"'Nombre de pions":X:1FX<40URX>6THENI 20ELSECLI FORI=1TOZ22:PLOTIS8+2ZxX,I,16+PAR:NEXT FORI=ITO22:PLOTIS,I,16:NEXT

FORI=24T025:PLOTIS+2#X,1,16+PA:NEXT FORI=24T025:PLOTIS,1,17+IN:NEXT PLOT 14+X,24,"Master"

PLOT 15+X,25,"Mind"

54

210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 0 910 320 930 340 990 960 9/0 980 590 600 610 620 630 640 6S0 660 670 680 690 700

DIM C6) :CHC1)="R": CSC 22="U" CH(3)="J":C#(4)="B":CSCS5)="M" C&Cé)="Cc"

PLOT 3,1,"couleurs"

PLOT 3,2,"possibles"

FOR 1=4 TO 11:PLOTIO,I,16+PA:NEXT FOR I1=4 TO 11:PLOT 5,1,16:NEXT FOR I1=5 TO i0

PLOT 6,1,1-4:PLOT 7,1,C$(I-4) NEXT

PRINT :PRINT :L=2

NC=1

DIM SX) ,FCX),FSCX)

FOR I=i TO X

SÉI)=INT(é#RNDC1))+1

NEXT I

REM DEBUT DU PROGRAME-----——————— FOR COUP=1 TO 20

FOR I=i TO IS:PRINT CHR#(9) : :NEXT PLU O9, "Notre

PLOT 2,18 ,"proposition?" É=FRE(""):PLOT 6,14,STRS$ (COUP)

GET T$:IF T$#=CHR$(27) THEN 1170

IF T$&=CHR$( 13) THEN 700

IF TS=CHR&CB)ORTS=CHRÉE( 7) THENS3C FOR I=1 TO 6:I1F T#=C$(I1) THEN 670 NEXT:PLOTPOS(0)-1,L," ":G0TO0S/0 IFPOS(0O) <ISANDT#=CHRS(S) THEN 570 IFPOSC0) >14+2#XANDT#=CHRS( 9) THENS70 PRINT T$;:T$::G0OTO0 570

PLOTPOS(0) , L,P:PLOTPOS(O)-1,L,I GOTO 570

PLOT dits u

55

56

710

aslt

770

1000 1010 102û 1030 1040 1050 1060 1070 1080 1090 1100

PLOT 2,18,"Voyons... "IWAIT 120 FOR 1=i TO X:F(1)=0:FS(I)=0:NEXT REM COMBIEN DE NOIRS ?

N= 0

FOR I=i TO X

IF SCID)<>SCRN(I4+2xI,L) THEN 790 FI)=1:FSiI)=1:NENt+I

NEXT I

REM COMBIEN DE BLANCS ©?

B=0

FOR I=1i TO X

IF F(I1)=1 THEN 9700

FOR J=i TO X

IF FS(Jo=i THEN 890

IF S(J)<>SCRNC(I4+2%xI,L) THEN 890 FCI1)=1:FSCJi=1:B=B+1:G0OTO 900 NEXT J

NEXT I

PP=19+2xX:IF N=0 THEN 950

PLOT PP,L,0:PP=PP+1 FORI=1ITON:PLOTPP ,L,R:PP=PP+1:NEXT IF B=0 THEN 980

PLOUF PRE PP=PP#I

FORI= {TOB: PLOTPP ,L,R: PP=PP+! sNEXT cn N=X THEN 1100

PRINT :L=L+1

NEXT COUP

CLS:PAPER 1:INK 7

PRINT : PRINT : PRINT : PRINT : PRINT PRINT SPC(13):;"VOUS ETES" PRINT :PRINT:PRINT CHR$(4) PRINT SPCCE92:

PRINT CHR#&(27) ; "NNUL" ; CHR$#( 4) END

1110 1120 1130 1140 1150 1160 11/70 1180 1190 1200 1210 1220 1230 1240

Note: le caractère ”£”’ est à remplacer par ”#”,

REM TROUVE----— PLOT 4,17,CHR$C10)+"BRAUO !" PLOT Z2,18,CHR$#C10)+" BRAVO !" PLOT 12,17,8:PLOT 12,18,8

PING

PLOT 15,24,16:PLOTI8+2xX,24,16+PA PLOT 15,25," "

FOR I=i TO x

PLOT 14+2*1,24,S(1)

PLOT 15+2*1,24,P

NEXT I

PRINT à0,23:

a” est à remplacer par @ ”.

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 2049, 2069 et 2099 permettent respectivement de sauter 1, 1 et 2 mesures.

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

2000 2010 2020 2030 2040 2050 2060 20 70

REM AUS TONER SANRENARRNA TE RARE DU=5000 : GOSUB 2510

GOSUB 2510

RESTORE : GOSUB 2S10

FOR I=i TO 25:READ K,N:NEXT GOSUB 2510

FOR I=i TO 24:READ K,N:NEXT GOSUB 2510

07

2510 FOR I=1 TO 3:READ K,N

2090 FOR 1=1 TO 49:READ K,N:NEXT 2500 REM----——————

2100 GOSUB 2510 2110 WAIT 200:PLAY 0,0,0,0:END

2080 RESTORE:GOSUB 2510 212U

Zr Œ x D WU PE LL »e eo EE LU LE + ©

LC og L'on Z OS © Nm 3 1 N

My Friends

2540 PLAY 7,0,1,DU:WAIT 15:GOT0 2510

2550 3000 REM With À Little Help From

2560 3001 REM 3002

00 © “0 «0 M M “0 mt 4

EP mem mm Ew,

NNNNGOOOOCOON- ON

SO ed qd A ed A ed 0 OO OO 7. +4 gd

tm ne mn © © OO = NN EN EN RE 2 En Pa oO M ee mn NN C4 -. SD M COCO à en mo Dre nm OO OO) 4 7 7. NN MMMMMM ee = 7 0 M mm M ee em OO OO CO 7 7. ee 0DD00MMO0OQO0 re m1 oO D sm mm Om vw. SO O0 m1 4 7

r =NNOGOGODOO--- -0N et Ad A 04 4 eh 4 4 4 4 (0) 4 O9 4 4 EE me MP M M mm ee

OONNNNNNNNNNNANN A

mm mm mm mm «+

M oO 0 M M M M M M M M M M M M M

3003 DATA 3004 DATA 3005 DATA 3006 DATA 3007 DATA 3008 DATA 3007 DATA 3010 DATA 3011 DATA 3012 DATA 3013 DATA 3014 DATA 3015 DATA 3016 DATA 3017 DATA 3018 DATA

3019

ee eme

NNNNOCGOSOO M OC A4 gd 4 ed 4 ed 4 md ne mm me NN NUNN ON MM enr me - (00 1) (9 0 “O0 © MO sr - +0 0 0 M M oO oo m FE ee ee - + © © “0 “0 M M “0 OD ee mm m + ee NNNNN ON

NN sen mm me

» = NNO0OO000O00O A 4 A 4 A 04 4 et

VONNNNN OA

3020 DAT 3021 DAT 3022 DAT 3023 DAT 3024 DAT 3025 DAT 3026 DAT 3027 DAT 3028 DAT

58

em B ee,

em ee

Eee mm 7 vw,

3029 DATA 3030 DATA 3031 DATA 3032 DATA 3033 DATA 3034 DATA 3035 DATA

3036

0 0 “O0 “0

mm

er nm mm mm mm Om 7 ww.

ee mm vw.

sr ee eNNMM mn re NN M + es 4 4 00 D UM) +4 4 4 + O0 0 6 M

Fr sm mem mm mm mm vw.

EE ne mm me m «

mn La m ”. ”.

UnOnMnMmnnmMmomn

TTL TITITITITITTITTT FRERE TTITITTITTTTTTITTLTT OOo OOo RO Oo NOW OR DE © 4 (M MMM TITTITTT TU LS IN OOo OO 0000060 mnnnnnnmnnmnmMmnmMmnMn

30S3

“0 0 “O0 © _ +. oo NN O NUE LT) 1) 4 1 1 O0 re Sooo NN NN ON WW Num m CN A ed 4 4 ee mm ee vw. nr. DOON WHO NN NN ON " 7 of 4 €. ©. y -. nes NN me NU = et ed 4 +4 NN + (M >. " 7 "7 ». 4 D) 7. et ruse MM OMMMn M QO “O0 © © TT mm © + ”. rer. NNANNoNNEM 1 NN ON CO ON meme mm 7 7 +». æ. re. NNONNNNMES OO OCG0O D en: Sr ee AN CR D cm mms MO = + nDMG = D CC NN ee 7 MM © PRIS ARNO OR nes

”. ”. ”. r. 7. ”. er ee La LS LS "

MMUMOMNNNGMNMEOM

À +4 F4 A À ÉA A A

058 DAT 3062 DATA 3063 DATA

3

Gé4 DATA 3065 DATA aÜ0éé DATA 3067 DATA 3068 DATA 30697 DATA

3054 DAT 3056 DAT 3057 DAT 3

3059 DAT 3060 DAT 3061 DAT

59

ee em

rem em

ee mm +

3070 DATA 3071 DATA 3072 DATA 3073 DATA 30 74 DATA 3075 DATA 3076 DATA

3077

oi oO © 2/02 +

”. Lao Æ ”. æ. ee La a " _ L 2 ee En me " +.

OO OI ou es ns mm mes OI NM MMM mm mme ee. Ne N'on . nCR NN ere emm me me (CC ON QI NOoOMMMm rer -MOoOoMMMMNOoOOCMMMm em me mt mnm mm em mm nm mm mm 7 M mm mt

se eMUIN 7 7 - Ü 4 et ts 7 ee (M) 1) NN) mn

OM ms mme mm 7 OO ne MMM mm mm mme em re ee MOMMNNNNO eMMMM = = eMIMNNNNN AN N © © es ee + Or ee NO OO nn nn nn

CO SE SP CS

3078 DATA 3077 DATA 3080 DATA 3081 DATA 3082 DATA 3083 DATA 3084 DATA 3085 DATA 3086 DATA 3087 DATA 308S DATA 3087 DATA 3090 DATA 3091 DATA 3072 DATA 3093 DATA 3094 DATA 3095 DATA 3096 DATA 3097 DATA 3098 DATA 3099 DATA 3100 DATA 3101 DATA 3102 DATA 3103 DATA 3104 DATA 3105 DATA 3106 DATA

60

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(Q) contient le nombre de noms de lasæmremiè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.

29 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. À la sortie de cette boucle, MOTS contient le dernier mot lu.

61

189 185 199

200

229

229 330

335

355 365 390 495 419

415 429

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 350 à 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 426.

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

à 495 Les lettres du mot égales à la lettre proposée sont placées dans le tableau MOT$. 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 1999 pour la

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

CIC

62

#

STE FEREFEN]

DRE AA AAA Ne

MEN

* * + * * * * _*# É.

9 REM INITIALI SATIONS%X 2% 32% 26 66 6 À

10 CLEAR

15 DIM L$(25) ,P#(C6) ,D$#C6) ,MOT#(20),S(5) 20 D$(0)="0":D#(12="1":D$(22="I1":D$S( 3)="/" 25 D$(4)="ç":D8(5)="/": DSC 6)=" GC"

30 S(0)=25:S(1)=25:S(2)=25:S(3)=25

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

A0 REM'CHOIX DU SUJET sense

45 TEXT:CLS : PAPER2: INKO : PRINT :L=0:F=0 : 1=0 50 PRINTSPC(10) ;"JEU DU PENDU" :PRINT

99 PRINT'Les sujets sont -MUSICIENS"

60 PRINT" SPORTIFS" 65 PRINT" HISTOIRE" 70 PRINT" —BOI SSONS" 75 PRINT" CAPITALES" 80 PRINT" —ACTEURS" 85 PRINT" SEXE"

70 PRINT" *STOPT

95 PRINT :PRINT : INPUT"'UOTRE CHOIX "; CH$ 100 IF CH$="MUSICIENS" THEN CH=0:G0OTO 145 105 IF CH$="SPORTIFS" THEN CH=1:GOTQ 145 110 IF CH$="HISTOIRE" THEN CH=2:GOTO0O 145 115 IF CH$="BOISSONS" THEN CH=3:GOTO 145 120 IF CH$="CAPITALES" THEN CH=4:GOTO 145 125 IF CH#$="ACTEURS" THEN CH=S:GOTC 145 127 IF CH$="SEXE" THEN 10000

130 IF CH$="STOP' THEN PRINT'"'AU REVOIR." :END 135 PRINT"'RATE !!!!'":GOTO0 95

140 REM CHOIX DU MOT À TROUVER-------

145 N=INTC(RND(1)#S(CH))+1

150 RESTORE

155 IF CH=0O THEN 170

160 FOR I=i TO CH:FOR J=i TO S(I-1)

165 READ MOT#:NEXT J,I

63

170 175 180 185 190 195

425 1000 1001

FOR 1=1 TO N:READ MOT$:NEXT

REM PREPARATION DE L’AFFICHAGE---

FOR 1=0 TO 25:L#(C1)=CHR$&(32) :NEXT

FOR 1=0 TO 6:P$(1)=CHR$(32) :NEXT

FOR 1=0 TO 20:MOT#(CI)=CHR# (32) :NEXT CLS: FIN=LEN(MOT$ )

FOR I=1 TO FIN:V$#=MIDS#S(MOTS$,1I,1)

IF UV$=}"A"ANDUS(="Z" THEN MOT$&(I1-1)="-":GOTO 215 MOT#(CI-1)=U$#:L=L+1

NEXT :C$="" -

FOR I1=1 TO LENÇ(MOT#)+4:C$=C#$+"x":NEXT REM AFFICHAGE DU JEU-----------—- PRINT CHR$<(30) ;

PRINT

PRINTSPC(18);"#xx2x 2x 262626 XX XXE EE

PRINTSPC(18) ;"+x x"

PRINT" #22 326362 E * DEJA PROPOSEES *"

PRINT" * + #"3:SPC(16);"…#"

PRINT" # —-- * # "3L86C0)3" "iL6C1)7" "sL8C225" "sLSCS) ss PRINT L#$(4);" ";L$S(CS)3;" ";LSCé);"

PRINT" ù + x";SPC(16);"x"

PRINT" #0 ù % x "iL#(7);" "sLHCB);" "sLSC(9D:I" "sLSC10)5;" M PRINTL#(1123;" "3L#(12);" "3;LSC13);" "

PRINT" x ù ";PSC0) ;" * #" 3; SPC(16);"%*"

PRINT" x Ù ";P$C3) PS1); PSC4)5;" + M: aie" MELSCIS) En PRINTLS(16);" "5LS(C1795;" "sLSCI18);" "sLSC19)3" "sLSC20):;" »*"

PRINT" x ù "3P$C2);" * x"; SPCC16);"%x"

PRINT" * ù "IPS CO2r" "sPS(6):" E a "sLSC213t" "sLS(222:" 4 PRINTL#(C23);" "3L$(24);" ";LS(25);" x"

PRINT" * ù * #";SPCC16);"#"

PRINT" x ù * CELL IÉELILLLILLLLLSI IN

PRINT" * /ùç *"

PRIMES Ness # “"3;CS$

PRINT" + *. #3

FOR 1=1 TO FIN:PRINT MOT$#(I-1) ; :NEXT

PRINT" *"

PRINT" ####X###X#%#%x%x% ":CH:IF F=i THEN GET A$:GOTO 5

PRINT :PRINT: PRINTCHR$#(14);"Quelle lettre proposez-vous "; GET L$:1FL$<"A"ORLS$S)>"2"THEN340 PRINT L$ RES TRAITEMENTS ss ns FOR 1=0 TO 25:1F L$CI)=L$ THEN 425 NEXT : OK=0O FOR I1=0 TO 25:1F L$<L$(I) THEN 380 IF L$(I1)=" " THEN 380 NEXT FOR J=25 TO 1+1 STEP-1:L$#(J)=L$(J-1):NEXT L$CI)=L#S:TR=I FOR I1=1 TO FIN:VS$=MIDS$(MOTS,1I,1) IF V$S=L$ THEN MOT$(I-1)=LS$:0K=1:L=L+1:GOTO 405 TR=O NEXT :1F L=LEN(MOT$) THEN PRINT"'BRAVO !":F=1:GOTO 225 IF OK THEN PRINT SPC(21) :GOTO0 225 PSCK)=DS(K)D):K=K+1:1F K<7 THEN PRINT SPC(C21):GO0OT0O 225 PRINT'"'Le mot etait ":;MOT#:F=1:GOTO 225 PRINT "DEJA PROPOSEE":GOTO 225 ,. DATA BERLIOZ,BACH,BEETHOVEN,BIZET , BRAHMS DATA CHOPIN, BUXEHUDE , HUMMEL ,MOUSSORGSKY , PACHELBEL

1002 DATA JOSQUIN DES PRES ,WAGNER ,MENDELSSOHM, SCARLATTI ,WOLLEMHAUPT 1003 DATA CZERNY , BRAUNGARDT , RAMEAU , ROSSINI , SCHUBERT

1004 DATA SCHUMANN ,WEBER,MOZART ,VIVALDI , OFFENBACH

2000 DATA TABARLY ,PROST ,PLATINI ,KILLY , BORG

64

2001 2002 2003 2004 3000 3001 3002 3003 3004 4000 4001 4002 4003 4004 5000 5001 5002 5003 5004 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 10000 10005 10010 10015 10020 10025 10030 10035 10040 10045 10050 10055 10060 10065 10070 10075 10080 10085 10090 10095 10100

Note :

DATA RUSSEL ,"CASSIUS CLAY" ,"MADAME CLAUDE" ,DARNICHE ,"NIKI LAUDA" DATA CAUW,PIRONI ,LAFFITE,ZITRONE ,CHICHESTER

DATA JAZY ,MIMOUN ,ANQUETIL , BOBET ,HINAULT

DATA MERCKX ,MOSER, POULIDOR, COPI ,RAAS

DATA "DE GAULLE" , CHARLEMAGNE" ,VERCINGETORIX" ,ATTILA ,NAPOLEON DATA HITLER,WASHINGTON, CHURCHI LL , PASTEUR , FLEMMING DATA PETAIN,"HIRO HITO" ,"PEPIN LE BREF",CLOVIS DATABERTHE AU GRAND PIED,"BLANCHE DE CASTILLE" ,ROOSVELT ,KENNEDY , DESCHANEL DATA"LA POMPADOUR" , "MUSTAPHA KEMAL" ,POMPIDOU , REAGAN , TCHERNENKO DATA CONTREXEUVILLE ,ARMAGNAC ,WHI SKY ,VODKA , GIN

DATA FRAMBOISE , GENEPI , CHARTREUSE , SAUTERNES , JUL I ENAS DATA" CHATEAU PETRUS" , CHAMPAGNE , COGNAC ,RIESLING , GEWURSTRAMINER DATA POIRE, GNOLE , SCHNAPS , PEINTURE , TRICHLORETYLENE DATA BRANDY ,MADERE ,PREFONTAINES , CIDRE, SAKE

DATA PARIS, LONDRES , BONN , ROME ,MADRI D

DATA WASHINGTON,TRIPOLI ,RYAD,"LE CAIRE" ,RABAT

DATA TANANARIVE ,MOSCOU ,ANKARA , PEKIN, BANGKOK

DATA TEHERAN, BAGDAD ,MONTREAL , RANGOON , TOKI O

DATA BRASILIA,MEXICO, GEORGETOWN , CANBERRA , BAMAKO

DATA HEPBURN, BOGART , BRANDO , GI RARDOT ,MASTROIANNI

DATA CASSEL , DELON, SINATRA, CECCALDI , GALABRU

DATA MEURISSE ,FERREOL ,NOIRET ,MONTANT , BURTON

DATA DARC ,WELLS , DENEUVE , BELMONDO ,WINDMARK

DATA PIAT ,DARRAS ,NEWMAN , SELLERS , VANNECK

DATA LOREN ,MOREAU, FLYNN , DEPARDIEU, BRYNNER

DATA LOLLOBRIDGIDA,CONSTANTIN,ANDRESS ,MARIELLE , KEATON DATA CHAPLIN,LAUREL , HARDY , JOBERT , BLANCHE

DATA DIFILHO,BLIER,MONROE ,POIRET ,BOURVIL

DATA FERNANDEL , LEWIS, YANNE , DAUPHIN , DEREK

DATA DUTRONC ,MANFREDI ,WAYNE ,USTINOV , CURTIS

DATA SERRAULT ,BALASKO ,DEUAERE , BALUTIN,TOGNAZZI

DATA PICCOLI ,PACOME ,HUPPERT ,ASTAIRE , PRESLEY

DATA ADAMO , HOLDEN, GABIN,BRIALY , SIGNORET

DATA ADJANI , CARREL ,VENTURA , HANIN , SCHNEIDER

DATA LAFONT ,GLASER,TRINTIGNANT , TAYLOR , GASSMAN

DATA FONDA, SHARIF , SEBERG , ROCHEFORT , LANVIN MITCHUM,HESTON, FOSSEY ,AUCLAIR , QUINN

DATA JOUVET , BRASSEUR ,MARAIS , MORGAN , HOFFMAN

DATA CARMET , BARDOT ,NEVILLE ,KELLER,CHAKIRIS

REM COMMENTAIRE POUR SEXE------

CLS : PRINT : PRINT

PRINT"JE NE JOUE PAS AVEC VOUS"

PRINT"ESPECE DE SATYRE !!!!"

PAPER 6:EXPLODE:WAIT 200

PRINT : PRINT

PRINT"JE REFUSE DE JOUER AVEC"

PRINT"UN TEL OBSEDE."

PAPER 1

FOR I=1 TO 10:SHOOT :WAITI0:NEXT

PRINT : PRINT : PRINT

PAPER 1!

PRINT"POUR QUI ME PRENEZ-VOUS"

PRINT"DEBILE titttiinnunuun

FOR 1=1 TO 7

ZAP:WAIT 10:EXPLODE:WAIT 15

NEXT

FOR I=1TO 20

SHOOT :WAIT 8

NEXT : PRINTCHRS (6)

PLAY 7,7,4,300

5

le caractère ”’ü”’ est à remplacer par f, tandis que ”ç” est à remplacer par \”.

65

2

Quelques

renseignements utiles pour programmer vos jeux

2.1 GESTION DE LA MÉMOIRE DE L'ORIC/ATMOS

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

ROM : Basic de l'ORIC

écran

caractères semi-graphiques caractères standards

programme Basic (début en #51)

de 400 à 429: rien

adresses d'entrées/sorties

utilisé par le Basic

pile du 6592

page 9 utilisée

FFFF-65535

CO99-49152

BFE9-49129

A900-40969

9C09-39936

98900-38912

590-1280

409-1924

309-768

209-512

199-256

9-9

en mode TEXT

programme Basic (début en #591)

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

FFFF-65535

C990-49152

BFEQ-49129

BB89-48900

B890-47 194

B499-46089

9F00-497@4

599-1289

409-1924

300-768

200-512

100-256

Q-0

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 (40 à #B).

b) La pile du microprocesseur. #100 à Z1FF

A chaque fois qu’une instruction JSR, PHA ou PHP est exécutée par le 6592, 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. 4200 à #2FF

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

d) Les adresses d’entrées/sorties. 430 à #4#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 #40-#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$S(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 LENCO.

69

PI 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 4.

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.2EXP—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

CN Le [ose [mu 0 [5

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 N22>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:

298 A$—’’123456789

la chaine 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$S(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 Taille du tableau nb. dimensions

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 PI 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

1

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 stocke sous la forme :

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

4] et 42 sont les codes ASCII des lettres A et B (65 et 66 en base 10).

(927 est la taille du tableau (39 en base 10).

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

(92 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. . -

Taille du tableau

Les deux premiers caractères du nom du tableau N1 et N2 sont en code ASCII négatif.

Valeur max +1 du dernier indice

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 ! ' ! '

dernier élément

* Tableau chaine

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

| Valeur max +1 du premier indice 1°" élément |

Pour chaque chaîne on stocke sa longueur, l'octet de poids faible puis l'octet de poids fort de l'adresse de la chaîne.

| dernier élément FE

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

Les chaines 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 chaînes, 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 à 424.

* 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 caracteres

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 46080+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 Ÿ à 31. Les 32x8—256 premiers octets des deux zones sont donc inutilisés.

h) La zone ecran

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 48999 à 49119. Il est à noter que la première ligne de l’écran, celle est située le mot CAPS correspond aux octets d'adresses 48 à 48039, et peut-être accédée grâce à PEEK, DEEK, POKE et DOKE.

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

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

i) La ROM #C000 à ZFFFF

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-

19

tion, ne peut être que lue. Par construction du microprocesseur 6592, on trouve en FFFE, FFFEC 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(#FFFC) 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 code par les 8 octets suivants :

32168421

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

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 46080 en mode TEXT. Le premier des huit octets codant la lettre A”. dont le code ASCII est 65, est à l’adresse 46080+8*65—46690. On trouve donc:

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

O 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+8xASC(CAR$)

39 FOR I=S TO S+7

49 PRINT I,PEEK(I)

5ÿ NEXT I

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

Le programme :

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

39 POKE 1+8,PEEK()

4ÿ NEXT |

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

17

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

20000010

32 168421

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

En exécutant le programme:

19 TEXT :S—46989+ASC('’ @ ‘’)*x8

28 FOR I=S TO S+7:READ V':POKE I,V :NEXT

39 DATA 2,64,29,29,29,29,29,9 on redéfinit @. Chaque fois que vous frapperez la touche @ ”, un ”r” est affiche.

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

20100001

32 168 42:

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

19 TEXT :S—46989+ASC('' @ ‘’)+8 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 47104, le premier octet d’un caractère semi-graphique de code ASCII a se trouve à l’adresse 47194+8xa.

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 #F8D 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 REDEFINITION DES CARACTERESXxx%*+x

30 TEXT:CLS:PAPER 2:INK O:PRINT:PRINT 40 PRINT'"'Donnez le code ASCII ":

DU PRINT" ÉS2=-1277

60 INPUT CODX ;

70 IF CODÆ<32 OR CODX)>127 THEN

80 PRINT'"'Quel jeu ": |

70 PRINT"(O:normal,i:graphique) ”"; 100 INPUT JEUX

110 IF JEUX<O OR JEUX >1i THEN 80

120 ÀAD=46080+1024xJEU+8*xC0D%

140. REP MODE: D'EMPED Isere 190 CLSIPRINIT

160 PRINT'Dessinez le caractere ":

170 PRINT'dans la grille"

180 PRINT:PRINT'"Pour marquer un point:" 190 PRINT'"-On deplace le curseur"

200 PRINT" avec les fleches"

210 PRINT"-On frappe X"

79

80

220

620

PRINT

PRINT'Pour effacer un point:" PRINT'"-On amene le curseur" PRINT" sur le point"

PRINT"-QOn frappe la barre"

PRINT

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

REM DESSINE LA GRILLE------------ FOR C=ié TO 23:PLOT C,1é6,"x":NEXT FOR L=17 TO 24:PLOT ié,L,"x"

PLOT 23,L,"#":NEXT

FOR C=ié TO 23:PLOT C,25,"%":NEXT REM PLACE CURSEUR DANS GRILLE---- PRINT:PRINT:FOR I=i TO 15

PRINT CHR#$(9) ;

NEXT :X=1 :Y=1

REM DESSIN DU CARACTERE---------- GET A$:1F AS=CHR$S(27) THEN 540

IF A$="X"ANDX<7THEN X=X+1 : GOTOS20 IF A$=" "ANDX(7THEN X=X+1 : GOTO520 A=ASC(A):IF CS OR A>11 THEN 420 IF A=8 AND X)>1 THEN X=X-1 : GOTO520 IF A=9 AND X<é THEN X=X+1 : GOTOS20 IF A=10AND Y<8 THEN Y=Y+1:GOTO520 IF A=11AND Y>1 THEN Y=Y-1 :GOTO520 GOTO 420

PRINT 4$:;:GOTO0 420

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

FOR I1=0 TO 7

FOR C=17 TO 22

IF SCRN(C,17+I1)<>ASCC"X") THEN6éOG FClomT(1)+2"(22-C)

NEXT C

NEXT I:PAPER 2:CLS

630 REM RANGE EN MEMOIRE ORIC-------- 640 PRINT :PRINT

650 FOR I1=0 TO 7

660 POKE AD+I,T(I)

670 PRINT"'POKE "3AD+I13:","3:TCI)

680 NEXT I

6790 PRINT:PRINT'"'On obtient:";

700 PRINT CHR$(27) ; CHR$( /2+JEU) ;

710 PRINT CHR$&(CODZ)

F£Ù à |

790 REM ENCORE 7eme estime 740 PRINT :PRINT

750 PRINT'"'Encore (CO/N) "3::GET À$&

760 IF A$="0" THEN RUN

770 IF A$="N" THEN END

780 PING:GOTO 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 49x28—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 480090 (ZBB80 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 @ à 27, la ligne @ étant la ligne supé- rieure, et les caractères de 9 à 39, l’adresse de l’octet correspondant au caractère X de la ligne Y vaut 48000+40%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

4ÿ :

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.

7: D: 5 SX TC 0

LS code ASCII Un octet de la zone écran

@: 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 10000000 (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

4ÿ :

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

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

149 RETURN

82

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

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 198

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

5ÿ GOSUB 198

69 X-12:Y-16:A$—"" video inverse’

79 GOSUB 19g

De WAIT 5g:GOTO 19

9ÿ :

199 REM PLOT EN VIDEO INVERSE

119 MUSIC 1,4,1,8

129 FOR 1-1 TO LEN(A$)

139 PLOT X+1-1,Y,ASC(MID$(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 chaine 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 9 à 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 48020, 18.

L’octet 48929 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 Y:INK 1:CLS 29 PLOT 11,1,CHR$(14)+'"DEMONSTRATION 39 PLOT 11,2,CHR$(14)+' DEMONSTRATION

59 PLOT 15,12,CHR$(1)+' ROUGE” 68 PLOT 15,13,CHR$(2)+'' VERT" 79 PLOT 15,14,CHR$(3)+''IAUNE"”’ 88 PLOT 15,15,CHR$(4)+''BLEU 99 PLOT 15,16,CHR$(5)+'’ MAUVE 199 PLOT 15,17,CHR$(6)+' CYAN" 119 PLOT 15,18,CHR$(7)+'' BLANC”

129 :

139 FOR 1-1 TO 7 :WAIT 299 :PING 149 FOR ]-11 TO 19

159 PLOT 14,],1+16 :PLOT 23,],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 159, 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 CHRS$(27); CHRS(code+64), voir l’annexe 3.2.

En effet, si vous exécutez PRINT CHR$(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.

L PRINT CHR$(12):REM EFFACE ECRAN 7 .

34 PRINT @ 15,26 :’' COUCOU” 4ÿ FOR 1-1 TO 26

84

5ÿ FOR 1=1 TO 26 68 PRINT CHR$(19); :REM VERS LE BAS 78 WAIT 28

88 NEXT

9ÿ : 7 PRINT CHR$(39) ; :REM RETOUR 119 : |

129 FOR 1-26 TO 2 STEP —2 134 FOR ]J=-1 TO I :PRINT CHR$(9): :NEXT

149 FOR J=1 TO I':PRINT CHR$(19) ; :NEXT 159 FOR J=1 TO 1-1 :PRINT CHR$(8); :NEXT 168 FOR J=1 TO 1-1 :PRINT CHR$(11); :NEXT 179 NEXT

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 adresse-mémoire du premier octet de la ligne se trouve 19ou #13 le curseur. 616 ou 268 numéro de la ligne est le curseur (Q à 27. 617 ou #269 numéro de la colonne est le curseur (9 à 39). 618 ou #26A bascules CTRL-D, CTRL-], CTRL-[, CTRL-F, CTRL-S et CTRL-Q. 619 ou Y26B code pour PAPER (16 à 23). 620 ou #26C code pour INK (9 à 7). 632 ou 4278 adresse-mémoire du premier octet de la seconde ligne de 633 ou 4279 l'écran (*BBD@ en TEXT, #BF99 en HIRES). 634 ou #27A adresse-mémoire du premier octet de la première ligne de 635 ou #27B l'écran (XBBA8 en TEXT, #BF68 en HIRES). 636 ou #27C nombre de caractères à enrouler (26x4@—1%4@ en TEXT, 637 ou #27D 2x49-80 en HIRES). 638 ou #27E nombre de lignes de l'écran (27 en TEXT ou 3 en HIRES).

Ces adresses sont à séparer en quatre groupes :

Celles qui servent au curseur: 18, 19, 616 et 617.

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 du premier octet de la ligne se trouve le curseur 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é le numéro de la colonne se trouve

le 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 peut écrire sur la première ligne de l’écran (Y—) et dans les deux premières colonnes (X=—ÿ ou 1). Considé- rons le programme suivant :

10 PRINT CHR#(30) ; :INPUT'X,Y ":X,Y 20 INPUT"CHAINE ":A4$

30 GOSUB 100 40 GET ÀA$:IF A$S<)>"A" THEN 10 30 END

100 REM PRINT AT X,Y,A8--———— 110 L=DEEK(18) :ACUR=L+PEEK(617)

115 DOKE £400,£6078:CALL £400

120 CAR=PEEK(ACUR)

130 IF CAR)127 THEN POKE ACUR, CAR- 128 140 L=£fBB80+Y*x40

150 POKE é616,Y:POKE 617,X

160 DOKE 18,L

165 DOKE £400,£€058:CALL £400

170 PRINT A$

180 RETURN

Note: le caractère £”’ est à remplacer par #”.

Nous allons expliquer le fonctionnement du sous-programme 190. 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 à 130.

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 BB80 est l'adresse du début de l'écran. Comme une ligne comporte 40 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, en 617 le numéro de la colonne.

169 On place en 18 la nouvelle adresse de la ligne est le 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. II lit le nombre qui se trouve en 18-19, lui ajoute le contenu de 617, et va à cette adresse. La, 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 inferieur à 128, l'ORIC lui ajoute 128 pour obtenir l'effet de vidéo inverse. Ceci fait, l'ORIC retourne au travail qu'il avait aban- donné. 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 et 617.

Maintenant, supposons que le réveil sonne pendant que l’ORIC exécute la ligne 149 ou 159. A la ligne 134, 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 et 617. Puis il revient à mon programme, qui a la ligne 169 modifie le contenu de 18-19. Lors de la prochaine sonne- rie, l’'ORIC ira donc modifier l’octet dont l’adresse et la nouvelle valeur sont en 18-19 et 617. Ainsi, le caractère dont l’adresse était l’ancienne valeur stockée en 18-19 et 617 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 44090 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 instruc- tions. C’est l'instruction SEI qui rend sourd l’ORIC. Puis en 165, on lui rend l’ouïe, en exécutant le sous-programme constitué de #58 et #60, soit CLI et RTS. L’instruction CLI à l’effet inverse de SE.

Si vous voulez mieux voir ce qui se passe, ajoutez la ligne:

117 FOR 1-1 TO 4ÿQ :NEXT |

Puis tapez: CLS :RUN return L’ORIC vous demande : X,Y? Tapez : 19,19 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 632 à 638 qui servent à définir la taille de l’écran pour PRINT. On trouve en 632-633 l’adresse de la seconde ligne, qui vaut normalement #BBD en mode TEXT et #BF99 en mode HIRES. En 634-635 se trouve l’adresse de la première ligne, #BBAS8 en TEXT et #BF68 en HIRES. Le nombre de caractères à déplacer lorsque l’écran est plein, à enrouler, se trouve en 636-637, et vaut 26x40—1949 en TEXT, 2x49—80 en HIRES. Enfin, en 638 se trouve le nombre de lignes de l’écran (27 en TEXT, 5 en HIRES).

88

Les ordres PRINT, CLS utilisent la zone dont l’adresse de début vaut DEEK(634), et comportant PEEK(638) lignes de 49 caractères. En modifiant ces valeurs, vous pouvez modifier la partie utilisable de l'écran. Tapez:

DOKE 636,7x49 :POKE 638,8 :CLS 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 632,#BB89+49 :DOKE 634, ÆBB89 :DOKE 636,27x4ÿ : POKE 638,28 :CLS return

PRINT peut maintenant écrire depuis #BB89 sur 28 lignes. C’est- a-dire que vous pouvez maintenant utiliser la ligne du haut de l’écran, celle se trouve CAPS. Tapez et exécutez :

19 DOKE 632, BB89+49:DOKE 634,# BB8ÿ 28 DOKE 636,27x4ÿ :POKE 638,28 :CLS 39 PRINT SPC(12) : "ZONE PROTEGEE” 49 FOR 1- #BB89+4945 TO # BB89 +445 + 39 5ÿ POKE I,ASC(’’="") 69 NEXT I 74 : 88 DOKE 632, #BB80+7x+49 9$ DOKE 634,# BB80+6+49 199 DOKE 636,21x49 :POKE 638,22 119 CLS

Vous pouvez déplacer le curseur, exécuter CLS ou CTRL-L sans atteindre les deux lignes supérieures de l’écran. Les lignes 19-20 définis- sent un écran de 28 lignes, tandis que 80-119 définissent 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 ajoute les lignes 25 et 129 pour obtenir :

89

19 DOKE 632,#BB89+49:DOKE 634, #BB89 29 DOKE 636, "27 x 4ÿ : POKE 638,28: CLS

25 POKE 619, 16 : POKE 629,7 : CLS

39 PRINT SPC (12) : "ZONE PROTEGEE

4ÿ FOR | # BB80+40x5 TO # BB89+49x+5+39 5ÿ POKE I,ASC(’=")

69 NEXT I

70:

89 DOKE 632, #BB89+7+4ÿ

9ÿ DOKE 634, #BB80+6+49

199 DOKE 636,21x49 :POKE 638,22

119 CLS

1284 POKE 619,18: POKE 629,9: 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 62). A la ligne 99, on fixe un écran vert (18 en 619) et de l'encre noire (9 en 620).

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

Poids du bit

| Afficha action du Affichage | ru clavier bit à @ simple Al sonore colonnes

Affich Affichage He 40. | : curseur

affiché

Action du bit à 1

Touche faisant changer d'état| aucune! CTRL-D le bit Caractère de contrôle CHRS$(26) HRS$(4 RCA aucun | CHRS$(4) CHR$(27) CHR$(19) d'état le bit

90

ubl double colonnes

Lorsque l’ORIC est branché, ou lorsque l’on enfonce reset”, l’ORIC place en 618 la valeur:

sm. [elelslsleolelils

Ce qui vaut O+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 affiche.

Les touches CTRL et les caractères de contrôle font changer d’état l’un 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 49 colonnes, avec un clavier silencieux et que le curseur soit pas affiché, il faut placer en 618 la valeur:

128 64 32 16 8 2 2 1 Rise nier

poids

Affichage pas ESC | Affichage | simple | Affichage clavier curseur 49 colonnes silencieux pas affiché

Ce qui vaut 0+9+32+0+8+9+2+9—42. On exécute donc:

POKE 618,42

91

2.4 TRUCS ET FICELLES DU MODE HIRES

L’écran HIRES est divisé en 203 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 (ZA090 à #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 49969 +40%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.

CR 1 Q

Le code compris entre @ et 127

Q: 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 videos (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 16 8 4 2 0 1 9 9 6 6 6 0 Eh + #4

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.

1

0+64+0+0+0+0+0+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 29x49 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 ® 1 O0 1 0

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- #A099 TO # Aÿ27 :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 1-# AÏ9Ÿ 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 a 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 199,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 le format suivant :

p. faible p. faible p. fort Q |

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 chaines 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-#9B 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

urnes" don ag ere ee ER 1e ligne ligne dernière ligne #9A-49B contient l'adresse contient l'adresse #9C-#9D du 1 octet du de l'octet suivant programme, #501 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 599. 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=598 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:

i GOTO 1000

10 REM CES REM FIGURENT LE

20 REM FROGRAMME AUQUEL

30 REM ON DESIRE AJOUTER DES

40 REM ORDRES DATA.

1000 DOKE £9C,DEEK(£9C)+5000 :CLEAR 1010 A=DEEK(£9C)D-5000-2:N=2000 1020 L$="";:2=FREC""): PRINT" >": 1030 GET A$S:IF AS=CHR$S(13) THEN 1050 1040 L$=L$+A$S: PRINT À$::GOTO 1030 1050 IF L$="" THEN 1130

1060 DOKE À ,A+LEN(L#)+6:DOKE À+2,N 1070 POKE À+4,145

1080 FOR I=i TO LEN(LS#)

97 -

1090 POKE A+4+I,ASC(MID#(LS,1,1)) 1100 NEXT I

1110 POKE A+S+LEN(LS) ,0 :A=A+LEN(LS) +6 1120 PRINT:N=N+10:GOTO 1020

1130 DOKE A,0:DOKE £9C,A+2:CLEAR

Note: le caractère £” est à remplacer par #7.

Avant d'exécuter ce programme, vérifiez soigneusement que les lignes 1999 à 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,19 return > return

Ready

LIST return

L’ORIC a ajouté les deux lignes:

/

2998 DATA 1,2,3,4 7,8,9

Re 2919 DATA 6,7,8,9,1

18

Vous pouvez changer le numéro de la première ligne, défini par l’instruction N—24@ 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 IF 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 stocke 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 commence donc, en 19, par repousser de 5999 l’adresse contenue en #9C. On dispose donc maintenant de 59 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Ÿ-XA 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.

1929 L$ va contenir la ligne que vous allez taper. Ne pas oublier le ”:" à la fin de la ligne.

1039 On lit un caractère. Si c'est RETURN, on va en 1959.

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.

1959 Si la ligne est vide, on sort du programme, on va en 113Q.

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.

1979 On place 145, qui est le code du mot réservé DATA.

1989 à 1109 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 1920.

1139 Cette ligne est exécutée lorsque l'on sort. DOKE A,9 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.9174532925x%T) peut être remplacé par:

19 CDR-O.9174532925

ss...

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.

A 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 reutilisant 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=9:J-1:K=-l:L=1I

La variable I sera la premiè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

ss...

........

ss...

Dans la mesure du possible, remplacer les GOTO par des boucles FOR NEXT ou REPEAT UNTIL.

Lorsque cela est possible, simplifiez ou supprimez les tests.

Exemples : 39 IF V<> Ÿ THEN 199

peut être remplacé par:

39 IF V THEN 199

19 IF A$-CHR$(8) THEN X=X-1 29 IF A$-CHRS$(9) THEN X=X+1

peut être remplacé par la seule ligne: 19 X-X+(A$-CHRS$(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 1990 un sous-programme qui trace un petit dessin, puis en 244 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 4ÿ.

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 4ÿ à 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

A6 93 29 XX A5 ÿ1 48

A5 2 48

A4 ÿ4 A5 fÿ1 85 95 A5 #2 85 96 28 XX B1 1 91 95 88

19 F9 CA

19 E9 68

85 42 68

85 91 68

A5 1 18 69-20 85 #1 99 92 E6 92 6ÿ

A5 1 38

E9 28 85 91 Bÿ 92 C6 92 69

XX

XX

DHAUT

TLIGNE

TRCARA

NXTLIG

RTS 1

PLIG

RTS 2

LDA CLC ADC STA BCC INC RTS

LDA EC SBC STA BCS DEC RTS

PLIG

ND

XLIG ), LE

Gr ZONES

TRCARA TLIGNE 2

1

# 4ÿ

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 4ÿ et

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 4ÿ et

ranger le résultat.

Si il y a retenue, retour

Sinon, décrémenter poids fort Fin.

Ce sous-programme est mis en mémoire par les lignes 2900 à 2070.

2910 A est l'adresse-mémoire l'on va placer les codes. #9C00 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

2029

2059

2060

caractères semi-graphiques, on n'hésite pas à les écraser, car on a entre #9C00 et #ADOO, 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 79, 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 159 lignes vers le haut le dessin.

104

Pour finir, voici le listing du programme:

10 KRKEM FACE DE LUNEXKXKXKXKXXXKXKXXXXXXXXXXX 20 MIRES

30 GOSUR 2000

40 :

30 X=50+15O0XARND (1): Y=170

60 DOKHE 1, HAO0OO0+4(V-20) X40+X/6-5

70 POKE:Ssañ4l2PORE 4,7

GO MUSIL. Fe Li LSUSPERATY ss, 100

90 GOSUR 1000

100 FOR Izi TQ 150

TO CELL DAS SOUND: LOU IsE0

120 NEXT

1:50 HIRES: GOTO 50

140 :

LOUE HE DES S LM ne en ne EE NS ARE En ee LUI0 CÜRSET XsYiS

1020 FOR Kai TQ SO: CIRÇCLE K,1:NEXT 1050 FOR 1=-1 TO 1 STEF 2

19040 CURSET X+IKk9,Y-10,0

1050 FOR J=i TO S:CIRCLE J.OsNEXT J 10640 CURSET X+IK7.Y—10,1

1070 FOK J=0 T0 6

10890 CURSET. X+IKU, Y-JS/oriI0s0

1090 CURSET X+I1KJ:Y-J"2/6+11,0

1100 NEXT J

11160 NEXT I

LIPOEURSET. XP rre02

1150 FILL. 40, 1, L+/XANDEE )

1140 RETURN

2000 REM SOUS-PROGRAMMES 650 hu oste 2010 =K#9CQ00

2020 FOK Is TO +64

2050 KREAD ViFOKRE I, V

“040 NEXT IT

2080 DHzA:s NX=DH+41: FLENX +1

2060 DOKE DH+S.PLSIDOKE DH+22, NX

2070 RETURN

2 1)E30

2OPO: MEME DAT sims Rss esse Net es

105

106

2100 2110 120 2150 2140 190 2160 +0 2160 Te 200 2210 DU

des bros deu

7 D e.10

DATAHAG, HOS, HEO, HFF, RFF, HAS, #01 DATAHAG, HAT, HO, #46, HA, HO4, HAS DATAHOL, #55, HO, HAS, HOT, HAS, HOË DATAHEO,HFFHFF SHELL, HO, #91, HOS DATAHBS,HIO,HF9, HCA, #10, HE9, #68 DATAHGS,HOË, #66, #95, #01, #60

REM NXTLIG..... a DATAHAS, HO1, #18, #69, 478,405, #01 DATAHPO, HOD,HED, HO, H6O

REM FLIG....... da de nt Le DATAHAS, HO1L, HIS, HE, #28, #05, #01 DATAHEO, HO, HC6, #OË, #60

Annexes

Effet de la touche ou de PRINT CHRS${code)

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 CHRS$(4) ou CTRL-D

Aucun

3.1 TABLE ASCII DE L'ORIC/ATMOS

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 ŸY 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 Ÿ 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

11

Le

108

Touche

CTRL-F

CTRL-G

CTRL-H ou +

CTRL-I ou

CTRL-J ou Ÿ

CTRL-K ou Î

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

14

29

21

Touche

CTRL-M ou RETURN

CTRL-N

CTRL-O

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 CHR$(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 Ÿ 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 /a touche ou

de PRINT CHRS${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 b, 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 Ÿ, 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

39

32 33 34 35 36 37 38 39 49 41 42 43 44 45 46 47 48 49 59 51 52 53 54 55 56

Touche

Pas de touche

CTRL-DEL

barre d'espacement

DO M OO BR À NN

200002 00900222 ee

Effet de la touche ou de PRINT CHRS{code)

CHR$(30) renvoie le curseur dans le coin supé- rieur gauche de l'écran, qui n'est pas effacé.

Affiche un ! Affiche un Affiche un # Affiche un $ Affiche un % Affiche un & Affiche un” Affiche un { Affiche un) Affiche un *

Affiche un +

Affiche un,

Affiche un Affiche un.

Affiche un / 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

| Affichage normal.

Affiche un espace, un blanc

Effet de PLOT X,Y,code

Passage en graphique 50 Hz. Affichage normal.

Passage en graphique 50 Hz

(guillemet) (dièse) (dollar)

(apostrophe)

(signe de multiplication)

(signe de division, slash)

Code ASCII

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

à

Touche

IO nm on ww > ® + V

ee EC SO DÉCO = SF AE

Affiche un 9

Affiche un :

Affiche un ;

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 |

Affiche un J

Affiche un K Affiche un L

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 Affiche un V Affiche un W

Effet

(colon)

(semi-colon)

Code

ASCII

88 89 99 91 92 93 94 95 96 97 98 99

100

191

192

193

194

195

196

107

198

199

| 119

112 113 114 115 116 re?

Touche

N << x

a

>

£

pas de touche

© On MO © 0: ?»P

C 10 7 Pp vVv OZzZ< rt

Affiche un X Affiche un Y Affiche un Z Affiche un fl 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 uni Affiche un j Affiche un k Affiche un Affiche un m Affiche un n Affiche un o Affiche un p Affiche un q Affiche unr Affiche un s Affiche unt Affiche un u

Effet

(crochet ouvrant) (backslash) (crochet fermant)

t

(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

129 X Affiche un x

121 Y Affiche un y

122 Z Affiche un z

123 { Affiche un

124 | 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=l, code+64 vaut 65 et CHR$(code+64) vaut PR

Chacun de ces codes est actif depuis l’endroit il se trouve jusqu’à la fin de sa ligne.

Attributs de @ à 15

Avec POKE ou PLOT code

Avec PRINT Depuis le clavier Action

sur le système vidéo

PRINT CHR$(27);"@" ESC @ encre noire

PRINT CHRS$(27);"A" ESC A encre rouge

PRINT CHRS$(27);"B" ESCB |encre verte

PRINT CHRS$(27);"C" ESC C encre jaune

PRINT CHR$(27);"D" ESC D encre bleue

PRINT CHR$(27);"E" ESC E encre magenta

PRINT CHRS$(27);"F" ESC F encre cyan

PRINT CHR$(27);"G” ESC G encre blanche

PRINT CHRS$(27);"H" ESCH [simple hauteur, fixe, normal

PRINT CHRS$(27);"1" ESC: simple hauteur, fixe,

semi-graphique

115

19 PRINT CHRS$(27);"J" double hauteur, fixe, normal

11 PRINT CHRS$(27);"K" double hauteur, fixe, semi-graphique

12 PRINT CHRS(27);"L" simple hauteur, clignotant, normal

19 PRINT CHR$(27);"M" simple hauteur, clignotant, semi-graphique

14 PRINT CHR$(27);"N" double hauteur, clignotant, normal

15 PRINT CHR$(27);"0" 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 code

Action sur le système vidéo

Avec PRINT Depuis le clavier

PRINT CHRS$(27);"P" ESCP écran noir PRINT CHRS(27);"Q" ESC Q écran rouge PRINT CHRS$(27);"R" ESCR écran vert

116

19 PRINT CHR$(27);"S" ESCS écran jaune

20 PRINT CHRS$(27):"T" ESC? écran bleu 21 PRINT CHRS$(27):'"U" ESC U écran magenta 22 PRINT CHRS(27):"V" ESC V écran cyan 23 PRINT CHRS$(27):'"W" ESC W écran blanc 24 PRINT CHRS$(27):"X" ESC X mode texte en 60 Hz 25 PRINT CHRS$(27):"Y" ESC Y mode texte [en 60 Hz 26 PRINT CHRS$(27):"2Z" ESC Z mode texte en 50 Hz 27 PRINT CHRS$(27):" { ESC | mode texte en 50 Hz 28 PRINT CHR$(27);" |” ESC | mode graphique en 60 Hz 29 PRINT CHRS$(27):" | " ESC | mode graphique en 60 Hz 30 PRINT CHRS$(27); pas de touche | mode graphique CHRS$(30) en 50 Hz

31 PRINT CHR$(27): ESC DEL mode graphique CHR$(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 65202

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 :

*

X et Ÿ :

118

accumulateur À

index X

index

compteur ordinal PC

r-

pointeur de pile S

NIVIBIDI1IZIC] é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. L Indicateur de résultat nul (Zéro). e Retenue (Carry).

Le 6502 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 Ÿ

ex : LDA #FF

LDA 1

LDA 1,X

LDA 1909 LDA 1999,X LDA 1900,Y LDA (1999,X) LDA (19909),Y ROL

TAX

BNE 1909 JMP (19900) 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

g

Branchement relatif lorsque C @ (pas de retenue).

119

BCS BEQ BIT

BMI BNE CRE 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 et l'opérande et positionne en consé- quence les indicateurs.

Compare le registre X et l'opérande, positionne les indicateurs. Compare le registre 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.

"OÙ" 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 Q Lee 7 fe

Pas d'opération. Ne fait rien.

"OÙ" 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 g

Rotation d'un bit vers la droite au travers de C de l'opérande. 7 Q

opérande

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 Range l'accumulateur en mémoire. STX Range le registre X en mémoire. STY Range le registre Ÿ en mémoire. TAX Recopie A dans X.

TAY Recopie A dans Y. |

TSX Recopie S (pointeur de pile) dans X. TXA Recopie X dans A.

TXS Recopie X danssS.

TYA Recopie Y dans A.

122

4edo 59g Jne,e1

O = 9 !s eyoueiq 298

x'18d0 Sy x njosqe 42d0 Sy njosqe x'19d0 Sy X'019z eBed

1840 Sy 019z e6ed 1SY | 1ne)}e/nuwno9e euonef e eBe/e9ep 71Sv c A'(18d0) GNv A'(9811pui) c (X'18d0) GNv (X'19811puI) A'18d0 GNY A'nIosqe x'18d0 GNv x'njosqe £ 4ed0 GNY njosqe z x'18d0 gNy | x'0197 oed u1qe1q,13. t 4ed0 GNY 019z eBed z 18d0# ANY Jelpauiuul V+W'v aNv t A'(18d0) 3qv A'9811pu) z (X'12d0) 3qv (X‘19811pul) A'18d0 5qv A'nIosqge x'18d0 5qv x'njosqe £ 48d0 5qYv njosqe Z xX'18d0 5qv x'019z eBed t 4ed0 5qv 019z eBed t 1edo# 5 elpoui ul V+D+W+v 2av A QG 1 9 Z N Sa1IDOW oi de ee N Lu uone19d0 enbluowauyy

SIN9]29/PU/

123

RE OR S9IPOW s1N9]29/pU/

S19]20,p 9/QWON

9219 e}191/duui |

sado SAg

Om

AW 16 18d0 118 njosqe NN ve 48d0 1]g 019z e6ed W'v

jne/81 | = AIS auyoueiq

Q = AIS eyoueiq

e}91duu! ]ueu8}n019p

Jne]81 O = N!S aeuyoue1q

Q = Z IS eyoueiq

| = N IS aeuyoueiq

| = Z IS euoueiq

L 9 IS eyoueiq

| os. 4ed0 S5g Je/91

sabessape p SIPOW

VX3H | 1n9/quw8SSse

9p0 axeJuAS uorne19dO

919

SA

918

148

148

3Ng

IWg

9nbIUOWaU

124

njosqe 019z eBed jeIpeuu

48d0 149 48d0 149 18d0# 1d9

W—A IUBAINS sin8]e91pul Sa] euuoisod

90 0 0 7 7Z NN

4edo xd 4ed0 xd) Jedo# xd)

njosqe 019z eBed jelpeuuil

W—X JueAIns sina}e9Ipul Sa| euuorisod

A'(18d0) 4W9 A'(19811put) (X'18d0) 4W9 (X‘19811put) °A‘18d0 JW A'nosqge xX'18d0 JW x njosqe 40d0 4W9 njosqe X'18d0 4W9 X'019z eBed 48d0 4W9 019z e6ed W—vY JueaIns

do# 4W9 Je/pauuwuI! | Sina}29IpuI Sa] auuoisod

oyo1duu

eyo|duu!

S19]20,p 9/QUON

1n9/qu9sse a9XEJUAS

sabessa1pe p SIPOYW

S1N9]29/pU/

Ad9

Xd9

dW9

A9

M9

UT ou

129

SONORE ZON XNI

34 x'18d0 5NI 33 18d0 SN 94 x'18d0 5NI 93 18d0 5N|

A'18d0) HO3 (xX'18d0) HO3 A'18d0 403 x'18d0 403 48d0 403 x'18d0 403 48d0 H03 Jedo# H03

A3Q

NNNMMMNAN Nm m Lun

O œo

x'12d0 93q

48d0 53q x'18d0 593 4840 93q

£ _:| 3q 39 C ga C

A a I 92 Z N SpHIPOUI

/n8/qwesse

S1N9)89/PUJ EXBJUAS

99 S18220,p | YX3H 9/QUON | 2p02

eyo1duul

x'njosqge njosqe X'019z eBed 019z eBed

À (19811pul) (X19811pul) A'njosqe x'njosqe njosqe X'019z eBed 019z eBed jelpeuul

x'njosqe njosqe xX'019z eBed 019z eBed

sabessaipe p

S8POYW

ATH TA

1q e 11q

JjISN|9xXe , NO. V+-W ® v

AFL—A

WEI—-W

XNI ONI 403 A3q ET Es

is re

126

e + © © 7 NN

N°: © E 92: Z NN SpJIPOUI SIN9]22/pPU/

om om NNNMMMNN NNNMmm

|

S]9120.,P

9/QUWON

QT

29

89

VX3H 9p07

Ado xaq7 4ed0 xgq7 A'18d0 xq7 4ed0 xgq7 Jdo# xq7

A'(18d0) yq7 (X'18d0) ya7 A‘18d0 \/g7 x'18d0 \/q7 48d0 q7 x'19d0 ygq7 48d0 \7g7 Jedo# \/q7

4840 ySf

(18d0) 4Wr 48d0 af

ANI

1n9/qu8Sse exXeJ]UAS

A'nJosqe njosqe ÀA'019z eBed 019z eBed jelPeuuiI

À (981/pul) (X'811pul) A‘nlosqe x'njosqe njosqe X'019z eBed 019z eBed jelpauull

)9811puI njosqge

ey191duui

sabessa1pe p S9POW

xqa1

H9d+{(z+9d)

19d+{(L1+9d) +94 elidue

H9d+(T+9d) 19d+{(1+9d)

vai EE ue

127

A'(18d0) yHyO (X'18d0) yyO A'18d0 YHO x'18d0 YHO 4ed0 YO x'12d0 YyO 4ed0 YO Jedo# YO

NNNMMMNN |

x'18d0 4s7 4ed0 yS7 x'19d0 y4S7 48d0 yS7 us

98 x'19d0 4gq7 9V 1840 17 c vg x'18d0 1g7 z tv 18d0 1q7 Z Ov Jdo# 17

NŒE 92 Sg/Ipou

S]9120,p 9/QUON

1n9/qW8SSe axXeJUAS

SIN9]29/pU/

ine}e|NnuWin99e

sabessa1pe p SIpOYW

ed v elidus | VHd

A'(19811pui) (xX'19811pul) A‘njosqge x'njosqge njosqe X'019z eBed 019z eBed Jelpeuuul

1gqe3}q,. NO. V+ WAV

x'njosqe njosqe X'019z eBed 019z eBed 2}I01P R

11q un ,p eBe/e99p HS7

x'njosqe njosqe X'019z eBed 019z eBed

Jelpeuu! AW

uone19d0 anbIuowauy

EL a —)

128

a

SÿIJIPOu S1N8]229/PU/

9

Z

S19)20,p 9/QUWON

ILE

x'12d0 HOH 4940 HOH X'18d0 HO 18d0 HOH OH

x'18d0 104 1840 0H x‘18d0 104 19d0 10H 10H

1Nn9/qW98SSe 9XEJ]UAS

ey191jduul

x‘njosqge njosqe xX'019z eBed 019z eBed ine}e|nuwn929e

x njosqe njosqe xX'019z eBed

019z e6ed in8}e|nuwin99e

eyo1duul

sabessa1pe p SIpOW

euwue16o1d-snos ap 1n0]91

uol}dn11ej}u! p 1n0}91

9HOIP }1q Un p uolje]oy

euyonef e 11q un p uolje]o}

d elidgp

v el!dop

po ame

SLH

ILH

HO

104

did

vi

Q. L Q Q

ES

129

AG!) ZN

SgyIpOU sIN9)82/pU/

S19]20,p 9/QUON

A'(18d0) y1S (x'1e8d0) y1S A'12d0 Y1S x'12d0 y 1S 48d0 \1S x'12d0 Y1S 48d0 \1S

A'edo) gs (X'18do) 5gs A'18d0 5gS x'18d0 5gs 4ed0 5gs x'18d0 5gs 4edo 5gs Jedo# 5gs

NNNMMMNON

1n9/qW8SSe SaxeJ]uAS

A'(19811pul) (X'81/pul) A‘njosqe x njosqe njosqe xX'019z eBed

019z eBed W+v Vis e]191duut IL ous eyo1duui 91 93S

A (39811puI) (X9811pui) A'nlosqe x'njosqe njosqe X'019z eBed 019z eBed jelpeuuil

sabessa.pe p

sepoyy uonje:8d0

anbluouauy

130

| SglJIPOU SIN9]829/PU/

S29120,p 9/QUWON

njosqe X'019z eBed 019z eBed

4edo X1S njosqe A'18d0 x1S À'019z eBed 12d0 X1S 019z eBed

/Nn9/qW8SSe sebessaipe p S9XBJ]UAS SpOW

131

Imprimerie de la Manutention à Mayenne Dépôt légal: juillet 1984 d’Editeur : 4150

Après «ORIC-1 à la conquête des jeux», Voici maintenant _ &ATMOS à la conquête des jeux », qui reprend l'ouvrage précé- dent en y ajoutant toutes les améliorations de l'ATMOS.

«ATMOS à la conquête des jeux » se propose de vous entrai- ner dans son univers de programmes, celui des jeux, des dessins en couleur, des sonorités synthétiques informatiques. Vous y rencontrerez une gentille petite chenille, six caméléons et quel- ques gloutons. Vous voyagerez dans l'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 ATMOS et, pourquoi pas, programmer vos jeux. Pour vous aider et vous guider dans ce labyrinthe aux 65536 adresses, «ATMOS à la conquête des Jeux » vous révèle le contenu de la mémoire de ATMOS, 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 | 8706

| see

| CCE TES EN