Привет! Меня зовут Илья Мамай, я инженер-программист в группе разработки операционных систем YADRO. В этой статье я хочу поделиться опытом некромантии сборки советского компьютера по мотивам «Микро-80», схемы которого были опубликованы в журнале «Радио». Но собирать я буду не по этим схемам. Используя их как опору и источник вдохновения, я начну с запуска процессора КР580ВМ80А (советского клона Intel 8080), определения признаков жизни и продолжу постепенным наращиванием функционала и возможностей системы. Здесь мы займемся и радиотехникой, и DIY, и программированием как самого процессора, так и современных микроконтроллеров. Но перед этим поделюсь историей, как я, будучи студентом 4 курса, дошел до этого…
С чего все началось
В прошлый Новый год сосед по общаге спросил, нужна ли мне куча советского радиобарахла, оставшаяся от его деда. Не знаю зачем, но я согласился, как только мне пообещали доставить это все из Ярославля в Москву. Реле, вольтметры, амперметры, тумблеры и счетчик Гейгера-Мюллера СБМ-20, которые, как мне сказали, были скручены с советских светофоров в давние времена. Что ж, знакомство с тем дедом точно стало бы достижением в какой-нибудь RPG, но его, к сожалению, уже не получить. Там же я нашел самодельные печатные платы на микросхемах семейства К155: в них медная фольга была разрезана ножом на квадраты, поверх которых была напаяна схема. А еще там была одна неизвестная мне микросхема-сороконожка — КР580ВВ51А.
КР580ВВ51А оказалась частью советского микропроцессорного комплекта серии КР580. Меня очень заинтересовало словосочетание «советский микропроцессорный комплект», а точнее, то, на что он мог сгодиться. После нескольких статей википедии про советские игрушечные компьютеры «Микроша», «Искра», «Корвет» я оказался на страницах журнала «Радио». Говорят, это был самый популярный журнал у советских радиолюбителей.
В одной из серий статей журнала читателям предлагалось по напечатанным схемам самостоятельно в домашних условиях собрать компьютер «Микро-80» на основе микропроцессора КР580ВМ80А. Подумать только: в те времена люди САМИ доставали детали и по схемам собирали рабочие компьютеры? Без осциллографов, интернета и прочих радостей цивилизации? Тогда и мне стоит попробовать, ведь старый — значит, скорее всего, простой. А у меня и осциллограф есть, и интернет. Точно получится же…
Первая попытка
Я принял вызов только к концу весны. Принял, потому что не хотел писать диплом, а чем только ни займешься, лишь бы его не писать. Решил собрать «Микро-80» на макетных платах по схемам. За шкафом общаги валялся доставшийся мне в наследство блок питания, паяльник и осциллограф. Среди радиодеталей друга было достаточно необходимой рассыпухи. Не хватало только одного — процессора КР580ВМ80А, который при ближайшем рассмотрении оказался клоном процессора Intel 8080. Да и весь комплект оказался клоном микропроцессорного комплекта от Intel.
Я поехал на Митинский радиорынок искать недостающий 40-ногий камень и макетные платы. Камень мне в итоге просто подарили. А потом оказалось, что ему нужно целых три напряжения питания (+5, –5 и +12В), и я поехал туда еще раз выпрашивать на разборе бесплатный компьютерный блок питания. В итоге это «бесплатно» стоило мне 400 рублей, надеюсь, не обманули.
Из блока питания, пары амперметров, добротного советского тумблера, делителя напряжения и клеевого пистолета я собрал источник питания для своего будущего убийцы рынка микропроцессоров. Достал макетную плату и за несколько вечеров и пару поездок в Митино осилил процессорный модуль (попутно научил паять соседа и вынудил его принять активное участие в процессе). Получил такой вот тестовый стенд:

Собирать все остальное без понимания, как проверить работоспособность, казалось бессмысленной авантюрой. Еще и диплом все-таки пришлось начать писать. И я забросил проект почти на год.
Вторая попытка
На пятки начала наступать очередная сессия, и вместо того, чтобы думать о неприятном, я начал думать о продолжении моей компьютерной авантюры. В этот раз решил действовать поэтапно:
Изучить документацию к процессору.
Собрать минимальную обвязку для его запуска, запустить и увидеть признаки его кремниевой жизни (пациенту все-таки необходима диспансеризация, в его-то годы).
Заставить Arduino симулировать память, чтобы запустить на процессоре простейшую программу и увидеть признаки ее выполнения. Так я смогу гарантировать, что пациент скорее жив, чем мертв.
Собрать память, заставить «ардуину» загружать туда информацию на старте, после чего — стать устройством передачи данных на ПК.
Двигаться дальше. В каком направлении – проблема меня будущего.
Пока я добрался только до третьего пункта, но мне уже есть, что об этом рассказать! Начну я с сердца компьютера «Микро-80» — процессора КР580ВМ80А.
КР580ВМ80А
Как я уже говорил, процессор КР580ВМ80А — это полная советская копия процессора Intel 8080, так что вся (или почти вся) известная информация об Intel 8080 верна и для нашего подопытного. Заостряю на этом внимание только потому, что единой документации на КР580ВМ80А я не нашел. Отыскал лишь несколько сухих страниц в советском справочнике «Микропроцессоры и микропроцессорные комплекты интегральных микросхем». Широкого выбора, с чего начать работу, эти страницы не давали, так что я решил начать с архитектуры и распиновки.

Хоть до появления первого x86-процессора должно пройти еще четыре года, но общие основы хорошо знакомой архитектуры х86 уже ясно просматриваются. 50 лет прошло, а они так похожи!
Наш герой имеет очень знакомый набор регистров:
16-разрядные: регистр адреса IP и регистр стека SP, которые за 50 лет с момента выпуска процессора сначала растолстели до 32 бит, став EIP и ESP, а потом, видимо, уже до конца разграбили подземелье и увеличились до 64-бит, став RIP и RSP.
Шесть 8-битных регистров общего назначения B, C, D, E, H, L, а также регистр-аккумулятор A, в который записывается результат выполнения большинства операций. В будущем их постигнет та же участь: их части обрастут префиксами и суффиксами, но общая структура сохранится.
Набор команд лаконичен и понятен, он вмещается в небольшую таблицу, которая вполне влезает в монитор. CISC еще не успел взять свое и обложить процессор командами для вычисления длины строки и выгуливания соседской собаки. Я пока не буду заострять внимание на командах, так как в рамках этой статьи нам понадобятся всего три из них.
Рассматривать регистры и инструкции для меня как для системного программиста, конечно, привычно и интересно. Но сейчас самое важное — это организация взаимодействия этого процессора с окружающим миром, что меня, системного программиста, пугает.
На распиновке выше видно, что процессор имеет 16-битную шину адреса (ножки A0–A15) и 8-битную шину данных (ножки D0–D7). Требует три напряжения питания (Ucc1 = +5 В, Ucc2 = –5 В и UIo = +12 В) и два тактовых сигнала, некие C1 и C2. А также имеет пачку входных сигналов. Пока пройдусь по ним кратко, буду останавливаться подробно, как только какой-нибудь из них нам понадобится:
RDY и HLD необходимы для приостановки работы процессора, если какое-либо устройство не успевает предоставить данные в необходимое время или хочет занять шины адреса или данных.
INT, высокий уровень на котором инициирует вызов прерывания.
SR, он же RESET.
Также мы видим, что процессор имеет несколько выходных сигналов:
HLDA, WI — подтверждение приостановки процессора внешним устройством.
INTE — имеет высокий уровень, когда прерывания включены.
RC и TR — запрос на чтение и запись данных на шине адреса соответственно.
SYN — сигнал синхронизации, высоким уровнем которого процессор обозначает начало исполнения машинного цикла.
Пока что этой информации достаточно, чтобы запустить процессор и не перегрузить статью. Так давайте же приступим. Для начала я предлагаю озадачиться сборкой источника питания на три напряжения.
Источник питания
Как я уже говорил, от источника питания требуется три напряжения — +5, –5 и +12 В. Быстро и просто добыть их для тестовых целей можно через обычный компьютерный блок питания стандарта ATX, который легко отыскать на разборе компьютерной техники.

Если взглянуть внимательно на разъем ATX, то видно, что он выдает напряжения +5, +12 и –12 В. –5 В присутствует в разъеме ATX, но, как я понял, в наше время оно чаще не реализуется. Мы получим его делителем напряжения, ведь потребление всех микросхем по линии –5 В очень мало, так что излишества нам ни к чему.
Также я добавлю туда тумблер для запуска (между землей и PS_ON), чтобы не ковыряться в контактах скрепкой, и два амперметра по линиям +5 В и +12 В, чтобы до появления белого дыма и запаха гари увидеть, что в работе схемы что-то идет не так. Итак, меньше слов и больше схем!

Номиналы резисторов я рассчитывал исходя из следующих условий. Ток по линии –5 В, согласно документации к процессору, не превышает 1 мА. Если ток, проходящий через два резистора, будет намного больше тока потребления по линии –5 В, то мы добьемся достаточной точности величины напряжения.
За «намного больше» обычно берется ровно в 10 раз. Потому из схемы и правил Кирхгофа…

…при учете, что V0 = –12 В, V1 = –5 В, I = 10 мА, получаем R1 = 500 Ом, R2 = 700Ом. Ну или, если брать ближайшие доступные номиналы, то R1 = 500 Ом, R2 = 680 Ом.

В соответствии с документацией, для долголетия процессора особенно важен порядок включения и выключения напряжений питания при запуске. Первым должно появиться –5 В, потом +5 В, потом +12 В. Отключаться питание должно в обратной последовательности. Из тематических форумов я узнал, что главное — не подавать положительные питания раньше, чем отрицательные, тогда процессор будет жить.
Порядок появления питаний в БП стандарта ATX не регламентирован, за это отвечают схемы на материнской плате. Однако, исходя из типовых схем и тех фактов, что…
все три напряжения берутся с одного и того же трансформатора,
емкость сглаживающих конденсаторов по цепям +5 В и +12 В намного больше емкости по цепи –5 В,
я купил имплант удачи за 4000 крышечек и нам повезет,
…можно предположить, что процессор выживет при запуске, так как –5 В появятся и пропадут первыми. Уверенно срезаем ATX разъем, паяем источник питания и получаем примерно такой DIY-экспонат. Мы с товарищами ласково называем его «электрофорез»:

Для экспериментов этого источника питания будет вполне достаточно, переходим к следующему важному для запуска процессора шагу — генерации тактовых сигналов.
Генератор тактовых сигналов
Документация и журнал «Радио» говорят, что необходимо два тактовых сигнала, их частота не должна быть ниже 500 КГц и выше 2,5 МГц и они должны иметь следующую форму:

Сигнал C2 должен обгонять сигнал C1 на треть периода. Для генерации таких сигналов есть два пути:
использование специализированной микросхемы КР580ГФ24,
сборка генератора из счетчика и микросхем логики.
В процессе радиотехнических изысканий я купил на развес килограмм советских микросхем и нашел там золото и КР580ГФ24. Но вообще отыскать ее бывает непросто, а логические микросхемы серии К155 все еще продаются в каждом хлебном магазине. Поэтому предлагаю рассмотреть оба варианта, хоть я и остановился на первом.
Путь джедая: генератор тактовых сигналов на логических элементах
Первое, что нам необходимо, — это сгенерировать меандр, из которого мы логическими операциями получим два необходимых тактовых сигнала. Для генерации меандра на логических элементах есть старая добрая советская схема на микросхеме К155ЛН1, представляющая собой шесть логических НЕ.

Работает она следующим образом. Конденсатор С9 попеременно заряжается и разряжается двумя инверторами, ведь пока напряжение на нем ниже напряжения высокого логического уровня, второй инвертор на выходе выдает высокий логический уровень, а первый — низкий. Соответственно, конденсатор заряжается выходом второго инвертора через резистор R2. А как только напряжение на нем увеличится до напряжения высокого логического уровня, оба инвертора переключатся и станут его разряжать. Снимая напряжение с выхода второго инвертора, мы и получим желаемый меандр. Кварцевый резонатор стабилизирует частоту переключения триггеров на своей резонансной частоте.
С меандром разобрались. Дальше предлагаю из него получить несколько меандров с частотами, кратными исходной. Давайте подключим к нему счётчик и посмотрим, что из этого выйдет.

Здесь я нарисовал 5-битный счетчик К155ИЕ5, распиновка которого выглядит так:
С0 — вход первого однобитного счетчика,
С1 — вход второго 3-битного счетчика (потому я их замкнул, чтобы в итоге получить 4-битный счетчик),
Q0-Q3 — выходы 4 бит рассчитанного счетчиком двоичного числа.
Входы R1 и R2 обнуляют значения каждого счетчика, а нам обнулять их незачем, потому они притянуты к земле. Используемый таким образом счетчик работает как делитель входной частоты на 2, 4, 8 и 16. Потому на выходах схемы out_2, out_4, out_8 мы получим следующие уровни сигналов.

А теперь настало время решать последнюю задачу, генерацию сигналов С1 и С2, самым простым и надежным методом — методом вглядывания. Вычислим логическое И сигналов out2 и out4, НЕ сигнала out2 и зарисуем результат.

Похоже ли это на требуемый сигнал? Ну, отдаленно да… Периоды, правда, не совпадают, да и смещены они не на треть периода, а на четверть. Но при запуске процессор должен бойко сказать: «С пивом покатит!» И заработать, ведь такая схема и была в «Микро-80». Используем out_4 и out_8 для вычисления тактовых сигналов, так как их вчетверо большая частота может оказаться полезной в будущем.
Осталась одна небольшая деталь. Для КР580ВМ80А необходима амплитуда тактовых сигналов 12 В, а у нас только 5 В. Потому воспользуемся какой-нибудь микросхемой с открытым коллектором типа К155ЛА7 и получим итоговую схему.

Собираем тактовый генератор:

Запускаем и давайте подглядывать: тыкаем осциллографом в ножки 6 и 8 микросхемы К155ЛА7.

Путь ситха: микросхема КР580ГФ24
Все, что мы сделали в предыдущем разделе, умеет одна микросхема — КР580ГФ24. А еще у нее есть типовая схема включения, которая радует глаз своей простотой, в отличие от ранее собранного осьминога:

Здесь все точно так же, просто вся логика собрана в одну микросхему. А цепь из диода, резистора и конденсатора отвечает за инициализацию процессора при старте. Ее мы пока игнорируем, как и все остальные сигналы кроме C1 и С2 — те пугают. Разберемся с ними по мере надобности или когда ничего не заработает, а пока просто подтянем их к земле или питанию в зависимости от того, инвертированы они или нет. Сейчас основная цель — запуститься. Собираем:


Подключаем процессор (питание и C1, C2). Осталось закинуть входные ноги на землю или на питание. Смотрим на осциллограмму:

Работает, ура! Остановимся на этой схеме, так как:
она проще, соответственно, вероятность ошибок меньше,
мама в детстве сказала мне, что джедаев не существует (и вообще, нам больше по нраву фэнтези-рпг).
Работоспособность «джедайского» варианта для всех дальнейших конструкций статьи я все же проверил за кадром. Вдруг кто решит заняться тем же.
Запускаем процессор
Наш тестовый стенд при запуске вроде бы не горит, но как понять, что он работает? Процессор будет пытаться читать инструкции с шины данных, а значит, поднимать сигнал RC (нога 17), чтобы сигнализировать об этом. На ней мы ожидаем что-то вроде меандра — это и будет признаком его успешного запуска. Тыкаем осциллограф одним каналом на 17 ногу, а вторым на 12 ногу К155ИЕ5:

Ура! Работает! Каждый четвертый такт сигнала out_2 процессор пытается читать шину данных, но там ничего нет, там нули. А инструкция с опкодом 0x00 — это NOP. Очень удобно.
Итак, мы сделали большой шаг — обеспечили процессор всем необходимым для работы. Осталось лишь дать ему инструкции. Но прежде необходимо понять, как процессор исполняет инструкции. Почему он читает инструкцию каждый 4 такт, может ли чаще или реже…
Как КР580ВМ80А исполняет инструкции
Процессор имеет переменную длину инструкции, от 1 до 3 байт. Каждая инструкция выполняется за 1–5 машинных циклов, каждый машинный цикл состоит из 3–5 тактов. Такт — это один период сигналов C1 и C2.
В первом машинном цикле М1, который занимает 4–5 тактов (Т), процессор делает следующее.
Т1. Выводит адрес на шину адреса, а на шину данных — информацию о своем состоянии. Здесь указывается, что сейчас собирается делать процессор: читать память, стек, устройства ввода-вывода, обрабатывать прерывание и т. д.
Т2. Проверяет состояние ножек RDY и HLD на предмет необходимости притормозить. Если на одной из ножек есть сигнал, процессор переходит в состояние останова до его исчезновения.
Т3. Читает с шины данных команду.
Т4. Подготавливает себя к исполнению команды или выполняет команду, если для нее не требуется дополнительных действий типа чтения регистров из памяти или портов ввода-вывода (необязательный шаг).
Т5. Продолжает выполнение команды (необязательный шаг).
Далее процессор может переходить в один из девяти вариантов машинных циклов. Среди них интересным пока является только цикл чтения запоминающего устройства, в котором происходит чтение памяти по адресу из PC или одной из пар регистров общего назначения. Проходит этот цикл по тому же сценарию, что и М1. Общая диаграмма состояний процессора для самый пытливых представлена на картинке:

На осциллограмме, полученной при запуске процессора, можно увидеть, что NOP (опкод 0х00) исполняется согласно вышеописанной схеме. За четыре такта он выполняет команду:
выводит свое состояние на шину данных,
проверяет отсутствие необходимости останова,
читает опкод 0х00 с шины данных,
исполняет NOP.
А потом просит следующую команду. Это еще раз подтверждает правильность функционирования камня.
Давайте теперь разберемся, как процессор будет исполнять более длинную инструкцию в три байта, которая не требует дополнительных операндов. Например, инструкцию JMP по адресу 0x0, имеющую опкод 0xC2 0x00 0x00 (последние два байта — адрес перехода), процессор будет выполнять не менее трех машинных циклов. Точнее мы узнаем, когда запустим ее на исполнение. Первым циклом будет описанный выше М1, так как он является первым при выполнении любой инструкции, а за ним последуют два цикла чтения ЗУ.
Наша следующая цель — научиться выдавать процессору по запросу байты инструкций на шину данных. Приступим!
Обслуживание шины данных
Подключаем КР580ВМ80А к Arduino
Финальная задача — заставить процессор исполнять программу:
0xFB EI # включить прерывания
0xF3 DI # выключить прерывания
0xC2 0x00 0x00 JMP 0x0000 # прыгнуть в начало
Эта программа очень полезна, так как у процессора имеется нога INTE, на которой есть сигнал, когда прерывания включены. Если программа заработает корректно, то на этой ноге мы увидим меандр.
Обслуживать шины адреса и данных я собираюсь посредством Arduino. Первое время она будет мимикрировать под RAM. ATmega2560 для этого отлично подойдет, так как имеет три ничем не занятых порта ввода-вывода, ноги которых еще и последовательно расположены на гребенках.
План действий у меня такой:
Запустить «ардуину» и первым делом подать логическую единицу на вход RST-процессора, чтобы он инициализировался, занулил себе PC.
Инициализировать на «ардуине» три порта — один под шину данных, два под шину адреса.
Инициализировать два прерывания — на запросы чтения и записи от процессора соответственно.
Подать логический 0 на сигнал RST.
Обслуживать запросы процессора на чтение, выдавая описанную выше программу в первых пяти байтах и мусор в оставшихся.
Есть только один напряженный момент: процессор я заводил на частоте 500 КГц, минимально допустимой. Микроконтроллер Arduino работает на 16 МГц. (Почти) любая инструкция исполняется «ардуиной» за один такт, но микроконтроллер в ней конвейерный 4-стадийный. Соответственно, результата исполнения последней инструкции мы дождемся только через четыре такта после ее начала. Нехитрой арифметикой получаем, что в один цикл КР580ВМ80А Arduino успеет исполнить не более 29 инструкций. Запоминаем это на всякий случай. Вдруг что-то не заработает, будет повод проверить.
Итак, подключаем младшую часть адреса к порту K, старшую к порту A. Шину данных подключаем к порту F. Делаем это в соответствии со схемой:

И земли соединить не забываем, а то обидно будет за мертвую «ардуину». Собираем и будем писать свиток с проклятиями код…


Учим Arduino мимикрировать под RAM
Давайте определим порты шины адреса:
#define ADDRL_DDR DDRK
#define ADDRL_PORT PORTK
#define ADDRL_PIN PINK
#define ADDRH_DDR DDRA
#define ADDRH_PORT PORTA
#define ADDRH_PIN PINA
И сразу настроим их на вход без подтягивающего резистора (в рамках паранойи):
static void abus_init() {
ADDRL_DDR = 0x00;
ADDRH_DDR = 0x00;
ADDRL_PORT = 0x00;
ADDRH_PORT = 0x00;
}
Таким же образом инициализируем порты шины адреса:
#define DATA_DDR DDRF
#define DATA_PORT PORTF
#define DATA_PIN PINF
static void dbus_init() {
DATA_DDR = 0x00;
DATA_PORT = 0x00;
}
Шину адреса сам КР580ВМ80А иногда использует на выход. Поэтому очень важно не допускать ситуаций, когда каждый контроллер пытается установить шину в своё состояние. В ходе такого эксперимента один из камней-ветеранов храбро пал на поле боя, за что следует отдать ему дань уважения: ценой своей жизни он рассказал нам, как делать не надо.
Далее необходимо настроить прерывание на запрос чтения от процессора. Срабатывать оно должно и по фронту сигнала, и по спаду. По фронту мы будем переключать порт в выходной режим и выкладывать запрашиваемый байт, а по спаду обратно включать его на вход. Определяем все необходимое для этого:
#define ISR_READ_INT INT0
#define ISR_READ_VECT INT0_vect
#define ISR_READ_ISC0 ISC00
#define ISR_READ_ISC1 ISC01
#define ISR_READ_DDR DDRD
#define ISR_READ_PORT PORTD
#define ISR_READ_PIN PIND
#define ISR_READ_PINNUM 0
И заряжаем это в свои регистры:
static void isr_init() {
EICRA = _BV(ISR_READ_ISC0) | _BV(ISR_READ_ISC1);
EIMSK |= _BV(ISR_READ_INT);
ISR_READ_DDR &= ~_BV(ISR_READ_PINNUM);
ISR_READ_PORT |= _BV(ISR_READ_PINNUM);
}
Определяем обработчик прерывания:
ISR(ISR_READ_VECT) {
if(ISR_READ_PIN & _BV(ISR_READ_PINNUM)) {
uint16_t address = ADDRL_PIN | (ADDRH_PIN << 8);
DATA_DDR = 0xff;
DATA_PORT = INTEL8080_RAM[address];
} else {
DATA_PORT = 0x0;
DATA_DDR = 0x0;
}
}
Здесь в массиве INTEL8080_RAM лежит та самая программа, которую я описывал выше. Только ее нужно скомпилировать в уме:
static uint8_t INTEL8080_RAM[] = {
0xfb, 0xf3, 0xc3, 0x00, 0x00
};
Также нам понадобится подключить вход RST-процессора к Arduino, чтобы:
позволить ему инициализироваться,
позволить инициализироваться «ардуине» и быть уверенным, что без нее процессор никуда не убежит.
#define INTEL8080_RST_DDR DDRD
#define INTEL8080_RST_PORT PORTD
#define INTEL8080_RST_PIN PIND
#define INTEL8080_RST_PINNUM 2
static void init_intel8080_reset() {
INTEL8080_RST_DDR |= _BV(INTEL8080_RST_PINNUM);
INTEL8080_RST_PORT |= _BV(INTEL8080_RST_PINNUM);
}
static void intel8080_reset() {
INTEL8080_RST_PORT |= _BV(INTEL8080_RST_PINNUM);
}
static void intel8080_run() {
INTEL8080_RST_PORT &= ~_BV(INTEL8080_RST_PINNUM);
}
Вот и все, теперь собираем:
int main() {
cli();
init_intel8080_reset();
intel8080_reset();
abus_init();
dbus_init();
isr_init();
_delay_us(1000);
sei();
intel8080_run();
for(;;);
}
Компилируем и…

Бинго! На ножке INTE появилась жизнь! Мы включаем прерывание ровно на один машинный цикл, выключаем обратно, потом начинаем сначала. Здесь можно отследить даже порядок чтения байтов инструкции (синий — сигнал запроса на чтение, желтый — INTE). Я подписал на иллюстрации.
1 машинный цикл — читаем инструкцию EI, исполняем, включаются прерывания
2 машинный цикл — читаем инструкцию DI, исполняем — выключаются прерывания
3–5 машинные циклы — читаем команду JMP 0x0, так как ее длина — три байта. На последнем цикле исполняем.
7 машинный цикл — начало второй итерации, снова читаем EI и идем по кругу.
Заметили одну странность в моем списке? Откуда-то взялся лишний цикл. Их должно быть пять на одну итерацию. Об этом говорит и документация, и размер команд. Но лишний цикл все равно есть.
Вроде уже работает, но почему-то не так, как я хотел
Скажу честно: на этот вопрос я потратил не одни выходные. Он мучил, он фрустрировал и не давал покоя. Я решил собрать компьютер, но не могу посчитать циклы правильно. Но причина была другая.
Оказалось, Arduino не поспевает за 50-летним старичком. Хоть он и работает на своей минимальной частоте в 500 кГц, это все равно слишком быстро. Периодически «ардуина» не успевает сменить команду на шине и процессор исполняет ее еще раз. Это были долгие сутки отладки осциллографом. Я полюбил GDB горячей любовью!
Давайте посмотрим, что накомпилировал компилятор в обработчике прерывания на запрос чтения:
ISR(ISR_READ_VECT) {
60: 1f 92 push r1
62: 0f 92 push r0
64: 0f b6 in r0, 0x3f ; 63
66: 0f 92 push r0
68: 11 24 eor r1, r1
6a: 0b b6 in r0, 0x3b ; 59
6c: 0f 92 push r0
6e: 8f 93 push r24
70: ef 93 push r30
72: ff 93 push r31
if(ISR_READ_PIN & _BV(ISR_READ_PINNUM)) {
74: 48 9b sbis 0x09, 0 ; 9
76: 0e c0 rjmp .+28 ; 0x94 <__vector_1+0x34>
uint16_t address = ADDRL_PIN | (ADDRH_PIN << 8);
78: 80 91 06 01 lds r24, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x700106>
7c: e0 b1 in r30, 0x00 ; 0
7e: f0 e0 ldi r31, 0x00 ; 0
80: fe 2f mov r31, r30
82: ee 27 eor r30, r30
84: e8 2b or r30, r24
DATA_DDR = 0xff;
86: 8f ef ldi r24, 0xFF ; 255
88: 80 bb out 0x10, r24 ; 16
DATA_PORT = INTEL8080_RAM[address];
8a: e0 50 subi r30, 0x00 ; 0
8c: fe 4f sbci r31, 0xFE ; 254
8e: 80 81 ld r24, Z
90: 81 bb out 0x11, r24 ; 17
92: 02 c0 rjmp .+4 ; 0x98 <__vector_1+0x38>
} else {
DATA_PORT = 0x0;
94: 11 ba out 0x11, r1 ; 17
DATA_DDR = 0x0;
96: 10 ba out 0x10, r1 ; 16
}
}
98: ff 91 pop r31
9a: ef 91 pop r30
9c: 8f 91 pop r24
9e: 0f 90 pop r0
a0: 0b be out 0x3b, r0 ; 59
a2: 0f 90 pop r0
a4: 0f be out 0x3f, r0 ; 63
a6: 0f 90 pop r0
a8: 1f 90 pop r1
aa: 18 95 reti
О ужас: 38 инструкций и чеховское ружье! Мы не успеваем только потому, что у нас есть calling convention, о которой заботится компилятор. Он не понимает, что после инициализации мы не исполняем какой-либо код, достойный соглашения о вызовах. Придется ему объяснять…
Тут моя программистская душа возрадовалась! Вы когда-нибудь читали в документации к gcc атрибуты вызова функций? Я каждый раз читал и с интересом задавался вопросом: кому, когда и как понадобится бо́льшая их часть? И здесь я нашел naked. Этот атрибут говорит компилятору не создавать пролог и эпилог функции (которые у нас и занимают бо́льшую часть кода!), но взамен требует принести тело функции в жертву — написать ее на ассемблере. Сделаем это.
Заставим наше прерывание срабатывать только по фронту:
static void isr_init() {
EICRA |= _BV(ISR_READ_ISC1) | _BV(ISR_READ_ISC0);
EIMSK |= _BV(ISR_READ_INT);
}
Сделаем его naked:
ISR(ISR_READ_VECT, ISR_NAKED) {
asm volatile(
И начнем переписывать строчку за строчкой.
Переключаем порт шины данных в выходной режим:
ldi r16, 0xff
out 0x10, r16
Читаем два байта шины адреса со своих портов:
lds r30, 0x0106
in r31, 0x0
Вычисляем смещение байта инструкции в нашем массиве:
add r30, %0
adc r31, %1
Загружаем байт в регистр:
ld r16, Z
И отправляем его в порт шины данных:
out 0x11, r16
Чуть-чуть ждем, чтобы процессор успел прочитать данные:
.rep 20
nop
.endr
Подбираем число нопов опытным путем после успешного запуска (интересно, что появилось раньше, курица или яйцо). Переводим шину данных обратно во входной режим:
eor r1, r1
out 0x11, r1
out 0x10, r1
И выходим из прерывания:
reti
Соберем все вместе:
ISR(ISR_READ_VECT, ISR_NAKED) {
asm volatile(
"ldi r16, 0xff\n\t"
"out 0x10, r16\n\t"
"lds r30, 0x0106\n\t"
"in r31, 0x0\n\t"
"add r30, %0\n\t"
"adc r31, %1\n\t"
"ld r16, Z\n\t"
"out 0x11, r16\n\t"
".rep 20\n\t"
"nop\n\t"
".endr\n\t"
"eor r1, r1\n\t"
"out 0x11, r1\n\t"
"out 0x10, r1\n\t"
"reti\n\t"
::
"r" ((uint8_t)(uint16_t)INTEL8080_RAM),
"r" ((uint8_t)((uint16_t)INTEL8080_RAM >> 8))
);
}
Попробуем запустить:

Лишний цикл пропал! И теперь процессор работает стабильно многие часы! Получается, зверушка оказалась живой и на ней теперь можно надстраивать всякую периферию.
Заключение
Я очень хочу считать программу с магнитофона. Какую-нибудь игру. И поиграть в нее на этом процессоре. Но для этого нужна полноценная память, клавиатура, монитор, а лучше сразу терминал. И этим предстоит заняться. Если вам понравился формат и статья зайдет, то следующую я планирую посвятить легендам об оперативной памяти и устройствах ввода-вывода процессора. Он, как доблестный воин после левел-апа, обзаведется 4 КБ SRAM и откроет в инвентаре порт для вывода текста в ноутбук (здесь также поможет «ардуина»). Надеюсь, в следующий раз КР580ВМ80А скажет нам «Hello, world!», ну или что там говорили в те времена…
Комментарии (158)
mark_ablov
15.01.2025 09:02Я сразу FPGA начал использовать, чтоб был запас для 8080, который крутится на частоте 3.125 МГц. По моему опыту даже частота в 1МГц с трудом переваривается не самыми мощными микроконтроллерами.
SIISII
15.01.2025 09:02Хотя, может, поздние варианты и поддерживали частоты свыше 3 МГц, но, вроде б, предел везде 2,5 указывается... Впрочем, обычно работает; кажись, в заводском Векторе его на 3 МГц как раз и гоняли.
А ПЛИС -- откопали старую, 5-вольтовую, или преобразователи уровней лепите?
mark_ablov
15.01.2025 09:02Я использовал оригинальный 8080 от Intel'a, а не клоны. Штатная частота Intel 8080A-1 как раз 3.125. Преобразователей накидал - уложился в 5 микросхем, с учётом отдельного чипа для конвертации уровней тактового сигнала в 12в (FPGA так же и тактирует 8080).
SIISII
15.01.2025 09:021) Если говорить строго, то нужно гарантировать порядок подачи питания, причём -5 В идут первыми, иначе проц имеет полное право сдохнуть. Учитывая, что сам БП никакого порядка не гарантирует, единственный способ -- делать свой... скажем так, контроллер питания, который пропускает на проц напряжения в нужном порядке. Правда, я неоднократно встречал слухи, что у советских процов поздних выпусков это требование стало необязательным: в принципе, это вполне возможно, ведь та же Интел через какое-то время выпустила 8085, чуть ли не важнейшим отличием которого стало только одно напряжение питания (отрицательное смещение научились вырабатывать "на борту"), который у нас тоже клонировали -- КР1821ВМ85, если склероз не изменяет.
2) Для отладки Ардуина вполне пойдёт; я сам временами использую её для разборок с логикой работы сложных микросхем, когда документация не даёт полного ответа или допускает двоякое толкование. Но для нормальной работы в качестве периферии, увы, не подходит. Я вот для аналогичной, но несколько более объёмной задачи (эмуляция периферии для СМ ЭВМ, в девичестве PDP-11) рассматриваю какой-нибудь мощный ARM -- скажем, GD32H7 с ядром Cortex-M7 на 600 МГц, ну а память будет настоящей, только на относительно современных (1990-х годов) микросхемах статического ОЗУ.
ПЛИС в роли периферии смотрится лучше, но там сразу кучу геморроя с согласованием уровней, ведь ПЛИС, поддерживающие +5 В, найти сложно, их выпуск прекращён много лет назад. Но такой вариант тоже рассматриваю, но, вероятно, как "продолжение банкета": отлаживаться по понятным причинам проще на микроконтроллере.
3) Достать почти все микросхемы 580-й серии пока ещё возможно. Самый дефицит, похоже, -- КР580ВВ79, которая применяется мало где (из любительских, кажется, только в ЮТ-88).
4) А вот в те годы (года эдак до 1987-88) "достать" означало прямо или косвенно украсть, ибо купить легально даже какую-нибудь К155ЛА3 было проблематично (в магазинах были лампы, транзисторы и несколько типов аналоговых микросхем -- и, по большому счёту, всё). Фактически, так сделали и разработчики Микро-80: где-то было то ли интервью, то ли рассказ о его создании, там и говорилось, что им в контору ошибочно прислали К580ИК80 (раннее название этого проца), которого ещё ни в каких справочниках не было, но они имели доступ к буржуйской литературе, кто-то связала советское название с 8080 -- и они из того, что было, слепили комп. Не по заданию конторы, а по собственному желанию использовали целую кучу государственных микросхем. Как только им не ай-ай-ай :)
DvoiNic
15.01.2025 09:02Самый дефицит, похоже, -- КР580ВВ79, которая применяется мало где
Я вообще не помню применения в самоделках. Только к 1816ВМ48/51 подключали
jar_ohty
15.01.2025 09:02Необязательность подачи минус 5 вольт возникает только в одном случае: если +12 В снизить до +5В. В любых, и в старых, и в новых. Но старые при этом не работают совсем, а новые кое-как, с пониженной частотой (в частности, на РКшных 1,7 МГц), но работают.
А так -- в качестве крайнего варианта допускалось документацией подавать и снимать -5 В одновременно с другими напряжениями.
mpa4b
15.01.2025 09:02Огоспаде, -5в это "смещение подложки", напрямую оно ничего не питает, только, собственно, подложку (большую часть кристалла мсх) смещает к -5в. Если -5в не подать, то что будет? Ну, пороговые напряжения у транзисторов чуть уползут, может быть вдруг даже работать правильно не сможет пока -5в не подадут. В чуть более новых чипах, например Z80, таковое смещение вырабатывалось прямo на кристалле, простым мультивибратором и выпрямителем-умножителем. Вдолгую отсутствие -5в как-то там влияет на дрейф атомов-загрязнителей из той самой подложки в транзисторы и нарушению их работы. Но в течение секунды -- никак не повлияет.
HardWrMan
15.01.2025 09:02Если быть совсем точным, то -5 был жизненно необходимым для первого поколения, который маркировался как К580ИК80. Он ещё в керамике был.
И первые экземпляры второго поколения, которые маркировались как К580ВМ80.
Суть его в том, что на тот момент чистота кремния была недостаточной поэтому получались паразитные токи, которые приводили к открыванию транзисторов и как следствие - тепловому пробою. Отрицательное смещение эффективно боролось с ними. И действительно - требовался только потенциал, ток был минимальный, буквально единицы мА. Что касается последнего поколения, которое маркировалось как КР580ВМ80А напряжение подложки требовалось, однако отсутствие не приводило к мгновенному выходу чипа из строя, потому что качество кремния заметно повысилось. Личный опыт игры с парой десятков чипов при сборке и эксплуатации этого процессора в ЛК "Орион-128.2" показал то, что чип выдерживает даже свап его на ходу, но я, конечно же, не советую так делать.
sim2q
15.01.2025 09:02И действительно - требовался только потенциал, ток был минимальный, буквально единицы мА.
скорее даже мкА, но проверять лень)
HardWrMan
15.01.2025 09:02Посмотрел букварь, для i8080A-1, самой быстрой версии, это типичноые 10мкА, максимально 1мА:
В букваре Микропроцессоры и микропроцессорные комплекты интегральных микросхем Том 1 указан только максимальный 1мА:
BillGilbertN
15.01.2025 09:021988-1989, Киев (УССР), радио-кружок при КЮТ - мы травили платы, паяли, собирали, тестировали и учились работать на тех самых "игрушечных" Микрошах и Корветах. Абсолютно бесплатно! Причем все компоненты/материалы нам выдавали, тоже бесплатно! Загнивающий СССР, чё вы хотели!
В 89 году мы переезжали из Киева - а в кружке как раз начали собирать несколько комплектов "Радио-86РК". Но я не знаю, собрали или нет.
Так вот, всю серию логики К155 можно было купить без проблем - приходишь в магазин, заказываешь, через некоторое время забираешь. А вот с серией 580 было сложнее.SIISII
15.01.2025 09:021989 -- это уже самый конец СССР, когда "социализм" уже, по сути, дал дуба; тогда в продаже что-то появляться стало (всякие спекулянты стали торговать уже открыто, а не из-под полы, а что-то и само государство стало, наконец, гражданам продавать). А попробуйте купить, скажем, в 1980-м -- фигушки. Зато дорогого Леонида Ильича можно было лично послушать.
Кроме того, Москва, Ленинград, Киев, Минск -- это далеко не весь СССР, так снабжение и всё такое прочее было намного лучше, чем в целом по стране. Недаром была типа загадка: длинное, зелёное, колбасой пахнет (ответ: электричка из Москвы).
Наконец, кружки -- это вообще ни разу не показатель, поскольку это организация -- а попробуй купить как частное лицо. (Ну и читай в таких условиях Хоровица с Хиллом про возможность заказа по почте чего угодно хоть из Мухосрановки-на-Аляске, а не только из Нью-Йорка).
Komrus
15.01.2025 09:02В Ленинграде, году так в 1989 купить хоть что-то из микросхем 580 серии в гос.торговле был шанс только в одном магазине на весь 5-миллионный город - "Электроника" на пр. Гагарина. И то - сугубо ножками приехать и убедиться, что сегодня не повезло :)
Микросхемы помельче - да, проскакивали в "Юных техниках" (штуки 3 магазинов на весь город)
Проц Z80 (я тогда ZX-Spectrum собирал) - тоже практически в одном месте можно было найти. На (тогда ещё неофициальной) толкучке около "Юного Техника" на Краснопутиловской :)
Viacheslav01
15.01.2025 09:02Вы удивитесь но в кружках и ныне все бесплатно. По крайней мере в школьных. Хотя кружков по сравнению с тем, что было в союзе, стало меньше.
Komrus
15.01.2025 09:02Лет несколько назад, когда младший активно ходил по кружкам - было ощущение, что кружков, по сравнению с советским периодом, стало поболее.
Районные и городской дворцы/дома пионеров - переименовались, но никуда не исчезли.
Появились "Кванториумы" (современные аналоги домов пионеров; также бесплатные) - со всякими техническими прибамбасами.
Плюс различные платные кружки - тоже снимают остроту вопроса и резко уменьшают очереди на попадание в бесплатные.Вспоминая своё пионерское детство в Ленинграде: записаться в кружок/секцию - тот ещё квест был (по крайней мере - в не-особо центральной части города, где мы тогда жили). Надо было строго в самом конце августа прибегать...
DvoiNic
15.01.2025 09:02Районные и городской дворцы/дома пионеров - переименовались, но никуда не исчезли.
Только там как-то всё тихо и уныло, по сравнению с теми временами...
Int_13h
15.01.2025 09:02Из опыта ребенка:
Кванториум (у нас он при детской железной дороге) оказался унылым, HTML изучали.
Из кружков: роботы на Lego Mindstorms (до 11 лет, потом выгнали типа неинтересно будет), предлагали 3D моделирование (принтеры и вот это вот все), но выбрал программирование и
удавапитон. В школе на трудах в 5 классе изучали Лего (те же роботы), сейчас всякий инженерный САПР (типа компаса), обещают Ардуину, но без паяльника.В целом даже продвинутые кружки по робототехнике, которые во всех соревках участвуют, останавиваются на типовых (отработанных поколениями - каждый год на соревнованиях одни и те же роботы) конструкциях роботов из желудей, палок и профилей, внутри ардуино/ягода и упправление со смартфона.
Где то при авиазаводе еще есть авиамодельный кружок "мейд ин СССР", но это надо очень фанатом быть.
VT100
15.01.2025 09:02Вполне можно использовать 3,3 В ПЛИС'ки с 5V tolerant входами. На приём адресов от 8080 будет работать эта фича, а на передачу данных к 8080 будет работать "естественное" согласование уровней при передаче от 3,3 V CMOS к (LS)TTL, описанное ещё у Хоровица с Хиллом (ЕМНИП).
ZekaVasch
15.01.2025 09:02На ютубе Алексей, любитель советских компов подробно собирал недавно микру 80.
Vinxru если не ошибаюсь
mmamayka Автор
15.01.2025 09:02Даа, он подогревал во мне интерес все время ковыряния в этом проекте!
Kotofay
15.01.2025 09:02Отличный гайд по Микро-80 и Океан-240(весьма грамотная ЭВМ)
https://www.youtube.com/@Alemorf/videosЗЫ: Очень понравилось в цикле по Микро-80 модификация дисплейного адаптера.
voldemar_d
15.01.2025 09:02Надо сразу взять Xilinx Spartan и реализовать на нём всё, как создатели ZX Spectrum Next сделали :-) Правда, из-за дороговизны и дефицита в последних реализациях они на другой FPGA перешли.
ash_lm
15.01.2025 09:02Впервые слышу про СБМ-20 в советских светофорах, да и поиск ничего не находит.
mmamayka Автор
15.01.2025 09:02Мне сказали, что это детали светофоров, я там нашел СБМ-20. В этом и абсурд ситуации)
Markscheider
15.01.2025 09:02Думаю, что это часть системы городского мониторинга. А датчики ставили на светофоры, т.к. удобно и есть, где провода сигнальные протянуть
salnicoff
15.01.2025 09:02А куда их тянуть? Светофоры в Ярославле работали автономно, «зеленую» волну сделали только на одном проспекте и то в самом конце 1980-ых...
DvoiNic
15.01.2025 09:02Решил собрать «Микро-80» на макетных платах по схемам
Это жестоко! Но только за такую безбашенность можно поставить плюсик!
Ну а к высказанным выше в комментах рекомендациям использовать FPGA - присоединяюсь.
зы. Микро-80 у нас в те годы в целом заработал, но дисплейный модуль мы так и не допаяли..
Zz2000
15.01.2025 09:02Я дисплей запустил в свое время, лет 30 назад, но в 2025-м заниматься подобной фигнёй занятие сомнительное. Охота поковырять ретро, можно запитлить 8080+8275+8279+память на каком нибудь циклоне. И то прикольные бы смотрелось. Впрочем это мое личное ИМХО, никому не навязываю.
DvoiNic
15.01.2025 09:02я периодически "думаю мысль" сделать эмуль PDP11/СМ4. Но лень пока побеждает...
Kotofay
15.01.2025 09:02Ностальгирую периодически тут https://skn.noip.me/pdp11/pdp11.html
Boot>boot rk1 ... .SH AL RT-11SJ V04.00C Booted from RK1:RT11SJ Resident Monitor base is 150076 (53310.) USR is set SWAP TT is set NOQUIET Indirect file abort level is ERROR Indirect file nesting depth is 3 PDP 11/70 Processor FP11 Hardware Floating Point Unit Extended Instruction Set (EIS) KT11 Memory Management Unit Cache Memory VT11 Graphics Display Hardware 60 Cycle System Clock No SYSGEN options enabled
SIISII
15.01.2025 09:02А я вот сейчас делаю несколько подпиленный римейк проца СМ-2420.01 -- в тырнетах есть схема и техописание, ну а это первый проц, какой в своё время я разобрал по косточкам, так сказать (году эдак в 1987-88) :)
Komrus
15.01.2025 09:02Насколько знаю, Микро-80 с своём первозданном виде, описанном в изначальных статьях в журнале "Радио" - был без схем печатных плат. Только принципиальные схемы. Собирать предлагалось каждому по своему разумению. То есть - на макетных платах по факту.
EskakDolar
15.01.2025 09:02Без советского кассетного магнитофона будет не то
Viacheslav01
15.01.2025 09:02Советских кассетных магнитофонов на авито как грязи.
Как раз себе недавно подбирал, для того, что бы посмотреть, что цифровой магнитофон на ленту пишет )
HardWrMan
15.01.2025 09:02Подержи моё пиво!
mmamayka Автор
15.01.2025 09:02Ого, крутоооо! Чем занимаются ПЛИСы? Один формирователь управляющих сигналов, насколько я догадываюсь, а второй делает страничную адресацию памяти судя по 512К Flash? Или это регенерация DRAM? А есть сорцы в открытом доступе?)
HardWrMan
15.01.2025 09:02Это просто чипсет, который заменил россыпуху. Вариант с россыпухой у меня тоже есть.
commanderxo
15.01.2025 09:02В открытом доступе с гербер файлами есть проект Сергея Кисилёва radio-86rk. Его я ещё не собирал, но Micro 8088 того же автора отлично заработал с первого раза.
rus-spb
15.01.2025 09:02При запуске такого от стороннего проца можно чуть упростить свою жизнь с паяльником.
На 8080 гарантированно нужна только напаянная ОЗУ-шка. Их сейчас реально найти и на все 64 кило.
На внешний контроллер надо завести: шину данных, reset, wr, rd, ready. Возможно, что-то ещё, сейчас уже надо думать чуть больше минуты.
Быстродействие внешнего проца тоже не важно при простейших довесках жёсткой логики снаружи.
Как выглядит процесс:
по сбросу проц читает первую команды всегда одинаково. Ставит адрес и читает "ПЗУ" – несколько раз. Далее, может быть, например, переход по новому адресу, или цикл записи данных.
Если сделать подсовывание от внешнего проца своего кода "из ПЗУ", можно имитировать выполнение заданной программы. Для замедления шустрости зажимая ready. Минимально надо всего два варианта таких циклов:reset; mov al,BYTE; mov ADDRESS,al; дать процессору записать BYTE по ADDRESS; reset --- если такое повторяется много раз, в нужной области ОЗУ появляется нужная нам программа. BYTE и ADRESS мы подсовываем нам нужные, в каждом цикле разные.
-
reset; jmp ADDRESS; отпускаем шину = запускаем свеже-записанную в ОЗУ программу.
Минимально этого уже хватит. Ready зажимается немедленно по падению WR или RD и отпускается по установке необходимого байта на шине адреса. 8080 сам заканчивает цикл. Если это делать, программу можно вообще грузить из компа по UART на любой скорости. Альтернатива – контроллер должен отрабатывать всё очень быстро. Загруженная в ОЗУ 8080 программа может уже самостоятельно, например, переписать нужный кусок во флэшь.
mmamayka Автор
15.01.2025 09:02Спасибо большое за совет. Именно этим я сейчас и занимаюсь: пытаюсь загружать программу в SRAM, а потом отпускать проц ее исполнять.
На 8080 гарантированно нужна только напаянная ОЗУ-шка
Подскажите, пожалуйста, почему? Чуть позже я все равно это распаяю, но пока делаю 10 ошибок на квадратный сантиметр хотелось бы держаться макетной платы.
da-nie
15.01.2025 09:02пытаюсь загружать программу в SRAM, а потом отпускать проц ее исполнять.
А зачем? Поставьте 32 кБ SRAM в верхние адреса, а в нижние какую-нибудь EEPROM/FLASH ПЗУ тоже на 32 кБ. Запишите в это ПЗУ программу получения данных и команд, скажем, по SPI с каких-либо портов (тут вам ВВ55 пригодится, помнится) ну, а ардуино пусть эту программу и передаст.
mmamayka Автор
15.01.2025 09:02Разумно! Спасибо большое за совет! Я почему-то думаю о своей ардуине как о панацее. Надо прекращать)
da-nie
15.01.2025 09:02Дам ещё совет не брать К580. А взять Z80. Ему только +5 В нужно.
c0mmandor
15.01.2025 09:02580ВМ80 может работать только от +5, на -5 подаем землю, на +12 подаем +5. При этом снижаются частотные характеристики, но работоспособность сохраняется, проверено практикой.
da-nie
15.01.2025 09:02Выше этот момент с напряжениями разбирался. Конкретный экземпляр может и не завестись. Это не штатная работа. Для Z80 (Т34ВМ1 или КР1858ВМ1) же это штатная гарантированная работа.
c0mmandor
15.01.2025 09:02100% это не штатный режим, но именно ВМ80 я не встречал не работающих в таком режиме (конечно мои эксперименты не показатель), в журнале, откуда я это когда взял, по-моему Р-Л каких то 90-х годов, писали что ИК80 ранние выпуски просто не работают в таком режиме, более поздние какие-то работают какие то нет, а ВМ80 вроде как должны.
da-nie
15.01.2025 09:02Я читал в ВК в обсуждениях 580 такие комментарии:
"Если не дать 580му +12 и -5 он издохнет! Проверено практикой!!!"
Так что у кого-то оно из строя-таки выходило.c0mmandor
15.01.2025 09:02ну если -5 и +12 в воздухе оставить при подключенной линии +5 то вероятно может быть и такой исход
da-nie
15.01.2025 09:02Я надеюсь, автор этого сообщения их в воздухе не оставлял. Это ж глупость неописуемая. :)
c0mmandor
15.01.2025 09:02вот, оставлю здесь ссылку на первоисточник, для интересующихся: публикация в 8 номере "Радиолюбителя" за 94 год. Гильманов, И. "Микропроцессор КР580ВМ80А в экономичном режиме". https://www.radioman-portal.ru/magazin/radiolubitel/1994/8.php
После прочтения, поскольку идея очень понравилась, тащить три источника действительно хлопотно, попробовал на нескольких экземплярах своих процессоров, на простейшем подключении, лишь бы начал команды считывать, убедился что действительно работает. Ну и память меня конечно подвела, ничего про особенности ИК против ВМ в статье не говорилось, видимо где-то в другом месте встречал, и возможно без привязки к экспериментам с питанием. Была какая то статья про историю разработки 580-й серии, может в Радио, но это уже не найду, да и не так важно это.
HardWrMan
15.01.2025 09:02Если говорить конкретно за ИК80 и ВМ80(А), то вся разница у них в верхней границе тактовой частоты и зависимость от питания. Всё это следствие качества кремния.
А вот если сравнивать ППА К580ИК55 и КР580ВВ55, то там есть большая разница в поведении. Например, если порт настроен на выход есть разница в том, что считается (FF, регистр вывода или физические ноги). Подробности уже не помню, увы.
mpa4b
15.01.2025 09:02Всё-таки между 8080 и Z80 есть принципиальная разница. В первом нет 'depletion mode' транзисторов (тех, у которых пороговое напряжение ниже нуля), во втором есть. Из-за этого первому и нужны 2 напряжения питания: обычная нмос-логика без 'depletion mode' транзисторов не дотягивает выходными уровнями до напряжения питания, но если мы её запитаем от +12в, то уровни будут достаточные, чтоб иметь честную "лог. 1" в 5 вольт на выходе, т.к. nmos-транзистор, соединяющий выход и шину 5в уже можно открыть уровнем, взятым от 12-вольтовой логики.
В случае с Z80 это всё не нужно, т.к. 'depletion mode' транзисторы работают как "идеальные" пуллапы, могущие дотянуть выход до 5в.HardWrMan
15.01.2025 09:02По большому счёту ВМ80 внутри 12ти вольтовый. Основная логика использует 12 а буферы выходов ножек используют 5.
Скрытый текст
И только ОЗУ регистрового файла использует 5 вольт для питания ячеек.
Скрытый текст
rus-spb
15.01.2025 09:02Потому, что Вас утомит разбираться как именно процессор выполняет тот или иной вариант кода. После сброса всё легко, надо изучить всего две-три последовательности: запись по адресу, переход на адрес, можно ещё чтение адреса. Далее повторяете то-же самое Х раз, или Y раз. В принципе, этого хватит, но можно ещё что-нибудь придумать для тестирования запускаемой серии :) . Так легко записать прогу в ОЗУ и запускать её там - но это всё.
А вот подсовывать процу нечто более сложное, это означает надёжно разобраться, предсказывать, где ему нужен фетч, где чтение данных, а где запись данных. Плюс к этому - прерывания, всякие системные состояния... Ох, утомит быстро. Из плюсов - начнёте понимать, как работают процы изнутри и что такое их конвеер. ...
Смиритесь с тем, что ОЗУшку всё-же надо/придётся паять и получите удовольствие :)
Ready полезно, т.к. быстродействие внешнего контроллера вообще не важно, хоть на тумблерах его делайте. Кстати, по этой технологии можно оживлять и платы на процах 8086, 80186, даже с клоком 50 МГц. Там только проводов управления надо чуть побольше.
tlittle
15.01.2025 09:02Недавно наткнулся вот на такой проект https://www.youtube.com/watch?v=ggm-KhYEMxs&t=320s
Он, правда, не на 580, а на z80, но идея кажется работоспособной.
sim2q
15.01.2025 09:02Если это делать, программу можно вообще грузить из компа по UART на любой скорости
Спасибо, интересно!
Тоже хочу запустить платку на Z80 с которой начинал, понятно что будет только RAM, 8051 тоже есть на борту, но идеологически некошерно прикручивать внешний загрузчик на МКrus-spb
15.01.2025 09:02Идеологически - как раз очень кошерно. Если у Вас малосерийное, даже среднесерийное производство это позволяет запаивать в платы чистые флэши, прямиком с завода/поставщика. И запускать / оживлять уже полностью смонтированное, но ещё не оживлённое изделие на столе регулировщиком после элементарных проверок. И запускать тесты, если есть проблемы.
Да, в крупносерийном производстве так не делают. Китайцы даже для тысячи штук с нас требовали hex прошивки проца, для заказа прошитой партии процов прямо на заводе-изготовителе (STM, NXP). Запаивалось строго уже зашитое.
Но до таких партий ещё надо дожить.
А если речь об отладке и загрузка у Вас быстрая, можно обойтись вообще только ОЗУхой, без ПЗУ/флэши.
Но это всё паралельная шина, эпоха 1980х, 1990х. Сейчас модно последовательные флэши, scl/sda.
Markscheider
15.01.2025 09:02в те времена люди САМИ доставали детали и по схемам собирали рабочие компьютеры? Без осциллографов, интернета и прочих радостей цивилизации?
Ну, справедливости ради, осциллографы тогда вполне себе были. И активно использовались при отладке
mmamayka Автор
15.01.2025 09:02Человек, у которого я докупал микросхемы говорил, что к осциллографу нужно было ходить, чтобы отладиться. Думаю, про то, что их не было я преувеличил. Все же не застал, как дела обстояли)
da-nie
15.01.2025 09:02Были, были. Тот же журнал Радио вам поо них расскажет. И покажет их доработки.
Komrus
15.01.2025 09:02Году в 1992 я прикупил где-то списанный двухлучевой осциллограф. На ЭЛТ. Как положено советской портативной технике - оснащён двумя ручками. Вес этой красоты - килограмм 50 был. Мы с одногрупником сильно вспотели, пока мне домой его тащили :)
Так что "ходить к осциллографу" - вполне верю :)
BillGilbertN
15.01.2025 09:02Мне на ДР в 1990 году отец подарил С1-67. Он всячески старался поддерживать моё увлечение радиотехникой/электроникой, которое сам же мне и привил. За что ему огромное спасибо!
В жёсткие 90-е ремонт телевизоров и организация кабельного телевидения кормила всю нашу семью - родителям почти не платили, зато я зарабатывал неплохо.
Я даже не представляю что было бы, если бы автору статьи предложили самостоятельно, с помощью лака для ногтей, фольгированного текстолита и хлорного железа изготовить плату для компьютера) А потом еще единственным (второе фиг достанешь!) сверлом на 0,7 ручной дрелью сверлить отверстия в плате)))sim2q
15.01.2025 09:02А потом еще единственным (второе фиг достанешь!) сверлом на 0,7 ручной дрелью
ну не сгущайте, а то потом слухи, что у нас медведи ходют....
бралась обычная швейная игла и затачивалась отвёрткой со скошенными углами.
не благодарите:)
DvoiNic
15.01.2025 09:02с помощью лака для ногтей,
стеклянным рейсфедером...
(эх,когда мы прочитали совет делать аналог стеклянного рейсфедера из пустого стержня от шариковой ручки... )
rus-spb
15.01.2025 09:02Кстати, ещё хотел сказать. Настоятельно рекомендую блокировочные кондюки вешать сверху на каждую паяемую микросхему. Независимо от тактовой. Такие зелёненькие, как у вас на фотках - по 47 нан - достаточно. И один электролит, допустим, 470 мкф в сторонке, в углу платы.
Плюс, соедините земли всех микрух типа положив сверху сетку тех же МГТФ-ов. Горизонтальную, плюс можно пару линий через каждую микруху по диагонали. Всё остальное у Вас, судя по фото, вполне работоспособно.
mmamayka Автор
15.01.2025 09:02Спасибо! Я почему-то под конец сборки начал пренебрегать конденсаторами, нужно будет довесить. А земли и питания на макетной плате снизу идут параллельными рядами и электролиты тоже в уголке сидят)
Но на самом деле вешаю конденсаторы скорее в рамках ритуальных практик и не совсем понимаю, чем вызвана их необходимость возле каждой микросхемы, тем более не понимаю, необходимость сетки из МГТФ. Предполагаю, мы таким образом пытаемся сократить разность потенциалов на длинной линии, но неужели габариты микросхемы настолько велики, чтобы у каждой стояла своя керамика? Или я фундаментально ошибаюсь?
rus-spb
15.01.2025 09:02На плате печатью сделана сетка горизонтальная, ... но это не сетка, а забор горизонтальных линий. Их можно/достаточно использовать, только добавьте вертикальные перемычки по возможности у каждого столбца микросхем от каждой строки на ближайшие.
Зачем? С некоторыми глюками лучше бороться превентивно, не рискуя скатиться в адепты тёмных религий :)
Есть очень толковый двухчасовой фильм по разводке печатных плат: "Земля в печатных платах / Слои, компоненты, секции, питание и переходы / Тренинг Рика Хартли". Посмотрите, пожалуйста. Он близко к этой и именно этой теме уделяет вполне достаточное внимание.
https://www.youtube.com/watch?v=c-VAPqNBDRU
Блокировочные конденсаторы нужны не для того, чтобы сокращать разности потенциалов на длинной линии, а чтобы внутри каждой микрухи не было бы глитчей по фронтам, когда переключаются широкие шины. Конкретная тактовая не важна. Важно именно быстродействие по фронту. Для Вашей платы и таких конденсаторов достаточно 22-68 нФ. Но на каждой микрухе, на ней, или под ней. А вот стадо электролитов по краям не нужно, бессмысленно, бесполезно, достаточно одного на плату.mmamayka Автор
15.01.2025 09:02А, понял про вертикальные перемычи. Спасибо за видео, я посмотрю. И керамики рассыплю по плате)
Luboff_sky
15.01.2025 09:02Радио-86РК. Не заработал((( мне было 15 лет. Как искал и на что выменивал деталюшки - отдельная тема. Плату выписывал почтой у какого-то кооператива.
А потом институт...и Синклер. Заработал! Кто помнит Аэлиту?
ahabreader
15.01.2025 09:02naked. Этот атрибут говорит компилятору не создавать пролог и эпилог функции (которые у нас и занимают бо́льшую часть кода!), но взамен требует принести тело функции в жертву — написать ее на ассемблере.
Документация использует ISR_NAKED с сишным кодом. В другом месте она запрещает не только C, но и extended asm (с двоеточиями и операндами), который в статье использован.
mmamayka Автор
15.01.2025 09:02Да, мне было очень обидно, что документация соврала по поводу возможности использования Си в
ISR_NAKED
,avr-gcc
не разрешил мне так делать, сказав прямым текстом, что он такого не поддерживает.Потому я воспользовался словом safely:
Only basic
asm
statements can safely be included in naked functionsИ проверил адекватность objdumpов. Отписывать вектор прерываний и их тела на асме в чистом виде было страшно лень...
ahabreader
15.01.2025 09:02Да уж, документация ведёт себя подозрительно ("extended asm or a mixture of basic asm and C code may appear to work..."). Но у меня avr-gcc не хочет ругаться на ISR_NAKED + C-код в ISR (C, C++, локально, на godbolt, на 5.4.0 .. 14.2.0).
AlexMih
15.01.2025 09:02Микро-80 - древний, и, честно говоря, не слишком удачный проект на этом процессоре. Я бы рекомендовал все же делать Радио-86 РК либо "Специалист". По ним и деталей надо меньше, и информации гораздо больше.
И еще, для отладки-трассировки тех систем вовсе не нужна аппаратура с еще большим быстродействием. Для этого нехитрой добавкой "пару ключей плюс кнопка" система вводилась в пошаговый режим, и можно было вволю глядеть даже тестером, по тактам, что происходит на шинах. Для эстетов можно было вывести все в ряды светодиодов.
HardWrMan
15.01.2025 09:02Микро-80 по сути букварный вариант использования чипсета. Практически копия из оригинального букваря на MCS80. Что в оригинале, что в журнале сложная машина разбита на функционально законченные блоки, которые можно собирать поэтапно получая некоторый результат сразу. Это сильно мотивирует. Его наследник по сути это ЮТ-88.
Что касается "хуже-лучше" то я бы не стал оперировать такими терминами при сравнении ЛК, публиковавшихся в журналах. Например, я люблю графику и поэтому топлю за Специалист (и его производные, вроде Специалист-МХ) потому что я с ним познакомился первым и Орион-128.2 потому что я его собрал и он так же графический. Однако, большинству простых людей достаточно и алфавитно-цифрового вывода, поэтому они собирали Радио-86РК или Микро-80/ЮТ-88. Например, радиолюбители, которые вели на них журналы и даже позже прикрутившие трансивер и получив электронный TTY. Это просто разные по назначению и частично совместимые программно компьютеры.
Последний аргумент это простота схемы и сборки. Тут, конечно, в лидерах Специалист "Экспресс", а тот же Радио-86РК пестрил дефицитными на актуальное время БИС КР580ВГ75 и КР580ВТ37. Я знаю - батя мой был увлечён. Я же собрал Орион потому что там из комплекта только процессор требуется, а его было много - факт. Остальное формировалось обычной логикой, которая так же валялась под ногами.
salnicoff
15.01.2025 09:028080/580 и «Ардуина»... Кто бы мог подумать...
А дальше можно попробовать собрать ЮТ-88, он в минимуме использует клавиатуру от калькулятора и экран от него же. Клавиатуру можно и на дверных звонках собрать...
P.S.: Плюсик Вам в карму авансом за Ваши будущие эксперименты!
Kobzar_habr
15.01.2025 09:02Если под словом "процессор" в названии статьи Вы имели ввиду КР580ВМ80А, то он вовсе не из журнала "Радио" – редакция журнала "Радио" их не выпускала.
Насколько я знаю, К580ИК80 (так он сначала назывался) не является ПОЛНОЙ копией Intel 8080. Впрочем, их было несколько вариантов, выпускаемых разными заводами, может быть и ПОЛНАЯ копия была.
В 1983 году я стал подписчиком журнала "Радио", так что этот журнал, начиная с февральского номера (именно в нём была опубликована первая схема "Микро-80" – процессорного модуля) повлиял на выбор профессии.
В 1985 или 1986 году (не помню), учась в 8 классе, я начертил свой вариант схемы процессорного модуля "Микро-80" с максимальным использованием ИМС МПК КР580.
HardWrMan
15.01.2025 09:02Насколько я знаю, К580ИК80 (так он сначала назывался) не является ПОЛНОЙ копией Intel 8080. Впрочем, их было несколько вариантов, выпускаемых разными заводами, может быть и ПОЛНАЯ копия была.
Никогда не была. Все версии даже самые ранние являются результатом переосмысления инженеров СССР. Декап который мы делали последние 15 лет это доказал. Более того, русский вариант ВМ80А преодолел планку в 3МГц и некоторые экземпляры могли взять даже 4МГц, в то время как для i8080A 2,5МГц было по паспорту а на 3МГц заводились не все экземпляры. При этом, ВМ80А грелся заметно меньше чем i8080A на тех же частотах.
vital72
15.01.2025 09:02AMD AM9080A-4DC по паспорту рассчитан на 4МГц. Intel 8080A-1 изначально на 3МГц, ему и преодолевать ничего не надо и, кстати говоря, даже процы без индекса (8080A) спокойно тянут 3 МГц долговременно. А меньше всего греется проц от National Semiconductor. По моим ощущениям советский КР580ВМ80А (пластик) греется ничуть не меньше интеловского.
HardWrMan
15.01.2025 09:02Верно, предпоследняя итерация действительно 3МГц по паспорту:
Но это уже на излёте и я не встречал его в дикой жизни (но это не показатель). Далее, его последователь А-2 почему-то откатили назад на 2,5МГц:
Внезапно, да?
PS Время в заголовке указано для самой короткой инструкции в 4 такта, в таблице параметров указано 0.32 мкс и 0.38 мкс для минимального периода такта соответственно.
ABRogov
15.01.2025 09:02являются результатом переосмысления инженеров СССР. Декап который мы делали последние 15 лет это доказал. Более того, русский вариант ВМ80А преодолел планку в 3МГц
Ага, преодолел, лет через 10, когда уже 286 были во всю.
Javian
15.01.2025 09:02КР580 использовался в роли массового универсального микроконтроллера для разных устройств от принтеров до терминалов. А ПК на нем строили любители изза его широкой доступности.
axe_chita
15.01.2025 09:02Ага, преодолел, лет через 10, когда уже 286 были во всю.
i8080 1974 год
КР580ВМ80А 1977 год
Как бы не наблюдается разрыва в десять лет ;)
HardWrMan
15.01.2025 09:02При этом, это не оптическая копия, а именно переосмысление. Т.е., полный реверс в транзисторную и логическую схемы, оптимизация, адаптация под имеющиеся техпроцессы и компиляция новой литографии.
SIISII
15.01.2025 09:02Поправка: 1977 год -- К580ИК80, переименование произошло позже, когда расширили номенклатуру обозначений микросхем (главным образом, ввели обозначения для микропроцессоров и иже с ними -- ВМ, ВИ, ВТ, ВВ...)
Kotofay
15.01.2025 09:02Можно навесить на процессор статическую ОЗУшку и ардуиной в неё писать код через USB. КМК, так будет проще и отлаживаться и не мудрить с загрузкой программ в ОЗУ и прошивок ПЗУ.
Собирал так же когда то РК86 и он сразу заработал (плата была корректная), кроме пресловутой ВГ75. Проверял работоспособность процессора точно так же -- вслепую написал EI-DI и динамик запищал. Радости не было предела. Потом ВГ-шку в панельку пришлось вставлять, дорожки от перепайки покоробились.
Позднее ремонтировал видеотерминалы серии ВТА-2000, там используется как раз ВМ80, и схема процессорной части до боли была знакомая, но сложнее.
mmamayka Автор
15.01.2025 09:02Можно навесить на процессор статическую ОЗУшку и ардуиной в неё писать код через USB. КМК, так будет проще и отлаживаться и не мудрить с загрузкой программ в ОЗУ и прошивок ПЗУ.
Это мой следующий пункт плана)
Позднее ремонтировал видеотерминалы серии ВТА-2000, там используется как раз ВМ80, и схема процессорной части до боли была знакомая, но сложнее.
Дааа, я из нее вытряхнул абсолютно все, местами даже нужное, так что проще там, как мне кажется, уже буквально некуда.
На самом деле даже сейчас запустить эту зверушку для меня было огромной радостью и удовольствием. Очень сложно представить, сколько эмоций это вызывало в те времена!
tlittle
15.01.2025 09:02Заостряю на этом внимание только потому, что единой документации на КР580ВМ80А я не нашел. Отыскал лишь несколько сухих страниц в советском справочнике «Микропроцессоры и микропроцессорные комплекты интегральных микросхем».
Вы шутите? Кажется, это одна из самых документированных микрух того времени. Более того, в 90-х нас, студентов-радиотехников, заставляли проектировать все, что угодно, на базе этого комплекта (часы, АОНы, фиг уже вспомню, что). А чего не хватило в справочнике? Ролика с Ютуба?
mmamayka Автор
15.01.2025 09:02Не хватило в справочнике понимания временных диаграм. Мне было непросто практически впервые разбираться в одной единой царь-диаграмме, в которой было все поведение микросхемы. Еще и в шакальном скане:
Я не спорю, что, возможно, их умел читать каждый пионер, но я не пионер и это не моя основная область деятельности, а один из способов провести выходные. 5 сухих страниц vs. талмуд документации к 8080.
Если вы можете подсказать мне какие-либо полезные материалы про комплект КР580, буду очень рад.
SIISII
15.01.2025 09:02Брать и читать оригинальные интеловские даташиты (собственно, советские -- это их переводы, иногда с косяками, иногда обрезанные). Плюс, у Интела были книжки про использование их железяк -- с примерами и прочим.
tlittle
15.01.2025 09:02Хм... на первой странице поиска:
https://portal.sibadi.org/pluginfile.php/5538/mod_resource/content/1/MU_po_laboratornym_rabotam_MPSU_1.pdf
https://www.bsuir.by/m/12_100229_1_65756.pdf
Во втором документе на последней странице список использованной литературы.
GidraVydra
15.01.2025 09:02счетчик Гейгера-Мюллера СБМ-20, которые, как мне сказали, были скручены с советских светофоров в давние времена
Несолидно как-то, я бы на светофоры как минимум гамма-спектрометры ставил, и сцинтилляционные камеры.
crackcraft
15.01.2025 09:02Тут уже упомянали ЮТ-88. Основная идея - помодульное создание и тестирование.
Вот первый материал из серии
https://jt-arxiv.narod.ru/DjVu/utpril/utpr8902.djvu
и далее по выпускам
https://jt-arxiv.narod.ru/utpril89.htmlJavian
15.01.2025 09:02Тут интересный гайд по сборке https://alemorf.github.io/retro_computers/UT-88/how_do_i_build.html/russian.html
VT100
15.01.2025 09:02Вчера была статья о ROM-эмуляторе для консоли Atari. Там STM32 работал просто в цикле, без каких либо прерываний. И тут можно попробовать то же самое, чтобы исключить все возможные накладные расходы.
Dm_Dm
15.01.2025 09:02Это пишет человек, который на работе делает ТСПУ?
axe_chita
15.01.2025 09:02Не хватало только одного — процессора КР580ВМ80А, который при ближайшем рассмотрении оказался клоном процессора Intel 8080.
Как я уже говорил, процессор КР580ВМ80А — это полная советская копия процессора Intel 8080, так что вся (или почти вся) известная информация об Intel 8080 верна и для нашего подопытного.
КР580ВМ80А не КЛОН, а аналог i8080, так как при его создании киевлянами были устранены обнаруженные ошибки в топологии и была проведена оптимизация схемы микропроцессора. Кстати, для оптимизации схемы i8080 использовалась БЭСМ6. Поэтому у них разное количество элементов на кристалле. Так что корректнее КР580ВМ80А называть аналогом i8080, или его сервис релизом от USSR ;)
HardWrMan
15.01.2025 09:02Следует уточнить, что ВМ80А аналог i8080А. Аналогом i8080 были ИК80 и ВМ80 (как второе поколение разработки). Отличия только в электрических и частотных показателях, в плане программной и потактовой совместимости они полностью идентичны и взаимозаменяемы.
axe_chita
15.01.2025 09:02И кстати из-за этой полной взаимозаменяемости и низкой цены ВМ80А имел определенный коммерческий успех на Западе среди производителей терминалов.
Dm_Dm
15.01.2025 09:02А как же копирасия?
axe_chita
15.01.2025 09:02А что Интел мог сделать СССР и СЭВ? Они же "А что ты мне сделаешь? Я же в другом городе живу!" Только пальчиком погрозить! И плюсом к тому, Интел тогда 580вм80а вскрыли и публично признали что топология у кристалла отличается от 8080А.
Int_13h
15.01.2025 09:02Вспоминается история эпического баттла "Intel vs. AMD", после которого х86 (с 386ых?) под своей маркировкой не делал только ленивый.
axe_chita
15.01.2025 09:02Всё было точностью до наоборот, до появления 386 (DX) x86 клепали "все кому не лень", и Intel смотрела на всё это сквозь пальцы. Но с выходом 386 Intel вдруг осознала, что её конкуренты AMD/Harris/NEC/Siemens чересчур оперились, и своими решениями мешают Intel стричь купоны (ЕМНИП 286@25mhz от Harris был существенно быстрее оригинального 386@16mhz, а столил Harris в разы дешевле). И тогда Intel "выпустили Кракена", юридический отдел начал массовые юридические преследования и мелкие секондсоурсы, легальные и не очень, стали отлетать на раз-два, а крупным пришлось пойти в суд.
SIISII
15.01.2025 09:02Это ещё может быть связано с изменениями в законодательстве. Архитектуры (т.е. системы команд и всё, относящиеся к "точке зрения программиста") в 1960-70-х не защищались, а соответственно, любой мог выпускать свои реализации чужих архитектур (в частности, поэтому СССР ничего не нарушил, позаимствовав у IBM, HP и DEC их архитектуры). А вот позже, насколько знаю, это дело стали защищать юридически.
axe_chita
15.01.2025 09:02Так вроде Intel в судах стала защищать не систему команд х86 (которая была публичной), а микрокод внутри микропроцессора ;)
Viacheslav01
15.01.2025 09:02Ну как самый простой вариант, можно воткнуть между ардуиной и вм80 регистр по шине данных. Как только процессор выдает сигнал запроса данных, поджигаем останов и не снимаем его пока не запишем очередной байт в регистр, после этого снимаем останов и радостный процессор забирает посылку.
Дешево и сердито, но чтение по байту за раз )
radiolok
Все же использовать Arduino в роли периферийного контроллера - перебор. при своих 16МГц она не будет ничего успевать делать - что и показал ассемблерный дебаг.
Я сейчас делаю похожую задачу - делаю плату для дебажного порта пишущей машинки на базе Z80 на 2.5МГц. Ее задача мониторить адрес/данные системной шины и по usb выплевывать Коната трассу того что там такого выполняет проц. Прошивка явно живая - активничает по периферии, но внешне машинка не работает :)
Так вот смотрю на BlackPill на базе stm32f411 и думаю - а хватит ли мне 100МГц для такого или половину времени буду WAIT держать? В описанном в статье эксперименте отношение частот 1к32, у меня 1к40... Быть может лучше ПЛИС на роль периферии?
mmamayka Автор
Это правда - с Arduino получилось больше мороки, но я этого не понимал с самого начала, так что использовал то, что было под рукой. Дальше, когда буду наращивать периферию, попробую использовать что-нибудь более шустрое. ПЛИС я трогать не хотел, так как опыта разработки очень мало, да и в схемотехнике не очень силен. Не хотел получить второй активный излучатель багов.
Мне кажется (но я не экспертен), что успевать выплевывать plain text трассу, не зажимая WAIT, при таком соотношении частот маловероятно, так как только на формирование строк уйдет пару десятков инструкций. Я хочу попробовать, пока у меня не появилась STM-ка, держать перед Ардуиной логическую схему, которая будет дергать её за прерывания, чтобы избавиться от ветвлений в обработчиках и дать себе большего пространства для маневра. Хотя думаю, что дело в итоге все равно придет к ПЛИС.
SIISII
Ну, отладить логику взаимодействия и т.д. и т.п. вполне можно и на Ардуине -- скорость в данном случае не требуется. А перенести уже отлаженное будет, думается, несложно.
mmamayka Автор
Я буду пробовать, спасибо большое за рекомендации!
SIISII
Если будут вопросы, спрашивайте: тут пока что ещё довольно много тех, кто с подобными древностями работал :)
nextbystander
Если вы не стремитесь к максимальной скорости и точности временных интервалов, то можно легко решить задачу без всяких ПЛИС. Сорок лет назад это делалось одним корпусом триггеров. Вот примерная схема для пошагового выполнения команд. На каждое нажатие кнопки выполнялась одна команда и процессор останавливался. Этот кусок схемы был откуда-то утянут, может что-то и напутано в полярности сигналов, давно это было. Так как Arduino не дает дребезга можно оставить только второй триггер, подключив вывод Arduino прямо к тактовому входу триггера. Сигнал /SYN это инвертированный SYNC.
mmamayka Автор
Ооо, как просто! Спасибо, я соберу себе для отладки. Но в целом логика поведения меня меньше челледжит, чем попадание во временные интервалы, потому READY дергать не хочется до последнего
nextbystander
Собственно говоря, что вас смущает в использовании READY? Он и придуман для работы с медленной периферией и памятью. Представьте, что Arduino это память с выборкой 5 или 10 микросекунд, лень считать точно. Arduino получила прерывание, без спешки выставила данные эмулируемой памяти, толкнула триггер RDY и ждет следующего прерывания. Для запуска системы и начальной отладки более чем достаточно. Можно и процессор перевести на 2 МГц, все будет работать.
Как развитие темы можно сделать отладчик на Arduino, с хардварными точками останова, трассировкой ну и дальше насколько хватит фантазии.
В любом случае сейчас это все на порядки проще чем тактовая кнопка и 24 светодиода на линиях адреса и данных для пошаговой отладки.
IgorPie
Радио-86рк дебажили пошагово примерно этим поделием
Yrust
Я делал минимальную схему на старой ПЛИС для запуска 8085 и Z80. До 8080 руки как-то не дошли. В принципе и на Ардуино всё это можно реализовать, если не гнаться за скоростью. Можно, как подсказали ниже, использовать RDY, а можно и тактовую частоту понизить. Только у 8080 есть нижняя граничная частота, кажется около 200кГц.
Не бойтесь ПЛИС, это довольно просто и наглядно. Не надо собирать макетку, паять перемычки и т.п. Всё можно нарисовать в режиме схемного ввода или на каком-либо языке описания схем и сразу прошить в чип. И если что-то не заработало, за минуту найти и исправить ошибку.
mmamayka Автор
У ВМ80А если я не ошибаюсь нижняя частота 500КГц, собственно на них он у меня и ходит.
А так да, спустя два дня чтения комментариев я прогнал максимализм и уже предельно близок к тому, чтобы подрубиться к READY и достать плисину)
Yrust
Если интересно, вот ссылка на мой проект 8085 на ПЛИС. https://zx-pk.ru/threads/34792-i8085mini-i-plis-(cpld).html
mmamayka Автор
Спасибо, я изучу!
FuzzyWuzzy07
А как насчет использования ESP-шки? Там и частота будет приемлимая. А если сама логика может работать и при очень низких частотах, то можно и напрямую всю инфу о сигналах и уровнях на пинах выводить через COM порт на монитор и анализировать.
salnicoff
А что за машинка, если не секрет?
sim2q
https://t.me/brainfuckpc/4605
radiolok
Машинку спас от забвения около 8 лет назад, родная мат. плата очень сильно пострадала от протекших батареек - спаял ей новую. Прошивка выглядит живой
Слева у платы как раз расположен краевой разъем для дебажных плат (есть даже фотографии подобных устройств) - там шина адреса, данных и все линии управления процессором. Также там можно поставить 2кб епромку - она будет расположена по адресу 0х3800 и после ребута управление уйдет на нее, с полным доступом к драйверам устройства по нижестоящим адресам.
Процессор живой, все CS шевелятся, но визуально никакого движения на машинке пока нет. Я в процессе дебага.
HardWrMan
Я помню машинку Ромашка, со шрифтом на ромашке. Она была на ВМ80А.
radiolok
Если ваша Ромашка выглядела так же как моя - то знаю такую. Я еще находил ПЭЛК "Элема" - по внешнему виду и механике 1к1 как роботрон, но мат. плата на ВМ80А. Явно более новая разработка нежели роботрон - уже два корпуса ПЗУ и один корпус ОЗУ. Но более простая - семисегментников на ней нет спереди, только светодиоды. Сейчас в муромском кибер-музее выставляется.
Другие машинки с Ромашкой мне тоже попадались, более компактные. Но процессор там был зарубежный, какой - уже не помню.
salnicoff
Нет. «Ромашки» делали на 1801, микросхемном клоне PDP-11.
HardWrMan
КР1850ВЕ35
salnicoff
Это уже поздняя версия какая-то, воткнули что попало, видимо, из-за дефицита. Ну или пытались какие-то дополнительные фичи сделать типа подключения к компьютеру. Первые несколько ревизий на 1801 были.
salnicoff
Круто! Удачи в работе! Пишите почаще!