From 37236919c76ed4b5a8a7c98950257e3626e268c4 Mon Sep 17 00:00:00 2001 From: Ian C Date: Mon, 9 Aug 2021 18:50:11 +0000 Subject: Changed initial directory and added joystick emulation. --- source/spec.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) (limited to 'source/spec.c') diff --git a/source/spec.c b/source/spec.c index 1a5eba2..0dc753f 100644 --- a/source/spec.c +++ b/source/spec.c @@ -134,9 +134,16 @@ static struct }; -/* The keyboard +/* The keyboard and joystick */ static Z80Byte matrix[8]; +static Z80Byte joystick; + +#define JOY_FIRE 0x10 +#define JOY_UP 0x08 +#define JOY_DOWN 0x04 +#define JOY_LEFT 0x02 +#define JOY_RIGHT 0x01 static struct { @@ -424,7 +431,66 @@ void SPECHandleKey(SoftKey key, int is_pressed) } else { - /* TODO: Joysticks? */ + switch(key) + { + case SK_PAD_UP: + if (is_pressed) + { + joystick = joystick | JOY_UP; + } + else + { + joystick = joystick & ~JOY_UP; + } + break; + + case SK_PAD_DOWN: + if (is_pressed) + { + joystick = joystick | JOY_DOWN; + } + else + { + joystick = joystick & ~JOY_DOWN; + } + break; + + case SK_PAD_LEFT: + if (is_pressed) + { + joystick = joystick | JOY_LEFT; + } + else + { + joystick = joystick & ~JOY_LEFT; + } + break; + + case SK_PAD_RIGHT: + if (is_pressed) + { + joystick = joystick | JOY_RIGHT; + } + else + { + joystick = joystick & ~JOY_RIGHT; + } + break; + + case SK_PAD_A: + if (is_pressed) + { + joystick = joystick | JOY_FIRE; + } + else + { + joystick = joystick & ~JOY_FIRE; + } + break; + + default: + break; + } } } @@ -448,9 +514,19 @@ Z80Byte SPECReadPort(Z80 *z80, Z80Word port) switch(lo) { case 0x1f: /* Kempston joystick */ + b = joystick; break; case 0x7f: /* Fuller joystick */ + b = ~joystick; + if (b & JOY_FIRE) + { + b |= 0x80; + } + else + { + b &= 0x7f; + } break; case 0xfb: /* ZX Printer */ -- cgit v1.2.3