-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
107 lines (96 loc) · 2.01 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package main
import (
"github.com/dustinbowers/chip8emu/chip8"
"github.com/hajimehoshi/ebiten/v2"
"image"
"log"
)
const (
screenWidth = 64
screenHeight = 32
hz = 700
)
type Game struct {
Screen *image.RGBA
Emu *chip8.Chip8
Running bool
}
var KeyMap = map[ebiten.Key]uint8{
ebiten.Key1: 0x1,
ebiten.Key2: 0x2,
ebiten.Key3: 0x3,
ebiten.Key4: 0xC,
ebiten.KeyQ: 0x4,
ebiten.KeyW: 0x5,
ebiten.KeyE: 0x6,
ebiten.KeyR: 0xD,
ebiten.KeyA: 0x7,
ebiten.KeyS: 0x8,
ebiten.KeyD: 0x9,
ebiten.KeyF: 0xE,
ebiten.KeyZ: 0xA,
ebiten.KeyX: 0x0,
ebiten.KeyC: 0xB,
ebiten.KeyV: 0xF,
}
func (g *Game) HandleInput() {
for k, v := range KeyMap {
if ebiten.IsKeyPressed(k) {
g.Emu.KeyDown(v)
} else {
g.Emu.KeyUp(v)
}
}
}
func (g *Game) Update() error {
if g.Running {
g.HandleInput()
_, err := g.Emu.EmulateCycle()
if err != nil {
log.Fatalf("emu.EmulateCycle: %v", err)
}
}
if g.Emu.DrawFlag {
g.Emu.DrawFlag = false
// Render Screen
for c, col := range g.Emu.Screen {
for r, on := range col {
offset := 4*((r*screenWidth)+c)
if on >= 1 {
g.Screen.Pix[offset+0] = 0xFF
g.Screen.Pix[offset+1] = 0xFF
g.Screen.Pix[offset+2] = 0xFF
g.Screen.Pix[offset+3] = 0xFF
} else {
g.Screen.Pix[offset+0] = 0x00
g.Screen.Pix[offset+1] = 0x00
g.Screen.Pix[offset+2] = 0x00
g.Screen.Pix[offset+3] = 0x00
}
}
}
}
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
screen.ReplacePixels(g.Screen.Pix)
//ebitenutil.DebugPrint(screen, fmt.Sprintf("TPS: %0.2f", ebiten.CurrentTPS()))
}
func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
return screenWidth, screenHeight
}
var g *Game
func main() {
ebiten.SetWindowSize(screenWidth*2, screenHeight*2)
ebiten.SetWindowTitle("Chip8 Emulator")
ebiten.SetMaxTPS(hz)
g = &Game{
Screen: image.NewRGBA(image.Rect(0, 0, screenWidth, screenHeight)),
Emu: chip8.NewChip8(),
Running: false,
}
g.addSupport()
if err := ebiten.RunGame(g); err != nil {
log.Fatal(err)
}
}