tunozemichanの日記 / tunozemichan's diary

SORD社のコンピューターM68やM68MXの解析についての備忘録です。This blog is a memorandum about the analysis of SORD's computers M68 and M68MX.

浮動小数点演算ユニット Am9511 を調べる(その3)

前回のBASCIのサンプルコードにはバグがあり、特定の条件のときにとんでもない数字になってしまいます。

以下、修正したコードです。

 

10690 REM POP FLOAT FROM AM9511 STACK, RETURN IN X
10700 B3 = INP(AM.DATA)
10710 B2 = INP(AM.DATA)
10720 B1 = INP(AM.DATA)
10730 B0 = INP(AM.DATA)
10740 PRINT "APU  : "HEX$(B3)" "HEX$(B2)" "HEX$(B1)" "HEX$(B0)
10750 X = 0
10760 IF (B2 AND &H80) = 0 THEN RETURN
10770 S = B3 AND &H80
10780 E = B3 AND &H7F
10790 ES = B3 AND &H40
10800 M.H = B2
10810 M.LL = B0
10820 M.LH = B1
10830 IF ES = &H40 THEN GOTO 10860
10842 E = E + 128
10860 M.H = M.H AND &H7F
10870 M.H = M.H OR S
10875 PRINT "BASIC: "HEX$(E)" "HEX$(M.H)" "HEX$(M.LH)" "HEX$(M.LL)
10880 P = VARPTR(X)
10890 POKE P + 0,M.LL
10900 POKE P + 1,M.LH
10910 POKE P + 2,M.H
10920 POKE P + 3,E
10930 RETURN

 

10830行の処理はもっとエレガントに書けるはずですが、もう疲れたのでこれにしました。IF文が入って遅くなってますが問題なく動作します。

 

Am9511(APU)から、4つデータをPOPして、各々ビットを取り出します。問題は指数部で、Am9511は7ビットで-64~63を表現しており、下駄を履かせていません。MBASICは、8ビットで表現したい数の指数nに-128を加えます。Am9511の方が指数の表現範囲は狭いので、負の指数だったときはそのまま計算できます。正の時のみ、128dを足して計算します。

 

アセンブラで簡単なライブラリを作る予定です。