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}