          IDENT  NVEPFU,130B
          TITLE  RAM$NVEPFU
          ABS
          SYSCOM B1
          ENTRY  XPFUA
          ORG    130B
          TITLE  NVEPFU - NOS-NOSVE TAPE FAP TRANSFER.

CKIOST    MACRO  FET
          LOCAL  CONT
          SA1    FET+0
          MX0    5
          LX0    14
          BX2    X1*X0
          ZR     X2,CONT     IF NO IO STATUS
          AX2    9
          SX3    X2-1
          NZ     X3,IOERR    IF ERROR
          MX6    5
          SA6    EOI         SET EOI FLAG
CONT      BSS    0
          ENDM

RESET     MACRO  FET
          SA1    FET+1
          SX6    X1
          SA6    FET+2
          SA6    FET+3
          ENDM

CKMST     MACRO  MASK
          LOCAL  READY,BEGIN,DONE,RCLP,RCLCNT
BEGIN     BSS    0
          SA1    NTHSR
          NG     X1,READY    IF REQUEST COMPLETE
          RJ     POLL
          SA1    NTHSR
          NG     X1,READY    IF REQUEST COMPLETE
          SA1    WMLI
          SX6    X1+1
          SA6    A1
          RECALL
          EQ     BEGIN

READY     BSS    0
          SA1    MLIPAR+MLPSV
          ZR     X1,DONE     IF MLI STATUS OK
          BX6    X1
          SA6    STS
          SB4    X6
          SA2    MASK
          SX0    1
          LX0    B4,X0
          BX2    X2*X0
          ZR     X2,MLERR    IF NON RETRY MLI ERROR

* REISSUE REQUEST

          SA1    REISSUE
          SX6    X1+1
          SA6    A1

* WAIT FOR A WHILE - 180 HAS UP TO 3 BLOCKS TO CATCH UP

          SX6    6           6 RECALLS
          SA6    RCLCNT
RCLP      BSS    0
          RECALL
          SA1    RCLCNT
          SX6    X1-1
          SA6    RCLCNT
          NZ     X6,RCLP     IF MORE
          RJ     ISSUE
          EQ     BEGIN
RCLCNT    BSS    1
DONE      BSS    0
          ENDM

SNDM      MACRO  HW,BUF
          SA1    HW
          SX6    BUF         ADDRESS
***          SX7    X1+1        (HEADER+DATA)+TRAILER
          SX7    X1
          SA6    MLIPAR+MLPFA
          SA7    MLIPAR+MLPBL
          RJ     ISSUE
          ENDM

SMSG      MACRO  HW,FET,BUF
          LOCAL  NOTEOI,NOTEOR,NOTEOF,SSS
          CKIOST FET
          SA1    FET+1
          SA2    FET+2
          SX1    X1
          SX2    X2
          IX6    X2-X1
***          SX6    X6+1        DATA+HEADER
          SA6    HW
          SA1    BLOCKS
          SA2    WORDS
          IX6    X6+X2
          SX7    X1+1
          SA7    A1
          SA6    A2

          MX0    1
          SA1    FET
          LX0    10
          BX2    X1*X0
          ZR     X2,NOTEOI
          SX6    AIEND
          SA6    MLIPAR+MLPAR
          MESSAGE (=C* EOI SENT *),3,R
          EQ     SSS
NOTEOI    BSS    0
          MX0    2
          LX0    5
          BX2    X1*X0
          AX2    3
          SX3    X2-2
          NZ     X3,NOTEOR
          SX6    AIEOP
          SA6    MLIPAR+MLPAR
**          MESSAGE (=C* EOP SENT *),3,R
          EQ     SSS
NOTEOR    BSS    0
          SX3    X2-3
          NZ     X3,NOTEOF
          SX6    AIEOF
          SA6    MLIPAR+MLPAR
**          MESSAGE (=C* EOF SENT*),3,R
          EQ     SSS
NOTEOF    BSS    0
          SX6    AIDATA
          SA6    MLIPAR+MLPAR
SSS       BSS    0
**          SA1    HW
**          RJ     CDD
**          SA6    M16
**          MESSAGE M15,3,R
          SNDM   HW,BUF
          SA1    EOI
          NZ     X1,EXIT     IF SENT EOI BLOCK
          ENDM

RECM      MACRO  HW
***          MX7    0
***          SA7    HW          CLEAR HEADER WORD (LENGTH)
          SX6    HW
          SA6    MLIPAR+MLPFA
          RJ     ISSUE
          ENDM

WRITF     MACRO  FET,HW
          LOCAL  WEOF,QQQ,WEOR,WWW
***          SX2    1
***          SA1    HW
***          MX0    22
***          LX0    22
***          BX3    X1*X0
***          IX3    X3-X2       LENGTH
          SA1    FET+3       OUT
          SA2    FET+2       IN
          BX1    X1-X2
          MX0    18
          LX0    18
          BX1    X1*X0
          NZ     X1,ERR2     IF BUFFER NOT EMPTY
**          SA1    MLIPAR+MLPV1
**          RJ     CDD
**          SA6    M16
**          MESSAGE M15,3,R
          SA3    MLIPAR+MLPV1  LENGTH
          SA4    FET+1
          SX6    X4
          SA6    FET+3       OUT=FIRST
          IX7    X4+X3
          SA7    FET+2       IN=FIRST+LENGTH
          SA2    BLOCKS
          SX6    X2+1
          SA6    A2
          SA2    WORDS
          IX6    X2+X3
          SA6    A2

          SA1    MLIPAR+MLPV2 ARB INFO
          BX6    X1
          SA6    MLIPAR+MLPAR FOR USE BY EXIT
          SX2    X1-AIDATA
          NZ     X2,WWW
          WRITE  FET
**          MESSAGE (=C*WRITE DATA*),3,R
          EQ     QQQ

WWW       BSS    0
          SX2    X1-AIEOP
          ZR     X2,WEOR
          SX2    X1-AIEOF
          ZR     X2,WEOF
          SX2    X1-AIEND
          NZ     X2,RAIERR
****          WRITER FET
          MESSAGE (=C*END OF OP RECD*),3,R
          EQ     EXIT

WEOR      BSS    0
          WRITER FET
**          MESSAGE (=C*WRITE EOP*),3,R
          EQ     QQQ

WEOF      BSS    0
          WRITEF FET
**          MESSAGE (=C*WRITE EOF*),3,R

QQQ       BSS    0
          ENDM
OPL       XTEXT  COMCCDD
OPL       XTEXT  COMCMAC
OPL       XTEXT  COMCCIO
OPL       XTEXT  COMCSYS
*copy COMSCVS
*copy COMMCVS
*copy COMSMLI
*copy COMMMLI
*copy mla$c170_memory_link_interface
BUFSIZ    EQU    3072+2
HWA       BSS    1
BUFA      BSS    BUFSIZ
TWA       BSS    1
*
HWB       BSS    1
BUFB      BSS    BUFSIZ
TWB       BSS    1
*
FETA      FILEB  BUFA,BUFSIZ
FETB      FILEB  BUFB,BUFSIZ
INPUT     FILEB  BUFB,BUFSIZ
AN170     BSS    1
AN180     BSS    1
STS       BSS    1
NTHSR     DATA   -2
REISSUE   DATA   0
WMLI      DATA   0
BLOCKS    DATA   0
WORDS     DATA   0
M1        DATA   10HMLI ERROR
M2        BSSZ   2

M3        DATA   10HCIO ERROR
M4        BSSZ   2

M13       DATA   20HREC ARBINFO ERROR
M14       BSS    1
          DATA   0
M15       DATA   10HRECLEN=
M16       BSS    1
          DATA   0
SMASK     VFD    60/1014040B
RMASK     VFD    60/40040B
MMASK     VFD    60/0
EOI       DATA   0
AIID170   EQU    0
AIWRITE   EQU    1
AIREAD    EQU    2
AIDATA    EQU    3
AIEOP     EQU    4
AIREWF    EQU    5
AISKIPF   EQU    6
AIEOF     EQU    7
AIEND     EQU    8
SIGNAL    BSS    1
ARBINFO   BSS    1
MSGLEN    BSS    1
SENDER    BSS    1
OPTYPE    BSS    1
SIONM     VFD    60/41000040B
ASM       VFD    60/40B
SMM       VFD    60/1016040B
RMM       VFD    60/40040B

CHKMLI    MACRO  MSK,BRANCH,STAT
          LOCAL  DONE
          SA1    STAT
          ZR     X1,DONE     IF STATUS=OK
          SA2    MSK
          SX0    1
          SB4    X1
          LX0    B4,X0
          BX2    X2*X0
          ZR     X2,MLERR
          RECALL
          EQ     BRANCH
DONE      BSS    0
          ENDM

BEGREAD   BSS    0
          SX6    AIDATA
          SA6    MLIPAR+MLPAR
          SX6    100
          SA6    MLIPAR+MLPSG
          SX6    MLFSE
          SA6    MLIPAR+MLPFN
          SX6    MLSOK
          SA6    MLIPAR+MLPSV
*
          SA1    SMASK
          BX7    X1
          SA7    MMASK
          READ   FETA,R

LOOP      BSS    0
          RESET  FETB
          READ   FETB
          SMSG   HWA,FETA,BUFA
          RECALL FETB
          CKMST  MMASK

          RESET  FETA
          READ   FETA
          SMSG   HWB,FETB,BUFB
          RECALL FETA
          CKMST  MMASK
          EQ     LOOP

BEGWRIT   BSS    0
          SX6    100
          SA6    MLIPAR+MLPSG
          SX6    MLFRE
          SA6    MLIPAR+MLPFN
          SX6    MLSOK
          SA6    MLIPAR+MLPSV
          SX6    BUFSIZ
          SA6    MLIPAR+MLPBL  BUFFER LENGTH
          MX6    0
          SA6    MLIPAR+MLPRI  RECEIVE INDEX
*
          SA1    RMASK
          BX7    X1
          SA7    MMASK
          REWIND FETA,R

RLOOP     BSS    0
          RECM   BUFA
          RECALL FETB
          CKIOST FETB
          CKMST  MMASK
          WRITF  FETA,HWA

          RECM   BUFB
          RECALL FETA
          CKIOST FETA
          CKMST  MMASK
          WRITF  FETB,HWB
          EQ     RLOOP

RAIERR    BSS    0
          SA1    MLIPAR+MLPV2
          RJ     CDD
          SA6    M14
          MESSAGE M13,0,R
          EQ     EXIT

MLERR     BSS    0
          SA2    MLIPAR+MLPSV
          MX6    0
          SA6    MLIPAR+MLPSV  TO PREVENT LOOP WITH EXIT/CKMST/MLERR
          BX1    X2
          RJ     CDD
          SA6    M2
          MESSAGE M1,0,R
          EQ     EXIT

IOERR     BSS    0
          BX1    X2
          RJ     CDD
          SA6    M4
          MESSAGE M3,0,R
          EQ     EXIT

ERR1      BSS    0
          MESSAGE (=C*NO AN180 IN INPUT FILE*),3,R
          EQ     EXIT

ERR2      BSS    0
          MESSAGE (=C*WRITE DIDNT FLUSH*),3,R
          EQ     EXIT

EXIT      BSS    0
          CKMST  MMASK
          RECALL FETA
          RECALL FETB
          SA1    OPTYPE
          SX0    X1-AIWRITE
          NZ     X0,EXIT2    IF NOT WRITE
EXIT1     BSS    0
          SEND   AN170,=0,SIGNAL,SIGNAL,=1,AN180,STS
          CHKMLI SMM,EXIT1,STS
EXIT2     BSS    0
          ENDRUN

          EJECT
ISSUE     BSS    1
ISSUE0    BSS    0
          SA1    NTHSR
          PL     X1,ISSUE3   IF REQUEST OUTSTANDING
          SX4    0
          SX2    MLIPAR
          CALLVS X2,X4,CVSMLIU,0
          ZR     X0,ISSUE    IF REQUEST COMPLETE
          BX1    X0
          AX1    30
          NZ     X1,ISSUE1   IF NOS/VE DOWN
          SX0    X0-1
          NZ     X0,ISSUE2   IF REQUEST NOT COMPLETE
          RECALL
          EQ     ISSUE0

ISSUE2    BSS    0
          BX6    X4
          SA6    NTHSR
          EQ     ISSUE       RETURN

ISSUE1    BSS    0
          SX6    MLSND
          SA6    MLIPAR+MLPSV
          EQ     ISSUE

ISSUE3    BSS    0
          MESSAGE (=C* REQ W/REQ OUTSTANDING*),3,R
          ABORT

**********************************************

POLL      BSS    1
          SA4    NTHSR
          NG     X4,POLL     IF NO REQUEST
          SX1    MLIPAR
          CALLVS X1,X4,CVSMLIU,0
          ZR     X0,POLL1    IF REQUEST COMPLETE
          AX0    30
          NZ     X0,POLL2    IF NOSVE DOWN
          EQ     POLL

POLL1     BSS    0
          SX6    -2
          SA6    NTHSR
          EQ     POLL

POLL2     BSS    0
          SX6    MLSND
          SA6    MLIPAR+MLPSV
          EQ     POLL
          EJECT
PFU       BSS    0
 XPFUA    BSS    0
          SB1    1
          MX6    0
          SA6    BUFB
          READ   INPUT,R
          SA1    BUFB
          ZR     X1,ERR1     IF NO AN180
          BX6    X1
          SA6    AN180

          MESSAGE (=C*SIGNON*),3,R
PFU1      BSS    0
          SIGNON =0,=0,AN170,STS
          CHKMLI SIONM,PFU1,STS

          MESSAGE (=C*ADDSPL*),3,R
PFU2      BSS    0
          ADDSPL AN170,AN180,STS
          CHKMLI ASM,PFU2,STS

          MESSAGE (=C*SEND AN170*),3,R
PFU3      BSS    0

* IC CONVENTION FOR AI IS:
* BIT0 = LAST
* BIT1 = FIRST
* BIT2 = EOP
* BIT3 = EOI
* BIT4-N = UBC

          SEND   AN170,=3,SIGNAL,AN170,=1,AN180,STS
          CHKMLI SMM,PFU3,STS

          MX6    0
          SA6    BUFB
          SA6    BUFB+1
          MESSAGE (=C*REC AN180*),3,R
PFU4      BSS    0
          RECEIVE AN170,ARBINFO,SIGNAL,BUFB,MSGLEN,=2,=0,SENDER,STS
          CHKMLI RMM,PFU4,STS

          SA2    BUFB
          BX6    X2
          SA6    AN180
          SA1    BUFB+1
          SX0    X1-AIWRITE
          NZ     X0,PFU6     IF NOT WRITE
          SX6    AIWRITE
          SA6    OPTYPE
          MESSAGE (=C*BEGIN WRITE*),3,R
          EQ     PFU8

PFU6      BSS    0
          SX0    X1-AIREAD
          NZ     X0,PFU7     IF NOT READ
          SX6    AIREAD
          SA6    OPTYPE
          MESSAGE (=C*BEGIN READ*),3,R
          EQ     PFU8

PFU7      BSS    0
          MESSAGE (=C*ILLEGAL START REQ*),3,R
          EQ     EXIT

PFU8      BSS    0
          MESSAGE (=C*ADD NEW AN180*),3,R
          ADDSPL AN170,AN180,STS
          CHKMLI ASM,PFU8,STS

* SETUP

          SA1    AN170
          SA2    AN180
          BX6    X1
          BX7    X2
          SA6    MLIPAR+MLPAN
          SA7    MLIPAR+MLPSN

          MX0    42
          SA1    =0LTAPE
          SA2    FETA
          BX2    -X0*X2
          BX6    X2+X1
          SA6    FETA
          SA6    FETB

          SA1    OPTYPE
          SX0    X1-AIWRITE
          ZR     X0,BEGWRIT  BEGIN TAPE WRITE
          EQ     BEGREAD     ELSE BEGIN READ
          END    XPFUA
