reason
This commit is contained in:
parent
182a907182
commit
0bc17c628a
4 changed files with 29 additions and 11 deletions
6
cpu.cpp
6
cpu.cpp
|
@ -1667,6 +1667,8 @@ void cpu::trap(uint16_t vector, const int new_ipl, const bool is_interrupt)
|
|||
uint16_t before_psw = 0;
|
||||
uint16_t before_pc = 0;
|
||||
|
||||
it_is_a_trap = true;
|
||||
|
||||
for(;;) {
|
||||
try {
|
||||
processing_trap_depth++;
|
||||
|
@ -1688,11 +1690,9 @@ void cpu::trap(uint16_t vector, const int new_ipl, const bool is_interrupt)
|
|||
}
|
||||
else {
|
||||
before_psw = getPSW();
|
||||
|
||||
b->addToMMR1(-2, 6);
|
||||
|
||||
before_pc = getPC();
|
||||
|
||||
b->addToMMR1(-2, 6);
|
||||
|
||||
// TODO set MMR2?
|
||||
|
@ -2224,6 +2224,8 @@ std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t
|
|||
|
||||
void cpu::step_a()
|
||||
{
|
||||
it_is_a_trap = false;
|
||||
|
||||
if ((b->getMMR0() & 0160000) == 0)
|
||||
b->clearMMR1();
|
||||
|
||||
|
|
3
cpu.h
3
cpu.h
|
@ -38,7 +38,7 @@ private:
|
|||
int processing_trap_depth { 0 };
|
||||
uint64_t instruction_count { 0 };
|
||||
uint64_t running_since { 0 };
|
||||
|
||||
bool it_is_a_trap { false };
|
||||
uint64_t mtpi_count { 0 };
|
||||
|
||||
// level, vector
|
||||
|
@ -114,6 +114,7 @@ public:
|
|||
void queue_interrupt(const uint8_t level, const uint8_t vector);
|
||||
|
||||
void trap(uint16_t vector, const int new_ipl = -1, const bool is_interrupt = false);
|
||||
bool is_it_a_trap() const { return it_is_a_trap; }
|
||||
|
||||
bool getPSW_c() const;
|
||||
bool getPSW_v() const;
|
||||
|
|
|
@ -74,7 +74,11 @@ class test_generator:
|
|||
|
||||
# TODO what is the maximum size of an instruction?
|
||||
mem_kv = []
|
||||
mem_kv.append((addr + 0, random.randint(0, 65536 - 8)))
|
||||
while True:
|
||||
instr = random.randint(0, 65536 - 8)
|
||||
if instr != 1: # TODO ignore 'WAIT' instruction
|
||||
break
|
||||
mem_kv.append((addr + 0, instr))
|
||||
mem_kv.append((addr + 2, random.randint(0, 65536 - 8)))
|
||||
mem_kv.append((addr + 4, random.randint(0, 65536 - 8)))
|
||||
mem_kv.append((addr + 6, random.randint(0, 65536 - 8)))
|
||||
|
@ -142,7 +146,8 @@ fh = open(sys.argv[1], 'w')
|
|||
t = test_generator()
|
||||
|
||||
tests = []
|
||||
for i in range(0, 4096):
|
||||
for i in range(0, 131072):
|
||||
print(f'{i}\r', end='')
|
||||
test = t.create_test()
|
||||
if test != None:
|
||||
tests.append(test)
|
||||
|
|
12
main.cpp
12
main.cpp
|
@ -69,6 +69,8 @@ int run_cpu_validation(const std::string & filename)
|
|||
cpu *c = new cpu(b, &event);
|
||||
b->add_cpu(c);
|
||||
|
||||
uint16_t start_pc = 0;
|
||||
|
||||
{
|
||||
// initialize
|
||||
json_t *memory_before = json_object_get(test, "memory-before");
|
||||
|
@ -101,7 +103,8 @@ int run_cpu_validation(const std::string & filename)
|
|||
{
|
||||
json_t *b_pc = json_object_get(registers_before, "pc");
|
||||
assert(b_pc);
|
||||
c->setPC(json_integer_value(b_pc));
|
||||
start_pc = json_integer_value(b_pc);
|
||||
c->setPC(start_pc);
|
||||
}
|
||||
|
||||
// TODO SP[]
|
||||
|
@ -173,6 +176,13 @@ int run_cpu_validation(const std::string & filename)
|
|||
}
|
||||
|
||||
if (err) {
|
||||
if (c->is_it_a_trap())
|
||||
DOLOG(warning, true, "Error by TRAP");
|
||||
else {
|
||||
auto data = c->disassemble(start_pc);
|
||||
DOLOG(warning, true, "Error by instruction %s", data["instruction-text"].at(0).c_str());
|
||||
}
|
||||
|
||||
char *js = json_dumps(test, 0);
|
||||
DOLOG(warning, true, "%s\n", js); // also emit empty line(!)
|
||||
free(js);
|
||||
|
|
Loading…
Add table
Reference in a new issue