2020-10-03 21:38:26 +00:00
|
|
|
package izapple2
|
2019-11-12 22:47:48 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
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.
|
|
|
|
|
2021-03-14 17:46:52 +00:00
|
|
|
Note that it doesn't intefere with the Apple IIe 80 columns in slot 3. It doesn't
|
|
|
|
have ROM or slot specific sofswitches.
|
|
|
|
|
|
|
|
|
2019-11-12 22:47:48 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2020-10-14 19:54:51 +00:00
|
|
|
// CardFastChip represents a
|
|
|
|
type CardFastChip struct {
|
2019-11-12 22:47:48 +00:00
|
|
|
cardBase
|
2020-04-02 19:50:01 +00:00
|
|
|
unlocked bool
|
|
|
|
unlockCounter uint8
|
|
|
|
enabled bool
|
|
|
|
accelerated bool
|
|
|
|
configRegister uint8
|
2019-11-12 22:47:48 +00:00
|
|
|
}
|
|
|
|
|
2024-01-06 20:48:23 +00:00
|
|
|
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
|
|
|
|
},
|
|
|
|
}
|
2020-10-14 19:54:51 +00:00
|
|
|
}
|
|
|
|
|
2019-11-12 22:47:48 +00:00
|
|
|
const (
|
|
|
|
fastChipUnlockToken = 0x6a
|
|
|
|
fastChipUnlockRepeats = 4
|
|
|
|
fastChipNormalSpeed = uint8(9)
|
|
|
|
)
|
|
|
|
|
2020-10-14 19:54:51 +00:00
|
|
|
func (c *CardFastChip) assign(a *Apple2, slot int) {
|
2019-11-12 22:47:48 +00:00
|
|
|
// The softswitches are outside the card reserved ss
|
|
|
|
// Only writes are implemented to avoid conflicts with the joysticks
|
2022-08-05 17:43:17 +00:00
|
|
|
a.io.addSoftSwitchW(0x6a, func(value uint8) {
|
2019-11-12 22:47:48 +00:00
|
|
|
if value == fastChipUnlockToken {
|
|
|
|
c.unlockCounter++
|
|
|
|
if c.unlockCounter >= fastChipUnlockRepeats {
|
|
|
|
c.unlocked = true
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
c.unlockCounter = 0
|
|
|
|
c.unlocked = false
|
2020-04-02 19:50:01 +00:00
|
|
|
c.enabled = false
|
2019-11-12 22:47:48 +00:00
|
|
|
}
|
|
|
|
}, "FASTCHIP-LOCK")
|
|
|
|
|
2022-08-05 17:43:17 +00:00
|
|
|
a.io.addSoftSwitchW(0x6b, func(uint8) {
|
2019-11-12 22:47:48 +00:00
|
|
|
if c.unlocked {
|
|
|
|
c.enabled = true
|
|
|
|
}
|
|
|
|
}, "FASTCHIP-ENABLE")
|
|
|
|
|
2022-08-05 17:43:17 +00:00
|
|
|
a.io.addSoftSwitchW(0x6d, func(value uint8) {
|
2020-04-02 19:50:01 +00:00
|
|
|
if c.enabled {
|
|
|
|
c.setSpeed(a, value)
|
2019-11-12 22:47:48 +00:00
|
|
|
}
|
|
|
|
}, "FASTCHIP-SPEED")
|
|
|
|
|
2022-08-05 17:43:17 +00:00
|
|
|
a.io.addSoftSwitchW(0x6e, func(value uint8) {
|
2020-04-02 19:50:01 +00:00
|
|
|
if c.enabled {
|
|
|
|
c.configRegister = value
|
|
|
|
}
|
|
|
|
}, "FASTCHIP-CONFIG")
|
|
|
|
|
2022-08-05 17:43:17 +00:00
|
|
|
a.io.addSoftSwitchW(0x6f, func(value uint8) {
|
2020-04-02 19:50:01 +00:00
|
|
|
if c.enabled && c.configRegister == 0 {
|
|
|
|
c.setSpeed(a, value)
|
|
|
|
}
|
|
|
|
}, "FASTCHIP-CONFIG")
|
|
|
|
|
2019-11-12 22:47:48 +00:00
|
|
|
c.cardBase.assign(a, slot)
|
|
|
|
}
|
2020-04-02 19:50:01 +00:00
|
|
|
|
2020-10-14 19:54:51 +00:00
|
|
|
func (c *CardFastChip) setSpeed(a *Apple2, value uint8) {
|
2020-04-02 19:50:01 +00:00
|
|
|
newAccelerated := (value > fastChipNormalSpeed)
|
|
|
|
if newAccelerated == c.accelerated {
|
|
|
|
// No change requested
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if newAccelerated {
|
2022-05-10 11:40:17 +00:00
|
|
|
a.RequestFastMode()
|
2020-04-02 19:50:01 +00:00
|
|
|
} else {
|
2022-05-10 11:40:17 +00:00
|
|
|
a.ReleaseFastMode()
|
2020-04-02 19:50:01 +00:00
|
|
|
}
|
|
|
|
c.accelerated = newAccelerated
|
|
|
|
}
|