You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
2.7 KiB

package main
import (
"flag"
"fmt"
"go-chip8/chip8"
"os"
"github.com/veandco/go-sdl2/sdl"
)
// SdlEmulator represents the Chip8 emulator with Sdl frontend
type SdlEmulator struct {
w int
h int
renderer *sdl.Renderer
zoom int32
chip8 chip8.Chip8
}
// NewSdlEmulator creates a new SdlEmulator
func NewSdlEmulator(w, h int, zoom int32) SdlEmulator {
c := chip8.NewChip8()
window, err := sdl.CreateWindow("go-chip8", sdl.WINDOWPOS_UNDEFINED,
sdl.WINDOWPOS_UNDEFINED, int32(w)*zoom, int32(h)*zoom, sdl.WINDOW_SHOWN)
if err != nil {
panic(err)
}
renderer, err := sdl.CreateRenderer(window, -1, 0)
if err != nil {
panic(err)
}
return SdlEmulator{
w: w,
h: h,
renderer: renderer,
zoom: zoom,
chip8: c,
}
}
func (e *SdlEmulator) drawGraphics() {
e.renderer.SetDrawColor(0, 0, 0, 1)
e.renderer.Clear()
e.renderer.SetDrawColor(255, 255, 255, 1)
for y := 0; y < e.h; y++ {
for x := 0; x < e.w; x++ {
pixel := e.chip8.Gfx[y*e.w+x]
if pixel != 0 {
e.renderer.FillRect(&sdl.Rect{
X: int32(x) * e.zoom,
Y: int32(y) * e.zoom,
W: e.zoom,
H: e.zoom,
})
}
}
}
e.renderer.Present()
e.chip8.DrawFlag = false
}
func (e *SdlEmulator) setKeys() {
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
switch t := event.(type) {
case *sdl.QuitEvent:
fmt.Println("Quit")
os.Exit(0)
case *sdl.KeyboardEvent:
switch t.Type {
case sdl.KEYDOWN:
if keyHex, ok := validKeys[t.Keysym.Sym]; ok {
fmt.Println("down", t.Keysym.Sym)
e.chip8.Key[keyHex] = 1
fmt.Println(keyHex, e.chip8.Key[keyHex])
}
case sdl.KEYUP:
if keyHex, ok := validKeys[t.Keysym.Sym]; ok {
fmt.Println("up", t.Keysym.Sym)
e.chip8.Key[keyHex] = 0
fmt.Println(keyHex, e.chip8.Key[keyHex])
}
if t.Keysym.Sym == sdl.K_ESCAPE {
fmt.Println("EXIT")
os.Exit(0)
}
}
}
}
}
/*
Key pad: Keyboard keys:
1 2 3 c 1 2 3 4
4 5 6 d q w e r
7 8 9 e a s d f
a 0 b f z x c v
*/
var validKeys = map[sdl.Keycode]byte{
sdl.K_1: 0x01,
sdl.K_2: 0x02,
sdl.K_3: 0x03,
sdl.K_4: 0x0c,
sdl.K_q: 0x04,
sdl.K_w: 0x05,
sdl.K_e: 0x06,
sdl.K_r: 0x0d,
sdl.K_a: 0x07,
sdl.K_s: 0x08,
sdl.K_d: 0x09,
sdl.K_f: 0x0e,
sdl.K_z: 0x0a,
sdl.K_x: 0x00,
sdl.K_c: 0x0b,
sdl.K_v: 0x0f,
}
func main() {
filepath := flag.String("file", "file-path", "file path of the input file")
flag.Parse()
emulator := NewSdlEmulator(chip8.W, chip8.H, 8)
err := emulator.chip8.LoadGame(*filepath)
if err != nil {
panic(err)
}
for {
emulator.chip8.EmulateCycle()
if emulator.chip8.DrawFlag {
emulator.drawGraphics()
}
emulator.setKeys()
sdl.Delay(200 / 60)
}
}