
Microsoft Z-80 SoftCard — это плата расширения для Apple II, добавлявшая возможность запуска ПО компьютера CP/M. Согласно Википедии, это был первый аппаратный продукт Microsoft, и в 1980 году он стал самым крупным источником дохода для компании.
CP/M работает на процессоре 8080, а Apple II имеет процессор 6502. Так как же запустить CP/M на Apple II? На плате был смонтирован отдельный процессор Zilog Z80, совместимый с 8080; по множеству причин, перечисленных в Википедии¹, он превосходил 8080.
Отлично, у нас есть процессор. Но что будет происходить со старым процессором 6502? В идеале нужно бы его просто отключить, но это невозможно, потому что некоторые задачи всё равно должны выполняться 6502². Николь Брэнаган подробнее изучила историю о том, как сосуществовали эти два процессора. Принцип заключался в следующем: SoftCard сообщала 6502, что выполняет DMA, поэтому 6502 приостанавливал работу и ожидал завершения DMA. Однако нельзя оставлять 6502 на паузе слишком долго: его внутренние регистры могут деградировать и утерять свои значения.
Для решения этой проблемы можно воспользоваться линией REFRESH процессора Z80, которую он использует, чтобы сообщать, что пока не выполняет доступ к памяти (потому что декодирует команду). Это даёт понять цепи обновления внешней памяти, что она может работать и обновлять ОЗУ, чтобы оно не деградировало и не теряло свои значения.
Обновление памяти в Apple II выполняется видеосхемой, поэтому отдельный сигнал REFRESH не требуется. SoftCard использует этот сигнал, чтобы разрешить 6502 выполнить небольшую часть его задач. (Предположительно, он находится в цикле, ожидая, пока его разбудят). Благодаря этому регистры 6502 обновляются.
Когда SoftCard нужно, чтобы 6502 выполнял работу, то она может обновить часть памяти, чтобы отдать 6502 приказ: «Выйди из своего цикла ожидания и выполни для меня работу, а затем сообщи ответ и вернись в цикл ожидания». Далее Z80 уходит в сон, пока не получит ответ от 6502.
Ещё одно препятствие для общего использования памяти процессорами 6502 и Z80 заключается в структуре памяти. И Z80, и 6502 считают первые 256 байт памяти особой областью и хотят использовать её для выполнения разных задач. Кроме того, ожидается, что программы CP/M будут загружаться по адресу $0100, но у 6502 жёстко прописано, что его стек CPU должен находиться в диапазоне $0100–$01FF. В нижней части структуры памяти Apple II есть и другие препятствия: системный монитор Apple II использует $0200–$02FF в качестве буфера клавиатурного ввода, байты в диапазоне $03F0–$03FF хранят векторы прерываний, а в $0400–$07FF находится текстовый буфер видеокадров. (В диапазоне $0800–$0BFF есть второй второй текстовый буфер видеокадров, но его почти никто не использует). Другие серьёзные препятствия: диапазон памяти $C000–$CFFF, используемый периферийными устройствами, и диапазон $D000–$FFFF, содержащий ROM монитора Apple II, нельзя заменить ОЗУ при наличии Language Card (карты расширения памяти на 16 КБ), если только последние несколько байтов $FFFA–$FFFF не используются процессором в качестве векторов прерываний.
Решить все эти проблемы можно изменением структуры памяти, поместив в SoftCard цепь трансляции адресов, чтобы когда Z80, например, запрашивает адрес $0000, он получал физическую память $1000. Изменение структуры аккуратно проделано так, чтобы особые зарезервированные адреса Apple II были перенесены в конец структуры памяти Z80 и вся обычная ОЗУ Apple II занимала в структуре памяти Z80 сплошное адресное пространство, начинающееся с $0000³.

В руководстве по плате SoftCard есть множество подробностей о том, как писать для неё код. Например, там есть инструкции о том, как выполнять вызов подпрограммы 6502 из Z80, и есть таблица перераспределения памяти для Z80. В ней даже есть справочное руководство по процессору Z80 с перечнем всех команд. Это пригодится мне для будущего поста.
¹ Я не знаю, откуда взялся дефис в Z-80.
² Во многих случаях ввод-вывод обрабатывается циклами таймингов, поэтому если нужно получить доступ, допустим, к игровым контроллерам, то необходимо позволить 6502 выполнять ввод-вывод с его точными программными циклами таймингов.
³ Также имелись два буфера кадров графики высокого разрешения, один в диапазоне $2000–$3FFF, другой — в $4000–$5FFF. Они находятся прямо посередине структуры памяти Z80, но на практике это не представляет проблемы, потому что CP/M была операционной системой текстового режима, поэтому запускаемые при помощи платы расширения программы всё равно не пытались работать с графикой.
Комментарии (14)

hira
12.11.2025 06:06В CP/M установлен процессор 8080
Вспоминаю, что CP/M - это ОС. Как в ОС может быть установлен процессор?

Fishkarius
12.11.2025 06:06Однако нельзя оставлять 6502 на паузе слишком долго: его внутренние регистры могут деградировать и утерять свои значения.
Кто-то может объяснить, это такой перевод корявый или в 6502 действительно была какая-то фундаментальная проблема с этим?

passing_by
12.11.2025 06:06Скорее всего у ранних 6502, изготовляемых по nMOS-технологии, регистры были устроены приблизительно так же, как и динамическая память и так же нуждались в регенерации.

zatim
12.11.2025 06:06Нет, ни у ранних ни у поздних 6502 такого не может быть. Это или опечатка или корявый перевод.

passing_by
12.11.2025 06:06Где-то я натыкался на сравнительный анализ оригинального MOS 6502 и CMOS-верии, выпущенной позже и другой фирмой. Там как одно из преимуществ КМОП-варианта подавался как раз "полностью статический дизайн", для которого понятие минимальной тактовой частоты теряло смысл, т.к. регистры не нуждались более в регенерации. Но вообще да, там речь шла именно о снятии ограничений по тактированию, тогда как агрегахтунг из этой статьй тактированием 6502, кажется, не управлял, а просто захватывал шину...

zatim
12.11.2025 06:06Статический дизайн и память на конденсаторах - разные вещи. Никогда, вроде бы, регистры процессора не делали на конденсаторах. В этом просто не было необходимости. Они не так много места занимают чтобы начать на этом экономить, а вот гемора с регенерацией - выше крыши.
Динамическая природа, как пишут, обусловлена другими элементами конструкции процессора, например, предварительно заряженными шинами — базовой мерой для ускорения работы NMOS-схем.

VT100
12.11.2025 06:06Речь именно о динамических триггерах. Например, в nMOS микроконтроллерах 8051 - тоже было ограничение по минимальной тактовой частоте.

NutsUnderline
12.11.2025 06:06ну как пример конденсатор "сам по себе" разряжается, а чем ему не держать заряд вечно пока не потребуется. но обычно это проблема динамического ОЗУ

smart_pic
12.11.2025 06:06В Радио86РК регенерацией ОЗУ занимался контроллер прямого доступа к памяти, который на время тормозил процессор и пересылал данные в контроллер вывода текста на экран.
Но если нужно было писать программу с жесткими таймингами - то приходилось для этого останавливать ПДП, но тогда были шансы что память деградирует . Поэтому сделал для Радио86РК аппаратную регенерацию памяти , о чем была статья в свое время в журнале "Радиолюбитель 12/92" https://www.radioliga.com/RL_91-95/2.2.htm
Вполне стандартное решение для тех лет . оно использовалось для расширения памяти больше 64к для восьми битных процессоров, использовалось для перенаправления вектора сброса процессора и многого другого.

Fishkarius
12.11.2025 06:06К слову сказать, именно поэтому загрузка программ с магнитофона Р86РК производилась при выключенном экране (DMA отключался) - для обеспечения жестких таймингов при загрузке.

Overphase
12.11.2025 06:06Мне как бывшему пользователю Агата, эта история очень и очень интересна.
Подумал о таком вопросе совместимости: на железе Агата/Apple II дисковая подсистема использовала программное кодирование/декодирование GCR, в отличие от MFM кодирования дисководов, которые обычно применялись в машинах с CP/M. Apple II не смог бы прочитать MFM, даже если бы очень захотел, в силу инженерных упрощений при разработке дисковода (привет гению Стива Возняка, без сарказма).
Наиболее логичное решение, которое я могу придумать, после подсказок от ChatGPT: диски SoftCard имели физическую разметку Apple II и логическую разметку CP/M поверх них, что могло бы быть реализовано на уровне кастомного BIOS CP/M. Но такая CP/M не могла бы прочитать диски от обычных компьютеров под CP/M. Также режим работы Apple II (родной DOS 3.3 или CP/M) выбирался бы в зависимости от того, какой начальный загрузчик записан на нулевой дорожке.
Следовательно, пользователь SoftCard был ограничен набором дисков и программ, которые Microsoft бы поставляла вместе с платой.
Прав ли я в своих выводах? Как это работало на самом деле?
NutsUnderline
12.11.2025 06:06совместимость дисков в разных cp/m вообще довольно условна, но накостылить разное можно. все равно переносимость софта значительно выше,
NutsUnderline
вот здесь корявенько. можно сказать что в начале памяти находиться неперемещеаемая таблица векторов прерываний и начинается исполнение кода. но в том же zx spectrum от нее используются считанные байты,