Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Unsorted (http://zx-pk.ru/forumdisplay.php?f=13)
-   -   ZX Spectrum: аппаратная реализация на восьми микросхемах (http://zx-pk.ru/showthread.php?t=13747)

Lisitsin 12th March 2011 13:39

Весело. А у меня и IFF1 не формируется.

Higgins 12th March 2011 13:54

Quote:

Originally Posted by Lisitsin (Post 365598)
Весело. А у меня и IFF1 не формируется.

Действительно весело. Как же вы прерывания обрабатываете? :)

Тогда так:
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).

Lisitsin 12th March 2011 15:16

1 Attachment(s)
Что-то вроде бы сляпал, но failed:

Lisitsin 12th March 2011 19:10

Кстати, поздравляю с новым статусом !!!

Higgins 12th March 2011 20:10

Quote:

Originally Posted by Lisitsin (Post 365619)
TRACE I_A_3.zip

Во второй строке у вас A=#3F, а F=#68, то есть ZF ошибочно взведен.

Quote:

Originally Posted by Lisitsin (Post 365678)
Кстати, поздравляю с новым статусом !!!

Спасибо. :)

balu_dark 12th March 2011 21:10

скоро - будет вполне возможно заменять мегой реальный Z80 осталось только недокументированные инструкции потом добавить. получится платка переходник с смдшной AVR. и кстати потреблять помоему будет меньше. только не знаю как с нагрузочной способностью.

Lisitsin 12th March 2011 22:17

1 Attachment(s)
Z исправил. Failed:

Higgins 12th March 2011 23:48

Quote:

Originally Posted by Lisitsin (Post 365767)
TRACE I_A_4.zip

Вижу две проблемы:

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:

8849 2c28
Вторая:
Quote:

8849 7f29
Третья:
Quote:

8849 5200

Lisitsin 13th March 2011 00:19

А как LD R,A влияет на флаги?

Higgins 13th March 2011 00:39

Quote:

Originally Posted by Lisitsin (Post 365799)
А как LD R,A влияет на флаги?

Не влияет на флаги.

Quote:

Originally Posted by Lisitsin (Post 365799)
А R я инкрементирую только в цикле М1 - то есть только при чтении очередной инструкции.

Значит, нужно искать другую причину избыточного увеличения R.

Кстати, в начале обработки прерывания 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.