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

f:id:PocketGriffon:20201029124634j:plain

Twitterに動画をあげたが、無事にタロットカードの絵がドット単位に描画出来るようになった。汎用的な処理ではなく、あくまでもタロットカードが表示出来れば良いという考えの元に作られたもの。プログラム内部で横32ドット縦48ドットの描画に固定されている。

 

HC-40の時にも同じ事をやってみているが、今回との違いを紹介してみたい。

HC-40でプログラム開発してみた その3 - レトロパソコンであそぼう!

 

 HC-40(Z80)版のおさらい

 詳しい事はリンク先を読んで頂くとして、ざっくり言えば水平型VRAM(横8ドットが1バイトに対応しているタイプ)でドット単位にモノを動かす話だ。

単純にVRAMへデータを書くだけではダメで、必要なドット数分だけ横にずらしてやらなくてはならない。今回の場合は横32ドットあるグラフィックが対象だ。

 

Z80の場合はレジスタが(それなりに)豊富にあるため、プログラムでそこまで苦労はしなかった。結局、IX、HLに32ドット分のデータを入れ、シフトして溢れたドット情報をAレジスタで拾う…という、まぁごく普通の方法で実装をした。

  add ix,ix
  adc hl,hl
  adc a,a

1回のシフトに掛かる時間は34サイクルだ。

HC-40のZ80自体が3.58MHzと速い事もあり、タロットカードを10枚動かしてもリアルタイムに動いていた。

 

HC-88(6301版)の実装

Z80版と同じ処理を6301で作ろうとすると、まずレジスタの数が圧倒的に足りない事情がある。これはもうCPUのアーキテクチャの違いなので嘆いたところで仕方が無い(^^;

今ある命令でどう実装するのか…を楽しむべきだ。

 

そう、なんとなくだけれども…6301でプログラミングをしていると、将棋の駒落ち戦を思い出す。主に対戦相手とのハンデだったりするのかも知れないが、実際には1枚落ち2枚落ちと数が増えれば増えるほど自分の難易度が飛躍的に上がっていく。

6301で出来る事(マシン語命令)の範囲でどう攻めていくのが良いのか…を考えると、ものすごく頭を使う事になる。何十年も前に活躍していたCPUなので、世界中に定石がありまくるんだろうけど、そこは敢えて調べずに脳内で考えてみたい(^-^)

 

結局、いろんな命令を組み合わせて考えてみたが、これが一番しっくりきた。

  asld
  rol $02
  rol $01
  rol $00

16bitのDレジスタにタロットカードの右半分のデータを入れておく、左半分はダイレクトページ上の$02、$01にデータを入れ、シフトして出てきたビットを$00で拾う。

これで1回のシフトに掛かる時間は19サイクルだ。最大で7回シフトが発生する可能性があるので、その場合は133サイクル。プログラムにはこのシフト4回のセットを7つ書いてあり、ずれたドットの分に合わせて飛び込み先を変えてやる事でループ展開している。

 

ちなみにシフトの時間が19サイクルって事はZ80よりも速いの!?とか思うことなかれ。残念ながら動いてるクロック数が違う。HC-88のZ80は2.45MHz動作、そして6301は614KHzだ。ほぼ4倍違うので、時間に換算すれば6301の19サイクルはZ80の76サイクルと同等だ。むしろZ80よりも2倍の時間が掛かってると思って欲しい。

 

右端と左端の重ね合わせ処理については、プログラムの自己書き換えを行っている。「プログラムにデータを埋め込む」みたいな言い方をしたりするけれども、こうする事でループ内での条件分岐が無くなり、最短のプログラムで絵が表示出来る。ただし可読性は最悪になるのでケースバイケースだ。

 

前回に引き続き、タロットの描画ルーチンを公開する(一番最後)。興味のある方はどんな事をしているのかを解析して欲しい。プログラムに興味の無い方が見ると異常なレベルでの眠気が来るので、睡眠導入剤として利用してもらうのもアリだw

 

プログラムの自己書き換えは、_C10+1、_C20+1、_C30+1の箇所だ。いずれも元は0が入っていて、このまま読んでも意味不明になるので、適宜プログラムを追って欲しい。

 

ひとつだけイイワケをすると、あくまでも6301初心者が書いてるので無駄はあるだろう。動く事を最優先しているので、そこは許して欲しい。

 

この先は?

HC-88でやりたいと思っていた事がだいぶ実現出来てきたので、少し興味が薄れてきている。もうひとつやるとしたら、メインCPUとスレーブCPUのやりとりの遅さについての調査と改善プログラムの開発くらいだろうか。

それとは別にもうひとつHC-88でやりたいと思っている事があるのでそちらを優先させるかも。これはまだナイショだw

 

V20エミュレータの開発に戻りたいところだけど、実はさらに別のマシンに浮気したくなってる。何度も寄り道して申し訳ないが、興味の赴くままにうろうろする楽しみも趣味の醍醐味だ!←自己肯定

 

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

 

↓プログラムソース(1ドット単位のタロットカード描画(32x48ドット)

f:id:PocketGriffon:20201029174427j:plain

f:id:PocketGriffon:20201029174449j:plain

f:id:PocketGriffon:20201029174554j:plain