; *** 26e PROGRAMME : LE PLAYFIELD DYNAMIQUE 2ème partie**** ; ; 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 Vid = Video - 5 ; sert de pointeur pour la vidéo Compteur1 = 255 ; 2 Compteurs utilisés pour écrire ... Compteur2 = 254 ; ... dynamiquement dans la mémoire vidéo 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 ; ************ 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 ; 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 Vid,Y ; Charge l'octet de la ligne STA PF0 ; pour le registre de Playfield PF0 LDA Vid+1,Y ; Charge l'octet de la ligne + 1 STA PF1 ; pour le registre de Playfield PF1 LDA Vid+2,Y ; Charge l'octet de la ligne + 2 STA PF2 ; pour le registre de Playfield PF2 ; PARTIE DROITE DE L'ECRAN LDA Vid,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 Vid+3,Y ; Charge l'octet de la ligne + 3 STA PF1 ; pour le registre de Playfield PF1 LDA Vid+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. ; ************* SYSTEME DE RALENTISSEMENT ************** INC Compteur1 ; Incrémente le compteur BNE Suite ; Tant qu'il n'a pas atteint 0 LDA #254 ; sinon, met 254 STA Compteur1 ; pour le réinitialiser ; ********** DEPLACEMENT DU PIXEL A DESSINER *********** DEC Posx ; Décrémente la position X du pixel DEC Posy ; Décrémente la position Y du pixel LDA Posx ; Compare la position X CMP #255 ; à 255 BNE Pasx ; Si différent, alors saute à Pasx LDA #38 ; Sinon met 38 STA Posx ; dans Posx Pasx LDA Posy ; Compare la position Y CMP #255 ; à 255 BNE Pasy ; Si différent, alors saute à Pasy LDA #23 ; Sinon met 23 STA Posy ; dans Posy Pasy ; ****************** 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 lesauvegarde dans Bitchange 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é Suite 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.