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; }
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); } }