micro:bitというシングルボードコンピュータをご存知だろうか?(^-^)
2種類が発売されていて、右→が初代、左←がv2と言われるモノ。
イギリスで開発された、主に教育用途のコンピュータのようだ。
日本でも何年か前から入ってきていて、micro:bitを扱った本もたくさん出てる。
micro:bitのv1の方(先に発売されていたタイプ)は何年か前に手に入れていたが、今まで使うチャンスが無く、この先も無いかも知れない…汗
プログラムはScratchで書ける。
というか、実はつい先日まで「Scratchでしか書けない」と思い込んでいた(^^;
秋葉原の千石電商でmicro:bit用の液晶モニタを見た時、あれ?もしかしてScratch以外でもプログラム書けるの?…と調べてしまったのが運のツキ(^^)
何か動かしてみようって気持ちになった!
micro:bit 本体
こちらが今回の主役、micro:bit v2!
ARM系のCPUで動作クロックは64MHz。
メモリはFlashが512KB、RAMが128KB。
基板の真ん中がCPUかと思ったらスピーカーだった!
USBケーブルを挿し込むと、いきなり電源が入る。
あらかじめ入ってたプログラムが動くんだけど、LEDが光りまくるわ音が出まくるわで夜に開けない方が良いかも知れない(^^;;
まずは本体単体でちゃんと動くかのチェック。
実はこれも今回知ったのだが、Arduino IDEでmicro:bitの開発が出来る。
Arduino IDEでmicro:bitの開発を行う準備 nRF5用ボードマネージャーの登録 | micro:bit Lab.【マイクロビット】
↑このページを参考にさせて頂いた。本当にありがとうございます!!(^^)
簡単なサンプルを作ってみたが、開発する時の感覚的にはM5Stackとほぼ同じだ。
ものすごく便利に感じる(^^)
最初の頃は「IDEって苦手なんだよねー」とか言ってたのが懐かしい(^-^;
液晶パネル
そしてこちらが今回使う液晶パネル。
大きさ的にはmicro:bitよりも一回りくらい大きい程度。
1.8インチという小型サイズでありながら、解像度は160x128ドット。
液晶のパネル?コントローラー?はST7735Sというらしい。
今までまーったく意識した事が無かったけれど、こういうボードマシンにつなげる場合にはコントローラーの型番が重要になってくるらしい。
そして前回のRaspberryPi Picoで意識するようになった、どのピンがどこに接続されているのかを知る情報もあった。
1.8inch LCD for micro:bit - Waveshare Wiki
こういうのってホントに意識したことがなかった…。
すごく良い勉強になってる気がします(^^)
前回のPicoの時は、LCDへのアクセスを自前で書いてみた。私の利用方法といえば、フレームバッファからLCDへどどーんと一気書き!くらいしか使わないため、それでも十分だった。
今回はサンプルがあるので、それを素直に使ってみる流れにしてみる。
サンプルはCS、RST、DC、MOSI、SCLKのピン番号を合わせるだけで動いた!
ここんところ、サンプルが動く経験とか無かったから妙に嬉しい(^^)
何でも良いので動くプログラムが手元にある安心感は計り知れない!
よし、じゃあこのプログラムを利用しつつ、画面全体を更新するプログラムを書いてみよう!
そう思って試したのがコレ↓
micro:bitに液晶パネルを繋げて、最初にテストした時の画像更新。この更新速度を見て「これはエミュレータ作れないかもなぁ…」と思った(-。-;
— PocketGriffon (@GriffonPocket) 2021年11月25日
実はこれはソフトウェアSPIで動いてた。
次に続く…#microbit pic.twitter.com/HzaIIvwn73
これは……orz
1画面(というか、すでにこの時に160x100でテストしてたw)を描き替えるのに、0.6秒くらい掛かってる。
0.6秒はヤバいでしょ…。いくらCPUが64MHzとは言え遅すぎる(T-T)
ソースコードを追いかけるものの、C++のクラスは本当に追いづらい…(-_-;;
遅い原因まで絞り込めないまま、やっぱり1から書いた方がいいのかな…と思い始める。
そんな時、何気にコメントに目が行く。SoftwareSPI / HardwareSPIという単語。
そういえばSPIってソフトウェアとハードウェアがあるらしい。どういう設定をすると切り替わるのか、切り替えられるのか、切り替わっちゃうのかがわかってない。
わかってないけど、ハードウェアSPIの方が速いらしい。
半信半疑でハードウェアSPIを利用するというエントリに変更してみる。
こちらがプログラムを見直して、ハードウェアSPIを利用した時の速度。
— PocketGriffon (@GriffonPocket) 2021年11月25日
これを見て「ヨシ、これなら作れるぞ!」と気合いが入った瞬間( ̄∇ ̄)
こういうちょっとした事に悩んでプログラム見て読んで理解して変更して、思った通りになるとプログラムってやめられないと思う(^^)#microbit pic.twitter.com/ZlKQhPcQRm
うおおおお!!!これは!!!(@_@;;;
いきなり画面更新の速度が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が起動するようになった!!
このあともちょっとコードを足すたびにビクビクしながら動かしていく事になった(^^;
micro:bit v2+液晶モニタで動くPC-8001エミュレータ!
— PocketGriffon (@GriffonPocket) 2021年11月25日
動かすのに苦労した!(^^)
やっぱり実機と同じ速度では動かず…(・・;)#microbit #PC8001 pic.twitter.com/BYTxmNe6pS
終わりに
micro:bitはシングルコアのマシンなので、CPUのエミュレーション処理と画面更新処理を分けることが出来ない。どちらも同じコアでタイミングを見ながら処理するしかないのだ!
64MHzで動くARMプロセッサでは、PC-8001を完全にエミュレーションするのは難しいみたいだ。まだまだ姑息な高速化手法はあるのだが、プログラムを追加するとRAMが溢れてしまうため、簡単ではなさそうだ。
CPUパワーも画面更新もちょっと足りないけれど、静止画を見る限りでは「PC-8001だねー」って言われる絵が出たと思う。
実際に遊べるようにはなってないけれど、Z80のエミュレーションくらいなら動くことがわかっただけで大満足でした!
今見るとラリーXの色がちょっと変だね…。もう面倒だから直さないけど!(^^;;
正直に言っちゃえば、micro:bitはもっとおもちゃおもちゃしてるマシンだと思ってた!
でも実際に使ってみると、ちゃんとしたコンピュータだった!
これこそ「こんなのでエミュレータ動かす??」ってマシンだと思う(^^)
人の道ならず、マシンの道を外れるって楽しいなぁw
ではまた次回!(^-^)ノ