package main import ( "unsafe" "github.com/ivanizag/apple2" "github.com/veandco/go-sdl2/sdl" ) func main() { a := apple2.MainApple() SDLRun(a) } // SDLRun starts the Apple2 emulator on SDL func SDLRun(a *apple2.Apple2) { window, renderer, err := sdl.CreateWindowAndRenderer(4*40*7, 4*24*8, sdl.WINDOW_SHOWN) if err != nil { panic("Failed to create window") } window.SetResizable(true) defer window.Destroy() defer renderer.Destroy() window.SetTitle(a.Name) kp := newSDLKeyBoard(a) a.SetKeyboardProvider(kp) s := newSDLSpeaker() s.start() a.SetSpeakerProvider(s) j := newSDLJoysticks() a.SetJoysticksProvider(j) go a.Run() running := true for running { for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() { switch t := event.(type) { case *sdl.QuitEvent: a.SendCommand(apple2.CommandKill) running = false case *sdl.KeyboardEvent: kp.putKey(t) j.putKey(t) case *sdl.TextInputEvent: kp.putText(t) case *sdl.JoyAxisEvent: j.putAxisEvent(t) case *sdl.JoyButtonEvent: j.putButtonEvent(t) } } img := apple2.Snapshot(a) if img != nil { surface, err := sdl.CreateRGBSurfaceFrom(unsafe.Pointer(&img.Pix[0]), int32(img.Bounds().Dx()), int32(img.Bounds().Dy()), 32, 4*img.Bounds().Dx(), 0x0000ff, 0x0000ff00, 0x00ff0000, 0xff000000) // Valid for little endian. Should we reverse for big endian? // 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff) if err != nil { panic(err) } texture, err := renderer.CreateTextureFromSurface(surface) if err != nil { panic(err) } renderer.Clear() w, h := window.GetSize() renderer.Copy(texture, nil, &sdl.Rect{X: 0, Y: 0, W: w, H: h}) renderer.Present() surface.Free() texture.Destroy() } sdl.Delay(1000 / 30) } }