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

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

問3-1

(defun dump-mov-n-rn (mem n)
  (format t "~4,'0x ~4,'0x mov $~x, r~x~%"
	(read16 mem *pc*) (read16 mem (+ *pc* 2)) (read16 mem (+ *pc* 2)) n)
  (incf *pc* 4))

(defun dump-mov-n-*rn (mem n)
   (format t "~4,'0x ~4,'0x mov $~x, (r~x)~%"
	   (read16 mem *pc*) (read16 mem (+ *pc* 2)) (read16 mem (+ *pc* 2)) n)
   (incf *pc* 4))

(defun dump-sys-exit (mem)
  (format t "~4,'0x sys 1 ; exit~%" (read16 mem *pc*))
  (incf *pc* 4))

(defun dump-sys-write (mem)
  (format t "~4,'0x sys 4 ; write~%" (read16 mem *pc*))
  (incf *pc* 2)
  (format t "~4,'0x: ~4,'0x ; arg~%" *pc* (read16 mem *pc*))
  (incf *pc* 2)
  (format t "~4,'0x: ~4,'0x ; arg~%" *pc* (read16 mem *pc*))
  (incf *pc* 2))

(defun reasem (mem)
  (let ((*pc* 0))
    (while (< *pc* (length mem))
	    (format t "~4,'0x: " *pc*)
	    (case (read16 mem *pc*)
	      (#x15c0 (dump-mov-n-rn mem 0))
	      (#x15c1 (dump-mov-n-rn mem 1))
	      (#x15c9 (dump-mov-n-*rn mem 1))

	      (#x8901 (dump-sys-exit mem))

	      (#x8904 (dump-sys-write mem))

	      (t (format t "~4,'0x ???~%" (read16 mem *pc*))
	         (incf *pc* 2))
	      )
	    )))




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

問3-2

(defun write16 (mem r n)
  (setf (elt mem r) (logand n #b0000000011111111))
  (setf (elt mem (+ r 1)) (ash n -8)))

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

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

(defun mov-n-*r1 (mem)
  (write16 mem *r1* (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))
	     (#x15c1 (mov-n-r1 mem))
	     (#x15c9 (mov-n-*r1 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