← На главную

Timex Sinclair 2068 с несовместимым ROM не осилил Spectrum-софт и умер

03.08.2026 21:39 · hackernews

ZX Spectrum заметно уступал другим платформам по удобству машинного кода. У Commodore были обратно совместимые jump table в KERNAL, MSX — единый стандарт с таблицей вызовов, IBM PC — BIOS. У Spectrum лишь горстка официальных точек входа, поэтому разработчики напрямую дёргали подпрограммы внутри системного ROM. Timex Sinclair 2068 получил несовместимый ROM, и почти никакой софт от Spectrum на нём не работал; это, вероятно, и убило его в США. Но Sinclair, судя по всему, вынес урок: в 128K версии критичные части ROM оставили совместимыми с 48K.

Машинный код загружается с ленты через LOAD ... CODE. Чтобы BASIC не перезаписал программу, память ограничивают через CLEAR. Вызов кода — через USR (он возвращает BC) или RANDOMIZE USR. Есть трюк: BASIC-программа сохраняется так, чтобы после LOAD запускалась с нужной строки, готовила память, грузила бинарник и передавала управление машинному коду.

Память 48K выглядит так: $0000-$3FFF — ROM, $4000-$5AFF — видеопамять, остальное — RAM. На 16K RAM кончается на $7FFF, на 128K ROM и RAM переключаются банками. Регистр IY редактировать нельзя, но его читают и используют как базу системных переменных.

Печать текста — через RST $10. Деление на верхнее и нижнее окна есть и в машинном коде. Шесть байт системных переменных управляют атрибутами: ATTR-T, MASK-T, ATTR-P, MASK-P, P-FLAGS, BORDERCR. Внутренняя процедура TEMPS копирует постоянные атрибуты во временные, CLS чистит экран, но не трогает рамку и сбрасывает вывод в нижнее окно, так что нужен свой хелпер. Скролл по умолчанию спрашивает подтверждение, если не сбрасывать SCR-CT.

Полуграфические символы доступны в диапазоне $80-$8F — все 16 комбинаций без инверсии. Пользовательские знаки — в $90-$A4, указатель на них лежит в UDG по адресу IY+65. Управляющие коды $10-$17 повторяют INK, PAPER, FLASH, BRIGHT, INVERSE, OVER, AT, TAB.

С клавиатурой помогает прерывание: оно обновляет FRAMES, сканирует порты, кладёт символ в LAST-K и ставит флаг. Прямой ввод через порты использует особенность Z80: IN A,(C) и OUT (C),A выставляют весь BC на шину адреса. Kempston-джойстик читается с одного 8-битного порта.

Итоговый пример с картинкой зонтика и текстом занял меньше половины размера аналогичной BASIC-программы. Но звук и сложная графика вроде DRAW пока недоступны — об этом автор расскажет в следующих постах.

Читать оригинал →