diff --git a/build.nr b/build.nr index af13b1c..8ba317e 100644 --- a/build.nr +++ b/build.nr @@ -1 +1 @@ -1588 +1589 diff --git a/compile b/compile index b6c1597..fbfb8ce 100755 --- a/compile +++ b/compile @@ -6,6 +6,7 @@ if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then cmake -B bin -S ./ cd bin make + mkdir disassembly if [ $? -eq 0 ]; then cd .. typeset -i build_number=$(cat build.nr) @@ -19,6 +20,7 @@ elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then cmake -B bin -S ./ -G "MinGW Makefiles" cd bin mingw32-make.exe + mkdir disassembly if [ $? -eq 0 ]; then cd .. typeset -i build_number=$(cat build.nr) diff --git a/extra/dragon info/todo.txt b/extra/dragon info/todo.txt index 2938225..03b712f 100644 --- a/extra/dragon info/todo.txt +++ b/extra/dragon info/todo.txt @@ -6,7 +6,7 @@ Add possibility to specify required instruction sets in dasm #***Add "Extended mov" instruction set #***Remove old offset mov -Implelemnt Instructions in dasm: +#***Implelemnt extmov mnemonics in dasm: ## Offset on first operand ## omov *R1, 0xFAAB, word 4 ## Move word immediate into (deref reg + immediate offset word) @@ -35,26 +35,26 @@ Implelemnt Instructions in dasm: ## Offset on second operand - movo *R1, *R2, word 4 ## Move word (deref reg + immediate offset word) into deref reg - movo *R1, *R2, R10 ## Move word (deref reg + reg offset) into deref reg - movo *R1, *R2, 4 ## Move word (deref reg + immediate offset byte) into deref reg + ## movo *R1, *R2, word 4 ## Move word (deref reg + immediate offset word) into deref reg + ## movo *R1, *R2, R10 ## Move word (deref reg + reg offset) into deref reg + ## movo *R1, *R2, 4 ## Move word (deref reg + immediate offset byte) into deref reg - movbo *R1, *R2, word 4 ## Move byte (deref reg + immediate offset word) into deref reg - movbo *R1, *R2, R10 ## Move byte (deref reg + reg offset) into deref reg - movbo *R1, *R2, 4 ## Move byte (deref reg + immediate offset byte) into deref reg + ## movbo *R1, *R2, word 4 ## Move byte (deref reg + immediate offset word) into deref reg + ## movbo *R1, *R2, R10 ## Move byte (deref reg + reg offset) into deref reg + ## movbo *R1, *R2, 4 ## Move byte (deref reg + immediate offset byte) into deref reg - movo R1, [0xFAAB], word 4 ## Move word (Memory + immediate offset word) into reg - movo R1, [0xFAAB], R10 ## Move word (Memory + reg offset) into reg - movo R1, [0xFAAB], 4 ## Move word (Memory + immediate offset byte) into reg + ## movo R1, [0xFAAB], word 4 ## Move word (Memory + immediate offset word) into reg + ## movo R1, [0xFAAB], R10 ## Move word (Memory + reg offset) into reg + ## movo R1, [0xFAAB], 4 ## Move word (Memory + immediate offset byte) into reg - movbo R1, [0xFAAB], word 4 ## Move byte (Memory + immediate offset word) into reg - movbo R1, [0xFAAB], R10 ## Move byte (Memory + reg offset) into reg - movbo R1, [0xFAAB], 4 ## Move byte (Memory + immediate offset byte) into reg + ## movbo R1, [0xFAAB], word 4 ## Move byte (Memory + immediate offset word) into reg + ## movbo R1, [0xFAAB], R10 ## Move byte (Memory + reg offset) into reg + ## movbo R1, [0xFAAB], 4 ## Move byte (Memory + immediate offset byte) into reg - movo R1, *R2, word 4 ## Move word (deref reg + immediate offset word) into reg - movo R1, *R2, R10 ## Move word (deref reg + reg offset) into reg - movo R1, *R2, 4 ## Move word (deref reg + immediate offset byte) into reg + ## movo R1, *R2, word 4 ## Move word (deref reg + immediate offset word) into reg + ## movo R1, *R2, R10 ## Move word (deref reg + reg offset) into reg + ## movo R1, *R2, 4 ## Move word (deref reg + immediate offset byte) into reg - movbo R1, *R2, word 4 ## Move byte (deref reg + immediate offset word) into reg - movbo R1, *R2, R10 ## Move byte (deref reg + reg offset) into reg - movbo R1, *R2, 4 ## Move byte (deref reg + immediate offset byte) into reg \ No newline at end of file + ## movbo R1, *R2, word 4 ## Move byte (deref reg + immediate offset word) into reg + ## movbo R1, *R2, R10 ## Move byte (deref reg + reg offset) into reg + ## movbo R1, *R2, 4 ## Move byte (deref reg + immediate offset byte) into reg \ No newline at end of file diff --git a/extra/dss/extmov_unit_tests.dss b/extra/dss/extmov_unit_tests.dss index 86cc1a3..86c8d7c 100644 --- a/extra/dss/extmov_unit_tests.dss +++ b/extra/dss/extmov_unit_tests.dss @@ -413,7 +413,8 @@ test_18_passed: mov R1, 0x9000 mov R3, 0xA000 mov [0xA022], 0x66 - %low EXT_MOV wdreg_immoffw_in_dreg _R1 _R3 0x00 0x22 + movo *R1, *R3, word 0x22 + ## %low EXT_MOV wdreg_immoffw_in_dreg _R1 _R3 0x00 0x22 mov ACC, *R1 jeq $test_19_passed, 0x66 push 0 @@ -430,7 +431,8 @@ test_19_passed: mov R3, 0xA000 mov [0xA033], 0x77 mov R2, 0x33 - %low EXT_MOV wdreg_regoff_in_dreg _R1 _R3 _R2 + movo *R1, *R3, R2 + ## %low EXT_MOV wdreg_regoff_in_dreg _R1 _R3 _R2 mov ACC, *R1 jeq $test_20_passed, 0x77 push 0 @@ -446,7 +448,8 @@ test_20_passed: mov R1, 0x9000 mov R3, 0xA000 mov [0xA044], 0x88 - %low EXT_MOV wdreg_immoffb_in_dreg _R1 _R3 0x44 + movo *R1, *R3, 0x44 + ## %low EXT_MOV wdreg_immoffb_in_dreg _R1 _R3 0x44 mov ACC, *R1 jeq $test_21_passed, 0x88 push 0 @@ -462,7 +465,8 @@ test_21_passed: mov R1, 0xA000 mov R3, 0xB000 movb [0xB055], 0x99 - %low EXT_MOV bdreg_immoffw_in_dreg _R1 _R3 0x00 0x55 + movbo *R1, *R3, word 0x55 + ## %low EXT_MOV bdreg_immoffw_in_dreg _R1 _R3 0x00 0x55 movb ACC, *R1 jeq $test_22_passed, 0x99 push 0 @@ -479,7 +483,8 @@ test_22_passed: mov R3, 0xB000 movb [0xB066], 0xAA mov R2, 0x66 - %low EXT_MOV bdreg_regoff_in_dreg _R1 _R3 _R2 + movbo *R1, *R3, R2 + ## %low EXT_MOV bdreg_regoff_in_dreg _R1 _R3 _R2 movb ACC, *R1 jeq $test_23_passed, 0xAA push 0 @@ -495,7 +500,8 @@ test_23_passed: mov R1, 0xA000 mov R3, 0xB000 movb [0xB077], 0xBB - %low EXT_MOV bdreg_immoffb_in_dreg _R1 _R3 0x77 + movbo *R1, *R3, 0x77 + ## %low EXT_MOV bdreg_immoffb_in_dreg _R1 _R3 0x77 movb ACC, *R1 jeq $test_24_passed, 0xBB push 0 @@ -509,7 +515,8 @@ test_24_passed: ## debug_break inc R5 mov [0xC088], 0xCC - %low EXT_MOV wmem_immoffw_in_reg _R1 0xC0 0x00 0x00 0x88 + movo R1, [0xC000], word 0x88 + ## %low EXT_MOV wmem_immoffw_in_reg _R1 0xC0 0x00 0x00 0x88 mov ACC, R1 jeq $test_25_passed, 0xCC push 0 @@ -524,7 +531,8 @@ test_25_passed: inc R5 mov [0xC099], 0xDD mov R2, 0x99 - %low EXT_MOV wmem_regoff_in_reg _R1 0xC0 0x00 _R2 + movo R1, [0xC000], R2 + ## %low EXT_MOV wmem_regoff_in_reg _R1 0xC0 0x00 _R2 mov ACC, R1 jeq $test_26_passed, 0xDD push 0 @@ -538,7 +546,8 @@ test_26_passed: ## debug_break inc R5 mov [0xC0AA], 0xEE - %low EXT_MOV wmem_immoffb_in_reg _R1 0xC0 0x00 0xAA + movo R1, [0xC000], 0xAA + ## %low EXT_MOV wmem_immoffb_in_reg _R1 0xC0 0x00 0xAA mov ACC, R1 jeq $test_27_passed, 0xEE push 0 @@ -552,7 +561,8 @@ test_27_passed: ## debug_break inc R5 movb [0xD099], 0x11 - %low EXT_MOV bmem_immoffw_in_reg _R1 0xD0 0x00 0x00 0x99 + movbo R1, [0xD000], word 0x99 + ## %low EXT_MOV bmem_immoffw_in_reg _R1 0xD0 0x00 0x00 0x99 mov ACC, R1 jeq $test_28_passed, 0x11 push 0 @@ -567,7 +577,8 @@ test_28_passed: inc R5 movb [0xD0AA], 0x22 mov R2, 0xAA - %low EXT_MOV bmem_regoff_in_reg _R1 0xD0 0x00 _R2 + movbo R1, [0xD000], R2 + ## %low EXT_MOV bmem_regoff_in_reg _R1 0xD0 0x00 _R2 mov ACC, R1 jeq $test_29_passed, 0x22 push 0 @@ -581,7 +592,8 @@ test_29_passed: ## debug_break inc R5 movb [0xD0BB], 0x33 - %low EXT_MOV bmem_immoffb_in_reg _R1 0xD0 0x00 0xBB + movbo R1, [0xD000], 0xBB + ## %low EXT_MOV bmem_immoffb_in_reg _R1 0xD0 0x00 0xBB mov ACC, R1 jeq $test_30_passed, 0x33 push 0 @@ -596,7 +608,8 @@ test_30_passed: inc R5 mov R3, 0x4000 mov [0x40CC], 0x44 - %low EXT_MOV wdreg_immoffw_in_reg _R1 _R3 0x00 0xCC + movo R1, *R3, word 0xCC + ## %low EXT_MOV wdreg_immoffw_in_reg _R1 _R3 0x00 0xCC mov ACC, R1 jeq $test_31_passed, 0x44 push 0 @@ -612,7 +625,8 @@ test_31_passed: mov R3, 0x4000 mov [0x40DD], 0x55 mov R2, 0xDD - %low EXT_MOV wdreg_regoff_in_reg _R1 _R3 _R2 + movo R1, *R3, R2 + ## %low EXT_MOV wdreg_regoff_in_reg _R1 _R3 _R2 mov ACC, R1 jeq $test_32_passed, 0x55 push 0 @@ -627,7 +641,8 @@ test_32_passed: inc R5 mov R3, 0x4000 mov [0x40EE], 0x66 - %low EXT_MOV wdreg_immoffb_in_reg _R1 _R3 0xEE + movo R1, *R3, 0xEE + ## %low EXT_MOV wdreg_immoffb_in_reg _R1 _R3 0xEE mov ACC, R1 jeq $test_33_passed, 0x66 push 0 @@ -642,7 +657,8 @@ test_33_passed: inc R5 mov R3, 0x5000 movb [0x5011], 0x77 - %low EXT_MOV bdreg_immoffw_in_reg _R1 _R3 0x00 0x11 + movbo R1, *R3, word 0x11 + ## %low EXT_MOV bdreg_immoffw_in_reg _R1 _R3 0x00 0x11 mov ACC, R1 jeq $test_34_passed, 0x77 push 0 @@ -658,7 +674,8 @@ test_34_passed: mov R3, 0x5000 movb [0x5022], 0x88 mov R2, 0x22 - %low EXT_MOV bdreg_regoff_in_reg _R1 _R3 _R2 + movbo R1, *R3, R2 + ## %low EXT_MOV bdreg_regoff_in_reg _R1 _R3 _R2 mov ACC, R1 jeq $test_35_passed, 0x88 push 0 @@ -673,7 +690,8 @@ test_35_passed: inc R5 mov R3, 0x5000 movb [0x5033], 0x99 - %low EXT_MOV bdreg_immoffb_in_reg _R1 _R3 0x33 + movbo R1, *R3, 0x33 + ## %low EXT_MOV bdreg_immoffb_in_reg _R1 _R3 0x33 mov ACC, R1 jeq $test_36_passed, 0x99 push 0 diff --git a/extra/dss/newTest.dss b/extra/dss/newTest.dss index b8881a5..bb601c9 100644 --- a/extra/dss/newTest.dss +++ b/extra/dss/newTest.dss @@ -10,8 +10,6 @@ $string "Hello World!!" .code - debug_break - %low 0xE0 0x01 mov R10, 0x00 mov R9, $_text_entered_handler mov R8, 0xA2 diff --git a/extra/make_and_debug b/extra/make_and_debug index bcb418f..1d753dc 100755 --- a/extra/make_and_debug +++ b/extra/make_and_debug @@ -17,11 +17,9 @@ if [ $? -eq 0 ]; then /bin/bash ./load_mbr cd .. printf "${green}Compiling Test Program...\n" - ./dasm dss/extmov_unit_tests.dss -o extmov_unit_tests.bin --extmov --save-disassembly disassembly/extmov_unit_tests.dds --verbose - # ./dasm dss/newTest.dss -o newTest.bin --extmov --save-disassembly disassembly/newTest.dds --verbose + ./dasm dss/newTest.dss -o newTest.bin --extmov --save-disassembly disassembly/newTest.dds --verbose printf "\n${green}Running Application...\n\n${clear}" - ./ddb config/testMachine.dvm --force-load extmov_unit_tests.bin 0x00 --verbose-load - # ./ddb config/testMachine.dvm --force-load newTest.bin 0x00 --verbose-load + ./ddb config/testMachine.dvm --force-load newTest.bin 0x00 --verbose-load cp dragon/disk1.dr ../extra/dragon/disk1.dr cp dragon/cmos.dr ../extra/dragon/cmos.dr fi diff --git a/extra/make_and_run b/extra/make_and_run index 35ac2bf..ac569a3 100755 --- a/extra/make_and_run +++ b/extra/make_and_run @@ -17,11 +17,9 @@ if [ $? -eq 0 ]; then /bin/bash ./load_mbr cd .. printf "${green}Compiling Test Program...\n" - ./dasm dss/extmov_unit_tests.dss -o extmov_unit_tests.bin --extmov --save-disassembly disassembly/extmov_unit_tests.dds --verbose - # ./dasm dss/newTest.dss -o newTest.bin --extmov --save-disassembly disassembly/newTest.dds --verbose + ./dasm dss/newTest.dss -o newTest.bin --extmov --save-disassembly disassembly/newTest.dds --verbose printf "\n${green}Running Application...\n\n${clear}" - ./dvm config/testMachine.dvm --force-load extmov_unit_tests.bin 0x00 - # ./dvm config/testMachine.dvm --force-load newTest.bin 0x00 + ./dvm config/testMachine.dvm --force-load newTest.bin 0x00 cp dragon/disk1.dr ../extra/dragon/disk1.dr cp dragon/cmos.dr ../extra/dragon/cmos.dr fi diff --git a/src/assembler/Assembler.cpp b/src/assembler/Assembler.cpp index 23a8d72..50d91fb 100644 --- a/src/assembler/Assembler.cpp +++ b/src/assembler/Assembler.cpp @@ -1946,9 +1946,305 @@ namespace dragon } else if (instEdit == "movo") { + if (st.count() != 3) + { + std::cout << "Invalid operand number; " << line << "3 -> 3 required\n"; + exit(0); + return; + } + eOperandType opType1 = parseOperand(st.next(), word1); + if (opType1 == eOperandType::Register) + { + m_code.push_back((uint8_t)word1); + code_offset++; + eOperandType opType2 = parseOperand(st.next(), word2); + ostd::String op3 = st.next(); + bool word_offset = false; + if (op3.startsWith("word")) + { + op3.substr(4).trim(); + word_offset = true; + } + eOperandType opType3 = parseOperand(op3, word3); + switch (opType2) + { + case eOperandType::DerefMemory: + m_code.push_back((uint8_t)((word2 & 0xFF00) >> 8)); + m_code.push_back((uint8_t)(word2 & 0x00FF)); + code_offset += 2; + break; + case eOperandType::DerefRegister: + m_code.push_back((uint8_t)word2); + code_offset++; + break; + default: + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + break; + } + switch (opType3) + { + case eOperandType::Immediate: + case eOperandType::Label: + if (word_offset) + { + if (opType2 == eOperandType::DerefMemory) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wmem_immoffw_in_reg; + else if (opType2 == eOperandType::DerefRegister) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wdreg_immoffw_in_reg; + else + { + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + } + m_code.push_back((uint8_t)((word3 & 0xFF00) >> 8)); + m_code.push_back((uint8_t)(word3 & 0x00FF)); + code_offset += 2; + } + else + { + if (opType2 == eOperandType::DerefMemory) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wmem_immoffb_in_reg; + else if (opType2 == eOperandType::DerefRegister) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wdreg_immoffb_in_reg; + else + { + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + } + m_code.push_back((uint8_t)word3); + code_offset++; + } + break; + case eOperandType::Register: + if (opType2 == eOperandType::DerefMemory) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wmem_regoff_in_reg; + else if (opType2 == eOperandType::DerefRegister) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wdreg_regoff_in_reg; + else + { + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + } + m_code.push_back((uint8_t)word3); + code_offset++; + break; + default: + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + break; + } + } + else if (opType1 == eOperandType::DerefRegister) + { + m_code.push_back((uint8_t)word1); + code_offset++; + eOperandType opType2 = parseOperand(st.next(), word2); + ostd::String op3 = st.next(); + bool word_offset = false; + if (op3.startsWith("word")) + { + op3.substr(4).trim(); + word_offset = true; + } + eOperandType opType3 = parseOperand(op3, word3); + switch (opType2) + { + case eOperandType::DerefRegister: + m_code.push_back((uint8_t)word2); + code_offset++; + break; + default: + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + break; + } + switch (opType3) + { + case eOperandType::Immediate: + case eOperandType::Label: + if (word_offset) + { + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wdreg_immoffw_in_dreg; + m_code.push_back((uint8_t)((word3 & 0xFF00) >> 8)); + m_code.push_back((uint8_t)(word3 & 0x00FF)); + code_offset += 2; + } + else + { + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wdreg_immoffb_in_dreg; + m_code.push_back((uint8_t)word3); + code_offset++; + } + break; + case eOperandType::Register: + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::wdreg_regoff_in_dreg; + m_code.push_back((uint8_t)word3); + code_offset++; + break; + default: + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + break; + } + } + else + { + std::cout << "Invalid operand type; " << line << " (" << opEdit << ") -> DerefRegister or Pointer required\n"; + exit(0); + return; + } } else if (instEdit == "movbo") { + if (st.count() != 3) + { + std::cout << "Invalid operand number; " << line << "3 -> 3 required\n"; + exit(0); + return; + } + eOperandType opType1 = parseOperand(st.next(), word1); + if (opType1 == eOperandType::Register) + { + m_code.push_back((uint8_t)word1); + code_offset++; + eOperandType opType2 = parseOperand(st.next(), word2); + ostd::String op3 = st.next(); + bool word_offset = false; + if (op3.startsWith("word")) + { + op3.substr(4).trim(); + word_offset = true; + } + eOperandType opType3 = parseOperand(op3, word3); + switch (opType2) + { + case eOperandType::DerefMemory: + m_code.push_back((uint8_t)((word2 & 0xFF00) >> 8)); + m_code.push_back((uint8_t)(word2 & 0x00FF)); + code_offset += 2; + break; + case eOperandType::DerefRegister: + m_code.push_back((uint8_t)word2); + code_offset++; + break; + default: + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + break; + } + switch (opType3) + { + case eOperandType::Immediate: + case eOperandType::Label: + if (word_offset) + { + if (opType2 == eOperandType::DerefMemory) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bmem_immoffw_in_reg; + else if (opType2 == eOperandType::DerefRegister) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bdreg_immoffw_in_reg; + else + { + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + } + m_code.push_back((uint8_t)((word3 & 0xFF00) >> 8)); + m_code.push_back((uint8_t)(word3 & 0x00FF)); + code_offset += 2; + } + else + { + if (opType2 == eOperandType::DerefMemory) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bmem_immoffb_in_reg; + else if (opType2 == eOperandType::DerefRegister) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bdreg_immoffb_in_reg; + else + { + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + } + m_code.push_back((uint8_t)word3); + code_offset++; + } + break; + case eOperandType::Register: + if (opType2 == eOperandType::DerefMemory) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bmem_regoff_in_reg; + else if (opType2 == eOperandType::DerefRegister) + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bdreg_regoff_in_reg; + else + { + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + } + m_code.push_back((uint8_t)word3); + code_offset++; + break; + default: + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + break; + } + } + else if (opType1 == eOperandType::DerefRegister) + { + m_code.push_back((uint8_t)word1); + code_offset++; + eOperandType opType2 = parseOperand(st.next(), word2); + ostd::String op3 = st.next(); + bool word_offset = false; + if (op3.startsWith("word")) + { + op3.substr(4).trim(); + word_offset = true; + } + eOperandType opType3 = parseOperand(op3, word3); + switch (opType2) + { + case eOperandType::DerefRegister: + m_code.push_back((uint8_t)word2); + code_offset++; + break; + default: + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + break; + } + switch (opType3) + { + case eOperandType::Immediate: + case eOperandType::Label: + if (word_offset) + { + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bdreg_immoffw_in_dreg; + m_code.push_back((uint8_t)((word3 & 0xFF00) >> 8)); + m_code.push_back((uint8_t)(word3 & 0x00FF)); + code_offset += 2; + } + else + { + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bdreg_immoffb_in_dreg; + m_code.push_back((uint8_t)word3); + code_offset++; + } + break; + case eOperandType::Register: + m_code[m_code.size() - code_offset] = hw::cpuext::ExtMov::OpCodes::bdreg_regoff_in_dreg; + m_code.push_back((uint8_t)word3); + code_offset++; + break; + default: + std::cout << "Invalid operand type; " << line << " (" << opEdit << ")\n"; + exit(0); + break; + } + } + else + { + std::cout << "Invalid operand type; " << line << " (" << opEdit << ") -> DerefRegister or Pointer required\n"; + exit(0); + return; + } } else {