; ********* QUINZIEME COURS : LES PUCES N°27 ********* ; ; ********** JOYSTICK VITESSE PROGRESSIVE ************ ; ; ******** Copyright Igor Barzilai - Juin 2000 ******* include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Pospl0 = 128 ; variable position player 0 Speed = 129 ; variable pour la vitesse ; de déplacement du player 0 Velocite ; Valeurs de déplacements du player 0 pour HMP0 .BYTE 112,96,80,64,48,32,16,0 .BYTE 240,224,208,192,176,160,144 Corresp ; Valeurs correspondantes en pixel .BYTE 249,250,251,252,253,254,255,0 .BYTE 1,2,3,4,5,6,7 Vaisseau ; forme du sprite BYTE. 8,8,28,93,93,127,127,127,73,0 ; ************** ZONE D'INITIALIZATION *************** Start SEI ; Ne modifiez rien à ces CLD ; lignes car elles LDX #255 ; initialisent le système TXS ; Transfert de 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 ; Initialise la position des sprites STA WSYNC ; Attend la fin du balayage STA RESP0 ; Initialise le player 0 LDA #0 ; initialise la variable de position STA Pospl0 ; du player 0, soit : tout à gauche LDA #7 ; initialise la vitesse à 7 (point mort) STA Speed ; correspondant au point mort 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 ; ; *********** ZONE DE ROUTINE DE DEPLACEMENT ************** ; **** ICI, ON NE MODIFIE QUE LA VITESSE DE DEPLACEMENT *** ; ********* LE DEPLACEMENT REEL A LIEU PLUS BAS *********** LDA SWCHA ; Regarde le joystick AND #192 ; Filtre la droite et la gauche 64+128 CMP #192 ; Regarde si l'un des deux est actionné BNE Joy_droite ; si oui, branche... LDA Speed ; sinon, regarde la vitesse CMP #7 ; la compare à 7 (point mort) BEQ Joy_droite ; Si point mort, alors branche... BCC Droite ; Si moins de 7 alors va à droite JMP Gauche ; Sinon va à gauche. Joy_droite LDA SWCHA ; on met le contenu de SWCHA dans l'accu AND #128 ; on filtre le bit 7 dont la valeur attribuée est 128 CMP #0 ; on compare ce résultat avec 0 (0=oui on va à droite) BNE Joy_gauche ; S'il n'est pas égal à 0, alors va au test suivant : gauche Droite INC Speed ; Incrémente la vitesse LDA Speed ; on vérifie que la vitesse CMP #15 ; n'atteint pas 15 BNE Joy_gauche ; LDA #14 ; sinon, on le met à 14, STA Speed ; correspondant à la vitessse maximum à droite Joy_gauche LDA SWCHA ; on met le contenu de SWCHA dans l'accu AND #64 ; on filtre le bit 6 dont la valeur attribuée est 64 CMP #0 ; on compare ce résultat avec 0 (0=oui on va à droite) BNE Pas_joy ; S'il n'est pas égal à 0, alors va au test suivant : bas Gauche DEC Speed ; Décrémente la vitesse LDA Speed ; on vérifie que la vitesse CMP #255 ; n'est pas inférieur à 0 (0 - 1 = 255) BNE Pas_joy LDA #0 ; sinon, on le met à 0, STA Speed ; correspondant à la vitessse minimum à gauche Pas_joy DrawScreen ; Ne changez rien LDA INTIM ; à ces lignes, BNE DrawScreen ; elles initialisent STA WSYNC ; l'affichage vidéo STA VBLANK ; ; **************** DEBUT D'AFFICHAGE ***************** STA WSYNC ; La première ligne n'affiche rien LDA #14 ; On met du blanc (14) STA COLUP0 ; pour le player0 ; Zone de 180 lignes vides LDY #0 ; Y est le compteur de ligne Boucle ; Boucle d'affichage des 180 lignes STA WSYNC ; On affiche rien durant ces lignes INY ; Incrémente Y CPY #180 ; Compare Y à 180 BNE Boucle ; Si différent, boucle l'affichage ; Affiche le vaisseau tout en bas de l'écran LDY #0 ; Y est le compteur de ligne Boucleaffiche ; Boucle d'affichage des 190 lignes LDA Vaisseau,Y ; Pointe sur le graphisme du vaisseau STA WSYNC ; Attend la fin du balayage STA GRP0 ; Met le graphisme dans le player0 INY ; Incrémente Y CPY #10 ; Compare Y à 10 BNE Boucleaffiche ; Si différent, boucle l'affichage ; ******* MODIFICATION DES VARIABLES DE POSITION ********** LDX #7 ; X sert de réserve à 7 pour annuler ; éventuellement le déplacement du player LDA Pospl0 ; charge la variable du player 0 dans A LDY Speed ; Charge Speed dans Y CLC ; il faut toujours un CLC avant un ADC ADC Corresp,Y ; Additionne la valeur correspondante CMP #152 ; Compare à 152 BCS Paschange ; Si moins de 152 branche ... Fintest STA Pospl0 ; Met à jour la position JMP Deplspr ; Et va effectuer le déplacement du sprite Paschange ; la position du player reste inchangée STX Speed ; Met Vitesse à 7 (point mort) ; ********** DEPLACEMENT EFFECTIF DU SPRITE ************** Deplspr LDY Speed ; On récupère le déplacement suivant ... LDA Velocite,Y ; ... la table 'velocite'... STA HMP0 ; ... que l'on attribue au player 0 STA WSYNC ; attend la fin du balayage : 192ème ligne STA HMOVE ; effectue le déplacements des sprites ; ************ APRES L'AFFICHAGE ************** 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.