HC-40でプログラム開発してみた!

HC-40用RS-232C通信アダプタの改良

先日の日記でHC-40用のRS-232C用アダプタをてきとーに作ったが、実際に使ってみるとダウンロード(ホスト→HC-40)はうまくいくのに、アップロード(HC-40→ホスト)には失敗するという奇妙な状態になっていた。

 

実際にプログラム開発を行う際は、ほとんどがダウンロードだけで良いはずなので、あんまり気にしなくてもいいかなーと思っていたが、海外の方々の素晴らしいツール(Vfloppyなど)を使うためには、信頼の出来るRS-232Cケーブルは必須らしい。

 

多分、プルダウン抵抗ってのを付ければいいんだろうな…と思い、試しにやってみた。ダメだったら取り外せば良いだけだし!

そして安定のアクロバティックはんだづけ!

いいの!動けばいいの(TOT)

見た目なんて…見た目なんて…orz

 

これで実験してみたところ、無事にアップロードも出来るようになりました!

良かった!

f:id:PocketGriffon:20200513183440j:plain

 

開発環境を考える

さて、今回プログラムを作るHC-40には、CPUにZ80が使われている。

とってもポピュラーなCPUなので開発環境も充実してる。なんでも選び放題!

アセンブラを楽しむのもアリなんだけど、複雑な構造のモノを作る気力と体力が残されていないお年頃なので、必然的に選ぶのはC言語となる。

 

昔、LSIC-80のパッケージを購入したことがあったのだが、度重なる引っ越しで行方不明になってしまってる。ファイルくらい残っていたら良かったけど、残念ながらそれも無い。

となると、現在出回ってるフリーで利用出来るコンパイラが良いだろう…ということで探してみた結果、sdccを使う事にした。

実はsdcc、過去に利用した事があるのだ。

全く知らないモノをイチから調べて使うよりは、一度でも経験があるモノを利用してラクしたい魂胆が見え見えだ。

 

イメージとしてはこうだ。

・使い慣れたマシンとエディタでソースを書く

・ホストマシンでコンパイル

・出来上がったバイナリをHC-40で読める形式(BASIC)に変換

・このBASICファイルをHC-40へRS-232C経由で送り込む

・HC-40で実行

 

よーし、これだったら作れそうだ!

 

 HC-40のメモリマップは?

さて、実際にプログラム を作ってみようと思っても、メモリマップが分からなければ話にならない。メモリのどこにプログラムを置くのが安全なのか知る必要がある。

BASICリファレンスマニュアルの「付録7 機械語プログラム」をみると、どうやら「上限アドレス〜XXXX」までがマシン語で使える領域らしい。

上限アドレスというのはCLEAR文で宣言するアドレス、XXXXというのはBDOSがあるアドレスで、0006h,0007h番地に書かれているらしい。

 

PRINT HEX(PEEK(7)*256+PEEK(6))

6206

 

どうやらRAMディスクを26KBに設定しているとこの値になるらしい。

そんな大きなプログラムを組むことも無いだろうから、&H5000からをマシン語エリアとした。

 

CLEAR ,&H4FFF

 

これでマシン語のスタートアドレスを&H5000にすれば問題無さそう。

 

HC-40にBASICプログラムを送り込む

開発環境の構築をここで細かく書いていくと大変なので、大きく割愛!

出来上がったマシン語バイナリを、BASICのDATA文に生成して送り込む。

プログラムとしてはこんな感じ。

 

1DATA MDAEFAMJMDADFAPPPPPPPPPPPPPPPPPP
2DEFINT A-Z:CLEAR,&H5000
3PRINT "&H5000 - &H500F"
4AD=&H5000:FOR I=1 TO 1:READ A$
5FOR J=1 TO 32 STEP 2:H=ASC(MID$(A$,J,1))-65:L=ASC(MID$(A$,J+1,1))-65:POKE AD,H*16+L:AD=AD+1:NEXT
6NEXT I
7KEY 1,"LOAD"+CHR$(34)+"COM0:"
8A=&H5000

 

当然だけど、これらは自前で作ったツールで出力される。

1行目のマシン語羅列がプログラムのサイズと共に増えていく構造。

マシン語列をアルファベットにしているのは、転送する量を減らしたかったから。

 データ量を減らすために行番号の間のスペースすら削ってしまった。

受信し終わった後、RUN → 手打ちで「CALL A」で実行。

よしよし、実行出来るようになったね!

 

マシン語コードを直接送り込む

ところで……BASICリファレンスマニュアルを読んでて「BLOAD」という命令が気になっていた。マシン語…というよりはバイナリのロード命令なのだけれども、ファイルディスクリプタにCOM0が指定出来そうだった。

 

まぁ、この手の命令はやってみたけどうまく行かない…というパターンが多かったので、特に期待もしていなかった。

 

ただ、データフォーマットがいかにもシーケンシャルな感じになっていたし、もしかしてRS-232C経由でも送れちゃう?と 思い、半信半疑でテスト。

フォーマットは以下な感じにしておけば良いらしい。

いいね、こういう 単純なフォーマット(^-^)

 

0xFD, 0xLL, 0xHH(配置する先頭アドレス), 0xLL, 0xHH(転送バイト数)

0xnn, 0xnn(以下、転送バイト数分だけデータが続く)

 

こんなテストをバイナリを作って送ってみたところ、なんか読めてるっぽい!

確認用BASICプログラムを作ってメモリの内容を見てみると、やっぱりちゃんと読み込めてる!

なんだ、いちいちBASICの形にしなくても読み込めるのか!!先に気づいていれば…汗

 

それに伴い開発環境を改造、直接バイナリを送り込める形式に変更した。

転送時間が単純に半分以下になった。

 

画面スクロール作ってみた!

VRAMの場所(0xE000)が分かり、キー入力(CP/Mシステムコール)が分かれば、どのくらいの速度で画面を書き替えられるのかを見てみたくなる。

 

とりあえず画面に何か描いて、それをメモリコピーでスクロールさせる。

f:id:PocketGriffon:20200513204035j:plain 

f:id:PocketGriffon:20200513204158j:plain

f:id:PocketGriffon:20200513204129j:plain

最適化を何もしていない状態だけど、秒間64ドットスクロールくらいかな?

 

HC-40を使ってみて思うこと

まず言えることが、とても扱いやすいハンドヘルドだってこと。

CPUがZ80というのが開発環境の自由度を広げてくれてる。

その上でCP/Mという広く普及したOSの上で、BASICが動いてる。

BLOADでバイナリのロードが出来るなど、「使う人」の中に開発者も入れてくれてる感じがすごくする。痒いところにちゃんと手が届いてるマシンに感じた。

 

気に入りました、このマシン!(^-^)/