retroforth/vm/nga-c/dev-error.c
crc c26569ba03 fix some casting issues in nga-c; back to 64-bit builds now
FossilOrigin-Name: fbc9b9970dcd17559ad61aa56b6bae423f76abddd4e78c98bf2038d72a7f8ec8
2023-10-22 22:04:32 +00:00

55 lines
1.5 KiB
C

/**************************************************************
_ __ _ _
_ __ ___| |_ _ __ ___ / _| ___ _ __| |_| |__
| '__/ _ \ __| '__/ _ \| |_ / _ \| '__| __| '_ \
| | | __/ |_| | | (_) | _| (_) | | | |_| | | |
|_| \___|\__|_| \___/|_| \___/|_| \__|_| |_|
for nga
(c) Charles Childers, Luke Parrish, Marc Simpsonn,
Jay Skeer, Kenneth Keating
**************************************************************/
/*
| 001 | Data Stack Underflow |
| 002 | Data Stack Overflow |
| 003 | Address Stack Underflow |
| 004 | Address Stack Overflow |
| 005 | Invalid Memory Access |
| 006 | Division by Zero |
*/
#ifdef ENABLE_ERROR
void execute(NgaState *vm, CELL cell);
void handle_error(NgaState *vm, CELL error) {
CELL saved_ip = vm->cpu[vm->active].ip;
if (vm->ErrorHandlers[error] != 0) {
printf("\nHandling %lld\n", (long long)error);
execute(vm, vm->ErrorHandlers[error]);
}
vm->cpu[vm->active].ip = saved_ip;
}
void register_error_handler(NgaState *vm) {
CELL ErrorID = stack_pop(vm);
CELL ErrorHandler = stack_pop(vm);
vm->ErrorHandlers[ErrorID] = ErrorHandler;
printf("Assigned %lld to %lld\n", (long long)ErrorID, (long long)ErrorHandler);
}
void io_error(NgaState *vm) {
switch (stack_pop(vm)) {
case 0: register_error_handler(vm); break;
default: break;
}
}
void query_error(NgaState *vm) {
stack_push(vm, 0);
stack_push(vm, 1234);
}
#endif