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

開発効率をもっと上げたい!

先日からメモリダンププログラムを作っていましたが、もーガマンの限界でした…。

何がって…編集→転送→実行に掛かる時間が長すぎて!

 

マシン語データを直接送り込むことの出来ないHC-88。

仕方が無いので、BASICのDATA文にマシン語データを内包しておき、HC-88へ転送後にメモリへPOKEするようにしていた。バイナリをテキストに変換しているだけでもサイズ的に倍、POKEするプログラムを含めたりすると1.5倍くらいのサイズになっていた。それに加えてBASICの遅さよ(T_T) なんで1.5KBをPOKEするだけで1分以上も掛かるの…。

ターンアラウンドタイムを短くするのは、作業においての基本中の基本だと思う!

 

というわけで、バイナリデータを直接転送する事の出来るプログラムを書く事にした!

ただでさえメモリが多くないところに、常駐させたい系のプログラムを置くわけだから、出来る限りサイズは小さい方が好ましい。それに加えて速度を上げた方が良いだろうから…という事で、オールアセンブラで書くこととした。

 

アセンブラは使い慣れたzasmを使う。そんな大きなプログラムを書くつもりでもないので、正直に言えばどれでもOK。アセンブル時間だって今の時代では気にならない(^^;

 

必要な材料&情報

アセンブラRS-232Cを扱うプログラム…と言っても、そんな構える必要は無い。なぜならば、便利なBIOSコールが用意されているから。何も通信ドライバを1から書くワケではないw

 

f:id:PocketGriffon:20201013163022j:plain

↑これはHC-40のオペレーションマニュアルに記載されている情報なんだけど、この当時のマニュアルにはこんな細かいことまで書かれている!

HC-40にはこのBIOSコールがあるけれども…HC-88にはどうなんだろう…。BIOSコール自体は良く似たものが用意されているのではないかと予想。エントリアドレスを調べてみてると、E839hとそれっぽいアドレスへ飛んでいる!なんらかのエントリは存在しているらしい。

 

BIOSコールのRSIOXが存在するものとしてHC-88上でプログラムを組んでみる。OPENしてみると戻り値がそれっぽい!よーし、きっと使える!

途中、CLOSEの処理がどうしても正常に動かず、やっぱり互換性が無かったのか…と思ったが、実に面倒な仕様になっていた(これはまた機会があればw)

 

バイナリデータを転送する際に、転送先アドレスと転送バイト数の情報が必要となる。これはHC-40でBLOADする際のフォーマットがあるので、それをそのまま採用した。HC-40用に作ったツールがそのまま利用出来る点は便利だ。

先頭1バイトが0xFD固定、次の2バイトが転送先アドレス、その次の2バイトが転送バイト数という、とても単純なフォーマットだ。

先頭1バイトが0xFDというのがちょっと気になるが、Z80の場合0xFDはPrifix命令となり、IYレジスタを扱うコードを一番先頭に置くイジワルをしない限りは問題にならないw

 

転送プログラムの開発

構造自体は難しいものではない。

先頭の5バイトを読み取り、必要なバイト数分だけ受信してメモリへ書き込むだけだ。

通信プログラムで面倒なのはエラー処理だろう。今回のプログラムでは以下の種類のエラーを出力する。

RS-232CをOPEN出来なかった

・途中でCTRL-Cが押された

・通信バッファが溢れてしまった

マシン語バイナリでは無いものが送られてきた

 

加えてプログラムサイズにも気を使いたい。メモリに常駐させたいので、小さければ小さいほど良い。実行速度については1サイクルを気にするようなプログラムではないため、変なテクニックは使わないw

 

方針さえ決まってしまえばテストを含めて半日も掛からず出来上がった!

 

高速バイナリ通信ツール

f:id:PocketGriffon:20201013160827j:plain

↑起動した直後の画面。

自分で「HIGH Speed」とか書いちゃうイタさは生暖かく見守って欲しいw

 

通信が終了するとこんな感じの表示となる。

f:id:PocketGriffon:20201013204610j:plain

なるべく表示は出さないようにしようと思っていたが、ホントに通信しているのか不安になるので、256バイト受信すると「・」を表示するようにしてみた。

プログラム開発していると、コードサイズは常に把握しているので、何個表示されたら通信終了か分かる。これで気持ち的にも安心するってモンですw

f:id:PocketGriffon:20201013204934j:plain

ちなみにマシン語じゃないファイルを読み込もうとすると↑こんな感じのエラーが出る。

間違いが起こることもないのでちょっと安心(^-^)

 

どのくらい速くなったのか?!

開発をしていて気が付いたのだが、通信速度が設定値MAX(19200bps)になる前に、機械的な限界に達してしまう模様。9600bpsフルスピードすら出ない事が分かった。受信バッファの数を増やそうが効果無し(T-T) 限界値を探りつつ、その範囲で高速化を狙う事にする。

 

さて、実際のところ、どのくらい速くなっただろうか。

実験に使うマシン語プログラムは開発中のメモリダンプ、サイズは1553バイト。

これを転送する時間を計ってみよう。

 

マシン語プログラムをBASICに内包して転送する方法で…

・BASICをHC-88へ転送する時間 31秒

・RUNしてマシン語データをPOKEする時間 51秒

という感じで、合計82秒掛かっていた。

 

開発したツールで転送してみると…なんと3.8秒!

これは…満足出来る結果になったと思う!(^-^)/

 

開発中は19200bpsのノーウェイトで送れたらカッコいいなぁ…なんて思っていたのですが、その前にRS-232Cのデータを受け取るスレーブCPU側が悲鳴を上げるみたい。LCDの表示を消したりしたら速くなるのかも知れないけれども、まぁそこまで頑張らなくてもいいかな。

 

ちなみにプログラムサイズは478バイト。エラーなどでたくさん文字列を入れてあるけれども、この文字列を抜かした純粋なプログラムだけのサイズで言えば310バイト。通信バッファを含めて812バイトと、まぁコンパクトに作れたかな。アセンブラで作っていると余計なコードが入らないので、むしろ狙わなくても小さくなりますね(^-^)

 

よし!これで開発効率が上がったぞ!

メモリダンププログラムに戻りまーす!

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