mirror of
https://github.com/ivanizag/izapple2.git
synced 2024-12-02 02:49:17 +00:00
108 lines
2.3 KiB
Go
108 lines
2.3 KiB
Go
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", "<internal>/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
|
|
}
|