; ******** VINGT QUATRIEME COURS : LES PUCES N°36 ******** ; ; ************ 4ème JEU : LA PILULE MAUDITE ************ ; ; ******* Copyright Igor Barzilai - Juillet 2001 ********* include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Etat = 128 ; Etat du player Compteur = 129 ; Compteur d'animation du player Starty = 130 ; début d'affichage du joueur Endy = 131 ; Fin d'affichage du joueur Joy = 132 ; mouvement de joystick précédent Starty1 = 133 ; début d'affichage de la pilule Endy1 = 134 ; Fin d'affichage de la pilule Compteur1 = 135 ; compteur de temps général Duree = 136 ; Duree de déplacement de la pilule Direction = 137 ; Direction de la pilule Score = 138 ; Temps gagné. commence à 32 ; ************ LIGNES DE BYTE ************* Player ; motif du Player0 BYTE. %01100110 BYTE. %11000101 BYTE. %00111000 BYTE. %00111100 BYTE. %00111100 BYTE. %00011000 BYTE. %00011100 BYTE. %00110110 BYTE. %00111100 BYTE. %00111100 BYTE. %01110110 BYTE. %00100101 BYTE. %00011000 BYTE. %00111100 BYTE. %00111100 BYTE. %00011000 BYTE. %00011100 BYTE. %00110110 BYTE. %00111100 BYTE. %00111100 BYTE. %00111110 BYTE. %00101000 BYTE. %00011000 BYTE. %00111100 BYTE. %00111100 BYTE. %00011000 BYTE. %00011100 BYTE. %00110110 BYTE. %00111100 BYTE. %00111100 BYTE. %00011100 BYTE. %00010000 BYTE. %00011000 BYTE. %00111100 BYTE. %00111100 BYTE. %00011000 BYTE. %00011100 BYTE. %00110110 BYTE. %00111100 BYTE. %00111100 Decor1 BYTE. %01111111 BYTE. %11000000 BYTE. %10000000 BYTE. %10000000 BYTE. %10000000 BYTE. %10000000 BYTE. %10000000 BYTE. %10000000 BYTE. %10011000 BYTE. %10000000 BYTE. %10000000 BYTE. %11000000 BYTE. %10000000 BYTE. %10000000 BYTE. %10000000 BYTE. %10000000 BYTE. %10001000 BYTE. %10001000 BYTE. %10001000 BYTE. %10001111 BYTE. %10000000 BYTE. %10000000 BYTE. %11000000 BYTE. %01111111 Decor2 BYTE. %11111111 BYTE. %00000000 BYTE. %00000000 BYTE. %00000000 BYTE. %00011111 BYTE. %00010000 BYTE. %00010000 BYTE. %00010000 BYTE. %00000000 BYTE. %00000000 BYTE. %00000000 BYTE. %00011111 BYTE. %00000000 BYTE. %00000000 BYTE. %00000000 BYTE. %00000000 BYTE. %00010000 BYTE. %00010000 BYTE. %00010000 BYTE. %00010000 BYTE. %00000000 BYTE. %00000000 BYTE. %00000000 BYTE. %11111111 Playerp ; motif du Player1 BYTE. %00000000 BYTE. %00011000 BYTE. %00111100 BYTE. %01111110 BYTE. %01111110 BYTE. %01111110 BYTE. %01111110 BYTE. %00111100 BYTE. %00011000 BYTE. %00000000 Colorp BYTE. 0,2,4,6,8,10,10,8,6,4,2,0 Color BYTE. 132,132,134,134,136,14,26,26,20,180 Table BYTE. 0,0,0,10,10,10,20,20,20,30,30,30,20,20,20,10,10,10 Inverse BYTE. 15,15,15,15,15,10,9,11,15,6,5,7,15,14,13,15 Mouvement ; Gauche et droite BYTE. 16,240 ; ************** ZONE D'INITIALIZATION *************** Start SEI ; Ne modifiez rien à ces CLD ; lignes car elles LDY #255 ; initialisent le système LDA #0 ; Charge 0 dans A B1 STA 0,Y ; Effacement de la RAM DEY ; en utilisant X comme compteur BNE B1 ; Boucle LDA #40 ; Initialise la position de départ STA Starty ; des deux players à 40 STA Starty1 ; LDA #30 ; Initialise la position d'arrivée STA Endy ; à 30 (les players font donc STA Endy1 ; dix lignes de hauteur) LDA #31 ; On initialise le score à 31 STA Score ; Le jeu se finit à 0 ! si on gagne... MainLoop ; Boucle principale d'affichage LDA #2 ; Ne changez rien à ces STA WSYNC ; lignes car elles STA WSYNC ; initialisent l'affichage STA WSYNC ; STA VSYNC ; STA WSYNC ; STA WSYNC ; LDY #53 ; STY TIM64T ; LDA #0 ; STA WSYNC ; STA VSYNC ; DrawScreen ; LDA INTIM ; BNE DrawScreen ; STA WSYNC ; STA VBLANK ; ; ******** PREPARATIFS DE L'AFFICHAGE INC Compteur ; Incrémente le compteur d'image du perso LDA Compteur ; Charge ce compteur dans A CMP #18 ; Compare à 18 BNE Pasdeborde ; tant que différent ... LDA #0 ; Sinon réinitialise le compteur STA Compteur ; Pasdeborde ; TAY ; Transfert le compteur dans Y LDA Table,Y ; Pour charger dans A la valeur STA Etat ; correspondant à l'état du player LDA #14 STA COLUP1 ; Couleur de la pastille LDA #54 ; Met du rouge... STA COLUPF ; pour le playfield LDA #1 ; Met le playfield... STA CTRLPF ; en mode symétrique LDA #0 ; Initialise... STA CXCLR ; le détecteur de collisions ; ******** AFFICHAGE LDY #95 ; Y est le compteur de ligne Affiche1 ; Affiche t-on le perso 0 ? CPY Starty ; compare Y à Starty BCS Passprite ; si plus petit, saute à Passprite CPY Endy ; compare Y à Endy BCC Passprite ; Si plus grand, saute à Passprite TYA ; On affiche le perso :Transfert Y dans A SEC ; Obligatoire avant un SBC SBC Endy ; A contient la ligne (0 à 19) du sprite TAX ; Transfert de A dans X LDA Color,X ; Charge la couleur de la ligne de sprite STA WSYNC ; LIGNES PAIRES STA COLUP0 ; Attribue la couleur à la ligne du sprite TXA ; X contient la ligne (0 à 19) du sprite ADC Etat ; on y ajoute Etat TAX ; Transfert A dans X LDA Player-1,X ; Charge la forme du player STA GRP0 ; Attribue la forme au player Decor ; Affiche le décor TYA ; Transfert Y dans A LSR ; pour le diviser par 4 LSR ; TAX ; Transfert le résultat dans X LDA Decor1,X ; pour charger le graphisme du décor STA WSYNC ; LIGNES IMPAIRES STA PF1 ; de la partie extérieure... LDA Decor2,X ; STA PF2 ; et de la partie intérieure Pastille CPY Starty1 ; compare Y à Starty BCS Passprite1 ; si plus petit, saute à Passprite CPY Endy1 ; compare Y à Endy BCC Passprite1 ; Si plus grand, saute à Passprite TYA ; Transfert Y dans A SEC ; Obligatoire avant un SBC SBC Endy1 ; A contient la ligne (0 à 19) du sprite TAX ; Transfert de A dans X LDA Colorp+1,X ; Charge la couleur de la ligne de sprite STA COLUP1 ; Attribue la couleur à la ligne du sprite LDA Playerp,X ; Charge la forme du player STA GRP1 ; Attribue la forme au player Passprite1 DEY ; Décrémente Y - REMARQUE : pas de CPY ! BNE Affiche1 ; Si différent, boucle l'affichage JMP Suite ; passe à la suite Passprite ; N'affiche pas le sprite0 STA WSYNC ; Attend la fin du balayage précédent LDA #0 ; efface... STA GRP0 ; ...le graphisme du player JMP Decor ; Saute à l'affichage du décor Suite STA WSYNC ; Après l'affichage LDA #0 ; efface... STA GRP0 ; le player du personnage, STA GRP1 ; la pastille, STA PF1 ; et le graphisme STA PF2 ; du playfield Joystick LDA CXP0FB ; Collision Player0 avec playfield et balle AND #128 ; Filtre pour collision playfield seulement BEQ Bouge ; Si on ne touche pas de mur, on saute à... LDA Joy ; Sinon, l'ancien mouvement de joystick TAX ; est transferé dans X LDA Inverse,X ; Pour obtenir le mouvement opposé STA Joy ; que l'on attribue à Joy JMP Testjoy ; Bouge ; observe le joystick en vue des déplacements LDA SWCHA ; Registre de detection du joystick LSR ; Ramène les 4 bits de poids fort LSR ; à la position des bits de poids faibles LSR ; LSR ; AND #1+2+4+8 ; Filtre les 4 bits de poids faibles STA Joy ; Sauvegarde l'ancien mouvement Testjoy LDA Joy ; Récupère le mouvement à jouer AND #8 ; filtre le bit correspondant à droite BEQ Droite ; si égal à 0 saute à l'étiquette droite LDA Joy ; Sinon récupère le mouvement à jouer AND #4 ; filtre le bit correspondant à gauche BEQ Gauche ; si égal à 0 saute à l'étiquette gauche JMP Pasbouger ; Sinon, on saute à Pasbouger Droite LDA #240 ; Pour déplacer le Player0 STA HMP0 ; vers la droite LDA #0 ; La Player0 ne subit pas STA REFP0 ; de réflexion JMP Apresbouger ; Saute sans condition Gauche LDA #16 ; Pour déplacer le Player0 STA HMP0 ; vers la droite LDA #8 ; La Player0 subit STA REFP0 ; la réflexion JMP Apresbouger ; Saute sans condition Pasbouger LDA #0 ; Pour ne pas déplacer STA HMP0 ; le Player0 Apresbouger LDA Direction ; Seul l'octet 1 de la direction AND #1 ; nous intéresse TAX ; pour LDA Mouvement,X ; obtenir le mouvement (16 ou 240) STA HMP1 ; STA WSYNC ; Attend de la ligne précédente STA HMOVE ; Pour opérer le déplacement relatif ; en fonction de la valeur mise dans HMP0 LDA Joy AND #2 ; Filtre le bit 5 de valeur 32 BEQ Haut ; si égal à 0 saute à l'étiquette Haut LDA Joy ; Registre de detection du joystick AND #1 ; Filtre le bit 4 de valeur 16 BEQ Bas ; si égal à 0 saute à l'étiquette Bas JMP Pasbouger2 ; Saute sans condition Bas INC Starty ; Incrémente Starty... INC Endy ; ...et Endy JMP Pasbouger2 ; Saute sans condition Haut DEC Starty ; Décrémente Starty... DEC Endy ; ...et Endy Pasbouger2 LDA Joy AND #15 ; Si les 4 bits de joystick CMP #15 ; sont différent de 1 (16+32+64+128 = 240) BNE Anime ; alors saute à anime LDA #8 ; Sinon initialise l'image du player à 8 STA Compteur ; Celle où il semble statique Anime ; On déplace la pilule en Y INC Compteur1 ; Incrémente le compteur général LDA Compteur1 ; S'il est impair AND #1 ; BEQ Nomove1 ; on ne bouge pas la pilule en Y LDA Endy1 ; sinon on la bouge : on compare sa position CMP Endy ; avec celle du joueur BEQ Nomove1 ; si elle est égale, alors pas de mouvement Y BCC Descend ; si elle est plus petite, on la descend Monte DEC Endy1 ; sinon on la monte en incrémentant DEC Starty1 ; sa position start et end JMP Nomove1 ; Descend INC Endy1 ; on descend la pilule een décrémentant INC Starty1 ; ses positions start et end Nomove1 ; On déplace la pilule en X LDA Duree ; Tant que la duree n'est pas atteinte BNE Nomove2 ; il n'y a pas de changement de mouvement X INC Direction ; sinon, change de direction (gauche/droite) LDA Compteur1 ; On créé un nombre pseudo aléatoire CLC ; en additionnant quelques variables ADC Joy ; qui changent souvent pour déterminer STA Duree ; la nouvelle duree du mouvement X Nomove2 DEC Duree ; A chaque balayage, la durée est décrémentée LDA CXPPMM ; et on teste s'il y a eut collison AND #128 ; entre les deux players (joueur et pilule) BEQ Pasmort ; Dans la négative, on survit... Mort ; LDA #0 ; Sinon, on coupe le son STA AUDV0 ; JMP Mort ; et on gel l'écran Pasmort ; Lorsque l'on survit... LDA Compteur1 ; Si le compteur général n'atteint pas 0 BNE Passcore ; on ne chanbge rien au score DEC Score ; sinon on le décrémente LDA #6 ; et on met à jour STA AUDC0 ; les registres LDA #4 ; musicaux STA AUDV0 ; LDA Score ; dont score sert STA AUDF0 ; pour la note LDA Score ; Si score n'atteint pas 0 BNE Passcore ; on ne gagne pas encore Gagne ; Sinon on gagne ! LDA #0 ; on coupe le son STA AUDV0 ; et on efface la pilule STA Starty1 ; on peut alors se promener dans le décor STA Endy1 ; sans pilule : On a gagné. Passcore ; ************ APRES L'AFFICHAGE ************** LDY #34 ; On compte les 36 lignes d'overscan Boucle4 ; Etiquette STA WSYNC ; Attend la fin de la ligne DEY ; Décrémente Y BNE Boucle4 ; On branche à Boucle4 JMP MainLoop ; Saute à Mainloop org $FFFC ; Ces trois lignes servent à .word Start ; déclarer à la VCS à quelle adresse .word Start ; commence le programme.