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

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

[第170回]


●F80のエラーメッセージ

前回は、ND80ZVのCP/M互換DOSシステム(仮想FDD版)の上でF80(FORTRAN80コンバイラ)を実行したところ、エラーメッセージが表示されてしまいました、というところまで書いて、そこで終わってしまいました。

前回お見せしたエラーメッセージには、おかしなところがあります。
そのことには以前から気がついていたのですが、なにしろ泥沼でもがいていたものですから、瑣末なことにはこだわっている余裕が無かったのです。

あ。
そこのところを再掲いたします。
実は、昨日UPしたときには、最後の1行(Fatal Errorの行)が落ちていたことにも気がつきましたので、本日になってからUPし直しました。

A>f80

*=HELLO
HELLO

%Line:10 Zero Format Valu・FORMAT(3X,7A+

?Line:10 Illegal Character for Synta・FORMAT(3X,7A+

%1 Warning(s) Issued
・
?1 Fatal Error(s) Detected
・


LINE:と10の間、ValuとFormatの間、SyntaとFormatの間、それから%1と?1との間の行、そして?1の次(最下行)におかしな表示があります。
ブラウザによって、ただの「・」が表示されたり、見慣れない文字(というよりマーク、記号)が表示されたりします。
Internet ExplorerやOperaではただの「・」ですが、Firefoxではおかしなマーク(?)が表示されます。

泥沼からやっと抜け出せて、今は落ち着いて考える余裕が出てきました。
そこで、本日になりましてから、そのあたりを追求してみることにいたしました。

このおかしな表示なのですが、それでは一体ここにはどのような文字コードがあるのでしょうか?
そういう場合に役に立ちますのが、MSDOSのDEBUGコマンドです。

ところが、ずっと以前に書いたことなのですが、Windows7(64bit)では、この便利なDEBUGコマンドが使えません(パソコンをつくろう[第12回])。
なんですか、64bitでも仮想XPモードとやらが使える、上のバージョンですと出来るらしいのでありますが。

余談になりますが、上記の記事を書きましたところ、ある方からメールをいただきました。
「Windows7の64bit版でもx86アプリケーションが動くツールを作りましたから、よろしかったら使ってみてください」というメールでした(パソコンをつくろう[第16回])。

Microsoftとは関係ない(と思います)方でもそういうツールを作ることが出来るといいますのに、これはいかにもMicrosoft様の手抜きじゃあありませんかねえ。

本題に戻ります。
エラーメッセージの部分だけをコピーして、TXTファイルにして、それをDEBUGコマンドで開きました。
下の画面はWindows98SEでの画面です。



Windows7(32bit)でもDEBUGコマンドは使えますけれど、こういうものはやっぱりWindows98あたりが一番使い易いです。
ですので、いつまでたってもWindows98は手放せません。

水色で囲ったところが、おかしな文字表示の部分です。
A0、E5、F8、8Aになっています。
確かにこれはASCIIじゃありません。

むむ。
これは、F80のバグか。
とも思ったのですが。
んなことは、ありませんでしょう。

おお。
ひらめきました。

CP/M2.2では、文字コードは7ビットしか使わなかったはず。
つまり最上位のビット7は常に0であるはずです。
ところが、このコードはどれも、ビット7が1です。
ひょっとすると、文字列の終わりを示すのに$(24H)ではなくて、最終文字の文字コードのビット7を1にする、というテクニックだったのでは。

それではということで、A0、E5、F8、8Aのビット7を0にしてみますと。
20、65、78、0Aになりました!

そういうことか!
文字列の終わりを$(24H)にした場合、
CP 24
JP Z,xxxx
でチェックすることになりますが、ビット7=1のチェックなら
OR A
JP M,xxxx
ですから、1バイト少なくて済みます。
文字列そのものも余分な$が不要になりますから、そこでも1バイト少なくて済みます。
当時の1バイトは貴重だったのですよねえ。

そういうことならば。
BDOSのファンクションコールで、文字コードをBIOSに送るところで、強制的にビット7=0にしてしまえばよい、ということになります。
さっそくそのように直してしまいました。

ところで。
肝心のエラーメッセージが出された理由なのですが。
それも今ではどういうことだったかわかっております(実にみっともない、お恥ずかしい理由でありました)。
わかっておりますから、[第168回]でお見せしましたように、ちゃんとコンパイルして、それからL80.COMでリンクして、そのあと作成されたHELLO.COMを実行するところまでできているのです。

もちろんエラーメッセージが出された理由がわかっておりますから、エラーを再現することだってできてしまいます。
下は7ビットコードのみを出力するように修正した、CP/M互換DOSで、わざと同じエラーを表示させてみたところです。



おかしな表示が消えて、代わりに本来の文字が表示されました。

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

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