nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 13 Aug 2020 22:52



Reply to topic  [ 10 posts ] 
Прогон программ для 8008 и 6800 на КР580/Z80 
Author Message
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
.
До сих пор единственным средством прогона программ одних процессоров на других была их программная эмуляция. Но это очень тормозящее прогон средство. Например, эмулятор РК86 написанный для ОРИОНА на Z80 тормозит в ~30 раз, а эмулятор Apple-II написанный для ОРИОНА на Z80 тормозит в ~40 раз. Эмуляция голого процессора (без экрана, клавиатуры и ПЗУ другого компьютера) даже родственного процессора тормозит минимум в 20-25 раз.

Некоторые люди мечтают поиметь первый 8-ми разрядный процессор 8008 и попробовать программировать для него. 8008 довольно ущербный - у него всего 48 команд вместо 78 команд у КР580 (158 команд у Z80). В частности, 8008 хуже работает с данными в ОЗУ, т.к в ОЗУ он может лазить только косвенной адресацией через регистровую пару HL (нет команд LDA/STA, LDAX/STAX, LHLD/SHLD; INX, DCX тоже нет). И данные в/из стека 8008 перемещать не умеет, стек только для адресов возврата из подпрограмм.

Т.о хотя игры "Принц Персии" и "Doom" для 8008 написать не получится (из-за скорости, а вовсе не нехватки 16 кб, - ОЗУ несложно добавить) и программировать для 8008 намного сложнее, чем для КР580, но в общем-то любую программу не особо критичную к скорости прогона можно написать. А главная особенность 8008 в том, что все его регистры и флаги есть в процессорах 8080 и Z80 и все его команды входят как подмножество в систему команд процессора КР580 ВМ80. Коды команд разные, но число байтов в командах одинаково. 16-разрядные данные передаются и хранятся в ОЗУ в том же порядке (старший, младший). Это и даёт нам некоторые неожиданные возможности для аппаратной эмуляции 8008.

Первым персональным компьютером считается Mark-8 на процессоре 8008. Тогда же в 1974 году на процессоре 8008 был выпущен компьютер Scelbi-8. Настоящие ценители ретро-машин должны быть заинтересованы сделать свою реплику Mark-8 или Scelbi-8, чтобы гонять на нём их исторические программы.

Микропроцессор Intel 8008 выпущенный в апреле 1972 года - предельно близок по архитектуре к последующему интелловскому процессору 8080. Увы, оригинальные процессоры выпущенные в начале 70-тых от времени в массе своей уже издохли, а оставшиеся из-за безумных коллекционеров стОят колоссальные деньги. Клон этого процессора U808D также производился в какой-то стране под именем ГДР (и аж до начала 80-х годов), но всё равно достать даже его невозможно. И кроме того, для 8008 чтобы не реализовывать демультиплексию шин на мелкой TTL-логике желательна периферия (мультиплексируемые ОЗУ, ПЗУ и порты) от МПК серии 4004.

Ввиду того, что цены на процессор 8008 высоки и пока тенденции на их падение не прослеживается, сделать реплику Mark-8 можно лишь используя клон процессора 8008 реализованный на современном скоростном микроконтроллере (если даже Z80 в котором 8.500 транзисторов так делают, то и 8008 с его жалкими 3.500 транзисторов можно с'эмулировать в программируемом кристалле). Но для тех, кто не в состоянии написать на языке Verilog эмулятор процессора 8008 и не имеет оборудования для прошивки, могу предложить одну необычную идею. Идею аппаратной эмуляции 8008 с использованием процессора КР580. Возможно это позволит прогонять даже оригинальные программы для CPU 8008 без всякой адаптации.

Т.к у процессора КР580 те же регистры и те же команды, что и у 8008, то, если есть исходник, то программа для 8008 легко переделывается в программу для КР580 и транслируется в коды КР580. Но это справедливо и аппаратно.

Если взять программу из команд процессора 8008 и скормить её процессору КР580 выполняя при чтении кода команды аппаратное перекодирование кода команд 8008 в коды соответствующих команд КР580. Т.к 8008 имеет низкий максимальный клок, а из-за мультиплексированной шины работает в несколько раз медленнее (эффективный такт порядка 200 КГЦ), то запаса скорости КР580 хватило бы не только на аппаратную эмуляцию аналогичных команд, но и программную эмуляцию отсутствующих у КР580 команд 8008. По счастью, в случае 8008 программно эмулировать не требуется, т.к все команды 8008 являются подмножеством команд КР580.

Аппаратное перекодирование байта легко сделает любое 8-ми разрядное ПЗУ с объёмом >= 256 байт (например 556 РТ5). Тогда из ОЗУ читается код команды 8008, а процессору КР580 на шине данных выставляется код аналогичной команды КР580. Большинство команд 8008 есть в КР580, за исключением команд для работы с 7-ми уровневым резидентным стеком 8008. У КР580 стек во внешнем ОЗУ, а у 8008 стек внутренний внутри процессора. Но это не должно стать проблемой, т.к 8008 адресует всего 16 кб адресного пространства, а КР580 аж 64 кб. Потому если при старте системы ставить стек КР580 выше адреса $400E, то команды работы со стеком 8008 также можно эмулировать аппаратно (если конечно нет неизвестных мне "засад").

Благодаря сигналу SYNC по которому в КР580 на шину данных выдаются флаги о последующем маш.цикле легко зафиксировать маш.такт в котором процессор читает код команды, т.е первый байт команды (8008 тоже выдаёт SYNC, но флаги операции выдаются не на шину данных, а на S0, S1, S2).

Увы, не так много осталось людей ностальгирующих по 8008 (а оставшихся добивает коронавирус). Меня в общем-то сейчас не волнует программирование для 8008, т.к есть гораздо более приятный процессор 6800. Потому я надеюсь что, смогу придумать как сделать аппаратно-программную эмуляцию 6800 на похожем принципе. Эти имеет смысл ввиду отсутствия скоростных 6800.

Надеюсь, что частично аппаратно, частично программно можно с'эмулировать процессор 6800 на Z80. Похоже, что за счёт частично программной эмуляции можно с'эмулировать нормальные (т.е прямые) микропроцессоры. Искривлённый микропроцессор 6502 таким образом с'эмулировать сложно и получится намного тормознее, т.к ни в КР580, ни в Z80 нет таких извращённых методов адресации, что есть в 6502 (там аж 13 методов адресации, хотя нормальным процессорам достаточно 3-4 метода).

Программная эмуляция может делаться так. Если встречается команда 6800, для которой у Z80 нет аналогичной похожей команды, то с выхода ПЗУ перекодирования процессор получает код команды RST 0 и по ней делается уход на процедуру эмуляции "левой" команды 6800. В этой процедуре эмуляции процессор смотрит какой код команды вызвал проблему и переходит на подпрограмму программной эмуляции этой команды не имеющей аналогов в Z80. Благодаря запасу скорости у Z80 8 МГЦ и тому, что, как минимум, половина команд эмулируется аппаратно (т.е прогоняется с заметным выигрышем по скорости), то программная существенно более медленная эмуляция части команд затормозит прогон не фатально и средняя скорость будет в разы выше оригинала.

Вместо ухода по RST можно использовать прерывания. Обслуживание прерывания в КР580 и Z80 по INT пришедшему в середине команды начинается прямо со следующей команды, так что здесь засад быть не должно. Но с прерываниями деталей больше. У меня есть работающее МП ядро на 6800, на котором я проверяю работу команд 6800 в ходе написания эмулятора 6800 на PC. Так что возможность сравнения при отладке эмуляции есть. По деталям аппаратный эмулятор 6800 (например, в РК86 или Специалисте) может вылиться всего в несколько не очень дорогих TTL-корпусов 555-й серии и ПЗУ.

Хотелось бы услышать мнения специалистов о наличии аппаратно-программных "засад", которые я не учёл. Если не найдёте, то можете просто признать, что это абсолютно новая и победительная идея для расширения системы команд КР580 ВМ80 до системы команд экзотического процессора КР580 ВМ1.


Last edited by barsik on 16 Jul 2020 17:21, edited 1 time in total.



16 Jul 2020 11:11
Profile
Novelist

Joined: 05 Jul 2020 15:08
Posts: 49
Location: Ижевск
Reply with quote
6502 был полностью выполнен на дискретных транзисторах, тогда можно ли провернуть такое же с 8008 (хотя бы на простой логике)?

Кстати, похожий на предложенный механизм трансляции используется в Эльбрусах для поддержки архитектуры x86. Вообще,
КМК это больше похоже хоть на аппаратную, но всё-же эмуляцию :econfused:


16 Jul 2020 13:36
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Русскую википедию про 8008 надо дополнять переводами из вражеской википедии. Узнал из других источников, что была ещё куча других компьютеров на 8008 и даже раньше, чем 1974 (некоторые даже были не в США, потому их не особо пропагандируют). Хотя из-за тогдашней дороговизны ОЗУ/ПЗУ и периферийных БИС эти машины не стали массовыми (тираж в лучшем случае 100-150 машин). Самой продвинутой похоже оказалась Sac State 8008, т.к имела DOS с винчестером, цветной дисплей, клавиатуру, модем, перфосчитыватель, МГ-адаптер и обслуживала принтер. Что, как я и написал выше, чётко доказывает, что система команд 8008 позволяет написать любую программу. Кстати, инженеры догадались аппаратно усовершенствовать МП-систему на 8008 добавив узел для внешнего стека. Ностальгирующие о программировании для 8008 старые энтузиасты даже делают реплику Sac State 8008.
dvarkin wrote:
6502 был полностью выполнен на дискретных транзисторах
Это доведение идеи ретро-хобби до абсурда. Я такого не понимаю. Конечно каждый в этом хобби сходит с ума по своему, осуждать не будем. Но в принципе, всё хорошо в меру.

На этом форуме (если МНИП, или ещё где-то, память уже не та) видел более интересную ссылку на 6502 сделанный на TTL-микросхемах. Это ведь намного проще, т.к это всего несколько сотен корпусов TTL логики, счётчиков, регистров, сумматоров, РПЗУ и др. Там было всего несколько сотен микросхем и скорость прогона была намного выше, чем эффективный такт всего в 50 КГЦ. Кажется и ранние DEC-процессоры любители так реализовывали. И даже релейные компьютеры (что сделал Конрад Цузе) из начала 40-х годов любители реплицировали.

Кстати, при разработке и отладке в железе прототипа Motorola 6800 (опять таки, если МНИП) этот процессор (содержащий в кристалле более 4000 транзисторов) был смакетирован на 451-ной TTL-микросхеме среднего уровня интеграции, уместившихся всего на ~десятке небольших печ.плат. А после замены некоторых TTL-узлов на РПЗУ и лог.матрицы число корпусов ещё сократилось на две сотни.
dvarkin wrote:
можно ли провернуть такое же с 8008 (хотя бы на простой логике)?
Исходя из вышеизложенного (и того, что в 8008 транзисторов на 500 меньше, чем в 6502), - конечно.

Но смысл? Тогда уж дешевле и проще обойдётся купить оригинал 8008. А ведь для построения компьютера на железном 8008 ещё надо покупать мультиплексируемую периферию 4004. И в первом посте я, вроде бы, выразил мнение, что тот же результат (прогон оригинальных программ 8008) можно достичь истратив всего 5 не особо дорогих TTL-корпусов и две РПЗУ 556 РТ4.

Но ещё проще (в случае, если эмуляторов SacState-8008, Mark-8, Scelbi-8 не найдётся) взять все имеющиеся программы для 8008 (вряд-ли их сохранилось особо много), дизассемблировать и просто перетранслировать в коды КР580. Это не проблема, т.к все команды 8008 входят как подмножество в процессор КР580 ВМ80 и КР580 ВМ1. Затем взять РК86, модифицировав ROM-BIOS конкретной исторической модели (например Scelbi-8) под железо РК86 для ввода/вывода об её клавиатуру/экран (в ретро машинах из 70-тых интерфейс с терминалом делался по посл.интерфейсу) и можно запускать бейсик для Scelbi-8.

А чтобы почувствовать ущербность 8008 даже возиться с электро-паяльником и губить остатки здововья ядовитыми парами свинца и канифоли не требуется. Берём РК86 с резидентным ассемблером-редактором "Микрон" (резидентный значит прошитый в ROM-диске или прошитый в расширенное ПЗУ C400...FFFF) и пытаемся написать более-менее серъёзную программу используя только команды, что есть в 8008. И тогда через полчаса станет ясно, что программировать для 8008 неудобно и по сравнению с ним процессор КР580 - это существенный шаг вперёд.

Ещё было бы интересно поиметь компилятор PL/M, что изначально в 1972 году транслировал для процессоров 4004 и 8008. Но это проблематично. Этот компилятор работал на PDP-10 (это недорогой и потому популярный в начале 70-тых майн-фрейм) и хотя эмуляторы столь популярного майн-фрейма для PC имеются (гуглится), но самого килдэлловского компилятора PL/M-8008 найти не смог.

Процессор 8008 производился более 10 лет, но основное применение он получил не в компьютерах, т.к в сравнении с 8080 и 6800 был слаб. Но для самых простых промышленных контроллеров и бытовых калькуляторов его возможностей хватало. На процессоре 8008 в 1972 году можно было сделать себе бюджетный калькулятор. Т.к калькуляторы тогда стоили от $395, а при цене 8008 в $120 и цене TTL-корпусов в $2 можно было уложиться в немного меньшую сумму.


Last edited by barsik on 17 Jul 2020 10:05, edited 5 times in total.



17 Jul 2020 03:33
Profile
Novelist

Joined: 05 Jul 2020 15:08
Posts: 49
Location: Ижевск
Reply with quote
Пример с 6502 на транзисторах я привёл, чтобы показать не такой уж и высокий уровень сложности подобных дел — первое что нагуглил. Конечно, я не предлагаю делать проц на транзисторах и упомянул про ТТЛ ИС (хотя, для троичной логики…).

Кроме того, после изучения англоязычной Википедии обнаружил, что 8008 был создан по образу дискретного процессора на ТТЛ логике терминала Datapoint 2200, но CTC продолжила использовать дискретный вариант втч из-за превосходящей скорости!

Трансляция команд на лету мне всё равно представляется как автомат, который можно:
а)сымитировать с помощью МК, как нормальные люди;
б)реализовать на мелкой и не очень логике, РПЗУ, ПЛМ и ПЛИС.
В любом случае, если есть сферические 8008-шники в вакууме, то предпочтут ли они ВМ80+автомат "чистым" автоматам, если КМК ВМ80 для них как для некоторых ретрокомпьютерщиков AVR?


17 Jul 2020 05:41
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
dvarkin wrote:
6502 был полностью выполнен на дискретных транзисторах, тогда можно ли провернуть такое же с 8008 (хотя бы на простой логике)?

Безусловно можно. Найди в Интернете ссылку "Кольцо самодельных процессоров" что-то типа
"Homebrew processor ring".
Ссылка есть и на нашем форуме... Походи по этому кольцу и увидишь много интересного! :kruto:

И не слушай этого - он уже тут как-то врал, что для калькулятора на рассыпухе нужны тысячи микросхем. :o
На самом деле, всё не так уж и сложно. Как пример - компьютеры Vang... или тот же простой EDUC-8.

Да и сам i8080 не раз повторяли на секционных ИС и мелкой логике. Ссылка на форуме есть.

_________________
iLavr


19 Jul 2020 04:03
Profile
Novelist

Joined: 05 Jul 2020 15:08
Posts: 49
Location: Ижевск
Reply with quote
barsik wrote:
Всем рекомендую почитать тему.
Читал до этого, перечитал - не могу утверждать, что в теме на непричастного к этому пользователя кто-либо беспричинно агрессивно и с непонятной злобой нападал, но могу предположить, что никто из не непричастных не был толерантен, все хороши. Тему жалко.


Предлагаю сравнить сабж по части с 8008 с соседней темой - стоит ли всё-таки переделывать компьютер ради 8008, если на максимум 121 74LS микросхеме можно 8008 и так сделать? Разве что затраты на баальшую плату ЛУТ я считаю значимыми.

Но "MC6800" (да и "p8080a") пока отыскивается на крупном китайском интернет-магазине по смешной цене. Как вам идея сделать простую 6800-карту расширения для системы на ВМ80А, которой хост-система будет периодически передавать управление шинами и только участок в памяти на некоторое заданное хостом время?


20 Jul 2020 07:56
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
dvarkin wrote:
barsik wrote:
Lavr wrote:
И не слушай этого болтуна, он уже тут как-то врал, что для калькулятора на рассыпухе нужны тысячи микросхем.
Я о тысячах микросхем не говорил. Врёшь как раз ты, Лавр.

Нелепое обвинение построено Лавром на основе вот этого поста. Всем рекомендую почитать тему. Как и по любой другой теме, где Lavr беспричинно агрессивно и с непонятной злобой нападает на людей, видно на сколько он неадекватен. К сожалению, хозяин форума вероятно считает, что хамство и злоба в форуме привлекают читателей.

И ещё раз повторю, невозможно оспорить, что только очень злобный и глубоко непорядочный человек станет называть ошибку в чьём-либо высказывании враньём (даже если бы ошибка была). Враньё и ложь это когда кто-то с недобрыми целями говорит неправду сознательно. А когда человек пишет то, что думает, излагает информацию не сомневаясь, что она верна, то даже если человек ошибается, то это никак не враньё, это вовсе не ложь. Называть ошибку враньём это низость, чётко характеризующая человека, кто к такому прибегает. У Лавра все врут, хотя ещё ни разу он не был прав в том, что считать ошибкой и что он так злобно обзывал враньём. Причём он сам постоянно врёт, - именно сознательно врёт, а не ошибается. Так Лавр сделал и в предыдущем посте, ибо есть большая разница между 800 и тысячами (как минимум в разы).
не могу утверждать, что в теме на непричастного к этому пользователя кто-либо беспричинно агрессивно и с непонятной злобой нападал, но могу предположить, что никто из не непричастных не был толерантен, все хороши.
Вы совсем не правы, даже то, что осталось после редактирования (и удаления трети самых неадекватных постов Лавра в конце темы) всё ещё чётко показывает, как Лавр, как всегда, придравшись к ерунде злобными оскорбительными нападками раздувал склоку, а я лишь вполне адекватно отбивался и пытался вернуться к техническим аспектам. Перечитайте тему и выпишите злобные фразы Лавра и сравните с моими ответами на них.
dvarkin wrote:
Как вам идея сделать простую 6800-карту расширения для системы на ВМ80А, которой хост-система будет периодически передавать управление шинами и только участок в памяти на некоторое заданное хостом время?
О двухпроцессорной системе 6802 и Z80 думал. Тут усугубляет отсутствие у 6802 в режиме HALT освобождения шин (т.е нужны буфера), а главное я не смог решить задачу, как передавать управление между двумя процессорами. В Commodore-128 в режиме Z80+CP/M второй процессор 6510 делает весь ввод/вывод, т.е успешно работает двухпроцессорная система.


24 Jul 2020 05:18
Profile
Novelist

Joined: 05 Jul 2020 15:08
Posts: 49
Location: Ижевск
Reply with quote
Quote:
Вы совсем не правы

Там я сложным образом высказал, что непричастные пользователи вроде как не подвергались колоссальному давлению.

Quote:
Тут усугубляет отсутствие у 6802 в режиме HALT освобождения шин (т.е нужны буфера), а главное я не смог решить задачу, как передавать управление между двумя процессорами.

Вот я и предлагаю выдавать ведомому процессору только часть памяти, то есть простой логикой сделать так, чтобы к какому бы он адресу не обратился, то попал бы в эту часть. Потом, простой же логикой, периодически (по спектрумовскому сигналу INT, например) останавливать ведомого и отбирать у него шины, чтобы ведущий смог подсчитывать время + контроллировать процесс вообще. А буферы по многим причинам много где важны, даже потому, что для ведомой системы ведь должна быть отдельная плата?


24 Jul 2020 06:37
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 04:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Вот здесь есть что-то на тему двух процессоров и замене процессора в самодельных 8-ми разрядках.


24 Jul 2020 09:15
Profile
Novelist

Joined: 05 Jul 2020 15:08
Posts: 49
Location: Ижевск
Reply with quote
Там всё ясно. Цель топика ведь — вести отладку программ одной архитектуры ЦП на машинах другой? Вот я и привёл
 Пример взаимодействия ведомой небольшой системы 6800 ведущей системой ZX Spectrum 48
Quote:
При том не фокусировал внимание на процедуре передачи управления от ведущего к ведомому, это обсуждалось, например, по вашей ссылке. Буферы нужны, но они и полезны, когда данные передаются между разными платами. При том предложил процедуру возврата управления — по сигналу INT, который в ZX Spectrum вроде как возникает 50 раз в секунду от ULA. По этому сигналу Z80 может выполнить системные процедуры и передать управление программе, передавшей ранее управление ведомой системе. Эта программа проверит какое-либо условие выхода и, в зависимости от условия, передаст управление ведомой системе до следующего INT или не передаст. Заодним немного обновится динамическая память (достаточно ли?). Программа на стороне ведущей системы может быть написана и на бейсике. Программе на стороне ведомой системы не нужно заботиться о возврате управления.
Также я предложил сделать так, чтобы ведомая система имела доступ только к своей области памяти, что можно выполнить просто соединив к 5В или земле соответствующие входы буферов адреса. В начало этой области нужно положить отлаживаемую программу.
Мне этот пример чем-то напоминает ПДП.

Это КМК идеальный способ решения проблемы
Quote:
как передавать управление между двумя процессорами


24 Jul 2020 12:16
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 10 posts ] 

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.