nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 11:27



Reply to topic  [ 12 posts ] 
Atari 2600 
Author Message
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Что то не нашел темы про Atari 2600. Неужели эта платформа никого тут не заинтересовала. В частности, множество интересных игр, имеющих полноценный скролл и 128 цветную графику. И все это работало на 128 байтах оперативной памяти и 4-16 Кб ПЗУ.


11 Jun 2013 13:02
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
vinxru wrote:
...множество интересных игр, имеющих полноценный скролл и 128 цветную графику.
И все это работало на 128 байтах оперативной памяти и 4-16 Кб ПЗУ.

Да - там урезанный 28-ногий 6502 "под маской" 6507. Меня конкретно - не заинтересовал...
А как других - трудно сказать, поскольку вот здесь мы его затронули вскользь.

_________________
iLavr


11 Jun 2013 13:35
Profile
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Post 
Там интересно видео (далее TIA).

По сути, это простейшая схема предназначенная для формирования экрана понга.

TIA не генерирут КСИ. Она вообще понятия не имеет о том, что изображение двумерное. Генерация КСИ возложена на программу.

TIA бесконечно повторяет одну и ту же строку. Какое то изображение получается, только благодаря тому, что процессор от строки к строке меняет значения регистров TIA


Игровое поле - это двухцветное изображение 20x1, которое дублируется до 40x1 и растягивается на всю строку в 160 пикселей. Правая часть игрового поля может быть зеркально отражена.

Игрок - это одноцветное изображение 8x1 (второй цвет прозрачный). Программист определяет положение игрока, его цвет, а так же некоторые эффекты (игрока можно отразить, растянуть, дублировать...).

Мишень - это отрезок 1,2,4 или 8 пикселей. Цвет мишени всегда такой же, как цвет игрока.

Мяч - это отрезок 1,2,4 или 8 пикселей. Мяч может быть любого цвета.

Code:
   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


Attachment:
a6e3a7efb831.jpg
a6e3a7efb831.jpg [ 17.09 KiB | Viewed 12065 times ]


Главная идея в выше написанном, это то, что на Atari была офигительная графика.

Игры всегда давали 50 fps, даже при полной перерисовке экрана.И 128 цветов на экране. И это требует около 0 байт видеопамяти.


11 Jun 2013 14:14
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
vinxru wrote:
Там интересно видео (далее TIA).

Возможно... но поскольку 6507, TIA и RIOT как и Atari 2600 мне недоступны,
то и не заинтересовало.

Сам 6502 меня заинтересовал, но в моей географической локации оказался
доступен лишь вот в таком сильно-интегрированном виде. Что не совсем
удобно, хотя и интересно...

_________________
iLavr


11 Jun 2013 14:31
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22411
Location: Silicon Valley
Reply with quote
Post 
ZX-80 и ZX-81 вроде тоже программно синхроимпульсы генерили

_________________
:dj: https://mastodon.social/@Shaos


11 Jun 2013 15:06
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
ZX-80 и ZX-81 вроде тоже программно синхроимпульсы генерили

Ну может быть программно-аппаратно - точнее будет...
Их идеологию передрали в "Галаксию", а там всё же аппаратная поддержка есть.



PS. Да,... и "Галаксия" всё-же схемотехнически ближе к ZX-80.

_________________
iLavr


11 Jun 2013 15:26
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
vinxru wrote:
Там интересно видео (далее TIA).
По сути, это простейшая схема предназначенная для формирования экрана понга.
TIA не генерирут КСИ. Она вообще понятия не имеет о том, что изображение двумерное. Генерация КСИ возложена на программу.
TIA бесконечно повторяет одну и ту же строку. Какое то изображение получается, только благодаря тому, что процессор от строки к строке меняет значения регистров TIA
....

Столкнулся с этим (этой) TIA - Television Interface Adaptor - совершенно по случаю (искал мануал на 6532, а эта БИС используется в Atari 2600).
Заинтересовало, и вспомнил про этот топик здесь. Даже скачал эмулятор Atari 2600 и попробовал пару игр посмотреть.
Раньше в жизни с Atari 2600 и её играми сталкиваться не приходилось...

По краткому описанию от vinxru из этого топика помнил, что программирование видео на Atari 2600 - дело весьма муторное, поскольку процесс программный, в динамике, и видео-ОЗУ как такового нет.
Но графика при таком аппаратном убожестве даже удивила! :o

Attachment:
POLEPSN.GIF
POLEPSN.GIF [ 2.61 KiB | Viewed 12065 times ]


Коллеги с форума http://zx-pk.ru/ в топике про Atari 2600 ссылаются на статью из Вики:
http://en.wikipedia.org/wiki/Atari_TIA
я прочитал - как-то всё неконкретно очень и педалируются трудности программирования.

Кто-нибуть знает, где почитать материал по TIA - Television Interface Adaptor более доходчиво
с конкретными примерами и желательно на русском
?

Сейчас смотрю материал: Atari 2600 Programming for Newbies


04 May 2015 02:04
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
Поискал сам, вот что удалось найти:

Более полное описание от vinxru на русском:
http://www.adsl.zveronline.ru/projects/articles/2011/06/15/atari_2600/
К сожалению исходник и бинарник примера там утеряны, и хотя там более подробно описано, понятнее чем здесь мне пока не стало... :-?

Цикл статей по программированию Atari 2600, к сожалению на английском:
The TIA and the 6502 (и далее...)
К сожалению, они не разбирают последовательно какой-то пример. Смущает жесткая потактовая привязка 6502 к TIA.
Не совсем понятно, как TIA может тормозить 6502, "когда он сам ей об этом скажет".

Честно говоря, вот эти понятия пока тоже несколько затуманивают общий смысл:
Quote:
Через регистры программист управляет 6-ю объектами: Игровое поле, которое занимает всю строку экрана; два игрока, две мишени, один мяч, которые могут находится в произвольном месте экрана.

Может о всём сразу и не надо заботиться программно, в примерах vinxru этого не видно.

Опять же - "симметрия относительно центра строки" - не наблюдаю её в скриншотах игр и не все из "5 управляемых программно объектов" наблюдаю на скриншотах... :(

Ну и раз уж были упомянуты "регистры TIA", то вот их полное описание (сожалению тоже на английском):
http://alienbill.com/2600/101/docs/stella.html

Наверное придется попереводить... русскоязычных материалов пока не встретилось.


P.S. Cтранно как-то... надеялся, что найдутся какие-либо форумы русскоязычных любителей Атари 2600
(по аналогии с "Денди" - Famicom), но - нет таких...


04 May 2015 06:18
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
БИС 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 соответствующую команду.
Attachment:
tv_timing.gif
tv_timing.gif [ 21.75 KiB | Viewed 12091 times ]

На 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).
Attachment:
_V_Combat_.png
_V_Combat_.png [ 4.18 KiB | Viewed 12091 times ]

На скриншоте игры в танчики на 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 битами в левой и правой половинах эрана либо зеркально симметрично, либо не симметрично следующим образом:
Attachment:
2600_timing_02.png
2600_timing_02.png [ 38.58 KiB | Viewed 12091 times ]

Таким образом весь экран как игровое поле состоит из 20х2=40 блоков на 192 видимых строк для NTSC (242 - для PAL).


09 May 2015 07:09
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
Таким образом, весь экран, как игровое поле, состоит из 20х2=40 блоков на 192 видмиых строк для NTSC (242 - для PAL).

Коды цвета в зависимости от реализуемого телевизионного стандарта выбираются из следующих таблиц:
Attachment:
ColorfulColors.gif
ColorfulColors.gif [ 40.89 KiB | Viewed 12091 times ]

Можно также использовать следующую ссылку: http://www.qotile.net/minidig/docs/tia_color.html

Реальные адреса регистров БИС TIA PF0, PF1, PF2, COLUBK, COLUPF и других задаются в заголовочном файле vcs.h и зависят от базового адреса БИС TIA.

В Atari 2600 карта распределения памяти и устройств ввода-вывода следующая:
Attachment:
_V_MAP_IO.gif
_V_MAP_IO.gif [ 5.49 KiB | Viewed 12091 times ]

БИС 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" в привычном для чтения виде - горизонтальном, а не вертикально, как было показано здесь ранее.


09 May 2015 07:18
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
При написании кода и всех представленных здесь выше материалов я пользовался информацией с сайтов:
Atari 2600 Programming for Newbies, Stella Programmers Guide и FlapPing 2600 Development Journal.

На странице Atari 2600 Programming for Newbies перечислен весь необходимый софт, поэтому я давать
эти ссылки отдельно здесь не буду.

Перейдём сразу к коду:
Code:
; _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 :

Attachment:
_V_Day.gif
_V_Day.gif [ 7.4 KiB | Viewed 12091 times ]

С Днём Победы! С праздником, коллеги!

А ньюансы программирования и графики обсудим позже... :wink:


09 May 2015 07:58
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
Я надеюсь, понятно, что вся эта надпись по сути - специфически нарисованное "игровое поле".
Но, поскольку никаких "знакогенераторов" у Atari 2600 в принципе нет, то заставки с надписями зачастую рисуются именно так.
Если на лету успевать манипулировать цветом фона игрового поля или цветом изображения поля, можно получить и весьма красивые эффекты!
Attachment:
BetaDemo.gif
BetaDemo.gif [ 8.94 KiB | Viewed 12074 times ]

Несколько слов о том, как всё это удобнее "рисовать"...
Существуют on-line "рисовалки" этой псевдографики:
http://alienbill.com/2600/playerpal.html
http://alienbill.com/2600/playfieldpal.html
http://alienbill.com/2600/playerpalnext.html
где можно сразу получить даже ассемблерный код вывода "рисунка".

Но на первый раз мне захотелось разобраться подробнее, как выводятся на экран эти регистры PF0...PF2, и поскольку есть подробная диаграмма в постах выше, то я выполнил надпись в редакторе ПК "Специалист" под эмулятором, скопировал эту графику и, нарисовав пару точечных линеек, в 8-кратном увеличении заполнил "таблицы" кодов вручную.
Attachment:
_V_DayGR.gif
_V_DayGR.gif [ 4.85 KiB | Viewed 12074 times ]


Это довольно легко, если помнить, как выводится эта псевдографика: по байтам - от старшего к младшему, по битам - младшие выводятся на экран первыми.

И есть еще один тонкий момент:
Code:
;
; выводим оставшиеся линии растра цветом фона
; 192(242) - (20 строк + 48 строк + 20 строк + 48 строк)
  ldy #81 ; при превышении - эмулятор меняет TV стандарт
PostMessgLoop:
  sta WSYNC
  dey;
  bne PostMessgLoop
;

Формула в коде приведена в общем-то правильная: 192(242) - (20 строк + 48 строк + 20 строк + 48 строк)
Но интересно, что эмуляторы относятся к этому довольно нестрого, не знаю, уж как реальная Atari 2600... 8)
Я сначала ошибся, а потом уже преднамеренно стал превышать число видимых строк на экран - 198 для NTSC.
До 217 строк только увеличивался вертикальный размер видимого поля.
А вот выше этого значения (если я не ошибся в подсчете) эмулятор решил, что мы перешли в стандарт PAL и изменил цвета. :D
Attachment:
_V_DayPAL.gif
_V_DayPAL.gif [ 7.41 KiB | Viewed 12074 times ]

Вот такие ньюансы и тонкости... и если кого-то заинтересовало программирование 6502 на платформе Atari 2600, то рекомендую вот этот цикл статей: FlapPing 2600 Development Journal.

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


10 May 2015 05:06
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 12 posts ] 

Who is online

Users browsing this forum: No registered users and 6 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.