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

(prims:define-global-frame call-hardware-loader)
(prims:define-global-variable call-hardware-loader *call-stack-pointer-base*)
(prims:define-global-variable call-hardware-loader *memory-pointer*)


(defmacro ch-free-frame (frame)
  "Return FRAME to heap, trashes return frame"
  `(progn
     (hw:write-open-active-return		;Write Free into RETURN
        (hw:dpb ,frame hw:%%ch-oar-return (hw:read-open-active-return)))
     (hw:ch-tcall)))
  
(defun ch-init ()
  "Initialize Call Hardware and build heap"
  (hw:write-open-active-return #xFFFFFF)
  (hw:nop)
  (let ((free #xfe))
    (hw:write-call-sp-hp #xF0FF)		;Empty the heap and stack.
    (dotimes (i 238.)
      (ch-free-frame free)
      (decf free)))
  (hw:write-open-active-return #xFFFF10)
  (setq *call-stack-pointer-base* 0)
  ;; some sort of open call to get scroller loaded in bottom frame.
  )

CH-INIT_6
   (MOVEI OPEN-ACTIVE-RETURN (QUOTE 16777215))
   (NOP)
   (MOVEI A2 (QUOTE 254))
   (MOVEI CALL-SP-HP (QUOTE 61695))
   (MOVEI A1 (QUOTE 0))
DO1032_18
   (ALUI-16 L-R NOP-NO-OVERFLOW-TRAP A1 (QUOTE 238) BW-24)
   (TEST BR-NOT-GREATER-OR-EQUAL)
   (BRANCH C_22 NIL)
C_21
B_55
   (MOVEI OPEN-ACTIVE-RETURN (QUOTE 16776976))
   (MOVEI A0 (QUOTE 0))
   (RETURN A0)
C_22
   (MOVE A0 OPEN-ACTIVE-RETURN)
   (ALU-FIELD FIELD-PASS OPEN-ACTIVE-RETURN A2 A0 (QUOTE 8) PW-II)
   (TAIL-CALL (QUOTE 0) (QUOTE 0) R0 NIL NEXT-PC-PC+1)
   (ALUI-16 L-R A2 A2 (QUOTE 1) BW-24)
   (UNCONDITIONAL-BRANCH DO1032_18 (ALU R+1 A1 A0 A1 BW-32))


(defun ch-unload ()
  "This routine takes one active off the call stack,
and reinstalls a catcher"
  (setq *call-stack-pointer-base*
	(logand 255. (1+ *call-stack-pointer-base*)))
  (ch-unload-one-active)
  (setq *call-stack-pointer-base*
	(logand 255. (1- *call-stack-pointer-base*)))
  (ch-put-cs *call-stack-pointer-base*
	     #xFF #xFF 'the-stack-catcher 0))

;;; Well, this is crufty, but it works.
CH-UNLOAD_1
   (ALU R+1 A1 A0 (%REGISTER *CALL-STACK-POINTER-BASE* 1 0) BW-24)
   (ALUI-16 ALU-AND A1 A1 (QUOTE 255) BW-24)
   (MOVE (%REGISTER *CALL-STACK-POINTER-BASE* 1 0) A1)
   (OPEN-CALL CH-UNLOAD-ONE-ACTIVE (QUOTE 0) IGNORE NIL)
B_19
   (ALU R-1 A0 A0 (%REGISTER *CALL-STACK-POINTER-BASE* 1 0) BW-24)
   (ALUI-16 ALU-AND A0 A0 (QUOTE 255) BW-24)
   (MOVE (%REGISTER *CALL-STACK-POINTER-BASE* 1 0) A0)
   (MOVE O0 (%REGISTER *CALL-STACK-POINTER-BASE* 1 0) CH-TAIL-OPEN)
   (MOVEI O1 (QUOTE 255))
   (MOVEI O2 (QUOTE 255))
   (MOVEI O3 (QUOTE THE-STACK-CATCHER))
   (MOVEI O4 (QUOTE 0))
   (TAIL-CALL CH-PUT-CS (QUOTE 5))



