Atari 2600
Moderator: Shaos
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
Atari 2600
Что то не нашел темы про Atari 2600. Неужели эта платформа никого тут не заинтересовала. В частности, множество интересных игр, имеющих полноценный скролл и 128 цветную графику. И все это работало на 128 байтах оперативной памяти и 4-16 Кб ПЗУ.
-
- Supreme God
- Posts: 16676
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Atari 2600
Да - там урезанный 28-ногий 6502 "под маской" 6507. Меня конкретно - не заинтересовал...vinxru wrote:...множество интересных игр, имеющих полноценный скролл и 128 цветную графику.
И все это работало на 128 байтах оперативной памяти и 4-16 Кб ПЗУ.
А как других - трудно сказать, поскольку вот здесь мы его затронули вскользь.
iLavr
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
Там интересно видео (далее TIA).
По сути, это простейшая схема предназначенная для формирования экрана понга.
TIA не генерирут КСИ. Она вообще понятия не имеет о том, что изображение двумерное. Генерация КСИ возложена на программу.
TIA бесконечно повторяет одну и ту же строку. Какое то изображение получается, только благодаря тому, что процессор от строки к строке меняет значения регистров TIA
Игровое поле - это двухцветное изображение 20x1, которое дублируется до 40x1 и растягивается на всю строку в 160 пикселей. Правая часть игрового поля может быть зеркально отражена.
Игрок - это одноцветное изображение 8x1 (второй цвет прозрачный). Программист определяет положение игрока, его цвет, а так же некоторые эффекты (игрока можно отразить, растянуть, дублировать...).
Мишень - это отрезок 1,2,4 или 8 пикселей. Цвет мишени всегда такой же, как цвет игрока.
Мяч - это отрезок 1,2,4 или 8 пикселей. Мяч может быть любого цвета.
Главная идея в выше написанном, это то, что на Atari была офигительная графика.
Игры всегда давали 50 fps, даже при полной перерисовке экрана.И 128 цветов на экране. И это требует около 0 байт видеопамяти.
По сути, это простейшая схема предназначенная для формирования экрана понга.
TIA не генерирут КСИ. Она вообще понятия не имеет о том, что изображение двумерное. Генерация КСИ возложена на программу.
TIA бесконечно повторяет одну и ту же строку. Какое то изображение получается, только благодаря тому, что процессор от строки к строке меняет значения регистров TIA
Игровое поле - это двухцветное изображение 20x1, которое дублируется до 40x1 и растягивается на всю строку в 160 пикселей. Правая часть игрового поля может быть зеркально отражена.
Игрок - это одноцветное изображение 8x1 (второй цвет прозрачный). Программист определяет положение игрока, его цвет, а так же некоторые эффекты (игрока можно отразить, растянуть, дублировать...).
Мишень - это отрезок 1,2,4 или 8 пикселей. Цвет мишени всегда такой же, как цвет игрока.
Мяч - это отрезок 1,2,4 или 8 пикселей. Мяч может быть любого цвета.
Code: Select all
LDY #0 ; unsigned char y = 0;
Loop4: ; do {
STY ColuP0 ; цвет_игрока_1 = y;
LDA Data, Y ; a = data[y];
STA Grp0 ; битмэп_игрока_1 = a;
STA Pf1 ; битмэп_игрового_поля = a;
STA Wsync ; ждем_конец_строки();
STA Wsync ; ждем_конец_строки();
INY ; y++;
CPY #88 ; bool flag = y<72;
BNE Loop4 ; } while(flag);
Data: .DB $82,$82,$82,$FE,$82,$82,$82,0 ; H
.DB $FE,$80,$80,$FE,$80,$80,$FE,0 ; E
.DB $80,$80,$80,$80,$80,$80,$FE,0 ; L
.DB $80,$80,$80,$80,$80,$80,$FE,0 ; L
.DB $7C,$82,$82,$82,$82,$82,$7C,0 ; O
.DB 0,0,0,0,0,0,0,0
.DB $92,$92,$92,$92,$92,$92,$6C,0 ; W
.DB $7C,$82,$82,$82,$82,$82,$7C,0 ; O
.DB $FC,$82,$82,$FC,$88,$84,$82,0 ; R
.DB $80,$80,$80,$80,$80,$80,$FE,0 ; L
.DB $FC,$82,$82,$82,$82,$82,$FC,0 ; D
Игры всегда давали 50 fps, даже при полной перерисовке экрана.И 128 цветов на экране. И это требует около 0 байт видеопамяти.
You do not have the required permissions to view the files attached to this post.
-
- Supreme God
- Posts: 16676
- Joined: 21 Oct 2009 08:08
- Location: Россия
Возможно... но поскольку 6507, TIA и RIOT как и Atari 2600 мне недоступны,vinxru wrote:Там интересно видео (далее TIA).
то и не заинтересовало.
Сам 6502 меня заинтересовал, но в моей географической локации оказался
доступен лишь вот в таком сильно-интегрированном виде. Что не совсем
удобно, хотя и интересно...
iLavr
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Supreme God
- Posts: 16676
- Joined: 21 Oct 2009 08:08
- Location: Россия
Ну может быть программно-аппаратно - точнее будет...Shaos wrote:ZX-80 и ZX-81 вроде тоже программно синхроимпульсы генерили
Их идеологию передрали в "Галаксию", а там всё же аппаратная поддержка есть.
PS. Да,... и "Галаксия" всё-же схемотехнически ближе к ZX-80.
iLavr
-
- Banned
- Posts: 397
- Joined: 04 Jan 2013 10:09
- Location: 95.24.178.158
Re: Atari 2600 TIA
Столкнулся с этим (этой) TIA - Television Interface Adaptor - совершенно по случаю (искал мануал на 6532, а эта БИС используется в Atari 2600).vinxru wrote:Там интересно видео (далее TIA).
По сути, это простейшая схема предназначенная для формирования экрана понга.
TIA не генерирут КСИ. Она вообще понятия не имеет о том, что изображение двумерное. Генерация КСИ возложена на программу.
TIA бесконечно повторяет одну и ту же строку. Какое то изображение получается, только благодаря тому, что процессор от строки к строке меняет значения регистров TIA
....
Заинтересовало, и вспомнил про этот топик здесь. Даже скачал эмулятор Atari 2600 и попробовал пару игр посмотреть.
Раньше в жизни с Atari 2600 и её играми сталкиваться не приходилось...
По краткому описанию от vinxru из этого топика помнил, что программирование видео на Atari 2600 - дело весьма муторное, поскольку процесс программный, в динамике, и видео-ОЗУ как такового нет.
Но графика при таком аппаратном убожестве даже удивила!

Коллеги с форума http://zx-pk.ru/ в топике про Atari 2600 ссылаются на статью из Вики:
http://en.wikipedia.org/wiki/Atari_TIA
я прочитал - как-то всё неконкретно очень и педалируются трудности программирования.
Кто-нибуть знает, где почитать материал по TIA - Television Interface Adaptor более доходчиво
с конкретными примерами и желательно на русском?
Сейчас смотрю материал: Atari 2600 Programming for Newbies
You do not have the required permissions to view the files attached to this post.
-
- Banned
- Posts: 397
- Joined: 04 Jan 2013 10:09
- Location: 95.24.178.158
Re: Atari 2600
Поискал сам, вот что удалось найти:
Более полное описание от vinxru на русском:
http://www.adsl.zveronline.ru/projects/ ... tari_2600/
К сожалению исходник и бинарник примера там утеряны, и хотя там более подробно описано, понятнее чем здесь мне пока не стало...
Цикл статей по программированию Atari 2600, к сожалению на английском:
The TIA and the 6502 (и далее...)
К сожалению, они не разбирают последовательно какой-то пример. Смущает жесткая потактовая привязка 6502 к TIA.
Не совсем понятно, как TIA может тормозить 6502, "когда он сам ей об этом скажет".
Честно говоря, вот эти понятия пока тоже несколько затуманивают общий смысл:
Опять же - "симметрия относительно центра строки" - не наблюдаю её в скриншотах игр и не все из "5 управляемых программно объектов" наблюдаю на скриншотах...
Ну и раз уж были упомянуты "регистры TIA", то вот их полное описание (сожалению тоже на английском):
http://alienbill.com/2600/101/docs/stella.html
Наверное придется попереводить... русскоязычных материалов пока не встретилось.
P.S. Cтранно как-то... надеялся, что найдутся какие-либо форумы русскоязычных любителей Атари 2600
(по аналогии с "Денди" - Famicom), но - нет таких...
Более полное описание от vinxru на русском:
http://www.adsl.zveronline.ru/projects/ ... tari_2600/
К сожалению исходник и бинарник примера там утеряны, и хотя там более подробно описано, понятнее чем здесь мне пока не стало...

Цикл статей по программированию Atari 2600, к сожалению на английском:
The TIA and the 6502 (и далее...)
К сожалению, они не разбирают последовательно какой-то пример. Смущает жесткая потактовая привязка 6502 к TIA.
Не совсем понятно, как TIA может тормозить 6502, "когда он сам ей об этом скажет".
Честно говоря, вот эти понятия пока тоже несколько затуманивают общий смысл:
Может о всём сразу и не надо заботиться программно, в примерах vinxru этого не видно.Через регистры программист управляет 6-ю объектами: Игровое поле, которое занимает всю строку экрана; два игрока, две мишени, один мяч, которые могут находится в произвольном месте экрана.
Опять же - "симметрия относительно центра строки" - не наблюдаю её в скриншотах игр и не все из "5 управляемых программно объектов" наблюдаю на скриншотах...

Ну и раз уж были упомянуты "регистры TIA", то вот их полное описание (сожалению тоже на английском):
http://alienbill.com/2600/101/docs/stella.html
Наверное придется попереводить... русскоязычных материалов пока не встретилось.
P.S. Cтранно как-то... надеялся, что найдутся какие-либо форумы русскоязычных любителей Атари 2600
(по аналогии с "Денди" - Famicom), но - нет таких...
-
- Banned
- Posts: 397
- Joined: 04 Jan 2013 10:09
- Location: 95.24.178.158
TIA-Television Interface Adaptor
БИС TIA (Television Interface Adaptor) была разработана в качестве телевизионного адаптера для микропроцессорных систем с ограниченным количеством оперативной памяти (ОЗУ).
На момент создания TIA БИС ОЗУ были еще довольно дороги, поэтому архитектура адаптера подразумевает, что полный телевизионный сигнал и необходимое цветное изображение можно создать, используя лишь его внутренние регистры.
С учетом того, что игровая приставка Atari 2600 имеет всего 128 байт ОЗУ, где также размещается и стек микропроцессора MOS 6507, можно признать дизайн TIA довольно успешным.
В общем-то, этот чип от MOS носит название 6525, и может иметь разновидности для различных телевизионных систем. В частности, UM6526P TIA PAL - разновидность для TV стандарта PAL.
Отличия заключаются в цветовой синхронизации, поскольку аппаратно БИС TIA способна сформировать 1 строку телевизионного растра, с импульсом строчной синхронизации, "вспышкой" цветовой синхронизации и строчным гасящим импульсом.
При этом микропроцессор MOS 6507 должен активно "подкидывать дровишки" в регистры БИС TIA фактически "на лету", чтобы формировать видимую часть строки, в связи с чем БИС TIA и микропроцессор 6507 довольно жестко связаны аппаратно.
БИС TIA синхронизируется внешним тактовым генератором с частотой 3.58 MHZ, с этой частотой выводятся точки цвета (или "пиксели") во время движения лучей по строке телевизионного растра, что позволяет вывести 228 "пикселей" в строке, из которых 68 отводятся на интервал гашения по строке, а на его длительности 16 тактов отводятся на импульс строчной синхронизации со "вспышкой" цветовой синхронизации.
Таким образом весь телевизионный растр формируется из таких строк, а тактовая частота 3.58 MHZ делится TIA на три (1.19 MHZ) и подается в качестве тактирующего сигнал Ф1 на микропроцессор 6507, таким образом достигается синфазность работы TIA и 6507, при этом TIA может притормозить 6507 сигналом готовности RDY, действительно, когда последний выдаст TIA соответствующую команду. На 3 выведенных TIA точки приходится, соответственно, 1 такт CPU 6507, и с этой скоростью (1.19 MHZ) микропроцессор должен успевать в точные моменты времени осуществлять запись в регистры TIA, состояние которых сразу же отображается на видимой части строки как изображение. На микропроцессор также возлагается задача подсчета выведенных строк растра в кадре в зависимости от телевизионного стандарта (262 для NTSC и 312 для PAL), а также формирование кадрового синхронизирующего импульса (обычно в 3 строки) и интервалов гашения по кадру (VERTICAL BLANK и OVERSCAN).
Собственно, во время интервалов времени гашения по строке и кадру (HORIZONTAL BLANK, VERTICAL BLANK и OVERSCAN) микропроцессор 6507 относительно свободен, чтобы производить операции, не связанные с отображением на экран, а значит, в эти интервалы он может подсчитывать коллизии игры, или какой другой исполняемой программы (демо-ролика, к примеру). Но при этом микропроцессор должен очень строго успевать вернуться к формированию изображения записью в регистры БИС TIA, иначе изображение может быть испорчено.
Итак, никакой видеопамяти в игровой приставке Atari 2600 нет, и надо очень строго в режиме реального времени производить запись в регистры БИС TIA, которыми она может сформировать на экране следующие 6 объектов: игровое поле, 2 игрока, 2 мишени и 1 мяч (background & playfield, sprites (2), missiles (2) and ball). На скриншоте игры в танчики на Atari 2600 background - это зеленый цвет фона, playfield - это желтый лабиринт, 2 sprites - это цифры счета, 2 missiles - это сами 2 танка и ball - это то, чем танки стреляют.
Для всех этих объектов у БИС TIA есть специфические регистры, благодаря которым, эти объекты и появляются на экране и, действительно, БИС TIA ориентирована на формирование изображения характерного для игры PING-PONG, но это вовсе не значит, что нельзя этими "выразительными средствами" запрограммировать другую игру. Но для этих объектов БИС TIA может аппаратно отслеживать их геометрическое наложение друг на друга или пересечение. (У БИС TIA также есть средства формирования звука и шумов, но речь сейчас идет не об этом).
Итак, background - цвет фона в TIA задается через регистр COLUBK;
playfield - цвет лабиринта (или переднего плана) в TIA задается через регистр COLUPF;
За картинку лабиринта отвечают 3 регистра БИС TIA PF0, PF1, PF2. Из их 3х8=24 битов при отображении игрового поля используются только 20 бит, т.к. у регистра PF0 отображаются на экран только биты 4…7. Регистры PF0, PF1, PF2 отбражаются своими 20 битами в левой и правой половинах эрана либо зеркально симметрично, либо не симметрично следующим образом: Таким образом весь экран как игровое поле состоит из 20х2=40 блоков на 192 видимых строк для NTSC (242 - для PAL).
На момент создания TIA БИС ОЗУ были еще довольно дороги, поэтому архитектура адаптера подразумевает, что полный телевизионный сигнал и необходимое цветное изображение можно создать, используя лишь его внутренние регистры.
С учетом того, что игровая приставка Atari 2600 имеет всего 128 байт ОЗУ, где также размещается и стек микропроцессора MOS 6507, можно признать дизайн TIA довольно успешным.
В общем-то, этот чип от MOS носит название 6525, и может иметь разновидности для различных телевизионных систем. В частности, UM6526P TIA PAL - разновидность для TV стандарта PAL.
Отличия заключаются в цветовой синхронизации, поскольку аппаратно БИС TIA способна сформировать 1 строку телевизионного растра, с импульсом строчной синхронизации, "вспышкой" цветовой синхронизации и строчным гасящим импульсом.
При этом микропроцессор MOS 6507 должен активно "подкидывать дровишки" в регистры БИС TIA фактически "на лету", чтобы формировать видимую часть строки, в связи с чем БИС TIA и микропроцессор 6507 довольно жестко связаны аппаратно.
БИС TIA синхронизируется внешним тактовым генератором с частотой 3.58 MHZ, с этой частотой выводятся точки цвета (или "пиксели") во время движения лучей по строке телевизионного растра, что позволяет вывести 228 "пикселей" в строке, из которых 68 отводятся на интервал гашения по строке, а на его длительности 16 тактов отводятся на импульс строчной синхронизации со "вспышкой" цветовой синхронизации.
Таким образом весь телевизионный растр формируется из таких строк, а тактовая частота 3.58 MHZ делится TIA на три (1.19 MHZ) и подается в качестве тактирующего сигнал Ф1 на микропроцессор 6507, таким образом достигается синфазность работы TIA и 6507, при этом TIA может притормозить 6507 сигналом готовности RDY, действительно, когда последний выдаст TIA соответствующую команду. На 3 выведенных TIA точки приходится, соответственно, 1 такт CPU 6507, и с этой скоростью (1.19 MHZ) микропроцессор должен успевать в точные моменты времени осуществлять запись в регистры TIA, состояние которых сразу же отображается на видимой части строки как изображение. На микропроцессор также возлагается задача подсчета выведенных строк растра в кадре в зависимости от телевизионного стандарта (262 для NTSC и 312 для PAL), а также формирование кадрового синхронизирующего импульса (обычно в 3 строки) и интервалов гашения по кадру (VERTICAL BLANK и OVERSCAN).
Собственно, во время интервалов времени гашения по строке и кадру (HORIZONTAL BLANK, VERTICAL BLANK и OVERSCAN) микропроцессор 6507 относительно свободен, чтобы производить операции, не связанные с отображением на экран, а значит, в эти интервалы он может подсчитывать коллизии игры, или какой другой исполняемой программы (демо-ролика, к примеру). Но при этом микропроцессор должен очень строго успевать вернуться к формированию изображения записью в регистры БИС TIA, иначе изображение может быть испорчено.
Итак, никакой видеопамяти в игровой приставке Atari 2600 нет, и надо очень строго в режиме реального времени производить запись в регистры БИС TIA, которыми она может сформировать на экране следующие 6 объектов: игровое поле, 2 игрока, 2 мишени и 1 мяч (background & playfield, sprites (2), missiles (2) and ball). На скриншоте игры в танчики на Atari 2600 background - это зеленый цвет фона, playfield - это желтый лабиринт, 2 sprites - это цифры счета, 2 missiles - это сами 2 танка и ball - это то, чем танки стреляют.
Для всех этих объектов у БИС TIA есть специфические регистры, благодаря которым, эти объекты и появляются на экране и, действительно, БИС TIA ориентирована на формирование изображения характерного для игры PING-PONG, но это вовсе не значит, что нельзя этими "выразительными средствами" запрограммировать другую игру. Но для этих объектов БИС TIA может аппаратно отслеживать их геометрическое наложение друг на друга или пересечение. (У БИС TIA также есть средства формирования звука и шумов, но речь сейчас идет не об этом).
Итак, background - цвет фона в TIA задается через регистр COLUBK;
playfield - цвет лабиринта (или переднего плана) в TIA задается через регистр COLUPF;
За картинку лабиринта отвечают 3 регистра БИС TIA PF0, PF1, PF2. Из их 3х8=24 битов при отображении игрового поля используются только 20 бит, т.к. у регистра PF0 отображаются на экран только биты 4…7. Регистры PF0, PF1, PF2 отбражаются своими 20 битами в левой и правой половинах эрана либо зеркально симметрично, либо не симметрично следующим образом: Таким образом весь экран как игровое поле состоит из 20х2=40 блоков на 192 видимых строк для NTSC (242 - для PAL).
You do not have the required permissions to view the files attached to this post.
-
- Banned
- Posts: 397
- Joined: 04 Jan 2013 10:09
- Location: 95.24.178.158
TIA-Television Interface Adaptor (Р.2)
Таким образом, весь экран, как игровое поле, состоит из 20х2=40 блоков на 192 видмиых строк для NTSC (242 - для PAL).
Коды цвета в зависимости от реализуемого телевизионного стандарта выбираются из следующих таблиц: Можно также использовать следующую ссылку: http://www.qotile.net/minidig/docs/tia_color.html
Реальные адреса регистров БИС TIA PF0, PF1, PF2, COLUBK, COLUPF и других задаются в заголовочном файле vcs.h и зависят от базового адреса БИС TIA.
В Atari 2600 карта распределения памяти и устройств ввода-вывода следующая: БИС MOS 6532 RIOT (RAM, Input/Output, Timer), собственно, содержит 128 байт ОЗУ, два 8-битных порта ввода-вывода и таймер с функциями предделителя.
Исходя из всего представленного материала, цикл вывода изображения на экран в Atari 2600 можно представить в форме следующего алгоритма:
Выдать:
3 телевизионные строки импульса кадровой синхронизации;
37 телевизионных строк интервала гашения по кадру;
192 видимые телевизионные строки (NTSC) (242 - PAL) изображения.
30 телевизионных строк гашения по кадру.
Типовые фрагменты кода для формирования отдельных временных интервалов и импульсов оформлены в виде макросов и содержатся в заголовочном файле macro.h , также используется таймер БИС RIOT 6532.
Собственно, все описанные выше средства и помогут нам вывести на экран эмулятора Atari 2600 сообщение "Hello word" в привычном для чтения виде - горизонтальном, а не вертикально, как было показано здесь ранее.
Коды цвета в зависимости от реализуемого телевизионного стандарта выбираются из следующих таблиц: Можно также использовать следующую ссылку: http://www.qotile.net/minidig/docs/tia_color.html
Реальные адреса регистров БИС TIA PF0, PF1, PF2, COLUBK, COLUPF и других задаются в заголовочном файле vcs.h и зависят от базового адреса БИС TIA.
В Atari 2600 карта распределения памяти и устройств ввода-вывода следующая: БИС MOS 6532 RIOT (RAM, Input/Output, Timer), собственно, содержит 128 байт ОЗУ, два 8-битных порта ввода-вывода и таймер с функциями предделителя.
Исходя из всего представленного материала, цикл вывода изображения на экран в Atari 2600 можно представить в форме следующего алгоритма:
Выдать:
3 телевизионные строки импульса кадровой синхронизации;
37 телевизионных строк интервала гашения по кадру;
192 видимые телевизионные строки (NTSC) (242 - PAL) изображения.
30 телевизионных строк гашения по кадру.
Типовые фрагменты кода для формирования отдельных временных интервалов и импульсов оформлены в виде макросов и содержатся в заголовочном файле macro.h , также используется таймер БИС RIOT 6532.
Собственно, все описанные выше средства и помогут нам вывести на экран эмулятора Atari 2600 сообщение "Hello word" в привычном для чтения виде - горизонтальном, а не вертикально, как было показано здесь ранее.
You do not have the required permissions to view the files attached to this post.
-
- Banned
- Posts: 397
- Joined: 04 Jan 2013 10:09
- Location: 95.24.178.158
Atari 2600 V_DAY
При написании кода и всех представленных здесь выше материалов я пользовался информацией с сайтов:
Atari 2600 Programming for Newbies, Stella Programmers Guide и FlapPing 2600 Development Journal.
На странице Atari 2600 Programming for Newbies перечислен весь необходимый софт, поэтому я давать
эти ссылки отдельно здесь не буду.
Перейдём сразу к коду:
Код хорошо мной откомментирован, поэтому я не вижу необходимости что-то добавить.
Компилируется код ассемблером DASM следующей командной строкой: dasm _V_Day.asm -f3 -o_V_Day.a26
Я использовал эмулятор Atari 2600 - Z26 для запуска исполняемого файла _V_Day.a26 :
С Днём Победы! С праздником, коллеги!
А ньюансы программирования и графики обсудим позже...
Atari 2600 Programming for Newbies, Stella Programmers Guide и FlapPing 2600 Development Journal.
На странице Atari 2600 Programming for Newbies перечислен весь необходимый софт, поэтому я давать
эти ссылки отдельно здесь не буду.
Перейдём сразу к коду:
Code: Select all
; _V_Day.asm ;
; Пример с ассиметричным игровым полем
;
processor 6502
include vcs.h
include macro.h
ORG $F000
MSpixelHeight = #8 ; высота символа в "пикселях"
LinesPerPixel = #6 ; кол-во строк растра на высоту "пикселя"
Start:
CLEAN_START; макрос
lda #$43
sta COLUBK ; цвет фона игрового поля
lda #30
sta COLUPF ; цвет изображения поля
; Основной цикл начинается с кадрового
; синхроимпульса, и с гашения по кадру
; и сделаем задержку по таймеру RIOT;
MainLoop:
VERTICAL_SYNC; макрос
lda #43
sta TIM64T
;
; мы ждем окончания задержки
;
WaitVblankEnd:
lda INTIM ; читаем таймер
bne WaitVblankEnd
sta VBLANK ; гашение по кадру
;
; Пять циклов отрисовки игрового поля:
; до сообщения (20), само сообщение(6х8=48), между строками (20)
; BeforeMessg , MessgShowLoop , MessgPostLoop
; вторая строка сообщения(48), после сообщения (сколько осталось -)
; (- до 192 NTSC или до 242 для PAL )
;
; выводим 20 строк цветом фона изображения до надписи
ldy #20
BeforeMessg:
sta WSYNC
dey
bne BeforeMessg
;
; здесь выводим 6х8=48 строк изображения надписи
; расчет по тактам 6502 взят из примера
ldx #MSpixelHeight ; X - высота символа надписи в условных "пикселях"
ldy #LinesPerPixel ; Y - высота условного "пикселях" в строках растра
;
MessgFirstLoop:
sta WSYNC
lda PFData0Left-1,X ;[0]+4
sta PF0 ;[4]+3 = *7* < 23 ;PF0 visible
lda PFData1Left-1,X ;[7]+4
sta PF1 ;[11]+3 = *14* < 29 ;PF1 visible
lda PFData2Left-1,X ;[14]+4
sta PF2 ;[18]+3 = *21* < 40 ;PF2 visible
nop ;[21]+2
nop ;[23]+2
nop ;[25]+2
lda PFData0Right-1,X ;[27]+4 можно записывать в PF0
sta PF0 ;[31]+3 = *34*
lda PFData1Right-1,X ;[34]+4 можно записывать в PF1
sta PF1 ;[38]+3 = *41*
lda PFData2Right-1,X ;[41]+4 можно записывать в PF2 точно в цикле 45
sta PF2 ;[45]+2 = *47* ; >
dey ; сдвинемся по высоте условного "пикселях" в строках растра
bne TheSamePixel ; "пиксель" пока прорисовываем все тот же
dex ; сдвинемся в спрайте изображения к следующей линии "пикселей"
beq ShowMessgEnd ; выходим, если вывод надписи завершен
ldy #LinesPerPixel ; иначе обновим счетчик линий "пикселя" по высоте
TheSamePixel:
jmp MessgFirstLoop
ShowMessgEnd:
; очистим все регистры игрового поля
lda #0
sta PF2
sta PF1
sta PF0
;
; выводим 20 строк цветом фона изображения до след.надписи
ldy #20
MiddleMessg:
sta WSYNC
dey
bne MiddleMessg
;
; здесь выводим ещё 6х8=48 строк изображения второй надписи
ldx #MSpixelHeight ; X - высота символа надписи в условных "пикселях"
ldy #LinesPerPixel ; Y - высота условного "пикселях" в строках растра
;
MessgSecondLoop:
sta WSYNC
lda RFData0Left-1,X ;[0]+4
sta PF0 ;[4]+3 = *7* < 23 ;PF0 visible
lda RFData1Left-1,X ;[7]+4
sta PF1 ;[11]+3 = *14* < 29 ;PF1 visible
lda RFData2Left-1,X ;[14]+4
sta PF2 ;[18]+3 = *21* < 40 ;PF2 visible
nop ;[21]+2
nop ;[23]+2
nop ;[25]+2
lda RFData0Right-1,X ;[27]+4 можно записывать в PF0
sta PF0 ;[31]+3 = *34*
lda RFData1Right-1,X ;[34]+4 можно записывать в PF1
sta PF1 ;[38]+3 = *41*
lda RFData2Right-1,X ;[41]+4 можно записывать в PF2 точно в цикле 45
sta PF2 ;[45]+2 = *47* ; >
dey ; сдвинемся по высоте условного "пикселях" в строках растра
bne PixelTheSame ; "пиксель" пока прорисовываем все тот же
dex ; сдвинемся в спрайте изображения к следующей линии "пикселей"
beq MessgSecondEnd ; выходим, если вывод надписи завершен
ldy #LinesPerPixel ; иначе обновим счетчик линий "пикселя" по высоте
PixelTheSame:
jmp MessgSecondLoop
MessgSecondEnd:
;
; снова очистим регистры игрового поля
lda #0
sta PF2
sta PF1
sta PF0
;
; выводим оставшиеся линии растра цветом фона
; 192(242) - (20 строк + 48 строк + 20 строк + 48 строк)
ldy #81 ; при превышении - эмулятор меняет TV стандарт
PostMessgLoop:
sta WSYNC
dey
bne PostMessgLoop
;
; отработаем интервал гашения по кадру
lda #2
sta VBLANK
ldx #30
OverScanWait:
sta WSYNC
dex
bne OverScanWait
jmp MainLoop
;
; Псевдографика выводимой надписи
;------------- первая строка надписи
;------------- первая половина поля
; у PF0 выводятся только 4 бита с 4 по 7
; "спрайт" выводится с нижнего байта
; и с младшего бита - здесь он зеркален
PFData0Left
.byte #%00000000;
.byte #%00000000;
.byte #%10000000;
.byte #%10000000;
.byte #%10000000;
.byte #%10000000;
.byte #%10000000;
.byte #%00000000;
PFData1Left
.byte #%00000000;
.byte #%11100000;
.byte #%00010000;
.byte #%00000000;
.byte #%00000000;
.byte #%00000000;
.byte #%00010000;
.byte #%11100000;
PFData2Left
.byte #%00010001;
.byte #%01011111;
.byte #%01001010;
.byte #%11001010;
.byte #%01001010;
.byte #%01001010;
.byte #%00001010;
.byte #%00001100;
;------------- вторая половина поля
PFData0Right
.byte #%00000000;
.byte #%01000000;
.byte #%01000000;
.byte #%01110000;
.byte #%01000000;
.byte #%01000000;
.byte #%00000000;
.byte #%00000000;
PFData1Right
.byte #%00000000;
.byte #%01111010;
.byte #%10000010;
.byte #%11111010;
.byte #%10001011;
.byte #%01110010;
.byte #%00000000;
.byte #%01010000;
PFData2Right
.byte #%00000000;
.byte #%00000100;
.byte #%00000100;
.byte #%00000101;
.byte #%00000110;
.byte #%00000100;
.byte #%00000000;
.byte #%00000000;
;------------- вторая строка надписи
;------------- первая половина поля
; у PF0 выводятся только 4 бита с 4 по 7
; "спрайт" выводится с нижнего байта
; и с младшего бита - здесь он зеркален
RFData0Left
.byte #%00000000;
.byte #%00100000;
.byte #%00100000;
.byte #%00100000;
.byte #%00100000;
.byte #%00100000;
.byte #%00100000;
.byte #%11100000;
RFData1Left
.byte #%00000000;
.byte #%10011100;
.byte #%10100010;
.byte #%10100010;
.byte #%10100010;
.byte #%10011100;
.byte #%10000000;
.byte #%10000000;
RFData2Left
.byte #%00000000;
.byte #%10001110;
.byte #%01010001;
.byte #%11010001;
.byte #%01001111;
.byte #%10000011;
.byte #%00001110;
.byte #%00010000;
;------------- вторая половина поля
RFData0Right
.byte #%00000000;
.byte #%01110000;
.byte #%00000000;
.byte #%01110000;
.byte #%01000000;
.byte #%00110000;
.byte #%00000000;
.byte #%00000000;
RFData1Right
.byte #%10001000;
.byte #%11111011;
.byte #%01010010;
.byte #%01010011;
.byte #%01010010;
.byte #%00110010;
.byte #%00000000;
.byte #%00000000;
RFData2Right
.byte #%00000000;
.byte #%01010011;
.byte #%00010100;
.byte #%01010011;
.byte #%01010000;
.byte #%01010000;
.byte #%01000000;
.byte #%01000000;
ORG $FFFC ; нет NMI у 6507 CPU...
.word Start ; RESET
.word Start ; IRQ
END
Компилируется код ассемблером DASM следующей командной строкой: dasm _V_Day.asm -f3 -o_V_Day.a26
Я использовал эмулятор Atari 2600 - Z26 для запуска исполняемого файла _V_Day.a26 :
С Днём Победы! С праздником, коллеги!
А ньюансы программирования и графики обсудим позже...

You do not have the required permissions to view the files attached to this post.
-
- Banned
- Posts: 397
- Joined: 04 Jan 2013 10:09
- Location: 95.24.178.158
Atari 2600 ASM
Я надеюсь, понятно, что вся эта надпись по сути - специфически нарисованное "игровое поле".
Но, поскольку никаких "знакогенераторов" у Atari 2600 в принципе нет, то заставки с надписями зачастую рисуются именно так.
Если на лету успевать манипулировать цветом фона игрового поля или цветом изображения поля, можно получить и весьма красивые эффекты! Несколько слов о том, как всё это удобнее "рисовать"...
Существуют on-line "рисовалки" этой псевдографики:
http://alienbill.com/2600/playerpal.html
http://alienbill.com/2600/playfieldpal.html
http://alienbill.com/2600/playerpalnext.html
где можно сразу получить даже ассемблерный код вывода "рисунка".
Но на первый раз мне захотелось разобраться подробнее, как выводятся на экран эти регистры PF0...PF2, и поскольку есть подробная диаграмма в постах выше, то я выполнил надпись в редакторе ПК "Специалист" под эмулятором, скопировал эту графику и, нарисовав пару точечных линеек, в 8-кратном увеличении заполнил "таблицы" кодов вручную. Это довольно легко, если помнить, как выводится эта псевдографика: по байтам - от старшего к младшему, по битам - младшие выводятся на экран первыми.
И есть еще один тонкий момент:
Формула в коде приведена в общем-то правильная: 192(242) - (20 строк + 48 строк + 20 строк + 48 строк)
Но интересно, что эмуляторы относятся к этому довольно нестрого, не знаю, уж как реальная Atari 2600...
Я сначала ошибся, а потом уже преднамеренно стал превышать число видимых строк на экран - 198 для NTSC.
До 217 строк только увеличивался вертикальный размер видимого поля.
А вот выше этого значения (если я не ошибся в подсчете) эмулятор решил, что мы перешли в стандарт PAL и изменил цвета.
Вот такие ньюансы и тонкости... и если кого-то заинтересовало программирование 6502 на платформе Atari 2600, то рекомендую вот этот цикл статей: FlapPing 2600 Development Journal.
Там от простого к сложному программируют этот самый PONG, под который железо Atari 2600 и было изначально расточено...
Желаю удачи!
Но, поскольку никаких "знакогенераторов" у Atari 2600 в принципе нет, то заставки с надписями зачастую рисуются именно так.
Если на лету успевать манипулировать цветом фона игрового поля или цветом изображения поля, можно получить и весьма красивые эффекты! Несколько слов о том, как всё это удобнее "рисовать"...
Существуют on-line "рисовалки" этой псевдографики:
http://alienbill.com/2600/playerpal.html
http://alienbill.com/2600/playfieldpal.html
http://alienbill.com/2600/playerpalnext.html
где можно сразу получить даже ассемблерный код вывода "рисунка".
Но на первый раз мне захотелось разобраться подробнее, как выводятся на экран эти регистры PF0...PF2, и поскольку есть подробная диаграмма в постах выше, то я выполнил надпись в редакторе ПК "Специалист" под эмулятором, скопировал эту графику и, нарисовав пару точечных линеек, в 8-кратном увеличении заполнил "таблицы" кодов вручную. Это довольно легко, если помнить, как выводится эта псевдографика: по байтам - от старшего к младшему, по битам - младшие выводятся на экран первыми.
И есть еще один тонкий момент:
Code: Select all
;
; выводим оставшиеся линии растра цветом фона
; 192(242) - (20 строк + 48 строк + 20 строк + 48 строк)
ldy #81 ; при превышении - эмулятор меняет TV стандарт
PostMessgLoop:
sta WSYNC
dey;
bne PostMessgLoop
;
Но интересно, что эмуляторы относятся к этому довольно нестрого, не знаю, уж как реальная Atari 2600...

Я сначала ошибся, а потом уже преднамеренно стал превышать число видимых строк на экран - 198 для NTSC.
До 217 строк только увеличивался вертикальный размер видимого поля.
А вот выше этого значения (если я не ошибся в подсчете) эмулятор решил, что мы перешли в стандарт PAL и изменил цвета.

Там от простого к сложному программируют этот самый PONG, под который железо Atari 2600 и было изначально расточено...
Желаю удачи!

You do not have the required permissions to view the files attached to this post.