
Начитавшись статей о сверхкомпактных языковых моделях — вроде тернарной нейронки на C# — я задумался: а заведется ли такая модель на любимом компьютере моего детства? При этом хотелось, чтобы это был не просто proof-of-concept, а приложение, ответа которого человек будет в силах дождаться.
Так появился HippoGPT — крошечная языковая модель, которая сочиняет детские сказки на обычном Spectrum 128K. Обучена она на TinyStories — корпусе простых англоязычных сказок для малышей. Про Спектрум там нет ни слова, поэтому пришлось добавить полторы тысячи сгенерированных историй про Speccy — с кассетами, текстами ошибок и Dizzy. Запустить можно прямо в браузере, на странице ZX Art. Не ждите слишком многого, но оно… работает!
Дисклеймер: код приложения написан с помощью Claude Opus. Проект задумывался как ответ на вопрос «возможно ли это?», а не как повод освежить навыки программирования на ассемблере Z80.
Для тех, кто не застал Спектрум
ZX Spectrum — британский домашний компьютер 1982 года, а у нас в 90-е его массово собирали в виде клонов промышленного производства типа «Пентагона» или безымянной кустарщины по чертежам из журналов. Его процессор Z80 вышел в 1976 году и производился 48 лет.
Z80 оказался настолько универсальным, что его ставили почти везде, где нужен был дешевый и простой процессор. Как пишут на Old-Games.ru, это автоматические определители номера, процессоры RFID-карт, стиральные машины, скороварки и даже ракеты. У меня самого в конце 90-х стоял телефон «Русь» с АОНом — тоже на Z80.
Для нейросети это суровая машина: 3,5 миллиона тактов в секунду и 128 КБ памяти. Ни плавающей точки, ни даже умножения — только сложение и сдвиги.
Как измерить ум GPT-бегемота
Для того чтобы выбрать подходящие параметры сети, нужно было как-то измерить «осмысленность» текста. Представьте игру «угадай следующую букву»: модель читает настоящую сказку и перед каждой буквой задает вопросы «да или нет», пока ее не угадает. Среднее число таких вопросов на букву и называется «биты на символ». Наугад среди 64 символов выбранного шрифта нужно шесть вопросов, а модель, которая что-то поняла в языке, обходится одним-полутора. Чем меньше, тем умнее.
На глаз разница в десятые доли бита плохо ощущается, поэтому во втором столбце та же цифра в словах. Она показывает, из скольких одинаково вероятных слов модель как будто выбирает каждое следующее слово. Меньше вариантов — связнее текст. Для масштаба в таблице есть и Qwen3-8B, которую я прогнал на тех же сказках, что и Хиппо.
Модель |
Бит на символ |
Выбирает слово из |
|---|---|---|
По буквам |
1,38 |
116 |
По токенам |
1,11 |
45 |
HippoGPT: веса по 4 бита и сказки про Спекки |
1,26 |
77 |
Для сравнения: Qwen3-8B, 8 млрд параметров |
0,67 |
10 |
Главный скачок при тестировании дал переход с букв на токены — частые куски слов вроде « the» или «ing». Словарь из 512 таких токенов сократил выбор со 116 слов до 45. Сжатие весов до 4 бит стоило немного, а без него веса просто не влезли бы в память. В итоге у модели два слоя, около 120 тысяч параметров и память на 64 токена назад.
Умножение без умножения
Нейросеть — это в основном умножения: чтобы написать один токен, HippoGPT перемножает около 119 тысяч пар чисел. Если решать в лоб, Z80 умножает программно, циклом из сдвигов и сложений, и тратит на каждое около 300 тактов. Одни умножения заняли бы 11 секунд на токен или 20 секунд на слово.
Выручила хитрость в духе школьной таблицы умножения. Весов в модели больше ста тысяч, но у каждого всего 15 возможных значений — от −7 до 7. Поэтому каждое входное число достаточно один раз умножить на эти 15 значений и записать ответы в табличку. Дальше умножать не нужно: для каждого веса ответ просто берется из таблички и прибавляется к сумме. На это уходит около 52 тактов.

Ближайший конкурент, умножение через таблицу квадратов, вдвое медленнее: ему на каждом шаге нужны два чтения из таблицы и вычитание. Зато квадраты пригодились во внимании, где меняются оба множителя: a·b = (a² + b² − (a − b)²) / 2. Суммы a² и b² по вектору считаются один раз, так что на каждую пару чисел остается одно чтение (a − b)² из таблицы. Экспоненту, корень и выбор следующего слова тоже заменили таблицами: в этой модели Спектрум почти не считает, а в основном подглядывает.
Веса заняли шесть банков памяти по 16 КБ из восьми. Казалось бы, 120 тысяч весов по 4 бита — это всего 60 КБ, но самые нагруженные матрицы пришлось хранить по байту на вес: так их быстрее читать. И первая раскладка все равно не сошлась: в расчетах просто забыл таблицу эмбеддингов на 32 КБ. Спасли полубайты — по два 4-битных веса в каждом байте самых больших таблиц.
Как проверить, что Спектрум не ошибается
Рядом с моделью живет ее точная копия на Python, которая считает в тех же целых числах, с теми же сдвигами и округлениями. Код для Z80 сверяется с ней в симуляторе до бита, и сказка из 200 токенов совпадает до последней буквы.
Две ошибки, найденные случайно
Сначала не срабатывал BREAK: клавиатура опрашивалась между тяжелыми расчетами, и короткое нажатие проваливалось в паузы до четверти секунды. Опрос пришлось встроить прямо в умножение матриц, и теперь самая длинная пауза — 47 миллисекунд. А опечатка «r type loading» вскрыла баг посерьезнее: Спектрум резал введенную фразу на токены не так, как модель видела при обучении, и понимал ее заметно хуже. После исправления фраза «R Tape loading error» больше не продолжается нелепым «errording».
Итоги в цифрах
Что |
Значение |
|---|---|
Параметры |
~120 тысяч, по 4 бита |
Скорость |
~4 секунды на токен |
Память |
112 КБ |
Машины |
Spectrum 128K, Pentagon |
Качество |
выбирает слово из ~77 (1,26 бита на символ) |
Признаюсь, я ожидал чуть-чуть большего. Связную и осмысленную сказку получить вполне можно — но, по моим ощущениям, лишь примерно в одном случае из десяти. В остальных девяти Хиппо бодро начинает, а через пару фраз путает героев, ходит по кругу и теряет нить. Что ж, не очень умный — зато работает.
Цель была полторы-две секунды на токен, вышло вдвое медленнее: текст печатается со скоростью бабушки, набирающей сообщение на телефоне без очков — слово примерно за восемь секунд. Все проверено в эмуляторах. Попробовать HippoGPT можно на ZX Art прямо в браузере — или скачать ленту и диск для своего Спектрума.
UPD: Сделал версию 1.1. Для машин с памятью от 256K (Scorpion ZS-256 и 1024, Pentagon 512, Profi и др.) появилась версия 256. В ней первые 16 токенов сказки, то есть затравка, навсегда остаются в памяти внимания. Тему затравки она держит заметно лучше, а Тим с радугой влезают в чужие сказки в четыре раза реже. Пишет она почти так же быстро, около 4,2 секунды на токен. Обе версии лежат на одной дискете TRD и SCL. Загрузчик сам определяет машину по тому, как она переключает страницы памяти, и грузит нужную версию, а внизу экрана видно «v1.1 128K» или «v1.1 256K». Дискета лежит на ZX Art, а исходники, обученные модели и подробная инструкция по сборке и обучению открыты на GitHub: https://github.com/Chegleyev/HippoGPT.
Комментарии (12)

WannaCode
25.10.2026 21:08В остальных девяти Хиппо бодро начинает, а через пару фраз путает героев, ходит по кругу и теряет нить. Что ж, не очень умный — зато работает.
Ну это почти уровень GPT-2 на оборудовании из 80-х так-то. Сколько еще там есть места для оптимизации, интересно.

NutsUnderline
25.10.2026 21:08Рядом с моделью живет ее точная копия на Python, которая считает в тех же целых числах, с теми же сдвигами и округлениями.
и тут я подумал - здесь по сути очень продвинутый генератор псевдослучайных чисел, наподобие тех самых 10000 мартышек с печатными машинками. более простые версии подобных генераторов генерировали слова raxala и огромный лабиринт в игрушке explorer

voldemar_d
25.10.2026 21:08А если взять ZX Next в версии с эмуляцией Z80 на частоте 28 МГц и 4 МБ памяти?

discourage Автор
25.10.2026 21:08На Next, помимо частоты и объема ОЗУ, есть еще и аппаратное умножение: одно умножение там занимает 8 тактов, а у меня шаг «умножить и прибавить» на таблицах стоит 52. Здесь можно было бы почти безболезненно увеличить контекстное окно до 256 токенов (сейчас Hippo помнит только 64). Думаю, абзац связного, хоть и простого текста более чем реален. В моих экспериментах любое заметное на глаз улучшение генерации стоило либо полсекунды на токен, либо 20–30% ОЗУ. Можно представить, сколько таких шажков можно сделать на Next, но это уже совсем другая лига. Мне был интересен именно обычный 128K, где нет ни памяти, ни умножения.

voldemar_d
25.10.2026 21:08Вроде как пишут, что один такт умножение занимает.
Скрытый текст
В ZX Spectrum Next для умножения используется инструкция MUL. Она выполняет беззнаковое 8×8-битное умножение: перемножает значения из 8-битных регистров D и E, а 16-битный результат сохраняет в паре регистров DE.
Ключевое преимущество перед стандартными возможностями оригинального Z80: эта инструкция выполняется за один такт (за 8 T-состояний). В оригинальном ZX Spectrum Spectrum такой аппаратной поддержки не было — умножение реализовывалось программно, в цикле, что занимало значительно больше времени.
Как это использовать
В проектах вроде z80nextlibrary есть готовые подпрограммы умножения, которые напрямую задействуют MUL для максимальной скорости. Например, для 8×8-битного умножения можно вызвать функцию, которая подставляет эту инструкцию, что даёт прирост производительности примерно на 85% по сравнению с обычными реализациями для стандартного Z80.
При этом важно понимать: MUL работает только с 8×8-битными числами. Для 16-битного умножения (например, 16×8 или 16×16) всё равно придётся писать или подбирать готовую подпрограмму.
Если вы пишете ассемблерный код под Spectrum Next и нужно быстро перемножить числа — смело ориентируйтесь на эту инструкцию.
Спасибо, не знал про такое. Интересно, много ли игр для Next, которые этот MUL используют?

aGGre55or
25.10.2026 21:08Next это FPGA-эмулятор стоящий как крыло самолёта и со своими ни с чем не совместимыми изобретениями. Интересен он только эмуляторщикам и 3,5 реальным пользователям в РФ. Однако есть отечественные клоны спектрума с памятью от 256К до 4М, которыми действительно пользуются ретро-компьютерщики. Поэтому увидеть релизы под разные объёмы памяти было бы интересно. HippoGPT потрясающе работает, но сказки вообще никак нерелевантны вводу)) Возможно при большем числе токенов и весов, это изменится?
Рядом с моделью живет ее точная копия на Python, которая считает в тех же целых числах, с теми же сдвигами и округлениями. Код для Z80 сверяется с ней в симуляторе до бита, и сказка из 200 токенов совпадает до последней буквы.
К сожалению, в статье нет ссылки на репозиторий где это можно было бы увидеть. Идею HippoGPT можно было бы развить, но для этого нужно чтобы было что развивать.
Две ошибки, найденные случайно
Я дискетировал в scl выложенный tap-файл там же на ZX-Art, а затем увидел что уже есть ваш оригинальный trd существующий отдельно. По хорошему его надо слить с основным релизом. Для пользователей в РФ интересен, конечно, только TR-DOS, а это trd/scl. У нас даже были изобретены эмуляторы дисковода с SD-карты, эволюционировавшие в дальнейшем в Gotek продаваемый китайцами на Aliexpress. Оказавшийся полезным в итоге, не только для TR-DOS.
И здесь есть два момента: грузить картинку "как есть" можно, но не модно. Потому что видно как она прорисовывается при загрузке и это лишнее ожидание. Поэтому запаковал её с эффектом и она стала весить 1367 байт, т.е. 6 секторов на диске вместо 27. В коде вероятно есть ещё ошибки. В основном коде по адресу #6DC5 стоит CALL #6E96, это вызов подпрограммы обработки температуры, которая начинается с #6E46. Таким образом переходит переход в середину этой подпрограммы, а не в её начало. По итогу всё работает, но выглядит странно и могло плохо закончиться, потому что влетает в POP HL:
6E94: 32 7E 76 LD (#767E),A ; восстановить цвет 6E97: E1 POP HL 6E98: 22 7F 76 LD (#767F),HL ; восстановить указатель 6E9B: C9 RET
discourage Автор
25.10.2026 21:08Однако есть отечественные клоны спектрума с памятью от 256К до 4М, которыми действительно пользуются ретро-компьютерщики
У самого когда-то был Profi 512 :-) Хорошо, я попробую собрать несколько прототипов под разные конфигурации Scropion 256 / Profit 512 и “турбо-кнопке” с 7МГц. Попробую поиграться с контекстным окном, размерами таблицы эмбеддингов и весами. Выберу, где будет самый приятный результат.
К сожалению, в статье нет ссылки на репозиторий где это можно было бы увидеть.
Ок, выложу на Github после экспериментов со Scorpion/Profi. По дискете услышал

discourage Автор
25.10.2026 21:08Сделал версию 1.1. Для машин с памятью от 256K (Scorpion ZS-256 и 1024, Pentagon 512, Profi и др.) появилась версия 256. В ней первые 16 токенов сказки, то есть затравка, навсегда остаются в памяти внимания. Тему затравки она держит заметно лучше, а Тим с радугой влезают в чужие сказки в четыре раза реже. Пишет она почти так же быстро, около 4,2 секунды на токен. Обе версии лежат на одной дискете TRD и SCL. Загрузчик сам определяет машину по тому, как она переключает страницы памяти, и грузит нужную версию, а внизу экрана видно «v1.1 128K» или «v1.1 256K». Дискета лежит на ZX Art, а исходники, обученные модели и подробная инструкция по сборке и обучению открыты на GitHub: https://github.com/Chegleyev/HippoGPT.

aGGre55or
25.10.2026 21:08Это настолько быстро произошло и настолько подробно описано, что у меня просто слов нет. Большое вам спасибо за эту работу.

NutsUnderline
25.10.2026 21:08Next это FPGA-эмулятор стоящий как крыло самолёта и со своими ни с чем не совместимыми изобретениями. Интересен он только эмуляторщикам
да, это чистерство. там можно не только умножение но и нейромодуль встроить. зачем только посредник в виде z80. Однако эмулируют его вроде уже и на относительно недорогом tang nano
эволюционировавшие в дальнейшем в Gotek продаваемый китайцами на Aliexpress
так вот откуда для него кастомные прошивки. но вообще как по мне для zx эмулировать надо сразу BГ93 - это опять же ненужный физический посредник
AlexLeonov
Самое лучшее безумие этого года )))