287 lines
7.2 KiB
C
287 lines
7.2 KiB
C
/*
|
|
* main.c
|
|
* joytest
|
|
*
|
|
* Created by Jeremy Rand on 2020-06-02.
|
|
* Copyright (c) 2020 Jeremy Rand. All rights reserved.
|
|
*
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <conio.h>
|
|
#include <joystick.h>
|
|
#include <apple2.h>
|
|
|
|
#include "drivers/a2_joystick_drv.h"
|
|
#include "pdlread.h"
|
|
|
|
|
|
// Defines
|
|
|
|
#define SW_VERSION "0.1"
|
|
|
|
|
|
// Globals
|
|
|
|
static uint8_t highestUp = 0x00;
|
|
static uint8_t lowestDown = 0xff;
|
|
static uint8_t lowestVertCentre = 0xff;
|
|
static uint8_t highestVertCentre = 0x00;
|
|
|
|
static uint8_t highestLeft = 0x00;
|
|
static uint8_t lowestRight = 0xff;
|
|
static uint8_t lowestHorizCentre = 0xff;
|
|
static uint8_t highestHorizCentre = 0x00;
|
|
|
|
// Implementation
|
|
|
|
void clearGlobals(void)
|
|
{
|
|
highestUp = 0x00;
|
|
lowestDown = 0xff;
|
|
lowestVertCentre = 0xff;
|
|
highestVertCentre = 0x00;
|
|
|
|
highestLeft = 0x00;
|
|
lowestRight = 0xff;
|
|
lowestHorizCentre = 0xff;
|
|
highestHorizCentre = 0x00;
|
|
}
|
|
|
|
|
|
void drawJoystick(uint8_t joyDriverMask)
|
|
{
|
|
revers(JOY_BTN_1(joyDriverMask));
|
|
cputcxy(9, 11, '1');
|
|
|
|
revers(JOY_BTN_2(joyDriverMask));
|
|
cputcxy(11, 11, '2');
|
|
|
|
joyDriverMask &= (JOY_UP_MASK | JOY_DOWN_MASK | JOY_LEFT_MASK | JOY_RIGHT_MASK);
|
|
|
|
revers(joyDriverMask == (JOY_UP_MASK | JOY_LEFT_MASK));
|
|
cputsxy(3, 5, "UL");
|
|
|
|
revers(joyDriverMask == JOY_UP_MASK);
|
|
cputcxy(6, 5, 'U');
|
|
|
|
revers(joyDriverMask == (JOY_UP_MASK | JOY_RIGHT_MASK));
|
|
cputsxy(8, 5, "UR");
|
|
|
|
revers(joyDriverMask == JOY_LEFT_MASK);
|
|
cputcxy(4, 7, 'L');
|
|
|
|
revers(joyDriverMask == 0);
|
|
cputcxy(6, 7, 'C');
|
|
|
|
revers(joyDriverMask == JOY_RIGHT_MASK);
|
|
cputcxy(8, 7, 'R');
|
|
|
|
revers(joyDriverMask == (JOY_DOWN_MASK | JOY_LEFT_MASK));
|
|
cputsxy(3, 9, "DL");
|
|
|
|
revers(joyDriverMask == JOY_DOWN_MASK);
|
|
cputcxy(6, 9, 'D');
|
|
|
|
revers(joyDriverMask == (JOY_DOWN_MASK | JOY_RIGHT_MASK));
|
|
cputsxy(8, 9, "DR");
|
|
|
|
revers(false);
|
|
}
|
|
|
|
|
|
void pollJoystick(void)
|
|
{
|
|
uint8_t joyDriverMask = 0x00;
|
|
uint8_t prevJoyDriverMask = 0x00;
|
|
uint8_t joystickNum = 0;
|
|
char ch;
|
|
|
|
uint8_t x;
|
|
uint8_t y;
|
|
bool testingX = true;
|
|
uint8_t pdlNum = 0;
|
|
|
|
clearGlobals();
|
|
|
|
clrscr();
|
|
cputsxy(11, 0, "CC65 JOYSTICK TEST");
|
|
cputsxy(11, 1, "------------------");
|
|
|
|
cputsxy(0, 3, "JOYSTICK NUM:");
|
|
|
|
cputsxy(0, 11, "BUTTONS:");
|
|
|
|
cputsxy(0, 20, "PRESS 0/1 TO SELECT JOYSTICK");
|
|
cputsxy(0, 21, "PRESS X/Y TO SELECT AXIS TEST");
|
|
cputsxy(0, 22, "PRESS C TO CLEAR TEST RESULTS");
|
|
cputsxy(0, 23, "PRESS Q TO QUIT");
|
|
cputsxy(30, 23, "(VER " SW_VERSION ")");
|
|
|
|
prevJoyDriverMask = joy_read(joystickNum);
|
|
drawJoystick(joyDriverMask);
|
|
|
|
do {
|
|
joyDriverMask = joy_read(joystickNum);
|
|
|
|
if (testingX)
|
|
{
|
|
x = pdlRead(pdlNum);
|
|
|
|
if (JOY_LEFT(joyDriverMask))
|
|
{
|
|
if ((!JOY_LEFT(prevJoyDriverMask)) &&
|
|
(x > highestLeft))
|
|
highestLeft = x;
|
|
}
|
|
else if (JOY_RIGHT(joyDriverMask))
|
|
{
|
|
if ((!JOY_RIGHT(prevJoyDriverMask)) &&
|
|
(x < lowestRight))
|
|
lowestRight = x;
|
|
}
|
|
else
|
|
{
|
|
if ((JOY_LEFT(prevJoyDriverMask)) &&
|
|
(x < lowestHorizCentre))
|
|
lowestHorizCentre = x;
|
|
else if ((JOY_RIGHT(prevJoyDriverMask)) &&
|
|
(x > highestHorizCentre))
|
|
highestHorizCentre = x;
|
|
}
|
|
|
|
cputsxy(20, 3, "TESTING: X AXIS");
|
|
|
|
cputsxy(20, 5, "HIGHEST LEFT: ");
|
|
if (highestLeft == 0x00)
|
|
cputs("N/A");
|
|
else
|
|
cprintf("%3d", highestLeft);
|
|
|
|
cputsxy(20, 6, "LOWEST CENTRE: ");
|
|
if (lowestHorizCentre == 0xff)
|
|
cputs("N/A");
|
|
else
|
|
cprintf("%3d", lowestHorizCentre);
|
|
|
|
cputsxy(20, 7, "HIGHEST CENTRE: ");
|
|
if (highestHorizCentre == 0x00)
|
|
cputs("N/A");
|
|
else
|
|
cprintf("%3d", highestHorizCentre);
|
|
|
|
cputsxy(20, 8, "LOWEST RIGHT: ");
|
|
if (lowestRight == 0xff)
|
|
cputs("N/A");
|
|
else
|
|
cprintf("%3d", lowestRight);
|
|
}
|
|
else
|
|
{
|
|
y = pdlRead(pdlNum);
|
|
|
|
if (JOY_UP(joyDriverMask))
|
|
{
|
|
if ((!JOY_UP(prevJoyDriverMask)) &&
|
|
(y > highestUp))
|
|
highestUp = y;
|
|
}
|
|
else if (JOY_DOWN(joyDriverMask))
|
|
{
|
|
if ((!JOY_DOWN(prevJoyDriverMask)) &&
|
|
(y < lowestDown))
|
|
lowestDown = y;
|
|
}
|
|
else
|
|
{
|
|
if ((JOY_UP(prevJoyDriverMask)) &&
|
|
(y < lowestVertCentre))
|
|
lowestVertCentre = y;
|
|
else if ((JOY_DOWN(prevJoyDriverMask)) &&
|
|
(y > highestVertCentre))
|
|
highestVertCentre = y;
|
|
}
|
|
|
|
cputsxy(20, 3, "TESTING: Y AXIS");
|
|
|
|
cputsxy(20, 5, "HIGHEST UP: ");
|
|
if (highestUp == 0x00)
|
|
cputs("N/A");
|
|
else
|
|
cprintf("%3d", highestUp);
|
|
|
|
cputsxy(20, 6, "LOWEST CENTRE: ");
|
|
if (lowestVertCentre == 0xff)
|
|
cputs("N/A");
|
|
else
|
|
cprintf("%3d", lowestVertCentre);
|
|
|
|
cputsxy(20, 7, "HIGHEST CENTRE: ");
|
|
if (highestVertCentre == 0x00)
|
|
cputs("N/A");
|
|
else
|
|
cprintf("%3d", highestVertCentre);
|
|
|
|
cputsxy(20, 8, "LOWEST DOWN: ");
|
|
if (lowestDown == 0xff)
|
|
cputs("N/A");
|
|
else
|
|
cprintf("%3d", lowestDown);
|
|
}
|
|
|
|
drawJoystick(joyDriverMask);
|
|
|
|
cputcxy(14, 3, '0' + joystickNum);
|
|
|
|
prevJoyDriverMask = joyDriverMask;
|
|
|
|
if (kbhit())
|
|
{
|
|
ch = cgetc();
|
|
switch (ch)
|
|
{
|
|
case '0':
|
|
case '1':
|
|
joystickNum = (ch - '0');
|
|
pdlNum = (testingX ? (2 * joystickNum) : ((2 * joystickNum) + 1));
|
|
|
|
// Fallthrough...
|
|
case 'C':
|
|
case 'c':
|
|
clearGlobals();
|
|
break;
|
|
|
|
case 'x':
|
|
case 'X':
|
|
testingX = true;
|
|
pdlNum = 2 * joystickNum;
|
|
break;
|
|
|
|
case 'y':
|
|
case 'Y':
|
|
testingX = false;
|
|
pdlNum = (2 * joystickNum) + 1;
|
|
break;
|
|
|
|
case 'q':
|
|
case 'Q':
|
|
case 0x1b:
|
|
return;
|
|
}
|
|
}
|
|
} while (1);
|
|
}
|
|
|
|
|
|
int main(void)
|
|
{
|
|
joy_install(&a2_joystick_drv);
|
|
pollJoystick();
|
|
joy_uninstall();
|
|
|
|
return 0;
|
|
}
|