From 3fc7e6ef1c5d644a6786bbd1aa3e1a2836d7aaa7 Mon Sep 17 00:00:00 2001 From: kub Date: Tue, 7 Jan 2025 23:25:28 +0100 Subject: [PATCH] pico, revisit kbd handling --- pico/pico.h | 4 ++-- pico/pico/memory.c | 14 +++++--------- platform/common/emu.c | 14 +++++--------- platform/common/input_pico.h | 6 ++---- platform/common/inputmap_kbd.c | 1 - platform/common/menu_pico.c | 2 +- platform/common/menu_pico.h | 1 + 7 files changed, 16 insertions(+), 26 deletions(-) diff --git a/pico/pico.h b/pico/pico.h index 25cf8776f..b2c8a3678 100644 --- a/pico/pico.h +++ b/pico/pico.h @@ -77,6 +77,7 @@ extern void *p32x_bios_g, *p32x_bios_m, *p32x_bios_s; #define POPT_DIS_FM_SSGEG (1<<23) #define POPT_EN_FM_DAC (1<<24) //x00 0000 #define POPT_EN_FM_FILTER (1<<25) +#define POPT_EN_PICO_KBD (1<<26) #define PAHW_MCD (1<<0) #define PAHW_32X (1<<1) @@ -178,6 +179,7 @@ typedef struct uint64_t time_keydown; uint8_t key_state; uint8_t shift_state; + uint8_t active; } picohw_kb; typedef struct { @@ -188,8 +190,6 @@ typedef struct unsigned int reserved[3]; unsigned char xpcm_buffer[XPCM_BUFFER_SIZE+4]; unsigned char *xpcm_ptr; - int is_kb_active; - int inp_mode; picohw_kb kb; } picohw_state; extern picohw_state PicoPicohw; diff --git a/pico/pico/memory.c b/pico/pico/memory.c index e49f27dcf..116990ece 100644 --- a/pico/pico/memory.c +++ b/pico/pico/memory.c @@ -57,11 +57,7 @@ static u32 PicoRead16_pico(u32 a) case 0x08: d = (PicoPicohw.pen_pos[1] >> 8); break; case 0x0a: d = PicoPicohw.pen_pos[1] & 0xff; break; case 0x0c: d = (1 << (PicoPicohw.page & 7)) - 1; - if (PicoPicohw.page == 7) { - d = 0x2a; // 0b00101010 - } else { - d = ((1 << (PicoPicohw.page & 7)) - 1); - } + if (PicoPicohw.page == 7) d = 0x2a; // 0b00101010 break; case 0x10: d = (PicoPicohw.fifo_bytes > 0x3f) ? 0 : (0x3f - PicoPicohw.fifo_bytes); break; case 0x12: d = (PicoPicohw.fifo_bytes | !PicoPicoPCMBusyN()) ? 0 : 0x8000; @@ -127,7 +123,7 @@ static void PicoWrite16_pico(u32 a, u32 d) PicoPicohw.fifo_bytes = 0; PicoPicoPCMResetN(1); } - // other bits used in software: 0x3f00. + // TODO: other bits used in software: 0x3f00. } else elprintf(EL_UIO, "m68k unmapped w16 [%06x] %04x @%06x", a, d & 0xffff, SekPc); @@ -136,7 +132,7 @@ static void PicoWrite16_pico(u32 a, u32 d) static u32 PicoRead8_pico_kb(u32 a) { u32 d = 0; - if (PicoPicohw.is_kb_active == 0) { + if (!(PicoIn.opt & POPT_EN_PICO_KBD)) { elprintf(EL_PICOHW, "kb: r @%06X %04X = %04X\n", SekPc, a, d); return d; } @@ -178,7 +174,7 @@ static u32 PicoRead8_pico_kb(u32 a) case 0x6: d = 0; // l&kbtype break; case 0x7: // cap/num/scr - if (PicoPicohw.inp_mode == 3) { + if (PicoPicohw.kb.active) { if (key == PEVB_PICO_PS2_CAPSLOCK && PicoPicohw.kb.has_caps_lock == 1) { PicoPicohw.kb.caps_lock = PicoPicohw.kb.caps_lock == 4 ? 0 : 4; PicoPicohw.kb.has_caps_lock = 0; @@ -188,7 +184,7 @@ static u32 PicoRead8_pico_kb(u32 a) break; case 0x8: d = 6; - if (PicoPicohw.inp_mode == 3) { + if (PicoPicohw.kb.active) { if (key) { PicoPicohw.kb.key_state = KEY_DOWN; } diff --git a/platform/common/emu.c b/platform/common/emu.c index 510fb1727..35434dbba 100644 --- a/platform/common/emu.c +++ b/platform/common/emu.c @@ -1148,7 +1148,7 @@ void run_events_pico(unsigned int events) } if (events & PEV_PICO_PAD) { if (pico_inp_mode == 2) { - pico_inp_mode = (PicoPicohw.is_kb_active ? 3 : 0); + pico_inp_mode = (PicoIn.opt & POPT_EN_PICO_KBD ? 3 : 0); emu_status_msg("Input: %s", pico_inp_mode ? "Keyboard" : "D-Pad"); } else if (pico_inp_mode == 3) { pico_inp_mode = 0; @@ -1164,18 +1164,14 @@ void run_events_pico(unsigned int events) emu_status_msg("Pen %s", PicoPicohw.pen_pos[0] & 0x8000 ? "Up" : "Down"); } - if ((currentConfig.EmuOpt & EOPT_PICO_PEN) && - (PicoIn.pad[0]&0x20) && pico_inp_mode && pico_overlay) { + if (((currentConfig.EmuOpt & EOPT_PICO_PEN) && + (PicoIn.pad[0]&0x20) && pico_inp_mode && pico_overlay) || + (!(PicoIn.opt & POPT_EN_PICO_KBD) && pico_inp_mode == 3)) { pico_inp_mode = 0; emu_status_msg("Input: D-Pad"); } - if (events & PEV_PICO_SWPS2) { - PicoPicohw.is_kb_active = !PicoPicohw.is_kb_active; - if (pico_inp_mode == 3) pico_inp_mode = 0; - emu_status_msg("Keyboard %sconnected", PicoPicohw.is_kb_active ? "" : "dis"); - } - PicoPicohw.inp_mode = pico_inp_mode; + PicoPicohw.kb.active = pico_inp_mode == 3; if (pico_inp_mode == 0 || pico_inp_mode == 3) return; diff --git a/platform/common/input_pico.h b/platform/common/input_pico.h index 47d9554d4..6ed713857 100644 --- a/platform/common/input_pico.h +++ b/platform/common/input_pico.h @@ -30,8 +30,7 @@ #define PEVB_PICO_STORY 19 #define PEVB_PICO_PAD 18 #define PEVB_PICO_PENST 17 -#define PEVB_PICO_SWPS2 16 -#define PEVB_RESET 15 +#define PEVB_RESET 16 #define PEV_VOL_DOWN (1 << PEVB_VOL_DOWN) #define PEV_VOL_UP (1 << PEVB_VOL_UP) @@ -47,10 +46,9 @@ #define PEV_PICO_STORY (1 << PEVB_PICO_STORY) #define PEV_PICO_PAD (1 << PEVB_PICO_PAD) #define PEV_PICO_PENST (1 << PEVB_PICO_PENST) -#define PEV_PICO_SWPS2 (1 << PEVB_PICO_SWPS2) #define PEV_RESET (1 << PEVB_RESET) -#define PEV_MASK 0x7fff8000 +#define PEV_MASK 0x7fff0000 /* Keyboard Pico */ diff --git a/platform/common/inputmap_kbd.c b/platform/common/inputmap_kbd.c index 022638d5e..dbe8c2f0d 100644 --- a/platform/common/inputmap_kbd.c +++ b/platform/common/inputmap_kbd.c @@ -32,7 +32,6 @@ const struct in_default_bind _in_sdl_defbinds[] = { { SDLK_F8, IN_BINDTYPE_EMU, PEVB_PICO_STORY }, { SDLK_F9, IN_BINDTYPE_EMU, PEVB_PICO_PAD }, { SDLK_F10, IN_BINDTYPE_EMU, PEVB_PICO_PENST }, - { SDLK_F12, IN_BINDTYPE_EMU, PEVB_PICO_SWPS2 }, { SDLK_BACKSPACE, IN_BINDTYPE_EMU, PEVB_FF }, { 0, 0, 0 } diff --git a/platform/common/menu_pico.c b/platform/common/menu_pico.c index 78342c095..556616b14 100644 --- a/platform/common/menu_pico.c +++ b/platform/common/menu_pico.c @@ -375,7 +375,6 @@ me_bind_action emuctrl_actions[] = { "Pico Storyware ", PEV_PICO_STORY }, { "Pico Pad ", PEV_PICO_PAD }, { "Pico Pen state ", PEV_PICO_PENST }, - { "Pico Keyboard ", PEV_PICO_SWPS2 }, { NULL, 0 } }; @@ -486,6 +485,7 @@ static menu_entry e_menu_md_options[] = mee_onoff_h ("FM filter", MA_OPT_FM_FILTER, PicoIn.opt, POPT_EN_FM_FILTER, h_fmfilter), mee_onoff_h ("FM DAC noise", MA_OPT2_ENABLE_YM_DAC, PicoIn.opt, POPT_EN_FM_DAC, h_dacnoise), mee_onoff_h ("Pen button shows screen", MA_OPT_PICO_PEN, currentConfig.EmuOpt, EOPT_PICO_PEN, h_picopen), + mee_onoff ("Pico Keyboard", MA_OPT_PICO_KBD, PicoIn.opt, POPT_EN_PICO_KBD), mee_end, }; diff --git a/platform/common/menu_pico.h b/platform/common/menu_pico.h index 59e6af80b..2b37c4f85 100644 --- a/platform/common/menu_pico.h +++ b/platform/common/menu_pico.h @@ -51,6 +51,7 @@ typedef enum MA_OPT_SOUND_ALPHA, MA_OPT_FM_FILTER, MA_OPT_PICO_PEN, + MA_OPT_PICO_KBD, MA_OPT2_GAMMA, MA_OPT2_A_SN_GAMMA, MA_OPT2_DBLBUFF, /* giz */