Pull to refresh

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

Reading time 9 min
Views 5.8K
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 за композитный выход
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+28
Comments 7
Comments Comments 7

Articles