git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

commit ccc8ed1bf6da4413a513dad783365257bc3e6789
parent d094af07c7d207cea6191c1bd6d7b7ea03f81686
Author: Toxa <untoxa@mail.ru>
Date:   Fri, 26 Apr 2024 11:33:48 +0300

SMS/GG refactor joypad polling: support 3 and 6 button controller in joypad()

Diffstat:
Mgbdk-lib/include/sms/hardware.h78+++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Mgbdk-lib/include/sms/sms.h16+++++++++-------
Mgbdk-lib/libc/targets/z80/gg/global.s85++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Mgbdk-lib/libc/targets/z80/gg/pad.s20+++++++++++++-------
Mgbdk-lib/libc/targets/z80/gg/pad_ex.s39++++++++++++++++++++++++---------------
Mgbdk-lib/libc/targets/z80/sms/global.s87++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Mgbdk-lib/libc/targets/z80/sms/pad.s53+++++++++++++++++++++++++++++++++++++++++++++++------
Mgbdk-lib/libc/targets/z80/sms/pad_ex.s36++++++++++++++++++++++--------------
8 files changed, 284 insertions(+), 130 deletions(-)

diff --git a/gbdk-lib/include/sms/hardware.h b/gbdk-lib/include/sms/hardware.h @@ -63,14 +63,33 @@ static volatile SFR AT(0x3E) MEMORY_CTL; static volatile SFR AT(0x3F) JOY_CTL; -#define JOY_P1_LATCH 0b00000010 -#define JOY_P2_LATCH 0b00001000 +#define JOY_P1_TR_DIR_IN 0b00000001 +#define JOY_P1_TR_DIR_OUT 0b00000000 +#define JOY_P1_TH_DIR_IN 0b00000010 +#define GUN_P1_LATCH JOY_P1_TH_DIR_IN +#define JOY_P1_TH_DIR_OUT 0b00000000 +#define JOY_P2_TR_DIR_IN 0b00000100 +#define JOY_P2_TR_DIR_OUT 0b00000000 +#define JOY_P2_TH_DIR_IN 0b00001000 +#define GUN_P2_LATCH JOY_P2_TH_DIR_IN +#define JOY_P2_TH_DIR_OUT 0b00000000 +#define JOY_P1_TR_OUT_HI 0b00010000 +#define JOY_P1_TR_OUT_LO 0b00000000 +#define JOY_P1_TH_OUT_HI 0b00100000 +#define JOY_P1_TH_OUT_LO 0b00000000 +#define JOY_P2_TR_OUT_HI 0b01000000 +#define JOY_P2_TR_OUT_LO 0b00000000 +#define JOY_P2_TH_OUT_HI 0b10000000 +#define JOY_P2_TH_OUT_LO 0b00000000 + +#define JOY_TH_HI (JOY_P1_TR_DIR_IN | JOY_P1_TH_DIR_OUT | JOY_P2_TR_DIR_IN | JOY_P2_TH_DIR_OUT | JOY_P1_TR_OUT_HI | JOY_P1_TH_OUT_HI | JOY_P2_TR_OUT_HI | JOY_P2_TH_OUT_HI) +#define JOY_TH_LO (JOY_P1_TR_DIR_IN | JOY_P1_TH_DIR_OUT | JOY_P2_TR_DIR_IN | JOY_P2_TH_DIR_OUT | JOY_P1_TR_OUT_HI | JOY_P1_TH_OUT_LO | JOY_P2_TR_OUT_HI | JOY_P2_TH_OUT_LO) static volatile SFR AT(0x7E) VCOUNTER; static volatile SFR AT(0x7F) PSG; -#define PSG_LATCH 0x80 +#define PSG_LATCH 0b10000000 #define PSG_CH0 0b00000000 #define PSG_CH1 0b00100000 @@ -174,26 +193,38 @@ extern UBYTE shadow_VDP_R10; static volatile SFR AT(0xDC) JOY_PORT1; -#define JOY_P1_UP 0b00000001 -#define JOY_P1_DOWN 0b00000010 -#define JOY_P1_LEFT 0b00000100 -#define JOY_P1_RIGHT 0b00001000 -#define JOY_P1_SW1 0b00010000 -#define JOY_P1_TRIGGER 0b00010000 -#define JOY_P1_SW2 0b00100000 -#define JOY_P2_UP 0b01000000 -#define JOY_P2_DOWN 0b10000000 +#define JOY_P1_UP 0b00000001 +#define JOY_P1_MD_Z JOY_P1_UP +#define JOY_P1_DOWN 0b00000010 +#define JOY_P1_MD_Y JOY_P1_DOWN +#define JOY_P1_LEFT 0b00000100 +#define JOY_P1_MD_X JOY_P1_LEFT +#define JOY_P1_RIGHT 0b00001000 +#define JOY_P1_MD_MODE JOY_P1_RIGHT +#define JOY_P1_SW1 0b00010000 +#define JOY_P1_TRIGGER JOY_P1_SW1 +#define JOY_P1_MD_A JOY_P1_SW1 +#define JOY_P1_SW2 0b00100000 +#define JOY_P1_MD_START JOY_P1_SW2 +#define JOY_P2_UP 0b01000000 +#define JOY_P2_MD_Z JOY_P2_UP +#define JOY_P2_DOWN 0b10000000 +#define JOY_P2_MD_Y JOY_P2_DOWN static volatile SFR AT(0xDD) JOY_PORT2; -#define JOY_P2_LEFT 0b00000001 -#define JOY_P2_RIGHT 0b00000010 -#define JOY_P2_SW1 0b00000100 -#define JOY_P2_TRIGGER 0b00000100 -#define JOY_P2_SW2 0b00001000 -#define JOY_RESET 0b00010000 -#define JOY_P1_LIGHT 0b01000000 -#define JOY_P2_LIGHT 0b10000000 +#define JOY_P2_LEFT 0b00000001 +#define JOY_P2_MD_X JOY_P2_LEFT +#define JOY_P2_RIGHT 0b00000010 +#define JOY_P2_MD_MODE JOY_P2_RIGHT +#define JOY_P2_SW1 0b00000100 +#define JOY_P2_TRIGGER JOY_P2_SW1 +#define JOY_P2_MD_A JOY_P2_SW1 +#define JOY_P2_SW2 0b00001000 +#define JOY_P2_MD_START JOY_P2_SW2 +#define JOY_RESET 0b00010000 +#define JOY_P1_LIGHT 0b01000000 +#define JOY_P2_LIGHT 0b10000000 static volatile SFR AT(0xF0) FMADDRESS; static volatile SFR AT(0xF1) FMDATA; @@ -213,13 +244,6 @@ static volatile UBYTE AT(0xfffd) MAP_FRAME0; static volatile UBYTE AT(0xfffe) MAP_FRAME1; static volatile UBYTE AT(0xffff) MAP_FRAME2; -extern const UBYTE _BIOS; - -extern const UBYTE _SYSTEM; - -#define SYSTEM_PAL 0x00 -#define SYSTEM_NTSC 0x01 - extern volatile UBYTE VDP_ATTR_SHIFT; #define VBK_TILES 0 diff --git a/gbdk-lib/include/sms/sms.h b/gbdk-lib/include/sms/sms.h @@ -31,6 +31,13 @@ #endif +extern const UBYTE _BIOS; + +extern const UBYTE _SYSTEM; + +#define SYSTEM_PAL 0x00 +#define SYSTEM_NTSC 0x01 + #define VBK_REG VDP_ATTR_SHIFT /** Joypad bits. @@ -52,13 +59,8 @@ #define J_RIGHT 0b00001000 #define J_B 0b00010000 #define J_A 0b00100000 -#if defined(__TARGET_sms) -#define J_SELECT 0b00100000 -#define J_START 0b00010000 -#elif defined(__TARGET_gg) -#define J_SELECT 0b00100000 -#define J_START 0b10000000 -#endif +#define J_START 0b01000000 +#define J_SELECT 0b10000000 /** Screen modes. Normally used by internal functions only. diff --git a/gbdk-lib/libc/targets/z80/gg/global.s b/gbdk-lib/libc/targets/z80/gg/global.s @@ -51,8 +51,27 @@ .JOY_CTL = 0x3F - .JOY_P1_LATCH = 0b00000010 - .JOY_P2_LATCH = 0b00001000 + .JOY_P1_TR_DIR_IN = 0b00000001 + .JOY_P1_TR_DIR_OUT = 0b00000000 + .JOY_P1_TH_DIR_IN = 0b00000010 + .GUN_P1_LATCH = 0b00000010 + .JOY_P1_TH_DIR_OUT = 0b00000000 + .JOY_P2_TR_DIR_IN = 0b00000100 + .JOY_P2_TR_DIR_OUT = 0b00000000 + .JOY_P2_TH_DIR_IN = 0b00001000 + .GUN_P2_LATCH = 0b00001000 + .JOY_P2_TH_DIR_OUT = 0b00000000 + .JOY_P1_TR_OUT_HI = 0b00010000 + .JOY_P1_TR_OUT_LO = 0b00000000 + .JOY_P1_TH_OUT_HI = 0b00100000 + .JOY_P1_TH_OUT_LO = 0b00000000 + .JOY_P2_TR_OUT_HI = 0b01000000 + .JOY_P2_TR_OUT_LO = 0b00000000 + .JOY_P2_TH_OUT_HI = 0b10000000 + .JOY_P2_TH_OUT_LO = 0b00000000 + + .JOY_TH_HI = 0b11110101 + .JOY_TH_LO = 0b01010101 .VDP_VRAM = 0x4000 .VDP_CRAM = 0xC000 @@ -142,37 +161,49 @@ .JOYPAD_COUNT = 1 - .UP = 0b00000001 - .DOWN = 0b00000010 - .LEFT = 0b00000100 - .RIGHT = 0b00001000 - .A = 0b00010000 - .B = 0b00100000 - .SELECT = 0b00100000 ; map to B - .START = 0b10000000 ; Game Gear Start button + .UP = 0b00000001 + .DOWN = 0b00000010 + .LEFT = 0b00000100 + .RIGHT = 0b00001000 + .A = 0b00010000 + .B = 0b00100000 + .START = 0b01000000 + .SELECT = 0b10000000 .JOY_PORT1 = 0xDC - .JOY_P1_UP = 0b00000001 - .JOY_P1_DOWN = 0b00000010 - .JOY_P1_LEFT = 0b00000100 - .JOY_P1_RIGHT = 0b00001000 - .JOY_P1_SW1 = 0b00010000 - .JOY_P1_TRIGGER = 0b00010000 - .JOY_P1_SW2 = 0b00100000 - .JOY_P2_UP = 0b01000000 - .JOY_P2_DOWN = 0b10000000 + .JOY_P1_UP = 0b00000001 + .JOY_P1_MD_Z = 0b00000001 + .JOY_P1_DOWN = 0b00000010 + .JOY_P1_MD_Y = 0b00000010 + .JOY_P1_LEFT = 0b00000100 + .JOY_P1_MD_X = 0b00000100 + .JOY_P1_RIGHT = 0b00001000 + .JOY_P1_MD_MODE = 0b00001000 + .JOY_P1_SW1 = 0b00010000 + .JOY_P1_TRIGGER = 0b00010000 + .JOY_P1_MD_A = 0b00010000 + .JOY_P1_SW2 = 0b00100000 + .JOY_P1_MD_START = 0b00100000 + .JOY_P2_UP = 0b01000000 + .JOY_P2_MD_Z = 0b01000000 + .JOY_P2_DOWN = 0b10000000 + .JOY_P2_MD_Y = 0b10000000 .JOY_PORT2 = 0xDD - .JOY_P2_LEFT = 0b00000001 - .JOY_P2_RIGHT = 0b00000010 - .JOY_P2_SW1 = 0b00000100 - .JOY_P2_TRIGGER = 0b00000100 - .JOY_P2_SW2 = 0b00001000 - .JOY_RESET = 0b00010000 - .JOY_P1_LIGHT = 0b01000000 - .JOY_P2_LIGHT = 0b10000000 + .JOY_P2_LEFT = 0b00000001 + .JOY_P2_MD_X = 0b00000001 + .JOY_P2_RIGHT = 0b00000010 + .JOY_P2_MD_MODE = 0b00000010 + .JOY_P2_SW1 = 0b00000100 + .JOY_P2_TRIGGER = 0b00000100 + .JOY_P2_MD_A = 0b00000100 + .JOY_P2_SW2 = 0b00001000 + .JOY_P2_MD_START = 0b00001000 + .JOY_RESET = 0b00010000 + .JOY_P1_LIGHT = 0b01000000 + .JOY_P2_LIGHT = 0b10000000 .FMADDRESS = 0xF0 .FMDATA = 0xF1 diff --git a/gbdk-lib/libc/targets/z80/gg/pad.s b/gbdk-lib/libc/targets/z80/gg/pad.s @@ -9,12 +9,18 @@ _joypad:: .jpad:: in a, (.JOY_PORT1) cpl - and #0b00111111 + and #(.JOY_P1_UP | .JOY_P1_DOWN | .JOY_P1_LEFT | .JOY_P1_RIGHT | .JOY_P1_SW1 | .JOY_P1_SW2) + ld l, a + and #.JOY_P1_SW2 + rlca + rlca + or l ; .SELECT = .JOY_P1_SW2 ld l, a in a, (.GG_STATE) cpl and #.GGSTATE_STT - or l + rrca + or l ; .START = .GGSTATE_STT ld l, a ret @@ -22,15 +28,15 @@ _joypad:: .padup:: _waitpadup:: 1$: - ld h,#0x7f ; wait for .jpad return zero 127 times in a row + ld h, #0x7f ; wait for .jpad return zero 127 times in a row 2$: call .jpad or a ; have all buttons been released? - jr nz,1$ ; not yet + jr nz, 1$ ; not yet dec h - jr nz,2$ - + jr nz, 2$ + ret ;; Wait for the key to be pressed @@ -40,5 +46,5 @@ _waitpad:: 1$: call .jpad ; read pad and h ; compare with mask? - jr z,1$ ; loop if no intersection + jr z, 1$ ; loop if no intersection ret diff --git a/gbdk-lib/libc/targets/z80/gg/pad_ex.s b/gbdk-lib/libc/targets/z80/gg/pad_ex.s @@ -22,21 +22,21 @@ _joypad_init:: ld e, (hl) inc hl ld d, (hl) - + inc hl pop bc ; pop return address ld sp, hl ; dispose params - push bc ; push return address back - + push bc ; push return address back + ld (de), a ; number of joypads ld l, a ; return number of joypads in l xor a inc de - ld (de), a + ld (de), a inc de - ld (de), a + ld (de), a inc de - ld (de), a + ld (de), a inc de ld (de), a @@ -45,9 +45,11 @@ _joypad_init:: ;void joypad_ex(joypads_t * joypads) __z88dk_fastcall; _joypad_ex:: + inc hl ; hl = joypads[] in a, (.GG_STATE) cpl and #.GGSTATE_STT + rrca ; .START = .GGSTATE_STT ld b, a ld c, #.JOY_PORT1 in e, (c) @@ -60,17 +62,24 @@ _joypad_ex:: rl d ld a, e cpl - and #0b00111111 - or b + and #(.JOY_P1_UP | .JOY_P1_DOWN | .JOY_P1_LEFT | .JOY_P1_RIGHT | .JOY_P1_SW1 | .JOY_P1_SW2) ld e, a + and #.JOY_P1_SW2 + rlca + rlca + or e + or b + ld (hl), a ; joypads[0] = buttons1 + inc hl + ld a, d cpl - and #0b00111111 + and #(.JOY_P1_UP | .JOY_P1_DOWN | .JOY_P1_LEFT | .JOY_P1_RIGHT | .JOY_P1_SW1 | .JOY_P1_SW2) ld d, a - - inc hl - ld (hl), e - inc hl - ld (hl), d - + and #(.JOY_P1_SW1 | .JOY_P1_SW2) + rlca + rlca + or d + ld (hl), a ; joypads[1] = buttons2 + ret diff --git a/gbdk-lib/libc/targets/z80/sms/global.s b/gbdk-lib/libc/targets/z80/sms/global.s @@ -51,8 +51,27 @@ .JOY_CTL = 0x3F - .JOY_P1_LATCH = 0b00000010 - .JOY_P2_LATCH = 0b00001000 + .JOY_P1_TR_DIR_IN = 0b00000001 + .JOY_P1_TR_DIR_OUT = 0b00000000 + .JOY_P1_TH_DIR_IN = 0b00000010 + .GUN_P1_LATCH = 0b00000010 + .JOY_P1_TH_DIR_OUT = 0b00000000 + .JOY_P2_TR_DIR_IN = 0b00000100 + .JOY_P2_TR_DIR_OUT = 0b00000000 + .JOY_P2_TH_DIR_IN = 0b00001000 + .GUN_P2_LATCH = 0b00001000 + .JOY_P2_TH_DIR_OUT = 0b00000000 + .JOY_P1_TR_OUT_HI = 0b00010000 + .JOY_P1_TR_OUT_LO = 0b00000000 + .JOY_P1_TH_OUT_HI = 0b00100000 + .JOY_P1_TH_OUT_LO = 0b00000000 + .JOY_P2_TR_OUT_HI = 0b01000000 + .JOY_P2_TR_OUT_LO = 0b00000000 + .JOY_P2_TH_OUT_HI = 0b10000000 + .JOY_P2_TH_OUT_LO = 0b00000000 + + .JOY_TH_HI = 0b11110101 + .JOY_TH_LO = 0b01010101 .VDP_VRAM = 0x4000 .VDP_CRAM = 0xC000 @@ -140,39 +159,53 @@ .R10_INT_OFF = 0xFF .R10_INT_EVERY = 0x00 - .UP = 0b00000001 - .DOWN = 0b00000010 - .LEFT = 0b00000100 - .RIGHT = 0b00001000 - .A = 0b00010000 - .B = 0b00100000 - .SELECT = 0b00100000 ; map to B - .START = 0b00010000 ; map to A + .UP = 0b00000001 + .DOWN = 0b00000010 + .LEFT = 0b00000100 + .RIGHT = 0b00001000 + .A = 0b00010000 + .B = 0b00100000 + .START = 0b01000000 + .SELECT = 0b10000000 .JOYPAD_COUNT = 2 .JOY_PORT1 = 0xDC - .JOY_P1_UP = 0b00000001 - .JOY_P1_DOWN = 0b00000010 - .JOY_P1_LEFT = 0b00000100 - .JOY_P1_RIGHT = 0b00001000 - .JOY_P1_SW1 = 0b00010000 - .JOY_P1_TRIGGER = 0b00010000 - .JOY_P1_SW2 = 0b00100000 - .JOY_P2_UP = 0b01000000 - .JOY_P2_DOWN = 0b10000000 + .JOY_PORT1 = 0xDC + + .JOY_P1_UP = 0b00000001 + .JOY_P1_MD_Z = 0b00000001 + .JOY_P1_DOWN = 0b00000010 + .JOY_P1_MD_Y = 0b00000010 + .JOY_P1_LEFT = 0b00000100 + .JOY_P1_MD_X = 0b00000100 + .JOY_P1_RIGHT = 0b00001000 + .JOY_P1_MD_MODE = 0b00001000 + .JOY_P1_SW1 = 0b00010000 + .JOY_P1_TRIGGER = 0b00010000 + .JOY_P1_MD_A = 0b00010000 + .JOY_P1_SW2 = 0b00100000 + .JOY_P1_MD_START = 0b00100000 + .JOY_P2_UP = 0b01000000 + .JOY_P2_MD_Z = 0b01000000 + .JOY_P2_DOWN = 0b10000000 + .JOY_P2_MD_Y = 0b10000000 .JOY_PORT2 = 0xDD - .JOY_P2_LEFT = 0b00000001 - .JOY_P2_RIGHT = 0b00000010 - .JOY_P2_SW1 = 0b00000100 - .JOY_P2_TRIGGER = 0b00000100 - .JOY_P2_SW2 = 0b00001000 - .JOY_RESET = 0b00010000 - .JOY_P1_LIGHT = 0b01000000 - .JOY_P2_LIGHT = 0b10000000 + .JOY_P2_LEFT = 0b00000001 + .JOY_P2_MD_X = 0b00000001 + .JOY_P2_RIGHT = 0b00000010 + .JOY_P2_MD_MODE = 0b00000010 + .JOY_P2_SW1 = 0b00000100 + .JOY_P2_TRIGGER = 0b00000100 + .JOY_P2_MD_A = 0b00000100 + .JOY_P2_SW2 = 0b00001000 + .JOY_P2_MD_START = 0b00001000 + .JOY_RESET = 0b00010000 + .JOY_P1_LIGHT = 0b01000000 + .JOY_P2_LIGHT = 0b10000000 .FMADDRESS = 0xF0 .FMDATA = 0xF1 diff --git a/gbdk-lib/libc/targets/z80/sms/pad.s b/gbdk-lib/libc/targets/z80/sms/pad.s @@ -9,7 +9,48 @@ _joypad:: .jpad:: in a, (.JOY_PORT1) cpl - and #0b00111111 + and #(.JOY_P1_UP | .JOY_P1_DOWN | .JOY_P1_LEFT | .JOY_P1_RIGHT | .JOY_P1_SW1 | .JOY_P1_SW2) + ld l, a + + ld a, #.JOY_TH_LO + out (.JOY_CTL), a + + in a, (.JOY_PORT1) + ld h, a + and #(.JOY_P1_LEFT | .JOY_P1_RIGHT) + jp z, 1$ + + ld a, h ; three button controller detected + cpl + ld h, a + and #.JOY_P1_MD_START ; .START = .JOY_P1_MD_START << 1 + rlca + or l + ld l, a + ld a, h + and #.JOY_P1_MD_A ; .SELECT = .JOY_P1_MD_A << 3 + rlca + rlca + rlca + or l + ld l, a + + .rept 3 ; skip 6-button controller keys + ld a, #.JOY_TH_HI + out (.JOY_CTL), a + ld a, #.JOY_TH_LO + out (.JOY_CTL), a + .endm + + ld a, #.JOY_TH_HI + out (.JOY_CTL), a + ret +1$: + ld a, l ; copy buttons 1 and 2 into start and select + and #(.JOY_P1_SW1 | .JOY_P1_SW2) + rlca + rlca + or l ; .START = .JOY_P1_SW1, .SELECT = .JOY_P1_SW2 ld l, a ret @@ -17,15 +58,15 @@ _joypad:: .padup:: _waitpadup:: 1$: - ld h,#0x7f ; wait for .jpad return zero 127 times in a row + ld h, #0x7f ; wait for .jpad return zero 127 times in a row 2$: call .jpad or a ; have all buttons been released? - jr nz,1$ ; not yet + jr nz, 1$ ; not yet dec h - jr nz,2$ - + jr nz, 2$ + ret ;; Wait for the key to be pressed @@ -35,5 +76,5 @@ _waitpad:: 1$: call .jpad ; read pad and h ; compare with mask? - jr z,1$ ; loop if no intersection + jr z, 1$ ; loop if no intersection ret diff --git a/gbdk-lib/libc/targets/z80/sms/pad_ex.s b/gbdk-lib/libc/targets/z80/sms/pad_ex.s @@ -22,21 +22,21 @@ _joypad_init:: ld e, (hl) inc hl ld d, (hl) - + inc hl pop bc ; pop return address ld sp, hl ; dispose params - push bc ; push return address back - + push bc ; push return address back + ld (de), a ; number of joypads ld l, a ; return number of joypads in l xor a inc de - ld (de), a + ld (de), a inc de - ld (de), a + ld (de), a inc de - ld (de), a + ld (de), a inc de ld (de), a @@ -45,6 +45,7 @@ _joypad_init:: ;void joypad_ex(joypads_t * joypads) __z88dk_fastcall; _joypad_ex:: + inc hl ; hl = joypads[] ld c, #.JOY_PORT1 in e, (c) inc c @@ -56,16 +57,23 @@ _joypad_ex:: rl d ld a, e cpl - and #0b00111111 + and #(.JOY_P1_UP | .JOY_P1_DOWN | .JOY_P1_LEFT | .JOY_P1_RIGHT | .JOY_P1_SW1 | .JOY_P1_SW2) ld e, a + and #(.JOY_P1_SW1 | .JOY_P1_SW2) + rlca + rlca + or e + ld (hl), a ; joypads[0] = buttons1 + inc hl + ld a, d cpl - and #0b01111111 + and #(.JOY_P1_UP | .JOY_P1_DOWN | .JOY_P1_LEFT | .JOY_P1_RIGHT | .JOY_P1_SW1 | .JOY_P1_SW2) ld d, a - - inc hl - ld (hl), e - inc hl - ld (hl), d - + and #(.JOY_P1_SW1 | .JOY_P1_SW2) + rlca + rlca + or d + ld (hl), a ; joypads[1] = buttons2 + ret

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.