Еще в январе 2020 года я начал подготовку к участию в Forever 2020 demoparty. Тема компо была объявлена ROBO, поэтому я решил написать простую работу для Atari 65XE. Когда интро было готово, я решил добавить растровый эффект. Увы, из-за отмены проведения Forever, часть интро была опубликована.
Процессором Atari служит MOS 6502 — 8-битные регистры и отсутствие портов для обращения к железу.Еще один компонент компьютера — ANTIC — он занимается формированием изображения — цвета, видеорежимы, символы.Для обращения к ANTIC существуют аппаратные ячейки, их назначения описаны в Mapping The Atari
Перечислять все адреса ячеек и назначения я не буду, опишу саму идею эффекта. Следует заметить, что для удобства адреса в Mapping имеют мнемоники — их так удобнее запоминать.
Что представляет собой экран? В текстовом режиме видно прямоугольник с символами и рамку.
Для удобства прямоугольник можно отключить, записав в адрес 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.
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
Другие варианты генерации цветов я оставлю тем, кто заинтересуется и попробует свои силы сам. Творите, экспериментируйте и создавайте. Это так увлекательно!
ZEvS_Poisk
Процессор 6502 хорош фиксированным временем исполнения.