samstyle / Xpeccy

Multiplatform emulator of retro computers
MIT License
73 stars 13 forks source link

Обработка прерываний #78

Closed ammehet closed 4 years ago

ammehet commented 4 years ago

Очень странно ведёт себя обработка прерываний. Просто прекращается навсегда после 0+ раз случайным образом. Не зависит от типа эмулируемой машины, зато зависит от множителя частоты процессора. Виснет на x1, x2. Работает на x4, x1.2, больше варианты не искал. Версия 0.6.20200428, MacOS.

Тестовый пример:

    device zxspectrum48
    org 0x6161
    ld  a,(val)
    inc a
    and 7
    ld  (val),a
    out (254),a
    ei
    ret
start:
    di
    ld  hl,0x6000
    ld  de,0x6001
    ld  bc,0x100
    ld  a,h
    ld  i,a
    inc a
    ld  (hl),a
    ldir
    im  2
loopA:
    ei
    jp loopA
val:
    db 0
    savetap "int-bug.tap",start
ammehet commented 4 years ago

Попробовал нецелые множители. x1.1 висит, x1.2-x1.9 работают, но судя по количеству тактов в дебаггере, прерывание таки не случается. Это x1.0: image

Это x1.2, на разных итерациях разные цифры: image image

samstyle commented 4 years ago

Проблемасина оказалась не в обработке прерывания CPU, а в правильной переброске его от видео к CPU. Вроде бы, исправилось. Фикс закоммичен.

ammehet commented 4 years ago

0.6.20200601 отлично работает. Спасибо!