ASMB,R,L,C,Z   ASSEMBLE STATEMENT FOR RTE IV  
*ASMB,R,L,C,N   ASSEMBLE STATEMENT FOR RTE II 
      IFN 
      HED OUTSPOOL ROUTINE FOR RTE II 
      XIF 
      IFZ 
      HED OUTSPOOL ROUTINE FOR RTE IV 
      XIF 
*     NAME:   SPOUT 
*     SOURCE: 92002-18009 (RTE II)  92067-18079 (RTE IV)
*     RELOC:  92002-16009 (RTE II)  92060-16011 (RTE III) 
*     RELOC:  92067-16028 (RTE-IV)--SRC: 92067-18079 (RTE IV) 
*     PGMR:   A.M.G.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  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.       *
*  ***************************************************************
* 
      IFN 
      NAM SPOUT,1,11 92002-16009 REV. 1740 770810 
      XIF 
      IFZ 
      NAM SPOUT,17,11 92067-16028 REV.1805 780309 
      XIF 
* 
*     ***  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 5-0 = LU # TO READ
* 
*  STAT2   SIGN BIT SET = CHECK OVERLAP CONDITION 
*          SIGN BIT CLEAR = NO OVERLAP CHECK NEEDED 
*          BITS 11-6 = FUNCTION BITS FOR STANDARD FILE
*          BITS 5-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 SP.CL     SPOOL CLASS ID
      EXT .DRCT 
* 
* 
IOBUF BSS 69
* 
      ORG IOBUF 
* 
* 
SPX   CLA 
      STA SPOUT 
      LDA SP.CL 
      IOR DONT
      JSB $LIBR 
      NOP 
      STA SP.CL 
      JSB $LIBX 
      DEF *+1 
      DEF SPT2
* 
      ORR 
* 
SPOUT JMP SPX 
* 
SPT2  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 D69 
      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 B40K
      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 B77 
      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 B77       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 
* 
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  JSB EXEC      READ THROUGH SMD. 
      DEF *+5 
      DEF LOKOP     WITH NO ABORT BIT SET.
      DEF ICNWD 
      DEF IOBUF 
      DEF D69 
      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.
      XOR STAT2     FORM THE CON WORD 
      AND B3700 
      XOR STAT2     UNDER THE RULES OF WOO
      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
* 
      LDA D67 
      CPB D69       COULD BE TOO LONG A LINE  IF SO 
      JMP LONG      USE IT
* 
      JMP RSTAN     WRONGLY FLAGGED AS NON STANDARD FILE
* 
OK    LDA IOBUF+1 
LONG  STA TEMP2     SET THE LENGTH
      LDA TEMP5     SAVE THE CONFIGURED STAT WORD FOR EOF 
      STA STAT2 
      LDB BUFR2     GET THE BUFFER ADDRESS
      JMP SEND1 
* 
RSTAN 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 ALR,ARS       CLEAR THE SIGN BIT
      STA TEMP5     SET THE CON WORD
      STB BUFFR     AND THE BUFFER ADDRESS
* 
      JSB DOWN?     MAKE SURE NOT DOWN (NO RETN IF SO)
      JSB EXEC      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 
* 
D67   DEC 67
C377  OCT 177400
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 EXEC      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 B77       ISOLATE OUTSPOOL LU.
      STA TEMP1     AND SAVE IT.
      LDB GETEQ     GET THE EOF FLAG
      LDA STAT2     AND THE LAST USED MODE
      AND B100      ISOLATE THE MODE BIT
      SZB           IF GOOD EOF 
      SZA           OR BINARY FILE
      JMP EOF0      SKIP MESSAGE
* 
      JSB DOWN?     DO THE DOWN CHECK 
      JSB EXEC      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 B40K      JUST COMPLETED. 
      DEF TEMP1 
      DEF D1
      NOP           IGNORE ERROR RETURN 
      LDA STAT1     TELL SMP WE ARE GOOD
      AND B77       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 
      IOR TEMP1     PICK UP 
      STA ICNWD     AND SET THE CON WORD
      JSB DOWN?     CHECK IF DOWN 
      JSB EXEC      SEND CONTROL REQUEST. 
      DEF *+5 
      DEF D19 
      DEF ICNWD 
      DEF M1
      DEF SP.CL 
      JMP CNTRL,I 
* 
DOWN? NOP           TEST FOR DOWN DEVICE
      CCA 
      ADA STAT2     THAN THE LU 
      AND B77       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 
      IOR B200      BACK SPACE ON RECORD
      STA TEMP2 
      JSB EXEC      BACK SPACE IN FILE
      DEF *+3 
      DEF D3
      DEF TEMP2 
      LDA D18 
      JMP SMPC      GO NOTIFY SMP TO PUT IN HOLD
* 
DWNEX JSB $LIBX     UP SO 
      DEF DOWN?     GO DO THE CALL
* 
*  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 
FILNO OCT 100000
FLCNT BSS 1 
STAT1 BSS 1 
STAT2 BSS 1 
LOKOP OCT 100001
NOABT OCT 140001
ICNWD BSS 1 
BUFR2 DEF IOBUF+2 
B40K  OCT 40000 
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
D69   DEC 69
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 
                                                                                                                        