This is a simple program demonstrating how to interface with a CPSF or CPSF-MD joystick. Refer to the following page for joystick register [[joystick_regs|reference]]. Using a second CPSF should follow the same technique but with joyport_b, IOC5 and PC5. It can be compiled with the Lydux toolchain with the following commands: $ human68k-gcc joytest.c -liocs $ human68k-objcopy -O xfile a.out joytest.x Code: // This is a simple program demonstrating how to interface with a CPSF or CPSF-MD joystick // Using a second CPSF should follow the same technique but with joyport_b, IOC4 and PC5 #include #include #include volatile uint8_t *joyport_a = (uint8_t*)0xE9A001; volatile uint8_t *joyport_b = (uint8_t*)0xE9A003; volatile uint8_t *joyport_c = (uint8_t*)0xE9A005; // joy control uint8_t *joycontrolword = (uint8_t*)0xE9A007; // if bit 7 = 0, bit manipulation. if bit 7 = 1, mode setting uint8_t joyport_c_old=0; int main(int argc, char *argv[]) { uint16_t port1 = 0; uint32_t usp = 0; // clear screen printf("\e[2J"); // this is working for all buttons with a CPSF or CPSF-MD usp = _iocs_b_super(0); // set IOC4 to 1, disables joystick 1 processing // preserves ADPCM settings joyport_c_old = *joyport_c; *joyport_c = 16|joyport_c_old; while(1) { port1=0; // move cursor to origin printf("\e[;0H"); printf("CPSF Controller Tester\n"); printf("Press ESC to quit.\n\n"); // unset PC4, this is the controller clock/button group select pin *joycontrolword = 8; // read joyport a bits port1 |= (~*joyport_a)<<8; // set PC4 *joycontrolword = 9; // read joyport a bits port1 |= (uint8_t)(~*joyport_a); printf("0x%04X\n", port1); // quit on ESC if(_dos_inpout(0xFF)==0x1B){ *joycontrolword = 8; *joyport_c = joyport_c_old; _iocs_b_super(usp); return 0; } } }