MSXはアンドロイドの夢を見るか9

IS01のキーボードが正常に認識しない問題ですが、まずはSDLの仕様で「/」が認識しないため以下を修正。

SDL_androidkeyboard.c

static SDL_scancode
TranslateKeycode(int keycode)
{
    SDL_scancode scancode = SDL_SCANCODE_UNKNOWN;

    if (keycode < SDL_arraysize(Android_Keycodes)) {
        scancode = Android_Keycodes[keycode];
    }
    if (scancode == SDL_SCANCODE_UNKNOWN) {
	return SDL_SCANCODE_SLASH;
    }
    return scancode;
}

また、IS01の仕様で特殊キーや、足りないキーに対応する。具体的には「Alt」で切り替える。

SDLgfx.c

#include <SDL.h>

#ifdef _IS01
static int alt=0;
#endif

(省略)

      /***********************************/
      /* OTHER KEYS: reset bit in KeyMap */
      /***********************************/
#ifdef _IS01
	  if (key==SDLK_LALT) {
		  key=SDLK_UNKNOWN;
      }
	  if (key==0x7f) key=0x8;
	  if (key==0x400000e1) key=0x130;
	  if (key==0x400000e5) key=0x13f;
	  if (key==0x4000004e) key=0x133;
	  if (key==0x4000004b) key=0x134;
	  if (key==0x4000010c) {
		  XKeyMap[Keys[0x132][0]]&=~Keys[0x132][1];
		  key=0x121;
	  }
	  if (key==0x40000051) key=0x112;
	  if (key==0x40000052) key=0x111;
	  if (key==0x4000004f) key=0x113;
	  if (key==0x40000050) key=0x114;
	  if (key==0x40000076) key=0x116; // MENU
	  if (alt && key==SDLK_l) key=SDLK_SEMICOLON;
	  if (alt && key==SDLK_SLASH) key=SDLK_QUOTE;
	  if (alt && key==SDLK_COMMA) key=SDLK_RIGHTBRACKET;
	  if (alt && key==SDLK_PERIOD) key=0x60;
	  if (alt && key==SDLK_p) key=SDLK_LEFTBRACKET;
	  if (alt && key==SDLK_MINUS) key=SDLK_BACKSLASH;
	  if (alt && key==SDLK_0) key=SDLK_EQUALS;
	  if (alt && key==SDLK_q) key=SDLK_TAB;
	  if (alt && key==SDLK_1) key=0x11a;
	  if (alt && key==SDLK_2) key=0x11b;
	  if (alt && key==SDLK_3) key=0x11c;
	  if (alt && key==SDLK_4) key=0x11d;
	  if (alt && key==SDLK_5) key=0x11e;
	  if (alt && key==0x8) key=0x115;
	  if (alt && key==SDLK_m) key=0x131;
      if(key<0x150) XKeyMap[Keys[key][0]]&=~Keys[key][1];
#else
	  if (key==SDLK_END) key=0x60;
	  if (key==SDLK_RCTRL) key=0x131;
      if(key<0x150) XKeyMap[Keys[key][0]]&=~Keys[key][1];
#endif
    }

    /****************/
    /* KEY RELEASED */
    /****************/
    
    if(event.type==SDL_KEYUP) {	

      /* Special keys released... */
      switch(key)
	{
	case SDLK_UP:    JoyState&=0xFE;break;
	case SDLK_DOWN:  JoyState&=0xFD;break;
	case SDLK_LEFT:  JoyState&=0xFB;break;
	case SDLK_RIGHT: JoyState&=0xF7;break;
	case SDLK_LALT:  JoyState&=0xEF;break;
	case SDLK_LCTRL: JoyState&=0xDF;Control=0;break;
	}

#ifdef _IS01
	  if (key==SDLK_LALT) {
		  key=SDLK_UNKNOWN;
		  alt++;
		  if (alt > 1) alt=0;
      }
	  if (key==0x7f) key=0x8;
	  if (key==0x400000e1) key=0x130;
	  if (key==0x400000e5) key=0x13f;
	  if (key==0x4000004e) key=0x133;
	  if (key==0x4000004b) key=0x134;
	  if (key==0x4000010c) {
		  XKeyMap[Keys[0x132][0]]|=Keys[0x132][1];
		  key=0x121;
      }
	  if (key==0x40000051) key=0x112;
	  if (key==0x40000052) key=0x111;
	  if (key==0x4000004f) key=0x113;
	  if (key==0x40000050) key=0x114;
	  if (key==0x40000076) key=0x116; // MENU
	  if (alt && key==SDLK_l) key=SDLK_SEMICOLON;
	  if (alt && key==SDLK_SLASH) key=SDLK_QUOTE;
	  if (alt && key==SDLK_COMMA) key=SDLK_RIGHTBRACKET;
	  if (alt && key==SDLK_PERIOD) key=0x60;
	  if (alt && key==SDLK_p) key=SDLK_LEFTBRACKET;
	  if (alt && key==SDLK_MINUS) key=SDLK_BACKSLASH;
	  if (alt && key==SDLK_0) key=SDLK_EQUALS;
	  if (alt && key==SDLK_q) key=SDLK_TAB;
	  if (alt && key==SDLK_1) key=0x11a;
	  if (alt && key==SDLK_2) key=0x11b;
	  if (alt && key==SDLK_3) key=0x11c;
	  if (alt && key==SDLK_4) key=0x11d;
	  if (alt && key==SDLK_5) key=0x11e;
	  if (alt && key==0x8) key=0x115;
	  if (alt && key==SDLK_m) key=0x131;
      if(key<0x150) XKeyMap[Keys[key][0]]|=Keys[key][1];
#else
	  if (key==SDLK_END) key=0x60;
	  if (key==SDLK_RCTRL) key=0x131;
      /* Key released: set bit in KeyMap */
      if(key<0x150) XKeyMap[Keys[key][0]]|=Keys[key][1];
#endif