Gigatron TTL microcomputer

Недавно наткнулся в просторах интернета на такое достижение ретрокомпьютерной мысли как Gigatron TTL microcomputer.

Официальный сайт: gigatron.io/
Gigatron — это минималистичный компьютер без микропроцессора.

Последняя часть предыдущего предложения может вызвать поначалу когнитивный диссонанс, но всё объясняется просто — процессор этого компьютера реализован на TTL–схемах. То есть ЦП у него представляет собой не одну микросхему, а рассыпан по многим более простым микросхемам типа сумматоров и сдвигов по всей плате. Поэтому в Gigatron–е нет микропроцессора, а есть просто процессор.
Минималистичность в изделии серьёзно довлеет — так, например, порт ввода только один: 8–битный канал IN и порт вывода так же один: 8–битный канал OUT. Изначально он может только немного поморгать светодиодами.
Однако его можно подключить к монитору, хотя и в системе отсутствует специализированный контроллер видео! Видеовывод совершается при этом самим ЦП через порт OUT на VGA–разьём — в результате 8 бит этого порта определяются как VSync, HSync и 3 RGB канала по 2 бита каждый — таким образом получается цветность в 64 RGB–оттенка (довольно грубых).
Кроме того, чтобы пролезть по частотам и размерам видеопамяти картинка там имеет скромное разрешение 160x120 пикселей.

Так как процессор плотно занят на период генерации VGA–сигнала, то ему остаётся не так уж много времени чтобы обрабатывать программу — хуже того нужно выдерживать точные тайминги по обработке видеосигнала. И вот тут возникает несколько причудливых решений.
Во первых, в основную массу времени (период VDraw) процессор занят генерацией видеосигнала, а полезную программу может выполнять только в окнах VBlank — когда луч развёртки «отдыхает».
Во вторых, так как 120 строк по вертикали рендерятся выводом каждой строки 4 раза подряд, что даёт 480 строк VGA, то с одной стороны для «ретро–эффекта» вывод каждой четвертой строки можно подавить, тогда между сканлайнами появятся как бы телевизионные черные полоски — но это полдела — второе дело тут в том, что процессор в эти полоски как раз начинает дополнительно обрабатывать программный код и этим заметно ускоряется в своей работе.
Но для того чтобы это всё заработало нужно чётко контролировать исполняемые инструкции по тактам.
И делается это весьма комплексно и с фантазией.
Процессор гигатрона — это строго 8–битная RISC–машина гарвардской архитектуры (64Кб ROM кода, 64Кб ROM данных к коду и от 32 до 64Кб RAM), каждая инструкция имеет фиксированный размер в 1 байт инструкции и 1 байт непосредственного (immediate) данного (даже если оно не используется). Исполняется любая инструкция за одно и то же время, частота синхрогенератора 6,25 МГц. Инструкций сравнительно немного, даже, например, сдвиги делаются путём lookup–таблиц, всё остальное работает на ADD/SUB/AND/OR/XOR, пересылки данных и условных и безусловных переходах.
Ассемблер для нативного асма имеется (ему и подробному описанию системы команд я посвящу следующую статью), но основное ядро системы написано иначе — на python сделан генератор инструкций в следующем файле: https://github.com/kervinck/gigatron-rom/blob/master/Core/ROMv1.py
Если промотать чуть подальше, то видно как созидаются машинные инструкции (это программа на питоне):
# Simple RAM test and size check by writing to [1<<n] and see if [0] changes.
ld(1);                          C('RAM test and count')
label('.countMem0')
st([memSize], Y)
ld(255)
xora([Y,0])
st([Y,0])                       # Test if we can change and read back ok
st([0]) # Preserve (inverted) memory value in [0]

в результате в файле https://raw.githubusercontent.com/kervinck/gigatron-rom/master/ROMv1.asm генерируется асмолистинг в настоящем синтаксисе ассемблера:
0003 0001  ld   $01         ;RAM test and count
.countMem0:   0004 d601  st   [$01],y
              0005 00ff  ld   $ff
              0006 6900  xora [y,$00]
              0007 ca00  st   [y,$00]
              0008 c200  st   [$00]
              0009 6900  xora [y,$00]
              000a ec0a  bne  $000a
              000b 00ff  ld   $ff


(продаётся Gigatron как комплект для самостоятельной сборки)

а в файле ROMv1.rom формируется двоичный файл к заливке в ROM.
Теперь мы снова возвращаемся к вопросу — как выдерживать чёткие тайминги для VGA–вывода и в то же время выполнять программы. Делается это тем, что на Native Asm написано только корневое ядро системы — собственно код отсчитывающий тайминги, выводящий видеосигнал в VGA и… в перерывах интепретирующий виртуальный код 16–битного Virtual CPU (vCPU)!
vCPU обладает собственной системой команд, по моему немного похожей на семейство Motorola 6800, например вот так выглядит его код: https://github.com/kervinck/gigatron-rom/blob/master/Contrib/at67/vCPU/mididemo64.vasm
; main loop 
erase           LDW     xPos
                DEEK
                ADDW    vbase
                STW     pixels
                LDI     0x00
                POKE    pixels
    
                CALL velocity

как видно уже есть стек, CALL и 16–битные команды.
Интерпретируя код на vCPU ядро способно как раз отслеживать сколько тактов потрачено на его выполнение и в нужные моменты прерываться на подпитку VGA.
Так же на vCPU написан какой то дикий язык высокого уровня — Gigatron Control Language (Gcl) и основная масса примеров и игр пользовательского софта написана уже на нём.
По синтаксису, имхо, Gcl — это какой то мозгоразрывающий гибрид лиспа с фортом: https://github.com/kervinck/gigatron-rom/blob/master/Apps/Racer_v1.gcl
[def { Wait -- Wait Delay number of frames (range 1..255) }
  \frameCount, Delay+ 255& tmp=
  [do \frameCount, tmp- if<>0loop]
  ret
] Wait=

Как я понял существует единый компилятор для нативного асма, vCpu и Gcl в одном — он там же в исходниках лежит.
Тем не менее ядро генерируется (видимо исторически) программой на питоне которая генерирует код на нативном 8–битном машинном коде, который интерпретирует виртуальный байткод 16–битного vCPU, который исполняет скомпилированные программы на языке высокого уровня GCL!

Довольно забавный, по моему, получился зверёк.

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

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.