; *** 27e PROGRAMME : DESSINONS SUR VCS **** ; ; 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 ****** Video = 128 ; Adresse la mémoire vidéo Vid2 = Video -5 ; sert de pointeur pour la vidéo Vid = Video ; Sert de pointeur pour dessiner Compteur1 = 255 ; Compteur Posx = 253 ; Position X du pixel à dessiner Posy = 251 ; Position Y du pixel à dessiner Ligne = 250 ; Adresse de la ligne du pixel à dessiner Bitchange = 249 ; Bit à dessiner Oldposx = 248 ; Ancienne position X Oldposy = 254 ; Ancienne position Y ; ************ LIGNES DE BYTE ************* Pict BYTE. %01100000,%00000000,%00000000,%00000000,%01100000 BYTE. %10000000,%00000000,%00000000,%00000000,%00010000 BYTE. %00000000,%11000000,%00000000,%00000000,%00001100 BYTE. %00000000,%00100000,%00000000,%00000000,%00000010 BYTE. %00000000,%00011000,%00000000,%00000001,%00000001 BYTE. %00000000,%00000100,%00000000,%00000010,%00000000 BYTE. %00000000,%00000011,%00000000,%00001100,%00000000 BYTE. %00000000,%00000000,%00000001,%00010000,%00000000 BYTE. %00000000,%00000000,%00000110,%01100000,%00000000 BYTE. %00000000,%00000000,%00001000,%10000000,%00000000 BYTE. %00001100,%00000000,%00110000,%00000000,%00000000 BYTE. %00000011,%00000000,%11000000,%00000000,%00000000 BYTE. %00000011,%00000000,%11000000,%00000000,%00000000 BYTE. %00001100,%00000000,%00110000,%00000000,%00000000 BYTE. %00000000,%00000000,%00001000,%10000000,%00000000 BYTE. %00000000,%00000000,%00000110,%01100000,%00000000 BYTE. %00000000,%00000000,%00000001,%00010000,%00000000 BYTE. %00000000,%00000011,%00000000,%00001100,%00000000 BYTE. %00000000,%00000100,%00000000,%00000010,%00000000 BYTE. %00000000,%00011000,%00000000,%00000001,%00000001 BYTE. %00000000,%00100000,%00000000,%00000000,%00000010 BYTE. %00000000,%11000000,%00000000,%00000000,%00001100 BYTE. %10000000,%00000000,%00000000,%00000000,%00010000 BYTE. %01100000,%00000000,%00000000,%00000000,%01100000 Mult5 BYTE. 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95 BYTE. 100,105,110,115,120,125,130,135,140,145,150,155,160,165 BYTE. 170,175,180,185,190,195,200,205,210,215,220,225,230,235 Tableoctet BYTE. 0,0,0,0 BYTE. 1,1,1,1,1,1,1,1 BYTE. 2,2,2,2,2,2,2,2 BYTE. 0,0,0,0 BYTE. 3,3,3,3,3,3,3,3 BYTE. 4,4,4,4,4,4,4,4 Tablebit BYTE. 16,32,64,128 BYTE. 128,64,32,16,8,4,2,1 BYTE. 1,2,4,8,16,32,64,128 BYTE. 1,2,4,8 BYTE. 128,64,32,16,8,4,2,1 BYTE. 1,2,4,8,16,32,64,128 ; ************** 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 ; ; LDY #0 ; ;Copyvid ; Copie le contenu de l'image ; LDA Pict,Y ; codé à l'adresse Pict ; STA Video,Y ; dans la mémoire Vidéo ; INY ; ; CPY #120 ; ; BNE Copyvid ; LDA #20 STA Posx LDA #10 STA Posy 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 ; DrawScreen ; LDA INTIM ; BNE DrawScreen STA WSYNC ; STA VBLANK ; ; **************** DEBUT D'AFFICHAGE ***************** LDA #136 ; On met du bleu STA COLUPF ; dans le playfield LDA #0 ; Cette valeur STA CTRLPF ; définit un Playfield disymétrique LDY #120 ; Compteur de lignes graphiques BoucleY LDX #7 ; Compteur de lignes écran BoucleX ; début de la boucle d'affichage STA WSYNC ; Attend la fin du balayage ; PARTIE GAUCHE DE L'ECRAN LDA Vid2,Y ; Charge l'octet de la ligne STA PF0 ; pour le registre de Playfield PF0 LDA Vid2+1,Y ; Charge l'octet de la ligne + 1 STA PF1 ; pour le registre de Playfield PF1 LDA Vid2+2,Y ; Charge l'octet de la ligne + 2 STA PF2 ; pour le registre de Playfield PF2 ; PARTIE DROITE DE L'ECRAN LDA Vid2,Y ; Charge l'octet de la ligne ASL ; mais décale quatre fois ASL ; les bits vers la gauche ASL ; pour décaler les bits 0123 ASL ; vers 4567 STA PF0 ; pour le registre de Playfield PF0 LDA Vid2+3,Y ; Charge l'octet de la ligne + 3 STA PF1 ; pour le registre de Playfield PF1 LDA Vid2+4,Y ; Charge l'octet de la ligne + 4 STA PF2 ; pour le registre de Playfield PF2 ; FIN DES BOUCLE DEX ; Décrémente X BNE BoucleX ; Si différent de 0 alors boucle DEY ; sinon décrémente Y de 5 DEY ; DEY ; DEY ; DEY ; BNE BoucleY ; Si Y est différent de 0 alors boucle ; ************** FIN DE L'AFFICHAGE ECRAN ************* STA WSYNC ; Attend la fin de balayage de la dernière ligne LDA #0 ; puis met à 0 : STA COLUPF ; la couleur du playfield, STA PF0 ; et les trois STA PF1 ; registres STA PF2 ; graphiques du Playfield. ; ********************* JOYSTICK *********************** ; ************* SYSTEME DE RALENTISSEMENT ************** INC Compteur1 ; Incrémente le compteur BNE Pasjoy ; Tant qu'il n'a pas atteint 0 LDA #248 ; sinon, met 248 STA Compteur1 ; pour le réinitialiser ; Donc, lorsque le compteur a atteint 0 ; on effectue un test de déplacement ; au joystick ; ****************** TEST DU JOYSTICK ******************* 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 INC Posx ; Valeur pour aller à droite LDA Posx CMP #40 BNE Joy_bas LDA #0 STA Posx 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 DEC Posx ; Valeur pour aller à gauche LDA Posx CMP #255 BNE Joy_bas LDA #39 STA Posx 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 Posy ; On décrémente le contenu de l'adresse mémoire 128 LDA Posy CMP #255 BNE Pasjoy LDA #23 STA Posy 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 Pasjoy ; S'il n'est pas égal à 0, alors va au test suivant : gauche INC Posy ; On décrémente le contenu de l'adresse mémoire 128 LDA Posy CMP #24 BNE Pasjoy LDA #0 STA Posy Pasjoy ; ****************** DESSINE LE PIXEL ****************** LDY Posy ; Utilise Y pour... LDA Mult5,Y ; charger le contenu de l'adresse Mult5+Posy STA Ligne ; et le sauver dans Ligne LDY Posx ; Utilise Y pour... LDA Tableoctet,Y ; charger le contenu de l'adresse Tableoctet+Posx ; A contient l'adresse de l'octet de la ligne CLC ; Instruction obligatoire avant un ADC ADC Ligne ; On ajoute l'adresse de la ligne TAX ; X contient l'adresse de l'octet à changer LDY Posx ; On cherche maintenant le bit à changer LDA Tablebit,Y ; En fonction de la position X du pixel ; Il récupère le bit concerné STA Bitchange ; et le sauvegarde dans Bitchange ; *************** ROUTINE DE CLIGNOTEMENT *************** Clignote ; clignotement LDA Vid,X ; Charge l'octet de la mémoire vidéo EOR Bitchange ; Si le bit est 1 il devient 0 et vice versa STA Vid,X ; Replace l'octet de la mémoire vidéo, modifié LDA INPT4 ; Test le bouton du joystick BMI Paspresse ; Si l'on ne le presse pas, saute à Paspresse LDA Posx ; Si Posx CMP Oldposx ; est différent de Oldposy BNE Inverse ; Alors on inverse le pixel LDA Posy ; Si Posy CMP Oldposy ; est différent de Oldposy BNE Inverse ; Alors on inverse le pixel JMP Pasinv ; Sinon on ne l'inverse pas ; ******************* ROUTINE D'INVERSION ********************** Inverse LDA Compteur1 ; Tant que le compteur CMP #255 ; n'a pas fini. BEQ Pasinv ; n'inverse pas le pixel LDA Vid,X ; Charge l'octet de la mémoire vidéo EOR Bitchange ; Si le bit est 1 il devient 0 et vice versa STA Vid,X ; Replace l'octet de la mémoire vidéo, modifié LDA Posx ; Met la valeur de Posx STA Oldposx ; à Oldposx LDA Posy ; Met la valeur de Posy STA Oldposy ; à Oldposy Pasinv Paspresse 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.