Z-1/FX-890P 演算I/O
Z-1/FX-890P Calclation I/O

戻る

1.はじめに

CASIO Z-1/FX-890Pでは, 計算はCPUではなくI/Oポート220, 221を経由して行われている. この文書は, 先に解析を試みたUn nouveau modèle, le Casio FX-890P/Z-1/Z-1GRを元に, さらに詳細に調査したものである.

2.数値の形式

数値は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)

3.メモリ

演算したい値はメモリの次のX/Yのアドレスに書き込む. 演算結果もここに書き込まれる. Xのアドレスには演算結果がマップされることもある(詳細は後で述べる).

アドレス 0400~0408 0410~0418
内容 Xまたは演算結果 Y

4.I/O

4.1 220への出力

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 (不定な値?)が代入される.

演算方法は内部に記憶され, 後で述べる演算結果のマッピングやフラグに影響する.

4.2 221への出力

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の値を交換する.

4.3 220からの入力

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になる. 指数部, 符号部は影響しない.

5. 参考ページ・参考文献


戻る [転載可・改変可]