JR-300エミュレータの開発その5

JR-300エミュレータの開発話、第5弾!(^-^)

いくつまで続くんだろ…多分7くらいで終わる気がする(^^;;

 

JR-300エミュレータを公開してからというもの、すごい量のDMが届く!

日本語英語のみならず「これは何語??」って思うメッセージまで(^^;;

JR-300ってそんな有名なマシンなんだっけ?(@_@;

 

「解析のコツみたいなものはあるのか?」という質問が多いのでお答えします!

コツというよりは「過去に自分でBASICインタプリタを作ったことがある」というのが大きい気がする。

BASICインタプリタが内部でどのように動いてるのかを理解しているので「これは何をしてるんだろう?」というよりも「多分こういうことをする処理があるはず」という狙った解析ができているんだと思う。

LINEやPAINTのアルゴリズムも、実際に作ったことがあるから迷うところが少ない。

コツというよりも、過去の経験と知識が役立ってるんじゃないかなー(^^)

 

 

2022/11/21(月)
BASICの命令や関数を実行しまくって、不具合が出るもの片っ端から直していく。
各命令を見ていくとJRシリーズっぽいもの(FIND命令とか)もあるけれど、SYMBOLなどのF-BASICっぽいものも存在する。
各メーカーの良いとこ取りをしたマシンっぽかったのかな…。

MON命令(マシン語モニタ)で ? を入力すると停止する。
何かヘルプを表示させようとしているとか??
調べてみると制御文字の0x07を出力していた……BEEPか!
音は最後の最後にしたいので、今は何もしないのが一番の対処!(^^;;

 

CONSOLE命令はスクロール開始行、スクロール行数の指定となっていた。
これもWIDTH命令で初期値に設定されたまま放置していたが、ちゃんと設定することで簡単に対応終了。
CONSOLE命令の省略形としてC. が使えるようだ。

 CONSOLE 0,25 → C.0,25

各命令の省略形を調べるのは、全コマンドを打ち込みまくるしかないか…。

これは別の機会に頑張ろう、おう!

 

PEEK、POKE、CALLのテストもサクッと終了。
この辺りの…サブCPUもグラフィックコントローラも触らないものは、今の状態でもほとんどが動くんだろうな…と思いつつも念のためテスト。

テストしてると楽しくて1日の作業時間があっという間に終わっていくw

    
2022/11/22(火)

今日はカラーパレット関連を見ていく。

 

PALET命令は2つの引数を持つ。

それぞれが数値で0〜7の範囲という、いかにもカラー番号を表している。

しかし…PALET命令を実行しても、グラフィックコントローラ側に情報が出ない。

ありゃ…と思っていると、意外にもサブCPUコマンドが(今まで出現した事のない)別のカタチで呼ばれている事に気がついた!

 

今までテキスト関連を制御する時には、[0xFC01]←0x06が入るタイプで、コマンドコード自体は[0xFC47]に入っていた。

 

そういえばこのサブCPUアクセスのサブルーチン群は、さらに上のレベルで分離していたんだった…。別のレベルでもサブCPUアクセスがあるとは!

 

コマンド 引数   パラメータアドレス
00      02    [FC27]
01      01    [FC34]
02      01    [FC2A]
03      01    [FC2F]
04      02    [FC34]
05      06    [FC3F]
06      23    [FC47] ← これがサブCPUアクセスの関数群
07      0B    [FC88]
08      0A    [FC90]
09      0C    [FC99]
0A      07    [FCAF]
0B      01    [FCB6]
0C      05    [FCBB] ← これも出てきてる
0D      03    [FCC6]
0E      01    [FCC9]
0F      03    [FCCE]
10      01    [FCED]

 

今までは0x06の呼び出ししか対応出来てなかったけれど、この機会に全て受け取れるように修正する。

かなり大きなコード修正になるので、2~3日はかかりそうな予感。

 

2022/11/23(水)
サブCPU処理のリファクタリング
元の構造を残さずキレイに書き直す判断をしたため大幅な変更。
今まで書き散らかしたコードの多いことよ…orz

 

2022/11/24(木)
サブCPU処理のリファクタリング作業が落ち着いてきた。

キレイに整理してみて分かったが、サブCPUのコマンド番号はまだまだ空きがあって、正体不明な部分だらけだった!

こんな少しの実装だけでもBASICって動くんだな…(^^;;

 

ようやくPALET命令の作業に戻ってこられた!

PALET 1,7
この指定で、カラー番号1の色(青)をカラー番号7の色(白)にチェンジする。

数値をカッコでくくるとSyntax Errorなので注意。

 

サブCPUコマンドの0x0C系列0x02がパレット変更機能と判明。

 

パレットの変更は、なぜかサブCPU側に情報が出ている。

パレットってグラフィック画面への命令だと思いこんでいるが、もしかしてテキスト画面にも影響するって事??

それとも最終的な表示は合成も含めてサブCPUが処理してるから?


…常識的に考えたらグラフィックのパレット変更だと思うので、今のところはそのように実装してみる。

実機で見てるわけではないので、これが正しいかどうかは分からない。

デモンストレーションのプログラムでパレットチェンジが出てくるかなぁ…。

 

BASICのシステムコール

BASIC内部で呼び出されるシステムコール、コマンド番号の後ろに2バイト空けるのがルールらしい。
この構造はF-BASICを解析してた時に見た覚えがある。

コマンド番号、戻り値、Reserve…みたいな感じなんだろうな、きっと。

 

表示プライオリティ
PRTY命令、おそらく画面のプライオリティなんだろうと想像。
どこかの資料に表示プライオリティを変えられると書いてあったので、この命令がそれなのかも?

 

PRTY命令の書き方は「PRTY 式」となっている。
数字は0〜255の範囲を取るみたいだけど、さすがにこれだけあると想像が付かない…。
スーパーインポーズ、テキスト、グラフィックの3つだと思うけれども、他にもあるのかな…。

 

BASIC起動時に1で初期化されているので、これがデフォルトっぽい。
この設定で、テキスト画面を手前、グラフィック画面を奥に設定しておく。
「PRTY 0」とすれば、テキストとグラフィックの表示優先順位を変えるようにしてみた。

この辺りも実機がないと確認は出来ない。

実機で見てみないと案件が増えてきた(^^;

 

 

2022/11/25(金)
謎のマシンJR-300、今までの解析でおぼろげに見えてきたのは…

 

Z80
メインのプログラムシーケンス

サブCPU
おそらく6802なんじゃないかと想像してるけどクロック数含めて詳細不明。
テキスト画面、サウンド、画面制御(パレットや表示優先順位など)を担当

グラフィックコントローラ
グラフィック全般を担当。
直線補間はあるっぽいけれど、それ以外は特筆する機能を見つけられていない。

 

メインCPUからビデオメモリを分離してる事で、表示に必要なDMAがZ80側に割り込まずに済むはず。その分、Z80はノーウェイトで動いていた可能性が高い。

ただ、サブCPUやグラフィックコントローラとのやりとりは複雑怪奇で、全体的なバランスは悪く感じる。

カタログスペック上は最高性能に見えたかも知れない!(^^;

 

さあ!

BASICインタプリタの各種命令もだいぶ動いてきたし…

そろそろデモンストレーションを動かしてみたいと思うようになってきた!(^^)

出来る限りBASICの命令でハードウェアの詳細を調査し、万全の体制でデモンストレーションへ移行したい気持ちが強かったけれど、まだまだ完全ではない。
PCG機能とか音楽演奏とかは放置したままになっている。

音楽はどうしようかな…とかなり悩み中。

 

不安は残るものの前に進むしか無いのでデモンストレーションの動作確認に入る!

デモンストレーションプログラムはBASIC言語で書かれているわけではない。オールマシン語プログラムとして独立している。

そのため、今まで解析してきたBASICのワークエリアなどは役に立たず、あくまでもサブCPUとグラフィックコントローラの仕様のみが生きる感じだ。

今までプログラムを書いてきたJR-300エミュレータの素性が試される!(T-T)

 

PCG

デモンストレーションプログラム先頭で、PCG定義みたいなエントリを見つけた。
サブCPUコマンドの0x06系統0x0Dでキャラクタを定義しているみたいだ。

データフォーマットはキャラクタ番号、実際のデータという感じの単純なものだったため、特に悩むこともなくサクッと対応。

フォントの0x00~0x3Eまでが書き換わってるのがわかるだろう。

ちなみにこのフォントビュワーも即席で作った!(^^;

こういうしょーもないツールが増えていくのも仕方ないだろう…w

 

フォントデータはBASICプログラムに埋まってるわけではない。私自身がJR-200を所有しているので、そこからデータを拝借してきた。このJR-300のフォントセットはコレで正しい…というわけではないのでご注意!

 

定義するキャラクタのデータは8バイト固定となっている。この事から察するにPCGはX1のような8色ではなく単色であることが分かる。

これは…ちょっぴり惜しさを感じちゃうな…(^^;

 

サウンド

次にサウンド関連の処理らしきものが出てきた。
どうやらサウンドはサブCPU側で動かしているらしい。

 

サブCPUとの共有メモリである0xFC0Eに0x00、0xFC02に0x80を書き込んだのち、0xFD00からサウンドデータ(微妙にバイナリ化されたMML)を書き込んでいく。

このMMLをテキスト化したデータは以下の通り。

 

T90V15O5L20C+L4DD+EL8AEDC+O4L24BO5L8DL24F+L8DO4L20BL4A+BO5L4CL7C+R1L8EDC+O4BAG+AL16O5C+L8O4BEO5L20C+L4DD+EL8AEDC+O4L24BO5L8DL24F+L8ED+DC+O4BAG+O5C+O4L7BR1L32BL16A
T90V15O5L8R8AR16O5R8ER16O4R8F+R16O5R8DR16O4R8G+R16O5R8ER16O4R8AR16R8AR16R8AR16O5R8ER16O4R8F+R16O5R8C+R16R8DR16O4R8G+R16R16L16G+R16
T90V15L8O3AR8O4ER8O3C+R8O4AR8O3DR8O4DR8O3BR8O4BR8O3G+R8O3G+R8O3AR8O4AR8O3G+R8O4DR8O3ER8O4G+R8O3AR8O4ER8O3C+R8O4AR8O3DR8O4DR8O3A+R8O4F+R8O3BR8O4F+R8O3ER8O4ER8O3L16AR16O4E

 

友人がMSXで演奏させてくれたけれども、微妙に…ちょっと…とても変!(^^;

私がテキストに変換する際にMMLの解釈を間違えているのか、それとも何かクセのあるサウンドドライバだったのか…(^^;;

これはエミュレータではないところで悩みそうw

 

プログラムを見る限り、サブCPUへ渡すMMLの長さは256バイトを超えても大丈夫のようだけど、限界値は不明。サブCPU側のバッファに依存しそう。

実機がないとわからんなぁ…。

とりあえずエミュレータ側がPSG対応するまでは仮対応で先に進む。

 

デモンストレーション画面
デモンストレーションの最初の画面を描画する辺りで、今まで制御文字だけだと思っていたエントリが、実は通常文字も扱える事を知った今!

こういう使い方の幅については、実例が出てこないと気が付けないよね…汗

 

でも表示された画面を見ると……

うん、見事に化けてるね(T-T)

 

多分だけど…標準フォントとPCGフォントを切り替える必要がありそう。
あるとしたらアトリビュートかな…。
JR-200ではアトリビュート情報の中にノーマルフォントとPCGフォントの切り替えビットがあったので、JR-300でも同じ機能があるのかも?

 

今回はここまで!

あと数回続きます~!

 

ではまた次回!(^-^)ノ