アーキテクチャ
CPU
8ビットのCPUです。1フレームにつき1命令を実行します。
レジスタ
汎用レジスタ(8ビット)
| レジスタ | 説明 |
|---|---|
| A | アキュムレータ。演算命令の主要なオペランドです。 |
| B, C | 汎用レジスタ。BCレジスタペアとしても使用します。 |
| D, E | 汎用レジスタ。DEレジスタペアとしても使用します。 |
| H, L | 汎用レジスタ。HLレジスタペアとしてメモリアドレス指定に使用します。 |
特殊レジスタ
| レジスタ | ビット幅 | 説明 |
|---|---|---|
| PC | 16ビット | プログラムカウンタ。次に実行する命令のアドレスを保持します。 |
| SP | 16ビット | スタックポインタ。スタックの先頭アドレスを保持します。 |
| PTBR | 16ビット | ページテーブルベースレジスタ。ページテーブルの先頭アドレスを保持します。 |
レジスタペア
2つの8ビットレジスタを組み合わせて16ビットの値として扱います。上位バイトが先のレジスタです。
| ペア名 | 上位 | 下位 |
|---|---|---|
| BC | B | C |
| DE | D | E |
| HL | H | L |
| PSW | A | F(フラグレジスタ) |
メモリ参照(M)
命令中のオペランド「M」は、HLレジスタペアが指すメモリアドレスの内容を意味します。
フラグレジスタ(F)
演算結果に応じて自動的に更新されるフラグの集合です。条件分岐命令で参照されます。
| フラグ | ビット位置 | 説明 |
|---|---|---|
| S(サイン) | 7 | 演算結果のビット7が1のとき1になります。 |
| Z(ゼロ) | 6 | 演算結果が0のとき1になります。 |
| AC(補助キャリー) | 4 | ビット3からビット4へのキャリー(またはボロー)が発生したとき1になります。 |
| P(パリティ) | 2 | 演算結果のビット中の1の個数が偶数のとき1になります。 |
| CY(キャリー) | 0 | 演算結果でキャリー(またはボロー)が発生したとき1になります。 |
フラグレジスタのビット配置
ビット: 7 6 5 4 3 2 1 0
[S] [Z] [0] [AC] [0] [P] [1] [CY]
ビット5と3は常に0、ビット1は常に1です。
メモリ
64KB(65,536バイト)のメモリ空間を持ちます。アドレス範囲は0x0000〜0xFFFFです。
マルチバイトデータはリトルエンディアン(下位バイトが低位アドレス)で格納されます。
起動時の初期状態
起動時、メモリの先頭3バイトには0番地への無限ループが配置されています。
0x0000: 0xC3 (JMP)
0x0001: 0x00 (ジャンプ先 下位バイト)
0x0002: 0x00 (ジャンプ先 上位バイト)
それ以外のアドレスは0x00で初期化されています。
スタック
スタックはメモリ上に確保され、SPレジスタが先頭を指します。スタックは下位アドレス方向に成長します。
- PUSH: SPをデクリメントしてからデータを書き込みます。
- POP: データを読み出してからSPをインクリメントします。
MMU(メモリ管理ユニット)
ページング方式の仮想メモリ機構です。有効時、CPUが発行するアドレスは仮想アドレスとして扱われ、ページテーブルを参照して物理アドレスに変換されます。
無効時は、アドレスがそのまま物理アドレスとして扱われます。
ページング仕様
| 項目 | 値 |
|---|---|
| ページサイズ | 256バイト |
| ページ数 | 256ページ |
| ページテーブルエントリ(PTE)サイズ | 2バイト |
| ページテーブルサイズ | 512バイト |
アドレス変換
仮想アドレスは以下のように分解されます。
仮想アドレス(16ビット): 上位8ビット → ページインデックス(0〜255) 下位8ビット → ページ内オフセット(0〜255)
変換手順は以下の通りです。
- PTBRの上位8ビットをページテーブルの先頭アドレスとします。
- 先頭アドレス + ページインデックス × 2 がPTEのアドレスです。
- PTEの上位8ビットが物理ページの先頭アドレスです。
- 物理ページの先頭アドレス + ページ内オフセット が物理アドレスです。
I/Oポート
256個のI/Oポート(0x00〜0xFF)を持ちます。IN命令とOUT命令でアクセスします。
現在の実装では、IN命令は常に0xFFを返し、OUT命令は何もしません。周辺機器との連携は今後追加予定です。
割り込み
割り込みの許可・禁止をEI/DI命令で制御できます。割り込み許可フラグ(INTE)は起動時に0(禁止)です。
現在、割り込みソースは実装されていません。そのため、現状のEI/DI命令は特に何もしません。