2023.3.26 記
2023.12.13 訂正
基本的なこととして ROM 内のルーチンについては Enri さんの解析ページを参照させてもらってください。JR-200 は仕様上 DRAM より ROM の方が速いので、欲しい機能が ROM にある場合は積極的に ROM ルーチンを使った方が有利。16ビット加減算、カーソルXY座標→VRAM アドレス変換、1バイト→アスキーコード2文字分に変換(スコアを表示するときに便利)など、便利なものがいろいろあり。
2023.9.10 追記
Enri さんのサイトが移転再開されたので新リンクを。
http://cmpslv2.starfree.jp/Jr200/EnrJr2.htm
アドレス | |
---|---|
0 | キーボードを押したときのピッピ音がいらなければ0に。VJR-200 はこの機能を実装していないので忘れがち。 |
0xe | |
0xc81f | 割り込みマスク。テンポ以外のタイマー割り込みを使わないなら2に。 |
0xca00 | 枠色。ROM バージョンによって初期値が違うので設定推奨。 |
0xe8cb コールするとアドレス1,2,3にそれぞれキーボード(キャラクターコード)、ジョイスティック1,2の値が入る。
0x30 - 0x31, 0x32 - 0x33, 0x34 - 0x35 に演奏するデータの先頭アドレスを書く。
0x2d, 0x2e, 0x2f に1を書く。
0xc811 でテンポを指定する。0x40 あたりを基本として適切なテンポになるように変えてみる。
0xc810 に0x59を書くと再生開始。
再生を止めるときは、0x30 - 0x31, 0x32 - 0x33, 0x34 - 0x35 に0を書く。
狭義のユーザー定義文字(BASIC の COLOR ,,1 で表示するもの)はキャラクターコードとビデオコードが違うため少々使いづらい。リアルタイム・ゲームならカナやグラフ文字を使うことは少ないだろうから、キャラクタコード 0x80~0xffの通常キャラクタ領域をゲームキャラにあてて、ユーザー定義文字領域(0xc000~xc3ff、0xd000~0xd3ff 【訂正 2023.12.13】 0xc000~0xc0ff, 0xc400~0xc4ff)はクリティカル・ルーチンを置くのがよい。なぜここにコードを置いた方がよいかは以下のページ参照。
https://jr200.web.fc2.com/hard/clock.html
ちなみになぜユーザー定義文字のキャラクターコードとビデオコードが違うのか問題については過去に掲示板で話題になったことがあるので、興味のある方は、掲示板ログの141~147を参照のこと。
https://jr200.web.fc2.com/bbs2/bbs2_2.html
設定時間が過ぎたかどうかを確認するために割り込みを使う必要はない。タイマーが一周すると 0xc816の5ビット目(LSB を0とする)、ボローが立つので、ここをチェックすればいい。ボロービットは読み出すごとに自動的に0に戻る。
0xc816 - 0xc818の設定値
0xc816 0x1e
0xc817 - 0xc818 | |
10FPS | 0x418a |
20FPS | 0x20c5 |
30FPS | 0x15d8 |
40FPS | 0x1062 |
50FPS | 0xd1b |
60FPS | 0xaec |
ちなみにタイマカウンタの内訳
TCA | ロード終了後は使われないので、ユーザープログラムで使っても大丈夫、多分 |
TCB | PLAY 文相当の演奏ルーチンを使うときのテンポ指定 |
TCC | サウンド再生に使用 |
TCD | サウンド再生に使用 |
TCE | |
TCF | サウンド再生に使用 |
6800のCPX命令にはNフラグが上位1バイトのみの引き算に基づき変化すると言う罠がある(Zフラグはちゃんと2バイトの引き算に基づいて変化する)。なので完全な引き算に基づいたNフラグが欲しければ
ROM ルーチン 0xef80 を使うか自作する。
[TOP PAGE]