--------------------------------------------------------------------- ; *** SEPTIEME PROGRAMME : LE PLAYFIELD EN SCROLLING **** ; ; Voici le code source entier ; les point-virgules sont pour les commentaires ; qui ne sont pas pris en compte par l'assembleur. ; N'utilisez jamais de tabulation pour créer ; des espaces car l'assembleur les refuse. include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Scroll = 128 ; ; ************ LIGNES DE BYTE ************* GPF0 BYTE. 16,48,112,112,240,240,112,112,48,16 ; ************** FIN DE ZONE DE BYTE ***************** ; ************** ZONE D'INITIALIZATION *************** Start SEI ; Ne modifiez rien à ces CLD ; lignes car elles LDX #255 ; initialisent le système TXS ; LDA #0 ; B1 STA 0,X ; effacement de la RAM DEX ; BNE B1 ; Initialisation ; MainLoop ; 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 ; STA CXCLR ; LDA #1 ; STA CTRLPF ; DrawScreen ; LDA INTIM ; BNE DrawScreen STA WSYNC ; STA VBLANK ; ; **************** DEBUT D'AFFICHAGE ***************** LDA #136 ; On met du bleu STA COLUPF ; dans le playfield LDX Scroll ; X prend la valeur de scroll LDY #0 ; Y va servir de compteur de lignes Boucleaffiche ; début de la boucle d'affichage LDA GPF0,X ; A = le contenu de l'adresse GPF0+X STA PF0 ; Affiche le graphisme contenu dans A STA PF1 STA PF2 STA WSYNC ; Attend la fin de la ligne INX ; X servant de pointeur pour les graphismes, on l'incrémente à chaque ligne CPX #10 ; si X différent de 10 ... BNE Suite ; branche à Suite LDX #0 ; sinon X = 0. X est un compteur de 0 à 9 cyclé Suite INY ; Incrémente Y CPY #192 ; Tant que l'on a pas affiché les 192 lignes... BNE Boucleaffiche ; ...on boucle INC Scroll ; Sinon on incrémente Scroll une fois à chaque balayage LDA Scroll ; On le charge dans A CMP #10 ; Pour le comparer à 10 BNE Fin ; Tant qu'il est différent, Branche à fin LDA #0 ; sinon, STA Scroll ; le remettre à 0 Fin LDA #0 ; On met en noir STA COLUPF ; La couleur du playfield ; **************** FIN DE 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 difffé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. --------------------------------------------------------------------- ; *** SEPTIEME PROGRAMME : LE PLAYFIELD EN SCROLLING **** ; ; Voici le code source entier ; les point-virgules sont pour les commentaires ; qui ne sont pas pris en compte par l'assembleur. ; N'utilisez jamais de tabulation pour créer ; des espaces car l'assembleur les refuse. include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Scroll = 128 ; Compteur = 129 ; ************ LIGNES DE BYTE ************* GPF0 BYTE. 16,48,112,112,240,240,112,112,48,16 ; ************** FIN DE ZONE DE BYTE ***************** ; ************** ZONE D'INITIALIZATION *************** Start SEI ; Ne modifiez rien à ces CLD ; lignes car elles LDX #255 ; initialisent le système TXS ; LDA #0 ; B1 STA 0,X ; effacement de la RAM DEX ; BNE B1 ; Initialisation ; MainLoop ; 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 ; STA CXCLR ; LDA #1 ; STA CTRLPF ; DrawScreen ; LDA INTIM ; BNE DrawScreen STA WSYNC ; STA VBLANK ; ; **************** DEBUT D'AFFICHAGE ***************** LDA #136 ; On met du bleu STA COLUPF ; dans le playfield LDX Scroll ; X prend la valeur de scroll LDY #0 ; Y va servir de compteur de lignes Boucleaffiche ; début de la boucle d'affichage LDA GPF0,X ; A = le contenu de l'adresse GPF0+X STA PF0 ; Affiche le graphisme contenu dans A STA PF1 STA PF2 STA WSYNC ; Attend la fin de la ligne INC Compteur ; Incrémente le compteur LDA Compteur ; Charge le compteur dans A CMP #8 ; Compare à 8 BNE PasincrementX ; Si différent de 8, branche à PasincrementX LDA #0 ; sinon, met 0 ... STA Compteur ; ... dans le compteur INX ; Incrément X CPX #10 ; compare X à 10 BNE Suite ; si différent, branche à Suite LDX #0 ; sinon initialise X Suite PasincrementX INY ; Incrémente Y CPY #192 ; Tant que l'on a pas affiché les 192 lignes... BNE Boucleaffiche ; ...on boucle INC Scroll ; Sinon on incrémente Scroll une fois à chaque balayage LDA Scroll ; On le charge dans A CMP #10 ; Pour le comparer à 10 BNE Fin ; Tant qu'il est différent, Branche à fin LDA #0 ; sinon, STA Scroll ; le remettre à 0 Fin LDA #0 ; On met en noir STA COLUPF ; La couleur du playfield ; **************** FIN DE 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 difffé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. --------------------------------------------------------------------- ; *** SEPTIEME PROGRAMME : LE PLAYFIELD EN SCROLLING **** ; ; Voici le code source entier ; les point-virgules sont pour les commentaires ; qui ne sont pas pris en compte par l'assembleur. ; N'utilisez jamais de tabulation pour créer ; des espaces car l'assembleur les refuse. include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Poidsfort = 128 ; Poidsfaible = 129 ; Tmp = 130 ; ; ************ LIGNES DE BYTE ************* GPF0 BYTE. 16,16,48,112,240,240,240,240,240,240,240,240,240,240,240,240 BYTE. 240,240,240,240,240,240,240,240,240,240,240,240,112,48,16,16 BYTE. 240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240 BYTE. 0,0,0,0,112,$50,$70,$10,$10,$00,$70,$20,$20,$20,$70,0 GPF1 BYTE. 0,0,0,0,0,128,192,224,240,248,252,254,255,255,255,255 BYTE. 255,255,255,255,254,252,248,240,224,192,128,0,0,0,0,0 BYTE. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE. 0,0,0,0,174,$A8,$A8,$A8,$EE,$00,$8B,$CA,$AB,$9A,$8A,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,0,0,0,0 BYTE. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE. 0,0,0,0,119,$11,$73,$41,$77,$00,$9D,$94,$54,$14,$1C,0 ; ************** FIN DE ZONE DE BYTE ***************** ; ************** ZONE D'INITIALIZATION *************** Start SEI ; Ne modifiez rien à ces CLD ; lignes car elles LDX #255 ; initialisent le système TXS ; LDA #0 ; B1 STA 0,X ; effacement de la RAM DEX ; BNE B1 ; Initialisation ; MainLoop ; 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 ; STA CXCLR ; LDA #1 ; STA CTRLPF ; DrawScreen ; LDA INTIM ; BNE DrawScreen STA WSYNC ; STA VBLANK ; ; **************** DEBUT D'AFFICHAGE ***************** LDA #136 ; On met du bleu STA COLUPF ; dans le 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 LDA GPF0,X ; A = le contenu de l'adresse GPF0 + X STA WSYNC ; Attend la fin de la ligne avant de changer les graphismes STA PF0 ; Change les graphismes de PF0 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ément le compteur-à-huit LDA Tmp ; CMP #8 ; Le compare à 8 BNE Pasfinbloc ; Si différent de 8, branche à Pasfinbloc LDA #0 ; Sinon STA Tmp ; initialise Tmp INX ; et incrémente X CPX #64 ; Compare X à 64 BNE Pasfinbloc ; Si différent, brancha à Pasfinbloc LDX #0 ; sinon, X = 0 Pasfinbloc Suite INY ; Incrémente Y CPY #192 ; Tant que l'on a pass afffiché les 192 lignes... BNE Boucleaffiche ; ... on affiche ! LDA #0 ; Fin de l'affichage, on met à 0 STA PF0 ; les trois registres de graphismes du Playfield STA PF1 STA PF2 INC Poidsfaible ; Incrémente Poidsfaible LDA Poidsfaible ; CMP #8 ; BNE Pasincrement ; s'il est différent de 8 alors branche à Pasincrément LDA #0 ; sinon STA Poidsfaible ; on le réinitialise INC Poidsfort ; et on incrémente Poidsfort LDA Poidsfort ; CMP #64 ; Si Poids fort est différent de 64 BNE Pasincrement ; on branche à Pasincrément LDA #0 ; sinon STA Poidsfort ; on le réinitialise Pasincrement ; **************** FIN DE 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 difffé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. --------------------------------------------------------------------- ; PREMIER PROGRAMME ; ; Voici le code source entier, ; ne tenez compte que des lignes comprises entre DRAWSCREEN et FIN DE l'AFFICHAGE ; (nous verrons plus tard ce qu'il se passe avant et après) ; ; les point-virgules servent à mettre des commentaires ; et ne sont absolument pas pris en compte par l'assembleur ; vous pouvez donc après vos lignes de code ajouter autant de commentaires ; que vous le souhaitez pour une meilleur compréhension include vcs2600.h org $F000 Start SEI CLD LDX #$FF TXS LDA #0 B1 STA 0,X DEX BNE B1 MainLoop LDA #2 STA WSYNC STA WSYNC STA WSYNC STA VSYNC STA WSYNC STA WSYNC LDX #53 STX TIM64T LDA #0 STA WSYNC STA VSYNC LDA #0 STA CXCLR LDA #1 STA CTRLPF DrawScreen ; ****************** DRAWSCREEN **************** LDA INTIM BNE DrawScreen STA WSYNC STA VBLANK LDA #0 STA PF0 STA PF1 STA PF2 STA WSYNC ; Première ligne LDA #12 ; Couleurs STA COLUPF LDA #112 STA PF0 LDA #174 STA PF1 LDA #119 STA PF2 STA WSYNC STA WSYNC ; Deuxième ligne LDA #$50 STA PF0 LDA #$A8 STA PF1 LDA #$11 STA PF2 STA WSYNC STA WSYNC ; Troisième ligne LDA #$70 STA PF0 LDA #$A8 STA PF1 LDA #$73 STA PF2 STA WSYNC STA WSYNC ; Quatrième ligne LDA #$10 STA PF0 LDA #$A8 STA PF1 LDA #$41 STA PF2 STA WSYNC STA WSYNC ; Cinquième ligne LDA #$10 STA PF0 LDA #$EE STA PF1 LDA #$77 STA PF2 STA WSYNC STA WSYNC ; Sixième ligne : rien LDA #0 STA PF0 STA PF1 STA PF2 STA WSYNC STA WSYNC ; Septième ligne LDA #$70 STA PF0 LDA #$8B STA PF1 LDA #$9D STA PF2 STA WSYNC STA WSYNC ; Septième ligne LDA #$20 STA PF0 LDA #$CA STA PF1 LDA #$94 STA PF2 STA WSYNC STA WSYNC ; Septième ligne LDA #$20 STA PF0 LDA #$AB STA PF1 LDA #$54 STA PF2 STA WSYNC STA WSYNC ; Septième ligne LDA #$20 STA PF0 LDA #$9A STA PF1 LDA #$14 STA PF2 STA WSYNC STA WSYNC ; Septième ligne LDA #$70 STA PF0 LDA #$8A STA PF1 LDA #$1C STA PF2 STA WSYNC STA WSYNC ; Sixième ligne : rien LDA #0 STA PF0 STA PF1 STA PF2 LDY #200 NTSC2 DEY BNE NTSC2 LDX #36 NTSC3 ; ******************* FIN DE L'AFFICHAGE ****************** STA WSYNC DEX BNE NTSC3 JMP MainLoop org $FFFC .word Start .word Start --------------------------------------------------------------------- ; PREMIER PROGRAMME ; ; Voici le code source entier, ; ne tenez compte que des lignes comprises entre DEBUT D'AFFICHAGE et FIN DE l'AFFICHAGE ; (nous verrons plus tard ce qu'il se passe avant et après) ; ; les point-virgules servent à mettre des commentaires ; et ne sont absolument pas pris en compte par l'assembleur ; vous pouvez donc après vos lignes de code ajouter autant de commentaires ; que vous le souhaitez pour une meilleur compréhension include vcs2600.h org $F000 ; ******************************* ZONE DE BYTE ************************************* ; **** ATTENTION DANGER : VOS LIGNES DE BYTE DOIVENT SE TROUVER DANS CETTE ZONE **** Dessin ; Cette ligne est une étiquette qui servira à identifier les octets de la série de BYTE BYTE. 60,126,126,255,153,153,189,165,255,255,171,129,215,126,126,60 ; Ci-dessus, série de 16 octets représentant le dessin de notre player ; *************************** FIN DE ZONE DE BYTE ********************************** Start SEI CLD LDX #$FF TXS LDA #0 B1 STA 0,X DEX BNE B1 MainLoop LDA #2 STA WSYNC STA WSYNC STA WSYNC STA VSYNC STA WSYNC STA WSYNC LDX #53 STX TIM64T LDA #0 STA WSYNC STA VSYNC STA CXCLR LDA #1 STA CTRLPF DrawScreen LDA INTIM BNE DrawScreen STA WSYNC STA VBLANK ; ***************** DEBUT D'AFFICHAGE *************** LDA #132 ; On charge la valeur 132 dans l'accu (132 correspond à un bleu) STA COLUP0 ; On place 132 dans le registre de couleur du player 0 LDX #0 ; On initialise X Boucle ; Cette ligne est une étiquette et servira plus loin à effectuer un saut ici LDA Dessin,X ; On charge dans A la valeur qui se trouve à Dessin+X STX COLUBK ; On va mettre la valeur de X dans le registre de couleur de fond d'écran... c'est plus joli STA GRP0 ; On change le contenu de PL0 avec le graphisme de la nouvelle ligne à dessiner STA WSYNC ; On attend la fin de l'affichage de la ligne INX ; On incrémente X CPX #16 ; On le compare à 16 BNE Boucle ; S'il n'est pas égal à 16, on saute à boucle LDA #0 ; On met 0 dans l'accu STA GRP0 ; pour effacer les lignes suivantes du player LDX #0 ; Initialise X Boucle2 ; Ceci est une étiquette et servira plus loin à effectuer un saut ici INX ; Incrémente X STA WSYNC ; Attend la fin de la ligne STX COLUBK ; Met la valeur de X dans le registre de couleur de fond d'écran... c'est plus joli CPX #212 ; Compare X à 212 BNE Boucle2 ; Si différent, on branche vers Boucle2 ; déplacements LDA #255 ; Charge 255 dans l'accu, Un 16 inverse le déplacement STA HMP0 ; pour le mettre dans le registre HMP0 STA HMOVE ; Le simple fait d'écrire dans HMOVE effectue le déplacement ; *********** FIN DE L'AFFICHAGE ************* LDA #0 STA COLUBK LDX #36 NTSC3 STA WSYNC DEX BNE NTSC3 JMP MainLoop org $FFFC .word Start .word Start --------------------------------------------------------------------- ; PREMIER PROGRAMME ; ; Voici le code source entier, ; ne tenez compte que des lignes comprises entre DEBUT D'AFFICHAGE et FIN DE l'AFFICHAGE ; (nous verrons plus tard ce qu'il se passe avant et après) ; ; les point-virgules servent à mettre des commentaires ; et ne sont absolument pas pris en compte par l'assembleur ; vous pouvez donc après vos lignes de code ajouter autant de commentaires ; que vous le souhaitez pour une meilleur compréhension ; N(*'utilisez pas de tabulation pour créer des espaces car l'assembleur les refuse include vcs2600.h org $F000 ; ******************************* ZONE DE BYTE ************************************* ; **** ATTENTION DANGER : VOS LIGNES DE BYTE DOIVENT SE TROUVER DANS CETTE ZONE **** Dessin ; Cette ligne est une étiquette qui servira à identifier les octets de la série de BYTE BYTE. 60,126,126,255,153,153,189,165,255,255,171,129,215,126,126,60 ; Ci-dessus, série de 16 octets représentant le dessin de notre player ; *************************** FIN DE ZONE DE BYTE ********************************** Start SEI CLD LDX #$FF TXS LDA #0 B1 STA 0,X DEX BNE B1 MainLoop LDA #2 STA WSYNC STA WSYNC STA WSYNC STA VSYNC STA WSYNC STA WSYNC LDX #53 STX TIM64T LDA #0 STA WSYNC STA VSYNC STA CXCLR LDA #1 STA CTRLPF DrawScreen LDA INTIM BNE DrawScreen STA WSYNC STA VBLANK ; ***************** DEBUT D'AFFICHAGE *************** LDA 128 ; On charge le contenu de l'adresse mémoire numéro 128 STA COLUP0 ; On place 132 dans le registre de couleur du player 0 LDX #0 ; On initialise X Boucle ; Cette ligne est une étiquette et servira plus loin à effectuer un saut ici LDA Dessin,X ; On charge dans A la valeur qui se trouve à Dessin+X STX COLUBK ; On va mettre la valeur de X dans le registre de couleur de fond d'écran... c'est plus joli STA GRP0 ; On change le contenu de PL0 avec le graphisme de la nouvelle ligne à dessiner STA WSYNC ; On attend la fin de l'affichage de la ligne INX ; On incrémente X CPX #16 ; On le compare à 16 BNE Boucle ; S'il n'est pas égal à 16, on saute à boucle LDA #0 ; On met 0 dans l'accu STA GRP0 ; pour effacer les lignes suivantes du player LDX #0 ; Initialise X Boucle2 ; Ceci est une étiquette et servira plus loin à effectuer un saut ici INX ; Incrémente X STA WSYNC ; Attend la fin de la ligne STX COLUBK ; Met la valeur de X dans le registre de couleur de fond d'écran... c'est plus joli CPX #212 ; Compare X à 212 BNE Boucle2 ; Si différent, on branche vers Boucle2 ; ******** ZONE DE ROUTINE DE DEPLACEMENT *********** 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 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 LDA #255 ; Valeur pour aller à droite STA HMP0 ; que l'on met dans le 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 dont la valeur attribuée est 64 CMP #0 ; on compare ce résultat avec 0 (0=oui on va à droite) BNE Joy_bas ; S'il n'est pas égal à 0, alors va au test suivant : bas LDA #16 ; Valeur pour aller à gauche STA HMP0 ; que l'on met dans le registre de déplacement du player 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 128 ; On décrémente le contenu de l'adresse mémoire 128 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 Fin_affiche; S'il n'est pas égal à 0, alors va au test suivant : gauche INC 128 ; On décrémente le contenu de l'adresse mémoire 128 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 ; *********** FIN DE L'AFFICHAGE ************* LDA #0 STA COLUBK LDX #36 NTSC3 STA WSYNC DEX BNE NTSC3 JMP MainLoop org $FFFC .word Start .word Start --------------------------------------------------------------------- ; QUATRIEME PROGRAMME : LE PLAYER MUSICAL ; Joystick à gauche et à droite pour faire varier la fréquence de la note ; Joystick en haut et en bas pour faire varier le type de son ; ; Voici le code source entier, ; ne tenez compte que des lignes comprises entre DEBUT D'AFFICHAGE et FIN DE l'AFFICHAGE ; (nous verrons plus tard ce qu'il se passe avant et après) ; ; les point-virgules servent à mettre des commentaires ; et ne sont absolument pas pris en compte par l'assembleur ; vous pouvez donc après vos lignes de code ajouter autant de commentaires ; que vous le souhaitez pour une meilleur compréhension ; N'utilisez pas de tabulation pour créer des espaces car l'assembleur les refuse include vcs2600.h org $F000 ; Nous déclarons nos adresses mémoires Couleur = 128 ; Couleur du player Type = 129 ; Type de son utilisé pour AUDC0 Note = 130 ; Note utilisée pour AUDF0 ; ******************************* ZONE DE BYTE ************************************* ; **** ATTENTION DANGER : VOS LIGNES DE BYTE DOIVENT SE TROUVER DANS CETTE ZONE **** Dessin ; Cette ligne est une étiquette qui servira à identifier les octets de la série de BYTE BYTE. 60,126,126,255,153,153,189,165,255,255,171,129,215,126,126,60 ; Ci-dessus, série de 16 octets représentant le dessin de notre player ; *************************** FIN DE ZONE DE BYTE ********************************** Start SEI CLD LDX #$FF TXS LDA #0 B1 STA 0,X DEX BNE B1 MainLoop LDA #2 STA WSYNC STA WSYNC STA WSYNC STA VSYNC STA WSYNC STA WSYNC LDX #53 STX TIM64T LDA #0 STA WSYNC STA VSYNC STA CXCLR LDA #1 STA CTRLPF DrawScreen LDA INTIM BNE DrawScreen STA WSYNC STA VBLANK ; ***************** DEBUT D'AFFICHAGE *************** LDA Couleur ; On charge dans l'accu le contenu de Couleur (128) STA COLUP0 ; On place 132 dans le registre de couleur du player 0 LDX #0 ; On initialise X Boucle ; Cette ligne est une étiquette et servira plus loin à effectuer un saut ici LDA Dessin,X ; On charge dans A la valeur qui se trouve à Dessin+X STX COLUBK ; On va mettre la valeur de X dans le registre de couleur de fond d'écran... c'est plus joli STA GRP0 ; On change le contenu de PL0 avec le graphisme de la nouvelle ligne à dessiner STA WSYNC ; On attend la fin de l'affichage de la ligne INX ; On incrémente X CPX #16 ; On le compare à 16 BNE Boucle ; S'il n'est pas égal à 16, on saute à boucle LDA #0 ; On met 0 dans l'accu STA GRP0 ; pour effacer les lignes suivantes du player LDX #0 ; Initialise X Boucle2 ; Ceci est une étiquette et servira plus loin à effectuer un saut ici INX ; Incrémente X STA WSYNC ; Attend la fin de la ligne STX COLUBK ; Met la valeur de X dans le registre de couleur de fond d'écran... c'est plus joli CPX #212 ; Compare X à 212 BNE Boucle2 ; Si différent, on branche vers Boucle2 ; ******** ZONE DE ROUTINE DE DEPLACEMENT *********** 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 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 LDA #255 ; Valeur pour aller à droite STA HMP0 ; que l'on met dans le registre de déplacement du player INC Note ; On incrémente la note 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 Joy_bas ; S'il n'est pas égal à 0, alors va au test suivant : bas LDA #16 ; Valeur pour aller à gauche STA HMP0 ; que l'on met dans le registre de déplacement du player DEC Note ; On décrémente la note 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 Couleur ; On décrémente la couleur (128) INC Type ; On incrément le type de son 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 Fin_affiche; S'il n'est pas égal à 0, alors va au test suivant : gauche INC 128 ; On décrémente la couleur (128) DEC Type ; on décrémente le type de son 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 ; *********** FIN DE L'AFFICHAGE ************* ; *********** ON JOUE LE SON ************* LDA #15 ; Volume à fond STA AUDV0 ; Dans le registre de volume LDA Type ; Type de son (varie en fonction du joystick haut-bas) STA AUDC0 ; Dans le registre de type de son LDA Note ; Note grave (31) à aigue (0) STA AUDF0 ; Dans le registre de fréquence LDA #0 STA COLUBK LDX #36 NTSC3 STA WSYNC DEX BNE NTSC3 JMP MainLoop org $FFFC .word Start .word Start --------------------------------------------------------------------- ; *** SIXIEME PROGRAMME : UN JEU TYPE SHOOT'EM UP **** ; ; Voici le code source entier ; les point-virgules sont pour les commentaires ; qui ne sont pas pris en compte par l'assembleur. ; N'utilisez jamais de tabulation pour créer ; des espaces car l'assembleur les refuse. include vcs2600.h org $F000 ; ************ DECLARATION DES ETIQUETTES ************ ; ***** DES ADRESSES MEMOIRE POUR LES VARIABLES ****** Dmissile = 128 ; Début du missile Fmissile = 129 ; Fin du missile Dbombe = 130 ; Début de la bombe Fbombe = 131 ; Fin de la bombe ; ************ LIGNES DE BYTE ************* Gvirus2 BYTE. 192,240,248,252,254,254,246 BYTE. 230,206,158,158,222,142,254,254,254 BYTE. 254,170,170,0,0,84,84,254 BYTE. 254,252,248,240,224,192,128,0 Cvirus BYTE. 132,134,132,134,134,134,136 BYTE. 134,136,136,136,138,136,138,138,54 BYTE. 14,14,14,14,14,14,14,14 BYTE. 54,136,134,136,134,134,134,0 Gcite BYTE. 38,38,38,38,38,182,182 BYTE. 182,182,255,255,0 Ccite BYTE. 30,28,30,28,26,24,26,24,22,20,18,0 BYTE. 0,0,0,0,0,0,0,0,0,0,0,0,0 Ship BYTE. 8,8,8,28,93,127,127,93,8,0,0,0 ; ************** FIN DE ZONE DE BYTE ***************** ; ************** ZONE D'INITIALIZATION *************** Start SEI ; Ne modifiez rien à ces CLD ; lignes car elles LDX #255 ; initialisent le système TXS ; LDA #0 ; B1 STA 0,X ; effacement de la RAM DEX ; BNE B1 ; Initialisation ; LDA #126 ; On charge 126 dans l'accu STA Dmissile ; Que l'on met dans Dmissile LDA #0 ; STA Dbombe ; LDA #10 ; STA Fbombe ; LDA #54 ; On charge 54 dans l'accu STA COLUP1 ; que l'on met dans COLUP1 MainLoop ; 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 ; STA CXCLR ; LDA #1 ; STA CTRLPF ; DrawScreen ; LDA INTIM ; BNE DrawScreen STA WSYNC ; STA VBLANK ; ; **************** DEBUT D'AFFICHAGE ***************** ; **************** AFFICHAGE DU VIRUS **************** LDX #0 ; On initialise X Boucle1 ; Etiquette LDA Cvirus,X ; met le contenu de Cvirus+X dans A STA COLUPF ; Met A en couleur de PLAYFIELD LDA Gvirus2,X; Met le contenu de Gvirus2+X dans A STA PF2 ; Met A en graphisme de PLAYFIELD STA WSYNC ; Attend fin de l'affichage ; de la ligne INX ; Incrémente X CPX #32 ; Compare X à 32 BNE Boucle1 ; S'il pas égal, saute à boucle1 ; ******* AFFICHAGE DU MISSILE ET DE LA BOMBE ******** LDA #14 ; Charge 14 dans A STA COLUP0 ; Met A comme couleur du player0 LDX #0 ; Initialise X Boucle2 ; Etiquette pour effectuer un saut STA WSYNC ; Attend la fin de la ligne ; ****** AFFICHAGE DU MISSILE CPX Dmissile ; Compare X à Dmissile BNE Pdm ; Si pas égal, saute à Pdm LDA #8 ; Met 8 dans A STA GRP0 ; Met A sans Graphismes du PLAYER0 JMP Pfm ; Saute à Pfm Pdm ; Etiquette pour Pas Début Missile CPX Fmissile ; Compare X à Fmissile BNE Pfm ; Si pas égal, saute à Pfm LDA #0 ; Charge 0 dans A STA GRP0 ; Met 0 dans Graphisme PLAYER0 Pfm ; Etiquette pour Pas Fin Missile ; ****** AFFICHAGE DE LA BOMBE CPX Dbombe ; Compare X à Dbombe BNE Pdb ; Si <> saute à Pdb (pas de bombe) LDA #255 ; Charge 255 dans l'accu STA GRP1 ; Que l'on met en graph du player1 JMP Pfb ; Saute à Pfb (pas fin bombe) Pdb ; étiquette (pas de bombe) CPX Fbombe ; Comare X à Fbombe BNE Pfb ; Si <> saute à Pfb (pas fin bombe) LDA #0 ; Charge 0 dans l'accu STA GRP1 ; Que l'on met en graph du player1 Pfb ; étiquette (pas fin bombe) INX ; Incrémente X de 1 (X=X+1) CPX #128 ; Compare X à 128 BNE Boucle2 ; Si différent, saute à Boucle2 ; **************** FIN DE LA BOUCLE 2 **************** ; ******* AFFICHAGE DU VAISSEAU ET DE LA CITE ******** LDA #134 ; Charge 134 dans l'accu STA COLUP0 ; pour la couleur du vaisseau LDX #0 ; Initialise X : compteur de lignes Boucle3 ; étiquette STA WSYNC ; Attend la fin du balayage ; de la ligne LDA Gcite,X ; Met le contenu de Gcite+X dans A STA PF0 ; Met A dans PF0 ; pour les STA PF1 ; Met A dans PF1 ; graphismes STA PF2 ; Met A dans PF2 ; de la cité LDA Ccite,X ; Met le contenu de Ccite+X dans A STA COLUPF ; A dans COLUPF pour coul de cité LDA Ship,X ; Met le contenu de Ship+X dans A STA GRP0 ; Pour graphisme du vaisseau INX ; Incrémente X (X=X+1) CPX #12 ; Compare X à 12 BNE Boucle3 ; Si X<>12 saute à Boucle3 ; ********** ZONE DE ROUTINE DE DEPLACEMENTS ********* ; ********* DEPLACEMENTS DU JOUEUR (PLAYER0) ********* LDA #0 ; Met 0 dans l'accu STA HMP0 ; Annule le déplacement du PLAYER0 Joydroite ; Test si le joystick est à droite LDA SWCHA ; Met le contenu de SWCHA dans A AND #128 ; Filtre le bit 7 CMP #0 ; Compare A à 0 (0=oui à droite) BNE Joygauche; Si pas égal, saute à Joygauche LDA #255 ; Valeur pour aller à droite... STA HMP0 ; ...pour le déplacement du PLAYER0 Joygauche ; Test si le joystick est à gauche LDA SWCHA ; Met le contenu de SWCHA dans A AND #64 ; Filtre le bit 6 CMP #0 ; Compare A à 0 (0=oui à gauche) BNE Finjoy ; Si pas égal, alors saute à Finjoy LDA #16 ; Valeur pour aller à gauche STA HMP0 ; ...pour le déplacement du PLAYER0 Finjoy ; Fin de routine du joystick ; ******************** ROUTINE DE TIR **************** LDA INPT4 ; Met contenu de INPT4 dans A BMI Pastir ; Si bouton pas pressé, saut à Pastir LDA #125 ; Sinon, charge 125 dans l'accu STA Dmissile ; Met A dans Dmissile LDA #135 ; Charge 135 dans l'accu STA Fmissile ; Met A dans Fmissile Pastir ; Etiquette Pastir LDA Dmissile ; Charge Dmissile dans A CMP #126 ; Si le missile n'est pas tiré BEQ Pdeplm ; Le missile ne se déplace pas DEC Dmissile ; Décrémente Dmissile 4 x DEC Dmissile ; pour le déplacer rapidement DEC Dmissile ; DEC Dmissile ; DEC Fmissile ; Décrémente Fmissile 4 x DEC Fmissile ; pour le déplacer rapidement DEC Fmissile ; DEC Fmissile ; LDA Dmissile ; Charge Dmissile dans l'accu CMP #1 ; Compare l'acccu à 1 BNE Paschoc ; Si <> saute à Paschoc LDA #126 ; sinon charge 126 dans l'accu STA Dmissile ; et le met dans Dmissile Paschoc ; Pas de choc du missile sur le virus Pdeplm ; Pas Déplacement Missile INC Dbombe ; La début de la bombe descend INC Fbombe ; La fin aussi LDA Fbombe ; On charge Fbombe dans l'accu CMP #126 ; on le compare à 126 BNE Pastombe ; Si <> alors saute à Pastombe LDA #0 ; Sinon, charge 0 dan l'accu STA Dbombe ; Que l'on met dans Dbombe LDA #10 ; On charge 10 dans l'accu STA Fbombe ; Que l'on met dans Fbombe Pastombe ; ** TEST DE COLLISION DE LA BOMBE ET DU MISSILE LDA CXPPMM ; Registre des collisions AND #128 ; Filtre le bit 7, collisions ; entre le PLAYER0 et le PLAYER1 CMP #128 ; Compare à 128 BNE Pascollision ; si <> saute à Pascollision STA CXCLR ; sinon, Initialise les collisisons LDX Dbombe ; et déplace horizontalement la bombe Bouclehasard ; Ce principe sera expliqué DEX ; ultérieurement CPX #0 ; BNE Bouclehasard ; STA RESP1 ; On place le player1 ailleurs ! LDA #0 ; Charge 0 dans l'accu pour... STA Dbombe ; initialiser le début de la bombe LDA #10 ; Charge 10 dans l'accu pour... STA Fbombe ; initialiser la fin de la bombe LDA #126 ; Charge 126 dans l'accu pour... STA Dmissile ; initialiser le début du misssile. Pascollision ; Etiquette ; **************** FIN DE L'AFFICHAGE **************** ; ****************** ON JOUE LE SON ****************** LDA Dmissile; On utilise la position du missile ADC #4 ; à laquelle on ajoute 4 STA AUDV0 ; Dans le registre de volume LDA #9 ; Type de son STA AUDC0 ; Dans le registre de type de son LDA Dmissile; On utilise la position du missile STA AUDF0 ; Dans le registre de fréquence LDA #4 ; Volume faible STA AUDV1 ; dans le registre de volume LDA #6 ; son pur STA AUDC1 ; dans le registre de type de son LDA Dbombe ; On utilise la position de la bombe LSR ; que l'on divise par deux LSR ; que l'on divise par deux STA AUDF1 ; pour le registre de note STA HMOVE ; Le simple fait d'écrire dans HMOVE ; effectue le déplacement du PLAYER0 ; à 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 difffé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. --------------------------------------------------------------------- @echo off dasm prog13.txt -f3 -v3 -oprog13.bin if errorlevel 1 goto erreur goto fin :erreur pause :fin pcae prog13.bin --------------------------------------------------------------------- @echo off dasm prog14.txt -f3 -v3 -oprog14.bin if errorlevel 1 goto erreur goto fin :erreur pause :fin pcae prog14.bin --------------------------------------------------------------------- @echo off dasm prog15.txt -f3 -v3 -oprog15.bin if errorlevel 1 goto erreur goto fin :erreur pause :fin pcae prog15.bin --------------------------------------------------------------------- @echo off dasm prog16.txt -f3 -v3 -oprog16.bin if errorlevel 1 goto erreur goto fin :erreur pause :fin pcae prog16.bin --------------------------------------------------------------------- @echo off dasm prog18.txt -f3 -v3 -oprog18.bin if errorlevel 1 goto erreur goto fin :erreur pause :fin pcae prog18.bin