AzAtom, и да, порядок выполнения DJNZ запоминается по названию самой мнемоники: Dec B, Jump if Not Zero
Вид для печати
AzAtom, и да, порядок выполнения DJNZ запоминается по названию самой мнемоники: Dec B, Jump if Not Zero
Ещё один вопрос назрел. Что будет, если в программе после префикса DD будет идти не обычная команда, а префикс FD или подряд 2-3 префикса DD? Просто переключится на другой регистр?
Если будут префиксы не DDCB, а наоборот CBDD, как отреагирует процессор?
Здесь http://emuverse.ru/wiki/Zilog_Z80/%D...B0%D0%BD%D0%B4 хорошо описаны команды, но не написано, как будет вести себя процессор при другой последовательности префиксов.
Прошу не отправлять проверять в эмуляторе.
По первому вопросу - да, будет на каждый префикс переключаться на другой регистр. Причем вся эта последовательность префиксов с командой за ней будет считаться как одна команда, которая не может быть прервана прерыванием.
По второму - CB DD нормальная команда Z80 - SET 3,L.
Точно, ступил с CB DD.
столкнулся тут с непоняткой на тему команды RETI у Z80, непонятно как она действует на флаги IFF, в одних справочниках пишут что "копируется IFF2 в IFF1", в других пишут что "не меняются", при этом в доке от Zilog написано
но у Ларченко и Родионова в книге написано что эти флаги копируются, в эмуле тогож Unreal исходниках в RETI тоже копия делаетсяЦитата:
However, this instruction does not enable interrupts that were disabled when the interrupt routine was entered. Before doing the RETI instruction, the enable interrupt instruction (EI) should be executed to allow recognition of interrupts after completion of the current service routine
как в реальности то?
В любом случае это важно только в обработчике немаскируемых прерываний с командой в конце RETI вместо RETN, т.к. при обработке маскируемых прерываний в оба флага IFF2 и IFF1 заносится 0. Дока от Zilog просто говорит, что RETI не включает прерывания, о копировании флагов ничего не сказано.
"All the ED xx RET? instructions copy IFF2 to IFF1, even RETI (ED 4D), which the official documentation does not note. The only difference between RETI and RETN is that peripheral devices which allow daisy-chaining of interrupts (eg the Z80 PIO) recognise the ED 4D sequence as 'end of interrupt' and then know that they can allow a further interrupt to be passed to the processor." Отсюда: https://wwwold.fizyka.umk.pl/~jacek/...0reference.htm
Я вот такую табличку забрал на https://vtrd.in/z80ops.html с clrhome.org
Удобная.
Добавлю вроде бы лучшую книжку, где про Z80 изложено наверное всё. Спасибо китайскому товарищу. Может кому будет не лень с гуглом всё это обрусить. :) Книжице уже более 15 лет...
Несложно догадаться, что RETI при выходе из маскируемого прерывания, если обработчик флаги не менял, просто опять запишет запрет на прерывания. Поэтому Z80 и требует EI перед RET/RETI. Если RETI используется для выхода из немаскируемого прерывания, то флаг прерывания восстановится таким, каким он был на старте обработчика. Ничего в IFF2 не копируется - в официальных доках ошибка. Об этом и другая информация про Z80 изложена на русском года 3 назад - буду рад добавочной информации и критическим замечаниям.
Э-э-э, а что тут переводить?
Инструкции INI/INIR/IND/INDR сначала декрементируют B, после чего используют BC, а инструкции OUTI/OTIR/OUTD/OTDR - наоборот.
В IFF2 ничего не копируется - копируется сам флаг IFF2 во флаг IFF1 при выполнении команд RETI/RETN. Но при заходе в маскируемое прерывание в оба флага заносится 0. Поэтому при выполнении RETI/RETN на выходе из маскируемого прерывания прерывания будут запрещены. А при выполнении RETI/RETN при выходе из НЕмаскируемого прерывания восстановится состояние маскируемых прерываний до входа в немаскируемое (IFF1:=IFF2).
- - - Добавлено - - -
Наоборот. INI/INIR/IND/INDR сначала читают из порта, потом декрементируют B,
OUTI/OTIR/OUTD/OTDR сначала декрементируют B, потом выводят в порт.
Блочные инструкции хорошо работают в реальных процессорах, и немножко нехорошо - в эмуляторах :) В некоторых правда - уже хорошо.
Вот видео теста флагов , полулегендарный как-бы-советский клон Т34
А вот флаги SCF\CCF на разных процессорах точно работают по разному)) Но это надо тестировать еще на чем нибудь, кроме жменьки моих процессоров ) Некомуу
Реально для Спека, Амстрада и большинство компов на Z80 RETI и RET работают абсолютно одинаково. Особый эффект от RETI возникает только если используется режим 2 и есть дополнительная аппаратура для его поддержки (это не только Z80-DMA). И подозреваю, что из NMI никакой код по RETI не выходит. :)
Интересно! Не знал про такие открытия. Наверное есть только два варианта таких штук: NMOS и CMOS. И трудно понять, неужели это может быть важно? Что это может быть за код, который проверяет флаги PF или HF после OTxR/INxR?! Особенно на Спектруме или приставке для BBC Micro. В официальной документации эти флаги имеют неопределённое значение.
спасибо за наводку, пофиксил в своей эмуляции Z80, теперь получше выглядит
Вложение 76925
Raydac, прогони еще вот эти на всякий случай - https://github.com/raxoft/z80test
Этот тест бы на разных клонах погоняли, да на разных Z80. Есть мнение, что он и для реальных спектрумов будет разные результаты давать.
вспоминаю что в похожих тестах (zexall?) для проверки исполнения некоторых команд использовались данные из ПЗУ.
то есть для корректного прохождения теста нужен был именно ROM1982
Вот и погоняйте, чО. Или только эмуляторщики отсались ?
Пока тест Петера проходит на реальных спеках и клонах 100%
Тест Патрика в отношении команд LDIR->NOP и на реалах проходит и в эмуляторах. И не в одном.
Ну так что, подтвердите имеющееся мнение?
На Профи я был бы рад увидеть нек. тесты
Привет всем фанатам Спектрума и не только :)
Как я понял из последней дискуссии, тайны из Z80 всё продолжают и продолжают извлекать)
Ох уж эти биты 5 и 3 :)
Насколько я понял после прерывания блочных команд биты 5 и 3 регистра флагов копируются из PC !? Всё так?
Или же биты 5 и 3 выставляются после выполнения команды BIT n,(HL) в процедуре прерывания, т.е. берутся из MEMPTR ???
И у меня ещё ряд вопросиков к знатокам:
Ребята, скажите, плиз, кто знает, Z80 реверснули или так и нет???
Создана ли его полноценная Verilog-модель?
И какое ядро Z80 залито в fpga в ZX-Next к примеру?
(читал разные темы, искал поиском, но так и не понятно)
В Следующем свое собственное ядро, но основанное на Т80, они его называют T80n.
Основа Т80 плюс немного, пару десятков, своих собственных самопальных операндов. Само собой совместимости это не прибавляет, а проблем - таки да. Чтобы не скучно было.
Например очередной тест. У них не идет. Так вот ищут проблемуу:
Цитата:
Checked undocumented im0/im1 instructions are done correctly. Checked timing of out (c), 0. Checked no ED xx NOP instructions are used. Checked with same Pentagon 128 ROMs as specemu. Looking at int pulse length next
Не проходят все otir если память не изменяет, как и на всех реализациях на fpga
Блочный тест флагов от Петера - весь не проходит.
CCF\SCF тоже не проходит.
Но то такое...
В Следующем дизайн на 99% заполнен, им просто физически невкуда(да и не зачем) фиксить и эти бесполезные знания.
В МиСТер-е со свободными ячейками несколько получше, но видимо у Алексея ровно те же соображения, а чисто из академических соображений тоже никому не впилось видимо.
zexall - это который многочАсовой?? Неее, сейчас тестят блоком тестов от Патрика, текущая версия 1.2
Спасибо за информацию!)
zebest, я правильно нашёл ссыль на этот тест от Патрика?
https://github.com/raxoft/z80test
zebest, ещё хотел спросить про SCF/CCF )) Поясните пожалуйста в кратце, что с этими командами не так? В английском не очень шарю, поэтому может не очень правильно понял!? Биты 5 и 3 не всегда из А берутся?
Если вкратце - то лучше в картинках, один раз увидеть, чем..
https://github.com/raxoft/z80test/co...11e3394a486051
флаги 5 и 3 как бы не очень то и документированы, поэтому конечные производители видимо корректили дизайн Z80 под себя, возможно и специально меняли.
На картинках три основных разновидности(паттерн) Патрик выделил для Zilog\NEC\ST, но попадаются и другие, которые видимо ни попадают ни в одну из этих, и поэтому тесты Патрика в отношении CCF\SCF не проходят.
Ну не проходят - и не проходят, что ж теперь )