Просмотр полной версии : Специалист: эмуляция
CityAceE
08.04.2016, 15:26
Есть ли какой-нибудь эмулятор, который эмулирует Специалист с процессором Z80?
P.S. Не нашёл темы, в которой уместно было бы задать этот вопрос, поэтому создал тему по эмуляции Специалиста.
marinovsoft
08.04.2016, 18:27
Отредактировать конфиг в b2m.
HardWareMan
08.04.2016, 19:23
Ого, а у b2m (http://zx-pk.ru/member.php?u=3501) уже есть конфиги?
marinovsoft
08.04.2016, 20:49
Конфиги есть у (мульти)эмулятора, автора которого вы указали.
Самопиар - версии бейсика (http://zx-pk.ru/showthread.php?t=12316&p=363277&viewfull=1#post363277) работоспособные на z80
Отредактировать конфиг в 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-диск на реале подключается при помощи данной схемы (http://zx-pk.ru/threads/12316-novyj-spetsialist-pk-na-diskretakh.html?p=428022&viewfull=1#post428022) к Специалисту_МХ2.
Никто не сказал мне что файл косячный - несколько программ не запускалось. Перезалил - пользуйтесь.
CityAceE
14.12.2018, 15:03
Сегодня получил вот такую картинку :)
https://pic.maxiol.com/thumbs/1544788859.90463878..png (https://pic.maxiol.com/?v=1544788859.90463878..png)
Чистый Python. Начал писать эмулятор Спектрума, а когда сделал эмуляцию первых 256 команд Z80, подумал, что уже могу начать эмулировать свой первый компьютер "Специалист".
CityAceE
17.12.2018, 05:48
Дело потихоньку движется. Конечно, тормоза удручают. Всё-таки по своей сути этот эмулятор - скрипт. Но у меня пока ещё есть, что оптимизировать ;)
https://pic.maxiol.com/images/1545017987.3254906935.zoo.gif
HardWareMan
17.12.2018, 20:39
Ну ты красавчик, запитонил Спеца. А еще существует жаба версия, кстати.
CityAceE
18.12.2018, 05:58
По следам эмуляции клавиатуры Специалиста написал небольшую заметку (https://zx-pk.ru/entries/293-klaviatura-pk-spetsialist-s-tochki-zreniya-programmista.html).
А ещё в процессе разбирательства обнаружил ошибку на сайте fifan. Таблица на этой (http://www.spetsialist-mx.ru/index4.html) странице должна выглядеть так:
https://pic.maxiol.com/thumbs/1545101800.3254906935.tabl.png (https://pic.maxiol.com/?v=1545101800.3254906935.tabl.png)
Номера столбцов перепишу, наверное уже ближе к новому году. За указанную опечатку спасибо.
Кстати и эту таблицу (http://www.spetsialist-mx.ru/index24.html) нужно переделать. Там кстати есть более чёткий рисунок подключения столбцов и строк клавиатуры к ВВ55.
CityAceE
21.12.2018, 14:27
Намучился с запуском 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 (https://github.com/begoon/i8080-core/blob/master/i8080.c) все флаги устанавливаются правильно, как на реале.
В бейсике проблема на z80 с флагом четности/переполнения. У 8080 это только четность, у z80 еще и переполнение в некоторых командах.
- - - Добавлено - - -
Конкретно в бейсике проблема командах adс a и sbb a. Еще был как минимум один специалистовский бейсик, у которого в процедуру затесалась недокументированная (для 8080) команда. На 8080 это nop, а на z80 - jr.
HardWareMan
21.12.2018, 15:59
Ну вот есть же профильная тема (https://zx-pk.ru/threads/23349-potaktovyj-klon-i8080-na-fpga-cpld.html), где есть абсолютно все ответы про 8080/ВМ80. Вот схема ALU:
https://jpegshare.net/images/15/a4/15a46300511f13d041f182e4e8571aac.png (https://jpegshare.net/images/dc/18/dc18d8575871261d0ddf91a5a9480fed.png)
Флаги S, Z и P тупые, тупая логическая операция над битами (Z = NOR(7:0), P = XOR(7:0), S = [7]), а вот C и AC более сложные и зависят от операции. Тем не менее, их логика высчитывается достаточно легко (внимательно смотрим на схему переноса (между регистром R и схемой выбора вывода результата и блоки формирования переноса при десятичной коррекции). Отличия с Z80 только в том, что у Z80 есть действующий флаг N - negative, который позволяет учитывать знак операции (ADD/SUB). И тогда С и АС не будут совпадать.
CityAceE
21.12.2018, 16:00
В бейсике проблема на z80 с флагом четности/переполнения. У 8080 это только четность, у z80 еще и переполнение в некоторых командах.
Это я нашёл и везде поправил. Но, видимо, где-то ещё есть ошибки. JR и ещё 11 отличных от Z80 команд тоже поменял, но пока BASIC не стартует.
HardWareMan
21.12.2018, 16:27
CityAceE, если ты вдруг пропустил (https://zx-pk.ru/threads/26438-spetsialist-emulyatsiya.html?p=991941&viewfull=1#post991941).
CityAceE, возможно текущая правильность эмуляции команд только кажущаяся, лучше проверить эксисайзером. Например вот вариант адаптированный для специалиста HardWareManом, только этот еще с патченым стеком, чтобы не вылетал при скролле.
CityAceE
22.12.2018, 04:00
8080ex1 - это прямо то, что нужно было! Спасибо HardWareMan'у за адаптацию под Специалист, а ivagor'у за то, что поделился!
Запустил и тут же получил вот это:
https://pic.maxiol.com/images/1545440390.90463878.8080validator.png
А после того, как профиксил логику флага полупереноса, которую я подглядел здесь (https://github.com/begoon/i8080-core), получил уже другой результат:
https://pic.maxiol.com/images/1545440466.90463878.8080validator2.png
CityAceE
23.12.2018, 15:13
Задолбался искать что не так. В итоге никак не получается победить ALUOP. В двух последних тестах ошибка. Вернее ошибка точно есть в тесте ALUOP NN, а результатов последнего теста я так и не смог дождаться. Часа 4 ждал и бросил. Начала теста ALUOP приходится ждать примерно 1,5 часа после запуска.
https://pic.maxiol.com/images/1545567218.90463878.8080validatornew.png https://pic.maxiol.com/images/1545567257.90463878.8080validatornew2.png
Но зато сейчас работает всё то, что не работало до этого:
https://pic.maxiol.com/images/1545567462.90463878.adskok.png https://pic.maxiol.com/images/1545567716.90463878.chess.png
Осталось чуть облагородить исходники и выложить всё это безобразие на GitHub.
никак не получается победить ALUOP
Проверь флаги в командах ANI ORI XRI.
HardWareMan
23.12.2018, 19:11
b2m, если у него падает ALUOP NN и ALUOP (REGLIST), то флаги всех команд ALU надо смотреть. Напомню, что INR/DCR и DAD прогоняются через ALU (для INR загружается константа 0х01 а для DCR - 0xFF). Т.е., действительно следует проверить логику работы логических а не арифметических операций. Скорее всего опять же флаги AC/C в этих командах, т.к. остальные флаги слишком тупые.
CityAceE
24.12.2018, 13:56
Сегодня произвёл серьёзный рефакторинг код, выделив все повторяющиеся части всех логических и арифметических операций в отдельные функции в ущерб и так никакой производительности скрипта. Несколько раз самым внимательным образом сравнил собственную эмуляцию с эталонным эмулятором (https://github.com/begoon/i8080-core/blob/master/i8080.c). Но 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;
Как видите, на выходе получилось практически идентично. И всё равно тест проваливается.
fflag_n(False) fflag_3(bool(reg_a & 0b00001000)) fflag_5(bool(reg_a & 0b00100000))
Для 100% эмуляции 8080 это надо менять. Биты 5 и 3 всегда 0, бит 1 - всегда 1.
CityAceE
24.12.2018, 14:32
Для 100% эмуляции 8080 это надо менять. Биты 5 и 3 всегда 0, бит 1 - всегда 1.
Это я учёл, поэтому у меня так:
def fflag_3(flag):
global flag_3
if not i8080:
flag_3 = flag
def fflag_5(flag):
global flag_5
if not i8080:
flag_5 = flag
def fflag_n(flag):
global flag_n
if not i8080:
flag_n = flag
Если я правильно понимаю, что здесь написано
fflag_n(False)
def fflag_n(flag): global flag_n if not i8080: flag_n = flag
то бит 1 регистра флагов обнуляется, а д.б. всегда 1.
CityAceE
24.12.2018, 15:08
Да нет, не так. Флаг сбрасывается только при условии, если переменная i8080 == False. В противном случае данная процедура игнорируется.
Где нибудь этому флагу присваивается значение 1 или по умолчанию 0 и так всегда для 8080?
CityAceE
24.12.2018, 15:16
При инициализации этому флагу присваивается True и, если это i8080 (а не Z80), то этот флаг у меня больше нигде не трогается. Этот момент я проверял, когда искал потенциальные ошибки.
Наверно самый неожиданный флаг 8080 это AC (который H) в ANI/ANA. Если и он правильно реализован, то тогда надо тестом проверять флаги по отдельности.
- - - Добавлено - - -
Переделал один тестик для специалиста. Для пробы тестируются только флаги H(AC) и P, можно и другие потестировать.
67435
Эталонные результаты из emu и emu80:
6743667437
CityAceE
25.12.2018, 00:57
ivagor, огромное спасибо! Это сильно поможет, а то вслепую найти уже, наверное, нереально.
А вот и виновник - команда sbi d8. Причём проблема в обоих флагах. У меня в эмуляторе она ведёт себя точно так же, как sui d8 и cpi d8. И по всем сведениям это корректное поведение. То же самое говорят эталонный эмулятор. Но почему же тогда отличаются результаты теста?
https://pic.maxiol.com/images/1545694655.3254906935.testflags.png
"Н" - Невнимательность! Вместо того, чтобы вызывать sbc_a() (вычитание с учётом флагом переноса) в командае sbi d8 я вызывал sub_a() (вычитание без учёта флага переноса)! Причём я сломал это вчера, пока чинил другое. Поправил, и результат не заставил себя ждать! :)
https://pic.maxiol.com/images/1545700168.3254906935.flagstest.png https://pic.maxiol.com/images/1545696676.3254906935.aluopnnok.png
Я даже не знаю сколько бы у меня ушло времени на поиск проблемы, если бы не тест ivagor. Ещё раз огромное спасибо! Теперь осталось поставить на ночь полный тест и посмотреть, что скажет последняя, самая длительная, секция тестирования.
HardWareMan
25.12.2018, 04:58
А ларчик... Впрочем, как обычно.
CityAceE
25.12.2018, 14:03
Существует ли какая-то общепринятая раскладка 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,
1. SD ATMega8 я подключал к стандартному Специалисту, там цвета нет
2. знаю, исправлю (может быть)
SD ATMega8 я подключал к стандартному Специалисту, там цвета нет
Нужно править конфигурацию в эмуляторе или менять прошивку?
Можно сравнить конфиги и по аналогии добавить к другому Специалисту. Об чём речь?
- - - Добавлено - - -
Если была прошивка стандартного Спеца, её нужно менять на аналогичную со стартером с SD-карты, или грузить стартер с магнитофона (если таковой имеется).
fifan, для цвета нужно добавить две строки в конфиг SD Mega
portC[4-7]=vid.pindex в секцию sys : K580ww55 {
palette="70607060504050403020302010001000" в секцию vid : Specialist-Video {
fifan, для цвета нужно добавить две строки в конфиг SD Mega
portC[4-7]=vid.pindex в секцию sys : K580ww55 {
palette="70607060504050403020302010001000" в секцию vid : Specialist-Video {
Спасибо! Помогло. Цвет есть.
CityAceE
12.09.2020, 21:29
Есть ли какой-нибудь эмулятор, который эмулирует Специалист с процессором Z80?
Намучился, пока сконфигурировал в Emu80 эмуляцию стандартного Специалиста с процессором Z80. Чтобы оно не потерялось, выложу конфигурационные файлы здесь. Нужно будет распаковать файлы из приложенного архива в папку с эмулятором с заменой существующих файлов. После этого в меню выбора платформ появится ещё одна - "Специалист Z80".
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot