Added binding of joystick directions, add throttling info to the traffic meter

This commit is contained in:
simon.kagstrom 2009-01-31 07:51:23 +00:00
parent f317afd4e8
commit 1a29531f81
5 changed files with 41 additions and 27 deletions

View File

@ -1,10 +1,6 @@
version 7:
TODO: Add ability to select files to load from disks in TODO: Add ability to select files to load from disks in
a menu a menu
TODO: Would it be possible for you to implement the
binding of Joystick directions to buttons?
TODO: Multiple frodo versions, switch between TODO: Multiple frodo versions, switch between
TODO: D-pad less responsive in v6 than v5 TODO: D-pad less responsive in v6 than v5
@ -13,6 +9,10 @@ version 7:
TODO: Fix two-controller issue TODO: Fix two-controller issue
version 7:
* Allow binding 1 and other extra buttons to joystick directions
and fire
-- Simon Kagstrom <simon.kagstrom@gmail.com>, -- Simon Kagstrom <simon.kagstrom@gmail.com>,
version 6: version 6:

View File

@ -570,6 +570,7 @@ void C64::network_vblank()
for (int i = 0; i < this->network_server->n_clients; i++) { for (int i = 0; i < this->network_server->n_clients; i++) {
Uint8 *master = this->TheDisplay->BitmapBase(); Uint8 *master = this->TheDisplay->BitmapBase();
NetworkClient *remote = this->network_server->clients[i]; NetworkClient *remote = this->network_server->clients[i];
static bool has_throttled;
remote->Tick( now - last_time_update ); remote->Tick( now - last_time_update );
/* Has the client sent any data? */ /* Has the client sent any data? */
@ -589,6 +590,7 @@ void C64::network_vblank()
} }
if (remote->ThrottleTraffic()) { if (remote->ThrottleTraffic()) {
/* Skip this frame if the data rate is too high */ /* Skip this frame if the data rate is too high */
has_throttled = true;
continue; continue;
} }
remote->EncodeDisplay(master, remote->screen); remote->EncodeDisplay(master, remote->screen);
@ -606,8 +608,10 @@ void C64::network_vblank()
if (last_time_update - last_traffic_update > 300) if (last_time_update - last_traffic_update > 300)
{ {
TheDisplay->NetworkTrafficMeter(remote->GetKbps() / (8 * 1024.0)); TheDisplay->NetworkTrafficMeter(remote->GetKbps() / (8 * 1024.0),
has_throttled);
last_traffic_update = now; last_traffic_update = now;
has_throttled = false;
} }
} }
} }

View File

@ -71,7 +71,7 @@ public:
void Update(void); void Update(void);
void UpdateLEDs(int l0, int l1, int l2, int l3); void UpdateLEDs(int l0, int l1, int l2, int l3);
void Speedometer(int speed); void Speedometer(int speed);
void NetworkTrafficMeter(float kb_per_s); void NetworkTrafficMeter(float kb_per_s, bool has_throttled);
uint8 *BitmapBase(void); uint8 *BitmapBase(void);
int BitmapXMod(void); int BitmapXMod(void);
#ifdef __riscos__ #ifdef __riscos__
@ -82,7 +82,8 @@ public:
#if defined(HAVE_SDL) #if defined(HAVE_SDL)
void FakeKeyPress(int kc, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix); void FakeKeyPress(int kc, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix);
void TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick); void TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick);
void UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix); void UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix,
uint8 *rev_matrix, uint8 *joystick);
void Update(uint8 *src_pixels); void Update(uint8 *src_pixels);
#endif #endif
bool NumLock(void); bool NumLock(void);

View File

@ -306,10 +306,10 @@ void C64Display::Speedometer(int speed)
delay++; delay++;
} }
void C64Display::NetworkTrafficMeter(float kb_per_s) void C64Display::NetworkTrafficMeter(float kb_per_s, bool is_throttled)
{ {
sprintf(this->networktraffic_string, "%6.2f KB/S", sprintf(this->networktraffic_string, "%6.2f KB/S%s",
kb_per_s); kb_per_s, is_throttled ? " THROTTLED" : "");
} }
/* /*
@ -342,15 +342,27 @@ void C64Display::FakeKeyPress(int kc, uint8 *CIA_key_matrix,
CIA_rev_matrix[i] = 0xFF; CIA_rev_matrix[i] = 0xFF;
} }
if (kc != -1) if (kc != -1)
this->UpdateKeyMatrix(kc, false, CIA_key_matrix, CIA_rev_matrix); this->UpdateKeyMatrix(kc, false, CIA_key_matrix, CIA_rev_matrix,
NULL);
} }
void C64Display::UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix) void C64Display::UpdateKeyMatrix(int c64_key, bool key_up,
uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
{ {
bool shifted = c64_key & 0x80; bool shifted = c64_key & 0x80;
int c64_byte = (c64_key >> 3) & 7; int c64_byte = (c64_key >> 3) & 7;
int c64_bit = c64_key & 7; int c64_bit = c64_key & 7;
// Handle joystick emulation
if (joystick && (c64_key & 0x40)) {
c64_key &= 0x1f;
if (key_up)
*joystick |= c64_key;
else
*joystick &= ~c64_key;
return;
}
if (key_up) { if (key_up) {
if (shifted) { if (shifted) {
key_matrix[6] |= 0x10; key_matrix[6] |= 0x10;
@ -477,17 +489,7 @@ void C64Display::TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix,
if (c64_key < 0) if (c64_key < 0)
return; return;
// Handle joystick emulation this->UpdateKeyMatrix(c64_key, key_up, key_matrix, rev_matrix, joystick);
if (c64_key & 0x40) {
c64_key &= 0x1f;
if (key_up)
*joystick |= c64_key;
else
*joystick &= ~c64_key;
return;
}
this->UpdateKeyMatrix(c64_key, key_up, key_matrix, rev_matrix);
} }
void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick) void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
@ -679,13 +681,15 @@ uint8 C64::poll_joystick(int port)
if (extra_keys[i]) if (extra_keys[i])
{ {
TheDisplay->UpdateKeyMatrix(kc, false, TheDisplay->UpdateKeyMatrix(kc, false,
TheCIA1->KeyMatrix, TheCIA1->RevMatrix); TheCIA1->KeyMatrix, TheCIA1->RevMatrix,
&j);
is_pressed[i] = true; is_pressed[i] = true;
} }
else if (is_pressed[i]) else if (is_pressed[i])
{ {
TheDisplay->UpdateKeyMatrix(kc, true, TheDisplay->UpdateKeyMatrix(kc, true,
TheCIA1->KeyMatrix, TheCIA1->RevMatrix); TheCIA1->KeyMatrix, TheCIA1->RevMatrix,
&j);
is_pressed[i] = false; is_pressed[i] = false;
} }
} }

View File

@ -46,16 +46,21 @@ typedef struct virtkey
{ name, -1, false, false } { name, -1, false, false }
#define D(name) \ #define D(name) \
{ name, -1, false, true } { name, -1, false, true }
#define J(name, v) \
{ name, 0x40 | (v), false, false }
#define KEY_COLS 15 #define KEY_COLS 15
#define KEY_ROWS 5 #define KEY_ROWS 8
static virtkey_t keys[KEY_COLS * KEY_ROWS] = { static virtkey_t keys[KEY_COLS * KEY_ROWS] = {
K("<-",7,1), K("1", 7,0), K("2", 7,3), K("3", 1,0), K("4", 1,3), K("5", 2,0), K("6", 2,3), K("7", 3,0), K("8", 3,3), K("9", 4,0), K("0", 4,3), K("+", 5,0), K("-", 5,3), K("£", 6,0), K("Hom", 6,3), K("<-",7,1), K("1", 7,0), K("2", 7,3), K("3", 1,0), K("4", 1,3), K("5", 2,0), K("6", 2,3), K("7", 3,0), K("8", 3,3), K("9", 4,0), K("0", 4,3), K("+", 5,0), K("-", 5,3), K("£", 6,0), K("Hom", 6,3),
K("Cr", 7,2), K("Q", 7,6), K("W", 1,1), K("E", 1,6), K("R", 2,1), K("T", 2,6), K("Y", 3,1), K("U", 3,6), K("I", 4,1), K("O", 4,6), K("P", 5,1), K("@", 5,6), K("*", 6,1), K("Au", 6,6),K("Rstr",4,0), K("Cr", 7,2), K("Q", 7,6), K("W", 1,1), K("E", 1,6), K("R", 2,1), K("T", 2,6), K("Y", 3,1), K("U", 3,6), K("I", 4,1), K("O", 4,6), K("P", 5,1), K("@", 5,6), K("*", 6,1), K("Au", 6,6),K("Rstr",4,0),
K("R/Stp", 7,7), K(NULL,0,0), K("A", 1,2), K("S", 1,5), K("D", 2,2), K("F", 2,5), K("G", 3,2), K("H", 3,5), K("J", 4,2), K("K", 4,5), K("L", 5,2), K(":", 5,5), K(";", 6,2), K("=", 6,5), K("Ret", 0,1), K("R/Stp", 7,7), K(NULL,0,0), K("A", 1,2), K("S", 1,5), K("D", 2,2), K("F", 2,5), K("G", 3,2), K("H", 3,5), K("J", 4,2), K("K", 4,5), K("L", 5,2), K(":", 5,5), K(";", 6,2), K("=", 6,5), K("Ret", 0,1),
K("C=", 7,5), S("Shft",1,7),K(NULL,0,0),K("Z", 1,4), K("X", 2,7), K("C", 2,4), K("V", 3,7), K("B", 3,4), K("N", 4,7), K("M", 4,4), K(",", 5,7), K(".", 5,4), K("/", 6,7), K("Dwn",0,7),K("Rgt", 0,2), K("C=", 7,5), S("Shft",1,7),K(NULL,0,0),K("Z", 1,4), K("X", 2,7), K("C", 2,4), K("V", 3,7), K("B", 3,4), K("N", 4,7), K("M", 4,4), K(",", 5,7), K(".", 5,4), K("/", 6,7), K("Dwn",0,7),K("Rgt", 0,2),
N("None"), K(NULL,0,0), K(NULL,0,0), K("space", 7,4),K(0, 0,0),K(NULL,0,0), K("f1", 0,4),K("f3", 0,5),K("f5", 0,6),K("f7", 0,3),K("Del",0,0),K(NULL,0,0), K(NULL,0,0), K(NULL,0,0), D("DONE"), N("None"), K(NULL,0,0), K(NULL,0,0), K("space", 7,4),K(0, 0,0),K(NULL,0,0), K("f1",0,4), K("f3",0,5), K("f5",0,6), K("f7",0,3), K("Del",0,0),K(NULL,0,0), K(NULL,0,0), K(NULL,0,0), D("DONE"),
K(NULL,0,0), K(NULL,0,0), K(NULL,0,0), K(NULL,0,0), K(0, 0,0),J("Joystick up",1),K(0, 0,0),K(NULL,0,0), K(NULL,0,0), K(NULL,0,0), K(NULL, 0,0),K(NULL,0,0), K(NULL,0,0), K(NULL,0,0), K(NULL, 0,0),
J("Joystick left",4),K(0, 0,0), K(NULL,0,0), K(NULL,0,0), K(0,0,0),J("Joystick fire",0x10),K(0,0,0),K(0,0,0), K(NULL,0,0), K(0,0,0),J("Joystick right",8),K(0, 0,0),K(0, 0,0), K(NULL,0,0), K(NULL,0,0),
K(NULL,0,0), K(0, 0,0), K(NULL,0,0), K(NULL,0,0), K(0,0,0),J("Joystick down",2),K(0,0,0),K(NULL,0,0),K(NULL,0,0), K(NULL,0,0), K(NULL,0,0), K(NULL,0,0), K(NULL, 0,0),K(NULL,0,0), K(NULL, 0,0),
}; };
static const char *shifted_names[KEY_COLS * KEY_ROWS] = { static const char *shifted_names[KEY_COLS * KEY_ROWS] = {