micro:bit v2でPC-8001エミュレータ!

micro:bitというシングルボードコンピュータをご存知だろうか?(^-^)

 

f:id:PocketGriffon:20211125184126j:plain

f:id:PocketGriffon:20211125184254j:plain

2種類が発売されていて、右→が初代、左←がv2と言われるモノ。

イギリスで開発された、主に教育用途のコンピュータのようだ。

日本でも何年か前から入ってきていて、micro:bitを扱った本もたくさん出てる。

 

micro:bitのv1の方(先に発売されていたタイプ)は何年か前に手に入れていたが、今まで使うチャンスが無く、この先も無いかも知れない…汗

 

プログラムはScratchで書ける。

というか、実はつい先日まで「Scratchでしか書けない」と思い込んでいた(^^;

秋葉原千石電商micro:bit用の液晶モニタを見た時、あれ?もしかしてScratch以外でもプログラム書けるの?…と調べてしまったのが運のツキ(^^)

何か動かしてみようって気持ちになった!

 

micro:bit 本体

f:id:PocketGriffon:20211125210338j:plain

こちらが今回の主役、micro:bit v2!

ARM系のCPUで動作クロックは64MHz。

メモリはFlashが512KB、RAMが128KB。

基板の真ん中がCPUかと思ったらスピーカーだった!

f:id:PocketGriffon:20211125212847j:plain

USBケーブルを挿し込むと、いきなり電源が入る。

あらかじめ入ってたプログラムが動くんだけど、LEDが光りまくるわ音が出まくるわで夜に開けない方が良いかも知れない(^^;;

 

まずは本体単体でちゃんと動くかのチェック。

実はこれも今回知ったのだが、Arduino IDEmicro:bitの開発が出来る。

Arduino IDEでmicro:bitの開発を行う準備 nRF5用ボードマネージャーの登録 | micro:bit Lab.【マイクロビット】

↑このページを参考にさせて頂いた。本当にありがとうございます!!(^^)

 

簡単なサンプルを作ってみたが、開発する時の感覚的にはM5Stackとほぼ同じだ。

ものすごく便利に感じる(^^)

最初の頃は「IDEって苦手なんだよねー」とか言ってたのが懐かしい(^-^;

 

液晶パネル

f:id:PocketGriffon:20211125215007j:plainf:id:PocketGriffon:20211125215022j:plain

そしてこちらが今回使う液晶パネル。

大きさ的にはmicro:bitよりも一回りくらい大きい程度。

1.8インチという小型サイズでありながら、解像度は160x128ドット。

液晶のパネル?コントローラー?はST7735Sというらしい。

今までまーったく意識した事が無かったけれど、こういうボードマシンにつなげる場合にはコントローラーの型番が重要になってくるらしい。

 

そして前回のRaspberryPi Picoで意識するようになった、どのピンがどこに接続されているのかを知る情報もあった。

1.8inch LCD for micro:bit - Waveshare Wiki

こういうのってホントに意識したことがなかった…。

すごく良い勉強になってる気がします(^^)

 

前回のPicoの時は、LCDへのアクセスを自前で書いてみた。私の利用方法といえば、フレームバッファからLCDへどどーんと一気書き!くらいしか使わないため、それでも十分だった。

 

今回はサンプルがあるので、それを素直に使ってみる流れにしてみる。

サンプルはCS、RST、DC、MOSI、SCLKのピン番号を合わせるだけで動いた!

f:id:PocketGriffon:20211125220812j:plainf:id:PocketGriffon:20211125220835j:plain

f:id:PocketGriffon:20211125220905j:plainf:id:PocketGriffon:20211125221139j:plain

ここんところ、サンプルが動く経験とか無かったから妙に嬉しい(^^)

何でも良いので動くプログラムが手元にある安心感は計り知れない!

 

よし、じゃあこのプログラムを利用しつつ、画面全体を更新するプログラムを書いてみよう!

そう思って試したのがコレ↓

 

これは……orz

1画面(というか、すでにこの時に160x100でテストしてたw)を描き替えるのに、0.6秒くらい掛かってる。

0.6秒はヤバいでしょ…。いくらCPUが64MHzとは言え遅すぎる(T-T)

 

ソースコードを追いかけるものの、C++のクラスは本当に追いづらい…(-_-;;

遅い原因まで絞り込めないまま、やっぱり1から書いた方がいいのかな…と思い始める。

 

そんな時、何気にコメントに目が行く。SoftwareSPI / HardwareSPIという単語。

そういえばSPIってソフトウェアとハードウェアがあるらしい。どういう設定をすると切り替わるのか、切り替えられるのか、切り替わっちゃうのかがわかってない。

わかってないけど、ハードウェアSPIの方が速いらしい。

半信半疑でハードウェアSPIを利用するというエントリに変更してみる。

 

うおおおお!!!これは!!!(@_@;;;

いきなり画面更新の速度が6倍以上速くなった!

 

うーん、結局のところ、どんな条件が揃えばハードウェアSPIが使えるのかがわかってない。

これは詳しく勉強しておきたいところだ!(^-^)

 

PC-8001エミュレータを移植する!

よーし、準備は整った!(気がする!)

これで勝つる!(気がする!)

 

液晶パネルを手にした瞬間から思っていた「PC-8001エミュレータを移植」してみる事にする!実際のところ、micro:bitのCPUとメモリから察するに、PC-8001エミュレータが限度だと思っていたので、今回は迷いなくターゲットを絞った。

 

先に128KBあるRAMの使い道について検討をしておく。

まずフレームバッファが160x100x2バイト構成で約32KB。

PC-8001のメインメモリが64KB、ROMが24KB、動かすゲームのデータが約8KB。

うん、ぴったり128KBになっちゃった!!(ToT)

このうち、どのデータがRAMに入り、どれがFlashに置かれるんだろう?

プログラムコードはFlashのまま?それともRAMに入る?

そもそもmicro:bitを触るのは今日が初めてなので、勝手がわからない!(^^;;

 

試してみたところ、どうやらconstデータはFlashに置いたままになるようだ。特別なアクセスもなく、そのままポインタ経由でデータが読めた!

逆に……なんとプログラムコードはRAMにコピーされるようだ!

そんな……エミュレータのプログラムってでっかいんだよ…(T-T)

 

何も考えずにフルセットを入れたところ、RAMが46KB足りないとエラーが出た!

46KB!よんじゅーろっきろばいと…!!

えー…これはちょっと……orz

 

ここから壮絶なメモリとの戦いが始まった!(^^;;;

まずはエミュレータ内部に入っていた逆アセンブラのコードを引っ剥がす。実際にコードを削るのではなく、プログラムから呼び出さなくすればリンク時に外される。依存しているところをコメントアウトしまくって、比較的大きな逆アセンブラ全体を削った。

それ以外にも、必要のなさそうなデータやバッファも削りまくり!

これらを減らしたところ、あと24KB足りないと表示された!

くそ、意外に減らないな…!!

 

次にPC-8001のメインメモリを削り始める。

RAMは64KBではなく、前半の24KBはROMが入るので40KBで良い。さらに6000h〜7FFFhの空間は何も無くても良いのでこの8KBもいらない。これで32KBと半分になった。その分、メモリをアクセスするプログラムが複雑になるが仕方ないだろう。

 

これでようやくPC-8001が起動するようになった!!

このあともちょっとコードを足すたびにビクビクしながら動かしていく事になった(^^;

 

終わりに

f:id:PocketGriffon:20211125224440j:plainf:id:PocketGriffon:20211125224405j:plain

micro:bitはシングルコアのマシンなので、CPUのエミュレーション処理と画面更新処理を分けることが出来ない。どちらも同じコアでタイミングを見ながら処理するしかないのだ!

 

64MHzで動くARMプロセッサでは、PC-8001を完全にエミュレーションするのは難しいみたいだ。まだまだ姑息な高速化手法はあるのだが、プログラムを追加するとRAMが溢れてしまうため、簡単ではなさそうだ。

 

CPUパワーも画面更新もちょっと足りないけれど、静止画を見る限りでは「PC-8001だねー」って言われる絵が出たと思う。

 

実際に遊べるようにはなってないけれど、Z80のエミュレーションくらいなら動くことがわかっただけで大満足でした!

 

今見るとラリーXの色がちょっと変だね…。もう面倒だから直さないけど!(^^;;

 

正直に言っちゃえば、micro:bitはもっとおもちゃおもちゃしてるマシンだと思ってた!

でも実際に使ってみると、ちゃんとしたコンピュータだった!

これこそ「こんなのでエミュレータ動かす??」ってマシンだと思う(^^)

人の道ならず、マシンの道を外れるって楽しいなぁw

 

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