From 3f57389c4e9a878abad3bd6c2f8eaa451906b573 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Wed, 1 May 2019 17:33:02 +0200 Subject: [PATCH] Device 724 with two Spacewar consoles. --- emu/cmd.c | 1 + emu/joy.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++------ emu/pdp6.h | 6 +++ 3 files changed, 107 insertions(+), 12 deletions(-) diff --git a/emu/cmd.c b/emu/cmd.c index a493ddb..3148dea 100644 --- a/emu/cmd.c +++ b/emu/cmd.c @@ -236,6 +236,7 @@ DevDef definitions[] = { #ifdef GRAPHICS { DIS_IDENT, makedis }, { JOY_IDENT, makejoy }, + { OJOY_IDENT, makeojoy }, #endif { NETMEM_IDENT, makenetmem }, { NETCONS_IDENT, makenetcons }, diff --git a/emu/joy.c b/emu/joy.c index 394dfbb..18a55c5 100644 --- a/emu/joy.c +++ b/emu/joy.c @@ -2,14 +2,21 @@ #include char *joy_ident = JOY_IDENT; +char *ojoy_ident = OJOY_IDENT; typedef struct Joy Joy; struct Joy { Device dev; IOBus *bus; - int pia_data; - int pia_spec; +}; + + +typedef struct OJoy OJoy; +struct OJoy +{ + Device dev; + IOBus *bus; }; @@ -73,10 +80,12 @@ joyinit(void) } static word bits = 0777777777777; +static word obits = 0; void joy_motion (SDL_JoyAxisEvent *ev) { - int n = ev->which; + int m, n = ev->which; + m = n * 18; n *= 9; if (ev->axis == 0) { @@ -85,28 +94,49 @@ void joy_motion (SDL_JoyAxisEvent *ev) bits &= ~(0200LL << n); if (ev->value > 10000) bits &= ~(0400LL << n); + + obits &= ~(060LL << m); + if (ev->value < -10000) + obits |= 020LL << m; + if (ev->value > 10000) + obits |= 040LL << m; } else if (ev->axis == 1) { bits |= 0100LL << n; - if (ev->value < -3000) + obits &= ~(0300LL << m); + if (ev->value < -10000) { bits &= ~(0100LL << n); + obits |= 0200LL << m; + } else if (ev->value > 10000) { + bits &= ~(0100LL << n); + obits |= 0100LL << m; + } } } void joy_button (SDL_JoyButtonEvent *ev) { - int n = ev->which; - word y = 0; + int m, n = ev->which; + word x = 0, y = 0; + m = n * 18; n *= 9; switch (ev->button) { - case 0: y = 020; break; //Torpedo - case 1: y = 040; break; //Hyperspace + case 0: x = 000010; y = 020; break; //Torpedo + case 1: x = 000004; y = 040; break; //Hyperspace + case 2: x = 020000; break; //Beacon beam + case 3: x = 000001; break; //Time K + case 4: x = 000002; break; //Time 0 + case 5: x = 000400; break; //"Xmit data" = torpedo + case 6: x = 010000; break; //"General cancel" = destruct } - if (ev->state) + if (ev->state) { bits &= ~(y << n); - else + obits |= x << m; + } else { bits |= y << n; + obits &= ~(x << m); + } } void controller_motion (SDL_ControllerAxisEvent *event) @@ -163,6 +193,32 @@ wake_joy(void *dev) } } +static void +wake_ojoy(void *dev) +{ + OJoy *joy; + IOBus *bus; + + joy = dev; + bus = joy->bus; + + if(bus->devcode == OJOY){ + if(IOB_STATUS){ + } + if(IOB_DATAI){ + bus->c12 |= obits; + } + if(IOB_CONO_CLEAR){ + } + if(IOB_CONO_SET){ + } + if(IOB_DATAO_CLEAR){ + } + if(IOB_DATAO_SET){ + } + } +} + static void joyioconnect(Device *dev, IOBus *bus) { @@ -173,6 +229,16 @@ joyioconnect(Device *dev, IOBus *bus) } +static void +ojoyioconnect(Device *dev, IOBus *bus) +{ + OJoy *joy; + joy = (OJoy*)dev; + joy->bus = bus; + bus->dev[OJOY] = (Busdev){ joy, wake_ojoy, 0 }; +} + + static Device joyproto = { nil, nil, "", nil, nil, @@ -180,11 +246,17 @@ static Device joyproto = { nil, nil }; +static Device ojoyproto = { + nil, nil, "", + nil, nil, + ojoyioconnect, + nil, nil +}; + Device* makejoy(int argc, char *argv[]) { Joy *joy; - Task t; joy = malloc(sizeof(Joy)); memset(joy, 0, sizeof(Joy)); @@ -192,7 +264,23 @@ makejoy(int argc, char *argv[]) joy->dev = joyproto; joy->dev.type = joy_ident; - //addtask(t); + + joyinit(); + + return &joy->dev; +} + +Device* +makeojoy(int argc, char *argv[]) +{ + OJoy *joy; + + joy = malloc(sizeof(OJoy)); + memset(joy, 0, sizeof(OJoy)); + + joy->dev = ojoyproto; + joy->dev.type = ojoy_ident; + joyinit(); return &joy->dev; diff --git a/emu/pdp6.h b/emu/pdp6.h index c03c258..0a42210 100644 --- a/emu/pdp6.h +++ b/emu/pdp6.h @@ -666,6 +666,12 @@ Device *makejoy(int argc, char *argv[]); extern char *joy_ident; +#define OJOY (0724>>2) +#define OJOY_IDENT "joy724" +Device *makeojoy(int argc, char *argv[]); +extern char *ojoy_ident; + + typedef struct Netmem Netmem; struct Netmem {