シリーズ「コンピュータの文字のしくみ」 第3回

回路が「形を覚える」とは?

点で、描く

これまでの話を、短く振り返っておく。

コンピュータの中にあるのは、0 と 1 の並び、パターンだけだ。 0100 0001 を「A」と読むのは、人が決めた表(文字コード)のほうである(第1回)。

パターンを光る形にするには、「どのパターンのとき、どこを光らせるか」の表を書けばいい。 その表は、そのままゲートの配線になる。 4 桁のパターンから、7 本の棒で数字を光らせる回路を、そうやって作った(第2回)。

ただ、7 本の棒では、「M」や「W」が書けなかった。 「あ」も、掲示板の行き先の「品川」も、書けなかった。 前回は、こう締めくくった。

どんな形でも出せる光らせ方は、ないだろうか。

答えは、駅の掲示板そのものにある。 光る掲示板を、近くで見てほしい。 文字は、線ではなく、碁盤の目のように並んだ細かい点でできている。

棒を、どんどん細かく刻んでいくと、最後は点になる。 点を縦と横に並べておけば、どの点を光らせるかを選ぶだけで、どんな形でも描ける。 点(ドット)を碁盤の目(マトリクス)に並べたこの表示を、ドットマトリクスと呼ぶ。

縦 8 つ・横 8 つの、64 個の点で描いてみた。

M
W
あ
棒では書けなかった形も、点なら描ける(8 × 8 の点)

棒では書けなかった「M」も「W」も、「あ」も描ける。

その代わり、光らせるかどうかを決めるものが、7 本から 64 個に増えた。 しかも、それが文字ごとに違う。 どの文字のとき、どの点を光らせるのか。それを、どこかに覚えておかなければならない。

この回は、文字の形を覚えておく回路を作る。

形を、メモリに

点は、光るか、消えているかの 2 通りだ。 光る点を 1、消えている点を 0 と書くことにしよう。

すると、横に並んだ 8 つの点は、8 桁のパターンになる。 第1回で、8 桁のまとまりを語と呼んだ。 点の 1 行が、ちょうど 1 語だ。

「A」の形を、1 行ずつパターンにしてみる。

0 行目0001 00001 行目0010 10002 行目0100 01003 行目1000 00104 行目1111 11105 行目1000 00106 行目1000 00107 行目0000 0000
「A」の形は、8 桁のパターンが 8 つ。光る点が 1、消えている点が 0

いちばん上の行は、左から 4 つ目の点だけが光っているので、0001 0000。 真ん中あたりの横棒の行は、1111 1110。 パターンを左から読むと、そのまま点の並びになっている。

右の 1 列と、いちばん下の 1 行は、どの文字でも空けておく。 文字を横や縦に並べたとき、隣の文字とくっつかないようにするためだ。

8 行あるので、「A」の形は 8 語。 「M」も「W」も、同じく 8 語ずつだ。

この語を、しまっておく箱が要る。

パターンを、たくさんしまっておける箱を、メモリという。 しまう場所には、0 から順に番号が付いている。この番号を番地という。 番地を入れると、その番地にしまってある語が出てくる。

『記憶のしくみ』を読んだ人は、第8回で作った 4 語のメモリを思い出してほしい。番地をデコーダでほどき、選んだ番地の語だけを出口に通していた。『CPU のしくみ』の第1回では、同じメモリに、命令を並べてしまっていた。

文字のパターンを、番地に

さて、「A」の 8 語を、メモリのどの番地にしまおうか。

掲示板に届くのは、「A」の形ではなく、0100 0001 というパターンだった。 それなら、このパターンを、そのまま番地に使えばいい。

ただし、「A」の形は 8 語ある。番地が 1 つでは足りない。 そこで、文字のパターンの後ろに、行の番号を 3 桁つなげる。 3 桁あれば、000 から 111 までの 8 通り。0 行目から 7 行目までを指せる。

文字のパターン 8 桁と、行の番号 3 桁。あわせて 11 桁の番地だ。

番地(文字のパターン + 行の番号)中身(その行の点)
0100 0001 0000001 0000
0100 0001 0010010 1000
0100 0001 0100100 0100
0100 0001 0111000 0010
0100 0001 1001111 1110
0100 0001 1011000 0010
0100 0001 1101000 0010
0100 0001 1110000 0000

番地の前の 8 桁は、どの行も「A」のパターン。後ろの 3 桁だけが、行ごとに変わる。 掲示板が「A」を描きたいときは、0100 0001 の後ろに 000 から 111 までを順につなげて、8 回読めばいい。

番地を、数として読んでみよう。 「A」のパターンは、数として読むと 65 だった。 後ろに 3 桁つなげると、1 桁増えるたびに位が 1 つずつ上がるので、65 は 2 × 2 × 2 = 8 倍になる。 だから、「A」の 3 行目の番地は、65 × 8 + 3 = 523 番地。 「A」の 8 語は、520 番地から 527 番地までに並んでいる。 「M」(0100 1101、77)なら、77 × 8 = 616 番地から。

第1回で、同じ 0011 0001 が、文字として読めば「1」、数として読めば 49 になる、と書いた。 今度は、同じ 0100 0001 を、番地の一部として読んでいる。 ここでも、名札を貼っているのは読む側だ。

では、このメモリを、回路でどう作るか。

実は、もう作り方を知っている。 第2回の 7 本の棒の回路と、まったく同じだ。

  1. 番地を、デコーダで、番地ごとの線にほどく。番地が 0100 0001 011 のときは、「A の 3 行目の線」だけが 1 になる。この線を語の線と呼ぶ。
  2. 点の列ごとに、OR を 1 個置く。OR は、入口のどれか 1 つでも 1 なら 1 を返すのだった。 その列の点が光る行の語の線を、全部その OR につなぐ。

第2回では、「表の ● を 1 つ書くことと、配線を 1 か所つなぐことは、同じこと」だった。 今回の表の ● は、文字の点そのものだ。 だから、配線の ● を並べると、文字の形がそのまま浮かび上がる。

このメモリは、一度しまった形を書き換えない。読むだけだ。 このような、読むだけのメモリを、ROM(ロム、Read Only Memory の頭文字)という。

押して、確かめる

「A」「M」「W」の 3 文字の形を、メモリにしまってみた。 3 文字 × 8 行で、24 語だ。

文字の形のメモリ シミュレータ

文字のパターンと行の番号のマスを押して、番地を替えてみてください

文字のパターン(8 桁)
行の番号(3 桁)

番地 0100 0001 00065 × 8 + 0 = 520 番地

番地(11 桁)デコーダA0100 0001の行01234567M0100 1101の行01234567W0101 0111の行0123456701234567列● は、その行のその列の点が光るところOROROROROROROROR行の番号(3 桁)行のデコーダ000 → 0001 → 1010 → 2011 → 3100 → 4101 → 5110 → 6111 → 7縦の線は8 行すべてに届いている← 受け取る0001 00008 × 8 の表示。受け取る線が 1 の行の点だけが、縦の線の値を受け取って覚える(ほかの行は前のまま)

「A」の 0 行目 → 0001 0000 を表示の 0 行目に

上の 8 つのマスが、文字のパターン。その下の 3 つのマスが、行の番号だ。 押すと、0 と 1 が切り替わる。

はじめは、0100 0001 000。「A」の 0 行目だ。 左のデコーダから出る 24 本の線のうち、「A」の 0 の線だけが緑になっている。 その線の ● は 1 つだけで、3 列にある(列は、いちばん左を 0 と数える)。 3 列の OR だけが 1 になり、読み出した語は 0001 0000。

図のいちばん下が、8 × 8 の表示だ。 列は、上の OR とそろえてある。 OR から下りる縦の線は、表示の 8 行すべてに届いている。

では、どの行が光るのか。 それを選んでいるのも、行の番号だ。

行の番号の 3 本は、番地の後ろ 3 桁として上のデコーダに入るだけではない。 図の左の端を下りて、表示の左の「行のデコーダ」にも入っている。 行のデコーダは、番地のデコーダと同じ作りで、行の番号を 8 本の「受け取る線」にほどく。 000 なら 0 行目の線、011 なら 3 行目の線だけが 1 になる。

受け取る線は、その行の点の下を横に走っている。 受け取る線が 1 の行(水色の帯)の点だけが、縦の線の値を受け取って、覚えておく。 ほかの行は、前に受け取った値のままだ。

いまは 0 行目の受け取る線が 1 なので、0 行目の 3 列に、点が 1 つ灯る。

行の番号のいちばん右のマスを押して、001 にしてみてほしい。 上では「A」の 1 行目の語の線に、下では 1 行目の受け取る線に、同時に替わる。 0010 1000 が出てきて、1 行目に点が 2 つ灯る。 0 行目の点は、さっき受け取った語のまま光っている。

同じ行の番号が、「メモリのどの行を読むか」と「表示のどの行に光らせるか」の両方を決めている。 だから、読んだ行と光る行が、ずれることはない。

1 行ずつ押していくのは手間なので、「8 行を順に読む」を押してみよう。 行の番号が 000 から 111 まで進み、表示に「A」が現れる。

ここで、図の ● の並びを見てほしい。 上から「A」「M」「W」の形が、縦に積んである。 配線が、そのまま文字の形をしている。

次は、文字のパターンを替えてみる。 「M」は 0100 1101。「A」から、下 4 桁の左の 2 つのマスを押せばいい。

押しても、表示はまだ「A」のままだ。 受け取る線が 1 なのは、いま読んでいる行だけだからである。 いまは 7 行目で、そこはどの文字でも空けてある行なので、見た目は変わらない。 「8 行を順に読む」を押すと、0 行目から順に「M」の行に替わり、表示が「M」になる。

「W」は 0101 0111 だ。こちらも試してみてほしい。

では、メモリにしまっていない文字はどうなるか。 「B」の 0100 0010 を押してみてほしい。

どの語の線も 1 にならず、読み出した語は 0000 0000。真っ暗だ。 第2回と同じで、表に書いていないパターンは、回路にも無い。 「B」の形も描きたければ、表に 8 行を足して、デコーダに 8 本の線を足し、点のところを OR につなげばいい。

文字の形も、点の並びのパターンとしてメモリに覚えておける。文字のパターンを番地にすれば、形が出てくる。

この回路は、「A」がどんな形かを知らない。 0100 0001 011 が来たら、ある 1 本の線が 1 になり、その線につないである OR が 1 になる。それだけだ。 並んで光った点を「A」と読んでいるのは、ここでもやはり、表示を見ている私たちである。

部品を数えてみよう。 メモリは、NOT 11 個(番地の桁ごとに 1 個)、AND 24 個(語の線 1 本に 1 個)、OR 8 個(点の列ごとに 1 個)。あわせて 43 個。 表示の行のデコーダは、NOT 3 個と AND 8 個だ。 まとめている場所(●)は 56 か所で、これは 3 文字の光る点の数と同じだ。 いちばん右の列は、どの文字でも空けてあるので、その列の OR には何もつないでいない。

ASCII の目に見える 95 文字を全部しまうなら、語の線は 95 × 8 = 760 本になる。 数は増えるが、作り方は変わらない。 本物のメモリは、ゲートを並べるのとは違う作り方をしているが、番地を入れるとその番地の語が出てくる、というところは同じだ。

流れる文字

掲示板では、文字が右から現れて、左へ流れていくことがある。 行き先が長くて、一度に入りきらないときなどだ。

文字が流れて見えるのは、点の並びを、1 列ずつ左へずらしているからである。

流れる文字

「1 列ずらす」を押して、文字を流してみてください

掲示板(16 列)。どの点も、右隣の点の値を受け取る次に入る列

ずらした回数 0 回

「1 列ずらす」を押すたびに、どの点も、右隣の点の値を受け取る。 左端の列は、こぼれて消える。 右端の列には、文字の形のメモリから読んだ「次の列」が入る。

メモリにしまってあるのは行ごとの語なので、1 列ぶんの点は、8 つの語から、同じ列の点を 1 つずつ拾って作る。 メモリの中身は、1 つも変わらない。ずれているのは、表示のほうだけだ。

「続けて流す」を押すと、ずらす間隔が短くなり、文字がなめらかに流れていくように見える。

『記憶のしくみ』を読んだ人は、第7回のシフトレジスタを思い出してほしい。クロックが来るたびに、どの桁も隣の桁の値を受け取っていた。この表示は、行ごとに 16 桁のシフトレジスタが 8 本並んでいる、と見ることができる。

漢字は、細かい

英字は、8 × 8 の点で足りた。 ASCII の 128 通りぶんの形をしまっても、128 × 8 = 1024 語だ。

では、日本語はどうか。

1 節で、「あ」も 8 × 8 の点で描いた。 けれど、このメモリでは「あ」を出せない。 番地の前半に入れる、「あ」のパターンが無いからだ。 第1回の ASCII の表に、「あ」はいない。

漢字は、さらに厳しい。 「駅」の線の数を、8 × 8 の点に収めるのは無理だ。 少なくとも、縦 16・横 16 くらいの点は要る。

8 × 8
64 点・8 語
16 × 16
256 点・32 語
点の大きさをそろえると、漢字はこれだけの点が要る

16 × 16 で 256 点。 1 行が 16 桁なので 2 語ずつ、1 文字で 32 語になる。

そして、漢字は数が多い。 ふだんの文章で使う目安として国が決めている常用漢字だけでも、2136 字ある。 1 文字 32 語なら、68352 語。 メモリは大きくなるが、形をしまう場所は、増やせばすむ。

困るのは、番地のほうだ。 番地の前半には、文字のパターンを使っていた。 けれど、8 桁のパターンは、256 通りしかない。 ASCII だけで、もう半分を使っている。 何千もの漢字に、1 つずつパターンを割り当てる余地は無い。

ちなみに、パソコンやスマホの画面の文字は、拡大してもなめらかなことが多い。 あれは、点の並びではなく、文字の輪郭の形を覚えておく別の作り方による。 けれど、どちらの作り方でも、まず「どの文字か」を、パターンで指さなければならない。

8 桁の語で、何千もの文字を、どう表すのか。

参考文献