オリジナルに対する修正箇所

////////////////////////////////////////////////////////////////////////

全体的に Unicode 化(char* => wchar_t*)
「C/C++」=>「詳細設定」=>「コンパイル言語の設定」を「C++ コードとしてコンパイル」に変更
(64bit対応のための修正時、コンパイラの警告を分かりやすくするため)
「kmz80 以下の *.c のみ「C コードとしてコンパイル」(リンカエラー回避)

////////////////////////////////////////////////////////////////////////

mbms2kss.cpp::KSS_mbm2kss (最新版適用時に忘れずに修正する)

KSS *KSS_mbm2kss(const uint8_t *data, uint32_t size) {

  if (0<drv_size && !drv_top) {
    mbmdrv_init();
  }

  if (drv_top) {
    //load_mbk();//by Kobarin ここでは呼ばないようにする
    return mbm2kss(data, size, cnv_mode, vsync_ntsc);
  } else {
    return NULL;
  }
}

load_mbk を呼ばないようにする
mbk は KSS_bin2kss の呼び出し前に KSS_set_mbk で設定する
mbk の検索&読み込みは kbmsxplug_decoder.cpp 内で行う
必要な mbk ファイルの検索順序は KSS_autoload_mbk に準拠する

////////////////////////////////////////////////////////////////////////

config.cpp::CONFIG *CONFIG_new(wchar_t *path, wchar_t *section)

//追加 by Kobarin
  _add_param_int(L"PSG_MUTE",    FMT_BOOL, 0, 1, 0);
  _add_param_int(L"SCC_MUTE",    FMT_BOOL, 0, 1, 0);
  _add_param_int(L"OPL_MUTE",    FMT_BOOL, 0, 1, 0);
  _add_param_int(L"OPLL_MUTE",   FMT_BOOL, 0, 1, 0);
//ここまで

////////////////////////////////////////////////////////////////////////

config.h/cpp::void CONFIG_load/CONFIG_save

void CONFIG_load(CONFIG *config) ;
=> void CONFIG_load(CONFIG *config, void *config_reader) ;

void CONFIG_save(CONFIG *config) ;
=> void CONFIG_save(CONFIG *config, void *config_writer) ;

IKpiConfig 経由で読み書きする(設定は実ファイルには保存しない)

CONFIG_load: mute と mask を読み込むようにした
//追加 by Kobarin
  config->mute[EDSC_PSG] = CONFIG_get_int(config, L"PSG_MUTE");
  config->mute[EDSC_SCC] = CONFIG_get_int(config, L"SCC_MUTE");
  config->mute[EDSC_OPLL] = CONFIG_get_int(config, L"OPLL_MUTE");
  config->mute[EDSC_OPL] = CONFIG_get_int(config, L"OPL_MUTE");

  config->mask[EDSC_PSG] = CONFIG_get_int(config, L"PSG_MASK");
  config->mask[EDSC_SCC] = CONFIG_get_int(config, L"SCC_MASK");
  config->mask[EDSC_OPLL] = CONFIG_get_int(config, L"OPLL_MASK");
  config->mask[EDSC_OPL] = CONFIG_get_int(config, L"OPL_MASK");
//ここまで

CONFIG_save: mute と mask を保存するようにした
//追加 by Kobarin
  CONFIG_set_int(config, L"PSG_MUTE", config->mute[EDSC_PSG]);
  CONFIG_set_int(config, L"SCC_MUTE", config->mute[EDSC_SCC]);
  CONFIG_set_int(config, L"OPLL_MUTE", config->mute[EDSC_OPLL]);
  CONFIG_set_int(config, L"OPL_MUTE", config->mute[EDSC_OPL]);

  CONFIG_set_int(config, L"PSG_MASK", config->mask[EDSC_PSG]);
  CONFIG_set_int(config, L"SCC_MASK", config->mask[EDSC_SCC]);
  CONFIG_set_int(config, L"OPLL_MASK", config->mask[EDSC_OPLL]);
  CONFIG_set_int(config, L"OPL_MASK", config->mask[EDSC_OPL]);
//ここまで

////////////////////////////////////////////////////////////////////////

cpage1.c/ ... cpage8.c/maskdlg.c/edit2413.c/他各種ダイアログ

static BOOL CALLBACK dlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
=> static INT_PTR CALLBACK dlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)

HPROPSHEETPAGE CreateConfigPage1(HINSTANCE hInst, CONFIG *config) 他

  psp.lParam = (long)config ;
    => psp.lParam = (LPARAM)config;

64bit 対応

////////////////////////////////////////////////////////////////////////

dialog.c::static BOOL CALLBACK dlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)

=> static INT_PTR CALLBACK dlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)

コンパイラ警告が出ないので、最新版適用時に注意

////////////////////////////////////////////////////////////////////////

dialog.c::CONFIG_dialog_show

winamp 用の不要なタブに関するコードを削除

////////////////////////////////////////////////////////////////////////

resource.rc
「演奏設定」タブの「CPU 速度」

CONTROL  "x4",IDC_CLK_FASTER,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,78,18,10
CONTROL  "x8",IDC_CLK_FASTEST,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,114,78,18,10

位置を 

CONTROL  "x2",IDC_CLK_FAST,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,66,78,18,10

の直後に移動&TABストップ有効化
(Radioボタンのグループ設定がおかしい)

MGS 歌詞ウィンドウのサイズを変更可能に
  IDD_OPTDLG の「プロパティ」->「Border」を「細枠」から「サイズ変更枠」に変更

////////////////////////////////////////////////////////////////////////

vm.c

void VM_reset(VM *vm, uint32_t clock, uint32_t init_adr, uint32_t vsync_adr, double vsync_freq, uint32_t song,
              uint32_t DA8) {
  /* Reset KMZ80 */
  kmz80_reset(&vm->context);
  LPDETECT_reset(vm->lpde);

  memset(vm->IO, 0, sizeof(vm->IO));
  //memset(vm->WIOPROC, 0, sizeof(vm->IO));   //サイズを間違えてる？
  memset(vm->WIOPROC, 0, sizeof(vm->WIOPROC));//by Kobarin

おそらく vm->WIOPROC の初期化が間違ってる？

////////////////////////////////////////////////////////////////////////

mgs2kss.c

改行を含む MGS のタイトルを取得出来ないのを修正
6,7バイト目が 0x0d 0x0a でなく 0x0a になっている(タイトルの始まりが
7バイト目からになっている)データがあるので対応(データがおかしい？)

void KSS_get_info_mgsdata(KSS *kss, uint8_t *data, uint32_t size) {
  uint32_t i = 0, offset = 0;

  for (i = 0; i < 6; i++)
    kss->idstr[i] = data[i];
  kss->idstr[i] = '\0';
  if(data[i] == 0x0d){//add by Kobarin
      i++;            //0d 0a にならず 0a になっている
  }                   //タイトルが 8 バイト目ではなく 7 バイト目からになっている
  offset = i+1;//8;   //7 バイト目から始まるデータに対応
  for (i = 0; i < 128; i++) {
    //if (data[offset + i] == 0x0D) //del
    if( data[offset + i] == 0x1a)   //↑修正 by Kobarin
      break;
    kss->title[i] = data[offset + i];
    if (kss->title[i] == 0x09)
      kss->title[i] = ' ';
  }
  kss->title[i] = '\0';
...

////////////////////////////////////////////////////////////////////////

kss.c

/*static*/ int is_sjis_prefix(int c) {//by Kobarin kssplay.c から参照可能にする
/*static*/ void msx_kanji_fix(unsigned char *title) {//by Kobarin kssplay.c から参照可能にする
マルチバイト文字で２バイト目で切れてる場合のバッファオーバーラン対策
(問題になるデータの存在を確認したわけではない)

////////////////////////////////////////////////////////////////////////

kssplay.c

static int mgs_text_update(VM *vm, uint32_t a, uint32_t d)
1行が80バイト以上あるデータの表示改善＆128バイト以上あると落ちるのを修正

