[0.2.1588] - Fully implemented ExtMov CPU extension
This commit is contained in:
parent
56e12f9949
commit
c9014b99b0
8 changed files with 358 additions and 48 deletions
2
build.nr
2
build.nr
|
|
@ -1 +1 @@
|
|||
1588
|
||||
1589
|
||||
|
|
|
|||
2
compile
2
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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
## 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -10,8 +10,6 @@
|
|||
$string "Hello World!!"
|
||||
|
||||
.code
|
||||
debug_break
|
||||
%low 0xE0 0x01
|
||||
mov R10, 0x00
|
||||
mov R9, $_text_entered_handler
|
||||
mov R8, 0xA2
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue