diff --git a/src/interp.c b/src/interp.c index c79fbe3..6fe6c23 100644 --- a/src/interp.c +++ b/src/interp.c @@ -98,6 +98,8 @@ int load_program(const char *fname) { FILE *f = fopen(fname, "rb"); int byte; xPc = 0x4000000000000000; + xSp = 0xFFFFFFFFFFFFFF00; + xBp = 0xFFFFFFFFFFFFFF00; uint64_t i = xPc; while ((byte = fgetc(f)) != EOF) { memory_set8(i, byte); @@ -160,7 +162,6 @@ int main(int argc, char **argv) { ((uint64_t)x7 << 8) + ((uint64_t)x8 << 0); registers[reg] = val; - //printf("Moved value 0x%lX into r%d\n", val, reg); registers[0] = 0; break; } @@ -185,6 +186,19 @@ int main(int argc, char **argv) { negativeFlag = (val < 0); break; } + case 0x7D: { // Cmp64 + unsigned char regA = inputs[0]; + unsigned char regB = inputs[1]; + + uint64_t valA = registers[regA]; + uint64_t valB = registers[regB]; + + zeroFlag = (valA == valB); + parityFlag = (valA-valB)&1; + positiveFlag = (valA > valB); + negativeFlag = (valA < valB); + break; + } case 0x94: { // Mov64 unsigned char dst = inputs[0]; unsigned char src = inputs[1]; @@ -234,6 +248,14 @@ int main(int argc, char **argv) { } break; } + case 0xC3: { // JmpIP + unsigned char addr = inputs[0]; + if (positiveFlag) { + if (DEBUG) printf("Jump!\n"); + xPc = registers[addr]; + } + break; + } case 0x46: { // Call unsigned char addr = inputs[0]; xSp -= 8;