izapple2/apple2Setup.go

173 lines
3.7 KiB
Go
Raw Normal View History

package apple2
2019-10-05 23:26:00 +00:00
import (
"errors"
"github.com/ivanizag/apple2/core6502"
)
2019-10-12 19:37:37 +00:00
// newApple2 instantiates an apple2
func newApple2plus() *Apple2 {
var a Apple2
a.Name = "Apple ][+"
a.mmu = newMemoryManager(&a)
a.cpu = core6502.NewNMOS6502(a.mmu)
2019-10-12 19:37:37 +00:00
// Set the io in 0xc000
a.io = newIoC0Page(&a)
a.mmu.setPages(0xc0, 0xc0, a.io)
addApple2SoftSwitches(a.io)
return &a
}
func newApple2eEnhanced() *Apple2 {
var a Apple2
a.Name = "Apple //e"
a.mmu = newMemoryManager(&a)
a.cpu = core6502.NewCMOS65c02(a.mmu)
// Set the io in 0xc000
a.io = newIoC0Page(&a)
a.mmu.setPages(0xc0, 0xc0, a.io)
addApple2SoftSwitches(a.io)
addApple2ESoftSwitches(a.io)
return &a
}
func (a *Apple2) setup(isColor bool, clockMhz float64, fastMode bool) {
a.commandChannel = make(chan int, 100)
a.isColor = isColor
a.fastMode = fastMode
if clockMhz <= 0 {
// Full speed
a.cycleDurationNs = 0
} else {
a.cycleDurationNs = 1000.0 / clockMhz
}
}
2019-05-18 14:43:51 +00:00
func (a *Apple2) insertCard(c card, slot int) {
c.assign(a, slot)
a.cards[slot] = c
}
const (
apple2RomSize = 12 * 1024
apple2eRomSize = 16 * 1024
)
// LoadRom loads a standard Apple2+ or 2e ROM
2019-10-05 23:26:00 +00:00
func (a *Apple2) LoadRom(filename string) error {
data, err := loadResource(filename)
if err != nil {
return err
}
size := len(data)
if size != apple2RomSize && size != apple2eRomSize {
2019-10-05 23:26:00 +00:00
return errors.New("Rom size not supported")
}
romStart := 0
mmu := a.mmu
if size == apple2eRomSize {
// The extra 4kb ROM is first in the rom file.
// It starts with 256 unused bytes not mapped to 0xc000.
a.isApple2e = true
extraRomSize := apple2eRomSize - apple2RomSize
mmu.physicalROMe = newMemoryRange(0xc000, data[0:extraRomSize])
romStart = extraRomSize
}
mmu.physicalROM = newMemoryRange(0xd000, data[romStart:])
mmu.resetRomPaging()
2019-10-05 23:26:00 +00:00
return nil
}
2019-10-02 21:39:39 +00:00
// AddDisk2 inserts a DiskII controller
2019-10-05 23:26:00 +00:00
func (a *Apple2) AddDisk2(slot int, diskRomFile string, diskImage string) error {
2019-05-18 14:43:51 +00:00
var c cardDisk2
2019-10-05 23:26:00 +00:00
data, err := loadResource(diskRomFile)
if err != nil {
return err
}
c.loadRom(data)
2019-05-18 14:43:51 +00:00
a.insertCard(&c, slot)
if diskImage != "" {
2019-10-05 23:26:00 +00:00
diskette, err := loadDisquette(diskImage)
if err != nil {
return err
}
2019-05-18 14:43:51 +00:00
c.drive[0].insertDiskette(diskette)
}
2019-10-05 23:26:00 +00:00
return nil
}
2019-10-02 21:39:39 +00:00
// AddHardDisk adds a ProDos hard dirve with a 2MG image
2019-10-05 23:26:00 +00:00
func (a *Apple2) AddHardDisk(slot int, hdImage string) error {
2019-10-02 21:39:39 +00:00
var c cardHardDisk
c.loadRom(buildHardDiskRom(slot))
a.insertCard(&c, slot)
2019-10-05 23:26:00 +00:00
hd, err := openHardDisk2mg(hdImage)
if err != nil {
return err
}
2019-10-02 21:39:39 +00:00
c.addDisk(hd)
2019-10-05 23:26:00 +00:00
return nil
2019-10-02 21:39:39 +00:00
}
// AddLanguageCard inserts a 16Kb card
func (a *Apple2) AddLanguageCard(slot int) {
2019-05-18 14:43:51 +00:00
a.insertCard(&cardLanguage{}, slot)
}
// AddSaturnCard inserts a 128Kb card
func (a *Apple2) AddSaturnCard(slot int) {
2019-05-18 14:43:51 +00:00
a.insertCard(&cardSaturn{}, slot)
}
// AddThunderClockPlusCard inserts a ThunderClock Plus clock card
2019-10-05 23:26:00 +00:00
func (a *Apple2) AddThunderClockPlusCard(slot int, romFile string) error {
var c cardThunderClockPlus
2019-10-05 23:26:00 +00:00
data, err := loadResource(romFile)
if err != nil {
return err
}
c.loadRom(data)
a.insertCard(&c, slot)
2019-10-05 23:26:00 +00:00
return nil
}
2019-05-18 21:40:59 +00:00
// AddCardLogger inserts a fake card that logs accesses
func (a *Apple2) AddCardLogger(slot int) {
a.insertCard(&cardLogger{}, slot)
}
// AddCardInOut inserts a fake card that interfaces with the emulator host
func (a *Apple2) AddCardInOut(slot int) {
a.insertCard(&cardInOut{}, slot)
}
// SetKeyboardProvider attaches an external keyboard provider
func (a *Apple2) SetKeyboardProvider(kb KeyboardProvider) {
a.io.setKeyboardProvider(kb)
}
// SetSpeakerProvider attaches an external keyboard provider
func (a *Apple2) SetSpeakerProvider(s SpeakerProvider) {
a.io.setSpeakerProvider(s)
}
2019-08-05 22:37:27 +00:00
// SetJoysticksProvider attaches an external joysticks provider
func (a *Apple2) SetJoysticksProvider(j JoysticksProvider) {
a.io.setJoysticksProvider(j)
}