MO5 Kandy Krush Java

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
farvardin
Messages : 436
Inscription : 27 déc. 2014 16:07
Contact :

Re: MO5 Kandy Krush Java

Message par farvardin »

Très bien la nouvelle animation, c'est beaucoup plus parlant. Merci d'avoir pris en compte cette remarque !
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: MO5 Kandy Krush Java

Message par jasz »

farvardin a écrit :Très bien la nouvelle animation, c'est beaucoup plus parlant.
En effet c'est nettement mieux ainsi 8)
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: MO5 Kandy Krush Java

Message par __sam__ »

Bah perso j'aimais bien le bruit lié au remplissage de la grille de départ. Mais bon.

Une remarque: Quand on est en mode auto, on entend le son de nouvelle partie. Je sais pas si c'est voulu, mais du coup il n'est pas silencieux dans ce mode.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: MO5 Kandy Krush Java

Message par Daniel »

Oui, j'ai laissé volontairement le son de début de partie en jeu automatique, et j'ai supprimé les son de remplissage de la grille qui énervait les occupants de la pièce quand je testais le jeu :wink:
Bon, ce n'est peut-être pas la bonne solution. Pour contenter tout le monde il faudrait pouvoir paramétrer tous les effets. Si le son est gênant, on peut mettre le volume à zéro dans les options de dcmoto. Avec l'exécutable Windows, vous pouvez régler le volume du son du PC.

Nouveauté du jour : Version TO sur disquette, carte SD et cartouche MEMO7
http://dcmoto.free.fr/programmes/kandykrush/index.html

Image

Je ne voulais pas frustrer les thomsonistes qui n'ont pas de MO. La version TO fonctionne sur TO7, TO7/70, TO9, TO8, TO8D, TO9+.

Sur TO7 les versions disquette et carte SD nécessitent l'extension 16K, sinon il n'y a pas assez de place pour charger le DOS.
Sur TO7 sans extension mémoire vous pouvez utiliser la version MEMO7, ou copier le programme KANDY7.BIN sur cassette.
Il se lance par LOADM"",,R

Image
Daniel
L'obstacle augmente mon ardeur.
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: MO5 Kandy Krush Java

Message par jasz »

Daniel a écrit :Je ne voulais pas frustrer les thomsonistes qui n'ont pas de MO. La version TO fonctionne sur TO7, TO7/70, TO9, TO8, TO8D, TO9+.
Je me disais aussi! Te connaissant ^^ :mrgreen:

PS. Ce serait bien d'avoir les dernières sources afin de les étudier. Enfin cela n'a aucune espèce d'obligation
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: MO5 Kandy Krush Java

Message par Daniel »

Les sources ne sont pas très propres car j'ai fait beaucoup de modifications ces derniers jours. Je les publierai plus tard sur le site dcmoto, après les avoir arrangées. En attendant voici le brouillon de la version TO.

Code : Tout sélectionner

/**************************************************\
*             TO7 KANDY KRUSH JAVA                 * 
*           (c) 2016 - Daniel Coulom               *  
*           http://dcmoto.free.fr/                 *
*           http://forum.system-cfg.com/           *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune  garantie  et *
* sans  engager  la  responsabilité  de  l'auteur. *
* Vous  pouvez  l' utiliser,  le  modifier  et  le *
* diffuser librement, en conservant cette  licence *
* et les références de l'auteur dans   toutes  les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/

* La version TO7 necessite de modifier :
* La routine affichage pastille (calcul couleur)
* La routine affichage chaine SWI --> JSR $6803
* les lectures clavier et test touches
* La routine effacement (octet couleur)
* La sequence escape pour ATTRB 1,1
* L'adresse de l'écran $0000 --> $4000
* Les adresses des pastilles
* La commutation de page video $A7C0 --> $E7C3
* Le bit buzzer $A7C1(b0) --> $E7C1(b3)
* Le graphisme du titre

/**************************************************\
*                Version 2016.10.06                *
\**************************************************/
* Historique
* 2016.10.06 Version originale (clone version MO5)     
  
*===========================================
* INITIALISATIONS
*===========================================  
  ORG   $9000
  LDX   #SCRINIT   chaine d'initialisation ecran 
  LBSR  CHAINE     initialisation ecran 
  LBSR  BITMAP     affichage du titre
INIT
  LDD   #$0000     zero dans D 
  STD   COUPS      remise a zero du nombre de coups
  STD   SCORE      remise a zero du score
  LDX   #SCRNEW    chaine pour ecran de debut partie 
  LBSR  CHAINE     affichage ecran de debut partie 
  LDX   #MAIDE     chaine du message pour l'aide
  LBSR  CHAINE     affichage du message pour l'aide  
  LBSR  DPARTIE    affichage du numero de partie
  LBSR  COULINI    initialisation des couleurs
  LBSR  TDISP      affichage de toutes les pastilles
  INC   JEUAUTO    pour supprimer le clignotement 
  LBSR  PALIGN     recherche alignements
  DEC   JEUAUTO    pour retablir le parametre
  LBSR  EFFBUZ     signal de debut de jeu   
  LBSR  EFFBUZ     signal de debut de jeu
  
*===========================================
* DEROULEMENT DU JEU
*===========================================  
JEU
  LBSR  DSCORE     affichage du score
  LDA   JEUAUTO
  BEQ   JEU1       jeu manuel
  LBSR  AUTOMAT    jeu automatique
  LBRA  SUIVANT    passage au coup suivant
JEU1
* SWI              lecture rapide clavier MO5
* FCB   $0C   
* CMPB  #$0C       'A' pour Aide MO5
  JSR   $E806      lecture clavier TO7
  ANDB  #$DF       majuscule
  CMPB  #$41       'A' pour Aide TO7
  BNE   JEU2
  LBSR  AIDE       affichage de l'aide
  BRA   JEU        affichage du score
JEU2
* CMPB  #$37       'J' pour Jeu automatique MO5
  CMPB  #$4A       'J' pour Jeu automatique TO7
  BNE   JEU3
  LDA   #$01
  STA   JEUAUTO    indicateur de jeu automatique
  BRA   JEU
JEU3
* SWI              contact crayon optique MO5
* FCB   $16
  JSR   $E81B      contact crayon optique TO7
  BCC   JEU1       attente appui
* SWI              coordonnees crayon optique MO5
* FCB   $18
  JSR   $E818      coordonnees crayon optique TO7

* test de la colonne pointee
  TFR   X,D
  LSRD
  LSRD
  LSRD
  TFR   D,X
  CMPX  #$0011
  LBLT  ERROR      trop a gauche
  CMPX  #$0026
  LBGT  ERROR      trop a droite

* test de la ligne pointee
  TFR   Y,D
  LSRD
  LSRD
  LSRD
  TFR   D,Y
  CMPY  #$0005
  BLT   ERROR      trop haut
  CMPY  #$0017
  BGT   ERROR      trop bas

* test pointage centre pastille
  TFR   X,D
  SUBD  #$0011     centre premiere pastille
  LBSR  DMOD3
  PSHS  B
  TFR   Y,D
  SUBD  #$0005     centre premiere pastille
  LBSR  DMOD3
  PULS  A
  ADDB  -1,S
  BEQ   ERROR   

* permutation horizontale
HORIZ
  TFR   Y,D
  SUBD  #$0005     centre premiere pastille
  LBSR  DMOD3
  BNE   VERT
  PSHS  Y,X
  LBSR  PINVH
  LBSR  PALIGN     recherche alignements
  PULS  X,Y
  BCS   SUIVANT    alignement trouve
  LBSR  PINVH      retablissement position
  BRA   ERROR   

* permutation verticale
VERT
  TFR   X,D
  SUBD  #$0011     centre premiere pastille
  LBSR  DMOD3
  BNE   ERROR
  PSHS  Y,X
  LBSR  PINVV
  LBSR   PALIGN    recherche alignement
  PULS  X,Y
  BCS   SUIVANT    alignement trouve
  LBSR  PINVV      retablissement position
  BRA   ERROR   
  
*===========================================
* PASSAGE AU COUP SUIVANT
*===========================================  
SUIVANT
  LDD   COUPS
  ADDD  #$0001
  STD   COUPS
  CMPD  COUPMAX    fin de partie apres n coups
  BEQ   FIN
  LBRA  JEU        suite du jeu

*===========================================
* ERREUR DE POINTAGE
*===========================================  
ERROR
  LDX   #$0800     hauteur note
  LDA   #$10       longueur note           
  LBSR  BUZZ
  LBRA  JEU

*===========================================
* FIN DE PARTIE
*===========================================  
FIN
  LDD   SCORE
  CMPD  MAX
  BLT   FIN0
  STD   MAX
FIN0  
  LDA   JEUAUTO    indicateur de jeu automatique
  LBNE  INIT       nouvelle partie automatique
FIN1
  LBSR  DSCORE  
  LDX   #MAPPUI    message appui sur une touche
  LBSR  CHAINE      
  LDX   #FPARTIE   message fin de partie
  LBSR  CHAINE     
FIN2
* SWI              lecture rapide clavier MO5
* FCB   $0C   
  JSR   $E809      lecture rapide clavier TO7
  BCC   FIN2
  LBRA  INIT
  
*===========================================
* JEU AUTOMATIQUE
*===========================================  
AUTOMAT
  LDB   #$37

* test permutation horizontale  
AUTO1
  TFR   B,A
  ANDA  #$07
  CMPA  #$07
  BEQ   AUTO3      permutation horizontale impossible 
  LBSR  CINVH      permutation horizontale
  PSHS  B
  LDB   #$37
AUTO2
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   AUTO9      alignement trouve
*  LBSR  TSTAV      test alignement vertical en B 
*  BCS   AUTO9      alignement trouve
  DECB
  BGE   AUTO2
  PULS  B
  LBSR  CINVH      retablissement des couleurs

* test permutation verticale  
AUTO3
  CMPB  #$2F
  BGT   AUTO5      permutation verticale impossible
  LBSR  CINVV      permutation verticale
  PSHS  B
  LDB   #$37
AUTO4
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   AUTO9      alignement trouve
*  LBSR  TSTAV      test alignement vertical en B 
*  BCS   AUTO9      alignement trouve
  DECB
  BGE   AUTO4
  PULS  B
  LBSR  CINVV      retablissement des couleurs
AUTO5
  DECB
  CMPB  #$1F
  BNE   AUTO1

AUTO10

* test permutation horizontale
  LDB   #$37
AUTO11
  TFR   B,A
  ANDA  #$07
  CMPA  #$07
  BEQ   AUTO13     permutation horizontale impossible 
  LBSR  CINVH      permutation horizontale
  PSHS  B
  LDB   #$37
AUTO12
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   AUTO9      alignement trouve
  LBSR  TSTAV      test alignement vertical en B 
  BCS   AUTO9      alignement trouve
  DECB
  BGE   AUTO12
  PULS  B
  LBSR  CINVH      retablissement des couleurs

* test permutation verticale  
AUTO13
  CMPB  #$2F
  BGT   AUTO15     permutation verticale impossible
  LBSR  CINVV      permutation verticale
  PSHS  B
  LDB   #$37
AUTO14
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   AUTO9      alignement trouve
  LBSR  TSTAV      test alignement vertical en B 
  BCS   AUTO9      alignement trouve
  DECB
  BGE   AUTO14
  PULS  B
  LBSR  CINVV      retablissement des couleurs
AUTO15
  DECB
  BGE   AUTO11

AUTO6
  LBSR  TDISP      affichage de toutes les pastilles
AUTO7
  BRA   AUTO7      pas de coup trouve

AUTO9
  PULS  B
  LBSR  PALIGN     recherche alignements

  RTS

*===========================================
* CALCUL DE D MODULO 3
* RESULTAT DANS D
*===========================================  
DMOD3
  SUBD  #$03
  BGE   DMOD3
  ADDD  #$03
  RTS

*===========================================
* CALCUL DE B MODULO 8
* RESULTAT DANS B
*===========================================  
BMOD8
  SUBB  #$08
  BGE   BMOD8
  ADDB  #$08
  RTS

*===========================================
* TEST ALIGNEMENT HORIZONTAL EN B
* CARRY SET SI ALIGNEMENT TROUVE
*===========================================  
TSTAH
  PSHS  B
  BSR   BMOD8      B modulo 8
  CMPB  #$05
  PULS  B
  BGT   TSTAH8     pas d'alignement en fin de ligne
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur pastille B 
  LEAX  1,X
  CMPA  B,X        couleur pastille B+1
  BNE   TSTAH8
  LEAX  1,X
  CMPA  B,X        couleur pastille B+2
  BNE   TSTAH8
  TST   JEUAUTO
  BNE   TSTAH7
  BSR   CLIGH      clignotement de l'alignement
TSTAH7
  COMA             set carry (trouve)
  BRA   TSTAH9
TSTAH8
  CLRA             clear carry
TSTAH9
  RTS

*===========================================
* CLIGNOTEMENT ALIGNEMENT HORIZONTAL EN B
*===========================================  
CLIGH
* effacement des pastilles
  BSR   EFFH 
* affichage des pastilles
  ADDB  #$02
  LBSR  PDISP
  DECB
  LBSR  PDISP
  DECB
  LBSR  PDISP
* signal sonore
  LDX   #$00A0     hauteur note
  LDA   #$20       longueur note           
  LBSR  BUZZ
* effacement des pastilles
  BSR   EFFH       
  RTS

*===========================================
* EFFACEMENT 3 PASTILLES HORIZONTALES EN B
*===========================================  
EFFH
  PSHS  B          empilage numero de pastille
  BSR   EFFINI     initialisations 
  LDB   #$18       compteur de boucles
* effacement des pastilles
EFFH1
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  LEAX  $1F,X  
  DECB
  BNE   EFFH1
* signal sonore
  BSR   EFFBUZ
  PULS  B,PC

*===========================================
* SIGNAL SONORE EFFACEMENT ALIGNEMENT
*===========================================  
EFFBUZ
  LDX   #$0080     hauteur note
  LDA   #$30       longueur note           
  LBSR  BUZZ
  LDX   #$0060     hauteur note
  LDA   #$40       longueur note           
  LBSR  BUZZ
  RTS

*===========================================
* INITIALISATIONS POUR EFFACEMENT PASTILLES
*===========================================  
EFFINI
* LDA   $A7C0      PA du PIA systeme MO5
  LDA   $E7C3      PA du PIA systeme TO7
  ANDA  #$FE       RAZ bit0
* STA   $A7C0      video couleur MO5
  STA   $E7C3      video couleur TO7
  LDX   #PADDR     table des adresses
  LSLB             deplacement dans la table              
  LDX   B,X        adresse pastille B
* LDA   #$44       couleur fond/forme MO5 
  LDA   #$E4       couleur fond/forme TO7 
  RTS

*===========================================
* TEST ALIGNEMENT VERTICAL EN B
* CARRY SET SI ALIGNEMENT TROUVE
*===========================================  
TSTAV
  CMPB  #$27
  BGT   TSTAV8     pas d'alignement en fin de colonne
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur pastille B 
  LEAX  8,X
  CMPA  B,X        couleur pastille B+8
  BNE   TSTAV8
  LEAX  8,X
  CMPA  B,X        couleur pastille B+16
  BNE   TSTAV8
  TST   JEUAUTO
  BNE   TSTAV7
  BSR   CLIGV      clignotement de l'alignement
TSTAV7
  COMA
  BRA   TSTAV9
TSTAV8
  CLRA             clear carry
TSTAV9
  RTS

*===========================================
* CLIGNOTEMENT ALIGNEMENT VERTICAL EN B
*===========================================  
CLIGV
* effacement des pastilles
  BSR   EFFV 
* affichage des pastilles
  ADDB  #$10
  LBSR  PDISP
  SUBB  #$08
  LBSR  PDISP
  SUBB  #$08
  LBSR  PDISP
* signal sonore
  LDX   #$00A0     hauteur note
  LDA   #$20       longueur note           
  LBSR  BUZZ
* effacement des pastilles
  BSR   EFFV       
  RTS

*===========================================
* EFFACEMENT 3 PASTILLES VERTICALES EN B
*===========================================  
EFFV
  PSHS  B          empilage numero de pastille
  BSR   EFFINI     initialisations 
  LDB   #$48       compteur de boucles
* effacement des pastilles
EFFV1
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  LEAX  $25,X  
  DECB
  BNE   EFFV1
* signal sonore
  BSR   EFFBUZ
  PULS  B,PC
  
*===========================================
* RECHERCHE DES ALIGNEMENTS
* CARRY SET SI ALIGNEMENT TROUVE
*===========================================  
PALIGN
  CLRA             initialisation compteur 
  PSHS  A          empilage compteur alignements
PALIGN1

* alignement horizontaux
  CLRB
HALIGN1
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   HALIGN4    alignement trouve
  INCB
  CMPB  #$36 
  BEQ   VALIGN     alignement non trouve
  BRA   HALIGN1
HALIGN4
  LBSR  SUPPR
  INCB
  LBSR  SUPPR
  INCB
  LBSR  SUPPR
  INC   ,S
  BRA   PALIGN1

*alignement verticaux
VALIGN
  CLRB
VALIGN1
  BSR   TSTAV      test alignement vertical en B 
  BCS   VALIGN4    alignement trouve
  INCB
  CMPB  #$28 
  BEQ   VALIGN8
  BRA   VALIGN1
VALIGN4
  ADDB  #$10
  LBSR  SUPPR
  LBSR  SUPPR
  LBSR  SUPPR
  INC   ,S
  BRA   PALIGN1
VALIGN8
  PULS  A
  CMPA  #$00
  BEQ   VALIGN9
  COMA  #$01       set carry
VALIGN9
  RTS
  
*===========================================
* RECHERCHE ALIGNEMENT VERT OU HORIZ
* CARRY SET SI UN ALIGNEMENT EST TROUVE
*===========================================  
RALIG
  PSHS  B
  LDB   #$37
RALIG1
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   RALIG9     alignement trouve
  LBSR  TSTAV      test alignement vertical en B 
  BCS   RALIG9     alignement trouve
  DECB
  BNE   RALIG1
  CLRA             clear carry  
RALIG9  
  PULS  B,PC
  
*===========================================
* AIDE = RECHERCHE DES COUPS POSSIBLES
*===========================================  
AIDE
  LDX   #$0100     hauteur note
  LDA   #$10       longueur note           
  LBSR  BUZZ       signal sonore
  CLRA             compteur de coups possibles
  PSHS  A          empilage compteur de coups
  INC   JEUAUTO    pour supprimer animation et son

* test des permutations verticales
AIDE0
  CLRB
AIDE1
  LBSR  CINVV       inversion des couleurs
  BSR   RALIG       recherche d'un alignement        
  BCC   AIDE2       pas d'alignement trouve
  LBSR  PERMV       affichage permutation verticale
  INC   ,S          incrementation du compteur de coups
AIDE2
  LBSR  CINVV       retablissement des couleurs
  INCB
  CMPB  #$2F
  BLE   AIDE1

* test des permutations horizontales
  CLRB
AIDE3
  TFR   B,A
  ANDA  #$07
  CMPA  #$07
  BEQ   AIDE5       dernier pion de la ligne
  LBSR  CINVH       inversion des couleurs
  BSR   RALIG       recherche d'un alignement        
  BCC   AIDE4       pas d'alignement trouve
  BSR   PERMH       affichage permutation horizontale
  INC   ,S          incrementation du compteur de coups
AIDE4
  LBSR  CINVH       retablissement des couleurs
AIDE5
  INCB
  CMPB  #$37
  BLE   AIDE3

* mise a jour du score et attente d'une touche
  DEC   JEUAUTO    pour retablir la valeur initiale
  LDD   SCORE
  SUBD  #$000A     enlever 10 points
  BGE   AIDE6
  LDD   #$0000     si negatif remettre a zero
AIDE6  
  STD   SCORE      mise a jour du score 
AIDE7
  LDX   #MAPPUI 
  LBSR  CHAINE     affichage du message appuyer touche
AIDE8
* SWI              lecture rapide clavier MO5
* FCB   $0C   
  JSR   $E806      lecture clavier TO7
  BEQ   AIDE8      attente d'une touche
* CMPB  #$03       touche secrete ACC MO5 pour redemarrer
  CMPB  #$16       touche secrete ACC TO7 pour redemarrer
  LBEQ  INIT       redemarrage     

* retablissement de la configuration de jeu
  LBSR  TDISP      affichage de toutes les pastilles
  LDX   #$0080     hauteur note
  LDA   #$10       longueur note           
  LBSR  BUZZ       signal sonore 
  LDX   #MAIDE 
  LBSR  CHAINE     affichage du message pour l'aide

  PULS  A          compteur de coups possibles
  CMPA  #$00
  BNE   AIDE9      continuer s'il y a des coups possibles 

* reinitialisation en cas de blocage
  LBSR  COULINI    initialisation des couleurs
  LBSR  TDISP      affichage de toutes les pastilles 
  LBSR  PALIGN     recherche alignements

AIDE9
  RTS
  
*===========================================
* AFFICHAGE PERMUTATION HORIZONTALE POSSIBLE
*===========================================  
PERMH
  LDX   #PADDR
  TFR   B,A
  LSLA
  LDX   A,X
  LEAX  $192,X
* LDA   $A7C0      PA du PIA systeme MO5  
  LDA   $E7C3      PA du PIA systeme TO7  
  ORA   #$01       Set bit 0
* STA   $A7C0      selection video forme MO5   
  STA   $E7C3      selection video forme TO7  
  LDA   #$FF
  STA   ,X+
  STA   ,X+
  LEAX  $26,X
  STA   ,X+
  STA   ,X+
PERMH9
  RTS
  
*===========================================
* AFFICHAGE PERMUTATION VERTICALE POSSIBLE
*===========================================  
PERMV
  LDX   #PADDR
  TFR   B,A
  LSLA
  LDX   A,X
  LEAX  $2D1,X
* LDA   $A7C0      PA du PIA systeme MO5  
  LDA   $E7C3      PA du PIA systeme TO7   
  ORA   #$01       Set bit 0
* STA   $A7C0      selection video forme MO5   
  STA   $E7C3      selection video forme TO7  
  LDA   #$0A       compteur de boucles
  PSHS  A          empilage
  LDA   #$30
PERMV1
  STA   ,X
  LEAX  $28,X
  DEC   ,S
  BNE   PERMV1
  PULS  A
PERMV9  
  RTS

*===========================================
* ECHANGE DES COULEURS B ET B+1 (HORIZONTAL)
*===========================================  
CINVH
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur premiere pastille
  PSH   A
  INCB
  LDA   B,X        couleur deuxieme pastille
  DECB
  STA   B,X        deuxieme dans premiere
  PULS  A
  INCB 
  STA   B,X        premiere dans deuxieme
  DECB             retablissement valeur initiale
  RTS

*===========================================
* ECHANGE DES COULEURS B ET B+8 (VERTICAL)
*===========================================  
CINVV
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur premiere pastille
  PSH   A
  ADDB  #$08
  LDA   B,X        couleur deuxieme pastille
  SUBB  #$08
  STA   B,X        deuxieme dans premiere
  PULS  A
  ADDB  #$08
  STA   B,X        premiere dans deuxieme
  SUBB  #$08
  RTS
  
*===========================================
* INITIALISATION DES COULEURS VALEUR A
*===========================================  
COULINI
* LDA   $2031      valeur aleatoire MO5
  LDA   $6031      valeur aleatoire TO7
  INCA             pour changer de couleur
* STA   $2031      en jeu automatique MO5
  STA   $6031      en jeu automatique TO7
  LSRA
  ANDA  #$07
  BEQ   COULINI    pas de noir
  CMPA  #$04
  BEQ   COULINI    pas de bleu
  CMPA  #$07
  BEQ   COULINI    pas de blanc
  LDX   #PCOLOR    table des couleurs
  LDB   #$37       numero derniere pastille
COULINI1   
  STA   B,X
  DECB
  BGE   COULINI1
  RTS

*===========================================
* CALCUL DU NUMERO DE PASTILLE B
* FONCTION DE LIGNE ET COLONNE POINTEES
*===========================================  
CALNUM
* numero dans la ligne = Y/3
  TFR   Y,D        ligne pointee
  SUBD  #$0005     centre premiere pastille
CALNUM1
  INCA   
  SUBB  #$03
  BGE   CALNUM1     
  DECA
* multiplication par 8
  LSLA
  LSLA
  LSLA
  PSHS  A          empilage resultat
* numero dans la ligne = X/3   
  TFR   X,D        colonne pointee
  SUBD  #$0011     centre premiere pastille
CALNUM2
  INCA   
  SUBB  #$03
  BGE   CALNUM2
  DECA
* ajout du nombre de pastilles lignes precedentes  
  ADDA  ,S
  TFR   A,B
  PULS  A
  RTS

*===========================================
* INVERSION DE DEUX PASTILLES B ET B+1
*===========================================  
PINVH
  BSR   CALNUM     calcul du numero B
  BSR   CINVH      inversion des couleurs
  LBSR  PDISP      affichage premiere pastille
  INCB  
  LBSR  PDISP      affichage deuxieme pastille
  LDX   #$0080     hauteur note
  LDA   #$08       longueur note           
  BSR   BUZZ
  RTS

*===========================================
* INVERSION DE DEUX PASTILLES B ET B+8
*===========================================  
PINVV
  BSR   CALNUM     calcul du numero B
  BSR   CINVV      inversion des couleurs
  LBSR  PDISP      affichage premiere pastille
  ADDB  #$08
  LBSR  PDISP      affichage deuxieme pastille
  LDX   #$0080     hauteur note
  LDA   #$08       longueur note           
  BSR   BUZZ
  RTS
  
*===========================================
* TEMPORISATION EN FONCTION DE X
*===========================================  
TEMPO
  PSHS  X
TEMPO1
  LEAX  -1,X
  BNE   TEMPO1
  PULS  X,PC  

*===========================================
* EMISSION SIGNAL SONORE
* TEMPO DANS X
* DUREE DANS A
*===========================================  
BUZZ
* signal sonore
  ORCC  #$50       masque les interruptions
  PSHS  A          compteur duree note
* LDA   $A7C1      registre pour le buzzer MO5
  LDA   $E7C1      registre pour le buzzer TO7
BUZZ1
* ORA   #$01
* STA   $A7C1      buzzer MO5 a un 
  ORA   #$08
  STA   $E7C1      buzzer TO7 a un 
  BSR   TEMPO      temporisation 
* ANDA  #$FE
* STA   $A7C1      buzzer MO5 a zero
  ANDA  #$F7
  STA   $E7C1      buzzer TO7 a zero
  BSR   TEMPO      temporisation 
  DEC   ,S
  BNE   BUZZ1
  PULS  A 
  ANDCC #$AF       restaure les interruptions
  RTS

*===========================================
* SUPPRESSION PASTILLE B ET DESCENTE COLONNE
*===========================================  
SUPPR
  PSHS  B 
SUPPR1
  SUBB  #$08       pastille au-dessus
  BLT   SUPPR2     haut de colonne depasse
  BSR   SCROLL     scroll pastille
  BRA   SUPPR1     pastille suivante
SUPPR2   
* LDA   $2031      valeur aleatoire MO5
  LDA   $6031      valeur aleatoire TO7
  INCA             pour changer de couleur
* STA   $2031      en jeu automatique MO5
  STA   $6031      en jeu automatique TO7
  ANDA  #$07       valeur entre 0 et 7
  INCA
  CMPA  #$04       couleur de fond MO5
  BNE   SUPPR3
  LDA   #$05
SUPPR3   
  CMPA  #$06
  BLE   SUPPR4
  LDA   #$01
SUPPR4
  LDX   #PCOLOR    table des couleurs
  ADDB  #$08       premiere pastille colonne
  STA   B,X
  LBSR  PDISP      affichage pastille 
  PULS  B,PC 

*===========================================
* SCROLL PASTILLE B
*===========================================  
SCROLL
  LDA   JEUAUTO    indicateur de jeu automatique
  BNE   SCROLL9    pas de mouvement en jeu automatique
  LDX   #PADDR     table des adresses
  LEAX  B,X        pointeur dans la table
  LEAX  B,X        pointeur dans la table
  LDY   ,X         adresse pastille B
  PSHS  Y          empilage adresse originale
  LDA   #$18       compteur de boucle
  PSHS  A          empilage compteur
  PSHS  Y,X        empilage pointeur et adresse 
SCROLL1
  PULS  X,Y
  LEAY  $28,Y
  STY   ,X
  PSHS  Y,X
  LBSR  PDISP
  DEC   4,S
  BNE   SCROLL1
  PULS  X,Y
  PULS  A
  PULS  Y          adresse originale
  STY   ,X         restauration de l'adresse
* signal sonore
  LDX   #$0040     hauteur note
  LDA   #$03       longueur note           
  LBSR  BUZZ
SCROLL9
  PSHS  B          empilage no pastille depart 
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur pastille depart
  ADDB  #$08
  STA   B,X        couleur pastille arrivee
  BSR   PDISP      affichage pastille arrivee
* incrementation du score
  LDD   SCORE
  ADDD  #$0001
  STD   SCORE
  PULS  B          depilage no pastille depart 
  RTS

*===========================================
* AFFICHAGE DU NUMERO DE PARTIE
*===========================================  
DPARTIE
  LDX   #PARTIE+2
  LBSR  CHAINE
  LDD   PARTIE
  ADDD  #$0001
  STD   PARTIE 
  JSR   DISPD      affichage registre D
  RTS

*===========================================
* AFFICHAGE DU SCORE
*===========================================  
DSCORE
  PSHS  B
  LDX   #BLANC     effacement de Patientez....
  LBSR  CHAINE
  LDX   #COUPS+2
  LBSR  CHAINE
  LDD   COUPS      nombre de coups
  JSR   DISPD      affichage registre D
  LDX   #SCORE+2  
  BSR   CHAINE
  LDD   SCORE      score
  JSR   DISPD      affichage registre D
  LDX   #MAX+2
  BSR   CHAINE
  LDD   MAX        hiscore
  JSR   DISPD      affichage registre D
  PULS  B,PC

*===========================================
* AFFICHAGE CHAINE EN X TERMINEE PAR $04
*===========================================  
CHAINE
  LDB   ,X+
  CMPB  #$04
  BEQ   CHAIN9
* SWI              affichage caractere MO5
* FCB   $02
  JSR   $E803      affichage caractere TO7
  BRA   CHAINE
CHAIN9
  RTS  

*===========================================
* AFFICHAGE COLONNE PASTILLE
*===========================================  
CDISP
  LDB   #$18
CDISP1               
  LDA   ,X+          
  STA   ,Y
  LEAY  $28,Y
  DECB
  BNE   CDISP1
  LEAY  -$3BF,Y 
  RTS

*===========================================
* AFFICHAGE DE LA PASTILLE B
*===========================================  
PDISP
  PSHS  B          empilage du numero de pastille 

* couleur
* LDA   $A7C0      MO5
  LDA   $E7C3      TO7
  ANDA  #$FE
* STA   $A7C0      MO5
  STA   $E7C3      TO7
  LDX   #PCOLOR
  LDA   B,X        couleur pastille
* calcul octet couleur pour MO5
* LSLA
* LSLA
* LSLA
* LSLA
* ORA   #$04       couleur de fond bleu
* calcul octet couleur pour TO7
  LSLA
  LSLA
  LSLA
  ORA   #$C4       bits intensite et fond
* recherche adresse pastille  
  LDX   #PADDR     table des adresses
  LSLB             deplacement dans la table              
  LDY   B,X        adresse pastille B
  PSHS  Y          empilage adresse
  LDB   #$18       nombre de lignes
PDISP0  
  STA   0,Y
  STA   1,Y
  STA   2,Y
  LEAY  $28,Y
  DECB
  BNE   PDISP0 
  ORA   #$07       couleur de fond blanc
  LEAY  -$27F,Y
  LDB   #$08 
PDISP2  
  STA   ,Y
  LEAY  $28,Y
  DECB
  BNE   PDISP2 
  PULS  Y

* forme  
  LDX   #PGRAPH    table de definition pastille
* INC   $A7C0      selection video forme MO5
  INC   $E7C3      selection video forme TO7
  BSR   CDISP      affichage premiere colonne
  BSR   CDISP      affichage deuxieme colonne
  BSR   CDISP      affichage troisieme colonne
  PULS  B,PC

*===========================================
* AFFICHAGE DE TOUTES LES PASTILLEs
*===========================================  
TDISP
  LDB   #$37
TDISP1  
  BSR   PDISP      affichage d'une pastille
  DECB
  BGE   TDISP1
  RTS

*===========================================
* AFFICHAGE BITMAP DU TITRE
*===========================================  
BITMAP
* LDY   #$0000     MO5 
  LDY   #$4000     TO7
  LDX   #TITRE
* LDA   $A7C0      MO5
  LDA   $E7C3      TO7
  ORA   #$01
* STA   $A7C0      MO5
  STA   $E7C3      TO7
BIT1
  LDD   ,x++
  STD   ,Y++
* CMPY  #$03C0     MO5
  CMPY  #$43C0     TO7
  BNE   BIT1
  RTS

*===========================================
* AFFICHAGE REGISTRE D EN DECIMAL
*===========================================  
DISPD
  STD   DWORK1    stockage de D 
  CLR   DISPCN    raz nbre de chiffres affiches
  LDD   #10000    diviseur
  BSR   DISPC
  LDD   #1000     diviseur
  BSR   DISPC
  LDD   #100      diviseur
  BSR   DISPC
  LDD   #10       diviseur
  BSR   DISPC
  LDD   #1        diviseur
  INC   DISPCN    forcer affichage unite a zero
  BSR   DISPC
  RTS

*===========================================
* AFFICHAGE CHIFFRE DECIMAL
*===========================================  
DISPC
  STD   DWORK2    stockage diviseur   
  BSR   DIVD      division de D 
  CMPB  #$00
  BNE   DISPC1
  LDA   DISPCN    nombre de chiffers affiches
  BNE   DISPC1    affichage du zero
  RTS             pas d'affichage du zero  
DISPC1
  INC   DISPCN   
  ADDB  #$30      code ASCII
* SWI             affichage caractere 
* FCB   $82       retour
  JSR   $E803      affichage caractere TO7
DISPCN
  FCB   $00

*===========================================
* DIVISION DE DWORK1 PAR DWORK2
* RESULTAT DANS B, RESTE DANS DWORK1
*===========================================  
DIVD
  CLRB 
  PSHS  B        compteur pour le quotient
  LDD   DWORK1   dividende
DIVD1
  SUBD  DWORK2   oter le diviseur
  BLT   DIVD2    terminer si valeur negative 
  INC   ,S       incrementer le quotient
  BRA   DIVD1    recommencer
DIVD2  
  ADDD  DWORK2   annuler la derniere soustraction 
  STD   DWORK1   reste dans DWORK1
  PULS  B,PC     depilage et retour 

DWORK1
  FDB   $0000    zone de stockage du nombre 
DWORK2
  FDB   $0000    diviseur
  
*===========================================
* Variables diverses (score, coups, etc.)
*===========================================  
PARTIE
  FDB  $0000
  FCB  $1E,$0A,$0A,$0A,$0A,$0A   
  FCC  'Partie: '
  FCB  $04
COUPS
  FDB  $0000
  FCB  $1E,$0A,$0A,$0A,$0A,$0A,$0A 
  FCC  'Coups : '
  FCB  $04
SCORE
  FDB  $0000
  FCB  $1E,$0A,$0A,$0A,$0A,$0A,$0A,$0A   
  FCC  'Score : '
  FCB  $04
MAX
  FDB  $0000
  FDB  $1E0A,$0A0A,$0A0A,$0A0A,$0A0A
  FCC  'Hiscore '
  FCB  $04
BLANC
  FCB  $1E   locate 0,0
  FDB  $0A0A,$0A0A,$0A0A
  FCB  $0A
  FCC  '                '
  FCB  $04
COUPMAX
  FDB  $0020       nbre de coups par partie
JEUAUTO
  FCB  $00         indicateur de jeu automatique
  
*===========================================
* Initialisation de l'ecran
*===========================================  
SCRINIT
  FCB  $1B   sequence d'echappement
  FCB  $47   forme blanc
  FCB  $1B   sequence d'echappement
  FCB  $54   fond bleu
  FCB  $1B   sequence d'echappement
  FCB  $64   cadre bleu
  FCB  $0C   effacement ecran
  FCB  $14   extinction curseur
  FCB  $04
  
*===========================================
* Ecran pour une nouvelle partie
*===========================================  
SCRNEW
  FCB  $1E   locate 0,0
  FDB  $0A0A,$0A0A,$0A0A
  FCC  '                '
  FDB  $0D0A
  FCC  'Patientez...    '
  FDB  $0D0A,$0A0A,$0A0A
  FCC  'Alignez 3 pions'
  FDB  $0D0A
  FCC  'de m'
  FDB  $1643
  FCC  'eme couleur '
  FDB  $0D0A
  FCC  'horizontalement '
  FDB  $0D0A
  FCC  'ou verticalement'
  FCB  $0D,$0A,$0A
  FCC  'Pointez entre 2 '
  FDB  $0D0A
  FCC  'pions pour les  '
  FDB  $0D0A
  FCC  'permuter.'
  FCB  $04
  
*===========================================
* Message pour afficher l'aide
*===========================================  
MAIDE
  FDB  $1E0A    locate 0,0 + line feed
  FDB  $0A0A,$0A0A,$0A0A,$0A0A,$0A0A
  FDB  $0A0A,$0A0A,$0A0A,$0A0A,$0A0A
  FCC  'Touche A = Aide'
  FDB  $0D0A
  FCC  'avec perte de  '
  FDB  $0D0A
  FCC  'dix points.    '
  FCB  $04
  
*===========================================
* Message d'appui sur une touche
*===========================================  
MAPPUI
  FDB  $1E0A    locate 0,0 + line feed
  FDB  $0A0A,$0A0A,$0A0A,$0A0A,$0A0A
  FDB  $0A0A,$0A0A,$0A0A,$0A0A,$0A0A
  FCC  'Appuyez sur une'
  FDB  $0D0A
  FCC  'touche pour    '
  FDB  $0D0A
  FCC  'continuer...   '
  FCB  $04
  
*===========================================
* Message de fin de partie
*===========================================  
FPARTIE  
* FDB  $1B73       caracteres taille double MO5
  FDB  $1B4F       caracteres taille double TO7
  FCB  $1F         sequence user
  FDB  $4D52       curseur ligne 13 colonne 18
  FCC  'FIN'
* FDB  $1B70       caracteres taille normale MO5
  FDB  $1B4C       caracteres taille normale TO7
  FCC  ' de '
* FDB  $1B73       caracteres taille double MO5
  FDB  $1B4F       caracteres taille double TO7
  FCC  'PARTIE'
* FDB  $1B70       caracteres taille normale MO5
  FDB  $1B4C       caracteres taille normale TO7
  FCB  $04
  
*===========================================
* Table des couleurs
*===========================================  
PCOLOR  
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  
*===========================================
* Positions des pastilles dans l'ecran
*===========================================  
PADDR
  FDB  $4510,$4513,$4516,$4519,$451C,$451F,$4522,$4525
  FDB  $48D0,$48D3,$48D6,$48D9,$48DC,$48DF,$48E2,$48E5
  FDB  $4C90,$4C93,$4C96,$4C99,$4C9C,$4C9F,$4CA2,$4CA5
  FDB  $5050,$5053,$5056,$5059,$505C,$505F,$5062,$5065
  FDB  $5410,$5413,$5416,$5419,$541C,$541F,$5422,$5425
  FDB  $57D0,$57D3,$57D6,$57D9,$57DC,$57DF,$57E2,$57E5
  FDB  $5B90,$5B93,$5B96,$5B99,$5B9C,$5B9F,$5BA2,$5BA5
  
*===========================================
* Graphisme de la pastille (par colonne)
*===========================================  
PGRAPH  
  FCB   $00,$00,$00,$00,$00,$03,$07,$07
  FCB   $0F,$0F,$0F,$0F,$0F,$0F,$07,$07
  FCB   $03,$00,$00,$00,$00,$00,$00,$00

  FCB   $00,$00,$00,$00,$FC,$FF,$FF,$FF
  FCB   $FF,$FF,$FE,$FE,$FC,$FC,$F1,$C3  
  FCB   $FF,$FC,$00,$00,$00,$00,$00,$00

  FCB   $00,$00,$00,$00,$00,$00,$80,$80  
  FCB   $C0,$C0,$C0,$C0,$C0,$C0,$80,$80  
  FCB   $00,$00,$00,$00,$00,$00,$00,$00  
  
*===========================================
* Graphisme du titre TO7
*===========================================  
TITRE
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FE00,$0000,$0FFF,$800F
  FDB   $FFFF,$F000,$00FF,$FFE3,$F83F,$FFFF,$FFFC,$7FFF
  FDB   $FE3F,$83FF,$FFFF,$FF8F,$FFFF,$F1FF,$FFFF,$FFFF
  FDB   $FE00,$0000,$0FFC,$0001,$FFFF,$F000,$00FF,$FFE3
  FDB   $F07F,$FFFF,$FFFC,$7FFF,$FE3F,$07FF,$FFFF,$FF8F
  FDB   $FFFF,$F1FF,$FFFF,$FFFF,$FE00,$0000,$0FF0,$0000
  FDB   $7FFF,$F000,$00FF,$FFE3,$E0FF,$FFFF,$FFFC,$7FFF
  FDB   $FE3E,$0FFF,$FFFF,$FF8F,$FFFF,$F1FF,$FFFF,$FFFF
  FDB   $FE00,$0000,$0FE0,$0000,$3FFF,$F000,$00FF,$FFE3
  FDB   $C1FF,$FFFF,$FFFC,$7FFF,$FE3C,$1FFF,$FFFF,$FF8F
  FDB   $FFFF,$F1FF,$FFFF,$FFFF,$FFFF,$FFFF,$FFC0,$7FF0
  FDB   $1FFF,$FFFF,$F0FF,$FFE3,$83F8,$1F10,$7F00,$63E3
  FDB   $FE38,$3E02,$3E3C,$0788,$3FFF,$F1F0,$38FC,$703F
  FDB   $FE00,$0400,$0FC1,$C01C,$1FFF,$F000,$10FF,$FFE3
  FDB   $07E0,$0F00,$3E00,$63C3,$FE30,$7E02,$3E38,$0380
  FDB   $1FFF,$F1C0,$18FC,$401F,$FE00,$0400,$0F87,$0007
  FDB   $0FFF,$F000,$30FF,$FFE0,$0FC0,$0700,$3C00,$63C3
  FDB   $FE00,$FE06,$3E30,$0380,$0FFF,$F180,$08F8,$000F
  FDB   $FE00,$0400,$0F86,$0003,$0FFF,$F000,$20FF,$FFE0
  FDB   $1FC3,$870E,$1870,$61C7,$FE01,$FE1E,$3E31,$E187
  FDB   $0FFF,$F187,$0C78,$870F,$FE00,$0400,$0F0C,$0001
  FDB   $87FF,$F000,$61FF,$FFE0,$0FC7,$C71F,$1878,$71C7
  FDB   $FE00,$FE3E,$3E30,$718F,$8FFF,$F18F,$8C78,$8F8F
  FDB   $FFFF,$843F,$FF08,$3FE0,$87FF,$FFF0,$C1FF,$FFE0
  FDB   $0FFE,$071F,$18F8,$7187,$FE00,$FE3E,$3E30,$0F8F
  FDB   $8FFF,$F1FC,$0C31,$FC0F,$FFFF,$843F,$FF08,$7FF0
  FDB   $87FF,$FFE0,$83FF,$FFE1,$87F0,$071F,$18FC,$708F
  FDB   $FE18,$7E3E,$3E38,$038F,$8FFF,$F1E0,$0E31,$E00F
  FDB   $FFFF,$843F,$FF08,$3FE0,$87FF,$FFE1,$87FF,$FFE3
  FDB   $83E0,$071F,$18FC,$780F,$FE38,$3E3E,$3E3C,$018F
  FDB   $8FFF,$F1C0,$0E21,$C00F,$FFFF,$843F,$FF0C,$0001
  FDB   $87FF,$FFC3,$07FF,$FFE3,$C3C1,$C71F,$18F8,$780F
  FDB   $FE3C,$3E3E,$3E3F,$C18F,$8FF8,$F183,$8F03,$838F
  FDB   $FFFF,$843F,$FF86,$0003,$0FFF,$FF82,$0FFF,$FFE3
  FDB   $E1C7,$871F,$1878,$781F,$FE3E,$1E3E,$3C31,$F18F
  FDB   $8FF8,$F18F,$0F03,$8F0F,$FFFF,$843F,$FF87,$0007
  FDB   $0FFF,$FF86,$1FFF,$FFE3,$F0C3,$071F,$1C30,$7C1F
  FDB   $FE3F,$0E3E,$1830,$618F,$8FF8,$6186,$0F07,$860F
  FDB   $FFFF,$843F,$FFC1,$C01C,$1FFF,$FF0C,$1FFF,$FFE3
  FDB   $F040,$071F,$1C00,$7C1F,$FE3F,$063E,$0038,$038F
  FDB   $8FF8,$0380,$0F87,$800F,$FFFF,$843F,$FFC0,$7FF0
  FDB   $1FFF,$FE08,$3FFF,$FFE3,$F860,$031F,$1E00,$7E1F
  FDB   $FE3F,$863F,$0038,$038F,$8FFC,$07C0,$0787,$C007
  FDB   $FFFF,$843F,$FFE0,$0000,$3FFF,$FE18,$7FFF,$FFE3
  FDB   $FC30,$E31F,$1F84,$7E3F,$FE3F,$C23F,$C23E,$0F8F
  FDB   $8FFF,$0FE1,$C7CF,$E1C7,$FFFF,$843F,$FFF0,$0000
  FDB   $7FFF,$FC30,$7FFF,$FFFF,$FFFF,$FFFF,$FFFF,$FC3F
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$843F,$FFFC,$0001,$FFFF,$F820,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FC7F,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$843F,$FFFF,$800F
  FDB   $FFFF,$F861,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$F07F
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$F0FF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$F1FF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF


END
Dernière modification par Daniel le 10 oct. 2016 12:44, modifié 1 fois.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: MO5 Kandy Krush Java

Message par 6502man »

Merci Daniel :D

J'étais certain que tu allez sortir la version TO :lol:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: MO5 Kandy Krush Java

Message par Daniel »

Dans cette version TO7 il y a encore une petite anomalie : on a toujours le même tableau au démarrage, car sur TO il n'y a pas de compteur pour le clignotement du curseur. Le jeu automatique doit donner toujours la même partie.

La prochaine version utilisera le timer pour initialiser les couleurs au hasard. Ce sera une version commune pour TO et pour MO.
Daniel
L'obstacle augmente mon ardeur.
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: MO5 Kandy Krush Java

Message par jasz »

Merci Daniel pour les sources même si elles ne sont pas très propres (je reprends tes termes) elles sont toutefois très intéressantes. Elles permettent, du moins pour moi, de voir les différences de codage entre les TO et les MO et surtout de comprendre comment ces machines gèrent tout ça. :D

Mais dis moi. Quand tu parles de version commune, tu penses à une seules sources fonctionnant sur TO et MO. C'est bien ça. Alors connaissant le problème de compatibilité d'échange entre les deux soit c'est pour te simplifier la tâche soit ce sera une version SD que l'on pourra lire sur l'un ou sur l'autre. Perso, je pencherais pour la deuxième. Quoique la première est compréhensible aussi ;)
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: MO5 Kandy Krush Java

Message par Daniel »

Voici un aperçu des sources de la version MO/TO. Il reste encore à tester soigneusement le programme avec toutes les machines.

Code : Tout sélectionner

/**************************************************\
*           KANDY KRUSH JAVA MO & TO               * 
*           (c) 2016 - Daniel Coulom               *  
*           http://dcmoto.free.fr/                 *
*           http://forum.system-cfg.com/           *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune  garantie  et *
* sans  engager  la  responsabilité  de  l'auteur. *
* Vous  pouvez  l' utiliser,  le  modifier  et  le *
* diffuser librement, en conservant cette  licence *
* et les références de l'auteur dans   toutes  les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/




/**************************************************\
*                Version 2016.10.07                *
\**************************************************/
* Historique
* 2016.10.07 Version unique pour MO et TO     
  
*===========================================
* DETERMINATION DU TYPE D'ORDINATEUR
*===========================================  
  ORG   $9000
  CLRA             initialisation type=0 (MO) 
  LDX   #$1F40     adresse RAM(MO) ou ROM(TO)
  LDB   ,X         lecture adresse X
  COM   ,X         tente de modifier adresse X
  CMPB  ,X         test modification adresse X
  BNE   TYPEMO     valeurs differentes -> MO
TYPETO
  INCA             initialisation type=1 (TO)   
TYPEMO
  COM   ,X         retablissement adresse X
  STA   MOTO       stockage du type 0=MO, 1=TO
  
*===========================================
* AFFICHAGE DU TITRE
*===========================================  
  LDX   #SCRINIT   chaine d'initialisation ecran 
  LBSR  CHAINE     initialisation ecran 
  LBSR  BITMAP     affichage du titre
  
*===========================================
* INITIALISATIONS
*===========================================  
INIT
  LDD   #$0000     zero dans D 
  STD   COUPS      remise a zero du nombre de coups
  STD   SCORE      remise a zero du score
  LDX   #SCRNEW    chaine pour ecran de debut partie 
  LBSR  CHAINE     affichage ecran de debut partie 
  LDX   #MAIDE     chaine du message pour l'aide
  LBSR  CHAINE     affichage du message pour l'aide  
  LBSR  DPARTIE    affichage du numero de partie
  LBSR  COLINI     initialisation des couleurs
  LBSR  TDISP      affichage de toutes les pastilles
  INC   JEUAUTO    pour supprimer le clignotement 
  LBSR  PALIGN     recherche alignements
  DEC   JEUAUTO    pour retablir le parametre
  LBSR  EFFBUZ     signal de debut de jeu   
  LBSR  EFFBUZ     signal de debut de jeu
  
*===========================================
* DEROULEMENT DU JEU
*===========================================  
JEU
  LBSR  DSCORE     affichage du score
  LDA   JEUAUTO
  BEQ   JEU1       jeu manuel
  LBSR  AUTOMAT    jeu automatique
  LBRA  SUIVANT    passage au coup suivant
JEU1
  TST   MOTO       test du type d'ordinateur
  BNE   JEU30

*===========================================
* Lecture clavier et crayon optique MO
*===========================================
JEU20
  SWI              lecture rapide clavier MO5
  FCB   $0C   
  CMPB  #$0C       'A' pour Aide MO5
  BNE   JEU21
  LBSR  AIDE       affichage de l'aide
  BRA   JEU        affichage du score
JEU21
  CMPB  #$37       'J' pour Jeu automatique MO5
  BNE   JEU22
  LDA   #$01
  STA   JEUAUTO    indicateur de jeu automatique
  BRA   JEU
JEU22
  SWI              contact crayon optique MO5
  FCB   $16
  BCC   JEU1       attente appui
  SWI              coordonnees crayon optique MO5
  FCB   $18
  BRA   JEU4

*===========================================
* Lecture clavier et crayon optique TO
*===========================================
JEU30
  JSR   $E806      lecture clavier TO7
  ANDB  #$DF       majuscule
  CMPB  #$41       'A' pour Aide TO7
  BNE   JEU31
  LBSR  AIDE       affichage de l'aide
  BRA   JEU        affichage du score
JEU31
  CMPB  #$4A       'J' pour Jeu automatique TO7
  BNE   JEU32
  LDA   #$01
  STA   JEUAUTO    indicateur de jeu automatique
  BRA   JEU
JEU32
  JSR   $E81B      contact crayon optique TO7
  BCC   JEU1       attente appui
  JSR   $E818      coordonnees crayon optique TO7

*===========================================
* Controle et execution du coup joue
*===========================================
JEU4

* test de la colonne pointee
  TFR   X,D
  LSRD
  LSRD
  LSRD
  TFR   D,X
  CMPX  #$0011
  LBLT  ERROR      trop a gauche
  CMPX  #$0026
  LBGT  ERROR      trop a droite

* test de la ligne pointee
  TFR   Y,D
  LSRD
  LSRD
  LSRD
  TFR   D,Y
  CMPY  #$0005
  BLT   ERROR      trop haut
  CMPY  #$0017
  BGT   ERROR      trop bas

* test pointage centre pastille
  TFR   X,D
  SUBD  #$0011     centre premiere pastille
  LBSR  DMOD3
  PSHS  B
  TFR   Y,D
  SUBD  #$0005     centre premiere pastille
  LBSR  DMOD3
  PULS  A
  ADDB  -1,S
  BEQ   ERROR   

* permutation horizontale
HORIZ
  TFR   Y,D
  SUBD  #$0005     centre premiere pastille
  LBSR  DMOD3
  BNE   VERT
  PSHS  Y,X
  LBSR  PINVH
  LBSR  PALIGN     recherche alignements
  PULS  X,Y
  BCS   SUIVANT    alignement trouve
  LBSR  PINVH      retablissement position
  BRA   ERROR   

* permutation verticale
VERT
  TFR   X,D
  SUBD  #$0011     centre premiere pastille
  LBSR  DMOD3
  BNE   ERROR
  PSHS  Y,X
  LBSR  PINVV
  LBSR   PALIGN    recherche alignement
  PULS  X,Y
  BCS   SUIVANT    alignement trouve
  LBSR  PINVV      retablissement position
  BRA   ERROR   
  
*===========================================
* PASSAGE AU COUP SUIVANT
*===========================================  
SUIVANT
  LDD   COUPS
  ADDD  #$0001
  STD   COUPS
  CMPD  COUPMAX    fin de partie apres n coups
  BEQ   FIN
  LBRA  JEU        suite du jeu

*===========================================
* ERREUR DE POINTAGE
*===========================================  
ERROR
  LDX   #$0800     hauteur note
  LDA   #$10       longueur note           
  LBSR  BUZZ
  LBRA  JEU

*===========================================
* FIN DE PARTIE
*===========================================  
FIN
  LDD   SCORE
  CMPD  MAX
  BLT   FIN0
  STD   MAX
FIN0  
  LDA   JEUAUTO    indicateur de jeu automatique
  LBNE  INIT       nouvelle partie automatique
FIN1
  LBSR  DSCORE  
  LDX   #MAPPUI    message appui sur une touche
  LBSR  CHAINE      
  TST   MOTO       test du type d'ordinateur
  BNE   FIN4
FIN2
  LDX   #FPART5    message fin de partie MO5
  LBSR  CHAINE     
FIN3
  SWI              lecture rapide clavier MO5
  FCB   $0C   
  BCC   FIN3
  LBRA  INIT
FIN4
  LDX   #FPART7    message fin de partie TO7
  LBSR  CHAINE     
FIN5
  JSR   $E809      lecture rapide clavier TO7
  BCC   FIN5
  LBRA  INIT
  
*===========================================
* JEU AUTOMATIQUE
*===========================================  
AUTOMAT
  LDB   #$37

* test permutation horizontale  
AUTO1
  TFR   B,A
  ANDA  #$07
  CMPA  #$07
  BEQ   AUTO3      permutation horizontale impossible 
  LBSR  CINVH      permutation horizontale
  PSHS  B
  LDB   #$37
AUTO2
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   AUTO9      alignement trouve
  DECB
  BGE   AUTO2
  PULS  B
  LBSR  CINVH      retablissement des couleurs

* test permutation verticale  
AUTO3
  CMPB  #$2F
  BGT   AUTO5      permutation verticale impossible
  LBSR  CINVV      permutation verticale
  PSHS  B
  LDB   #$37
AUTO4
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   AUTO9      alignement trouve
  DECB
  BGE   AUTO4
  PULS  B
  LBSR  CINVV      retablissement des couleurs
AUTO5
  DECB
  CMPB  #$1F
  BNE   AUTO1

AUTO10

* test permutation horizontale
  LDB   #$37
AUTO11
  TFR   B,A
  ANDA  #$07
  CMPA  #$07
  BEQ   AUTO13     permutation horizontale impossible 
  LBSR  CINVH      permutation horizontale
  PSHS  B
  LDB   #$37
AUTO12
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   AUTO9      alignement trouve
  LBSR  TSTAV      test alignement vertical en B 
  BCS   AUTO9      alignement trouve
  DECB
  BGE   AUTO12
  PULS  B
  LBSR  CINVH      retablissement des couleurs

* test permutation verticale  
AUTO13
  CMPB  #$2F
  BGT   AUTO15     permutation verticale impossible
  LBSR  CINVV      permutation verticale
  PSHS  B
  LDB   #$37
AUTO14
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   AUTO9      alignement trouve
  LBSR  TSTAV      test alignement vertical en B 
  BCS   AUTO9      alignement trouve
  DECB
  BGE   AUTO14
  PULS  B
  LBSR  CINVV      retablissement des couleurs
AUTO15
  DECB
  BGE   AUTO11

AUTO6
  LBSR  TDISP      affichage de toutes les pastilles
AUTO7
  BRA   AUTO7      pas de coup trouve

AUTO9
  PULS  B
  LBSR  PALIGN     recherche alignements

  RTS

*===========================================
* CALCUL DE D MODULO 3
* RESULTAT DANS D
*===========================================  
DMOD3
  SUBD  #$03
  BGE   DMOD3
  ADDD  #$03
  RTS

*===========================================
* CALCUL DE B MODULO 8
* RESULTAT DANS B
*===========================================  
BMOD8
  SUBB  #$08
  BGE   BMOD8
  ADDB  #$08
  RTS

*===========================================
* TEST ALIGNEMENT HORIZONTAL EN B
* CARRY SET SI ALIGNEMENT TROUVE
*===========================================  
TSTAH
  PSHS  B
  BSR   BMOD8      B modulo 8
  CMPB  #$05
  PULS  B
  BGT   TSTAH8     pas d'alignement en fin de ligne
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur pastille B 
  LEAX  1,X
  CMPA  B,X        couleur pastille B+1
  BNE   TSTAH8
  LEAX  1,X
  CMPA  B,X        couleur pastille B+2
  BNE   TSTAH8
  TST   JEUAUTO
  BNE   TSTAH7
  BSR   CLIGH      clignotement de l'alignement
TSTAH7
  COMA             set carry (trouve)
  BRA   TSTAH9
TSTAH8
  CLRA             clear carry
TSTAH9
  RTS

*===========================================
* CLIGNOTEMENT ALIGNEMENT HORIZONTAL EN B
*===========================================  
CLIGH
* effacement des pastilles
  BSR   EFFH 
* affichage des pastilles
  ADDB  #$02
  LBSR  PDISP
  DECB
  LBSR  PDISP
  DECB
  LBSR  PDISP
* signal sonore
  LDX   #$00A0     hauteur note
  LDA   #$20       longueur note           
  LBSR  BUZZ
* effacement des pastilles
  BSR   EFFH       
  RTS

*===========================================
* EFFACEMENT 3 PASTILLES HORIZONTALES EN B
*===========================================  
EFFH
  PSHS  B          empilage numero de pastille
  BSR   EFFINI     initialisations 
  LDB   #$18       compteur de boucles
* effacement des pastilles
EFFH1
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  LEAX  $1F,X  
  DECB
  BNE   EFFH1
* signal sonore
  BSR   EFFBUZ
  PULS  B,PC

*===========================================
* SIGNAL SONORE EFFACEMENT ALIGNEMENT
*===========================================  
EFFBUZ
  LDX   #$0080     hauteur note
  LDA   #$30       longueur note           
  LBSR  BUZZ
  LDX   #$0060     hauteur note
  LDA   #$40       longueur note           
  LBSR  BUZZ
  RTS

*===========================================
* INITIALISATIONS POUR EFFACEMENT PASTILLES
*===========================================  
EFFINI
  TST   MOTO       test du type d'ordinateur
  BNE   EFFIN3
EFFIN2
  LDA   $A7C0      PA du PIA systeme MO5
  ANDA  #$FE       RAZ bit0
  STA   $A7C0      video couleur MO5
  LDA   #$44       couleur fond/forme MO5 
  BRA   EFFIN4
EFFIN3
  LDA   $E7C3      PA du PIA systeme TO7
  ANDA  #$FE       RAZ bit0
  STA   $E7C3      video couleur TO7
  LDA   #$E4       couleur fond/forme TO7 
EFFIN4
  LDX   #PADDR     table des adresses
  LSLB             deplacement dans la table              
  LDX   B,X        adresse pastille B
  RTS

*===========================================
* TEST ALIGNEMENT VERTICAL EN B
* CARRY SET SI ALIGNEMENT TROUVE
*===========================================  
TSTAV
  CMPB  #$27
  BGT   TSTAV8     pas d'alignement en fin de colonne
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur pastille B 
  LEAX  8,X
  CMPA  B,X        couleur pastille B+8
  BNE   TSTAV8
  LEAX  8,X
  CMPA  B,X        couleur pastille B+16
  BNE   TSTAV8
  TST   JEUAUTO
  BNE   TSTAV7
  BSR   CLIGV      clignotement de l'alignement
TSTAV7
  COMA
  BRA   TSTAV9
TSTAV8
  CLRA             clear carry
TSTAV9
  RTS

*===========================================
* CLIGNOTEMENT ALIGNEMENT VERTICAL EN B
*===========================================  
CLIGV
* effacement des pastilles
  BSR   EFFV 
* affichage des pastilles
  ADDB  #$10
  LBSR  PDISP
  SUBB  #$08
  LBSR  PDISP
  SUBB  #$08
  LBSR  PDISP
* signal sonore
  LDX   #$00A0     hauteur note
  LDA   #$20       longueur note           
  LBSR  BUZZ
* effacement des pastilles
  BSR   EFFV       
  RTS

*===========================================
* EFFACEMENT 3 PASTILLES VERTICALES EN B
*===========================================  
EFFV
  PSHS  B          empilage numero de pastille
  BSR   EFFINI     initialisations 
  LDB   #$48       compteur de boucles
* effacement des pastilles
EFFV1
  STA   ,x+ 
  STA   ,x+ 
  STA   ,x+ 
  LEAX  $25,X  
  DECB
  BNE   EFFV1
* signal sonore
  LBSR  EFFBUZ
  PULS  B,PC
  
*===========================================
* RECHERCHE DES ALIGNEMENTS
* CARRY SET SI ALIGNEMENT TROUVE
*===========================================  
PALIGN
  CLRA             initialisation compteur 
  PSHS  A          empilage compteur alignements
PALIGN1

* alignement horizontaux
  CLRB
HALIGN1
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   HALIGN4    alignement trouve
  INCB
  CMPB  #$36 
  BEQ   VALIGN     alignement non trouve
  BRA   HALIGN1
HALIGN4
  LBSR  SUPPR
  INCB
  LBSR  SUPPR
  INCB
  LBSR  SUPPR
  INC   ,S
  BRA   PALIGN1

*alignement verticaux
VALIGN
  CLRB
VALIGN1
  BSR   TSTAV      test alignement vertical en B 
  BCS   VALIGN4    alignement trouve
  INCB
  CMPB  #$28 
  BEQ   VALIGN8
  BRA   VALIGN1
VALIGN4
  ADDB  #$10
  LBSR  SUPPR
  LBSR  SUPPR
  LBSR  SUPPR
  INC   ,S
  BRA   PALIGN1
VALIGN8
  PULS  A
  CMPA  #$00
  BEQ   VALIGN9
  COMA  #$01       set carry
VALIGN9
  RTS
  
*===========================================
* RECHERCHE ALIGNEMENT VERT OU HORIZ
* CARRY SET SI UN ALIGNEMENT EST TROUVE
*===========================================  
RALIG
  PSHS  B
  LDB   #$37
RALIG1
  LBSR  TSTAH      test alignement horizontal en B 
  BCS   RALIG9     alignement trouve
  LBSR  TSTAV      test alignement vertical en B 
  BCS   RALIG9     alignement trouve
  DECB
  BNE   RALIG1
  CLRA             clear carry  
RALIG9  
  PULS  B,PC
  
*===========================================
* AIDE = RECHERCHE DES COUPS POSSIBLES
*===========================================  
AIDE
  LDX   #$0100     hauteur note
  LDA   #$10       longueur note           
  LBSR  BUZZ       signal sonore
  CLRA             compteur de coups possibles
  PSHS  A          empilage compteur de coups
  INC   JEUAUTO    pour supprimer animation et son

* test des permutations verticales
AIDE0
  CLRB
AIDE1
  LBSR  CINVV       inversion des couleurs
  BSR   RALIG       recherche d'un alignement        
  BCC   AIDE2       pas d'alignement trouve
  LBSR  PERMV       affichage permutation verticale
  INC   ,S          incrementation du compteur de coups
AIDE2
  LBSR  CINVV       retablissement des couleurs
  INCB
  CMPB  #$2F
  BLE   AIDE1

* test des permutations horizontales
  CLRB
AIDE3
  TFR   B,A
  ANDA  #$07
  CMPA  #$07
  BEQ   AIDE5       dernier pion de la ligne
  LBSR  CINVH       inversion des couleurs
  BSR   RALIG       recherche d'un alignement        
  BCC   AIDE4       pas d'alignement trouve
  BSR   PERMH       affichage permutation horizontale
  INC   ,S          incrementation du compteur de coups
AIDE4
  LBSR  CINVH       retablissement des couleurs
AIDE5
  INCB
  CMPB  #$37
  BLE   AIDE3

* mise a jour du score et attente d'une touche
  DEC   JEUAUTO    pour retablir la valeur initiale
  LDD   SCORE
  SUBD  #$000A     enlever 10 points
  BGE   AIDE6
  LDD   #$0000     si negatif remettre a zero
AIDE6  
  STD   SCORE      mise a jour du score 
AIDE7
  LDX   #MAPPUI 
  LBSR  CHAINE     affichage du message appuyer touche
AIDE8
* SWI              lecture rapide clavier MO5
* FCB   $0C   
  JSR   $E806      lecture clavier TO7
  BEQ   AIDE8      attente d'une touche
* CMPB  #$03       touche secrete ACC MO5 pour redemarrer
  CMPB  #$16       touche secrete ACC TO7 pour redemarrer
  LBEQ  INIT       redemarrage     

* retablissement de la configuration de jeu
  LBSR  TDISP      affichage de toutes les pastilles
  LDX   #$0080     hauteur note
  LDA   #$10       longueur note           
  LBSR  BUZZ       signal sonore 
  LDX   #MAIDE 
  LBSR  CHAINE     affichage du message pour l'aide

  PULS  A          compteur de coups possibles
  CMPA  #$00
  BNE   AIDE9      continuer s'il y a des coups possibles 

* reinitialisation en cas de blocage
  LBSR  COLINI     initialisation des couleurs
  LBSR  TDISP      affichage de toutes les pastilles 
  LBSR  PALIGN     recherche alignements

AIDE9
  RTS
  
*===========================================
* AFFICHAGE PERMUTATION HORIZONTALE POSSIBLE
*===========================================  
PERMH
  LDX   #PADDR
  TFR   B,A
  LSLA
  LDX   A,X
  LEAX  $192,X
  TST   MOTO       test du type d'ordinateur
  BNE   PERMH2
PERMH1
  LDA   $A7C0      PA du PIA systeme MO5  
  ORA   #$01       Set bit 0
  STA   $A7C0      selection video forme MO5   
  BRA   PERMH3
PERMH2
  LDA   $E7C3      PA du PIA systeme TO7  
  ORA   #$01       Set bit 0
  STA   $E7C3      selection video forme TO7  
PERMH3
  LDA   #$FF
  STA   ,X+
  STA   ,X+
  LEAX  $26,X
  STA   ,X+
  STA   ,X+
PERMH9
  RTS
  
*===========================================
* AFFICHAGE PERMUTATION VERTICALE POSSIBLE
*===========================================  
PERMV
  LDX   #PADDR
  TFR   B,A
  LSLA
  LDX   A,X
  LEAX  $2D1,X
  TST   MOTO       test du type d'ordinateur
  BNE   PERMV2
PERMV1
  LDA   $A7C0      PA du PIA systeme MO5  
  ORA   #$01       Set bit 0
  STA   $A7C0      selection video forme MO5   
  BRA   PERMV3
PERMV2
  LDA   $E7C3      PA du PIA systeme TO7   
  ORA   #$01       Set bit 0
  STA   $E7C3      selection video forme TO7  
PERMV3
  LDA   #$0A       compteur de boucles
  PSHS  A          empilage
  LDA   #$30
PERMV4
  STA   ,X
  LEAX  $28,X
  DEC   ,S
  BNE   PERMV4
  PULS  A
PERMV9  
  RTS

*===========================================
* ECHANGE DES COULEURS B ET B+1 (HORIZONTAL)
*===========================================  
CINVH
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur premiere pastille
  PSH   A
  INCB
  LDA   B,X        couleur deuxieme pastille
  DECB
  STA   B,X        deuxieme dans premiere
  PULS  A
  INCB 
  STA   B,X        premiere dans deuxieme
  DECB             retablissement valeur initiale
  RTS

*===========================================
* ECHANGE DES COULEURS B ET B+8 (VERTICAL)
*===========================================  
CINVV
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur premiere pastille
  PSH   A
  ADDB  #$08
  LDA   B,X        couleur deuxieme pastille
  SUBB  #$08
  STA   B,X        deuxieme dans premiere
  PULS  A
  ADDB  #$08
  STA   B,X        premiere dans deuxieme
  SUBB  #$08
  RTS

*===========================================
* CALCUL DU NUMERO DE PASTILLE B
* FONCTION DE LIGNE ET COLONNE POINTEES
*===========================================  
CALNUM
* numero dans la ligne = Y/3
  TFR   Y,D        ligne pointee
  SUBD  #$0005     centre premiere pastille
CALNUM1
  INCA   
  SUBB  #$03
  BGE   CALNUM1     
  DECA
* multiplication par 8
  LSLA
  LSLA
  LSLA
  PSHS  A          empilage resultat
* numero dans la ligne = X/3   
  TFR   X,D        colonne pointee
  SUBD  #$0011     centre premiere pastille
CALNUM2
  INCA   
  SUBB  #$03
  BGE   CALNUM2
  DECA
* ajout du nombre de pastilles lignes precedentes  
  ADDA  ,S
  TFR   A,B
  PULS  A
  RTS

*===========================================
* INVERSION DE DEUX PASTILLES B ET B+1
*===========================================  
PINVH
  BSR   CALNUM     calcul du numero B
  BSR   CINVH      inversion des couleurs
  LBSR  PDISP      affichage premiere pastille
  INCB  
  LBSR  PDISP      affichage deuxieme pastille
  LDX   #$0080     hauteur note
  LDA   #$08       longueur note           
  BSR   BUZZ
  RTS

*===========================================
* INVERSION DE DEUX PASTILLES B ET B+8
*===========================================  
PINVV
  BSR   CALNUM     calcul du numero B
  BSR   CINVV      inversion des couleurs
  LBSR  PDISP      affichage premiere pastille
  ADDB  #$08
  LBSR  PDISP      affichage deuxieme pastille
  LDX   #$0080     hauteur note
  LDA   #$08       longueur note           
  BSR   BUZZ
  RTS
  
*===========================================
* TEMPORISATION EN FONCTION DE X
*===========================================  
TEMPO
  PSHS  X
TEMPO1
  LEAX  -1,X
  BNE   TEMPO1
  PULS  X,PC  

*===========================================
* EMISSION SIGNAL SONORE
* TEMPO DANS X
* DUREE DANS A
*===========================================  
BUZZ
* signal sonore
  ORCC  #$50       masque les interruptions
  PSHS  A          compteur duree note
  TST   MOTO       test du type d'ordinateur
  BNE   BUZZ3
* version MO5
BUZZ1
  LDA   $A7C1      registre pour le buzzer MO5
BUZZ2
  ORA   #$01
  STA   $A7C1      buzzer MO5 a un 
  BSR   TEMPO      temporisation 
  ANDA  #$FE
  STA   $A7C1      buzzer MO5 a zero
  BSR   TEMPO      temporisation 
  DEC   ,S
  BNE   BUZZ2
  BRA   BUZZ9
* version TO7
BUZZ3
  LDA   $E7C1      registre pour le buzzer TO7
BUZZ4
  ORA   #$08
  STA   $E7C1      buzzer TO7 a un 
  BSR   TEMPO      temporisation 
  ANDA  #$F7
  STA   $E7C1      buzzer TO7 a zero
  BSR   TEMPO      temporisation 
  DEC   ,S
  BNE   BUZZ4
* retour
BUZZ9
  PULS  A 
  ANDCC #$AF       restaure les interruptions
  RTS
  
*===========================================
* RETOUR VALEUR ALEATOIRE DANS A
*===========================================  
ALEA
  TST   MOTO       test du type d'ordinateur
  BNE   ALEA2
ALEA1
  LDA   $2031      valeur aleatoire MO5
  INCA             pour changer de couleur
  STA   $2031      en jeu automatique MO5
  BRA   ALEA3
ALEA2
  LDA   $E7C7      valeur aleatoire TO7
  INCA             pour changer de couleur
  STA   $E7C7      en jeu automatique TO7
ALEA3
  RTS
  
*===========================================
* INITIALISATION AU HASARD DES COULEURS
*===========================================  
COLINI
  BSR   ALEA       valeur aleatoire dans A
  LSRA
  ANDA  #$07
  BEQ   COLINI     pas de noir
  CMPA  #$04
  BEQ   COLINI     pas de bleu
  CMPA  #$07
  BEQ   COLINI     pas de blanc
  LDX   #PCOLOR    table des couleurs
  LDB   #$37       numero derniere pastille
COL9   
  STA   B,X
  DECB
  BGE   COL9
  RTS

*===========================================
* SUPPRESSION PASTILLE B ET DESCENTE COLONNE
*===========================================  
SUPPR
  PSHS  B 
SUPPR1
  SUBB  #$08       pastille au-dessus
  BLT   SUPPR2     haut de colonne depasse
  BSR   SCROLL     scroll pastille
  BRA   SUPPR1     pastille suivante
SUPPR2
  BSR   ALEA       valeur aleatoire dans A
  ANDA  #$07       valeur entre 0 et 7
  INCA
  CMPA  #$04       couleur de fond MO5
  BNE   SUPPR8
  LDA   #$05
SUPPR8   
  CMPA  #$06
  BLE   SUPPR9
  LDA   #$01
SUPPR9
  LDX   #PCOLOR    table des couleurs
  ADDB  #$08       premiere pastille colonne
  STA   B,X
  LBSR  PDISP      affichage pastille 
  PULS  B,PC 

*===========================================
* SCROLL PASTILLE B
*===========================================  
SCROLL
  LDA   JEUAUTO    indicateur de jeu automatique
  BNE   SCROLL9    pas de mouvement en jeu automatique
  LDX   #PADDR     table des adresses
  LEAX  B,X        pointeur dans la table
  LEAX  B,X        pointeur dans la table
  LDY   ,X         adresse pastille B
  PSHS  Y          empilage adresse originale
  LDA   #$18       compteur de boucle
  PSHS  A          empilage compteur
  PSHS  Y,X        empilage pointeur et adresse 
SCROLL1
  PULS  X,Y
  LEAY  $28,Y
  STY   ,X
  PSHS  Y,X
  LBSR  PDISP
  DEC   4,S
  BNE   SCROLL1
  PULS  X,Y
  PULS  A
  PULS  Y          adresse originale
  STY   ,X         restauration de l'adresse
* signal sonore
  LDX   #$0040     hauteur note
  LDA   #$03       longueur note           
  LBSR  BUZZ
SCROLL9
  PSHS  B          empilage no pastille depart 
  LDX   #PCOLOR    table des couleurs
  LDA   B,X        couleur pastille depart
  ADDB  #$08
  STA   B,X        couleur pastille arrivee
  BSR   PDISP      affichage pastille arrivee
* incrementation du score
  LDD   SCORE
  ADDD  #$0001
  STD   SCORE
  PULS  B          depilage no pastille depart 
  RTS

*===========================================
* AFFICHAGE DU NUMERO DE PARTIE
*===========================================  
DPARTIE
  LDX   #PARTIE+2
  LBSR  CHAINE
  LDD   PARTIE
  ADDD  #$0001
  STD   PARTIE 
  JSR   DISPD      affichage registre D
  RTS

*===========================================
* AFFICHAGE DU SCORE
*===========================================  
DSCORE
  PSHS  B
  LDX   #BLANC     effacement de Patientez....
  LBSR  CHAINE
  LDX   #COUPS+2
  LBSR  CHAINE
  LDD   COUPS      nombre de coups
  JSR   DISPD      affichage registre D
  LDX   #SCORE+2  
  BSR   CHAINE
  LDD   SCORE      score
  JSR   DISPD      affichage registre D
  LDX   #MAX+2
  BSR   CHAINE
  LDD   MAX        hiscore
  JSR   DISPD      affichage registre D
  PULS  B,PC

*===========================================
* AFFICHAGE CHAINE EN X TERMINEE PAR $04
*===========================================  
CHAINE
  TST   MOTO       test du type d'ordinateur
  BNE   CHAIN2
CHAIN1
  LDB   ,X+
  CMPB  #$04
  BEQ   CHAIN9
  SWI              affichage caractere MO5
  FCB   $02
  BRA   CHAIN1
CHAIN2
  LDB   ,X+
  CMPB  #$04
  BEQ   CHAIN9
  JSR   $E803      affichage caractere TO7
  BRA   CHAIN2
CHAIN9
  RTS  

*===========================================
* AFFICHAGE DE LA PASTILLE B
*===========================================  
PDISP
  PSHS  B          empilage du numero de pastille 
  LDX   #PCOLOR
  LDA   B,X        couleur pastille
  LSLA
  LSLA
  LSLA
  TST   MOTO       test du type d'ordinateur
  BNE   PDISP2
* calcul octet couleur MO5
PDISP1
  LDB   $A7C0      MO5
  ANDB  #$FE
  STB   $A7C0      MO5
  LSLA
  ORA   #$04       couleur de fond bleu
  BRA   PDISP3
* calcul octet couleur TO7
PDISP2
  LDB   $E7C3      TO7
  ANDB  #$FE
  STB   $E7C3      TO7
  ORA   #$C4       bits intensite et fond
* recherche adresse pastille  
PDISP3
  LDB   ,S         numero de pastille
  LDX   #PADDR     table des adresses
  LSLB             deplacement dans la table              
  LDY   B,X        adresse MO5 pastille B
  TST   MOTO       test du type d'ordinateur
  BEQ   PDISP4     type MO5
  LEAY  $4000,Y    adresse TO7 pastille B
PDISP4
  PSHS  Y          empilage adresse
  LDB   #$18       nombre de lignes
PDISP5  
  STA   0,Y
  STA   1,Y
  STA   2,Y
  LEAY  $28,Y
  DECB
  BNE   PDISP5 
  ORA   #$07       couleur de fond blanc
  LEAY  -$27F,Y
  LDB   #$08 
PDISP6  
  STA   ,Y
  LEAY  $28,Y
  DECB
  BNE   PDISP6 
  PULS  Y

* forme  
  TST   MOTO       test du type d'ordinateur
  BNE   PDISP8
PDISP7
  INC   $A7C0      selection video forme MO5
  BRA   PDISP9
PDISP8
  INC   $E7C3      selection video forme TO7
PDISP9
  LDX   #PGRAPH    table de definition pastille
  BSR   CDISP      affichage premiere colonne
  BSR   CDISP      affichage deuxieme colonne
  BSR   CDISP      affichage troisieme colonne
  PULS  B,PC

*===========================================
* AFFICHAGE DE TOUTES LES PASTILLEs
*===========================================  
TDISP
  LDB   #$37
TDISP1  
  BSR   PDISP      affichage d'une pastille
  DECB
  BGE   TDISP1
  RTS

*===========================================
* AFFICHAGE COLONNE PASTILLE
*===========================================  
CDISP
  LDB   #$18
CDISP1               
  LDA   ,X+          
  STA   ,Y
  LEAY  $28,Y
  DECB
  BNE   CDISP1
  LEAY  -$3BF,Y 
  RTS

*===========================================
* AFFICHAGE REGISTRE D EN DECIMAL
*===========================================  
DISPD
  STD   DWORK1    stockage de D 
  CLR   DISPCN    raz nbre de chiffres affiches
  LDD   #10000    diviseur
  BSR   DISPC
  LDD   #1000     diviseur
  BSR   DISPC
  LDD   #100      diviseur
  BSR   DISPC
  LDD   #10       diviseur
  BSR   DISPC
  LDD   #1        diviseur
  INC   DISPCN    forcer affichage unite a zero
  BSR   DISPC
  RTS

*===========================================
* AFFICHAGE CHIFFRE DECIMAL
*===========================================  
DISPC
  STD   DWORK2     stockage diviseur   
  BSR   DIVD       division de D 
  CMPB  #$00
  BNE   DISPC1
  LDA   DISPCN     nombre de chiffers affiches
  BNE   DISPC1     affichage du zero
  RTS              pas d'affichage du zero  
DISPC1
  INC   DISPCN   
  ADDB  #$30       code ASCII
  TST   MOTO       test du type d'ordinateur
  BNE   DISPC3
DISPC2
  SWI              affichage caractere 
  FCB   $82        retour
DISPC3
  JSR   $E803      affichage caractere TO7
  RTS
DISPCN
  FCB   $00

*===========================================
* DIVISION DE DWORK1 PAR DWORK2
* RESULTAT DANS B, RESTE DANS DWORK1
*===========================================  
DIVD
  CLRB 
  PSHS  B        compteur pour le quotient
  LDD   DWORK1   dividende
DIVD1
  SUBD  DWORK2   oter le diviseur
  BLT   DIVD2    terminer si valeur negative 
  INC   ,S       incrementer le quotient
  BRA   DIVD1    recommencer
DIVD2  
  ADDD  DWORK2   annuler la derniere soustraction 
  STD   DWORK1   reste dans DWORK1
  PULS  B,PC     depilage et retour 

DWORK1
  FDB   $0000    zone de stockage du nombre 
DWORK2
  FDB   $0000    diviseur
  
*===========================================
* Variables diverses (score, coups, etc.)
*===========================================  
PARTIE
  FDB  $0000
  FCB  $1E,$0A,$0A,$0A,$0A,$0A   
  FCC  'Partie: '
  FCB  $04
COUPS
  FDB  $0000
  FCB  $1E,$0A,$0A,$0A,$0A,$0A,$0A 
  FCC  'Coups : '
  FCB  $04
SCORE
  FDB  $0000
  FCB  $1E,$0A,$0A,$0A,$0A,$0A,$0A,$0A   
  FCC  'Score : '
  FCB  $04
MAX
  FDB  $0000
  FDB  $1E0A,$0A0A,$0A0A,$0A0A,$0A0A
  FCC  'Hiscore '
  FCB  $04
BLANC
  FCB  $1E   locate 0,0
  FDB  $0A0A,$0A0A,$0A0A
  FCB  $0A
  FCC  '                '
  FCB  $04
COUPMAX
  FDB  $0020       nbre de coups par partie
JEUAUTO
  FCB  $00         indicateur de jeu automatique
MOTO
  FCB  $00         type d'ordinateur 0=MO,1=TO
  
*===========================================
* Initialisation de l'ecran
*===========================================  
SCRINIT
  FCB  $1B   sequence d'echappement
  FCB  $47   forme blanc
  FCB  $1B   sequence d'echappement
  FCB  $54   fond bleu
  FCB  $1B   sequence d'echappement
  FCB  $64   cadre bleu
  FCB  $0C   effacement ecran
  FCB  $14   extinction curseur
  FCB  $04

*===========================================
* AFFICHAGE BITMAP DU TITRE
*===========================================  
BITMAP
  TST   MOTO
  BNE   BITM7
BITM5
  LDA   $A7C0      registre MO5
  ORA   #$01       bit selection video
  STA   $A7C0      selection forme
  LDY   #$0000     adresse ecran MO5 
  LDX   #TITRE5    adresse titre MO5
  LDD   #$0E18     dimensions bitmap
  BSR   BITMX      affichage bitmap
  LDY   #$000E     adresse ecran MO5 
  BRA   BITM9
BITM7
  LDA   $E7C3      registre TO7
  ORA   #$01       bit selection video
  STA   $E7C3      selection forme
  LDY   #$4000     adresse ecran TO7
  LDX   #TITRE7    adresse titre TO7
  LDD   #$0E18     dimensions bitmap
  BSR   BITMX      affichage bitmap
  LDY   #$400E     adresse ecran TO7
BITM9
  LDX   #KANDYK    adresse titre
  LDD   #$1A18     dimensions bitmap

*===========================================
* AFFICHAGE EN Y DU BITMAP X
* LARGEUR Ax8, HAUTEUR B  
*===========================================  
BITMX
  PSHS  B,A        empilage des dimensions
BITMX1  
  PSHS  Y          adresse debut ligne
BITMX2
  LDB   ,X+        lecture 8 bits
  STB   ,Y+        ecriture 8 bits
  DECA             compteur de colonnes
  BNE   BITMX2     colonne suivante
  PULS  Y          adresse debut de ligne 
  LEAY  $28,Y      adresse ligne suivante 
  LDA   ,S         compteur de colonnes
  DEC   1,S        compteur de lignes
  BNE   BITMX1     ligne suivante
  PULS  A,B,PC
  
*===========================================
* Ecran pour une nouvelle partie
*===========================================  
SCRNEW
  FCB  $1E   locate 0,0
  FDB  $0A0A,$0A0A,$0A0A
  FCC  '                '
  FDB  $0D0A
  FCC  'Patientez...    '
  FDB  $0D0A,$0A0A,$0A0A
  FCC  'Alignez 3 pions'
  FDB  $0D0A
  FCC  'de m'
  FDB  $1643
  FCC  'eme couleur '
  FDB  $0D0A
  FCC  'horizontalement '
  FDB  $0D0A
  FCC  'ou verticalement'
  FCB  $0D,$0A,$0A
  FCC  'Pointez entre 2 '
  FDB  $0D0A
  FCC  'pions pour les  '
  FDB  $0D0A
  FCC  'permuter.'
  FCB  $04
  
*===========================================
* Message pour afficher l'aide
*===========================================  
MAIDE
  FDB  $1E0A    locate 0,0 + line feed
  FDB  $0A0A,$0A0A,$0A0A,$0A0A,$0A0A
  FDB  $0A0A,$0A0A,$0A0A,$0A0A,$0A0A
  FCC  'Touche A = Aide'
  FDB  $0D0A
  FCC  'avec perte de  '
  FDB  $0D0A
  FCC  'dix points.    '
  FCB  $04
  
*===========================================
* Message d'appui sur une touche
*===========================================  
MAPPUI
  FDB  $1E0A    locate 0,0 + line feed
  FDB  $0A0A,$0A0A,$0A0A,$0A0A,$0A0A
  FDB  $0A0A,$0A0A,$0A0A,$0A0A,$0A0A
  FCC  'Appuyez sur une'
  FDB  $0D0A
  FCC  'touche pour    '
  FDB  $0D0A
  FCC  'continuer...   '
  FCB  $04
  
*===========================================
* Message de fin de partie MO5
*===========================================  
FPART5  
  FDB  $1B73       caracteres taille double MO5
  FCB  $1F         sequence user
  FDB  $4D52       curseur ligne 13 colonne 18
  FCC  'FIN'
  FDB  $1B70       caracteres taille normale MO5
  FCC  ' de '
  FDB  $1B73       caracteres taille double MO5
  FCC  'PARTIE'
  FDB  $1B70       caracteres taille normale MO5
  FCB  $04
  
*===========================================
* Message de fin de partie TO7
*===========================================  
FPART7  
  FDB  $1B4F       caracteres taille double TO7
  FCB  $1F         sequence user
  FDB  $4D52       curseur ligne 13 colonne 18
  FCC  'FIN'
  FDB  $1B4C       caracteres taille normale TO7
  FCC  ' de '
  FDB  $1B4F       caracteres taille double TO7
  FCC  'PARTIE'
  FDB  $1B4C       caracteres taille normale TO7
  FCB  $04
  
*===========================================
* Table des couleurs
*===========================================  
PCOLOR  
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  FCB  $00,$00,$00,$00,$00,$00,$00,$00
  
*===========================================
* Positions des pastilles dans l'ecran
*===========================================  
PADDR
  FDB  $0510,$0513,$0516,$0519,$051C,$051F,$0522,$0525
  FDB  $08D0,$08D3,$08D6,$08D9,$08DC,$08DF,$08E2,$08E5
  FDB  $0C90,$0C93,$0C96,$0C99,$0C9C,$0C9F,$0CA2,$0CA5
  FDB  $1050,$1053,$1056,$1059,$105C,$105F,$1062,$1065
  FDB  $1410,$1413,$1416,$1419,$141C,$141F,$1422,$1425
  FDB  $17D0,$17D3,$17D6,$17D9,$17DC,$17DF,$17E2,$17E5
  FDB  $1B90,$1B93,$1B96,$1B99,$1B9C,$1B9F,$1BA2,$1BA5
  
*===========================================
* Graphisme de la pastille (par colonne)
*===========================================  
PGRAPH  
  FCB   $00,$00,$00,$00,$00,$03,$07,$07
  FCB   $0F,$0F,$0F,$0F,$0F,$0F,$07,$07
  FCB   $03,$00,$00,$00,$00,$00,$00,$00

  FCB   $00,$00,$00,$00,$FC,$FF,$FF,$FF
  FCB   $FF,$FF,$FE,$FE,$FC,$FC,$F1,$C3  
  FCB   $FF,$FC,$00,$00,$00,$00,$00,$00

  FCB   $00,$00,$00,$00,$00,$00,$80,$80  
  FCB   $C0,$C0,$C0,$C0,$C0,$C0,$80,$80  
  FCB   $00,$00,$00,$00,$00,$00,$00,$00  
  
*===========================================
* Graphisme MO5
*===========================================  
TITRE5
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FE00,$7FFC,$00FC,$0000,$3F00,$0000,$7FFF
  FDB   $FEFF,$BFFB,$FEF3,$FFFF,$CF7F,$FFFF,$7FFF
  FDB   $FEFF,$BFFB,$FEEF,$FFFF,$F77F,$FFFF,$7FFF
  FDB   $FEF7,$DFF7,$DEEF,$FFFF,$F77F,$FFFF,$7FFF
  FDB   $FEF3,$DFF7,$9EDF,$FFFF,$FB78,$0000,$7FFF
  FDB   $FEF3,$EFEF,$9EDF,$0000,$FB7B,$FFFF,$FFFF
  FDB   $FEF5,$EFEF,$5EDE,$FFFF,$7B7B,$FFFF,$FFFF
  FDB   $FEF5,$F7DF,$5EDE,$FFFF,$7B7A,$0007,$FFFF
  FDB   $FEF6,$F7DE,$DEDE,$FFFF,$7B78,$FFF9,$FFFF
  FDB   $FEF6,$FBBE,$DEDE,$FFFF,$7B7F,$FFFE,$FFFF
  FDB   $FEF7,$7BBD,$DEDE,$FFFF,$7B7F,$FFFF,$7FFF
  FDB   $FEF7,$7D7D,$DEDE,$FFFF,$7B7E,$001F,$7FFF
  FDB   $FEF7,$BD7B,$DEDE,$FFFF,$7B00,$FFEF,$7FFF
  FDB   $FEF7,$BEFB,$DEDE,$FFFF,$7BFF,$FFEF,$7FFF
  FDB   $FEF7,$DEF7,$DEDE,$FFFF,$7BFF,$FFEF,$7FFF
  FDB   $FEF7,$DEF7,$DEDE,$FFFF,$7BFF,$FFEF,$7FFF
  FDB   $FEF7,$EFEF,$DEDF,$0000,$FB00,$FFEF,$7FFF
  FDB   $FEF7,$EFEF,$DEDF,$FFFF,$FB7E,$001F,$7FFF
  FDB   $FEF7,$F7DF,$DEEF,$FFFF,$F77F,$FFFF,$7FFF
  FDB   $FEF7,$F7DF,$DEEF,$FFFF,$F7BF,$FFFE,$FFFF
  FDB   $FEF7,$FBBF,$DEF3,$FFFF,$CFCF,$FFF9,$FFFF
  FDB   $FE07,$F83F,$C0FC,$0000,$3FF0,$0007,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  
*===========================================
* Graphisme TO7
*===========================================  
TITRE7
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FE00,$0000,$0FFF,$800F,$FFFF,$F000,$00FF
  FDB   $FE00,$0000,$0FFC,$0001,$FFFF,$F000,$00FF
  FDB   $FE00,$0000,$0FF0,$0000,$7FFF,$F000,$00FF
  FDB   $FE00,$0000,$0FE0,$0000,$3FFF,$F000,$00FF
  FDB   $FFFF,$FFFF,$FFC0,$7FF0,$1FFF,$FFFF,$F0FF
  FDB   $FE00,$0400,$0FC1,$C01C,$1FFF,$F000,$10FF
  FDB   $FE00,$0400,$0F87,$0007,$0FFF,$F000,$30FF
  FDB   $FE00,$0400,$0F86,$0003,$0FFF,$F000,$20FF
  FDB   $FE00,$0400,$0F0C,$0001,$87FF,$F000,$61FF
  FDB   $FFFF,$843F,$FF08,$3FE0,$87FF,$FFF0,$C1FF
  FDB   $FFFF,$843F,$FF08,$7FF0,$87FF,$FFE0,$83FF
  FDB   $FFFF,$843F,$FF08,$3FE0,$87FF,$FFE1,$87FF
  FDB   $FFFF,$843F,$FF0C,$0001,$87FF,$FFC3,$07FF
  FDB   $FFFF,$843F,$FF86,$0003,$0FFF,$FF82,$0FFF
  FDB   $FFFF,$843F,$FF87,$0007,$0FFF,$FF86,$1FFF
  FDB   $FFFF,$843F,$FFC1,$C01C,$1FFF,$FF0C,$1FFF
  FDB   $FFFF,$843F,$FFC0,$7FF0,$1FFF,$FE08,$3FFF
  FDB   $FFFF,$843F,$FFE0,$0000,$3FFF,$FE18,$7FFF
  FDB   $FFFF,$843F,$FFF0,$0000,$7FFF,$FC30,$7FFF
  FDB   $FFFF,$843F,$FFFC,$0001,$FFFF,$F820,$FFFF
  FDB   $FFFF,$843F,$FFFF,$800F,$FFFF,$F861,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  
*===========================================
* Graphisme Kandy Krush
*===========================================  
KANDYK
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFE3,$F83F,$FFFF,$FFFC,$7FFF,$FE3F,$83FF,$FFFF,$FF8F,$FFFF,$F1FF,$FFFF,$FFFF
  FDB   $FFE3,$F07F,$FFFF,$FFFC,$7FFF,$FE3F,$07FF,$FFFF,$FF8F,$FFFF,$F1FF,$FFFF,$FFFF
  FDB   $FFE3,$E0FF,$FFFF,$FFFC,$7FFF,$FE3E,$0FFF,$FFFF,$FF8F,$FFFF,$F1FF,$FFFF,$FFFF
  FDB   $FFE3,$C1FF,$FFFF,$FFFC,$7FFF,$FE3C,$1FFF,$FFFF,$FF8F,$FFFF,$F1FF,$FFFF,$FFFF
  FDB   $FFE3,$83F8,$1F10,$7F00,$63E3,$FE38,$3E02,$3E3C,$0788,$3FFF,$F1F0,$38FC,$703F
  FDB   $FFE3,$07E0,$0F00,$3E00,$63C3,$FE30,$7E02,$3E38,$0380,$1FFF,$F1C0,$18FC,$401F
  FDB   $FFE0,$0FC0,$0700,$3C00,$63C3,$FE00,$FE06,$3E30,$0380,$0FFF,$F180,$08F8,$000F
  FDB   $FFE0,$1FC3,$870E,$1870,$61C7,$FE01,$FE1E,$3E31,$E187,$0FFF,$F187,$0C78,$870F
  FDB   $FFE0,$0FC7,$C71F,$1878,$71C7,$FE00,$FE3E,$3E30,$718F,$8FFF,$F18F,$8C78,$8F8F
  FDB   $FFE0,$0FFE,$071F,$18F8,$7187,$FE00,$FE3E,$3E30,$0F8F,$8FFF,$F1FC,$0C31,$FC0F
  FDB   $FFE1,$87F0,$071F,$18FC,$708F,$FE18,$7E3E,$3E38,$038F,$8FFF,$F1E0,$0E31,$E00F
  FDB   $FFE3,$83E0,$071F,$18FC,$780F,$FE38,$3E3E,$3E3C,$018F,$8FFF,$F1C0,$0E21,$C00F
  FDB   $FFE3,$C3C1,$C71F,$18F8,$780F,$FE3C,$3E3E,$3E3F,$C18F,$8FF8,$F183,$8F03,$838F
  FDB   $FFE3,$E1C7,$871F,$1878,$781F,$FE3E,$1E3E,$3C31,$F18F,$8FF8,$F18F,$0F03,$8F0F
  FDB   $FFE3,$F0C3,$071F,$1C30,$7C1F,$FE3F,$0E3E,$1830,$618F,$8FF8,$6186,$0F07,$860F
  FDB   $FFE3,$F040,$071F,$1C00,$7C1F,$FE3F,$063E,$0038,$038F,$8FF8,$0380,$0F87,$800F
  FDB   $FFE3,$F860,$031F,$1E00,$7E1F,$FE3F,$863F,$0038,$038F,$8FFC,$07C0,$0787,$C007
  FDB   $FFE3,$FC30,$E31F,$1F84,$7E3F,$FE3F,$C23F,$C23E,$0F8F,$8FFF,$0FE1,$C7CF,$E1C7
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FC3F,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$FC7F,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$F07F,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$F0FF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
  FDB   $FFFF,$FFFF,$FFFF,$FFFF,$F1FF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF
 
END
Daniel
L'obstacle augmente mon ardeur.
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: MO5 Kandy Krush Java

Message par jasz »

Je pense qu'il y a plus simple pour tester si il s'agit d'un TO ou d'un MO

Code : Tout sélectionner

	  CLR	MOTO	' le tampon MOTO n'a pas besoin d'être initialisé 
			         ' car normalement à 0 lors du chargement du programme
TEST LDX	#$FFF0 ' je pointe l'adresse moniteur commune aux deux types dans x
	  LDA   #7	  ' je charge la valeur du bit à tester
	  BITA  2,(X)  * les parenthèses servent à comprendre qu'il s'agit du mot contenu dans X+2
	  BNE	SUITE  ' si le bit 7 est à 1 alors c'est un MO
	  INC   MOTO   ' sinon c'est un TO
SUITE...
MOTO FCB   00

J'ai mis volontairement l'adresse $FFF0 au cas ou le besoin de tester la version est nécessaire ;) Sinon bien sûr on peut simplifier par

Code : Tout sélectionner

TEST     LDA  #7
         BITA #$FFF2
         BNE  SUITE
         INC  MOTO
Dernière modification par jasz le 07 oct. 2016 19:02, modifié 1 fois.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: MO5 Kandy Krush Java

Message par Daniel »

Ce que tu écris est vrai pour les ROMs officielles Thomson. Par contre, pour d'autres ROMs existantes ou à venir, il n'y a aucune garantie. Par exemple, dans la dernière version de la ROM OS/9 pour TO9+, le bit 7 de $FFF2 est à 1. Tu me diras que ce n'est pas grave, car Kandy Krush ne fonctionne pas dans OS/9 puisqu'il appelle des routines système Thomson. Mais rien n'empêche un développeur d'écrire une ROM compatible Thomson avec un bit 7 de $FFF2 différent de la valeur habituelle.

Ma méthode de test de l'adresse $1F40 pour déterminer si c'est de la RAM ou de la ROM n'est pas plus compliquée et un peu plus sûre.
Daniel
L'obstacle augmente mon ardeur.
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: MO5 Kandy Krush Java

Message par jasz »

Daniel a écrit : Mais rien n'empêche un développeur d'écrire une ROM compatible Thomson avec un bit 7 de $FFF2 différent de la valeur habituelle.
Oui aussi! Mais là on rentre dans un futur incertain :roll: . Et si ce jeune homme s'amuse à dénaturer toutes les ROM d'origines ou allons nous? Remarque, je dis ça, je dis rien :mrgreen: Mon exemple s'applique simplement à des machines ordinaires ;)

edit
Remarque, cette fameuse partie commune aux deux types pourrait t'être utile pour l'affichage du logo. L'octet $FFF0 permet de connaitre le modèle de la machine :idea:
Dernière modification par jasz le 08 oct. 2016 08:23, modifié 2 fois.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: MO5 Kandy Krush Java

Message par __sam__ »

jasz a écrit :

Code : Tout sélectionner

	  LDA   #7
	  BITA  XXXX
	  BNE	SUITE  ' si le bit 7 est à 1 alors c'est un MO
Ya un bug! Sur le 6809 l'opération BITA est en réalité un masque AND qui ne modifife pas le registe. Aussi pour tester le bit 7, il faut charger A le registre avec 128 (==pow(2,7)) et pas 7.

Code : Tout sélectionner

LDA $FFF2
BITA #128
BNE SUITE
...
mais on peut même directement faire ANDA #128 si on se fiche de la valeur lue. En outre comme c'est le bit 7 de la valeur lue, il se retrouve dès le LDA dans le flag N du processeur:

Code : Tout sélectionner

TST $FFFE   ou LDA c'est pareuil pour le bit N(egative)
BMI SUITE
...
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: MO5 Kandy Krush Java

Message par jasz »

En effet __sam__, tu as parfaitement raison. C'est vrai que BIT ne fonctionne pas comme un BTST. :?

Il faut donc charger A avec $80 et remplacer le BITA par ANDA. J'aurais du tester avant :oops: mea culpa

Code : Tout sélectionner

	  CLR	MOTO	' le tampon MOTO n'a pas besoin d'être initialisé 
			         ' car normalement à 0 lors du chargement du programme
TEST LDX	#$FFF0 ' je pointe l'adresse moniteur commune aux deux types dans x
	  LDA   $80    ' je charge la valeur du bit à tester
	  ANDA  2,(X)  * les parenthèses servent à comprendre qu'il s'agit de l'octet contenu dans X+2
	  BEQ	SUITE  ' si le bit 7 est à 1 alors c'est un MO
	  INC   MOTO   ' sinon c'est un TO
SUITE...
MOTO FCB   00

Edit
Mais j'avoue ne pas avoir pensé à cette solution

Code : Tout sélectionner


TEST TST	#$FFF2 
	  BLT	SUITE  ' si le bit 7 est à 1 alors l'octet est négatif donc <0 c'est un MO
	  INC   MOTO   ' sinon c'est un TO
SUITE...
MOTO FCB   00

Merci __sam__ pour cette précision :)
Dernière modification par jasz le 08 oct. 2016 08:09, modifié 2 fois.
Répondre