I made intel HEX file to binary file converter.

Version Up to ver 1.1
18 Mar 2017
http://www.nabeta.tk/msx/ihex2bin1.1.zip

FFFF番地まで対応。
Z80アセンブラを使うのに必要だったので作りました。
Windows版です。
コマンドラインで、DOS窓で使います。
C++ Builderで、ANSI C記述で作りました。
ソース込み。
ライセンスは、2-Clause BSD License
ソースや実行ファイルをたまになくすので、なくす前に公開しました。

I made ANSI C to K&R C(BDS C,MSX-C)converter,translator

This is a old version. please wait upload new version.
バージョンアップしました。
これは古いので新しいバージョンのアップロードをお待ちください。
http://www.nabeta.tk/msx/ansi2krwin1.0.zip

名前は、asu ansi2kr です。
これはBDS Cをある程度ANSI C化するためのものです。
ANSI C記述のソースをK&Rソースにある程度変換します。
おそらくMSX-Cにも有効だと思います。
C++ Builder(ANSI C記述)で作りました。
ソース込みで公開しました。
ライセンスは2-clause BSD license です。
添付している実行バイナリはC++ BuilderでコンパイルしたWindows版ですが、
BDS CでコンパイルしたCP/M、MSX-DOS版と
HI-TECH CでコンパイルしたCP/M、MSX-DOS版も存在します。
現時点、CP/M、MSX-DOS版の実行バイナリは公開していませんがする予定でいますし、ソースあります。
BDS Cは単体ではANSI Cに対応していませんが、このasu ansi2krで変換かけるとasu ansi2krのソースをBDS Cでコンパイルできます。
まだホームページは作っていないです。
最近いろいろ作っていて、まとめて公開しようと思っていたのですが、昨夜、最近作った二つのプログラムを誤って削除してしまい無くしてしまいしました。
いますぐまとめて公開することはできなくなりました。
そこで、一番最後に作ったこの asu ansi2kr を先に公開します。
Vectorにも登録申請しました。
変換前と変換後の行番号が一致してずれないのでコンパイラが出力するエラー行を見てANSI仕様の変換前のソースの修正をすることができます。
このコンバーターのおかげで、BDS CのソースをC++ BuilderやHI-TECH Cと共通化できて便利です。

ソースを誤って削除して復活できない。

最近作った二つのプログラムのソースをDOS窓のDELコマンドで削除してしまった。
ファイル復活ソフトを試してみたが普通のスキャンでは目的のファイルは見つからない。
詳しくスキャンすると時間がかかりすぎるので途中でキャンセルした。
最後までやってないけど何日もかかりそうな気がした。
削除ファイル復活ソフトはディレクトリ(フォルダ)の指定ができずドライブの指定しかできない。
ドライブ全てをスキャンしようとする。
これでは復活は無理そうだ。
指定したディレクトリ(フォルダ)だけ読みに行けないということは復活させる方法なんて分かってない復活ソフトなんだろうと思う。
どこのディレクトリか分かっているのにドライブ全体を読みに行って関係ないファイルの一覧を出されても困る。
無くしたプログラムのうちのひとつは数日前の実行ファイルだけは残っている。
もうひとつは実行ファイルも消えた。
同じ物をまた作ることは可能だとは思うが時間がかかる。
二度と同じ物は作れないとは思わないが大変だ。
精神的ショック。
他のファイルは復活可能だが、作業環境が消えている。
とりあえず、可能なところまで復旧しないと。
バイナリすらなくしたプログラムは最初から作り直さないといけない。
バイナリだけ残っているものはとりあえず、ソースなくてもいいか。

BDS CのターゲットMSX-BASICでBASIC復帰に対応。

BDSCのスタートアップルーチンのC.CCCをCP/M(MSX-DOS)からMSX-BASICに普通に変えると、
プログラムの終了時に暴走するかリセットするかになる。
どうやったらリセットかけずに済むのかいろいろやってみて、できました。
やはり、リセットかかりますという仕様では公開しにくいのでがんばりました。
あと少しまだ改良したいところがあるのでまだ公開しません。

MSXライブラリに少し追加したい機能があるのと、
BDS Cを宣言だけでもANSI C規格に対応させたいんですよね。
HI-TECH Cとz88dkができるのに、BDS Cだけはできませんではやはり公開しにくいです。

WindowsのZ80アセンブラは、zmac が良さそう

http://www.48k.ca/zmac.html

少ししか試していません。
M80(MACRO-80)向けソースもアセンブルできました。
ORG、EQU、 .Z80 、ASEG などの疑似命令も指定なしで対応していました。
16進は、M80と同じ、100H などの H形式にも指定なしで対応していました。
フリーで公開されていてオープンソースです。
gcc+bison用のソースで、Ubuntuでそのままmake一発でコンパイルできました。
C++ Builderではコンパイルできませんでしたが、Windows向けバイナリはあります。
M80を使うをやめてこれに置き換えようと思います。
気に入らないのはカレントディレクトリではなくて、 カレントディレクトリの下のzout というディレクトリにしか出力できないことです。
これは設定でも指定でも変えられません。
かといって、Windowsでコンパイルするのは大変です。
bisonだし。

BDS Cの ZCASMをWindowsに移植した

BDS CのZCASM(ZCASM15.Cベース)をWindowsに移植しました。
ZCASMはBDS Cのリンカのリロケータブルファイルを作るために、一般の汎用Z80アセンブラにかける前にソースファイルのテキスト処理をするプリプロセッサーです。
CP/Mエミュレーターに依存する項目をひとつ減らしました。
MSX-DOSとMSX-BASICの条件アセンブル機能のを付加するために、ZCASMにかける前にソースファイルのテキスト処理をするプリプロセッサーであるAAPPをついこの前、自作したばかりです。
AAPPを別プログラムにしてもいいのですが、ZCASMに内蔵してもいいかも知れません。
ZCASMがWindows化したことより、ZCASMの改良も簡単になります。

BDS Cで作ったCR3(MSXゲーム)をHI-TECH Cに移植してみた。

CR3はBDS Cでコンパイルしたものですが、C言語なので他のC言語コンパイラにも割りと簡単に移植できるはずです。
ということで、HI-TECH CのCP/M版に移植してみました。
名前はCR3HTにしました。まだ公開していませんが後でします。
MSX-C Library互換ライブラリ for HI-TECH Cを使ってみました。
HI-TECH Cの能力の高さには驚きます。
BDS Cよりも高速に動くプログラムが作れてプログラムサイズも小さくなりました。
そしてANSI対応なので新しいC言語コンパイラとのソース互換を取りやすいです。
MSX-C Library互換ライブラリ for HI-TECH Cは、私が使った範囲内ではちゃんと動いています。
同ライブラリはサンプルプログラムはなく、とっつきにくいですが今回移植したCR3HTが今後の誰かのサンプルになるかも知れません。
実は移植はすんなりいかず最初は暴走ばかりして原因も分からず、回避する方法も分からずで丸一日時間をつぶしてようやく解決しました。
BDS Cではうまく動くソースがHI-TECH Cではうまく動かなかったのです。
暴走を回避する方法はループを遅くすることで解決しました。
ループにウェイトを入れただけです。
ループの中ではスペースキーやA/Bボタンやカーソルキージョイスティックの入力や色のパレットのセットなどをしています。
なぜウェイトを入れなければならないのかは、分かりません。
MSXの仕様なのかな?
BDS Cではウェイトは必要なかったのですが、動作速度が遅いから要らなかったのかな?
いずれにしろ、HI-TECH Cでは速く動かすことで暴走することがあり、ウェイトを入れればよいということが分かりました。
MSX-C Library互換ライブラリ for HI-TECH Cは有用ですが、機能はちょっと足りません。
線を描いたり、四角形を描く機能もないです。
足りない機能でC言語で簡単に自作できる部分については自作しました。
HI-TECH C用にC言語で自作したのは以下の関数です。
peek() 実アドレス指定でメモリを読む
poke() 実アドレス指定でメモリに書く
play() 簡易音楽再生
pistl() ピストル音再生
clik() クリック音のオン・オフ
ckesu() 文字カーソル消す
sput() 文字列表示(C言語標準関数は遅いので)(MSX-C Library互換ライブラリを呼ぶ)
palette() 簡単にカラーパレットを設定。(MSX-C Library互換ライブラリを呼ぶ)
putdeg() 数値を表示(C言語標準関数は遅いので)(MSX-C Library互換ライブラリを呼ぶ)
rnd() 簡易議事乱数を作る。(標準関数のsrand()がなぜか動かなかったので)

CR3で使っている機能で唯一C言語では移植できなかったのはR800からZ80に切り替える機能です。
HI-TECH CでCPU切り替えをするにはアセンブラで自作するしかないです。
BDS Cの代替にHI-TECH Cがなり得るかどうかですが、現状はMSX-DOSのプログラム作成に限ればなり得ると思います。
まだ誰もHI-TECH C用のMSXのBASICのOSで動くライブラリを作っていないんじゃないかと思います。
BDS Cでは私の自作したものがあります。まだ公開していませんが公開予定です。
z88dkもBASICのOSで動くプログラムのコンパイルに対応していてprintfなども対応しています。
HI-TECH CでBASICの上で動くプログラムを作りたいならMSX関連ライブラリの自作はもちろん、printfなどの標準ライブラリの改造からHI-TECH Cの初期化ルーチンの改造も必要かも知れませんし大ごとになるんじゃないかと思っています。
フリーとして配布されたもの中には初期化ルーチンのソースは入っていません。
フリー版ではROM化できないようにソースを入れなかったのでしょうか?
初期化ルーチンのソースがないのでHI-TECH CのフリーのものではBASICでは動かせそうにないです。

BDS CとHI-TECH Cとz88dkをおおまかに比較すると、
HI-TECH C、
・コンパイル性能○ BDS Cに可能な二次元配列の引数渡しができない以外は利点だらけ。
・情報△? 情報少ないかも? 開発した会社が買収されて、一切の情報公開をやめている。
・入手△ 開発した会社が買収されて、一切の情報公開をやめてしまい第三者による二次配布のものしかない。
・ライセンス△ Web archiveのHI-TECH C CP/M版の記録によると少なくとも昔は商用からフリーソフトにライセンスを変更して配布していた時期があったようです。商用利用も可能のようですがフリーでも著作権は放棄されておらず短い文面ではどこまでが許されるのかよく分かりません。
また、コンパイラのソースがないのでソースのライセンスはフリーではないです。
・MSXライブラリ△ MSX-DOS版のみ。初期化ルーチンのソースがないのでCP/M、MSX-DOS以外のOSへの対応は難しい。
・ソース× ライブラリのソース有り。C.COM(フロントエンド?)のソースあり。初期化ルーチンのソースなし。コンパイラのソースなし。リンカのソースなし。ライブラリマネージャーのソースなし。
・将来性× ソースがないのでわずかな修正や変更も難しいです。
  エミュレーターを使わないネイティブに移植とかも無理だと思います。

BDS C
・コンパイル性能× ANSI C未対応、long、float、double、符号付きchar未対応、変数の初期化未対応、最適化甘い、static変数なし
・情報○ 情報多い
・入手○ 公式サイトで配布中
・ライセンス○ パブリックドメインで公式サイトで確認可能。オープンソース
・MSXライブラリ○ MSX-DOSの他、BASICのOS対応。
・ソース○ コンパイラのソースあり。リンカのソースあり。ライブラリマネージャーのソースあり。ライブラリ、初期化ルーチンのソースあり。その他ツールのソースあり。
 ただし、コンパイラとデフォルトのリンカはアセンブリ言語ソース。リンカのC言語版(L2.COM)とライブラリマネージャー、その他のツール(ZCASMなど)はC言語ソースなので簡単にWindowsに移植できそう。
将来性△ 開発元は開発を終了しています。引き継いだ有名な派生もなさそう。

z88dk
・コンパイル性能△ 二次元配列未対応という致命的欠陥あり。ANSIにいくらか対応。        long,float,double対応。前身は低機能なSmall-C。その他調査不足のため不明。
・情報△? 情報少なそうな気が
・入手○ 公式サイトで配布中
・ライセンス○ 詳しく知りませんがゆるいライセンスだと思います。
・MSXライブラリ△? printfなどの関数はMSX-DOS、BASIC(BLOADとROM)に対応しています。
  MSX固有の機能を使う関数の有無は調査不足で不明。
・ソース○ 全部ソースあり
将来性○ 現在多分開発中

AAPP アセンブラ・プリプロセッサーが完成

BDS C用のMSXライブラリ(MSX-DOS版とMSX-BASIC-OS版の二種類)を改良しているところです。
MSX-DOSからSUB-ROMを呼ぶ方法が分かったこともあり進展がありました。
あとは、Z80アセンブラで書いたMSXライブラリのソースをひとつのソースでMSX-DOSとMSX-BASIC-OSの二種類に対応したいと思ってWindowsで動くツールを自作して完成しました。
BDS Cの場合はZ80アセンブリ言語のソースをまず、ZCASM.COM(プリプロセッサーもしくはコンバーター)にかけて、M80用のソースに変換する必要があります。
M80なら条件アセンブルすればいいじゃないかと思うでしょうが、M80の前にZCASMを経由するわけで、そのZCASMが条件アセンブルに対応していません。
条件アセンブルで実行しないソースの部分までZCASMはラベル処理をするので、ソースによってはZCASMが処理したラベルの元が条件アセンブルで実行されない部分にあることもありM80の段階でエラーになります。
では、どうすればいいかですが、ZCASMにかける前に条件アセンブルで実行しない部分をコメントアウトするプリプロセッサーを自作すればいいと考えて自作しました。
この自作プリプロセッサーはaapp という名前にしました。
これにより、MSX-DOS用のソースとMSX-BASIC-OS用のソースを分けることなく同じソースで対応できるので管理が楽になります。

残念なことに、3月15日に最新のバイナリを誤って削除してなくしてしまった上に、ソースファイルも消してしまってソースは全く残っていません。
四日前のバイナリは残っています。
これ以外にも削除してしまったもがあり、それはソース、バイナリとも全滅です。

call MSX SUB-ROMのBIOS on MSX-DOS

MSX2テクニカルガイドブックに載っているサンプルはいつものように動かなかったので、古雑誌からサンプルを探し出してやってみたら動いた。
元のサンプルは呼び出したところに戻って来ないでBIOSを実行後に暴走してくれたので少しだけ変えた。
このプログラムは、わざわざスタック領域にプログラムを転送して実行している。
多分0000H~7FFFH (メモリ領域の前半32KB)にはプログラムを置けないからだと思う。
SUB-ROMにメモリを切り替えた時に自身のプログラムがメモリ上から居なくなってしまわないように高位アドレスに転送している。
でも、転送は処理時間がそれなりにかかるので頻繁に呼ぶのには向いていない。
それを回避するには、subbegのルーチンを常時高位アドレスに置いておけばいい。
C言語でそれをするには、ちょっと考えなくてはいけない。
できればスタックよりも高位アドレスに置きたいし。

呼び出し方は、
普通に、IXにSUB-ROM BIOSの番号を入れて、レジスタにパラメーターをセットして、
BASICで、「CALL 015FH ;EXTROM」とするところを「CALL calsub」にする。
「;sublen equ $-subbeg」はもし使用しているアセンブラがエラーにならなければコメントアウトして前方にある「sublen equ 18H」を消してもいい。

;LD BC,xxx ;if need
;LD DE,xxx ;if need
;…..
;LD IX,SUB-ROM_No
;call calsub

;CALL SUB-ROM from MSX-DOS.”MSX magazine” 1987.1.183P
calslt equ 001ch
enaslt equ 0024h
extrom equ 015fh
ramado equ 0f341h
calhl equ 0f399h
exptbl equ 0fcc1h
sublen equ 18H ; subbeg routine byte size
;
calsub:
ex af,af’
exx
ld hl,-sublen
add hl,sp
ld a,82h
cp h
jr nc,nostack
ld sp,hl
push hl
ex de,hl
ld hl,subbeg
ld bc,sublen
ldir
pop hl
call calhl
ld hl,sublen
add hl,sp
ld sp,hl
exx
ex af,af’

ret
nostack:
ld de,msg
ld c,09h
call 5
rst 0
msg: defb ‘SP too low !$’

subbeg:
ld h,0
ld a,(EXPTBL)
call ENASLT
exx
ex af,af’
call EXTROM
ex af,af’
exx
ld h,0
ld a,(RAMADO)
;jp ENASLT ;BUG
call ENASLT ;set back to page 0;
ret
;sublen equ $-subbeg

BDS CのターゲットMSX-BASICのOSの構築できました。

まずBDS Cで作ったプログラムがMSXのディスクBASIC環境で起動するようにしました。
自作MSXライブラリもMSXのディスクBASIC環境でも動くようにしました。
BDS C標準ライブラリもMSXのディスクBASIC環境で動くように再コンパイルと再アセンブルしました。
ただし、BDS C標準ライブラリはMSXのディスクBASICでは動作するものは限られます。
何が動いて何が動かないのかは詳しいことは調べないと分かりません。
現在分かっている範囲内では、rand、kbhit、printf、getchar、putcharは動いています。
ファイル操作関係は、fopenが動かなかったので全部だめだと思います。
動くようにすることは理論的には可能ですが諦めます。
excelはアセンブル時にエラーが出たのと最初から動くわけがないソースなので何もしないで戻るダミーにしています。
あとは、終了時にBASICに戻ることはできずに、ワームブート(リセットみたいな感じ)してしまいます。
これらも諦めます。
BDS C標準関数は、MSX-DOSを使えば全部動くと思いますし、MSX-DOSでも自作MSXライブラリは動きます。
制限はありますが、BDS CでMSXのディスクBASICをターゲットにできたことは大きな意味があると思います。
MSXディスクBASIC用のライブラリとソースとプログラム作成に必要な自作ツールは後で公開します。
BLOADファイル化とBASICのOS上でのスタック初期化処理を埋め込むツールを作っています。
普通にコンパイルしたファイルそのままではBASICのOSでは起動できませんが、起動できる形式にコンバートするツールを作りました。