arnaucube
arnaucube/go-chip8Public Self-hosted repository
go-chip8/main.go
main.goRaw
  1package main
  2
  3import (
  4	"flag"
  5	"fmt"
  6	"go-chip8/chip8"
  7	"os"
  8
  9	"github.com/veandco/go-sdl2/sdl"
 10)
 11
 12// SdlEmulator represents the Chip8 emulator with Sdl frontend
 13type SdlEmulator struct {
 14	w        int
 15	h        int
 16	renderer *sdl.Renderer
 17	zoom     int32
 18	chip8    chip8.Chip8
 19}
 20
 21// NewSdlEmulator creates a new SdlEmulator
 22func NewSdlEmulator(w, h int, zoom int32) SdlEmulator {
 23	var c chip8.Chip8
 24	c.Initialize()
 25
 26	window, err := sdl.CreateWindow("go-chip8", sdl.WINDOWPOS_UNDEFINED,
 27		sdl.WINDOWPOS_UNDEFINED, int32(w)*zoom, int32(h)*zoom, sdl.WINDOW_SHOWN)
 28	if err != nil {
 29		panic(err)
 30	}
 31	renderer, err := sdl.CreateRenderer(window, -1, 0)
 32	if err != nil {
 33		panic(err)
 34	}
 35
 36	return SdlEmulator{
 37		w:        w,
 38		h:        h,
 39		renderer: renderer,
 40		zoom:     zoom,
 41		chip8:    c,
 42	}
 43}
 44
 45func (e *SdlEmulator) drawGraphics() {
 46	e.renderer.SetDrawColor(0, 0, 0, 1)
 47	e.renderer.Clear()
 48	e.renderer.SetDrawColor(255, 255, 255, 1)
 49	for y := 0; y < e.h; y++ {
 50		for x := 0; x < e.w; x++ {
 51			pixel := e.chip8.Gfx[y*e.w+x]
 52			if pixel != 0 {
 53				e.renderer.FillRect(&sdl.Rect{
 54					X: int32(x) * e.zoom,
 55					Y: int32(y) * e.zoom,
 56					W: e.zoom,
 57					H: e.zoom,
 58				})
 59			}
 60		}
 61	}
 62
 63	e.renderer.Present()
 64	e.chip8.DrawFlag = false
 65}
 66
 67func (e *SdlEmulator) setKeys() {
 68	for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
 69		switch t := event.(type) {
 70		case *sdl.QuitEvent:
 71			fmt.Println("Quit")
 72			os.Exit(0)
 73		case *sdl.KeyboardEvent:
 74			switch t.Type {
 75			case sdl.KEYDOWN:
 76				if keyHex, ok := validKeys[t.Keysym.Sym]; ok {
 77					fmt.Println("down", t.Keysym.Sym)
 78					e.chip8.Key[keyHex] = 1
 79					fmt.Println(keyHex, e.chip8.Key[keyHex])
 80				}
 81			case sdl.KEYUP:
 82				if keyHex, ok := validKeys[t.Keysym.Sym]; ok {
 83					fmt.Println("up", t.Keysym.Sym)
 84					e.chip8.Key[keyHex] = 0
 85					fmt.Println(keyHex, e.chip8.Key[keyHex])
 86				}
 87				if t.Keysym.Sym == sdl.K_ESCAPE {
 88					fmt.Println("EXIT")
 89					os.Exit(0)
 90				}
 91			}
 92		}
 93	}
 94
 95}
 96
 97/*
 98	Key pad:     Keyboard keys:
 99	1 2 3 c      1 2 3 4
100	4 5 6 d      q w e r
101	7 8 9 e      a s d f
102	a 0 b f      z x c v
103*/
104var validKeys = map[sdl.Keycode]byte{
105	sdl.K_1: 0x01,
106	sdl.K_2: 0x02,
107	sdl.K_3: 0x03,
108	sdl.K_4: 0x0c,
109	sdl.K_q: 0x04,
110	sdl.K_w: 0x05,
111	sdl.K_e: 0x06,
112	sdl.K_r: 0x0d,
113	sdl.K_a: 0x07,
114	sdl.K_s: 0x08,
115	sdl.K_d: 0x09,
116	sdl.K_f: 0x0e,
117	sdl.K_z: 0x0a,
118	sdl.K_x: 0x00,
119	sdl.K_c: 0x0b,
120	sdl.K_v: 0x0f,
121}
122
123func main() {
124	filepath := flag.String("file", "file-path", "file path of the input file")
125
126	flag.Parse()
127
128	emulator := NewSdlEmulator(chip8.W, chip8.H, 8)
129
130	err := emulator.chip8.LoadGame(*filepath)
131	if err != nil {
132		panic(err)
133	}
134
135	for {
136		emulator.chip8.EmulateCycle()
137		if emulator.chip8.DrawFlag {
138			emulator.drawGraphics()
139		}
140		emulator.setKeys()
141		sdl.Delay(200 / 60)
142	}
143}