Какой процессор используется в спектре zx

Обновлено: 01.07.2024

Как я упоминал в предыдущем посте, душой микрокомпьютера ZX Spectrum 48K (какой сюрприз) является ЦП Z80. Очевидно, вам нужно эмулировать ЦП, чтобы приблизиться к полноценному эмулятору Спектрума. Хотите верьте, хотите нет, но эмуляция ЦП не представляет большой сложности по сравнению с другими устройствами машины (генерация видеодисплея, эмуляция ленты и т. д.), но она трудоемка из-за богатого набора инструкций Z80.

Прежде чем перейти к деталям реализации, которые я использовал в SpectNetIde, я дам вам краткий обзор Z80A. Пожалуйста, не рассчитывайте на то, что эта статья станет учебным пособием по изучению процессора. Я сосредоточусь на аспектах, которые являются наиболее важными с точки зрения дизайна и разработки эмулятора.

Производитель Z80A, Zilog, — американский производитель микроконтроллеров. Его самый известный продукт — семейство чипов Z80. Из-за своей простоты с точки зрения аппаратного взаимодействия он стал популярным сразу после своего первого выпуска в 1976 году.

Регистры

Как показано на рис. 1, он имеет 8 основных регистров ( A , B , C , D , E , H , L и F ) с соответствующими им альтернативными регистрами ( A' , B' , C' , D' , E ', H', L' и F'); два индексных регистра (IX, IY); указатель стека ( SP ); программный счетчик ( PC ) и два специальных регистра I и R .


Рисунок 1: Регистры ЦП Z80A

Регистр A называется аккумулятором. С точки зрения программирования этот регистр является наиболее гибким, так как он может быть операндом большего количества инструкций, чем любой другой. Регистр F представляет собой набор 1-битных флагов, которые индивидуально устанавливаются инструкциями Z80. ЦП может использовать состояние флагов в качестве условий для инструкций, изменяющих ход выполнения программы.

Альтернативный набор регистров может служить резервным для основных регистров. Инструкция Z80 EXX меняет местами основную и альтернативную пары.

ПК (счетчик программ) указывает на место, где ЦП должен прочитать следующий байт кода операции для выполнения. SP означает указатель стека. Как следует из названия, он указывает на вершину стека, используемого для вызовов подпрограмм и значений, сохраняемых в стеке.

Есть два специальных регистра, I и R . I (Регистр адреса страницы прерывания) используется в определенном режиме прерывания в качестве старших восьми битов ячейки памяти, которая служит адресом подпрограммы прерывания — устройство, запрашивающее прерывание, предоставляет младшие восемь битов. R (регистр обновления памяти) содержит счетчик обновления памяти, позволяющий использовать динамическую память с той же легкостью, что и статическую память.

Сигналы управления

ЦП использует управляющие сигналы для связи с внешними устройствами. И наоборот, он получает сигналы, когда внешний мир хочет уведомить ЦП о событиях. Z80 имеет тринадцать управляющих контактов, 8 из них отправляют, пять из них принимают сигналы. С точки зрения эмулятора, эти три сигнала, поступающие на ЦП, необходимы:

  • INT : запрос прерывания от устройств. Этот запрос можно отключить (включить) с помощью инструкций ЦП.
  • NMI: запрос немаскируемого прерывания (не может быть включен или отключен)
  • RESET : немедленно перезагружает ЦП, как если бы мы выключили питание, а затем снова его включили.

Инструкции

ЦП Z80 имеет более 1000 инструкций. Наиболее часто используемые имеют однобайтовый код операции. Есть менее часто используемые инструкции, которые используют два или три байта кода операции. Кроме того, инструкции могут иметь аргументы. Каждая инструкция начинается с кода операции. Эти коды явно сообщают ЦП, есть ли у инструкции аргументы или ее код состоит из нескольких байтов.

  • Код операции $ED — это префикс, означающий, что второй байт определяет расширенную операцию.
  • $CB — еще один код префикса. В этом случае второй байт именует инструкцию по обработке битов.
  • $DD и $FD — это префиксы для операций с индексами. Второй байт описывает инструкцию. $DD означает, что IX , $FD означает, что в инструкции должен использоваться индексный регистр IY.
  • Когда префикс $CB следует за префиксами $DD и $FD, третий байт именует инструкцию по обработке битов.
  • При написании кода Z80 мы используем язык ассемблера Z80 для определения инструкций для выполнения. Компилятор транслирует эти самые инструкции в эквивалентные им машинные коды, в коды операций и аргументы соответственно.

Давайте рассмотрим несколько примеров:

Недокументированные инструкции и регистры

В официальной документации Z80 — не знаю почему — опущены сотни операций, которые может выполнять Z80. Многие из них связаны со старшими и младшими восемью битами индексных регистров IX и IY (называемых XL , XH , YL и YH , или иногда IXL , IXH , IYL и IYH ).

Примечание. К счастью, в Интернете можно найти надежные документы, в которых содержатся недостающие сведения. Вы должны знать, что многие игры для ZX Spectrum используют эти недокументированные инструкции, поэтому эмулятор высокой точности должен их реализовывать — это то, что делает и SpectNetIde.

На рисунках 2, 3, 4, 5 и 6 показан весь набор инструкций Z80. Красноватые ячейки — это изначально недокументированные инструкции ЦП. Обратите внимание, что на Рисунке 5 и Рисунке 6 показаны инструкции с индексом IX. Вы можете использовать те же инструкции с префиксом $FD для регистра IY.






Время

Если вы собираетесь написать эмулятор ZX Spectrum — или любой компьютерный эмулятор — вы скоро узнаете, что самое главное — это позаботиться о времени. Без этого вы не сможете создать высокоточную эмуляцию реального оборудования.

Примечание. В следующих статьях этой серии я буду рассматривать отдельные аспекты тайминга почти в каждом посте.

ЦП Z80 выполняет инструкции в виде серии последовательных машинных циклов. Чтобы понять, как это работает, на рис. 7 показаны подробные временные характеристики инструкции INC (HL). INC (HL) увеличивает значение, хранящееся по адресу памяти, указанному парой регистров HL.

Как показано на рисунке, ЦП выполняет эту инструкцию за четыре машинных цикла:

  • M1: ЦП считывает код операции из адреса памяти, указанного ПК (счетчик программ). Логика выполнения понимает, что означает эта инструкция и как ее обрабатывать.
  • M2: ЦП считывает содержимое адреса памяти, указанного HL, в некоторый внутренний регистр ALU, чтобы быть готовым к его обработке.
  • M3: ЦП увеличивает значение внутреннего регистра АЛУ.
  • M4: ЦП записывает увеличенное значение обратно в адрес памяти, на который указывает HL.


Рисунок 7: Временная диаграмма инструкции INC (HL)

Ну, это краткое описание циклов M1…M4 не упомянуло многих тонких деталей работы. Реальное исполнение сложнее. Диаграмма показывает, что машинные циклы используют более одного тактового импульса (Т-цикла) для выполнения своих задач. Самый длинный — М1 с четырьмя Т-циклами. Чтение и запись в память занимают соответственно три Т-цикла. Самый быстрый шаг — это приращение, он занимает один такт.

Цикл M1 особенный, поэтому я хотел бы добавить о нем больше деталей:

Каждая инструкция начинается с получения кода операции. Если код имеет префикс (например, в случае расширенных, индексированных инструкций и инструкций по манипулированию битами), каждая выборка кода операции аналогична. Цикл M1 принимает за T-циклы T1, T2, T3 и T4. Вот что происходит во время M1:

  • Когда начинается T1, ЦП помещает содержимое ПК в адресную шину. Примерно через полтакта ЦП подписывает управляющий сигнал MREQ (Memory Request) в тандеме с RD (Read).
  • В T2 память отвечает, помещая содержимое памяти, адресованное ПК, на шину данных. (К этому времени адрес памяти стабилизируется на адресной шине.)
  • Как только начинается Т3, по переднему фронту тактового сигнала ЦП считывает содержимое шины данных — код операции попадает в один из внутренних регистров. ЦП отменяет сигналы RD и MREQ и помещает младшие семь бит R (Refresh Page Register) в младшие семь строк адресной шины. В то же время ЦП помещает содержимое I (регистра прерывания) в верхние восемь строк адресной шины и подписывает RFSH (сигнал обновления).
  • Во время T3 и T4, когда адрес страницы обновления стабилизируется на адресной шине, ЦП снова подает сигнал MREQ. Комбинация MREQ и RFSH позволяет чипам DRAM обновлять содержимое памяти адресуемой страницы.
  • К концу T3 ЦП анализирует считанный код операции и готовится к последующим машинным циклам. Многие операции просты и не требуют дополнительной памяти или доступа к вводу-выводу. ЦП выполняет эти операции во время T4.
  • К концу T4 MREQ, RD (и немного позже RFSH) возвращаются в неактивное состояние. ЦП увеличивает последние семь бит R, сохраняя при этом самый старший бит.

Как видите, машинный цикл M1 имеет большое значение, он отвечает за обновление памяти DRAM.Без этого периодического цикла обновления память забыла бы свое содержимое. Просто чтобы иметь представление об этом времени, каждая страница должна обновляться каждые 64 миллисекунды или меньше.

Чтобы периферийные устройства и другие устройства знали, что ЦП выполняет M1 , Z80 имеет системный управляющий сигнал M1 , который становится активным во время T1 и T2 .

Может случиться так, что во время операций с памятью и вводом-выводом процессору потребуется подождать, пока память или устройство подготовятся к передаче данных. ЦП имеет входной сигнал WAIT; устройства могут использовать его, чтобы подписать, что они не готовы позволить ЦП выполнять операцию чтения или записи.

Примечание. Позже, в другом посте, вы узнаете, что диапазон памяти от 4000 до 7 FFF в ZX Spectrum 48K оспаривается. Иногда, когда ЦП хочет прочитать или записать память, он вынужден ЖДАТЬ , так как ULA имеет приоритет, чтобы не прерывать поток электронов в катодной ванне.

Машинные циклы чтения и записи памяти, чтения и записи ввода-вывода имеют свои подробные временные параметры — аналогично M1 . Здесь я не буду их детализировать. Если вам интересно, ознакомьтесь с официальной документацией Zilog Z80 по сигналам INT и NMI. NMI означает немаскируемое прерывание. Когда ЦП получает запрос NMI, он выполняет процедуру прерывания, начиная с адреса $0066.

INT вызывает маскируемое прерывание. Маскируемый означает, что вы можете отключить (и снова включить) его с помощью программного обеспечения с помощью инструкций DI (отключить прерывание) и EI (разрешить прерывание) Z80 соответственно.< /p>

Z80 предлагает три режима обработки прерываний. Вы можете активировать их с помощью инструкций IM 0 , IM 1 и IM 2 :

Конечно, ЦП не может спрятать текущую операцию в тот момент, когда поступает запрос на прерывание. Z80 определяет временной цикл запроса/подтверждения прерывания:

Далее: Эмуляция процессора Z80A

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

Футболки ZX Spectrum!

см. подробности

Футболки ZX81!

см. подробности
< /p>

Готовы быстрые футболки!

см. подробности
< /p>

Футболки Arcade Cherry!

см. подробности
< /p>

Футболки с джойстиком Atari!

см. подробности

Футболки со спиральной программой!

см. подробности
< /p>

Футболки Battle Zone!

см. подробности

Футболки корабля Vectrex!

см. подробности

Футболки Moon Lander!

см. подробности

Футболки с генератором лабиринтов C64!

см. подробности

Футболки с изображением элитного космического корабля!

см. подробности
< /p>

Футболки Competition Pro Joystick!

см. подробности

Atari ST бомбит футболки!

см. подробности< бр />

Футболки Пак Пак Монстр!

см. подробности

Футболки с кодом BASIC!

см. подробности
< /p>

Векторные футболки с кораблями!

см. подробности

Футболки Pixel Adventure!

см. подробности

Прорывные футболки!

см. подробности

Sinclair ZX Spectrum был одним из самых популярных европейских компьютеров 80-х годов. Были запущены две модели: одна с 16 КБ ОЗУ и одна с 48 КБ ОЗУ.

Одной из самых «интересных» характеристик является клавиатура! Некоторые клавиши имеют более пяти (!) функций! БАЗОВЫЕ ключевые слова нельзя вводить побуквенно, вместо этого приходится использовать функциональные клавиши. Для этого компьютера было разработано множество периферийных устройств и программ. Кажется, было выпущено несколько моделей этих компьютеров (минимум 3), но технических подробностей о них у меня нет. В 1984 году он был заменен Spectrum +, а в 1985 году - Spectrum 128.

Алан Уилсон сообщает нам:

В 16-килобайтной версии компьютера были загружены только 16-килобайтные чипы оперативной памяти, а в 48-килобайтной версии оба банка были заполнены.

Чтобы удержать цены на низком уровне, Sinclair использовал неисправные микросхемы 64 КБ (внутренние 2 x 32 КБ). Все чипы в банке ОЗУ на 32 КБ должны были работать с одной и той же половиной чипов на 64 КБ. На печатную плату была установлена ​​ссылка для выбора первой половины или второй половины.

С помощью нескольких логических микросхем экспериментатор мог получить доступ к неисправному банку 32 КБ.

Я думаю, что Spectrum действительно был компьютером, который вызвал революцию. C64 был недоступен большинству людей, но почти каждый мог позволить себе Spectrum. Он имел графику с высоким (256x192) разрешением и достаточно памяти для создания серьезных игр. Поскольку он был достаточно дешевым, он стимулировал рынок игр больше, чем любой другой компьютер, и только недавно количество компьютерных игр сравнялось с количеством игр для Spectrum. В то время быть гиком было очень не круто, а программировать компьютеры было уделом ботаников, а быть ботаником означало принадлежать к группе неприкасаемых в социальном плане. Удивительно видеть, насколько мир изменился с тех пор, и теперь все хотят думать, что они компьютерщики. Работа с ZX Spectrum научила меня проектировать аппаратное обеспечение на базе Z80, благодаря чему я получил свою первую работу на заводе R$D по разработке компьютеров для управления платежными системами видеоигр.

Привет! Я наткнулся в сети на пару настоящих красавцев, Issue One 16K Spectrum, который выглядит так, как будто я никогда не видел такого хорошего, как раньше. Тот же самый продавец, кажется, раскопал пару настоящих жемчужин с точки зрения коллекционной ценности, в том числе оригинальную литературу Синклера, с которой я раньше не сталкивался. Взгляните, посмотрите, что вы думаете:

SE под кодовым названием Chloe представляет собой модифицированный Timex TC2048. Модификации были определены Эндрю Оуэном, а разработаны и реализованы Яреком Адамски. В каждом разделе вы можете найти ссылки на дополнительную информацию в других разделах этого часто задаваемых вопросов или на другие справочные документы.

Технические характеристики:
Технические характеристики ZX Spectrum SE:

Если вы были очень взволнованы, когда Zilog анонсировала eZ80, вам следует следить за развитием проекта Sparky Ричарда Келша. Он использует собственную 24-битную версию Basic, частично основанную на Sinclair Extended Basic. Я думал, что буду первым, кто будет использовать Sinclair Extended Basic на подлинном оборудовании, но Гарри Ланкастер, разработчик ZX Spectrum +3e, опередил меня. Я работаю с ним над тем, чтобы Sinclair Extended Basic поддерживал ResiDOS — операционную систему интерфейса ZXATASP IDE. Мы также рассматриваем возможность объединения аспектов +3e и Sinclair Extended Basic.

    Процессор
    Основной процессор в SE работает на частоте 3,528 МГц, а не 3,5 МГц в 48K Spectrum. Временные интервалы линии развертки не изменяются, поскольку SCLD использует счетчики, а не циклы времени. Так же, как и в обычном спектре 48 K, имеется 224 T-состояния на строку развертки и 312 строк развертки перед телевизионным изображением.

Горизонтальное MMU Timex рассматривает ОЗУ как три банка памяти; Банки HOME, DOCK и EX.

Главный банк — это обычная область памяти Spectrum. Верхние 32 КБ не оспариваются, но область экрана 16 КБ ниже этого оспаривается. Банки DOCK и EX накладываются на этот банк, но перелистывание области экрана не изменяет ОЗУ, используемое ULA. Это означает, что можно настроить экран и вывести его на страницу.

Выгрузка памяти осуществляется в банках по 8 КБ либо из банка DOCK, либо из банка EX, но эти банки являются взаимоисключающими — вы не можете выполнять подкачку в банке из обоих одновременно. Бит 7 порта 0xff определяет, какой банк использовать (0=DOCK, 1=EX-ROM). Порт 0xf4 определяет, какие банки должны быть загружены, причем каждый бит относится к соответствующему банку (0-7 или 0'-7'). Когда память выгружается, прерывания должны быть отключены, а стек должен находиться в области, которая не будет меняться.

В TC2048 BASIC содержится в ПЗУ объемом 16 КБ, а банки 0-7 и 0'-7' обычно недоступны, в то время как в TS2068 часть BASIC хранится в ПЗУ 8 КБ в банке 0' и картриджи, подключенные к док-станции, используют банки 0-7.В SE каждый из этих банков подключен к 64 КБ ОЗУ, что обеспечивает дополнительные 128 КБ в дополнение к базовой ОЗУ.

Соревнующиеся тайминги памяти для SE неизвестны, но должны быть аналогичны таковым для машины 48K, за исключением того, что шаблон начинается с другого количества T-состояний после прерывания, чем обычное 14335. Нечетные банки в 128 схема оспаривается.

Чтение этого порта возвращает последний отправленный на него байт.

Система TS2068 имеет только 48 КБ базовой оперативной памяти, но SE также был расширен за счет использования варианта системы подкачки ZX Spectrum 128 для увеличения базовой оперативной памяти до 144 КБ. Это означает, что HOME банк выгружается как обычный Spectrum 128, за исключением того, что есть дополнительный банк по адресу 0x8000, где вы ожидаете найти банк 2. Это не вызывает никаких проблем с существующим коммерческим программным обеспечением, хотя некоторые демоверсии (такие как как 'Real Action') затронуты, но это обеспечивает больше памяти.

Банк HOME вызывается так же, как Spectrum 128, с использованием порта 0x7ffd. Банки HOME RAM 1,3,4,6 и большинство из 7 используются для RAM-диска в 128 Basic; остальные 7 содержат блокноты редактора.

Банки EX и DOCK вызываются горизонтальным MMU. Из-за использования двух совершенно разных систем пейджинга существуют определенные аппаратные ограничения, в отношении которых могут выполняться пейджинговые банки. Первый побочный эффект заключается в том, что нечетные (медленные) банки пейджинговой системы 128 имеют более высокий приоритет, чем банки DOCK и EX.

Карта памяти выглядит так: Итак, чтобы использовать память DOCK или EX в 0xc000. 0xffff, должен быть выбран один из четных банков (0,2,4,6) из системы пейджинга 128. Если выбран банк 1,3,5 или 7, этот банк появится вместо памяти DOCK или EX. Это касается битов 6 и 7 порта MMU 0xf4.

Второй побочный эффект заключается в том, что биты 2 и 3 порта MMU 0xf4 также применяются к нечетным (медленным) банкам в разделе D. Поэтому, когда вы выбираете один из нечетных банков (для раздела D, используя порт 0x7ffd), а затем переключите раздел B (0x4000..0x7fff) на DOCK/EX, у вас также будет DOCK/EX в разделе D.

Вся карта памяти описана ниже. Память DOCK/EX помечена как X0. X7, потому что вы можете иметь только DOCK или EX одновременно (бит 7 порта 0xfe). Число означает 1/8 часть 64 КБ, что соответствует биту в порту 0xf4.

Разделы помечены как AL, AH, BL, BH, CL, CH, DL, DH. Каждый означает 8 КБ.

    В случае выбора HOME

  • Блок питания
    Для SE требуется источник питания 9 В постоянного тока с током 800 мА, центральная полярность. Это обеспечивается через трансформатор, питающийся от источника переменного тока 230 В частотой 50 Гц. Ярек модифицировал светодиод, так что он горит красным, когда блок питания подключен, и зеленым, когда машина включена.

    Первый представляет собой модифицированную версию редактора ZX Spectrum 128. Вызов подпрограммы TEST в ROM-1 заменен кодом для сброса ULA Timex.

Возможность переключения стереовыхода ABC/ACB.

Экран высокого разрешения использует область данных экрана 0 и экрана 1 для создания экрана размером 512x192 пикселей. Столбцы берутся поочередно с экрана 0 и экрана 1. Область атрибутов не используется. В этом режиме все цвета, включая ГРАНИЦУ, ЯРКИЕ, а цвет ГРАНИЦЫ совпадает с цветом БУМАГИ.

Высокоцветный экран использует область данных экрана 0 для своих данных и область данных экрана 1 для своих атрибутов, что дает 2 цвета на блок 8x1 пикселей. Область атрибутов имеет тот же порядок байтов, что и область данных, а это означает, что файлы MLT, в которых области атрибутов расположены последовательно, должны быть преобразованы для отображения.

Бит 6 имеет эквивалентную функцию инструкции машинного кода DI, если он установлен, или инструкции EI в противном случае.

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

В дополнение к этим режимам экрана ULA может получить доступ к двум отдельным видеообластям, как Spectrum 128. Это делается с помощью бита 3 порта 0x7ffd. Это дает ULA в общей сложности 27 КБ ОЗУ, которые можно использовать для четырех стандартных областей экрана или двух экранов с высоким разрешением или с высоким цветом.

Будущие разработки:
интерфейсы IDE и RS232 должны быть доступны в ближайшее время.

Оригинальный ZX Spectrum

Сегодня исполняется 30 лет со дня рождения ZX Spectrum, одного из самых популярных домашних компьютеров, когда-либо созданных, и, возможно, самого важного фактора в создании ИТ-индустрии в Великобритании. ZX Spectrum, произведенный Sinclair Research в Кембридже, Англия, обычно считается британским эквивалентом Commodore 64, произведенного в США.

Материнская плата ZX Spectrum

Как Sinclair Research справилась с этой задачей? Инновационный дизайн и агрессивная инженерия. С самого начала Sinclair Research знала, что хочет, чтобы ZX Spectrum был как можно дешевле, поэтому почти каждый компонент разрабатывался с нуля с расчетом на экономию копейки. Основная печатная плата была сделана максимально компактной и плотной, что привело к очень гибкому корпусу (всего 23x14x3 см по сравнению с чудовищными 40x21x7 см Commodore 64 и гигантскими 40x35x8 см BBC Micro). Вместо обычной клавиатуры с сотнями движущихся частей использовалась резиновая островная клавиатура с четырьмя или пятью частями. (В глазах первоначальных пользователей это привело к тому, что клавиатура ZX Spectrum выглядела как «мертвая плоть» — ранний пример технического мема.) ZX Spectrum был упакован в пластиковый корпус и весил всего 550 граммов (1,2 фунта). по сравнению с металлическим, неуклюжим 1,8 кг (4 фунта) Commodore 64 и изнурительным 3,7 кг (8,1 фунта) BBC Micro.

Короче говоря, ZX Spectrum был просто лучше сконструирован, чем его современники — так же, как и iPhone, за исключением того, что Apple использует свое инженерное преимущество и преимущество в области поставок, чтобы выжимать более высокую прибыль, а не снижать цены. Как и ZX Spectrum, iPhone не использует принципиально другой кремний или материалы — Apple по-прежнему ограничена современным уровнем техники — но благодаря дизайну, проектированию и опыту поставок Apple просто удается втиснуть больше технологий в одно и то же ( или меньше) пространство — и с более дешевой спецификацией.

ZX Spectrum+ , более поздняя версия, в которой не было

ZX Spectrum+, более поздняя версия, в которой отказались от "мертвой плоти" клавиатуры

ZX Spectrum будет продано пять миллионов единиц — неплохо, если учесть, что в Великобритании всего 30 миллионов домов, — и чистый Клайв Синклер, владелец Sinclair Research, посвященный в рыцари «за заслуги перед британской промышленностью». ». Любопытно, что Синклер, серийный изобретатель, недавно признался, что на самом деле не использует компьютеры — предпочитает телефон электронной почте.

По сей день, даже после 30 лет применения закона Мура и учета инфляции, очень мало домашних компьютеров продаются по более низкой цене, чем ZX Spectrum (сегодня он стоил бы около 450 долларов США). . Raspberry Pi, британский ПК на базе Linux, который будет продаваться по цене около 25 долларов, является очевидным исключением и духовным преемником ZX Spectrum.

Читайте также: