Whoops, I forgot that there are two execution paths leading to that error message. As it turns out, signed comparisons work fine in fizmo. The problem is with throw/catch. These instructions aren’t used by Inform at all, as far as I know, so it must have been difficult for interpreter developers to find test cases.
This change seems to fix the problem:
diff --git a/src/interpreter/routine.c b/src/interpreter/routine.c
index 8e07ab6..2737ccc 100644
@@ -370,7 +370,7 @@ void opcode_throw(void)
- while (number_of_stack_frames > dest_stack_frame)
+ while (number_of_stack_frames >= dest_stack_frame)
set_variable(last_result_var, op, false);