MacでMSXのプログラムを作る!

2023年3月12日に秋葉原UDXにて行われた、MSX DEVCON3に参加した。

その時、会場にM5Stack Core2を持参すれば、今現在のMSX0を書き込んで送り返してくれるということだったので、私もお願いする事とした。

 

よくよく考えてみると、MSXでキチンとプログラムを作ったのは1990年が最後。

それ以降、3年くらい前にFS-A1ST(TurboR)が出土するまでの間、触ったことがなかった。

 

思えばMSXで初めてアセンブラというモノを使った(それまではハンドアセンブル)。

自分にはマシン語プログラムで256バイト以上のものは作れないだろうと思い込んでいたが、アセンブラを使用する事でこんな簡単になるんだ!と驚いた覚えがある(^^)

 

当時入っていた大阪のマイコンクラブで行われていたプログラムコンテストに参加するために奮闘したのをきっかけに、Z80アセンブラがスラスラ書けるようになった。

 

その後、なにかのきっかけがあり、マイコンBASICマガジン1982年11月号に掲載されていたPC-8001用のCOSMO MISSILEというゲームを、目コピーでMSXへ移植した。

オールマシン語のプログラムもこれが初めてだった!(^^)

↑今でもソースファイルは手元に残っている。

アセンブラソースファイルで57KBにもなった(コメントが多い)。

当時は中二病のようなペンネームを使っていたので、自己保身のために隠したww

 

MSXでCコンパイラ

今の時代にアセンブラZ80をバリバリ書くのも楽しいけれど、もう良いお年頃でもあるので、速度を要さない部分などはできるだけ手軽に書きたいのがホンネだ(^^;;

 

そこで、今使えるZ80のCコンパイラを探してみる事。

 

まず有名なのはMSX-C

今回のMSX 0 M5Stackにも入れると西和彦さんが表明してくださっている。

せっかくあるツールならば使わない手はないだろう(^-^)

ちなみに製品版の場合、MSX-Cを使うためにはMSX-DOS2 TOOLSが必要で、さらに日本語MSX-DOS2も必要になり、当時だいぶ泣いた(T-T)

MSX-Cを活用する場合には、実機(MSX0 M5Stack)上で動かす必要がある。現在の開発環境としてはどうだろうか…。

 

ちなみにMSX-CはZ80のコードを出力するんだろうか?それとも8080コード限定なんだろうか…。使っていた当時、あんまり気にした事が無かったけれども…汗

 

 

次に思い浮かんだのはSDCC

sdcc.sourceforge.net

SDCCは、2008年頃に某書籍を執筆しようとしている時に利用していた。

結局、書籍自体が頓挫してしまったため世には出なかったけれど…汗

 

そして2020年、HC-40のプログラムをするためにも活用した。

pocketgriffon.hatenablog.com

2008年頃に使用したSDCCとはオプションの表記が変わっていて、全部調べ直す事となった。コレは想像よりもだいーぶ苦労したよ…orz

 

今であればSDCCを利用するのがオススメだと思う。

WindowsでもMacでもLinuxでも使用できるメリットは計り知れない(^-^)

 

 

そして私が大好きなLSIC-80

これは商用コンパイラなんだけど、長年(少なくとも20年以上!)使っている。

そのおかげで初期のセッティングに慣れている事や、コンパイラが出力するコードを理解しているため、人間最適化がしやすかったりして、個人的に気に入っている。

 

ただ、問題があるとすれば(私が所有しているパッケージでは)Windows環境でしか動かない事だ…。MS-DOS環境ではなくてWindows環境だ。これはMacユーザーには敷居が高い。

 

だけど!

今回はWineを利用する事で、M1 Mac上でWindowsアプリを動かす事が出来た!

思ったよりも快適に使えているので、備忘録を含めて残しておこうと思ったのだ!

この記事は誰得?!(^^;;

 

M1 MacWineを使う

今回やりたい事は、M1 Mac上でIntelコードで書かれたWindowsアプリを動かしたいだ。

異なるアーキテクチャのものを動かすので、結構厄介かも知れない…(^^;;

 

zenn.dev

M1 MacにWineをインストールする方法は、上の記事を参考にさせていただいた!

有益な情報を残してくださった筆者様には感謝しまくりだ!(^-^)

 

インストールしたWineでLSIC-80が動くか試してみる。

よしよし、なんとなく動きそうな予感だ!

実際にコンパイルしてみよう。

あら??cppがないと怒られた。

 

実はlcc80.exeはコンパイラドライバであり、内部でプリプロセッサやパーサーなどを順次呼び出すようになっている。

そのため、実行パスを通しておかないとコマンドを見つけられないようだ。

 

Wineプログラムへパスを渡すためにはWINEPATHという環境変数を設定するらしい。

ここでハタと困った…。

WINEPATHへ渡すのは、Macから見た絶対パス?それともWineから見たパス??

どちらも試してみたところ、どうやらWineから見たパスを渡すようだ。

 

Wineから見たCドライブは、~/.wine/dosdrives/c:/ となる(実態はdrive_c)。

そこにLSIC-80本体を入れつつパスを通す。

 export WINEPATH=C:/lsic80/bin; wine lcc80.exe hello.c

 

これらの情報を暗記したままにするのは無理なので、急いでMakefileを書いていく!(^-^;

 

プログラムを作る

さて……MSXのプログラムを作るのは、以前turboRを発掘して以来だ!

出てきたturboRはFDDが空回りする現象が出ていた。修理してみようと頑張ったけれど、当時の私の修理技術ではまともに直す事が出来なかった…orz

仕方ないので、SDカードが刺さるカートリッジというのを手に入れた!(^o^)

そこにFlashAirというWiFi付きのSDカードを差し込んで、最新の開発環境を満喫した!

 

「FiashAir MSX」で検索したら、当時のツイートが出てきた(^^;;

 

出来上がったCOMファイルを、単純にファイルコピーしてMSX側で実行する事が出来たので、本当に便利だった!

 

この本を参考にしながらFlashAirのセッティングをしていた。
FlashAir側にこんな設定が出来るなんて知らなかった!この本に出会わなかったら、便利な環境は作れなかっただろう!(^-^)

 

今、このカートリッジは親しい友人に貸してしまっているため手元にはない。

そんな状況でどうやってMSXの開発をするか…。

というわけで、今回はエミュレータ(fMSX)を使うことにした!(^^)

 

作ったプログラムをディスクイメージに固めてMSX側でコマンド名を入力して実行して…という過程を想像していたら、ちょっとコレは面倒カモ??と思ってしまった。

ROMカートリッジのヘッダを付けるなりして、なんとか自動起動が出来ないだろうか…。

久しぶりにテクニカルハンドブックを引っ張り出す!

この本には本当にお世話になった!(^-^)

使いすぎてボロボロになってしまっているけれど、まだまだお世話になりそうだ!

 

これを見る限り、ROMヘッダを偽装(偽装?!)するのは簡単そうだ!

 

…あれ?
アセンブラってこれだけで済んじゃう??(^-^;;
あ、アセンブラ自体はLSIC-80付属のrz80.exeを利用している!
 

ちなみにスタック領域については、テクニカルハンドブックに載っていたワークメモリマップを見て、F380h以前ならば大丈夫なのかも…と思って設定している。
もっと適切な場所があるようならば助言いただけると助かります!(^^;;
 

C言語で書いたプログラムはこんな感じ。
 
MSXのブートシーケンスはちゃんと理解していないけれど、カートリッジプログラムに制御が渡ったタイミングでBIOSは使えるらしい。
_chputや_initxtはBIOSコールを呼び出すdefineマクロで、定義自体は自分で書いている。
 
コードは4000h、ワークエリアはC000hのアドレスに生成されるよう、リンカのオプションを設定してコンパイル!これで無事に似非ROMカートリッジが出来上がる(^-^)
 
fMSXを起動する時のオプションとして、出来上がったバイナリを指定してやれば、起動した瞬間にプログラムを実行する事が出来る!

最初から最後までタッチパッドを触ること無く作業が進む環境に大満足だ!(^-^)

 

おわりに

今回はLSIC-80を動かすという、おそらく日本でやろうとする人はいないであろう事を題材としたけれど、Windowsでしか動かないソフトをMacで動かす良い例になるだろう(^^)
 
これまでWindowsでしか使えないソフトがあるたびに悲しい思いをしてきた。我慢しきれなくなって、開発環境をWindowsへ移行するか…と決意し、2022年12月にWindowsマシンを購入した。
 
でも私は長年Macを使い続けてきたせいで、もはや指がMacのショートカットを覚えきってしまっている状態。些細な違いでもイラっとしてしまい、Windows環境が合わず2ヶ月もしないうちにMacに戻ってきた(T-T)
 
そのWindows環境でしか動かないというツールの代表格がLSIC-80だったのだ。
しかしこれがM1 Macでも問題なく動く事が分かった今、Windowsを使う必要性が全く無くなってしまった!(^^;;;
 
MSX0 M5StackはIoTの活用に振ったものだとは理解しているけれど、ネットワークはまだしもGroveに接続される機器は得意とは言えない(T-T)
せめてソフトウェア側で頑張るよー!(^-^;;
 
ではまた次回!(^-^)ノ