From 6177b2f7481a8b80d44d95bc60fb134fcc69556e Mon Sep 17 00:00:00 2001 From: EDiasAlberto Date: Thu, 6 Jun 2024 13:01:26 +0100 Subject: [PATCH] assemble branch instructions --- src/parser.c | 2 +- src/twopassassembly.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/parser.c b/src/parser.c index be2f874..004e5fb 100644 --- a/src/parser.c +++ b/src/parser.c @@ -10,7 +10,7 @@ //TODO: // - use string matching to get opcode, and operands (DONE) // - check operand count (DONE) -// - match opcode to a64 struct types (PARTIALLY DONE) +// - match opcode to a64 struct types (DONE) // - count operands and match type/values // - generate final a64inst and return diff --git a/src/twopassassembly.c b/src/twopassassembly.c index d6194a8..c701732 100644 --- a/src/twopassassembly.c +++ b/src/twopassassembly.c @@ -1,3 +1,5 @@ +#include "global.h" + //generates assembled code based on two pass assembly method void generateSymbolTable(a64inst_instruction instrs[], int numInstrs){ @@ -13,26 +15,28 @@ void generateSymbolTable(a64inst_instruction instrs[], int numInstrs){ word assembleBranch(a64inst_instruction *instr, int ){ word binInstr = 0; + binInstr += (5^28); //101 start of branch instr switch (instr->data.BranchData.BranchType) { case a64inst_UNCONDITIONAL: //000101 //25-0: sign extended simm26 - + binInstr += instr->data.processOpData.unconditionalOffset; break; case a64inst_REGISTER: - //1101011 - //0000 + //10000 //11111 //000000 //9-5: address from register //0000 - + binInstr += ((instr->processOpData.src)^5); break; case a64inst_CONDITIONAL: // 01010100 // 25-5: sign extended offset // 4-0: 0{condition} + binInstr += ((instr->processOpData.offset)^5); + binInstr += instr->processOpData.cond; break; default: break;