changes to make it compile on ESP32 (does currently not support "std::optional")
This commit is contained in:
parent
f5bea4b5dc
commit
517f2afb9b
3 changed files with 61 additions and 59 deletions
|
@ -2,13 +2,9 @@
|
|||
default_envs = serial32
|
||||
src_dir = .
|
||||
|
||||
[env]
|
||||
framework = arduino
|
||||
lib_ldf_mode = deep+
|
||||
lib_deps =
|
||||
src_filter = +<*> -<.git/> -<.svn/> -<example/> -<examples/> -<test/> -<tests/> -<build> -<player.cpp>
|
||||
|
||||
[env:serial32]
|
||||
lib_ldf_mode = deep+
|
||||
src_filter = +<*> -<.git/> -<.svn/> -<example/> -<examples/> -<test/> -<tests/> -<build> -<player.cpp>
|
||||
platform = espressif32
|
||||
board = wemos_d1_mini32
|
||||
framework = arduino
|
||||
|
@ -16,5 +12,5 @@ monitor_speed = 115200
|
|||
upload_speed = 1000000
|
||||
lib_deps = greiman/SdFat@^2.1.2
|
||||
adafruit/Adafruit NeoPixel@^1.10.4
|
||||
build_flags = -std=c++17 -Ofast -DESP32=1
|
||||
build_flags = -std=gnu++17 -Ofast -DESP32=1
|
||||
build_unflags = -std=gnu++11 -Os
|
||||
|
|
100
cpu.cpp
100
cpu.cpp
|
@ -1433,7 +1433,7 @@ void cpu::trap(const uint16_t vector, const int new_ipl)
|
|||
D(fprintf(stderr, "TRAP %o: PC is now %06o, PSW is now %06o\n", vector, getPC(), new_psw);)
|
||||
}
|
||||
|
||||
std::tuple<std::string, int, std::optional<uint16_t>, uint16_t> cpu::addressing_to_string(const uint8_t mode_register, const uint16_t pc, const bool word_mode) const
|
||||
cpu::operand_parameters cpu::addressing_to_string(const uint8_t mode_register, const uint16_t pc, const bool word_mode) const
|
||||
{
|
||||
assert(mode_register < 64);
|
||||
|
||||
|
@ -1453,43 +1453,43 @@ std::tuple<std::string, int, std::optional<uint16_t>, uint16_t> cpu::addressing_
|
|||
|
||||
switch(mode_register >> 3) {
|
||||
case 0:
|
||||
return { reg_name, 2, { }, uint16_t(getRegister(reg) & mask) };
|
||||
return { reg_name, 2, -1, uint16_t(getRegister(reg) & mask) };
|
||||
|
||||
case 1:
|
||||
return { format("(%s)", reg_name.c_str()), 2, { }, uint16_t(b->readWord(getRegister(reg)) & mask) };
|
||||
return { format("(%s)", reg_name.c_str()), 2, -1, uint16_t(b->readWord(getRegister(reg)) & mask) };
|
||||
|
||||
case 2:
|
||||
if (reg == 7)
|
||||
return { format("#%06o", next_word), 4, next_word, uint16_t(next_word & mask) };
|
||||
return { format("#%06o", next_word), 4, int(next_word), uint16_t(next_word & mask) };
|
||||
|
||||
return { format("(%s)+", reg_name.c_str()), 2, { }, uint16_t(b->readWord(getRegister(reg)) & mask) };
|
||||
return { format("(%s)+", reg_name.c_str()), 2, -1, uint16_t(b->readWord(getRegister(reg)) & mask) };
|
||||
|
||||
case 3:
|
||||
if (reg == 7)
|
||||
return { format("@#%06o", next_word), 4, next_word, uint16_t(b->readWord(next_word) & mask) };
|
||||
return { format("@#%06o", next_word), 4, int(next_word), uint16_t(b->readWord(next_word) & mask) };
|
||||
|
||||
return { format("@(%s)+", reg_name.c_str()), 2, { }, uint16_t(b->readWord(b->readWord(getRegister(reg))) & mask) };
|
||||
return { format("@(%s)+", reg_name.c_str()), 2, -1, uint16_t(b->readWord(b->readWord(getRegister(reg))) & mask) };
|
||||
|
||||
case 4:
|
||||
return { format("-(%s)", reg_name.c_str()), 2, { }, uint16_t(b->readWord(getRegister(reg) - (word_mode == false || reg >= 6 ? 2 : 1)) & mask) };
|
||||
return { format("-(%s)", reg_name.c_str()), 2, -1, uint16_t(b->readWord(getRegister(reg) - (word_mode == false || reg >= 6 ? 2 : 1)) & mask) };
|
||||
|
||||
case 5:
|
||||
return { format("@-(%s)", reg_name.c_str()), 2, { }, uint16_t(b->readWord(b->readWord(getRegister(reg) - 2)) & mask) };
|
||||
return { format("@-(%s)", reg_name.c_str()), 2, -1, uint16_t(b->readWord(b->readWord(getRegister(reg) - 2)) & mask) };
|
||||
|
||||
case 6:
|
||||
if (reg == 7)
|
||||
return { format("%06o", (pc + next_word + 2) & 65535), 4, next_word, uint16_t(b->readWord(getRegister(reg) + next_word) & mask) };
|
||||
return { format("%06o", (pc + next_word + 2) & 65535), 4, int(next_word), uint16_t(b->readWord(getRegister(reg) + next_word) & mask) };
|
||||
|
||||
return { format("%o(%s)", next_word, reg_name.c_str()), 4, next_word, uint16_t(b->readWord(getRegister(reg) + next_word) & mask) };
|
||||
return { format("%o(%s)", next_word, reg_name.c_str()), 4, int(next_word), uint16_t(b->readWord(getRegister(reg) + next_word) & mask) };
|
||||
|
||||
case 7:
|
||||
if (reg == 7)
|
||||
return { format("@%06o", next_word), 4, next_word, uint16_t(b->readWord(b->readWord(getRegister(reg) + next_word)) & mask) };
|
||||
return { format("@%06o", next_word), 4, int(next_word), uint16_t(b->readWord(b->readWord(getRegister(reg) + next_word)) & mask) };
|
||||
|
||||
return { format("@%o(%s)", next_word, reg_name.c_str()), 4, next_word, uint16_t(b->readWord(b->readWord(getRegister(reg) + next_word)) & mask) };
|
||||
return { format("@%o(%s)", next_word, reg_name.c_str()), 4, int(next_word), uint16_t(b->readWord(b->readWord(getRegister(reg) + next_word)) & mask) };
|
||||
}
|
||||
|
||||
return { "??", 0, { }, 0123456 };
|
||||
return { "??", 0, -1, 0123456 };
|
||||
}
|
||||
|
||||
std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t addr) const
|
||||
|
@ -1521,18 +1521,18 @@ std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t
|
|||
// TODO: 100000011
|
||||
|
||||
if (do_opcode == 0b000) {
|
||||
auto dst_text = addressing_to_string(dst_register, (pc + 2) & 65535, word_mode);
|
||||
auto dst_text { addressing_to_string(dst_register, (pc + 2) & 65535, word_mode) };
|
||||
|
||||
auto next_word = std::get<2>(dst_text);
|
||||
if (next_word.has_value())
|
||||
instruction_words.push_back(next_word.value());
|
||||
auto next_word = dst_text.instruction_part;
|
||||
if (next_word != -1)
|
||||
instruction_words.push_back(next_word);
|
||||
|
||||
work_values.push_back(std::get<3>(dst_text));
|
||||
work_values.push_back(dst_text.work_value);
|
||||
|
||||
// single_operand_instructions
|
||||
switch(so_opcode) {
|
||||
case 0b00000011:
|
||||
text = "SWAB " + std::get<0>(dst_text);
|
||||
text = "SWAB " + dst_text.operand;
|
||||
break;
|
||||
|
||||
case 0b000101000:
|
||||
|
@ -1605,17 +1605,17 @@ std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t
|
|||
}
|
||||
|
||||
if (text.empty() && name.empty() == false)
|
||||
text = name + word_mode_str + space + std::get<0>(dst_text);
|
||||
text = name + word_mode_str + space + dst_text.operand;
|
||||
}
|
||||
else if (do_opcode == 0b111) {
|
||||
std::string src_text = format("R%d", (instruction >> 6) & 7);
|
||||
auto dst_text = addressing_to_string(dst_register, (pc + 2) & 65535, word_mode);
|
||||
auto dst_text { addressing_to_string(dst_register, (pc + 2) & 65535, word_mode) };
|
||||
|
||||
auto next_word = std::get<2>(dst_text);
|
||||
if (next_word.has_value())
|
||||
instruction_words.push_back(next_word.value());
|
||||
auto next_word = dst_text.instruction_part;
|
||||
if (next_word != -1)
|
||||
instruction_words.push_back(next_word);
|
||||
|
||||
work_values.push_back(std::get<3>(dst_text));
|
||||
work_values.push_back(dst_text.work_value);
|
||||
|
||||
switch(ado_opcode) { // additional double operand
|
||||
case 0:
|
||||
|
@ -1644,7 +1644,7 @@ std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t
|
|||
}
|
||||
|
||||
if (text.empty() && name.empty() == false)
|
||||
text = name + space + src_text + comma + std::get<0>(dst_text);
|
||||
text = name + space + src_text + comma + dst_text.operand;
|
||||
}
|
||||
else {
|
||||
switch(do_opcode) {
|
||||
|
@ -1677,24 +1677,24 @@ std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t
|
|||
}
|
||||
|
||||
// source
|
||||
auto src_text = addressing_to_string(src_register, (pc + 2) & 65535, word_mode);
|
||||
auto src_text { addressing_to_string(src_register, (pc + 2) & 65535, word_mode) };
|
||||
|
||||
auto next_word_src = std::get<2>(src_text);
|
||||
if (next_word_src.has_value())
|
||||
instruction_words.push_back(next_word_src.value());
|
||||
auto next_word_src = src_text.instruction_part;
|
||||
if (next_word_src != -1)
|
||||
instruction_words.push_back(next_word_src);
|
||||
|
||||
work_values.push_back(std::get<3>(src_text));
|
||||
work_values.push_back(src_text.work_value);
|
||||
|
||||
// destination
|
||||
auto dst_text = addressing_to_string(dst_register, (pc + std::get<1>(src_text)) & 65535, word_mode);
|
||||
auto dst_text { addressing_to_string(dst_register, (pc + src_text.length) & 65535, word_mode) };
|
||||
|
||||
auto next_word_dst = std::get<2>(dst_text);
|
||||
if (next_word_dst.has_value())
|
||||
instruction_words.push_back(next_word_dst.value());
|
||||
auto next_word_dst = dst_text.instruction_part;
|
||||
if (next_word_dst != -1)
|
||||
instruction_words.push_back(next_word_dst);
|
||||
|
||||
work_values.push_back(std::get<3>(dst_text));
|
||||
work_values.push_back(dst_text.work_value);
|
||||
|
||||
text = name + word_mode_str + space + std::get<0>(src_text) + comma + std::get<0>(dst_text);
|
||||
text = name + word_mode_str + space + src_text.operand + comma + dst_text.operand;
|
||||
}
|
||||
|
||||
if (text.empty()) { // conditional branch instructions
|
||||
|
@ -1837,27 +1837,27 @@ std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t
|
|||
text = format("TRAP %o", instruction & 255);
|
||||
|
||||
if ((instruction & ~0b111111) == 0b0000000001000000) {
|
||||
auto dst_text = addressing_to_string(dst_register, (pc + 2) & 65535, word_mode);
|
||||
auto dst_text { addressing_to_string(dst_register, (pc + 2) & 65535, word_mode) };
|
||||
|
||||
auto next_word = std::get<2>(dst_text);
|
||||
if (next_word.has_value())
|
||||
instruction_words.push_back(next_word.value());
|
||||
auto next_word = dst_text.instruction_part;
|
||||
if (next_word != -1)
|
||||
instruction_words.push_back(next_word);
|
||||
|
||||
work_values.push_back(std::get<3>(dst_text));
|
||||
work_values.push_back(dst_text.work_value);
|
||||
|
||||
text = std::string("JMP ") + std::get<0>(dst_text);
|
||||
text = std::string("JMP ") + dst_text.operand;
|
||||
}
|
||||
|
||||
if ((instruction & 0b1111111000000000) == 0b0000100000000000) {
|
||||
auto dst_text = addressing_to_string(dst_register, (pc + 2) & 65535, word_mode);
|
||||
auto dst_text { addressing_to_string(dst_register, (pc + 2) & 65535, word_mode) };
|
||||
|
||||
auto next_word = std::get<2>(dst_text);
|
||||
if (next_word.has_value())
|
||||
instruction_words.push_back(next_word.value());
|
||||
auto next_word = dst_text.instruction_part;
|
||||
if (next_word != -1)
|
||||
instruction_words.push_back(next_word);
|
||||
|
||||
work_values.push_back(std::get<3>(dst_text));
|
||||
work_values.push_back(dst_text.work_value);
|
||||
|
||||
text = format("JSR R%d,", src_register & 7) + std::get<0>(dst_text);
|
||||
text = format("JSR R%d,", src_register & 7) + dst_text.operand;
|
||||
}
|
||||
|
||||
if ((instruction & 0b1111111111111000) == 0b0000000010000000)
|
||||
|
|
10
cpu.h
10
cpu.h
|
@ -4,7 +4,6 @@
|
|||
|
||||
#include <assert.h>
|
||||
#include <map>
|
||||
#include <optional>
|
||||
#include <set>
|
||||
#include <stdint.h>
|
||||
#include <vector>
|
||||
|
@ -51,7 +50,14 @@ private:
|
|||
bool condition_code_operations(const uint16_t instr);
|
||||
bool misc_operations(const uint16_t instr);
|
||||
|
||||
std::tuple<std::string, int, std::optional<uint16_t>, uint16_t> addressing_to_string(const uint8_t mode_register, const uint16_t pc, const bool word_mode) const;
|
||||
struct operand_parameters {
|
||||
std::string operand;
|
||||
int length;
|
||||
int instruction_part;
|
||||
uint16_t work_value;
|
||||
};
|
||||
|
||||
operand_parameters addressing_to_string(const uint8_t mode_register, const uint16_t pc, const bool word_mode) const;
|
||||
std::map<std::string, std::vector<std::string> > disassemble(const uint16_t addr) const;
|
||||
void disassemble(void) const;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue