-(define ((make-instr opcode modifier A-mode A-num B-mode B-num name) . args)
- (match args
- (('copy n) (make-instr opcode modifier A-mode A-num B-mode B-num n))
- (('copy-from! other n)
- (set! opcode (other 'opcode))
- (set! modifier (other 'modifier))
- (set! A-mode (other 'A-mode))
- (set! A-num (other 'A-num))
- (set! B-mode (other 'B-mode))
- (set! B-num (other 'B-num))
- (set! name n))
- (('opcode) opcode)
- (('modifier) modifier)
- (('A-mode) A-mode)
- (('A-num) A-num)
- (('B-mode) B-mode)
- (('B-num) B-num)
- (('name) name)
- (('print) (print opcode
- "." modifier
- " " (mode-string A-mode) A-num
- ", " (mode-string B-mode) B-num
- (if (null? name) "" (conc " ; " name))))
- (('set-opcode! x n) (set! opcode x) (set! name n))
- (('set-modifier! x n) (set! modifier x) (set! name n))
- (('set-A-mode! x n) (set! A-mode x) (set! name n))
- (('set-A-num! x n) (set! A-num x) (set! name n))
- (('set-B-mode! x n) (set! B-mode x) (set! name n))
- (('set-B-num! x n) (set! B-num x) (set! name n))))
-
-(define (mode-string mode)
- (case mode
- ((immediate) "#")
- ((direct) "$")
- ((indirect-A) "*")
- ((indirect-B) "@")
- ((pre-indirect-A) "{")
- ((pre-indirect-B) "<")
- ((post-indirect-A) "}")
- ((post-indirect-B) ">")))
+(define (make-instr opcode modifier A-mode A-num B-mode B-num)
+ (lambda args
+ (match args
+ (('opcode) opcode)
+ (('modifier) modifier)
+ (('A-mode) A-mode)
+ (('A-num) A-num)
+ (('B-mode) B-mode)
+ (('B-num) B-num)
+ (('make-copy) (make-instr opcode modifier A-mode A-num B-mode B-num))
+ (('set! 'opcode x) (set! opcode x))
+ (('set! 'modifier x) (set! modifier x))
+ (('set! 'A-mode x) (set! A-mode x))
+ (('set! 'A-num x) (set! A-num x))
+ (('set! 'B-mode x) (set! B-mode x))
+ (('set! 'B-num x) (set! B-num x))
+ (('set-from! other)
+ (set! opcode (other 'opcode))
+ (set! modifier (other 'opcode))
+ (set! A-mode (other 'A-mode))
+ (set! A-num (other 'A-num))
+ (set! B-mode (other 'B-mode))
+ (set! B-num (other 'B-num)))
+ (else
+ (error "Invalid instr arguments" args)))))
+
+(define (mode->string mode)
+ (case mode
+ ((immediate) "#")
+ ((direct) "$")
+ ((indirect-A) "*")
+ ((indirect-B) "@")
+ ((pre-indirect-A) "{")
+ ((pre-indirect-B) "<")
+ ((post-indirect-A) "}")
+ ((post-indirect-B) ">")
+ (else
+ (error "Unknown mode."))))
+
+(define (instr->string instr)
+ (conc opcode
+ "." modifier
+ " " (mode->string A-mode) A-num
+ " " (mode->string B-mode) B-num))