Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <strings.h>
- #include <exec/exec.h>
- #include <exec/memory.h>
- #include <devices/input.h>
- #include <devices/inputevent.h>
- #include <proto/exec.h>
- #include <proto/dos.h>
- #include <proto/intuition.h>
- #include <proto/graphics.h>
- #include <proto/muimaster.h>
- #include <proto/lowlevel.h>
- #if defined(__AROS__) || defined (__morphos__)
- #include <proto/alib.h>
- #endif
- #ifndef MAKE_ID
- #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
- #endif
- #include "amidog/rawkey.h"
- #include "plugin.h"
- #define KEYNAME "JOYLL"
- static char ininame[16];
- #include "version.h"
- static FPSEAmigaAbout info = {
- FPSE_IFACE_MAGIC,
- FPSE_IFACE_VERSION,
- FPSE_JOY,
- "joyll",
- (char *)VERSION,
- "AmiDog",
- "LowLevel JOY plugin.",
- };
- //-----------------------------------------------------------------
- static int DummyPoll(int outbyte)
- {
- return ACK_OK;
- }
- #define ANALOG_MIN (0x00)
- #define ANALOG_MAX (0xFF)
- #define ANALOG_MID (0x7F)
- static UINT32 joy_ret = 0xffffffff;
- static UINT8 left_analog_x = ANALOG_MID;
- static UINT8 left_analog_y = ANALOG_MID;
- static UINT8 right_analog_x = ANALOG_MID;
- static UINT8 right_analog_y = ANALOG_MID;
- static UINT8 *padbuf0 = NULL;
- static int (*CmdPoll)(int) = DummyPoll;
- static int padcnt = 0;
- static int NormalPoll(int outbyte);
- static int Cmd46Poll_Analog(int outbyte);
- static int Cmd46Poll_Digital(int outbyte);
- static int Cmd4CPoll(int outbyte);
- static int FirstPoll(int outbyte);
- static int JOY_Device = 0;
- #define DIGITAL_UP (12)
- #define DIGITAL_DOWN (14)
- #define DIGITAL_LEFT (15)
- #define DIGITAL_RIGHT (13)
- #define DIGITAL_START (11)
- #define DIGITAL_SELECT (8)
- #define DIGITAL_TRIANGLE (4)
- #define DIGITAL_CROSS (6)
- #define DIGITAL_SQUARE (7)
- #define DIGITAL_CIRCLE (5)
- #define DIGITAL_L1 (2)
- #define DIGITAL_L2 (0)
- #define DIGITAL_R1 (3)
- #define DIGITAL_R2 (1)
- #define DIGITAL_L3 (9)
- #define DIGITAL_R3 (10)
- #define ANALOG_MODE (16)
- #define ANALOG_LEFT_UP (17)
- #define ANALOG_LEFT_DOWN (18)
- #define ANALOG_LEFT_LEFT (19)
- #define ANALOG_LEFT_RIGHT (20)
- #define ANALOG_RIGHT_UP (21)
- #define ANALOG_RIGHT_DOWN (22)
- #define ANALOG_RIGHT_LEFT (23)
- #define ANALOG_RIGHT_RIGHT (24)
- #define TYPE_NONE (0)
- #define TYPE_BUTTON (1)
- #define DEFAULT_LLPORT_A (1)
- #define DEFAULT_LLPORT_B (3)
- static struct keysym_type {
- char *label;
- int bitnum;
- int rawkey;
- int type;
- unsigned int mask_a;
- unsigned int mask_b;
- } keysym[] = {
- /* Digital */
- { "Up", 12, KEY_UP, TYPE_BUTTON, JPF_JOY_UP, 0 },
- { "Down", 14, KEY_DOWN, TYPE_BUTTON, JPF_JOY_DOWN, 0 },
- { "Left", 15, KEY_LEFT, TYPE_BUTTON, JPF_JOY_LEFT, 0 },
- { "Right", 13, KEY_RIGHT, TYPE_BUTTON, JPF_JOY_RIGHT, 0 },
- { "Start", 11, KEY_ENTER, TYPE_BUTTON, JPF_BUTTON_PLAY, 0 },
- { "Select", 8, KEY_TAB, TYPE_NONE, 0, JPF_BUTTON_PLAY },
- { "Triangle", 4, KEY_E, TYPE_BUTTON, JPF_BUTTON_YELLOW, 0 },
- { "Cross", 6, KEY_X, TYPE_BUTTON, JPF_BUTTON_RED, 0 },
- { "Square", 7, KEY_S, TYPE_BUTTON, JPF_BUTTON_GREEN, 0 },
- { "Circle", 5, KEY_F, TYPE_BUTTON, JPF_BUTTON_BLUE, 0 },
- { "L1", 2, KEY_Q, TYPE_BUTTON, JPF_BUTTON_REVERSE, 0 },
- { "L2", 0, KEY_W, TYPE_NONE, 0, JPF_BUTTON_REVERSE },
- { "R1", 3, KEY_R, TYPE_BUTTON, JPF_BUTTON_FORWARD, 0 },
- { "R2", 1, KEY_T, TYPE_NONE, 0, JPF_BUTTON_FORWARD },
- /* Analog */
- { "Analog", ANALOG_MODE, 0 /* ~ */, TYPE_NONE, 0, 0 },
- { "LeftAnalogUp", ANALOG_LEFT_UP, KEY_U, TYPE_NONE, 0, 0 },
- { "LeftAnalogDown", ANALOG_LEFT_DOWN, KEY_N, TYPE_NONE, 0, 0 },
- { "LeftAnalogLeft", ANALOG_LEFT_LEFT, KEY_H, TYPE_NONE, 0, 0 },
- { "LeftAnalogRight", ANALOG_LEFT_RIGHT, KEY_K, TYPE_NONE, 0, 0 },
- { "LeftAnalogPress", 9, KEY_J, TYPE_NONE, 0, 0 },
- { "RightAnalogUp", ANALOG_RIGHT_UP, 26 /* : */, TYPE_NONE, 0, 0 },
- { "RightAnalogDown", ANALOG_RIGHT_DOWN, 58 /* / */, TYPE_NONE, 0, 0 },
- { "RightAnalogLeft", ANALOG_RIGHT_LEFT, 41 /* [ */, TYPE_NONE, 0, 0 },
- { "RightAnalogRight", ANALOG_RIGHT_RIGHT, 43 /* * */, TYPE_NONE, 0, 0 },
- { "RightAnalogPress", 10, 42 /* ] */, TYPE_NONE, 0, 0 },
- };
- #define NUM_KEYSYM ((int)( (sizeof(keysym)) / (sizeof(struct keysym_type)) ))
- static int ll_port_a = DEFAULT_LLPORT_A;
- static int ll_port_b = DEFAULT_LLPORT_B;
- static const char *lowlevel_name[] = {
- "-",
- "A - JOY UP",
- "A - JOY DOWN",
- "A - JOY LEFT",
- "A - JOY RIGHT",
- "A - BUTTON GREEN",
- "A - BUTTON YELLOW",
- "A - BUTTON RED",
- "A - BUTTON BLUE",
- "A - BUTTON FORWARD",
- "A - BUTTON REVERSE",
- "A - BUTTON PLAY",
- "B - JOY UP",
- "B - JOY DOWN",
- "B - JOY LEFT",
- "B - JOY RIGHT",
- "B - BUTTON GREEN",
- "B - BUTTON YELLOW",
- "B - BUTTON RED",
- "B - BUTTON BLUE",
- "B - BUTTON FORWARD",
- "B - BUTTON REVERSE",
- "B - BUTTON PLAY",
- NULL
- };
- static const ULONG lowlevel_mask[] = {
- 0,
- JPF_JOY_UP,
- JPF_JOY_DOWN,
- JPF_JOY_LEFT,
- JPF_JOY_RIGHT,
- JPF_BUTTON_GREEN,
- JPF_BUTTON_YELLOW,
- JPF_BUTTON_RED,
- JPF_BUTTON_BLUE,
- JPF_BUTTON_FORWARD,
- JPF_BUTTON_REVERSE,
- JPF_BUTTON_PLAY,
- JPF_JOY_UP,
- JPF_JOY_DOWN,
- JPF_JOY_LEFT,
- JPF_JOY_RIGHT,
- JPF_BUTTON_GREEN,
- JPF_BUTTON_YELLOW,
- JPF_BUTTON_RED,
- JPF_BUTTON_BLUE,
- JPF_BUTTON_FORWARD,
- JPF_BUTTON_REVERSE,
- JPF_BUTTON_PLAY
- };
- #define NUM_LOWLEVEL ((int)( (sizeof(lowlevel_mask)) / (sizeof(ULONG)) ))
- static int mask_to_index(ULONG mask_a, ULONG mask_b)
- {
- ULONG i;
- for (i=0; i<NUM_LOWLEVEL; i++) {
- if ((i <= 11) && (lowlevel_mask[i] & mask_a)) {
- return i;
- }
- if ((i >= 12) && (lowlevel_mask[i] & mask_b)) {
- return i;
- }
- }
- return 0;
- }
- void read_cfg(UINT32 *par)
- {
- FPSEAmiga *spu = (FPSEAmiga *)par;
- char tmp[256];
- int i;
- strcpy(ininame, KEYNAME);
- strcat(ininame, "_");
- strcat(ininame, (char *)((FPSEAmiga *)par)->PadNr);
- if (spu->ReadCfg(ininame, "PortA", tmp) == FPSE_OK) {
- ll_port_a = atoi(tmp);
- if ((ll_port_a < 0) || (ll_port_a > 3)) {
- ll_port_a = DEFAULT_LLPORT_A;
- }
- }
- if (spu->ReadCfg(ininame, "PortB", tmp) == FPSE_OK) {
- ll_port_b = atoi(tmp);
- if ((ll_port_b < 0) || (ll_port_b > 3)) {
- ll_port_b = DEFAULT_LLPORT_B;
- }
- }
- for (i=0; i<NUM_KEYSYM; i++) {
- if (spu->ReadCfg(ininame, keysym[i].label, tmp) == FPSE_OK) {
- sscanf(tmp, "%d,%d,%d,%d", &keysym[i].type, &keysym[i].rawkey, &keysym[i].mask_a, &keysym[i].mask_b);
- }
- }
- }
- void write_cfg(UINT32 *par)
- {
- FPSEAmiga *spu = (FPSEAmiga *)par;
- char tmp[256];
- int i;
- strcpy(ininame, KEYNAME);
- strcat(ininame, "_");
- strcat(ininame, (char *)((FPSEAmiga *)par)->PadNr);
- sprintf(tmp, "%d", ll_port_a);
- spu->WriteCfg(ininame, "PortA", tmp);
- sprintf(tmp, "%d", ll_port_b);
- spu->WriteCfg(ininame, "PortB", tmp);
- for (i=0; i<NUM_KEYSYM; i++) {
- sprintf(tmp, "%d,%d,%d,%d", keysym[i].type, keysym[i].rawkey, keysym[i].mask_a, keysym[i].mask_b);
- spu->WriteCfg(ininame, keysym[i].label, tmp);
- }
- }
- #ifdef __morphos__
- static struct InputEvent *_MyInputHandler(void);
- static const struct EmulLibEntry gate_MyInputHandler = {
- TRAP_LIB,
- 0,
- (void (*)(void))_MyInputHandler}, *MyInputHandler = &gate_MyInputHandler;
- static struct InputEvent *_MyInputHandler(void)
- {
- struct InputEvent *event_list = (APTR) REG_A0;
- #else
- struct InputEvent *MyInputHandler(REG(a0, struct InputEvent *event_list))
- {
- #endif
- #define JOY_SET_BIT(bitnum) ( ((joy_ret) & (1<<(bitnum))) ? (1) : (0) )
- struct InputEvent *event;
- for (event = event_list; event; event = event->ie_NextEvent) {
- if (event->ie_Class == IECLASS_RAWKEY) {
- int i;
- for(i=0;i<NUM_KEYSYM;i++) {
- if (keysym[i].rawkey == (event->ie_Code & 0x7f)) {
- if (!(event->ie_Code & IECODE_UP_PREFIX)) {
- joy_ret &= ~(1<<keysym[i].bitnum);
- } else {
- joy_ret |= (1<<keysym[i].bitnum);
- }
- switch (keysym[i].bitnum) {
- case ANALOG_MODE:
- if (event->ie_Code & IECODE_UP_PREFIX) {
- if (JOY_Device == 0x73) {
- JOY_Device = 0x41;
- } else {
- JOY_Device = 0x73;
- }
- }
- break;
- case ANALOG_LEFT_UP:
- case ANALOG_LEFT_DOWN:
- left_analog_y = (JOY_SET_BIT(ANALOG_LEFT_UP) == JOY_SET_BIT(ANALOG_LEFT_DOWN)) ? ANALOG_MID : JOY_SET_BIT(ANALOG_LEFT_UP) ? ANALOG_MAX : ANALOG_MIN;
- break;
- case ANALOG_LEFT_LEFT:
- case ANALOG_LEFT_RIGHT:
- left_analog_x = (JOY_SET_BIT(ANALOG_LEFT_LEFT) == JOY_SET_BIT(ANALOG_LEFT_RIGHT)) ? ANALOG_MID : JOY_SET_BIT(ANALOG_LEFT_LEFT) ? ANALOG_MAX : ANALOG_MIN;
- break;
- case ANALOG_RIGHT_UP:
- case ANALOG_RIGHT_DOWN:
- right_analog_y = (JOY_SET_BIT(ANALOG_RIGHT_UP) == JOY_SET_BIT(ANALOG_RIGHT_DOWN)) ? ANALOG_MID : JOY_SET_BIT(ANALOG_RIGHT_UP) ? ANALOG_MAX : ANALOG_MIN;
- break;
- case ANALOG_RIGHT_LEFT:
- case ANALOG_RIGHT_RIGHT:
- right_analog_x = (JOY_SET_BIT(ANALOG_RIGHT_LEFT) == JOY_SET_BIT(ANALOG_RIGHT_RIGHT)) ? ANALOG_MID : JOY_SET_BIT(ANALOG_RIGHT_LEFT) ? ANALOG_MAX : ANALOG_MIN;
- break;
- default:
- break;
- }
- }
- }
- }
- }
- return event_list;
- #undef JOY_SET_BIT
- }
- static struct IOStdReq *inputReqBlk = NULL;
- static struct MsgPort *inputPort = NULL;
- static struct Interrupt *inputHandler = NULL;
- static char HandlerName[50];
- static int input_error = -1;
- void rem_inputhandler(void)
- {
- if (!input_error) {
- inputReqBlk->io_Data=(APTR)inputHandler;
- inputReqBlk->io_Command=IND_REMHANDLER;
- DoIO((struct IORequest *)inputReqBlk);
- CloseDevice((struct IORequest *)inputReqBlk);
- input_error = -1;
- }
- if (inputReqBlk) {
- DeleteIORequest((struct IORequest *)inputReqBlk);
- inputReqBlk = NULL;
- }
- if (inputHandler) {
- FreeMem(inputHandler, sizeof(struct Interrupt));
- inputHandler = NULL;
- }
- if (inputPort) {
- DeleteMsgPort(inputPort);
- inputPort = NULL;
- }
- }
- int add_inputhandler(void)
- {
- sprintf(HandlerName, "input handler:%08x", (int)FindTask(NULL));
- if ((inputPort = CreateMsgPort())) {
- if ((inputHandler = (struct Interrupt *)AllocMem(sizeof(struct Interrupt), MEMF_PUBLIC|MEMF_CLEAR))) {
- if ((inputReqBlk = (struct IOStdReq *)CreateIORequest(inputPort, sizeof(struct IOStdReq)))) {
- if (!(input_error = OpenDevice("input.device", 0, (struct IORequest *)inputReqBlk, 0))) {
- inputHandler->is_Code = (void *)MyInputHandler;
- inputHandler->is_Data = NULL;
- inputHandler->is_Node.ln_Pri = 100;
- inputHandler->is_Node.ln_Name = HandlerName;
- inputReqBlk->io_Data = (APTR)inputHandler;
- inputReqBlk->io_Command = IND_ADDHANDLER;
- DoIO((struct IORequest *)inputReqBlk);
- }
- }
- }
- }
- if (!input_error) {
- return 0;
- } else {
- rem_inputhandler();
- return -1;
- }
- }
- // This Function is called when emulator starts
- int JOY_Open(UINT32 *par)
- {
- /* Device type */
- JOY_Device = 0x41;
- read_cfg(par);
- if (add_inputhandler()) {
- return FPSE_ERR;
- }
- /* Force CD32 pad */
- SetJoyPortAttrs(ll_port_a, SJA_Type, SJA_TYPE_GAMECTLR, TAG_END);
- SetJoyPortAttrs(ll_port_b, SJA_Type, SJA_TYPE_GAMECTLR, TAG_END);
- return FPSE_OK;
- }
- static int get_key(int *keycode, ULONG *mask_a, ULONG *mask_b)
- {
- static const char *window_text = "Press desired key/button, move stick or press ESC for no key.";
- struct Window *window;
- int done = 0;
- *keycode = -1; /* no key */
- *mask_a = 0; /* no button */
- *mask_b = 0; /* no button */
- window = OpenWindowTags(NULL,
- WA_Title, (ULONG)"",
- WA_Flags, WFLG_NOCAREREFRESH|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO,
- WA_IDCMP, IDCMP_CLOSEWINDOW|WFLG_REPORTMOUSE|IDCMP_RAWKEY|IDCMP_CHANGEWINDOW,
- WA_Left, 100,
- WA_Top, 100,
- WA_Width, 100,
- WA_Height, 40,
- WA_Activate, TRUE,
- TAG_DONE);
- if (window != NULL) {
- struct IntuiMessage *imsg = NULL;
- ULONG imCode, imClass, portstate_a, portstate_b;
- /* Resize window and set pens */
- int length = TextLength(window->RPort, window_text, strlen(window_text));
- ChangeWindowBox(window, 100, 100, window->BorderLeft+length+window->BorderRight+8, window->BorderTop+window->IFont->tf_YSize*2+window->BorderBottom);
- SetAPen(window->RPort, 1);
- SetBPen(window->RPort, 0);
- /* Wait until window has been resized */
- while (done == 0) {
- /* Sleep a little */
- Delay(1);
- /* Check for IDCMP messages */
- while ((imsg = (struct IntuiMessage *)GetMsg(window->UserPort))) {
- imClass = imsg->Class;
- imCode = imsg->Code;
- ReplyMsg((struct Message *)imsg);
- if (imClass == IDCMP_CHANGEWINDOW) {
- Move(window->RPort, 4, window->IFont->tf_YSize);
- Text(window->RPort, window_text, strlen(window_text));
- }
- else if (imClass == IDCMP_RAWKEY) {
- imCode &= 0x7f;
- if (imCode != 69) {
- *keycode = imCode;
- }
- done = 1; /* ok */
- }
- else if (imClass == IDCMP_CLOSEWINDOW) {
- done = -1; /* cancel */
- }
- }
- /* Check for LowLevel input */
- portstate_a = ReadJoyPort(ll_port_a);
- portstate_b = ReadJoyPort(ll_port_b);
- if (portstate_a & (JP_BUTTON_MASK | JP_DIRECTION_MASK))
- {
- *mask_a = portstate_a;
- done = 2; /* lowlevel */
- }
- if (portstate_b & (JP_BUTTON_MASK | JP_DIRECTION_MASK))
- {
- *mask_b = portstate_b;
- done = 2; /* lowlevel */
- }
- }
- CloseWindow(window);
- }
- return done;
- }
- int JOY_Configure(UINT32 *par)
- {
- BOOL running = TRUE;
- ULONG signals;
- #define BTN_OK (32)
- #define PORT_CHANGE_A (33)
- #define PORT_CHANGE_B (34)
- APTR label, text[NUM_KEYSYM], button, app, main_group, window, ok, cancel, Oport_a, Oport_b, Oinput[NUM_KEYSYM];
- char *CY_PortContent[5];
- CY_PortContent[0] = "0";
- CY_PortContent[1] = "1";
- CY_PortContent[2] = "2";
- CY_PortContent[3] = "3";
- CY_PortContent[4] = NULL;
- read_cfg(par);
- app = ApplicationObject,
- MUIA_Application_Author, "Mathias Roslund",
- MUIA_Application_Base, KEYNAME,
- MUIA_Application_Title, KEYNAME,
- MUIA_Application_Version, VERSTAG,
- MUIA_Application_Copyright, "Mathias Roslund",
- MUIA_Application_Description, KEYNAME,
- SubWindow, window = WindowObject,
- MUIA_Window_Title, KEYNAME,
- MUIA_Window_ID, MAKE_ID('0', 'W', 'I', 'N'),
- WindowContents, VGroup,
- Child, HGroup,
- Child, TextObject,
- MUIA_Text_PreParse, "\033r",
- MUIA_Text_Contents, "Port A",
- MUIA_Weight, 0,
- MUIA_InnerLeft, 0,
- MUIA_InnerRight, 0,
- End,
- Child, Oport_a = CycleObject,
- MUIA_Cycle_Entries, CY_PortContent,
- MUIA_Cycle_Active, ll_port_a,
- End,
- End,
- Child, HGroup,
- Child, TextObject,
- MUIA_Text_PreParse, "\033r",
- MUIA_Text_Contents, "Port B",
- MUIA_Weight, 0,
- MUIA_InnerLeft, 0,
- MUIA_InnerRight, 0,
- End,
- Child, Oport_b = CycleObject,
- MUIA_Cycle_Entries, CY_PortContent,
- MUIA_Cycle_Active, ll_port_b,
- End,
- End,
- Child, main_group = ColGroup(4), End,
- Child, HGroup,
- Child, ok = TextObject,
- ButtonFrame,
- MUIA_Background, MUII_ButtonBack,
- MUIA_Text_Contents, "Ok",
- MUIA_Text_PreParse, "\033c",
- MUIA_InputMode, MUIV_InputMode_RelVerify,
- End,
- Child, cancel = TextObject,
- ButtonFrame,
- MUIA_Background, MUII_ButtonBack,
- MUIA_Text_Contents, "Cancel",
- MUIA_Text_PreParse, "\033c",
- MUIA_InputMode, MUIV_InputMode_RelVerify,
- End,
- End,
- End,
- End,
- End;
- if (app) {
- int i;
- DoMethod(window,
- MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
- app,
- 2,
- MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit
- );
- DoMethod(cancel,
- MUIM_Notify, MUIA_Pressed, FALSE,
- app,
- 2,
- MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit
- );
- DoMethod(ok,
- MUIM_Notify, MUIA_Pressed, FALSE,
- app,
- 2,
- MUIM_Application_ReturnID, BTN_OK
- );
- DoMethod(Oport_a,
- MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime,
- app,
- 2,
- MUIM_Application_ReturnID, PORT_CHANGE_A
- );
- DoMethod(Oport_b,
- MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime,
- app,
- 2,
- MUIM_Application_ReturnID, PORT_CHANGE_B
- );
- for (i=0; i<NUM_KEYSYM; i++) {
- /* label */
- label = TextObject,
- MUIA_Text_PreParse, "\033r",
- MUIA_Text_Contents, keysym[i].label,
- MUIA_InnerLeft, 0,
- MUIA_InnerRight, 0,
- End;
- Oinput[i] = CycleObject,
- MUIA_Cycle_Entries, lowlevel_name,
- MUIA_Cycle_Active, mask_to_index(keysym[i].mask_a, keysym[i].mask_b),
- End,
- text[i] = TextObject,
- MUIA_Background, MUII_TextBack,
- MUIA_Frame, MUIV_Frame_Text,
- MUIA_Text_Contents, rawkey_to_name(keysym[i].rawkey),
- End;
- button = TextObject,
- ButtonFrame,
- MUIA_Background, MUII_ButtonBack,
- MUIA_Text_Contents, "Change",
- MUIA_Text_PreParse, "\033c",
- MUIA_InputMode, MUIV_InputMode_RelVerify,
- End;
- DoMethod(button,
- MUIM_Notify, MUIA_Pressed, FALSE,
- app,
- 2,
- MUIM_Application_ReturnID, (i + 1)
- );
- /* add to window */
- DoMethod(main_group, OM_ADDMEMBER, label);
- DoMethod(main_group, OM_ADDMEMBER, Oinput[i]);
- DoMethod(main_group, OM_ADDMEMBER, text[i]);
- DoMethod(main_group, OM_ADDMEMBER, button);
- }
- }
- if (app) {
- int i;
- set(window, MUIA_Window_Open, TRUE);
- while (running) {
- unsigned long retval = DoMethod(app, MUIM_Application_Input, &signals);
- switch (retval) {
- case MUIV_Application_ReturnID_Quit:
- running = FALSE;
- break;
- case BTN_OK:
- for (i=0; i<NUM_KEYSYM; i++) {
- ULONG active;
- get(Oinput[i], MUIA_Cycle_Active, &active);
- if (active > 0) {
- keysym[i].type = TYPE_BUTTON;
- keysym[i].mask_a = (active <= 11) ? lowlevel_mask[active] : 0;
- keysym[i].mask_b = (active >= 12) ? lowlevel_mask[active] : 0;
- } else {
- keysym[i].type = TYPE_NONE;
- keysym[i].mask_a = 0;
- keysym[i].mask_b = 0;
- }
- }
- write_cfg(par);
- running = FALSE;
- break;
- case PORT_CHANGE_A: {
- ULONG active;
- get(Oport_a, MUIA_Cycle_Active, &active);
- /* Force CD32 pad */
- SetJoyPortAttrs(ll_port_a, SJA_Type, SJA_TYPE_AUTOSENSE, TAG_END);
- ll_port_a = active;
- SetJoyPortAttrs(ll_port_a, SJA_Type, SJA_TYPE_GAMECTLR, TAG_END);
- for (i=0; i<NUM_KEYSYM; i++) {
- set(Oinput[i], MUIA_Cycle_Active, 0);
- }
- } break;
- case PORT_CHANGE_B: {
- ULONG active;
- get(Oport_b, MUIA_Cycle_Active, &active);
- /* Force CD32 pad */
- SetJoyPortAttrs(ll_port_b, SJA_Type, SJA_TYPE_AUTOSENSE, TAG_END);
- ll_port_b = active;
- SetJoyPortAttrs(ll_port_b, SJA_Type, SJA_TYPE_GAMECTLR, TAG_END);
- for (i=0; i<NUM_KEYSYM; i++) {
- set(Oinput[i], MUIA_Cycle_Active, 0);
- }
- } break;
- default:
- if ((retval >= 1) && (retval <= (1+NUM_KEYSYM))) {
- int keycode, result;
- ULONG mask_a, mask_b;
- result = get_key(&keycode, &mask_a, &mask_b);
- if (result == 1) { /* KEY */
- keysym[retval - 1].rawkey = keycode;
- set(text[retval - 1], MUIA_Text_Contents, (ULONG)rawkey_to_name(keycode));
- } else if (result == 2) { /* lowlevel */
- int index = mask_to_index(mask_a, mask_b);
- set(Oinput[retval - 1], MUIA_Cycle_Active, index);
- }
- }
- break;
- }
- if (running && signals) {
- Wait(signals);
- }
- }
- MUI_DisposeObject(app);
- }
- #undef PORT_CHANGE
- #undef BTN_OK
- return FPSE_OK;
- }
- void JOY_About(UINT32 *par)
- {
- memcpy(par, &info, sizeof(FPSEAmigaAbout));
- }
- void JOY_Close(void)
- {
- /* Force CD32 pad */
- SetJoyPortAttrs(ll_port_a, SJA_Type, SJA_TYPE_AUTOSENSE, TAG_END);
- SetJoyPortAttrs(ll_port_b, SJA_Type, SJA_TYPE_AUTOSENSE, TAG_END);
- rem_inputhandler();
- }
- void JOY_LoadState(JOY_State *state) {}
- void JOY_SaveState(JOY_State *state) {}
- int JOY_SetAnalog(int mode)
- {
- int prev = (JOY_Device != 0x41);
- if (mode == 1) {
- JOY_Device = 0x73;
- } else if (mode == 0) {
- JOY_Device = 0x41;
- }
- return prev;
- }
- void JOY_SetOutputBuffer(UINT8 *buf)
- {
- padbuf0 = buf;
- }
- int JOY_StartPoll(void)
- {
- ULONG portstate_a, portstate_b;
- UINT32 ret = joy_ret;
- int lax = left_analog_x;
- int lay = left_analog_y;
- int rax = right_analog_x;
- int ray = right_analog_y;
- int i;
- ret |= ((1 << DIGITAL_UP) | (1 << DIGITAL_DOWN) | (1 << DIGITAL_LEFT) | (1 << DIGITAL_RIGHT));
- portstate_a = ReadJoyPort(ll_port_a);
- portstate_b = ReadJoyPort(ll_port_b);
- for (i=0; i<NUM_KEYSYM; i++) {
- switch (keysym[i].type) {
- case TYPE_BUTTON:
- if (portstate_a & keysym[i].mask_a) {
- ret &= ~(1<<keysym[i].bitnum);
- } else {
- ret |= (1<<keysym[i].bitnum);
- }
- if (portstate_b & keysym[i].mask_b) {
- ret &= ~(1<<keysym[i].bitnum);
- } else {
- ret |= (1<<keysym[i].bitnum);
- }
- break;
- default:
- break;
- }
- }
- padbuf0[1] = JOY_Device;
- padbuf0[2] = 0x5A;
- padbuf0[3] = ret >> 8;
- padbuf0[4] = ret;
- padbuf0[5] = rax;
- padbuf0[6] = ray;
- padbuf0[7] = lax;
- padbuf0[8] = lay;
- padcnt = 0;
- CmdPoll = FirstPoll;
- return ACK_OK;
- }
- static int NormalPoll(int outbyte)
- {
- if (padcnt > (1+((JOY_Device&0xF)<<1)) ) return ACK_ERR;
- return ACK_OK;
- }
- static int DeviceSelectPoll(int outbyte)
- {
- if (padcnt == 3) {
- if (outbyte == 0) {
- JOY_Device = 0x41;
- } else {
- JOY_Device = 0x73;
- }
- }
- return ACK_OK;
- }
- static int Cmd46Poll_Digital(int outbyte)
- {
- if (padcnt == 3)
- {
- UINT32 *buf32 = (UINT32 *)padbuf0;
- if (outbyte) {
- buf32[1] = C_SWAP32(0x01010100);
- padbuf0[8] = 0x14;
- } else {
- buf32[1] = C_SWAP32(0x00020100);
- padbuf0[8] = 0x0A;
- }
- CmdPoll = NormalPoll;
- }
- return ACK_OK;
- }
- static int Cmd46Poll_Analog(int outbyte)
- {
- if (padcnt == 3)
- {
- UINT32 *buf32 = (UINT32 *)padbuf0;
- if (outbyte) {
- buf32[1] = C_SWAP32(0x01000100);
- padbuf0[8] = 0x14;
- } else {
- buf32[1] = C_SWAP32(0x00000100);
- padbuf0[8] = 0x0A;
- }
- CmdPoll = NormalPoll;
- }
- return ACK_OK;
- }
- static int Cmd4CPoll(int outbyte)
- {
- if (padcnt == 3)
- {
- if (outbyte)
- padbuf0[6] = 0x07;
- else
- padbuf0[6] = 0x04;
- CmdPoll = NormalPoll;
- }
- return ACK_OK;
- }
- static int FirstPoll(int outbyte)
- {
- UINT32 *buf32;
- switch (outbyte) {
- case 0x44:
- buf32 = (UINT32 *)padbuf0;
- buf32[0] = C_SWAP32(0x005AF3FF);
- buf32[1] = C_SWAP32(0x00000000);
- padbuf0[8] = 0;
- CmdPoll = DeviceSelectPoll;
- break;
- case 0x45:
- buf32 = (UINT32 *)padbuf0;
- buf32[0] = C_SWAP32(0x035AF3FF);
- if (JOY_Device == 0x41)
- buf32[1] = C_SWAP32(0x01020002);
- else
- buf32[1] = C_SWAP32(0x01000102);
- padbuf0[8] = 0;
- CmdPoll = NormalPoll;
- break;
- case 0x46:
- buf32 = (UINT32 *)padbuf0;
- buf32[0] = C_SWAP32(0x005AF3FF);
- if (JOY_Device == 0x41)
- CmdPoll = Cmd46Poll_Digital;
- else
- CmdPoll = Cmd46Poll_Analog;
- break;
- case 0x47:
- buf32 = (UINT32 *)padbuf0;
- buf32[0] = C_SWAP32(0x005AF3FF);
- buf32[1] = C_SWAP32(0x01000200);
- padbuf0[8] = 0;
- CmdPoll = NormalPoll;
- break;
- case 0x4C:
- buf32 = (UINT32 *)padbuf0;
- buf32[0] = C_SWAP32(0x005AF3FF);
- buf32[1] = C_SWAP32(0x00000000);
- padbuf0[8] = 0;
- CmdPoll = Cmd4CPoll;
- break;
- case 0x4D:
- buf32 = (UINT32 *)padbuf0;
- buf32[0] = C_SWAP32(0xFF5AF3FF);
- buf32[1] = C_SWAP32(0xFFFFFFFF);
- padbuf0[8] = 0xFF;
- default:
- CmdPoll = NormalPoll;
- break;
- }
- return ACK_OK;
- }
- int JOY_Poll(int outbyte)
- {
- padcnt++;
- return CmdPoll(outbyte);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement