izapple2/cardBase.go

78 lines
1.9 KiB
Go
Raw Normal View History

2020-10-03 21:38:26 +00:00
package izapple2
2019-03-02 19:41:25 +00:00
2019-05-18 14:43:51 +00:00
type card interface {
2019-10-02 21:39:39 +00:00
loadRom(data []uint8)
2019-05-18 14:43:51 +00:00
assign(a *Apple2, slot int)
}
2019-03-02 19:41:25 +00:00
type cardBase struct {
a *Apple2
romCsxx *memoryRangeROM
romC8xx *memoryRangeROM
romCxxx *memoryRangeROM
slot int
2019-10-20 22:00:42 +00:00
_ssr [16]softSwitchR
_ssw [16]softSwitchW
_ssrName [16]string
_sswName [16]string
2019-03-02 19:41:25 +00:00
}
2019-10-02 21:39:39 +00:00
func (c *cardBase) loadRom(data []uint8) {
2019-05-18 14:43:51 +00:00
if c.a != nil {
2019-10-05 23:26:00 +00:00
panic("Assert failed. Rom must be loaded before inserting the card in the slot")
2019-05-18 14:43:51 +00:00
}
if len(data) == 0x100 {
// Just 256 bytes in Cs00
2020-09-23 16:19:15 +00:00
c.romCsxx = newMemoryRangeROM(0, data, "Slot ROM")
} else if len(data) == 0x800 {
// The file has C800 to C8FF
// The 256 bytes in Cx00 are copied from the first page in C800
2020-09-23 16:19:15 +00:00
c.romCsxx = newMemoryRangeROM(0, data, "Slor ROM")
c.romC8xx = newMemoryRangeROM(0xc800, data, "Slot C8 ROM")
} else if len(data) == 0x1000 {
// The file covers the full Cxxx range. Only showing the page
// corresponding to the slot used.
2020-09-23 16:19:15 +00:00
c.romCxxx = newMemoryRangeROM(0xc000, data, "Slot ROM")
} else {
panic("Invalid ROM size")
}
2019-05-18 14:43:51 +00:00
}
func (c *cardBase) assign(a *Apple2, slot int) {
c.a = a
2019-03-02 19:41:25 +00:00
c.slot = slot
if slot != 0 {
if c.romCsxx != nil {
// Relocate to the assigned slot
c.romCsxx.setBase(uint16(0xc000 + slot*0x100))
a.mmu.setCardROM(slot, c.romCsxx)
}
if c.romC8xx != nil {
a.mmu.setCardROMExtra(slot, c.romC8xx)
}
if c.romCxxx != nil {
a.mmu.setCardROM(slot, c.romCxxx)
a.mmu.setCardROMExtra(slot, c.romCxxx)
}
}
2019-03-02 19:41:25 +00:00
for i := 0; i < 0x10; i++ {
2020-08-30 19:11:43 +00:00
if c._ssr[i] != nil {
a.io.addSoftSwitchR(uint8(0xC80+slot*0x10+i), c._ssr[i], c._ssrName[i])
}
if c._ssw[i] != nil {
a.io.addSoftSwitchW(uint8(0xC80+slot*0x10+i), c._ssw[i], c._sswName[i])
}
2019-03-02 19:41:25 +00:00
}
}
2019-05-18 14:43:51 +00:00
2019-10-20 22:00:42 +00:00
func (c *cardBase) addCardSoftSwitchR(address uint8, ss softSwitchR, name string) {
c._ssr[address] = ss
c._ssrName[address] = name
}
func (c *cardBase) addCardSoftSwitchW(address uint8, ss softSwitchW, name string) {
c._ssw[address] = ss
c._sswName[address] = name
}