Add assembler

This commit is contained in:
2025-01-07 10:44:39 -06:00
parent 09ff519edd
commit e252e8eb19
3 changed files with 150 additions and 38 deletions

View File

@@ -1,19 +1,64 @@
(use-modules (d- test))
;;; VM tests
(use-modules (scmvm vm)
(use-modules (d- test)
(scmvm assembler)
(scmvm vm)
(rnrs bytevectors)
(rnrs io ports))
(rnrs io ports)
((scheme base)
#:select (open-output-bytevector get-output-bytevector)))
;;; Data
(define adder-program-asm
'((push 1)
(push 2)
(+)
(store #x01)))
(define adder-program
(define fib-program-asm
'( (load 1)
(call fib)
(jmp cleanup)
fib
(dup)
(push 0)
(=)
(if not0)
(pop)
(pop)
(push 0)
(return)
not0
(pop)
(dup)
(push 1)
(=)
(if not1)
(pop)
(pop)
(push 1)
(return)
not1
(pop)
(push 1)
(-)
(dup)
(call fib)
(swap)
(push 1)
(-)
(call fib)
(+)
(return)
cleanup
(store #x1)))
(define adder-program-bytecode
#vu8(#x01 1 0 0 0 ; Push value "1"
#x01 2 0 0 0 ; Push value "2"
#x05 ; Perform "+"
#x03 1 0 0 0 ; Store the value to memory address 1
))
(define fib-program
(define fib-program-bytecode
#vu8(#x04 1 0 0 0 ; 0 load "n" from memory address 0x01
#x0d 15 0 0 0 ; 5 call fib procedure
#x16 83 0 0 0 ; 10 jump to cleanup
@@ -52,15 +97,27 @@
#x03 1 0 0 0 ; 83 store fib(n) to memory address 0x01
))
(define-test-suite "VM"
;;; Tests
(define-test-suite "assembler"
(define-test "adder"
(define out (open-output-bytevector))
(with-output-to-port out (lambda () (assemble adder-program-asm)))
(assert-equal adder-program-bytecode (get-output-bytevector out)))
(define-test "fib"
(define out (open-output-bytevector))
(with-output-to-port out (lambda () (assemble fib-program-asm)))
(assert-equal fib-program-bytecode (get-output-bytevector out))))
(define-test-suite "vm"
(define-test "adder"
(define my-vm (make-vm))
(define my-program (open-bytevector-input-port adder-program))
(define my-program (open-bytevector-input-port adder-program-bytecode))
(run-vm my-vm my-program)
(assert-equal 3 (vm-memory-ref my-vm 1)))
(define-test "fib"
(define my-vm (make-vm))
(vm-memory-set! my-vm 1 6)
(define my-program (open-bytevector-input-port fib-program))
(vm-memory-set! my-vm 1 10)
(define my-program (open-bytevector-input-port fib-program-bytecode))
(run-vm my-vm my-program)
(assert-equal 8 (vm-memory-ref my-vm 1))))
(assert-equal 55 (vm-memory-ref my-vm 1))))