PC-8201でプログラミング!その1(プログラムに興味のある人向け)

f:id:PocketGriffon:20200530180240j:plain

今回は…

主にPC-8201でのマシン語プログラムに興味のある人向けにテキストを書いています。
プログラム組んでみたいなーって人はじっくりと、そう出ない人はさらっと読んでみてください(^^)
プログラム経験が無いと読み解くのは難しいかも知れません。

 

たまに思うのですが… 

レトロパソコンを趣味とする人は、主に何をするのが好きなんでしょうね??
ゲームで遊ぶんでしょうか? 所有欲でしょうか? それとも1度使ってみたいから?

人それぞれの理由がありそうですが、私は当時のマシンでプログラミングするのが好きです。

当時、高くて手が出なかったマシンが、今はちょっと背伸びをすれば手に入れる事が出来ます。
しかもメモリフル装備とかで!(当時は空いてるスロットを埋めることなんて夢の話でした…)。

せっかく懐かしい機種を手に入れたんだからプログラムを楽しんでみたい!(^^)

 

PC-8201のCPU

PC-8201で使われているのは、8085というCPUです。
あんまり聞き覚えが無いかなーと思いますが、ざっくりソフト的に見たらIntel 8080と同等品です。

速度は2.4MHz。当時としては標準的か、少し速度遅いかな…くらいの感じだと思います。
この速度に加え、液晶へのアクセスの煩雑さが相まって、使ってみるともっさりした感じがします。

 

PC-8201のメモリマップ

f:id:PocketGriffon:20200530200537j:plain

あんまり詳しいことは書きませんが、前半32KBがROM、後半32KBがRAM、というざっくりとした覚え方で構わないかと思います。
マシン語を置く場所はCLEAR文で指定をします。
そんな大きなプログラムを書くわけで無ければF000h以降に置けば良いかと思います。

 

CLEAR 256,61440

 

PC-8201はメニューからバンクを切り替える機能があります。SHIFT+F5で切り替える事が出来ますが、メモリを32KB以上に増設していないと機能しないようです。この機能、「メモリ空間を広げて使う」というよりは、「もうひとつの環境があって、それとごっそり切り替える」機能のようです。最初、この考え方には面食らいました(^^;

f:id:PocketGriffon:20200530200631j:plain

 

開発環境とか言語とか

やっぱり開発の手間は減らしたい(この歳になると寿命と直結する)ので、高級言語(これって死語?)を使いたい。
最初に探すのはやっぱりC言語でしょう!
しかもPC-8201のCPUに対応している必要があります。
つまり8085(8080)のコードを出力してくれるコンパイラ

 

調べてみると、CP/M-80で利用されていたコンパイラがいくつかヒットします。
BDS-C、Small-Cなどなど。
しかしこれらはCP/M-80の環境が無いと活用が出来ないので、気軽に使える感じではありません。

 

商用ではLSI C-80というのがあります。私自身、遙か昔にLSIC-80を購入している人なのですが、度重なる引っ越しでパッケージをどこかにしまい込んでしまってて、残念ながら見つかってません…。見つかったらコレ1択なのに(T-T)

 

ところでMSX-CはZ80のコードしか出力出来ないんでしょうか…手元にパッケージもあるので試してみたら良いのですが、MSX環境をしまい込んでしまったのでセッティングが面倒です…汗

f:id:PocketGriffon:20200530200734j:plain

 

便利なコンパイラが使えないのならば、アセンブラを使うしかありません!
Z80と8085の違いを理解してる人であれば、Z80アセンブラをそのまま使用する事が出来ます。

 

Z80用だったらいろんなアセンブラがあります。むしろどれを使ったら良いのか悩むほど!
そんな中で、私は昔から使ってるアセンブラがあるので、それを使う事にしました!
zasmというアセンブラです。
これを利用して作ることにします!

k1.spdns.de

 

PC-8201へプログラムダウンロード

PC-8201へ、RS-232C経由でバイナリを直接送り込めれば良いのですが、そうは問屋が卸してくれません。
マニュアルにはBSAVEでファイルディスクリプタをCOM:にしてやれば送り込めそうな気がするのですが、実際にやってみるとFC(Illegal function call)エラーになってしまいます。

f:id:PocketGriffon:20200530201212j:plain

 

仕方ないので、BASICプログラムの中にバイナリデータを内包し、実機側でメモリに書き込む方法を考えてみます。
RUNすればマシン語データを所定のメモリへ書き込み後、実行までしてくれたら便利です!

PC-8201はBASICでの16進数表記(&H)が使えません。
パッと見てアドレスやデータが分かりづらいのですが…
こんな感じのプログラムを送り込むのが簡単そうです。

 

10 CLEAR 256,57344
20 FOR I=0 TO 311:READ A:POKE 61440+I,A:NEXT
30 CLS:EXEC 61440
40 DATA 195,234,240,229,197,6,240,33,0,232,119,35,119,35,119,35
50 DATA 119,35,119,35,119,35,119,35,119,35,5,194,10,240,193,225
  :

 

通信速度については、9600bpsノーウェイトでダウンロード出来てしまいます。
まだものすごく大きなバイナリは試していないのですが、少なくとも4KB程度のサイズであればすんなり転送出来ます。
1200bps程度の速度しか出ないHC-40とは対照的。

 

グラフィックデータのような「大きなデータで、かつ1度メモリに転送しておけば滅多に変更が無いもの」については、転送速度を短くする方が得策なため、データーフォーマットを少し工夫して転送量を減らしたりしてます。

 

1CLEAR 256,57344
2AD=57344:FOR I=1 TO 96
3LOCATE0,0:PRINT AD:READ A$
4FOR N=1 TO 32 STEP 2:D=(ASC(MID$(A$,N,1))-65)*16+(ASC(MID$(A$,N+1,1))-65):POKE AD,D:AD=AD+1:NEXT N
5NEXT I
6DATAPPABGBLBPBGBABABABABABABABABABAB
7DATAABABABABEBIJNFJFIJJFJFAJABABABPP
  :

 

行番号後のスペースすら削ってしまった!

 

これら一連のBASICプログラムを自動生成するツールを作成して使ってます(^^)
打ち込むコマンドは「make」のみです。

 

うーん、やっぱり抽象的な書き方になってしまうのは仕方ないのかな…。
もう少しPC-8201のプログラミングについて書こうかと思っていましたが、想像以上に複雑になりそうだったので合間をみつつ書いていこうと思います。
その前に…こんな話題に興味ある人いるんだろーか(^^;