8進数の使い道

マイコンのリセット要因を表示するレジスタの実験をしていたとき、

とりあえずレジスタの値を表示するために8進数を使うことを思いついた。

というのもリセット直後の値を読む都合もあり、デバッガを接続せず読み出せる必要があり、

コンソールにすぐ表示できる方法として思いついたのがそれだったと。


8進数の何がいいってビットシフトと足し算で簡単に作れることである。

2進数のデータを4bit単位で区切れば16進数、3bit単位で区切れば8進数、

この点ではどちらもあまり差はないのだが、画面に表示するにはASCIIコードにする必要がある。

16進数だと0~9とA~Fは文字コードが連続していないので、

各桁の値が9以下なら’0’の文字コード+値、10以上なら’A’の文字コード+(値-10)を出力する必要がある。

一方の8進数は各桁の値は0~7なので、単純に’0’の文字コード+値でASCIIに変換できる。

というので、他のライブラリなど使わずにサッと数値を文字にして表示するのに便利だったと。


しかし8進数というのは普段そんなに使うものではない。

歴史的な経緯もありCでは 0741 のように先頭に0を付けるだけで8進数リテラルとして扱われるなど扱いはよいが、

この機能が活用されているのはUNIXのパーミッション設定ぐらいしか見ない。

読み込み・書き込み・実行の権限を3bitで表すので3bitで1桁になる8進数が好都合と。

かなり特殊な使い方のような気がする。


歴史的に8進数の扱いがよいのは、昔のコンピュータは3の倍数のビット数をよく使っていたかららしい。

初期のコンピュータでは36bitあるいはその半分の18bitが使われることが多かったらしい。

36bitあれば10進数の10桁を格納できることが理由だったという。

ようは10桁表示の電卓のイメージである。ああいうのを作りたかったと。

符号ビットを考慮すれば最低35bitあればよく、6の倍数に切り上げて36bitと。

この時代は6bitの文字コードも使われていたという。

6bitあれば数字+アルファベットが入るから。(大文字・小文字の区別は付かないが)

だから6bitを2桁で表せる8進数のニーズがけっこうあったのだという。


ただ、その後に浮動小数点演算が導入されて、固定長整数にこだわる理由も減り、

8bitを単位とした体系に移行していったという。

4bitで10進数の1桁、8bitで2桁と二進化十進数としてもこっちの方が好都合だったのかも。

(二進化十進数は今どきはあまり使わないけど、昔はよく使われていたとか)

文字コードも7bitのASCIIコードが標準となり、残り1bitはASCIIの拡張に使われた。

8bit単位なら16進数2桁で8bit表せるのがよいとなる。

今となっては8進数も見る影もないのはこのような事情がある。


今回は横着して8進数表示にしたわけだが、その甲斐あってリセット要因レジスタの仕様が判明していった。

ちょっと不思議なレジスタで通電時にはほぼ全てのビットが立っていて、

これをクリアしておくと、次回からは発生したリセット要因が残ると。

例えばウォッチドッグでリセットした場合はウォッチドッグのビットが立つと。

なのでレジスタを読んだらゼロクリアするということを前提とすれば、

ほぼ全てのビットが立っている=パワーオンリセット、

特定のビットだけ立っている=それがリセット要因ということになる。

あまり見ないやり方だがハードウェア的には作りやすいのかも知れない。

パワーオンリセットの途上であれこれガチャガチャとリセットしても、

全部立った状態からスタートするとすれば証拠隠滅できてしまうので。

ただ、ちょっと解せない仕様もあるので要調査である。