Так он и должен крутиться, а в прерывании по достижении счетчиком нуля должен выходить. Возможно, Турбо режим отключает прерывания.
Так он и должен крутиться, а в прерывании по достижении счетчиком нуля должен выходить. Возможно, Турбо режим отключает прерывания.
МГТФ - любимый провод!
KAY-1024(4096)/SL-4/TURBO v2010 + Nemo-FDC + Nemo-IDE (CF 4GB) + SMUC2 Rev.B RTC (HDD 1.6GB + DVD-ROM) + PROF-ROM + ZXMC2 + GENERAL SOUND 2MB + ZX-BUS_TEE + FDD 3.5' + FDD 5.25' + VGA&PAL
Посмотри в теневике, меняется ли содержимое регистра BC со временем. Если не меняется - что-то с турбо режимом, почему-то, если он включен, отключены прерывания.
- - - Добавлено - - -
Листинг кода, может, кто-то шарит в особенностях Турбо-режима Кая, разберется, почему виснет:
Скрытый текст
; CLEAR 32255 (#7DFF)
ORG 32700
LD C,#FE
OUT (C),0
LD HL,#7E00
LD DE,#7E01
LD BC,256
LD (HL),#7F
LDIR
LD BC,500 ; время определения ошибки z80 в 1/50 секунды
LD A,#7E
LD I,A
IM 2
EI
L1 LD A,R
JP PE,L1
LD BC,1
LEND IM 1
LD A,#3F
LD I,A
EI
RET
ORG #7F7F
PUSH AF
DEC BC
LD A,B
OR C
JR Z,L3
POP AF
L2 EI
RET
L3 POP AF
POP AF
JP LEND
[свернуть]
Последний раз редактировалось Spectramine; 14.01.2018 в 22:37.
В турборежиме может случиться так, что прерывание приходит не в любой такт, а только в такой такт, чтобы не затронуть команду LD A,R. Точно это зависит от кол-ва тактов в прерывании и от логики WAIT в турборежиме. А вообще классная тема, спасибо всем, кто высказался, открыли мне глаза на важный баг Z80!
Правда, позанудствую немного. Мне кажется, иметь такие подпрограммы, которые проверяют, разрешены ли прерывания - это дурной тон. В любой момент исполнения программы программисту известно, запрещены прерывания или разрешены. Можно иметь две точки входа в подпрограмму, одна из которых разрешает прерывания по выходу, а другая - нет, и вызывать ту из них, которая соответствует режиму работы процессора в данный момент. Мне только в одной ситуации нужно было проверять состояние IFF2 - в обработчике NMI. Но в этот момент работа команды LD A,R не может быть нарушена, т.к. IFF1=0 и прерывания фактически запрещены.
Вспомнил. У меня ещё 2012-ом году отказалась работать игра Terra Cresta. У других владельцев КАЯ она тоже не заработала. Там от ссылки и далее по топику. Я так и не понял тогда, из-за чего эта проблема: то ли из-за CMOS Z80 (Z84C0020PEC, но на Фениксе работает!), то ли из-за схемы формирования /INT'а в КАЕ на ИР16. В общем, определится бы с причиной и решить эту проблему.
- - - Добавлено - - -
И вот отсюда и далее по топику тоже можно почитать (вроде, всё-таки, из-за процессора).
Последний раз редактировалось SoftFelix; 16.01.2018 в 02:06.
МГТФ - любимый провод!
KAY-1024(4096)/SL-4/TURBO v2010 + Nemo-FDC + Nemo-IDE (CF 4GB) + SMUC2 Rev.B RTC (HDD 1.6GB + DVD-ROM) + PROF-ROM + ZXMC2 + GENERAL SOUND 2MB + ZX-BUS_TEE + FDD 3.5' + FDD 5.25' + VGA&PAL
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Ну, вроде, разобрались - разработчики пофиксили баг LD A,R в CMOS Z80 очень мощно - после LD A,R/LD A,I не может произойти прерывание (как после EI во всех Z80), а в Кае длительность INT - два цикла M1, как раз на одну команду LD A,R.
- - - Добавлено - - -
Так что и из-за процессора и из-за Кая, комплексно.
МГТФ - любимый провод!
KAY-1024(4096)/SL-4/TURBO v2010 + Nemo-FDC + Nemo-IDE (CF 4GB) + SMUC2 Rev.B RTC (HDD 1.6GB + DVD-ROM) + PROF-ROM + ZXMC2 + GENERAL SOUND 2MB + ZX-BUS_TEE + FDD 3.5' + FDD 5.25' + VGA&PAL
Так оно ж программно и отлавливается - если тест виснет, это показатель того, что INT надо фиксить, или будут и в играх проблемы.
Тут вроде как не тест надо дорабатывать, а Кай - 2 цикла M1 на INT это явно маловато. В стандартном спеке длительность INT 32 такта, если брать по 4 такта на цикл M1 - это 8 циклов M1 надо.
Слегка поправил тест - поставил время проверки 2 секунды, и предупреждение, что, если программа виснет, INT проблемный:CMOSz80tst.zip
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)