Great Assembler

C、BASICときたら、後はアセンブラしかないでしょう。経験的なことを主体に引っ掛かったときに思い出したら...という事を願って書き進めます。

[目次]

御意見、御感想、御希望等ありましたら何でもE-Mailでどうぞ

This page is presented by Tatsuhiko Syoji(rxk16664@nifty.ne.jp)

Tatsu's MSX Researchesにもどる


[みんなの広場]

このコーナーでは、アセンブラの種類などにとらわれない話を進めていきます。

ありがちなミス

 アセンブラの記法は、大体は共通性が有りますが、細かいところでは、結構違いがあったりします。
 例えば、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対策

 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命令の飛び先に行くようになるというだけのことなのです。

MSX-DOS1のファイルオープン、作成ファンクションの罠

 HI-TECH C Resource kit #2のMSX-DOS1用ライプラリを製作していて気づいたのですが、MSX-DOS1のファイルオープン、作成ファンクションって、FCBのレコードサイズを128に強制的に設定してしまうようです。そのため、任意のレコードサイズでファイルを扱うには、他のファンクションの前に、レコードサイズを一度だけ設定しなければいけないようです。
 これは、CP/M-80との互換を取るためなのでしょうか?


[M80&L80の部屋]

こちらは、一応、MSXでは標準のM80&L80に関する話です。

EXTRNって...

 EXTRN擬似命令による他のモジュールのグローバルシンボルの参照宣言はやや、曲者です。というのも、EXTRN擬似命令で他のモジュールのグローバルシンボルの参照宣言をしたけれども、最終的にL80に読み込ませたどのモジュールにもEXTRN擬似命令で宣言したグローバルシンボルが無く、グローバルシンボルを実際には使っていないときでも、(要するに一切支障は無い)、Undefined Global(s)の警告メッセージが出たりします。
親切と言えば、親切ですが、いささかお節介なときも(特に開発途中の段階で)あると思いません?

MSX-DOS1 TOOLSのM80&L80の正体?

 M80&L80と言えば、MSX-DOSの元となったCP/M時代から定評のあったアセンブラ&リンカですが、MSX-DOS TOOLS(DOS2 TOOLSではない!)のM80&L80は、著作権表示以外に、MSX-DOS1に特化した、改良というのは行われていないようで、CP/Mエミュレータを使って他の機械で動かすこともできます。486とか、Pentiumの様な高速CPUになると、なまじMSXで動かすより速いので、クロス開発にも合ったりします。

DEFB,DEFM命令のバグ?

 DEFM命令および、DEFM命令の引数には、1バイトで表せる整数(上位バイトのビットがすべて0か1)のみが指定できるとマニュアルには書いてあります。
 ところが、拙作XMARK互換カスタマイザAyakaとの互換をとるべくMSX-DOS1 TOOLSのM80&L80を調べていると、1バイトで表せない-257を指定してもエラーにならずにアセンブルすることができました。さすがに、-513を指定するとエラーが出ましたが。
 もしかすると、bit 8は見ていないというバグがあるのかもしれません。