From 4e3d071f23ad853254d0a8048f99105b23b92136 Mon Sep 17 00:00:00 2001 From: cth103 Date: Wed, 6 Jun 2018 21:28:01 +0000 Subject: [PATCH] add opcodes --- arm/cpu.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/arm/cpu.c b/arm/cpu.c index ec27c29..794bb2b 100644 --- a/arm/cpu.c +++ b/arm/cpu.c @@ -11,6 +11,7 @@ uint64_t *MEMORY; //Memory void interpret(uint64_t opcode) { switch(opcode) { //ADC (Add with Carry) + /* Add/subtract (with carry). */ case 0x1a000000: MEMORY[pc+1] = MEMORY[pc+2] + MEMORY[pc+3] + C; //dest = op_1 + op_2 + Carry @@ -71,7 +72,7 @@ void interpret(uint64_t opcode) { //dest = op_1 - op_2 - NOT(Carry) pc = pc + 1; break; - case 0x7a000000: //SBC (Subtract with Carry With Status) + case 0x7a000000: //SBCS (Subtract with Carry With Status) MEMORY[pc+1] = MEMORY[pc+2] - MEMORY[pc+3] - ~C; if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? C = 0x00000001; @@ -91,5 +92,156 @@ void interpret(uint64_t opcode) { //dest = op_1 - op_2 - NOT(Carry) pc = pc + 1; break; + case 0x5a0003e0: //NGC (Negate with Carry) (This instruction is an alias of SBC.) + MEMORY[pc+1] = MEMORY[pc+2] - MEMORY[pc+3] - ~C; + if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? + C = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] < 0x00000000) { //negative? + N = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] = 0x00000000) { //zero? + Z = 0x00000001; + pc = pc + 1; + break; + } + //dest = op_1 - op_2 - NOT(Carry) + pc = pc + 1; + break; + case 0x7a0003e0: //NGCS (Negate with Carry With Status) (This instruction is an alias of SBCS.) + MEMORY[pc+1] = MEMORY[pc+2] - MEMORY[pc+3] - ~C; + if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? + C = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] < 0x00000000) { //negative? + N = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] = 0x00000000) { //zero? + Z = 0x00000001; + pc = pc + 1; + break; + } + //dest = op_1 - op_2 - NOT(Carry) + pc = pc + 1; + break; + /* Add/subtract (extended register). */ + case 0x0b200000: //ADD (adds...) + MEMORY[pc+1] = MEMORY[pc+2] + MEMORY[pc+3]; + if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? + C = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] < 0x00000000) { //negative? + N = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] = 0x00000000) { //zero? + Z = 0x00000001; + pc = pc + 1; + break; + } + //dest = op_1 + op_2 + pc = pc + 1; + break; + case 0x2b200000: //ADDS (adds With Status) + MEMORY[pc+1] = MEMORY[pc+2] + MEMORY[pc+3]; + if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? + C = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] < 0x00000000) { //negative? + N = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] = 0x00000000) { //zero? + Z = 0x00000001; + pc = pc + 1; + break; + } + //dest = op_1 + op_2 + pc = pc + 1; + break; + case 0x2b20001f: //CMN (Compare Negative) + N = MEMORY[pc+2] - ~MEMORY[pc+3]; + if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? + C = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] = 0x00000000) { //zero? + Z = 0x00000001; + pc = pc + 1; + break; + } + // = op_1 - (NOT op_2) ; result is not stored, only flags updated + pc = pc + 1; + break; + case 0x4b200000: //SUB (substracts) + MEMORY[pc+1] = MEMORY[pc+2] - MEMORY[pc+3]; + if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? + C = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] < 0x00000000) { //negative? + N = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] = 0x00000000) { //zero? + Z = 0x00000001; + pc = pc + 1; + break; + } + //dest = op_1 - op_2 + pc = pc + 1; + break; + case 0x6b200000: //SUBS (substracts with status) + MEMORY[pc+1] = MEMORY[pc+2] - MEMORY[pc+3]; + if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? + C = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] < 0x00000000) { //negative? + N = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] = 0x00000000) { //zero? + Z = 0x00000001; + pc = pc + 1; + break; + } + //dest = op_1 - op_2 + pc = pc + 1; + break; + case 0x6b20001f: //CMP (COMPARE) + N = MEMORY[pc+2] - MEMORY[pc+3]; + if (MEMORY[pc+1] => 0xffffffff) { //overflow (unsigned signed)? + C = 0x00000001; + pc = pc + 1; + break; + } + if (MEMORY[pc+1] = 0x00000000) { //zero? + Z = 0x00000001; + pc = pc + 1; + break; + } + // = op_1 - op_2 ; result is not stored, only flags updated + pc = pc + 1; + break; } } \ No newline at end of file -- 2.11.4.GIT