2018-08-24 23:25 — asano
カテゴリー:
今回からパーソナルということでマイコンの事情について見ていきましょう。
8080, MC6800, 6502といった初期の8ビットマイコンの直接扱える数値はもちろん8ビットの整数です。16ビットのレジスタを持ったものもありますが主にアドレス指定のためのもので使える演算が限られていたり自由度の低いものでした。
この頃になると数値のビット表現は2進で負数は2の補数に収束しています。ただ10進演算の需要自体は残っているため、8ビットを2つに分けて10進2桁として使用するための補正命令を持っているものもありました。通常の加算命令と組み合わせることで10進の加算ができるというものです。
演算は2項演算としては加算・減算・比較・AND・OR・XORあたり、単項演算では符号反転・ビット反転・シフト・ローテートくらいを持っているのが一般的でした。中には符号反転+加算で代用できるからと減算命令を持たないものがあったり、各社の考え方や想定している用途等で微妙に異なってはいます。
乗算や除算命令は無いのが普通で、必要とあらばソフトウェアで処理をします。
8ビットでは不足する場合もソフトウェアで8ビットごとに分けて処理をします。加算命令で桁あふれが発生するとキャリーフラグがセットされ、上位の加算時にはこれも加えます。そのためキャリーを含めた加算命令というのが用意されているのが一般的です。
この頃の個人用のコンピュータの言語というとBASICとアセンブリが中心です。
BASICでは簡易なものでは16ビットの整数、本格的なものでは16ビットの整数に加えて浮動小数点数をサポートしているのが一般的でした。プロセッサによるサポートは無いので乗除算や浮動小数点演算はBASIC処理系に含まれていて、BASICでソフトウェアを書く際にはあまり意識する必要はありません。ただ浮動小数点演算等は遅いのでなるべく避けるといった配慮はパフォーマンスを上げるためには必須です。
大抵のBASICは2進処理でしたが、シャープのポケコンやカシオなど電卓に縁のあるメーカでは10進処理を行なっていたものがあります。ポケコンは電卓の延長(プログラムできる電卓)の性格が強かったのでほとんどが10進だったと思います。
アセンブリ言語で書く場合は自前で処理しなければなりません。BASIC処理系内のルーチンを呼び出すことは(情報が公開されていれば)可能ですが、アセンブリ言語で書く目的は通常パフォーマンス向上なので何とか整数(固定小数点を含む)で処理できないか考えたものです。
余談ですがこの頃にアスキー誌上で発表され人気を博した言語に「TL/1」(Tiny Language 1)というのがありました。Algol系のコンパイル言語なのですが、何と変数が1バイトという割り切った仕様でした。ほとんどそのまま8ビットプロセッサのコードに落ちるので非常に高速なのです。8ビットで不足する時はキャリー付きの加算演算子などがあってまさしく「読みやすく書けるアセンブリ言語」といった存在でした。
次回は8ビット後期と浮動小数点演算などを予定しています。
コメントを追加