;;; -*- Mode:LISP; Package:TRANSPORTER-RAM; Base:10; Readtable:CL -*-

(in-package 'transporter-ram)

(export '(
	  initialize-transporter-ram
	  load-transporter-ram
	  load-transporter-ram-data
	  set-transporter-mode
	  transporter-trap-handler
	  ))

(defconstant *number-of-transporter-modes*
	     (vinc:field-maximum hw:%%memory-control-transporter-mode))

(defconstant *number-of-transport-types*
	     (vinc:field-maximum hw:%%memory-status-transport-type))

(defconstant *number-of-transporter-md-byte-values*
	     (vinc:field-maximum hw:%%transporter-ram-md-byte))

(define-control-register-modifier modify-transporter-mode
				  modify-memory-control hw:%%memory-control-transporter-mode)

(defun set-transporter-mode (new-value)
  (modify-transporter-mode new-value)
  nil)

(defun store-into-transporter-ram (value)
  (hw:write-transporter-ram (hw:dpb value hw:%%transporter-ram-bus-offset 0.))
  (hw:nop)
  (hw:nop)
  nil)

(defun read-from-transporter-ram ()
  (hw:ldb (hw:read-gc-ram) hw:%%transporter-ram-bus-offset 0)
 ;  (hw:ldb (hw:read-gc-ram) (byte (byte-size hw:%%transporter-ram-bus-offset) 0.) 0.)	;was
  )

;(defun initialize-transporter-ram ()
;  ;; Load up the vma-unboxed, md-unboxed set so we can read
;  ;; the boot vector.
;  (trap::disable-traps)
;  (let ((transporter-data
;	  (vinc::dpb-multiple-unboxed
;	    hw:$$non-trappable-pointer     hw:%%transporter-ram-trappable-pointer
;	    hw:$$dont-trap-if-oldspace     hw:%%transporter-ram-trap-if-oldspace
;	    hw:$$dont-trap-if-not-oldspace hw:%%transporter-ram-trap-if-not-oldspace
;	    hw:$$no-box-error              hw:%%transporter-ram-box-error
;	    0.)))
;    (set-transporter-mode vinc:$$transporter-mode-normal)
;    (hw:vma-start-read-unboxed-md-unboxed-no-transport 0)
;    (dotimes (md-byte *number-of-transporter-md-byte-values*)
;      (hw:write-md-unboxed (hw:dpb md-byte hw:%%transporter-ram-md-byte 0.))
;      (hw:write-transporter-ram
;	(hw:dpb transporter-data (byte 4. 4.) 0.))))
;  (hw:vma-start-read-unboxed-md-unboxed 0.)
;  (hw:read-md)
;  (trap::enable-traps))

(defun read-transporter-ram-data-from-memory (md-byte trans-type trans-mode base)
  (hw:vma-start-read-no-transport
    (+ base
       (vinc::dpb-multiple-unboxed
	 md-byte    (byte (byte-size hw:%%transporter-ram-md-byte) 0.)
	 trans-type (byte (byte-size hw:%%memory-status-transport-type)
			  (byte-size hw:%%transporter-ram-md-byte))
	 trans-mode (byte (byte-size hw:%%memory-control-transporter-mode)
			  (+ (byte-size hw:%%memory-status-transport-type)
			     (byte-size hw:%%transporter-ram-md-byte)))
	 0.)) :unboxed :unboxed)
  (hw:read-md))

(defmacro with-transporter-mode (mode thunk)
  `(LET ((OLD-MODE (MODIFY-TRANSPORTER-MODE ,mode))
	 (THUNK ,thunk))
     (PROG1 (FUNCALL THUNK)
	    (SET-TRANSPORTER-MODE OLD-MODE))))

(defun write-transporter-ram (vma-boxed md-boxed trans-type trans-mode datatype value)
  (trap::without-traps
    #'(lambda ()
	(with-transporter-mode trans-mode
	  #'(lambda ()
	      ;; Setup vma boxed and trans type
	      (vma-start-read-generic vma-boxed hw:$$unboxed $$read-no-cdr trans-type 0.)
	      ;; setup datatype and md-boxed
	      (write-md-generic (hw:dpb datatype hw:%%transporter-ram-md-byte 0.) md-boxed)
	      (store-into-transporter-ram value)
	      ))
	)))

(defun read-transporter-ram (vma-boxed md-boxed trans-type trans-mode datatype)
  (trap::without-traps
    #'(lambda ()
	(with-transporter-mode trans-mode
	  #'(lambda ()
	      ;; Setup vma boxed and trans type
	      (vma-start-read-generic vma-boxed hw:$$unboxed $$read-no-cdr trans-type 0.)
	      (hw:nop)
	      ;; setup datatype and md-boxed
	      (write-md-generic (hw:dpb datatype hw:%%transporter-ram-md-byte 0.) md-boxed)
	      (read-from-transporter-ram)
	      ))
	)))

(defun write-transporter-ram-address (address data)
  (multiple-value-bind (vma-boxed md-boxed trans-type trans-mode datatype)
      (decode-transporter-address address)
    (write-transporter-ram vma-boxed md-boxed trans-type trans-mode datatype data)))

(defun read-transporter-ram-address (address)
  (multiple-value-bind (vma-boxed md-boxed trans-type trans-mode datatype)
      (decode-transporter-address address)
    (read-transporter-ram vma-boxed md-boxed trans-type trans-mode datatype)))

(defun decode-transporter-address (address)
  (values
    (hw:ldb address (byte 1 11.) 0)
    (hw:ldb address (byte 1 10.) 0)
    (hw:ldb address (byte 2 8) 0)
    (hw:ldb address (byte 2 6) 0)
    (hw:ldb address (byte 6 0) 0)
;	  (lisp:ldb (byte 1 11.) address)		;unfortunately, these dont have symbolic definitions yet.
;	  (lisp:ldb (byte 1 10.) address)
;	  (lisp:ldb (byte 2 8) address)	;trans-type from instruction
;	  (lisp:ldb (byte 2 6) address)	;trans-mode semi-constant from memory-control-register.
;	  (lisp:ldb (byte 6 0) address)
	  ))
	       
	  
(defun load-transporter-ram (data-vector-origin)
  ;this is actually called during initialization.
  ;it loads the whole thing from a vector in memory.
  "  (on the K side:) LOAD-TRANSPORTER-RAM is called by EVENT-HORIZON which is called by COLD-BOOT-FUNCTION.
     (on the  side:) MEGA-BOOT calls K-BOOT calls PSEUDO-BOOT which tells the K to HW:JUMP to COLD-BOOT-FUNCTION.

     LOAD-TRANSPORTER-RAM reads the transporter ram data which was built by LOAD-BOOT-TRANSPORTER-RAM-DATA.
     (MAKE-COLD-LOAD calls COLD-LOAD-DATA calls COLD-TRANSPORTER-RAM-DATA calls LOAD-BOOT-TRANSPORTER-RAM-DATA)"

 (trap::without-traps
    #'(lambda ()
	(dotimes (trans-mode *number-of-transporter-modes*)
	  (dotimes (trans-type *number-of-transport-types*)
	    (dotimes (md-byte *number-of-transporter-md-byte-values*)
	      (let ((transporter-data
		      (read-transporter-ram-data-from-memory md-byte trans-type trans-mode data-vector-origin)))
		(dotimes (vma-boxed 2.)
		  (dotimes (md-boxed 2.)
		    (write-transporter-ram vma-boxed md-boxed trans-type trans-mode md-byte
		      (hw:ldb transporter-data (byte 4. (vinc::dpb-multiple-unboxed
							  vma-boxed (byte 1. 2.)
							  md-boxed  (byte 1. 3.)
							  0))
			      0))))))))
	;;; Clear out any traps.
	(hw:vma-start-read-no-transport-vma-unboxed-md-unboxed 0.)
	(hw:read-md)
	nil)))


(defun load-transporter-ram-pattern (vma-boxed md-boxed datatype mstat mctl value)
  (dotimes (vmab 2.)
    (when (or (eq t vma-boxed) (= vma-boxed vmab))
      (dotimes (mdb 2.)
	(when (or (eq t md-boxed) (= mdb md-boxed))
	  (dotimes (dtp 64.)
	    (when (or (eq t datatype) (= dtp datatype))
	      (dotimes (type 4.)
		(when (or (eq t mstat) (= type mstat))
		  (dotimes (mode 4.)
		    (when (or (eq t mctl) (= mctl mode))
		      (write-transporter-ram vmab mdb type mode dtp value))))))))))))



(defconstant no-trans vinc::$$transport-type-no-transport)
(defconstant trans    vinc::$$transport-type-transport)
(defconstant vis-evcp vinc::$$transport-type-visible-evcp)
(defconstant write    vinc::$$transport-type-write)

(defconstant normal   vinc::$$transporter-mode-normal)

(defun load-transporter-ram-data ()		;not used at present.
  ;; Format of transporter ram data:
  ;;                           vma-boxed md-boxed datatype mstat mctl value
  ;; Value is:
  ;;    box-error trap-if-not-old trap-if-old trappable-pointer

  ;; Anything weird we trap on. 
  (load-transporter-ram-pattern t t t                 t        t      #b1111)
  
  ;; Don't trap on unboxed-write if no gc-write-test, no trap on unboxed read if "no-transport"
  (load-transporter-ram-pattern 0 0 t                 no-trans normal #b0000)
  
  ;; Don't trap on unboxed-write if no gc-write-test, trap on unboxed read if not "no-transport"
  (load-transporter-ram-pattern 0 0 t                 vis-evcp normal #b0110)
  
  ;; NIL is not treated like a pointer in the transporter ram.
  (load-transporter-ram-pattern t 1 vinc:$$dtp-nil    no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-nil    trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-nil    vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-nil    write    normal #b0000)

  ;; FIXNUMS 
  (load-transporter-ram-pattern t 1 vinc:$$dtp-fixnum no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-fixnum trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-fixnum vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-fixnum write    normal #b0000)

  ;; CHARACTERS same as fixnums
  (load-transporter-ram-pattern t 1 vinc:$$dtp-character no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-character trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-character vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-character write    normal #b0000)

  ;; ARRAY HEADER SINGLE not a pointer, but don't bash
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-single no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-single trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-single vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-single write    normal #b0000) ;Compiler bug - writes temps to stack

  ;; ARRAY HEADER MULTIPLE not a pointer, but don't bash
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-multiple no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-multiple trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-multiple vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-multiple write    normal #b0000) ;Compiler bug - writes temps to stack

  ;; ARRAY HEADER EXTENSION not a pointer, but don't bash
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-extension no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-extension trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-extension vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array-header-extension write    normal #b0000) ;Compiler bug - writes temps to stack

  ;; STRUCTURE HEADER not a pointer, but don't bash
  (load-transporter-ram-pattern t 1 vinc:$$dtp-structure-header no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-structure-header trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-structure-header vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-structure-header write    normal #b0000) ;Compiler bug - writes temps to stack

  ;; HASH-TABLE HEADER not a pointer, but don't bash
  (load-transporter-ram-pattern t 1 vinc:$$dtp-hash-table-header no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-hash-table-header trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-hash-table-header vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-hash-table-header write    normal #b0000) ;Compiler bug - writes temps to stack

  ;; UNBOXED STRUCTURE HEADER not a pointer, but don't bash
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unboxed-header no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unboxed-header trans    normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unboxed-header vis-evcp normal #b1001)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unboxed-header write    normal #b0000) ;Compiler bug - writes temps to stack

  ;; ARRAY
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-array  write    normal #b0011)

    ;; STRUCTURE
  (load-transporter-ram-pattern t 1 vinc:$$dtp-structure  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-structure  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-structure  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-structure  write    normal #b0011)

    ;; HASH-TABLE
  (load-transporter-ram-pattern t 1 vinc:$$dtp-hash-table  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-hash-table  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-hash-table  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-hash-table  write    normal #b0011)

    ;; CONS
  (load-transporter-ram-pattern t 1 vinc:$$dtp-cons   no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-cons   trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-cons   vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-cons   write    normal #b0011)

    ;; SYMBOL HEADER pointer, but don't bash
  (load-transporter-ram-pattern t 1 vinc:$$dtp-symbol-header no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-symbol-header trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-symbol-header vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-symbol-header write    normal #b0000) ;Compiler bug - writes temps to stack

  ;; SYMBOL
  (load-transporter-ram-pattern t 1 vinc:$$dtp-symbol   no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-symbol   trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-symbol   vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-symbol   write    normal #b0011)

  ;; BIGNUM
  (load-transporter-ram-pattern t 1 vinc:$$dtp-bignum   no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-bignum   trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-bignum   vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-bignum   write    normal #b0011)

  ;; RATIONAL
  (load-transporter-ram-pattern t 1 vinc:$$dtp-rational   no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-rational   trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-rational   vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-rational   write    normal #b0011)

  ;; SHORT-FLOAT
  (load-transporter-ram-pattern t 1 vinc:$$dtp-short-float   no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-short-float   trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-short-float   vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-short-float   write    normal #b0011)

  ;; SINGLE-FLOAT
  (load-transporter-ram-pattern t 1 vinc:$$dtp-single-float   no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-single-float   trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-single-float   vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-single-float   write    normal #b0011)

  ;; DOUBLE-FLOAT
  (load-transporter-ram-pattern t 1 vinc:$$dtp-double-float   no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-double-float   trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-double-float   vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-double-float   write    normal #b0011)

  ;; COMPLEX
  (load-transporter-ram-pattern t 1 vinc:$$dtp-complex   no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-complex   trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-complex   vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-complex   write    normal #b0011)

  ;; UNBOUND
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unbound  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unbound  trans    normal #b0111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unbound  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unbound  write    normal #b0011)


  ;-- incomplete..   one-q-forward, external-value-cell-pointer not here. -rg 4/13/88
  ;; I'm not sure this is quite right

  ;; BODY-FORWARD
  (load-transporter-ram-pattern t 1   vinc:$$dtp-body-forward  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1   vinc:$$dtp-body-forward  trans    normal #b0111)
  (load-transporter-ram-pattern t 1   vinc:$$dtp-body-forward  vis-evcp normal #b1111)
  (load-transporter-ram-pattern t 1   vinc:$$dtp-body-forward  write    normal #b0011)

  ;; HEADER-FORWARD
  (load-transporter-ram-pattern t 1   vinc:$$dtp-header-forward  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1   vinc:$$dtp-header-forward  trans    normal #b0111)
  (load-transporter-ram-pattern t 1   vinc:$$dtp-header-forward  vis-evcp normal #b1111)
  (load-transporter-ram-pattern t 1   vinc:$$dtp-header-forward  write    normal #b0011)
    
  ;; COMPILED-FUNCTION
  (load-transporter-ram-pattern t 1 vinc:$$dtp-compiled-function  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-compiled-function  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-compiled-function  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-compiled-function  write    normal #b0011)

  ;; CODE
  (load-transporter-ram-pattern t 1 vinc:$$dtp-code  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-code  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-code  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-code  write    normal #b0011)

  ;; LOCATIVE
  (load-transporter-ram-pattern t 1 vinc:$$dtp-locative  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-locative  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-locative  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-locative  write    normal #b0011)

  ;; UNBOXED-LOCATIVE
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unboxed-locative  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unboxed-locative  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unboxed-locative  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unboxed-locative  write    normal #b0011)

  ;; LEXICAL-CLOSURE
  (load-transporter-ram-pattern t 1 vinc:$$dtp-lexical-closure  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-lexical-closure  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-lexical-closure  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-lexical-closure  write    normal #b0011)

  ;; INTERPRETER-CLOSURE
  (load-transporter-ram-pattern t 1 vinc:$$dtp-interpreter-closure  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-interpreter-closure  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-interpreter-closure  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-interpreter-closure  write    normal #b0011)

  ;; DYNAMIC-CLOSURE
  (load-transporter-ram-pattern t 1 vinc:$$dtp-dynamic-closure  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-dynamic-closure  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-dynamic-closure  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-dynamic-closure  write    normal #b0011)

  ;; SELECT-METHOD
  (load-transporter-ram-pattern t 1 vinc:$$dtp-select-method  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-select-method  trans    normal #b0011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-select-method  vis-evcp normal #b1011)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-select-method  write    normal #b0011)

  ;; UNRECONCILED (always trap)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unreconciled  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unreconciled  trans    normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unreconciled  vis-evcp normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-unreconciled  write    normal #b1111)

  ;; SELF-REF-POINTER
  (load-transporter-ram-pattern t 1 vinc:$$dtp-self-ref-pointer  no-trans normal #b1111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-self-ref-pointer  trans    normal #b0111)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-self-ref-pointer  vis-evcp normal #b0000)
  (load-transporter-ram-pattern t 1 vinc:$$dtp-self-ref-pointer  write    normal #b0000)

  )


(defun transporter-trap-handler (vma vma-boxed md md-boxed map-bits transp-type)
  (when (= 1 md-boxed)
    (dispatch (byte 2 0) transp-type
	      (vinc::$$transport-type-transport
		(dispatch vinc:%%data-type md
			  (vinc:$$dtp-unbound
			    (trap:trap-on)
			    (li:error "Read UNBOUND from memory" vma md))
			  (vinc:$$dtp-header-forward
			    (vmem:vma-start-read-generic
			      vma-boxed md-boxed 0 transp-type
			      (hw:dpb-aligned vma vinc:%%data-type md))
			    (return-from transporter-trap-handler))
			  (vinc:$$dtp-body-forward
			    (trap:trap-on)
			    (let ((index (hw:ldb (hw:32- vma md) vinc:%%fixnum-field 0)))
			      (hw:vma-start-read (hw:dpb vinc:$$dtp-locative vinc:%%data-type md))
			      (hw:read-md)
			      (hw:nop)
			      (hw:nop)
			      (hw:trap-off)
			      (hw:vma-start-read (hw:24+ index (hw:read-vma))))
			    (return-from transporter-trap-handler))
			  (t nil)))
	      (t nil)))
    (trap:trap-on)
    (li:error "Transporter trap error" vma vma-boxed md md-boxed map-bits transp-type))
