Растровый эффект для Atari 65XE

от автора

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 

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

ссылка на оригинал статьи https://habr.com/ru/post/498072/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *