Lions' 本読み (63)

朝練メモ。間接、というヤツがよく分からん。これはマニュアル見た方が良いのかな。
トラップを起こした命令の下 6bit が 0 の場合、古い PC の値は番地になってて、その中にシステムコール呼び出しな命令がある、ということなのか。

fuiword

10 章で出てきてるんですが、中身を確認してませんでした。見てみます。

0844 _fuiword:
0845 _fuword:
0846    mov    2(sp),r1
0847 fuword:
0848    jsr    pc,gword
0849    rts    pc

引数を r1 に格納して gword に jmp してます。gword が終わったら 0849 経由で呼び出し元に戻ります。gword は直下で以下。

0851 gword:
0852    mov    PS,-(sp)
0853    bis    $340,PS
0854    mov    nofault,-(sp)

PS および nofault をスタックに退避。PS を操作して優先度を最高にしてます。

0855    mov    $err,nofault
0856    mfpi   (r1)
0857    mov    (sp)+,r0
0858    br     1f

nofault に例外処理な番地をセットして mfpi 命令を呼び出してます。mfpi は 渡された番地の情報をスタックに push して戻すので、何もなければスタックから pop して r0 に格納。ちなみに例外発生時には 0880 以降の処理に制御が移ります。
例外の時には fuiword への戻りもスキップして呼び出し元に戻るんですね。
で、以下な後始末をして終了。

0875 1:
0876    mov    (sp)+,nofault
0877    mov    (sp);,PS
0878    rts    pc

nofault および PS をスタックから復帰させてます。ここで優先度も元に戻ります。