TITLE UNSPOOLER DEMON PROGRAM FOR TPL DEVICE (MB) 6 APR 72 ; RVSD (JFH) 31 JAN 75 ;;; WEDNESDAY SEPT 15,1976 17:06:29 ; load as command under MONIT, will disown itself, ; print files on the TPL, and then commit suicide ; MODIFIED 9/23/75 (PDL) TO MAKE LOGGING IN WORK AND TO ELIMINATE ; PAIN OF CHANGING LPT NUMBER OR SPOOLING DIRECTORY. ; Modified 8/19/80 (SWG) to avoid printing binary files by simulating EOF ; if bufferful is more than 10% non-formatting control characters. VERSIO==.FNAM2 .MLLIT==1 .XCREF A,B,C,D,E,P IF1 [ PRINTX / (CR) FOR DEVICE LPT, nn FOR Tnn / .TTYMAC N IFSN N,,LPTNUM==(SIXBIT /T!N/) IFSE N,,LPTNUM==(SIXBIT /LPT/) TERMIN PRINTX /(CR) FOR .LPTR. DIRECTORY, OR TYPE NEW NAME / .TTYMAC D IFSN D,,SPLDIR==SIXBIT /D/ IFSE D,,SPLDIR==SIXBIT /.LPTR./ TERMIN ];IF1 ;NOTE!!! -- FOR DEBUGGING SET LOCATION "DEBUG" NON-ZERO ;AND OUTPUT WILL GO TO TTY:, AND WILL NOT PROCEED, ETC. ;ACCUMULATOR DEFS A=1 B=2 C=3 D=4 E=5 COLUMN=6 MARKER=7 P=17 ;IO CHANNELS TPLI=12 ;TPL FILE INPUT LPTO=13 ;LPT OUTPUT ERRI=15 ;ERR DEVICE INPUT DSKO=16 ;LIST OF USERS ;FILE DIRECTORY DEFINITIONS .INSRT SYSTEM;FSDEFS > LOC 42 JSR TSINT LOC 100 LPTOPN: %TJSIO+.UIO,,LPTNUM ;SUPER-IMAGE STRING-IOT SIXBIT /SPOOLROUTPUT/ BEG: .CLOSE 1, ;FOR DAEMON BOOTSTRAP .SUSET [.SMASK,,[%PIIOC]] ;BIT 1.9 IS I/O CHAN ERR MOVEI P,PDL .SUSET [.SSNAM,,[SPLDIR]] .FDELE LPTDEL ;DELETES A LINK FOR LPT STATE - "~~~THE LPT~IS" JFCL ;LINK CREATED IF OOPEN FAILS (LPT CHANNEL OUTPUT) MOVEI A,LPTOPN SKIPE DEBUG' MOVEI A,[.UAO,,'TTY ? 'SPOOLR ? 'OUTPUT] .DEMON ;GET ONE REQUEST HERE, SO FAILING LPT WILL NOT HANG IN LOOP JFCL ;LOGGING OUT, STARTING UP, GETTING LPT LOSS, LOGGING OUT &C&C PUSHJ P,OOPEN JRST NOLPT SKIPE DEBUG' JRST NOVALU ;FOR DEBUGGING DON'T DISOWN, ETC. .SUSET [.RINTB,,B] ;GET -1,,0 IF TOP LEVEL, DO NOT DO .VALUE SKIPL B .VALUE [ASCIZ /:PROCEDî:DISOWNî/] NOVALU: .SUSET [.RUNAME,,B] ;GET LOGIN NAME HRRI B,-1 AOJN B,RDNAM ;WAS NOT -1, ALREADY LOGGED IN .CALL LOGIN JFCL ;DO I CARE? ;FALL THRU WHEN LOGGED IN RDNAM: .SUSET [.SSNAM,,[SPLDIR]] MOVEI A,[SIXBIT / &DSK.FILE.(DIR)/] ;IMAGE MODE PUSHJ P,IOPEN JRST NOTPL ;NO DIRECTORY, FLUSH ;READ IN ENTIRE DIRECTORY MOVE A,[-2000,,DIRBUF] .IOT TPLI,A ;READ DIR .CLOSE TPLI, ;CLOSE DIR CHANNEL HLRES A ADDI A,2000 ;AMOUNT WE GOT JUMPE A,NOTPL MOVEM A,DIRLNT ;SCAN DIRECTORY, AND DIE IF NO FILES TO PRINT MOVE A,DIRBUF+UDNAMP ADDI A,DIRBUF ;ADDRESS OF NAME AREA SKIPA FSCNXT: ADDI A,LUNBLK MOVE 0,DIRLNT ADDI 0,DIRBUF CAML A,0 JRST NOTPL ;NO FILES FOUND TO PRINT SKIPN UNFN1(A) ;FILE NAME? JRST FSCNXT ;NO, LOOK AT NEXT MOVE 0,UNRNDM(A) TLNE 0,UNIGFL ;PRINTABLE? JRST FSCNXT ;NO, TRY NEXT LDB 0,[UNPKN] ;ON PACK 0? JUMPE FSCNXT ;MUMBLE BLETCH! MOVE 0,UNFN1(A) CAME 0,[SIXBIT /DONT/] JRST STRSCN MOVE 0,UNFN2(A) CAME 0,[SIXBIT /DELETE/] JRST STRSCN SETZM UNDATE(A) JRST FSCNXT ;SCAN DIR FOR LEAST FILE CREATION DATE, AND TRY TO ;PRINT IT STRSCN: MOVE A,DIRBUF+UDNAMP ;ADDRESS OF NAME AREA ADDI A,DIRBUF MOVEI B,0 ;"POINTER" TO BEST FILE SO FAR DIRSCN: MOVE 0,DIRLNT ADDI 0,DIRBUF CAML A,0 ;AT END OF DIR?? JRST PRTBST ;YES, GO PRINT BEST MOVE 0,UNRNDM(A) ;SEE IF FILE IS TO BE IGNORED TLNE 0,UNIGFL JRST NXTENT IF2, .ERR SOMEDAY, FIX PACK 0 PROBLEM, DELETE NEXT 2 LINES, AND SAME ABOVE LDB 0,[UNPKN 0] JUMPE 0,NXTENT ;PACK 0 PROBLEM SKIPN C,UNDATE(A) JRST NXTENT ;ENTRY NOT GOOD MOVE 0,UNFN1(A) CAME 0,[SIXBIT /DONT/] JRST TIMCHK MOVE 0,UNFN2(A) CAMN 0,[SIXBIT /DELETE/] JRST NXTENT ;IGNORE "DONT DELETE" TIMCHK: SKIPE B ;NO BEST YET -> TAKE THIS ONE CAMGE C,UNDATE(B) ;BETTER?? MOVE B,A ;YEP NXTENT: ADDI A,LUNBLK JRST DIRSCN ;PRINT HEADER FOR DATE/TIME/FILE, ETC. PRTBST: JUMPE B,RDNAM ;TRY AGAIN READ DIRECTORY SETZM UNDATE(B) ;INDICATE PRINTING BEING DONE MOVE 0,UNFN1(B) MOVEM 0,NAME MOVE 0,UNFN2(B) MOVEM 0,NAME+1 MOVE 0,NAME CAMN 0,[SIXBIT /____XX/] ; SPOOLED FILE FROM XX? JRST [MOVSI A,20 ; PRINT WITHOUT HEADER ANDCAM A,TPLNAM MOVEI A,TPLNAM PUSHJ P,IOPEN JRST NOPRT ;OPEN FAIL PUSHJ P,OFF ; BLANK PAGE JRST COPYST] PUSHJ P,OCR PUSHJ P,OFF PUSHJ P,OSTARS MOVEI A,[ASCIZ / Line-printer output for: /] PUSHJ P,OMESS .CALL [SETZ SIXBIT /OPEN/ [20,,TPLI] [SIXBIT /DSK/] TPLNAM+1 SETZ TPLNAM+2] JRST OLDBIG ;CAN'T OPEN FILE, NAME WILL NOT MATTER .CALL [SETZ SIXBIT /RAUTH/ MOVEI TPLI SETZM A] JRST OLDBIG ;CAN'T READ AUTHOR, GET NM2 AND HOPE JUMPE A,OLDBIG CAMN A,[-1] JRST OLDBIG ;AUTHOR IS RANDOM, HOPE NM2 IS A WINNER CAMN A,[SIXBIT /.BATCH/] JRST OLDBIG ; IF AUTHOR IS .BATCH, THERE MAY BE A GOOD SECOND NAME .CLOSE TPLI, JRST DOBIGP OLDBIG: MOVE A,NAME+1 DOBIGP: PUSHJ P,OBIG MOVSI A,20 ;OPEN LINK MODE IORM A,TPLNAM MOVEI A,TPLNAM PUSHJ P,IOPEN JRST NOPRT ;OPEN FAIL MOVS A,UNRNDM(B) ;RANDOM BITS FROM DIRECTORY ANDI A,UNLINK JUMPE A,PRTFIL ;JUST A FILE, NOT A LINK MOVEI A,[ASCIZ / Queued link: /] PUSHJ P,OMESS PUSHJ P,ONAME PUSHJ P,OCRLF MOVSI A,20 ANDCAM A,TPLNAM MOVEI A,TPLNAM PUSHJ P,IOPEN JRST NOPRT ;OPEN FAIL PRTFIL: MOVEI A,[ASCIZ / Queued file: /] PUSHJ P,OMESS PUSHJ P,ONAME MOVEI A,[ASCIZ " ("] PUSHJ P,OMESS MOVE A,ICHARS PUSHJ P,OFIX MOVEI A,[ASCIZ " characters)"] PUSHJ P,OMESS MOVEI A,[ASCIZ / Printed by UNSPOOLER generation /] PUSHJ P,OMESS MOVE A,[.FNAM2] ;VERSION NUMBER PUSHJ P,OSIX MOVEI A,[ASCIZ /, at /] PUSHJ P,OMESS .CALL [SETZ ? 'RQDATE ? SETZM A] MOVNI A,1 PUSHJ P,ODATE PUSHJ P,OCRLF PUSHJ P,OCRLF PUSHJ P,OSTARS PUSHJ P,OFF ;END OF HEADER, NOW DO FILE COPY COPYST: MOVEI A,60. MOVEM A,LINES' ;A COUNTER FOR LINES ON PAGE. SETZB COLUMN,MARKER COPY: PUSHJ P,IIOT ;GET CHAR JRST NOEOF ;TRY TO READ PAST END OF FILE, NO ^C COPYA: CAIN A,177 ;SPECIAL CTL CHAR IS RUBOUT JRST OUTCTL ;OUTPUT AS RUB ? (© CAIL A,40 ;SKIP IF CONTROL CHAR, ASCII < 40 JRST OUTOK ;JUMP TO OUTPU NORMAL PRINTING > 40 JRST @OUTAB(A) ;DISPATCH FOR CONTROL CHARACTERS OUTAB: REPEAT 10,OUTCTL ;   ^C     BS ;^H BACKSPACE TAB ;^I TAB LF ;^J LINE FEED VT ;^K DOES LF OVER FOLD ON PAPER FF ;^L FORM FEED CR ;^M CARRIAGE RETURN REPEAT 12,OUTCTL ;          CTLX ; SPECIAL KLUDGE TO MAKE SAIL UNDERBARS COME OUT REPEAT 2,OUTCTL ALT ;ESCAPE  REPEAT 4,OUTCTL ;    SPACE ; KLUDGE FOR SAIL UNDERBAR (CTL-X) CTLX: MOVEI A,"_ JRST OUTOK OUTCTL: PUSH P,A MOVEI A,177 ;LPT UP ARROW PUSHJ P,OUTMARK ;OUTPUT IT POP P,A ;RESTORE CHAR TRC A,100 OUTOK: PUSHJ P,OUTMARK ;OUTPUT THE CHAR JRST COPY TAB: TRO COLUMN,7 SPACE: AOJA COLUMN,COPY VT: PUSHJ P,OUTLINE SOS A,LINES ;VT IS CHAR WHICH WILL LF OVER THE PERFORATIONS IN PAPER CAMG A,[-6] ;60 PRINTING LINES+6 LINES ON FOLD = 66 LINES IN 11 INCH MOVEI A,60. MOVEM A,LINES JRST LF1 ;OUTPUT A LF LF: PUSHJ P,OUTLINE SOSG LINES JRST FFLF ;TIME NOW FOR A NEW PAGE LF1: MOVEI A,^J PUSHJ P,OIOT JRST COPY FFLF: PUSHJ P,FFREAL PUSHJ P,IIOT SETOM A CAIN A,^L ;FF AFTER LF AT TOP, IGNORE JRST COPY JUMPGE A,COPYA ;NOT EOF, OUTPUT NEXT CHAR JRST NOEOF ;EOF FF: PUSHJ P,OUTLINE PUSHJ P,FFREAL JRST COPY FFREAL: MOVEI A,60. ;LINES ON PAGE MOVEM A,LINES MOVEI A,^L JRST OIOT BS: SOSGE COLUMN ;DON'T GO LEFT OF 0 CR: SETZM COLUMN ;ZERO POSITION AT CR ONLY JRST COPY ALT: MOVEI A,"$ PUSHJ P,OUTMARK MOVEI A,"0 SOJA COLUMN,OUTOK OUTMARK: HRL A,COLUMN MOVEM A,LPBUF(MARKER) CAIGE MARKER,LPBUFL-1 AOS MARKER AOJA COLUMN,CPOPJ OUTLINE: JUMPLE MARKER,CPOPJ PUSH P,COLUMN PUSH P,A PUSH P,B PUSH P,C OUTL0: MOVE A,[LINBUF-1,,LINBUF] BLT A,LINBUF+132.-1 SETZB B,C OUTL1: MOVE A,LPBUF(C) HLRZ COLUMN,A CAIL COLUMN,132. JRST OUTL2 SKIPL LINBUF(COLUMN) JRST [MOVEM A,LPBUF(B) ;OVERSTRIKE - SAVE FOR LATER AOJA B,OUTL2] MOVEM A,LINBUF(COLUMN) OUTL2: CAIGE C,-1(MARKER) AOJA C,OUTL1 MOVE MARKER,B MOVEI COLUMN,132. SKIPGE LINBUF-1(COLUMN) SOJG COLUMN,.-1 JUMPE COLUMN,OUTL3 MOVNS COLUMN HRLZS COLUMN MOVE A,LINBUF(COLUMN) PUSHJ P,OIOT AOBJN COLUMN,.-2 MOVEI A,^M PUSHJ P,OIOT OUTL3: JUMPG MARKER,OUTL0 ;CHECK BACK FOR MORE TO OUTPUT POP P,C POP P,B POP P,A POP P,COLUMN POPJ P, NOEOF: MOVEI A,5*OBUFL CAME A,OCOUNT PUSHJ P,OUTLINE ;NORMAL NOW TO FALL OFF END OF FILE JFCL NOMOR: PUSHJ P,ICLOSE FDELE: MOVEI A,[ASCIZ / * * * * * * Unable to delete this file. /] SKIPE DEBUG JRST STRSCN ;DEBUGGING, DON'T DELETE .FDELE TPLNAM PUSHJ P,OMESS ;DELETE DID NOT SKIP, OUTPUT SAME .DEMON JFCL JRST STRSCN ;GO BACK TO START NEXT FILE ;HERE WHEN FILE DELETED OUT FROM UNDER UNSPOOLER NOPRT: MOVEI A,[ASCIZ / * * * * * * Unable to OPEN the file /] PUSHJ P,OMESS MOVE A,NAME PUSHJ P,OSIX PUSHJ P,OSPC MOVE A,NAME+1 PUSHJ P,OSIX MOVEI A,[ASCIZ " because: "] PUSHJ P,OMESS .OPEN ERRI,ERROR JRST FDELE NOPRT1: .IOT ERRI,A CAILE A,3 CAIN A,14 JRST NOPRT2 PUSHJ P,OIOT JRST NOPRT1 NOPRT2: .CLOSE ERRI, PUSHJ P,OCRLF PUSHJ P,OSTARS JRST FDELE ERROR: SIXBIT / ERR !/ ;HERE WHEN NOTHING TO PRINT OR NOTHING TO PRINT ON ;PLACES A LINK IN THE UNSPOOLERS DIRECTORY NAMED "THE LPT IS XXXXX" ;WHERE XXXXX IS "NOT READY" FOR PAPER OUT ETC. ; "BUSY" FOR SOMEONE ELSE USING THE LPT NOLPT: .SUSET [.RINTB,,B] JUMPG B,[.VALUE [ASCIZ /: The LPT could not be opened.î/] JRST BEG] .STATUS LPTO,A ;GET CHANNEL LOSS FOR OPEN LDB A,[220600,,A] CAIN A,7 ;OPEN LOSS "DEVICE NOT READY" JRST NOLPTY ;ALREADY SET UP CAIE A,8 ;OPEN LOSS "DEVICE NOT AVAILABLE" JRST NOLPT8 IFE LPTNUM-'LPT,MOVE A,[SQUOZE 0,LPTUSR] .ELSE MOVE A,[SQUOZE 0,TTYSTS] .EVAL A, JRST NOLPSY IFN LPTNUM-'LPT,ADDI A,+</10> ;TO GET TTYSTS+LPTNUM MOVSS A HRRI A,A .GETLOC A, MOVE B,[SQUOZE 0,UNAME] .EVAL B, JRST NOLPSY ADDI B,(A) MOVSS B HRRI B,B .GETLOC B, MOVEM B,LPTBSY ;FN1 OF LINK (PRINTS 2ND) MOVE B,[SQUOZE 0,JNAME] .EVAL B, JRST NOLPSY ADDI B,(A) MOVSS B HRRI B,B .GETLOC B, MOVEM B,LPTBSY+1 ;FN2 OF LINK (PRINTS 3RD) NOLPSY: MOVSI A,LPTBSY JRST NOLPTX NOLPT8: DPB A,[030600,,A] ANDI A,0707 IORI A,'L00 HRRM A,LPTLOS+1 ;FN2 OF LINK (PRINTS 3RD) MOVSI A,LPTLOS NOLPTX: HRRI A,LPTLNK+3 BLT A,LPTLNK+5 NOLPTY: .SUSET [.SSNAM,,[SPLDIR]] .OPEN LPTLNK JFCL .DEMON ;REMOVE SIGNAL FROM PREVIOUS LINK JFCL SOSGE RETRY JRST KILL MOVEI A,30.*10. ;10 SEC SLEEP .SLEEP A, JRST BEG ;PERHAPS SOMEONE HAS HELPED IT UP RETRY: 6*5 ;6 TRIES PER MIN * 5 MINS LPTDEL: SIXBIT / DSK THELPT IS / LPTLNK: SIXBIT /0 DSK THELPT ISREADY . NOT/ LPTBSY: SIXBIT /UUUUUUJJJJJJBUSY->/ LPTLOS: SIXBIT /FAIL OPNL00OPEN / NOTPL: PUSHJ P,OCLOSE NOLPTK: PUSHJ P,ICLOSE KILL: .LOGOUT ;IF FAILS, THEN DO NEXT SKIPE DEBUG .VALUE ;IF DEBUGGING, DONT "KILL" .BREAK 16,160000 ;INTERRUPT HANDLER TSINT: 0 TSRET: 0 MOVE A,TSRET ;SEE IF INPUT ERROR CAIE A,IFILLX ;IFILLX-1 IS ONLY TPL IN IOT .DISMIS [KILL] ;NOT AN INPUT ERROR - QUIT MOVEI A,[ASCIZ " * * * * * * I/O channel error occurred while printing this file. "] PUSHJ P,OMESS MOVEI P,PDL .DISMISS [NOMOR] ;IOPEN - ROUTINE FOR OPENING INPUT IOPEN: .OPEN TPLI,(A) POPJ P, ;REPORT LOSS SETZM IEOF SETZM ICOUNT .CALL [SETZ ? 'FILLEN ? MOVEI TPLI ? SETZM A] MOVSI A,377777 ;BIG NUMBER IF FILLEN CALL FAILS IMULI A,5 MOVEM A,ICHARS ;UPPER LIMIT ON NUMBER OF CHARS INPUT POPJ1: AOS (P) POPJ P, ;SUBROUTNE FOR READING FROM INPUT IFILL: SKIPGE IEOF ;SKIP IF NOT READ EOF YET POPJ P, ;RETURN WO SKIP MOVE A,[-IBUFL,,IBUFF] .IOT TPLI,A IFILLX: MOVEM A,IEOF MOVEI A,-IBUFF(A) IMULI A,5 HRRZM A,ICOUNT MOVNS A ADDB A,ICHARS ;SUB FROM TOTAL CHARS IN FILE JUMPG A,IFILLZ ;NOT YET NEAR END OF FILE ; HERE THE END OF THE FILE AS DETERMINED FROM THE FILE LENGTH AT IOPEN ABOVE ; IS EXAMINED FOR TRAILING ^C (ITS FILLER BEFORE EXISTENCE OF BIT COUNT IN FILE) ; AND FOR ^@ (NUL - FILLER FROM SOME IMPORTED PROGRAMS AND FILES) ; NOTE: THE IOT POINTER CANNOT BE EXAMINED FOR COUNTING OUT, BECAUSE THE LAST ; WORD IN THE FILE COULD LIE IN THE LAST WORD OF THE BUFFER, THUS THE IOT WOULD ; HAVE BEEN FULLY COUNTED OUT. ( 0,,IBUFF+BUFLEN ) MOVE A,IEOF ;POINTS TO WORD IN BUFFER 1 PAST LAST INPUT WORD HRLI A,350700 ;LEFT MOST BYTE MOVEM A,IPOINT ;SAVE IN TEMP SPOT IFILLY: MOVE A,IPOINT ADD A,[070000,,] ;BACK UP THE BYTE POINTER SKIPG A ;SKIP IF NOT AT LEFT END OF WORD ADD A,[347777,,-1] ;BACK UP THE BYTE POINTER TO WORD-1, BYTE 010700 MOVEM A,IPOINT LDB A,A ;FETCH THE BYTE CAIE A,^C ;LOOP BACK IF ^C CAIN A,^@ ;LOOP IF ^@ JRST [SOSLE ICOUNT ;DECREMENT THE CHAR COUNT JRST IFILLY ;BACK TO CHECK MORE POPJ P,] ;THE BUFFER WAS ENTIRELY FULL OF ^C (OR ^@) - GIVE EOF RETURN ;FALLS THRU TO IFILLZ IF CHAR WAS NOT ^C OR ^@ IFILLZ: MOVE A,[440700,,IBUFF] MOVEM A,IPOINT ; NOW CHECK FOR "BINARY" FILE = MORE THAN 10% CONTROL CHARACTERS MOVE 0,A ; char pointer PUSH P,B MOVE B,ICOUNT ; char count PUSH P,C ; char holder MOVEI A,0 ; ctl char count IFILLC: SOSGE B ; Done with bufferful? JRST IFILLD ; Yup. ILDB C,0 ; Get next char. CAIL C,40 ; ctl char? JRST IFILLC ; nope MOVE C,OUTAB(C) CAIE C,OUTCTL ; formatting char? JRST IFILLC ; yup AOJA A,IFILLC ; baddie - count it IFILLD: POP P,C POP P,B JUMPE A,IIOT ; Any ctl chars? MOVE 0,ICOUNT IDIV 0,A ; Yup; what ratio? CAIL 0,10. JRST IIOT ; Less than 10%: OK. MOVEI A,[ASCIZ " * * * * * * A portion of this file had more than about ten percent control characters, so the remainder will not be printed. "] PUSHJ P,OMESS POPJ P, ; More than 10%: simulate EOF. IIOT: SOSGE ICOUNT JRST IFILL ILDB A,IPOINT AOS (P) POPJ P, ;SUBROUTINE FOR CLOSING INPUT ICLOSE: .CLOSE TPLI, POPJ P, ;SUBROUTINE FOR OPENING OUTPUT CHANNEL ;AND SETTING UP BUFFER OOPEN: .OPEN LPTO,(A) POPJ P, PUSH P,A MOVEI A,5*OBUFL MOVEM A,OCOUNT MOVE A,[440700,,OBUFF] MOVEM A,OPOINT POP P,A AOS (P) POPJ P, ;SUBROUTINE FOR OUTPUTTING TO BUFFER/LPT OFILL: PUSH P,A PUSH P,B MOVE A,[440700,,OBUFF] MOVEM A,OPOINT MOVEI B,5*OBUFL MOVEM B,OCOUNT .CALL [SETZ ? SIXBIT /SIOT/ ? MOVEI LPTO ? A ? SETZ B] .LOSE 1000 POP P,B POP P,A SKIPA OIOT6: ADDI A,40 ;CONVERT TO ASCII OIOT: SOSGE OCOUNT JRST OFILL IDPB A,OPOINT POPJ P, ;SUBROUTINE OUTPUTS A SPACE OSPC: PUSH P,A MOVEI A,40 PUSHJ P,OIOT JRST POPAJ ;SUBROUTINE OUTPUTS A CR OCR: PUSH P,A MOVEI A,^M PUSHJ P,OIOT JRST POPAJ ;SUBROUTINE OUTPUTS A CRLF OCRLF: PUSH P,A MOVEI A,^M PUSHJ P,OIOT MOVEI A,^J PUSHJ P,OIOT JRST POPAJ ;SUBROUTINE OUTPUTS A FORM FEED OFF: PUSH P,A MOVEI A,^L PUSHJ P,OIOT JRST POPAJ ;SUBROUTINE TO OUTPUT THREE LINES OF STARS OSTARS: PUSH P,A MOVEI A,STARS PUSHJ P,OMESS MOVEI A,STARS PUSHJ P,OMESS MOVEI A,STARS PUSHJ P,OMESS JRST POPAJ ; SUBROUTINE TO OUTPUT INTEGER IN A OFIX: PUSH P,A MOVE 0,A PUSH P,[-1] ; Mark end of stack use. IDIVI 0,10. PUSH P,1 ; Push a digit. JUMPN 0,.-2 OFIX1: POP P,A ; Get digit again. JUMPL A,POPAJ ; Jump if done. ADDI A,"0 ; Convert to ASCII. PUSHJ P,OIOT JRST OFIX1 ;SUBROUTINE TO OUTPUT MESSAGE POINTED TO BY A OMESS: PUSH P,A HRLI A,440700 PUSH P,A ILDB A,(P) JUMPE A,POP1AJ PUSHJ P,OIOT JRST .-3 POP1AJ: POP P,(P) POPAJ: POP P,A CPOPJ: POPJ P, ;SUBROUTINE TO CLOSE OUTPUT CHANNEL OCLOSE: PUSH P,A .STATUS LPTO,A JUMPE A,POPAJ MOVEI A,^L ;FLUSH UP PAPER PUSHJ P,OIOT MOVEI A,5*OBUFL SUB A,OCOUNT ;SUBTRACT NUMBER OF CHARS LEFT JUMPLE A,CLOSEX PUSH P,B MOVE B,[440700,,OBUFF] .CALL [SETZ ? SIXBIT /SIOT/ ? MOVEI LPTO ? B ? SETZ A] .LOSE 1000 POP P,B CLOSEX: .CLOSE LPTO, POP P,A POPJ P, ;SUBROUTINE TO OUTPUT CONTENTS OF A AS SIXBIT (6 CHARS RARELY) OSIX: PUSH P,A PUSH P,B MOVE B,A ; PICK UP THE SIXBIT JUMPE B,OSIXO MOVEI A,0 LSHC A,6 PUSHJ P,OIOT6 JUMPN B,.-3 OSIXO: POP P,B JRST POPAJ ;ROUTINE TO PRINT CONTENTS OF A IN SIXBIT AS DATE O6DATE: PUSH P,A ;ONTO STACK LDB A,[220600,,(P)] PUSHJ P,OIOT6 LDB A,[140600,,(P)] PUSHJ P,OIOT6 MOVEI A,"/ PUSHJ P,OIOT LDB A,[060600,,(P)] PUSHJ P,OIOT6 LDB A,[000600,,(P)] PUSHJ P,OIOT6 MOVEI A,"/ PUSHJ P,OIOT LDB A,[360600,,(P)] PUSHJ P,OIOT6 LDB A,[300600,,(P)] PUSHJ P,OIOT6 JRST POPAJ ;ROUTINE TO PRINT CONTENTS OF A AS TIME HH:MM:SS O6TIME: PUSH P,A ;ONTO STACK LDB A,[360600,,(P)] PUSHJ P,OIOT6 LDB A,[300600,,(P)] PUSHJ P,OIOT6 MOVEI A,": PUSHJ P,OIOT LDB A,[220600,,(P)] PUSHJ P,OIOT6 LDB A,[140600,,(P)] PUSHJ P,OIOT6 MOVEI A,": PUSHJ P,OIOT LDB A,[060600,,(P)] PUSHJ P,OIOT6 LDB A,[000600,,(P)] PUSHJ P,OIOT6 JRST POPAJ ;ROUTINE TO FORMULATE DATE AND TIME FROM SYSTEM INTERNAL FORMAT IN UFD ;RETURNS DATE IN A, TIME IN B G6DATE: PUSH P,C PUSH P,D PUSH P,E MOVE D,A ;BITS TO D ; year LDB B,[330700,,D] ; year in century IDIVI B,10. ; divide to get decimal ADDI B,'0 ; forms sixbit of decade DPB B,[060600,,A] ADDI C,'0 ; forms sixbit of year DPB C,[000600,,A] ; month LDB B,[270400,,D] ; month IDIVI B,10. ADDI B,'0 DPB B,[360600,,A] ADDI C,'0 DPB C,[300600,,A] ; day LDB B,[220500,,D] ; day IDIVI B,10. ADDI B,'0 DPB B,[220600,,A] ADDI C,'0 DPB C,[140600,,A] ; now compute time HRRZS C,D ; isolate # 1/2 seconds LSH C,-1 ; forms # seconds IDIVI C,60. ; computes # minutes IDIVI D,10. ; put # seconds remaining away ADDI D,'0 ADDI E,'0 DPB D,[060600,,B] DPB E,[000600,,B] IDIVI C,60. ; computes # hours IDIVI D,10. ; put remaining minutes away ADDI D,'0 ADDI E,'0 DPB D,[220600,,B] DPB E,[140600,,B] IDIVI C,10. ; put # hours away ADDI C,'0 ADDI D,'0 DPB C,[360600,,B] DPB D,[300600,,B] POP P,E POP P,D POP P,C ROT A,-12. ;TO GET YEAR IN LEFT END ;(CODE ABOVE GOBBLED FROM ELSEWHERE) POPJ P, ;SUBROUTINE TO PRINT CONTENTS OF A IN SYSTEM DATE/TIME FORMAT AS DATE AND TIME ODATE: PUSH P,B PUSHJ P,G6DATE PUSHJ P,O6DATE ;PRINT DATE PUSHJ P,OSPC MOVE A,B PUSHJ P,O6TIME POP P,B POPJ P, ; ONAME - print name of file currently open on TPLI channel ONAME: PUSH P,A .CALL [SETZ SIXBIT /RFNAME/ MOVEI TPLI MOVEM A ;DEV MOVEM N1' MOVEM N2' SETZM A] ;SNAME JRST ONAMEX PUSHJ P,OSIX ;OUTPUT SNAME MOVEI A,[ASCIZ /; /] PUSHJ P,OMESS MOVE A,N1 PUSHJ P,OSIX PUSHJ P,OSPC MOVE A,N2 PUSHJ P,OSIX MOVEI A,[ASCIZ / -- created /] PUSHJ P,OMESS .CALL [SETZ ? 'RFDATE ? MOVEI TPLI ? SETZM A] JRST ONAMEX PUSHJ P,ODATE MOVEI A,[ASCIZ / by /] PUSHJ P,OMESS .CALL [SETZ ? SIXBIT /RAUTH/ ? MOVEI TPLI ? SETZM A] JRST ONAMEX SKIPN A MOVE A,[SIXBIT / -??- /] PUSHJ P,OSIX JRST POPAJ ONAMEX: MOVEI A,[ASCIZ / ( system call failed ) /] PUSHJ P,OMESS JRST POPAJ ; ROUTINE TO BIG-PRINT THE USER'S NAME ON HEAD-SHEET OBIG: PUSH P,A PUSH P,B PUSH P,C PUSH P,D PUSH P,E MOVSI B,-7 ;NUMBER OF VERTICAL ELEMENTS IN 5X7 CHAR OBIGB: MOVE D,[440600,,C] MOVE C,-4(P) ;ORIGINAL SIXBIT FROM "A" OBIGA: ILDB A,D ;GET 6BIT CHR LDB A,LDBT(B) ;GET 5BITS OF SCAN LINE DPB A,D ;REPLACE CHAR WITH PATTERN FOR ITS SCAN LINE TLNE D,770000 JRST OBIGA ;DO IT 6 TIMES MOVE MARKER,[440700,,LPBUF] SKIPN D,C ;THIS IS THE BIT PATTERN FOR ALL 6 CHARS JRST OBIGX ;NO MARKS, JUST DO CRLF MOVE A,[ASCII / /] REPEAT 3,MOVEM A,.RPCNT+LPBUF ADDI MARKER,3 ;LEAD OFF LINE WITH SOME SPACE OBIGD: SKIPG D SKIPA A,["*] MOVEI A,40 ;SPACE REPEAT 3,IDPB A,MARKER LSH D,1 JUMPN D,OBIGD OBIGX: MOVEI A,^M IDPB A,MARKER MOVEI A,^J IDPB A,MARKER MOVEI A,0 IDPB A,MARKER MOVEI A,LPBUF PUSHJ P,OMESS PUSHJ P,OMESS ;TWICE FOR BIGGER BIG-PRINT AOBJN B,OBIGB POP P,E POP P,D POP P,C POP P,B POP P,A POPJ P, LDBT: REPEAT 7,<370500-.RPCNT*50000>,,CH5.7T(A) CH5.7T: 0 ;SP DEFINE .. A,B,C,D,E,F,G,H IFSN H,,.ERR Bad char table entry A ? B ? C ? D ? E ? F ? G TERMIN .BYTE 5 .. 4,4,4,4,4,0,4,, ;! .. 12,12,12,0,0,0,0,, ;" .. 12,12,37,12,37,12,12,, ;# .. 4,17,24,16,5,36,4,, ;$ .. 36,31,2,4,10,23,3,, ;% .. 4,12,4,10,25,22,15,, ;& .. 4,4,4,0,0,0,0,, ;' .. 2,4,10,10,10,4,2,, ;( .. 10,4,2,2,2,4,10,, ;) .. 0,25,16,33,16,25,0,, ;* .. 0,0,4,33,4,0,0,, ;+ .. 0,0,0,0,14,4,10,, ;, .. 0,0,0,16,0,0,0,, ;- .. 0,0,0,0,0,14,14,, ;. .. 0,1,2,4,10,20,0,, ;/ .. 16,21,23,25,31,21,16,, ;0 .. 4,14,4,4,4,4,16,, ;1 .. 16,21,1,2,4,10,37,, ;2 .. 16,21,1,6,1,21,16,, ;3 .. 2,6,12,37,2,2,2,, ;4 . . . OK, BEELER? .. 37,20,36,1,1,21,16,, ;5 .. 16,21,20,36,21,21,16,, ;6 .. 37,1,2,4,10,20,20,, ;7 .. 16,21,16,21,21,21,16,, ;8 .. 16,21,21,17,1,21,16,, ;9 .. 0,14,14,0,14,14,0,, ;: .. 0,14,14,0,14,4,10,, ; ; .. 0,2,4,10,4,2,0,, ;< .. 0,0,37,0,37,0,0,, ;= .. 0,10,4,2,4,10,0,, ;> .. 16,21,2,4,4,0,4,, ;? .. 16,21,27,25,27,20,17,, ;@ .. 16,21,21,37,21,21,21,, ;A .. 36,21,21,36,21,21,36,, ;B .. 16,21,20,20,20,21,16,, ;C .. 36,21,21,21,21,21,36,, ;D .. 37,20,20,36,20,20,37,, ;E .. 37,20,20,36,20,20,20,, ;F .. 16,21,20,20,23,21,16,, ;G .. 21,21,21,37,21,21,21,, ;H .. 16,4,4,4,4,4,16,, ;I .. 7,1,1,1,1,21,16,, ;J .. 21,22,24,34,22,21,21,, ;K .. 20,20,20,20,20,20,37,, ;L .. 21,33,25,21,21,21,21,, ;M .. 21,21,31,25,23,21,21,, ;N .. 16,21,21,21,21,21,16,, ;O .. 36,21,21,36,20,20,20,, ;P .. 16,21,21,21,25,22,15,, ;Q .. 36,21,21,36,21,21,21,, ;R .. 16,21,20,16,1,21,16,, ;S .. 37,4,4,4,4,4,4,, ;T .. 21,21,21,21,21,21,16,, ;U .. 21,21,21,21,21,12,4,, ;V .. 21,21,21,21,21,25,12,, ;W .. 21,21,12,4,12,21,21,, ;X .. 21,21,12,4,4,4,4,, ;Y .. 37,2,4,16,4,10,37,, ;Z .. 6,4,4,4,4,4,6,, ;[ .. 0,20,10,4,2,1,0,, ;\ .. 14,4,4,4,4,4,14,, ;] .. 4,16,25,4,4,4,4,, ;^ .. 0,4,10,37,10,4,0,, ;_ .BYTE IFN .-CH5.7T-64.,.ERR Char table not 64. long ;CONSTANTS, STORAGE &C STARS: ASCII/************************************************************/ ASCII/************************************************************/ ASCIZ/***** / ICHARS: 0 IEOF: 0 ICOUNT: 0 IPOINT: 0 IBUFL==200 IBUFF: BLOCK IBUFL PDL: BLOCK 30 OBUFL==20 OBUFF: BLOCK OBUFL -1,,40 ;SPACE CHARS TO FILL LINBUF LINBUF: BLOCK 132. LPBUFL==1000 LPBUF: BLOCK LPBUFL OCOUNT: 0 OPOINT: 0 LOGIN: SETZ SIXBIT /LOGIN/ ['UNSPOO] SETZ [0] TPLNAM: SIXBIT / "DSK/ NAME: BLOCK 2 0 ;FOR DELETE CONSTANTS VARIABLES DIRBUF: BLOCK 2000 ;HERE AT END, FOR PAGING. THIS GETS REFERENCED ONLY FOR NEW FILE. DIRLNT: 0 END BEG