-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathcardMultiRom.go
107 lines (91 loc) · 2.31 KB
/
cardMultiRom.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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
}