標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第399回]

●何かシカケがあるのでは?

前回([第398回])をお読みになった読者の方からご質問のメールをいただきました。
「単に出力をトグルさせているだけなのに、なぜ1μsもかかるのですか?何かシカケでもあるのでしょうか?」
ごもっともなご質問です。

前回ご紹介した、パラレルポートにパルスを出力する8086のアセンブラプログラムはこんなリストでした。


        MOV DX,378
LOOP:OUT DX,AL
        XOR AL,01
        JMP LOOP

そしてこれが、そのプログラムを実行した結果ですよ、といってお見せした写真です。


ふつう、こういうパルスを出力するときは、パルス幅に合わせたダミーループで時間をかせぐようにします。
しかしご紹介したアセンブラプログラムにはそれがありません。

いったいどんなパソコンを使っているのでしょう?
これじゃ余りに遅すぎます。
これではまるで8ビットCPU並の速度です。

どうやらこれはDOS/Vパソコン(PC/AT互換機)のパラレルポートがもっている規格(?)のようです。
パラレルポートはプリンタポートとも呼ばれるように、プリンタ接続のためのインターフェースとして設計されました。
初期のパソコン用プリンタのインターフェースは低速で、ストローブ信号は少なくとも1μsは必要とされていました。
これに対してパソコンのCPUクロックはどんどん速くなる一方です。
もしもプリンタポートに出力するパルスをソフトウェアの待ち時間ループで作ったとすると、そのプリンタ制御プログラムはパソコンのクロックに合わせて全部変えなければなりません。
多分そういう理由からだと思いますが、実はパラレルポートにアクセスすると約1μsのウェイトが強制的に挿入されてしまいます。
これがハードウェア的に行われるのか、ソフト的に行われるのかは、私には不明です。
ただこのことはWindows98の機能ではなくて、もっと下のDOSの機能のようです。
今回のテストプログラムはWindows98のDOSプロンプトで実行しましたが、Windows98を終了してDOSでプログラムを実行させてみても、このウェイト時間は変わりません。
なおDOSプロンプトで実行すると、約1μsのウェイト時間とは別にWindowsがマルチプログラミング処理を行っていることを示す波形の乱れが見られます(上の波形写真で薄い影のような波形がそれです)。
この波形の乱れはWindowsを終了してDOSで実行したときには無くなりますが、それでも約1μsのウェイトはそのままです。

このウェイトについては、もう少し書きたいことがあるのですが、本日もまた時間が無くなってしまいました。
続きは次回にいたします。

またいずれあらためてお話ししますけれど、最後にちょいとひとこと。
Cを使ったプログラムばかりやっていると、こういうハードに直結した部分については全く気がつかないまま通りすぎてしまいます。
どなたも言及されないようですけれど、Cの功罪の、きわめて「罪」な部分だと思います。

逆にアセンブラを使ってDOS上でプログラムを作ると、こういうハードに直結した部分まで見えてきます。
これはなかなかに興味深いことだと思います。

こともあろうに、Microsoft社は、WindowsXP以後、その楽しみを技術者から奪ってしまいました。
これはもう罪も罪、とんでもない大罪だと思うのですが、いかがでしょうか?
(パソコンのOSはもはや一私企業のものではなくて、「公器」とも言うべきものになっていると、私は思います。果たしてMicrosoft社にその自覚はありや、なしや?)
2009.12.14upload

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