; ******** VINGT TROISIEME COURS : LES PUCES N°35 ******** ; ; ************** PLAYER ANIME DANS UN DECOR ************ ; ; ******** Copyright Igor Barzilai - Juin 2001 *********** include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Etat = 128 Compteur = 129 Starty = 130 Endy = 131 Joy = 132 ; ************ 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. %10000111 BYTE. %10000000 BYTE. %10000000 BYTE. %10000000 BYTE. %11111111 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 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 ; ************** 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 STA Starty LDA #30 STA Endy 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 #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 ; Affichage des 10 lignes du perso 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 ; 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 dde 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 avec X comme index STA GRP0 ; Attribue la forme au player Decor ; Affiche le décor TYA ; Transfert Y dans A LSR ; pour le diviser par 8 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 DEY ; Décrémente Y - REMARQUE : pas de CPY ! BNE Affiche1 ; Si différent, boucle l'affichage JMP Suite ; Après l'affichage dde l'écran, passe à la suite Passprite ; N'affiche pas le sprite 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 PF1 ; et le graphisme STA PF2 ; du playfield Joystick LDA CXP0FB ; Registre de collision du Player 0 avec le playfield et la balle AND #128 ; Filtre pour analyser la collision avec le playfield seulement BEQ Bouge ; Si on ne touche pas de mur, on saute au test du joystick LDA Joy ; Sinon, on récupère l'ancien mouvement de joystick TAX ; que l'on transfert 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 STA WSYNC ; Attend la fin du balayage 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 ; ************ 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.