diff --git a/chip8/chip8.go b/chip8/chip8.go index 8bb2694..f4eaa34 100644 --- a/chip8/chip8.go +++ b/chip8/chip8.go @@ -10,6 +10,7 @@ const graphicsBufferSize = 64 * 32 type Chip8 struct { addressRegister uint16 beepTimer byte + beepRequired bool drawRequired bool delayTimer byte graphics [graphicsBufferSize]byte @@ -70,11 +71,22 @@ func (cpu *Chip8) TickTimers() { if cpu.delayTimer > 0 { cpu.delayTimer-- } - if cpu.beepTimer > 0 { + if cpu.beepTimer == 1 { + cpu.beepRequired = true + cpu.beepTimer-- + } else if cpu.beepTimer > 1 { cpu.beepTimer-- } } +func (cpu *Chip8) BeepNeeded() bool { + if cpu.beepRequired == true { + cpu.beepRequired = false + return true + } + return false +} + func (cpu *Chip8) zeroIndexOpcodes() { if cpu.opcode == 0x00E0 { // fuck it the gc can do the hard work for us diff --git a/cmd/web/main.go b/cmd/web/main.go index b40c50a..2914fbe 100644 --- a/cmd/web/main.go +++ b/cmd/web/main.go @@ -22,7 +22,7 @@ var drawBuf = [64 * 32]byte{} var drawNeeded = false var graphicsLock sync.Mutex var keysLock sync.Mutex -var window js.Value +var window, beep js.Value var keys [16]byte var gameRunning = true @@ -45,10 +45,10 @@ var keyMap = map[int]int{ 86: 15, // v } -var gameMap = map[string]func() []byte { - "pong": getPong, +var gameMap = map[string]func() []byte{ + "pong": getPong, "spaceinv": getSpaceInvaders, - "tetris": getTetris, + "tetris": getTetris, } func keyEventHandle(event js.Value) { @@ -81,6 +81,10 @@ func cpuCycle(cpu *chip8.Chip8, c chan int, i int) { cpu.TickTimers() //println("here!") } + if cpu.BeepNeeded() { + go playSound() + } + c <- 1 } @@ -95,7 +99,7 @@ func runGame(game []byte) { for gameRunning { c := make(chan int) go timeCycle(c) - i ++ + i++ go cpuCycle(cpu, c, i) if i > 7 { i = 0 @@ -125,10 +129,17 @@ func changeGame(event js.Value) { } } +func playSound() { + beep.Call("play") + //window.Get("navigator").Call("vibrate", 300) +} + func main() { println("CHIP8 IS HERE!") window = js.Global() + beep = window.Get("Audio").New("data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjI1LjEwMQAAAAAAAAAAAAAA/+NAwAAAAAAAAAAAAFhpbmcAAAAPAAAAAwAAA3YAlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaW8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw////////////////////////////////////////////AAAAAExhdmYAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAN2UrY2LgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/jYMQAEvgiwl9DAAAAO1ALSi19XgYG7wIAAAJOD5R0HygIAmD5+sEHLB94gBAEP8vKAgGP/BwMf+D4Pgh/DAPg+D5//y4f///8QBhMQBgEAfB8HwfAgIAgAHAGCFAj1fYUCZyIbThYFExkefOCo8Y7JxiQ0mGVaHKwwGCtGCUkY9OCugoFQwDKqmHQiUCxRAKOh4MjJFAnTkq6QqFGavRpYUCmMxpZnGXJa0xiJcTGZb1gJjwOJDJgoUJG5QQuDAsypiumkp5TUjrOobR2liwoGBf/X1nChmipnKVtSmMNQDGitG1fT/JhR+gYdCvy36lTrxCVV8Paaz1otLndT2fZuOMp3VpatmVR3LePP/8bSQpmhQZECqWsFeJxoepX9dbfHS13/////aysppUblm//8t7p2Ez7xKD/42DE4E5z9pr/nNkRw6bhdiCAZVVSktxunhxhH//4xF+bn4//6//3jEvylMM2K9XmWSn3ah1L2MqVIjmNlJtpQux1n3ajA0ZnFSu5EpX////uGatn///////1r/pYabq0mKT//TRyTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq/+MQxNIAAANIAcAAAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==") + window.Call("addEventListener", "keydown", js.FuncOf(func(this js.Value, args []js.Value) interface{} { keyEventHandle(args[0]) return nil