Example #1
0
File: joy.c Project: feli7254/SGDK
void JOY_init()
{
    vu8 *pb;
    u8  a, id;
    u16 i;

    joyEventCB = NULL;
    gport = 0xFFFF;

    // disable ints
    SYS_disableInts();

    /* check for EA 4-Way Play */
    pb = (vu8 *)0xa10009;
    *pb = 0x40;
    pb = (vu8 *)0xa1000b;
    *pb = 0x43;
    pb = (vu8 *)0xa10005;
    *pb = 0x7C;
    pb = (vu8 *)0xa1000b;
    *pb = 0x7F;
    pb = (vu8 *)0xa10005;
    *pb = 0x7C;
    pb = (vu8 *)0xa10003;
    a = *pb & 3;

    if (a == 0)
    {
        /* EA 4-Way Play detected */
        portType[PORT_1] = PORT_TYPE_EA4WAYPLAY;
        portType[PORT_2] = PORT_TYPE_EA4WAYPLAY;
        portSupport[PORT_1] = JOY_SUPPORT_EA4WAYPLAY;
        portSupport[PORT_2] = JOY_SUPPORT_OFF;

        for (i=JOY_1; i<JOY_NUM; i++)
        {
            joyType[i] = JOY_TYPE_UNKNOWN; /* default to unknown */
            joyState[i] = 0;
            joyAxisX[i] = 0;
            joyAxisY[i] = 0;
        }

        // restore ints
        SYS_enableInts();

        /* wait a few vblanks for JOY_update() to get valid data */
        VDP_waitVSync();
        VDP_waitVSync();
        VDP_waitVSync();

        return; /* EA 4-Way Play is the only thing that can be plugged in as it takes both ports */
    }

    /*
     * Initialize ports for peripheral interface protocol - default to
     * TH Control Method for pads
     */

    /* set the port bits direction */
    pb = (vu8 *)0xa10009;
    *pb = 0x40;
    pb += 2;
    *pb = 0x40;
    pb += 2;
    *pb = 0x40;
    /* set the port bits value */
    pb = (vu8 *)0xa10003;
    *pb = 0x40;
    pb += 2;
    *pb = 0x40;
    pb += 2;
    *pb = 0x40;

    VDP_waitVSync();
    VDP_waitVSync();

    /* get ID port 1 */
    pb = (vu8 *)0xa10003;
    a = *pb;
    *pb = 0x00;
    id = (a & 8) | (a & 4) ? 8 : 0;
    id |= (a & 2) | (a & 1) ? 4 : 0;
    a = *pb;
    *pb = 0x40;
    id |= (a & 8) | (a & 4) ? 2 : 0;
    id |= (a & 2) | (a & 1) ? 1 : 0;
    portType[PORT_1] = id;

    /* get ID port 2 */
    pb = (vu8 *)0xa10005;
    a = *pb;
    *pb = 0x00;
    id = (a & 8) | (a & 4) ? 8 : 0;
    id |= (a & 2) | (a & 1) ? 4 : 0;
    a = *pb;
    *pb = 0x40;
    id |= (a & 8) | (a & 4) ? 2 : 0;
    id |= (a & 2) | (a & 1) ? 1 : 0;
    portType[PORT_2] = id;

    /* now set the port support */

    portSupport[PORT_1] = JOY_SUPPORT_OFF; /* default to off */
    portSupport[PORT_2] = JOY_SUPPORT_OFF; /* default to off */

    for (i=JOY_1; i<JOY_NUM; i++)
    {
        joyType[i] = JOY_TYPE_UNKNOWN; /* default to unknown */
        joyState[i] = 0;
        joyAxisX[i] = 0;
        joyAxisY[i] = 0;
    }

    switch (portType[PORT_1])
    {
        case PORT_TYPE_MENACER:
        case PORT_TYPE_JUSTIFIER:
            /* init port for light gun control */
            pb = (vu8 *)0xa10009;
            *pb = 0x30;
            pb = (vu8 *)0xa10003;
            *pb = 0x30;
            break;
        case PORT_TYPE_MOUSE:
        case PORT_TYPE_TEAMPLAYER:
            /* init port for Three Line Handshake Method */
            pb = (vu8 *)0xa10009;
            *pb = 0x60;
            pb = (vu8 *)0xa10003;
            *pb = 0x60;
            break;
        case PORT_TYPE_PAD:
            portSupport[PORT_1] = JOY_SUPPORT_6BTN; /* default to on for pads */
            break;
    }

    switch (portType[PORT_2])
    {
        case PORT_TYPE_MENACER:
        case PORT_TYPE_JUSTIFIER:
            /* init port for light gun control */
            pb = (vu8 *)0xa1000b;
            *pb = 0x30;
            pb = (vu8 *)0xa10005;
            *pb = 0x30;
            break;
        case PORT_TYPE_MOUSE:
        case PORT_TYPE_TEAMPLAYER:
            /* init port for Three Line Handshake Method */
            pb = (vu8 *)0xa1000b;
            *pb = 0x60;
            pb = (vu8 *)0xa10005;
            *pb = 0x60;
            break;
        case PORT_TYPE_PAD:
            portSupport[PORT_2] = JOY_SUPPORT_6BTN; /* default to on for pads */
            break;
    }

    /* check if need to turn on an input device */
    if ((portType[PORT_1] != PORT_TYPE_PAD) && (portType[PORT_2] != PORT_TYPE_PAD))
    {
        /* no pads - look for teamplayer or mouse */
        if (portType[PORT_1] == PORT_TYPE_TEAMPLAYER)
            JOY_setSupport(PORT_1, JOY_SUPPORT_TEAMPLAYER);
        else if (portType[PORT_2] == PORT_TYPE_TEAMPLAYER)
            JOY_setSupport(PORT_2, JOY_SUPPORT_TEAMPLAYER);
        else if (portType[PORT_1] == PORT_TYPE_MOUSE)
            JOY_setSupport(PORT_1, JOY_SUPPORT_MOUSE);
        else if (portType[PORT_2] == PORT_TYPE_MOUSE)
            JOY_setSupport(PORT_2, JOY_SUPPORT_MOUSE);
    }

    // restore ints
    SYS_enableInts();

    /* wait a few vblanks for JOY_update() to get valid data */
    VDP_waitVSync();
    VDP_waitVSync();
    VDP_waitVSync();

    /* now update pads to reflect true type (3 or 6 button) */
    if (portType[PORT_1] == PORT_TYPE_PAD)
        if (joyType[JOY_1] == JOY_TYPE_PAD3)
            portSupport[PORT_1] = JOY_SUPPORT_3BTN;
    if (portType[PORT_2] == PORT_TYPE_PAD)
        if (joyType[JOY_2] == JOY_TYPE_PAD3)
            portSupport[PORT_2] = JOY_SUPPORT_3BTN;
}
Example #2
0
File: main.c Project: kubilus1/SGDK
int main()
{
    char str[16];

    VDP_setScreenWidth256();
    VDP_setHInterrupt(0);
    VDP_setHilightShadow(0);

    // speed up controller checking
    JOY_setSupport(PORT_1, JOY_SUPPORT_6BTN);
    JOY_setSupport(PORT_2, JOY_SUPPORT_OFF);

    JOY_setEventHandler(handleJoyEvent);

    BMP_init(TRUE, PAL0, FALSE);

    camdist = FIX16(15);

    M3D_reset();
    M3D_setCamDistance(camdist);
    M3D_setLightEnabled(1);
    M3D_setLightXYZ(FIX16(0.9), FIX16(0.9), FIX16(-0.9));

    // allocate translation and rotation structure
    M3D_setTransform(&transformation, &translation, &rotation);
    M3D_setTranslation(&transformation, FIX16(0), FIX16(0), FIX16(20));
    M3D_setRotation(&transformation, FIX16(0), FIX16(0), FIX16(0));

    flatDrawing = 0;

    while (1)
    {
        doActionJoy(JOY_1, JOY_readJoypad(JOY_1));

        M3D_setCamDistance(camdist);

        // do work here
        rotation.x += rotstep.x;
        rotation.y += rotstep.y;
        rotation.z += rotstep.z;
        transformation.rebuildMat = 1;

        updatePointsPos();

        // ensure previous flip buffer request has been started
        BMP_waitWhileFlipRequestPending();
        BMP_showFPS(1);

        BMP_clear();

        drawPoints(0xFF);

        BMP_drawText("trans z:", 0, 2);
        fix16ToStr(translation.z, str, 2);
        BMP_drawText(str, 10, 2);
        BMP_drawText("cam dist:", 0, 3);
        fix16ToStr(camdist, str, 2);
        BMP_drawText(str, 11, 3);

        BMP_flip(1);
    }
}