パスワードを忘れた? アカウント作成
43179 journal

TarZの日記: 昔、8ビット機を使っていた頃… 4

日記 by TarZ

 確か、私がまだ8ビット機を使っていたような、昔々のお話。何かの場で、こんな質問を目にしたことがあるのです。

「コンピュータ内部のCPUでは、2進法で処理がされているのですよね? でも、モニタ上に表示される数値は、10進数だったり16進数だったりします。なんで2進での処理なのに、10進数とか16進数を表示できるのでしょう? 一体どこで変換しているんでしょう?」

 いやあ、一体どう説明すればよいのか途方に暮れましたねえ。

「目に見えている10進数だったり16進数だったりするモノ」は、コンピュータ内になにか10進数やら16進数やらの実体があるわけではなくてッ!

  1. メモリ上の数値が文字コード化されてテキストRAMに格納され、
    強いて言えばここが10/16進変換のポイントか。でも、あくまで0/1で淡々と処理されるだけ。例えば、数値 00001010 → 文字コード 00110001 00110000
  2. 文字コードに応じたキャラクタイメージがCRTCによってROMから読みだされ、
    ここも0/1。例えば、文字コード 00110001 00110000 → ビットイメージ 00111110 00001000 , 01000001 00011000 , 01000001 00001000 , ...
  3. 輝度の信号となってRGBケーブルを流れ、
    もちろん0/1。
  4. モニタ上の蛍光体に電子ビームで描き出される。

この過程で、10進数やら16進数やらがコンピュータ上に現れることはなく、全て0/1の処理なんです!

 …なんてことを説明しても、ダメそうな気がしたもので。

# そんな、当時感じた軽い絶望感を、ふと思い出しました。なんでだろう。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • バイナリデータを数字として読めるアスキーコードの文字列に変換する処理なら、
    アセンブラをいじったことのある人は大概一度はプログラムしたことがあるでしょうし、
    C言語の標準ライブラリにも同様の処理をするコードが入っているんじゃないですか、
    例えばprintf()の中に。

    VRAMから先は端折って説明したほうがいいんじゃないかと思いますよ、8ビットなら特に。
    ビットマップディスプレイにCPUやグラフィックアクセラレータが文字のパターンを
    一生懸命書き込みする仕組みは、8ビットマイコンではあまり一般的ではなかったでしょう。
    (MSX2とかは画面モード切替えるとテキスト画面がなくなるのでBASIC上でそういう処理もできますが)

    テキスト画面、40x25か80x25かは設定によって変わるけれど、画面上にキャラクタを表示するため、
    その1区画ごとに特別なメモリが割り当てられていて、そこに表示したいアスキーコードを書き込めば
    ディスプレイに即座に表示されるようになっている…程度の知識でいいんじゃないでしょうか。
    あんまり詳しく説明したって複雑になるだけだし。
    さらに文字の色はどうするの?とか聞かれたとしても、
    それも専用のメモリに書き込めば反映されるって言えばいいんじゃないかと思います。

    あとは、自分でプログラムさせてみることでしょうね。動かしてみせるのが一番だ。
    メモリに好きなデータを読み書きするプログラムを作らせて、実際にVRAMに書いてみればいいんだ。
    そうすれば、自分が何をやっているかだんだん理解できてくるんじゃないかと思います。

    昔は横一列80バイトの倍数を高速演算するために、
    64(6bit-右シフト)+16(4bit-右シフト)=80で高速演算したりして、無い知恵を絞ったもんですね。
    • by TarZ (28055) on 2008年12月19日 13時52分 (#1476616) 日記

      C言語の標準ライブラリにも同様の処理をするコードが入っているんじゃないですか、
      例えばprintf()の中に。
       はい、1.の処理のところですね。

       ただ、これはあくまで「人間が数値として認識できる文字コード上での表現」への変換であって、実際にCPUの中で0/1の電気信号が、10進数とか16進数になったわけではないわけです。
       で、「それをそのまま回答にしたのでは、おそらくこの質問者が聞きたい答えにならないんだろうな」と(当時は)漠然と思っていました。なんとなく、質問者の中に「回答に対する願望」みたいなものを感じたのです。例えば、「2進(電気信号の0/1)処理が10/16進数に変換されるような、なんだかよくわからない謎の仕掛けがCPUの回路上のどこかにあるんだ。自分はそういう回答が聞きたいんだ」といったような。(なぜ私がそういう印象を持ったかは、ちょっと解説が難しいのですが…)

       ということで、望まれない回答しかできなさそうな点において、「どう回答したものか途方に暮れた」というのが真相です。

      # 繰り返しますが、なんでこんなことをふと思い出したのかはナゾですよー。ふふふ。

      昔は横一列80バイトの倍数を高速演算するために、
      64(6bit-右シフト)+16(4bit-右シフト)=80で高速演算したりして、無い知恵を絞ったもんですね。
       私はこれをいまだに引きずっていて、CPUに高速な乗算命令が当たり前のように載り、描画周りをグラフィックアクセラレータがやってくれるようになった現在においても、画面の横方向のピクセル数は2^nでないと気持ちが悪いのです。:-)
      親コメント
  • 「そもそもAとかBとか記号も含めて文字を表示しているんですから、文字を表示するカラクリが有るんです。
    ですから、その文字で表示するときについでだから人間の判り易い様に、10進に直したりしているだけ。」

    ってので良いのではないかな、っと。

    #昔、1行表示のモノクロドットマトリクス液晶と、そのVRAMの2進ダンプデータで丸め込んだ覚えはある。

    今なら手元に工業用のインクジェットプリンタの制御基板の試作品とかあるから、それで一文字ずつ計算し変換しフォントから文字引っ張って来て印字用のバッファにビットマップ入れて、それを一列毎送って行って一文字分繰り返せば、「ハイ、文字が出来ました」ってなるからわかりやすいかな?
    一列分ビットマップデータを設定し、ピエゾを駆動すると対象に文字のタテ一列が出てくるってのは、一見で理解し易いでしょう。

    フォントも試しに作ったフォントエディタが有るし、動作原理さえ教えた後は、プリンタ制御試験用のシミュレータでやって見ればPC上に表示=通常の表示とほぼ一緒の原理な訳だし。

    LabVIEW辺りでビジュアルなプログラムとしてそういうのを見せれば、教育用には良いかもね。

    • 「そもそもAとかBとか記号も含めて文字を表示しているんですから、文字を表示するカラクリが有るんです。
      ですから、その文字で表示するときについでだから人間の判り易い様に、10進に直したりしているだけ。」
       はい、説明するとしたら、やっぱりそういうアプローチになりそうですね。

       でも最近は、こういった質問はあまり目にすることがなくなってきた気もします。そもそも、PCがどうやって動いているのかを疑問にする人自体が減ったような。PCが高性能になり、ブラックボックス化が進んだせいでしょうか。

      LabVIEW辺りでビジュアルなプログラムとしてそういうのを見せれば、教育用には良いかもね。
       あとは、昔あったようなマイコンキットとかですかねえ。

      # マイコンじゃないけど、学研の電子ブロックはまだ持ってるゾ。
      親コメント
typodupeerror

「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常

読み込み中...