# === VIRTUAL MACHINE ================================================ # Data shared by all VM components. DATA: # instruction set version vm.Version is number # text bytecode input for the loader vm.Input is text # 8 numeric registers & all num vars vm.RAM is number vector # instructions vm.Code is number vector vm.Code* is number # text literals & variables vm.Text is text vector vm.Text* is number # internal - vectors vm.vec.n is number vector vm.vec.t is text vector vm.vec.tmp is text vector vm.vec.keys is text vector # "$id:$num": keyname, "$id:keyname": 1 or 0 # tmp __vm.i is number __vm.x is number __vm.boot is number __vm.key is text PROCEDURE: # vm must be booted (initalized) before it can run # TODO: call this in vm.Run or something instead. sub-procedure vm.Boot if __vm.boot is not equal to 0 then return end if # Set command line arguments on boot. # Hack for `dino run FILE` vs `dino FILE` if argv:0 is equal to "run" then store 2 in __vm.i # dino 0:run 1:file 2...:[arguments...] subtract 2 from ARGC in vm.RAM:$AC else store 1 in __vm.i subtract 1 from ARGC in vm.RAM:$AC end if store 0 in __vm.x while __vm.i is less than ARGC do in __vm.key join $OFFSET.ARGV ":" __vm.x store ARGV:__vm.i in vm.vec.t:__vm.key incr __vm.i incr __vm.x repeat store 1 in __vm.boot end sub-procedure