-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathio.cpp
111 lines (106 loc) · 1.83 KB
/
io.cpp
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
#include <Arduino.h>
#include <r65emu.h>
#include "screen.h"
#include "io.h"
#include "config.h"
void IO::down(uint8_t key) {
switch (key) {
case KEY_UP:
_up = false;
break;
case KEY_DOWN:
_down = false;
break;
case KEY_LEFT:
_left = false;
break;
case KEY_RIGHT:
_right = false;
break;
case P1_START:
_p1_start = false;
break;
case P2_START:
_p2_start = false;
break;
case COIN:
_coin = false;
break;
}
}
void IO::up(uint8_t key) {
switch (key) {
case KEY_UP:
_up = true;
break;
case KEY_DOWN:
_down = true;
break;
case KEY_LEFT:
_left = true;
break;
case KEY_RIGHT:
_right = true;
break;
case P1_START:
_p1_start = true;
break;
case P2_START:
_p2_start = true;
break;
case COIN:
_coin = true;
break;
case PAUSE:
_paused = !_paused;
break;
case ROTATE:
_screen_flipped = !_screen_flipped;
break;
}
}
void IO::operator=(uint8_t b) {
if (_acc >= SPRITE_START && _acc < SPRITE_START + SPRITE_LEN) {
if (_acc & 0x01)
_screen.set_sprite(_acc-SPRITE_START-1, _sx, b);
else
_sx = b;
return;
}
switch (_acc) {
case INT_ENABLE:
_int_enabled = (b & 0x01);
break;
case SOUND_ENABLE:
_sound_enabled = (b & 0x01);
break;
case FLIP_SCREEN:
_screen_flipped = (b & 0x01);
break;
}
}
IO::operator uint8_t() {
if (_acc >= INPUTS_0 && _acc < INPUTS_1) {
uint8_t v = 0x10;
if (_up) v |= 0x01;
if (_left) v |= 0x02;
if (_right) v |= 0x04;
if (_down) v |= 0x08;
if (_coin) v |= 0x20;
return v;
}
if (_acc >= INPUTS_1 && _acc < DIP_1) {
uint8_t v = 0x10;
if (_up) v |= 0x01;
if (_left) v |= 0x02;
if (_right) v |= 0x04;
if (_down) v |= 0x08;
if (_p1_start) v |= 0x20;
if (_p2_start) v |= 0x40;
return v;
}
if (_acc >= DIP_1)
return NORMAL_NAMES | DIFFICULTY_NORMAL | BONUS_AT_20000 |
ONE_LIFE_PER_GAME | ONE_COIN_ONE_GAME;
return 0x00;
}