ドキュメントがまったく無いというのも考えものなので。

10/26 クラス Piece に追加。フォント周りとか。

  1. 概要
  2. 動かす
  3. 使えるクラスライブラリ
  4. サンプル
  5. 注意

1. 概要

mvmはP/ECEでJavaのバイトコードのようなものを実行する仮想マシンです。 「Javaはなんか嫌。」という人が作ってるので色々やばいです。

2. 動かす

ダウンロードした後、p/eceに転送しておいてください。 それから、適当にプログラムをこしらえて。ライブラリとか サンプルとかを参考に。

それからコンパイル。コンパイルする際は、さっきダウンロードしたファイルの中に一緒に付いてる mvm.jarにクラスパスを通しておいてください。

ex) $ javac -classpath mvm.jar nanika.java

コンパイルできたら必要そうなファイルを main.jar に入れておいてください。 mvm.jarは入れなくていいです。

ex) $ jar -cvf main.jar *.class

それをp/eceに送って、mvmを実行。動かなかったら多分僕が悪いです、気が向いたらバグ報告ください。

3. 使えるライブラリ

標準ライブラリみたいなものは以下のものが使えるはずです。 コンパイル時にギリギリ困らない程度実装されてます。

Object equals だけ実装
String コンストラクタ String(String) だけ実装
StringBuffer appendとtoString()は実装

それと以下ふたつが package vaca に含まれます。

「Java仮想マシンって名乗っちゃだめ(商標なので)」っていうんだったら、 Java仮想マシン。略して"Vaか"だよ馬鹿。だからパッケージ名vacaでいいんだよ。

っていうふうな感じで名付けたパッケージ名だったように思います。

Piece

P/ECEへのインターフェースです。基本的にP/ECEのAPIを基にしてるので そっちの方も参照してください。 全部 static メソッドなんで、そのまま使ってください。

public static void lcdTrans pceLCDTrans VRAMの転送。
public static byte[] lcdSetBuffer(byte[]buf) pceLCDSetBuffer VRAMの設定、取得
public static int padGet() pcePadGet パッドの状態の取得。ちなみに、Piece.PAD_RI とかが使えます
public static void cls() VRAMの消去。 自分でVRAM取得して配列の値いじってもいいんだけど、こっちのほうが速い
public static void appReqExit(int code) pceAppReqExit
public static void appSetProcPeriod(int period) pceAppSetProcPeriod
public static void drawBmp( PieceBmp bmp, int x, int y ) x, y の位置に bmp の描画。
void fontPutStr( String str )

書くのが面倒になってきたので…

package vaca;

public class Piece
{
	public static final int PAD_RI = 0x01;
	public static final int PAD_LF = 0x02;
	public static final int PAD_DN = 0x04;
	public static final int PAD_UP = 0x08;
	public static final int PAD_B  = 0x10;
	public static final int PAD_A  = 0x20;
	public static final int PAD_D  = 0x40;
	public static final int PAD_C  = 0x80;

	public static final int TRG_RI = 0x0100;
	public static final int TRG_LF = 0x0200;
	public static final int TRG_DN = 0x0400;
	public static final int TRG_UP = 0x0800;
	public static final int TRG_B  = 0x1000;
	public static final int TRG_A  = 0x2000;
	public static final int TRG_D  = 0x4000;
	public static final int TRG_C  = 0x8000;

	public static final int FONT_5x10 = 0;
	public static final int FONT_8x16 = 1;
	public static final int FONT_4x6 = 2;

	public static final int FONT_RETURN = 0;
	public static final int FONT_NORETURN = 128;

	public static native void lcdTrans();
	public static native byte[] lcdSetBuffer(byte[]buf);
	public static native int padGet();
	public static native void cls();
	public static native void appReqExit(int code);

	public static native void drawBmp( PieceBmp bmp, int x, int y );

	public static native void appSetProcPeriod(int period);
	public static native void fontPutStr(String str);
	public static native void fontSetPos( int x, int y );
	public static native void fontSetTxColor( int color );
	public static native void fontSetBkColor( int color );
	public static native void fontSetType( int type );

}

こんな感じになってます

PieceBmp

drawBmpできるビットマップを pgd ファイルから作ります。 ちなみに、main.jar に含まれているファイルはそのまま使えます。 今はコンストラクタしか無いです。

public PieceBmp( String filename ) filename からビットマップをロードします。 失敗したら例外とかじゃなくて、そのまま異常終了してしまうのが辛い (例外処理がまだきちんと実装されてないので…)

大体こんな感じです。あと文字描画さえできれば基本的なところは大丈夫だと思うのですが。

4. サンプル

mvm.zipに含まれるサンプルです

import vaca.*;

class Main // Mainっていうクラスを用意
{
	int x=0,y=0;
	byte [] lcdbuff;

	PieceBmp bmp;

	public Main(){ // 最初にコンストラクタが呼ばれます
		lcdbuff = Piece.lcdSetBuffer( null );
		
		bmp = new PieceBmp("test.pgd");
		Piece.appSetProcPeriod( 25 );
	}

	public void appProc( int cnt ) {  // appProcはP/ECEのそれと一緒
		int pad = Piece.padGet();

		if ( ((pad&Piece.PAD_DN)!=0) && y<88 )
			y++;
		else if ( ((pad&Piece.PAD_UP)!=0) && y>0 )
			y--;

		if ( ((pad&Piece.PAD_RI)!=0) && x<128 )
			x++;
		else if ( ((pad&Piece.PAD_LF)!=0) && x>0 )
			x--;

		if ( (pad&Piece.TRG_C) == Piece.PAD_C ) {
			Piece.appReqExit( 0 ); // 終了
		}

		Piece.drawBmp( bmp, x, y );
		Piece.fontSetPos( x+18, y+2 );
		Piece.fontPutStr( "< help!" );

		Piece.lcdTrans();
		Piece.cls();
	}
}

5. 注意

色々気を付けないといけない点があります

他にもあるかも。

ソース


wo