This commit is contained in:
folkert van heusden 2022-03-24 13:34:40 +01:00
parent aeab0b1845
commit 449817aa52

16
cpu.cpp
View file

@ -488,18 +488,23 @@ bool cpu::additional_double_operand_instructions(const uint16_t instr)
}
case 1: { // DIV
int32_t R0R1 = (getRegister(reg) << 16) | getRegister(reg + 1);
int32_t divider = getGAM(dst_mode, dst_reg, true, false);
int16_t divider = getGAM(dst_mode, dst_reg, false, false);
if (divider == 0) {
if (divider == 0) { // divide by zero
setPSW_n(false);
setPSW_z(true);
setPSW_v(true);
setPSW_c(true);
break;
}
else {
int32_t R0R1 = (getRegister(reg) << 16) | getRegister(reg + 1);
int32_t quot = R0R1 / divider;
uint16_t rem = R0R1 % divider;
fprintf(stderr, "value: %d, divider: %d, gives: %d / %d\n", R0R1, divider, quot, rem);
fprintf(stderr, "value: %o, divider: %o, gives: %o / %o\n", R0R1, divider, quot, rem);
// TODO: handle results out of range
@ -508,9 +513,8 @@ bool cpu::additional_double_operand_instructions(const uint16_t instr)
setPSW_n(quot < 0);
setPSW_z(quot == 0);
setPSW_v(quot > 0xffff || quot < -0xffff);
setPSW_v(quot > 32767 || quot < -32768);
setPSW_c(false);
}
return true;
}