MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第37回]
●2進浮動小数点数の正規表現
[第35回]で上記の見出しをつけて説明しましたが肝心の「正規表現」については触れずに終ってしまいました。
ここしばらく脱線の上に脱線を重ねているのですが、もうしばらくお付き合いをお願いいたします。
2進の浮動小数点数値は指数1バイト+仮数3バイトで表現する、と説明しました。
2−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 |
820B 800052AEF000017801CC 00FA481075D1 FA95 0684 FA12 F200 8221 800052AEF000017801CC 00FA00000000 0044 0000 FF12 F10B |