+(define (instr-zero? ptr modifier decrement)
+ (let ((instr (core-get ptr)))
+ (case modifier
+ ((A AB)
+ (if decrement (instr 'set-A-num! (addr+ (instr 'A-num) -1)))
+ (= 0 (instr 'A-num)))
+ ((A AB)
+ (if decrement (instr 'set-B-num! (addr+ (instr 'B-num) -1)))
+ (= 0 (instr 'B-num)))
+ ((X I F)
+ (if decrement
+ (begin
+ (instr 'set-A-num! (addr+ (instr 'A-num) -1))
+ (instr 'set-B-num! (addr+ (instr 'B-num) -1))))
+ (and (= 0 (instr 'A-num))
+ (= 0 (instr 'B-num)))))))
+
+(define (combine-and-store core A-ptr B-ptr modifier name f)
+ (case modifier
+ ((A) (core B-ptr 'set! 'A-num
+ (f (core B-ptr 'A-num) (core A-ptr 'A-num)) name))
+ ((B) (core B-ptr 'set! 'B-num
+ (f (core B-ptr 'B-num) (core A-ptr 'B-num)) name))
+ ((AB) (core B-ptr 'set! 'B-num
+ (f (core B-ptr 'B-num) (core A-ptr 'A-num)) name))
+ ((BA) (core B-ptr 'set! 'A-num
+ (f (core B-ptr 'A-num) (core A-ptr 'B-num)) name))
+ ((F I) (core B-ptr 'set! 'A-num
+ (f (core B-ptr 'A-num) (core A-ptr 'A-num)) name)
+ (core B-ptr 'set! 'B-num
+ (f (core B-ptr 'B-num) (core A-ptr 'B-num)) name))
+ ((X) (core B-ptr 'set! 'A-num
+ (f (core B-ptr 'A-num) (core A-ptr 'B-num)) name)
+ (core B-ptr 'set! 'B-num
+ (f (core B-ptr 'B-num) (core A-ptr 'A-num)) name))))
+
+(define (eval-operand core mode num ptr name)