SHARP PC-1360エミュレータの開発した!

今回はとーっても苦労した(TOT)

せっかくなので苦労を分かち合いたいw

f:id:PocketGriffon:20210927184036j:plain

 

これまでにいくつもエミュレータ作ってるが、完成させる事が出来たものなんて多くなくて、むしろ失敗してるエミュレータの方が数多いw

普段は表に出さないだけで葬られてるんだけど、今回はどんな感じでエミュレータの開発をしているのかも含めてさらけ出してみる!

 

PC-1360のエミュレータを作ってみたい!

PC-1350のエミュレータは、一時期すごい気合を入れて作っていた時期があった!

その1〜9まであり、当時かなりの力を入れていた事が分かる。

…分かるけど、実際に作ったものはHello Worldのみというのも凄まじい(^^;;;

どうも私はSC61860に苦手意識を持ってしまっていて、ニーモニックも暗記できない、それぞれの機能も理解が乏しいという状態でしかない(T-T)

 

そんな状態で、なぜ今回PC-1360を??と思われるかも知れないが、ポケコンジャーナル誌に「RAY-FORCE」という凄いゲームが掲載されている事を知り、ぜひ動かしてみたい!と思ったのだ(^-^)

 

型番からいってもPC-1350とPC-1360は兄弟みたいなモノだろうし、RAY-FORCE自体がPC-1360/PC-1360Kの両機種で動くとなっているので、まずは構造が簡単であろうPC-1360に対応してみようと考えた。

 

……おそらく、これらの事情に詳しい方はここいらへんで大量のフラグが立ってるのを理解するだろうけど、これを考えてた時の私の脳内にはフラグが立ってなかった!!(^^;;;

知らぬが仏って言葉は、後にならないと理解できないのだ!!(^-^;

 

エミュレータ開発準備

エミュレータを開発する上で、まずはなにはともあれ本体に入ってるROMデータを手に入れないと、どーにもならない。

f:id:PocketGriffon:20210926122010j:plain

幸い私はPC-1360/PC-1360Kどちらも所有している。

まずは(勝手な想像で)構造が単純そうなPC-1360からROMデータを引っこ抜く事にした。

とは言ってもメモリマップがさっぱり分かってないので、まずはメインメモリの64KBをホストへ転送してみた。PC-1360は思った以上に通信速度を上げられないので、この転送だけで2時間以上も掛かった!(T-T)

 

メモリの中身を見てみると…$0000〜$1FFFが全部00…。そうか、そうだったね、内部ROMは簡単に見えないとか、そういうのあったね(T-T)

 

$2000〜$27FFまではぽっかり空いたような空間、$2800〜$31FFまでがなんかのデータ、そこから$3FFFまではやはり何もない。$4000〜がおそらくROM??っぽいデータ、$8000以降にBASICのプログラムらしきものが入っていた。私は32KBメモリカードを2枚取り付けているので、$8000以降がRAMというのはなんとなく想像できる。

 

$0000〜$1FFFは内部ROMというプログラムが入っていて、特別な命令を使わない限り読めない…という事情がPC-1350の時にあったことを思い出した。全く同じプログラム(アドレス以外は無改造)を利用して、無事にデータを転送する事が出来た!

 

まずは安直に動かせないか、一応試してみる!

PC-1350エミュレータのメモリ部分に、PC-1360から抜いてきたメモリデータを書き込み、強引に起動させてみる。はい暴走したー(T-T)←エミュレータ上の話

さすがにそこまで単純じゃないか…それは想像してた、うん。

 

PC-1360のメモリマップを探せ!

そこから膨大なレトロ資料の中から、必要な情報を探すこととなった!欲しいのはPC-1360のメモリマップだ!

 

こういう時に便利なのが工学社が発刊していたポケコンジャーナル誌だ。うちには創刊号から最終号までの101巻が全部揃っている…と書きたいが、残念ながら1冊のみ行方不明だ(T-T)

 

PC-1360の発売は、ポケコンジャーナル誌創刊よりも前の話らしい。そのため「新機種を内部解析しました〜」みたいな情報ではPC-1360が扱われていない(T_T)

「The BASIC誌」ならどうだろう…と思い探してみたが、手持ちの号には載っていない。

うーん…めちゃくちゃ資料少なく無いですか、PC-1360系…(T^T)

ここに来てもまだ「PC-1350とほぼ同じだったら解析もあんまりされないか」とノーテンキに考えている自分がいた…。

 

メモリマップを探している間に、何度と無く「バンク切り替え」という言葉を目にした。そういえばPC-1350に比べてPC-1360の処理速度が遅いのは、バンク切り替えをしているからだ…という記述を(遠い昔に)読んだ覚えがある。

 

ペラペラとポケコンジャーナル誌を見ていくと……88年11月号の53ページにある「ポケコンQ&A」に、PC-1360Kのバンク切り替えプログラムが載っていた!これはすごい参考になる。

f:id:PocketGriffon:20210926124914j:plain

文章の中で「文字フォントはバンク1のROMの418Bhから入ってる」と書かれている。という事は、その付近のアドレスがバンク切り替え対象になるって事か…。

あれ??バンク切り替えするのに割込み禁止しなくていいのか…(^-^;;

 

試しに、このプログラムからバンク切り替えをしている部分のみを抜き出して、PC-1360実機で動くプログラムを(もちろんアセンブラで!)作り、変化のあるアドレスを調べてみた!

そしたら…どうやら$4000〜$7FFFの16KBが切り替わるっぽい。$3400がメモリマップドI/Oになっていて、そこに0~7の値を入れる事で、16KB*8バンクが切り替わる…のかな??←まだ自信なし

 

次にRAMはどんな感じに見えているのか?これはもう、RAMカードを取り付けてPEEK/POKEでテストしてみるのが楽ちんだ!

f:id:PocketGriffon:20210926130715j:plain

とりあえず、手持ちのメモリカードを交換しながらS1スロットへ取り付けてみる。

08KB  $E000〜$FFFF

16KB  $C000〜$FFFF

32KB  $8000〜$FFFF

こんな感じにメモリが顔を出した。なるほど、後ろから詰まっていくのか…。

 

ところで…PC-1360は32KBのメモリカードを2枚取り付ける事が出来る。

SET MEM "B"とすることで、全メモリがBASICプログラムで利用可能となる。

f:id:PocketGriffon:20210926131225j:plain

ポケコンでこれってすごくない??(^-^) 素直に感心しちゃうわー。

でも…これはメモリマップ的にどう見えるんだろ???

上の調査から想像するに、$8000以下にメモリが顔出すような気がしないので、おそらく$8000〜$FFFFがバンク切り替えするのかも知れない。うーん、SC61860でこのメモリ量か…スゴイとしか言いようがない(^^)

 

今わかっている範囲のROMを引っこ抜くプログラムを作ってみる。さっき抜き出した64KBのメモリのうち、$4000〜$7FFFはバンク0のROMっぽいが、念のためここのバンクも含めた8バンク分、全てを取り出すプログラムを作る。

 

ROMだけで128KB……。

この時点で、PC-1360エミュレータをM5Stickで動かす事を諦めた(^^;

 

PC-1360エミュレータ実装開始!

移植を単純にするため、PC-1350エミュレータからデバッガの機能を外してシンプルにした。

実行はzsh上、デバッグは基本的にprintfのみという感じにした。これでも十分作れるはずだ!

 

PC-1350に比べてメモリの量がどどーんと増えているので、メモリアクセス部分は作り直しだ。しかもバンク切り替えがある…。

せっかくなのでM5Stackでも動かせるように、メモリの構造は工夫しておきたい。

メインメモリはINTERNALで、巨大なROMはPSRAMでいいか…とか、そんな事を考えつつ実装を進める。

 

実装を進めていく上で……ん?PC-1350と兄弟みたいなマシン??全然違うじゃん…むしろ違うじゃん…(T-T) PC-1350の資料を参考にすればいいや…と思っていた自分の中の大前提が崩れていく…。

f:id:PocketGriffon:20210926134744j:plain

ある程度実装を進めたところで、ついに初期画面が表示された!!

よーし!よーし!!よーし!!!!

 

相変わらず私はテキストベースでのテストが好きなので、画面表示は'#'とか'.'で済ませてしまう。ブログで見る側は大変かも知れない(^^;

 

ここから先に進めるためには、キー入力を実装する必要がある。

実際にキーボードから入力するのもアリだけど、私はプログラムで擬似的にキーコードを発生させる方法を好んで使う。まずは「Y」を入力出来るようにしてみる。

この辺りはPC-1350で作ったものをそのまま流用したらいいかとなった。

……が!!!なんと、PC-1350とキーマトリクスの互換性がない(T-T)

f:id:PocketGriffon:20210926135831j:plain

↑これはポケコンジャーナル誌90年7月号に掲載されていたPC-1360のキーマトリクスなんだけど、私はこの表がぱっと理解できず大いに悩んだ(T-T)

 

実機上で、上の画面(RAM CARD S1 CLEAR O.K.?)で"Y"を押さなかった場合の挙動を見て、エミュレータで"Y"を押したつもりのキー情報を発生させてテストを繰り返す事になった(^^;;;

 

ちなみにこの画面で"Y"以外を押すと、画面右上に*マークが現れて電源を切る以外に何も出来なくなる。これはSHARPの、メモリカードを入れないと本体が起動しないポケコンで、メモリカードに問題があると起こるケースと同じだ。

 

プログラム内にあるキーテーブルをPC-1360用に定義し直して、ようやくテキストベースではあるけれど、PC-1360が起動した!

この時点でPROGRAM/RUNのモード切替やBASICのプログラムなどは動くようになっていた。おお、意外に速いぞ!

 

LOOP命令のなぞ

ココまで来たらきっとRAY-FORCEは動く!

早いとこその有志を拝見しようじゃないの(^^)

 

まずは雑誌に載っているRAY-FORCEを打ち込む準備を始める…。が、ここで助け舟をいただけた!すでに打ち込んであるというテキストをいただけたのだ!(^-^) 自分では打ち込んでいない事になるけど、掲載誌を所有しているからグレーゾーン?(T-T) 

 

RAY-FORCEのバイナリは$2000〜$27FF、$C030〜$F9CFの2つに分離されていた。$2000からRAMがあるのか…。それは気づいてなかった。エミュレータ的には大きな問題はないので、まぁ大丈夫か。

 

さて実行してみようと思ったら、なんとSC61860エミュレータで、まだ実装がなされていない命令コードが出てきた。おおお、まだ未対応のコードがあったのか…。という事は、SHARPのBASIC ROMでは使われていない命令コードって事ね…。

 

RAY-FORCEの中で「LOOP」という命令を使用していた。ループ命令を持つCPUはとても多いけれど、このLOOPは繰り返し回数をスタック上に持つという珍しいタイプ。

実際に利用している箇所を見ても、ループ回数をPUSHした後にLOOPしている。なるほど。

f:id:PocketGriffon:20210927211625j:plain

いつもこの「機械語マニュアル」を利用して命令を実装している。

今回のLOOP命令はこんな感じに書かれていた。

f:id:PocketGriffon:20210927211721j:plain

ここに書かれている日本語の通りに命令を実装したのだが……その後トラブル続出!いきなりBASICのプロンプトに戻っちゃったり、リセットされちゃったり。何が起きたの?!(T-T)

実装したLOOP命令のプログラムを何度見返してもおかしいところはなさそうだ。

 

自分のプログラムが絶対に大丈夫だと思い始めた頃、ようやくFAY-FORCEのプログラムを追いかけ始める。するとハタと変な箇所に気がついた。

PUSH→LOOP、で、その後にあるであろうPOPが無く、RTNしちゃってるのだ。

は?どーゆーこと??

たまたまた見ていた箇所にLOOPが2つあり、PUSH、PUSH、RTNという、マシン語で良くありがちなリターンアドレス操作に見えてしまったので、さらに混乱した!

 

実際にプログラムにバグがないと仮定すると、本来2つ積んであるはずのスタックが消滅してる…と解釈できる。そもそもこの仮設は正しいのか?正しいとしたらどのタイミングで???

ただでさえ詳しくないSC61860でこの未知の問題は厳しい!!(T-T)

 

結局、LOOP命令のループから抜けるタイミングで、1つスタックを減らすコードを入れてみる事にした。ホントに正しいのかどうか分からない上に、使われてるのは(今のところ)RAY-FORCEだけなので、慎重には慎重に……(T-T)

この修正をいれるためだけで、現象から理論、対策検討で一晩掛かってしまった(ToT)

誰か詳しい人がいたら真相を教えて欲しいところです(T-T)

 

RAY-FORCEを起動させる!

よし、ついにFAY-FORCEを起動させられる段階になった!

バイナリのロードは正規の手順は踏んでなく、いきなりメモリに読み込ませる方法を取った!

でも実行するのはちゃんとCALL&C032しよう(^-^)

f:id:PocketGriffon:20210927213726j:plain

よっしゃー画面出た!!

ここでサウンドの有無を聞かれるので、とりあえず'N'を選択。

選択……せんたく……

…全くの無反応(T-T)

 

あれ?Nキーの発生に失敗しているのかな??と思い、BASIC上で「NEXT」とか打ち込むが、正常に入る。あらら???

ここでまたしても足踏み状態。ちなみに'Y'を入れるとプログラムカウンタは先に進むようだ。でも'N'の不具合を残したまま先に進みたくない!

ここは是が非でも修正するのだと思い、必死に原因を調べた!!

 

…そしたらひょんなところから答えらしきモノが見つかった!

f:id:PocketGriffon:20210927215303j:plain

これはPC-1360のキー入力待ちルーチンの戻り値を示した表だ。
RAY-FORCEのプログラム中で、Yが押されたチェックをするコードは、$3Fと比較をしている。うん、これは確かに'Y'だ!

そして…'N'が押されたチェックをするコードには、なんと$46と比較されていた!$46というのは、PC-1360ではBRKキーだ。なんということ…キーコードに互換性が無かった!

 

PC-1360とPC-1360Kって上位互換というか、限りなく同じ機種だと思っていたのに、こんな根本的なところが違ってるなんて…(T-T)

あれ????

いやへんだぞ、だってRAY-FORCEはPC-1360/PC-1360Kの両方で動くプログラムだ。

f:id:PocketGriffon:20210927220332j:plain

わかりやすく赤で囲ったが、確かに両方の機種で動くのだ。

…ということは、何か機種判定に失敗しているのかも知れない。

またしてもRAY-FORCEのプログラムを頭から追いかけていく事になった!(ToT)

 

だけど……追いかけてみてはっきりしたけれど、起動してからタイトルが表示されるまでの間、何かをチェックしているような箇所が存在しないのだ。つまり機種判定はしていない。

判定ではなくて何かのスイッチ的な関数があるのか…とか、これまた何時間も調べる事に。

万策尽きて、これは一度実機で動かしてみないとダメなのかもな…と考え始め、PC-1360にロードする方法などを調べ始めた。

 

そしたら……

f:id:PocketGriffon:20210927223110j:plain

何気なくメモリテストをした結果なのだが…おわかりいただけるだろうか??

この結果を受け入れるのであれば、上のPC-1360Kは$2000からRAMが存在し、下のPC-1360には$2000にRAMが存在しないらしい…のだ!

いやちょっとまって!RAY-FORCEは$2000からのメモリに格納するダンプがどどーんとあるし!そもそもRAMが無いとかダメだってば(T_T)

 

ここに来てよーやく気がついた!

RAY-FORCEが掲載されたのは90年4月号。見るべきは5月号!

f:id:PocketGriffon:20210927223557j:plain

……orz

 

これは……当時打ち込んじゃった人がいたとしたら本当に忍びない。

実際に打ち込もうとしても$2000からRAMが無いので入力そのものがダメだった可能性は高いが、それでも期待した人いそうだ(T-T)

 

結論、RAY-FORCEはPC-1360K専用!

 

今回のPC-1360エミュレータでは、仕方がないので$2000以降にRAMを配置する事にした。なんと表現したら良いだろう…PC-1360Kのハードを持ってるけど載ってるROMがPC-1360って感じ??要するにズルっ子実装だ!!(^^;;;

 

さっきのキー入力判定の差異については、実行時にプログラムパッチを当てる事にした。元のバイナリには触らず、あくまでも実行時のみ変更。著作物でもあるしね(^-^)

これにより、無事に'N'が判定出来るようになった!

f:id:PocketGriffon:20210927224009j:plain

f:id:PocketGriffon:20210927224027j:plain

時間を置いてVRAMの中身を見ても、ちゃんと動いてるようなので、これならば画面描画部分を作ってもよさそうだ!


先日、Macでの画面描画方法を覚えたので、もう画面に出力させる事はお茶の子さいさいだ!

f:id:PocketGriffon:20210927224257j:plain

なんとなく液晶っぽくドットを表現してみた(^^)

そうか、本当はこんなに横長なのか(^^;;

動画も撮影してみたので、ぜひ見て欲しい。

 

 

そもそもは「PC-1360はPC-1350と似たようなモン」という勘違いから始まった開発作業だったけど、相当苦労しました(^^;; いつもなら「これ以上調べる事はない」というくらいまで前調査をしてから作り始めるんだけど、今回は思いつきで始めちゃったから本当に大変だった。

f:id:PocketGriffon:20210927224711j:plain

エミュレータの開発を始めると、机の上が書籍と本体で混沌としまくる!

いつも以上に大変だったエミュレータ、これをM5Stackに移植する?いやいや、もうインパクトはPC-1350の時と変わらないのでいいだろう(^^;; それよりもPC-1360Kに対応した方が需要がありそうな気もするけど…どうなんだろね??

 

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