;; -*- 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])