2012.8.13
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第195回]


●MACRO−80(解決編その2です)

前回からの続きです。
MACRO−80とL80によってアセンブルしリンクして作成されたMVFTST1C.COMを実行したところハングアップしてしまいました。
そのMVFTST1C.COMの中味を調べたところ、どういうわけか、まともな機械語プログラムファイルではありませんでした。

インターネットから得た情報によって、ソースプログラムの先頭に置いた
ORG 0100H
を削除(コメント文に変更)したところ、まっとうなマシン語プログラムファイルが生成されました。

なぜORGがあってはいけないのか?
そもそもなぜORGがなくてもよいのか?
ORGがない場合、マシン語プログラムは通常0000Hから作成されることになります。
しかしCP/Mの場合、プログラムの先頭は0100Hです。

むむむ。
そういうことか。
ちょっと見えてきたように思います。

おお。
せっかくダウンロードしたMACRO−80のマニュアルがありますから、それを読んでみることにしました。
マニュアルのダウンロードについては[第191回]で説明をいたしました。



謎を解く鍵はここにありました。



PSEUDOというのは「偽の」という意味です。
アセンブラの「擬似命令」についての説明です。
ここではそのうちの、relocationつまりプログラムの再配置についての擬似命令について説明をしています。

MACRO−80アセンブラはデフォルトでは、アセンブル後のプログラムはメモリのCSEGという領域に置くように働きます。
CSEGはCode Segmentの意味でしょう。
Z80ではこの概念はありませんが、8086ではアセンブラの擬似命令としてではなく、CPUの正規の命令として、CS(Code Segment)やDS(Data segment)などを扱う命令が登場します。
Code Segmentはその名の通り、マシン語の命令コードを格納するメモリエリアのことです。

うむむ。
少し読めてきましたよ。
CP/Mの場合、CSEGの先頭アドレスは0100Hでありましょう。
だから。
ORGを使う必要はなかったのです。

私はMACRO−80を普通のアセンブラだと思っていたものですから。
普通のアセンブラは、プログラムの開始アドレスをORGで指定しない場合、コードは0000Hから割り付けられます。
Absoluteなアセンブラです。
それに対してMACRO−80は、relocatableなアセンブラだったのです。

おお。
普通のアセンブラのようにabusoluteな使い方をしたいときは、ASEGを使え、ということのようであります。
ソースプログラムの先頭にASEGと書いておくと、MACRO−80はマシン語コードを0000Hを開始番地とするメモリエリアに配置するようにアセンブルします。

その場合にORG 0100Hと書けば、それ以降は0100H番地にコードが配置されることになります。
こちらはORGについての説明です。



つまり、ごく一般的に、普通のAbusoluteなアセンブラと同じ感覚でMACRO−80を使うならば、前回説明しましたようにORGを書かないことにするか、または
プログラムの先頭で
ASEG
ORG 0100H
と書くかのいずれかにすればよい、ということになります。

それでは。
ASEGを書かずに、ORG 0100Hと記述したら、一体どうなるのか?ということですが。
CSEGのトップが0100Hということならば、ORG 0100Hは100H+100H=200Hということなのでは?

そこで前回お見せしましたヒントの画像です。



VFTST1.COMのFCBのセクタ数を見てみますと02になっています(アドレス040FH)。
これに対してMVFTST1C.COMは03です(アドレス002FH)。

いずれも短いプログラムで1セクタ(128バイト)に収まりますが、VFTST1.COMはSAVEコマンドの機能を使ったため、2セクタ(256バイト)単位で記録されます。
ですからセクタ数が02になっています。

それでは、MVFTST1C.COMは?
ASEGを指定しないでMACRO−80によってアセンブルしましたから、CSEG(先頭アドレスは0100H)に割り付けられました。
その際、ORG 0100Hを使いましたから、CSEGの先頭(0100H)から、さらに0100Hバイトを空けた後にコードが置かれたのではないかと思います。
おお。
それなら、セクタ数は03になります。

今まで、MVFTST1C.COMのマシン語コードが書かれていると思っていた、0100Hには何も書かれていなかった、のでした。
すると。
MVFTST1C.COMの本当のマシン語コードは、3セクタ目にある?

MVFTST1C.COMの1セクタ目は[第193回]で見ています。
セクタbW00でした。
3セクタ目はbW02です。



おお。
セクタbW02には、まともなプログラムが書かれていました。
VFTST1.COM(下の画像)と比べてみてください。
こちらもは[第193回]でお見せしました。
よく見ると先頭が3バイトずれていますが、おそらくrelocatableな処理のための何らかの作業スペースが取られたためと思われます。



やっと。
納得できました。
これにて一件落着です。

ワンボードマイコンでCP/Mを![第195回]
2012.8.13upload

前へ
次へ
ホームページトップへ戻る