Архитектура и программирование Mattel Intellivision

Mattel Intellivision — первая в мире игровая приставка с 16-разрядным процессором. Компьютер был разработан американской фирмой Mattel в 1979 году и производился вплоть до 1984 года (выпущено более 3 млн. штук). Intellivision широко известен в США, однако малоизвестен в Европе и совсем неизвестен в России.





В отличии от своего главного конкурента — приставки Atari VCS (2600) с весьма простой архитектурой и 8-разрядным процессором 6502, Mattel пошла по сложному пути, выбрав процессор General Instrument CP1610 (CP1600). В принципе, в то время все были под впечатлением архитектуры PDP-11, поэтому не так уж удивительно, что CP1610 его напоминает (урезана функциональность регистров и меньше режимов адресации).

Как и в случае с компьютером TI-99/4a и процессором TMS9900, 16-разрядность по факту не дала машине преимущества в производительности над 8-разрядными компьютерами с процессорами 6502 или z80, но в плане программирования — интерес машина представляет вполне.

Аналогично другим игровым приставкам, программы здесь хранятся на картриджах, представляющих собой ПЗУ размером от 4 до 24 кб. Кроме того, в самом компьютере также есть небольшое ПЗУ Executive ROM, размером 6кб, в котором хранятся базовые подпрограммы и набор символов и крохотное ОЗУ суммарным размером 1.5кб.
Несмотря на то, что шина также 16-разрядная, это не даёт особого выигрыша, так как ОЗУ (за исключением 240 слов System RAM) — 8-разрядное.

Процессор



16-разрядный процессор General Instrument CP-1610 (разработки примерно 1975 года) работает на частоте около 1 МГц и имеет 8 регистров, из которых общего назначения лишь четыре — R0-R3. Остальные регистры имеют особые свойства:

После обращения к R4, R5 (как хранящим адрес) их содержимое автоматически увеличивается на единицу. Содержимое R6 уменьшается на единицу при чтении из него и увеличивается на единицу при записи.

Другое название регистра R6 — SP (указатель стека). Строго говоря, аппаратного стека в этом процессоре нет, но он может быть достаточно легко организован, поскольку при записи в память инструкцией, в которой адрес хранится в R6, этот регистр автоматически увеличивается на единицу, а при чтении наоборот — уменьшается.

И, наконец, есть регистр R7 — это PC (указатель команд), в который можно записывать как в обычный регистр.

Также существует несколько флагов (Z,S,O,C), не имеющих специального регистра флагов, но доступных через команды GSWD/RSWD.

Набор команд для перемещения данных между памятью и регистрами довольно традиционен (в отличии от, скажем, TMS9900, регистры не отображаются в память, так что операции память-память одной инструкцией не поддерживаются).


MVII #$4000, R1 ; помещает значение $4000 в регистр R1

MVI $200, R0 ; помещает значение из памяти по адресу $200 в регистр R0

MVI@ R3, R1 ; помещает значение из памяти по адресу из R3 в R1

MVO@ R1, R3 ; помещает значение из R1 в память по адресу из R3



Вызовы подпрограмм выглядят типично для процессоров того поколения:


JSR  R5, SUBR	; переход к подпрограмме по адресу SUBR. При этом в R5 помещается текущее значение PC.
         ...

; сама подпрограмма
SUBR:
         ...
MOVR    R5,PC	; помещаем сохранённое значение в PC. Поскольку при чтении из регистра R5 его содержимое автоматически увеличивается, в PC оказывается адрес следующей за JSR инструкции - произойдёт возврат из подпрограммы.



Передача параметров:


JSR  R5, SUBR
WORD 6	; первый параметр
WORD 2	; второй параметр
         ...
SUBR:
MVI@  R5, R0	; помещаем значение 6 (находящееся в памяти по адресу хранящемуся в R5) в регистр R0.
MVI@  R5, R1	; Поскольку R5 при чтении автоматически увеличивается, в R1 здесь окажется значение по следующему адресу, т.е. 2
           ...
JR  R5		; это алиас для команды MOVR R5,PC. Опять же - поскольку R5 снова увеличился, здесь произойдет переход по адреса следующему за WORD 2. Т.е. произойдёт возврат из подпрограммы.


Полезным свойством процессора является возможность производить операции не только над регистрами общего назначения, но и над остальными. Выше это видно на примере с MOVR R5,PC. Существует масса более или менее хитрых трюков, основанных на операциях с PC. К примеру, DECR PC реализует бесконечный цикл. INCR PC пропускает следующую команду.

Для реализации стека используются следующие алиасы:


PSHR R0 = MVO@ R0, R6
PULR R0 = MVI@ R6, R0



Любопытно что, хотя процессор имеет все возможности для полноценной работы с 16-разрядными данными, все его инструкции умещаются в 10 бит (6 зарезервированы для будущих расширений) и ранние ПЗУ картриджей тоже были десятиразрядными, для удешевления. Позднее все ПЗУ стали 16-разрядными, так что теперь всё это уже неважно.
Тем не менее, в ассемблере до сих пор так и осталось понятие «DECLE» — десятиразрядное слово. В более-менее современных программах оно функционально эквивалентно DW (WORD). Аналогом DD (DWORD) является BIDECLE.

Память


Карта памяти включает адреса, по которым доступно ОЗУ, ПЗУ, видеоконтроллеры и периферия (STIC, PSG, Intellivoice).

К ОЗУ относится:

  • 256b 8-разрядного ScratchPad RAM по адресам $0100 — $01EF (используется для переменных, в том числе BIOS)
  • 352b 16-разрядного System RAM по адресам $0200-$035F (здесь находится экранная область BACKTAB, стек процессора и пр.
  • 512b 8-разрядного GRAM для пользовательских образов символов и спрайтов по адресам $3800 — $39FF


К ПЗУ относится:

  • 2k 8-разрядного ПЗУ с символами и псевдографикой по адресам $4000 — $FFFF (а также $3000 — $37FF, $2000 — $2FFF)
  • 4k 10-разрядного ПЗУ Executive ROM (BIOS) по адресам $1000-$1fff
  • 4...24k 10- либо 16-разрядного ПЗУ картриджа по адресам $0400-$0fff


Графика


Видеоконтроллер под названием STIC (AY-3-8900) для тех времён весьма неплох. Он обеспечивает разрешение 160x96 точек (20x12 символов размером 8x8 точек) при 16 цветах и 8 одновременно отображаемых спрайтов. Также имеется аппаратный горизонтальный и вертикальный скроллинг (сдвиг на 1-8 точек).

Графического режима, строго говоря, здесь нет, но в текстовом режиме можно перепрограммировать символы (блоки 8x8 точек, называемые CARDS), указывая в таблице BACKTAB, с какого адреса в GROM или GRAM они определены, а также их цвета (фона и изображения). В GROM хранится 2кб стандартных букв, цифр и псевдографики.



Так же как и, скажем, в Magnavox Odyssey (Videopac), в STIC реализовано прерывание по обратному ходу луча по кадру. Но, к сожалению, точно так же не допускается изменение в это время регистров видеоконтроллера, что исключает различные растровые эффекты, обычные для более поздних систем — типа Commodore 64 или Atari XE/XL.

Существует два видеорежима — FGBG (Foreground Background) и CS (Color Stack). Они отличаются интерпретацией бит в BACKTAB — сколько и какие биты там отвечают за адрес в GRAM/GROM, сколько и какие за цвета.
В режиме FGBG цвета хранятся непосредственно в BACKTAB и их может быть 8 для изображения (биты 0,1,2) и 16 для фона (биты 9,10,13,12). При этом номера блоков, на которые можно ссылаться — ограничены 0-63 для GRAM и GROM (биты 3-8).

В режиме CS цветов может быть 16 для изображенияи и фона, но задаются они хитро — в BACKTAB биты 0, 1, 2 и 12 непосредственно определяют цвет изображения (аналогично FGBG, только цветов в два раза меньше), а вот для фона всё хитрее — цвета берутся из регистров STIC cs0..cs3 ($28-$2B). Если бит 13 для всех блоков сброшен, то цвет фона для всего экрана берётся из cs0. Если же встречается блок, у которого этот бит установлен, то цвет фона этого и последующих блоков берётся из cs1. Если встречается ещё такой блок, где он установлен, то из cs2, а затем из cs3 — циклически. Таким образом, можно выбирать любой цвет из «палитры» всего лишь одним битом. Доступные номера блоков в этом режиме: 0-63 для GRAM и 0-255 для GROM

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

Кроме того, отдельно во всех режимах можно установить цвет рамки и сузить рамку слева и/или сверху (необходимо при использовании регистров скроллинга).

Спрайты (они называются MOB) могут быть размером 8x8 и 8x16. Для каждого в регистрах STIC можно указать цвет, приоритет относительно фонового изображения и номер (не адрес!) блока в GRAM, из которого будет браться содержимое, по аналогии с BACKTAB. Кроме того, любой спрайт может быть аппаратно растянут в 2, 4 или 8 раз и зеркально отражён по горизонтали или вертикали.
Интересно, что визуальное разрешение спрайта по вертикали вдвое выше, чем разрешение изображения (точек из которых составлены, например, символы). Т.е. спрайт 8x8 на самом деле состоит из 8 пикселов по горизонтали и 8 полупикселов по вертикали.
Спрайты размером 8x16 отображают два последовательно идущих в памяти блока 8x8.

Запись в регистры STIC и в GRAM возможна только во время обратного хода луча VBLANK (точнее, там есть два периода — VBLANK1 и VBLANK2, но не будем углубляться).

Существует стандартный подход к смене изображения на экране. Он заключается в установке вектора прерывания STIC на обработчик, который начинает вызываеться в начале VBLANK каждую 1/60 секунды. В обработчике осуществляется запись в регистры STIC (включается экран, устанавливаются цвета рамки, меняются координаты спрайтов и т.п.) и запись в GRAM (отрисовка изображения).

Чтобы успеть проделать все эти операции, используется так называемый shadowing — сначала всё, что нужно записать в GRAM, подготавливается в буфере в ОЗУ, а в обработчике из ОЗУ в GRAM копируется.

Звук

Что касается звука, тут достаточно назвать чип — AY-3-8914 (между прочим, разработки той же компании, что и процессор и видеоконтроллер — General Instrument). Это, фактически, тот же чип, что и в широко известном ZX Spectrum, с теми же возможностями — три канала, генератор шума, ограниченные возможности формирования огибающей. Адресуется чип по адресам $01F0 — $01FF.

Кроме того, достаточно популярным периферийным устройством является синтезатор речи IntelliVoice построенный, как и аналогичные модули для других компьютеров тех времён (Magnavox Odyssey, TI-99/4a), на базе чипа General Instrument SP0256. Поиграться с LPC коэффициентами можно при помощи программы Voice Tinkerer.

Периферия

Для Mattel Intellivision cуществовало некоторое количество периферийных устройств. Как и в случае с другими игровыми приставками, Mattel попыталась придать своей машинке свойства домашнего компьютера — был выпущен модуль клавиатуры. Он имел собственный процессор 6502, ОЗУ 16к, ПЗУ с Бейсиком, встроенный магнитофон и, в итоге, по мощности и себестоимости был сопоставим с самой приставкой. Выпуск модуля был обещан но очень долго откладывался (дошло до судебных исков покупателей к компании) и, в итоге, было выпущено всего лишь 4 тысячи штук.

Конкуренция с Atari VCS (2600) привела к созданию странного устройства под названием System Changer. По сути, это была копия Atari VCS, но разработанная и выпускавшаяся Mattel, вставляющаяся в слот Intellivision и позволявшая, соответственно, запускать игры для Atari VCS.

В 1982 году появился синтезатор речи IntelliVoice, уже упомянутый выше.

Любопытным периферийным устройством был PlayCable. Mattel периодически транслировал игры через телевизионные каналы. Владельцы PlayCable могли их скачивать с ТВ эфира во внутреннюю память модуля и затем играть. Периодически набор транслируемых игр менялся.

Стоит также упомянуть про стандартные пульты управления с диском и кнопками. Это самые обыкновенные джойстики на два направления, на замыкание/размыкание, оформленные в виде дисков (нужно нажимать на края). Большое количество дополнительных кнопок, впрочем, довольно необычно для игровых приставок.

Средства разработки и эмуляции

В те годы, когда Intellivision продавалась, разработка игр для неё была непростым делом. Технически для этого использовался PDP-11 с эмулятором ПЗУ и соответствующим софтом.

В наши времена, конечно, всё куда проще. Как минимум для Win32 существует хороший эмулятор с отладчиком — есть SDK, включающий ассемблер с примерами кода и библиотеками, реализующих наиболее распространённые функции работы с графикой и звуком.

Из эмуляторов на данный момент лучше всего работает jzintv, включащий отладчик.

Ассемблирование и запуск осуществляется так:

as1600.exe -i C:\work\inty\sdk\examples\library -o %1.rom %1.asm

jzintv.exe -v1 -p C:\work\inty\sdk\rom %1.rom

Кроме того, популярен так называемый IntyBasic. Это кросс-компилятор языка Basic в исходный код на ассемблере. В некотором смысле его можно назвать макро-ассемблером, имитирующим синтаксис Бейсика. Он довольно хорош — получается вполне качественный код, не говоря уже о массе примеров и документации.

Исходники выглядят примерно так:

SPRITE 1,0
WHILE COL0 AND $0004
    #Y = #Y - 256
    SPRITE 0,X+8,SPR63
    WAIT
WEND
GOSUB update_score
#Y = #Y + 256
PLAY music_victory
FOR c = 0 to 100
    WAIT
NEXT c

Трансляция в ассемблер осуществляется следующим образом:

IntyBASIC.exe %1.bas %1.asm C:\work\inty\intybasic



Для переноса образа ROM в компьютер я лично приобрёл LTO Flash картридж (образы заливаются по USB, картридж вставляется в Intellivision, где после включения появляется меню со списком).

Интро «Yolka»

С целью проникнуться духом платформы, мною было написано небольшое (6kb) новогоднее интро — Yolka:



Для графики здесь используется режим Color Stack. Ёлки и месяц представляют собой спрайты (для ёлки используется один и тот же спрайт, растянутый в 2-4 раза).
Для имитации снега средняя часть экрана периодически заполняется одним и тем же последовательно увеличивающим свой код символом, каждый из которых представляет собой очередной «кадр» полёта двух снежинок в блоке 8x8. Кадры подобраны так, что стыкуются с такими же соседними.
Горизонтальные полоски, сугроб, сосульки и надпись «HAPPY NEW YEAR» — это всё обычные стандартные символы.
Для перемещение вверх-вниз используется регистр вертикального скроллинга STIC при суженной сверху рамке (этого не видно, поскольку она такого же цвета, как и фон). Т.е. перемещается целиком всё, что есть на экране.
К сожалению, пересъемка с экрана очень искажает цвета и даёт помехи. В реальности всё выглядит куда приличнее.

Что касается звука, то речь (стихи из песни про ёлочку) произносится модулем синтезатора Intellivoice. При этом русские слова составлены из английских фонем (аллофонов).

Исходник можно посмотреть на github

Программное обеспечение

Конечно, это почти исключительно игры — их было выпущено больше сотни, в том числе несколько homebrew игр было выпущено уже в 2000-х.



С демосценой негусто. Есть несколько интро, из которых стоит посмотреть на Spirit авторства Arnauld Chevallier.

Тот же автор в 2003-2004 году написал для Intellivision операционную систему под названием IntyOS. Хотя по понятным причинам (хотя бы из-за отсутствия дисковода) применить на практике её проблематично, тем не менее, это вполне полноценная ОС с оконным графическим интерфейсом, пропорциональными шрифтами, настоящей многозадачностью и API для разработчиков приложений.



Сам Arnauld Chevallier реализовал под свою ОС несколько простых приложений: музыкальный плеер, часы, индикатор загрузки системы и Hello World.

P.S. Спасибо tnt23 за композитный выход

11 комментариев

avatar
Появление такой статьи для меня является очень приятной неожиданностью. Большое спасибо за разбор платформы, и, конечно же, за интро!

Я кода-то делал заметку об этом компьютере в игровом контексте: www.old-games.ru/forum/xfa-blog-entry/mattel-intellivision-i-don-daglou.2864/

Один момент меня в процессе изучения особенно заинтриговал: «данная приставка имела полноценную операционную систему в ROM, под названием EXEC. Функционировала она по событийной и объектно-ориентированной модели. Игровые объекты — структуры данных из картриджа, получали системные оповещения о перемещении или столкновении с другими объектами». Интересно было бы узнать подробности!
avatar
Пожалуйста :) А откуда в статье информация насчёт «полноценной операционной системы в ROM» с объектно-ориентированностью?

Я сейчас полез посмотрел ещё раз в исходники пары игр и не вижу чтобы там вообще обращения к ROM как-то особо использовались.
avatar
Кажется, я эту информацию взял из интервью www.intellivisionworld.com/english/News/2007_02.asp
avatar
В других интервью автор EXEC недвусмысленно говорит о своей OS: www.digitpress.com/library/interviews/interview_david_rolfe.html и www.gooddealgames.com/interviews/int_rolfe.html
avatar
Глянул эти интервью. Гм. Я ни о чём подобном даже косвенно не видел упоминаний во всей документации которую я смотрел пока изучал Inty. Есть у меня подозрение, что люди которые занимались Inty уже в этом веке просто игнорировали всё, что там в этом EXEC было.
Насчёт объектно-ориентированной — обрати внимание на этот фрагмент:
«I created a crude object-oriented programming model, only the “objects” were real screen objects rather than software concepts»
Т.е. похоже она «объектно ориентированная» вовсе не в смысле ООП, а просто он это так назвал.
Короче, не хочу гадать — не знаю :)
avatar
Великолепно написано, спасибо! Теперь намного яснее стало, в чем трудности платформы.

Еще пара видео явно выдающихся игрух:


Полноэкранный скроллинг.


Вышеупомянутый Thunder Castle, очень достойный для того времени графоний.


И немного прекрасного.
avatar
Mud Buggy годная! я-б сыграл
avatar
Модуль клавиатуры с памятью — это и есть ECS? Есть не новое демо 2017 года, где невольно поучаствовало несколько спектрумовских художников, так вот оно как раз под Intellivision с ECS.


Современные игры хороши:
Sydney Hunter and The Shrines of Peril
Space Patrol
Flapee Bird
avatar
> Модуль клавиатуры с памятью — это и есть ECS?
На эту тему везде написано очень мутно. В принципе, есть Keyboard component, а есть ECS. Но кое-где в описаниях их характеристики очень похожи. В реальности пофиг, так как это было выпущено в каких-то единичных количествах. Известной была именно оригинальная Intellivision.
avatar
Мне давно нравится эта игра, как реализовано типичное для ранних 80-х коридорно-лабиринтное псевдо-3D.



К слову, почти наверняка весь чипсет GI, включая процессор CP1610 (в даташите среди возможных применений первыми упоминаются ТВ-игры), видеоконтроллер и наш родной AY-3-8910, были изначально разработаны именно для этой приставки, как заказные чипы, и уже потом пошли в народ.
avatar
Спасибо за интересный материал!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.