additional instructions are only ^0111 and not ^1111 (2)

This commit is contained in:
folkert van heusden 2023-03-20 10:07:51 +01:00
parent e6d89c425e
commit d81f7eec66
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1

70
cpu.cpp
View file

@ -410,8 +410,12 @@ bool cpu::double_operand_instructions(const uint16_t instr)
if (operation == 0b000) if (operation == 0b000)
return single_operand_instructions(instr); return single_operand_instructions(instr);
if (operation == 0b111 && word_mode == false) if (operation == 0b111) {
if (word_mode)
return false;
return additional_double_operand_instructions(instr); return additional_double_operand_instructions(instr);
}
const uint8_t src = (instr >> 6) & 63; const uint8_t src = (instr >> 6) & 63;
const uint8_t src_mode = (src >> 3) & 7; const uint8_t src_mode = (src >> 3) & 7;
@ -1836,45 +1840,49 @@ std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t
if (text.empty() == false && next_word != -1) if (text.empty() == false && next_word != -1)
instruction_words.push_back(next_word); instruction_words.push_back(next_word);
} }
else if (do_opcode == 0b111 && word_mode == false) { else if (do_opcode == 0b111) {
std::string src_text = format("R%d", (instruction >> 6) & 7); if (word_mode)
auto dst_text { addressing_to_string(dst_register, (addr + 2) & 65535, word_mode) }; name = "?";
else {
std::string src_text = format("R%d", (instruction >> 6) & 7);
auto dst_text { addressing_to_string(dst_register, (addr + 2) & 65535, word_mode) };
auto next_word = dst_text.instruction_part; auto next_word = dst_text.instruction_part;
work_values.push_back(dst_text.work_value); work_values.push_back(dst_text.work_value);
switch(ado_opcode) { // additional double operand switch(ado_opcode) { // additional double operand
case 0: case 0:
name = "MUL"; name = "MUL";
break; break;
case 1: case 1:
name = "DIV"; name = "DIV";
break; break;
case 2: case 2:
name = "ASH"; name = "ASH";
break; break;
case 3: case 3:
name = "ASHC"; name = "ASHC";
break; break;
case 4: case 4:
name = "XOR"; name = "XOR";
break; break;
case 7: case 7:
text = std::string("SOB ") + src_text; text = std::string("SOB ") + src_text;
break; break;
}
if (text.empty() && name.empty() == false)
text = name + space + src_text + comma + dst_text.operand;
if (text.empty() == false && next_word != -1)
instruction_words.push_back(next_word);
} }
if (text.empty() && name.empty() == false)
text = name + space + src_text + comma + dst_text.operand;
if (text.empty() == false && next_word != -1)
instruction_words.push_back(next_word);
} }
else { else {
switch(do_opcode) { switch(do_opcode) {