Paste number 12411: Looking for a little feedback on this function and its comments

Paste number 12411: Looking for a little feedback on this function and its comments
Pasted by: nyef
When:12 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+9KR
Channel:#lisp
Paste contents:
Raw Source | XML | Display As
(defun handle-popj-14 ()
  (let ((chain-enable (not (zerop (logand #x04000000
					  *machine-control-register*)))))
    (if *micro-instruction-trace*
	(format t "POPJ-14: to ~A chain enable: ~A need fetch: ~A LC ~A~%"
		*micro-instruction-pointer* chain-enable
		*need-fetch* *location-counter*))

    ;; The POPJ-14 condition is almost completely undocumented. It is not
    ;; even mentioned in the TI CPU manual. The only reference I have found
    ;; thus far is in memo 528, which describes the CADR version, which
    ;; isn't suficient information when it comes to emulating it on Raven.

    ;; The behavior of POPJ-14 depends on the need-fetch signal (available
    ;; to microcode as part of the MCR) and on the chain-enable bit also
    ;; in the MCR (settable directly under microcode control).

    ;; If need-fetch is set, the top 25 bits of the location counter are
    ;; transferred to the VMA and a mapped read cycle is initiated. Next,
    ;; the location counter is incremented. If chain-enable is not set,
    ;; the microinstruction address being returned to is modified by oring
    ;; in the value #b10. If we initiated a read cycle and chain-enable is
    ;; set, the microinstruction address being returned to is modified by
    ;; oring in the value #b11. Finally, unless chain-enable was set or a
    ;; read cycle was not required, we update the need-fetch signal;
    ;; setting it if the updated location-counter is even, clearing it
    ;; otherwise.

    ;; There is a cleverness here (and in the corresponding ISTM case for
    ;; the DISPATCH instruction). Instructions are stored in memory with
    ;; the even-offsetted instructions in the low half of the memory word.
    ;; The need-fetch signal is set when the location-counter is -even-.
    ;; It turns out that when reading the MIB, the high-half of the word
    ;; is returned when the location counter is even. This means that the
    ;; location counter actually points to the instruction -after- the one
    ;; currently being executed. Presumably this also means that either the
    ;; macroinstruction handlers start off with a check to see if a memory
    ;; access failed or there is trap functionality to perform the check
    ;; in hardware (this is suggested by some of the fields in the MCR).

    ;; If *need-fetch* is set, start a read cycle.
    (when *need-fetch*
      (setf (aref *virtual-memory-address*)
	    (ldb (byte 25 1) *location-counter*))
      (start-read))

    (incf *location-counter*)

    (unless chain-enable
      (setf *micro-instruction-pointer*
	    (logior *micro-instruction-pointer* 2)))

    (when (and chain-enable (not *need-fetch*))
      (setf *micro-instruction-pointer*
	    (logior *micro-instruction-pointer* 3)))

    (when (or chain-enable (not *need-fetch*))
      (setf *need-fetch* (evenp *location-counter*)))))

This paste has no annotations.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.