izapple2/cardFastChip.go
2024-01-06 21:48:23 +01:00

101 lines
2.3 KiB
Go

package izapple2
/*
Simulates just what is needed to make Total Replay use fast mode. Can change
from controlled speed to max speed the emulator can do.
Note: It ends up not being useful for Total Replay as loading from HD is already
very fast. HD blocks are loaded directly on the emulated RAM.
Note that it doesn't intefere with the Apple IIe 80 columns in slot 3. It doesn't
have ROM or slot specific sofswitches.
See:
https://github.com/a2-4am/4cade/blob/master/src/hw.accel.a
http://www.a2heaven.com/webshop/resources/pdf_document/18/82/c.pdf
*/
// CardFastChip represents a
type CardFastChip struct {
cardBase
unlocked bool
unlockCounter uint8
enabled bool
accelerated bool
configRegister uint8
}
func newCardFastChipBuilder() *cardBuilder {
return &cardBuilder{
name: "FASTChip IIe Card - limited",
description: "Accelerator card for Apple IIe. Limited support.",
buildFunc: func(params map[string]string) (Card, error) {
return &CardFastChip{}, nil
},
}
}
const (
fastChipUnlockToken = 0x6a
fastChipUnlockRepeats = 4
fastChipNormalSpeed = uint8(9)
)
func (c *CardFastChip) assign(a *Apple2, slot int) {
// The softswitches are outside the card reserved ss
// Only writes are implemented to avoid conflicts with the joysticks
a.io.addSoftSwitchW(0x6a, func(value uint8) {
if value == fastChipUnlockToken {
c.unlockCounter++
if c.unlockCounter >= fastChipUnlockRepeats {
c.unlocked = true
}
} else {
c.unlockCounter = 0
c.unlocked = false
c.enabled = false
}
}, "FASTCHIP-LOCK")
a.io.addSoftSwitchW(0x6b, func(uint8) {
if c.unlocked {
c.enabled = true
}
}, "FASTCHIP-ENABLE")
a.io.addSoftSwitchW(0x6d, func(value uint8) {
if c.enabled {
c.setSpeed(a, value)
}
}, "FASTCHIP-SPEED")
a.io.addSoftSwitchW(0x6e, func(value uint8) {
if c.enabled {
c.configRegister = value
}
}, "FASTCHIP-CONFIG")
a.io.addSoftSwitchW(0x6f, func(value uint8) {
if c.enabled && c.configRegister == 0 {
c.setSpeed(a, value)
}
}, "FASTCHIP-CONFIG")
c.cardBase.assign(a, slot)
}
func (c *CardFastChip) setSpeed(a *Apple2, value uint8) {
newAccelerated := (value > fastChipNormalSpeed)
if newAccelerated == c.accelerated {
// No change requested
return
}
if newAccelerated {
a.RequestFastMode()
} else {
a.ReleaseFastMode()
}
c.accelerated = newAccelerated
}