Open joncampbell123 opened 5 years ago
This modification must be done carefully. In the ideal case, the "cascade ISR hack" can just be made into Specially Fully Nested Mode and the BIOS init / PIC startup code can just be set to switch on Specially Fully Nested Mode as part of startup in PC-98 mode.
But I want to do this carefully:
I'm careful about DOSBox-X implementing actual hardware behavior, rather than the DOSBox SVN approach of making it "good enough" to get games running.
Verify on real PC-98 hardware how interrupts react in the default programmed mode
Booting the original firmware on mame shows the master being programmed with sfnm.
There is growing evidence that emulation problems (and the workaround) are related by the use of Specially Full Nested Mode on PC-98 (instead of Fully Nested Mode on IBM PC/XT/AT).
The difference appears to affect how the cascade interrupt works, which is why the "ignore cascade interrupt ISR" hack always resolves ISR problems with PC-98 games.
In Fully Nested Mode, if the slave pic fires an IRQ, the ISR needs to EOI the master AND the slave before any more interrupts from the slave are sent to the CPU.
In Specially Fully Nested Mode, the slave PIC can issue more interrupts even if the master cascade interrupt is in service (if they are higher priority than prior slave interrupts). ISRs must EOI the slave PIC, then read the ISR bitfield and (should) ack the master IF there are no more interrupts pending on the slave (confirmed behavior of some PC-98 games). Most PC-98 games appear to EOI the slave PIC without checking the ISR or bothering to EOI the master cascade interrupt, which according to the documentation should happen to work anyway.
This also means that if an IBM PC/XT/AT DOS game also switches on Specially Fully Nested Mode, the warning message in src/hardware/pic.cpp can be removed and the cascade IRQ hack can be enabled at that point (as some IBM PC games/demos are reported to do).
See also: https://www.eeeguide.com/block-diagram-of-8259-programmable-interrupt-controller/