PDP-11による機械語入門 問2-2

PDP-11による機械語入門 - Qiita

問2-2

(defun mov-n-r0 (mem)
  (setf *r0* (read16 mem (+ *pc* 2)))
  (incf *pc* 4))

(defun sys-exit (mem)
  (setf *pc* -1))

(defun sys-write (mem)
  (let* ((s (read16 mem (+ *pc* 2)))
	 (len (read16 mem (+ *pc* 4)))
	 (str (map 'string #'character (subseq mem s (+ s len)))))
    (case *r0*
      (1 (format t str))
      )
    (incf *pc* 6)
    ))
(defun run1 (mem tsize)
  (let ((*pc* 0)
	(*r0* 0))
    (while (and (< *pc* tsize) (> *pc* -1))
	   (case (read16 mem *pc*)
	     (#x15c0 (mov-n-r0 mem))
	     (#x8901 (sys-exit mem))
	     (#x8904 (sys-write mem))
	     (t (format t "~4,'0x: ~4,'0x ???~%" *pc* (read16 mem *pc*))
		(setf *pc* -1))
	     )
	   )))

(defun run (path)
  (let* ((mem (load-memory path))
	 (tsize (read16 mem 2))
	 (dsize (read16 mem 4)))
    (run1 (subseq mem 16) tsize)))

pdp11/pdp-11.lisp at master · mas454/pdp11 · GitHub