Есть ли какой-нибудь эмулятор, который эмулирует Специалист с процессором Z80?
P.S. Не нашёл темы, в которой уместно было бы задать этот вопрос, поэтому создал тему по эмуляции Специалиста.
Вид для печати
Есть ли какой-нибудь эмулятор, который эмулирует Специалист с процессором Z80?
P.S. Не нашёл темы, в которой уместно было бы задать этот вопрос, поэтому создал тему по эмуляции Специалиста.
Отредактировать конфиг в b2m.
Ого, а у b2m уже есть конфиги?
Конфиги есть у (мульти)эмулятора, автора которого вы указали.
Самопиар - версии бейсика работоспособные на z80
а бейсик практик для Z80 не адаптировали?
Ну что держите файлы эмулятора с добавленными конфигурациями, которые соответственно называются SpecialistZ80.cfg и SpecialistMXZ80.cfg для Специалиста и Специалиста-МХ.
Представленный выше файл можно загрузить так:
EMU.exe
New configuration -> SpecialistZ80
Открыть -> bpz31.rks
Конфигурацию SpecialistMXZ80 не проверял, т.к. не знаю какие программы были написаны для Специалист-МХ на Z80.
P.S. данный обрезанный архив эмулятора мною используется давно и успешно.
Кстати, можете посоветовать качественные опенсорсные реализации эмуляции процессора Z80 для использования в GPL-проекте?
Хочу также добавить поддержку Z80, но не хочется изобретать велосипед (к тому же я плохо с ним знаком, в отличие от 8080).
Нашёл небольшую недоработку в файле Flash-диска подключаемого к конфигурации Специалиста_МХ2. В файле MX2 SET8C, подключаемого как внешний Flash-диск (IvagorTim0xaGam8c.rom) есть опечатка для перехода к режиму цветов из 5 в 8 необходимо оперировать с регистром #f7fa, а не с #fffa. Т.е. в данный регистр нужно записать число D1=1. Вот скриншот доработки. Почему-то с этой опечаткой у меня не переключался цвет из 5 в 8 и не работала игра Color Lines от Vinxru (не сгорали построенные линии). Я сделал большой файл Flash-диска, который вмещает в себя 25 файлов и занимает 227 кБайт. Напомню, что данный Flash-диск на реале подключается при помощи данной схемы к Специалисту_МХ2.
Никто не сказал мне что файл косячный - несколько программ не запускалось. Перезалил - пользуйтесь.
Сегодня получил вот такую картинку :)
https://pic.maxiol.com/thumbs/1544788859.90463878..png
Чистый Python. Начал писать эмулятор Спектрума, а когда сделал эмуляцию первых 256 команд Z80, подумал, что уже могу начать эмулировать свой первый компьютер "Специалист".
Дело потихоньку движется. Конечно, тормоза удручают. Всё-таки по своей сути этот эмулятор - скрипт. Но у меня пока ещё есть, что оптимизировать ;)
https://pic.maxiol.com/images/154501...906935.zoo.gif
Ну ты красавчик, запитонил Спеца. А еще существует жаба версия, кстати.
По следам эмуляции клавиатуры Специалиста написал небольшую заметку.
А ещё в процессе разбирательства обнаружил ошибку на сайте @fifan. Таблица на этой странице должна выглядеть так:
https://pic.maxiol.com/thumbs/154510...06935.tabl.png
Номера столбцов перепишу, наверное уже ближе к новому году. За указанную опечатку спасибо.
Кстати и эту таблицу нужно переделать. Там кстати есть более чёткий рисунок подключения столбцов и строк клавиатуры к ВВ55.
Намучился с запуском BASIC. Я-то изначально делал эмуляцию Z80 по таблицам от Z80. И после того, как завершил 256 команд начали запускаться почти все игры. Если не брать во внимание ошибки, которые я сделал, то остались незапускаемыми только ADSKOK и BASIC.
ADSKOK я в итоге запустил. Там была проблема с флагами. Кто ж мог предположить, что если сделать PUSH BC, а потом тут же POP AF, то С ни разу не будет равен А! Из-за этого пришлось шерстить всю таблицу и проверять как на i8080 эмулируются флаги. Нашлось немало отличий от Z80! Всё, что нашёл исправил. В результате ADSKOK запустился таки. Оказалось, что программа имеет нечто типа защиты - при первом запуске код раскодируется, как раз с помощью всевозможных команд, которые используют флаги отличные от Z80, в том числе встречается и вышеупомянутая последовательность PUSH BC, POP AF. Но с BASIC пока всё плохо. Упёрся во флаг полупериноса.
Может быть уважаемый @Pyk внесёт ясность, эмулятором которого я пользуюсь для сравнения того, что я сделал с тем, как должно быть?
Вот, например команда #A7 AND A (ANA A). Согласно документации i8080 она устанавливает флаг полупереноса согласно результату операции, в то время как у Z80 он просто устанавливается в единицу в результате операции. Но в результате AND A,A никогда не будет полупереноса - так я и эмулирую. А по данным Emu80 он всё таки есть. Как же это расценивать?
Думаю все знают, но на всякий случай - в этом эмуляторе 8080 все флаги устанавливаются правильно, как на реале.
В бейсике проблема на z80 с флагом четности/переполнения. У 8080 это только четность, у z80 еще и переполнение в некоторых командах.
- - - Добавлено - - -
Конкретно в бейсике проблема командах adс a и sbb a. Еще был как минимум один специалистовский бейсик, у которого в процедуру затесалась недокументированная (для 8080) команда. На 8080 это nop, а на z80 - jr.
Ну вот есть же профильная тема, где есть абсолютно все ответы про 8080/ВМ80. Вот схема ALU:
https://jpegshare.net/images/15/a4/1...e4e8571aac.png
Флаги S, Z и P тупые, тупая логическая операция над битами (Z = NOR(7:0), P = XOR(7:0), S = [7]), а вот C и AC более сложные и зависят от операции. Тем не менее, их логика высчитывается достаточно легко (внимательно смотрим на схему переноса (между регистром R и схемой выбора вывода результата и блоки формирования переноса при десятичной коррекции). Отличия с Z80 только в том, что у Z80 есть действующий флаг N - negative, который позволяет учитывать знак операции (ADD/SUB). И тогда С и АС не будут совпадать.
CityAceE, если ты вдруг пропустил.
CityAceE, возможно текущая правильность эмуляции команд только кажущаяся, лучше проверить эксисайзером. Например вот вариант адаптированный для специалиста HardWareManом, только этот еще с патченым стеком, чтобы не вылетал при скролле.
8080ex1 - это прямо то, что нужно было! Спасибо HardWareMan'у за адаптацию под Специалист, а ivagor'у за то, что поделился!
Запустил и тут же получил вот это:
https://pic.maxiol.com/images/154544...0validator.png
А после того, как профиксил логику флага полупереноса, которую я подглядел здесь, получил уже другой результат:
https://pic.maxiol.com/images/154544...validator2.png
Задолбался искать что не так. В итоге никак не получается победить ALUOP. В двух последних тестах ошибка. Вернее ошибка точно есть в тесте ALUOP NN, а результатов последнего теста я так и не смог дождаться. Часа 4 ждал и бросил. Начала теста ALUOP приходится ждать примерно 1,5 часа после запуска.
https://pic.maxiol.com/images/154556...lidatornew.png https://pic.maxiol.com/images/154556...idatornew2.png
Но зато сейчас работает всё то, что не работало до этого:
https://pic.maxiol.com/images/154556...878.adskok.png https://pic.maxiol.com/images/154556...3878.chess.png
Осталось чуть облагородить исходники и выложить всё это безобразие на GitHub.
b2m, если у него падает ALUOP NN и ALUOP (REGLIST), то флаги всех команд ALU надо смотреть. Напомню, что INR/DCR и DAD прогоняются через ALU (для INR загружается константа 0х01 а для DCR - 0xFF). Т.е., действительно следует проверить логику работы логических а не арифметических операций. Скорее всего опять же флаги AC/C в этих командах, т.к. остальные флаги слишком тупые.
HardWareMan, да кэп.
Сегодня произвёл серьёзный рефакторинг код, выделив все повторяющиеся части всех логических и арифметических операций в отдельные функции в ущерб и так никакой производительности скрипта. Несколько раз самым внимательным образом сравнил собственную эмуляцию с эталонным эмулятором. Но ALUOP NN, как и прежде, выдаёт ошибку. Даже не знаю в какую сторону копать. Наверное просто глаз замылился и я что-то упускаю.
Ну вот, например, так сейчас у меня выглядит эмуляция команды ORI на Python:
А вот для сравнения как эмуляция той же команды выглядит в эталонном эмуляторе на С:Код:def or_a(reg):
global reg_a, flag_p, flag_h, flag_c, flag_z, flag_s
reg_a |= reg
flag_s = bool(reg_a & 0b10000000)
flag_z = not reg_a
flag_h = False
flag_p = parity[reg_a]
flag_c = False
fflag_n(False)
fflag_3(bool(reg_a & 0b00001000))
fflag_5(bool(reg_a & 0b00100000))
return
def b11110110(): # OR A,d
global pc, ticks
or_a(read_mem(inc_pc()))
pc = inc_pc2()
ticks += 7
return
Как видите, на выходе получилось практически идентично. И всё равно тест проваливается.Код:#define ORA(val) \
{ \
A |= (val); \
S_FLAG = ((A & 0x80) != 0); \
Z_FLAG = (A == 0); \
CLR(H_FLAG); \
P_FLAG = PARITY(A); \
CLR(C_FLAG); \
}
case 0xF6: /* ori data8 */
cpu_cycles = 7;
work8 = RD_BYTE(PC++);
ORA(work8);
break;
Да нет, не так. Флаг сбрасывается только при условии, если переменная i8080 == False. В противном случае данная процедура игнорируется.
Где нибудь этому флагу присваивается значение 1 или по умолчанию 0 и так всегда для 8080?
При инициализации этому флагу присваивается True и, если это i8080 (а не Z80), то этот флаг у меня больше нигде не трогается. Этот момент я проверял, когда искал потенциальные ошибки.
Наверно самый неожиданный флаг 8080 это AC (который H) в ANI/ANA. Если и он правильно реализован, то тогда надо тестом проверять флаги по отдельности.
- - - Добавлено - - -
Переделал один тестик для специалиста. Для пробы тестируются только флаги H(AC) и P, можно и другие потестировать.
Вложение 67435
Эталонные результаты из emu и emu80:
Вложение 67436Вложение 67437
ivagor, огромное спасибо! Это сильно поможет, а то вслепую найти уже, наверное, нереально.
А вот и виновник - команда sbi d8. Причём проблема в обоих флагах. У меня в эмуляторе она ведёт себя точно так же, как sui d8 и cpi d8. И по всем сведениям это корректное поведение. То же самое говорят эталонный эмулятор. Но почему же тогда отличаются результаты теста?
https://pic.maxiol.com/images/154569....testflags.png
"Н" - Невнимательность! Вместо того, чтобы вызывать sbc_a() (вычитание с учётом флагом переноса) в командае sbi d8 я вызывал sub_a() (вычитание без учёта флага переноса)! Причём я сломал это вчера, пока чинил другое. Поправил, и результат не заставил себя ждать! :)
https://pic.maxiol.com/images/154570....flagstest.png https://pic.maxiol.com/images/154569....aluopnnok.png
Я даже не знаю сколько бы у меня ушло времени на поиск проблемы, если бы не тест ivagor. Ещё раз огромное спасибо! Теперь осталось поставить на ночь полный тест и посмотреть, что скажет последняя, самая длительная, секция тестирования.
А ларчик... Впрочем, как обычно.
Существует ли какая-то общепринятая раскладка PC-клавиатуры для Специалиста или кто во что горазд? Особенно интересуют клавиши, которые не буквенные. А то я сразу же клавиши забиндил для Монитора, то есть QWERTY. А потом начал игры запускать и столкнулся с тем, что во всех играх управление жёстко задано и если использовать QWERTY, то вся концепция рушится - для игр непременно требуется JCUKENG. В играх типа DUNGEON используется управление ИТЬБЮ (ITXB@), в ЗООПАРКе что-то своё:
https://pic.maxiol.com/images/1545735788.90463878..png
В общем, чаще всего управление использует физическое расположение клавиш на стандартной клавиатуре Специалиста. А клавиатура Специалиста несколько отличается по физическому размещению клавиш от PC-шной.
Нашёл подходящую тему и решил задать вопрос автору эмулятора emu.
Я тут заметил, что в эмуляторе появилась новая конфигурация "Специалист + SD ATMega8 (alemorf)". Вроде всё хорошо работает, но заметил две ошибки:
1. нет цвета, как бы вообще.
2. не верно выводится имя файла, у которого более 8 символов, например: ivagorti.m0x вместо IvagorTim0xaGam8c.rom, в сокращённом виде нужно так - IvagorT~.rom,