mirror of
https://github.com/lefticus/6502-cpp.git
synced 2024-12-21 10:30:35 +00:00
Initial support for __mulhi3
This commit is contained in:
parent
468e794d5e
commit
49cf9cc32d
35
include/lib1funcs.hpp
Normal file
35
include/lib1funcs.hpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
static constexpr std::string_view __mulhi3 =
|
||||||
|
R"(
|
||||||
|
;;; based on protocol from gcc's calling conventions for AVR
|
||||||
|
|
||||||
|
;;; R25:R24 = R23:R22 * R25:R24
|
||||||
|
;;; Clobbers: __tmp_reg__, R21..R23
|
||||||
|
|
||||||
|
__mulhi3:
|
||||||
|
mov __temp_reg__,r24
|
||||||
|
mov r21,r25
|
||||||
|
ldi r25,0
|
||||||
|
ldi r24,0
|
||||||
|
cp __temp_reg__,__zero_reg__
|
||||||
|
cpc r21,__zero_reg__
|
||||||
|
breq .__mulhi3_L5
|
||||||
|
.__mulhi3_L4:
|
||||||
|
sbrs __temp_reg__,0
|
||||||
|
rjmp .__mulhi3_L3
|
||||||
|
add r24,r22
|
||||||
|
adc r25,r23
|
||||||
|
.__mulhi3_L3:
|
||||||
|
lsr r21
|
||||||
|
ror __temp_reg__
|
||||||
|
lsl r22
|
||||||
|
rol r23
|
||||||
|
cp __temp_reg__,__zero_reg__
|
||||||
|
cpc r21,__zero_reg__
|
||||||
|
brne .__mulhi3_L4
|
||||||
|
ret
|
||||||
|
.__mulhi3_L5:
|
||||||
|
ret
|
||||||
|
)";
|
||||||
|
|
||||||
|
|
3315
lib1funcs.S
3315
lib1funcs.S
File diff suppressed because it is too large
Load Diff
@ -16,10 +16,10 @@
|
|||||||
|
|
||||||
#include "include/6502.hpp"
|
#include "include/6502.hpp"
|
||||||
#include "include/assembly.hpp"
|
#include "include/assembly.hpp"
|
||||||
|
#include "include/lib1funcs.hpp"
|
||||||
#include "include/optimizer.hpp"
|
#include "include/optimizer.hpp"
|
||||||
#include "include/personalities/c64.hpp"
|
#include "include/personalities/c64.hpp"
|
||||||
|
|
||||||
|
|
||||||
int to_int(const std::string_view sv)
|
int to_int(const std::string_view sv)
|
||||||
{
|
{
|
||||||
int result{};
|
int result{};
|
||||||
@ -875,9 +875,7 @@ std::vector<mos6502> run(const Personality &personality, std::istream &input)
|
|||||||
|
|
||||||
std::vector<AVR> instructions;
|
std::vector<AVR> instructions;
|
||||||
|
|
||||||
while (input.good()) {
|
const auto parse_line = [&](const auto &line) {
|
||||||
std::string line;
|
|
||||||
getline(input, line);
|
|
||||||
try {
|
try {
|
||||||
std::smatch match;
|
std::smatch match;
|
||||||
if (std::regex_match(line, match, Label)) {
|
if (std::regex_match(line, match, Label)) {
|
||||||
@ -902,6 +900,29 @@ std::vector<mos6502> run(const Personality &personality, std::istream &input)
|
|||||||
}
|
}
|
||||||
|
|
||||||
++lineno;
|
++lineno;
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto parse_stream = [&](auto &stream) {
|
||||||
|
while (stream.good()) {
|
||||||
|
std::string line;
|
||||||
|
getline(stream, line);
|
||||||
|
parse_line(line);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto parse_string = [&](const auto &string) {
|
||||||
|
std::stringstream ss{std::string(string)};
|
||||||
|
parse_stream(ss);
|
||||||
|
};
|
||||||
|
|
||||||
|
parse_stream(input);
|
||||||
|
|
||||||
|
const bool needs_mulhi3 = std::any_of(begin(instructions), end(instructions), [](const AVR &instruction) {
|
||||||
|
return instruction.line_text.find("__mulhi3") != std::string::npos;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (needs_mulhi3) {
|
||||||
|
parse_string(__mulhi3);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> labels;
|
std::set<std::string> labels;
|
||||||
@ -910,7 +931,7 @@ std::vector<mos6502> run(const Personality &personality, std::istream &input)
|
|||||||
if (i.type == ASMLine::Type::Label) { labels.insert(i.text); }
|
if (i.type == ASMLine::Type::Label) { labels.insert(i.text); }
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> used_labels{ "main", "__udivmodhi4", "__mulhi3" };
|
std::set<std::string> used_labels{ "main" };
|
||||||
|
|
||||||
for (const auto &i : instructions) {
|
for (const auto &i : instructions) {
|
||||||
const auto check_label = [&](const std::string &value) {
|
const auto check_label = [&](const std::string &value) {
|
||||||
@ -963,7 +984,6 @@ std::vector<mos6502> run(const Personality &personality, std::istream &input)
|
|||||||
i.text = new_labels.at(i.text);
|
i.text = new_labels.at(i.text);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
spdlog::warn("Unused label: '{}', consider making function static until we remove unused functions", i.text);
|
spdlog::warn("Unused label: '{}', consider making function static until we remove unused functions", i.text);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user