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