SHARP PC-1350でプログラミング その1

f:id:PocketGriffon:20201130231837j:plain

手強いぞ!SC61860!!

PC-1350のCPUであるSC61860、想像以上に苦戦してる!!(T-T)

以前から書籍を眺めながら「理解するのに大変そうなアーキテクチャだなぁ…」と思っていたのだが…実際にやり始めたら、その認識すら甘かった事に気づかされた!!

当時SC61860使っていた方々、本当に良く理解&覚えられましたね!!!

このCPU覚えたら、他のCPUなんて怖くないわって思った(^^;;

CISC色の非常に強いCPU、嫌いじゃ無いなーw

CPUのアーキテクチャを云々言えるほどの身分ではありませぬが、思ったことをつらつらと。

 

ニーモニックが直感的じゃない

命令のニーモニックを見て「これはロード」「これは演算」ってパッとわかりにくくて苦労してる。

例えば「STP」、想像では「Pレジスタをどこかにストア」なんだけど、実際には「Aレジスタの内容をPレジスタに代入」。

「IXL」は「XレジスタをインクリメントしてDPレジスタへ代入し、そのDPの示すアドレスの外部RAMから1バイトをAレジスタにロード」。

ひとつずつ覚えていくしかないんだろうけれども、パッとどんな命令があったのか忘れるw 機能を思い出したとしてもニーモニックに結びつかない。これがプログラミングする時には結構キツい(T-T)

 

Qレジスタが壊れる?

命令によってはQレジスタが破壊されるモノがある。どれが破壊されてどれが破壊されないのかを覚えておかないと、Qレジスタを使える範囲が分からない。

そもそも命令実行時に、関係の無いレジスタが破壊されるのってアリなの?(T-T)

 

バイナリはビッグエンディアンだけどスタックにはリトルエンディアン

これはちょっと自信なさげだけれども、そうっぽい。

例えばLIDPのバイナリは「$10 $12 $34」でDPレジスタに$1234が入る。だけどPC=$1234をスタックにプッシュ(CALLなど)すると、メモリには「$34 $12」の順で書かれる。

私の思い違いだろうか……汗

 

シフト命令でZフラグが不定

シフト命令を実行した後、答えがゼロになってもZフラグに反映されない。私の中に「8bit CPUで8bitの演算をした時にはフラグが変化する」という固定概念があったおかげでハマりまくった(T-T)

 

他にも気になった事としては、DIDL(DPレジスタの下位バイトへのロード)はあるのに、上位へのロードが無い、とか、MVWDとMVBDの違いはWord/Byteではなくて、参照するのがIレジスタかJレジスタの違い…などなど。

各命令に特記事項が多くて、ご老体の脳みそでは覚えられない…(^^;;

 

習うよりも慣れろ!!!

どのCPUでもそうだけど、とにかく書いていくしかないんだよね…そして目と脳みそを通じてニーモニックに慣れていくしかない!

というわけで!

f:id:PocketGriffon:20201130230139p:plainf:id:PocketGriffon:20201130230201j:plain

PC-1350エミュレータを作ってみた!!

 

「ワンパターンだなお前!」とか言うなかれ!(ToT)

やっぱりCPUそのものの動きを書いてみる事が、ニーモニックはどうあれ内部処理は理解できるはずだ。実際、相当深いところまで理解できた気がする(そうでなければ動かない)。

その上で気が付いた事がいくつもあった…という事だ。

 

現状ではようやく画面に「RUN MODE」と表示されプロンプトが出たところ。VRAMを可視化する外部ツールでようやく動作を確認した。動いてるというよりは「やっと動いた」感じ(^^; まだ実装していない命令も多いので、これからまだまだ苦労せねばならないw

 

ROMの吸い出し

最初は単純に逆アセンブラを作ってみようと思っていたのだが、資料を見れば見るほど苦労しそうだったので、エミュレータを作った方が理解が出来るだろう…と思ったのだ。

で、エミュレータを作るためには、どうしてもPC-1350のROMが必要だ。

 

PC-1350は$0000〜$1FFFに内部ROM(CPU内部にあるらしいROM)、$8000〜$FFFFに外部ROMがある。

 

このうち、外部ROMはBASICからでも簡単に読める。そこでPEEK(アドレス)で読んだデータを、RS-232C経由でホストへ送るプログラムを書いた。転送速度よりも正確さを大事にしたため、データ転送が重くなり、32KBを転送するのに2時間以上も掛かったw

 

そして鬼門の内部ROM。こちらはBASICから読めない(読んでも0が返ってくる)。理由はさっぱり分からないがそういうものらしい。…というわけで、ネットで調べてみると別の機種用だったが目的が果たせそうな情報があった。それをPC-1350用に改造+上記のBASICプログラムにてホストへ転送する事が出来た。

ROMを吸い出すだけで、丸1日掛かったよ…orz

 

今回の目的は…

本来の目的は、SC61860でプログラムをする事であり、エミュレータを作る事じゃないw マジメにちゃんと作ってみたいと思っているので、そのための環境整備だと思って欲しい!

遠回りかも知れないが、私にはこういうやり方の方が性にあってる(^^;;

さすがにアセンブラまで作ったりはしないだろうけれども……汗

 

また中間報告入れていきます!

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