package main import ( "flag" "fmt" "os" "github.com/freewilll/apple2/audio" "github.com/freewilll/apple2/cpu" "github.com/freewilll/apple2/disk" "github.com/freewilll/apple2/keyboard" "github.com/freewilll/apple2/mmu" "github.com/freewilll/apple2/system" "github.com/freewilll/apple2/utils" "github.com/freewilll/apple2/video" "github.com/hajimehoshi/ebiten" ) var showInstructions *bool var disableFirmwareWait *bool var resetKeysDown bool var fpsKeysDown bool var breakAddress *uint16 // checkSpecialKeys checks // - ctrl-alt-R has been pressed. Releasing the R does a warm reset // - ctrl-alt-F has been pressed, toggling FPS display func checkSpecialKeys() { if ebiten.IsKeyPressed(ebiten.KeyControl) && ebiten.IsKeyPressed(ebiten.KeyAlt) && ebiten.IsKeyPressed(ebiten.KeyR) { resetKeysDown = true } else if ebiten.IsKeyPressed(ebiten.KeyControl) && ebiten.IsKeyPressed(ebiten.KeyAlt) && !ebiten.IsKeyPressed(ebiten.KeyR) && resetKeysDown { resetKeysDown = false cpu.Reset() } else { resetKeysDown = false } if ebiten.IsKeyPressed(ebiten.KeyControl) && ebiten.IsKeyPressed(ebiten.KeyAlt) && ebiten.IsKeyPressed(ebiten.KeyF) { fpsKeysDown = true } else if ebiten.IsKeyPressed(ebiten.KeyControl) && ebiten.IsKeyPressed(ebiten.KeyAlt) && !ebiten.IsKeyPressed(ebiten.KeyF) && fpsKeysDown { fpsKeysDown = false video.ShowFPS = !video.ShowFPS fmt.Println("Toggled") } else { fpsKeysDown = false } } func update(screen *ebiten.Image) error { keyboard.Poll() checkSpecialKeys() system.FrameCycles = 0 system.LastAudioCycles = 0 exitAtBreak := true cpu.Run(*showInstructions, breakAddress, exitAtBreak, *disableFirmwareWait, system.CpuFrequency/60) audio.ForwardToFrameCycle() system.Cycles += system.FrameCycles system.FrameCycles = 0 return video.DrawScreen(screen) } func main() { var Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n\n", os.Args[0]) fmt.Fprintf(flag.CommandLine.Output(), "Synopsis: %s [disk image file]\n\n", os.Args[0]) fmt.Fprintf(flag.CommandLine.Output(), "Options\n") flag.PrintDefaults() } flag.Usage = Usage showInstructions = flag.Bool("show-instructions", false, "Show instructions code while running") disableFirmwareWait = flag.Bool("disable-wait", false, "Ignore JSRs to firmware wait at $FCA8") breakAddressString := flag.String("break", "", "Break on address") mute := flag.Bool("mute", false, "Mute sound") clickWhenDriveHeadMoves := flag.Bool("drive-head-click", false, "Click speaker when drive head moves") flag.Parse() diskImages := flag.Args() var diskImage string if len(diskImages) > 0 { diskImage = diskImages[0] } breakAddress = utils.DecodeCmdLineAddress(breakAddressString) ebiten.SetRunnableInBackground(true) cpu.InitInstructionDecoder() mmu.InitRAM() mmu.InitApple2eROM() mmu.InitIO() if diskImage != "" { disk.ReadDiskImage(diskImage) } cpu.Init() keyboard.Init() video.Init() audio.InitEbiten() audio.Mute = *mute audio.ClickWhenDriveHeadMoves = *clickWhenDriveHeadMoves system.Init() cpu.SetColdStartReset() cpu.Reset() ebiten.Run(update, 280*video.ScreenSizeFactor, 192*video.ScreenSizeFactor, 2, "Apple //e") disk.FlushImage() }