ASMB,R,Q,C  ASSEMBQE STATEMENT FOR RTE IV 
      HED OUTSPOOL ROUTINE FOR RTE IV-B 
*     NAME:   SPOUT 
*     SOURCE: 92067-18355 
*     RELOC:  92067-16350 
*     PGMR:   A.M.G.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM SPOUT,1,11 92067-16350 REV.1903 790706
* 
*     ***  THE GREAT SPOOL OUT ROUTINE  *** 
* 
* 
*     ***  SMP REQUESTS TO SPOUT  *** 
* 
*  (1) NEW MENU TO SEARCH 
*       STAT1 = 2 
*       STAT2 = 0 
*       IOBUF CONTAINS MENU 
* 
*  (2) UNLOCK LU AND SEARCH NEW MENU
*       STAT1 = 3 
*       STAT2 = LU TO UNLOCK
*       IOBUF CONTAINS MENU 
* 
*  (3) START UP A NEW SPOOL 
*       STAT1 = 1 
*       STAT2 = NEW STAT2 CLASS PARAMETER 
*       IOBUF CONTAINS NEW STAT1
* 
* 
*     ***  FORM OF CLASS PARAMETERS  ***
* 
*  STAT1   SIGN BIT SET = STANDARD FILE 
*          SIGN BIT CLEAR = OUTSPOOL WITH HEADERS 
*          BIT 12 SET = CAME FROM DVS43 
*          BITS 11-8 = LINE COUNT 
*          BITS 7-0 = LU # TO READ
* 
*  STAT2   SIGN BIT SET = CHECK OVERLAP CONDITION 
*          SIGN BIT CLEAR = NO OVERLAP CHECK NEEDED 
*          BIT 14 SET = RECORD TRUNCATED MESSAGE ALREADY SENT BY SMP
*          BITS 13-8 = FUNCTION BITS FOR STANDARD FILE
*          BITS 7-0 = OUTSPOOL LU # 
* 
*     STD. I/O REQUEST: 
* 
*     OPT. PRAM #1  STAT1 
*     OPT. PRAM #2  SET UP COUNT WORD (FLCNT) 
* 
*     EQT 32/33 
*     32   STAT1
*     33   STAT2
*     29   FLCNT
* 
      EXT $LIBR     TURN OFF INTERRUPTS 
      EXT $LIBX     TURN ON INTERRUPTS
      EXT LURQ      LU LOCK/UNLOCK REQUEST
      EXT $LUAV     LU AVAILABILITY TABLE 
      EXT EXEC      SYSTEM CALLS
      EXT XLUEX     EXTENDED SYSTEM CALLS 
      EXT $SPCL     SPOOL CLASS ID
      EXT .DRCT 
* 
* 
IOBUF BSS 131 
* 
      ORG IOBUF 
* 
* 
SPX   CLA 
      STA SPOUT 
      LDA $SPCL 
      IOR DONT
      JSB $LIBR 
      NOP 
      STA $SPCL 
      JSB $LIBX 
      DEF *+1 
      DEF SPT2
* 
      ORR 
* 
SPOUT JMP SPX 
* 
SPT2  LDA $SPCL 
      STA SP.CL     SAVE FOR INTERNAL USE 
      JSB EXEC      CLASS GET LOOP STARTS HERE. 
      DEF *+8       FLOW OF CONTROL DIRECTED
      DEF D21       FROM THIS POINT.
      DEF SP.CL 
BUFAD DEF IOBUF 
      DEF D131
      DEF STAT1 
      DEF STAT2 
      DEF ICNWD 
      LDB ICNWD     WHAT TYPE ORIGINAL REQUEST? 
      CPB D2
      JMP WRREQ     ORDINARY WRITE. 
* 
      CPB D3
      JMP SPT2      CONTROL - BACK THROUGH LOOP.
* 
      LDA STAT1     WRITE-READ. 
      CPA D2        HAVE AN SMP REQUEST 
      JMP MENU
* 
      CPA D1
      JMP FILAT 
* 
      JSB LURQ      MUST UNLOCK LU OF FILE
      DEF *+4       WHICH SMP FAILED TO OPEN
      DEF B60K
      DEF STAT2 
      DEF D1
      NOP           IGNORE ERROR
      JMP SPT2      GET THE NEXT CHORE
* 
MENU  LDA BUFAD     HAVE A MENU TO SEARCH.
      STA TEMP1 
MENU5 LDA TEMP1,I   GO THROUGH LU'S IN MENU 
      SZA,RSS       TRYING TO LOCK EACH ONE.
      JMP MENU4 
* 
* 
      JSB LURQ      TRY TO LOCK.
      DEF *+4 
      DEF NOABT     WITHOUT ABORT.
      DEF TEMP1,I 
      DEF D1
      JMP MENU6     ERROR JUST IGNORE THIS ONE
      SZA,RSS 
      JMP MENU3     SUCCESSFUL LOCK.
* 
      SSA           UNSUCCESSFUL. 
      JMP MENU4     NO RN'S AVAILABLE.  QUIT. 
* 
MENU6 ISZ TEMP1     LU ALREADY LOCKED.  TRY 
      JMP MENU5     SEARCHING MORE OF MENU. 
* 
MENU4 CLB 
      CPB STAT2 
      JMP MENU2 
* 
      STB STAT2 
      JMP MENU
* 
MENU2 CPB IOBUF     NULL MENU?
      JMP SPT2      YES - BACK TO GET.
* 
      LDA D10       TELL SMP ABOUT THE LOCK PROBLEM 
      JMP SMPC
* 
MENU3 LDA D11       SUCCESS TELL SMP
      LDB TEMP1,I   FIRST MOVE UP THE PRAM
      STB TEMP1 
      JMP SMPC
* 
FILAT LDA IOBUF     HAVE A SET OF FILE
      STA STAT1     ATTRIBUTES. 
      AND B377      READ LU # 
      STA ICNWD     START UP THE SPOOL. 
      JSB GETEQ     GET EQT ADDRESS OF
      ADB M2        STARTING NEW FILE.
      LDA FILNO     INCREMENT AND SET 
      CCE,INA,SZA,RSS 
      ERA           FILE COUNTER INTO EQT29.
      STA FLCNT 
      STA FILNO 
      JSB PUT       STUFF THE EQT.
      ADB D3
      STB LCNT      SAVE EQT32 ADDRESS. 
      JSB SLCNT     STAT2 IN EQT32 AND EQT33. 
      CCA           SET FLAG IN 
      STA GETEQ     GETEQ TO INDICATE SET UP
      JMP WRR10 
* 
WRREQ LDA STAT2 
      STA FLCNT 
      LDA STAT1     NORMAL READ-WRITE LOOP
      AND B377      STARTS HERE.
      STA ICNWD 
      JSB GETEQ     GET ADDRESS OF EQT32. 
      ADB M2        BACK UP AND GET 
      LDA B,I       THE SET UP COUNT
      CPA FLCNT     IS IT GOOD? 
      INB,RSS       YES  SKIP 
      JMP SPT2      NO  OLD NEWS  IGNOR IT
* 
      ADB D2        SET B TO EQT32 ADDRESS
      STB LCNT      SAVE EQT32 ADDRESS. 
      INB 
      LDA B,I       PICK UP STAT2 FROM THE EQT AND
      STA STAT2     SAVE IT 
      LDB STAT1     PICK UP STORED STAT1 VALUE. 
      LDA LCNT,I    AND SAVE VERSION
      BLF,SLB       IF FROM EXTEND
      RSS           SKIP THE INCREMENT
      ADA B400      ELSE STEP THE COUNTER 
      STA STAT1     SET STAT1 FOR LOCAL USE 
      AND B7400     ISOLATE THE COUNTER 
      SZA,RSS       IF COUNT IS ALREADY TO ZERO 
      JMP SPT2      IGNOR THE EXTEND WAKE UP. 
* 
      JSB SLCNT     UPDATE THE EQT
WRR10 LDA STAT2     NEED WE CHECK THE 
      SSA,RSS       OVERLAP CONDITION?
      JMP WRR6      NO NEED.
* 
      JSB .DRCT     WE MUST CHECK OVERLAP 
      DEF $LUAV     CONDITIONS BEFORE CONTINUING. 
      LDB A,I 
      STB TEMP1 
      INA 
      STA TEMP2     SAVE ADDRESS OF TABLE.
WRR   LDB A,I       SEARCH THE $LUAV TABLE
      INA           FOR THE READ LU.
      BLR,BRS 
      CPB ICNWD 
      JMP WRR3      WE HAVE IT. 
* 
      INA 
      JMP WRR 
* 
B400  OCT 400 
SP.CL NOP 
* 
WRR3  LDB A,I       SAVE SPLCON RECORD #
      STB TEMP5     CORRESPONDING TO THIS 
      LDA TEMP2     SPOOL LU.  WILL FIND IF 
WRR5  INA           WE HAVE A POTENTIAL OVERLAP 
      LDB A,I       CONDITION BY FINDING
      CPB TEMP5     ANOTHER ENTRY OF SAME 
      JMP WRR4      RECORD #. 
* 
WRR7  INA 
      ISZ TEMP1 
      JMP WRR5
* 
      LDB STAT2     CLEAR OVERLAP CHECK BIT.
      BLR,BRS 
      STB STAT2 
WRR6  CLA 
      STA CNWD2     INITIALIZE SECOND CONTROL WORD
      JSB XLUEX      READ THROUGH SMD.
      DEF *+5 
      DEF LOKOP     WITH NO ABORT BIT SET.
      DEF ICNWD 
      DEF IOBUF 
      DEF D131
      JMP SPT2      HOLD I.O. 
* 
      ALF,ALF       CHECK STATUS WORD.
      SSA 
      JMP EOF       END OF FILE.
* 
      STB TEMP2     SAVE THE TRANSMITTED LENGTH 
      LDA STAT1 
      CCE,SSA,RSS   WHAT TYPE OF FILE?
      CPB D1        FIRST REASONABLE NESS TEST ONE WORD 
      JMP RSTAN     STANDARD. 
* 
      LDA IOBUF     OUTSPOOL WITH HEADERS.
      AND B3700     FORM THE CON WORD 
      STA TEMP6 
      LDA STAT2     LU# 
      AND B377
      STA TEMP5     SALT IT AWAY
      LDA IOBUF     GET THE REQUEST CODE
      AND OKBIT     (=B24077) ALL BUT LEAST 2 SHOULD BE 0 
      CCE,SZB       FORCE ZERO LENGTH READS TO FAIL 
      CPA D3        IF CONTROL
      JMP CNTST     GO TRY IT 
* 
      CPA D2        BETTER BE A WRITE 
      RSS           GOOD SHOW GO DO IT
      JMP RSTAN     WRONGLY FLAGGED 
* 
      LDA IOBUF+1   FIGURE FINAL LENGTH OF LINE 
      CCE,SSA       IF CHAR 
      ARS           CONVERT TO WORDS
      SSA 
      CMA,INA 
      ADA D2        SHOULD MATCH THE READ LENGTH IN B 
      CPA B         DOES IT?? 
      JMP OK        YES STILL OK
* 
      CPB D131      COULD BE TOO LONG A LINE  IF SO 
      RSS           USE IT
* 
      JMP REFLG     WRONGLY FLAGGED AS NON STANDARD FILE
* 
      JSB TRUNC     SEND THE RECORD TRUNCATED MESSAGE 
      LDA D128      SET LENGTH TO 128 
      RSS 
* 
OK    LDA IOBUF+1 
      STA TEMP2     SET THE LENGTH
      LDA TEMP6     SAVE THE CONFIGURED STAT WORD FOR EOF 
      RAL,RAL       RECONFIGURE STAT2 
      XOR STAT2     TO SAVE STAT
      AND B374C     UNDER THE RULES 
      XOR STAT2     OF WOO
      STA STAT2 
      LDB BUFR2     GET THE BUFFER ADDRESS
      JMP SEND1 
* 
B374C OCT 37400     HIGH FUNCTION BIT MASK
* 
RSTAN LDB TEMP2     GET TRANSMISSION LOG
      CPB D131      TOO LONG A RECORD?
      RSS           SEND RECORD TRUNCATED MESSAGE 
      JMP REFLG 
* 
      LDB D128      SET LENGTH TO MAX OF 128 WORDS
      STB TEMP2 
      JSB TRUNC     SEND RECORD TRUNCATED MESSAGE 
* 
REFLG LDA STAT2     GET LU WORD 
      AND B374C     MASK FUNCTION BITS 8-13 
      RAR,RAR       SET FUNCTION CODE IN BITS 6-11
      STA TEMP6     SET FOR XLUEX CALL
      LDA STAT1     REFLAG IT 
      ELA,RAR       SET THE STANDARD BIT
      STA STAT1     AND 
      LDB BUFAD     GET THE BUFFER ADDRESS
      LDA STAT2     AND THE CON WORD
SEND1 AND B377      GET THE OUTSPOOL LU 
      STA TEMP5     SET THE CON WORD
      STB BUFFR     AND THE BUFFER ADDRESS
* 
      JSB DOWN?     MAKE SURE NOT DOWN (NO RETN IF SO)
      JSB XLUEX      WRITE A LINE TO
      DEF *+8       A DEVICE. 
      DEF D18 
      DEF TEMP5 
BUFFR BSS 1         BUFFER ADDRESS
      DEF TEMP2     BUFFER LENGTH 
      DEF STAT1     CLASS PARAMETER.
      DEF FLCNT     CLASS PARAMETER.
      DEF SP.CL 
      LDA STAT1     FIRST TIME THROUGH
      ADA C377      DECREASE COUNT OF LINES 
      STA STAT1     SET IT BACK 
      JSB SLCNT 
      LDA STAT1     NEED TO DO ANOTHER
      AND B7400 
      ISZ GETEQ     IF FIRST LINE WAIT FOR COME BACK
      SZA,RSS       IF COUNT DOWN TO ZERO WAIT
      JMP SPT2      YES- BACK TO GET LOOP.
* 
      JMP WRR10     COUNT NOT ZERO AND NOT FIRST LINE 
* 
D8    DEC 8 
D20   DEC 20
D128  DEC 128 
D130  DEC 130 
D131  DEC 131 
ERRMS ASC 8,RECORD TRUNCATED
C377  OCT 177400
B377  OCT 377 
OKBIT OCT 24077 
B7400 OCT 7400
CNTST CPB D2        BETTER BE A TWO WORD RECORD 
      RSS           GOOD SHOW 
      JMP RSTAN     NO GOOD GO RETYPE IT
* 
      JSB DOWN?     NO RETURN IF DOWN DEVICE
      JSB XLUEX      SEND CONTROL REQUEST.
      DEF *+5 
      DEF D19 
      DEF TEMP5 
      DEF IOBUF+1 
      DEF SP.CL 
      JMP WRR10 
* 
WRR4  ADA M1
      LDB A,I       FOUND A RECORD MATCH. 
      BLR,BRS       IS THIS THE SAME ENTRY
      INA 
      CPB ICNWD     WE PICKED UP BEFORE.
      JMP WRR7      YES.
* 
      LDA B         GET THE LU TO A FOR GETEQ 
      JSB GETEQ     NO.  CHECK FURTHER. 
      CCA           GET CURRENT LINE COUNT
      ADA LCNT      FROM THE READ EQT 
      LDA A,I       TO A
      CMA           AND COMPARE 
      ADA B,I       WITH THE WRITE EQT
      SSA,RSS 
      JMP WRR6      WE ARE OK.
* 
      INB           SET UP WRITE EQT
      STB LCNT
      LDA STAT1     OVERLAP FAILED - SET EQT32
      IOR DVCHK     AND EQT33 IN LU OF FILE 
      LDB FLCNT     BEING WRITTEN SO THAT SMD 
      STA STAT1 
      STB STAT2 
      JSB SLCNT     WILL CALL US BACK WHEN IT 
      JMP SPT2      HAS WRITTEN ANOTHER RECORD. 
* 
GETEQ NOP           THIS ROUTINE FINDS US THE 
      ADA M1        EQT ADDRESS CORRESPONDING 
      ADA DRT       TO A GIVEN LU #.
      LDA A,I 
      AND B77 
      ADA M1
      MPY D15 
      ADA EQTA
      ADA D12 
      LDB A,I 
      ADB D15 
      JMP GETEQ,I 
* 
PUT   NOP 
      JSB $LIBR 
      NOP 
      STA B,I 
      JSB $LIBX 
      DEF PUT 
* 
EOF   STB GETEQ     SAVE THE EOF STATUS FLAG
      LDB LCNT
      ADB M3
      CLA 
      JSB PUT       CLEAR THE FLAG SO WILL NOT BELIEVE FURTHER GETS 
      LDA STAT2     END OF FILE.
      AND B377      ISOLATE OUTSPOOL LU.
      STA TEMP1     AND SAVE IT.
      LDB GETEQ     GET THE EOF FLAG
      LDA STAT2     AND THE LAST USED MODE
      AND B400      ISOLATE THE MODE BIT
      SZB           IF GOOD EOF 
      SZA           OR BINARY FILE
      JMP EOF0      SKIP MESSAGE
* 
      JSB DOWN?     DO THE DOWN CHECK 
      JSB XLUEX      SEND THE BAD EOF MESSAGE 
      DEF *+8 
      DEF D18 
      DEF TEMP1 
      DEF EOFER 
      DEF D4
      DEF STAT1 
      DEF STAT2 
      DEF SP.CL 
      JMP EOF1      NOW SEND ALL POSSIBLE EOFS
* 
EOF0  SSB           IF BAD EOF
      JMP EOF1      SEND ALL POSSIBLE EOF'S FOR ALL FILES 
* 
      LDA STAT1 
      SSA,RSS       STANDARD FILE?
      JMP EOF2      NO - HAVE HEADERS.. 
* 
EOF1  LDA B100
      JSB CNTRL     SEND EOF
      LDA B1000 
      JSB CNTRL     SEND LEADER REQUEST 
      LDA B1100 
      JSB CNTRL     SEND TOP OF FORM REQUEST
EOF2  JSB LURQ      UNLOCK THE LU 
      DEF *+4       OF THE OUTSPOOL 
      DEF B60K      JUST COMPLETED. 
      DEF TEMP1 
      DEF D1
      NOP           IGNORE ERROR RETURN 
      LDA STAT1     TELL SMP WE ARE GOOD
      AND B377      AND FINISHED WITH THIS FILE.
      STA TEMP1 
      LDA D12       SEND DEQUE TO SMP 
SMPC  STA SLCNT     SET CALL CODE 
      JSB EXEC
      DEF *+6 
      DEF D24 
      DEF SMP 
      DEF SLCNT     RQ PRAM 
      DEF TEMP1     CURRENT LU
      DEF GETEQ     EOF STATUS
      JMP SPT2
* 
SLCNT NOP 
      JSB $LIBR 
      NOP 
      LDA STAT1 
      LDB STAT2 
      DST LCNT,I
LCNT  EQU *-1 
      JSB $LIBX 
      DEF SLCNT 
* 
CNTRL NOP 
      STA CNWD2     SET THE FUNCTION CODE 
      LDA TEMP1     PICK UP 
      STA ICNWD     AND SET THE LU# IN CONTROL WORD 1 
      JSB DOWN?     CHECK IF DOWN 
      JSB XLUEX      SEND CONTROL REQUEST.
      DEF *+5 
      DEF D19 
      DEF ICNWD     TWO WORD CONTROL WORD 
      DEF M1
      DEF SP.CL 
      JMP CNTRL,I 
* 
DOWN? NOP           TEST FOR DOWN DEVICE
      CCA 
      ADA STAT2     THAN THE LU 
      AND B377      ISOLATE 
      ADA DRT       INDEX INTO THE DRT
      STA B         SAVE FOR LU TEST
      CCA           SET TO GET THE EQT
      JSB $LIBR     GO PRIV TO STOP RACES 
      NOP 
      ADA B,I       EQT NO-1
      AND B77       ISOLATE THE EQ NO.
      CPA B77       IF NO EQT THEN
      JMP DWNEX     GO SENT THE LINE
* 
      ADB LUMAX     INDEX TO LU FLAG
      LDB B,I       IF SIGN SET THEN DOWN 
      SSB           ELSE UP 
      JMP DOWN
* 
      MPY D15       GET EQT ADDRESS 
      ADA EQTA
      ADA D4        TO A
      LDA A,I       GET THE WORD
      RAL,SLA       IF DOWN 
      JMP DWNEX     NOT DOWN EXIT 
* 
      SSA,RSS       SKIP
      JMP DWNEX     ELSE GO EXIT
* 
DOWN  JSB $LIBX     DEVICE IS DOWN
      DEF *+1 
      DEF *+1 
      LDA ICNWD     SET UP TO CALL SMP AND
      STA TEMP1 
      LDA B200      BACK SPACE ON RECORD
      STA TEMP2 
      JSB XLUEX      BACK SPACE IN FILE 
      DEF *+3 
      DEF D3
      DEF TEMP1     TWO WORD CONTROL REQUEST
      LDA D18 
      JMP SMPC      GO NOTIFY SMP TO PUT IN HOLD
* 
DWNEX JSB $LIBX     UP SO 
      DEF DOWN?     GO DO THE CALL
* 
* 
TRUNC NOP           SEND RECORD TRUNCATD MESSAGE
      LDB LCNT
      INB           ADDRESS OF EQT WORD 33
      LDA STAT2 
      RAL,CLE,ELA   BIT 14 IN E REG 
      SEZ,CCE       SET?
      JMP RECER     YES, THEN DO NOT CALL SMP 
* 
      ERA,RAR       SET BIT 14 TO INDICATE SMP CALLED ONCE
      STA STAT2 
      LDA STAT1 
      AND B377      GET THE CURRENT SPOOL LU
      STA TEMP1 
* 
      JSB EXEC      CALL SMP TO SEND RECORD 
      DEF *+5       TRUNCATED MESSAGE 
      DEF D24 
      DEF SMP 
      DEF D20       PARAMETER FOR SMP 
      DEF TEMP1     CURRENT SPOOL LU #
* 
RECER LDA STAT2 
      AND B400      ISOLATE THE MODE BIT
      SZA           IF BINARY SKIP
      JMP TRUNC,I   WRITTING THE MESSAGE
* 
      LDA STAT2 
      AND B377      GET THE OUTSPOOL LU 
      STA TEMP1 
      JSB DOWN?     CHECK IF DEVICE IS DOWN 
* 
      JSB XLUEX     WRITE THE RECORD TRUNCATED
      DEF *+8       MESSAGE TO THE OUTSPOOL DEVICE
      DEF D18 
      DEF TEMP1 
      DEF ERRMS     RECORD TRUNCATED
      DEF D8
      DEF STAT1 
      DEF STAT2 
      DEF SP.CL 
* 
      JMP TRUNC,I   RETURN
* 
*  STORAGE
* 
D4    DEC 4 
B200  OCT 200 
A     EQU 0 
B     EQU 1 
EQTA  EQU 1650B 
DRT   EQU 1652B 
LUMAX EQU 1653B 
SMP   ASC 3,SMP 
EOFER ASC 4, BAD EOF
TEMP1 BSS 1 
TEMP2 BSS 1 
TEMP3 BSS 1 
TEMP5 BSS 1 
TEMP6 BSS 1 
FILNO OCT 100000
FLCNT BSS 1 
STAT1 BSS 1 
STAT2 BSS 1 
LOKOP OCT 100001
NOABT OCT 160001
ICNWD BSS 1 
CNWD2 NOP 
BUFR2 DEF IOBUF+2 
B60K  OCT 60000 
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D10   DEC 10
D11   DEC 11
D12   DEC 12
D15   DEC 15
D18   DEC 18
D19   DEC 19
D21   DEC 21
D24   DEC 24
M1    DEC -1
M2    DEC -2
M3    DEC -3
B77   OCT 77
B100  OCT 100 
B1000 OCT 1000
B1100 OCT 1100
B3700 OCT 3700
DVCHK OCT 10000 
DONT  OCT 20000 
* 
      END SPOUT 
                                                                                                                                  