HC-88でプログラミング! その6

HC-88はワリと手軽にROMを交換する事が出来る。

背面にあるフタを開けるとROMが顔を覗かせる。

ROMの両脇につまみがあり、それを引っ張る事で簡単にROMが外れる。

ソケットは2つあり、それぞれB、Cドライブとして見えている。

BASICは常駐かなーと思っているけれども、UTY-Jは使ったり使わなかったりするので、たまに変更して立ち上げてみたり。これだけでも楽しいw

HC-40にも同じように2つのソケットがあるが、HC-45にはなぜか3つある。

f:id:PocketGriffon:20201021010330j:plainf:id:PocketGriffon:20201021010351j:plain

 

6301マシン語入門

昔の書籍を見ていると、どうやら6301マシン語入門という本があったらしい。例によってまーったく手に入らない。いつか巡り合わせがきたら手に入れたいな…なんてことを思いつつ、無いならば国会図書館行かなくちゃ…くらいに思っていた。

f:id:PocketGriffon:20201021011236j:plain

で、そうなんですよ…。

いつもの事なんですが…

f:id:PocketGriffon:20201021011336j:plain

↑すでに複写サービスを利用していた事をすっかり忘れてた!!!

なんだ、手元に資料たくさんあるじゃん(T-T)

でもどの書籍も特徴的で、あっちに書いてある事とこっちに書いてある事をあわせて読まないと全体像が分からなかったりする。やっぱり何種類は欲しいところ。

 

6301アセンブラ

結局、自作を始めてしまったw

cppを有効活用、マクロ機能は無し、後方参照はサポート、分割アセンブルしない…など、手を抜けるところを抜きまくれば、1日あれば作れるか…と思いつつ作っていたが、ちょっと思うところがあり一旦中断した。

 

HC-88のメインCPUはZ80だ。なぜスレーブCPUの6301にこだわっているのか、気になっている方もいるだろう。

 

実はHC-88はスレーブCPU側にプログラムを送り込んで、実行する事が出来るのだ。

FM-7やFP-1100みたいだ」というフレーズを何度となく使っているが、実はプログラム実行が出来るというところまで同じなのだ!

f:id:PocketGriffon:20201021012658j:plain

出来るとなったらやりたくなるのがオトコノコだ!ごりごりに組まなくても良いから、単純なプログラムでも良いから作ってみたい!

そんな事情があって、6301のアセンブラを探していたのだ。

 

ともかくやってみよう!

ちゃんとした開発環境はあとから作るとして、まずはとりあえず版でも良いのでスレーブCPUでプログラムを実行してみたい!

そして速度的にどのくらいになるのかを知っておきたいのが心情だ!

試しに同じ事をするプログラムを3パターン作ってみた。

 

画面全体(480x64ドット)を反転させるプログラムを作ってみた。

・単純にBASICで作ったモノ

Z80マシン語で動くがVRAMアクセスはスレーブCPUを介するモノ

・スレーブCPUにプログラムを送り込んで直接実行するモノ

これらの速度を比べてみよう!

 

BASICで作ってみた

まずは一番単純な構造のBASICプログラム。

必要な命令としては、画面のドットを読み取るコマンド(POINT)、ドットを書き込むコマンド(PRESET)が分かればなんとかなる。

そして横480ドット×縦64ドットで30,720回ループを作れば良い。

ドットの反転は「PRESET(X,Y),POINT(X,Y) XOR 7」とすれば条件判定が入らない。

これで実行してみたところ、画面全体が反転するまでに813秒掛かった!

BASIC = 813秒

f:id:PocketGriffon:20201021015559j:plain

 

Z80マシン語で書いてみた

BASICで書いた場合とはFOR〜NEXTの部分が単純に高速化される。あくまでも速くなるのはメインCPU(Z80)側だけであり、スレーブCPUは基本的にBASICの速度と同じだ。

 

ちょっとだけ変わったのは、データのアクセス方法だ。

BASICではドットを読んで→XORして→書き込みとしていたが、マシン語でVRAMをアクセスをする場合には「VRAMのメモリを読んで、論理演算して書き戻す」という機能(CMD=01h)が存在する。これを使えば8ドット単位に、しかもメインCPUから見たVRAMアクセスは、書き込み動作だけで処理が終わる。単純に1/16くらいの時間になりそうな雰囲気。

 

ちなみにスレーブCPUのメモリ書き込みの機能としては「ANDして書く」「ORして書く」「XORして書く」「そのまま書く」の4種類が存在する。

なんとなく「そのまま書く」が一番速そうな雰囲気があるが、実は処理の順番的にANDが一番速くOR→XOR→直接の順番で遅くなる。せめてコンペア3回ではなくテーブルジャンプにしてくれたら速度は同じだった気がするのだが…。

 

そして気になる画面反転の速度は……21秒でした!BASICからマシン語に変換されただけでも相当速くなるね!でも1画面反転に21秒はやっぱりまだ時間が掛かってるね…。

Z80マシン語=21秒

f:id:PocketGriffon:20201021015824j:plain

 

6301CPU上でプログラムを動かしてみる!

スレーブCPUは6301なので、マシン語も当然6301(6800)で書いてやらないといけない。アセンブラを用意していたが、それよりも先に実行したい欲求が強いので、ハンドアセンブルする事にしたw そんな大きなプログラムは書かないので大丈夫!

それで用意したのがこんなプログラム↓

f:id:PocketGriffon:20201021020101j:plain

特徴的な命令としては「eim」がある。これは「メモリの内容とオペランドをXORしてメモリに書き戻す」という動作をしてくれる。面白い事にアキュムレータを汚さない。上のプログラムではインデックスアドレッシングを用いているが、ダイレクトアドレッシングでアクセスする事でメモリ効率も速度も速くなるため、ダイレクトページにワークエリアを置くプログラムはとても作りやすい。アセンブラの醍醐味は、こういう高級言語では書く事の出来ない命令を使う事…ではないだろうか(^-^)

 

プログラムを見て分かる通り、おそらくマシン語プログラムとしては最低速度だと思う。適度なループ展開などをしてやればすぐに2倍3倍の速度にはなるだろう。そういう楽しみはこの先の楽しみとして、まずは動かす事を優先しよう!(^-^)

 

さてこのプログラムをCMD=01hでメモリに書き込み、CMD=02hで実行してやる。

問題は、スレーブCPUのメモリ空間の「どこ」にプログラムを置けば実行出来るのかが分からない事だ…。これはもう地道に実験するしかない。

で、試してみた結果、グラフィックモード(SCREEN 3)の時は、$8000〜$837Fまでの896バイト、$9541〜$9764の558バイトにプログラムを置ける事が分かった。全体で1454バイトのフリーメモリだw

 

さて、これで実行してみた結果!なんと1秒以下の速度となった!動画をTwitterへ上げておこうと思うので、ぜひ見てみて欲しい(画面が反転するだけの動画w)

6301マシン語=1秒以下

 

HC-88、面白い!!!

レトロパソコンでサブ側のCPUを制御するのは、FM-7PC-8801(ディスク側)についで、これが3台目だ(仕事ではもっと大量にやっているが…)。 6800というCPUも相まって、とても面白いマシン!!

こうなってくると絵とか動かしたくなる! HC-40の時にやってたみたいにタロットデータを動かしてみるか…それとも何か簡単なデモでも作ってみるか…夢が広がるw

 

何をするにも、やっぱり6301アセンブラ欲しいですね。

ちゃちゃっと作ろうと思います!

ぎゃー!楽しいww

 

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