CASIO Z-1/FX-890Pでは, 計算はCPUではなくI/Oポート220, 221を経由して行われている. この文書は, 先に解析を試みたUn nouveau modèle, le Casio FX-890P/Z-1/Z-1GRを元に, さらに詳細に調査したものである.
数値は9バイトで, 全てBCDで格納されている.
バイト | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
桁 | 12 | 13 | 10 | 11 | 8 | 9 | 6 | 7 | 4 | 5 | 2 | 3 | 1 | - | 1 | 2 | 1 | 2 |
内容 | 仮数部 | 指数部 | 符号部 |
符号部は次のようになっている.
値 | 仮数部 | 指数部 |
---|---|---|
00 | 正 | 負 |
01 | 正 | 正 |
05 | 負 | 負 |
06 | 負 | 正 |
指数部は2桁単位で下位→上位の桁の順に格納される(1バイト内は上位→下位). 6バイト目の上位ニブルは0である(処理の途中で使われることはある).
指数が0以上(符号部が01または06)のとき, 指数部にはそのままの値が格納される.
指数が負(符号部が00または05)のとき, 指数部には 100+指数 の値が格納される. (例: -1のときは99)
演算したい値はメモリの次のX/Yのアドレスに書き込む. 演算結果もここに書き込まれる. Xのアドレスには演算結果がマップされることもある(詳細は後で述べる).
アドレス | 0400~0408 | 0410~0418 |
---|---|---|
内容 | Xまたは演算結果 | Y |
220への出力は, 演算方法の設定, シフト, 処理結果の内部レジスタへの代入を行う. 各ビットの意味は次の表の通りである.
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
役割 | 内部レジスタへの代入 | 仮数部の演算 | 符号部の演算 | 指数部の演算 | シフト有無 | シフト方向 | X/Y | 加減算 |
値 | 00:演算結果の仮数部を代入しない 80:演算結果の仮数部を代入する |
00:仮数部と指数・符号部 40:仮数部のみ |
00:しない 20:する |
00:しない 10:する |
00:しない 08:する |
00:左(10倍) 04:右(10分の1) |
00:X 02:Y |
00:加算 01:減算 |
演算方法は4,5,6ビット目で指定する. これらは複数のビットをORで設定しても複数の演算は同時に行われない. 値と演算は次の通りである.
6ビット目 | 5ビット目 | 4ビット目 | 値 | 演算 |
---|---|---|---|---|
0 | 0 | 0 | 00 | XとYの仮数部同士, 指数・符号部同士の加減算 指数・符号部同士の加減算は, 指数部と符号部の2バイト(BCD4桁)を1つの数値として扱って行われる |
0 | 0 | 1 | 10 | XまたはYの指数部に1を加減算 結果がオーバーフローした(99を超えた)場合, 符号部に1が加算される 結果がアンダーフローした(00を下回った)場合, 符号部から1が減算される |
0 | 1 | 0 | 20 | XまたはYの符号部に5を加減算 |
0 | 1 | 1 | 30 | (10と同じ) |
1 | 0 | 0 | 40 | XとYの仮数部同士の加減算 |
1 | 0 | 1 | 50 | 演算を行わない |
1 | 1 | 0 | 60 | 演算を行わない |
1 | 1 | 1 | 70 | 演算を行わない |
加算・減算は0ビット目で指定する.
演算の対象は1ビット目で指定する.
仮数部の演算は, 指定した方が加減算される値となり, 指定されなかった方が加減算する値となる.
また, 演算が行われなかった部分は, ここで指定したXまたはYの値となる.
3ビット目をONのとき, XまたはYの仮数部のシフトが行われる. シフトした場合は仮数部の演算は行われない.
7ビット目がONのとき, 仮数部の演算またはシフト結果, 指数部の演算結果, 符号部の演算結果が内部レジスタに代入される.
7ビット目がOFFのとき, 仮数部のシフト結果, 指数部の演算結果, 符号部の演算結果が内部レジスタに代入される.
7ビット目がOFFかつシフトを行わなかったとき, 内部レジスタには 03 00 00 00 00 00 00 00 00 (不定な値?)が代入される.
演算方法は内部に記憶され, 後で述べる演算結果のマッピングやフラグに影響する.
221への出力は, X/Yの操作やマップの変更を行う. 各ビットの意味は次の表の通りである.
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
役割 | XとYを交換 | - | - | 0で初期化 | 代入 または マップ変更 | X/Y | ||
値 | 00:しない 80:する |
- | - | 00:しない 10:する |
04:内部レジスタの値をX/Yに代入 08:演算結果をマップ 0e:Xをマップ 他:変化なし |
00:X 01:Y |
1~3ビット目が04のとき, 内部レジスタの値をXまたはYに代入する.
1~3ビット目が08のとき, XとYの演算結果を400~418にマップする.
このとき400~418を読み込むと演算結果が得られる. 400~418に書き込むとXに書き込まれる.
演算結果は, XまたはYに値を書き込むと自動的に(ポートに出力などを行わなくても)変化する.
演算は最後にポート220に出力した値にしたがって行われるが, シフトは行われない. (シフト有無が0であるように振る舞う.)
1~3ビット目が0eのとき, Xの値を400~418にマップする.
4ビット目がONのとき, XまたはYの仮数部, 指数部, 符号部を全て00にする.
7ビット目がONのときXとYの値を交換する.
220からの入力は演算結果のフラグである. 各ビットの意味は次の表の通りである.
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
役割 | - | ゼロフラグ | - | - | - | - | - | キャリーフラグ |
値 | - | 00:演算結果が0ではない 40:演算結果が0 |
- | - | - | - | - | 00:演算結果がキャリーなし 01:演算結果がキャリーあり |
フラグはポート220を読み込んだ時点のXとYでの演算結果で決まる. (ポート220に出力した時点ではない.)
演算は最後にポート220に出力した値にしたがって行われるが, シフトは行われない. (シフト有無が0であるように振る舞う.)
0ビット目はキャリーフラグで, 演算結果の仮数部が99999999999999をオーバーした, または0を下回ったときON, それ以外のときOFFになる. 指数部, 符号部は影響しない.
6ビット目はゼロフラグで, 演算結果の仮数部が全て00の場合ON, それ以外の場合OFFになる. 指数部, 符号部は影響しない.