mirror of
https://github.com/lefticus/6502-cpp.git
synced 2025-05-17 06:38:19 +00:00
add jst
This commit is contained in:
parent
ba5fa6c978
commit
2a2ce54d32
20
src/main.cpp
20
src/main.cpp
@ -127,7 +127,8 @@ struct mos6502 : ASMLine
|
|||||||
rts,
|
rts,
|
||||||
clc,
|
clc,
|
||||||
sec,
|
sec,
|
||||||
bit
|
bit,
|
||||||
|
jsr
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool get_is_branch(const OpCode o) {
|
static bool get_is_branch(const OpCode o) {
|
||||||
@ -156,6 +157,7 @@ struct mos6502 : ASMLine
|
|||||||
case OpCode::ORA:
|
case OpCode::ORA:
|
||||||
case OpCode::cmp:
|
case OpCode::cmp:
|
||||||
case OpCode::jmp:
|
case OpCode::jmp:
|
||||||
|
case OpCode::jsr:
|
||||||
case OpCode::adc:
|
case OpCode::adc:
|
||||||
case OpCode::sbc:
|
case OpCode::sbc:
|
||||||
case OpCode::rts:
|
case OpCode::rts:
|
||||||
@ -192,6 +194,7 @@ struct mos6502 : ASMLine
|
|||||||
case OpCode::dec:
|
case OpCode::dec:
|
||||||
case OpCode::ORA:
|
case OpCode::ORA:
|
||||||
case OpCode::jmp:
|
case OpCode::jmp:
|
||||||
|
case OpCode::jsr:
|
||||||
case OpCode::bne:
|
case OpCode::bne:
|
||||||
case OpCode::bmi:
|
case OpCode::bmi:
|
||||||
case OpCode::beq:
|
case OpCode::beq:
|
||||||
@ -283,6 +286,8 @@ struct mos6502 : ASMLine
|
|||||||
return "sec";
|
return "sec";
|
||||||
case OpCode::bit:
|
case OpCode::bit:
|
||||||
return "bit";
|
return "bit";
|
||||||
|
case OpCode::jsr:
|
||||||
|
return "jsr";
|
||||||
case OpCode::unknown:
|
case OpCode::unknown:
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
@ -353,7 +358,8 @@ struct i386 : ASMLine
|
|||||||
sbbb,
|
sbbb,
|
||||||
negb,
|
negb,
|
||||||
notb,
|
notb,
|
||||||
retl
|
retl,
|
||||||
|
call
|
||||||
};
|
};
|
||||||
|
|
||||||
static OpCode parse_opcode(Type t, const std::string &o)
|
static OpCode parse_opcode(Type t, const std::string &o)
|
||||||
@ -400,6 +406,8 @@ struct i386 : ASMLine
|
|||||||
if (o == "sbbb") return OpCode::sbbb;
|
if (o == "sbbb") return OpCode::sbbb;
|
||||||
if (o == "pushl") return OpCode::pushl;
|
if (o == "pushl") return OpCode::pushl;
|
||||||
if (o == "retl") return OpCode::retl;
|
if (o == "retl") return OpCode::retl;
|
||||||
|
if (o == "call") return OpCode::call;
|
||||||
|
if (o == "calll") return OpCode::call;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw std::runtime_error("Unknown opcode: " + o);
|
throw std::runtime_error("Unknown opcode: " + o);
|
||||||
@ -483,9 +491,9 @@ void translate_instruction(std::vector<mos6502> &instructions, const i386::OpCod
|
|||||||
instructions.emplace_back(mos6502::OpCode::lda, get_register(o1.reg_num, 1));
|
instructions.emplace_back(mos6502::OpCode::lda, get_register(o1.reg_num, 1));
|
||||||
instructions.emplace_back(mos6502::OpCode::sta, get_register(o2.reg_num, 1));
|
instructions.emplace_back(mos6502::OpCode::sta, get_register(o2.reg_num, 1));
|
||||||
} else if (o1.type == Operand::Type::literal && o2.type == Operand::Type::reg) {
|
} else if (o1.type == Operand::Type::literal && o2.type == Operand::Type::reg) {
|
||||||
instructions.emplace_back(mos6502::OpCode::lda, Operand(o1.type, "#<" + o1.value));
|
instructions.emplace_back(mos6502::OpCode::lda, Operand(o1.type, "#<" + o1.value));
|
||||||
instructions.emplace_back(mos6502::OpCode::sta, get_register(o2.reg_num));
|
instructions.emplace_back(mos6502::OpCode::sta, get_register(o2.reg_num));
|
||||||
instructions.emplace_back(mos6502::OpCode::lda, Operand(o1.type, "#>" + o1.value));
|
instructions.emplace_back(mos6502::OpCode::lda, Operand(o1.type, "#>" + o1.value));
|
||||||
instructions.emplace_back(mos6502::OpCode::sta, get_register(o2.reg_num, 1));
|
instructions.emplace_back(mos6502::OpCode::sta, get_register(o2.reg_num, 1));
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error("Cannot translate movl instruction");
|
throw std::runtime_error("Cannot translate movl instruction");
|
||||||
@ -736,6 +744,10 @@ void translate_instruction(std::vector<mos6502> &instructions, const i386::OpCod
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case i386::OpCode::call:
|
||||||
|
instructions.emplace_back(mos6502::OpCode::jsr, o1);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw std::runtime_error("Cannot translate unhandled instruction");
|
throw std::runtime_error("Cannot translate unhandled instruction");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user