~ubuntu-branches/ubuntu/quantal/vice/quantal

« back to all changes in this revision

Viewing changes to src/joystick.c

  • Committer: Bazaar Package Importer
  • Author(s): Zed Pobre
  • Date: 2006-07-30 19:15:59 UTC
  • mto: (9.1.1 lenny) (1.1.6 upstream)
  • mto: This revision was merged to the branch mainline in revision 9.
  • Revision ID: james.westby@ubuntu.com-20060730191559-g31ymd2mk102kzff
Tags: upstream-1.19
ImportĀ upstreamĀ versionĀ 1.19

Show diffs side-by-side

added added

removed removed

Lines of Context:
41
41
#include "joy.h"
42
42
#include "joystick.h"
43
43
#include "maincpu.h"
 
44
#include "network.h"
44
45
#include "snapshot.h"
45
46
#include "ui.h"
46
47
#include "types.h"
55
56
 
56
57
/* Latched joystick status.  */
57
58
static BYTE latch_joystick_value[JOYSTICK_NUM] = { 0, 0, 0 };
 
59
static BYTE network_joystick_value[JOYSTICK_NUM] = { 0, 0, 0 };
58
60
 
59
61
/* to prevent illegal direction combinations */
60
62
static const BYTE joystick_opposite_direction[] = 
62
64
 
63
65
static alarm_t *joystick_alarm = NULL;
64
66
 
 
67
static CLOCK joystick_delay;
65
68
 
66
69
static void joystick_latch_matrix(CLOCK offset)
67
70
{
68
 
    memcpy(joystick_value, latch_joystick_value, sizeof(joystick_value));
 
71
    BYTE idx;
 
72
 
 
73
    if (network_connected()) {
 
74
        idx = network_joystick_value[0];
 
75
        if (idx > 0)
 
76
            joystick_value[idx] = network_joystick_value[idx];
 
77
        else
 
78
            memcpy(joystick_value, network_joystick_value, sizeof(joystick_value));
 
79
    } else {
 
80
        idx = latch_joystick_value[0];
 
81
        if (idx > 0)
 
82
            joystick_value[idx] = latch_joystick_value[idx];
 
83
        else
 
84
            memcpy(joystick_value, latch_joystick_value, sizeof(joystick_value));
 
85
    }
69
86
    ui_display_joyport(joystick_value);
70
87
}
71
88
 
94
111
    joystick_event_record(); 
95
112
}
96
113
 
 
114
void joystick_event_delayed_playback(void *data)
 
115
{
 
116
    memcpy(network_joystick_value, data, sizeof(latch_joystick_value));
 
117
    alarm_set(joystick_alarm, maincpu_clk + joystick_delay);
 
118
}
 
119
 
 
120
void joystick_register_delay(unsigned int delay)
 
121
{
 
122
    joystick_delay = delay;
 
123
}
97
124
/*-----------------------------------------------------------------------*/
 
125
static void joystick_process_latch(void)
 
126
{
 
127
    if (network_connected()) {
 
128
        CLOCK joystick_delay = JOYSTICK_RAND();
 
129
        network_event_record(EVENT_JOYSTICK_DELAY,
 
130
                (void *)&joystick_delay, sizeof(joystick_delay));
 
131
        network_event_record(EVENT_JOYSTICK_VALUE, 
 
132
                (void *)latch_joystick_value, sizeof(latch_joystick_value));
 
133
    } 
 
134
    else
 
135
    {
 
136
        alarm_set(joystick_alarm, maincpu_clk + JOYSTICK_RAND());
 
137
    }
 
138
}
98
139
 
99
140
void joystick_set_value_absolute(unsigned int joyport, BYTE value)
100
141
{
101
142
    if (event_playback_active())
102
143
        return;
103
144
 
104
 
    latch_joystick_value[joyport] = value;
105
 
    alarm_set(joystick_alarm, maincpu_clk + JOYSTICK_RAND());
106
 
}
107
 
 
108
 
BYTE joystick_get_value_absolute(unsigned int joyport)
109
 
{
110
 
    return latch_joystick_value[joyport];
 
145
    if (latch_joystick_value[joyport] != value) {
 
146
        latch_joystick_value[joyport] = value;
 
147
        latch_joystick_value[0] = (BYTE)joyport;
 
148
        joystick_process_latch();
 
149
    }
111
150
}
112
151
 
113
152
void joystick_set_value_or(unsigned int joyport, BYTE value)
117
156
 
118
157
    latch_joystick_value[joyport] |= value;
119
158
    latch_joystick_value[joyport] &= ~joystick_opposite_direction[value & 0xf];
120
 
    alarm_set(joystick_alarm, maincpu_clk + JOYSTICK_RAND());
 
159
    latch_joystick_value[0] = (BYTE)joyport;
 
160
    joystick_process_latch();
121
161
}
122
162
 
123
163
void joystick_set_value_and(unsigned int joyport, BYTE value)
126
166
        return;
127
167
 
128
168
    latch_joystick_value[joyport] &= value;
129
 
    alarm_set(joystick_alarm, maincpu_clk + JOYSTICK_RAND());
 
169
    latch_joystick_value[0] = (BYTE)joyport;
 
170
    joystick_process_latch();
130
171
}
131
172
 
132
173
void joystick_clear(unsigned int joyport)
133
174
{
134
175
    latch_joystick_value[joyport] = 0;
 
176
    latch_joystick_value[0] = (BYTE)joyport;
135
177
    joystick_latch_matrix(0);
136
178
}
137
179