image

Еще в январе 2020 года я начал подготовку к участию в Forever 2020 demoparty. Тема компо была объявлена ROBO, поэтому я решил написать простую работу для Atari 65XE. Когда интро было готово, я решил добавить растровый эффект. Увы, из-за отмены проведения Forever, часть интро была опубликована.

Процессором Atari служит MOS 6502 — 8-битные регистры и отсутствие портов для обращения к железу.Еще один компонент компьютера — ANTIC — он занимается формированием изображения — цвета, видеорежимы, символы.Для обращения к ANTIC существуют аппаратные ячейки, их назначения описаны в Mapping The Atari

Перечислять все адреса ячеек и назначения я не буду, опишу саму идею эффекта. Следует заметить, что для удобства адреса в Mapping имеют мнемоники — их так удобнее запоминать.

image

Что представляет собой экран? В текстовом режиме видно прямоугольник с символами и рамку.

Для удобства прямоугольник можно отключить, записав в адрес 559 значение 0. Как видно, что есть простор для растрового эффекта.

Теперь нужно синхронизировать рисование с выводом на экран. Существует два метода:

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

Здесь RTCLOCK — часы реального времени, которые запускаются при включении компьютера. Сначала увеличивается $14, потом $13 и $12. Идея синхронизации проста: сравнивать значение ячейки $14 с текущим. Если предыдущее значение не совпадает, то произошло прерывание.

Но в моем эффекте способ не подходит, поэтому удобнее использовать VCOUNT($D40B)-вертикальный счетчик линий, генерируемых на кадре. Ожидание начала кадра будет:

ws
	lda $D40B ; VCOUNT
	bne ws

Сама идея заключается в записи цветовых значений в регистр COLBK($D01A) — цвет рамки.
Значение, записываемое в регистр разбивается на две части: тип цвета и яркость, вычисляется как тип*16+яркость. Подробно описано здесь и здесь.

Но при установке цвета для каждой линии понадобится синхронизация — запись любого значения в WSYNC(D40A) остановит процессор и заставит ждать начала следующей строки. Такой же метод используется в прерываниях Display List.

Сам эффект разбивается на ожидание кадра, генерацию цветовых значений и запись их в описанные регистры. Я использовал адреса нулевой страницы для простоты. Для компиляции можно использовать ассемблер xasm.

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

Получилось 54 байта. 54-6(заголовок программы)=48 байт. Есть время экспериментировать, например поиграть с яркостями зеленого цвета

	lda $CC
;* новый код
	and #$0f
	ORA #$C0
;* запись цвета
	sta $D40A ; wsync
	sta $D01A

Другие варианты генерации цветов я оставлю тем, кто заинтересуется и попробует свои силы сам. Творите, экспериментируйте и создавайте. Это так увлекательно!