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