@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 --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
これはフリーソフトウェアです. 利用許諾についてはソースを
ご覧ください.
商業性や特定の目的への適合性の如何に関わらず, 無保証です.
This program built for i386-pc-mingw32
⭐︎Macの場合はwineを入れてMakefileをちょっと修正
hex2bin
とt88tool
はWindowsのCLI(コマンドライン)ツールです。わたしのメイン環境はM1 Macbook Proなので、そのままではWindowsのexeは動きません。ちょっと諦めかけていたんですが、wineを入れたらいけるかも?と思って入れてみてうまく行ったのでご紹介。
wineの導入
MacにHomebrewでwineを入れましょう。M1 Macの場合はarch指定をしないとダメかも。
以下のページの手順を参考に順に実施させていただきました。ありがとうございます。

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経由でhex2bin
やt88tool
を動かすため、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.exe
やt88tool.exe
と拡張子まで指定してください。これでwine
の下でそれぞれのexeが動くようになります。
※ちなみに、MakefileにはPC-8001で実行するときのアドレスがPROG_ADDR
で切られているので PC-8001の環境が16kバイトの機器をお使いの場合などは適宜別のアドレス(8080
→C080
など)に変更してください。
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版リリースサイトからインストーラーを落としてきてインストールしてください。

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言語でクロス開発できますので、ハードルがぐぐっと下がる気がします。ぜひぜひお試しを!!
コメント