Atari 2600

Компьютеры прошлого, не попавшие в другие разделы

Moderator: Shaos

vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Atari 2600

Post by vinxru »

Что то не нашел темы про Atari 2600. Неужели эта платформа никого тут не заинтересовала. В частности, множество интересных игр, имеющих полноценный скролл и 128 цветную графику. И все это работало на 128 байтах оперативной памяти и 4-16 Кб ПЗУ.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Atari 2600

Post by Lavr »

vinxru wrote:...множество интересных игр, имеющих полноценный скролл и 128 цветную графику.
И все это работало на 128 байтах оперативной памяти и 4-16 Кб ПЗУ.
Да - там урезанный 28-ногий 6502 "под маской" 6507. Меня конкретно - не заинтересовал...
А как других - трудно сказать, поскольку вот здесь мы его затронули вскользь.
iLavr
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Там интересно видео (далее TIA).

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

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
a6e3a7efb831.jpg
Главная идея в выше написанном, это то, что на Atari была офигительная графика.

Игры всегда давали 50 fps, даже при полной перерисовке экрана.И 128 цветов на экране. И это требует около 0 байт видеопамяти.
You do not have the required permissions to view the files attached to this post.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

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

Сам 6502 меня заинтересовал, но в моей географической локации оказался
доступен лишь вот в таком сильно-интегрированном виде. Что не совсем
удобно, хотя и интересно...
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

ZX-80 и ZX-81 вроде тоже программно синхроимпульсы генерили
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

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



PS. Да,... и "Галаксия" всё-же схемотехнически ближе к ZX-80.
iLavr
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: Atari 2600 TIA

Post by Stan »

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

По краткому описанию от vinxru из этого топика помнил, что программирование видео на Atari 2600 - дело весьма муторное, поскольку процесс программный, в динамике, и видео-ОЗУ как такового нет.
Но графика при таком аппаратном убожестве даже удивила! :o
POLEPSN.GIF
Коллеги с форума 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.
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: Atari 2600

Post by Stan »

Поискал сам, вот что удалось найти:

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

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

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

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

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

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


P.S. Cтранно как-то... надеялся, что найдутся какие-либо форумы русскоязычных любителей Атари 2600
(по аналогии с "Денди" - Famicom), но - нет таких...
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

TIA-Television Interface Adaptor

Post by Stan »

БИС 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 соответствующую команду.
tv_timing.gif
На 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).
_V_Combat_.png
На скриншоте игры в танчики на 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 битами в левой и правой половинах эрана либо зеркально симметрично, либо не симметрично следующим образом:
2600_timing_02.png
Таким образом весь экран как игровое поле состоит из 20х2=40 блоков на 192 видимых строк для NTSC (242 - для PAL).
You do not have the required permissions to view the files attached to this post.
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

TIA-Television Interface Adaptor (Р.2)

Post by Stan »

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

Коды цвета в зависимости от реализуемого телевизионного стандарта выбираются из следующих таблиц:
ColorfulColors.gif
Можно также использовать следующую ссылку: http://www.qotile.net/minidig/docs/tia_color.html

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

В Atari 2600 карта распределения памяти и устройств ввода-вывода следующая:
_V_MAP_IO.gif
БИС 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.
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Atari 2600 V_DAY

Post by Stan »

При написании кода и всех представленных здесь выше материалов я пользовался информацией с сайтов:
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 :
_V_Day.gif
С Днём Победы! С праздником, коллеги!

А ньюансы программирования и графики обсудим позже... :wink:
You do not have the required permissions to view the files attached to this post.
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Atari 2600 ASM

Post by Stan »

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

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

И есть еще один тонкий момент:

Code: Select all

;
; выводим оставшиеся линии растра цветом фона
; 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
_V_DayPAL.gif
Вот такие ньюансы и тонкости... и если кого-то заинтересовало программирование 6502 на платформе Atari 2600, то рекомендую вот этот цикл статей: FlapPing 2600 Development Journal.

Там от простого к сложному программируют этот самый PONG, под который железо Atari 2600 и было изначально расточено...
Желаю удачи! :wink:
You do not have the required permissions to view the files attached to this post.