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