; ******** DIX HUITIEMECOURS : LES PUCES N°30 ******** ; ; ***************** SCROLLING VERTICAL ************** ; ; ***** Copyright Igor Barzilai - Octobre 2000 ******** include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Scrol1 = 128 ; 10 octets pour PF1 Scrol2 = 138 ; 10 octets pour PF0 et PF2 Compteur = 148 ; Compteur de ralentissement Starty = 149 ; Première position y du vaisseau Endy = 150 ; Dernière position y du vaisseau Projectilex = 151 ; Position X du projectile Projectiley = 152 ; Position Y du projectile Vitesse = 153 ; Vitesse du vaisseau ; ************ LIGNES DE BYTE ************* Table2 ; motif BYTE. $00,$44,$66,$66,$77,$77,$77,$FF,$FF,$FF Table1 ; le même motif inversé (gauche-droite) BYTE. $00,$22,$66,$66,$EE,$EE,$EE,$FF,$FF,$FF Vaisseau BYTE. $03,$07,$0F,$7e,$fc,$9c,$5c,$3c,$0c,$04,$04,$00 ; ************** 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 ; Initialisation des variables RAM LDX #0 ; Initialise X Boucleinit ; Etiquette pour boucler LDA Table1,X ; Charge Table1+X STA Scrol1,X ; Dans Scrol1+X LDA Table2,X ; Charge Table2+X STA Scrol2,X ; Dans Scrol2+X INX ; Incrémente X CPX #10 ; Cmpare X à 10 BNE Boucleinit ; Si différent, alors saute à Boucleinit STA WSYNC ; Attend le balayage écran LDA #140 ; Met 140 STA Starty ; dans Starty LDA #128 ; Met 128 STA Endy ; Dans Endy LDA #160 ; Met 160 STA Projectiley ; Dans projectiley STA RESP1 ; Initialise la position du player 1 LDA #56 ; Met 56 STA COLUP1 ; dans COLUP1 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 ; ; **************** DEBUT D'AFFICHAGE ***************** LDA #0 ; Dispose le playfield STA CTRLPF ; en mode couleur des sprites et répétition LDA #140 ; Met 140 (bleu) STA COLUPF ; Dans COLUPF (Couleur du Playfield) LDA #14 ; Met 14 (blanc) STA COLUP0 ; dans COLUP0 (couleur du vaisseau) LDA #7 ; Met 7 (Taille de sprite grande) STA NUSIZ0 ; dans le registre de taille du player 0 NOP ; Intruction nulle servant NOP ; à attendre NOP ; pour initialiser NOP ; la position NOP ; du vaisseau spatial NOP ; à droite... NOP ; Ajoutez des nop pour NOP ; décaler vers la droite STA RESP0 ; Initialise la position, du vaisseau STA CXCLR ; Initialise le registre de collision ; vaisseau (PL0) et du projectile (PL1) ; ** AFFICHAGE DE LA PREMIERE PARTIE : SCROLLING HAUT ** LDY #9 ; Y est le compteur de ligne Affiche1 ; Boucle d'affichage des 10 lignes TYA ; Transfert Y dans A LDA Scrol2,Y ; Charge Scrol2+X STA WSYNC ; Attend la fin de la ligne STA PF0 ; A dans PF0 STA PF2 ; A dans PF2 LDA Scrol1,Y ; Charge Scrol1+X STA PF1 ; A dans PF1 DEY ; Décrémente Y - REMARQUE : pas de CPY ! CPY #255 BNE Affiche1 ; Si différent, boucle l'affichage LDA #0 ; Met 0 STA WSYNC STA PF0 ; dans les trois STA PF1 ; registres STA PF2 ; du playfield ; ** AFFICHAGE DE LA DEUXIEME PARTIE : VAISSEAU ET PROJECTILE ** LDY #170 ; Charge 170 dans le compteur de ligne Affiche2 ; CPY Projectiley ; Compare Y à la position y du projectile BNE Pasprojectile ; Si différent, alors saute... LDA #255 ; sinon 255 = afffiche le projectile JMP Suite ; Saute à suite Pasprojectile ; LDA #0 ; 0 = n'affiche pas le projectile Suite ; STA GRP1 ; Dans le registre du projectile Affichevaiss ; LDA #0 ; Met 0 CPY Starty ; Compare Y à Starty BCS Dessus ; Si moins, saute au dessus CPY Endy ; Compare y à Endy BCC Dessous ; Si plus, saute au dessous TYA ; Sino transfert Y dans A SEC ; obligatoire avant un SBC SBC Endy ; Soustrait de Endy TAX ; Transfert A dans X LDA Vaisseau,X ; Charge le graphisme du vaisseau + X Dessus Dessous STA WSYNC ; Attend la fin du balayage STA GRP0 ; Met A dans le graphisme de playeer 0 (Vaisseau) DEY ; Décrémente Y BNE Affiche2 ; Si différent, boucle... ; ** AFFICHAGE DE LA TROISIEME PARTIE : SCROLLING BAS ** LDY #0 Affiche3 ; Boucle d'affichage des 10 lignes TYA ; Transfert Y dans A LDA Scrol2,Y ; Charge Scrol2+X STA WSYNC ; Attend la fin de la ligne STA PF0 ; A dans PF0 STA PF2 ; A dans PF2 LDA Scrol1,Y ; Charge Scrol1+X STA PF1 ; A dans PF1 INY ; Incrémente Y CPY #9 BNE Affiche3 ; Si différent, boucle l'affichage ; ************ APRES L'AFFICHAGE ************** ; **************** PROJECTILE ***************** LDA #255 ; Déplace de 1 pixel vers la droite STA HMP1 ; me player 1 (projectile) STA WSYNC ; obligatoire avant un STA HMOVE STA HMOVE ; Effectue le déplacement des sprites LDA CXPPMM ; Registre de collision AND #128 ; bit de collision Player0 - Player1 BEQ Pasdecollision ; Collision ; JMP Collision ; boucle ("plante!") sur collision Pasdecollision ; INC Projectilex ; LDA Projectilex ; CMP #159 ; BNE Pasdeborde ; LDA Starty ; SEC ; SBC #10 ; STA Projectiley ; LDA #0 ; STA Projectilex ; Pasdeborde INC Compteur ; Ce compteur sert à ralentir LDA Compteur ; la vitesse du scrolling CMP #4 ; Compare le Compteur à 4 BNE Passcrol ; Si différent, pas de scrolling ce tour LDA #0 ; Sinon, STA Compteur ; on initialise le compteur LDX #0 ; ansi que X... Scrol ; qui va servir de compteur à 10 LDA Scrol1,X ; Charge Scrol1+X AND #1 ; Filtre le premier bit (celui qui va disparaitre) CMP #0 ; On compare le résultat à 0 BNE Force1 ; si différent Force0 ; CLC ; Le bit de carrry est à 0 JMP Noforce ; Force1 ; SEC ; Le bit de carrry est à 1 Noforce ; LDA Scrol1,X ; Charge Scrol1+X dans A ROR ; Rotation à droite STA Scrol1,X ; Sauve A dans Scrol&+X LDA Scrol2,X ; Charge Scrol2+X dans A AND #128 ; On filtre le bit gauche CMP #0 ; Compare à 0 BNE Force1b ; Force0b ; CLC ; Le bit de carry est à 0 JMP Noforceb ; Force1b ; SEC ; Le bit de carry est à 1 Noforceb ; LDA Scrol2,X ; Charge Scrol2+X dans A ROL ; Rotation à gauche STA Scrol2,X ; Sauve A dans Scrol2+X INX ; Incrément X CPX #11 ; Compare X à 11 BNE Scrol ; Si différent, saute à Scrol Passcrol ; ********** JOYSTICK ********* Joy_bas LDA SWCHA ; on met le contenu de SWCHA dans l'accu AND #32 ; on filtre le bit 5 dont la valeur attribuée est 32 CMP #0 ; on compare ce résultat avec 0 (0=oui on va à droite) BNE Joy_haut ; S'il n'est pas égal à 0, alors va au test suivant : haut DEC Starty ; Décrémente Starty... DEC Starty ; deux fois... DEC Endy ; Décrément Endy... DEC Endy ; deux fois... Joy_haut LDA SWCHA ; on met le contenu de SWCHA dans l'accu AND #16 ; on filtre le bit 4 dont la valeur attribuée est 16 CMP #0 ; on compare ce résultat avec 0 (0=oui on va à droite) BNE Finjoy ; S'il n'est pas égal à 0, alors va au test suivant : gauche INC Starty ; Incrémente Starty... INC Starty ; deux fois... INC Endy ; Incrémente Endy.... INC Endy ; deux fois... Finjoy 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.