X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=ez.git;a=blobdiff_plain;f=ez.el;h=3948f4c098b36f38e0276fbff8ea0a5b86e23402;hp=1efc2d672c8a2205e956b5641d5795522472ad12;hb=984f78aa6ded9a174c6fa3dcff1241e2f4bc7033;hpb=b1e6b624739552c19cd4c3b033716360fda64e94 diff --git a/ez.el b/ez.el index 1efc2d6..3948f4c 100644 --- a/ez.el +++ b/ez.el @@ -55,6 +55,14 @@ new-s (binformat d new-s)))) +(defun ez-list-to-string-hex (l) + (concat "(" + (when l + (concat + (format "%x" (car l)) + (apply 'concat (mapcar (lambda (n) (format " %x" n)) (cdr l))))) + ")")) + ;; Memory (defvar ez-memory nil @@ -147,14 +155,14 @@ (let ((addr (ez-get-obj-addr obj))) (ez-mem-set-byte (+ addr 6) new-child))) -(defun ez-get-obj-plist-addr (obj-id) - (let ((addr (ez-get-obj-addr obj-id))) +(defun ez-get-obj-plist-addr (obj) + (let ((addr (ez-get-obj-addr obj))) (ez-mem-ref-word (+ addr 7)))) -(defun ez-get-obj-name (obj-id) - (let ((plist-addr (ez-get-obj-plist-addr obj-id))) +(defun ez-get-obj-name (obj) + (let ((plist-addr (ez-get-obj-plist-addr obj))) (if (> (ez-mem-ref-byte plist-addr) 0) - (ez-get-zstring (+ 1 (ez-get-obj-plist-addr obj-id))) + (ez-get-zstring (+ 1 (ez-get-obj-plist-addr obj))) nil))) (defun ez-get-prop-default (prop) @@ -371,10 +379,13 @@ (defun ez-set-var (var val) (cond ((= var 0) + (message "Pushed %x to stack" val) (ez-routine-stack-push val)) ((< var 16) + (message "Saved %x to local variable %x" val var) (ez-set-local-var var val)) (t + (message "Saved %x to global variable %x" val (- var 16)) (ez-set-global-var (- var 16) val)))) (defun ez-read-pc-var-and-inc () @@ -444,10 +455,11 @@ (let ((table-row (assoc (list optype opcode) ez-op-table))) (unless table-row (error "Unsupported op PC:%x Optype:%s Opcode:%x Operands:%s Operand-types:%s" - instr-pc optype opcode operands operand-types)) + instr-pc optype opcode (ez-list-to-string-hex operands) operand-types)) (let ((mnemonic (elt table-row 1))) (message "PC:%x Optype:%s Opcode:%x Mnemonic:%s Operands:%s Operand-types:%s" - instr-pc optype opcode mnemonic operands operand-types)) + instr-pc optype opcode mnemonic + (ez-list-to-string-hex operands) operand-types)) (funcall (elt table-row 2) operands operand-types)))) (defun ez-read-var-operands-and-inc () @@ -527,6 +539,8 @@ ((var #x02) storeb ez-op-storeb) ((2op #x10) loadb ez-op-loadb) ((2op #x01) je ez-op-je) + ((2op #x02) jl ez-op-jl) + ((2op #x06) jin ez-op-jin) ((2op #x08) or ez-op-or) ((2op #x09) and ez-op-and) ((2op #x14) add ez-op-add) @@ -544,10 +558,12 @@ ((1op #x09) remove_obj ez-op-remove-obj) ((2op #x0E) insert_obj ez-op-insert-obj) ((var #x03) put_prop ez-op-put-prop) + ((2op #x11) get_prop ez-op-get-prop) ((0op #x02) print ez-op-print) ((0op #x0B) new_line ez-op-new-line) ((var #x06) print_num ez-op-print-num) - ((var #x05) print_char ez-op-print-char))) + ((var #x05) print_char ez-op-print-char) + ((1op #x0A) print_obj ez-op-print-obj))) (defun ez-op-ret (operands &optional operand-types) (let ((retval (car operands))) @@ -595,6 +611,12 @@ (ez-op-jl (cons (ez-get-var var) (cdr operands)) (cons 'w (cdr operand-types)))) t) +(defun ez-op-jin (operands operand-types) + (let ((obj (car operands)) + (n (cadr operands))) + (ez-do-branch (or (= n 0) + (= n (ez-get-obj-parent obj))))) + t) (defun ez-op-jump (operands operand-types) (let ((offset (if (eq (car operand-types) 'b) @@ -721,20 +743,19 @@ (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)) - t)) + (ez-do-branch (> sib 0))) + t) (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)) - t)) + (ez-do-branch (> child 0))) + t) (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) - (ez-do-branch (> parent 0)) - t)) + (ez-set-var (ez-read-pc-byte-and-inc) parent)) + t) (defun ez-op-remove-obj (operands operand-types) (let ((obj (car operands))) @@ -751,8 +772,15 @@ (let* ((obj (car operands)) (prop (cadr operands)) (a (caddr operands))) - (ez-set-obj-prop obj prop a) - t)) + (ez-set-obj-prop obj prop a)) + t) + +(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))) + t) (defun ez-op-print (operands operand-types) (let* ((word-count-and-string (ez-get-zstring-and-length (ez-get-pc))) @@ -776,6 +804,10 @@ (ez-print (string c))) t) +(defun ez-op-print-obj (operands operand-types) + (let ((obj (car operands))) + (ez-print (ez-get-obj-name obj))) + t) ;; Execution loop