Effet raster pour Atari 65XE

image

En janvier 2020, j'ai commencĂ© les prĂ©paratifs pour participer Ă  la dĂ©mopartie Forever 2020. Le thĂšme de la compo a Ă©tĂ© annoncĂ© par ROBO, j'ai donc dĂ©cidĂ© d'Ă©crire une Ɠuvre simple pour l'Atari 65XE. Lorsque l'intro Ă©tait prĂȘte, j'ai dĂ©cidĂ© d'ajouter un effet bitmap. HĂ©las, en raison de l'annulation de Forever, une partie de l'intro a Ă©tĂ© publiĂ©e.

Le processeur Atari est MOS 6502 - registres 8 bits et manque de ports pour accéder au matériel. Un autre composant de l'ordinateur est ANTIC - il implémente des images - couleurs, modes vidéo, symboles. Il existe des cellules matérielles pour accéder à ANTIC, leur fonction est décrite dans Mapping The Atari

je ne listerai pas toutes les adresses des cellules et la destination, je dĂ©crirai l'idĂ©e de l'effet lui-mĂȘme. Il convient de noter que pour plus de commoditĂ©, les adresses dans Mapping ont des mnĂ©moniques - elles sont si pratiques Ă  retenir.

image

Qu'est-ce qu'un Ă©cran? En mode texte, un rectangle avec des symboles et un cadre est visible.

Pour plus de commodité, vous pouvez désactiver le rectangle en écrivant la valeur 0 à 559. Comme vous pouvez le voir, il y a de la place pour un effet raster.

Vous devez maintenant synchroniser le dessin avec la sortie à l'écran. Il existe deux méthodes:

RTCLOK      equ $0012
      lda RTCLOK+2
waits
      cmp RTCLOK+2
       beq waits

Ici, RTCLOCK est l'horloge en temps réel qui démarre lorsque l'ordinateur est allumé. Augmente d'abord 14 $, puis 13 $ et 12 $. L'idée de la synchronisation est simple: comparer la valeur de la cellule 14 $ avec celle actuelle. Si la valeur précédente ne correspond pas, une interruption s'est produite.

Mais à mon avis, la méthode ne convient pas, il est donc plus pratique d'utiliser un compteur vertical de lignes VCOUNT ($ D40B) généré sur le cadre. Attendre le début de la trame sera:

ws
	lda $D40B ; VCOUNT
	bne ws

L'idĂ©e elle-mĂȘme est d'Ă©crire des valeurs de couleur dans le registre COLBK ($ D01A) - la couleur du cadre.
La valeur écrite dans le registre est divisée en deux parties: type de couleur et luminosité, calculées comme type * 16 + luminosité. Décrit en détail ici et ici .

Mais lors de la dĂ©finition de la couleur pour chaque ligne, une synchronisation est nĂ©cessaire - l'Ă©criture de toute valeur dans WSYNC (D40A) arrĂȘtera le processeur et le fera attendre que la ligne suivante dĂ©marre. La mĂȘme mĂ©thode est utilisĂ©e dans les interruptions de la liste d'affichage.

L'effet lui-mĂȘme est divisĂ© en attendant la trame, en gĂ©nĂ©rant des valeurs de couleur et en les Ă©crivant dans les registres dĂ©crits. J'ai utilisĂ© des adresses de page zĂ©ro pour plus de simplicitĂ©. Vous pouvez utiliser l'assembleur xasm pour compiler.

image


	org $4000
	
start

wait_frame
ws
	lda $D40B ; VCOUNT
	bne ws
       LDY #0
       STY 559
zz
	LDA $CD
	CLC
	ADC #5
	STA $CD
	BCC BR1
	INC $CE
BR1
	ADC $CB
	STA $CB
	BCC BR2
	INC $CC
BR2
	LDA $CC
	STA $D40A ; WSYNC
	STA $D01A
	INY
	BNE zz
	BEQ wait_frame
	run start

Il s'est avĂ©rĂ© 54 octets. 54-6 (en-tĂȘte de programme) = 48 octets. Il est temps d'expĂ©rimenter, par exemple, jouer avec la luminositĂ© du vert

	lda $CC
;*  
	and #$0f
	ORA #$C0
;*  
	sta $D40A ; wsync
	sta $D01A

D'autres options pour gĂ©nĂ©rer des couleurs seront laissĂ©es Ă  ceux qui sont intĂ©ressĂ©s et essayer moi-mĂȘme. CrĂ©ez, expĂ©rimentez et crĂ©ez. Cela est si excitant!

All Articles