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 où 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 dé 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 dé 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 YŸ 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, où 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 où 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 où 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" --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 où 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 dé 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à l'indicatif de ‘’ Rencontres du 3° 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.
2° coup: On déplace le grand disque de la tige de gauche à celle de droite.
3° 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 4û 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 où 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 4û 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 2° 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 < Sé ) 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 où 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 où 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 eÙ :
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 où 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) OÙ 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 où 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
1û zû 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 OÙ 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) OÙ 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 OÙ 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) ;
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" Où ù + x";SPC(16);"x"
PRINT" #0 ù Où % 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 2° é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 où 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 où 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 où 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 4Ù
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'Pour effacer un point:" PRINT'"-On amene le curseur" PRINT" sur le point"
PRINT"-QOn frappe la barre"
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 où 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 où 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 où 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 où se trouve 19ou #13 le curseur. 616 ou 268 numéro de la ligne où est le curseur (Q à 27. 617 ou #269 numéro de la colonne où 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 où se trouve le curseur est stockée en 18-19.
En 616 est stocké le numéro de la ligne courante, où sera affichée le prochain caractère. Normalement, ceci correspond à la ligne où se trouve le curseur. En 617 est stocké le numéro de la colonne où 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 où 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 où 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 8° 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 où 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 né 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 où 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 2° 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.
oÙ
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 ), YŸ 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 où 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 où 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 où 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 YŸ
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 YŸ et l'opérande, positionne les indicateurs. Décrémente d'une unité l'opérande.
Décrémente d'une unité le registre X.
Décrémente d'une unité le registre Y.
"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 JŸ
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 N° 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