Skip to content

Latest commit

 

History

History
150 lines (113 loc) · 6.94 KB

README.md

File metadata and controls

150 lines (113 loc) · 6.94 KB

micro MSX2+ for Android

About

Basic Usage

build.gradle

アプリの build.gradle の dependencies に以下を追加してください。

implementation 'com.suzukiplan:msx2:0.1'

micro-msx2p を簡単に扱える Android 用の View です

(基本的な使い方)

1. activity_main.xml などで定義

<com.suzukiplan.msx2.MSX2View
    android:id="@+id/emulator"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

MSX2+ の画面領域(568x480)は MSX2View 内で aspect-fit で配置されます。View の画角が 568:480 と異なる場合、上下または左右に黒色の帯が表示されます。

2. Initialize

MSX2View はレイアウトで配置した状態だと初期化待ち状態(ブラックスクリーン)になります。

Activity や Fragment 上で MSX2View.initialize を呼び出し、初期化処理を行うことで動き始めます。

executor.execute {
    msx2View.initialize(
        0x1B, // SELECT ボタンのキー割当 (0x1B = ESC)
        0x20, // START ボタンのキー割当 (0x20 = SPACE)
        assets.open("cbios_main_msx2+_jp.rom").readBytes(),
        assets.open("cbios_logo_msx2+.rom").readBytes(),
        assets.open("cbios_sub.rom").readBytes(),
        assets.open("game.rom").readBytes(),
        RomType.NORMAL
    )
}

3. Set Delegate

MSX2View を扱う Activity または Fragment 上で MSX2View.Delegate の実装を行います。

class MainActivity : AppCompatActivity(), MSX2View.Delegate {
    private lateinit var msx2View: MSX2View
    private val joyPad = JoyPad()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        msx2View = findViewById(R.id.emulator)
        msx2View.delegate = this
           :
    }

    // 毎フレームコールバックされる(入力キーコードを返す)
    override fun msx2ViewDidRequirePad1Code() = joyPad.code

    // エミュレータ起動時(動作直前)に呼び出される(quickLoadで状態復元を行う)
    override fun msx2ViewDidStart() {
        val save = File(applicationContext.cacheDir, "save.dat")
        if (save.exists()) {
            val data = save.readBytes()
            msx2View.quickLoad(data)
        }
    }

    // エミュレータ停止時(破棄直前)に呼び出される(quickSaveで状態保持を行う)
    override fun msx2ViewDidStop() {
        val save = msx2View.quickSave() ?: return
        File(applicationContext.cacheDir, "save.dat").writeBytes(save)
    }
}

MSX2ViewSurfaceView の派生クラスで、micro-msx2p のインスタンスはサーフェースのライフサイクルに従います。そして、サーフェースはアプリを終了する時やホーム画面に戻った時に破棄されます。そこで、基本的には上記で例に示しているように、クイックセーブ・ロードで状態の保持を復元を行うことを想定しています。これにより、ゲームプレイ中に突然電話が鳴ってきても、電話応対後にアプリを起動すれば状態を維持することができます。

なお MSX2View.Delegate の全てのコールバックは、サブスレッドから呼び出されます。

Example

app ディレクトリ以下が MSX2View を用いたアプリケーション実装の例です。

image

  • MainActivity.kt の実装を見れば MSX2View の使い方を簡単に把握できるようになっています
  • Android Studio でビルドすれば assets に組み込まれた game.rom が起動します
  • デフォルトの game.rom は Hello, World! を表示するシンプルな ROM ファイルです
  • game.rom を置き換えることで任意のゲームを起動できます
  • メガロムを起動する時は MSX2View.initialize に指定している RomType を適切に変更してください

Advanced Usage

MSX2View を用いることで、Androidで簡単に micro-msx2p を用いることができますが、JNI インタフェースをそのまま利用できる Coreクラス を用いることで、micro-msx2p の全ての機能を活用した高度なプログラムを開発することもできます。

License

本プログラムには次の OSS が含まれています。利用に当たっては、著作権(財産権)及び著作者人格権は各作者に帰属する点の理解と、ライセンス条項の厳守をお願いいたします。

appディレクトリ配下とmsx2ディレクトリ配下のソースコードは全て micro MSX2+ の一部として同じライセンス下で利用可能です。