Zennで記載した内容のC++の実装です!
テストで (5+3)x2 = 16
をCPUで計算 させています🥳
🔗Zenn「RustでCPUを自作して動くまで📝」
🔗Rust版の実装
- アーキテクチャ ... 8bit
- メモリ空間 ... 256Byte
- 汎用レジスタ ... 8本(R0はアキュムレータ)
- フラグレジスタ ... ゼロ、キャリー、オーバーフロー、ネガティブ
- 命令セット ... 18(転送、算術論理演算、ジャンプ命令)
LDI
: レジスタに即値をロードMV
: レジスタ間のデータ転送ADD
,SUB
,MUL
,DIV
: 四則演算AND
,OR
,XOR
: 論理演算SHL
,SHR
: シフト操作PUSH
,POP
: スタック操作JMP
,JZ
,JNZ
: ジャンプ命令HALT
: 実行停止NOP
: なにもしない
命令セットを元に、CC8Rで(5+3)x2
をCPUで計算させるアセンブラです🥳
ORG 0x0000 ; プログラムの開始アドレスを0x0000に設定
LDI R1, 5 ; R1に5をロード
LDI R2, 3 ; R2に3をロード
LDI R3, 2 ; R3に2をロード
ADD R1, R2 ; R1とR2を加算
MV R4, R0 ; R0の値をR4に移動
MUL R3, R4 ; R3とR4を掛け算
HALT ; プログラムを終了s
アセンブラを機械語にしたものです🥳
0x14 0x01 0x05 // LDI R1, 5
0x14 0x02 0x03 // LDI R2, 3
0x14 0x03 0x02 // LDI R3, 2
0x20 0x01 0x02 // ADD R1, R2
0x18 0x04 0x00 // MV R4, R0
0x40 0x03 0x04 // MUL R3, R4
0x10 // HALT
CPUに(5+3)x2
をさせるC++のテストコードです🛠️
int main() {
CC8R cpu;
// (5+3)x2 のプログラム
uint8_t program[] = {
0x14, 0x01, 0x05, // LDI R1, 5
0x14, 0x02, 0x03, // LDI R2, 3
0x14, 0x03, 0x02, // LDI R3, 2
0x20, 0x01, 0x02, // ADD R1, R2
0x18, 0x04, 0x00, // MV R4, R0
0x40, 0x03, 0x04, // MUL R3, R4
0x10 // HALT
};
for (int i = 0; i < sizeof(program); i++) {
cpu.memory[i] = program[i];
}
while (cpu.execute(cpu.fetch()));
cpu.display();
return 0;
}
テストコードで出力される文字と期待値です🥳
自作CPUで(5+3)x2=16
を計算できているとR0が16になる
- 期待値: R0 ... 16
LDI R1, 5
LDI R2, 3
LDI R3, 2
ADD R1, R2
MV R4, R0
MUL R3, R4
HALT
Register: [16 5 3 2 8 0 0 0]
Flag: 0x00
SP: 0xF0
PC: 0x13