RaspberryPi Picoでプログラミング!

f:id:PocketGriffon:20211012180518j:plain

間違いなくRaspberryPi Picoを作った方は「違うんだよ…そういう使い方をするハードじゃないんだよ…」って思ってるに違いない!(^-^)

 

今回はRaspberryPi PicoでPC-8001エミュレータを動かしちゃったお話!(^^;;

一応、反省はしてるw

 

事の発端は……

MI68で手に入れたX68000 Compact XVIの形をしたRaspberryPi Zeroケースに、Zeroを入れるべくお店まで出向いていった時に、何気に目に入ったのがコレ。

f:id:PocketGriffon:20211012181341j:plain

サイズと名前から想像するに、RaspberryPi Picoに取り付ける液晶ユニットっぽい。

解像度は240x135ドットと、M5Stickと同じ。

そうかー、これがあったらPC-8001エミュレータ動くのかな…と何気に頭をよぎる。

よぎっちゃったら……やるしか無くない?!(^-^)

そんな単純な理由でパーツを買ってくる私であったw

 

液晶ディスプレイの中身は…

f:id:PocketGriffon:20211012185343j:plain

写真ではPicoも一緒に映っちゃってますが、別売りですw

そうか…Picoって薄っぺらい基板だけだから、ピンヘッダをはんだづけしないといけないのか…。うーん、久しぶりのはんだづけ。

f:id:PocketGriffon:20211012185705j:plainf:id:PocketGriffon:20211012185854j:plain

ブレッドボードを利用しつつはんだづけをしていく。

どうも私はピンヘッダが苦手で……その…節足動物みたいに見えるよね?(T-T)

今にも動き出しそうでちょっとイヤなんですよねー…(TOT)

 

f:id:PocketGriffon:20211012191137j:plain

Picoと液晶を合体させるとこんな感じ!

Picoの上に固定されるので、変にケーブルが伸びたりせず液晶が邪魔にならずに済む!

 

f:id:PocketGriffon:20211012191538j:plain

サイズ的に……えーと、ほぼいっしょ?

液晶サイズも同じに見えるので、何を作っても見た感じの驚きはないかも(T-T)

まぁでもPicoで何かが動くってのは重要でしょ?! ←そうなの?

 

MacでPicoの環境を整える!

これが一番大変だったかも知れない!

今まで、RaspberryPi用のプログラムを組む場合、完成までMac上で開発して、最終的な動作確認のみをRaspberryPi実機でビルドするようにしていた。それで問題がなかったし、むしろそれが普通な感じだった。

 

しかしPicoの場合は本体にOSというものが載ってなく、セルフビルドが現実的ではない。どうしてもホストマシンでのクロスビルド環境が必要となる。

そのため、私自身も手持ちのMacで環境を整えた。

 

ネットに書かれていた記事を参考にしつつ環境をダウンロードした。

その後、独自であれこれ触ってしまったために、だいぶオリジナル環境になってしまったかも。

ビルド環境全体がCMakeに依存しているので「CMakeってなんぞ?」って方には厳しいかも…。でもなんとなくファイルを触ってたら分かるよ、うん(^^;;

 

もうひとつ大変だったのは↓こっち!

f:id:PocketGriffon:20211012210603j:plain

ちょっと分かりにくいけれど、基板上にある「BOOTSEL」と書かれたボタンを押しながらUSBケーブルを挿し込むと、Picoにデータを書き込めるようになる。これが結構辛い。

ピンヘッダがついてるので指に刺さるし、その状態でボタン押しながら差し込みづらいUSBケーブルと格闘する事数回。

f:id:PocketGriffon:20211012210735j:plain

何かのはずみでボタンが壊れてしまった!

私が壊したんじゃない!壊れちゃったんだと言いたい!!(^-^;;

結局、これはボタンそのものが完全に壊れてしまったので、別のPicoを使うことに(T-T)

ダウンロード回数5回ほどの寿命でした(ToT)

 

この故障を教訓に、いくつかの対策を施した。

まずはUSBコネクタの挿抜回数を減らすために、スイッチ付きのUSBハブを用意。

f:id:PocketGriffon:20211012211625j:plain

USBの線を抜かなくても、スイッチをパチパチすれば電源のON/OFFが出来る!

これは本当に便利だ!

さらに!!!

f:id:PocketGriffon:20211012211820j:plain

ネットでこんなPicoカバーを見つけた!これがあれば、あの忌まわしいボタンを直接触らなくても、間接的にポッチン出来る!

実際に取り付けてみてから気がついたが…

f:id:PocketGriffon:20211012211921j:plain

液晶がついている面の、反対側にぼっちょがついてるので、液晶を上にした状態でPico自体を下にぐっと押す(意味分かる?)と、ボタンが押される。この状態でUSBハブのスイッチをONにすれば書き込みモードで起動する…というワケだ。

 

実際にやってみると、格段に使いやすくなった!これであのボタンも勝手に壊れる事はないだろう!(あくまでも壊してないと言い張る)

 

PC-8001エミュレータの移植

今回のPicoは、M5Stickに構成が近く載っているメモリはM5Stickの半分の264KB。

そのため、M5Stickからソースコードを移植するのが簡単だと判断した。

 

Z80エミュレータなどのファイルを何も考えずにコピーしてきて、CMakeLists.txtに必要なファイルを書き加えていくだけの作業だ(^^)

M5Stick特有な機能は、pc8001.inoファイルに集めてあったので、このファイルの代わりになる、Pico用のC++ファイルを用意すれば良いだけの話である。

 

エミュレータ初期化、エミュレータ駆動、表示系実装という感じに順を追って動作確認をして行ったが…驚いたことに、メモリ確保(malloc)と表示系(LavyanGFX)を数行書き替えただけで動いてしまった!(^-^;;

Picoのビルド環境が出来上がってから、ほぼ1時間でエミュレータが動いた!

 

M5StickとRaspberryPi Picoはライブラリ的には互換性がないので移植は大変かと思われていたが、そもそもMac環境からM5Stickへ移植してるくらいなので、元々のソース自体が環境に依存している部分が少なかった。

 

Pico側の勉強については、表示サンプルファイルを1つ読んだだけだった。

でもそれで十分だったよ!(^-^)

 

 

Picoにコアが2つあることをすっかり忘れていて、最初に動かした時は秒間2コマくらいしか表示されず、まぁ133MHzだったらこんなモンかも?と思い込んでしまった。

 

その後、コアを2つ使うように修正し、必要な箇所のみ画面更新するようにしたところ、実機よりも速く動くようになった!

 

ちなみに、Picoでマルチコア対応をする時は CMakeLists.txtのtarget_link_librariesにpico_multicoreを追加する必要がある。

 

 

終わりに

完全に手探り状態で移植したワリには、それなりに動いてしまった事に驚く!

特に表示系が思った以上に速いのは、可能性が広がる(^-^)

メモリの空き情報など分かってない事が多いけれど(特に意味もなく)他の機種を動かしてみても楽しいかもね…と思った!

 

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

M5Stickでプログラム!その3

今回はM5StickC PlusでPC-8801エミュレータ(アルフォス専用)を動かした話(^^)

 

f:id:PocketGriffon:20211006121913j:plain

何回か前のブログに書いているけど、過去に一度チャレンジして失敗してる(^^;;

せっかくなので、前回失敗した方法と、今回成功した方法を書いてみようと思う。

ちなみに主要なコードは1行も再利用してなく、全て作り直してる(^^;;

 

前回の失敗編

M5Stickは内部のメモリが大きくなく、M5StackならばPSRAMにSDカードにとデータの逃げ場所がたくさんあるのに対し、M5Stickでは基本的に内部RAMしかない。

フラッシュメモリもあるけれども、今まで使ったことがないのでちょっと手を出しづらい

↑イイワケ

 

PC-8801でアルフォスを動かすためには、PC-8801のBASICROMが72KB、メインメモリが64KB、VRAM48KBと合計で184KBと結構なサイズが必要となる。

前回はこれがメモリに入るとは考えず、全く別のアプローチを取った。

 

カセットテープからアルフォスを起動するシーケンスは…

・まずはBASICのプログラムがロードされる

・RUNするとマシン語モニタへ移りロード

マシン語のデータが2つ読み込まれる

・実行

という感じだ。

 

この際、BASICプログラムを実行するのにBASIC ROMと、monしてロードをするためにモニタを起動するためのROMが必要となっていた。

これらのROMは、ロードし終わったアルフォスを起動した時点で使わなくなる。

 

そこで「ロードが終わった状態のRAMを保存して利用」すれば、アルフォスを起動できるんじゃないかと思った!

うまく行けばメインメモリ64KB+VRAM 48KBだけでアルフォスを動かす事が出来る!

 

そう思って始めた実験だったが、通常のPC-8801が起動するシーケンスとは状態が違うためか、実にさまざまな問題が続出した!I/Oポート情報なども保存して持ってきたが、それでもデモが起動するとおかしな表示なってしまうなどさんざんだった。

結局、BASIC ROMがない状態でのテストは失敗に終わってしまった(T-T)

f:id:PocketGriffon:20211006124154j:plain

 

今回の成功編

今回うまく行ったのは、BASIC ROMも含めてメモリに収める事ができ、通常のシーケンスで起動出来た事が大きい気がする。

「あれ?メモリないんですよね?」と言われればその通り(^^;;

 

私も詳しく調べた上で対処出来たわけではないので書き方が適当になるが、ちょっとした割り切りをした上で、ROMデータを別の場所(セクション)に置く事にした。

 

アルフォスで「カセットからのロード」をエミュレーションするために、「カセットから1バイト得る」というROMエントリにパッチを当てている。そのため、今まではROMデータ自体を書き込み可能なセクションに配置していたのだ。

 

私自身の変なこだわりなのだが、オリジナルデータはそのままの状態で残しておき、実行時に動的なパッチを当てる事を好む。人様の著作物を扱う上で大切にしてきた。

 

しかし今回はメモリ不足に対応したかったので、あらかじめROMデータにパッチを当てた状態にしておき、書き換え不可能なセクションに配置した。プログラム上からROMデータを触る事はなくなったので、書き込み不能で良いのだ。

 

そしてPC-8801のメモリアクセス機構を改造して、ROM領域にアクセスされた場合には、置かれているデータそのものをアクセスするようにした。

どうせメモリマップを大きく変更したかったので、えいやっと手を付けた。

 

成功したけど失敗したところ!

もうこれは明らかに!!(^^;;;

前回の画像と今回の画像を比べてみたら一目瞭然!

f:id:PocketGriffon:20211006124154j:plain前回

f:id:PocketGriffon:20211006131316j:plain今回

1枚めが前回、2枚めが今回だ。

前回のは縦方向には圧縮していない状態ではあるけど、明らかに前回の方が絵が綺麗だ…。

これはもうドット変換のアプローチの仕方を失敗としか思えない(T-T)

 

前回の方法は…

・640ドットを320ドットに縮める

・この際、隣同士の色を見て中間色を生成する

・出来上がった320ドットの映像をLovyanGFXで240ドットに縮める

という事をしていた。

 

今回の方法は…

・640ドットを直接240ドットに縮める。

・この際、横8ドットを「3ドット、4ドット、3ドット」と分割し、その中の色を見て中間色を生成する

・出来上がった240ドットの映像をそのまま表示

…てな事をしている。

 

f:id:PocketGriffon:20211006132018j:plain

ソースコードに書いてあったものをそのまま貼り付けてしまうが、こんな感じの色変換を横8ドット毎に行っているのだが、リアルタイムに表示されてしまうM5Stickにビックリだ!

 

手間が掛かってる割に見た目はちょっと…というのはさすがにアレなので、画像生成は前回の方法も試してみようかな…(表示系だけなので、そんな大変ではない)

 

戦い終わって…

想像してた頃から「そりゃ無理だよなぁ…」と思っていたPC-8801アルフォスが、それなりのクオリティで動いた事にとても満足!!(^-^)

 

CPUパワー的にはまだ余裕があってウェイトを入れている。入れているウェイトの値を見ると、概ね85%くらいのパワーで動いてるようだ。

この大きさで、これだけのパワーが有るとほとんどの事はやれてしまいそうな気がするね。

もっとも本来の使い方であるハードを相手にしたプログラムでは、これでも遅いと感じるのかも知れないけど…(^^;;;

 

ちなみにこれだけ動かしても本体はほんのり温かくなる程度。

よきよき(^^)

 

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

SHARP MZ-2500を使う! その2

引き続きMZ-2500で開発環境を整えている!

Hello World、そしてメモリダンプが作れたので、これまでのレポートをば。

 

f:id:PocketGriffon:20210930191231j:plain

MZ-2500といえば、CPUにZ80Bが積まれている事が有名だけど、私の人生におけるZ80BはMZ-2500で2台目だ。1台目は沖のif800 model30を使った時だった!

 

当時はBタイプのZ80なんて聞いたことがなく、かつif800のとてももっさりとした動作を見ていたので、BタイプはAよりも遅いんだと思いこんでいた。

その後、MZ-2500が発売された時に6MHzと聞いてたいそう驚いた!

実は速かったんじゃないの、if800は…と思い、もう一度触るチャンスが欲しいと思っているが、あのでっかい筐体を手に入れる気にはならず…今に至る(^^;;

 

先日「Hello Worldが表示できたよ」とツイートしたが、あれはどちらかと言えば「開発する環境が整ってきたよ」的な意味合いが大きかった(^^)

前回のブログで「RS-232Cでの通信が出来たよ」と書いたが、もう少し詳細を書いてみようと思う。この時代にそんな情報が欲しい人がいるかどうかは疑問だけど(^^;;

 

ファイル形式と通信速度

MZ-2500に送り込むプログラムの形式は、こんな感じになった。

f:id:PocketGriffon:20211001103117j:plain

行番号はゼロサプレスされてるんだけど空白が残るという不思議な形式。これはMZ-2500本体から「SAVE "COM:",A」とした時にこのように送られてきたので、それを真似るようにした。

4桁分しかないんだけど10000超えたらどうなるんだろ…汗

 

マシン語領域は(暫定的に)&HE000からとし、マシン語データはそのままPOKEする形とした。MZ-2500はこの形式が一番速そうだったので!(事実、実行開始の待ち時間はほぼ無い)

予約語はなぜか小文字。これはなにかスイッチがあるのかも???

 

改行コードはCRLF(&H0D,&H0A)。

ファイルの最後には&H1Aではなくて改行コード2つ。この改行コード2つがないとMZ-2500側が通信終了を検知してくれない。

 

このフォーマットのファイルをホストマシン側で作り、MZ-2500へ送り込むようにしている。通信に時間は掛かるけど、フロッピーでやりとりしたり実機で開発するよりは効率が良いのでは…と思っている(^^)

 

しかし、なぜか通信速度がとても遅い。9600bpsを設定しているけれども、実際に転送に掛かってる時間から考えると1500bpsくらいしか出ていない。これも何か設定の不備があるんだと思うけれど、今のところ分かってない(-_-;

 

開発環境と開発言語

RS-232Cでプログラムを流し込むことを前提としているという事で、開発自体はMZ-2500本体ではなくてホストマシンで行っている。

 

編集は、普段から使い慣れたMacで行っている。私はMacBookPro(ノート型)使い。

アセンブラはLSIC-80付属のものを使用している。ということで、C言語も使う。ブート+速度を要する部分はアセンブラ、それ以外はC言語という感じの構成だ。

 

残念ながらLSI-80はMac上では動かない。仕方ないのでファイル共有をしたWindowsマシン上でビルドをしている。Remote Desktopで繋げたWindowsで「make」と打ち込むだけの簡単なお仕事だ(^-^)

 

LSIC-80付属のアセンブラは、そもそもの使い方がCコンパイラが出力したアセンブラファイルを扱う事を前提しているせいか、機能が豊富ではない。そこで単体でも使いやすいようにプリプロセッサを通すようにしている。おかげでマクロや条件アセンブルが出来るので使い勝手は上々だ(^-^)

f:id:PocketGriffon:20211001105712j:plain

自分なりのライブラリを整備していってるおかげで、なんとなくBASIC感覚でプログラムが組めている。こうなってくると楽になるね(^-^)

 

IOCSを介さずにテキスト表示を行ってみたかったので(単なる興味)、あれこれ画策していた。テキスト画面に書き込むコードに面食らい、スクロールに追従する方法が分からずに苦戦したが、なんとか表示出来るようになった。

 

メモリダンプを作ってみたい!

せっかくテキストに表示出来るようになった、あーんどメモリの内容を見てみたい!って事で、いつもの流れでメモリダンプを作ってみた。

f:id:PocketGriffon:20211001110108j:plain

作ったメモリダンプはメモリマッピングに対応していて、MZ-2500の全メモリを見る事が出来る……と書きたかったが、辞書ROMなどのバンク切り替えには対応出来てない。これはダンププログラムを作るタイミングで、バンク切り替えの存在に気がついてなかったからだ(ToT)

 

表示はリアルタイムに更新されていて、割り込みなどで値が変わるメモリはその状況が見える。おかげで割り込み時のワークエリアなどは見つけやすい。しかし今回はプログラム解析をするつもりがあまりないので、そのまでの必要性は無かったのかも(^^;

 

これを作る際、いろんな本を参考にしていた。

主観では有るけど、本について思ったことを書いてみたい。

f:id:PocketGriffon:20211001110823j:plain

工学社から発売されていたテクニカル・マニュアル。

基本的に工学社から発売されていた活用研究的なものは、無条件に全部手に入れていた。

基本的にIOCSの使い方が書かれていて、サンプルも少なめ。今のところ使用頻度はそこまで高くない。というか、ほぼ参考に出来てない(^^;;

これからMZ-2500を覚えていったら使うのかな…という印象。

 

f:id:PocketGriffon:20211001112100j:plain

かなり幅広く解説されている電波新聞社版の活用研究本。この頃って工学社電波新聞社の両方から「活用研究」という本が出ていて、どっちがどっちなのか一瞬分からなくなる(^^;

実際に手に取ると、紙質で気がついたりするんですが…汗

この本のI/Oポート、ワークエリアは参考になった。この本が無かったらテキスト表示でスクロールに追従するのは難しかったかも?

今回のダンププログラムでは比較的開いた回数が多かった。

 

f:id:PocketGriffon:20211001112840j:plain

今回はこの本を一番参考にしたかも?!

メモリマッピングの説明がほどよくまとまっていて、見やすかった。

グラフィックのモードについても個々の説明が多いので、この先も活用しそうな予感!

 

で…作ってみたダンププログラムなのですが、直接テキストVRAMをアクセスしているのにも関わらず、画面を書いてるところが見えちゃう!想像していたよりも3倍くらいか、それ以上に遅いイメージ。なんで???

 

テキストVRAMの構造が複雑で、そのままアスキーコードを入れたらいいのかと思っていたら、実は3バイトの書き込みが必要だった。ここの変換が遅いのかなぁ…とか、メモリから1バイト取ってくるごとにメモリマッピングを変更してるところかなぁ…とか、いろいろと思いつくとこがあって修正をしたけれども改善されず。

 

最終的に考えが行き着いたのは「もしかしてVRAMのアクセスが遅い?」だった。

単に遅いのではなく、表示期間中にアクセスしたらブランク期間まで待たされるくらいでないと遅さに説明が付かなかったので、もしや…と思って調べてみたら、いろんなところで書いてあったw

f:id:PocketGriffon:20211001114802j:plain

てっきりMZ-2500クラスならばサイクルスチールなどの技術が入ってるんだと思いこんでいたけれど、そうでは無かったのか…。MZシリーズの伝統なのかな(^^;;

 

ゲーム機みたいなプログラムの作り方をした方が、頭の中がしっくり来て良いかもね!基本的にブランク期間中以外はVRAMは触らない方がよさそうだ。なんだろう…MZ-2500に感じるちょっとしたじゃじゃ馬感は…(^^;;

 

テキストの書き換えに、アドレスの離れたところに3バイト書き込む必要がある事、そもそもの構造でブランク期間に書き込むようにはしていなかった事、この先はあんまりテキスト表示をしまくる予定もない事…などの事情により、今回は改造しない事にした!

 

という感じで少しずつ触っていってる!

最終的に「よーし、MZ-2500は大雑把に理解したぞ」くらいまで行けたらいいんだけどな(^^) 機能が豊富なゆえ、そこまでたどり着けるのか…汗

 

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

SHARP MZ-2500を使う! その1

f:id:PocketGriffon:20210929143823j:plain

今回はMZ-2500のお話(^-^)

何日か前にtwitterに「これから使います」と書いたけど、全然触れてなかった(^^;

このMZ-2500、手に入れてから2年以上が経つんだけど、手に入れた当初に動作確認をした以外は、ほとんど触っていなかった!!

なんていうんだろう……MZ-2500は私の中では大御所扱いで、使い始めてもやりたいことが出来るようになるまでは、相当時間が掛かるマシンという印象があり、軽い気持ちで触り始める事が出来なかったのだ。

 

私の中での同じような大御所にX68000もあるんだけど、X68000は過去に相当触った経験があるため、どちらかと言えば思い出すマシン。それに引き換えMZ-2500は触ったことが無いのだ!! 初めて触るMZ-2500はきっと手強いだろう…という揺るぎない自信がある!(^^;;

これから触ろうって事は、じっくり腰を据えて使おうという気持ちの表れだ!

 

ちなみに私のMZ歴は、MZ-1200はプログラムも含めて触っていた。MZ-700、MZ-1500は軽く触った程度。MZ-2000は観賞用として箱に入って保管してある(^^;

 

MZ-2500セットご紹介

f:id:PocketGriffon:20210929145027j:plain

うちにあるのは2ドライブタイプのMZ-2521。

手に入れた当初よりもいろんな拡張をして今に至る。

 

ありがちなのは「キーボードが手に入らない」というヤツだろう。なぜか本体とキーボードがバラバラに市場にでてしまうので、キーボード争奪戦が繰り広げられる(T-T)

そんな時はこのアダプタがオススメだ。

f:id:PocketGriffon:20210929160218j:plain

↑リアルな専用キーボードよりもよっぽど安価で手に入れる事が出来る。私はサンタさんにプレゼントしてもらうという幸運に恵まれた(^^;

ただ、日本語キーボードを接続するようになっているため、英語キーボードしか所有していなかった私は、テンキー付きの日本語キーボードを手に入れる事となった(^^)

 

f:id:PocketGriffon:20210929145949j:plain

↑本体内部には、128KB増設メモリ、4096色カラーパレットボード、辞書ボード、拡張VRAMボードが載っている。

音声合成ボードは、そこまではいらんか…と思い、意図的に増設をしていない。

 

ここまで載っていればMZ-2531じゃなくてもいいかな…って気になるかも?

MZ-2531のカセットに貼られている「V2」というシールがカッコいいなぁ…とは思うけれども、MZ-2521の天板に書かれている「MZ-2500」も捨てがたい!(^^)

 

f:id:PocketGriffon:20210929150430j:plain

↑オプションという事を知らなかったけれども、拡張ボードを入れるためのボックス?も手に入れた当初から付いていた。

 

f:id:PocketGriffon:20210929145824j:plainf:id:PocketGriffon:20210929150835j:plain

システムディスク系もある程度揃っているのではないかと…。
今気がついたが、システムディスクの右上にあるディスク、V2用??
あとはDUST BOXと書かれたディスクが15枚ほどある。同人ディスクだろうか?

 

f:id:PocketGriffon:20210929152023j:plain

この上にあるデモテープはどうやって使うんだろう…。あんまり分かってない。

下のプロレスは動作確認用に手に入れたものだ。でも動かしたことがない(^^;;

 

f:id:PocketGriffon:20210929152243j:plain

マニュアルや参考書籍は、チャンスがあれば手に入れてきた。マニュアルはこれで全部揃ってるかどうか自信がない。薄い何かがあったような気がするが行方不明だ。

f:id:PocketGriffon:20210929152710j:plain

上の写真にあったCP/Mと、このSmall-Cがあれば、とりあえず開発には困らないかなーと。

実際には使わない可能性もあるけどw

 

使い始める前に…

まずはシステムディスクのバックアップを取る!

そこから???と思うかも知れないが、ホントにここからなのだ(^^;;

CP/MMS-DOSと違い、使い方が統一されていないマシンを触るのにはマニュアル類があった方が安心!

 

と、その前に。

f:id:PocketGriffon:20210929154741j:plain

どのくらい効果があるのか分からないけれど、ディスクヘッドをクリーニングする!大切なシステムディスクに傷付いちゃったら、泣くに泣けない(T-T)

f:id:PocketGriffon:20210929155028j:plain

↑過去、不用意に某マシンにディスクを突っ込んだら思いっきり傷がついてしまい、メディアがダメになってしまった事がある(T-T)

 

f:id:PocketGriffon:20210929155417j:plain

これらのシステムディスクはバックアップディスクを使い、マスターは大切に保管しとく(^^)

 

開発環境はどうしよう…

やっぱり……RS-232Cを繋いで、基本はホストマシンであるMacでの開発だろうか。

BASICのコマンドを調べてみたが、BASICプログラムはアスキー形式でRS-232CへLOAD/SAVE出来るみたいだけど、マシン語(バイナリ)はダメらしい。ぐぬぬ…またしてもこのパターン(^^;;

 

とりあえずBASICだけでも良いので転送出来るようにしてみよう。

RS-232Cの初期化はinit命令で行うらしい。

 init "COM:9600,N81XNDLLN"

9600bps、ノンパリティ、データ長は8bit、ストップビット1bit、Xon/offアリ、それ以降はワリと適当(^^;;

 

これで「SAVE "COM:",A」とすれば良い。

Mac側はいつも使ってるPCG-LinkMacを使用(^-^)

f:id:PocketGriffon:20210929161653j:plain

おー!何の問題なく、いっぱつで通信できた!これは嬉しい(^-^)

 

上の通信設定(init)は、auto-run.m25という起動時の自動実行ファイルに入れておく。ついでにLOAD "COM:"もファンクションキーへ定義しておく。こうすれば起動するたびに手作業でinitしなくても、自動的に定義される。これは便利だ(^-^)

 

よし!これでちょっとずつプログラム組んでいってみよう!

実は…別の事にも興味が行ってしまっていて、いきなり集中出来るかは分からない。

困ったことに興味ある別のことも少し時間がかかりそうなので、どっちを先にやるか…(^^;

両方を同時に進める器用さが欲しい!

 

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

M5Stack FACESを使う!

「PocketGriffonがM5Stackをコレクションしている」という変な噂が流れているらしい…。

さすがに集めてなんていません、マジで(T-T)

 

そんな噂が流れると、知り合い(主に技術系経営者)が喜んで(不要になったものを)送ってくるわけだ…orz 嬉しそうな顔が目に浮かぶよ(T^T)

 

でも今回の贈り物は素直に喜びたい!

なぜならば、使ってみて一発で気に入ったからだ! (^o^)/

今回はM5Stack FACESのお話!

f:id:PocketGriffon:20210928231609j:plain

 

ここで「FACESとは!?」とか書く気はない(^^;;

それはもう、他でいっぱい書いてあると思うので、ここでは私目線のレポートを書いていきたいと思う。

特に私自身、M5系がCore2→Stick→FIREという遍歴の持ち主なので、一風変わった感覚かも知れない。

 

使いやすいキーボードが欲しい!

M5Stackのプログラミングのしやすさに感動して、ここ数週間はずっと近場に置いておいて、何かアレばちょこちょこプログラミングをするという事を繰り返していた。

Twitterやブログに公開する以外にもたくさん作っている(^-^)

これだけ簡単に画像が表示できるデバイスを手にしたのは初めてだったので、嬉しくて楽しくて無駄に作ってる感はある(^^;;

 

でもそういうのを作っていると、やっぱり入力デバイスが欲しくなる。M5Stack Core2はタッチパネルが付いてるんだけど、あんまり便利に使えたことがない…。ABCボタンも同様だ。プログラムがヘタなのかも知れないw

 

f:id:PocketGriffon:20210928233600j:plain

試しにキーボードも手に入れてみた。CP/M80などは完全対応させてみて、実際に使えるところまで持っていったが、やはりちょっと押しづらい。カーソルキーが左についているのも理由のひとつかも知れないが、ぽちぽちと押す感覚も得意ではなかった。指が痛くなっちゃう(^^;

 

そんな時、(理由はどうあれ)FACESが手に入った!

前から少し気にはなっていたんだけど、キーボードに1万円超える金額かぁ…と躊躇していた。

M5Stackが同梱されているとは知らず、純粋にキーボードだけの価格だと思ってたのだ(^^;

 

せっかくなので、手に入れてまだ何も触ってなかったFIREを取り付けつつ、プログラムしてみる事にした!

 

CP/M80の対応

まずはこのキーボード、どうやって扱うのかを調べてみねば。

こういう新たなハードを手に入れても、サンプルが充実してるM5Stackならば怖いものは無い!「スケッチ例→M5Stack→Face→KEYBOARD」にサンプルがあった!

 

なるほど…ははぁ…。初期化とデータ取得部分さえ押さえれば特に難しい事はない。

ただ…「M5.Power.begin()」この記述は初めて見た。

ドキュメントを見る限り、バッテリー駆動する場合に残量などの情報を取得出来るらしい。今後、人に見せる機会もあるかもなので、入れておくことにしよう。

 

キーボードが返してくるデータは、ASCIIコードそのものみたい。すごく単純明快!

さらに画面下部にある3つのボタンにも対応を…と思っていたら、Core2と全く同じコードでいけちゃう事が判明!すごいぞ、これ(^-^)

 

結局、調べ始めてから30分もしないうちに実装が完了した!

しかもキーボードが思っていたよりも打ちやすい。難を言うと印刷されてる文字が小さすぎて、「|(パイプ記号)」と「!(びっくりマーク)」の区別が付かなかったよ(T-T)

f:id:PocketGriffon:20210929001210j:plainf:id:PocketGriffon:20210929001234j:plain

ついでに気になっていたSD周りも修正した!起動時間が圧倒的に短くなったよ。

なんか…FIREでSDカードをアクセスするとノイズのような音が出る…。これってウチのだけ?

f:id:PocketGriffon:20210929001351j:plain

画面下部のボタンによる拡大縮小もちゃんと動作した!

使い勝手が飛躍的に上がった気がする(^-^)

 

PC-1360エミュレータの移植

前のブログで「移植しないよ」と書きつつも、気が変わって移植しちゃった!!

PC-1360の液晶(150x32)を、単純に倍角にして表示してみてもM5Stackなら表示できるんだな…と思い、その画面を見てみたくなったという単純な理由だ!

 

f:id:PocketGriffon:20210929001740j:plain

いつもの流れで移植、まずはシリアル上でPC-1360が起動してるのを確認する。この表示はほぼ一発で出た!移植作業に慣れてきてるなー!

ここまで動いていれば、あとは表示系を作るだけだ。

f:id:PocketGriffon:20210929001854j:plain

そしてこの画面もほぼ一発で表示された!

内部的には150x32ドットのスプライトを1枚持ち、それをLovyanGFXの機能で縦横を2倍にしているだけだ。表示時の負担は大きいと思うけど、CPUパワーが余りまくってるので良いかなーと(^-^;;

 

ここからキーボード対応をしていったのだが、PC-1360エミュレータが変だ。キーマトリクスがPC-1360Kになっちゃってる!これは…おそらく内部で行っているであろう機種判定で間違いを返してしまってるのだろう…。キーマトリクス取得部分を解析しないとダメかも。

今回はこのまま行っちゃうけど!←

 

もうひとつバグというか間違いに気がついた。

f:id:PocketGriffon:20210929002434j:plain

S1、S2スロットともに32KBの増設メモリを入れてる想定で開発をしていたけれど、どうやらS1スロットしか認識していない。SET MEM "B"すると停止してしまう…。

どうもS1、S2スロットの切り替えは、バンク切り替えというよりは「バスを切り替えてる」ようなコードが入っているようなので、もう少し解析が必要かも。

 

まぁそのへんは置いておくとしても、キーボードでBASICプログラムを打ち込んでみる。

f:id:PocketGriffon:20210929003025j:plainf:id:PocketGriffon:20210929003041j:plain

おおー、ちゃんと入力できた!

本当に小型のPC-1360が目の前にある!って感じだ(^-^)

 

f:id:PocketGriffon:20210929003332j:plainf:id:PocketGriffon:20210929003441j:plain

RAY-FORCEもちゃんと動いた!こちらはゲームパッドに対応した。

 

f:id:PocketGriffon:20210929003802j:plain

プログラムの都合で同時キー入力が入らなくなってしまっているので、操作はとてもやりづらい…。でも動くからとりあえずは良いか!(個人的割り切りw)

 

という感じで、Core2→FIREへの移植は、移植というほどの事でもなく動いてしまうようだ。

かつFACESへの対応もめちゃくちゃ簡単だった!プログラム経験が少しでもある人であれば、悩むところは無いだろう。

 

キーボードとパッドを入れ替える際に、FACE自体がとても外しづらいのが気になる!こんな頻繁に取り替える事を想定していないのかも知れないが、「壊れちゃわないかな?」ととても心配になる(^^; するっと外せる方法があったら良いのだけれども…汗

 

周辺機器も充実してきて、どんどんM5Stackが好きになっていく!(^-^)

多分、本来の目的とは「ほど遠い」使い方をしてるんだろうけど、困ったことに使ってる本人としての満足感はとても高い!(^^;;

今後も使っていくよー!

 

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

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に対応した方が需要がありそうな気もするけど…どうなんだろね??

 

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

M5Stickでプログラム!その2

先日のM5Stick PC-8001エミュレータのツイートに、こんな返信があった。

 

これに返信する形で、私も冗談でPC-1350の画面を表示させたりして遊んでいたw

f:id:PocketGriffon:20210923222132j:plain

この画像はでっちあげで作ったものだが、実際にPC-1350エミュレータで動かした結果を元に、VRAMのドット情報をM5Stick上で再現したものだ。

 

利用したエミュレータは、私がSC61860(PC-1350のCPU)を覚えるために作ったものだ。CPUを覚えるためにCPUのエミュレータを作るというのは順番が逆な気もするが、そんな状態でもエミュレータというモノは作れてしまう(^^)

 

f:id:PocketGriffon:20210923222132j:plain

↑PC-1350の実ドットサイズ(150x32ドット)で表示した時。

 

このサイズだとさすがに文字を読むのも大変だ。これじゃあ見られないよなぁ…と思ったが、画面の両端が余っているのはもったいない。でも150ドットを240ドットに拡大したらキレイなドットにならないのは想像に難しくないだろう。

 

f:id:PocketGriffon:20210923222315j:plain

横を1.6倍すると同時に、縦方向も1.6倍してみた。これはLovyanGFXのpushRotateZoomを利用して、とてもお手軽に拡大させていただいた!(^^)

そしたら……おおお……意外にも読めちゃうじゃないのさ!

あおさんの楽しいノリもあるので、ここは移植してみるしかないかな!

 

PC-1350エミュレータの移植

移植元となったのは昨年の12月に作っていたPC-1350エミュレータで、このブログにも経緯を含めて事細かく書いてあるので、ぜひ参照して欲しい。

 

今読み返してみると、デバッガもアセンブラも作ってるね…。どんだけSC61860に対して恐怖心を持って挑んでんだw 結局、Hello World+αくらいで挫折っぽくなってるけど(^^;;

 

エミュレータ全体の構成としては、逆アセンブラ、ダンプ、デバッガなどがゴテゴテくっついているが、CPUエミュレーション部分のプログラムは極めてシンプルに作られていた。コメントその他を含めた行数で1000行に満たない。CPUのエミュレーションとしては破格の小ささかも??

 

結局、M5Stickに移植するに辺り、元々あった初期化部分を書き直し、メモリ周り、表示周りを追加するだけで動いてしまった。書いたコード量としては150行程度だが、すでにこれまで移植したエミュレータがあったので、そちらからソースをコピペしただけだ(^^;;

 

画面表示系は上のジョーク投稿の時にすでに書いてしまっていたので、そういう意味では「移植するぞ」と思ってから書いたコードは、ほぼ無いかも知れない…汗

 

 

動画も撮ったので、ぜひご覧になっていただきたい。

これでも相当ウェイトを入れている状態だ。

 

2MHzの6809を2つ駆動しても余裕のあるM5系のCPUなので、768KHzで動くSC61860のエミュレーションは余裕しゃくしゃくだ。贅沢にもCPUエミュレーションと画面描画で1コアずつ使ったが、どちらのコアもdelayを入れまくってる!(^^;

 

 

そういえば「M5で昔のC言語ソースコードを利用しようとすると、デバッグでprintfが使えないので苦労する」みたいなお話をDMで頂いた。そうか、普段からC++のみしか使ってない方は「extern "C"」を存じてないのか…と目からウロコ(^^;;

 

私はこんな感じの関数を *.inoに定義して使っている。ソースコードが汚いのは気にしないで欲しい(T-T) ここに載せるためだけに一部書き換えたりしてるので、もしも動かなかったら適宜直していただきたい(^^;;

f:id:PocketGriffon:20210923233955j:plain

これでC言語からメモリ確保(xmalloc)とデバッグ表示(sioprintf)が使えるようになる。

あれ?今見るとbzeroではなくmemset使ってる…うむむ…(-_-;;

 

今まで移植したエミュレータもはっきり言えば需要があるとは思っていないが、今回のPC-1350エミュレータは、さらに需要がない気がしてならない(^^;;

でもまぁ困ったことに自己満足度は高い(^-^;;

 

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