/SPOOLR.MA SYMBIONT DEMONSTRATION PROGRAM DECEMBER 28,1978 / / / / / / / / / /COPYRIGHT (C) 1977,1978,1979 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /4 OS/78 SPOOLER SYMBIONT VERSION=2 DHRT=7647 /DEVICE HANDLER RESIDENCY TABLE DCWT=7760 /DEVICE CONTROL WORD TABLE TASK=SPOOLR INIWT=0 CUR=30 SPLVER="2 SPLPAT="A /PATCH LEVEL / NORMALLY, QUEUE AND SPOOLER HAVE SAME VERSION NUMBER AND PATCH LEVEL / SEE TAG 'QVER' FOR QUEUE VERSION NUMBER / SPOOLER RUNS UNDER RTS8, ATTENTION SHOULD BE GIVEN TO ADDING CODE / ALMOST THE ENTIRE FIELD IS TAKEN UP BY THE VARIOUS RTS8 TASKS / ALSO, OF NOTE, THE SPOOLER RUNS THE COMMAND DECODER IN "SPECIAL MODE" / THIS TRANSLATES AS REQUIRING SPECIAL ATTENTION WHEN ACCESING THE / INFORMATION STORED BY THE COMMAND DECODER / THIS PROGRAM IS THE CREATION OF STANLEY RABINOWITZ AND TO HIM / WE GIVE FULL CREDIT FOR IT / COMMENTS OF ANY NOTE WERE ADDED BY JOE BRUEN / / CHANGES FOR VERSION 2: -J. BRUEN- / 1. CHANGED THE PROGRAM OVER TO MACREL FROM PAL8 / 2. MADE IT COMPATIBLE WITH LATEST RTS8(DEVICE EXTENSION KIT) / 3. COMMENTED THE SOURCE CODE / 4. ADDED CODE TO PROPERLY HANDLE AN ATTEMPT TO RUN SPOOLER INSTEAD / OF REQUESTING IT. / 5. IMPROVED METHOD OF HANDLING ILLEGAL WILDCARD .START 7700,3 /INITIALIZATIOON FOR SPOOLR SYMBIONT STARTS AT 7700 .ASECT SPL1 /SET UP OF RTS8 TASK MACRO FIELD 3 .TASK SPOOLR .ASECT SPOO /SECTION TO HANDLE SYMBIONT CANCEL FIELD 3 *3 /CCL CANCEL COMMAND BRANCHES HERE JMP I .+1 CANCL /GO PROCESS CANCEL SVER, SPLVER /VERSION SPAT, SPLPAT /PATCH LEVEL .ASECT SPO1 /MAIN SPOOLR CODE STARTS HERE FIELD 3 *1400 START, CLA IAC /SPOOLR STARTS HERE AFTER INTERRUPT DCA EFLAG CAL /RTS8 CALL WAITE /WAITING TO RUN EFLAG /WHEN EFLAG IS POSTED, WE CAN RUN AGAIN SPLOOP, TAD GETPTR /POINTER TO TTY QUE INPUT CIA /PUTPTR USED IN INPUTTING TTY STUFF TAD I (PUTPTR /POINTS TO END OF INPUT SNA CLA JMP START /IF NO MORE FILES ARE PRESENT FOR SPOOLING TAD I GETPTR SNA CLA HLT /INTERNAL ERROR STA DCA I GETPTR /MARK SLOT AS PRINTING NOW ISZ GETPTR TAD GETPTR DCA I (FILPTR /SET UP POINTER TO NAME OF FILE TO BE SPOOLED TAD GETPTR TAD (4 DCA GETPTR /ADVANCE OVER FILE NAME CLA IAC AND I GETPTR DCA RUNI /SET UP RTS8 RX8A MESSAGE INFO TAD RUNI DCA FUNCW /SET UP RTS8 OS8F MESSAGE TAD I GETPTR DCA OPT / OPTION FOR BLOCK LETTER HEADER ISZ GETPTR TAD I GETPTR /MINUS THE NUMBER OF COPIES DCA QCNT ISZ GETPTR ISZ GETPTR /SEVENTH WORD OF INPUT INFO IS BY-PASSED TAD GETPTR TAD (-SPLEND /TEST FOR FULL TTY INPUT BUFFER SZA CLA JMP .+3 TAD (SPLTAB /IF FULL, RESET TTY INPUT BUFFER TO BEGINNING DCA GETPTR TAD I (FILPTR DCA TEMP /STORE POINTER TO FIRST WORD OF FILE NAME TAD I TEMP SNA CLA JMP SPLOOP /IF ZERO,IT WAS DELETED LUP, JMS I (BLOK /GO TEST FOR BLOCK HEADER OPTION TAD I (FILPTR DCA FILP /SET UP POINTER TO FILE NAME FOR RTS8 CALL CAL /RTS8 CALL TO LOOKUP FILE SENDW OS8F LKMSG /MESSAGE INFO STORED AT LKMSG TAD STAT /WHAT IS FILE'S STATUS? SZA CLA JMP FNF /FILE NOT FOUND TAD BLOKK /STARTING BLOCK OF FILE DCA FBLOK /SET UP FOR RX8A READ TAD LEN /LENGTH OF FILE CIA DCA KN /SET UP FOR READ LU, CAL /RTS8 RX8A FILE READ SENDW RX8A RMES /READ INFO STORED AT RMES TAD RSTA /WAS IT A'GOOD' READ? SZA CLA JMP ERR /NOT SO, GO PRINT ERROR MESSAGE DCA I (CTRLZ /CLEAR CTRLZ SUBROUTINE ENTRY JMS I (UNPACK /ROUTINE TO RE-ORGANIZE DATA FOR PRINTING TAD I (CTRLZ /DID WE COME ACROSS END OF FILE? SZA CLA JMP END /THAT'S ALL... ISZ FBLOK /SET UP TO READ MORE OF THE FILE ISZ KN /LIKEWISE JMP LU /DO THE READ END, CAL /OUTPUT TO LPT, END OF FILE SENDW LPT FFMSG /END OF FILE MESSAGE ISZ QCNT /UPDATE # OF COPIES JMP LUP /IF COPY COUNT NON-ZERO, REPEAT OUTPUT STA /FINISHED ALL COPIES TAD FILP /CLEAR ENTRY IN TTY INPUT BUFFER DCA TEMP DCA I TEMP /FREES UP SLOT BY ZEROING FIRST WORD JMP SPLOOP /GO ACCESS NEXT FILE TO BE SPOOLED RMES, ZBLOCK 3 /MESSAGE FOR RX8A CALL RUNI, 0 230 /READ 2 PAGES FILBUF+200 /INTO THIS MEMORY AREA FBLOK, 0 /FROM THIS BLOCK ON RX8A RSTA, 0 /ERROR INDICATOR KN, 0 /FILE LENGTH ERR, /IF ERROR ENCOUNTERED READ RX8A FNF, CAL /IF ERROR LOOKING UP FILE SENDW LPT FNFMSG /ERROR MESSAGE STA DCA QCNT /PRINT MESSAGE BUT ONCE JMP END QCNT, 0 /COUNTER FOR THE NUMBER OF COPIES TEMP, 0 OPT, 0 /HEADER OPTION EFLAG, 0 /RTS8 EVENT FLAG GETPTR, SPLTAB /FILE POINTER LKMSG, ZBLOCK 3 /RTS8 OS8F MESSAGE UNIT, RX8A /DEVICE FOR LOOK-UP FUNCW, 0 /CALL FUNCTION WORD FILP, 0 /POINTER TO FILE NAME STAT, 0 /FILE'S STATUS AFTER LOOK-UP BLOKK, 0 /STARTING BLOCK LEN, 0 /LENGTH OF FILE PAGE /THE 'Q' ROUTINE IS CALLED FROM THE QUEUE ROUTINE /IN FIELD ZERO. IT'S PURPOSE IS TO STORE THE TTY INPUT INFO /(I.E., FILE NAMES, # OF COPIES,ETC.) IN A BUFFER, SPLTAB, /AT MEMORY LOCATION 2000. Q, 0 /CALLED FROM OS/8 TAD (7605 /SET UP POINTER TO COMMAND DECODER TABLE DCA INPTR /FIRST INPUT IS AT 17605, WHEN IN SPECIAL MODE TAD (-5 /SET UP INPUT FILE COUNTER DCA KNT LP, CDF 10 TAD I INPTR /ACCESS INPUT FILE ENTRY CDF CUR SNA JMP RET /IF ENTRY IS ZERO, RETURN TIME TAD (DHRT-1 /IN SPECIAL CD MODE, ONLY DEVICE # IS IN FIRST WORD DCA TEM /DEVICE #, PROVIDES AN INDEX INTO DEVICE HANDLER TABLE CDF 10 TAD I TEM /IN THE TABLE, WE FIND THE HANDLER ENTRY POINT TAD (-7607 /IT SHOULD BE EITHER THE SYSTEM HANDLER, CDF CUR SNA JMP OKU /IF IT IS THE SYS HANDLER, SET UNIT # TO ZERO TAD (7607-FAKRX1 /OR, IT SHOULD BE THE RXA1 HANDLER SZA CLA HLT /NOT RX DRIVE 0 OR 1 CLA IAC /IF IT IS RXA1 SET UNIT # TO ONE OKU, DCA UNI /STORE UNIT NUMBER ISZ INPTR /ACCESS THE INPUT FILE INFO FROM THE CD IOF /DELICATE STUFF TAD I PUTPTR /LOCATE THE FIRST FREE SPACE IN THE BUFFER SZA CLA JMP .-2 /QUEUE IS FULL /*** SHOULD REALLY DO A CTRL/C CHECK HERE CLA IAC DCA I PUTPTR /SET FIRST WORD TO INDICATE FILE PRESENT ISZ PUTPTR TAD (-4 /SET UP COUNTER FOR WORDS IN FILE NAME DCA KON DCA WLDFLG /INITIALIZE '*', '?', ERROR FLAG JMS STO /STORE THE NAME ISZ KON JMP .-2 CDF 10 TAD I (7643 /ACCESS COMMAND DECODER OPTION WORD CMA AND (20 /ISOLATE HEADER OPTION CDF CUR CLL RTR /SITUATE IT IN BIT 0 RTR RTR TAD UNI /PUT UNIT NUMBER IN BIT 11 DCA I PUTPTR / INTO WORD 5 CDF 10 TAD I (7645 /SEE IF WE WANT TWO COPIES OF THE HEADER CDF CUR AND (200 /THIS BIT TELL US CLL RTL RAL TAD I PUTPTR /STORE IT ALSO IN WORD 5 DCA I PUTPTR ISZ PUTPTR CDF 10 TAD I (7646 /ISOLATE THE NUMBER OF COPIES SNA IAC /SET NUMBER TO, AT THE MINIMUM, ONE CIA CDF CUR DCA I PUTPTR /# OF COPIES INTO WORD 6 ISZ PUTPTR DCA I PUTPTR /0 INTO WORD 7 ISZ PUTPTR TAD PUTPTR TAD (-SPLEND /CHECK TO SEE IF WE'RE AT THE END OF THE BUFFER SZA CLA JMP .+3 TAD (SPLTAB /IF SO, RESET POINTER TO THE START DCA PUTPTR ION CIF 0 JMS I (WLDCHK /RETURN TO QUEUE ROUTINE TO CHECK ILLEGALS ISZ KNT /END OF FILE INPUT LINE? JMP LP /IF NOT, LOOP RET, TAD (EFLAG /IF YES, POST EVENT FLAG CAL POST CDF CUR CIF CDF 0 JMP I Q /AND RETURN WLDFLG, 0 /NON-0 MEANS SAW A WILD CARD KON, 0 STO, 0 /ROUTINE TO STORE FILE IN TTY INPUT BUFFER CDF 10 TAD I INPTR /STORE NAME1 CDF CUR DCA I PUTPTR /INTO WORD 1 TAD I PUTPTR CIF CDF 0 JMS I (WILD /RETURN TO QUEUE FOR WILD CARD PROCESSING ISZ WLDFLG /FOUND A WILD ONE(EITHER A "?" OR A "*") ISZ INPTR /INCREMENT POINTERS ISZ PUTPTR JMP I STO /AND RETURN KNT, 0 /INPUT FILE COUNTER INPTR, 0 /POINTER TOO THE COMMAND DECODER INPUT TEM, 0 UNI, 0 /DEVICE UNIT NUMBER STORAGE PUTPTR, SPLTAB /POINTER TO BUFFER PAGE / FORMAT OF SPOOLER TABLE /8-WORD ENTRIES /0 0 IF UNUSED, 1 IF TO BE PRINTED, -1 IF PRINTING NOW /1 NAME1 (0 IF DELETED ENTRY) /2 NAME2 /3 NAME3 (SIXBIT) /4 EXTENSION /5 UNIT IN BIT 11, BIT 0=1 IF WANT BLOCK LETTER HEADER / BIT 1=1 IF WANT 2ND COPY OF BLOCK LETTERS /6 NEGATIVE OF NUMBER OF COPIES DESIRED /7 UNUSED SPLTAB, ZBLOCK 400 SPLEND=. /ENTER WITH AC EQUAL TO THE NEGATIVE OF THE NUMBER OF /CHARACTERS TO BE IN A GROUP (SIDE OF BASIC BLOCK) IN LETTER /THIS SHOULD BE IN THE RANGE 1-3 INCLUSIVE BLKLET, 0 DCA I PGROUP /STORE NEGATIVE TAD FILPTR DCA I PBLKPTR /PRINT CHARS BEGINNING AT NAME1 JMS I POUTBLK /PRINT 6 CHARS (3 WORDS) -3 JMS I POUTBLK /NOW PRINT EXTENSION -1 /2 CHARS (1 WORD) JMP I BLKLET /RETURN PGROUP, GROUP PBLKPTR,BLKPTR POUTBLK,OUTBLK FILPTR, 0 *.&7600+24 BITLST, ZBLOCK 4 1621;2137;2121;2100 /A 3621;2136;2121;3600 /B 1621;2020;2021;1600 /C 3422;2121;2122;3400 /D 3720;2036;2020;3700 /E 3720;2036;2020;2000 /F 1621;2023;2121;1700 /G 2121;2137;2121;2100 /H 1604;0404;0404;1600 /I 0702;0202;0222;1400 /J 2122;2430;2422;2100 /K 2020;2020;2020;3700 /L 2133;2525;2121;2100 /M 2131;3125;2323;2100 /N 1621;2121;2121;1600 /O 3621;2136;2020;2000 /P 1621;2121;2522;1500 /Q 3621;2136;2422;2100 /R 1720;2016;0101;3600 /S 3704;0404;0404;0400 /T 2121;2121;2121;1600 /U 2121;2112;1204;0400 /V 2121;2125;2533;2100 /W 2121;1204;1221;2100 /X 2121;2116;0404;0400 /Y 3701;0204;1020;3700 /Z PAGE GROUP, 0 /NEG OF # OF CHARS PER GROUP BLKPTR, 0 WCOUNT, 0 /NEG OF # OF WORDS TO PRINT LCOUNT, 0 /NEG OF # OF LINES PER LETTER IN BASIC BLOCK RNUM, 0 /NUMBER OF ROWS OF BASIC BLOCKS PER BIG LETTER SAVPT, 0 LETR, 0 /LETTER TO PRINT BITPTR, 0 /POINTS INTO BIT LIST BBITS, 0 BCOUNT, 0 LETT, 0 OUTBLK, 0 /PRINT BLOCK LETTERS / CDF 10 / TAD I BLKPTR / CDF 0 / SNA CLA / JMP OUTLV /HACK TAD BLKPTR DCA SAVPT DCA RNUM BLK3, TAD GROUP DCA LCOUNT BLK1, TAD I OUTBLK /GET NEG NUMBER OF WORDS DCA WCOUNT TAD SAVPT DCA BLKPTR BLK2, TAD I BLKPTR /GET LETTER RTR RTR RTR JMS LSTBLK TAD I BLKPTR JMS LSTBLK /RIGHT HALF ISZ BLKPTR /GO TO NEXT WORD ISZ WCOUNT /DONE WITH ROW? JMP BLK2 /NO JMS I QQCRLF /YES ISZ LCOUNT /DONE WITH GROUP? JMP BLK1 /NO ISZ RNUM /YES, GO TO NEXT ROW TAD RNUM AND (10 SNA CLA /DONE? JMP BLK3 /NO OUTLV, JMS I QQFIN /AN EXTRA CR FOR GOOD LUCK ISZ OUTBLK JMP I OUTBLK QQCRLF, CRLF QQ77, 77 QQFIN, FIN LSTBLK, 0 AND QQ77 /GET 6-BIT LETTER DCA LETR TAD LETR CLL RTL /TIMES 4 (4 WORDS PER LETTER) TAD (BITLST /ADD IN BASE OF BIT LIST DCA BITPTR TAD RNUM CLL RAR /DIVIDE RNUM BY 2 TAD BITPTR /UNITS DIGIT TO LINK DCA BITPTR /GET REAL BIT POINTER TAD I BITPTR /LINK OFF: LEFT HALF, ON: RIGHT HALF SZL JMS I QRTL DCA BBITS TAD (-6 DCA BCOUNT LB2, TAD BBITS /ROTATE LEFT RAL /IMPORTANT BIT TO LINK DCA BBITS SZL TAD LETR /BIT ON: PRINT LETTER, OFF: PRINT SPACE SZL TAD QQ40 AND QQ77 TAD QQ40 DCA LETT TAD GROUP DCA GCOUNT LB3, TAD LETT JMS I QQLISTER ISZ GCOUNT JMP LB3 ISZ BCOUNT JMP LB2 JMP I LSTBLK QRTL, RRTL QQ40, 40 QQLISTER,LISTER DIGS, 1621;2325;3121;1600 /0 0414;2404;0404;3700 /1 1621;0102;1420;3700 /2 3601;0204;0201;3700 /3 0206;1222;3702;0200 /4 3720;3601;0121;1600 /5 0710;2036;2121;1600 /6 3701;0204;1010;1000 /7 1621;2116;2121;1600 /8 1621;2117;0102;3400 /9 IFNZRO DIGS-BITLST-300 <_ERROR_> GCOUNT, 0 PAGE / FILBUF IS THE BUFFER FOR UNPACKING CHARACTERS / ONE BLOCK IS READ FROM THE DEVICE INTO THE / TOP TWO PAGES OF THE BUFFER, UNPACKED AND STORED IN THE / START OF THE BUFFER---HANDLED BY THE ROUTINE UNPACK FILBUF, ZBLOCK 600 0 / LINBUF IS USED AS A BUFFER FOR PRINTING BLOCK / LETTERS IS IS ACCESSED BY THE ROUTINE LISTER / IT IS STORE WITH OUTPUT INFO LINE BY LINE LINBUF, ZBLOCK 210 CRLF, 0 /ROUTINE TO HANDLE CR/LF'S WHEN PRINTING HEADERS DCA I LINPTR CAL /PRINT OUT ENTIRE BUFFER TO LPT SENDW LPT LPMSG /CONTAINS MESSAGE FOTR LPT TAD (LINBUF DCA LINPTR /RESET POINTER JMP I CRLF LINPTR, LINBUF LISTER, 0 /SETS UP INFO IN LINBUF DCA I LINPTR ISZ LINPTR /INCREMENT POINTER JMP I LISTER RRTL, 0 /ROTATE AC SIX BIT TO THE LEFT RTL RTL RTL JMP I RRTL LPMSG, ZBLOCK 3 /RTS8 LPT MESSAGE NOPACK+IND 0 LINBUF FIN, 0 /END OF BLOCK HEADER JMS CRLF /DO ANOTHER PRINT TO BE SURE JMP I FIN /THAT IS IT FFMSG, ZBLOCK 3 /END OF OUTPUT MESSAGE NOPACK+NOCRLF 0 14;0 / ROUTINE, UNPACK, TRANSFORMS FILE DATA FROM 3-2 STORAGE / FORMAT INTO PRINTABLE FORM FOR THE LINE PRINTER / IN 3-2 FORMAT THE THREE CHARACTERS ARE STORED AS FOLLOWS: / CHARACTER 1: BITS 4-11 OF THE FIRST WORD / CHARACTER 2: BITS 4-11 OF THE SECOND WORD / CHARACTER 3: BITS 0-3 OF THE FIRST & SECOND WORD UNPACK, 0 TAD (-200 DCA C /SET UP COUNTER FOR 3-2 PAIRS TAD (FILBUF+200 DCA P1 /SET UP POINTER TO FILE DATA TAD P1 IAC DCA P2 /POINTER TO SECOND WORD TAD (FILBUF DCA P3 /SET UP POINTER TO STORE TRANSFORMED DATA LOOOP, TAD I P1 /SET THE PROCESS IN MOTION JMS STOR /STORE FIRST CHARACTER TAD I P1 /SAVE BITS 0-3 OF THIRD CHARACTER AND (7400 DCA TM /SAVED HERE TAD I P2 /STORE SECOND CHARACTER JMS STOR TAD I P2 AND (7400 /GET SECOND HALF OF THIRD CHARACTER CLL RTR /RE-LOCATE TO ACCOMODATE FIRST THREE BITS RTR TAD TM /ADD IN FIRST THREE BITS RTR RTR JMS STOR /NOW STORE ISZ P1 /INCREMENT POINTERS TO NEXT PAIR ISZ P1 ISZ P2 ISZ P2 ISZ C /INCREMENT COUNTER FOR # OF PAIRS JMP LOOOP /LOOP FOR NEXT PAIR FINY, CAL /FALL HERE AFTER PROCESSING ALL 200 PAIRS SENDW /RTS8 OUTPUT TO THE LPT LPT FILMSG /MESSAGE INFO JMP I UNPACK /GO ACCESS NEXT BLOCK FOR UNPACKING /POINTERS FOR UNPACK P1, 0 P2, 0 P3, 0 C, 0 TM, 0 STOR, 0 /STORE UNPACKED ASCII CHARACTERS AND (177 /ISOLATE RELEVANT BITS TAD (-32 SNA /TEST FOR END OF FILE(CTRLZ) JMS CTRLZ TAD (32 /IF NO EOF, RECLAIM PROPER CHARACTER DCA I P3 /STORE IT AWAY ISZ P3 /INCREMENT STORAGE POINTER JMP I STOR / CTRLZ, WHEN USED INDICATES FOR SSECTION OF CODE / KNOWN AS LU(LOCATED APPROX. 31500) THAT EOF HAS BEEN REACHED CTRLZ, 0 /HANDLES END OF FILE CHARACTER(CTRLZ) DCA I P3 /STORE EOF INDICATOR JMP FINY FILMSG, ZBLOCK 3 /RTS8 LPT WRITE INFO NOPACK+NOCRLF+IND 0 FILBUF FNFMSG, ZBLOCK 3 /LPT ERROR MESSAGE 0 0 TEXT /FILE NOT FOUND/ PAGE / THIS IS THE FAKE RX SYSTEM HANDLER. ALL RX DEVICE CALLS / WHETHER SPOOLER OR OS/8, ARE HANDLED BY THE RTS8 RX TASK / THIS CODE HERE IS MOVED INTO THE SYS HANDLER AREA / IN FIELD ZERO, LOCATION 7607. IT CAUSES THE OS/8 HANDLER CALL INFO / TO BE RELOCATED INTO FIELD THREE... FAKERX, RELOC 7607 FAK, 0 CLA DCA UNITY /CLEAR THE RX UNIT # INDICATOR TAD I FAK /GET THE FUNCTION CONTROL WORD DCA T1 ISZ FAK TAD I FAK /BUFFER ADDRESS DCA T2 ISZ FAK TAD I FAK /GET THE STARTING BLOCK ON THE DEVICE DCA T3 ISZ FAK /POINT TO ERROR RETURN RDF TAD KCIDF /STORE AWAY THE CALLING FIELD DCA FAKRET /AS A CIF CDF FOR RETURN TAD PARG /NOW MOVE THEM IN PLACE FOR RTS8 RX8A CALL DCA PTR CIF CDF 30 TAD T1 /FUNCTION CONTROL WORD DCA I PTR ISZ PTR TAD T2 /BUFFER ADDRESS DCA I PTR ISZ PTR TAD T3 /STARTING BLOCK NUMBER DCA I PTR TAD UNITY DCA I PRXU /SET UP RXA0 AS UNIT CALLED JMS I PSYS /GO DO THE RTS8 REQUEST SNL /ERROR RETURN ISZ FAK /VALID HANDLER CALL RAR FAKRET, HLT /CIF CDF TO CALLING FIELD JMP I FAK PRXU, RXUN PARG, ARG PTR, 0 KCIDF, CIF CDF PSYS, SYS T1, 0 T2, 0 T3, 0 UNITY, 0 / THIS IS THE FAKE RX NON-SYS OS/8 HANDLER / AS FOR THE SYSTEM HANDLER ALL THE APPROPRIATE / INFO IS GIVEN TO OS/8. SEE INITIALIZATION CODE AT 37700. FAKRX1, 0 TAD FAKRX1 /SET UP PROPER RETURN IN FAK ROUTINE DCA FAK CLA IAC /INITIALIZE THE UNIT # TO ONE. JMP FAK+2 /USURP THE SYSTEM CODE RELOC / MOVE ROUTINE'S PRIMARY FUNCTION IS TO MOVE THE FAKE RX HANDLERS / CODE IN AND OUT OF MEMORY WHEN THE SPOOLER IS RUNNING AND / CANCELED. / THE SET-UP INFO IS PASSED TO MOVE FROM THE CALLING ROUTINE MOVE, 0 TAD (-134 /SET UP MOVE COUNTER DCA COUNT TAD I MOVE DCA FROCDF /STORE CDF OF CODE TO BE MOVED ISZ MOVE TAD I MOVE DCA FROPTR /STORE STARTING LOCATION OF CODE TO BE MOVED ISZ MOVE TAD I MOVE DCA TOCDF /STORE CDF OF FIELD OF DESTINATION ISZ MOVE TAD I MOVE DCA TOPTR /STORE STARTING LOCATION OF DESTINATION ISZ MOVE FROCDF, HLT /MOVE LOOP IS SET UP HERE TAD I FROPTR /GET WORD ISZ FROPTR /INCREMENT POINTER TOCDF, HLT DCA I TOPTR /STORE WORD ISZ TOPTR ISZ COUNT /ALL DONE? JMP FROCDF /IF NOT, LOOP CDF 30 /RESET DATA FIELD JMP I MOVE FROPTR, 0 TOPTR, 0 COUNT, 0 / OS/8 RX HANDLER CALLS ARE EXECUTED UNDER RTS8 SYS, 0 CAL SENDW RX8A SYSMSG /DEVICE CALL INFO STORED CLL TAD SYSTAT /CHECK FOR HANDLER ERROR SZA CLA STL /SET ERROR INDICATOR CIF CDF 0 JMP I SYS SYSMSG, ZBLOCK 3 /RTS8 RX8A MESSAGE RXUN, 0 /UNIT INFO ARG, ZBLOCK 3 /3 ARGUMENTS SYSTAT, 0 /ROUTIUNE TO CHECK BLOCK HEADER OPTION AND PROCESS IT / IF NEED BE. HEADER IS A DEFAULT OPTION BLOK, 0 TAD I (OPT /CHECK OPTION SWITCH SMA CLA JMP I BLOK / /H MEANS NO HEADER TAD (-3 JMS I (BLKLET /OUTPUT HEADER CAL SENDW /PRINT END OF FILE MESSAGE LPT FFMSG /MESSAGE INFO TAD I (OPT /CHECK FOR OPTION FOR SECOND COPY OF HEADER RAL SMA CLA JMP I BLOK TAD (-3 JMS I (BLKLET /IF OPTION IS PRESENT PRINT AGAIN CAL SENDW LPT FFMSG JMP I BLOK PAGE /LOCATIONS 6000-6134 ARE USED TO STORE THE OS/8 /SYSTEM HANDLER WHILE THE SPOOLER IS RUNNING /ALL DEVICE CALLS ARE HANDLED UNDER RTS8 .ASECT SPOO3 FIELD 3 *6000 ZBLOCK 134 .ASECT SPOO4 FIELD 3 *7640 /CANCL IS THE CODE TO PROCESS THE CCL COMMAND / CANCEL. IT'S TASK IS TO REPLACE THE SYSTEM HANDLER / AND ALSO, CLEAR THE HANDLER RESIDENCY INFO, WHICH / WAS ALTERED BY THE SPOOLER CANCL, IOF CAF /CLEAR FLAGS CDF 30 JMS I TMOVE /RELOAD SYSTEM HANDLER CDF 30 /MOVE INFO 6000 /MOVE FROM HERE CDF 0 7607 /TO HERE CDF 10 /TIME TO RESET RXA0,RXA1 HANDLERS DCA I RX0 /ZERO RXA0 ENTRY POINT---SIGNIFIES NON-RESIDENCY DCA I RX1 /RXA1 ENTRY POINT, LIKEWISE... CIF CDF 0 JMP I T7605 /RETURN TO OS/8 RUNERR, CIF CDF 0 /ERROR IF YOU "R" SPOOLR INSTEAD OF "REQ" JMP I .+1 PRNR RX1, 0 RX0, 0 TMOVE, MOVE T7605, 7605 / CCL REQ COMMAND ENTERS SPOOLER CODE AT THIS POINT / INITIALIZATION CONSISTS OF SETTING UP FAKE RX DEVICE HANDLERS / I.E., REPLACING SYS HANDLER, ALTERING THE DEVICE HANDLER RESIDENCY / TABLE IN FIELD ONE *7700 JMP RUNERR /ENTRY POINT TO SPOOLR CLA /CAN RUN OR CHAIN TO SPOOLR CDF 30 CIF 10 JMS I T7700 /CALL USR 10 /LOCK USR INTO MEMORY JMS I TMOVE /STORE OS/8 SYS HANDLER IN 6000 CDF 0 /INPUT INFO FOR MOVE S7607, 7607 CDF 30 6000 /SAVE AWAY ORIGINAL SYSTEM HEAD JMS I TMOVE /LOAD IN FAKE HANDLER CDF 30 /INPUT INFO FOR MOVE FAKERX CDF 0 7607 /STORE IN FAKE RX SYSTEM HANDLER TAD T17 /SET UP COUNTER TO STEP THRU DHRT DCA K CDF 10 TAD I DNTBL DCA H /SET UP POINTER TO TABLE L, TAD I H /STEP THRU TABLE TO ISOLATE RXA0,RXA1 TAD NRXA1 /IS IT RXA1? SNA JMP SETRX1 /SET RXA1 ENTRY POINT IAC /IS IT RXA0? SNA CLA JMP SETRX0 /SET RXA0 ENTRY POINT RSET, ISZ H /INCREMENT POINTER ISZ K /ARE WE THRU THE ENTIRE TABLE? JMP L /NOPE, SO LOOP... CDF CUR JMP I T200 /START UP RTS/8 SETRX1, JMS RXTST /CALCULATE POINTER INTO DHRT TAD TAKRX1 /RXA1 ENTRY POINT DCA I TMP /STORE INTO DHRT TAD TMP DCA RX1 /SAVE POINTER FOR CANCL JMP RSET SETRX0, JMS RXTST TAD S7607 /RXA0 HAS SAME ENTRY POINT AS SYS DCA I TMP /STOR INTO THE DHRT TAD TMP DCA RX0 /SAVE FOR CANCL JMP RSET RXTST, 0 TAD I DNTBL /GET THE TABLE ORIGIN CIA TAD H /THIS WILL GIVE US THE OFFSET INTO THE TABLE TAD TDHRT /ADDED TO THE ORIGIN OF THE DHRT DCA TMP /GIVES US A POINTER TO THE HANDLER ENTRY POINT JMP I RXTST T17, -17 DNTBL, 36 /POINTER TO PERMANENT DEVICE NAME TABLE T7700, 7700 TAKRX1, FAKRX1 T200, 200 NRXA1, -6411 /MINUS THE STORED NAME FOR RXA1 TDHRT, DHRT K, 0 H, 0 TMP, 0 / THIS SECTION EFFECTIVELY BLOCKS OUT LOWER FIELD ZERO FROM BEING / LOADED WITH RELOCATABLE RTS8 TASKS .ASECT SPOO2 FIELD 0 *3 /FIRST THREE LOCATIONS OF FIELD ZERO PROTECTED /MUST MAINTAIN SYMBIONT INTERRUPT CODE ZBLOCK 1775 PAGE / THIS IS THE QUEUEING ROUTINE. IT LOADS INTO FIELD ZERO / LOCATIONS 2000-3377. IT IS CALLED BY THE CCL COMMAND / QUE. IT INTERACTS QUITE HEAVILY WITH THE SPOOLER / IN SETTING UP THE INPUT FILE INFO. .ASECT SPOK FIELD 0 *2000 QUEUE, SKP /NON-CHAINED ENTRY-CALL COMMAND DECODER JMP NOCD /CHAINED TO ENTRY JMS CHECK /CHECK THAT SPOOLER IS RUNNING QUEUE2, CIF 10 /USR CALL FOR THE COMMAND DECODER JMS I (200 5 /CD 5200 /SPECIAL MODE NOCD, JMS CHECK /VERIFY THAT SPOOLER IS RUNNING CIF CDF 30 JMS I (Q /JUMP TO SPOOLER TO STORE INPUT INFO CLA IAC AND LOPTION /CHECK FOR VERSION LISTING OPTION SZA CLA JMS I (LISTY /IT'S THERE, DO A /L OPTION CDF 10 TAD I (7642 /CHECK COMMAND DECODER TO SEE IF WE ALT MODED... CDF 0 SMA CLA /RETURN TO KBM? JMP I (7605 /YES JMP QUEUE2 /NO, GET SOME MORE INPUT / CHECK TESTS FOR L OPTION-- VERSION LISTING / ALSO, VERIFIES SYMBIONT RUNNING CHECK, 0 CDF 10 /ACCESS COMMAND DECODER INFO CLA IAC AND I (7643 /IS L OPTION SET? CDF 0 SZA CLA /SKIP IF NOT SET JMS VERS /PRINT QUEUE VERSION CDF 10 TAD I (7643 DCA LOPTION /SAVE INFO ABOUT /L CLL STA RAL /7776 AND I (7643 DCA I (7643 /GET RID OF /L BIT TAD I (7726 /IS SYMBIONT BIT SET CDF 0 AND (4 /TEST FOR IT SZA CLA JMP RUNING /SOME SYMBIONT IS RUNNING - HOPE IT'S SPOOLER PRNR, JMS I (PRINT /PRINT NOT RUNNING NR JMP I (7605 RUNING, CLA IAC AND LOPTION /IS LISTING OPTION SET? SNA CLA JMP I CHECK /IF NOT RETURN JMS I (PRINT /PRINT SPOOLER VERSION SV CDF 30 TAD I (SVER /PRINT ACTUAL VERSION NUMBER CDF 0 JMS I (TYPE CDF 30 TAD I (SPAT /PRINT PATCH LEVEL CDF 0 JMS I (TYPE JMS I (CRLFF /DO A COUPLE OF CARRAIGE RETURN, LINE FEEDS JMS I (CRLFF JMP I CHECK VERS, 0 /PRINT QUE VERSION HEADING JMS I (PRINT VR JMP I VERS LOPTION,0 PAGE / PRINT HANDLES A STRING OF CHARACTERS TO BE PRINTED PRINT, 0 TAD I PRINT /GET PTR TO STRING TO BE PRINTED DCA SPTR ISZ PRINT /ISOLATE FIRST CHARACTER PRLUP, TAD I SPTR SNA /ZERO INDICATES END OF STRING JMP I PRINT /RETURN TO CALLING ROUTINE JMS TYPE /PRINT CHARACTER ISZ SPTR /POINT TO NEXT CHARACTER JMP PRLUP /CONTINUE PRINTING SPTR, 0 TYPE, 0 /ROUTINE TO PRINT SINGLE CHARACTERS TLS /LOAD CHARACTER IN TO TTY PRINT BUFFER TSF /LOOP UNTIL PRINTED JMP .-1 CLA KSF /WAS THERE ANY TTY INPUT? JMP I TYPE /NO CTRLS, TAD (200 /TEST FOR CONTROL C KRS /READ INPUT BUFFER TAD (-203 SNA /IF ZERO, GET OUT JMP CTRLC TAD (203-223 /OTHERWISE, TEST FOR CTRL/S SZA CLA /IF CTRL/S, LOOP JMP I TYPE /OTHERWISE, RETURN JMP CTRLS CTRLC, JMP I (7605 /EXIT TO MONITOR / ROUTINE WILD TESTS FOR '*' AND '?' CHARACTERS / ILLEGAL INPUT CHARACTERS UNDER COMMAND DECODER / IN SPECIAL MODE. WILD, 0 DCA WTEM /STORE WORD TAD WTEM JMS WCHK /DO ACTUAL WILD CARD CHECK TAD WTEM /TEST SECOND CHARACTER(STORED SIX-PACK) RTR RTR RTR /ROTATE TO FIRST SIX BITS JMS WCHK /DO CHECK ISZ WILD /SET RETURN FOR NO WILD CARD WLDRET, CIF CDF 30 /RETURN TO SPOOLR JMP I WILD WTEM, 0 WCHK, 0 /TEST FOR ILLEGAL CHARACTERS AND (77 TAD (-77 SNA JMP WLDRET /FILENAME CONTAINS A ? TAD (77-52 SNA CLA JMP WLDRET /FILENAME CONTAINS A * JMP I WCHK / WLDCHK IS CALLED FROM SPOOLR / AFTER STORING INFO ABOUT FILE, THIS ROUTINE IS CALLED BY SPOOLR / TO PRINT ERROR MESSAGE IF A WILD CARD WAS FOUND WLDCHK, 0 CDF 30 TAD I (WLDFLG /WAS THERE A WILD CARD CDF 0 SZA CLA /IF SO, PRINT ERROR MESSAGE JMS WLDERR CIF CDF 30 /RETURN TO SPOOLR JMP I WLDCHK REPTR, 0 WLDERR, 0 /PRINT WILD CARD ERROR MESSAGE JMS I (PRINT WE /LOCATION OF ERROR MESSAGE CIF CDF 30 TAD I (PUTPTR TAD (-3 /ZERO OUT THE HEADING INFO DCA REPTR DCA I REPTR JMP I WLDCHK WE, 215;212 "?;" ;"-;" ;"I;"l;"l;"e;"g;"a;"l;" ;"*;" ;"o;"r;" ;"? 215;212;0 CRLFF, 0 / ROUTINE TOO HANDLE CARRAIGE RETURN-LINE FEED TAD (215 /CARRAIGE RETURN JMS TYPE TAD (212 /LINE FEED JMS TYPE JMP I CRLFF PAGE / THIS ROUTINE IS CALLED TO PRINT THE NAMES OF THE FILES / WHICH ARE IN THE QUEUE. THIS ONLY OCCURS WHEN THE LIST / OPTION IS USED. PNAME, 0 /PRINT NAME /POINTER IN AC POINTS TO FIELD 3 DCA PNPTR /PRINT NULLS AS SPACES TO MMAKE THINGS LINE UP JMS PR6 /PRINT FIRST TWO CHARACTERS IN NAME JMS PR6 /PRINT SECOND TWO JMS PR6 /PRINT THIRD TWO CDF CUR TAD I PNPTR /PRINT PERIOD IF EXTENSION IS PRESENT CDF 0 SZA CLA /IS EXTENSION PRESENT? TAD (".-40 /IF SO, FORM A PERIOD(256) TAD (40 /IF NOT, PRINT A SPACE(TTY ACCEPTS 6 BIT CHAR.) JMS I (TYPE JMS PR6 /PRINT EXTENSION CHARACTERS JMP I PNAME PR6, 0 /ADJUSTS CHARACTERS FOR PRINTING CDF CUR TAD I PNPTR /GET WORD(TWO CHARACTERS/WORD) RTR /FIRST CHARACTER IN HIGHER BITS RTR RTR JMS PBYTE /PRINT IT CDF CUR TAD I PNPTR /ACCESS WORD AGAIN JMS PBYTE /PRINT SECOND CHARACTER ISZ PNPTR /POINT TO NEXT TWO CHARACTERS JMP I PR6 PBYTE, 0 /PREPARES SIX BIT CHARACTERS FOR PRINTING CDF 0 AND (77 /ISOLATE RELEVANT BITS SNA /IF ZERO, SET TO 40(SPACE CHARACTER) TAD (40 TAD (40 AND (77 /ULTIMATELY WANT SEVEN RELEVANT ASCII BITS TAD (40 /BY THIS TIME WE HAVE IT JMS I (TYPE JMP I PBYTE PNPTR, 0 PAGE SV, ",;40;40;40;40 "S;"P;"O;"O;"L;"E;"R;" ;"V;"e;"r;"s;"i;"o;"n;40 0 NR, 215;212 "?;" ;"-;" ;"S;"p;"o;"o;"l;"e;"r;" ;"n;"o;"t;" ;"r;"u;"n;"n;"i;"n;"g 215;212 0 VR, 215;212 QVER, "O;"S;"/;"7;"8;" ;"Q;"U;"E;"U;"E;" ;"V;"e;"r;"s;"i;"o;"n;" ;"2;"A 0 PAGE / LISTY IS CALLED AS A RESULT OF THE LIST OPTION BEING SET / WHEN THE CCL COMMAND QUE IS GIVEN LISTY, 0 /PERFORM A STATUS REPORT DCA QQCNT /CLEAR FILES PRESENT INDICATOR FLAG CDF CUR TAD I (GETPTR /GET POINTER TO FILE NAME BUFFER DCA GPTR TAD (-40 DCA GCNT /SET UP # OF FILES COUNTER GLUP, CDF CUR TAD I GPTR /GET ENTRY 0 CDF 0 SNA JMP GINCY /FIRST ENTRY = 0, INDICATES EMPTY IAC /FIRST ENTRY = -1, INDICATES PRINTING SNA CLA TAD ("*-40 TAD (40 DCA RXM /PRINT * IF PRINTING NOW ISZ QQCNT /INDICATES QUE NOT EMPTY ISZ GPTR /POINTS TO 4 WORDS OF FILE NAME TAD GPTR TAD (4 DCA GOPTR /POINTS TO OPTION WORD CLA IAC CDF CUR AND I GOPTR /GET UNIT TAD ("0 DCA GUNIT CDF 0 JMS I (PRINT RXM /EITHER A SPACE OR A *(INDICATES ACTIVE) TAD GPTR JMS I (PNAME /PRINT NAME TAD GOPTR DCA GPTR /SET UP POINTER TO OPTION WORD CDF CUR TAD I GPTR CDF 0 SMA CLA /CHECK HEADER OPTION JMS PHDR /PRINT NO HEADER CDF CUR TAD I GPTR /CHECK SECOND HEADER OPTION CDF 0 RAL SPA CLA JMS PP2 /TWO HEADER OPTION IS SET ISZ GPTR CDF CUR CLA IAC TAD I GPTR /GET NUMBER OF COPIES CDF 0 SZA JMS PCOP ISZ GPTR /POINT TO UNUSED WORD ISZ GPTR /POINT TO NEXT ENTRY JMS I (CRLFF GINCM, TAD GPTR /TEST FOR END OF BUFFER TAD (-SPLEND SZA CLA /IF ZERO, END OF BUFFER JMP .+3 TAD (SPLTAB /RESET POINTER TO BEGINNING OF BUFFER DCA GPTR GINC, ISZ GCNT /INCREMENT # OF FILES COUNTER JMP GLUP /IF NOT YET 40 CONTINUE PRINTING TAD QQCNT /IF WE'VE LOOPED THRU ,TEST FOR EMPTY BUFFER SZA CLA JMP I LISTY /IF FILES WERE FOUND, RETURN TO CALLER JMS I (PRINT EMPTY /PRINT EMPTY MESSAGE IF NONE FOUND JMP I LISTY GCNT, 0 GPTR, 0 GOPTR, 0 RXM, 40;40;"R;"X;"A GUNIT, "0;":;0 GINCY, TAD GPTR /IF FILE INDICATOR IS ZERO TAD (10 /WE WANT TO JUMP TO NEXT INDICATOR DCA GPTR /SO, WE ADVANCE THE POINTER JMP GINCM / ROUTINE TO PRINT THE NUMBER OF COPIES DURING LIST OPTION / ENTER WITH NEGATIVE OF THE NUMBER OF COPIES PCOP, 0 TAD (-1 CIA DCA PTEM JMS I (PRINT SCOP /PRINT COPIES HEADER TAD PTEM JMS I (PNUM /PRINT NUMBER JMP I PCOP PTEM, 0 SCOP, "/;"C;"O;"P;"I;"E;"S;":;0 PHDR, 0 /PRINTS NO HEADER MESSAGE JMS I (PRINT PH JMP I PHDR PP2, 0 /PRINTS TWO HEADER OPTION JMS I (PRINT P2H JMP I PP2 QQCNT, 0 PAGE PH, "/;"N;"O;"H;"D;"R;0 P2H, "/;"2;0 EMPTY, 215;212 "Q;"u;"e;"u;"e;" ;"i;"s;" ;"e;"m;"p;"t;"y 0 / THIS ROUTINE PRINTS NUMBER OF COPIES OPTION / THE ROUTINE IS ENTERED WITH THE NUMBER IN THE AC / THE NUMBER OF COPIES IS IN OCTAL PNUM, 0 DCA PTEM2 /INITIALIZE TEMPS DCA SETFLG TAD (-4 DCA HIKNT LOOPIE, TAD PTEM2 ISZ HIKNT /COUNTER FOR DIGITS, MAXIMUM IS FOUR JMS ROTIT /NEEDS ROTATING(UNLESS LAST GROUP) AND (7 /ISOLATE RELEVANT BITS SZA /ARE THERE ANY BITS SET AMONGST THE THREE? ISZ SETFLG /IF SO, SET FLAG DCA WRTMP /STORE DIGIT... TAD SETFLG /HAS FLAG BEEN SET? SNA CLA JMP LOOPIE /IF NOT, LOOP TAD WRTMP /IS SO, PRINT IT TAD ("0 /ADJUST FOR ASCII JMS I (TYPE TAD HIKNT /PRINTED ALL THE DIGITS? SZA CLA JMP LOOPIE /NOT YET JMS I (PRINT /PRINT OCTAL MESSAGE OCT JMP I PNUM ROTIT, 0 /ROUTINE TO ADJUST DIGIT TO PROPER SPOT FOR PRINTING CLL CLA TAD HIKNT /COUNTER FOR DIGIT, IS A GOOD INDICATOR DCA NCNT /FOR THE NUMBER OF ROTATES TAD PTEM2 /GET NUMBER REPT, RTR;RAR ISZ NCNT /ENOUGH ROTATES? JMP REPT JMP I ROTIT /ENOUGH IS ENOUGH... OCT, "(;"o;"c;"t;"a;"l;");0 SETFLG, 0 NCNT, 0 WRTMP, 0 PTEM2, 0 HIKNT, 0 PAGE .ASECT SPOOX FIELD 0 *3400 ZBLOCK 4200 PAGE