izapple2/cardLanguage.go

97 lines
2.2 KiB
Go
Raw Normal View History

2019-05-16 20:55:19 +00:00
package apple2
/*
Language card with 16 extra kb for the Apple ][ and ][+
Manual: http://www.applelogic.org/files/LANGCARDMAN.pdf
The language card doesn't have ROM for Cx00. It would not
be used in slot 0 anyway.
Note also that language cards for the Apple ][ had ROM on
board to replace the main board F8 ROM with Autostart. That
was not used/needed on the Apple ][+. As this emulates the
Apple ][+, it is not considered. For the Plus it is often
2019-05-16 20:55:19 +00:00
refered as Language card but it is really a 16 KB Ram card,
"When RAM is deselected, the ROM on the Language card is selected for
2019-05-16 20:55:19 +00:00
the top 2K ($F800-$FFFF), and the ROM on the main board is selected
for $D000-$F7FF.
Power on RESET initializes ROM to read mode and RAM to write mode,
and selects the second 4K bank to map $D000-$DFFF."
Writing to the softswtich disables writing in LC? Saw that
somewhere but doing so fails IIe self check.
2019-05-16 20:55:19 +00:00
*/
type cardLanguage struct {
cardBase
readState bool
2019-10-20 22:00:42 +00:00
writeState uint8
2019-11-05 23:02:03 +00:00
altBank bool // false is bank1, true is bank2
2019-05-16 20:55:19 +00:00
}
const (
// Write enabling requires two softswitch accesses
2019-05-16 20:55:19 +00:00
lcWriteDisabled = 0
lcWriteHalfEnabled = 1
lcWriteEnabled = 2
)
2019-05-18 14:43:51 +00:00
func (c *cardLanguage) assign(a *Apple2, slot int) {
2019-05-16 20:55:19 +00:00
c.readState = false
c.writeState = lcWriteEnabled
2019-11-05 23:02:03 +00:00
c.altBank = true // Start on bank2
2019-05-16 20:55:19 +00:00
a.mmu.initLanguageRAM(1)
2019-10-20 22:00:42 +00:00
for i := uint8(0x0); i <= 0xf; i++ {
2019-05-16 20:55:19 +00:00
iCopy := i
2019-10-20 22:00:42 +00:00
c.addCardSoftSwitchR(iCopy, func(*ioC0Page) uint8 {
c.ssAction(iCopy)
2019-05-16 20:55:19 +00:00
return 0
2019-10-20 22:00:42 +00:00
}, "LANGCARDR")
c.addCardSoftSwitchW(iCopy, func(*ioC0Page, uint8) {
c.ssAction(iCopy)
2019-10-20 22:00:42 +00:00
}, "LANGCARDW")
2019-05-16 20:55:19 +00:00
}
2019-05-18 14:43:51 +00:00
c.cardBase.assign(a, slot)
c.applyState()
2019-05-16 20:55:19 +00:00
}
func (c *cardLanguage) ssAction(ss uint8) {
2019-11-05 23:02:03 +00:00
c.altBank = ((ss >> 3) & 1) == 0
2019-05-16 20:55:19 +00:00
action := ss & 0x3
switch action {
case 0:
// RAM read, no writes
c.readState = true
c.writeState = lcWriteDisabled
case 1:
// ROM read, RAM write
c.readState = false
c.writeState++
case 2:
// ROM read, no writes
c.readState = false
c.writeState = lcWriteDisabled
case 3:
//RAM read, RAM write
c.readState = true
c.writeState++
}
if c.writeState > lcWriteEnabled {
c.writeState = lcWriteEnabled
}
c.applyState()
}
func (c *cardLanguage) applyState() {
c.a.mmu.setLanguageRAM(c.readState, c.writeState == lcWriteEnabled, c.altBank)
2019-05-16 20:55:19 +00:00
}