millfork/include/x16_joy.mfk

100 lines
1.7 KiB
Plaintext

import joy
void x16_reset_joy() {
input_dx = 0
input_dy = 0
input_a = 0
input_b = 0
input_x = 0
input_y = 0
input_start = 0
input_select = 0
input_l = 0
input_r = 0
}
alias reset_joy = x16_reset_joy!
// TODO: be more controller-agnostic?
// SNES:B NES:A keyboard:Ctrl
alias input_b = input_btn
// SNES:A
byte input_a
// SNES:X
byte input_x
// SNES:Y NES:B keyboard:Alt
byte input_y
// SNES/NES:Start keyboard:Enter
byte input_start
// SNES/NES:Select keyboard:Space
byte input_select
// SNES:L
byte input_l
// SNES:R
byte input_r
enum x16_joy_type {
joy_nes = 0
joy_keyboard = 1
joy_snes = 15
joy_none = 255
}
x16_joy_type joy_type
void read_joy1() {
x16_reset_joy()
read_also_joy1()
}
void read_joy2() {
x16_reset_joy()
read_also_joy2()
}
inline void read_also_joy1() {
__read_joy(0)
}
inline void read_also_joy2() {
__read_joy(1)
}
asm void __read_joy(byte register(a) joy_id) {
JSR $FF53 // TODO: should we?
JSR $FF56
STY joy_type
CPY #0
BMI __read_joy_skip
PHX
JSR x16_joy_byte0
PLA
JSR x16_joy_byte1
__read_joy_skip:
RTS
}
void x16_joy_byte0(byte value) {
if value & 8 == 0 { input_dy -= 1 }
if value & 4 == 0 { input_dy += 1 }
if value & 2 == 0 { input_dx -= 1 }
if value & 1 == 0 { input_dx += 1 }
if value & 16 == 0 { input_start += 1 }
if value & 32 == 0 { input_select += 1 }
if value & 64 == 0 { input_y += 1 }
if value & 128 == 0 { input_b += 1 }
}
void x16_joy_byte1(byte value) {
if value & 16 == 0 { input_r += 1 }
if value & 32 == 0 { input_l += 1 }
if value & 64 == 0 { input_x += 1 }
if value & 128 == 0 { input_a += 1 }
joy_type = x16_joy_type(value & 15)
}