#include "../tdkpin_arithmetic.h" #include #include #include #include uint8_t g_borland_cpu_level; static jmp_buf g_fault_jump; static uint16_t g_runtime_code; static bool g_divide_fault; _Noreturn void borland_runtime_error(uint16_t code) { g_runtime_code = code; longjmp(g_fault_jump, 1); } _Noreturn void win16_integer_divide_fault(void) { g_divide_fault = true; longjmp(g_fault_jump, 1); } int main(void) { assert(borland_multiply_i32(123456, -789) == -97406784); assert((uint32_t)borland_multiply_i32(INT32_MAX, INT32_MAX) == 1); assert((uint32_t)borland_multiply_i32(INT32_MIN, 2) == 0); BorlandDivI32Result result = borland_divide_i32(-100, 7); assert(result.quotient == -14 && result.remainder == -2); result = borland_divide_i32(100, -7); assert(result.quotient == -14 && result.remainder == 2); result = borland_divide_i32(-100, -7); assert(result.quotient == 14 && result.remainder == -2); g_borland_cpu_level = 1; result = borland_divide_i32(INT32_MIN, -1); assert(result.quotient == INT32_MIN && result.remainder == 0); g_runtime_code = 0; if (setjmp(g_fault_jump) == 0) { (void)borland_divide_i32(1, 0); assert(false); } assert(g_runtime_code == 200); g_borland_cpu_level = 2; g_divide_fault = false; if (setjmp(g_fault_jump) == 0) { (void)borland_divide_i32(INT32_MIN, -1); assert(false); } assert(g_divide_fault); return 0; }