Я строю Commodore PET на FPGA. Я реализовал собственное ядро 6502 в Kansas Lava (код доступен по адресу https://github.com/gergoerdi/mos6502-kansas-lava) и достаточное количество операций ввода-вывода (https://github.com/gergoerdi/eightbit-kansas-lava) Я смог загрузить на нем оригинальный Commodore PET ROM, получить мигающий курсор и начать печатать.
Однако, набрав классическую программу BASIC
10 PRINT "HELLO WORLD"
20 GOTO 10
он вылетает через некоторое время (через несколько секунд) с
?ILLEGAL QUANTITY ERROR IN 10
Потому что мой код имеет достаточно разумное тестовое покрытие для каждого кода операции и проходит AllSuiteA, я подумал, что стоит изучить тесты для более сложного поведения, и так я пришел к Комплект прерываний Клауса Дорманна. Запуск его в симуляторе Kansas Lava выявил массу ошибок в моей исходной реализации прерывания:
- Не был установлен флаг
I
при входе в обработчик прерывания - Флаг
B
был повсюду - Прерывания IRQ полностью игнорировались, если только
I
не было сброшено, когда они прибыли (правильное поведение, по-видимому, состоит в том, чтобы ставить прерывания в очередь, когдаI
установлено, и когда оно сбрасывается, их все равно следует обрабатывать)
После их исправления я теперь могу успешно запустить тест Клауса Дорманна, поэтому я надеялся, что, загрузив мою машину обратно на настоящую FPGA, если повезет, сбой BASIC исчезнет.
Однако новая версия, в которой все эти ошибки с прерываниями исправлены и пройдена проверка прерывания в симуляторе, теперь не реагирует на ввод с клавиатуры или даже просто мигает курсором на реальном ПЛИС. Обратите внимание, что и ввод с клавиатуры, и мигание курсора выполняются в ответ на внешнее IRQ (подключенное от сигнала экрана VBlank), поэтому это означает, что исправленная версия каким-то образом нарушила всю обработку прерываний...
Я ищу любые расплывчатые предложения, что может пойти не так или как я могу начать отлаживать это.
Полный код доступен по адресу https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite, ошибочный коммит (тот, который исправляет тест и ломает PET) — 7a09b794af. Я понимаю, что это полная противоположность минимально жизнеспособному воспроизведению, но само изменение крошечное, и поскольку я понятия не имею, где что-то пойдет не так, и поскольку для воспроизведения проблемы требуется машина, достаточно функциональная для загрузки стандартного Commodore PET ROM, я не Не знаю, как я мог уменьшить его...
Добавлено:
Мне удалось воспроизвести ту же проблему на том же оборудовании с очень простым (осмелюсь сказать, минимальным) ПЗУ вместо стандартного ПЗУ для домашних животных:
.org $C000
reset:
;; Initialize PIA
LDY #$07
STY $E813
LDA #30
STA $42
STA $8000
CLI
JMP *
irq:
CMP $E812 ; ACK irq
DEC $42
BNE endirq
LDX $8000
INX
STX $8000
LDA #30
STA $42
endirq: RTI
.res $FFFC-*
.org $FFFC
resetv: .addr reset
irqv: .addr irq