izapple2/apple2/ioC0Page.go

114 lines
2.6 KiB
Go
Raw Normal View History

package apple2
2019-02-17 23:01:48 +00:00
import (
"fmt"
)
type ioC0Page struct {
2019-03-02 19:41:25 +00:00
softSwitchesR [256]softSwitchR
softSwitchesW [256]softSwitchW
softSwitchesData [128]uint8
2019-04-13 18:29:31 +00:00
keyboard KeyboardProvider
2019-05-09 22:09:15 +00:00
speaker SpeakerProvider
apple2 *Apple2
}
type softSwitchR func(io *ioC0Page) uint8
type softSwitchW func(io *ioC0Page, value uint8)
2019-04-21 19:04:02 +00:00
// KeyboardProvider declares the keyboard implementation requirements
2019-04-13 18:29:31 +00:00
type KeyboardProvider interface {
GetKey(strobe bool) (key uint8, ok bool)
}
2019-05-09 22:09:15 +00:00
// SpeakerProvider declares the speaker implementation requirements
type SpeakerProvider interface {
// Click receives a speaker click. The argument is the CPU cycle when it is generated
Click(cycle uint64)
}
// See https://www.kreativekorp.com/miscpages/a2info/iomemory.shtml
// See https://stason.org/TULARC/pc/apple2/programmer/004-I-d-like-to-do-some-serious-Apple-II-programming-Whe.html
const (
ssOn uint8 = 0x80
ssOff uint8 = 0x00
)
func newIoC0Page(a *Apple2) *ioC0Page {
2019-02-24 14:05:50 +00:00
var io ioC0Page
io.apple2 = a
2019-02-24 14:05:50 +00:00
addApple2SoftSwitches(&io)
if a.isApple2e {
2019-02-24 14:05:50 +00:00
addApple2ESoftSwitches(&io)
}
return &io
}
func (p *ioC0Page) addSoftSwitchRW(address uint8, ss softSwitchR) {
p.addSoftSwitchR(address, ss)
p.addSoftSwitchW(address, func(p *ioC0Page, _ uint8) {
ss(p)
})
}
func (p *ioC0Page) addSoftSwitchR(address uint8, ss softSwitchR) {
if p.softSwitchesR[address] != nil {
fmt.Printf("Addresss 0x0c%02x is already assigned for read", address)
}
p.softSwitchesR[address] = ss
}
func (p *ioC0Page) addSoftSwitchW(address uint8, ss softSwitchW) {
if p.softSwitchesW[address] != nil {
fmt.Printf("Addresss 0x0c%02x is already assigned for write", address)
}
p.softSwitchesW[address] = ss
}
2019-04-21 19:04:02 +00:00
func (p *ioC0Page) isSoftSwitchActive(ioFlag uint8) bool {
2019-02-24 14:05:50 +00:00
return (p.softSwitchesData[ioFlag] & ssOn) == ssOn
}
2019-04-13 18:29:31 +00:00
func (p *ioC0Page) setKeyboardProvider(kb KeyboardProvider) {
p.keyboard = kb
}
2019-05-09 22:09:15 +00:00
func (p *ioC0Page) setSpeakerProvider(s SpeakerProvider) {
p.speaker = s
}
func (p *ioC0Page) Peek(address uint8) uint8 {
//fmt.Printf("Peek on $C0%02x ", address)
ss := p.softSwitchesR[address]
if ss == nil {
2019-04-15 21:13:05 +00:00
if p.apple2.panicSS {
panic(fmt.Sprintf("Unknown softswitch on read to 0xC0%02x", address))
}
2019-03-04 23:00:12 +00:00
return 0
}
return ss(p)
}
2019-04-21 19:04:02 +00:00
func (p *ioC0Page) internalPeek(address uint8) uint8 {
return 0
}
2019-04-26 16:08:30 +00:00
func (p *ioC0Page) all() []uint8 {
return nil
}
func (p *ioC0Page) Poke(address uint8, value uint8) {
//fmt.Printf("Poke on $C0%02x with %02x ", address, value)
ss := p.softSwitchesW[address]
if ss == nil {
2019-04-15 21:13:05 +00:00
if p.apple2.panicSS {
panic(fmt.Sprintf("Unknown softswitch on write to 0xC0%02x", address))
}
2019-03-04 23:00:12 +00:00
return
}
ss(p, value)
}