package apple2 import ( "go6502/core6502" ) // NewApple2 instantiates an apple2 func NewApple2(romFile string, charRomFile string, clockMhz float64, isColor bool, fastMode bool, panicSS bool) *Apple2 { var a Apple2 a.mmu = newMemoryManager(&a, romFile) a.cpu = core6502.NewNMOS6502(a.mmu) if charRomFile != "" { a.cg = NewCharacterGenerator(charRomFile) } a.commandChannel = make(chan int, 100) a.isColor = isColor a.fastMode = fastMode a.panicSS = panicSS if clockMhz <= 0 { // Full speed a.cycleDurationNs = 0 } else { a.cycleDurationNs = 1000.0 / clockMhz } // Set the io in 0xc000 a.io = newIoC0Page(&a) a.mmu.setPages(0xc0, 0xc0, a.io) return &a } func (a *Apple2) insertCard(c card, slot int) { c.assign(a, slot) a.cards[slot] = c } // AddDisk2 insterts a DiskII controller func (a *Apple2) AddDisk2(slot int, diskRomFile string, diskImage string) { var c cardDisk2 c.loadRom(diskRomFile) a.insertCard(&c, slot) if diskImage != "" { diskette := loadDisquette(diskImage) //diskette.saveNib(diskImage + "bak") c.drive[0].insertDiskette(diskette) } } // AddLanguageCard inserts a 16Kb card func (a *Apple2) AddLanguageCard(slot int) { a.insertCard(&cardLanguage{}, slot) } // AddSaturnCard inserts a 128Kb card func (a *Apple2) AddSaturnCard(slot int) { a.insertCard(&cardSaturn{}, slot) } // ConfigureStdConsole uses stdin and stdout to interface with the Apple2 func (a *Apple2) ConfigureStdConsole(stdinKeyboard bool, stdoutScreen bool) { if !stdinKeyboard && !stdoutScreen { return } // Init frontend fe := newAnsiConsoleFrontend(a, stdinKeyboard) if stdinKeyboard { a.io.setKeyboardProvider(fe) } if stdoutScreen { go fe.textModeGoRoutine() } } // 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) }