(define RegisterInstructions
    (local ((define arithmetic
	      (lambda (op)
		(lambda (sign digits) 
		  (set-reg! (vector-ref digits 2)
			    (op (get-reg (vector-ref digits 3)) 
				(get-reg (vector-ref digits 4)))))))
	    (define checked-arithmetic
	      (lambda (op)
		(lambda (sign digits)
		  (if (= (get-reg (vector-ref digits 4)) 0)
		      (machine-error "division by 0")
		      (op sign digits)))))
	    (define pick
	      (lambda (indirect-bit z)
		(cond
		  ((= indirect-bit 0) (get-reg z))
		  ((= indirect-bit 1) 0)
		  (else (machine-error "bad instruction"))))))
      (vector
       (dispatch-to SpecialInstructions 2)
       (arithmetic mod/+)
       (arithmetic mod/-)
       (arithmetic mod/*)
       (checked-arithmetic (arithmetic mod/div))
       (checked-arithmetic (arithmetic mod/%))
       (lambda (sign digits)
	 (local ((define indirect-bit (vector-ref digits 5))
		 (define x (vector-ref digits 2))	
		 (define y (vector-ref digits 3))
		 (define z (vector-ref digits 4)))
	   (set-reg! x (get-mem (+ (get-reg y) (pick indirect-bit z))))))
       (lambda (sign digits)
	 (local ((define indirect-bit (vector-ref digits 5))
		 (define x (vector-ref digits 2))	
		 (define y (vector-ref digits 3))
		 (define z (vector-ref digits 4)))
	   (set-mem! (+ (get-reg y) (pick indirect-bit z)) (get-reg x))))
       (lambda (sign digits) (set-pc! (get-reg (vector-ref digits 2))))
       (lambda (sign digits)
	 (set-reg! (vector-ref digits 3) (get-reg (vector-ref digits 2)))))))
