スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


Raspberry Pi で X68000 エミュレータ PX68K を動かしてみる(その2)

そんな訳で、Raspberry Pi で X68000 エミュレータ PX68K を動かそう、というよりは、どうやって Raspberry Pi のスクリーンショットを撮ろうかと悩んでいる感じではあります。

Linux には大体あると思いますが、Raspberry Pi で動作する Linux、Raspbian にも、画面に表示されているビットマップを保持する /dev/fb0 という仮想デバイスが見えているので、ここからデータをファイルに落とし、視覚化することにします。

まずは Raspberry Pi を普通に立ち上げ、login: プロンプトが出たところで、母艦から SSH で Raspberry Pi にリモートログインし、cat /dev/fb0 > hoge.dat でフレームバッファの内容をファイルに落とし、母艦に転送しておきます。

さて、どうやって視覚化するかですが、まっとうなやり方としては「.bmp に変換するプログラムをつくる」でしょうか。
この方法は以前やったような気がするし、.bmp のフォーマットを調べるのが面倒なので、母艦の Ubuntu Linux 上にフレームバッファのデータを表示するプログラムを作成し、それをスクリーンショット採取してファイルにすることにします。
一から作成するのは面倒なので、PX68K でも使っている SDL を使います。PX68K から SDL の画面表示部分をそのまま持ってくる感じですね。

とりあえず成功したスクリーンキャプチャを載せておきます。
ウィンドウの中身がRaspberry Pi 起動後の画面写真です。
周りは母艦の Ubuntu Linux のメニューだったり、さらにそのUbuntu Linux が動いている VMware player のウィンドウだったりしますが気にしない。
1824_rpi.png
と、まずはちゃんとしたスクリーンショットを載せましたが、一番最初にできたプログラムで撮ったスクリーンショットはこちら。
1920_rpi.png

画面が流れてしまっています。画面の解像度があっていないようです。

最初は 1920x1080 を想定してプログラムを組んだのですがどうやら違うようですね。確かにフレームバッファから吸い出したファイルのサイズも、1920x1080x2 より小さい。横幅 1680 とか 1280 とか試してもうまくいかない。

うーむ、わからん。

なにか情報がないかといろいろ探していたら、dmesg に気になる記述を発見。

pi@raspberrypi ~ $ dmesg | grep -i hdmi
pi@raspberrypi ~ $ dmesg | grep -i frame
[ 1.303588] Console: switching to colour frame buffer device 228x61
[ 1.844331] dwc_otg: Microframe scheduler enabled
pi@raspberrypi ~ $

228x61 ? これを 8 倍すると 1824x488 。縦は 16 倍か。
1824x976 だ。確かに Raspberry Piの画面をよく見ると、画面の四隅に黒枠がある気がする。この分 1920x1080 より小さいのか。
ということで、横幅 1824 でようやっと Raspberry Pi の起動画面スクリーンショットをゲットだぜ。
表示プログラムの窓枠に出ている数字は、実はこの画面横幅のキャプションでした。

手抜きですが、今回作ったプログラム fbview.c を載せておきます。
カレントディレクトリにあるフレームバッファデータ hoge.dat を読み込み、画面に表示します。
引数を与えないと 1920x1080 として表示します。1824x976 として表示したければ

fbview 1824 976

の様に引数指定してください。
終了は F12 キーです。

コンパイルは以下の様に。
SDL1.2 の dev 環境が必要です。Ubuntu だと libsdl1.2-dev かな。SDL 2.0だと動きませんというかコンパイルが通らないはず。

gcc -o fbview fbview.c `sdl-config --libs --cflags`


プログラム本体は最後に。

というわけで、無事 Raspberry Pi の起動画面のスクリーンショットを撮影することに成功しました。
めでたしめでたし。
ふー、ちかれた。
あれ、なんか忘れているような気がするが、なんだっけ。
まぁいいや、ではでは。


#include <stdio.h>
#include <stdlib.h>

#include <SDL.h>

#if 1
#define WIDTH 1920
#define HEIGHT 1080
#else
#define WIDTH 800
#define HEIGHT 600
#endif

int main(int argc, char **argv)
{
SDL_Surface *surface;
SDL_Event ev;
FILE *fp;
int w, h;
int i, j;
unsigned short d, *p;

if (argc == 3) {
w = atoi(argv[1]);
h = atoi(argv[2]);
} else {
w = WIDTH;
h = HEIGHT;
}

if (SDL_Init(SDL_INIT_VIDEO) < 0) {
puts("SDL_Init() error");
exit(1);
}

SDL_WM_SetCaption(argv[1], NULL);

if (SDL_SetVideoMode(w, h, 16, SDL_SWSURFACE) == NULL) {
puts("SDL_SetVideoMode() error");
exit(1);
}

surface = SDL_GetVideoSurface();
if (surface == NULL) {
puts("SDL_GetVideoSurface() error");
exit(1);
}

p = surface->pixels;

fp = fopen("hoge.dat", "r");
if (fp == NULL) {
puts("fopen() error");
exit(1);
}

for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) {
fread(&d, 2, 1, fp);
*p++ = d;
}
}

fclose(fp);

SDL_UpdateRect(surface, 0, 0, w, h);

while (1) {
while (SDL_PollEvent(&ev)) {
if (ev.type == SDL_KEYDOWN) {
if (ev.key.keysym.sym == SDLK_F12) {
return 0;
}
}
}
}
}



Comment

[271]

ひっそりさん、10月25日以降の更新が無いんだけど、元気にしてるんですか?
ブログ書く時間が無いんですか?
いろいろと忙しくされてるのかな?

[274] Re: タイトルなし

> ひっそりさん、10月25日以降の更新が無いんだけど、元気にしてるんですか?
> ブログ書く時間が無いんですか?
> いろいろと忙しくされてるのかな?

すみません、元気です。
時間を見つけてちょこちょこ更新したいですね。

コメントの投稿


管理者にだけ表示を許可する

Trackback

http://hissorii.blog45.fc2.com/tb.php/239-a8349412

«  | HOME |  »

プロフィール

ひっそりぃ

Author:ひっそりぃ
Twitter:@hissorii_com
GitHub:hissorii


月別アーカイブ


最新記事


カテゴリ



最新コメント


最新トラックバック




RSSリンクの表示


Amazon


QRコード

QRコード

Amazon


ブログランキング

ブログランキング【くつろぐ】
にほんブログ村 ゲームブログ×PlayNCBlogへ

メールフォーム

名前:
メール:
件名:
本文:


カウンタ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。