apple2js/test/js/cards/langcard.spec.ts

51 lines
2.5 KiB
TypeScript
Raw Normal View History

Fix issue #187 (and upgrade jest) (#188) * Update jest to v29.5.0 This updates jest to the latest version (29.5.0) and fixes everything that the upgrade breaks. One of the biggest differences is that the mock types changed and I'm once again confused as to the "proper" way to create mocks in jest. Whatever. * Fix issue #187 were bank writing was not working correctly Before, `mmu.ts` would deactivate writing to the language card if `prewrite` was reset. However, it is totally possible to reset `prewrite` and leave writing enabled, as shown my Sather in _Understanding the Apple IIe_, table 5.5, p. 5-24. For example: ```assembly_x86 sta $c08a ; WRITE DISABLE; READ DISABLE lda $c08b ; PRE-WRITE set lda $c08b ; WRITE enabled sta $c08a ; PRE-WRITE reset; WRITE still enabled! lda $c08b ; PRE-WRITE set; WRITE still enabled! ``` would not work correctly because the last line would clear `_writebsr` before setting `_prewrite`, which is incorrect. Now, `_writebsr` is only set when `_prewrite` is set and thus only cleared when `writeSwitch` is false. This matches Table 5.5. * Fix pre-write for the language card This is the same issue as the `MMU`, namely that `langcard.ts` would deactivate writing to the language card if `prewrite` was reset. However, it is totally possible to reset `prewrite` and leave writing enabled, as shown my Sather in _Understanding the Apple II_, table 5.4, p. 5-30. See the previous commit for an example. This change also adds a test for the `LanguageCard` class.
2023-07-08 18:18:38 +00:00
import LanguageCard from '../../../js/cards/langcard';
import Apple2ROM from '../../../js/roms/system/fpbasic';
describe('Language Card', () => {
it('is constructable', () => {
const langCard = new LanguageCard(new Apple2ROM());
expect(langCard).not.toBeNull();
});
it('requires prewrite to write to bank1', () => {
const langCard = new LanguageCard(new Apple2ROM());
// From https://github.com/whscullin/apple2js/issues/187
// Action descriptions from Sather, Table 5.5, p. 5-24, UtAIIe:
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE (write enabled)
langCard.ioSwitch(0x89, 0x00); // WRTCOUNT = 0, READ DISABLE (write still enabled)
langCard.ioSwitch(0x89); // WRTCOUNT = WRITCOUNT + 1, READ DISABLE (write still enabled)
langCard.write(0xd0, 0x00, 0xa1);
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE (write still enabled)
expect(langCard.read(0xd0, 0x00)).toBe(0xa1);
});
it('prewrite is reset on write access before write', () => {
const langCard = new LanguageCard(new Apple2ROM());
// Action descriptions from Sather, Table 5.5, p. 5-24, UtAIIe:
langCard.ioSwitch(0x89, 0x00); // WRTCOUNT = 0, READ DISABLE
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE (write not enabled yet)
langCard.ioSwitch(0x8b, 0x00); // WRTCOUNT = 0, READ ENABLE (write still not enabled)
const oldValue = langCard.read(0xd0, 0x00);
langCard.write(0xd0, 0x00, 0xa1); // writes to the void
expect(langCard.read(0xd0, 0x00)).toBe(oldValue); // reads old value
});
it('write stays active with overzealous switching', () => {
const langCard = new LanguageCard(new Apple2ROM());
// Action descriptions from Sather, Table 5.5, p. 5-24, UtAIIe:
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE (write enabled)
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE (write enabled)
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE (write enabled)
langCard.write(0xd0, 0x00, 0xa1);
langCard.ioSwitch(0x8b); // WRTCOUNT = WRTCOUNT + 1, READ ENABLE (write still enabled)
expect(langCard.read(0xd0, 0x00)).toBe(0xa1);
});
});