![]() |
Весело. А у меня и IFF1 не формируется.
|
Quote:
Тогда так: 1) Вводим два флажка IFF1, IFF2. 2) "RETN" копирует IFF2 в IFF1. 3) Про "LD A, I" и "LD A, R" уже сказано. 4) В начале обрабтки прерывания сбрасываем IFF1 и IFF2. 5) Прерывание обрабатываем если прерывания не запрещены и текущий такт от начала фрейма в пределах длительности сигнала ~INT. У меня это 32 такта. 6) Запрещенное прерывание означает, что либо IFF1 сброшен, либо была выборка одного из оп-кодов, после которых прерывания не должно быть, либо и то, и другое вместе. 7) "DI" сбрасывает IFF1 и IFF2. 8) "EI" взводит IFF1 и IFF2. 9) Оп-коды, после которых не должно быть прерываний: #DD (префикс для IX), #FB (инструкция "EI") и #FD (префикс для IY). |
1 Attachment(s)
Что-то вроде бы сляпал, но failed:
|
Кстати, поздравляю с новым статусом !!!
|
Quote:
Quote:
|
скоро - будет вполне возможно заменять мегой реальный Z80 осталось только недокументированные инструкции потом добавить. получится платка переходник с смдшной AVR. и кстати потреблять помоему будет меньше. только не знаю как с нагрузочной способностью.
|
1 Attachment(s)
Z исправил. Failed:
|
Quote:
1) Инкрементировать следует только младшие семь разрядов R. Старший разряд остается неизменным. При этом инструкция "LD R, A" загружает в R все восемь разрядов. 2) Инкрементировать R следует только в циклах выборки (fetch). Непосредственные операнды инструкций извлекаются обычными циклами чтения, которые не являются циклами выборки. например, в инструкции "LD HL, #nn" будет цикл выборки и два цикла чтения, итого R инкрементируем один раз. Но: префиксы #CB и #ED, а также префиксы для IX/IY #DD и #FD читаются тоже циклами выборки, и значит каждый такой префикс увеличивает R. Теперь смотрим в трейсинг. Ищем строки для PC=#8849. Эти строки отражают состояние после инструкции "LD A, R". Перед циклом тестирования R сбрасывается в ноль с помощью "LD R, A". В первой такой строке у вас получается R=#4C. А должен быть R=#2C. Вторая такая строка у вас говорит, что R=#DB (сразу замечаем перемену старшего разряда R, чего быть не должно). А должен быть R=#7F. Значит, между циклами у вас R увеличивается на #DB - #4C = #8F = 143. А должен увеличиваться на #7F - #2C = #53 = 83. Итого 143 - 83 = 60 лишних циклов выборки. Для такого короткого кода (одна итерация тестирования) это очень много. Из этого я делаю вывод, что R у вас инкрементируется не только для циклов выборки. Еще раз, кратко. Первая строка для PC=#8849 должна быть: Quote:
Quote:
Quote:
|
А как LD R,A влияет на флаги?
|
Quote:
Quote:
Кстати, в начале обработки прерывания R следует инкрементировать тоже. |
| All times are GMT +4. The time now is 16:59. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.