# HG changeset patch # User jcdutton # Date 1049577782 0 # Node ID a68751e6e84fae42f69325b42e0b37e081c97538 # Parent 840e99bfb57d47e0a519818eb9f01b3232496b99 Use more common sense values for div 0. I.E. As close to infinity as a 16 bit number can get! Also avoid div 0 exception for MOD operation. I.E. 10 % 0 gives a crash with the message "Floating point exception" on my PC. diff -r 840e99bfb57d -r a68751e6e84f decoder.c --- a/decoder.c Sat Apr 05 16:45:45 2003 +0000 +++ b/decoder.c Sat Apr 05 21:23:02 2003 +0000 @@ -426,21 +426,25 @@ break; case 5: tmp = get_GPRM(command->registers, reg) * data; - if(tmp >= shortmax) tmp = shortmax; + if(tmp > shortmax) tmp = shortmax; set_GPRM(command->registers, reg, (uint16_t)tmp); break; case 6: if (data != 0) { set_GPRM(command->registers, reg, (get_GPRM(command->registers, reg) / data) ); } else { - set_GPRM(command->registers, reg, 0); /* Avoid that divide by zero! */ + set_GPRM(command->registers, reg, 0xffff); /* Avoid that divide by zero! */ } break; case 7: - set_GPRM(command->registers, reg, (get_GPRM(command->registers, reg) % data) ); + if (data != 0) { + set_GPRM(command->registers, reg, (get_GPRM(command->registers, reg) % data) ); + } else { + set_GPRM(command->registers, reg, 0xffff); /* Avoid that divide by zero! */ + } break; - case 8: /* SPECIAL CASE - RND! */ - set_GPRM(command->registers, reg, ((uint16_t) ((float) data * rand()/(RAND_MAX+1.0))) ); + case 8: /* SPECIAL CASE - RND! Return numbers between 1 and data. */ + set_GPRM(command->registers, reg, 1 + ((uint16_t) ((float) data * rand()/(RAND_MAX+1.0))) ); break; case 9: set_GPRM(command->registers, reg, (get_GPRM(command->registers, reg) & data) );