Вопрос про !M1 при чтении операнда

Микропроцессоры и микроконтроллеры от фирмы Zilog, а также компьютеры на них построенные

Moderator: Shaos

User avatar
masterspammer
Fanat
Posts: 95
Joined: 13 Dec 2020 21:11

Re: Вопрос про !M1 при чтении операнда

Post by masterspammer »

dvarkin wrote: ...
$ cd Z80Explorer
$ qmake
$ make all
Спасибо - так бы не попробовал (доверился документации)!
Уткнулся в единственную известную ошибку https://github.com/gdevic/Z80Explorer/issues/1
(нужна гораздо более свежая версия qt, чем стоит, как буду обновлять систему, так попробую ещё).
Alekcandr wrote: ...Надо задавать вопрос автору симулятора.
Переписываемся; уже до авторов собственно эмулятора Z80 информация дошла.

С другой стороны, даже если с префиксом и без него !M1 действительно по-разному ведёт себя в 0xСВ - командах, это разница в пару логических элементов дешифратора.
dvarkin
Fanat
Posts: 87
Joined: 05 Jul 2020 14:08
Location: Ижевск

Re: Вопрос про !M1 при чтении операнда

Post by dvarkin »

masterspammer wrote:(нужна гораздо более свежая версия qt, чем стоит, как буду обновлять систему, так попробую ещё).
Я из-за этого на днях Debian обновил до bullseye, после этого всё собралось.
User avatar
masterspammer
Fanat
Posts: 95
Joined: 13 Dec 2020 21:11

Re: Вопрос про !M1 при чтении операнда

Post by masterspammer »

Смотрю я на длинный ряд единичек в колонке m1 и думаю - ну не может же быть, чтоб тут ещё и прерывание могло сработать, это ж совсем бяка будет...
dvarkin wrote:Я из-за этого на днях Debian обновил до bullseye, после этого всё собралось.
Вот не готов пока на такое действо - ни дома ни на работе... так-то оно запланировано на какие-нибудь небинарные выходные, но быстрее процессор на макетку припаяю с примерно таким viewtopic.php?p=83470#p83470 обвесом.
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Вопрос про !M1 при чтении операнда

Post by Alekcandr »

masterspammer wrote:Смотрю я на длинный ряд единичек в колонке m1 и думаю - ну не может же быть, чтоб тут ещё и прерывание могло сработать, это ж совсем бяка будет...
Не туда.

Текущее состояние стейт машины (машинный цикл) не делимая величина. Внешние события могут анализироваться только в промежутках машинных циклов. Соответственно и реагировать стейт машина может только в этих промежутках.

Касательно прерываний. Пару цитат.
Interrupt Request (input, active low). Interrupt Request is generated by I/O devices. The CPU honours a request at the end of the current instruction if IFF1 is set. INT is normally wired-OR and requires an external pullup for these applications.
Non-Maskable Interrupt (input, negative edge-triggered). NMI has a higher priority than INT. NMI is always recognised at the end of the current instruction, independant of the status of the interrupt ip-ops and automatically forces the CPU to restart at location 0066h.
Вот тут, на мой взгляд, не очень удачно было принято решение разработчиками.
Bus Request (input, active low). Bus Request has a higher priority than NMI and is always recognised at the end of the current machine cycle. BUSREQ forces the CPU address bus, data bus and control signals MREQ, IORQ, RD and WR to go to a high-empedance state so that other devices can control these lines. BUSREQ is normally wired-OR and requres an external pullup for these applications. Extended BUSREQ periods due to extensive DMA operations can prevent the CPU from refreshing dynamic RAMs.
Приходится "выкручиваться" программно для безударного переключения между двумя процессорами в MSX.
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
User avatar
masterspammer
Fanat
Posts: 95
Joined: 13 Dec 2020 21:11

Re: Вопрос про !M1 при чтении операнда

Post by masterspammer »

Alekcandr wrote:...Не туда.

Текущее состояние стейт машины (машинный цикл) не делимая величина. Внешние события могут анализироваться только в промежутках машинных циклов. Соответственно и реагировать стейт машина может только в этих промежутках.
Судя по документации-то так и есть (и там написано, что она неделимая не святым духом, а что после префиксов (и EI) на один такт блокируются прерывания); но опять же судя по документации, код команды со всеми префисами читается при активном !M1. И вот это место выглядит очень похоже на глюк - один внешний сигнал ведёт себя странно, близкие ему внутренние тоже могут вести себя странно (если довольно редкая команда читается без !M1, то и прерывания могут быть пропущены); в общем, попробую проверить на всякий случай при случае.
Alekcandr wrote: Касательно прерываний. Пару цитат.
Interrupt Request (input, active low). Interrupt Request is generated by I/O devices. The CPU honours a request at the end of the current instruction if IFF1 is set. INT is normally wired-OR and requires an external pullup for these applications.
Тут как раз просто и понятно, а начало обработки прерывания легко можно отследить по запросу вектора (!M1 и !IOREQ).
Alekcandr wrote:
Non-Maskable Interrupt (input, negative edge-triggered). NMI has a higher priority than INT. NMI is always recognised at the end of the current instruction, independant of the status of the interrupt ip-ops and automatically forces the CPU to restart at location 0066h.
Тут хуже - если нужно отследить, что вот прямо сейчас начало обрабатываться прерывание, то по сути надо ловить "the end of the current instruction".
Alekcandr wrote:
Вот тут, на мой взгляд, не очень удачно было принято решение разработчиками.
Bus Request (input, active low). Bus Request has a higher priority than NMI and is always recognised at the end of the current machine cycle. BUSREQ forces the CPU address bus, data bus and control signals MREQ, IORQ, RD and WR to go to a high-empedance state so that other devices can control these lines. BUSREQ is normally wired-OR and requres an external pullup for these applications. Extended BUSREQ periods due to extensive DMA operations can prevent the CPU from refreshing dynamic RAMs.
Кто ПДП запросил, тот память и регенерирует; сложно представить, что процессор __всё равно__ будет лезть в память и регенерировать её не смотря на ПДП.
Alekcandr wrote: Приходится "выкручиваться" программно для безударного переключения между двумя процессорами в MSX.
А как там сделано? Мои планы на ПДП начинаются и оканчиваются ВТ57 (на типа COVOX звук выдавать).
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Вопрос про !M1 при чтении операнда

Post by Alekcandr »

По прерываниям. Только так
masterspammer wrote:надо ловить "the end of the current instruction"
, и не как по другому. Иначе
masterspammer wrote:бяка будет...
По команде EI иметься ввиду следующие
During execution of an EI instruction, interrupt is not sampled. So if interrupt (Maskable interrupt) goes active during the instruction just before an EI instruction, or during EI instruction, it will be acknowledged during the following instruction.
masterspammer wrote:начало обработки прерывания легко можно отследить по запросу вектора (!M1 и !IOREQ)
Скорее не отследить, а подтвердить для периферии в фирменной схеме обработки прерываний от Zilog. И периферия может выставить на шину данных 8 битный вектор прерывания.
masterspammer wrote:А как там сделано? Мои планы на ПДП начинаются и оканчиваются ВТ57 (на типа COVOX звук выдавать).
Самой схемы не существует. А подпрограмму переключения, пожалуйста.
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
User avatar
masterspammer
Fanat
Posts: 95
Joined: 13 Dec 2020 21:11

Re: Вопрос про !M1 при чтении операнда

Post by masterspammer »

Alekcandr wrote:Скорее не отследить, а подтвердить для периферии в фирменной схеме обработки прерываний от Zilog. И периферия может выставить на шину данных 8 битный вектор прерывания.
Это уже от задачи зависит. Для маскируемых прерываний всё просто, а вот NMI сложнее.
Alekcandr wrote: Самой схемы не существует. А подпрограмму переключения, пожалуйста.
Ух, забористое! Верно ли я понимаю, что там два частично совместимых процессора (один постандартнее, другой помощнее) и можно переключить процессор, продолжив выполнение той же программы? "И эти люди мне запрещают ковыряться в носу!" Похоже, что задуманное мной наркоманство (для которого и нужны все эти такты, !M1 и отслеживания NMI не такое и страшное извращение и про него стоит написать.
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Вопрос про !M1 при чтении операнда

Post by Alekcandr »

masterspammer wrote:Это уже от задачи зависит. Для маскируемых прерываний всё просто, а вот NMI сложнее.
Да что же там с NMI сложнее? Как его планируется использовать?

Вполне полное описание как оно работает.

Image
masterspammer wrote:Ух, забористое!
По мне нормальное решение. Правда, запоздалое как минимум на лет 5-ть. А вот свой VDP они делали, не иначе как под забористой травой (личное суждение).
masterspammer wrote:Верно ли я понимаю, что там два частично совместимых процессора (один постандартнее, другой помощнее) и можно переключить процессор, продолжив выполнение той же программы?
Да переключение полностью прозрачное для выполняемой программы, на лету. Один процессор стандартный Z80 (для совместимости), второй очень продвинутый R800 (на данный момент черный ящик).
Alekcandr wrote:Как его планируется использовать?
Прочитал в соседней теме. Спрошу тут сразу. А чем стандартное решение не устраивает? Хоть от Intel (внешний контроллер прерываний), хоть от Zilog (встроенные контроллеры прерываний в комплект микросхем Zilog).
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
User avatar
masterspammer
Fanat
Posts: 95
Joined: 13 Dec 2020 21:11

Re: Вопрос про !M1 при чтении операнда

Post by masterspammer »

Alekcandr wrote:Да что же там с NMI сложнее? Как его планируется использовать?

Вполне полное описание как оно работает.
Снаружи чтобы отследить с точностью до такта первый ромбик следует наворотить кусок дешифратора команд - как минимум полный дешифратор префиксов. У маскируемого достаточно одного логического элемента. Цель одна - переключение страниц в MMU (потом распишу).

Alekcandr wrote:Прочитал в соседней теме. Спрошу тут сразу. А чем стандартное решение не устраивает? Хоть от Intel (внешний контроллер прерываний), хоть от Zilog (встроенные контроллеры прерываний в комплект микросхем Zilog).
В соседней теме - внешний контроллер прерываний 580-й серии штука сложная, на 20 мГц не заведётся, а для "маргариткового венка" у меня нет комплекта микросхем Zilog. Конечно можно наворотить и на ПЛИС, и на AVR, но неспортивно.
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Вопрос про !M1 при чтении операнда

Post by Alekcandr »

Теперь стало понятнее. Отчего такой интерес.
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Вопрос про !M1 при чтении операнда

Post by Lavr »

masterspammer wrote:В соседней теме - внешний контроллер прерываний 580-й серии штука сложная, на 20 мГц не заведётся, ...
Существует более простой вариант, если вам вдруг интересно:
viewtopic.php?f=81&t=10110&start=255#p124099

И там - еще есть далее по тексту:
viewtopic.php?f=81&t=10110&start=270#p124100
iLavr
User avatar
masterspammer
Fanat
Posts: 95
Joined: 13 Dec 2020 21:11

Re: Вопрос про !M1 при чтении операнда

Post by masterspammer »

Lavr wrote: Существует более простой вариант, если вам вдруг интересно:
viewtopic.php?f=81&t=10110&start=255#p124099
Довольно очевидное решение, но и с очевидной проблемой - при нескольких одновременно поступивших (по факту - накопившихся за время запрета прерываний) сигналов обработан будет только один (с максимальным приоритетом), остальные потеряются, а хочется-то чтоб отработали все с соблюдением очерёдности. Кроме того, для изменения приоритета прерываний придётся одновременно и перепаивать схему и переписывать программу (что может быть и не сильно страшно - зависит от задачи).

А моя идея подать сразу 7 сигналов (примерно так же, но без шифратора и в другом режиме прерываний) и уже только программой определять. Минус 1 сигнал, минус примерно с полкилобайта памяти, плюс обработка всех поступивших сигналов в порядке и плюс возможность управлять порядком без пайки.
Lavr wrote: И там - еще есть далее по тексту:
viewtopic.php?f=81&t=10110&start=270#p124100
Примерно к тому же пришли в той теме - viewtopic.php?p=158802#p158802
User avatar
masterspammer
Fanat
Posts: 95
Joined: 13 Dec 2020 21:11

Re: Вопрос про !M1 при чтении операнда

Post by masterspammer »

Про эмулятор http://www.visual6502.org/JSSim/expert-z80.html - если что, нашёл я причину ошибки:

файл http://www.visual6502.org/JSSim/chip-z80/support.js строка 630 (см. с отметкой +++++ ниже)
function disassemblytoHTML(prefix, opcode){

var disassembly;
switch (prefix) {
case 0xCB: disassembly = disassembly_cb; break;
case 0xDD: disassembly = disassembly_dd; break;
case 0xED: disassembly = disassembly_ed; break;
case 0xFD: disassembly = disassembly_fd; break;
case 0xDDCB: disassembly = disassembly_ddcb; break;
+++++ case 0xFDCB: disassembly = disassembly_ddfd; break;
default: disassembly = disassembly_00; break;
}

var opstr=disassembly[opcode];
if(typeof opstr == "undefined")
return "unknown"
return opstr.replace(/ /,' ');
}
логично что никакого disassembly_ddfd тут быть не может, а должно быть
case 0xFDCB: disassembly = disassembly_fdcb; break;
Поправил на лету (поставил breakpoint и присвоил disassembly_ddfd=disassembly_fdcb) - заработало; ну можно и локально на диск себе сохранить и поправить.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Вопрос про !M1 при чтении операнда

Post by Shaos »

Напиши авторам
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
masterspammer
Fanat
Posts: 95
Joined: 13 Dec 2020 21:11

Re: Вопрос про !M1 при чтении операнда

Post by masterspammer »

Shaos wrote:Напиши авторам
Написал сразу же, конечно. Но они __несколько__ небыстрые.