27 |
BSVによるメモリダンプモジュールの設計 (10) |
受信したデータは以下の図に示すように、一文字4bitのデータが連続する、VRAM内容を示すログデータです(右側を一部省略)。
VRAMデータ4bitの意味は以下のとおりです。
- bit3: バリケード(シールド)=非画像情報
- bit2: R=画像情報
- bit1: G=画像情報
- bit0: B=画像情報
従って、非画像情報を無視し、次のコードにより画像フォーマットであるPPMに変換します。
log2ppm.c
#include <stdio.h> void main() { char line[4096]; char ch; printf("P3\n256 256\n255\n"); for(int y = 0; y <= 255; y++) { fgets(line, sizeof(line), stdin); for(int x = 0; x <= 255; x++) { ch = line[x] - 0x30; if ((ch & 0x4) != 0) printf("255 "); // R else printf("0 "); if ((ch & 0x2) != 0) printf("255 "); // G else printf("0 "); if ((ch & 0x1) != 0) printf("255 "); // B else printf("0 "); } printf("\n"); } }
以下のコマンドによりフィルタを作成します。
$ gcc -O log2ppm.c -o log2ppm
上記のようにフィルターとして実行し、ログデータを画像ファイルに変換します。
$ ./log2ppm <putty.log >putty.ppm
生成されたファイルを画像処理ツールであるgimp2で開くと以下のように正常に受信されています。
以上で、ゲームのメモリダンプ機能がひとおおり完成しました。ゲームの状態を吸い出したのは、これをオートエンコーダによりCNNに認識させるのを目的としています。