BDS CでMSX-BASIC(BLOAD)に対応したが

正直、作成したプログラムをMSX-BASICで実行させる機能は要らないと今になって思った。
もしROMカートリッジのプログラムに対応していたらの場合だけど。
BLOADファイルは実行にMSX-DOSが必要なくなるけど、BASICインタプリタを内蔵したROMが必要になって結局ライセンス問題は解決しない。
そして、プログラムの最大サイズが使用メモリも含めて20000バイトぐらいと小さくプログラムサイズが大きくなりがちなC言語を使うのは実用性に乏しい。
使えるメモリとプログラムサイズが最も大きいのはMSX-DOSだがROMカートリッジは最大32752バイトのプログラムが作れ(メガROM除く)実用の範囲内にあると思う。

ROMカートリッジのイメージファイルのサイズ

間違ったことを書いていたので後日訂正しました。
blueMSXも、WebMSXは32768バイトちょうどでないとエラーが出る。(正確には16KB単位のサイズで規格内のサイズ)
100バイトぐらいのプログラムでも32768バイトにしないといけないのは無駄すぎる。

BDS CでMSXのROMカートリッジのプログラム作成に成功

やりたかったBDS CでのMSXのROMカートリッジのプログラムの作成に成功しました。
実物のROMカートリッジは作成しておらず、エミュレーターで動作させました。
まだテストプログラム段階です。
条件アセンブルは手動でやってツールのAAPPで自動化には対応していないのと、
標準ライブラリの移植はこれからなので公開できるのは時間がかかります。
HI-TECH Cでも同様のことはできると思いますが、それは後回しもしくはやるかどうかまだ決めていません。
ROMカートリッジ版のCR3を公開したあとは、WebMSXをC-BIOS専用に改造したいです。
ソースの解析は難しいため作者もしくは誰かの協力がないとできないかも知れません。
C-BIOSは著作権問題を回避したMSXのBIOSです。
C-BIOSはROMカートリッジだけに対応してBASICインタプリタと、BASICのOSとMSX-DOSを使うことはできません。
C言語なので元々BASICは必要どころか邪魔ですし、開発はWindowsで行っているのでMSX-DOSも必要ありません。
ROMカートリッジのソフトが動きさえすればですが。
もし、WebMSXのC-BIOS専用版が完成すれば、MSXはクリーンになります。

zmac はバイナリファイルも出力していた

今気づいたんだけどZ80アセンブラのzmacは、拡張子.cim のファイルにバイナリファイルも出力していた。
知らなかったから、ihex2binというHEXファイルからバイナリへのコンバーターを作って使っていたが、要らんかった。
なんかの役には立つとは思うけど。

MSX ROMカートリッジのプログラムをアセンブラで作ることに成功。

前やろうとしてできなかったんですが、できました。
BDS C用のROMカートリッジの初期化ルーチンとランタイムライブラリとMSXライブラリと標準ライブラリを作らなければならなくなりました。
標準ライブラリは諦めるかも。
今、アセンブラの条件アセンブルをするためのプリプロセッサーのAAPPが、BASICとMSX-DOSの切り替えしかできません。
それを改造して、BASICとMSX-DOSとROMカートリッジの三つを切り替えられるようにしなければなりません。
でも、AAPPのソースは削除してしまってないんです。

最初から作り直しかあ。嫌だなあ。
実は今月、bloadmakeというプログラムも消してしまって短期間に二回も作りました。
せっかく作ったものをまた最初から作るとか、嫌な気分です。
しかもAAPPは作ったばかりで、公開する前にソースなくしてしまった。
バイナリだけ残っています。

MSX ROM cartridge example program(Z80 assembler)

ORG 04000H
;MSX ROM header 16 bytes
DB ‘AB’ ;MSX ROM header mark
DW 4010H ;start address(or initial routine address)
DB 0,0,0,0,0,0,0,0,0,0,0,0

;initial MSX
DI ;4010H
LD SP,(0FC4AH)
EI
LD HL,0C002H
LD (HL),013H
LD HL,0C006H
LD (HL),015H
LD HL,0C00AH
LD (HL),015H
IN A,(0A8H)
AND 0CFH
LD D,A
IN A,(0A8H)
AND 0CH
ADD A,A
ADD A,A
OR D
OUT (0A8H),A
LD HL,08080H
LD (0C032H),HL
LD HL,01H
LD (0C02DH),HL
LD HL,00H
LD (0C049H),HL
LD (0C04BH),HL

;main program
;put ‘v’
LD A,’v’
CALL 0A2H

;program end
ELOOP:
DI
HALT
JR ELOOP

ORG 0BFFFH ;program size 32768 bytes(32KB)
NOP

END

HI-TECH Cのインラインアセンブラの条件アセンブル

が、できないみたいだ。
いろいろやったけど全部エラー。
HI-TECH CでMSX-BASICのOS上で動くプログラムを作る方法は分かってテストプログラムも動作したが、条件アセンブルできないのではMSX-DOSとMSX-DISK-BASICでソースを分けないといけない。
それはしたくない。ひとつのソースで管理したい。
ソースを分けるとど片方のソースファイルを書き換えても、もう片方には反映されず、もう片方も書き換えればいいんだが二度手間になる。
そこでBDS C用に作った条件アセンブルプリプロセッサーのAAPPを試してみたがHI-TECH Cのインラインアセンブラの仕様には合わなくてエラーが出る。
AAPPのソースを少し書き換えれば済む話ではあるが、実はソースは間違って削除してしまってソースがないのだ。
最初からAAPPを作り直さないといけない話。
簡単なプログラムではあるが入れ子(ネスト)にも対応させてあって多少ややこしい。
CR3のHI-TECH C版はMSX-DISK-BASICに移植できるとは思いますが、その前にAAPPをいちから作り直そうと思います。
すぐにとりかかるかどうかは分からない。
気が向いたらやります。

HI-TECH Cで、MSX-BASICのBLOADファイルを作れた

作れないとあちこちに書いたけど、いろいろ調べてやってみたらできた。
分かったのは、置き換えないといけないのはランタイムルーチンは含まず、スタートアップルーチンだけだ。
BDS Cはランタイムルーチンを含んだスタートアップルーチンを置き換えないといけなかった。
(ソースファイルは同じひとつのもの)
そして、BDS Cはライブラリを設定を変えて再コンパイル、Cソースもオプションを変えて再コンパイルが必要だったが、HI-TECH Cはそれが必要ない。
MSX-BASICのプログラムやROM化までのプログラムを作る環境を整えるまでの労力はHI-TECH Cのほうがずいぶんと楽だ。
これだけ言うとHI-TECH Cのほうがすごく思えるがそうでもないかも知れない。
なぜなら、HI-TECH CでMSX-BASICに対応させるとprintfなどの標準ライブラリが使えなくなった。
ランタイムルーチンも書き換えたBDS Cではprintfやgetcharその他は使える。
(fopenなど使えないものもあるが。)
BDS Cはランタイムルーチンのソースも用意されて変更できるので書き換えればだが別のOSでも標準ライブラリがある程度使えるようになっている。
大変更しなくても、CP/Mシステムコールのジャンプアドレスの5番地を、MSX-BASICからMSX-DOSシステムコールを呼ぶジャンプアドレスのF37DHにEQU定義を変えるだけでprintfが使える。
それと同じことをHI-TECH Cでする方法が今のところ分からない。
標準ライブラリのソースを書き換えてコンパイルしてライブラリを作り直すしかないだろう。
必要な関数のみをリンクするようにするにはライブラリマネージャーも使わなければいけない。
やればおそらくできるだろうが面倒くさい。

CR3(落ち物ミニゲーム)+BDS C用MSXライブラリ

http://www.nabeta.tk/msx/cr3.html

バージョンアップしました。
MSXライブラリはMSX-DISK-BASICにも対応して、MSX-DOSがなくても動作するプログラムを作れるようになりました。
そして、CR3のソースは、asu ansi2krを使用することによりANSI C記述に変えました。
また、HI-TECH Cにも対応しました。
HI-TECH CでのMSX機能は自作しました。
HI-TECH CのMSX機能はライブラリ化せずCソースの中にC言語とZ80インラインアセンブラで書いています。
HI-TECH CのほうはMSX-DOSでMSX-DISK-BASICに対応しません。