Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/genplus-gx/core/input_hw/activator.c
2 views
1
/***************************************************************************************
2
* Genesis Plus
3
* Sega Activator support
4
*
5
* Copyright (C) 2011-2013 Eke-Eke (Genesis Plus GX)
6
*
7
* Redistribution and use of this code or any derivative works are permitted
8
* provided that the following conditions are met:
9
*
10
* - Redistributions may not be sold, nor may they be used in a commercial
11
* product or activity.
12
*
13
* - Redistributions that are modified from the original source must include the
14
* complete source code, including the source code for all components used by a
15
* binary built from the modified sources. However, as a special exception, the
16
* source code distributed need not include anything that is normally distributed
17
* (in either source or binary form) with the major components (compiler, kernel,
18
* and so on) of the operating system on which the executable runs, unless that
19
* component itself accompanies the executable.
20
*
21
* - Redistributions must reproduce the above copyright notice, this list of
22
* conditions and the following disclaimer in the documentation and/or other
23
* materials provided with the distribution.
24
*
25
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
29
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
* POSSIBILITY OF SUCH DAMAGE.
36
*
37
****************************************************************************************/
38
39
#include "shared.h"
40
41
struct
42
{
43
uint8 State;
44
uint8 Counter;
45
} activator[2];
46
47
void activator_reset(int index)
48
{
49
50
activator[index].State = 0x40;
51
activator[index].Counter = 0;
52
}
53
54
INLINE unsigned char activator_read(int index)
55
{
56
/* IR sensors 1-16 data (active low) */
57
uint16 data = ~input.pad[index << 2];
58
59
/* D1 = D0 (data is ready) */
60
uint8 temp = (activator[index].State & 0x01) << 1;
61
62
switch (activator[index].Counter)
63
{
64
case 0: /* x x x x 0 1 0 0 */
65
temp |= 0x04;
66
break;
67
68
case 1: /* x x l1 l2 l3 l4 1 1 */
69
temp |= ((data << 2) & 0x3C);
70
break;
71
72
case 2: /* x x l5 l6 l7 l8 0 0 */
73
temp |= ((data >> 2) & 0x3C);
74
break;
75
76
case 3: /* x x h1 h2 h3 h4 1 1 */
77
temp |= ((data >> 6) & 0x3C);
78
break;
79
80
case 4: /* x x h5 h6 h7 h8 0 0 */
81
temp |= ((data >> 10) & 0x3C);
82
break;
83
}
84
85
return temp;
86
}
87
88
INLINE void activator_write(int index, unsigned char data, unsigned char mask)
89
{
90
/* update bits set as output only */
91
data = (activator[index].State & ~mask) | (data & mask);
92
93
/* TH transitions */
94
if ((activator[index].State ^ data) & 0x40)
95
{
96
/* reset sequence cycle */
97
activator[index].Counter = 0;
98
}
99
else
100
{
101
/* D0 transitions */
102
if ((activator[index].State ^ data) & 0x01)
103
{
104
/* increment sequence cycle */
105
if (activator[index].Counter < 4)
106
{
107
activator[index].Counter++;
108
}
109
}
110
}
111
112
/* update internal state */
113
activator[index].State = data;
114
}
115
116
unsigned char activator_1_read(void)
117
{
118
return activator_read(0);
119
}
120
121
unsigned char activator_2_read(void)
122
{
123
return activator_read(1);
124
}
125
126
void activator_1_write(unsigned char data, unsigned char mask)
127
{
128
activator_write(0, data, mask);
129
}
130
131
void activator_2_write(unsigned char data, unsigned char mask)
132
{
133
activator_write(1, data, mask);
134
}
135
136