(defvar ez-start-pc nil)
(defvar ez-himem-base nil)
-(defvar ez-dict-addr nil)
+(defvar ez-dict-base nil)
(defvar ez-objtab-addr nil)
(defvar ez-abbrevtab-addr nil)
(defvar ez-globalvartab-addr nil)
(logand (lsh word -5) #b11111)
(logand word #b11111)))
-(defun ez-get-zstring-chars (base-addr)
+(defun ez-get-zstring-chars-and-length (base-addr)
(let ((addr base-addr)
(chars nil)
(not-done t)
(setq not-done nil))))
(cons word-count chars)))
-(defun ez-get-zstring (base-addr)
- (let* ((word-count-and-chars (ez-get-zstring-chars base-addr))
+(defun ez-get-zstring-and-length (base-addr)
+ (let* ((word-count-and-chars (ez-get-zstring-chars-and-length base-addr))
(word-count (car word-count-and-chars))
(chars (cdr word-count-and-chars))
(cur 0)
(let ((abbrev-addr
(* 2 (ez-mem-ref-word (+ ez-abbrevtab-addr
(* 2 (+ (* (- abbrev-char 1) 32) char)))))))
- (setq s (concat s (cdr (ez-get-zstring abbrev-addr)))))
+ (setq s (concat s (cdr (ez-get-zstring-and-length abbrev-addr)))))
(setq abbrev-char nil))
((memq char '(1 2 3)) ;Abbreviation
(setq abbrev-char char))
(setq cur lock))))
(cons word-count s)))
+(defun ez-get-zstring (base-addr)
+ (cdr (ez-get-zstring-and-length base-addr)))
+
;; Call stack
((1op #x0E) load ez-op-load)
((var #x01) storew ez-op-storew)
((2op #x0F) loadw ez-op-loadw)
+ ((var #x02) storeb ez-op-storeb)
+ ((2op #x10) loadb ez-op-loadb)
((2op #x01) je ez-op-je)
((2op #x08) or ez-op-or)
((2op #x09) and ez-op-and)
((var #x03) put_prop ez-op-put-prop)
((0op #x02) print ez-op-print)
((0op #x0B) new_line ez-op-new-line)
- ((var #x06) print_num ez-op-print-num)))
+ ((var #x06) print_num ez-op-print-num)
+ ((var #x05) print_char ez-op-print-char)))
(defun ez-op-ret (operands &optional operand-types)
(let ((retval (car operands)))
(ez-set-var (ez-read-pc-byte-and-inc) (ez-mem-ref-word (+ baddr (* 2 n)))))
t)
+(defun ez-op-storeb (operands operand-types)
+ (let ((baddr (car operands))
+ (n (cadr operands))
+ (a (caddr operands)))
+ (ez-mem-set-byte (+ baddr n) a))
+ t)
+
+(defun ez-op-loadb (operands operand-types)
+ (let ((baddr (car operands))
+ (n (cadr operands)))
+ (ez-set-var (ez-read-pc-byte-and-inc) (ez-mem-ref-byte (+ baddr n))))
+ t)
+
(defun ez-op-and (operands operand-types)
(let ((a (car operands))
(b (cadr operands)))
t))
(defun ez-op-print (operands operand-types)
- (let* ((word-count-and-string (ez-get-zstring (ez-get-pc)))
+ (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-print (number-to-string s)))
t)
+(defun ez-op-print-char (operands operand-types)
+ (let ((c (car operands)))
+ (ez-print (string c)))
+ t)
+
;; Execution loop