package main import ( "flag" "fmt" "go-chip8/chip8" "os" "github.com/veandco/go-sdl2/sdl" ) // SdlEmulator represents the Chip8 emulator with Sdl frontend type SdlEmulator struct { w int h int renderer *sdl.Renderer zoom int32 chip8 chip8.Chip8 } // NewSdlEmulator creates a new SdlEmulator func NewSdlEmulator(w, h int, zoom int32) SdlEmulator { c := chip8.NewChip8() window, err := sdl.CreateWindow("go-chip8", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, int32(w)*zoom, int32(h)*zoom, sdl.WINDOW_SHOWN) if err != nil { panic(err) } renderer, err := sdl.CreateRenderer(window, -1, 0) if err != nil { panic(err) } return SdlEmulator{ w: w, h: h, renderer: renderer, zoom: zoom, chip8: c, } } func (e *SdlEmulator) drawGraphics() { e.renderer.SetDrawColor(0, 0, 0, 1) e.renderer.Clear() e.renderer.SetDrawColor(255, 255, 255, 1) for y := 0; y < e.h; y++ { for x := 0; x < e.w; x++ { pixel := e.chip8.Gfx[y*e.w+x] if pixel != 0 { e.renderer.FillRect(&sdl.Rect{ X: int32(x) * e.zoom, Y: int32(y) * e.zoom, W: e.zoom, H: e.zoom, }) } } } e.renderer.Present() e.chip8.DrawFlag = false } func (e *SdlEmulator) setKeys() { for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() { switch t := event.(type) { case *sdl.QuitEvent: fmt.Println("Quit") os.Exit(0) case *sdl.KeyboardEvent: switch t.Type { case sdl.KEYDOWN: if keyHex, ok := validKeys[t.Keysym.Sym]; ok { fmt.Println("down", t.Keysym.Sym) e.chip8.Key[keyHex] = 1 fmt.Println(keyHex, e.chip8.Key[keyHex]) } case sdl.KEYUP: if keyHex, ok := validKeys[t.Keysym.Sym]; ok { fmt.Println("up", t.Keysym.Sym) e.chip8.Key[keyHex] = 0 fmt.Println(keyHex, e.chip8.Key[keyHex]) } if t.Keysym.Sym == sdl.K_ESCAPE { fmt.Println("EXIT") os.Exit(0) } } } } } /* Key pad: Keyboard keys: 1 2 3 c 1 2 3 4 4 5 6 d q w e r 7 8 9 e a s d f a 0 b f z x c v */ var validKeys = map[sdl.Keycode]byte{ sdl.K_1: 0x01, sdl.K_2: 0x02, sdl.K_3: 0x03, sdl.K_4: 0x0c, sdl.K_q: 0x04, sdl.K_w: 0x05, sdl.K_e: 0x06, sdl.K_r: 0x0d, sdl.K_a: 0x07, sdl.K_s: 0x08, sdl.K_d: 0x09, sdl.K_f: 0x0e, sdl.K_z: 0x0a, sdl.K_x: 0x00, sdl.K_c: 0x0b, sdl.K_v: 0x0f, } func main() { filepath := flag.String("file", "file-path", "file path of the input file") flag.Parse() emulator := NewSdlEmulator(chip8.W, chip8.H, 8) err := emulator.chip8.LoadGame(*filepath) if err != nil { panic(err) } for { emulator.chip8.EmulateCycle() if emulator.chip8.DrawFlag { emulator.drawGraphics() } emulator.setKeys() sdl.Delay(200 / 60) } }