★ AMSTRAD CPC ★ GAMESLIST ★ BILLARD AMERICAIN (c) CPC REVUE ★

CPC REVUE

Ce logiciel est un simulateur de billard américain ou “pool” avec 15 boules numérotées et une blanche. Il y a en fait 2 règles, la première est décrite dans les livres spécialisés et celle qui est utilisée dans les “cafés”. La différence essentielle se situe à plusieurs niveaux : le comptage des points, les pénalités, le côté du joueur. Ces deux règles sont donc intégrées dans le logiciel, les joueurs choisissant celle avec laquelle ils préfèrent jouer. Est incluse aussi la façon de tirer sur la boule de choc, soit par un affichage de la queue de billard directement sur la table, soit par une représentation sur le côté, cette dernière façon de faire étant nettement plus difficile pour tirer dans une direction particulière. Les principales règles sont incluses dans le programme.

LE PROGRAMME se compose de plusieurs modules chaînés entre eux. Le programme "BILLARD" est il un chargeur qui positionne le HIMEM à &86AE afin de pouvoir charger le programme "DATA.IMG", résultat de la compilation d'une image faite à partir d'un logiciel de dessin. Le programme suivant appelé DATA.DEC est un décompilateur oui va afficher le dessin de présentation pendant que les autres programmes se chargent. On trouve le programme OBJET qui est le programme en langage machine de déplacement des boules. Puis la procédure se termine par le chargement du programme BASIC principal. Une fois charge on demande au joueur les règles désirées, c'est-à-dire les règles officielles ou les règles de "café", en fonction de la réponse, le calcul des points sera différent. L'affichage direct est le mode le plus simple car la représentation de la queue se fait directement sur la table, alors que l'affichage sur le côté est une représentation de la direction par rapport à la boule. Une fois ces questions complétées, l'écran devient noir puis au bout de quelques instants, l'écran de jeu apparaît.

A gauche, il y a la table de billard vue du dessus. A droite, en haut, il y a les cases contenant les boules qui tomberont dans les blouses. En dessous les scores des joueurs s'inscrivent. Juste au-dessus du score d'un joueur, se trouve un point jaune indiquant lequel des deux joueurs va jouer. Dans le cas des règles de café, le joueur ne s'affiche pas aussi longtemps qu'aucune boule n est tombée dans une blouse. Les joueurs jouent donc à tour de rôle. A droite de la table se trouve la valeur des boules, elles sont numérotées de haut en bas et de gauche à droite, les dizaines ne sont pas indiquées mais sont comptées dans le jeu. Suivent trois tableaux de détermination du tir. La boule blanche isolée ou entourée par un segment blanc représente la boule de tir. Dans le cas de la méthode de tir sur le côté, le segment blanc représente la direction du tir. Juste'en dessous se trouve une représentation symbolique d'une boule et la fin de la queue afin de simuler la position de la queue par rapport à la boule pour lui imprimer un effet. Pour finir, en dessous, se trouve une règle graduée qui détermine la force du tir. " "

Le programme assembleur...

De &9000 à &935F il y a les dessins des boules de billard. Etant donné que l'affichage se fait en mode 0, il y a 2 représentations pour une boule. Le dessin des boules de deux couleurs a été inversé afin de simuler un mouvement de la boule. Théoriquement la gestion des sprites se fait par un programme spécialisé qui comprend la hauteur et la largeur. Ici, ce n'est pas nécessaire étant donné qu'il n'y a qu'un seul type de sprite, en l'occurrence les boules de billard. En fonction de la position paire ou impaire de la boule, on affiche l'un ou l'autre sprite de la même boule.

Les tables RTA1 et RTA2 sont celles utilisées par le programme de gestion de l'effet. En fait, l'effet se matérialise par une modification de l'angle, soit dans le sens trigonométrique, soit dans l'autre sens ; il y a donc deux tables. Pour avoir la déviation modifiée, il suffit de chercher dans la table la valeur de DX et DY, puis de prendre les deux valeurs suivantes.
Table DRO et GAU : les deux premiers octets donnent I indice dans la table, on obtient les coordonnées d'affichage de la boule quand elle tombe dans un trou, il suffit d'afficher aux coordonnées X et Y la boule correspondante puis d'incrémenter le pointeur, pour préparer la boule suivante.

La table TT est la table des trous... Elle est divisée en trois colonnes, les deux premières colonnes sont les positions des trous, la troisième donne l'octet pour la mise à jour dans la table TBT.
Les octets FPX et FPY contiennent la future position de la boule avant affichage.
Les octets TBXY mémorisent la table des chocs.
Les octets APXY contiennent la position actuelle de la boule.
Les octets RE servent pour affecter les registres IX et IY.
Lorsqu'une boule tombe dans un trou grâce à l'octet de la troisième colonne de la table TBT, on met à jour cet octet, ce qui permettra de déterminer si elle tombe a droite ou à gauche.

LA TABLE DES CHOCS. TBC

             ;  ------------ GAUCHE
             ;  | | | ------ DROITE
   Octet       | | | | | |
   TBC-1   7 6 5 4 3 2 1 0
             ;  | | | | | |
   BAS --------- | | | | ------ HAUT
MILIEU ----------- | | |------- MILIEU
  HAUT ------------| |--------- BAS

 


Les tables T1 à T8, en fonction du déplacement de la boule, il y a choc si et seulement si une boule se trouve aux positions adéquates, ces tables donnent les positions relatives en fonction du déplacement de la boule sachant que le premier octet donne le nombre de positions possibles d'une boule.

TABLE TCB

Table relative pour chaque boule
En 0 et 1 on a l'adresse du sprite à afficher.
Y et X est la position de la boule.
DY et DX correspondent à la déviation en x et y. En faisant une rotation sur ces octets, s'il y a débordement, alors il y a modification de la position de la boule. Vitesse : reflet de la vitesse de la boule, elle varie de 1 à 10.
L'octet SS est spécial : en fonction des bits positionnés et des octets DY et DX on peut déterminer le sens et la direction de la boule.
Pour chaque boule il y a donc &20 octets de réservés afin de gérer tous les déplacements des boules.
Les tables TS et TC sont des simili tables de sinus et cosinus qui donnent en fonction d'un angle et de la vitesse, la vitesse résultante.

La table TBT correspond aux boules tombées.

En &98AD commence le programme proprement dit, il gère le déplacement des boules de billard et ne rend la main au programme BASIC que lorsque toutes les boules se sont immobilisées. Les explications contenues dans le listing source doivent être suffisantes pour comprendre l'algorithme, en résumé,

&98ADà &997A C'est la boucle principale, c'est ici qu'est gérée l'initialisation du nombre ae chocs sur la bande, le nombre de boules en mouvement, l'initialisation du registre IX qui pointe sur la table TCB de la boule en mouvement, la vitesse de la boule avec le ralentissement. Le déplacement de la boule se fait par appel à un sous-programme en &997C, l'affichage des boules tombées dans une blouse, la mise à jour de la table TBT, l'effacement et l'affichage de la boule à sa nouvelle position et enfin c'est ici que l'on détermine s'il y a encore une boule en mouvement.

&997C à &99E2 On aère le déplacement de chaque boule, on calcule la position future de la boule et avec un appel au sous-programme TCHOC, on vérifie s'il y a un choc, si oui, on continue sur CHOC sinon on passe à la position suivante. Le nombre de déplacements dépend de la vitesse.

&99E3 à &9A72 Sous-programme de test en cas de choc. On commence à ini-tialiser la table des chocs, puis on vérifie s'il y a un choc sur la bande ou une chute dans une blouse. Sinon on charge la table des coups en fonction de la direction de la boule. C'est à partir de cette table que l'on vérifie s'il y a choc avec une autre boule.

&9A73 à &9AB6 On initialise le registre HL avec une des tables T1 à T8 en fonction de la direction de la boule.

&9AB7 à &9AD1 Mise à jour de la table TBC dans le cas de choc avec une boule.

&9AD4 à &9B4A C'est ici que se fait le test pour savoir si la boule tape contre une banae ou bien tombe dans une blouse.

&9B4B à &9B6A On initialise le sprite d'affichage de la boule en fonction de la position de la boule (position paire ou impaire en x).

&9B6B à &9B7B  Mise à jour de la table TBC

&9B7C à &9EAE C'est la partie la plus importante du programme, c'est ici que l'on gère les chocs entre les boules ou contre la bande. On teste si la boule est tombée dans un trou, si oui, on arrête le sous-programme sinon on regarde si c'est un choc de côté, si oui, on ralentit la boule, on incrémente pour cette boule le nombre de chocs bande, on met à jour le côté du choc, on calcule la nouvelle direction puis on saute au programme qui gère l'effet. Dans le cas d'un choc avec une boule, on met à 0 les octets qui servent pour ce choc, on initialise le registre IY avec l'adresse de la boule choquée, on calcule l'octet SS de la boule choquée, ensuite les directions DX2 et DY2 en fonction du choc, enfin l'angle de choc.

On initialise ensuite DX1 et DY1 afin de pouvoir calculer l'angle de rebond de la boule en mouvement. On calcule la vitesse des boules choquées à partir du calcul précédent des angles et de la table des "sinus" puis la vitesse résultante de la boule de départ à partir de la table des "cosinus". Pour terminer, on gère l'effet, tout simplement en modifiant l'angle de rebond en fonction du sens.

Sachant que l'octet qui se trouve en (IX +#11) correspond à l'effet, on y met le nombre déterminé par la déviation de la queue sur la boule et en fonction du sens, on positionne le bit 8. En cas de choc, on inverse le sens de rotation de la boule.

Suivent un certain nombre de sous-programmes : le premier détermine l'angle de la boule en fonction du sens et de la déviation en X et Y de la boule. Sachant que le cercle trigonométrique ici ne comporte que 32 angles différents. Ensuite on trouve le sous-programme SAN qui est en fait un sous-programme de CAN.
Le sous-programme MAN est utilisé par le sous-programme EFFET et c'est lui qui modifie l'angle de rebond à droite ou à gauche, il utilise les sous-programmes qui suivent et qui sont : XP, XN, YP et YN.
Afin d'avoir un affichage constant des boules le sous-programme AT est une temporisation variable qui dépend du nombre de boules en mouvement.

Le sous-programme CPT affiche les boules tombées dans les blouses.

Le bruitage est effectué par le sous-programme BRU qui utilise les 3 tables TBR1, TBR2 ETTBR3, pour charger les registres du PGES.

Le programme AFF est celui qui permet d'afficher les sprites des boules, il a été adapté pour ce jeu afin de gagner en rapidité et pour avoir un affichage au pixel.

En &A100, c'est l'appel par le BASIC pour afficher une boule, appelé par CALL &A1 00, x, y, ad avec x et y la position de la boule et ad l'adresse du sprite à afficher.

En &A1 10, c'est l'initialisation des tables DRO, GAU et TBT en début de partie.

Quelques informations supplémentaires

La vitesse : à partir du BASIC, on détermine la force par la variable FO qui est "pokée" en IX + 6, en supposant que IX pointe sur la boule que l'on frappe. Donc, en IX + 6 on a un octet compris entre 1 et 10, en IX + 10, on a au départ 0, on ajoute une valeur égale à # 1 0 à chaque fois que l'on déplace la boule. Quand cet octet déborde, on décrémente la vitesse, donc l'octet IX+ 6. Ainsi lorsque l'octet IX + 6 arrive à 0, la boule s'arrête. C'est l'octet IX +#10 que j'ai appelé "décimale" dans le programme source.

Le programme BASIC principal

10 à 90 Demande des règles
100 Demande types de rèqles et de tir
110 à 190 Data d'initialisation de la table TCB
200 à 240 Data des angles de tir
250 à 450 Initialisation des variables
460 à 550 Raz des couleurs
560 à 590 Dessin de la table
600 à 680 Dessin des quatre coins
690 à 720 Dessin des quatre boulons
730 à 760 Dessin des quatre rebords
770 à 820 Dessin des diamants
830 à 1000 Dessin des trous
1010 à 1060 Dessin du titre
1070 à 1100 Affichage de "BILLARD"
1110 a 1200 Dessin du tableau des scores
1210 à 1330 Dessin du tableau de la direction et de la force
1340 à 1450 Dessin de la valeur des boules
1460 à 1490 Dessin de la boule de choc
1500 à 1640 Dessin des boules sur la table
1650 Initialisation de la partie
1660 à 1720 Mise à jour des couleurs après dessin de l'écran
1730 a 1760 Affichage du score des joueurs
1770 Positionnement de la boule blanche sur la table
1790 à 2100 GESTION DE LA DIRECTION DU TIR
1830 à 1870 On affiche la boule de tir
1880 Test si fin de partie
1890 Mise à 0 de la partie décimale de la vitesse
1900 à 1950 En fonction de AF on affiche la queue au niveau de la table ou sur le côté
1960 à 2010 Entrée d'un caractère
2020 à 2100 En fonction de la touche enfoncée, ou de la méthode de tir, on affiche la queue de billard
2110 à 2210 GESTION DE L'EFFET
2220 à 2330 GESTION DE LA FORCE DE TIR
2340 à 2480 DEPLACEMENT DES BOULES
2390 à 2410 On initialise les variables de la boule
2420 à 2430 Mise à jour en mémoire des variables dans la table TCB
2440 S'il s'agit des règles officielles, on mémorise la position des boules
2450 Mise à 0 de l'octet &940F
2460 Raz du nombre de chocs sur les bandes Déplacement des boules par appel au sous-programme en
langage machine
Comptage du nombre de chocs sur les bandes
2470 Détermination du nombre de boules tombées
2480 Raz du nombre de boules tombées
2490 à 2920 CALCUL DES POINTS
2540 Détermination en fonction de la règle
2550 à 2730 Règles de café
2740 à 2920 Règles officielles
2930 à 3050 FIN DE PARTIE
3060 à 3190 AFFICHAGE DU SCORE ET DU JOUEUR
3090 à 3120 Affichage du joueur
3130 a 3190 Affichage du score des joueurs
3200 a 3320 Calcul des points en fonction de la position des boules tombées et de leurs valeurs
3330 à 3390 Sous-programme de remise à zéro du nombre de chocs sur la bande
3400 à 3490 Sous-programme de comptage du nombre de chocs sur la bande
3500 à 3670 Sous-programme de déplacement de la boule blanche sur la table d'effacement
3680 à 3780 Sous-programme de la boule blanche lorsqu'elle tombe dans une blouse
3790 à 3850 Sous-programme de mémorisation de la position des boules numérotées
3860 à 3930 Sous-programme de vérification de la position des boules
3940 à 4380 Règles du jeu
4390 à 4420 Détermination du type de la règle
4430 à 4470 Détermination de la méthode de tir

Les variables principales

A Angle de tir
AF Couleur de la queue définie au départ en fonction de la méthode de tir
AN Ancien angle de tir
ANBT Adresse de la boule de tir
BT Nombre de boules tombées
CO Côté des boules tombées
D Effet
DE Effet corrigé
FL Flag mis à 1 si la boule de choc est tombée dans une blouse
FL1 Flag mis à 1 si une boule au moins est tombée à droite
FL2 mis à 1 si une boule au moins est tombée à gauche
FL3 Flag mis à 1 s'il n'y a pas eu de mouvement de boule après le tir
FO Force de tir
FSP Flag d'affichage de la boule blanche en fonction de sa position
I1,I2 Permet l'affichage de la détermination du joueur
JOUEUR Numéro du joueur à jouer
JOUEUR1 Score du joueur 1
JOUEUR2 Score du joueur 2
MAF Matrice contenant les angles de tir
MPX,MPY Mémorisation de la position des boules avant le tir
NB Numéro de la boule tombée
NBC1 Nombre de chocs sur la bande de la première boule numérotée
NBC2 Nombre de chocs sur la bande des autres boules numérotées
NBTI Numéro de la boule de choc
OUV Flag permettant de savoir si c'est le début de jeu dans le cas d'une partie avec les règles officielles
PB Flag mis à 1 si la boule blanche est tombée dans une blouse
PE Point de pénalité
PK Adresse de la boule de choc dans la table  TCB
POSX, POSY Position de la boule blanche lors de la mise en place sur la table
RE Flag déterminant le type de règles choisi
SP Matrice d'adresse des sprites
SS Octet SS mis à jour dans la table TCB pour déplacement de la boule
TBT Comptage du nombre de boules tombées au cours de la partie
TOT Nombre de points par le comptage des boules numérotées au cours du coup
TOTD Total des points à droite
TOTG Total des points à gauche
TT Adresse dans la table GAU ou DRO du pointeur
VX, VY Position en X et Y de la boule de choc
X1, X2 Mémorisation de la position de la queue avant déplacement
X3, X4 Position de la queue après déplacement
XP, YP Position de la queue
AFO$ Mode d'affichage graphique normal
AF1$ Mode d'affichage graphique XOR
J1$ Chaîne représentant le score du joueur 1
J2$ Chaîne représentant le score du joueur 2

Que les dieux informatiques nous pardonnent ! Les (nombreux) lecteurs qui nous ont téléphoné avaient deviné que le programme publié dans le numéro 33 était en Assembleur. Il fallait donc posséder un programme permettant d'entrer les codes. Cette longue liste n'est pas inutile puisque vous réclamez souvent des listings Assembleur commentés, ainsi que des jeux bien réalisés.

PROCEDURES
DE CHARGEMENT

Si vous avez un Assembleur et si vous avez réussi, grâce à la fin du listing paru dans ce numéro, à obtenir un listing objet (OBJET.BIN), alors vous n'aurez pas de problèmes pour rassembler les morceaux du puzzle.

SANS ASSEMBLEUR

Le numéro précédent vous a permis d'apprendre par coeur le mode . d'emploi, donc plus de problèmes de ce côté-là. En revanche, le chargement des programmes risaue de vous poser quelques problèmes. Récapitulons donc la marche à suivre, deux cas se distinguant : vous possédez un lecteur de disques ou bien un lecteur de cassettes.

VERSION DISQUE

Tapez et chargez tous les listings, c'est-à-dire : "LISTING1", "LISTING2", "BILLARD.BAS", "BILLARD1 .BAS".
Une fois toutes les vérifications d'usage effectuées, tapez RUN "LISTING1", le lecteur se met en marche puis l'écran affiche READY. Tapez RUN "LISTING2", le déroulement est identique à la séquence précédente. Maintenant, le programme est prêt : il ne vous reste qu'à taper RUN "BILLARD" pour lancer le tout.

VERSION CASSETTE

Les choses se compliquent un peu : il faut utiliser deux cassettes pour ne pas trop se perdre dans les dédales informatiques.
La première cassette (ou cassette n° 1) devra contenir tous les programmes parus dans ce numéro sauf les listings Assembleur bien sûr.
Sur la cassette n° 2, vous devez tout d'abord enregistrer le listing "BILLARD". Ensuite, il faut reprendre la cassette n° 1 et charger le programme "LISTING1" en mémoire par un LOAD "LISTINGl". Replacez la cassette n° 2 et tapez RUN. Suivez les instructions inscrites à l'écran (PRESS REC AND PLAY).
Une fois la sauvegarde automatique effectuée, il suffit de reprendre la prodédure en remplaçant le programme "LISTING1" par "LISTING2".
Enfin, le programme "BILLARD1" est à placer en deuxième position. Si vous faites un CAT sur la cassette, vous devez obtenir l'ordre suivant : BILLARD.BAS - DATA.IMG - DATA.DEC - OBJET.BIN - BILLARD1. BAS.
Pour lancer le programme, il suffit de taper "RUN".

Bon courage !

CPC n°32,33

BILLARD AMERICAIN
(c) CPC REVUE

AUTEUR: Lionel GARDEUR

★ ANNÉE: 1988
★ LANGAGE:
★ GENRE: INGAME MODE 0 , BOARD , POOL

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Billard  Americain    FRENCHDATE: 2013-08-30
DL: 65 fois
TYPE: ZIP
SIZE: 34Ko
NOTE: 40 Cyls
.HFE: OUI

Je participe au site:
» Newfile(s) upload/Envoye de fichier(s)

QUE DIT LA LOI FRANÇAISE:

L'alinéa 8 de l'article L122-5 du Code de la propriété intellectuelle explique que « Lorsque l'œuvre a été divulguée, l'auteur ne peut interdire la reproduction d'une œuvre et sa représentation effectuées à des fins de conservation ou destinées à préserver les conditions de sa consultation à des fins de recherche ou détudes privées par des particuliers, dans les locaux de l'établissement et sur des terminaux dédiés par des bibliothèques accessibles au public, par des musées ou par des services d'archives, sous réserve que ceux-ci ne recherchent aucun avantage économique ou commercial ». Pas de problème donc pour nous!

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 110 millisecondes et consultée 1129 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.