D
Size: a a a
D
D
D
PG
PG
D
PG
(define-syntax use
(lambda (stx)
(let [(lib-name (... stx))]
...)))
(define-syntax header
(lambda (stx)
(let [(path (... stx))]
(map (lambda (...)
#`(define #,fn ...))
(parse-header path)))))
PG
D
PG
D
D
PG
A
A
(define-syntax opcode
(syntax-rules ()
((opcode name func o1t o2t)
(let ((name (lambda (regs args)
(let ((op1 (if (eq? o1t 'r) (nth regs (first args)) (first args)))
(op2 (if (eq? o2t 'r) (nth regs (second args)) (second args))))
(map (lambda (i val)
(if (= i (third args)) (func op1 op2) val)) '(0 1 2 3) regs)))))
(push! name *all-opcodes*)))))
A
A
A
(opcode addr + 'r 'r)
(opcode addi + 'r 'i)
(opcode mulr * 'r 'r)
(opcode muli * 'r 'i)
(opcode banr bitwise-and 'r 'r)
(opcode bani bitwise-and 'r 'i)
(opcode borr bitwise-ior 'r 'r)
(opcode bori bitwise-ior 'r 'i)
(opcode setr (lambda (a b) a) 'r 'i)
(opcode seti (lambda (a b) a) 'i 'i)
(opcode gtir i> 'i 'r)
(opcode gtri i> 'r 'i)
(opcode gtrr i> 'r 'r)
(opcode eqir i= 'i 'r)
(opcode eqri i= 'r 'i)
(opcode eqrr i= 'r 'r)
PG