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

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

問2-1

(defun load-memory (path)
  (with-open-file (s path :element-type '(unsigned-byte 8))
    (let ((mem (make-array (file-length s) :element-type '(unsigned-byte 8))))
      (read-sequence mem s)
      mem)
    ))

(defun read16 (mem i)
  (logior (elt mem i) (ash (elt mem (+ i 1)) 8)))

(defun reasem (mem)
  (let ((i 0))
    (while (< i (length mem))
      (format t "~4,'0x: " i)
      (case (read16 mem i)
	(#x15c0 (format t "~4,'0x ~4,'0x mov $~x, r0~%"
			(read16 mem i) (read16 mem (+ i 2)) (read16 mem (+ i 2)))
	        (incf i 4))

	(#x8901 (format t "~4,'0x sys 1 ; exit~%" (read16 mem i))
	        (incf i 2))
	
        (#x8904 (format t "~4,'0x sys 4 ; write~%" (read16 mem i))
	        (incf i 2)
		(format t "~4,'0x: ~4,'0x ; arg~%" i (read16 mem i))
		(incf i 2)
		(format t "~4,'0x: ~4,'0x ; arg~%" i (read16 mem i))
		(incf i 2))

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

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

GitHub - mas454/pdp11
今回はCommon Lispを使っています。