PC-8001のプログラムをC言語で開発(M1 MacもOK)

PC-8001

@tako2さんが「PC-8001 SDCC 開発サンプル」をGithubで公開してくださいました。
PC-8001のマシン語プログラムをパソコン上のC言語で開発できるという素晴らしい環境です。Windowsが前提の雛形でしたが、wineを使ってCLIツールの起動ができたのでM1 Macでもサンプルプログラムのビルドができましたので、まとめてみます。

SDCC(Cコンパイラ)を導入

なにはともあれ、CコンパイラのSDCCが必要です。Windowsの方はSDCC (https://sdcc.sourceforge.net/) にアクセスして、ダウンロードページx86_64 Binariesのところにある setup.exeをもらってきましょう。
私がWindows環境に入れたバージョンはv4.5.0です。

> sdcc --version
SDCC : mcs51/z80/z180/r2k/r2ka/r3ka/sm83/tlcs90/ez80_z80/z80n/r800/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15/mos6502/mos65c02/f8 TD- 4.5.0 #15242 (MINGW64)
published under GNU General Public License (GPL)

Macの方はHomebrewでの導入がオススメ。

arch -arm64 brew install sdcc

PC-8001 SDCC 開発サンプルの準備

gitを使って手元にcloneする

まずは、自分のパソコンに@tako2さんの「PC-8001 SDCC 開発サンプル」をGithubから持ってきましょう。cloneするときはワークフォルダなどへcdしてからにしてください。cloneを実行した直下にpc8001dev フォルダが作られます。

mkdir work
cd work
git clone https://github.com/tako2/pc8001dev.git

githubからcloneすると以下のようなフォルダ&ファイルが出来上がります。
sample.c がPC-8001で動くプログラムです。ランタイムルーチンが mycrt0.asm として添付されています。

% tree
.
├── LICENSE
├── README.md
├── sample
│   ├── build
│   │   └── Makefile
│   ├── mycrt0.asm
│   └── sample.c
└── tools
    └── cmt2wav.py

ビルドは build フォルダでmakeを叩けば動くのですが、もうちょっと準備が必要です。

ツールを準備

README.mdに書いてある通り、Makefileで使われている以下の2つのツールをゲットして cmt2wav.py と同じ tools フォルダに入れましょう。インテルHexファイルをバイナリ形式へ変換するツールと、PC-88/80系のファイルを生成してくれるツールです。

ツール名注意点
hex2bin
https://sourceforge.net/projects/hex2bin/
tar.bz2形式のファイルをダウンロードして展開すると/bin/Release フォルダに hex2bin.exe があります。
t88tool
http://bugfire2009.ojaru.jp/download.html#t88tool
zipを展開して出てきた t88tool.exe だけでOK!

ビルドにはmakeが必要です

ビルドはmakeを使って実施します。GNU makeを導入しておいてください。
Windows環境の場合は以下のページから Binaries のzipをダウンロードするのが吉です。

Make for Windows
make {whatisit}
> make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
これはフリーソフトウェアです. 利用許諾についてはソースを
ご覧ください.
商業性や特定の目的への適合性の如何に関わらず, 無保証です.

This program built for i386-pc-mingw32

⭐︎Macの場合はwineを入れてMakefileをちょっと修正

hex2bint88toolはWindowsのCLI(コマンドライン)ツールです。わたしのメイン環境はM1 Macbook Proなので、そのままではWindowsのexeは動きません。ちょっと諦めかけていたんですが、wineを入れたらいけるかも?と思って入れてみてうまく行ったのでご紹介。

wineの導入

MacにHomebrewでwineを入れましょう。M1 Macの場合はarch指定をしないとダメかも。
以下のページの手順を参考に順に実施させていただきました。ありがとうございます。

Wine で Mac で Windowsアプリを動かそう

wne本体を入れる (これだけで良いかも?)

brew tap gcenx/wine
arch -arm64 brew install --cask --no-quarantine wine-crossover

wine補助ツールを入れる

cd ~/Downloads
curl -OL https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
arch -arm64 brew install winetricks

日本語代替フォントを入れる

winetricks fakejapanese_ipamona
winetricks fakejapanese_vlgothic

Makefileの修正

wine経由でhex2bint88toolを動かすため、Makefileをちょっとだけ修正します。

PROJECT = sample
PROG_ADDR = 8080
DATA_ADDR = c000
     :
     :

$(BIN_IMAGE): $(IHX_IMAGE)
	wine $(TOOLDIR)/hex2bin.exe $<

$(CMT_IMAGE): $(BIN_IMAGE)
	wine $(TOOLDIR)/t88tool.exe -M -f $@ $< $(PROG_ADDR)

上記のように、各ツールの前に wineコマンドを追加するのと、hex2bin.exet88tool.exeと拡張子まで指定してください。これでwineの下でそれぞれのexeが動くようになります。
※ちなみに、MakefileにはPC-8001で実行するときのアドレスがPROG_ADDRで切られているので PC-8001の環境が16kバイトの機器をお使いの場合などは適宜別のアドレス(8080C080など)に変更してください。

CLIツールを動かすためだけにwineはちょっと大袈裟かもしれないので、なにか他に良いツールがあったら教えてプリーズです。

sample.cをビルドしてみよう

SDCCでC言語ソースをクロスコンパイルする環境ができたので、sample.cをビルドしてみましょう。
ちなみにsample.cの中身は以下のようなソースとなってまして、文字列 “Hello World!”をPC-8001のVRAM先頭アドレス 0xF300 から順に書き込むというものです。画面だと左上のところに表示されます。

#include <stddef.h>
#include <stdint.h>

void myprint(const uint8_t *str)
{
	uint8_t *vram;

	vram = (uint8_t *)0xf300;

	while (*str != 0) {
		*vram = *str;
		vram += 2;
		str ++;
	}
}

void main()
{
	myprint("Hello World!");

	while (1) {}
}

ビルドコマンド投入

ビルドコマンドを投入する手順は以下の通りです。

cd pc8001dev/sample/build
make

makeを実行すると Cランタイムの mycrt0.asmがアセンブリされ、続いてsample.cがコンパイルされリンクされます。
コンパイル結果はインテルHexで出力されてhex2binコマンドでバイナリが作られ、その後t88toolでPC-8001用のcmtファイルが作られます。

% make
sdasz80 -o mycrt0.rel ../mycrt0.asm
sdcc -mz80 -c -I ../ ../sample.c
../sample.c:17: warning 283: function declarator with no prototype
sdcc -mz80 --code-loc 0x8080 --data-loc 0xc000 --no-std-crt0 -o sample.ihx mycrt0.rel sample.rel
wine ../../tools/hex2bin.exe sample.ihx
wineserver: using server-side synchronization.
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
00cc:err:environ:init_peb starting L"Z:\\Users\\kuninet\\git\\pc8001dev\\tools\\hex2bin.exe" in experimental wow64 mode
hex2bin v2.5, Copyright (C) 2017 Jacques Pelletier & contributors

Allocate_Memory_and_Rewind:
Lowest address:   00008080
Highest address:  000080C1
Starting address: 00008080
Max Length:       66

Binary file start = 00008080
Records start     = 00008080
Highest address   = 000080C1
Pad Byte          = FF
wine ../../tools/t88tool.exe -M -f sample.cmt sample.bin 8080
00e4:err:environ:init_peb starting L"Z:\\Users\\kuninet\\git\\pc8001dev\\tools\\t88tool.exe" in experimental wow64 mode
<<<t88tool ver1.24>>>
option : output *.cmt
output file name = sample.cmt
[sample.bin]
First Address = 8080
Check Address Header [31 00 00 21]
 #1  []       (bin) : 8080-80C1 :    66 [Byte]
----- Data End -----
(CMT MAKE)
FunctionKey : L<CR>g8080<CR> :     9[Byte]
Write Machine Program (EA68-EAC8) [autokey]
Write Machine Program (8080-80C1) []
--> sample.cmt
------

sample.cmtファイルをSDカードにCOPYして SD-DOSや yanatakaさんのPC-8001_SDボードでPC-8001実機で動かすもよし PC-8001miniやエミュレーターで動かすもよしという感じです。

カセット入力音声ファイル作成

実機にSDカードインターフェースを装備していない場合はカセットインターフェースからロードして使いたい!ということになると思います。@tako2さんのPC-8001 SDCC 開発サンプルにはcmtファイルからwavファイルを作成するpytthonスクリプトがついてます。

Python3の導入

pythonスクリプトを動かすためにpython3を導入してください。Windowsの場合は以下のPythonのWindows版リリースサイトからインストーラーを落としてきてインストールしてください。

Python Releases for Windows
The official home of the Python Programming Language

Macの場合はHomebrewでインストールがお手軽です。

arch -arm64 brew install python@3.12

Macの場合はMakefileをちょっと見直し

Macの場合はMakefileをちょっと修正しましょう。python3コマンドを頭につけてあげると良いかもです。(わたしの環境だけかも…)

        :
wav: $(CMT_IMAGE)
	python3 $(TOOLDIR)/cmt2wav.py $< $(WAV_IMAGE)
        :

カセットインターフェース音声wavファイル作成

カセットインターフェースでロードできるwavファイルはmakeコマンドにwavオプションをつけて実行するとsample.wavができあがります。

make wav

smple.cをビルドして出来たプログラムを実行してみよう

smple.cをビルドしてできたプログラムを実行してみましょう。ビルドして出来上がったファイルはマシン語のファイルですのでカセットインターフェース経由でロードする場合はmon[ret] → L[ret]するとオートスタートルーチンが入ってますので自動実行されます。

PC-8001_SDの場合は mon[ret]*L SAMPLE.CMTのところにカーソルを持って行って [ret]でオートローダまで自動実行されます。

最後に…

PC-8001のプログラムは、実機でN-BASICで作るかTL/1-PCなどのコンパイラを使うか…はたまた別のパソコンを使ったクロス開発では The Macroassembler AS のようなZ80クロスアセンブラで作るか?という感じでしたが、SDCCを使うとC言語でクロス開発できますので、ハードルがぐぐっと下がる気がします。ぜひぜひお試しを!!

コメント