前回の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
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
10880 P = VARPTR(X)
10890 POKE P + 0,M.LL
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を足して計算します。
アセンブラで簡単なライブラリを作る予定です。