;;; -*- Mode:LISP; Package:LISP-INTERNALS; Base:10; Readtable:CL -*-

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; hooks for the debugger
;;; read and modify registers in a frame

(defun control-pdl-depth (control-pdl)
  "Index of topmost frame of control pdl"
  (floor (- (control-pdl-pointer control-pdl) control-pdl-base)
	 control-pdl-frame-size))

(defun control-pdl-frame-info (control-pdl frame-number)
;  (declare (values type rpc rdest global-frame))
  (let ((frame-index (+ control-pdl-base (* control-pdl-frame-size frame-number)))
	word0 word1)
    (when (>= frame-index (control-pdl-pointer control-pdl))
      (li:error "frame not in control pdl"))
    (setq word0 (array:%vm-read32 control-pdl frame-index))
    (setq word1 (array:%vm-read32 control-pdl (1+ frame-index)))
    (values (hw:ldb word0 %%cpdl0-type-code 0)		;type
	    word1					;RPC
	    (hw:ldb word0 %%cpdl0-rdest	0)		;RDEST
	    (hw:ldb word0 %%cpdl0-global-frame 0))))	;global frame

(defun control-pdl-frame-examine-register (control-pdl frame-number register-number)
  (let ((frame-index (+ control-pdl-base (* control-pdl-frame-size frame-number)))
	box-bits datum)
    (when (>= frame-index (control-pdl-pointer control-pdl))
      (li:error "frame not in control pdl"))
    (setq box-bits (hw:ldb (array:%vm-read32 control-pdl frame-index) %%cpdl0-box-bits 0))
    (setq datum (array:%vm-read32 control-pdl (+ control-pdl-frame-offset-to-registers
						 register-number frame-index)))
    (if (hw::32logbitp register-number box-bits)
	(hw:dpb-boxed datum (byte 32 32) (hw:unboxed-constant 0))	;make boxed
      datum)))								;unboxed

(defun control-pdl-frame-modify-register (control-pdl frame-number register-number new-value boxed-p)
  (let ((frame-index (+ control-pdl-base (* control-pdl-frame-size frame-number)))
	word0)
    (when (>= frame-index (control-pdl-pointer control-pdl))
      (li:error "frame not in control pdl"))
    (setq word0 (array:%vm-read32 control-pdl frame-index))
    (flet ((change-datum ()
	     (array:%vm-write32 control-pdl (+ control-pdl-frame-offset-to-registers
					 register-number frame-index) new-value))
	   (change-box-bit ()
	     (array:%vm-write32 control-pdl frame-index
			  (hw:dpb (hw:dpb (if boxed-p 1 0)
					  (byte 1 register-number)
					  (hw:ldb word0 %%cpdl0-box-bits 0))
				  %%cpdl0-box-bits
				  word0))))
      (if boxed-p				;try and do this safely
	  (progn (change-datum)
		 (change-box-bit))
	(progn (change-box-bit)
	       (change-datum))) )))

