
Еще в январе 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
Другие варианты генерации цветов я оставлю тем, кто заинтересуется и попробует свои силы сам. Творите, экспериментируйте и создавайте. Это так увлекательно!
ссылка на оригинал статьи https://habr.com/ru/post/498072/
Добавить комментарий