PocketCHIP : mz800emu ドットバイドット表示&端末からのメニュー表示

MZ-800エミュレータ、mz800emuですが、画面サイズに応じて表示エリアを拡大縮小してくれる機能が付いているみたいです。ありがたい機能なのですが、PocketCHIPのような低解像度表示だと、拡大縮小によるドットのガタツキのほうが気になってしまうところです。
周辺の空白部分のサイズで、うまいこと表示できるように調整してみます。

基準となる画面サイズが、ソースコード \src\gdg\video.h のこの部分。

/* viditelny obraz */
#define DISPLAY_BORDER_LEFT_WIDTH 154
#define DISPLAY_SCREEN_WIDTH 640
#define DISPLAY_BORDER_RIGHT_WIDTH 134

#define DISPLAY_BORDER_TOP_HEIGHT 46
#define DISPLAY_SCREEN_HEIGHT 200
#define DISPLAY_BORDER_BOTOM_HEIGHT 42

 /* celkove rozmery displeje */
#define DISPLAY_VISIBLE_WIDTH ( DISPLAY_BORDER_LEFT_WIDTH +
 DISPLAY_SCREEN_WIDTH + DISPLAY_BORDER_RIGHT_WIDTH )
#define DISPLAY_VISIBLE_HEIGHT ( DISPLAY_BORDER_TOP_HEIGHT + 
DISPLAY_SCREEN_HEIGHT + DISPLAY_BORDER_BOTOM_HEIGHT )

横は、空白(154) + 画面(640) + 空白(134) = 928、縦は 空白(46) + 画面(200) + 空白(46) = 292です。

画面横サイズが320じゃなくて640なのは、MZ-800が横640ドット表示に対応しているからですね。縦は描画時には上記を2倍して(292 x 2 = 584)使われているようです。

基準の画面が 928 x 584、これをPocketCHIPの480 x 272 に入るように縮小して表示しているのです。倍数になってないので、ドットにガタガタが出てしまうのですね。

ということは、もともとの画面サイズを、480 x 272の倍数になるようにしてしまえばいいのですよ。MZ-700モードを使うなら、320 x 200 なので、完全にドットバイドット表示が可能なはず!

( 640 + 右 + 左 ) =  480  x 2 になるように、左右空白を160に、
( 200 + 上 + 下 ) x 2 = 272 x 2 になるように、上下空白を36に。

/* viditelny obraz */
#define DISPLAY_BORDER_LEFT_WIDTH 160
#define DISPLAY_SCREEN_WIDTH 640
#define DISPLAY_BORDER_RIGHT_WIDTH 160

#define DISPLAY_BORDER_TOP_HEIGHT 36
#define DISPLAY_SCREEN_HEIGHT 200
#define DISPLAY_BORDER_BOTOM_HEIGHT 36

これで、再コンパイルしたところ…

元の画面
mz_20

後の画面
mz_25

違いがお分かりいただけるだろうか?

mz_26

ああ、美しい…。

空白指定をさらに小さくすることで、(文字はガタガタにはなりますが)PocketCHIPの画面いっぱいに表示させることも可能です。


それから、右クリックでエミュレータメニューを出す処理ですが、PocketCHIPからは右クリックできないので、別の方法を考えました。

メニュー出す処理は、\src\iface_sdl\iface_sdl.c の、この部分ですね。

case SDL_MOUSEBUTTONDOWN:
if ( event.button.button == SDL_BUTTON_RIGHT ) {
 ui_show_hide_main_menu ( );
#ifdef UI_TOPMENU_IS_WINDOW
  } else {
     ui_hide_main_menu ( );
#endif
  };

(Linuxの場合は「UI_TOPMENU_IS_WINDOW」の部分も有効です。右クリック以外のマウスボタンだとメニューを隠す処理。)

こいつを、これのちょっと上にある、ALT+キーの部分にも作ってやりましょう。
ALT関連の処理としては、ALT + C でカセット画面表示、ALT + MでCPU MAX SPEED、ALT + Pでエミュレータ一時停止、というのがすでに作られていましたので、その下に追加。
キーは、何でもいいんですけど ALT + X あたりに付けてみましょう。

} else if ( event.key.keysym.scancode == SDL_SCANCODE_X ) {
  /*
   * Show main menu: Alt + X
   */
    ui_show_hide_main_menu ( );
  };

てな感じですね。

mz_27

これで、ALT + X でメニュー表示できるようになった!