; ********* DOUZIEME COURS : LES PUCES N°24 *************** ; ; ***************** CAVERNS OF MARS ********************** ; ; ****** Copyright Igor Barzilai - Février 2000 *********** include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Poidsfort = 128 ; L'utilisation de Poidsfort et de Poidsfaible = 129 ; Poidsfaible et de Tmp Tmp = 130 ; est expliqué dans puces n°19 Level = 131 ; Level détermine le niveau de difficulté ; et aura pour conséquence la vitesse du ; Scrolling, la couleur du playfield, ; et le sons d'ambiance. Etat = 132 ; Etat détermine la phase du jeu ; 0 = on joue ; 14 = collision ; autre = explosion ; ************ LIGNES DE BYTE ************* GPF1 BYTE. 0,0,0,0,0,128,192,224,240,248,252,254,255,255,3,3 BYTE. 3,3,255,255,254,252,248,240,224,192,128,0,0,0,0,0 BYTE. 128,192,128,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128 BYTE. 192,192,224,240,224,192,192,128,128,0,0,0,0,0 GPF2 BYTE. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE. 0,0,0,0,0,0,0,0,0,0,0,0,240,224,192,128 BYTE. 0,0,0,0,0,0,31,14,4,0,0,0,0,0,0,0 BYTE. 0,0,0,0,0,0,0,0,0,128,192,224,192,224,192,128 Couleurs ; Ce sont les couleurs du playfield des 8 niveaux BYTE. 136,226,58,4,254,156,10,0 Vitesses ; Ce sont les vitesses des 8 niveaux BYTE. 1,2,2,4,4,4,8,8 ; ************** ZONE D'INITIALIZATION *************** Start SEI ; Ne modifiez rien à ces CLD ; lignes car elles LDX #255 ; initialisent le système TXS ; Transfer X dans S LDA #0 ; Charge 0 dans A B1 STA 0,X ; Effacement de la RAM DEX ; en utilisant X comme compteur BNE B1 ; Boucle Initialisation ; Initialisation du jeu LDA #0 ; Charge 0 dans A STA WSYNC ; Attend la fin du balayage écran LDX #5 ; Cette boucle Init ; permet d'initialiser STA 127,X ; toutes les adresses mémoire de 128 à DEX ; 128+5 correspondant à Poidsfort,Tmp BNE Init ; Poidsfaible, Level et Etat STA RESP0 ; Positionne le player0 au centre STA CXCLR ; Initialise les collisions 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 ; LDX #53 ; STX TIM64T ; LDA #0 ; STA WSYNC ; STA VSYNC ; DrawScreen ; LDA INTIM ; BNE DrawScreen ; STA WSYNC ; STA VBLANK ; LDA #1 ; Dispose le playfield STA CTRLPF ; en mode symétrique ; **************** DEBUT D'AFFICHAGE ***************** LDA #0 ; Charge 0 dans A STA GRP0 ; Pour effacer le player0 LDA #58 ; Charge 58 dans A STA COLUP0 ; Pour la couleur du player0 LDX Level ; Charge Level dans X LDA Couleurs,X ; Charge le contenu de Couleur+X dans A STA COLUPF ; met A dans la couleur du playfield LDA #255 ; Charge 255 dans A STA PF0 ; Met A dans le registre de graphisme ; ddes bords du playfield LDX Poidsfort ; X = Poidsfort LDA Poidsfaible ; A = Poidsfaible STA Tmp ; Tmp = A (donc Tmp = Poidsfaible) LDY #0 ; Initialise Y pour le compteur de ligne Boucleaffiche ; Boucle d'affichage des 192 lignes ; Le "vaisseau" doit être affiché ; entre les ligne 96 et 110 - donc : CPY #96 ; Compare Y à 96 BMI Jojo ; Si plus petit alors va à Jojo CPY #110 ; Compare Y à 110 BPL Jojo ; Si plus grand alors va à Jojo LDA #255 ; Sinon met prépare 255 pour le player0 JMP Jojo2 ; et va à Jojo2 Jojo ; On n'est pas à une ligne du "vaisseau" LDA #0 ; On prépare 0 pour le player 0 Jojo2 STA WSYNC ; Attend la fin de la ligne avant de.. STA GRP0 ; ...changer les graphismes du Player0 LDA GPF1,X ; A = le contenu de l'adresse GPF1 + X STA PF1 ; Change les graphismes de PF1 LDA GPF2,X ; A = le contenu de l'adresse GPF2 + X STA PF2 ; Change les graphismes de PF2 INC Tmp ; Incrémente le compteur-à-huit LDA Tmp ; Charge le contenu de Tmp dans A CMP #8 ; Le compare à 8 BNE Pasfinbloc ; Si différent de 8, va à Pasfinbloc LDA #0 ; Sinon STA Tmp ; initialise Tmp INX ; et incrémente X CPX #64 ; Compare X à 64 BNE Pasfinbloc ; Si différent, branche à Pasfinbloc LDX #0 ; sinon, X = 0 Pasfinbloc Suite INY ; Incrémente Y CPY #192 ; Tant qu'on a pas affiché 192 lignes.. BNE Boucleaffiche ; ... on affiche ! ; *** FIN d'AFFICHAGE *** LDA #0 ; on met à 0 STA PF0 ; dans les trois registres de graphismes STA PF1 ; du Playfield : STA PF2 ; PF0, PF1 et PF2 ; *** INCREMENT DU SCROLLING *** LDX Level ; le Poidsfaible est incrémenté en LDA Poidsfaible ; fonction de Level. CLC ; On utilise également ADC Vitesses,X ; une table des vitesses (1 à 8) STA Poidsfaible ; pour déterminer la vitesse du scrolling CMP #8 ; Compare A à 8 BNE Pasincrement ; si différent de 8, va à Pasincrement LDA #0 ; sinon STA Poidsfaible ; on le réinitialise INC Poidsfort ; et on incrémente Poidsfort LDA Poidsfort ; Charge le contenu de poidsfort dans A CMP #64 ; Si Poidsfort est différent de 64 BNE Pasincrement ; on branche à Pasincrément LDA #0 ; sinon STA Poidsfort ; on le réinitialise INC Level ; ...et on passe au niveau suivant Pasincrement ; ********** FIN DE L'AFFICHAGE ET SONS **************** LDA Level ; Charge le contenu de Level dans A CLC ; Fonction obligatoire avant un ADC ADC #2 ; On ajoute 2 à A STA AUDV1 ; Met A dans le volume de la voix 1 LDA #2 ; Charge 2 dans A STA AUDC1 ; 2 dans le type de son = son moteur LDA #8 ; Met 8 dans A SEC ; Obligatoire avant un SBC SBC Level ; Soustrait le contenu de Level à A STA AUDF1 ; Met A dans la fréquence de voix 1 ; ************** ZONE DE TEST DE COLLISION *********** LDA Etat ; Charge le contenu de Etat dans A STA COLUBK ; met A comme couleur de fond STA AUDV0 ; met A comme volume de voix 0 STA AUDC0 ; met A comme channel de voix 0 STA AUDF0 ; met A comme fréquence de voix 0 CMP #0 ; Compare A à 0 BEQ Testcollision ; Si égal, va à Testcollision DEC Etat ; Sinon décrémente Etat LDA Etat ; Charge Etat dans A CMP #0 ; Compare à 0 BNE Joystick ; Si différent, va à joystick JMP Initialisation ; Saute à Initialisation Testcollision LDA CXP0FB ; Collision playfield-player0 CMP #128 ; Si différent de 128 BNE Joystick ; Il n'y a pas collision Collision LDA #14 ; On met Etat STA Etat ; à 14 Joystick ; *** ZONE DE ROUTINE DE DEPLACEMENT ******** STA WSYNC LDA #0 ; Met 0 dans l'accu STA HMP0 ; pour annuler le déplacement du player Joy_droite LDA SWCHA ; on met le contenu de SWCHA dans l'accu AND #128 ; on filtre le bit 7 CMP #0 ; on compare ce résultat avec 0 (0=droite) BNE Joy_gauche ; S'il n'est pas égal à 0, alors va gauche LDA #255 ; Valeur pour aller à droite STA HMP0 ; dans registre de déplacement du player Joy_gauche LDA SWCHA ; on met le contenu de SWCHA dans l'accu AND #64 ; on filtre le bit 6 CMP #0 ; on compare ce résultat avec 0 (0=gauche) BNE Fin_affiche ; S'il n'est pas égal à 0 LDA #16 ; Valeur pour aller à gauche STA HMP0 ; dans registre de déplacement du player Fin_affiche STA HMOVE ; Le simple fait d'écrire dans HMOVE ; effectue le déplacement à gauche ; ou à droite en fonction de la valeur ; mise dans HMP0 LDX #34 ; On compte les 36 lignes d'overscan Boucle4 ; Etiquette STA WSYNC ; Attend la fin de la ligne DEX ; Décrémente X CPX #0 ; Si X est différent à 0 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.