2014.9.13

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第37回]


●2進浮動小数点数の正規表現

[第35回]で上記の見出しをつけて説明しましたが肝心の「正規表現」については触れずに終ってしまいました。
ここしばらく脱線の上に脱線を重ねているのですが、もうしばらくお付き合いをお願いいたします。
2進の浮動小数点数値は指数1バイト+仮数3バイトで表現する、と説明しました。
−1(=0.5)は指数が00で仮数が400000です。
これを指数バイトを上位に置いて、その下に仮数部3バイトを置いて、2進ビット表現で示すと下のように表されます。
00000000 01000000 00000000 00000000

それでは2−2(=0.25)を同じように表現すると
00000000 00100000 00000000 00000000
と表せそうです。
しかしそのようには表現しません。
この場合には指数部を変化させて
11111111 01000000 00000000 00000000
と表現します。
11111111は十進数に直すと−1です。
この表現は仮数部の2−1に指数部の2−1を掛けたものと考えられますから0.5×0.5=0.25
になります。

上例のように指数部を操作して、常に仮数部の最上位ビットの0の右に必ず1が来るように配置することを「2進浮動小数点数の正規化」といいます。
そのようにするメリットは、そうすることで常に最大の有効桁数を維持することができることです。

●[第34回]からの続きです

[第34回]でテストプログラムを実行した結果、異常が発生しているところをかなり絞り込むことができました。
テストプログラムのアドレス820Bから8221の間で異常が発生していることがわかりました。

              ;shift right RB & RBE++;till A=0
8206 47       RBFA4:MOV B,A
8207 3A10F1     LDA RB7
820A 57         MOV D,A
820B CD1D83     CALL FADSP
820E 210FF1   RBFA42:LXI H,RB6
8211 0E04       MVI C,04
8213 AF         XRA A;reset cf
8214 7E       RBFA43:MOV A,M
8215 1F         RAR
8216 77         MOV M,A
8217 2B         DCX H
8218 0D         DCR C
8219 C21482     JNZ RBFA43
821C 14         INR D
821D 05         DCR B
821E C20E82   JNZ RBFA42
8221 CD1D83     CALL FADSP
8224 7A         MOV A,D
8225 3210F1     STA RB7
8228 3AFFF1   RBFA5:LDA FA8

上のプログラム部分では何をやっているかといいますと、FAレジスタにRBレジスタを加算する前準備として、RBレジスタの値をFAレジスタの桁と合わせるために仮数部の値を右にシフトしています。

820B 800052AEF000017801CC 00FA481075D1 FA95 0684 FA12 F200
8221 800052AEF000017801CC 00FA00000000 0044 0000 FF12 F10B

上のデータの2番目のブロックはFAレジスタで3番目のブロックはRBレジスタです。
その次からは、その時点でのCPUレジスタの値が次の順で並んでいます。
AF BC DE HL

FAレジスタ先頭の80は仮数部の符号です。
80ですから負号です。
次の00は指数部です。
その次からの4バイトが加算する場合に計算の対象となる仮数部の上位4バイトです。
52AEF000です。

次のRBレジスタもFAバイトと同じ並びです。
第1バイトは00ですから仮数は正の数です。
次の指数部はFAです。
仮数部は481075D1です。

FAレジスタの指数が00なのに対してRBレジスタの指数はFA(−6)ですから、RBレジスタの値はFAレジスタよりも2−6だけ小さい値です。
そのままでは加算できませんから桁を合わせるためにRBレジスタの仮数部を右に6ビットシフトして指数部を00にするための演算を行なっているのが上のプログラム部分です。

やっと説明を再開したところなのですが、本日はまた時間がなくなってしまいました。
毎回細切れ状態で申し訳ありませんが、本日はここまでにいたします。

MYCPU80でCP/Mを![第37回]
2014.9.13upload

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