HC-88でプログラミング! その14(完結)

f:id:PocketGriffon:20201114101055j:plain

HC-88でプログラミング、ついに完結!!

 

まずはTwitterに投稿した動画をご覧あれ!

 

HC-88らしからぬでっかい絵を表示しています。全体像が見られないので上にスクロールさせながら見せてる感じです。

なんか…たったそれだけなのに、すごーく苦労したww

せっかくなので苦労した部分をクローズアップしつつ、HC-88でご紹介出来てなかった部分を説明出来たら…と思う。

 

メモリが足りない!!

絵のデータは、せっかくなので画面全体にどどーんと表示させてみたい!

…となるとサイズは横480ドット、縦はメモリの許す限りって事にしてみよう。モノクロだしめちゃくちゃデッカい絵が入っちゃうかも?!

まずはメモリマップをちゃんと確認しておこう。

f:id:PocketGriffon:20201114004238j:plain

64KBのうち、0000h〜7D00h(31.25KB)の範囲は使用されていて使えない。

そして画像にあるyyyyHのアドレスを調べてみると、これはC006hと出た。計算が面倒なのでC000hとしよう。7D00h〜C000hまでがフリーエリアとなると4300h(16.75KB)がフリーエリア。

ん?だいぶフリーエリア狭くない??この範囲にメインプログラム、グラフィックデータ、そして通信プログラムが入る。

引き算していこう。まず通信プログラムは、プログラム本体+通信バッファ+スタック領域で約1KBが必要。BC00hから配置する事にして7D00h〜BC00hがフリーエリアで15.75KB。

そして通信プログラムはBASICで読み込ませるので、BASIC領域も必要。CLEAR文でギリギリのメモリサイズを探っていく。そうしたら&H9700ではダメ、&H9800ならばOKと出た。

9800h〜BC00hがフリーエリアで……9KB?え??

 

横480ドットだとすると60バイト、そうすると9KBで縦153ドットしかメモリに置けない…。

えーなんか想像よりもかなーり小さい絵になってしまいそう…。

ここに来てメインメモリに全てのグラフィックデータを置いておくのは諦めた。

だがしかし!HC-88には128KBの超巨大RAMドライブがあるじゃないか!!しかも読み込みも超高速!

絵のデータはRAMドライブへ入れておき、ロードしながら表示してやればいいのかな…。

ファイルへのアクセスは、ベースOSにCP/Mを採用しているHC-88ではとても簡単な話だ。OSの載っていないマシンでディスクをアクセスしようとしたら結構大変なのだ!

 

試しにコードを書いてみたところ…ディスクからの読み込みが…遅い(^^;; これじゃあZ80→6301のデータ通信よりも、RAMドライブ→Z80への転送の方がボトルネックになってしまい、意図した感じの動作にならない(^^; というわけでディスクから読みながら表示する案はボツ!

 

じゃあデータを圧縮してみたらどうだろうか?ランレングスかハフマンで小さくなるかなぁ…ハフマンは展開も時間掛かるから…などと考えつつデータを圧縮するテストをしてみたが…大して圧縮されない(^^;; これはもう選んだ絵が緻密すぎるのもカモ!

f:id:PocketGriffon:20201114095241j:plainf:id:PocketGriffon:20201114102642j:plain

結局、圧縮も思うように小さくならない事が分かり、いろいろと方向転換が必要に(T-T)

最終的に、絵のデータは256x256ドット、8KBに納めることにした。

 

プログラムも2段階ロード(データ→プログラム)をする事でもう少しメモリを絞り出してみたい。

1段階めでロードプログラムの配置、データのダウンロード、

2段階めで初期化プログラムのロード、プログラムのロード。

プログラムを試すたびにこの行程をするのは面倒だけど仕方ない。

最終的なメモリマップはこうしてみた。

 

9000h〜9BFFh 絵を表示するプログラム

9C00h〜BBFFh 絵のデータ(8KB)

BC00h〜BFFFh RS-232Cからのロードプログラム

 

ちなみにBASICを起動せずにCP/Mから実行する方法もあったが、スクリーンを初期化する方法が分からず……ああああああ!!!ここまで書いて気が付いた!エスケープシーケンスでモードセットすればいいんじゃないかと(T-T) しまった先に気づいていれば…orz

 

CP/Mからコマンドを起動する方法をとれば、もっと大きな絵を表示する事が出来そう。うーん…気づいてしまったらやりたくなるが…一旦キリにしたいw

ゲーム作ったりする時はCP/Mからのコマンド起動の方がメモリたくさん使えて良いかもね。

 

6301側のプログラム

この絵は、データはZ80側に置いてあり、スクロールする都度Z80→6301へ転送しながら表示させている。一度表示したデータは加工する事なく、スクロールと共に消えていく。

 

6301側のプログラムは、先日のサブシステム実験の時とほとんど変わらない。そもそも6301側に全てのデータを置けない時点で、プログラム以外は置かれない。

 

あらたに追加したプログラムは、上スクロールをする部分だけだ。汎用のメモリコピーではなく、1ドット上にスクロールするプログラムに特化した。少し面白いプログラムになったので見て欲しい。

f:id:PocketGriffon:20201114110334j:plain

これは「とある1ライン」を「1つ上のライン」にコピーするプログラムだ。

特徴はXレジスタ1本でメモリコピーをしているところだ。スクロールという処理の都合上、転送元と転送先の距離(アドレスの差)は分かっている。それを利用してXレジスタを足したり引いたり(マイナス値を加算)している。PUSH/POPするよりもこちらの方が高速だ。

6301のプログラミングをしていると、レジスタが少ない&アドレッシングが多い分、工夫のしがいがある。長いプログラムを組むのは大変だが、短めのプログラムだったら存分に楽しめる。

 

気になるのは…スクロール処理がそれなりに重いため、メインCPUからの割り込みを拾いきれるか…ここは心配しかないので、通信バッファを大きめ(64バイト)とした。

 

構想段階では拡大縮小とかラスタスクロールとかしてみようかなーとか思っていたが、途中でひどいバグに悩まされて気力が萎えたw 絵がスクロールしかないのはそのためだw

 

6301側にデータを格納し、小さなコマンドで実行をさせるタイプのモノ(ゲームなど)は6301の速度の実感する事が出来るだろう。思ったよりも速いよ!

ラリーXみたいなゲームだったら存分に発揮出来るかなぁ…。横スクロールするようなシューティングゲームは得意では無い…というか横8ドット単位のスクロールなら出来そうだけど…汗

 

一応の完結!

これにてHC-88でのプログラミングは一旦終了にしようと思う。

本体のメンテナンスから始まり、プログラム環境の構築、アセンブラの作成、最後のプログラミングと…結構遊んだ気がするw そしてHC-80/88の知識もだいーぶ増えた。

あとは…CP/Mからあれこれやってみたい気持ちが残ってしまったが、やり始めるとまた数週間没頭してしまいそうなので、今はやめておこうと思うw

 

さあ次は何で遊ぼうかな!

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