PCでPasocomMini MZ-80Cの開発環境を整える
発売直後に入手し、同梱ソフトで遊んだり、簡単な動作確認をしたまま放置していたPasocomMini MZ-80Cですが、どうせだからもうちょっと使ってる感のある使い方をしてみたいな、と思い、MZ-80Cネイティブのプログラムを書いてみる事にしました。
とはいえ、PasocomMini実機でアセンブラでプログラムを書くのは結構しんどく、一応S-OSを動かして、その上でREDAを動かしアセンブルして動作、といったところまではやってみたものの、実際にはPCでクロスアセンブルしたものを持っていくのが現実的であろうと考え、その付近の環境を整えてみる事にしました。
アセンブラの準備
PC向けのZ80のアセンブラは結構ありますが、なんとなくASxxxx( http://shop-pdp.net/ashtml/asxxxx.htm )を選択しました。この環境にはZ80以外のCPUのアセンブラも提供されており、そのうち他のCPUも触りたくなった時にソースコードの書式を覚えなおさなくていいから楽かなあ、といった程度のザックリした理由です。また、WindowsでもMacでもLinuxでも動くので、環境を選ばないというのも良い点です。
(Windowsの場合) ダウンロードサイト( http://shop-pdp.net/ashtml/asxget.php )からVS 2013版等お好きなものをダウンロードし、テキトーにインストールします( asz80.exe と aslink.exe をパスの通ったところに放り込む。あるいは c:\asxxxx など、好きなところに入れる )。
(Mac等の場合) 上記ダウンロードサイトから ASxxxx Cross Assemblers Source Code as a zipped file (5118K) をダウンロードし展開、asxs5p20/asxv5pxx/asxmak/linux/build に移動してからmake、asxs5p20/asxv5pxx/asxmak/linux/exe の下に実行ファイルが出来るので、 asz80、aslinkをパスの通ったところにコピーします。
IHXの変換
ASxxxxはリンク時にIntel HEX形式での出力を選べます。Intel HEX形式は比較的簡単なフォーマットなので、これを変換して、PasocomMini MZ-80Cで使えるMZTフォーマットにする事にします。
変換は何でやっても良かったのですが、なんとなくPythonでテキトーに書いてみました。
こちら、Python 3で動く気がするので、テキトーにPythonの環境を整えてください(こんなところを読む人はこれくらいでわかると思うので説明がテキトーです)。
また、上記スクリプトの一行目はWindowsで動かすための設定になっているので、Windows以外の方は適切に書き換えてください(スクリプト内に、書き換え用のコメントが記載してあります)。
IHX2MZTの使い方
$ python ihx2mzt.py -h
usage: ihx2mzt.py [-h] [-o OUTNAME] [-n MZTFNAME] [-x EXEADDR] infile [infile …]Intel Hex to MZT Converter.
positional arguments:
infile ihx file nameoptional arguments:
-h, –help show this help message and exit
-o OUTNAME, –output OUTNAME
output file name(.mzt)
-n MZTFNAME, –name MZTFNAME
MZT file name(ASCII)
-x EXEADDR, –execaddress EXEADDR
execute address(HEX)
基本的にはIHXファイルを引数に与えるだけで、MZTファイルを出力します。
IHXファイルには、自分がメモリのどのアドレスに配置されるべきか、という情報が入っているため、その情報を元にMZTファイルを作っています。複数のIHXファイルが与えられた場合、各IHXファイルが重ならない状態である場合は、メモリ空間上にいい具合に並べた上で、1つのMZTファイルに出力します。
この仕組みにより、例えば、S-OSのIHXファイルと、S-OSのプログラムのIHXファイルを同時に与えると、S-OSが含まれたMZTファイルが出来上がるので、いちいちS-OSを読み込んでから自分のプログラムが入ったMZTファイルを読み込む、といった手間が省けます。
また、オプションとして-o の後に出力ファイル名(.mzt)、 -n の後にMZ-80内でのファイルの名前、 -x の後に実行アドレス(16進数)を指定する事が出来ます。
Makefileの用意
いちいちコマンドラインを叩いていては面倒なので、Makefileを作ります。なんらかのmakeを拾ってきてパスを通してください( Windowsの場合は このへん、MacやLinuxの場合は、まあ、いい具合にお願いします(大雑把すぎ))。
下記のようなMakefileを作る事で、アセンブル、リンク、MZTファイルの作成までを一発で行います。
エディタにてmakeを呼び出すような設定にしておくと便利でしょう(自分はSublime TextでCtrl+Bでmakeが行われるようにしました)。
#
# Makefile
#
# source file
PGM=sostst
# link target ihx (SWORD, etc...)
LINKIHX=./SWORD.IHX
# for Windows
ASXXXXPATH=c:/asxxxx/
REMOVE=del
# for Mac / etc...
# ASXXXXPATH=
# REMOVE=rm -f
ASBIN=$(ASXXXXPATH)asz80
ASLINK=$(ASXXXXPATH)aslink
IHX2MZT=./ihx2mzt.py
all: $(PGM)
install: $(PGM)
clean:
rm -f $(PGM)
rm -f $(PGM).o
rm -f $(PGM).lst
$(PGM):
$(ASBIN) -o $(PGM)
$(ASLINK) -i $(PGM)
$(IHX2MZT) $(PGM).IHX $(LINKIHX)
$(REMOVE) $(PGM).ihx
$(REMOVE) $(PGM).rel
見てのとおりかなりテキトーです。Windows用で、なおかつS-OSのIHXを混ぜる設定になっていますが、このあたりは各自いじってみてください。
S-OS “SWORD”のIHXファイル
Oh!MZ 1986年2月号のMZ-80K/C版S-OSを自分で入力した上で、少しいじったS-OS “SWORD”のIHXを置いておきます。
これを単純にIHX2MZT.pyで変換すると、素のS-OSのMZTが出来上がります。
サンプルプログラム
下記のようなプログラムを sostst.asmとして保存し、SWORDのIHXファイルを同じパスに配置した上で、前述のMakefileを置き、makeを実行すると、sostst.mzt が出力されます。このファイルをPasocomMini MZ-80CのSDカードの /PCM/MZ80 フォルダの下に配置して読み込む事で、自動でS-OSが起動するので、「J3000」と入力する事で、下記プログラムが実行出来ます。
.AREA CODE1 (ABS)
.ORG 0x3000
MPRINT .EQU 0x1fe2
CALL MPRINT
.ASCII 'HELLO S-OS SWORD!'
.DB 0x0d,0
RET
いちいちSDカードを外してリブートして……というのが面倒な場合は、FlashAirを使って無線で転送する(しかしリブートは必要)という方法もあるので、ググっていただければと思います。
いちいち転送するのが面倒な場合はエミュレーターを使い、法的に問題ない 互換モニタをダウンロード すれば多分大丈夫だと思われます。
更にお試しで作ったもの
こちら、twitterに先行して上げた動画ですが、PCGの動作チェックとして、ハイドライドっぽいマップをキーボードでスクロールさせる、というデモプログラムです。
画像は全て自分で描きおこしてますし、マップデータもMSX版を元にしつつ自分でマップエディタ(Tiled)で並べたものなので、権利的にはソースを公開したりしても問題ないはずですが、Z80をマトモに書いたことのない人間が書いたコードのため、むしろ悪影響がありそうなので、ソースコードはナシで、MZTだけ置いておきます(ディスアセンブルすれば丸見えですが……)。
WASDキーで上下左右にスクロールします。スクロールだけなら、まあまあ実機の速度でもそんなに問題ない速度が出ていますね(一応VBlankを待って、問題ないタイミングで画面を描き変えているはずですが、実機での確認は出来ていないので、実機ではチラつくかもしれません)。
ちなみに、ここからゲーム化する気はないのであしからず……。
まとめ
という事で、MZ-80のプログラムの環境構築についてまとめてみました。
自分でやった事としては、IHXをMZTに変換するツールを作ったくらいで、あとは世の中に転がっているものを拾ってきただけでしたが、何かの参考になれば幸いです。
記事を見ればおわかりかと思いますが、開発環境を作るだけならそんなに難しくないので、もし、買っただけで眠っているPasocomMini MZ-80Cがありましたら、この記事を参考に何か作ってみるのも面白いかもしれません。
自分も、今の時代、Unityなどのゲームエンジンで開発をする事が多いですが、たまにはアセンブラなんかを書いて、全てが手のうちにあった時代に想いを馳せつつ、楽しく開発が出来ればなー、と、思っております。
では!
最近のコメント