forked from scottferg/Fergulator
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontroller.go
More file actions
111 lines (97 loc) · 1.94 KB
/
controller.go
File metadata and controls
111 lines (97 loc) · 1.94 KB
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
108
109
110
111
package main
import (
"github.com/0xe2-0x9a-0x9b/Go-SDL/sdl"
)
type Controller struct {
ButtonState [8]Word
StrobeState int
LastWrite Word
}
func (c *Controller) SetButtonState(k sdl.KeyboardEvent, v Word) {
switch k.Keysym.Sym {
case sdl.K_z: // A
c.ButtonState[0] = v
case sdl.K_x: // B
c.ButtonState[1] = v
case sdl.K_RSHIFT: // Select
c.ButtonState[2] = v
case sdl.K_RETURN: // Start
c.ButtonState[3] = v
case sdl.K_UP: // Up
c.ButtonState[4] = v
case sdl.K_DOWN: // Down
c.ButtonState[5] = v
case sdl.K_LEFT: // Left
c.ButtonState[6] = v
case sdl.K_RIGHT: // Right
c.ButtonState[7] = v
}
}
func (c *Controller) KeyDown(e sdl.KeyboardEvent) {
c.SetButtonState(e, 0x41)
}
func (c *Controller) KeyUp(e sdl.KeyboardEvent) {
c.SetButtonState(e, 0x40)
}
func (c *Controller) Write(v Word) {
if v == 0 && c.LastWrite == 1 {
c.StrobeState = 0
}
c.LastWrite = v
}
func (c *Controller) Read() (r Word) {
if c.StrobeState < 8 {
r = c.ButtonState[c.StrobeState]
} else if c.StrobeState == 19 {
r = 0x1
} else {
r = 0x0
}
c.StrobeState++
if c.StrobeState == 24 {
c.StrobeState = 0x0
}
return r
}
func (c *Controller) Init() {
for i := 0; i < len(c.ButtonState); i++ {
c.ButtonState[i] = 0x40
}
}
func JoypadListen() {
for {
select {
case ev := <-sdl.Events:
switch e := ev.(type) {
case sdl.QuitEvent:
running = false
case sdl.KeyboardEvent:
switch e.Keysym.Sym {
case sdl.K_ESCAPE:
running = false
case sdl.K_r:
// Trigger reset interrupt
if e.Type == sdl.KEYDOWN {
cpu.RequestInterrupt(InterruptReset)
}
case sdl.K_l:
if e.Type == sdl.KEYDOWN {
// Trigger reset interrupt
LoadState()
}
case sdl.K_s:
if e.Type == sdl.KEYDOWN {
// Trigger reset interrupt
SaveState()
}
}
switch e.Type {
case sdl.KEYDOWN:
controller.KeyDown(e)
case sdl.KEYUP:
controller.KeyUp(e)
}
}
}
}
}