C、BASICときたら、後はアセンブラしかないでしょう。経験的なことを主体に引っ掛かったときに思い出したら...という事を願って書き進めます。
このコーナーでは、アセンブラの種類などにとらわれない話を進めていきます。
アセンブラの記法は、大体は共通性が有りますが、細かいところでは、結構違いがあったりします。
例えば、Simple ASM 1.3体験版だとラベル名"end:"が通りますが、ZASMの場合、ラベル名に、"end:"は使えなかったりします。擬似命令にendがあり、擬似命令と同じ名前をラベルに使えないからです。
他には、定数関連で、1バイトのデータをセットするDBもしくはDEFB命令は両方使える
アセンブラと片方の命令しか使えないといった違いや(DW,DSといった擬似命令でも同じ)、16進数の記法の違い(1文字目が数字でも必ず頭に0を付け、終わりにHを書くというアセンブラもある)など、探せば色々とあります。
HI-TECH Cのマクロアセンブラの16進数をC言語形式(0x????)で書くような(普通のxxxxH形式の書き方もできるけど)あからさまに、アセンブラの種類固有のものはともかく、仕様の細かい違いによるミスには気を付けたいものです。
MS-DOSもMSX-DOSも実行ファイルの拡張子が.COMなので、間違ってMS-DOSで、MSX-DOSの実行ファイルを実行するということが考えられます。そうすると、暴走するという事が考えられます。
これを防ぐには、MSX-DOS用のCOMファイルの先頭を JP nnnn(絶対ジャンプ)にする事で、MS-DOSでは、何もしない実行ファイルができます。種明かしをすると、80x86系CPUでは、オブジェクトコードがC3の時は、RET命令になっていて、MS-DOS上で動かすと、何もせずに、MS-DOSに戻るのに対し、Z80CPUでは、JP nnnn 命令になっているので、CP/M,MSX-DOS上で動かすと、JP命令の飛び先に行くようになるというだけのことなのです。
HI-TECH C Resource kit #2のMSX-DOS1用ライプラリを製作していて気づいたのですが、MSX-DOS1のファイルオープン、作成ファンクションって、FCBのレコードサイズを128に強制的に設定してしまうようです。そのため、任意のレコードサイズでファイルを扱うには、他のファンクションの前に、レコードサイズを一度だけ設定しなければいけないようです。
これは、CP/M-80との互換を取るためなのでしょうか?
こちらは、一応、MSXでは標準のM80&L80に関する話です。
EXTRN擬似命令による他のモジュールのグローバルシンボルの参照宣言はやや、曲者です。というのも、EXTRN擬似命令で他のモジュールのグローバルシンボルの参照宣言をしたけれども、最終的にL80に読み込ませたどのモジュールにもEXTRN擬似命令で宣言したグローバルシンボルが無く、グローバルシンボルを実際には使っていないときでも、(要するに一切支障は無い)、Undefined Global(s)の警告メッセージが出たりします。
親切と言えば、親切ですが、いささかお節介なときも(特に開発途中の段階で)あると思いません?
M80&L80と言えば、MSX-DOSの元となったCP/M時代から定評のあったアセンブラ&リンカですが、MSX-DOS TOOLS(DOS2 TOOLSではない!)のM80&L80は、著作権表示以外に、MSX-DOS1に特化した、改良というのは行われていないようで、CP/Mエミュレータを使って他の機械で動かすこともできます。486とか、Pentiumの様な高速CPUになると、なまじMSXで動かすより速いので、クロス開発にも合ったりします。
DEFM命令および、DEFM命令の引数には、1バイトで表せる整数(上位バイトのビットがすべて0か1)のみが指定できるとマニュアルには書いてあります。
ところが、拙作XMARK互換カスタマイザAyakaとの互換をとるべくMSX-DOS1 TOOLSのM80&L80を調べていると、1バイトで表せない-257を指定してもエラーにならずにアセンブルすることができました。さすがに、-513を指定するとエラーが出ましたが。
もしかすると、bit 8は見ていないというバグがあるのかもしれません。