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}