;; -*- Mode: Scheme -*-
(include "lib/core.scm")
(include "lib/pair.scm")
(include "lib/string.scm")
(include "lib/io.scm")
;; a toy for now.
;; eventually, we'll have a translation phase which will use a vector or list
;; of direct closure pointers... forth-style threading, etc.
;; insn thunks
(define vm-insns #(insn-return))
;; insn data
(define vm-data #(0))
;; VM registers
(define regs #(0 0 0 0 0 0 0 0 0 0))
(define pci 0)
(define pcd 0)
(define (next-insn)
(set! pci (+ pci 1))
vm-insns[pci]
)
(define (next-data)
(let ((r vm-data[pcd]))
(set! pcd (+ pcd 1))
r))
(define (insn-literal)
(set! regs[vm-data[pcd]] vm-data[(+ pcd 1)])
(set! pcd (+ pcd 2))
((next-insn)))
(define (insn-return)
regs[vm-data[pcd]]
)
(define (insn-plus)
(set! regs[vm-data[pcd]] (+ regs[vm-data[(+ pcd 1)]] regs[vm-data[(+ pcd 2)]]))
(set! pcd (+ pcd 3))
((next-insn)))
(define (insn-minus)
(set! regs[vm-data[pcd]] (- regs[vm-data[(+ pcd 1)]] regs[vm-data[(+ pcd 2)]]))
(set! pcd (+ pcd 3))
((next-insn)))
(vm-insns[0])