diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..97a368b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 Jeremy Rand + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2ee323c --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +JoyTest +======== + +This is a joystick test program for the cc65 joystick driver. A problem was found with the original cc65 driver so it is being re-written. I am creating this program to provide feedback that the new implementation works well (or doesn't work well) on a variety of HW. + +[Download a disk image](https://github.com/jeremysrand/joytest/releases/download/0.1/joytest.dsk) + diff --git a/joytest.xcodeproj/project.pbxproj b/joytest.xcodeproj/project.pbxproj index fbd4bb7..1489cc2 100644 --- a/joytest.xcodeproj/project.pbxproj +++ b/joytest.xcodeproj/project.pbxproj @@ -46,6 +46,10 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 9D1716772490096400C83148 /* pdlread.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = pdlread.s; sourceTree = ""; }; + 9D171678249009C300C83148 /* pdlread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pdlread.h; sourceTree = ""; }; + 9D17167B2490184800C83148 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 9D17167C2490187500C83148 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 9DB59E8E2487471900C57C78 /* joytest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = joytest; sourceTree = BUILT_PRODUCTS_DIR; }; 9DB59E912487471900C57C78 /* joytest.dsk */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = joytest.dsk; sourceTree = BUILT_PRODUCTS_DIR; }; 9DB59E962487471900C57C78 /* doNotBuild */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = doNotBuild; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -81,6 +85,8 @@ 9DB59E872487471900C57C78 = { isa = PBXGroup; children = ( + 9D17167B2490184800C83148 /* README.md */, + 9D17167C2490187500C83148 /* LICENSE */, 9DB59E972487471900C57C78 /* joytest */, 9DB59E8F2487471900C57C78 /* Products */, ); @@ -100,6 +106,8 @@ isa = PBXGroup; children = ( 9DB59E982487471900C57C78 /* main.c */, + 9D1716772490096400C83148 /* pdlread.s */, + 9D171678249009C300C83148 /* pdlread.h */, 9DB59E9A2487471900C57C78 /* Makefile */, 9DB59E9C2487471900C57C78 /* make */, 9DB59EB32487471900C57C78 /* Supporting Files */, diff --git a/joytest/Makefile b/joytest/Makefile index 75041b0..dc483fa 100644 --- a/joytest/Makefile +++ b/joytest/Makefile @@ -11,6 +11,9 @@ # include make/head.mk +export CC65_HOME := /Users/jrand/Coding/AppleCoding/Apple2/cc65/cc65 +CC65_BIN=/Users/jrand/Coding/AppleCoding/Apple2/cc65/cc65/bin + # Customize this file to control what gets built, what machines to # target, where in memory to put it, etc. @@ -21,7 +24,7 @@ PGM=joytest # Uncomment the one you want below (the first one is the default): # MACHINE = apple2 # MACHINE = apple2-dos33 -# MACHINE = apple2-system +MACHINE = apple2-system # MACHINE = apple2-loader # MACHINE = apple2-reboot # MACHINE = apple2enh @@ -145,7 +148,7 @@ SRCDIRS+= # If you want to link the joystick driver with your executable, # uncomment the next line. -# DRIVERS += joystick +DRIVERS += joystick # # To use the joystick driver, add code which looks like this to your # project: diff --git a/joytest/main.c b/joytest/main.c index b868ff0..977d18c 100644 --- a/joytest/main.c +++ b/joytest/main.c @@ -9,12 +9,278 @@ #include +#include +#include #include +#include +#include + +#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) { - printf("HELLO, WORLD!\n"); - cgetc(); + joy_install(&a2_joystick_drv); + pollJoystick(); + joy_uninstall(); + return 0; } diff --git a/joytest/make/DevApple.vii b/joytest/make/DevApple.vii index 4f487a9..c235024 100644 Binary files a/joytest/make/DevApple.vii and b/joytest/make/DevApple.vii differ diff --git a/joytest/make/V2Make.scpt b/joytest/make/V2Make.scpt index 7f623e5..756e4bf 100644 Binary files a/joytest/make/V2Make.scpt and b/joytest/make/V2Make.scpt differ diff --git a/joytest/pdlread.h b/joytest/pdlread.h new file mode 100644 index 0000000..e67deeb --- /dev/null +++ b/joytest/pdlread.h @@ -0,0 +1,19 @@ +// +// pdlread.h +// joytest +// +// Created by Jeremy Rand on 2020-06-09. +// Copyright © 2020 Jeremy Rand. All rights reserved. +// + +#ifndef _GUARD_PROJECTjoytest_FILEpdlread_ +#define _GUARD_PROJECTjoytest_FILEpdlread_ + + +#include + + +extern uint8_t pdlRead(uint8_t pdlNum); + + +#endif /* define _GUARD_PROJECTjoytest_FILEpdlread_ */ diff --git a/joytest/pdlread.s b/joytest/pdlread.s new file mode 100644 index 0000000..8097767 --- /dev/null +++ b/joytest/pdlread.s @@ -0,0 +1,23 @@ +; +; pdlread.s +; joytest +; +; Created by Jeremy Rand on 2020-06-09. +; Copyright © 2020 Jeremy Rand. All rights reserved. +; + .include "apple2.inc" + .export _pdlRead + + +; ROM entry points + +PREAD := $FB1E ; Read paddle in X, return AD conv. value in Y + +_pdlRead: + bit $C082 ; Switch in ROM + tax ; Set paddle number + jsr PREAD ; Read paddle value + tya + ldx #$00 + bit $C080 ; Switch in LC bank 2 for R/O + rts