diff --git a/cardBuilder.go b/cardBuilder.go index 68eed5c..41a4702 100644 --- a/cardBuilder.go +++ b/cardBuilder.go @@ -41,6 +41,7 @@ func getCardFactory() map[string]*cardBuilder { cardFactory["softswitchlogger"] = newCardLoggerBuilder() cardFactory["memexp"] = newCardMemoryExpansionBuilder() cardFactory["mouse"] = newCardMouseBuilder() + cardFactory["multirom"] = newMultiRomCardBuilder() cardFactory["parallel"] = newCardParallelPrinterBuilder() cardFactory["saturn"] = newCardSaturnBuilder() cardFactory["smartport"] = newCardSmartPortStorageBuilder() diff --git a/cardMultiRom.go b/cardMultiRom.go new file mode 100644 index 0000000..08b9b6a --- /dev/null +++ b/cardMultiRom.go @@ -0,0 +1,111 @@ +package izapple2 + +/* + MultiROM card for Apple II + +See: https://www.applefritter.com/content/multiple-image-rom-card + + +------- +28C256 (Also for 27256 on Rev 1.1 cards) +------- +0000-07FF - CPM boot (User 2) Bank 3 +0800-0FFF - Freeze (User 3) Bank 2 +1000-37FF - IntBasic including programmers aid BankBasic 0 +3800-3FFF - Monitor Bank 6 +4000-47FF - Lockbuster (User 1) Bank 4 +4800-4FFF - Dead boot diagnostic Bank 5 +5000-77FF - Applesoft BankBasic 1 +7800-7FFF - Autostart Bank 7 + + +*/ + +// MultiRomCard represents a Multiple Image ROM Card +type MultiRomCard struct { + cardBase + rom []uint8 + basicBank int + f8Bank int +} + +func newMultiRomCardBuilder() *cardBuilder { + return &cardBuilder{ + name: "MultiROM", + description: "Multiple Image ROM card.", + defaultParams: &[]paramSpec{ + {"rom", "ROM file to load", "/MultiRom(SP boot)-Prog aid-28C256.BIN"}, + {"basic", "Bank for D000 to F7FF", "1"}, + {"bank", "Bank for F8", "7"}}, + buildFunc: func(params map[string]string) (Card, error) { + var c MultiRomCard + var err error + c.basicBank, err = paramsGetInt(params, "basic") + if err != nil { + return nil, err + } + c.f8Bank, err = paramsGetInt(params, "bank") + if err != nil { + return nil, err + } + + romFile := paramsGetPath(params, "rom") + data, _, err := LoadResource(romFile) + if err != nil { + return nil, err + } + + c.rom = data + return &c, nil + }, + } +} + +func (c *MultiRomCard) assign(a *Apple2, slot int) { + c.cardBase.assign(a, slot) + a.mmu.inhibitROM(c) +} + +func (c *MultiRomCard) translateAddress(address uint16) uint16 { + var baseAddress uint16 + // Basic part + if address < 0xf800 { + switch c.basicBank { + case 0: + baseAddress = 0x1000 + default: + baseAddress = 0x5000 + } + return address - 0xd000 + baseAddress + } + + // F8 part + + switch c.f8Bank { + case 2: + baseAddress = 0x0800 + case 3: + baseAddress = 0x0000 + case 4: + baseAddress = 0x4000 + case 5: + baseAddress = 0x4800 + case 6: + baseAddress = 0x3800 + default: + baseAddress = 0x7800 + } + return address - 0xf800 + baseAddress +} + +func (c *MultiRomCard) peek(address uint16) uint8 { + return c.rom[c.translateAddress(address)] +} + +func (c *MultiRomCard) poke(address uint16, value uint8) { + // Nothing +} + +func (c *MultiRomCard) setBase(base uint16) { + // Nothing +} diff --git a/resources/MultiRom(SP boot)-Prog aid-28C256.BIN b/resources/MultiRom(SP boot)-Prog aid-28C256.BIN new file mode 100644 index 0000000..44b0375 Binary files /dev/null and b/resources/MultiRom(SP boot)-Prog aid-28C256.BIN differ