Просмотр полной версии : Эмуляция 8080 на z80
Надеюсь не ошибся с разделом.
Сделал простейший (трудоемкость написания 3-5 человеко-часов) вариант интерпретатора 8080 для z80. Зачем это нужно (в теории) - можно перехватывать команды, которые обращаются к железу и получить на (ретро)компе с z80 эмулятор другого ретрокомпа с 8080. В теории звучит интересно, но практического смысла в текущем варианте маловато, тем не менее озвучу некоторые характеристики, возможно кто-то делал и у него получилось лучше или где-то лежит более удачный вариант: размер почти 2.5 Кб; скорость примерно в 15 раз меньше, чем у нативного исполнения, т.е. для соответствия 2 МГц 8080 нужен z80 30 МГц. Попробовал на примере специалиста. Программы (down to earth, exolon, zoo, mona, basic-практик адаптированный к z80) работают. Пробовал на 20 МГц, немного медленнее оригинала, но терпимо. Конечно хотелось бы побыстрее, но ускорить получится разве что с динамической рекомпиляцией (типа как здесь (http://www.tni.nl/products/gem.html)).
NEO SPECTRUMAN
23.03.2021, 19:05
Конечно хотелось бы побыстрее,
думаю если влезу я то можно и чуть быстрее
но только sjasm+ADP
ну и отлаживать потом это будет раз в 7 тяжелее если что
ну и размер увеличится раза в 2
я начол писать именно динамический рекомпилятор но потом забил...
...точнее я планировал делать рекомпиляцию если парсер находит зацикливание на участке который поместится в буфер (для начало рекомпиляции уже нужно знать список всех переходов и куда они ведут, так что парсер не просто тратит время)
а в случае не ненахождения запускать интерпретатор
но оказалось это на порядок несколько больше мороки чем простой интерпретатор :)
- - - Добавлено - - -
кстате никаких сслыок на результат в первом посте нету :)
- - - Добавлено - - -
(в теории) - можно перехватывать команды, которые обращаются к железу и получить на (ретро)компе с z80 эмулятор другого ретрокомпа с 8080.
любой перехват обращения
катастрофически просаживает производительность
а защита\трансляция адресов памяти так просто моментально в разы
самый оптимальный вариант
например эмулятор специалиста на специалисте :v2_lol:
ну как например это со спектрумом было в первых zxzxemul-аторах
когда напряммую читается родное пзу и пишется в родную видео память
- - - Добавлено - - -
другого ретрокомпа с 8080
ну и особо нет ретрокомпов на 8080
которые можно было бы эмулировать
там или конченейшие %все что угодно% контроллеры которые и на ПЦ досих пор нормально не эмулируются
или памяти больше чем у хост платформы...
любой перехват обращения
катастрофически просаживает производительность
а защита\трансляция адресов памяти так просто моментально в разы
Есть комбинация эмулирующего и эмулируемого компьютеров, для которой по минимуму требуется только эмуляция клавиатуры. Частичная (исходя из разумной достаточности) защита памяти для этой комбинации также обойдется очень дешево. В сумме накладные расходы (для одного конкретного варианта) вряд ли потянут больше 10%, скорее всего единицы процентов для типичных программ.
NEO SPECTRUMAN
23.03.2021, 19:10
Есть комбинация эмулирующего и эмулируемого компьютеров
нудо
вектор\специалист
вектор\орион
орион\специалист
у кого там экраны в одинаковом направлении?
может еще можно среди рк-шек
перенаправлять обращение к портам
но пзу-шку то не подменишь
хотя азачем?
но это не интересные варианты...
- - - Добавлено - - -
для эмуляций всего хорошо бы пошел АТМ с его любая страница в любое окно
а вот на других это уже...
все интересные машинки на z80 6502
а z80 не так легко эмулировать
у него 100500 команд...
эмулятор 6502 проверенный временм давно есть
бери пиши :)
и по моему даже не один
Мне всегда казалось что Z80 практически на 100% совместим с 8080. Интереснее было бы наоборот, эмулировать Z80 на 8080. Но попытка написать VM на Z80 это забавно.
Lethargeek
23.03.2021, 20:06
скорость примерно в 15 раз меньше, чем у нативного исполнения, т.е. для соответствия 2 МГц 8080 нужен z80 30 МГц
а чего так медленно-то? у z80 же вдвое больше регистров, и даже если эмулировать 64k, большинство команд сводится к exx:команда:exx
NEO SPECTRUMAN
23.03.2021, 20:24
а чего так медленно-то?
напиши узнаешь
тыж забыл про эмуляции PC
самый быстрый табличный вызов только жрет 18 тактов
что уже 4+ нопа :)
ld h,tab ;7
ld h,(hl) ;7
jp (hl) ;4
но это то недостаточно
добавляем pc
ld a,(bc) ;
ld l,a ;
еще 3 нопа
добавляем exx
еще 2 нопа
еще инкримент PC
вот уже и в 10 раз медленее...
кстате а когда мы инкриментим PC
нам уще нужно сохранить флаги
в 12 раз медленее :)
а не в 10
inc bc на флаги же не влияет (вот нам эта гадость\особеннсть наконец пригодилась)
большинство команд сводится к exx:команда:exx
Так и сделал, без этого было бы сильно медленнее.
NEO SPECTRUMAN
23.03.2021, 21:07
Так и сделал, без этого было бы сильно медленнее.
давай я те перепишу дыркодер команд
посмотрим на сколько станет быстрее
может приобщим тя к православному sjasm-у :)
...или омжет мне проще написать оно с 0-ля
команд у 8080 не так много...
только для меня это не 3...5 человекочаса
а больше...
в придачу я щас много чего другого делаю одновременно
тогда посмотрим у кого длиннее :v2_tong2:
хотя мне проще забить :)
Lethargeek
23.03.2021, 21:20
самый быстрый табличный вызов только жрет 18 тактов
что уже 4+ нопа
ld h,tab ;7
ld h,(hl) ;7
jp (hl) ;4
ну, во-первых, очевидно не самый быстрый... ;)
NEO SPECTRUMAN
23.03.2021, 21:22
ну, во-первых, очевидно не самый быстрый...
аха
ну давай быстрее
вариант когда tab адрес есть в другом регистре не предлагать :)
так любой дурак сможет за неделю
на изичах :v2_lol:
Lethargeek
23.03.2021, 21:33
аха
ну давай быстрее
вариант когда tab адрес есть в другом регистре не предлагать
так любой дурак сможет за неделю
на изичах
kek, на изичах без адреса в регистре:
inc h
ld h,(hl)
jp (hl)
:v2_tong2:
NEO SPECTRUMAN
23.03.2021, 21:37
kek, на изичах без адреса в регистре:
inc h
ld h,(hl)
jp (hl)
:v2_tong2:
отлично
у тебя в h был старший адрес кода эмуляции предыдущей команды
который неизвестен
ты его взял и проинкрементил
потом прочитал что то неизвестно от куда
и перешел неизвестно куда то
конец немного предсказуем :v2_lol:
Lethargeek
23.03.2021, 21:44
у тебя в h был старший адрес кода эмуляции предыдущей команды
который неизвестен
ты его взял и проинкрементил
потом прочитал что то неизвестно от куда
низачот, помедитируй до просветления :v2_dizzy_bye: ведь всего три строчки, это несложно :v2_lol:
NEO SPECTRUMAN
23.03.2021, 22:20
кстате может получитсо сделать быстрее
если читалка будет префетчить сразу несколько байт в регистры
для эмулятора 8080 на z80 это вполне возможно
но тогда заметно усложнится код каждой команды
и появятся болшие трудности с реализацией простых и эффективных оптимизаций декодера...
от которых скорей всего будет больше толку....
написал\прикинул вариант с префетчем 3 байт
получилось на 8 тактов дольше на каждый считанный байт :v2_lol:
кроме того в случае rst и ret будет лишнее чтение...
- - - Добавлено - - -
низачот, помедитируй до просветления ведь всего три строчки, это несложно
помедетировал
до быстрей НО
ты предлагаешь 256 256 байтных таблиц :v2_lol::v2_clapp:
или около того
сам умножишь? :)
мало того я и не знаю как такое скомпилировать
ADP такое ниасилит...
хотя в принципе можно жестко извратится и написать
за каждой командой зарезервировать место (точнее "расческой")
собрать сначала одну таблицу
а потом продублировать ее 256 раз :)
должно будет получитсо
конечно за 256 я преувеличил
и для мелких команд это вполне реализуемо
но все равно памяти это будет жрать дохренище
Lethargeek
24.03.2021, 08:46
конечно за 256 я преувеличил
и для мелких команд это вполне реализуемо
но все равно памяти это будет жрать дохренище
плохо медитировал, давай заново :v2_dizzy_biggrin2: всего чуть менее чем вдвое больше табличной памяти
и еще чуть меньше 2+ наборов таблиц (которые могут помочь, в частности, с проблемой несовместимости parity)
NEO SPECTRUMAN
24.03.2021, 13:08
(типа как здесь).
кстате есть упоминание существования (незавершенного) эмулятора геймбоя для sam coupe SAM2GB
(по моему не для базовой конфигурации)
но найти каких то реальных файлов мне не удалось...
да и SAM Revival 19 тоже не удалось найти
а там на эту тему что то было написано
https://www.samcoupe.com/news2007/19extra.jpg
https://sam.speccy.cz/revivalmag.html
https://www.samcoupe.com/
https://www.worldofsam.org/products/sam2gb
https://web.archive.org/web/20160324044813/http://www.zxspectrum.00freehost.com/sam2_gb.htm
дето находил еще картинки но щас потерял
1. Добавил еще один бенч и точно измерил замедление (сравнение скорости везде с 8080 2 МГц) для вчерашней версии:
Мона - медленнее в 15.45 раз
Расчет Пи (100 цифр) - медленнее в 12.38 раз
Скорее всего в Пи сказывается большое количество dad, которые эмулируются просто и быстро.
2. Пробежался по командам: доделал то, что вчера ленился доделывать; оптимизировал и другое, что заметил; убрал самомодифицирующийся код.
Мона - медленнее в 13.54 раз
Расчет Пи (100 цифр) - медленнее в 10.84 раз
Этот вариант еще и короче, чем в п.1
3. Из спортивного интереса вне конкурса попробовал коррекцию флага четности в двух вариантах - полный медленный и упрощенный (портит флаг полупереноса) быстрый. Быстрый между п.1 и п.2, а вот медленный заметно уступает даже п.1. Оригинальные бейсики работают с обоими вариантами, но при такой скорости и наличии адаптированных к z80 бейсиков не вижу смысла в коррекции флага четности.
NEO SPECTRUMAN
25.03.2021, 12:44
Расчет Пи (100 цифр)
все это на словах
давай сами тесты :)
чтоб мы тоже могли померять длину попугаев\разы
- - - Добавлено - - -
Расчет Пи (100 цифр) - медленнее в 10.84 раз
а сколько у тебя раз выполняется nop?
Попробовал предложение (https://zx-pk.ru/threads/33078-emulyatsiya-8080-na-z80.html?p=1109922&viewfull=1#post1109922) Lethargeek, с ним быстрее на процент с копейками.
все это на словах
Пока можно считать фейком.
а сколько у тебя раз выполняется nop?
Есть ли в пи нопы и сколько их там - не считал, это версия 2015 года, я с тех пор запомнил только общие моменты, не такие частности.
Lethargeek
25.03.2021, 20:34
ivagor, а как ты эмулируешь флаги?
В основном варианте никаких специальных усилий для коррекции флагов не прилагается, как команды z80 сформировали, так и есть.
Lethargeek
25.03.2021, 22:20
как команды z80 сформировали, так и есть.
но это же не полностью совместимо
Задача - запуск программ для 8080, самый вероятный источник программ - специалист, поэтому тренируюсь на нем. Приоритеты в решении этой задачи:
1. Быстродействие
2. Точность во всех проявлениях (флаги, соотношение длительностей команд и т.п.)
Сейчас п.1 на порядки важнее. Несовпадение установки флага четности влияет из популярных программ только на потомки микрософтовского бейсика 3.2. Пробное добавление коррекции этого флага показало, что если очень надо, то можно и корректировать, но при наличии патченых под z80 версий бейсика за флаг четности можно особо не переживать, лучше пусть эмулятор работает побыстрее.
Lethargeek
26.03.2021, 11:51
Так сам флаг необязательно корректировать, можно сохранять последний результат несовместимой команды и потом, когда надо, просто проверять его на чётность каким-нибудь OR. И для скорости иметь два набора таблиц с двумя вариантами эмуляции, которые будут неявно переключаться (тот самый "inc h" или "ld h,?") после команды, чтобы для совместимых не замедляться сохранением и проверкой результата.
Т.е. как я понимаю разделить обработку флага четности на 2 части: в арифметической команде сохранить результат, который возможно потребуется проверить на четность, и переключить таблицу на условные переходы с проверкой на четность. Плюс там еще надо предусмотреть возможность переключения обратно на "облегченные" варианты после того, как "подозрительный" результат или сам флаг четности станут неактуальны. Сам бы я так делать не стал, слишком много мороки и слишком много кода, проще сразу проверить и установить флаг четности после арифметических команд (хотя в быстром варианте это тоже привело к сильному разбуханию кода). Ну и повторюсь - в этом нет серьезной необходимости, вот если кто-нибудь сделает программу или игрушку сильно завязанную на флаг четности, тогда можно будет еще подумать над этой темой.
Интерпретатор 8080 на 8080 оказался не настолько хуже интерпретатора на z80, насколько я ожидал. Медленнее на 25-33%, по размеру в полтора раза больше. Но если z80 на 20 МГц есть, то с подобными 8080 напряженка.
Lethargeek
29.03.2021, 19:43
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQca48KDxQJBLNg-mxHC6bu7Bc7bwJnb_qEx3PGVeiVMBf8vllOu6zCV1zRlyFQZrz c-wc
Kakos_nonos
29.03.2021, 20:37
Да, интересно, сколько максимальных вложений уместится в память? :-)
То есть, 8080 эмулируется на 8080, который эмклируется на 8080, который эмулируется...
Скорее всего интересующиеся подобной тематикой в курсе, но не вижу ничего плохого в том, чтобы привести ссылку на x86 (http://nedoos.ru/svn/listing.php?repname=NedoOS&path=%2Fsrc%2Fx86%2F&#ada516564919e125820b83e53cf87c9c7) Alone Codera, там рядом и z80. А на его ютубовском канале можно посмотреть соответствующие стримы.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot