| Addr | |
|---|---|
| レジスタ | |
0x0000 | ゼロレジスタ |
0x0001 | 割込復帰アドレス |
0x0002 | pc プログラムカウンタ |
0x0003 | sp スタックポインタ |
0x0004 | ra 関数復帰アドレス |
0x0005 | rp 関数復帰ポインタ |
0x0006:0x0007 | a0-a1 引数 / 返り値 |
0x0008:0x000B | t0-t3 一時 (caller-save) |
0x000C:0x000F | s0-s3 保存 (callee-save) |
| 状態制御レジスタ | |
0x0010 | HALT (1 を書くと停止) |
| 入出力レジスタ | |
0x0100 | serial_tx |
0x0101 | serial_rx |
0x1000:0x2FFF | 映像メモリ |
0x3000:0x4FFF | 定数メモリ |
0x5000:0xffff | 変数メモリ |
レジスタ
メモリ空間先頭の 16 word はレジスタとしてアドレス指定できます。
ゼロレジスタ zero
値が 0x0000 に固定されたレジスタです。書き込みは無視されます。mov(rd, rs) を add(rd, rs, z) で、loadi(rd, imm) を addi(rd, z, imm) で実現するためのレジスタです。
割込復帰アドレス ira (Interrupt Return Address)
割り込みが受理された瞬間、ハードウェアが現在の PC をこのレジスタに退避します。iret 命令は PC を ira に書き戻して元の処理に復帰します。
プログラムカウンタ pc (Program Counter)
通常の load/store から読み書きはできず、PC を更新するには jump / call / ret 等の制御命令を使う必要があります。
制御レジスタ csr (Control & Status Register)
プロセッサの状態を管理するためのレジスタです。
| bit | 機能 |
|---|---|
bit 0 | 割り込み許可 (ENABLE) |
bit 2-5 | 割り込みマスク (MASK0-MASK3) |
bit 8 | intr0 発火フラグ |
bit 9 | intr1 発火フラグ |
bit 10 | intr2 発火フラグ |
bit 11 | intr3 発火フラグ |
CSR はレジスタなので、andi(csr, csr, mask) / ori(csr, csr, flag) という形で 1 命令で制御できます。
復帰アドレス ra (Return Address)
call 命令が次に実行すべき PC (PC + 1) を書き込みます。ret 命令は ra を読んで PC に書き戻します。
関数フレームポインタ fp (Frame Pointer)
関数フレームの基底アドレスです。RK16 ABI ではスタックは FP のみで管理し、subi(fp, fp, n) でフレームを伸ばし、リターン時に元の FP を書き戻します。
汎用レジスタ a0:a1, t0:t3, s0:s3
汎用レジスタは 10 本。RISC-V 風に役割を 3 グループに分けます。
a0-a1(caller-save): 引数および返り値t0-t3(caller-save): 一時計算用。関数呼出で破壊されうるs0-s3(callee-save): callee が prologue/epilogue で退避・復元するので、caller から見れば呼出を跨いで値が保たれる
呼出規約の詳細は 関数呼び出し規約 を参照。
状態制御レジスタ
入出力レジスタ
メモリマップド I/O はアドレス 0x1000 以降に並びます。シリアル送受信は serial_tx (0x1000) に書き込めば送信、serial_rx (0x1001) を読めば受信 (受信バッファが空なら 0xFFFF) という単純な仕様です。