diff --git a/src/syseng/scrimp.162 b/src/syseng/scrimp.162 new file mode 100644 index 00000000..bae28780 --- /dev/null +++ b/src/syseng/scrimp.162 @@ -0,0 +1,2422 @@ + +TITLE SCRIMP +;THE MIT XGP UNSPOOLER PITTS JARVIS 4/13/74 +;PLOT AND SCAN ADDED BY TK +;SQUISH COMMAND ADDED BY GLS AND H 4/14/75 + +.MLLIT==1 + +;AC ASSIGNMENTS + +A=1 +B=2 +C=3 +D=4 +E=5 +T=6 ;SUPER TEMPORARIES, NOT PRSERVED OVER SUBROUTINE CALLS +TT=7 +X=10 +Z=11 +Y=12 +X0=13 +Y0=14 +FONT=15 ;FONT INDEX +CHNL=16 ;TEN TO 11 CHANNEL +P=17 + +.XCREF A B C D E T TT X Z Y X0 Y0 FONT CHNL P XX + +NCHNL==3 ;# OF CHANNELS WE ARE WILLING TO ADMIT + COCHNL==0 ;COMMAND OUT + CICHNL==1 ;COMMAND IN + DOCHNL==2 ;DATA OUT + +;TIME SHARING I/O CHANNELS + +TTYICH==0 +TTYOCH==1 +FNTICH==2 +TXTICH==3 +ERRICH==4 + +LAMBDA==10.*60. ;10 SECOND TIME OUT ON XGP +XGP11==1 ;IDENTIFICATION # OF XGP PDP-11 +MAXFNT==20 ;MAXIMUM # FONTS WE WILL SEND TO PDP11 +TTY1==3 ;ONLY THESE TTYS CAN SEND TO XGP +TTY2==24 +CLKINT==200000 ;REAL TIME INTERRUPT, LEFT HALF +IOCINT==400 ;IO CHANNEL ERROR, RIGHT HALF +MAPMSK==574377776000 ;MASK TO TYPE 10-11 MAP TABLE ENTRIES + +DEFINE CONC A,B,C +A!B!C +TERMIN + +MK==117. ;MAX NUMBER OF BLOCKS ALLOWABLE FOR PLOT FILES +WDSPL==51.+2 +YBITL==51.*32. +XBITL==11.*200. +BYTMAX==52.*4 + +LOC 42 + JSR TSINT + +LOC 100 + +GO: MOVE P,[-PDL,,PDB-1] ;GET A PDL + .OPEN TTYICH,[(SIXBIT /TTY/)] ;OPEN THE TTY + .VALUE + .OPEN TTYOCH,[1,,(SIXBIT /TTY/)] + .VALUE + .SUSET [.RIOC+TTYOCH,,A] + HLRZS A + ANDI A,77 + MOVEM A,TTYNUM + CAIE A,TTY1 + .VALUE [ASCIZ /:USE T03 (TELETYPE 35 NEAR XGP-11) +/] + .LOGOUT ;I HATE THOSE GOD DAMN BAG BITERS WHO TRY TO MAKE ME TOP LEVEL + PUSHJ P,VERTYP + .CORE ICORE ;REDUCE TO INITIAL CORE + .LOSE + SKIPN TXTSNM + .SUSET [.RSNAM,,TXTSNM] + SETZM DSKCMD + SETZM NOTYPE + MOVEI A,LNKVPG + MOVEM A,T11PAG + .CALL [ SETZ + SIXBIT /T11MP/ + T11PAG + SETZ [<3_34.>\1777\\]] + .VALUE NOPDP11 + SKIPN 10LNKV + .HANG ;WAIT FOR 11 TO SET THINGS UP + MOVE A,[CLKINT,,IOCINT] + MOVEI B,1_ + .SETM2 A, + MOVE A,[200000,,B] + MOVEI B,LAMBDA ;XGP TIME OUT + .REALT A, + JFCL + PUSH P,[442000,,10LNKV] + ILDB A,(P) ;POINTS AT CHANNEL HEADERS + ILDB B,(P) ;# CHANNELS + IMULI B,BPRCHL ;# BYTES IN AREA + PUSHJ P,GET11 ;GET THAT PAGE + ILDB A,(P) ;ORIGIN OF BUFFER AREA + ILDB B,(P) ;SIZE (BYTES) + MOVEM A,BUFORG + SUB P,[1,,1] + PUSHJ P,GET11 ;GET BUFFER IN MAP + MOVEI CHNL,COCHNL + PUSHJ P,OPEN + +;FALLS THROUGH + +;MAIN LOOP + +RECYCL: SETOM SET ;NO ERRORS FLAG + MOVE P,[-PDL,,PDB-1] ;RESET THE STACK + MOVEI CHNL,COCHNL + SETZB FONT,HDRCNT + SETZM DFHDRF + PUSHJ P,OPEN ;OPEN UP THE DATA CHANNEL + PUSHJ P,VRESET ;RESET VAIABLES + PUSHJ P,FRESET ;RESET FONTS + PUSHJ P,PRESET ;RESET PRINT FILE NAME AND DEVICE + PUSHJ P,COMMAN ;GET COMMAND FROM TTY OR OTHER + PUSHJ P,TXTOPN ;OPEN TEXT INPUT FILE + PUSHJ P,TXTFNF ; FILE NOT FOUND + SKIPN TXTCMD + JRST RECYC1 ;DON'T READ COMMANDS + SKIPGE SET + PUSHJ P,RTXTCM ;READ SETTINGS FROM TXTFILE +RECYC1: SKIPN SQSHFL ;SQUISH? + JRST RECYC2 ; NO + SKIPL SET + JRST RECYCL + PUSHJ P,PRESCN ; MUST PERFORM PRE-SCAN + PUSHJ P,TXTOPN + PUSHJ P,TXTFNF ;CONFUSION +RECYC2: SKIPL SET + JRST RECYCL + PUSHJ P,FONTS ;SEND THOSE FONTS + MOVEI FONT,0 + SKIPL SET + JRST RECYCL ;ERRORS HAVE HAPPENED + PUSHJ P,SNDTXT ;SKIP PAGES AND SEND REMAINDER + .CLOSE TXTICH, + JRST RECYCL + +;THIS IS THE FILE NAME READER + +.INSRT FNR > + +;SCRIMPY INTERRUPT ROUTINES + +TSINT: 0 + 0 + PUSH P,A + SKIPGE A,TSINT + JRST TTYBRK ;TTY CHANNEL INTERUPT + TLZE A,CLKINT + JRST TSCLK ;CLOCK INTERUPT + TRZE A,IOCINT + JRST IOCERR ;IO CHANNEL ERROR + JRST TSX +TTYBRK: TRZN A,1_ + JRST TSX + MOVEI A,TTYICH + .ITYIC A, + JRST TSX + CAIN A,^G + PUSHJ P,CNTRLG ;STOP THE WORLD, HE TYPED CONTROL-G +TSX: POP P,A + .DISMI TSINT+1 + +TSCLK: MOVE A,ABORTL + TLZ A,777774 + JUMPE A,TSX + POP P,A + .DISMI [CRASH] + +;HERE FOR IO CHANNEL ERROR + +IOCERR: MOVEI B,[ASCIZ /IO CHANNEL ERROR: /] + PUSHJ P,OUTSTR + .SUSET [.RBCHN,,A] + CAIN A,FNTICH ;IS IT FONT LOSSAGE + JRST [ PUSHJ P,FNTFNF + JRST IOCER1] + CAIN A,TXTICH ;PERHAPS IT IS THE TEXT FILE + JRST [ PUSHJ P,TXTFNF + JRST IOCER1] + PUSHJ P,ERRTYP ;HUH? WHAT'S THIS CHANNEL +IOCER1: MOVEI A,40 ;PUT A SPACE AT END + PUSHJ P,TYO + .CLOSE TXTICH, + .CLOSE FNTICH, + SETOM ABORTF ;TRY ABORTING THE LISTING + .DISMI [CRASH] + +;HERE FOR CONTROL-G TYPED AT CONSOLE, GOBBLE UP ALL HIS TYPE IN + +CNTRLG: SETOM ABORTF + PUSHJ P,TYI + CAIE A,^G + JRST .-2 + POPJ P, + +;COMMAND LINE SCANNER + +COMMAN: PUSHJ P,SOUT ;CARRIAGE RETURN AND STAR + PUSHJ P,TTYLIN ;GET TTY LINE INTO COMAND BUFFER +COMAN1: MOVE B,[PUSHJ P,COMGET] + MOVE C,[-1,,["_]] ;BREAK TABLE + JSR FNR"GETFIL ;NON-SKIP RETURN FOR NULL FILE SPEC + JRST [ CAIN A,"; + JRST ALTER + PUSHJ P,HUH + JRST COMMAN] + SETZM TXTFN1 + SETZM TXTFN2 + JUMPE E,GETFNT + MOVEM E,TXTFN1 ;FN1 + SKIPN T + MOVSI T,360000 ;GREATER THAN + MOVEM T,TXTFN2 ;FN2 + SKIPE TT + MOVEM TT,TXTSNM ;SNAME + SKIPE D + MOVEM D,TXTO ;DEV +GETFNT: SETZM ABORTF + CAIN A,15 + PUSHJ P,COMGET ;IGNORE CARRIAGE RETURNS + CAIN A,12 + POPJ P, ;END OF LINE + CAIE A,"_ + SKIPA B,[[ASCIZ /IGNORING FONT SPEC/]] + PUSHJ P,GETF0 ;READ FONT FILE NAMES + JRST COMERR + POPJ P, + +;ROUTINE TO READ FONT FILE NAMES + +GETF0: MOVE C,[-1,,[",]] + MOVEI FONT,0 +GETF0A: PUSH P,FONT + JSR FNR"GETFIL + JRST GETF2 + MOVE FONT,(P) + JUMPE E,GETF1 + MOVEM E,FNTFN1(FONT) ;FNAM1 + SKIPN T + MOVSI T,'KST + MOVEM T,FNTFN2(FONT) ;FNAM2 +GETF1: SKIPN TT + MOVE TT,FNTSNM ;DEFAULT SNAME + MOVEM TT,FNTSNM(FONT) + SKIPN D + MOVSI D,'DSK ;DEFAULT DEVICE + MOVEM D,FNTO(FONT) + SETOM FCHFLG(FONT) + CAIN A,15 + PUSHJ P,COMGET ;IGNORE CARRIAGE RETURNS +GETF2: POP P,FONT + CAIN A,12 + JRST POPJ1 ;A-OK + ADDI FONT,FNTVLN + CAIGE FONT,MAXFNT*FNTVLN + CAIN A,", + JRST GETF0A ;GO BACK FOR MORE + MOVEI B,[ASCIZ /IGNORING JUNK AT END OF FONT SPECS/] + POPJ P, + +;TTY LEVEL COMMAND RETURN + +COMERR: PUSH P,A +COMER1: PUSHJ P,TERPRI +POPXIT: POP P,A +COMXIT: CAIN A,12 + POPJ P, + PUSHJ P,COMGET + JRST COMXIT + +HUH: MOVEI B,[ASCIZ /???/] + JRST COMERR + +;ALTER MODE COMES HERE + +ALTER: PUSHJ P,SPCSKP ;SKIP OVER SPACES, TABS, AND CRS + CAIN A,12 + JRST COMMAN ;IGNORE BLANK ALTER COMMANDS +ALTCOM: PUSHJ P,DECODE + JRST [ PUSHJ P,HUH + JRST COMMAN] ;UNDEFINED COMMAND + PUSHJ P,SPCSKP + SETZM ABORTF + MOVE C,COMTAB(B) + PUSHJ P,(C) + PUSHJ P,COMERR ;ROUTINE LOST, TELL THE PEOPLE WHY + PUSHJ P,COMXIT ;GOBBLE UP REST OF LINE + JRST COMMAN ;BACK TO PRINT MODE + +;HERE TO SKIP OVER SPACES IN COMMAND LINE + +SPCSKP: CAIN A,12 ;DON'T SKIP OVER LINE FEED + POPJ P, +SPCSK1: PUSHJ P,COMGET +SPCSK2: CAIE A,40 + CAIN A,11 + JRST SPCSK1 + CAIN A,15 + JRST SPCSK1 + POPJ P, + +;COMMAND DISPATCH TABLE + +DEFINE XX NAME,ROUTIN +[SIXBIT /NAME/],,ROUTIN +TERMIN + +;SHOULD BE IN ALPHABETICAL ORDER +;ALL THESE ROUTINES SHOULD SKIP RETURN IF NO ERRORS +; ERROR RETURN WITH POINTER TO ASCIZ STRING IN B +; NORML RETURN + +COMTAB: +XX AUTCUT,SETCUT +XX BOTMAR,SETBOT +XX FFCUT,SETFFC +XX HEADER,HEADER +XX HEIGHT,SHWHGT +XX HELP,HELP +XX KILL,KILL +XX KSET,KSET +XX LFTMAR,SETLFT +XX LIST,LIST +XX LSP,SETLSP +XX LOGOUT,LOGOUT +XX NLINES,SETLIN +XX PLOT,PLOT +XX PRINT,PRINT +XX RESET,RESET +XX ROTATE,ROTATE +XX SAMPLE,SAMPLE +XX SCAN,SCAN +XX SHOW,SHOW +XX SIZE,SIZE +XX SKIP,SETPSK +XX SNDFNT,FONTSA +XX SQUISH,SQUISH +XX TEST,SETTST +XX TOPMAR,SETTOP +XX TXTCMD,SETXTC +XX VERSE,VERSE +XX VSP,SETVSP +XX X0,SETX0 +XX Y0,SETY0 +COMTBL==.-COMTAB + +;READS COMMANDS FROM TEXT FILE + +RTXTCM: AOSN ABORTF + JRST [ AOS SET + POPJ P,] + PUSH P,UDEPTH ;TO SEE IF IT CHANGES + PUSH P,DSKCMD + SETOM DSKCMD +TXTCM1: SKIPL DSKCMD + JRST TXTCXT + PUSHJ P,DSKLIN ;GET COMMAND FROM DISK + PUSHJ P,COMGET ;GET COMMAND CHARACTER + CAIN A,^M + JRST TXTCM1 ;IGNORE NULL LINE + CAIE A,"; + JRST TXTCXT ;EXIT + PUSHJ P,SPCSKP + CAIN A,12 + JRST TXTCM1 ;IGNORE NULL COMMAND LINE + MOVEI B,COMBUF + PUSH P,A + SKIPN NOTYPE + PUSHJ P,OUTSTR ;LET HIM KNOW WHAT'S GOING ON + POP P,A + PUSHJ P,DECODE + JRST TXTCXT ;NOT IN TABLE, GO AWAY + PUSHJ P,SPCSKP + MOVE C,COMTAB(B) + PUSHJ P,(C) + JFCL ;IGNORE LOSSAGE + PUSHJ P,COMXIT + JRST TXTCM1 + +;HERE TO EXIT TEXT FILE COMMAND READER + +TXTCXT: POP P,DSKCMD + PUSHJ P,TXTOPN ;REOPEN, IT MIGHT EVEN BE A DIFFERENT FILE + JRST [ AOS SET ;LOSSAGE + POP P,(P) ;FLUSH UDEPTH + JRST TXTFNF] + POP P,A + CAME A,UDEPTH + JRST RTXTCM ;THAT WAS THE COMMAND FILE, NOW READ THE PRINT FILE + POPJ P, + +;HERE TO DECODE COMMAND + +DECODE: MOVE C,[440600,,D] + TDZA D,D +DECOD1: PUSHJ P,COMGET + PUSHJ P,CVSIX ;CONVERT TO SIX BIT + JUMPL B,[ CAIN A,15 + PUSHJ P,COMGET ;IGNORE CARRIAGE RETURNS + CAIN A,12 + JRST DECOD2 + POPJ P,] ;COMMAND NOT UNDERSTOOD + JUMPE B,DECOD2 ;SEARCH COMMAND TABLE + TLNE C,770000 + IDPB B,C ;ONLY 6 CHARACTERS + JRST DECOD1 + +;LOOK UP COMMAND IN D + +DECOD2: JUMPE D,[ CAIN A,": + JRST DECODE ;DON'T SCREW FOR LEADING COLON + POPJ P,] ;ERROR + MOVEI B,COMTBL-1 +DECOD3: MOVS C,COMTAB(B) + CAMN D,(C) + JRST POPJ1 ;FOUND HIM + SOJGE B,DECOD3 + POPJ P, ;NOT FOUND + +;CONVERT A TO SIXBIT, LEAVE RESULT IN B + +CVSIX: CAIN A,11 + MOVEI A,40 + MOVNI B,1 ;ASSUME NOT SIXBIT + CAIL A,40 + CAILE A,"_ + JRST CVSIX1 ;MIGHT BE LOWER CASE + MOVEI B,-40(A) ;ITS UPPER CASE + POPJ P, +CVSIX1: CAIL A,"a + CAILE A,"z + POPJ P, ;NOT SIXBIT + MOVEI B,-100(A) + POPJ P, + +;READ IN A DECIMAL NUMBER AND LEAVE RESULT IN D +; NON-SKIP RETURN, NUMBER NOT READ +;BREAK CHARACTER LEFT IN A + +DECIN: MOVEI C,1 ;SIGN + CAIN A,"- + PUSHJ P,[ MOVNI C,1 ;NEGATIVE NUMBER + JRST COMGET] + PUSHJ P,CVDIG ;CONVERT CHARACTER CODE TO DIGIT + JUMPL B,CPOPJ ;NOT A DIGIT, NO NUMBER THERE + TDZA D,D +DECIN1: PUSHJ P,COMGET + PUSHJ P,CVDIG ;LEAVE DIGIT IN B + JUMPL B,[ JUMPGE C,POPJ1 + MOVNS C + MOVNS D + JRST POPJ1] + IMULI D,10. + IMULI C,10. ;KEEP TRACK OF DIGITS READ + ADD D,B + JRST DECIN1 + +;COVERT DIGIT IN A TO NUMBER + +CVDIG: MOVNI B,1 ;ASSUME FAILURE + CAIL A,"0 + CAILE A,"9 + POPJ P, ;FAILURE + MOVEI B,-"0(A) + POPJ P, + +;GET POSITIVE ARGUMENT +; NON-SKIP RETURN FOR FAILURE + +POSARG: PUSHJ P,ARGIN + POPJ P, + JUMPL D,CPOPJ + JRST POPJ1 + +ARGIN: PUSHJ P,DECIN + POPJ P, ;ERROR RETURN + PUSHJ P,SPCSK2 + CAIN A,12 + AOS (P) + POPJ P, + +;ALTER MODE ACTION ROUTINES + +SCAN: MOVEI A,SCAN2 + MOVEM A,SCNRET + PUSHJ P,SCNFN + JRST [ MOVEI B,[ASCIZ /???/] + POPJ P,] +SCAN2: .SUSET [.SSNAM,,TXTSNM] + .CALL [ SETZ ? SIXBIT/OPEN/ ? 5000,,.BII ? 1000,,TXTICH + TXTO ? TXTFN1 ? TXTFN2 ? SETZ TXTSNM] + JRST [ SKIPGE DELUP ;PRINT ERROR MESSAGE ONLY FOR SINGLE FILE + AOSA (P) + PUSHJ P,TXTFNF + MOVEI B,0 + POPJ P,] + SKIPGE DELUP' + PUSHJ P,SFNPNT + MOVEI A,SBUF +SCAN1: HRRZ B,A + LSH B,-12 + CAILE B,MK+1 + JRST SEOF + .CORE 1(B) + .VALUE + HRLI A,-2000 + .IOT TXTICH,A + JUMPL A,SEOF + MOVEI B,SEOF+MK*2000 + CAIL B,(A) + JRST SCAN1 +SEOF: .CLOSE TXTICH, + PUSH P,A + MOVEI A,2 + PUSHJ P,CMDO + PUSHJ P,CMDOF + MOVEI A,30. + .SLEEP A, + POP P,A + SUBI A,SBUF + HRRZS A + LSH A,-12 + AOS A + PUSH P,A + MOVE D,A + PUSHJ P,DECPNT + MOVEI B,[ASCIZ /K CORE LOCKED +/] + PUSHJ P,OUTSTR + POP P,A + HRL A,A + HRRI A,SBUF_-12 + .CALL XGPPLT + JRST XPLTL + MOVEI A,30.*30. + .SLEEP A, + .CORE SBUFP + .VALUE + SKIPL DELUP + JRST POPJ1 + .CALL [SETZ ? 'DELETE + CHSTS ? CHSTS+1 ? CHSTS+2 ? SETZ CHSTS+3] + JFCL + JRST @SCNRET + + +SFNPNT: MOVE A,[TXTICH,,CHSTS] + .RCHST A, + MOVE A,TXTSNM + MOVEM A,CHSTS+3 + HRLZS CHSTS + MOVEI A,CHSTS + PUSHJ P,PNTFNM + JRST TERPRI + +XPLTL: MOVEI B,[ASCIZ /XGP LOSSAGE! +/] + PUSHJ P,OUTSTR + .CORE SBUFP + .VALUE + POPJ P, + +XGPPLT: SETZ + SIXBIT /XGPIM/ + SETZ A + +SCNFN: MOVE D,[SIXBIT /DSK/] + MOVEM D,TXTO + SETZM DELUP + PUSHJ P,COMBAC + MOVE B,[PUSHJ P,COMGET] + MOVEI C,[0] + JSR FNR"GETFIL + POPJ P, + CAMN E,[SIXBIT /*/] + JSP B,[ SETOM DELUP + MOVSI E,(SIXBIT / + +WRITE: HRRZ X,X0 ;pick up x position of bit to write + TDNN B,MORMSK(D) ;don't mark till all motion done + CAIL X,XBITL ;out of range? + JRST M1 ;yes, ignore it + IMULI X,WDSPL ;words per scan line + HRRZ Z,Y0 ;pick up y position + CAIL Z,YBITL ;out of range? + JRST M1 ;yes, ignore + LSHC Z,-5 ;word # in line into z, bit position in high part of y + ADD X,Z ;add in the word number in the line + LSH Y,-<36.-5> ;move the bit position into spot to index with + MOVE Z,BITAB(Y) ;pick up the bit we really want to use + IORM Z,BITBUF(X) ;zap it into the buffer + JRST M1 ;back for another bit in the file + + CNTER==36. +MORMSK: REPEAT 5,[ + CNTER==CNTER-7 + 0 + 0 + 0 + 7_CNTER + 3_CNTER + 1_CNTER + 0 +] + +;this routine converts the bit map just produced into a possibly more compact +;representation, using the run length encoding option. It can never result +;in a longer representation, since it can always use the image representation +;if that is more efficient + +SLLUP: .CLOSE TXTICH, + MOVE A,LFTMAR + MOVEM A,VPOS' + MOVEI A,SBUF + MOVEM A,FPTR' + MOVEI A,BITBUF +SLLUP1: AOS VPOS + PUSH P,A + PUSHJ P,CNVRT + POP P,A + JUMPE B,SLLUP2 + MOVE C,FPTR + MOVE D,B + ADDI D,1 ;FOR THE EXTRA POSITION/LENGTH WORD + LSH D,1 + DPB D,[242000,,(C)] + MOVE D,VPOS + DPB D,[042000,,(C)] + AOS C + MOVE D,C + ADD D,B + MOVEM D,FPTR + HRLI C,BYTBF ;SOURCE + BLT C,-1(D) +SLLUP2: ADDI A,WDSPL + CAIGE A,BITBUF+MK*2000 + JRST SLLUP1 + MOVE A,FPTR + HRLI A,442000 + MOVEI B,2 + IDPB B,A + MOVEI B,XBITL+100 + ADD B,LFTMAR + TRO B,100000 + IDPB B,A + SETZM 1(A) + AOS FPTR + AOS A,FPTR + JRST SEOF + + +CNVRT: SETZM LSTBB' + SETZM BYTCNT' + SETZB E,D ;BIT COUNT, LAST DIFFERENT BIT COUNT + MOVEI C,0 + JSP T,DEP + JFCL + MOVEI C,0 + JSP T,DEP + JFCL + HRLI A,-WDSPL+2 +W1: MOVE B,(A) +W2: JFFO B,DOW ;FOUND A BLACK BIT +W3: ADDI D,32. ;ALL BITS OF THIS WORD WHITE + AOBJN A,W1 + MOVE C,LSTBB + MOVEM C,BYTCNT ;BACKUP BYTE BUFFER TO LAST BLACK BITS +REPEAT 3,[ MOVEI C,0 ;ESCAPE CODE + JSP T,DEP + JRST IMSL +] + MOVEI C,1 + JSP T,DEP + JRST IMSL + JRST ESL + +B1: SETCM B,(A) +B2: JFFO B,DOB ;FOUND A WHITE BIT +B3: ADDI D,32. + AOBJN A,B1 + MOVEI C,0 + JRST DOB ;PRETEND WE JUST GOT A WHITE BIT + +DOW: ANDCA B,MTB(C) + CAIL C,40 + JRST W3 + ADD C,D ;BIT POSITION OF THIS BIT + EXCH C,E ;LAST CHANGE UPDATE + SUBM E,C ;DIFFERENCE IN C +DOW2: CAILE C,377 + JRST DOW1 + JSP T,DEP + JRST IMSL + JRST B2 + +DOW1: MOVEM C,TEMP' + MOVEI C,377 + SUBM C,TEMP + JSP T,DEP + JRST IMSL + JSP T,DEP + JRST IMSL + MOVN C,TEMP + JRST DOW2 + +DOB: ANDCA B,MTB(C) + CAIL C,40 + JRST B3 + ADD C,D + EXCH E,C + SUBM E,C +DOB2: CAILE C,377 + JRST DOB1 + JSP T,DEP + JRST IMSL + MOVE C,BYTCNT + MOVEM C,LSTBB ;SAVE LAST BYTE USED FOR BLACKNESS + JRST W2 + +DOB1: MOVEM C,TEMP + MOVEI C,377 + SUBM C,TEMP + JSP T,DEP + JRST IMSL + JSP T,DEP + JRST IMSL + MOVN C,TEMP + JRST DOB2 + +MTB: REPEAT 36.,[ + <-1>_<-.RPCNT> +] + +DEP: MOVE X,BYTCNT + CAIL X,BYTMAX ;CAN WE DO BETTER IN IMAGE MODE? + JRST (T) ;YES + MOVE Y,X + ANDI Y,3 + LSH X,-2 + DPB C,BYTAB(Y) ;DEPOSIT IN THE KLUDGY FORMAT WANTED BY THE XGP + MOVEI C,0 + AOS BYTCNT + JRST 1(T) + +BYTAB: 241000,,BYTBF(X) + 341000,,BYTBF(X) + 041000,,BYTBF(X) + 141000,,BYTBF(X) + +BYTBF: BLOCK WDSPL + +;GET HERE WHEN THE RUN LENGTH ENCODED VERSION IS LONGER THAN AN IMAGE SCAN LINE, +;AND WE WANT TO CONVERT THE BIT MAP INTO AN IMAGE SCAN LINE. + +IMSL: MOVE A,-1(P) ;POINTER TO BEG OF BIT MAP + HRLI A,-WDSPL+2 + SETOM LSTBB ;WE HAVE BLACKNESS IN THIS LINE + SETZM BYTCNT ;START AT BEG OF THE BYTCOUNT + MOVEI C,0 ;ESC + JSP T,DEP + JFCL + MOVEI C,2 ;ENTER IMAGE MODE + JSP T,DEP + JFCL +IMSL1: MOVE C,(A) ;PICKUP WORD FROM BIT MAP + CIRC C,44 ;REVERSE BIT ORDER + MOVE C,D ;PICKUP FIRST 8 BITS + JSP T,DEP + JFCL + LSH D,-8 ;NEXT 8, ETC. + MOVE C,D + JSP T,DEP + JFCL + LSH D,-8 + MOVE C,D + JSP T,DEP + JFCL + LSH D,-8 + MOVE C,D + JSP T,DEP + JFCL + AOBJN A,IMSL1 ;BACK FOR THE NEXT BIT MAP WORD +ESL: MOVE B,BYTCNT + ADDI B,3 ;ROUND OFF TO NEXT HIGHER WORD + LSH B,-2 ;FOUR BYTES/WORD + SKIPN LSTBB + MOVEI B, ;RETURN ZERO IF THIS LINE IS NULL + POPJ P, + +;READ ONLY MEMORY + +SHWHGT: SKIPE NOTYPE + JRST POPJ1 + MOVEI E,HEIGHT +ROMSHW: CAIE A,12 + JRST ALTHUH +SHWARG: SKIPE NOTYPE + JRST POPJ1 + MOVE D,(E) + PUSH P,A + PUSHJ P,DECPNT + JRST POPAJ1 + +;HERE TO GIVE # TEXT LINES + +SETLIN: SKIPE NOTYPE + JRST POPJ1 + MOVEI E,NLINES + JRST ROMSHW + +VERSE: CAIE A,12 + JRST BADARG + PUSHJ P,VERTYP ;TYPE OUT VERSION # + PUSHJ P,CRLF ;RESTORES A TO RIGHT THING! + JRST POPJ1 + +;POSITIVE ONLY VARIABLES + +ONEARG: CAIN A,12 + JRST SHWARG ;NO ARG, SHOW WHAT WE HAVE + PUSHJ P,POSARG + JRST BADARG + MOVEM D,(E) + JRST POPJ1 + +SETLFT: MOVEI E,LFTMAR + JRST ONEARG + +SETTOP: SKIPA E,[TOPMAR] +SETBOT: MOVEI E,BOTMAR +SETVS1: PUSHJ P,ONEARG + JRST BADARG +SETVS2: PUSHJ P,CALINE ;RECALCULATE NLINES + JRST POPJ1 + +SETLSP: CAIE A,12 + PUSHJ P,POSARG + JRST SHWARG + MOVEM D,LSP + SETOM VSP ;CAN'T HAVE IT BOTH WAYS + JRST SETVS2 + +SETTST: MOVEI A,3 + PUSHJ P,CMDO + PUSHJ P,CMDOF + JRST COMMAN + +SETVSP: CAIE A,12 ;VSP IS A FUNNY ONE + PUSHJ P,POSARG + JRST BADARG + MOVEM D,VSP + SETOM LSP + JRST SETVS2 + +ROTATE: MOVSI A,PLTD2 + HRRI A,DOBIT + BLT A,DOBIT+43 + JRST POPJ1 + +;ANY VALUE LEGAL VARIABLES +SETX0: SKIPA E,[INITX0] +SETY0: MOVEI E,INITY0 + JRST ANYVAL + +SETFFC: MOVEI E,FFCUT ;CAUSES XGP TO CUT ONLY ON FORM FEED + JRST ANYVAL + +SETXTC: SKIPA E,[TXTCMD] +SETCUT: MOVEI E,AUTCUT +ANYVAL: CAIN A,12 + JRST SHWARG + PUSHJ P,ARGIN + JRST BADARG + MOVEM D,(E) + JRST POPJ1 + +;MISCELLANEOUS ROUTINES + +HEADER: SETZM HDRCNT ;SETS HEADING TEXT + CAIN A,12 ;NULL HEADER + JRST POPJ1 ; IS EASY + MOVEI B,HDRTXL*5 ;SIZE OF BUFFER + MOVE C,[440700,,HDRTXT] +HEAD1: PUSHJ P,COMGET + SOSL B ;DON'T OVERFLOW BUFFER + IDPB A,C + AOS HDRCNT + CAIE A,12 ;GO UNTIL WE FIND A LINE FEED + JRST HEAD1 + JUMPGE B,POPJ1 ;JUMPE IF ALL IS OKAY + MOVEI B,[ASCIZ /HEADER TRUNCATED/] + POPJ P, + +LIST: SETOM DFHDRF ;FLAG FOR DEFAULT HEADER +PRINT: SKIPE DSKCMD + JRST PRINT1 ;DIFFERENT THINGS FOR DSK COMNMANDS + MOVEM A,(P) ;CLOBBER RETURN ADDRESS + MOVEI B,[ASCIZ /PRINT MODE/] + PUSHJ P,TERPRI + POP P,A + CAIN A,12 + JRST COMMAN + PUSHJ P,COMBAC + JRST COMAN1 ;READ THE FILE SPEC THAT'S THERE + +;HERE TO FOR PRINT COMMAND WHILE READING DISK COMMANDS + +PRINT1: AOSE UDEPTH + JRST POPJ1 ;ONLY ALLOW 1 LEVEL + PUSHJ P,COMBAC ;UNREAD THE LAST CHARACTER + MOVE B,[PUSHJ P,COMGET] + MOVEI C,0 + JSR FNR"GETFIL ;NON-SKIP RETURN FOR NULL FILE SPEC + JRST POPJ1 ;IGNORE LOSSAGE + SETZM TXTFN1 + SETZM TXTFN2 + JUMPE E,POPJ1 + MOVEM E,TXTFN1 ;FN1 + SKIPN T + MOVSI T,360000 ;GREATER THAN + MOVEM T,TXTFN2 ;FN2 + SKIPE TT + MOVEM TT,TXTSNM ;SNAME + SKIPE D + MOVEM D,TXTO ;DEV + JRST POPJ1 + +;LIST PRINTS FILES WITH DEFAULT HEADER (TIME, DATE, AND PAGE #) +COMBAC: MOVE B,COMPNT + PUSHJ P,DECBP ;DECREMENT BYTE POINTER + MOVEM B,COMPNT + AOS COMCNT + POPJ P, + +KILL: SKIPE DSKCMD + JRST POPJ1 + .VALUE [ASCIZ /:KILL +/] + +LOGOUT: SKIPE DSKCMD + JRST POPJ1 + .VALUE [ASCIZ /:LOGOUT +/] + +SQUISH: SETOM SQSHFL ;JUST SET SQUISH FLAG + JRST POPJ1 .SEE SNDFNT + +BADARG: MOVEI B,[ASCIZ /ARG???/] + POPJ P, + +POPHUH: POP P,A +ALTHUH: MOVEI B,[ASCIZ /HUH/] + POPJ P, + +SHOW: SKIPE NOTYPE + JRST POPJ1 + PUSH P,A + MOVEI B,[ASCIZ /SKIP /] + MOVEI E,PSKIP + PUSHJ P,SHOW1 +IRP VAR,,[LSP,VSP,LFTMAR,TOPMAR,BOTMAR,NLINES,AUTCUT,FFCUT,TXTCMD] + MOVEI B,[ASCIZ /VAR! /] + MOVEI E,VAR + PUSHJ P,SHOW1 +TERMIN + MOVEI B,[ASCIZ /KSETS:/] + PUSHJ P,TERPRI + JRST KSET0A +KSET0: SKIPE NOTYPE + JRST POPJ1 + PUSH P,A +KSET0A: MOVEI FONT,0 +KSET1: PUSHJ P,KSET4 + SKIPN FNTFN1(FONT) + JRST [ MOVEI B,[ASCIZ /UNSPECIFIED/] + PUSHJ P,TERPRI + JRST KSET69] + MOVEI A,FNTO(FONT) + PUSHJ P,PNTFNM ;PRINT FILE NAME + PUSHJ P,CRLF +KSET69: ADDI FONT,FNTVLN + CAIGE FONT,MAXFNT*FNTVLN + JRST KSET1 + AOS -1(P) ;DO THE SKIP RETURN + JRST POPXIT + +SHOW1: PUSHJ P,OUTSTR + MOVE D,(E) + PUSHJ P,DECPNT + JRST CRLF + +KSET: CAIN A,12 + JRST KSET0 + PUSHJ P,COMBAC ;UN READ THE LAST CHARACTER + MOVE B,[PUSHJ P,COMGET] + PUSHJ P,GETF0 ;GET FONT FILE NAME (SETS UP C) + POPJ P, ;ERROR RETURN + PUSH P,A + MOVEI FONT,0 +KSET2: SKIPN FNTFN2(FONT) + JRST [ SKIPN DSKCMD + SKIPE NOTYPE + JRST KSET3 + PUSHJ P,KSET4 + MOVEI B,[ASCIZ /NONE SPECIFIED/] + PUSHJ P,TERPRI + JRST KSET3] + MOVE A,FNTO + SKIPN FNTO(FONT) + MOVEM A,FNTO(FONT) + MOVE A,FNTSNM + SKIPN FNTSNM(FONT) + MOVEM A,FNTSNM(FONT) + PUSHJ P,FNTOPN + JRST [ SKIPE NOTYPE + JRST KSET3 + PUSHJ P,KSET4 + PUSHJ P,FNTFNF + PUSHJ P,CRLF + JRST KSET3] + .CLOSE FNTICH, +KSET3: ADDI FONT,FNTVLN + CAIGE FONT,MAXFNT*FNTVLN + JRST KSET2 + JRST POPAJ1 + +KSET4: MOVE D,FONT + IDIVI D,FNTVLN + PUSHJ P,DECPNT + MOVEI A,40 + PUSHJ P,TYO + JRST TYO + +SAMPLE: PUSHJ P,VRESET + MOVEI B,[0] + CAIN A,12 + POPJ P, ;ERROR, NO FONT SPECIFIED + PUSHJ P,COMBAC ;BACK UP A CHARACTER + MOVE B,[PUSHJ P,COMGET] + PUSHJ P,GETF0 + POPJ P, ;ERROR + JUMPN FONT,CPOPJ ;MORE CHANCE FOR LOSSAGE + PUSH P,A + MOVE A,[FNTBEG,,FNTBEG+FNTVLN] + BLT A,FNTBEG+-1 + MOVE A,[[SIXBIT /DSK/ ? SIXBIT /FIX25/ ? SIXBIT /KST/ ? SIXBIT /FONTS/],,FNTBEG] + BLT A,FNTBEG+FNTVLN-1 + MOVEI FONT,0 +SAMP1: SETOM FCHFLG(FONT) + PUSHJ P,FNTOPN + JRST POPAJ ;LOSSAGE + .CLOSE FNTICH, + JUMPN FONT,SAMP2 + ADDI FONT,FNTVLN + JRST SAMP1 +SAMP2: SETZM HDRCNT + MOVEI A,FNTO+FNTVLN + MOVE C,[440700,,HDRTXT] + PUSHJ P,SAMP3 ;PUT FONT NAME IN FILE + PUSHJ P,SAMP8 ;THROW IN SOME EXTRA CARRIAGE RETURNS + PUSHJ P,SAMP8 + MOVE A,[[SIXBIT /DSK/ ? SIXBIT /CODES/ ? SIXBIT />/ ? SIXBIT /FONTS/],,TXTO] + BLT A,TXTSNM + POP P,A + PUSHJ P,COMXIT + SKIPE DSKCMD + JRST POPJ1 + MOVEM A,(P) ;CLOBBER RETURN ADDRESS + MOVEI B,[ASCIZ /PRINT MODE/] + PUSHJ P,TERPRI + JRST POPAJ + +SAMP3: PUSH P,A + MOVE B,(A) ;DEVICE + CAMN B,[SIXBIT /DSK/] ;ONLY AI HAS AN XGP + MOVE B,[SIXBIT /AI/] + PUSHJ P,SAMP4 + MOVEI A,": + PUSHJ P,SAMP5 + MOVE A,(P) + MOVE B,3(A) ;SNAME + PUSHJ P,SAMP4 + MOVEI A,"; + PUSHJ P,SAMP5 + MOVE A,(P) + MOVE B,1(A) ;FILE NAME 1 + PUSHJ P,SAMP4 + MOVEI A,40 + PUSHJ P,SAMP5 + POP P,A + MOVE B,2(A) ;FILE NAME 2 +SAMP4: MOVEI A,0 + LSHC A,6 + ADDI A,40 + PUSHJ P,SAMP5 + JUMPN B,SAMP4 + POPJ P, + +SAMP8: MOVEI A,15 + PUSHJ P,SAMP5 + MOVEI A,12 +SAMP5: AOS HDRCNT + IDPB A,C + POPJ P, + +SAMP6: HRLI B,440700 +SAMP7: ILDB A,B + JUMPE A,CPOPJ + PUSHJ P,SAMP5 + JRST SAMP7 + +RESET: PUSHJ P,VRESET + AOS (P) + JRST COMXIT + +;TYPES LIST OF COMMANDS + +HELP: SKIPE NOTYPE + JRST POPJ1 + MOVEI D,0 +HELP1: CAIL D,COMTBL + POPJ P, + MOVS B,COMTAB(D) + MOVE B,(B) + PUSHJ P,SIXO + PUSHJ P,CRLF + AOJA D,HELP1 + +;SET TO SKIP FIRST PAGES OF FILE + +SETPSK: MOVEI E,PSKIP + CAIN A,12 + JRST SHWARG + PUSHJ P,POSARG + JRST BADARG + MOVNS D + CAMGE D,PSKIP + MOVEM D,PSKIP + JRST POPJ1 + +;RESET VARIABLES + +VRESET: MOVSI B,PLTD1 + HRRI B,DOBIT + BLT B,DOBIT+43 +IRP VAR,,[VSP,LSP,LFTMAR,TOPMAR,BOTMAR,PLINES,AUTCUT,PSKIP,TXTCMD,UDEPTH,INITX0,INITY0,SQSHFL,FFCUT] + MOVE B,[I!VAR] + MOVEM B,VAR +TERMIN + +;CALCULATES # TEXT LINES IN TEXT AREA + +CALINE: MOVE D,PLINES + SUB D,TOPMAR + SUB D,BOTMAR + MOVEM D,SLINES + SKIPGE E,LSP ;USE LSP IF SET + JRST CALIN1 + SKIPGE E,VSP + MOVEI E,DVSP ;IF VSP NOT SET USE DEFAULT + ADD E,HEIGHT +CALIN1: IDIV D,E + MOVEM D,NLINES + POPJ P, + +;RESET FONTS + +FRESET: MOVE A,[[SIXBIT /DSK/ ? SIXBIT /FIX25/ ? SIXBIT /KST/ ? SIXBIT /FONTS/ + 25. ;HEIGHT + 20. ;BASE LINE + 0 ;CPA + 0 ;KST ID + -1],,FNTBEG] ;FCHFLG + BLT A,FNTBEG+FNTVLN-1 + SETZM FNTBEG+FNTVLN + MOVE A,[FNTBEG+FNTVLN,,FNTBEG+FNTVLN+1] + BLT A,FNTBEG+-1 + POPJ P, + +;RESET PRINT FILE NAME + +PRESET: MOVE A,[SIXBIT /DSK/] + MOVEM A,TXTO + SETZM TXTFN1 + SETZM TXTFN2 + POPJ P, + +;CALCULATES SIZE OF PAGE WITH CURRENT SETTINGS + +SIZE: SKIPE NOTYPE + JRST POPJ1 + MOVEI FONT,0 ;DO CALUCLATIONS WITH THIS FONT + CAIE A,12 + JRST SIZE2 ;SET SIZE OF PAGE BY SPECIFICATION IN INCHES + PUSH P,A + PUSHJ P,FNTOPN + JRST [ PUSHJ P,FNTFNF + JRST POPHUH] + .CLOSE FNTICH, + JUMPLE A,[ MOVEI B,[ASCIZ /ILLEGAL HEIGHT/] + JRST COMER1] + MOVE A,SLINES ;# SCAN LINES IN TEXT AREA + ADD A,TOPMAR + ADD A,BOTMAR + IDIVI A,192. ;SCAN LINE DENSITY (LINES/INCH) + PUSH P,B + MOVE D,A + PUSHJ P,DECPNT + MOVEI A,". + PUSHJ P,TYO + MOVE D,(P) + IMULI D,1000. ;THREE DECIMAL PLACES SUFFICES + IDIVI D,192. ;SCAN LINE DENSITY + MOVEI A,"0 + CAIGE D,10. + PUSHJ P,TYO + CAIGE D,100. + PUSHJ P,TYO + PUSHJ P,DECPNT + MOVEI A,"" + PUSHJ P,TYO + SKIPN (P) + JRST SIZE1 + MOVEI B,[ASCIZ / (/] + PUSHJ P,OUTSTR + MOVE D,(P) + PUSHJ P,DECPNT + MOVEI B,[ASCIZ \/192)\] + PUSHJ P,OUTSTR +SIZE1: POP P,(P) + AOS -1(P) ;SKIP RETURN + JRST POPXIT + +;HERE READ PAGE SIZE IN INCHES AND SET SLINES + +SIZE2: PUSHJ P,ARGIN ;READ STRING OF DIGITS + JRST [ CAIE A,". + JRST BADARG + JRST .+1] + JUMPLE D,BADARG + IMULI D,1000. ;THOUSANDTHS OF INCHES + PUSH P,D + CAIN A,12 + JRST SIZE4 ;NO DECIMAL FRACTION + PUSHJ P,COMGET ;GET FIRST DIGIT FOR ARGIN + CAIN A,15 + JRST .-2 + CAIN A,12 + JRST SIZE4 + PUSHJ P,ARGIN +SIZE3: JRST [ POP P,(D) + JRST BADARG] + JUMPL D,SIZE3 + IMULI D,1000. ;THOUSANDTH'S OF INCHES + IDIV D,C ;SCALE TO # DIGITS READ + ADDM D,(P) +SIZE4: POP P,D + IMULI D,192. + IDIVI D,1000. ;SCAN LINES IN TEXT AREA + MOVE E,D + SUB D,TOPMAR + SUB D,BOTMAR + JUMPLE D,[ MOVEI B,[ASCIZ /TOP AND BOTTOM MARGINS EXCEED SIZE SPECIFIED/] + POPJ P,] + MOVEM E,PLINES + JRST SETVS2 ;RECALCULATE NLINES AND SKIP RETURN + +;HERE TO TRANSMIT FONTS IN ALTER MODE + +FONTSA: CAIE A,12 + JRST HUH + PUSH P,A + MOVEI FONT,0 ;IF HE'S GONE TO ALL THIS TROUBLE. . . +FONTA1: SKIPE FNTFN1(FONT) ;MAKE SURE A FONT IS SPECIFIED + SETOM FCHFLG(FONT) ;TRANSMIT ALL FONTS + ADDI FONT,FNTVLN + CAIGE FONT,MAXFNT*FNTVLN + JRST FONTA1 + PUSHJ P,FONTS + JRST POPAJ + +;HERE TO TRANSMIT FONTS + +FONTS: PUSHJ P,CLRKST ;CLEAR ALL CHARACTERS SETS FIRST + MOVEI FONT,0 ;TRANSMIT FONTS THAT NEED IT +FONTS0: AOSE FCHFLG(FONT) + JRST FONTS1 ;DONT NEED TO SEND THAT ONE + PUSHJ P,FNTOPN ;OPEN FONT FILE (READS FIRST 2 WORDS) + JRST [ PUSHJ P,FNTFNF ; FILE NOT FOUND + PUSHJ P,CRLF + JRST FNTS0A] + PUSHJ P,SNDFNT +FNTS0A: .CLOSE FNTICH, +FONTS1: ADDI FONT,FNTVLN + CAIGE FONT,MAXFNT*FNTVLN + JRST FONTS0 + POPJ P, + +;HERE TO CLEAR ALL KSETS IN PDP-11 + +CLRKST: MOVEI E,MAXFNT-1 +CLRKS1: MOVEI A,0 + PUSHJ P,CMDO ;KSET MODE + PUSHJ P,CMDO ;CLEAR . . . + MOVE A,E ;THIS CHARACTER SET + PUSHJ P,CMDO + SOJGE E,CLRKS1 + POPJ P, + +;COMMAND BUFFER FILLING AND GETTING + +TTYLIN: MOVE B,[010700,,COMBUF-1] + SETZM COMCNT +TTYL1: PUSHJ P,TYI + JUMPE A,TTYL1 + CAIN A,177 + JRST RUBOUT ;RUBOUT + CAIN A,4 + JRST [ MOVEI B,[ASCIZ / ???/] + PUSHJ P,OUTSTR + PUSHJ P,SOUT ;CONTROL-D CANCELS WHOLE LINE + JRST TTYLIN] + CAIN A,14 + JRST TTYFF ;FORM FEED RETYPES BUFFER + CAIN A,15 + JRST TTYCR + CAIN A,12 + JRST TTYLF + PUSHJ P,COMPUT + JRST TTYL1 + +RUBOUT: SOSGE COMCNT + JRST [ PUSHJ P,CRLF + JRST TTYLIN] + LDB A,B + PUSHJ P,TYO + PUSHJ P,DECBP ;DECREMENT BYTE POINTER + JRST TTYL1 + +DECBP: ADD B,[070000,,0] + JUMPGE B,CPOPJ + SUB B,[430000,,1] + POPJ P, + +TTYFF: PUSH P,B ;FORM FEED RETYPES BUFFER + PUSH P,C + PUSHJ P,CRLF + SKIPG C,COMCNT + JRST TTYFFX + MOVE B,[010700,,COMBUF-1] +TTYFF1: ILDB A,B + PUSHJ P,TYO + SOJG C,TTYFF1 +TTYFFX: POP P,C + POP P,B + JRST TTYL1 + +TTYLF: MOVEI A,15 + PUSHJ P,TYO +TTYCR: PUSHJ P,COMPUT + MOVEI A,12 + PUSHJ P,COMPUT + MOVE B,[010700,,COMBUF-1] + MOVEM B,COMPNT + POPJ P, + +COMPUT: IDPB A,B + AOS COMCNT + POPJ P, + +COMGET: SOSGE COMCNT + .VALUE + ILDB A,COMPNT + POPJ P, + +;FILL COMBUF WITH A COMMAND LINE FROM DISK FILE + +DSKLIN: SETZM COMCNT + MOVE B,[010700,,COMBUF-1] + MOVEM B,COMPNT +DSKL1: PUSHJ P,TXTI + JUMPE A,DSKL1 ;IGNORE NULLS + JUMPL A,DSKSTP ;EOF? + CAIE A,3 + CAIN A,14 + JRST DSKSTP ;GET OUT + CAIN A,12 + JRST DSKLF ;GET OUT + CAIE A,15 ;IGNORE CARRIAGE RETURNS + PUSHJ P,COMPUT + JRST DSKL1 + +DSKSTP: MOVEI A,1 ;STOP READING FROM DISK FILE AFTER THIS LINE + MOVEM A,DSKCMD +DSKLF: MOVEI A,15 + PUSHJ P,COMPUT + MOVEI A,12 + PUSHJ P,COMPUT + MOVEI A,0 + JRST COMPUT + +;TTY ROUTINES + +TERPRI: PUSHJ P,OUTSTR +CRLF: MOVEI A,15 + PUSHJ P,TYO + MOVEI A,12 +TYO: .IOT TTYOCH,A + POPJ P, + +SOUT: PUSHJ P,CRLF + MOVEI A,"* + JRST TYO + +TYI: .IOT TTYICH,A + POPJ P, + +VERTYP: MOVE B,[.FNAM1] ;PRINT VERSION NUMBER + PUSHJ P,SIXO + MOVEI A,". + PUSHJ P,TYO + MOVE B,[.FNAM2] +SIXO: MOVE C,[440600,,B] +SIXO1: ILDB A,C + JUMPE A,CPOPJ + ADDI A,40 + PUSHJ P,TYO + TLNE C,770000 + JRST SIXO1 + POPJ P, + +;FILES NOT FOUND + +TXTFNF: MOVEI A,TXTO + MOVEI B,[ASCIZ /TEXT /] + JRST FNF +FNTFNF: MOVEI B,[ASCIZ /FONT /] + MOVEI A,FNTO(FONT) +FNF: PUSH P,A + AOS SET ;ERRORS HAVE HAPPENED + PUSHJ P,OUTSTR + POP P,A + PUSHJ P,PNTFNM ;PRINT FILE NAME + MOVEI A,40 + PUSHJ P,TYO +ERRTYP: .OPEN ERRICH,[ (SIXBIT /ERR/) + 1] + JRST .-1 ;DON'T TAKE NO FOR AN ANSWER +ERRTY1: .IOT ERRICH,A + CAIGE A,40 + JRST [ .CLOSE ERRICH, ;ANY CONTROL CHARACTER STOP THIS NON-SENSE + POPJ P,] + PUSHJ P,TYO + JRST ERRTY1 + +OUTSTR: HRLI B,440700 +OUTS1: ILDB A,B + JUMPE A,CPOPJ + PUSHJ P,TYO + JRST OUTS1 + +DECPNT: JUMPGE D,DECPN1 + MOVEI A,"- + PUSHJ P,TYO + MOVMS D +DECPN1: IDIVI D,10. + HRLM E,(P) + JUMPE D,DECPN2 + PUSHJ P,DECPN1 +DECPN2: HLRZ A,(P) + ADDI A,"0 + JRST TYO + +;PRINTS FILE NAME + +PNTFNM: PUSH P,A + MOVE B,(A) ;DEVICE + PUSHJ P,SIXO + MOVEI A,": + PUSHJ P,TYO + MOVE A,(P) + MOVE B,3(A) ;SNAME + PUSHJ P,SIXO + MOVEI A,"; + PUSHJ P,TYO + MOVE A,(P) + MOVE B,1(A) ;FILE NAME 1 + PUSHJ P,SIXO + MOVEI A,40 + PUSHJ P,TYO + POP P,A + MOVE B,2(A) ;FILE NAME 2 + JRST SIXO + +CRASH: MOVE C,ABORTL+1 + MOVEI D,10 + MOVEM D,ABORTL + LSH C,-24 + MOVEM C,XGPES' + TRNE C,200 + PUSHJ P,E1 + TRNE C,40 + PUSHJ P,E2 + TRNE C,20 + PUSHJ P,E3 + TRNE C,10 + PUSHJ P,E4 + TRNE C,4 + PUSHJ P,E5 +ABRTED: SETZM PSKIP + SETZM HDRCNT + SETZM DFHDRF + MOVEI B,[ASCIZ /LISTING ABORTED/] + PUSHJ P,OUTSTR + MOVE P,[-PDL,,PDB-1] + JRST RECYCL + +E1: MOVEI B,[ASCIZ /PAPER LOW+/] + JRST OUTSTR + +E2: MOVEI B,[ASCIZ /NO -12, PAPER JAM+/] + JRST OUTSTR + +E3: MOVEI B,[ASCIZ /FUSER COLD+/] + JRST OUTSTR + +E4: MOVEI B,[ASCIZ /FILAMENT COLD+/] + JRST OUTSTR + +E5: MOVEI B,[ASCIZ %DRUM/WEB/PAPER OUT+%] + JRST OUTSTR + +;GETS PAGES FROM PDP-11 +; CALL WITH 11 ADDRESS IN A AND # BYTES DESIRED IN B + +GET11: LSH B,-2 ;PROTECTION IN 10 WORDS + TRZ A,3 ;AVOID POSSIBLE EMBARASSEMENT + LSH A,10 ;10 STYLE ADDRESS + TLO A,600000 ;VALID AND WRITE ENABLE + MOVEI C,XGP11 + LSH C,26. ;PDP-11 # + IOR A,C +GET11A: MOVEI C,1777 ;POSSIBLE PROTECTION + CAMG B,C + MOVE C,B ;ONLY WANTS PART OF PAGE + AOS T11PAG + IOR C,A ;MAP ENTRY + .CALL [ SETZ + SIXBIT /T11MP/ + T11PAG + SETZ C] + .VALUE NOPDP11 + ADD A,[2000_12] ;SET FOR NEXT PAGE + SUBI B,2000 + JUMPGE B,GET11A ;HE WANTS MORE + POPJ P, + +NOPDP11: +ASCIZ /: CANNOT GET PDP-11 PAGES  +/ + +;SENDS 8 BIT BYTE TO 11 + +CMDO: SOSGE T,CMDPAR(CHNL) ;GET PARITY + MOVNS T,CMDPAR(CHNL) + SKIPL @CHHDRP(CHNL) + JRST ABRTED ;CHANNEL CLOSED BY 11 + IDPB A,@CMDPTR(CHNL) + IBP @CMDPTR(CHNL) + SOSLE CMDCNT(CHNL) + POPJ P, ;MORE ROOM IN BUFFER + +;HERE TO FORCE BUFFER + +CMDOF: MOVE T,CMDSIZ(CHNL) ;SIZE OF THIS BUFFER + SUB T,CMDCNT(CHNL) ;NUMBER OF BYTES IN BUFFER + JUMPE T,CPOPJ ;DON'T FORCE + SKIPL @CHHDRP(CHNL) + JRST ABRTED ;CHANNEL CLOSED BY 11 + IDPB T,CMDBUF(CHNL) ;MARK WITH VALID COUNT + ILDB T,CMDBUF(CHNL) ;NEXT ON RING + JUMPE T,[ SKIPN @CMDBUF(CHNL) ;10-11 INTERFACE IS ON LEVEL 7 + .HANG ;AND SO IS RUG + LDB T,CMDBUF(CHNL) + JRST .] + PUSHJ P,SETCBF + SKIPL @CMDBUF(CHNL) + .HANG ;WAIT FOR THAT ONE TO FREE UP +CMDOF1: PUSH P,A + ADDI T,1 ;POINT AT NEXT TEN WORD + ILDB A,T ;SIZE OF THIS BUFFER + MOVEM A,CMDCNT(CHNL) + MOVEM A,CMDSIZ(CHNL) + MOVEI A,10 ;SWITCH TO 8 BIT BYTES + DPB A,[300600,,T] + MOVEI A,0 + EXCH A,T + MOVEM A,@CMDPTR(CHNL) + ADDI T,1 + IBP A + MOVEM A,@CMDPTR(CHNL) + SETZM CMDPAR(CHNL) +POPAJ: POP P,A +CPOPJ: POPJ P, + +;HERE TO OPEN A 10-11 CHANNEL + +OPEN: SKIPL @CHHDRP(CHNL) + .HANG + MOVEI T,@CHHDRP(CHNL) + PUSHJ P,ADRING ;WILL POINT TO BUFFER 11 IS HACKING + PUSHJ P,ADRING ;ADVANCE TO NEXT BUFFER + SKIPL (T) + .VALUE ;THAT BUFFER BETTER BE FREE + JRST CMDOF1 ;FOUND HIM SET POINTERS + +ADRING: LDB T,[042000,,(T)] +SETCBF: SUB T,BUFORG ;OFFSET IN BYTES + SKIPGE T + .VALUE ;PDP-11 BUFFERS BUGGERED + LSH T,-2 ;IN PDP-10 WORDS + ADD T,[442000,,BUFFER] + MOVEM T,CMDBUF(CHNL) + POPJ P, + +;HERE TO SEND WORD IN A TO 11 + +WRDO: PUSH P,A + PUSHJ P,CMDO ;LOW ORDER BYTE FIRST + MOVE A,(P) + LSH A,-10 ;NOW HIGH ORDER BYTE + PUSHJ P,CMDO + JRST POPAJ + +;TIME SHARING I/O ROUTINES + +FNTOPN: SETZM HEIGHT(FONT) + SETZM KSTID(FONT) + MOVE A,FNTSNM(FONT) + .SUSET [.SSNAM,,A] + .CALL [ SETZ ? SIXBIT/OPEN/ ? 5000,,.UII ? 1000,,FNTICH + FNTO(FONT) ? FNTFN1(FONT) ? SETZ FNTFN2(FONT)] + POPJ P, + PUSHJ P,FNTIN + MOVEM A,KSTID(FONT) + PUSHJ P,FNTIN + HRRZM A,HEIGHT(FONT) + PUSH P,A + LDB A,[221100,,(P)] + MOVEM A,BASE(FONT) + LDB A,[331100,,(P)] + MOVEM A,CPA(FONT) + HRRZS (P) ;RETURNS HEIGHT OF FONT IN A + PUSHJ P,CALINE +POPAJ1: POP P,A +POPJ1: AOS (P) + POPJ P, + +TXTOPN: .SUSET [.SSNAM,,TXTSNM] + .CALL [ SETZ ? SIXBIT/OPEN/ ? 5000,,.BAI ? 1000,,TXTICH + TXTO ? TXTFN1 ? SETZ TXTFN2] + POPJ P, + AOS (P) + SETZM TXTFLG ;THAT FILE IS OPEN +TXTBF: SKIPGE A,TXTFLG + POPJ P, ;FOUND EOF + SETZM TXTBUF + MOVE A,[TXTBUF,,TXTBUF+1] + BLT A,TXTBUF+TXTBFL-1 + MOVE A,[-TXTBFL,,TXTBUF] + .IOT TXTICH,A + MOVEM A,TXTFLG ;TRIPS EOF FLAG + MOVEI A,TXTBFL*5 + MOVEM A,TXTCNT + MOVE A,[440700,,TXTBUF] + MOVEM A,TXTPTR + MOVEI A,0 + SKIPL TXTFLG ;LAST BUFFER? + POPJ P, + HLRO A,TXTFLG ;CALCULATE # WORDS READ + ADDI A,TXTBFL + PUSH P,A + IMULI A,5 ;# CHARACTERS READ + MOVEM A,TXTCNT + POP P,A + ADDI A,TXTBUF + SETOM TXTBUF-1 ;END TEST IF BUFFER HAS ONLY EOF STYLE CHARACTERS IN IT. + HRLI A,010700 ;LAST BYTE OF LAST WORD IN BUFFER + PUSH P,B +DBPLR: LDB B,A + JUMPE B,DBPL ;NULL, IGNORE + CAIE B,3 + CAIN B,14 + JRST DBPL ;EITHER EOF CHAR OR FORM FEED, FLUSH +TXTBIX: MOVEI A, + POP P,B + POPJ P, + +DBPL: MOVEI B,0 + DPB B,A + ADD A,[070000,,] ;BACKUP THE BYTE POINTER + JUMPGE A,DBPLR ;RETURN TO CHECK THIS CHAR + SOS A + HRLI A,10700 ;BACK UP A WORD WORTH + JRST DBPLR + +;HERE TO GET ONE CHARACTER FROM TEXT BUFFER + +TXTBFI: PUSHJ P,TXTBF + JUMPL A,CPOPJ ;EOF +TXTI: SOSGE TXTCNT + JRST TXTBFI + ILDB A,TXTPTR + POPJ P, + +;HERE TO GET WORD FROM FONT FILE + +FNTIN: .IOT FNTICH,A + POPJ P, + +;;; ROUTINE TO PRE-SCAN TEXT FILE AND DECIDE WHAT CHARS ARE NEEDED. +;;; SETS BITS IN SQSHTB FOR THE SNDFNT ROUTINE TO LOOK AT. +;;; SKIPS ON ***** FAILURE **** TO OPEN THE TEXT FILE. + .SEE RECYCL + +PRESCN: SETZM SQSHTB ;CLEAR BIT TABLE + MOVE A,[SQSHTB,,SQSHTB+1] + BLT A,SQSHTB+177 + PUSHJ P,TXTOPN ;OPEN TEXT FILE + JRST POPJ1 ;FAILED + SKIPA E,[400000,,0] ;INITIALLY IN FONT 0 +PRSC0: IORM E,SQSHTB(A) ;HERE IF CHAR IS ACTUALLY USED (SET BIT) +PRSC1: PUSHJ P,TXTI ;GOBBLE CHAR FROM FILE + JUMPL A,CPOPJ ;EXIT ON EOF + JRST @.+1(A) + PRSC1 ;NULL + REPEAT 7, PRSC0 ;NORMAL GUYS + REPEAT 3, PRSC1 ;BS, TAB, LF + PRSC0 ;^K (NORMAL) + REPEAT 2, PRSC1 ;FF, CR + REPEAT 176-^M, PRSC0 ;NORMAL GUYS + PRSC2 ;RUBOUT (XGP ESCAPE) + + +PRSC2: PUSHJ P,TXTI ;XGP ESCAPE + JRST @.+1(A) + PRSC0 ;NORMAL + PRSC3 ;XGP ESCAPE 1 (GOBBLES N BYTES) + PRSC3C ;XGP ESCAPE 2 (GOBBLES 1 BYTE) + PRSC3B ;XGP ESCAPE 3 (GOBBLES 2 BYTES) + PRSC11 ;XGP ESCAPE 4 (GOBBLES 11. BYTES) + REPEAT 3, [.VALUE] ;RESERVED + REPEAT 3, PRSC0 ;BS, TAB, LF -- NORMAL + [.VALUE] ;RESERVED + REPEAT 2, PRSC0 ;FF, CR -- NORMAL + REPEAT 37-^M, [.VALUE] ;RESERVED + REPEAT 137, PRSC0 ;NORMAL GUYS + PRSC0 ;RUBOUT -- NORMAL + + +PRSC3: PUSHJ P,TXTI ;ESCAPE 1 + JRST @PRST(A) +PRST: REPEAT 40, PRSC3A ; FONT SELECT + PRSC3B ;40 COLUMN SELECT (2 BYTES) + PRSC3C ;41 ! UNDERSCORE (1 BYTE) + PRSC3C ;42 " LINE SPACE (1 BYTE) + PRSC3C ;43 # ABSOLUTE BASE LINE ADJ (1 BYTE) + PRSC1 ;44 $ PAGE NUMBER (NO BYTES) + PRSC3D ;45 % HEADING (COUNT, THEN N BYTES) + PRSC1 ;46 & START UNDERLINE (NO BYTES) + PRSC3C ;47 ' STOP UNDERLINE (1 BYTE) + PRSC3C ;50 ( INTERCHAR SPACING (1 BYTE) + PRSC3B ;51 ) VARIABLE WIDTH UNDERLINE (2 BYTES) + PRSC3C ;52 * RELATIVE BASE LINE ADJUST (1 BYTE) +PRSTL==.-PRST + REPEAT 200-PRSTL, [.VALUE] ;RESERVED + +PRSC3A: MOVSI E,400000 ;FONT SELECT + MOVNS A + LSH E,(A) + JRST PRSC1 + +PRSC3B: PUSHJ P,TXTI ;SKIP 2 BYTES +PRSC3C: PUSHJ P,TXTI ;SKIP 1 BYTE + JRST PRSC1 + +PRSC3D: PUSHJ P,TXTI ;SKIP N BYTES + SKIPA D,A +PRSC11: MOVEI D,11. ;SKIP 11. BYTES +PRSC3E: SOJL D,PRSC1 + PUSHJ P,TXTI + JRST PRSC3E + +COMMENT $ MIT FONT FORMAT AND CMU FONT FORMAT + +WORDS 0-1 + KSTID + BYTE (9) COLUMN_POSITION_ADJUSTMENT,BASE_LINE (18) HEIGHT + ;base line # rasters from top of character matrix +REMAINDER OF FILE: ONE BLOCK OF DATA FOR EACH CHARACTER + USER_ID + ;NOT USED 4/10/74 but LOW ORDER BIT MUST BE 1 + LEFT_KERN,,CODE + ;left kern always 0 for CMU + RASTER_WIDTH,,CHARACTER_WIDTH + ;raster width always 0 for CMU + CHARACTER_MATRIX + ;the matrix is stored 4 8-bit bytes per word so that + ;ILDB with 8-bit byte size gets successive bytes. + ;The bits are bit reversed in each byte (high order + ;bit of character in low order bit of byte). + ;the matrix is stored row by row. +$ + +;TRANSMITS FONT OVER COMMAND CHANNEL + +SNDFNT: MOVE A,FONT ;CONVERT FONT INDEX TO FONT # + IDIVI A,FNTVLN + MOVN B,A + MOVSI X,400000 + LSH X,(B) ;X HAS BIT FOR SQSHTB + SKIPGE SQSHFL + JSP E,SQCHK ;DON'T SEND FONT IF NO CHARACTERS USED + PUSH P,A ;SAVE FONT # + MOVEI A,0 ;ESCAPE TO KSET + PUSHJ P,CMDO + MOVNI A,1 ;LOAD THIS FONT + PUSHJ P,CMDO + POP P,A ;FONT # + PUSHJ P,CMDO + MOVE A,HEIGHT(FONT) ;HEIGHT + PUSHJ P,WRDO + MOVE A,BASE(FONT) ;BASE LINE + PUSHJ P,WRDO +SNDFN0: PUSHJ P,FNTIN ;IGNORE USER ID + trnn a,1 ;check terminating bit + jrst [ movei b,[asciz /bad font: /] + pushj p,outstr + movei a,fnto(font) + pushj p,pntfnm + pushj p,crlf + jrst sndf0a + ] +SNDF0A: PUSHJ P,FNTIN ;CHARACTER CODE + MOVE E,A + HRRZS A ;CLEAR KERN INFO + CAILE A,177 + HRROI A,200 ;ANY ILLEGAL CHARACTER STOPS US + SKIPGE SQSHFL ;IF SQUISHING, AND IF NOT END OF FONT, + JUMPGE A,SNDF7 ; THEN DECIDE WHETHER TO SEND CHARACTER +SNDF0H: movem a,lstchr + PUSHJ P,CMDO ;"SEND" IT + JUMPL A,SNDFXT ;FORCE BUFFER AND EXIT + HLRES E ;LEFT KERN + ADD E,CPA(FONT) ;FUDGE CPA INTO KERN + MOVN A,E ;FUDGE FOR THE PDP-11 PROGRAM + PUSHJ P,CMDO + PUSHJ P,FNTIN ;RASTER WIDTH,,CHARACTER WIDTH + SKIPG A + jrst [ movei b,[asciz /zero or negative char width: /] + jrst cfntnm ;0 OR NEGATIVE WIDTH + ] + ADD A,E ;FUDGE IN KERN AND COLUMN POSITION ADJUSTMENT + JUMPLE A,[ movei b,[asciz /kern or cpa problem: /] + jrst cfntnm + ] ;HALF HEARTED CHECK + PUSHJ P,WRDO ;SPACING WIDTH + TLNE A,-1 + HLRZS A + PUSHJ P,WRDO ;RASTER WIDTH + ADDI A,7 + LSH A,-3 ;# 8 BIT BYTES PER ROW + MOVEM A,BYPR ;BYTS PER ROW + MOVE E,HEIGHT(FONT) + MOVE C,BYPR +SNDF1: PUSHJ P,FNTIN + MOVE D,A ;BYTES COME PACKED 4 PER WORD + MOVE B,[441000,,D] ;THIS IS HOW WE UNPACK THEM +SNDF2: ILDB A,B + PUSHJ P,CMDO + SOJLE C,SNDF5 ;THATS ALL FOR THIS ROW +SNDF21: TLNN B,700000 + JRST SNDF1 ;THAT'S ALL FOR THIS WORD + JRST SNDF2 + +cfntnm: pushj p,outstr + move a,lstchr' + pushj p,decpnt + movei a,". + pushj p,tyo + movei a,40 + pushj p,tyo + movei a,fnto(font) + pushj p,pntfnm + pushj p,crlf + .value + +SNDF5: MOVE C,BYPR + MOVEI A,0 + TRNE C,1 ;IF ODD # OF BYTES, SEND A 0 BYTE + PUSHJ P,CMDO + SOJLE E,SNDFN0 ;THATS ALL FOR THIS CHAR + JRST SNDF21 + +;HERE TO DECIDE WHETHER TO SEND CHAR IN SQUISH MODE + +SNDF7: TDNE X,SQSHTB(A) ;IF BIT NOT SET IN SQSHTB, + JRST SNDF0H ; MUST SKIP OVER CHARACTER + PUSHJ P,FNTIN ;SKIP RASTER WIDTH,,CHARACTER WIDTH +SNDF7A: PUSHJ P,FNTIN + TRNN A,1 ;BIT 1.1 => USER ID FOR NEXT CHAR + JRST SNDF7A + JRST SNDF0A + +;HERE EXIT SNDFNT + +SNDFXT: PUSHJ P,CMDOF ;FORCE BUFFER + SKIPGE KSTLOD ;WAIT FOR PDP-11 TO FINISH + .HANG + LDB D,[242000,,KSTLOD] ;# CHARACTERS MISSED + JUMPE D,CPOPJ + PUSHJ P,DECPNT ;TELL HIM HOW MANY HE LOST + MOVEI B,[ASCIZ / CHARACTERS LOST FONT /] + PUSHJ P,OUTSTR + MOVE D,FONT + IDIVI D,FNTVLN + PUSHJ P,DECPNT ;PRINT FONT # + MOVEI A,40 + PUSHJ P,TYO + MOVEI A,FNTO(FONT) + PUSHJ P,PNTFNM + JRST CRLF + +;SCAN THROUGH SQSHTB FOR THIS FONT, IF NO CHARACTERS IN THIS FONT +;ARE USED THE TAKE POPJ RETURN OTHER WISE RETURN TO SNDFNT + +SQCHK: MOVEI B,177 ;CHARACTER CODE +SQCHK1: TDNE X,SQSHTB(B) + JRST (E) ;FOUND A CHARACTER THAT IS USED IN THIS FONT + SOJGE B,SQCHK1 + POPJ P, ;NO CHARACTERS IN THIS FONT USED + +;SNDTXT SEND TEXT TO THE PDP-11 + +SNDTXT: SETZM PAGE + AOS PAGE ;START PRINTING ON PAGE 1 + AOSN DFHDRF ;WANT DEFAULT HEADER? + PUSHJ P,DEFHDR ; YES +SNDTX1: SKIPL PSKIP ;SKIPING PAGES + JRST XGPLPT ;NO, PRINT SOME GOODIES + PUSHJ P,TXTI ;GET A CHARACTER + CAIN A,177 ;RUBOUT IS ESCAPE CHARACTER + PUSHJ P,TXTRUB ;PROCESS RUBOUT + JUMPL A,SNDEND ;EOF WHILE SKIPPING? + CAIE A,^L ;PAGE MARK? + JRST SNDTX1 + AOS PSKIP + AOS PAGE + JRST SNDTX1 + +;HERE TO PROCESS RUBOUT WHILE READING TEXT FILE + +TXTRUB: PUSHJ P,TXTI ;GET NEXT CHARACTER + JUMPL A,CPOPJ ;EOF? + CAILE A,TXTRDL ;LEGAL CONTROL CODE + JRST RUBSXT ;NO, JUST CLOBBER A AND RETURN + JRST @.(A) ;DISPATCH +TXTRDO: RUBCA ;1 COMPLICATED + RUBS1 ;2 COLUMN INCREMENT, SOAKS UP 1 CHARACTER + RUBS2 ;3 SKIP TO SCAN LINE, SOAKS UP 2 CHARACTERS + RUBS13 ;4 VECTOR, SOAKS UP 13 CHARACTERS +TXTRDL==.-TXTRDO + +;SOAKS UP CHARACTERS FROM INPUT STREAM, LOOKS FOR EOF + +RUBS3: SKIPA B,[3] +RUBS13: MOVEI B,13 + JRST RUBS +RUBS1: SKIPA B,[1] +RUBS2: MOVEI B,2 +RUBS: PUSHJ P,TXTI ;GET CHARACTER + JUMPL A,CPOPJ ;EOF? + SOJG B,RUBS +RUBSXT: MOVEI A,0 ;CLOBBER CHARACTER + POPJ P, + +;HERE TO PROCESS RUBOUT + +RUBCA: PUSHJ P,TXTI ;GET CHARACTER + JUMPL A,CPOPJ ;EOF? + CAIGE A,MAXFNT ;FONT SWITCH? + MOVE FONT,A + SUBI A,37 ;LOOK FOR OTHER CONTROL CODES + JUMPLE A,RUBSXT ;UNDER? + CAILE A,TXTADL ;OVER? + JRST RUBSXT + JRST @.(A) ;DISPATCH +TXTADO: RUBS2 ;40 COLUMN SELECT + RUBS3 ;41 ! UNDERSCORE + RUBS1 ;42 " LINE SPACE + RUBS1 ;43 # ABSOLUTE BASELINE ADJUST + RUBSXT ;44 $ PRINT PAGE NUMBER + TAKHDR ;45 % ACCEPT HEADING TEXT + RUBSXT ;46 & START UNDERLINE + RUBS1 ;47 ' STOP UNDERLINE + RUBS1 ;50 ( SET INTERCHARACTER SPACING + RUBS2 ;51 ) VARIBLE WIDTH UNDERLINE + RUBS1 ;52 * RELATIVE BASELINE ADJUST +TXTADL==.-TXTADO + +;ACCEPTS HEADING TEXT + +TAKHDR: PUSHJ P,TXTI ;GET CHARACTER COUNT OF HEADER + MOVEM A,HDRCNT + JUMPLE A,CPOPJ ;EOF? + SETZM HDRTXT ;CLEAR HEADER BUFFER + MOVE A,[HDRTXT,,HDRTXT+1] + BLT A,HDRTXT+HDRTXL-1 + MOVE B,HDRCNT ;PREPARE TO READ HEADER TEXT + MOVE C,[440700,,HDRTXT] + MOVEI D,HDRTXL*5 +TKHDR1: PUSHJ P,TXTI + JUMPL A,CPOPJ ;EOF? + SOSL D + IDPB A,C + SOJG B,TKHDR1 + JUMPGE D,RUBSXT + ADDM D,HDRCNT ;D HAS -# CHARACTERS LOST + JRST RUBSXT + +;SET UP THE DEFAULT HEADER + +DEFHDR: SETZM HDRCNT + MOVE C,[440700,,HDRTXT] + .RLPDT A, + LDB A,[320300,,B] ;GET DAY OF WEEK (0 => SUNDAY) + MOVE B,[ [ASCIZ /Sun/] + [ASCIZ /Mon/] + [ASCIZ /Tues/] + [ASCIZ /Wednes/] + [ASCIZ /Thurs/] + [ASCIZ /Fri/] + [ASCIZ /Satur/]](A) + PUSHJ P,SAMP6 + MOVEI B,[ASCIZ /day, /] + PUSHJ P,SAMP6 + .RDATE B, + LSHC A,2*6 ;TWO SIX BIT CHARACTERS IS YEAR + LSH A,44-<2*6> ;SUITABLE FOR SIX BIT PRINTING + PUSH P,A + MOVEI A,0 + LSHC A,6 ;FIRST DIGIT OF MONTH + MOVEI D,-20(A) + IMULI D,10. + MOVEI A,0 + LSHC A,6 ;SECOND DIGIT OF MONTH + ADDI D,-20(A) + PUSH P,B + MOVE B,[ [ASCIZ /????/] + [ASCIZ /January /] + [ASCIZ /February /] + [ASCIZ /March /] + [ASCIZ /April /] + [ASCIZ /May /] + [ASCIZ /June /] + [ASCIZ /July /] + [ASCIZ /August /] + [ASCIZ /September /] + [ASCIZ /October /] + [ASCIZ /November /] + [ASCIZ /December /]](D) + PUSHJ P,SAMP6 + POP P,B + MOVEI A,0 ;PRINT DAY OF MONTH + LSHC A,6 ;GET FIRST DIGIT + CAIE A,'0 ;DON'T PRINT LEADING ZERO + LSHC A,-6 + PUSHJ P,SAMP4 + MOVEI B,[ASCIZ /, 19/] + PUSHJ P,SAMP6 + POP P,B + PUSHJ P,SAMP4 ;YEAR + MOVEI A,40 + PUSHJ P,SAMP5 + PUSHJ P,SAMP5 + PUSHJ P,SAMP5 + .RTIME B, ;DATE + LSHC A,2*6 + LSH A,6 + IORI A,': + LSHC A,2*6 + LSH A,6 + IORI A,': + PUSH P,B + MOVE B,A + PUSHJ P,SAMP4 + POP P,B + PUSHJ P,SAMP4 + MOVEI B,TENSP + PUSHJ P,SAMP6 ;TEN SPACES + MOVE A,[TXTICH,,CHSTS] + .RCHST A, + MOVEI A,CHSTS + HRLZS CHSTS + PUSHJ P,SAMP3 ;FILE NAME + MOVEI B,TENSP + PUSHJ P,SAMP6 + MOVEI B,[ASCIZ /Page $ + + +/] + PUSHJ P,SAMP6 + MOVEI A,HDRTXL*5 + MOVEI B,[ASCIZ /HEADER BUFFER OVERFLOW/] + CAMGE A,HDRCNT + PUSHJ P,TERPRI + POPJ P, + +TENSP: ASCIZ / / + +;HERE TO PRINT THE REAL GOODS + +XGPLPT: MOVEI A,1 ;ESCAPE TO "MIXED" + PUSHJ P,CMDO + SKIPL LSP ;LSP SPECIFIED + JRST SNDVAR ; LSP IS SPECIFIED, USE IT + SKIPGE A,VSP + MOVEI A,DVSP ;VSP WAS NOT SPECIFIED, USE THE DEFAULT VALUE + ADD A,HEIGHT + MOVEM A,LSP +SNDVAR: MOVEI A,ZZ + PUSHJ P,CMDO ;SEND COUNT OF NUMBER OF PARAMETER THAT FOLLOW +ZZ==0 +IRP B,,[LSP,LFTMAR,TOPMAR,BOTMAR,PLINES,PAGE,AUTCUT,FFCUT] +ZZ==ZZ+1 + MOVE A,B + PUSHJ P,WRDO +TERMIN + PUSHJ P,CMDOF ;FORCE OUTPUT + MOVEI CHNL,DOCHNL ;ALL THE REST GOES ON DATA OUT + PUSHJ P,OPEN + PUSHJ P,SNDRCA ;SEND RUBOUT + MOVE A,FONT ;DO EXPLICIT FONT SELECT + PUSHJ P,CMDO + SKIPG B,HDRCNT ;SEND HEADER TEXT? + JRST XGPLOP + PUSHJ P,SNDRCA + MOVEI A,45 ;ACCEPT HEADER TEXT + PUSHJ P,CMDO + MOVE A,HDRCNT + PUSHJ P,CMDO + MOVE C,[440700,,HDRTXT] + ILDB A,C + PUSHJ P,CMDO + SOJG B,.-2 + MOVE C,[440700,,HDRTXT] ;AND NOW WE SEND IT +XGPLP1: ILDB A,C ;SO THAT IT APPEARS AS HEADER OF FIRST PAGE + PUSHJ P,CMDO + SOSLE HDRCNT + JRST XGPLP1 +XGPLOP: PUSHJ P,TXTI + JUMPL A,TXTEOF ;EOF? + PUSHJ P,CMDO + AOSE ABORTF + JRST XGPLOP +TXTEOF: MOVEI A,200 ;EOF CODE + PUSHJ P,CMDO + PUSHJ P,CMDOF ;FORCE BUFFER + MOVSI A,400000 + ANDCAM A,@CHHDRP(CHNL) ;CLOSE DATA OUT CHANNEL +SNDEND: SETZM PSKIP + SETZM HDRCNT + SETZM DFHDRF + POPJ P, ;AND RETURN + +;SENDS ROUBOUT + +SNDRCA: MOVEI A,177 + PUSHJ P,CMDO + MOVEI A,1 + JRST CMDO + +PDL==20 +PDB: BLOCK PDL + +BYPR: 0 ;BYTES PER ROW WHILE LOADING FONTS +DSKCMD: 0 ;READING COMMANDS FROM DISK FLAG +NOTYPE: 0 ;DON'T TYPE OUT +TTYNUM: 0 ;NUMBER OF TTY WE HAVE +CHSTS: BLOCK 8 ;STORAGE FOR CURRENTLY PLOTTED/SCANNED FILE +ABORTF: 0 ;NON ZERO => XGP 11 PROGRAM CRAPPED OUT + ;IN A WELL DEFINED WAY + +TXTBFL==200 +TXTCNT: 0 ;TEXT BUFFER COUNTER +TXTPTR: 0 ;BYTE POINTER INTO TEXT BUFFER +TXTFLG: 0 ;NEGATIVE=>EOF SEEN + + 0 ;DUMMY TEXT BUFFER LOCATION USED FOR END + ;TEST AT DBPLR... MUST PRECEDE TXTBUF +TXTBUF: BLOCK TXTBFL + +COMBFL==200 +COMCNT: 0 +COMPNT: 0 +COMBUF: BLOCK COMBFL + +T11PAG: 0 ;NEXT PAGE TO GET FROM 11 +SET: 0 ;ERROR FLAG THAT STOPS XGP OUTPUT +BUFORG: 0 ;ORIGIN OF BUFFERS IN 11 SPACE + +;DEFAULT PAGE PARAMETERS + +IINITX0==1100. +IINITY0==-180. +ISQSHFL==0 +ILFTMAR==200 +ITOPMAR==200 +IBOTMAR==174 +ISLINES==3504 ;VSP, SLINES, TOPMAR, BOTMAR SET TO MAKE 60 LINES OF FIX25 PER PAGE +IPLINES==ISLINES+ITOPMAR+IBOTMAR +ILSP==-1 +DLSP==25.+6 ;25 HIGH FONT + 6 LINES OF VSP +IVSP==-1 ;DEFAULT IS TO USE LSP +DVSP==6 +IAUTCUT==-1 +IFFCUT==0 +IPSKIP==0 ;# PAGES TO SKIP AT BEGGINING +ITXTCMD==-1 +IUDEPTH==-1 + +;PAGE PARAMETERS + +INITX0: 0 +INITY0: 0 +SQSHFL: 0 ;NON-ZERO => SQUISH USELESS CHARS OUT OF FONTS +LFTMAR: 0 +TOPMAR: 0 ;ALLOWS 60 LINES OF TEXT ON ONE 11" PAGE +BOTMAR: 0 +NLINES: 0 ;11 INCHES +AUTCUT: 0 +FFCUT: 0 ;NON-ZERO FORCES XGP TO CUT ONLY AT FORM FEEDS +PSKIP: 0 ;# PAGES TO SKIP AT BEGINING +TXTCMD: 0 ;0 IMPLIES DONT LOOK FOR COMMANDS IN TEXT FILE +LSP: 0 ;BASE LINE SPACING +VSP: 0 ;-1 => USE LSP, OTHER WISE LSPHEIGHT+VSP +UDEPTH: 0 ;# PRINTS IN PROGRESS +PLINES: 0 ;# SCAN LINES ON PAGE +SLINES: 0 ;# SCAN LINES IN TEXT AREA +PAGE: 0 ;PAGE # OF FIRST PRINTED PAGE +DFHDRF: 0 ;-1=>PUT DEFAULT HEADER ON EACH PAGE +HDRCNT: 0 ;# CHARACTERS IN PAGE HEADER +HDRTXL==<200+4>/5 ;SIZE OF TEXT HEADER AREA +HDRTXT: BLOCK HDRTXL ;BUFFER FOR HEADER TEXT +SQSHTB: BLOCK 200 ;ONE WORD FOR EACH ASCII CHAR + ;BIT 4.9 = FONT 0, 4.8 = FONT 1, ETC. + +;FONT VARIABLES + +FNTBEG==. +FNTO: SIXBIT /DSK/ +FNTFN1: SIXBIT /FIX25/ ;USED AS A FLAG, IF 0 THEN FONT NOT SPECIFIED +FNTFN2: SIXBIT /KST/ +FNTSNM: SIXBIT /FONTS/ +HEIGHT: 0 ;HEIGHT OF FONT +BASE: 0 ;BASE LINE +CPA: 0 ;COLUMN POSITON ADJUSTMENT +KSTID: 0 ;FONT ID +FCHFLG: -1 ;-1=> TRANSMIT TO 11 +FNTVLN==.-FNTBEG ;LENGTH OF FONT VARIABLE AREA + +LOC FNTBEG+ + +TXTO: SIXBIT/DSK/ +TXTFN1: 0 +TXTFN2: 0 +TXTSNM: 0 + +;10-11 CHANNEL DATA AREAS + +CMDPAR: BLOCK NCHNL ;PARITY +CMDCNT: BLOCK NCHNL ;BUGGER BYTE COUNTER +CMDSIZ: BLOCK NCHNL ;SIZE OF THIS BUFFER +CMDBUF: BLOCK NCHNL ;BYTE POINTER TO FIRST 11 WORD OF BUFFER +CMDPTR: REPEAT NCHNL,CONC CMDPT,\.RPCNT,(T) +REPEAT NCHNL,[ +CONC CMDPT,\.RPCNT,[: BLOCK 2] +] +CHHDRP: REPEAT NCHNL,CHHDR+*.RPCNT + +LITTER: CONSTANTS +VARS:: VARIABLES +PAT:PATCH: +ICORE==<.+1777>_<-12> +;MEMORY MAP + +;PROGRAM PAGES 0-ICORE + +;CHANNEL HEADER POINTER AREA + +LNKVPG==ICORE+1 ;PAGE # + 10LNKV=LNKVPG_12 ;ORIGIN + LNKV==124 ;ORIGIN IN 11 ADDRESS SPACE + ABORTL=<402-LNKV>/4+10LNKV ;10 ADDRESS OF ABORT FLAG + KSTLOD=ABORTL+6 ;PDP-10 ADDRESS OF KST LOADER FLAG + +;CHANNEL HEADER AREA + +CHHDPG==LNKVPG+1 ;PAGE # + CHHDR=CHHDPG_12 ;ORIGIN + BPRCHL==10 ;# BYTES IN 1 CHANNEL HEADER + +;10-11 BUFFER AREA + +BUFPG==CHHDPG+1 ;FIRST PAGE # + BUFFER=BUFPG_12 + +SBUFP==BUFPG+1 +SBUF=SBUFP_12 +BITBUF=SBUF+WDSPL + +END GO + \ No newline at end of file