SEPボード/サービスルーチン

サービスルーチンとは、ROMに書き込まれたプログラム群のことであり、サービスに対して様々なサービスを提供するものである。SEPの設計においてROMには次のサービスルーチンが用意されている。

  • 実行開始番地入力ルーチン
  • メモリ読み出しルーチン
  • メモリ書き込みルーチン
  • メモリチェックルーチン
  • SEPボードテストプログラム
  • 倍精度乗算ルーチン
  • 倍精度除算ルーチン
  • ブロック転送ルーチン

実行開始番地入力ルーチン(0xF800〜)

ユーザがプログラムの実行開始番地を入力して、その番地にジャンプするルーチンである。SEP-3アーキテクチャでは、PC(プログラムカウンタ)の初期値は、この実行開始入力ルーチンの先頭アドレス(0xf800)である。本体は0xF870から格納されている。

  1. RESETボタンを押す(resetする)
  2. STARTボタンを押す(0xf800から実行を開始し、0xF873で入力待ちになる)
  3. 16bitトグルスイッチに開始番地をセットし、 ACKボタンを押す(指定した番地から実行が開始される。)
        .=0xf800
        jmp label_0xf870
        .=0xf870
label_0xf870:
        mov #0xFFE0, R0   ; 入力待ち(開始番地をトグルスイッチで入力し、ACKボタンを押す)
        mov (R0), R7      ; 入力した値をR7(PC)に入れる(次は入力した番地の命令が実行される)

メモリ読み出しルーチン(0xF808〜)

メモリ読み出しルーチンとは、ユーザがSEPボードだけの操作(PCとQuartusIIツール「In System Memory Content Editor」を用いたメモリダンプではない)でメモリの内容を読み出し、16bit赤色LED(以下、データ出力LED)へ出力するルーチンである。本体は0xF880から格納されている。

  1. 0xF808から実行開始する(jmp命令や実行開始番地入力ルーチンを使用する)
  2. 16bitトグルスイッチに読み出し開始番地をセットし、 ACKボタンを押す(指定した番地から表示が開始される。)
  3. ACKを押す毎にアドレスがカウントアップされ、次の番地の内容がデータ出力LEDに表示される。現在表示中のアドレスは、R1に保持されている。

メモリ書き込みルーチン(0xF810〜)

メモリ書き込みルーチンとは、ユーザがSEPボードだけの操作((PCとQuartusIIツール「In System Memory Content Editor」を用いたメモリダンプではない)でメモリに値を書き込むルーチンである。本体は0xF890から格納されている。

  1. 0xF810から実行開始する(jmp命令や実行開始番地入力ルーチンを使用する)
  2. 16bitトグルスイッチに読み出し開始番地をセットし、 ACKボタンを押す(0xf893で入力待ちになり、指定した番地から書き込みが開始される。)
  3. ACKを押す毎にアドレスがカウントアップされ、次の番地に書き込まれることになる。現在の書き込み先アドレスは、データ出力LEDに表示されている。

メモリチェックルーチン(0xF818〜)

DE2-115上に搭載されているRAMの物理的な破損をチェックするルーチン。チェック対象となるメモリ領域は0x0000番地から0xF7FF番地までである。

  1. 1パス目のチェックで0xA5A5の値を書き込んだ後、読み出して0xA5A5と値を照合する。
  2. 2パス目のチェックで0x5A5Aの値を書き込んだ後、読み出して0x5A5Aと値を照合する。
  3. 3パス目のチェックで0xFFFFの値を書き込み初期化する。

書き込みデータと読み出しデータが異なっていた場合は、物理的な破損があるとして、不整合を起こしたメモリアドレスをデータ出力LEDに表示する。

このサービスルーチンは、メンテナンス用であり、主にボード組み立て時やメモリが怪しいと思われるときに使用する。

SEPボードテストプログラム(0xF820〜)

SEPボードテストプログラムは、1〜Nまでの総和を計算するプログラムである。このルーチンを実行してみて、DE2-115やSEPが正しく動作しているかどうかを確認するプログラムである。ただし、このプログラムはFPGAやCPUの異常を発見するものではない。あくまでも、「正しく動作しているようだ」程度の判断をするためのものである。

プログラム自体は、「コンピュータ設計I」や「機械語と計算機械」でハンドアセンブルしたであろうプログラムが使用されている。

倍精度乗算ルーチン(0xf828〜)

倍精度乗算プログラムは、16bit×16bitを行い、32bitの結果を帰すサブルーチンである。 r0レジスタに被乗数,r1レジスタに乗数をセットして、ユーザプログラムからコールする。演算結果の上位がr2レジスタ,下位がr1レジスタに格納される。r0〜r2レジスタは壊されるので、コール前にr0〜r2レジスタを退避しておく必要がある。

倍精度除算ルーチン(0xf830〜)

倍精度除算プログラムは、32bit÷16bitを行い、16bitの結果を帰すサブルーチンである。 r0,r1レジスタに被除数,r2レジスタに除数をセットして、ユーザプログラムからコールする。演算結果の上位がr3レジスタ,下位がr4レジスタに格納され、余りはr1レジスタに格納される。r0,r1,r2,r3,r4レジスタは壊されるので、コール前にr0〜r4レジスタは退避しておく必要がある。

ブロック転送ルーチン(0xf838〜)

ブロック転送ルーチンは、転送元アドレスからの指定ワード数を転送先アドレスにコピーするサブルーチンである。r0レジスタに転送ワード数,r1レジスタに転送先開始アドレス,r2レジスタに転送元開始アドレスを格納して、ユーザプログラムからコールする。 領域の重複を考慮して、データを上書きにより壊すことがないように、アドレスとワード数からインクリメントかデクリメントかを判断して転送を行う。 r0,r1,r2レジスタは壊されるので、コール前にr0〜r2レジスタは退避しておく必要がある。