Вход

Просмотр полной версии : Специалист: эмуляция



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
Конфиги есть у (мульти)эмулятора, автора которого вы указали.

ivagor
08.04.2016, 21:08
Самопиар - версии бейсика (http://zx-pk.ru/showthread.php?t=12316&p=363277&viewfull=1#post363277) работоспособные на z80

fifan
08.04.2016, 21:52
Отредактировать конфиг в b2m.
Только так и это реально.

zx_
08.04.2016, 22:31
а бейсик практик для Z80 не адаптировали?

ivagor
09.04.2016, 16:02
а бейсик практик для Z80 не адаптировали?
Где его скачать?

- - - Добавлено - - -

Нашел, пропатчил, на первый взгляд работает

fifan
09.04.2016, 16:38
Ну что держите файлы эмулятора с добавленными конфигурациями, которые соответственно называются SpecialistZ80.cfg и SpecialistMXZ80.cfg для Специалиста и Специалиста-МХ.

Представленный выше файл можно загрузить так:
EMU.exe
New configuration -> SpecialistZ80
Открыть -> bpz31.rks

Конфигурацию SpecialistMXZ80 не проверял, т.к. не знаю какие программы были написаны для Специалист-МХ на Z80.

P.S. данный обрезанный архив эмулятора мною используется давно и успешно.

Pyk
10.04.2016, 00:58
Кстати, можете посоветовать качественные опенсорсные реализации эмуляции процессора Z80 для использования в GPL-проекте?
Хочу также добавить поддержку Z80, но не хочется изобретать велосипед (к тому же я плохо с ним знаком, в отличие от 8080).

fifan
15.01.2017, 10:58
Нашёл небольшую недоработку в файле 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.

fifan
28.01.2017, 07:41
Никто не сказал мне что файл косячный - несколько программ не запускалось. Перезалил - пользуйтесь.

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)

fifan
18.12.2018, 06:59
Номера столбцов перепишу, наверное уже ближе к новому году. За указанную опечатку спасибо.

Кстати и эту таблицу (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 он всё таки есть. Как же это расценивать?

ivagor
21.12.2018, 14:51
Думаю все знают, но на всякий случай - в этом эмуляторе 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).

ivagor
21.12.2018, 16:45
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.

b2m
23.12.2018, 16:28
никак не получается победить 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 в этих командах, т.к. остальные флаги слишком тупые.

b2m
23.12.2018, 19:42
HardWareMan, да кэп.

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;


Как видите, на выходе получилось практически идентично. И всё равно тест проваливается.

ivagor
24.12.2018, 14:29
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

ivagor
24.12.2018, 14:41
Если я правильно понимаю, что здесь написано

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. В противном случае данная процедура игнорируется.

ivagor
24.12.2018, 15:13
Где нибудь этому флагу присваивается значение 1 или по умолчанию 0 и так всегда для 8080?

CityAceE
24.12.2018, 15:16
При инициализации этому флагу присваивается True и, если это i8080 (а не Z80), то этот флаг у меня больше нигде не трогается. Этот момент я проверял, когда искал потенциальные ошибки.

ivagor
24.12.2018, 17:11
Наверно самый неожиданный флаг 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-шной.

fifan
11.02.2020, 17:58
Нашёл подходящую тему и решил задать вопрос автору эмулятора emu.
Я тут заметил, что в эмуляторе появилась новая конфигурация "Специалист + SD ATMega8 (alemorf)". Вроде всё хорошо работает, но заметил две ошибки:
1. нет цвета, как бы вообще.
2. не верно выводится имя файла, у которого более 8 символов, например: ivagorti.m0x вместо IvagorTim0xaGam8c.rom, в сокращённом виде нужно так - IvagorT~.rom,

b2m
12.02.2020, 09:59
1. SD ATMega8 я подключал к стандартному Специалисту, там цвета нет
2. знаю, исправлю (может быть)

fifan
12.02.2020, 10:29
SD ATMega8 я подключал к стандартному Специалисту, там цвета нет
Нужно править конфигурацию в эмуляторе или менять прошивку?

b2m
12.02.2020, 13:28
Можно сравнить конфиги и по аналогии добавить к другому Специалисту. Об чём речь?

- - - Добавлено - - -

Если была прошивка стандартного Спеца, её нужно менять на аналогичную со стартером с SD-карты, или грузить стартер с магнитофона (если таковой имеется).

ivagor
12.02.2020, 17:20
fifan, для цвета нужно добавить две строки в конфиг SD Mega
portC[4-7]=vid.pindex в секцию sys : K580ww55 {
palette="70607060504050403020302010001000" в секцию vid : Specialist-Video {

fifan
13.02.2020, 09:44
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".