mtm$170_trap_handler ident
         list      1,1,0
         space     4
*copy ASMREGS
*copy OSA$DUAL_STATE_CONTROL_BLOCK
*copy OSA$EI_INTERFACE_CONSTANTS
*copy osa$dual_state_170_os_stack
*copy MTAMS
*copyc osa$dft_constants
*copy OSA$EI_CONSTANT_DEFINITIONS
*copy SYA$XP_AND_SF_CONSTANTS
         PAGE
.
.        EIE        - EI EXTENSIONS FOR DUAL STATE OPERATION
.
.        ENTRY POINT INTO THE A170 ENVIRONMENT AFTER C180 STATE IS
.        DEADSTARTED FROM WITHIN THE A170 ENVIROMENT. THIS ROUTINE
.        REINITIALIZES THE C170 REGISTERS, PLACES THE CORRECT PVA'S
.        INTO THE STACK FRAME SAVE AREA AND RETURNS CONTROL TO THE
.        C170 ENVIRONMENT. EIE IS INITIATED AS A SPECIAL NOS/VE
.        TASK BY C180 STATE.
.
.        entry     - A3 = PVA of C170 stack and SSR segment.
.
.        exit      Trap handler initialized for dual state operation.
.
         DEFG      mtp$170_trap_handler
.
.        ****ENTER HERE FROM NVE VIA AN EXCHANGE JUMP TO START DUAL STATE***
.
oss$nos_trap_handler section working,read+execute,,0,8
         use       oss$nos_trap_handler
mtp$170_trap_handler bss 0
         ENTL      X0,0c0(16)          .DISABLE TRAPS
         CPYXS     X0,X0
         ADDAQ     a_psa,a_static,sf_job_stack
         ADDAQ     a_dsp,a_psa,33*8
         CPYAA     a_csf,a_dsp
         addpxq    a_wrk,x0,mtp$170_trap_handler
         la        a_dscb,a_wrk,dscb_pva
         la        a_dscb,a_dscb,0     .fetch dscb pointer
.
.        CLEAR EI WORKING STORAGE MEMORY.
.
         entp      x1,0
         tpage     x1,a_psa            .translate stack frame address
         lbyts,4   x2,a_dscb,x0,ve_sfsa
         brxeq     x1,x2,nth2          .if clear not required
         ENTE      X2,ssrdir/8-1
         entp      x1,0
         ENTP      X0,0
nth1     SXI       X0,a_static,X1,0    .CLEAR EI WORKING STORAGE
         brinc     X2,X1,nth1          .LOOP TO END OF EI WORKING STORAGE
nth2     addaq     a8,a_static,ssrdir
         sa        a8,a_static,pva_2
.
         la        a_nos,a_wrk,nos_pva
         la        a_jps,a_wrk,nos_xp
         la        a_nos,a_nos,0       .fetch pva of nos segment
         la        a_jps,a_jps,0       .fetch pva of nos exchange package
         sa        a_dscb,a_static,pva_of_dscb
         sa        a_nos,a_static,pva_of_os
         sa        a_static,a_wrk,tcbp+10 .store pointer to working storage
.
         lbyts,2   x1,a_wrk,x0,mliptr  .create ptr to mf wired
         shfx      x1,x1,x0,32
         sbyts,6   x1,a_static,x0,pva_3
.
.        NOTIFY HELPER PP TO MOVE STACK-FRAME-SAVE AREA OF THE
.        OLD 'IDLED' ENVIRONMENT INTO THE NEW EI WORKING STORAGE
.        SAVE AREA.
.
         entp      x1,0
         tpage     x1,a_psa            .translate stack frame address
         lbyts,4   x2,a_dscb,x0,ve_sfsa
         subr      x2,x1               .calculate offset to sfsa
         cpyaa     a8,a_psa
         addax     a8,x2               .move stack from save area to stack frame
         brreq     x0,x2,nth3          .if move from boot
         movb,a8,x0  a_psa,x1  0,0,17*8,0     0,0,17*8,0
         movb,a8,x0  a_psa,x1  0,0,16*8,17*8  0,0,16*8,17*8
         sbyts,4   x1,a_dscb,x0,ve_sfsa
.
nth3     la        a9,a_wrk,nos_st
         la        a9,a9,0             .fetch pointer to segment table
         la        a8,a_wrk,boot_sdte
         lbyts,8   x3,a8,x0,0
         brxeq     x3,x0,nth5          .if no boot segment
         sx        x3,a9,8*2           .save boot sdte in segment 2
         ente      x3,1002(16)         .build pointer to boot segment
         sbyts,2   x3,a_static,x0,pva_3+8
         la        a8,a_static,pva_3+8 .form pointer to 170 xp in boot
         lbyts,1   x2,a8,x0,xp_vmid
         brreq     x0,x2,nth5          .if nothing to move
         ente      x6,xp_x0
         entp      x5,0
nth4     lbyts,6   x3,a8,x5,2
         sbyts,6   x3,a_psa,x5,2
         incr      x5,8
         brrne     x5,x6,nth4          .if more a registers to move
         movb,a8,x0  a_psa,x1  0,0,16*8,17*8  0,0,16*8,17*8
nth5     entp      x2,0
         sx        x2,a9,8*2           .clear segment 2 entry
         sa        a_jps,a_static,pva_3+8 .save offset to JPS
.
         lbyts,2   x2,a_psa,x0,xp_pit  .upper 32 bits of pit
         lbyts,2   x3,a_psa,x0,xp_pit+8
         insb      x3,x2,x0,4017(8)
         entl      x0,0c9(16)
         cpyxs     x3,x0               .update PIT
         tpage     x6,a_jps
         sbyts,4   x6,a_dscb,x0,ve_jps
.
.        SET TRAP POINTER TO EIE VALUE.
.
         ENTE      X1,0C4(16)          .TRAP POINTER REGISTER
         addpxq    a8,x0,tcbp
         cpyax     x2,a8
         CPYXS     X2,X1               .SET EI TRAP POINTER
.
.        ADJUST PVA'S FOR NOS/VE TRAP 017 TASK JOB MODE
.        NEED TO FIX-
.        P, A0, A1, A2 at sf_job_stack
.
         SA        a_psa,a_psa,xp_a0   .A0 TO sf_job_stack
         SA        a_psa,a_psa,xp_a0+8 .A1 TO sf_job_stack
.
.        RETURN TO C170 ENVIRONMENT.
.
         entp      x2,REST170          .SET RESTART C170 STATUS
         ENTP      X1,1
         INSB      X2,X1,X0,B180DST    .SET C180 DEADSTARTED BIT
         SBYTS,4   X2,a_dscb,X0,ds_stat
         BRREQ     X0,X0,trap5
         PAGE
.
.        TRAP CODE BASE POINTER PAIR.
.
         ALIGN     0,8
tcbp     address   ce,trap
.
.        READ ONLY VARIABLES.
.
         ref       mtv$mli_status,mtv$nst_p,mtv$nos_seg_p,mtv$ns_xp_p
         ref       mlv$c170_rqst_blk,osv$boot_sdte,mtv$nos_segment_table_p
         ref       mlv$enable_hot_key
mlistat  ADDRESS   R,mtv$mli_status
dscb_pva address   r,mtv$nst_p
hotkey   address   r,mlv$enable_hot_key
nos_pva  address   r,mtv$nos_seg_p
nos_xp   address   r,mtv$ns_xp_p
nos_st   address   r,mtv$nos_segment_table_p
boot_sdte address  r,osv$boot_sdte
mliptr   address   r,mlv$c170_rqst_blk
.
.        MEMORY LINK STATUS
.
         ALIGN     0,2
         PAGE
...
.        trap       - TRAP 017 INTERFACE ROUTINES ENTRY.
.
.        ENTRY POINT FOR TRAP PROCESSING FROM C170 STATE.
.        THE C170 ENVIRONMENT IS SAVED IN sf_job_stack STACK FRAME SAVE AREA
.        AND CONTROL IS TRANSFERRED TO THE RESPECTIVE TRAP CONDITION
.        HANDLERS. THE TRAP HANDLERS ALWAYS RETURN CONTROL TO trap5
.        ON COMPLETION.
.        THE TRAP HANDLERS ARE OF TWO CATEGORIES:
.
.        1. CMU INSTRUCTION SIMULATION ROUTINES, CALLED WHEN THE
.                  UNIMPLEMENTED INSTRUCTION TRAP BIT IS SET AND THE TRAP
.                  CONDITION IS NOT DUE TO A TRAP170 INSTRUCTION.
.
.        2. T017 REQUEST CALL, TRAP IS CAUSED BY an 017 INSTRUCTION.
.
.        ENTRY      - (A0) = sf_job_stack + 33*8
.                      (A1) = sf_job_stack + 33*8
.                      (A2) = sf_job_stack
.                      (A3) = BTH017
.                      ALL OTHER REGISTERS AS DEFINED BY C170 STATE.
.
.        EXIT       TRAP CONDITIONS SERVICED, RETURN TO A170 ENVIRONMENT
.                  OR GIVE CONTROL TO NOS/VE WHEN HIGHER PRIORITY.
.
.        REGISTER USAGE
.                  (A0) = sf_job_stack + 33*8
.                  (A1) = sf_job_stack + 33*8
.                  (a_psa) = sf_job_stack
.                  (a_static) = EI WORKING STORAGE
.                  (a_wrk) = Trap handler pva.
.
.
.        ***ENTER HERE FROM C170 STATE VIA A TRAP***
.
         ALIGN     0,8                 .MUST BE ON WORD BOUNDARY
trap     BSS       0
         ENTL      X0,0
         SBYTS,3   X0,a_psa,X0,xp_cb0     .CLEAR C170 B0 REGISTER
         LA        a_nos,a_static,pva_of_os  .NOS POINTER
         la        a_dscb,a_static,pva_of_dscb  .dscb pointer
         addpxq    a_wrk,x0,mtp$170_trap_handler
         lbyts,3   x_flc,a_psa,x0,xp_flc  .provide x_flc
         lbyts,3   xb,a_psa,x0,xp_rac     .create a_rac
         cpyaa     a_rac,a_nos
         shfx      xb,xb,x0,3
         addax     a_rac,xb
.
         lbyts,2   x1,a2,x0,xp_ucr
         shfc      x2,x1,x0,48         .UCR bit 48
         brxgt     x0,x2,pif           .If privilaged instruction fault
         shfc      x2,x1,x0,49         .UCR bit 49
         brxgt     x0,x2,cis           .If unimplemented instruction
         shfc      x2,x1,x0,51         .UCR bit 51
         brxgt     x0,x2,trap5         .IF process interval timer
.
.        Illegal TRAP CONDITION, EI MTR WILL PROCESS IT.
.
         EIMTRCAL  EIRQC,GENCODE       .CALL EI MTR TO PROCESS ERROR
.
.        trap exit entrys.
.
trap2    lx        x1,a_static,ve_down    .bit 2**30 set if ve down
         iorx      x0,x1
trap3    SX        X0,a_psa,xp_cx0        .STORE USER XO REGISTER
trap4    LA        a8,a_psa,xp_p
         ADDAQ     a8,a8,8             .INCREMENT P REGISTER
         SA        a8,a_psa,xp_p
trap5    BSS       0                   .RETURN TO C170 STATE
.
.        EXIT POINT FOR C170 CPUMTR T017 REQUESTS(E.G. PURGE BUFFER),
.        SINCE RETURN IS ALWAYS TO THE C170 ENVIRONMENT.
.
         ENTL      X0,0c3(16)
         CPYXS     X0,X0               .SET TEF AND TED
         RETURN
*copy OSI$C170_CMU_EMULATION
*copy OSI$PRIVILAGED_170_INSTRUCTIONS
.
.        request table.
.
         fn017     rspt,read_set_pit   .read and set pit
         fn017     mliu,mlirqup        .unpriv memory link
         fn017     cpcm,minilink       .mini-link request
         fn017     cinv,bmi            .cache invalidate
         fn017     rpva,fetch_pva      .return pva value
         fn017     3,downc180          .return to stand-alone
         fn017     2002(8),status_ve   .get the ve status
         fn017     end
.
         brreq     x0,x0,pif4          .illegal function
.
.
         ALIGN     0,2
CONSOLE  BSS       0
         entp      x0,0
         sxi       x0,a_psa,x_reg2,xp_cx0 .set terminator found in return param
         entp      x0,0
         BRREQ     X0,X0,trap2
         PAGE
.        DOWNC180   - TERMINATE NOSVE ENVIRONMENT.
.
DOWNC180 BSS       0
         lbyts,4   x1,a_dscb,x0,ds_flag  .check if VE going down
         brxne     x1,x0,down0         .ve already going down
         entp      x1,1                .Set VE down flag, this informs SCI to
                                       . start VE termination.
         sbyts,4   x1,a_dscb,x0,ds_flag
         eimtrcal  mtrr#std,0,nohlt
DOWN0    BSS       0
         entp      x0,0
         brreq     x0,x0,trap3         .exit with ve up status
         space      4
.        status_ve - get the current running status of ve.
.
status_ve bss      0
         lx        x2,a_static,ve_down  .fetch the ve down flag
         sxi       x2,a_psa,x_reg1,xp_cx0
         entp      x0                  .return ve up in x0
         brreq     x0,x0,trap3         .store x0 and return
         PAGE
.        MLIRQST - PROCESS A NOS/VE MLI REQUEST FROM A C170 JOB.
.
.        THIS ROUTINE WILL ATTEMPT TO ADD THE MEMORY LINK REQUEST FROM THE C170
.        JOB TO A QUEUE OF REQUESTS THAT ARE PROCESSED BY THE NOS/VE
.        MLI HELPER TASK.  IF THE QUEUE IS FULL, THE REQUEST IS REJECTED.  IF
.        THE QUEUE IS NOT FULL THEN THE REQUEST IS ADDED TO THE QUEUE.
.
.        ENTRY:
.        x_reg1    pointer to the mli parameter block.
.        x_reg2    if 0, then this is an initial request.
.                  else it is the request queue index of the polling request.
.
.        EXIT:
.        C170-X0    0 IF REQUEST WAS ACCEPTED
.                  1 IF REQUEST REJECTED BECAUSE QUEUE FULL
.                  2 IF REQUEST REJECTED BECAUSE REQUEST NOT COMPLETE
.        x_reg2    request queue index if initial request.
.
.        NOTE:
.        WARNING - THIS ROUTINE MAY BE INTERRUPTED BY A SIT, AND CONTROL
.                  MAY BE GIVEN TO ANOTHER 180 TASK.
.
MLIMI    EQU       10                  . NUMBER OF ENTRIES IN THE REQUEST TABLE
MLIEL    EQU       160                 . LENGTH OF SINGLE QUEUE ENTRY
IDLE     EQU       0                   . IDLE OPSTATUS
WAIT180  EQU       1                   . WAIT FOR 180 OPSTATUS
WAIT170  EQU       2                   . WAIT FOR 170 OPSTATUS
SMIP     EQU       3                   . SEND MOVE IN PROGRESS
RMIP     EQU       4                   . RECEIVE MOVE IN PROGRESS
.
.        OFFSETS INTO A GIVEN QUEUE ENTRY
.
OPSTATUS EQU       0
COPYLENG EQU       OPSTATUS+8
TIME     EQU       COPYLENG+8
JSN      EQU       TIME+8
INTRPT   EQU       JSN+8
USED     EQU       INTRPT+8
MLIPKT   EQU       USED+8
RTPTR    EQU       MLIMI*MLIEL
BFPTR    EQU       RTPTR+6
MXSIZE   EQU       BFPTR+6
REJECT   EQU       MXSIZE+8
.
PKTLEN   EQU       14*8
MLPFA    EQU       5                   . WORD OFFSET OF BUFFER
MLPBL    EQU       6                   . WORD OFFSET OF BUFFER LEN
MLPFN    EQU       3                   . WORD OFFSET OF FUNCTION
MLFSE    EQU       4                   . SEND FUNCTION
.
ACCPTALL EQU       2
RJCTALL  EQU       0
ACCPTDSC EQU       1
.
.        A-register usage within the memory link.
a_npkt   areg      4                   .pointer to nos packet address
a_vpkt   areg      5                   .pointer to nos/ve packet address.
a_vbuf   areg      6                   .pointer to nos/ve data buffer.
a_mli    areg      7                   .pointer to mli area.
.
.
mlirqup  bss       0                   .unprivilaged memory link
         LA        a_mli,a_wrk,mliptr
         LBYTS,8   X2,a_mli,X0,REJECT  . GET DEADSTART STATUS
         ENTP      X3,ACCPTALL
         entl      x0,1                .pretend request queue full
         brrne     x2,x3,trap2         .return and store x0
.
.        CHECK FOR TYPE OF REQUEST (SUB-FUNCTION)
.
         lxi       x_reg1,a_psa,x_reg1,xp_cx0
         isob      x_reg1,x_reg1,x0,0473(8)  .strip off upper 4 bits
.
.        validate the c170 packet and form pva.
.
         addxq     x8,x_reg1,pktlen/8  .compute lwa for packet
         brrge     x8,x_flc,mliabort   .if address error
         brrgt     x0,x_reg1,mliabort  .if negative
         shfx      x1,x_reg1,x0,3
         cpyaa     a_npkt,a_rac
         addax     a_npkt,x1
.
         lxi       x4,a_psa,x_reg2,xp_cx0 .fetch request index
         isob      x4,x4,x0,0473(8)    .strip off upper 4 bits
         BRXNE     x4,X0,MLIPOLL       . IF POLLING REQUEST
.
.        FIND FREE ENTRY
.
         entp      X2,0
         entp      X4,MLIMI
         entp      X5,IDLE
         cpyaa     a_vpkt,a_mli
.
MLI1     BSS       0
         BRXGE     X2,X4,MLIFULL       . IF FULL
         ENTP      X0,SMIP
         ENTP      XA,IDLE
         ADDAQ     A9,a_vpkt,OPSTATUS
CS2      CMPXA     XA,A9,X0,CS2
         BRREQ     X1,X0,MLI2          . IF AVAILABLE
         INCX      X2,1
         ADDAQ     a_vpkt,a_vpkt,MLIEL
         BRXEQ     X0,X0,MLI1
.
.        FOUND FREE ENTRY AT a_vpkt/X2.
.
MLI2     BSS       0
         SBYTS,1   X2,a_static,X0,ENTRY   . SAVE ENTRY INDEX
         lbyts,8   x8,a_mli,x0,mxsize
         mulx      x8,x2
         la        a_vbuf,a_mli,bfptr
         addax     a_vbuf,x8           .a_vbuf = ^mli data buffer
         incx      x2,1
         sxi       x2,a_psa,x_reg2,xp_cx0 .save buffer index
.
         ENTP      XA,0
         CPYTX     XB,XA
         SBYTS,8   XB,a_vpkt,X0,TIME   . SET REQ START TIME
         LBYTS,8   XA,a_vpkt,X0,USED
         INCX      XA,1
         SBYTS,8   XA,a_vpkt,X0,USED
         ENTP      XA,0                . CLEAR INTRPT WORD
         SBYTS,8   XA,a_vpkt,X0,INTRPT
.
.        move parameter list from 170 to 180.
.
         entp      x5,13               .stop
         entp      x6,0                .index
movepl   bss       0
         lxi       x7,a_npkt,x6,0
         isob      x7,x7,x0,0473(8)    .strip off upper 4 bits
         sxi       x7,a_vpkt,x6,mlipkt
         brinc     x5,x6,movepl        .branch if more to move
.
.        IF SEND THEN VERIFY PARAMS AND MOVE DATA
.
         LBYTS,8   X5,a_vpkt,X0,(MLPFN*8)+MLIPKT
         entp      X6,MLFSE
         BRXNE     X5,X6,INITDONE      . IF NOT SEND
.
CSM      BSS       0
         LBYTS,8   X5,a_vpkt,X0,(MLPFA*8)+MLIPKT . GET BUFFER ADDRESS
         LBYTS,8   X6,a_vpkt,X0,(MLPBL*8)+MLIPKT . GET BUFFER LENGTH
         CPYXX     X7,X6
         SHFX      X6,X6,X0,3
         LBYTS,8   X8,a_mli,X0,MXSIZE
         BRXGT     X6,X8,MLIABORT      . IF TOO BIG
         ADDX      X7,X5
         BRXGE     X7,x_flc,MLIABORT   . IF BUFFER>FL
         BRXGT     X0,X5,MLIABORT      . IF BUFFER<0
         lbyts,4   xa,a_vpkt,x0,intrpt+4 . get intrpt offset
         subx      x6,xa
.
.        MOVE X6 BYTES FROM RAC+X5 TO C180 BUFFER
.
         cpyaa     a8,a_rac
         SHFX      X5,X5,X0,3          . TO BYTES
         ADDAX     a8,X5               . a8=^ C170 BUFFER
         cpyax     xf,a8               . save buffer address
.
         ENTE      X9,256
         CPYXX     X0,X9
         CPYXX     X1,X9
         cpyaa     ab,a_vbuf
.
. add intrpt restart address
.
         addax     a8,xa
         addax     ab,xa
.
SMVE1    BSS       0
         BRXEQ     X6,X0,INITDONE      . IF MOVE COMPLETE
         BRXGT     X6,X9,SMVE2         . IF > 256 BYTES TO MOVE
         CPYXX     X9,X6
         CPYXX     X0,X9
         CPYXX     X1,X9
.
SMVE2    BSS       0
         SUBX      X6,X9
         MOVB,a8,X0  ab,X1  1,9,0,0  1,9,0,0
         ADDAX     a8,X9
         ADDAX     ab,X9
         brcr      5,3,smve1           . if no xr
         brxeq     x6,x0,initdone      . if move complete
.
         cpyax     xa,a8
         subr      xa,xf         . curpos - buffer start
         sbyts,4   xa,a_vpkt,x0,intrpt+4 . save intrpt offset
         entp      x0,smip                 .set entry for restart
         entp      xa,smip
         addaq     a9,a_vpkt,OPSTATUS
cs4      cmpxa     xa,a9,x0,cs4
         brrne     x1,x0,cs4
         lbyts,8   xa,a_dscb,x0,d7jp
         isob      xa,xa,x0,0453(8)
         sx        xa,a_vpkt,jsn
         brxeq     x0,x0,trap5
.
.        MOVE COMPLETE - STORE JSN, OPSTATUS
.
INITDONE BSS       0
         lbyts,8   xa,a_dscb,x0,d7jp
         isob      xa,xa,x0,0453(8)
         SX        XA,a_vpkt,JSN
.
         entp      x0,wait180
         entp      xa,smip
         addaq     a9,a_vpkt,OPSTATUS
cs6      cmpxa     xa,a9,x0,cs6
         brrne     x1,x0,cs6
.
.        HAVE NOSVE MONITOR READY THE HELPER TASK
.
         LBYTS,6   XB,a_mli,X0,RTPTR
         LBYTP,6   XC,NIL
         BRXEQ     XB,XC,MLT23         . IF HELPER NOT READY
         LA        AA,a_wrk,mlistat
         entp      X1,1
         SBYTS,1   X1,AA,X0,MLIWT      .INHIBIT WAIT FOR HELPER.
         la        aa,a_wrk,hotkey
         lbyts,1   x1,aa,x0,0
         brxeq     x1,x0,mlt23         . If memory link hot key not enabled
.
.        Force the dispatcher to run immediately
.
         eimtrcal  donthing,0,nohlt    .Do nothing (but check dispatcher)
.
MLT23    BSS       0
.
.        RETURN - SET C170 X0 TO 2
.
         entp      x0,2
         brreq     x0,x0,trap2         .exit
.
.        RETURN - SET C170 X0 TO 1 FOR REQUEST REJECTED
.
mlifull  entp      x0,1
         brreq     x0,x0,trap2         .exit
.
.        PROCESS MLI POLLING REQUEST-
.        VERIFY THAT X4 IS VALID
.
         ALIGN     0,8
MLIPOLL  BSS       0
         LBYTS,8   XA,a_static,X0,PC
         INCX      XA,1
         SBYTS,8   XA,a_static,X0,PC
         BRXGE     X0,X4,MLIABORT      . IF < 0
         entp      X3,MLIMI
         BRXGT     X4,X3,MLIABORT      . IF > MLIMI-1
         decx      x4,1
         CPYXX     XA,XA               . *** HDW BUG ***
         MULXQ     XA,X4,MLIEL
         cpyaa     a_vpkt,a_mli
         ADDAX     a_vpkt,XA
         la        a_vbuf,a_mli,BFPTR
         lbyts,8   x8,a_mli,x0,mxsize
         mulx      x8,x4
         addax     a_vbuf,x8
.
.        IF STATUS IS WAIT180 THEN RETURN TO 170
.
         entp      x0,0
         entp      xa,0
         entp      xb,wait180
         addaq     a9,a_vpkt,OPSTATUS
cs8      cmpxa     xa,a9,x0,cs8
         BRXNE     XA,XB,MPOLL1        . IF NOT WAIT180
         entp      x0,2
         brreq     x0,x0,trap2         .return c170_x0 = 2
.
.        VERIFY ENTRY IS NOT IDLE/JSN
.
MPOLL1   BSS       0
. WARNING --- The following code depends on XA remaining set from cs8 above.
         entp      XB,IDLE
         BRXEQ     XA,XB,MLIABORT      . IF IDLE
         lbyts,8   xc,a_dscb,x0,d7jp
         LX        XB,a_vpkt,JSN
         isob      xc,xc,x0,0453(8)
         BRXNE     XC,XB,MLIABORT      . IF JSNS <>
         entp      xb,smip
         brxeq     xa,xb,csm           . continue send move
         entp      xb,rmip
         brxeq     xa,xb,crm           . continue receive move
.
.        REQUEST IS COMPLETE.  MOVE LAST 4 WORDS OF PARAM BLOCK BACK TO C170.
.
MPOLL2   BSS       0
         MOVB,a_vpkt,X0 a_npkt,X1 0,9,4*8,MLIPKT+80  0,9,4*8,80
         entp      xb,0
         sbyts,8   xb,a_vpkt,x0,intrpt . initialize intrpt
.
.        CHECK IF COPYLENG <> 0 THEN MOVE DATA TO 170
.
crm      bss       0
         LBYTS,8   X6,a_vpkt,X0,COPYLENG
         BRXEQ     X6,X0,POLLDONE      . IF NO DATA TO MOVE
         LBYTS,8   X5,a_vpkt,X0,(MLPFA*8)+MLIPKT . GET BUFFER ADDRESS
         cpyxx     x7,x6
         shfx      x6,x6,x0,3          .to bytes
         addx      x7,x5
         brxge     x7,x_flc,mliabort   .if buffer > FL
         brxgt     x0,x5,mliabort      .if buffer < 0
         lbyts,4    xa,a_vpkt,x0,intrpt+4 . get intrpt offset
         subx      x6,xa
.
.        MOVE X6 BYTES FROM C180 BUFFER TO RAC+X5
.
         CPYAA     a8,a_rac
         SHFX      X5,X5,X0,3          . TO BYTES
         ADDAX     a8,X5               . a8=^ TO C170 BUFFER
         cpyax     xf,a8               . save buffer start
         addax     a8,xa     . add intrpt offset
         addax     a_vbuf,xa
.
         ENTE      X9,256
         CPYXX     X0,X9
         CPYXX     X1,X9
.
RMVE1    BSS       0
         BRXEQ     X6,X0,POLLDONE      . IF MOVE COMPLETE
         BRXGT     X6,X9,RMVE2         . IF > 256 BYTES TO MOVE
         CPYXX     X9,X6
         CPYXX     X0,X9
         CPYXX     X1,X9
.
RMVE2    BSS       0
         SUBX      X6,X9
         MOVB,a_vbuf,X0   a8,X1 1,9,0,0  1,9,0,0
         ADDAX     a8,X9
         ADDAX     a_vbuf,X9
         brcr      5,3,rmve1           . if no xr
         brxeq     x6,x0,polldone      . if complete
.
         cpyax     xa,a8
         subr      xa,xf             . curpos - buffer start
         sbyts,4   xa,a_vpkt,x0,intrpt+4 . save intrpt offset
         lbyts,8   xa,a_static,x0,xrc
         incx      xa,1
         sbyts,8   xa,a_static,x0,xrc
         entp      x0,rmip             . set receive restart
         entp      xa,smip
         addaq     a9,a_vpkt,OPSTATUS
cs12     cmpxa     xa,a9,x0,cs12
         brrne     x1,x0,cs12
         brxeq     x0,x0,trap5
.
.        POLLING REQUEST DONE - RESET QUEUE ENTRY
.
POLLDONE BSS       0
         entp      x0,0
         SX        x0,a_vpkt,JSN
         entp      x0,idle
         entp      xa,rmip
         addaq     a9,a_vpkt,OPSTATUS
cs14     cmpxa     xa,a9,x0,cs14
         brrne     x1,x0,cs14
         entp      x0,0
         brreq     x0,x0,trap2         .return c170_x0 = 0
.
.        SOME SORT OF 170 ADDRESS ERROR HAS OCCURRED
.
MLIABORT BSS       0
         LBYTS,8   XA,a_static,X0,ERC
         INCX      XA,1
         SBYTS,8   XA,a_static,X0,ERC
         brreq     x0,x0,aor1          .abort c170 job
NIL      VFD,48    0FFFF80000000(16)   . NIL PVA
.
.
.
ENDTH017 EQU       $
.
         END
