+ (if (= raddr 0)
+ (ez-set-var (ez-read-pc-byte-and-inc) 0) ; Simply return 0
+ (ez-add-call-stack-frame new-pc)
+ (dotimes (i L)
+ (if (< i n)
+ (ez-set-local-var (+ i 1) (elt call-operands i))
+ (ez-set-local-var (+ i 1) (ez-mem-ref-word (+ r 1 (* 2 i))))))))
+ 'run)
+
+(defun ez-op-test-attr (operands operand-types)
+ (let ((obj (car operands))
+ (attr (cadr operands)))
+ (ez-do-branch (= 1 (ez-get-obj-attr obj attr)))
+ 'run))
+
+(defun ez-op-set-attr (operands operand-types)
+ (let ((obj (car operands))
+ (attr (cadr operands)))
+ (ez-set-obj-attr obj attr 1))
+ 'run)
+
+(defun ez-op-clear-attr (operands operand-types)
+ (let ((obj (car operands))
+ (attr (cadr operands)))
+ (ez-set-obj-attr obj attr 0))
+ 'run)
+
+(defun ez-op-get-sibling (operands operand-types)
+ (let ((sib (ez-get-obj-sibling (car operands))))
+ (ez-set-var (ez-read-pc-byte-and-inc) sib)
+ (ez-do-branch (> sib 0)))
+ 'run)
+
+(defun ez-op-get-child (operands operand-types)
+ (let ((child (ez-get-obj-child (car operands))))
+ (ez-set-var (ez-read-pc-byte-and-inc) child)
+ (ez-do-branch (> child 0)))
+ 'run)
+
+(defun ez-op-get-parent (operands operand-types)
+ (let ((parent (ez-get-obj-parent (car operands))))
+ (ez-set-var (ez-read-pc-byte-and-inc) parent))
+ 'run)
+
+(defun ez-op-remove-obj (operands operand-types)
+ (let ((obj (car operands)))
+ (ez-remove-obj obj))
+ 'run)
+
+(defun ez-op-insert-obj (operands operand-types)
+ (let ((obj1 (car operands))
+ (obj2 (cadr operands)))
+ (ez-insert-obj obj1 obj2))
+ 'run)
+
+(defun ez-op-put-prop (operands operand-types)
+ (let* ((obj (car operands))
+ (prop (cadr operands))
+ (a (caddr operands)))
+ (ez-set-obj-prop obj prop a))
+ 'run)
+
+(defun ez-op-get-prop (operands operand-types)
+ (let* ((obj (car operands))
+ (prop (cadr operands)))
+ (ez-set-var (ez-read-pc-byte-and-inc)
+ (ez-get-obj-prop obj prop)))
+ 'run)
+
+(defun ez-op-print (operands operand-types)
+ (let* ((word-count-and-string (ez-get-zstring-and-length (ez-get-pc)))
+ (word-count (car word-count-and-string))
+ (string (cdr word-count-and-string)))
+ (ez-print string)
+ (ez-increment-pc (* 2 word-count)))
+ 'run)
+
+(defun ez-op-new-line (operands operand-types)
+ (ez-print "\n")
+ 'run)
+
+(defun ez-op-print-num (operands operand-types)
+ (let ((s (ez-decode-signed-operand (car operands) (car operand-types))))
+ (ez-print (number-to-string s)))
+ 'run)
+
+(defun ez-op-print-char (operands operand-types)
+ (let ((c (car operands)))
+ (ez-print (string c)))
+ 'run)
+
+(defun ez-op-print-obj (operands operand-types)
+ (let ((obj (car operands)))
+ (ez-print (ez-get-obj-name obj)))
+ 'run)
+
+(defvar ez--next-read-args nil)
+(defun ez-op-read (operands operand-types)
+ (let ((baddr1 (car operands))
+ (baddr2 (cadr operands)))
+ (setq ez--next-read-args (list baddr1 baddr2)))
+ 'wait-for-input)
+
+(defun ez-op-read2 (input-string)
+ (let* ((baddr1 (car ez--next-read-args))
+ (baddr2 (cadr ez--next-read-args)))
+
+ (dotimes (i (length input-string))
+ (let ((char (elt input-string i)))
+ (ez-mem-set-byte (+ baddr1 1 i) char)))
+ (ez-mem-set-byte (+ baddr1 1 (length input-string)) 0)
+
+ (ez--tokenize baddr1 baddr2))
+ 'run)
+
+(defun ez--tokenize (tb-baddr pb-baddr)
+
+ (let ((unfinished t)
+ (token-start 0)
+ (token-end 0)
+ (token-count 0))
+
+ (while unfinished
+ (let ((next-char (ez-mem-ref-byte (+ tb-baddr 1 token-end))))
+ (cond
+ ((eq next-char ?\s)
+ ;; Add token
+ (setq token-end (- token-end 1))
+ (let* ((text (ez-mem-ref-string (+ tb-baddr 1 token-start)
+ (+ tb-baddr 1 token-end)))
+ (dict-entry (ez-lookup-dictionary text)))
+ (setq token-count (+ token-count 1))
+ (ez-mem-set-word (+ pb-baddr 2 (* token-count 4))
+ dict-entry)
+ (ez-mem-set-bytes (+ pb-baddr 2 (* token-count 4) 2)
+ (length text)
+ token-start))
+ (setq token-start (+ token-end 1))
+ (setq token-end token-start))
+
+ ((ez-is-separator char)
+ ;; Add token and separator token
+ )
+ ((eq char 0)
+ (setq unfinished nil))
+ (setq token-end (+ token-end 1)))
+ ))))
+
+;; Execution loop
+
+(defun ez-load-and-run (filename)