Rastereffekt für Atari 65XE

Bild

Bereits im Januar 2020 begann ich mit den Vorbereitungen für die Teilnahme an der Forever 2020-Demoparty. Das Compo-Thema wurde von ROBO angekündigt, daher habe ich beschlossen, eine einfache Arbeit für den Atari 65XE zu schreiben. Als das Intro fertig war, habe ich beschlossen, einen Bitmap-Effekt hinzuzufügen. Leider wurde aufgrund der Absage des Forever ein Teil des Intro veröffentlicht.

Der Atari-Prozessor besteht aus MOS 6502 - 8-Bit-Registern und dem Fehlen von Ports für den Zugriff auf Hardware. Eine weitere Komponente des Computers ist ANTIC - er implementiert Bilder - Farben, Videomodi, Symbole. Es gibt Hardwarezellen für den Zugriff auf ANTIC. Ihr Zweck wird in Mapping The beschrieben Atari

Ich werde nicht alle Adressen der Zellen und des Ziels auflisten, sondern die Idee des Effekts selbst beschreiben. Es sollte beachtet werden, dass die Adressen in Mapping der Einfachheit halber Mnemonik haben - sie sind so bequem zu merken.

Bild

Was ist ein Bildschirm? Im Textmodus ist ein Rechteck mit Symbolen und einem Rahmen sichtbar.

Der Einfachheit halber können Sie das Rechteck deaktivieren, indem Sie den Wert 0 bis 559 schreiben. Wie Sie sehen, ist Platz für einen Rastereffekt.

Jetzt müssen Sie die Zeichnung mit der Ausgabe auf dem Bildschirm synchronisieren. Es gibt zwei Methoden:

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

Hier ist RTCLOCK die Echtzeituhr, die beim Einschalten des Computers startet. Erhöht zuerst 14 $, dann 13 $ und 12 $. Die Idee der Synchronisation ist einfach: Vergleichen Sie den Wert von Zelle $ 14 mit dem aktuellen. Wenn der vorherige Wert nicht übereinstimmt, ist ein Interrupt aufgetreten.

Meiner Meinung nach passt die Methode jedoch nicht. Daher ist es bequemer, einen vertikalen VCOUNT-Zähler ($ D40B) für Linien zu verwenden, die auf dem Frame generiert wurden. Warten auf den Start des Frames wird sein:

ws
	lda $D40B ; VCOUNT
	bne ws

Die Idee selbst ist, Farbwerte in das COLBK-Register ($ D01A) zu schreiben - die Farbe des Rahmens.
Der in das Register geschriebene Wert ist in zwei Teile unterteilt: Farbtyp und Helligkeit, berechnet als Typ * 16 + Helligkeit. Hier und hier ausführlich beschrieben .

Wenn Sie jedoch die Farbe für jede Zeile einstellen, ist eine Synchronisierung erforderlich. Wenn Sie einen beliebigen Wert in WSYNC (D40A) schreiben, wird der Prozessor angehalten und auf den Start der nächsten Zeile gewartet. Die gleiche Methode wird in Interrupts der Anzeigeliste verwendet.

Der Effekt selbst gliedert sich in das Warten auf den Frame, das Generieren von Farbwerten und das Schreiben in die beschriebenen Register. Der Einfachheit halber habe ich Seitenadressen von Null verwendet. Sie können den xasm-Assembler zum Kompilieren verwenden.

Bild


	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

Es stellte sich heraus, 54 Bytes. 54-6 (Programmkopf) = 48 Bytes. Es ist Zeit zu experimentieren, zum Beispiel mit der Helligkeit von Grün zu spielen

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

Weitere Möglichkeiten zur Farbgenerierung überlasse ich Interessierten und versuche mich selbst. Erstellen, experimentieren und erstellen. Das ist so aufregend!

All Articles