tunozemichanの日記 / tunozemichan's diary

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

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

AM9511.BASの中を見る。

 

Am9511エミュレータに添付されているMBASIC用のサンプルコードAM9511.BASは、非常によくできています。これだけ見れば、Am9511に計算させることが簡単にできるようになります。

まず、最初に初期化。

1130 AM.STATUS = &H43
1140 AM.DATA = &H42
1150 X = 0!

 

Am9511のステータスコマンドポート番号とデータポート番号を明記して、計算に使う

変数Xを0("!"があるので単精度)で初期化します。

 

次に、ステータスコマンドポートに0H、NOPを送ります。GOSUB 1370はAm9511のBUSY解除待ちルーチンです。BUSY解除後に、Am9511の状態を表示します。

 

1180 GOSUB 1370
1190 OUT AM.STATUS,&H0 ' NOP
1200 GOSUB 1370
1210 S = INP(AM.STATUS) : PRINT "NOP STATUS = "; HEX$(S)

 

次にステータスコマンドポートに、1AHを送ります。これはπをスタックにプッシュする命令です。GOSUB 1370でBUSY解除待ちして、解除後、状態を表示します。

次のGOSUB 1660は、Am9511のデータスタックからデータを取り出し、MBASICのfloat形式に変換して、xにその結果を入れるルーチンです。

結果のXを表示します。もちろんXは3.14159になります。

 

1220 OUT AM.STATUS,&H1A ' PUPI
1230 GOSUB 1370
1240 S = INP(AM.STATUS) : PRINT "PUPI STATUS = "; HEX$(S)
1250 GOSUB 1660 : PRINT "   "; X

 

一度、Xの値をYに退避して、GOSUB 1430に飛びます。これは、MBASICのFLOAT表現された値Xを、Am9511の浮動小数点数内部表現に変換して、Am9511のデータスタックに積むルーチンです。そして、先ほど説明したGOSUB 1660ルーチンを読んで、スタックから取り出して、表現をMBASICのFLOATに変換して、Xに入れて表示します。

YはAm9511のPUPI命令(πをスタックに積む命令)の結果、Xはその結果をスタックに積んで、そのデータを取り出した結果なので、当然、同じ値になります。

 

1260 Y=X ' TRY SENDING PI BACK TO CHIP AND TESTING
1270 REM WE CAN TRY TO "ROUND-TRIP" PI. WE USED PUPI TO GET THE
1280 REM VALUE INTO THE CHIP, THEN READ IT OUT, AND CONVERTED TO MS.
1290 REM WE SEND THAT VALUE BACK TO THE CHIP, THEN READ IT AGAIN
1300 REM THE VALUE OF "PUPI" CAN BE CONVERTED TO AND FROM MS WITH
1310 REM NO LOSS.
1320 GOSUB 1430
1330 GOSUB 1660 : PRINT Y, X

 

以上です。Am9511を操作するのに必要な、初期化、BUSY解除待ち、MBASICのFLOAT表現からAm9511表現への変換、その逆変換がそろっています。

簡潔かつ必要十分なコードです。これを使って、色々と計算してみます。