mirror of
https://github.com/ivanizag/izapple2.git
synced 2024-12-27 11:30:02 +00:00
MultiROM card by davidm in applefritter
This commit is contained in:
parent
ea492f118e
commit
677e1113cb
@ -41,6 +41,7 @@ func getCardFactory() map[string]*cardBuilder {
|
|||||||
cardFactory["softswitchlogger"] = newCardLoggerBuilder()
|
cardFactory["softswitchlogger"] = newCardLoggerBuilder()
|
||||||
cardFactory["memexp"] = newCardMemoryExpansionBuilder()
|
cardFactory["memexp"] = newCardMemoryExpansionBuilder()
|
||||||
cardFactory["mouse"] = newCardMouseBuilder()
|
cardFactory["mouse"] = newCardMouseBuilder()
|
||||||
|
cardFactory["multirom"] = newMultiRomCardBuilder()
|
||||||
cardFactory["parallel"] = newCardParallelPrinterBuilder()
|
cardFactory["parallel"] = newCardParallelPrinterBuilder()
|
||||||
cardFactory["saturn"] = newCardSaturnBuilder()
|
cardFactory["saturn"] = newCardSaturnBuilder()
|
||||||
cardFactory["smartport"] = newCardSmartPortStorageBuilder()
|
cardFactory["smartport"] = newCardSmartPortStorageBuilder()
|
||||||
|
111
cardMultiRom.go
Normal file
111
cardMultiRom.go
Normal file
@ -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", "<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
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MultiRomCard) setBase(base uint16) {
|
||||||
|
// Nothing
|
||||||
|
}
|
BIN
resources/MultiRom(SP boot)-Prog aid-28C256.BIN
Normal file
BIN
resources/MultiRom(SP boot)-Prog aid-28C256.BIN
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user