#IFNDEF __lib_joystick #DEFINE __lib_joystick 1 GOTO __skip_lib_joystick // ============================================================================ // JOYSTICK INPUT DRIVER FOR COMMODORE 64 // ============================================================================ // This library provides joystick input reading for the Commodore 64. // // Joystick reading uses CIA port 2 ($DC00) which is preferred for games // Port 1 ($DC01) conflicts with keyboard matrix scanning // // Usage: // #INCLUDE "joystick.c65" // WHILE 1 // joy_read() // BYTE test_bit // test_bit = joy_state & JOY_UP_MASK // IF test_bit // // handle up // ENDIF // WEND // ============================================================================ // CIA Port addresses WORD CONST JOY_PORT1 = $DC01 // Port 1 (conflicts with keyboard) WORD CONST JOY_PORT2 = $DC00 // Port 2 (recommended for games) // Joystick bit masks (active low - 0 = pressed) BYTE CONST JOY_UP_MASK = %00000001 // Bit 0 BYTE CONST JOY_DOWN_MASK = %00000010 // Bit 1 BYTE CONST JOY_LEFT_MASK = %00000100 // Bit 2 BYTE CONST JOY_RIGHT_MASK = %00001000 // Bit 3 BYTE CONST JOY_FIRE_MASK = %00010000 // Bit 4 // Joystick state variable BYTE joy_state // Inverted joystick state (1=pressed, 0=not pressed) // ============================================================================ // FUNC joy_read_port1 // Read joystick port 1 (alternative port, may conflict with keyboard) // Updates the same joy_state variable as joy_read() // ============================================================================ FUNC joy_read_port1 BYTE joy_raw joy_raw = PEEK JOY_PORT1 joy_state = joy_raw ^ $FF // Invert bits: 1=pressed, 0=not pressed FEND // ============================================================================ // FUNC joy_read // Read joystick port 2 and update state variable // Call this every frame to update joystick state // Inverts active-low CIA bits to active-high (1=pressed, 0=not pressed) // ============================================================================ FUNC joy_read_port2 BYTE joy_raw joy_raw = PEEK JOY_PORT2 joy_state = joy_raw ^ $FF // Invert bits: 1=pressed, 0=not pressed FEND LABEL __skip_lib_joystick #IFEND