/ TEXT FORMATTER - RUNOFF DOINDX=0 /NO INDEX STUFF / BY: CLYDE G. ROBY, JR. / DEPARTMENT OF PHYSIOLOGY AND BIOPHYSICS / WEST VIRGINIA UNIVERSITY MEDICAL CENTER / MORGANTOWN, WEST VIRGINIA / JANUARY 10, 1974 / VERSION 0: 1/10/74 / INITIAL TYPE IN OF PROGRAM / MAJOR REWRITING OF SOME ROUTINES 5/74 AND 6/74 / VERSION 1: 7/74 / ADDING IN NEW FEATURES / ADD IN .FLAG COMMANDS / CAPITALIZE WORDS WITH " AS FLAG CHARACTER / ALSO ADDED IN .AUTOCAPITALIZE COMMAND / VERSION 2: 7/23/74 / STARTED WORK ON .FOOTNOTE / MAJOR MOVING OF ROUTINES AND REWRITING / VERSION 3: 9/4/74 / BETTER LOGIC FOR MULTIPLE COPIES / BETTER FOOTNOTE PROCESSING AND " PROCESSING / CAPITALIZE FIRST CHARS OF WORDS WITH ^' AND \' / CLEANED UP OUTPUT ROUTINES / VERSION 4: 9/12/74 / BETTER .HEADER COMMAND IMPLEMENTED / BETTER COMCHK ROUTINE / IMPLEMENTED .TABS ABSOLUTE AND .TABS RELATIVE COMMANDS / ADDED .CHAPTER COMMAND / CLEANED UP FLAG COMMAND PROCESSING / ALSO CLEANED UP HEADER AND FOOTER PROCESSING / PATCH B: FIXED BUG IN FOOTER ROUTINE IN COMBO WITH .NOHEADER / IMPROVED CENTERING AND FIXED BUG THERE / CLEANED UP 'GETARG' ROUTINE AND "TITLE" COMMAND /SPLITTING CODE FOR 12K/16K VERSION /CHANGED NAME TO RUNOFF /IMPROVED ERROR REPORTING /SHORT COMMANDS MAY BE FREELY USED /COMMANDS STRICTLY ALPHABETICAL /DOUBLE CHECK FOR "NO" ALLOWING GENERAL WORDS STARTING WITH NO /NEGATIVE PARA INDENT ALLOWED /0 PARA SEPARATION ALLOWED /FIXED INDENT BUG /MOVED STACK AND JMP VECTORS TO FLD 1 /PROPERLY PACKS OUT EXTRA SPACES AND TABS /PUT IN HOOKS FOR ADDITIONAL COMMANDS AND FLAGS / .NOTE / .FLAG HYPHEN - / .TABS QUOTE / .HEADER ROMAN /INSTALLED FULL OPTION DECODING /RUNOFF NOW CHAINS TO ITSELF ON A RESTART /HOOKS IN FIELD 0 FOR INDEX CLASS COMMANDS /STACK CALLABLE ACROSS FIELDS /COMMAND CHECKER CALLABLE ACROSS FIELDS /AUG 76 CHANGES TO RUN 11 RUNOFF TEST FILES /CLEANED UP COMMENT HANDLING AND VARIOUS BUGS AS NOTED IN SOURCE /ADDED \CR FEATURE FOR LONG LINES /T.W. MCINTYRE THIS VERSION WILL BE VERSION 5 VERS1="0 /TEN'S DIGIT OF VERSION NUMBER VERS2="6 /ONE'S DIGIT OF VERSION NUMBER PATCH="B /THE PATCH LEVEL / DEFINE SPECIAL INSTRUCTIONS TO ASSEMBLER FIXMRI INC=2000 /ISZ WHEN NOT EXPECTED TO SKIP MTWO=CLL STA RAL /GENERATE A -2 IN ACC / SOME USEFUL EQUALITIES SMALLA="A!40 SMALLZ="Z!40 YES=0000 NO=7777 SKIPYES=SZA CLA SKIPNO=SNA CLA ALBSCH=37 /ALTERNATE BACKSPACE CHAR BSCH=10 /NORMAL BACKSPACE ULCH2=55 /ALTERNATE UNDERLINE ULCH1=137 /STANDARD UNDERLINE DECIMAL WID1=79 /STANDARD WIDTH WID2=60 /ALTERNATE WIDTH LONG2=60 /ALTERNATE PAGE LENGTH LONG1=66 /STANDARD PAGE LENGTH OCTAL FIELD 0 *4 / SOME LOCATIONS USED BY THE 'PUSH' AND 'POP' ROUTINES PAGSKP, 0 /JUST TO GET THIS DEBUGGED CHRCNT, 0 PUSHTM, 0 PPTEMP, 0 / THE AUTO-INDEX REGISTERS (10-17) *10 AUTOX1, 0 /GENERAL XR'S USED THROUGHOUT PROG. AUTOX2, 0 AUTOX3, 0 BRKXR, 0 SORTXR, 0 /USED BY "SORTC" AND "SORTJ" PRTXR, 0 /USED BY SUBROUTINE "PRINT" FNXR, 0 /AUTOXR USED BY FOOTNOTE ROUTINES / GENERAL SWITCHES USED BY CERTAIN COMMANDS *20 / LOCATIONS THAT ARE INITIALIZED TO SPECIALIZED VALUES / KEEP THESE LOCATIONS IN THE SPECIFIED ORDER (SEE 'INITS') OTHERS=. FNPTR, FNBUFF /FOOTNOTE BUFFER POINTER SUBPGN, 0 /SUBPAGE LETTER PWIDTH, 120 /LENGTH OF OUTPUT LINE (80) COPYWD, 0 /THE COPY WIDTH ALLOWED FOR THIS LINE PLENGTH,102 /LENGTH OF PAGE (66) STKPTR, STACK /STACK POINTER FOR PUSH-POP LIST PARAGV, -1 /LEGAL VALUES ARE 1 TO 5 AND -1 /DEFAULT IS (SPACING + 1) / 2 PARAGP, 2 /.TEST PAGE ARG FOR PAGRGRAPH TABCHR, 640 /QUOTED SPACE IS ASSUMED HWORD, 0005 /HEADER AT TOP OF PAGE ON RIGHT SIDE ARABIC NUMBERALS /"PAGE" IN UPPER CASE - TA000000RRUU /T=0 TOP, A=0 ARABIC, RR=0 LEFT, 1 RIGHT, 2 CENTER, 3 ALTER /UU=0 NUMBER, 1 UPPER, 2 LOWER, 3 MIXED / THE TOP AND BOTTOM OF PAGE PARAMETER TABLES / THE FIRST NUMBER IS NO. OF BLANK LINES FROM "TOP" TO / THE FIRST PRINTED LINE. / THE SECOND NUMBER IS NO. OF BLANK LINES FROM LAST PRINTED / LINE TO "BOTTOM" SECTION OF BLANK LINES. / THE TOTAL NUMBER OF LINES AT TOP OR BOTTOM IS 6. TOP, 1; 2 /3 PRINTED LINES AT TOP BOTTOM, 3; 2 /1 PRINTED LINE AT BOTTOM / SWITCHES THAT USER CAN SET TFIRSW, NO /NO FIRST TITLE ASSUMED SWPARA, NO /0 = .AUTOPARAGRAPH, /7777 = .NOAUTOPARAGRAPH SWHEAD, YES /0 = .HEADER, 7777 = .NOHEADER SWPAGE, YES /0 = .PAGING, 7777 = .NOPAGING SWSBPG, NO /0 = .SUBPAGE, 7777 = .NOSUBPAGE SWCC, NO /0 = .CONTROL CHARACTERS, 7777 = .NCC SWCAP, YES /0 = .AUTOCAPITALIZE, 7777 = .NAC SWPER, YES /0 = .PERIOD, 7777 = .NOPERIOD /0 = OUTPUT 2 SPACES AFTER .!?;: SWPNUM, YES /0 = .NUMBER, 7777 = .NONUMBER UNCASE, 7777 /UNDERLINE SWITCH FOR CURRENT CHAR CQCASE, 7777 /0000 = SET CAP WORD, 7777 = CLEAR IT ALMARG, 1 /ACTUAL LEFT MARGIN FOR CURRENT LINE /THIS IS HERE FOR THE HSAVE CODE TO SAVE IT WITH MARGS /THE FOLLOWING PARAMETERS ARE GROUPED AS THE FOOTNOTE /PRESERVATION GROUP. THEY ARE PRESERVED ACROSS FOOTNOTES. FNDFLT=. LMARG, 1 /LEFT MARGIN (COLUMN) RMARG, 106 /RIGHT MARGIN (70) SWJUST, YES /0 = .JUSTIFY, 7777 = .NOJUSTUFY SWFILL, YES /0 = .FILL, 7777 = .NOFILL LSPACE, -1 /ASSUME SINGLE SPACING PARAGN, 5 /INDENT 5 SPACES ON PARAGRAPH MODE, 7777 /7777 = \\, SET LOWER CASE MODE /0000 = ^^, SET UPPER CASE MODE UNMODE, 7777 /7777 = \&, CLEAR UNDERLINE MODE /0000 = ^&, SET UNDERLINE MODE CFMODE, 7777 /0000 = \', CLEAR CAPITALIZE FIRST MODE /7777 = ^', SET CAPITALIZE FIRST CHAR MODE HFILL, 7777 /7777 = FILL WITH SPACES ON LEFT END OTHEREND=. / LOCATIONS THAT SHOULD BE INITIALIZED TO ZERO ZEROS=. /ZERO THESE LOCS ON RE-INITIALIZATION ECAPSW, 0 /NON-ZERO FOR CAPITALIZING FIRST CHARS FNDFLE=. /END OF FOOTNOTE PRESERVATION GROUP TITFLG, 0 /NORMALLY RESERVE TITLE SPACING DEFERN, 0 /NO. OF "FIGURE DEFERRED" LINES FNCTR, 0 /NO. OF "FOOTNOTE" LINES OVERFLOW /7777 = FILL WITH SPACES ON LEFT END FNFLAG, 0 /7777 = WE ARE PROCESSING FROM /FOOTNOTE BUFFER FNLINE, 0 /NO. OF FOOTNOTE LINES ALLOCATED ON PAGE LOWONE, 0 /NONZERO IF TO MAKE SINGLE CHAR LOW CASE UPONE, 0 /NONZERO IF TO CAPITALIZE SINGLE CHAR TABFLG, 0 /0000 = ABSOLUTE TABS, 7777 = RELATIVE ZEROEND=. /END OF ZERO INITIALIZATION LOCS / GENERAL LOCATIONS USED THROUGHOUT PROGRAM, NOT INITIALIZED COUNT, 0 /GENERAL COUNTER CTR1, 0 /OTHER COUNTERS CTR2, 0 PTR1, 0 /TEMPORARY POINTERS PTR2, 0 CHAR, 0 /HOLDS LAST INPUT CHAR NUMBER, 0 /HOLDS LAST NUMBER CONVERTED (ALSO TEMP) SIGN, 0 /SIGN OF LAST NUMBER CONVERTED CVRTQ, 0 /INDICATES WHETHER LAST NO. WAS CONVERTED RELFLG, 0 /INDICATES IF RELATIVE PSWITC, 0 /NON-ZERO IF /P SWITCH GIVEN /PAUSE AT PAGE BREAK TO CHANGE PAPER FSWITC, 0 /NON-ZERO IF /F SWITCH GIVEN /SIMULATE FORM FEED CHAR USWITCH,0 /NON-ZERO TO FORCE UPPER CASE ON OUTPUT CURCOL, 0 /CURRENT COLUMN (ABSOLUTE) IN OUTPUT /LINE THAT NEXT CHAR IS TO BE STORED FNPTR2, 0 /2ND PTR USED IN FOOTNOTE PROCESSING NOFLG, 0 /THE "NO" FLAG FOR COMMANDS, 7777 IF "NO" LENOL, 0 /LENGTH OF OUTPUT LINE BETWEEN MARGS OUTPTR, 0 /GET SET TO CURRENT POSITION IN LINE OUTCTR, 0 /(-) NO. OF CHARS LEFT ON LINE NLINES, 0 /NO. OF LINES LEFT ON PAGE PAGENO, 1 /CURRENT PAGE NUMBER - START WITH 1 TOPSW, 7777 /7777 IF AT TOP OF NEW PAGE SORTCN, 0 /ARGUMENT NO. FOR SORTJ AND COMCHK INLINE, 0 /CURRENT INPUT LINE INPAGE, 0 /CURRENT INPUT PAGE SEQFLG, NO /NORMALLY NO SEQUENCE NUMBERS TXTFLG, NO /NO TEXT ON PAGE YET / EFFECTIVE MACRO CALLS GET= JMS I . /GET A CHAR FROM OS/8 INPUT FILE GETX PUT= JMS I . /OUTPUT CHAR TO OS/8 OUTPUT FILE PUTX GETC= JMS I . /GET A CHAR FROM INPUT FILE GETCX OSAVE= JMS I . /SAVE CHAR IN OUTPUT LINE BUFFER OSAVEX SPNOR= JMS I . /IGNORE SPACES ON COMMAND LINE SPNORX SORTJ= JMS I . /CHARACTER DISPATCH AND JUMP ROUTINE SORTJX GARBAGE=JMS I . /IGNORE GARBAGE AT END OF COMMAND LINE GARBJX COMCHK= JMS I . /COMMAND DISPATCH ROUTINE CMDCKX WORDCK= JMS I . /CHECK FOR SINGLE COMMAND WORD WRDCKX GETNUM= JMS I . /GET A NUMBER FROM COMMAND LINE GETNMX NUMCHK= JMS I . /GET A NUMBER AND CHECK IT NUMCKX NUMPOS= JMS I . /GET A POSITIVE NON ZERO NUMBER NUMPOX RELQ= JMS I . /CHECK LAST CONVERSION FOR RELATIVE RELQX BINPRT= JMS I . /PRINT A NUMBER IN OUTPUT BINASC DOEJECT=JMS I . /SKIP TO TOP OF NEW PAGE EJECTX BREAK= JMS I . /"BREAK" THE OUTPUT LINE BY FORCING IT BREAKX EOCQ= JMS I . /IS THIS CHAR "END OF COMMAND" CHAR? EOCQX TSTALL= JMS I . /IS CHARACTER LARGE ALPHA? TSTALX CRLF= JMS I . /OUTPUT A CR/LF COMBO CRLFX ERROR= JMS I . /OUTPUT AN ERROR MESSAGE ERRORX ERRORC= JMS I . /OUTPUT ERROR MESSAGE, GET NEXT CMD ERRCX ERRORF= JMS I . /OUTPUT A FATAL ERROR MESSAGE ERRFX PUSHA= JMS I . /PUSH ACC ONTO STACK PUSHAX POPA= JMS I . /POP TOP OF STACK TO ACC POPAX SAVELIST= JMS I . /SAVE LIST OF ELEMENTS ON STACK SAVELX RESTORE= JMS I . /RESTORE LIST OF ELEMENTS FROM THE STACK RESTRX PUSHJ= JMS I . /RECURSIVE JMS PUSHJX BADCMD= JMP I . /JMP!! ILLEGAL COMMAND ILLCMD POPJ= JMP I . /JMP!! RETURN FROM PUSHJ POPJX RETURN= JMP I . /JMP!!! GET A NEW COMMAND LINE RTNLNK, NLINE EOCGO= JMP I . /JMP!!! IGNORE GARBAGE AND GET NEW COMMAND LINE EOCGOX PAGE FIELD 0 / START OF THE PROGRAM "PRINTR" / IF PROGRAM IS STARTED AT LOCATION 200, THEN COMMAND DECODER / IS INVOKED AND THE FOLLOWING IS REQUESTED: / *OUTPUT 2 SPACES SAVC81, JMS SAVEIT /SAVE THE 2 SPACES AFTER ECHAR TAD [" ] JMS SAVEIT SAVC82, STA DCA ECAPSW /CAPITALIZE NEXT CHAR (MAYBE) JMP SAVSP1 /GET ANOTHER CHAR SAVCL9, TAD [" ] /SAVE THE FIRST SPACE AFTER CHAR JMS SAVEIT JMP SAVCL3 /THEN GO SAVE CURRENT CHAR SAVSP, TAD SAVCHR /SAVE THIS FIRST SPACE JMS SAVEIT SAVSP1, TAD SWFILL /BUT IF FILL IS ON IGNORE OTHERS SKIPYES JMP SAVCL2 /NO FILL LET IT GO SAVSP2, JMS SAVECR /GET NEXT CHAR SZA JMP SAVSP3 /NOT AN EOL JMS SAVEOQ /HOW DO WE HANDLE IT? JMP SAVCL2 /WE DID A BREAK LEAVE IT SAVSP3, TAD [-" ] /IS IT A SPACE SNA CLA JMP SAVSP2 /YES, IGNORE IT JMP SAVCL3 /AND BACK TO NORMAL SAVHYP, JMS SAVECR /YES, WHAT IS NEXT? AND [7737] /DON'T CARE UPPER OR LOWER TSTALL /UPPER OR LOWER ALPHA? JMP SAVHY2 /NO, PASS HYPHEN AND CHAR STL CLA RTR /2000 TO ACC JMP SAVCL4 /SET THE BIT AND GO SAVHY2, TAD CMDHYP /GET A HYPHEN OR WHATEVER HE USES JMS SAVEIT /AND PRINT IT JMP SAVCL3 /PROCESS THIS CHAR NORMALLY SAVEOL, JMS SAVEOQ /CHECK OUT HOW JMP SAVCL3+1 /LIKE A SPACE JMP SAVCL2 /WE DID A BREAK SAVEOQ, 0 TAD SWFILL SKIPNO JMP SAV1SP PUSHJ JUSTIFY ISZ SAVEOQ JMP I SAVEOQ SAV1SP, TAD [" ] DCA SAVCHR TAD SAVCHR JMP I SAVEOQ PAGE / SAVE A CHARACTER IN OUTPUT LINE BUFFER / CHECK IF LINE BUFFER FULL (BY WORDS) / CHECK TO SEE IF WE JUSTIFY LINE, ALSO SAVEIT, 0 DCA SAVETC /SAVE CHAR TO PUT IN BUFFER TAD SAVEIT /SAVE RETURN LOC ON STACK PUSHA SAVE1, TAD OUTCTR /IS BUFFER FULL? SNA CLA JMP SAVE3 /YES, MUST SAVE A "WORD" SAVE2, TAD CHRCNT /NO, SAVE THE CHAR SZA CLA /ANY CHARS ON LINE YET? JMP SAVE22 /YES, GO SAVE THE CHAR TAD SAVETC /NO, IS CHAR A SPACE? TAD [-" ] SZA CLA JMP SAVE22 /CHAR NOT A SPACE, GO SAVE IT TAD SWFILL /YES, A SPACE...FILL MODE ON? SKIPNO POPJ /YES, IGNORE THOSE INITIAL SPACES SAVE22, TAD SAVETC /GET THE CHAR OSAVE /AND SAVE IT NOP POPJ /RETURN SAVE3, TAD SAVETC /SAVE CURRENT CHAR ON STACK PUSHA TAD SAVETC /WHAT IS IT? TAD [-" ] /IF IT IS SPACE WE'RE DONE SNA CLA JMP SAV371 /THERE MAY HAVE BEEN MORE THAN ONE SPACE SAVE33, JMS SAVDEC /DECREMENT PTR, LENGTH OF LINE JMP SAV333 /IGNORE POSSIBLE HYPHEN ON 1ST CHAR SAV331, JMS SAVDEC /REGULAR LOOP POINT TAD I OUTPTR /GET THE CHAR RTL /CHECK FOR HYPHEN FLAG BIT SZL CLA /IS IT HYPHEN JMP SAV332 /YES, PROCESS IT SAV333, TAD [-" ] /NO, IS IT A SPACE TAD I OUTPTR SNA JMP SAVE37 /YES, WE HAVE A WORD TAD [" ] /REGENERATE CHAR PUSHA /AND SAVE IT ON STACK STA TAD OUTCTR DCA OUTCTR /DECREMENT OUTPUT BUFFER CTR TAD CHRCNT /HAVE WE MOVED EVERYTHING OUT? SZA CLA JMP SAV331 /NO, KEEP LOOKING FOR A SPACE SAVE35, POPA /EVERYTHING OUT OSAVE /MOVE EVERYTHING BACK TO OUTPUT BUFFER JMP .-2 SAV351, PUSHJ /THEN PRINT THE LINE PRINT TAD LSPACE /CURRENT SPACING (-) CRLF JMP SAVE62 /GO GET CURRENT CHAR SAV332, TAD I OUTPTR /SAVE THE HYPHEN CHAR PUSHA /ON THE STACK TAD KHYPHN /GET A HYPHEN OSAVE /SAVE IT IN OUTPUT KHYPHN, "- /THIS IS FOR OSAVE A NOP STA CLL RAL /DECREMENT BY TWO FOR CHAR AND HYPHEN TAD OUTCTR /STACKED CHAR SAV371, DCA OUTCTR /AND FALL THROUGH TO SAVE37 /COME HERE IF FINAL CHAR IS SPACE SAVE37, TAD CHRCNT /HAVE WE MOVED ALL CHARS OUT? SNA CLA /IF WE HAVE, IT IS ALL SPACES JMP SAV351 /YES, RESTORE EVERYTHING, THEN JMS SAVDEC /DECREMENT POINTER, LENGTH OF LINE TAD I OUTPTR /GET A CHAR TAD [-" ] SNA CLA JMP SAVE37 /ANOTHER SPACE INC LENOL /COUNT LAST NON-SPACE CHAR INC CHRCNT /NEED IT FOR POINTING TOO TAD OUTCTR PUSHA /SAVE CHAR COUNT ON STACK TOO PUSHJ JUSTIFY /JUSTIFY THE LINE AND PRINT POPA DCA SAVETC /RESTORE CTR FOR MOVE TAD SAVETC SNA CLA JMP SAVE62 /GET CURRENT CHAR SAVE61, POPA /RESTORE CHARS THAT WE SAVED OSAVE SKP JMP SAVE9 /BAD ERROR ISZ SAVETC /ALL CHARS SAVED YET? JMP SAVE61 SAVE62, POPA /EFFECTIVE CURRENT CHAR DCA SAVETC /SAVE THE CURRENT CHAR JMP SAVE1 SAVE9, ERRORF /FATAL ERROR, BAD PROGRAM TEXT \OE\ *.-1 SAVETC, 0 / SUBROUTINE TO FIX UP PARAMETERS FOR A NEW OUTPUT LINE / NORMALLY ENTER WITH CLEAR ACC / OTHERWISE, ENTER WITH LEFT MARGIN MODIFIER IN ACC NLPARM, 0 TAD LMARG /ADD TO CURRENT LEFT MARGIN DCA ALMARG /THE ACTUAL LEFT MARGIN TAD NLPARM PUSHA /LIKE WE WERE CALLED VIA PUSHJ NPARMS, TAD ALMARG /ACTUAL LEFT MARGIN CIA IAC TAD RMARG /RIGHT MARGIN DCA COPYWD /COPY WIDTH = RMARG-ALMARG+1 TAD (LINE) DCA OUTPTR /INITIALIZE POINTER TAD COPYWD CIA DCA OUTCTR /MAX NO. OF CHARS ON LINE TAD (-MAXWIDTH /CAN'T EXCEED PHYSICAL BUFFER EITHER DCA PLCNT /OSAVEX KEEPS TRACK OF THIS DCA LENOL /LENGTH OF OUTPUT LINE IS 0 DCA CHRCNT /NO CHARACTERS EITHER TAD ALMARG DCA CURCOL /INITIALIZE CURRENT COLUMN POPJ /CALLED VIA "PUSHJ" / PUSHJ / PUSH RETURN LOC TO TOP OF STACK / JUMP TO ADDRESS GIVEN AS ARGUMENT PUSHJX, 0 DCA PUSHTM /SAVE ACC CLA CLL IAC TAD PUSHJX PUSHA /SAVE RETURN LOC ON TOP OF STACK TAD I PUSHJX /GET LOC TO JUMP TO DCA PUSHJX TAD PUSHTM /RESTORE ACC JMP I PUSHJX /JUMP TO THE ROUTINE PAGE /JUSTIFY ROUTINE CALLED VIA PUSHJ;JUSTIFY JUSTIFIES AND PRINTS CURRENT LINE /CHECKS JUSTIFY SWITCH JUSTIFY, TAD CHRCNT /CHECK FOR NOTHING ON LINE SNA CLA JMP JUST63 /JUST DO THE SPACING JUST5, TAD SWJUST /DO WE JUSTIFY THE LINE? SKIPYES JMP JUST60 /NO, GO PRINT LINE TAD KCOUNT /WORTH ABOUT 370 DCA SAVCTR /TRY TO JUSTIFY LINE 370 TIMES JUST8, JMS PLINEQ /SEE IF WE CAN PRINT LINE ISZ HFILL /MUST JUSTIFY LINE, WHICH HALF? JMP RFILL /JUSTIFY STARTING ON RIGHT SIDE STA DCA HFILL JMS LEFILL /JUSTIFY STARTING ON LEFT SIDE KCOUNT, SKP /USED AS COUNT VALUE, NOT CRITICAL RFILL, JMS RIFILL /JUSTIFY STARTING AT RIGHT SIDE ISZ SAVCTR /TRIED 370 TIMES? JMP JUST8 /NO, TRY AGAIN JMP JUST6 /YES, GIVE UP AND PRINT / SUBROUTINE TO CHECK TO SEE IF WE CAN PRINT THE OUTPUT LINE PLINEQ, 0 TAD LENOL /IS THE LENGTH OF THE LINE CIA TAD COPYWD /EQUAL TO THE ALLOWABLE LENGTH? SZA CLA JMP I PLINEQ /NO, TRY AGAIN JUST6, TAD HFILL /MAKE SURE WE START AT OPPOSITE SMA CLA / END NEXT TIME STA DCA HFILL JUST60, PUSHJ /PRINT THE OUTPUT LINE PRINT JUST63, TAD LSPACE /CURRENT SPACING (-) CRLF POPJ /OK, GO ON BACK SAVCTR, 0 / SUBROUTINE TO FILL THE OUTPUT LINE WITH SPACES / STARTING ON THE LEFT SIDE OF THE LINE LEFILL, 0 TAD (LINE) /INITIALIZE PTR AND CTR DCA PTR1 TAD CHRCNT /ACTUAL LENGTH OF OUTPUT LINE CIA DCA CTR1 LEFIL2, TAD I PTR1 INC PTR1 TAD [-" ] SZA CLA JMP LEFIL4 LEFIL8, ISZ CTR1 JMP LEFIL2 JMP I LEFILL LEFIL3, TAD I PTR1 INC PTR1 TAD [-" ] SNA CLA JMP LEFIL6 LEFIL4, ISZ CTR1 JMP LEFIL3 JMP I LEFILL LEFIL6, JMS PLINEQ TAD CTR1 SNA JMP I LEFILL JMS SAVFILL JMP LEFIL2 / SUBROUTINE TO FILL THE OUTPUT LINE / BY INSERTING SPACES STARTING AT RIGHT END OF LINE RIFILL, 0 TAD CHRCNT TAD (LINE) DCA PTR1 /POINTS TO LAST CHAR OF LINE+1 TAD CHRCNT CIA DCA CTR1 RIFIL7, STA TAD PTR1 DCA PTR1 TAD I PTR1 TAD [-" ] SZA CLA JMP RIFIL3 ISZ CTR1 JMP RIFIL7 JMP I RIFILL RIFIL2, STA TAD PTR1 DCA PTR1 TAD I PTR1 TAD [-" ] SNA CLA JMP RIFIL4 RIFIL3, ISZ CTR1 JMP RIFIL2 JMP I RIFILL RIFIL4, ISZ CTR1 SKP JMP I RIFILL JMS PLINEQ TAD CHRCNT /LENGTH OF OUTPUT LINE TAD CTR1 SNA JMP I RIFILL CIA JMS SAVFILL JMP RIFIL7 / SUBROUTINE TO MOVE THE OUTPUT LINE BUFFER / 1 CHAR TO RIGHT FOR SPECIFIED COUNT SAVFILL,0 DCA CTR2 TAD CHRCNT TAD (LINE-1) DCA PTR2 /INITIALIZE TO LAST CHAR-1 OF LINE SAVFL2, TAD I PTR2 INC PTR2 DCA I PTR2 MTWO TAD PTR2 DCA PTR2 ISZ CTR2 JMP SAVFL2 INC LENOL /WE HAVE ONE MORE CHAR ON THE LINE INC CHRCNT /A CHARACTER THAT PRINTS JMS PLINEQ JMP I SAVFILL EJMPS, SAVCL7 SAVCL7 SAVCL7 SAVCL7 SAVCL7 /5 REAL ECHARS SAVSP /PACK OUT EXTRA SPACES SAVHYP /CHECK OUT HYPHEN CHAR SAVEOL /SPECIAL FOR EOL PAGE / GENERAL GET-A-CHAR ROUTINE / DOES SOME CHECKING FOR CASE, AND UNDERLINE GETCX, 0 CLA CLL GETCX1, TAD UNMODE /UNDERLINE THE SAME WAY DCA UNCASE GETCX2, GET /GET AN INPUT CHAR DCA CHAR /AND SAVE IT GETCX3, TAD CHAR /GET THE CURRENT CHAR SORTJ /CHECK FOR CERTAIN CTRL/CHARS CTRLS-1 CTRLJ-CTRLS GETCX8, TAD CHAR /NOT A SPECIAL CHAR /OR PROCESS AT SAVE TIME TAD [-" ] SNA CLA JMP GCSP /A SPACE, SPECIAL DOINGS TAD CHAR /GET CHAR BACK AGAIN AND [377] /DON'T CARE WHETHER IT'S A TAD [-" ] / QUOTED OR UNQUOTED CTRL/CHAR SMA CLA /IS IT A REAL LIVE CTRL/CHAR? JMP GETCX6 /NO TAD SWCC /YES, CTRL/CHARS ALLOWED? SKIPNO JMP GETCXR /YES, KEEP IT QUOTED OR UNQUOTED ERROR /NO, GIVE ERROR, ILLEGAL CTRL/CHAR TEXT \IC\ *.-1 JMP GETCX2 /GET ANOTHER CHAR GETCX6, TAD CHAR /CHECK FOR SPECIAL TEXT CHARS SORTJ CMDCHR-1 CMDJMP-CMDCHR GETCX4, TAD CHAR /REG. CHAR COMES THRU HERE TSTALL /TEST FOR LARGE ALPHABETICS JMP GETCX5+1 /NOT ALPHABETIC TAD UPONE /CAPITALIZE ONE CHAR? SZA CLA JMP GETCX5 /YES, LET IT PASS TAD LOWONE /LET A SINGLE CHAR GO LITTLE? SZA CLA JMP GETCLO /YES, MAKE IT SMALL TAD MODE /UPPER CASE MODE SNA CLA JMP GETCX5 /YES, LET CHAR PASS TAD CQCASE /CAPITALIZE A WORD? SNA CLA JMP GETCX5 /YES, PASS CHAR THRU TAD SWCAP /AUTOCAPITALIZE ON? SKIPYES JMP GETCLO /NO, LET IT GO FOR SMALL CHAR TAD ECAPSW /YES, DO WE CAPITALIZE THIS CHAR? SZA CLA JMP GETCX5 /YES GETCLO, TAD CHAR /NO, CONVERT FROM UPPER TO LOWER AND [7737] TAD (40) DCA CHAR /AND SAVE THE CHAR GETCX5, DCA ECAPSW /TURN OFF CAP FIRST CHAR SWITCH TAD UNCASE /UNDERLINE THE CHARACTER? SZA CLA JMP GETCXR /NO, GO RETURN TAD CHAR CLL RAL /SET 4000 BIT FOR UNDERLINING STL RAR DCA CHAR /AND SAVE IT GETCXR, DCA UPONE /CLEAR SINGLE CAP GETCX7, DCA LOWONE /CLEAR SINGLE LOWER CASE JMP I GETCX /RETURN TO CALLER GETUN, TAD UNFLAG SKIPYES JMP GETCX4 /NO UNDERLINE FLAG AVAILABLE DCA UNCASE /"&", UNDERLINE NEXT CHAR JMP GETCX2 GETSP, TAD SPFLAG SKIPYES JMP GETCX4 /NO FORCED SPACE FLAG TAD [" ] /#, FORCE A SPACE TO PASS JMP GETCX9 /IT MIGHT BE UNDERLINE, TOO GETCHR, TAD QUFLAG SKIPYES JMP GETCX4 /NOT USING QUOTE FLAG GET /"_", TAKE NEXT CHAR LITERALLY GETCX9, TAD [400] /SET 400 TO PASS PROGRAM DCA CHAR JMP GETCX5 /IT MIGHT BE UNDERLINED GETCWD, TAD CQFLAG /CAN WE USE THE CHAR AS FLAG? SKIPYES JMP GETCX4 /NO, RETURN AS NORMAL CHAR TAD CQCASE /IF ALREADY ON, CLEAR IT CMA DCA CQCASE /YES, SET CAP WORD FOR NEXT WORD JMP GETCX1 /GET NEXT CHAR GETCFL, TAD CFFLAG /CAN WE USE THE CHAR AS FLAG? SKIPYES JMP GETCX4 /NO, USE AS REGULAR CHAR STA DCA UPONE /YES, SET TO CAPITALIZE 1 CHAR JMP GETCX1 /GET ANOTHER CHAR GCFF, INC INPAGE /FORM FEED IS END OF PAGE, INC PAGE# DCA INLINE /RESET LINE NO. JMP GETCX2 GCLF, GCVT, INC INLINE /END OF LINE, INCREMENT LINE NO. DCA CHAR GCCR, GCTAB, GCSP, STA DCA CQCASE TAD CFMODE CMA /MAKE IT NON-ZERO TO SET UPONE IF ON DCA UPONE /CAPITALIZE ONE CHAR, MAYBE TAD CHAR SNA /WAS IT AN EOL? ISZ LOWONE /IF LOWONE IS SET IGNORE EOL (0) CHAR TAD [-215] SNA CLA /WAS CHAR A CARRIAGE RETURN? JMP GETCX1 /YES, IGNORE IT JMP GETCX7 /NO, USE GOOD CHAR /IF LOWONE WAS NOT SET OR IT /WASN'T EOL THIS FIXES ALL UP / GET A CHAR FROM OS/8 INPUT FILE GETX, 0 CLA CLL TAD FNFLAG /PROCESSING A FOOTNOTE? SZA CLA JMP GETCFN /YES, GET CHARS FROM FOOTNOTE BUFFER CIF 10 JMS I (XXGET) /GET A CHAR FROM I/O PACKAGE GETXRT, JMP I GETX /'GETCFN' RETURNS HERE PAGE /SUBROUTINE TO SAVE A LIST OF ELEMENTS ON THE STACK /CALLING SEQUENCE: / TAD (LISTEND / SAVELIST / -LISTCNT SAVELX, 0 DCA SAVPTR /SAVE OUT POINTER HERE TAD I SAVELX /GET THE COUNT DCA SAVECT SAVELP, TAD I SAVPTR /GET AN ELEMENT PUSHA /SAVE IT STA /DECREMENT THE POINTER TAD SAVPTR DCA SAVPTR ISZ SAVECT /CHECK COUNT JMP SAVELP /DO MORE SAVING ISZ SAVPTR /POINTER IS ONE PAST TAD SAVPTR /SAVE IT TOO PUSHA TAD I SAVELX /SAVE THE COUNT TOO PUSHA ISZ SAVELX /PAST THE COUNT JMP I SAVELX /AND RETURN /SUBROUTINE TO RESTORE THE LIST OF ELEMENTS FOUND ON TOP OF /THE STACK. /CALL WITH RESTORE /TOP IS COUNT /TOP +1 IS POINTER /TOP +2 TO TOP +N+2 ARE ELEMENTS RESTRX, 0 POPA /GET THE COUNT DCA SAVECT /WE CAN USE HIS TEMPS POPA DCA SAVPTR RESTLP, POPA /NOW GET AN ELEMENT DCA I SAVPTR ISZ SAVPTR /INCREMENT THE POINTER ISZ SAVECT /ARE WE DONE JMP RESTLP /NO, RESTORE SOME MORE JMP I RESTRX /YES, RETURN SAVPTR=PTR2 SAVECT=CTR2 / SUBROUTINE TO SKIP GARBAGE ON COMMAND LINE GARBJX, 0 SPNOR /IGNORE ANY LEADING SPACES TAD CHAR EOCQ /END OF COMMAND LINE? JMP I GARBJX /YES, RETURN ERROR /NOPE TEXT \GJ\ *.-1 GARBJ2, GETC /GET CHARS TAD CHAR EOCQ /MUST GO TO END OF COMMAND JMP I GARBJX JMP GARBJ2 / SUBR TO DECREMENT POINTER AND LENGTH OF LINE SAVDEC, 0 STA TAD OUTPTR DCA OUTPTR STA TAD CHRCNT DCA CHRCNT /IT IS IN THE LINE WHATEVER IT IS TAD I OUTPTR /CHECK FOR CONTROLS JMS CCCHK /CHECK IF CONTROL INC LENOL /WE TOOK OUT A BACKSPACE THE LINE IS LONGER JMP I SAVDEC /CONTROL CHARS TAKE NO PHYSICAL SPACE STA TAD LENOL DCA LENOL JMP I SAVDEC / SUBROUTINE TO OUTPUT A BREAK / IF LINE IS ALL SPACES, DO NOT OUTPUT IT / OTHERWISE, PRINT THE LINE AND END IT /OLD BUG ... BREAK CALLS ITSELF IF FOOTNOTE IS TRIGGERED BY BREAK /FIX BY CALLING VIA PUSHJ BREAKX, 0 TAD BREAKX /SET UP TO RETRUN VIA POPJ PUSHA /ROUTINE OCCASIONALLY CALLS ITSELF PUSHJ /CHECK OUT THE LINES ON THE PAGE PRTHEAD /WE NEED THIS BECAUSE FOOTER DOES NOT SET /UP THE LINES ON THE PAGE BREAK0, TAD CHRCNT SNA JMP BREAK2 /NOTHING IN LINE, RETURN CIA DCA BRKCNT /SAVE THE NO. OF CHARS ON LINE TAD (LINE-1) DCA BRKXR /GET READY TO LOOK AT LINE BREAK1, TAD I BRKXR /GET A CHAR FROM BUFFER TAD [-" ] /IS CHAR A SPACE? SZA CLA JMP .+4 /IS NOT A SPACE, GO PRINT LINE ISZ BRKCNT /IS A SPACE, ALL CHARS CHECKED? JMP BREAK1 /NOPE JMP BREAK2 /RETURN IF LINE FULL OF SPACES PUSHJ /NO, WE HAVE TO PRINT THE LINE PRINT BRKMOD, TAD LSPACE /**IN RESPONSE TO AN SPR CRLF /OUTPUT CR/LF, TOO BREAK2, JMS NLPARM /SET UP NEW LINE PARMS TAD (SAVCL2+1) /RESET OUTPUT COROUTINE DCA SAVECR POPJ /RETURN WAS PUSHED BY BREAKX BRKCNT, 0 /SUBROUTINE TO HANDLE COMMANDS AND FUNCTIONS NOT YET IMPLEMENTED NYIMPL, ERRORC /TREAT IT AS COMMAND ERROR TEXT \NY\ *.-1 / DISPATCH SUBROUTINE / ARG 1 IS CHARLIST - 1, ARG 2 IS JUMPLIST-CHARLIST / IF TARGET CHAR MATCHES CHAR IN CHAR LIST, THEN / APPROPRIATE JUMP IS MADE / OTHERWISE RETURNS TO CALLER IF CHAR NOT IN LIST SORTJX, 0 DCA SORTCC /SAVE THE TARGET CHARACTER DCA SORTCN /CLEAR CHAR NO. TAD I SORTJX /GET CHARLIST-1 INC SORTJX DCA SORTXR /USE AUTO-XR SKP SORTJ1, INC SORTCN /INCREMENT NO. OF CHAR IN LIST TAD I SORTXR /GET CHAR FROM CHAR LIST SNA JMP SORTJ3 /ZERO ENDS THE LIST CIA TAD SORTCC /EQUAL TO TARGET CHAR? SZA CLA JMP SORTJ1 /NO, CHECK NEXT CHAR IN LIST SORTJ2, TAD I SORTJX /GET JLIST-CLIST SNA JMP I SORTJX /IF 0, RETURN IMMEDIATELY TAD SORTXR /MAKE PTR TO JUMPLIST DCA SORTJX TAD I SORTJX /GET THE JUMP LOCATION DCA SORTJX JMP I SORTJX /DISPATCH TO ROUTINE SORTJ3, TAD SORTCC /WAS TARGET CHAR 0 ALSO? SNA CLA JMP SORTJ2 /YES, SO WE HAVE EQUALITY TAD I SORTJX /GET CLIST-JLIST INC SORTJX /PREPARE TO RETURN TO CALLER SNA CLA INC SORTJX /IF 0, SKIP TO FAIL RETURN JMP I SORTJX /RETURN TO CALLER SORTCC, 0 / THE .BREAK COMMAND (ABBREVIATION .BR OR SIMPLY .) / SEND THE OUTPUT LINE TO OUTPUT FILE IF THERE IS SOMETHING IN IT BREAKC, BREAK STA DCA SVECAP /CAPITALIZE LIKE A PERIOD ACCORDING TO DARRELL EOCGO PAGE / .FIGURE N SKIP N LINES FOR A FIGURE ON THIS PAGE / OR EJECT AND THEN SKIP N LINES / .FIGURE DEFERRED N SAVE CTR FOR NEXT PAGE FOR FIGURE / IF DOESN'T FIT, BUT CONTINUE WITH TEXT ON / THIS PAGE FIGURE, WORDCK /CHECK FOR "DEFERRED" FIGWD JMP FIGDEF /YES, IS DEFERRED FIGURE NUMCHK /GET A NUMBER IF THERE I ONE BADCMD /NO, ILLEGAL COMMAND STA /NOT DEFERRED FIGURE JMP FIGDF2 /NEVER USE A RELATIVE JUMP FIGDEF, DCA I [CMDLINE] /TO GET ANOTHER ARGUMENT NUMCHK /GET A NUMBER IF THERE IS ONE JMP BADARG /NO, BAD ARGUMENT FIGDF2, DCA CTR1 /USED AS TEMP FLAG BREAK PUSHJ /IN CASE WE'RE AT BOTTOM OF PAGE PRTHEAD TAD NUMBER CIA TAD NLINES /NO. OF LINES LEFT ON PAGE SMA CLA JMP .+4 /YES, GO SKIP PROPER NO. OF LINES ISZ CTR1 /NO, DEFER THE FIGURE? JMP .+5 /YES DOEJECT /NO, MUST SKIP TO NEW PAGE TAD NUMBER CRLF /THEN SAVE FIGURE JMP FIGDF3 TAD NUMBER /DEFER TO NEXT PAGE TAD DEFERN /BY KEEPING UPDATED CTR DCA DEFERN FIGDF3, EOCGO /I.E. GARBAGE; RETURN / .FLAG TYPE C /SET TYPE FLAG TO CHARACTER C / .NOFLAG TYPE /CLEAR TYPE FLAG NOFLGC, STA DCA NOFLG /SET "NO" FLAG FLAGC, COMCHK /CHECK THEM OUT FLGWDS-1 0 JMP GOODFG /IS A GOOD FLAG WORD ILLFC, ERRORC /ILLEGAL FLAG COMMAND TEXT \FG\ *.-1 GOODFG, STA /BACK UP FOR "ALL" TAD SORTCN /WHICH TYPE? DCA FGNUM /SAVE THE FLAG NUMBER TAD FGNUM /AND GET IT BACK SPA /WAS IT "ALL" JMP FLAGSC TAD (CMDFLAGS) DCA PTR1 /POINTS TO APPROPRIATE FLAG SWITCH TAD NOFLG DCA I PTR1 /SET OR CLEAR THE FLAG TAD NOFLG SKIPYES /WAS IF .FLAG COMMAND? JMP FLAGC1 /NO, IT WAS .NOFLAG COMMAND SPNOR /IGNORE SPACES AFTER THE TYPE TAD CHAR EOCQ RETURN /IF NO CHARS ON LINE, RETURN TAD FGNUM /WHICH TYPE? TAD (CMDCHR-2) DCA PTR1 /POINTS TO FLAG CHARACTER TAD CHAR AND [377] /JUST WANT GOOD ASCII CHAR DCA I PTR1 /SAVE NEW FLAG CHARACTER GETC /GET NEXT CHAR FLAGC1, DCA CTFLAG /CONTROL FLAG ALWAYS ON DCA EFFLAG /ENDFOOTNOTE FLAG ALWAYS ON, TOO EOCGO / .FLAGS ALL / .NOFLAGS ALL FLAGSC, CLA TAD (CMDFLAGS) /SET UP POINTERS DCA PTR1 TAD (FLGBKU) DCA PTR2 TAD (CMDFLAGS-FLGEND) DCA COUNT TAD NOFLG /RESTORE OR CLEAR? SKIPYES JMP SAVFLG /SAVE AND CLEAR TAD I PTR2 /RESTORE THE FLAGS DCA I PTR1 JMS FLGDN /TEST IF FINISHED AND INC PTRS JMP .-3 /DO SOME MORE SAVFLG, TAD I PTR1 /SAVE AND CLEAR FLAGS DCA I PTR2 STA /7777 IS NO DCA I PTR1 /SET FLAG TO NO JMS FLGDN JMP .-5 /DO SOME MORE FGNUM, FLGDN, 0 /INCREMENT POINTERS AND TEST CTR INC PTR1 INC PTR2 ISZ COUNT JMP I FLGDN JMP FLAGC1 /CLEAN IT UP AND RETURN / .PERIOD SET PERIOD SWITCH; SET LAST AUTOCAP SWITCH / .NOPERIOD SET NOPERIOD SWITCH; SET NOAUTOCAPITALIZE, TOO NOPER, STA DCA NOFLG PERIOD, TAD NOFLG DCA SWPER /SET THE PERIOD SWITCH TAD SWPER /IS IT .PERIOD? SKIPYES JMP .+3 TAD CAPSW /YES, SET LAST AUTOCAPITALIZATION SKP STA /NO, SET "NO AUTOCAPITALIZE" DCA SWCAP /SET AUTOCAPITALIZATION SWITCH EOCGO /UTILITY ROUTINE FOR POSITIVE NUMERIC ARGS NUMPOX, 0 NUMCHK /GET A NUMBER MAYBE JMP I NUMPOX /NO NUMBER RETURN TO .+1 ISZ NUMPOX /A NUMBER, MAY BE GOOD TAD NUMBER /CHECK IT OUT SMA SZA /ONLY WANT POS DEF JMP I NUMPOX ERRORC TEXT \BN\ /IT IS A BAD NUMBER *.-1 /SUBROUTINE TO CHECK CONTROL CHARACTERS /ROUTINE SKIPS IF CHAR IS NOT A CONTROL AND RETURNS WITH ACC CLEAR CCCHK, 0 AND [377 /DON'T CARE ABOUT QUOTE NOW TAD [-" ] SMA /SKIP HERE IF CONTROL INC CCCHK /SKIP THERE IF NOT A CONTROL TAD (30 /SPACE - BACKSPACE SZA CLA /IS IT BACKSPACE? INC CCCHK /NO, SKIP ONE JMP I CCCHK PAGE / .SKIP N / OUTPUT N * LINE SPACING BLANK LINES / .BLANK N / OUTPUT N BLANK LINES / IF N<0, THEN SKIP TO N LINES FROM BOTTOM OF PAGE SKIP, STA /SKIP COMMAND, 7777 BLANK, DCA SKPSW /BLANK COMMAND, 0000 NUMCHK /GET A NUMBER IF THERE IS ONE SKP /NO NUMBER JMP .+3 /GOT A GOOD NUMBER CLA IAC DCA NUMBER /ASSUME 1 IF NOT BREAK TAD NUMBER /IS THE ARGUMENT O.K. ? SPA CLA JMP SKIP3 /NEGATIVE, RELATIVE ISZ SKPSW /SKIPPING OR BLANKING? JMP BLANK3 /BLANKING, GO GIVE CR/LF'S TAD LSPACE /(-) CURRENT LINE SPACING DCA COUNT TAD NUMBER /GET ACTUAL NO. OF LINES TO SKIP ISZ COUNT JMP .-2 DCA NUMBER /AND SAVE THE NO. BLANK3, TAD NUMBER /GET THE NUMBER OF LINES TO SKIP SPA SNA JMP BADARG /<= 0, IS ERROR CRLF /SKIP THE LINES TAD LSPACE /(-) CURRENT LINE SPACING TAD LSPACE / MULTIPLY BY 2 TAD NLINES /CAN WE FIT ON THIS PAGE? SPA CLA DOEJECT /NO, EJECT TO NEW PAGE JMP SKIP31 /RETURN SKIP3, TAD NUMBER /(-) FOR RELATIVE TAD NLINES /SKIP TO N LINES FROM BOTTOM SMA SZA /CAN WE DO IT ON THIS PAGE? CRLF /YES, GO TO N LINES FROM BOTTOM SKIP31, EOCGO SKPSW, 0 BADARG, ERRORC /BAD ARGUMENT TEXT \BA\ *.-1 / .PARAGRAPH / OPTIONAL 3 ARGUMENTS / INDENTION FOR PARAGRAPH, SPACING TO THE PARAGRAPH, AND / ".TEST PAGE" ARGUMENT PARAGRAPH,NUMCHK /GET FIRST ARGUMENT JMP PARAG0 /NO FIRST ARG JMS INDEN3 /CHECK IT AGAINST MARGINS TAD NUMBER /IT IS OK DCA PARAGN /INDENTION FOR PARAGRAPH PARAG0, DCA I [CMDLINE] NUMCHK /GET SECOND ARG JMP PARAG1 /NO SECOND ARG TAD NUMBER /USE CONVERTED NO. AS TAD (-5) SMA SZA CLA /IS ARG -, OR 1 TO 5? JMP BADARG /NO, ILLEGAL ARGUMENT TAD NUMBER /USE CONVERTED NO. AS DCA PARAGV /SPACING TO THE PARAGRAPH PARAG1, DCA I [CMDLINE] NUMCHK /GET THIRD ARG JMP PARAG4 /NO THIRD ARG TAD NUMBER /YES SPA JMP BADARG /IT WAS MINUS, TOO BAD! DCA PARAGP /USE AS ".TEST PAGE" ARG PARAG4, STA PARAG, DCA NUMBER /MARK AUTO ENTRY BREAK /PARAGRAPH ENTRY IF .AUTOPARAGRAPH SET TAD TXTFLG /ARE WE AT TOP OF NEW PAGE? SKIPYES JMP PAAARG /NO PARAGRAPH SPACING ON NEW PAGE TAD PARAGV SNA JMP PAAARG /ZERO OR NO LINES SMA JMP PARAG2 /USER SUPPLIED VERTICAL SPACING STA /-1 TO ACC TAD LSPACE /(-) STL RAR /USE (LINE SPACING + 1) / 2 PARAG2, CRLF PAAARG, TAD LSPACE /CAN PART OF PARAGRAPH FIT ON PAGE? DCA COUNT TAD PARAGP ISZ COUNT /.TEST PAGE ARG * LINE SPACING JMP .-2 SNA JMP PARAG3 /WE CAN FIT ON PAGE (NO SPECIAL TEST IF 0) CIA TAD NLINES SPA CLA /CAN WE FIT? DOEJECT /NO, MUST DO EJECT FIRST PARAG3, TAD PARAGN /PARAGRAPH INDENTION FOR LMARG MODIFIER JMS NLPARM /SET UP NEW LINE PARMS STA DCA ECAPSW /CAPITALIZE NEXT CHAR STA DCA SVECAP /NEED THIS FOR .PARAGRAPH ISZ NUMBER /.PARA OR AUTO? JMP NLINE1 /MULTIPLE LEADING SPACES GET CAUGHT EOCGO /RETURN IF .PARA / .TEST PAGE N / IF N LINES CAN FIT ON PAGE, O.K. / OTHERWISE, EJECT FIRST TESTPG, WORDCK TSTPGL JMP TSTPG BADCMD /ILLEGAL COMMAND TSTPG, BREAK /PRINT THIS LINE NUMPOS /GET A POSITIVE NUMBER JMP BADARG /ILLEGAL NUMERIC ARG CIA TAD NLINES SPA CLA DOEJECT /NO, MUST DO AN EJECT EOCGO /THE FOLLOWING CODE CHECKS FOR GARBAGE AT THE END OF MOST COMMANDS /IT ALSO IGNORES SPACES AND FINDS VALID EOL AND COMMAND CHARS EOCMOR, GETC /WHAT IS NEXT CHAR? EOCGOX, TAD CHAR /THIS IS THE ENTRY POINT VIA JMP SORTJ /CHECK THEM ALL OUT EOCLST-1 /WE DON'T CHECK COMMA EOCJMP-EOCLST ERROR /IF WE GET HERE IT IS GARBAGE TEXT \EC\ /END OF COMMAND ERROR *.-1 JMP I .+1 /TREAT IT LIKE A COMMENT EOCJMP, COMCOM /! COMMENT ON COMMAND LINE NLINE /; IS END OF LINE COMMAND /. IS NEW COMMAND EOCMOR / SPACE IS IGNORED EOCMOR /TAB IS IGNORED NLINE / 0 IS END OF LINE PAGE / .JUSTIFY SET JUSTIFY MODE / .NOJUSTIFY SET NO JUSTIFICATION MODE NOJUST, STA DCA NOFLG /SET "NO" FLAG JUST, TAD NOFLG DCA SWJUST /SET JUSTIFY-NOJUSTIFY FLAG TAD SWJUST DCA JUSTFG /SAVE THE FLAG, TOO BREAK JMP NUMC2 /IGNORE GARBAGE AND RETURN JUSTFG, 0 / .FILL SET FILL MODE; SET LAST JUSTIFY-NOJUSTIFY MODE / .NOFILL SET NOFILL MODE; SET NOJUSTIFICATION MODE NOFILL, STA DCA NOFLG FILLC, TAD NOFLG DCA SWFILL /SET THE FILL-NOFILL FLAG TAD SWFILL /IS IT FILL? SKIPYES JMP .+3 TAD JUSTFG /YES, SET LAST JUSTIFICATION SKP STA /NO, SET NOJUSTIFY, TOO DCA SWJUST /SET JUSTIFICATION SWITCH BREAK JMP NUMC2 /IGNORE GARBAGE AND RETURN / .NUMBER N / RENUMBER THE PAGE NO. TO N / .NONUMBER NONUM, STA DCA NOFLG /SET THE "NO" FLAG NUMCMD, TAD NOFLG DCA SWPNUM /SET THE PAGE NO. FLAG TAD SWPNUM SKIPYES JMP NUMC2 /IF .NONUMBER, GO RETURN NUMPOS /GET A POSITIVE NON ZERO NUMBER JMP NUMC2 /NO NUMBER JUST GO CLA /WE DON'T WANT IT YET NUMC1, TAD PAGENO RELQ DCA PAGENO /RESET PAGE NUMBER NUMC2, EOCGO / .CHAPTER CHAPTER NAME / TAKE REST OF COMMAND LINE AS NEW CHAPTER NAME / .SUBTITLE THIS IS A SUBTITLE / TAKE REST OF COMMAND AS NEW SUBTITLE / .TITLE THIS IS A TITLE / TAKE REST OF COMMAND LINE AS NEW TITLE CHAPTER,TAD (CHBUFF-1) /INITIALIZE PTR, CTR FOR CHAPTER DCA AUTOX3 TAD (-CHLENGTH) JMP TITLE1 SBTTLC, TAD (SBTTLB-1) /INIT PTR FOR SUBTITLE SKP /COUNT IS SAME AS TITLE EVEN, TAD (EVBUFF-1) /INIT FOR EVEN PAGE STUFF SKP /DITTO ABOVE ODD, TAD (ODBUFF-1) /NOW OFR ODD PAGES JMP TITLDO /DITTO TITLEC, TAD NOFLG /IS IT .NOTITLE SKIPYES JMP NOTITL /TURN OFF TITLE AND SUBTITLE SPACING DCA TITFLG /ON A REAL TITLE TURN IT ON TAD (TITLEB-1) /INITIALIZE PTR, CTR FOR TITLE TITLDO, DCA AUTOX3 TAD (-TLENGTH) TITLE1, DCA COUNT /SAVE THE COUNT TAD CHAR EOCQ /END OF COMMAND AFTER THE COMMAND? JMP TITL51 /YES, EMPTY BUFFER SPNOR /IGNORE LEADING SPACES SKP TITLE2, GETC /GET A CHAR FROM INPUT FILE TAD CHAR /CHECK IT OUT TITL51, CDF 10 /BUFFERS IN FLD 1 SNA JMP TITLE5 /END OF TITLE OR SUBTITLE DCA I AUTOX3 /SAVE IN BUFFER CDF 0 /BACK TO HERE ISZ COUNT /BUFFER FULL? JMP TITLE2 ERROR /YES, TITLE BUFFER FULL TEXT \HL\ *.-1 TITLE4, GETC /NOW GO TO END OF COMMAND TAD CHAR SZA CLA JMP TITLE4 TITLE5, DCA I AUTOX3 /ZERO TO END THE TITLE OR SUBTITLE CDF 0 /BACK TO FLD 0 RETURN /THEN RETURN NOTITL, STA /TURN OF TITLE STUFF DCA TITFLG JMP NUMC2 /A GOOD WAY TO GO HOME / .PAGING / .NOPAGING NOPAGE, STA DCA NOFLG PAGING, TAD NOFLG DCA SWPAGE JMP NUMC2 /IGNORE GARBAGE AND RETURN / .SUBPAGE / .END SUBPAGE (.ES) SUBPG, TAD ("A) /INITIALIZE SUBPAGE LETTER DCA SUBPGN SKP ESUBPG, STA DCA SWSBPG JMP NUMC2 /IGNORE GARBAGE AND RETURN / SUBROUTINE TO SAVE A CHAR IN OUTPUT LINE BUFFER / IF LINE BUFFER OVERFLOWS, RETURN .+2 / OTHERWISE, RETURN NORMALLY .+1 OSAVEX, 0 DCA I OUTPTR /SAVE CHAR IN OUTPUT LINE BUFFER TAD I OUTPTR /GET IT BACK NOW INC OUTPTR /INCREMENT PTR JMS CCCHK /CHECK IF CONTROL JMP OSAVBS /BACKSPACE IS A LITTLE HARDER JMP OSAVCC /YES SPECIAL DOINGS INC CURCOL /INCREMENT CURRENT ABSOLUTE COLUMN INC LENOL /LENGTH OF OUTPUT LINE ISZ OUTCTR /ANY MORE CHAR POSITIONS LEFT? SKP INC OSAVEX /NO, RETURN .+2 OSAVCC, INC CHRCNT /ALL CHARS ARE COUNTED HERE ISZ PLCNT /CHECK THE BUFFER COUNT JMP I OSAVEX /NORMAL RETURN .+1 ERRORF TEXT \ML\ *.-1 PLCNT, -MAXWIDTH /THE NUMBER OF POSITIONS IN THE BUFFER OSAVBS, STA /BACKSPACE MAKES THE LINE SHORTER TAD LENOL DCA LENOL STA /ONE LESS CHARACTER TO FILL IT TOO TAD OUTCTR DCA OUTCTR JMP OSAVCC /OTHERWISE IT IS A CONTROL PAGE / .LEFT N / .RIGHT N / LEFT ADJUST OR RIGHT ADJUST THE LINE / IF N APPEARS, MODIFY THE MARGIN / .LEFT MARGIN N / .RIGHT MARGIN N / CHANGE THE LEFT OR RIGHT MARGIN TO N LEFT, STA /SET "LEFT" RIGHT, DCA LRFLAG /SET "RIGHT" WORDCK /SEE WHAT WE GOT MARGWD JMP MARGS BREAK GETNUM JMS GLINE /GET THE LINE TO BE ADJUSTED ISZ LRFLAG /LEFT OR RIGHT ADJUST JMP RADJ /RIGHT ADJUST THE LINE TAD LMARG RELQ /GET NEW LEFT MARGIN JMS LMCHK /DON'T LET IT GET AWAY LADJ1, DCA ALMARG /FIX UP FOR ADJUSTING LINE PUSHJ /PRINT THE LINE PRINT TAD LSPACE CRLF EOCGO RADJ, TAD RMARG /GET THE NEW MARGIN RELQ DCA NUMBER /SAVE IT TEMPORARILY JMS RMCHK /KEEP CONTROL OF IT STA TAD LENOL CIA TAD NUMBER /NEW RMARG-LENOL+1 JMP LADJ1 /FIX UP FOR RIGHT ADJUSTMENT LMARGC, STA /.LM, SET LEFT MARGIN RMARGC, DCA LRFLAG /.RM, SET RIGHT MARGIN MARGS, DCA I [CMDLINE] /SO WE CAN GET A NUMERIC ARG GETNUM /GET NEW MARGIN SETTING ISZ LRFLAG /LEFT OR RIGHT? JMP RMARGS TAD LMARG /LEFT MARGIN RESET RELQ JMS LMCHK /CHECK NEGATIVE LEFT MARGIN DCA NUMBER /SAVE TEMPORARILY TAD NUMBER CIA TAD RMARG SPA SNA CLA /LEFT MARGIN >= RIGHT MARGIN? JMP MARGE /YES, GIVE ERROR TAD NUMBER DCA LMARG /SAVE GOOD LEFT MARGIN MARGS2, BREAK /NEW MARGINS ARE SET UP MARGGR, EOCGO RMARGS, TAD RMARG /RIGHT MARGIN RESET RELQ DCA NUMBER /SAVE A WHILE JMS RMCHK /CHECK AGAINST PWIDTH TAD NUMBER /CHECK IT NOW CIA TAD LMARG SPA SNA CLA /RIGHT MARGIN <= LEFT MARGIN? JMP .+3 /NO, GO SAVE IT MARGE, ERRORC /ILLEGAL MARGIN SETTING TEXT \BM\ *.-1 TAD NUMBER /GET GOOD RIGHT MARGIN DCA RMARG /AND SAVE IT JMP MARGS2 / .MARGINS N,M / SET LEFT MARGIN TO N, SET RIGHT MARGIN TO M MARGNS, GETNUM /GET NO. FOR LEFT MARGIN TAD LMARG RELQ JMS LMCHK DCA LRFLAG /SAVE IT TEMPORARILY DCA I [CMDLINE] /TO GET ANOTHER NUMERIC ARG GETNUM /GET NUMBER FOR RIGHT MARGIN TAD RMARG RELQ DCA NUMBER /SAVE RIGHT MARGIN TEMPORARILY JMS RMCHK TAD NUMBER CIA TAD LRFLAG SMA CLA JMP MARGE /LEFT MARGIN > RIGHT MARGIN, ERROR TAD LRFLAG /GOOD MARGINS DCA LMARG /SAVE LEFT MARGIN TAD NUMBER DCA RMARG /SAVE RIGHT MARGIN JMP MARGS2 /GO SET UP MARGINS AND RETURN LMCHK, 0 SMA SZA JMP I LMCHK CLA ERROR TEXT \LM\ CLA IAC /MAKE IT 1 JMP I LMCHK RMCHK, 0 TAD PWIDTH CIA TAD NUMBER /RIGHT MARGIN LEFT HERE SPA SNA CLA JMP I RMCHK ERROR TEXT \RM\ TAD PWIDTH DCA NUMBER /USE PWIDTH JMP I RMCHK / .AUTOPARAGRAPH / .NOAUTOPARAGRAPH NAUTOP, STA DCA NOFLG AUTOP, TAD NOFLG DCA SWPARA JMP MARGGR /IGNORE GARBAGE AND RETURN / SUBROUTINE TO RESTORE THE LINE BUFFER LRFLAG, /WATCH THIS IF MOVED THIS GOES WITH ABOVE CODE HREST, 0 RESTORE /RESTORE THE MARGS PUSHJ /SET UP NEW LINE PARMS NPARMS /"ALMARG" ALREADY SETUP, THOUGH POPA SNA JMP HREST6 /NOTHING TO RESTORE ON LINE POPA /GET THE COUNT DCA HSAVCT /RESTORE CTR POPA /DON'T NEED THE POINTER HREST4, POPA OSAVE /SAVE CHAR CORRECTLY IN BUFFER SKP /IN CASE THIS FILLS ??? JMP HREST6 /JUST RETURN ISZ HSAVCT /ALL CHARS MOVE? JMP HREST4 /NO HREST6, JMP I HREST /RETURN TO CALLER PAGE / A FOOTNOTE IS TO BE AT THE BOTTOM OF CURRENT PAGE / DO THE FOOTNOTE PRE-PROCESSING DOFNOTE, TAD (FNDFLE-1 /SAVE STUFF ACROSS FOOTNOTE SAVELIST FNDFLT-FNDFLE STA /WE ARE CURRENTLY PROCESSING DCA FNFLAG / INSIDE A FOOTNOTE TAD FNSTRT /INITIALIZE AUTOXR FOR FETCH DCA FNXR /FROM FOOTNOTE BUFFER JMP FIXRET /FIX UP PARAMETERS AND RETURN TO PROCESS IT / CONTINUATION OF "GETCX" ROUTINE / GET CHARACTERS FROM FOOTNOTE BUFFER GETCFN, TAD FNXR /AT END OF FOOTNOTE BUFFER? TAD FNLAST SZA CLA JMP GETCF1 /NO, MORE CHECKING TO DO ERRORF /FATAL ERROR TEXT \FX\ /FOOTNOTE BUFFER EXHAUSTED *.-1 GETCF1, TAD FNXR /END OF FOOTNOTE BUFFER? CMA /FNPTR IS 1 MORE THAN LAST CHAR TAD FNPTR /LAST LOC USED IN BUFFER + 1 SNA CLA JMP GETCF2 /YES, PREPARE TO EXIT FOOTNOTE PROCESSING TAD FNPTR2 /NO SNA JMP GETCFR /NO FOOTNOTES ON NEXT PAGE CIA TAD FNXR /AT START OF NEXT PAGE FOOTNOTE? SNA CLA JMP GETCF3 /YES, RESET FOR REGULAR PROCESSING GETCFR, JMS FNTFLD /FOOTNOTE BUFFER IN FIELD 1 TAD I FNXR /NO, GET CURRENT CHAR FROM FOOTNOTE BUFFER CDF 00 JMP GETXRT /GO BACK TO "GETX" GETCF2, CLA IAC /RESET FOOTNOTE BUFFER POINTER TAD FNSTRT /THIS IS FNBUFF-1 DCA FNPTR / TO BEGINNING OF THE BUFFER JMP EXFNOTE /EXIT FROM FOOTNOTE PROCESSING GETCF3, TAD FNSTRT /END OF FOOTNOTE, THIS PAGE DCA FNXR /MOVE BUFFER OF NEXT PAGE DOWN JMS FNTFLD /FOOTNOTE BUFFER IN FIELD 1 GETCF4, TAD I FNPTR2 INC FNPTR2 DCA I FNXR /SAVE CHAR AS WE MOVE TAD FNPTR2 /ARE WE AT END OF BUFFER CIA TAD FNPTR SZA CLA JMP GETCF4 /NO, CONTINUE TO MOVE CDF 00 /YES EXFNOTE,BREAK /OUTPUT LAST LINE OF FOOTNOTE DCA FNFLAG /NO LONGER PROCESSING A FOOTNOTE RESTORE JMP CRLFX3 /RETURN TO FINISH FOOTER / THERE CAN BE FOOTNOTES IN THIS DUMB PROGRAM!! / .FOOTNOTE N SAVE N LINES ON PAGE FOR FOOTNOTE FNOTE, TAD FNFLAG /ARE WE PROCESSING A FOOTNOTE? SNA CLA JMP .+3 /NO, PROCESS IT ERRORF /YES, FATAL ERROR TEXT \FF\ /FOOTNOTE IN FOOTNOTE *.-1 GETNUM /GET NO. OF LINES TO RESERVE GARBAGE /IGNORE OTHER GARBAGE TAD LSPACE /NO, GET LINE SPACING (-) DCA COUNT TAD NUMBER /RESERVE N * LINE SPACING SPA SNA CLA JMP BADARG /BAD FOOTNOTE ARGUMENT TAD NUMBER ISZ COUNT JMP .-2 DCA COUNT /TOTAL NO. OF LINES TAD COUNT CIA TAD NLINES SPA SNA /CAN FOOTNOTE FIT ON THIS PAGE? JMP FNOTE8 /NOPE DCA NLINES /YES, NEW LINE COUNTER IS UPDATED TAD COUNT TAD FNLINE /NO. OF LINES OF FOOTNOTE ON PAGE DCA FNLINE /UPDATE THE COUNTER FNOTE1, GET DCA CHAR /GET CHAR FROM OS/8 INPUT TAD CHAR CIA TAD EFCHAR SZA CLA /IS IT END OF FOOTNOTE? JMP FNOTE5 /NO, SAVE THIS LINE JMP CMDCOM /REMAINDER OF LINE IS A COMMENT FNOTE4, GET /GET NEXT CHAR ON LINE DCA CHAR FNOTE5, TAD CHAR /CURRENT CHAR JMS FNTFLD /FOOTNOTE BUFFER IN FIELD 1 DCA I FNPTR /SAVE CHAR IN FOOTNOTE BUFFER CDF 00 INC FNPTR TAD FNPTR /AT END OF BUFFER? TAD FNLAST SNA CLA JMP FNOTE6 /YES, ERROR MESSAGE TAD CHAR /NOPE TAD [-215] /IS IT LINE TERMINATOR? SMA SZA JMP FNOTE4 /NO, GET NEXT CHAR TAD (215-212) SPA CLA JMP FNOTE4 /NO, GET MORE CHARS ON LINE JMP FNOTE1 /YES, GET ANOTHER LINE FNOTE6, ERRORF /FATAL ERROR TO RUN OUT OF ROOM TEXT \FO\ *.-1 FNOTE8, CLA TAD FNCTR /FOOTNOTE ALREADY ON OTHER PAGE? SZA JMP .+3 /YES, ADD TO CURRENT CTR TAD FNPTR /NO FOOTNOTE ON NEW PAGE DCA FNPTR2 /SAVE PTR FOR OTHER PAGE TAD COUNT /SAVE THESE LINES DCA FNCTR /FOR CORRECT COUNT ON OTHER PAGE JMP FNOTE1 /GO GET THE FOOTNOTE FNSTRT, FNBUFF-1 /THIS COULD BE CHANGED BY INIT CODE FNLAST, -FNBEND /THIS CAN CHANGE ALSO FNTFLD, 0 CDF 10 /WE CAN CHANGE THE FIELD TOO JMP I FNTFLD PAGE / GET A NUMBER FOR A COMMAND / NUMERIC CHARS ARE IN COMMAND LINE GETNMX, 0 TAD I [CMDLINE] /ANY CHARS IN CMD LINE? SNA CLA JMS GETARG /NO, GO GET AN ARGUMENT TAD [CMDLINE] /YES, SET UP PTR & HALF SWITCH DCA NUMPTR DCA NUMHLF DCA SIGN /ASSUME + DCA CVRTQ /NO CONVERSION YET DCA RELFLG /NO RELATIVE DCA NUMBER /CLEAR NUMBER JMS NUMGET /GET A CHAR DCA GETNCH /AND SAVE IT TAD GETNCH TAD (-"+) SNA JMP GETN3 /"+"; SIGN IS + , SET RELATIVE TAD ("+-"-) SZA CLA JMP GETN4 STA /"-", SIGN IS -, SET RELATIVE GETN3, DCA SIGN /SET SIGN STA DCA RELFLG /SET RELATIVE FLAG, TOO JMP GETN6 GETN4, TAD GETNCH /NOT SIGN, GET CHAR AND CHECK FOR NUM SKP GETN6, JMS NUMGET /GET ANOTHER CHAR TAD (-"9) SMA SZA JMP GETN7 /NOT A DIGIT TAD ("9-"0) SPA JMP GETN7 /DITTO DCA GETDIG /SAVE GOOD DECIMAL DIGIT TAD NUMBER CLL RTL TAD NUMBER CLL RAL /MULTIPLY BY 10(10) TAD GETDIG /ADD IN NEW DIGIT DCA NUMBER /UPDATE THE NUMBER STA DCA CVRTQ /CONVERSION HAS TAKEN PLACE JMP GETN6 GETN7, CLA CLL /END OF NUMBER TAD CVRTQ /DID CONVERSION TAKE PLACE? SZA CLA TAD SIGN /YES, WAS SIGN (-) ? SNA CLA JMP I GETNMX /NO, JUST RETURN TAD NUMBER /YES, NEGATE THE NUMBER CIA DCA NUMBER JMP I GETNMX GETNCH, 0 GETDIG, 0 / GET A CHARACTER FROM COMMAND LINE FOR "GETNUM" NUMGET, 0 TAD I NUMPTR /YES, GET 2 CHARS ISZ NUMHLF /WHICH HALF TO USE? JMP NUML INC NUMPTR /NEXT 2 CHARS NUMR, AND [77] /USE RIGHT HALF TAD [" ] /GENERATE ASCII CHAR AND [77] TAD [" ] JMP I NUMGET /AND RETURN WITH IT NUML, CLL RTR; RTR; RTR /GET CHAR FROM LEFT HALF DCA NUMTMP STA DCA NUMHLF TAD NUMTMP JMP NUMR /AND GO CHECK IT OUT NUMHLF, 0 NUMPTR, 0 NUMTMP, 0 / SUBROUTINE TO OUTPUT A CARRIAGE RETURN / LINE FEED COMBO / ENTER WITH NO. OF CR/LF'S IN ACC (+) CRLFX, 0 SNA IAC /IF ZERO, ASSUME 1 SMA /SKIP IF ALREADY NEG CIA /MAKE NEG FOR CTR DCA CRLFC /SAVE THE COUNTER TAD CRLFX /SAVE RETURN LOC FOR REENTRY PUSHA /PRETEND HE CALLED VIA "PUSHJ" CRLFX2, TAD CRLFC /SAVE THE COUNTER ON THE STACK PUSHA PUSHJ /PRINT HEADER IF NECESSARY PRTHEAD TAD [215] /OUTPUT THE CARRIAGE RETURN FIRST PUT TAD (212) /OUTPUT THE LINE FEED NOW PUT STA TAD NLINES DCA NLINES /DECREMENT NO. OF LINES ON PAGE TAD NLINES SZA CLA /ANY LINES LEFT ON PAGE? JMP CRLFX5 /YES, MAYBE RETURN TAD FNFLAG /NO, ARE WE PROCESSING A FOOTNOTE? SZA CLA JMP CRLFX4 /YES, GO DO FOOTER TAD FNLINE /NO, IS THERE A FOOTNOTE ON THIS PAGE? SNA JMP CRLFX4 /NO, GO DO THE FOOTER DCA NLINES /YES, SET UP NO. OF LINES LEFT ON PAGE DCA FNLINE /ZAP NO. OF FOOTNOTE LINES TO ZERO JMP DOFNOTE /GO DO THE FOOTNOTE CRLFX3, TAD TOPSW /RETURN TO HERE AFTER FOOTNOTE PROCESSING SNA CLA /DO WE NEED TO GO TO TOP OF PAGE? DOEJECT /YES CRLFX5, JMS NLPARM /SET UP PARMS FOR NEW LINE POPA DCA CRLFC /RESTORE CURRENT CTR ISZ CRLFC /ALL LINES OUT YET? JMP CRLFX2 POPJ /YES, RETURN TO CALLER CRLFC, 0 PAGE / PRINT THE OUTPUT LINE / SEND THE OUTPUT LINE TO THE OUTPUT FILE PRINT, PUSHJ /DO WE DO TOP OF PAGE? PRTHEAD TAD (LINE-1) /PREPARE TO PRINT THE LINE DCA PRTXR /INITIALIZE PTR AND CTR TAD CHRCNT /LENGTH OF OUTPUT LINE SNA JMP PRINT6 /NOTHING IN LINE, JUST RETURN CIA DCA PRTCTR DCA TXTFLG /NOW WE ARE PRINTING JMS OVERDO /DO LEFT MARGIN ETC. DCA PRTCNT /NO. OF UNDERLINES ON LINE PRINT2, TAD I PRTXR /GET A CHAR DCA PRTCHR /SAVE CHAR FOR CHECKING TAD PRTCHR PUT /OUTPUT CHAR FIRST TAD PRTCHR /IS CHAR TO BE UNDERLINED? SMA CLA JMP PRINTC /NO, JUST COUNT IT TAD UNSWIT /YES, CAN WE UNDERLINE IT NOW? SPA CLA JMP .+3 /YES INC PRTCNT /NO, JUST COUNT IT JMP PRINTC TAD BSPCHR /SEND A BACKSPACE CHARACTER PUT TAD ULCHR /FOLLOWED BY AN UNDERLINE PUT PRINTC, ISZ PRTCTR /BUFFER EMPTY? JMP PRINT2 /NO, KEEP PRINTING MORE? TAD PRTCNT /DO WE NEED TO UNDERLINE THIS LINE? SNA CLA JMP PRINT6 /NO, GO RETURN TAD UNSWIT /BUFFER IS EMPTY SPA SNA CLA /DO WE UNDERLINE ANY CHAR? JMP PRINT6 /NOPE, PREPARE TO RETURN TAD [215] /FIRST OUTPUT CR TO GET TO START OF LINE PUT MTWO TAD UNSWIT SNA CLA /UNDERLINES ON SAME LINE (=2) ? JMS LFPUT /JUST A LINEFEED DON'T ADJ COUNT JMS OVERDO /LEFT MARGIN AND SHIFT TAD (LINE-1) /PREPARE TO CHECK BUFFER AGAIN DCA PRTXR /INITIALIZE PTR AND CTR TAD CHRCNT CIA DCA PRTCTR PRINT4, TAD I PRTXR /GET A CHARACTER SNA JMP PRINT6 /END OF BUFFER, PREPARE RETURN SMA /UNDERLINE THE CHAR? JMP PRINT5 /NO, JUST SPACE OVER IF NOT CONTROL CLA /YES, GET UNDERLINE TAD ULCHR /GET THE UNDERLINE CHAR _ OR - JMP PRINT8 PRINT5, JMS CCCHK JMP PRINT9 /A LITTLE EXTRA FOR BACKSPACE JMP PRINT8+1 /DON'T SPACE FOR CONTROLS TAD [" ] /JUST A SPACE PRINT8, PUT /OUTPUT THE CHARACTER ISZ PRTCTR JMP PRINT4 PRINT6, JMS NLPARM /RESET PARMS FOR NEW LINE POPJ /AND RETURN TO CALLER PRINT9, ISZ PRTXR /SKIP THIS NEXT CHAR /IT MUST BE THERE SINCE BS CAN'T END LINE ISZ PRTCTR /THIS CAN'T SKIP DITTO ABOVE JMP PRINT8+1 /REJOIN THE MAIN CODE ULCHR, "_ /NORMALLY UNDERLINE / HOW DO WE UNDERLINE A CHAR? / 0, NO UNDERLINE ALLOWED / 4000, FOLLOW CHAR BY BACKSPACE AND UNDERLINE CHARS / 1, SPACES AND UNDERLINES ON SAME LINE / 2, SPACES AND DASHES ON NEXT LINE UNSWIT, 1 /SPACES AND UNDERLINES ON SAME LINE PRTCTR, 0 PRTCHR, 0 PRTCNT, 0 KOVERE, 0 KOVERO, 0 BSPCHR, 210 OVERDO, 0 /PRINT SEQUENCE NUMBERS OVER AND LEFT MARGIN SPACES JMS PUTSEQ /MAYBE PUT IN SEQUENCE NUMBERS TAD PAGENO /GET THE PAGE NUMBER CLL RAR /EVEN OR ODD TO LINK STA SZL TAD KOVERO /DIFFERENCE FOR ODD PAGES TAD KOVERE /BINDING MARGIN FOR EVEN PAGES TAD ALMARG JMS TSPACE /OUTPUT LEADING SPACES JMP I OVERDO /GO BACK NOW / SUBROUTINE TO PRINT SPACES NECESSARY TO EFFECT LEFT MARGIN TSPACE, 0 SNA JMP I TSPACE /NO LEADING SPACES, RETURN CIA DCA TSPCTR /SAVE CTR TAD [" ] PUT ISZ TSPCTR JMP .-3 JMP I TSPACE / OUTPUT AN ERROR MESSAGE ERRORX, 0 CDF 0 TAD I ERRORX /PICK IT UP DCA ERRLNK /PASS IT TO REAL ROUTINE CIF 10 /WHICH IS IN FIELD 1 JMS ERROUT /DO PROPER ERROR STUFF ERRLNK, 0 INC ERRORX /SKIP OVER ERROR MESSAGE JMP I ERRORX /AND RETURN / GIVE ERROR MESSAGE AND GET NEXT COMMAND TSPCTR, ERRCX, 0 CLA CLL TAD I ERRCX /PICK UP ERROR MESSAGE DCA .+2 ERROR /OUTPUT IT 0 ERCGO, EOCGO /IGNORE ANY GARBAGE AND RETURN CTRLJ, GCTAB GCLF GCVT GCFF GCCR PAGE / .HEADER OPTIONS / PLACES THE HEADER LINE AND TELLS WHERE AND HOW TO PRINT IT / .NOHEADER NOHEAD, STA /SET THE "NO" FLAG DCA NOFLG HEADER, TAD NOFLG /SET THE HEADER SWITCH DCA SWHEAD TAD SWHEAD /WAS IT "NOHEADER" ? SKIPYES JMP HEAD2 /YES IT IS, JUST RETURN SPNOR /IGNORE SPACES AFTER COMMAND TAD CHAR EOCQ /END OF COMMAND? JMP HEAD2 /YES, JUST RETURN HEAD1, COMCHK HEADWD-1 HEADJ-1 TAD I [CMDLINE] /NOT, AN ARG THERE? SZA CLA JMP HEAD3 /YES, ILLEGAL HEADER ARGUMENT TAD NOFLG /NO, WAS IT SIMPLY "NO" ? SZA DCA SWHEAD /YES, JUST "NO", EQUIV. TO "NOHEADER" HEAD2, EOCGO HEAD3, ERRORC /ILLEGAL HEADER ARGUMENT TEXT \HD\ *.-1 HSTYLE, TAD (7774 /JUST STYLE BITS HDPUT, AND HWORD /COME HERE FROM OTHERS TAD SORTCN /HAS THE STYLE CODE DCA HWORD /PUT IT AWAY JMP HEAD1 /MAYBE ANOTHER HPOSIT, TAD (-4 /POSITION 4-7 TAD SORTCN /GET JUST THE 2 BITS CLL RTL /INTO POSITION DCA SORTCN /AND SAVE TAD (7763 /MASK FOR POSITION JMP HDPUT /PUT IT IN THE HEADER HPLACE, SKP /TOP OF PAGE HPLACI, STL CLA RAR /BOTTOM OF PAGE DCA SORTCN /SAVE IT CLL STA RAR /AC3777 MASK JMP HDPUT HBASE, SKP /ARABIC HBASI, STL CLA RTR /AC2000 FOR ROMAN DCA SORTCN /SAVE IT CLL STA RTR /AC5777 MASK JMP HDPUT HSPLIT, TAD [" ] /USE A SPACE FOR SPLIT CHAR DCA HDCHAR /EITHER SP OR - SEPARATES THEM TAD (1000 /FLAG BIT FOR SPLIT JMP .+3 HNSPLT, TAD ("-) /IF NOT SPLIT THEN HYPHEN DCA HDCHAR DCA SORTCN /FLAG BIT TEMPORARILY HERE TAD (6777 /GET THE MASK JMP HDPUT /AND PUT IT IN / THE CENTERING COMMANDS / .CENTER (.C) CENTERS ON 1 AND PAPER WIDTH / .CENTER N CENTERS OVER COLUMN N/2 / .CENTER WIDTH (.CW) CENTERS ON 1 AND PAPER WIDTH / .CENTER MARGINS (.CM) CENTERS ON CURRENT LEFT AND RIGHT MARGINS / .CENTER MARGINS N,M CENTERS ON MARGINS N AND M CENTC, COMCHK /CHECK FOR ANYTHING AFTER .CENTER CENTW-1 CENTJ-1 NUMCHK /GET A NUMBER SKP /NO NUMBER THERE JMP CENTC9 /YES TAD I [CMDLINE] /IS THERE ANYTHING AFTER .CENTER? SZA CLA BADCMD /YES, IS ILLEGAL COMMAND CWDTH, JMP CENTC8 /ASSUME STANDARD PAGE WIDTH FOR CENTERING CENTC3, TAD CENTLM /SET UP "CWIDTH" TAD CENTRM /CWIDTH = CENTRM+CENTLM CENTC8, DCA CWIDTH /SET UP CWIDTH FOR CENTERING GARBAGE /IGNORE GARBAGE ON COMMAND LINE BREAK TAD RTNLNK /WE GO OUT WITH A POP PUSHA CENTNT, JMS GLINE /GET A LINE TO CENTER TAD CWIDTH /GET THE CWIDTH TO ACC JMS CENTER /CENTER THE LINE (SET UP ALMARG) PUSHJ /PRINT CENTERED LINE PRINT TAD LSPACE /(-) LINE SPACING CRLF /RIGHT NO. OF CR/LF'S POPJ /WE MAY HAVE BEEN CALLED FROM NOTE CENTC9, TAD PWIDTH RELQ /SET UP THE CENTERING WIDTH JMP CENTC8 /GET THE LINE CMARG, GETNUM /GET THE MARGINS TO CENTER ON TAD LMARG RELQ DCA CENTLM /SET LEFT MARGIN FOR CENTERING DCA I [CMDLINE] /SO WE CAN GET ANOTHER NUMBER GETNUM TAD RMARG RELQ DCA CENTRM /SET RIGHT MARGIN FOR CENTERING JMP CENTC3 /GO CENTER NEXT LINE CENTLM, 0 CENTRM, 0 / GET A LINE TO ADJUST OR CENTER GLINE, 0 GLINE4, GETC /GET CHARS TO CENTER TAD CHAR SNA JMP I GLINE /END OF LINE, PREPARE TO CENTER IT TAD (-211) /IS CHAR A TAB? SNA CLA TAD (" -211) /YES, CONVERT IT TO A SPACE TAD CHAR OSAVE /SAVE IT IN OUTPUT LINE JMP GLINE4 ERROR /TOO MANY CHARS ON LINE TEXT \LL\ *.-1 GLINE5, GETC /GO FOR END OF LINE TAD CHAR SZA CLA JMP GLINE5 JMP I GLINE /RETURN WHEN FOUND /SMALL SUBROUTINE TO OUTPUT A CHAR TO TTY TYPEIT, 0 TLS TSF JMP .-1 CLA CLL JMP I TYPEIT PAGE / SUBROUTINE TO SET "ALMARG" SO THAT THE OUTPUT LINE IS CENTERED / IF ACC IS ZERO, USE THE STANDARD PAGE WIDTH / OTHERWISE, THE ACC CONTAINS CENTER LMARG + CENTER RMARG CENTER, 0 SNA TAD PWIDTH /IF ZERO, ASSUME CENTER ON PWIDTH DCA CWIDTH /USE FOR CENTER WIDTH TAD LENOL /ACTUAL LENGTH OF OUTPUT LINE CIA IAC TAD CWIDTH /CWIDTH = CENTER LMARG + CENTER RMARG CLL RAR DCA ALMARG /ALMARG=INT((CWIDTH-LENOL+1)/2) TAD PWIDTH CIA TAD LENOL TAD ALMARG SPA SNA CLA JMP I CENTER /THE ENTIRE LINE DOESN'T EXCEED PWIDTH TAD LENOL /YES, IT DOES CIA TAD PWIDTH DCA ALMARG /SO SET ACTUAL LEFT MARGIN SO THAT /THE ENTIRE LINE WILL FIT JMP I CENTER CWIDTH, 0 / FATAL ERROR HAS OCCURRED / GIVE ERROR MESSAGE AND RETURN TO SYSTEM ERRFX, 0 K7600, 7600 /CLEAR GARBAGE FROM ACC TAD I ERRFX DCA .+2 ERROR /OUTPUT ERROR MESSAGE 0 CIF 10 /MAIN END OF FILE IN FLD 1 JMP EOFIL3 /THEN FALL THRU FOR END OF FILE / END OF FILE PROCEDURE / CHECK TO SEE IF ALL COPIES OUT / THEN RETURN TO SYSTEM EOFILE, BREAK /END OF FILE, OUTPUT LAST LINE TAD TOPSW /ARE WE AT TOP OF PAGE? SNA CLA DOEJECT /NO, GO TO TOP OF PAGE CIF 10 JMP EOFCK1 /MOST OF WORK IS UP HERE / GET A WORD TO COMMAND BUFFER GETARG, 0 TAD [CMDLINE] /INITIALIZE COMMAND PTR DCA ARGPTR DCA I ARGPTR /ZERO CHARS TAD (-20) /LENGTH OF BUFFER DCA ARGCTR /INTIALIZE THE CTR DCA ARGHLF /STORE IN LEFT HALF FIRST GTARG1, SPNOR /IGNORE SPACES BEFORE ANYTHING SKP GTARG3, GETC /GET ANOTHER CHAR TAD CHAR SORTJ /SPECIAL COMMAND CHAR CHECK CMDLST-1 /!, ;, COMMA, SPACE, TAB, AND 0 (EOL) CMDLJ-CMDLST TAD ARGCTR SNA CLA JMP GTARG3 /IGNORE EXCESS CHARS TAD CHAR /IS CHAR A SMALL ALPHABETIC? JMS TSTALS /TEST FOR LOWER CASE ALPHABETIC SKP CLA JMP GTARG4 /YES, MAKE IT UPPER CASE TAD CHAR /NOT LOWER CASE ALPHABETIC AND [77] /STRIP TO 6 BITS JMP GTARG4+2 /AND GO STORE IT GTARG4, TAD CHAR /NOT A NUMERIC CHAR AND (37) /STRIP IT TO 5 BITS TO KEEP UPPER CASE ISZ ARGHLF JMP ARGLEFT /STORE IN LEFT HALF TAD I ARGPTR DCA I ARGPTR /STORE IN RIGHT HALF INC ARGPTR DCA I ARGPTR /MAKE SURE NEXT LOC IS ZERO ISZ ARGCTR /ANOTHER 2 CHARS IN NOP JMP GTARG3 ARGLEFT,CLL RTL; RTL; RTL /MOVE TO LEFT HALF DCA I ARGPTR /AND SAVE IT STA DCA ARGHLF /RIGHT HALF NEXT TIME JMP GTARG3 GETNOQ, TAD I [CMDLINE] /CHECK WHAT WE HAVE TAD (-1617) /"NO" SZA CLA JMP .+4 /SOMETHING THERE, GO RETURN TAD I (CMDLINE+1) /IS COMMAND JUST "NO" ? SNA CLA JMP GTARG1 /YES, IGNORE SPACES, GET REST OF IT CMDEND, JMP I GETARG /RETURN TO CALLER GTCOM, GETC /GET THE CHAR AFTER THE COMMA JMP CMDEND /TO START OFF NEXT TIME / COMMENT IN COMMAND LINE /COMMENT CODE CHANGED TO IGNORE FLAG STUFF IN COMMENTS 8/76 COMMENT,CIF 10 /ROUTINE IN FLD 1 JMS I (ENDCHK /IF ACC IS ZERO IT LOOKS FOR COMMAND END JMP CMDEND /IT ONLY COMES BACK WHEN DONE CMDCOM, STA /THE .COMMENT COMMAND IS NEARLY THE SAME COMCOM, CIF 10 JMS I (ENDCHK /UP THERE NOW RETURN /YES, RETURN ARGPTR, 0 ARGCTR, 0 ARGHLF, 0 / .SPACING N (N = 1-5) SPACING,BREAK GETNUM /WE WILL ALLOW RELATIVE DARRELL!! TAD LSPACE /SPACING IS NEGATIVE CIA RELQ /BUT THE USER DOESN'T KNOW THAT DCA NUMBER TAD NUMBER SPA SNA JMP BADARG /NO 0 OR NEGATIVE SPACING HERE TAD (-5) /IN RANGE 1 TO 5? SMA SZA CLA JMP BADARG /NO, BAD ARGUMENT TAD NUMBER /USE THE ARGUMENT AS CIA DCA LSPACE /THE NEW SPACING NUMBER (-) EOCGO PAGE / .PAGE COMMANDS / .PAGE OR .PAGE N /.PAGE EVEN /.PAGE ODD - GO TO THE NEXT EVEN OR ODD PAGE / .PAGE TOP / .PAGE BOTTOM / .PAGE SIZE PAGEC, COMCHK /CHECK FOR LEGAL "PAGE" COMMANDS PAGCMD-1 PAGJMP-1 PAGCOM, GETNUM /NOW THAT FOOTNOTE IS THROUGH GET THE NUMBER TAD (RELFLG /SAVE THIS STUFF ACROSS THIS FOOTNOTE MAYBE SAVELIST -4 BREAK /GET LAST LINE OF PAGE PRINTED OUT TAD TXTFLG /ARE WE AT TOP OF PAGE ALREADY? SNA CLA DOEJECT /NO, SKIP TO TOP OF NEW PAGE RESTORE /GET OUR STUFF BACK NOW TAD PAGENO RELQ /SET UP NEW PAGE NO. SMA JMP PAGEC2 /GOOD ERRORC /BAD PAGE NO., GIVE MESSAGE TEXT \PG\ *.-1 PAGEC2, TAD PAGSKP /MAYBE SKIP A PAGE DCA PAGENO /UPDATE THE PAGE NO. DCA PAGSKP /CLEAR THE SKIP EOCGO /CLEAN UP ANY GARBAGE AND RETURN /PAGE EVEN OR PAGE ODD /THESE FUNCTIONS ADVANCE THE PAGE /IF NECESSARY TO MAKE NEXT PAGE EVEN OR ODD PEVEN, CLA IAC /MAKE IT ODD PODD, TAD PAGENO /FIND OUT WHAT IT IS RAR;CLA RAL /EVEN ODD IN ACC 11 DCA PAGSKP /SHALL WE SKIP A PAGE? JMP PAGCOM /THIS IS FLAKY BUT WE ARE SHORT ON SPACE / .PAGE SIZE OR .PAPER SIZE COMMANDS / TWO ARGS, FIRST IS PAGE LENGTH, SECOND IS PAGE WIDTH PAGSIZE,GETNUM /GET THE FIRST ARG TAD PLENGTH RELQ DCA NUMBER /NEW PAGE LENGTH TAD NUMBER TAD (-21) /MUST BE AT LEAST 6+6+5 LONG SMA CLA JMP PAGSZ3 /LEGAL PAGE LENGTH PSIZER, ERRORC /PAGE SIZE MUST BE > 17 TEXT \PS\ *.-1 PAGSZ3, TAD NUMBER /THE PAGE LENGTH IS GOOD DCA PLENGTH /SO GIVE NEW PAGE LENGTH DCA I [CMDLINE] /TO GET NEW NUMBER GETNUM /GET THE PAGE WIDTH TAD PWIDTH RELQ DCA NUMBER /SAVE TEMPORARILY TAD NUMBER TAD (-MAXWIDTH) /MAXIMUM PAGE WIDHT SMA SZA CLA JMP PSIZER /PAGE SIZE IS TOO LARGE TAD NUMBER CIA TAD LMARG SMA CLA /PAGE WIDTH > LEFT MARGIN? JMP PSIZER /NO, BAD PAGE TAD NUMBER DCA PWIDTH /RESET PAGE WIDTH TAD NUMBER DCA RMARG /ALSO RESET RIGHT MARGIN BREAK /RESET FOR NEW WIDTH, NEW PARMS EOCGO / .PAGE TOP N,M / .PAGE BOTTOM N,M PAGTOP, TAD (TOP-BOTTOM) /USE TOP OF PAGE TABLES PAGBOT, TAD (BOTTOM) /USE BOTTOM OF PAGE TABLES DCA PAGPTR /INITIALIZE THE PTR GETNUM /GET NO. OF LINES TO SKIP AT "TOP" TAD I PAGPTR RELQ DCA I PAGPTR /SAVE IN APPROPRIATE TABLE INC PAGPTR /POINT TO 2ND ENTRY IN TABLE DCA I [CMDLINE] /CLEAR TO GET ANOTHER NUMBER GETNUM /GET NO. OF LINE TO SKIP AT "BOTTOM" TAD I PAGPTR RELQ DCA I PAGPTR /SAVE IN APPROPRIATE TABLE EOCGO PAGPTR, 0 / TEST CHAR IN ACC FOR LARGE ALPHABETIC TSTALX, 0 AND [377] /JUST WANT GOOD CHAR TAD (-"Z) SMA SZA JMP TSTRTN /NOT ALPHABETIC TAD ("Z-"A) SMA CLA ISZ TSTALX /.+2 IF ALPHABETIC TSTRTN, CLA CLL JMP I TSTALX /.+1 IF NOT LARGE ALPHABETICS / SUBROUTINE TO SKIP TO TOP OF NEW PAGE EJECTX, 0 TAD EJECTX /PRETEND WE WERE CALLED BY "PUSHJ" PUSHA TAD NLINES /NO. OF LINES TO BOTTOM OF PAGE CRLF /GO TO BOTTOM AND DO FOOTER, TOO POPJ /WE MUST RETURN THIS WAY / SUBROUTINE TO CHECK FOR END-OF-COMMAND CHAR EOCQX, 0 SZA /CHAR IN ACC TAD (-";) /NOT ZERO, IS IT SEMI-COLON? SZA CLA INC EOCQX /NOT SEMI OR EOL, RETURN .+2 JMP I EOCQX /EOL OR SEMI, RETURN .+1 / SUBROUTINE TO TEST CHAR IN ACC FOR SMALL ALPHABETIC / RETURN .+1 IF NOT, .+2 IF GOOD SMALL ALPHABETIC TSTALS, 0 AND [377] /GET RID OF EXTRA GARBAGE TAD (-SMALLZ) SMA SZA JMP TSTAL2 /NOT ALPHABETIC TAD (SMALLZ-SMALLA) SMA CLA INC TSTALS /RETURN .+2 IF GOOD SMALL ALPHABETIC TSTAL2, CLA CLL JMP I TSTALS /RETURN .+1 IF NOT / .CONTROL CHARACTERS / .NOCONTROL CHARACTERS NOCCHR, STA DCA NOFLG /SET "NO" FLAG CCHARS, WORDCK /CHECK SPELLING OF "CHARACTERS" CCHRS JMP CHARCC BADCMD /ILLEGAL COMMAND CHARCC, TAD NOFLG DCA SWCC /SET THE SWITCH CORRECTLY EOCGO PAGE / BOTTOM OF PAGE BREAK FOOTER, 0 TAD SWPAGE /DO WE FORM PAGES? SKIPYES JMP BBRK56 /NO DCA NLINES /NO LINES ON PAGE YET JMS HSAVE /SAVE CURRENT LINE BUFFER TAD SWHEAD /ANY FOOTER AT BOTTOM OF PAGE? SKIPYES JMP BBRK2 /NO, JUST OUTPUT FORM FEED TAD BOTTOM /ANY PRINTOUT AT BOTTOM OF PAGE? SZA CRLF /YES, FIRST OUTPUT "TOP" OF BOTTOM BREAK TAD HWORD /HEADER WORD CLL RAL /"BOTTOM" BIT TO LINK JMS OHEAD /OUTPUT THE HEADER LINE CLA /ACC IS -1 IF IT DIDN'T HAPPEN TAD FSWITC /SIMULATE A FORM FEED? SNA CLA JMP BBRK2 /NO TAD BOTTOM+1 /TTY, OUTPUT TO A PAGE BREAK SZA CRLF TAD (-6) /SIMULATE FORM FEED AND PAGE BREAK DCA BRKCTR BBRK0, TAD BRKCHR /PAGE BREAK IS "------" PUT ISZ BRKCTR JMP BBRK0 TAD [215] /FOLLOWED BY CARRIAGE RETURN PUT JMP BBRK21 BBRK2, TAD (214) /OUTPUT A FORM FEED TO PUT /GO TO TOP OF NEW PAGE BBRK21, TAD PSWITC /PAUSE AT PAGE BREAK? SNA CLA JMP BBRK5 /NO, GO ON BBRK1, CIF 10 /YES, DUMP THE BUFFER JMS I (XXDUMP) /DUMP CURRENT BUFFER IF PAUSE TAD (207) /BELL CHARACTER JMS TYPEIT /PRINT IT OUT BBRK11, KSF JMP .-1 /WAIT AROUND UNTILL OPERATOR IS READY KRB /READ THE CHAR TAD (-220) /MUST HIT CTRL/P SZA CLA JMP BBRK11 /OTHERWISE, WAIT AROUND BBRK5, JMS HREST /RESTORE LINE BUFFER TAD SWSBPG SKIPYES /OUTPUT SUBPAGE NO. ? JMP BBRK55 /NOPE TAD SUBPGN /YES TAD (-"Z) /ARE WE PAST THE LETTER "Z" ? SZA CLA JMP BBRK52 /NO, WE CAN INCREMENT SUBLETTER ERROR /YES, GIVE ERROR MESSAGE TEXT \BL\ *.-1 SKP BBRK52, INC SUBPGN /INCREMENT SUBLETTER SKP BBRK55, INC PAGENO /INCREMENT PAGE NUMBER NOP BBRK56, STA DCA TOPSW /WE NEED A TOP HEADER /WE USED TO SET NLINES HERE BUT THE RESULT /WAS THAT ROUTINES AT THE TOP OF A NEW PAGE /WOULD GET TWO DIFFERENT VALUES FOR NLINES JMP I FOOTER /RETURN TO CALLER BRKCHR, "- /MAY BE CHANGED TO SPACE BY OPTION BRKCTR, 0 /CONTINUATION OF CRLF FOR BOTTOM OF PAGE /WE STOP ANY CARRY OVER OF LINES CRLFX4, JMS FOOTER /PRINT OUT FOOTER SPACING AT LEAST JMS NLPARM /NEW LINE STUFF POPA /GET CRLF COUNT OFF THE STACK POPJ /RETURN NO BLANKS AT TOP OF PAGE / PART OF GETC ROUTINE / COME HERE IF ^, &, ', ", OR \ / PROCESSING SPECIAL CHARS (^^, ^&, ^', ^", \\, \&, \', \") GETMODE,TAD SORTCN TAD (ULFLAGS) DCA PTR1 /POINTS TO CORRECT FLAG CHARACTER FLAG TAD I PTR1 /CAN WE USE THIS FLAG CHARACTER? SKIPYES JMP GETCXR /NO, JUST RETURN TAD SORTCN /YES TAD (MODES) DCA PTR1 TAD I PTR1 DCA PTR1 /POINTS TO CORRECT MODE WORD TAD LOWONE DCA I PTR1 /SET THE MODE (UP/LOW, UNDERLINE, CAP) DCA LOWONE /DON'T FORCE NEXT CHAR LOWERCASE TAD SORTCN TAD (GETRJM) DCA PTR1 /FIGURE OUT WHERE TO RETURN TAD I PTR1 DCA PTR1 /ACTUAL LOC TO RETURN TO JMP I PTR1 /AND RETURN THERE / SAVE THE CURRENT LINE BUFFER HSAVE, 0 TAD CHRCNT /NO. OF CHARS IN OUTPUT LINE CIA DCA HSAVCT /SAVE FOR SAVELIST MAYBE TAD CHRCNT /GET IT AGAIN SNA JMP HSAVE5 /NOTHING ON LINE, SKIP SAVING TAD (LINE-1) SAVELIST /SAVE THIS STUFF FROM THE LINE HSAVCT, 0 HSAVE5, TAD CHRCNT /GET LINE COUNT PUSHA /AND SAVE IT TAD (RMARG /SAVE THE MARGIN STUFF SAVELIST -3 /ALMARG,LMARG,RMARG CLA IAC /SET MARGINS TO WIDTH DCA LMARG TAD PWIDTH DCA RMARG JMS NLPARM JMP I HSAVE PAGE / DO A TOP OF PAGE BREAK / CALLED BY "PUSHJ;PRTHEAD" PRTHEAD,TAD TOPSW /ARE WE AT TOP OF PAGE? SNA CLA POPJ /NO, RETURN DCA TOPSW /NO LONGER WE AIN'T STA /NO TEXT ON PAGE YET DCA TXTFLG JMS HSAVE /SAVE CURRENT LINE BUFFER TAD SWPAGE /DO WE FORM PAGES? SKIPYES JMP TBRK3 /NO, JUST RETURN DCA NLINES /NO LINES ON PAGE NOW TAD KDOWN /TOP BINDING MARGIN SZA /NO TOP MARGIN? JMS LFPUT /PUT THAT MANY LINE FEEDS TAD SWHEAD /DO WE DO A HEADING? SKIPYES JMP TBRK3 /NO, JUST SET UP LINES ON NEXT PAGE TAD TOP /DO "TOP" OF TOP OF PAGE SZA CRLF /SKIP APPROPRIATE NO. OF LINES TAD HWORD CLL RAL /GET "TOP" BIT TO LINK CML /IT IS COMPLEMENT JMS OHEAD /DO THE TOP OF PAGE HEADER LINE TAD TITFLG /DO WE DO TITLE STUFF? SKIPYES /OHEAD RETURNS INFO ON FIRST PAGE AS ACC=-1 JMP TBRK23 /NO, FORGET THE SPACING TOO CLA STL RAR DCA OUTCTR TAD PAGENO /CHECK FOR EVEN OR ODD CLL RAR /EVEN ODD TO LINK SZL CLA /GET APPROPRIATE BUFFER TAD (ODBUFF-EVBUFF TAD (EVBUFF-1 DCA .+2 /FOR THE MOVE COOMMAND JMS MOVEL /GET IT MAYBE EVBUFF-1 JMP TBRK1 /NOTHING THERE JMS PRJUST /PRINT IT JUSTIFIED JMP TBRK2 /THIS REPLACES TITLE TBRK1, JMS MOVEL /YES, MOVE TITLE LINE TO LINE BUFFER TITLEB-1 JMP TBRK2 /NO TITLE JMS CENTER /CENTER THE TITLE PUSHJ /PRINT IT PRINT TBRK2, CRLF JMS MOVEL /YES, MOVE TO LINE BUFFER SBTTLB-1 JMP TBRK22 /NO SUBTITLE JMS CENTER /CENTER IT, TOO PUSHJ /AND PRINT IT PRINT TBRK22, CRLF TBRK23, TAD TOP+1 /THEN NO. OF LINES TO BODY SZA CRLF STA /THERE IS NO TEXT ON THIS PAGE DCA TXTFLG /AT LEAST NOT YET. TAD TITFLG /ARE WE DOING TITLES SKIPNO CLA STL RTL /2 LINES FOR TITLE AND SUBTITLE IAC /2 AT THE BOTTOM TOO TAD TOP /CALCULATE BODY LENGTH TAD TOP+1 TAD BOTTOM TAD BOTTOM+1 CIA TBRK3, TAD PLENGTH DCA NLINES /NO. OF LINES IN MAIN BODY TAD FNFLAG SZA CLA /PROCESSING A FOOTNOTE? JMP TBRK31 /YES, RETURN IMMEDIATELY TAD DEFERN /DEFERRED FIGURE COUNT CIA TAD NLINES /CAN IT FIT SPA SNA CLA JMP TBRK4 /NO, ERROR TAD DEFERN SZA CRLF /SKIP APPROPRIATE NO. OF LINES DCA DEFERN /AND CLEAR DEFERRED FIGURE CT. TAD FNCTR /FOOTNOTE ON THIS PAGE? CIA TAD NLINES SPA JMP TBRK5 /CAN'T FIT DCA NLINES /YES, RESET LINE CTR TAD FNCTR /NO. OF LINES ON NEXT PAGE DCA FNLINE /INITIALIZE FOOTNOTE COUNTER DCA FNCTR /NO MORE FOOTNOTES YET TBRK31, JMS HREST /RESTORE THE LINE BUFFER POPJ /GO RETURN TBRK5, TBRK4, ERRORF /PAGE OVERFLOW ON DEFERRED FIGURE OR FOOTNOTE TEXT \PF\ *.-1 /SUBROUTINE TO PRINT THE CURRENT LINE WITH JUSTIFY ON PRJUST, 0 TAD SWJUST /OK, SAVE JUSTIFY MODE DCA TBTEMP /SAVE IT FOR NOW DCA SWJUST /WE WILL TRY TO JUSTIFY PUSHJ JUSTIFY TAD TBTEMP DCA SWJUST /RESTORE JUSTIFY JMP I PRJUST / SUBROUTINE TO OUTPUT LINEFEEDS TO DEVICE - AT LEAST ONE TBTEMP, LFPUT, 0 SNA IAC /IF 0 ASSUME 1 CIA DCA CTR1 /MAKE COUNT TAD (212) PUT ISZ CTR1 JMP .-3 JMP I LFPUT /WE WILL ALLOW A LIMITED USED OF THE DOWN PARAMETER FROM WITHIN THE FILE CDOWN, NUMPOS /A GOOD NUMBER NEEDED DCA KDOWN EOCGO KDOWN, 0 PAGE / SUBROUTINE TO OUTPUT THE HEADER LINE AT THE APPROPRIATE POSITION / THE LINK BIT IS SET IF THIS IS TIME TO OUTPUT IT OHEAD, 0 SNL CLA JMP OHEAD6 /DON'T OUTPUT THE LINE STA /DO WE PRINT IT ON THIS PAGE? TAD PAGENO /ONLY IF GREATER THAN 0 SPA JMP OHEAD6 /NO TITLE ON 0 TAD TFIRSW /-1 IF NO, 0 IF YES SPA /RETURN -1 IF WE DON'T PRINT HEADER JMP OHEAD6 /NO TITLE ON PAGE 1 CLA /CLEAN IT UP TAD SWPNUM /DO WE OUTPUT PAGE NUMBER? SKIPYES JMP OHEAD6 /NO CLL STA /ACC = -1 LINK = 0 JMS CHAPQ /MOVE IT IN UNLESS NUMBER COMES FIRST TAD HWORD AND (3) /CHECK OUT "NUMBER, UPPER, LOWER, MIXED" JMS ACCJMP /JMP TO OFFSET BELOW JMP OHEAD3 /"NUMBER" NO WORD TAD (PAGEU-PAGEL) /"UPPER" TAD (PAGEL-PAGEM) /"LOWER" TAD (PAGEM-1) /"MIXED" DCA .+2 /SAVE CORRECT "PAGE " JMS MOVEL /MOVE CORRECT "PAGE " TO LINE OHTEMP, 0 HDCHAR, "- /THIS LOCATION ALWAYS SKIPPED OHEAD3, TAD HWORD /CHECK ROMAN, ARABIC RTL /BIT TO LINK CLA /CLEAR FOR NUMBER TAD PAGENO /CONVERT THE NUMBER TO ASCII OR ROMAN SZL JMS BINROM /CONVERT TO ROMAN - SKIP TWO ON RETURN BINPRT OTSAVE /SAVE NUMBER THIS WAY TAD SWSBPG /HOW ABOUT SUBLETTER? SKIPYES JMP .+3 /NONE YET TAD SUBPGN /YES, JMS OTSAVE /SAVE THE SUBLETTER ON LINE, TOO TAD HWORD /WHERE TO PUT IT ON LINE? RTL /CHECK SPLIT SMA CLA /IS IT? JMP OHEAD8 /NO, REGULAR CHECK CLA IAC /LEFT MARG SETUP DCA ALMARG CLA CLL /PRINT NOW IF NUM - CHAP JMS CHAPQ /MAYBE NUMBER THEN CHAPTER JMS PRJUST /PRINT IT JUSTIFIED JMP OHEAD6 /NO CRLF IT'S DONE ALREADY OHEAD8, TAD HWORD /CHECK OTHERS RTR AND (3) /"LEFT, RIGHT, CENTER, ALTER" JMS ACCJMP /GO TO CORRECT OFFSET JMP OHEAD5 /"LEFT" JMP OHEAD4 /"RIGHT" JMP OHEAD7 /"CENTER" TAD PAGENO /"ALTER" CLL RAR /CHECK IF PAGE NUMBER IS EVEN OR ODD SNL CLA JMP OHEAD5 /"LEFT" FOR EVEN OHEAD4, STA /"RIGHT" IF ODD TAD LENOL CIA TAD PWIDTH /PWIDTH-LENOL+1 SKP /SET UP FOR CORRECT MARGINS OHEAD5, CLA IAC /AGAINST LEFT MARGIN IF "LEFT" DCA ALMARG /SET LEFT MARGIN CORRECTLY SKP OHEAD7, JMS CENTER /CENTER THE HEADER LINE - IF CENTER IGNORE SPLIT OHEAD2, PUSHJ PRINT CRLF /BLANK LINE IF NO HEADER OHEAD6, JMP I OHEAD /RETURN TO CALLER /RETURN ACC = -1 IF NO HEADER LINE WAS PRINTED /SUBROUTINE TO JUMP TO OFFSET IN THE ACC CHATMP, ACCJMP, 0 TAD ACCJMP DCA ACCJMP JMP I ACCJMP /MOVE CHAPTER BUFFER TO OUTPUT /ACC AND LINK SET IF THIS IS TIME FOR CHAP - NUMBER /ACC AND LINK CLEAR IF THIS IS TIME FOR NUMBER - CHAPTER CHAPQ, 0 DCA CHAPQF /SAVE ACC FLAG TAD HWORD /CHECK OPTIONS AND (1014 /SPLIT, ALTER ETC DCA CHATMP /SAVE IT A MINUTE IAC /NOW EVEN, ODD AND PAGENO TAD CHATMP /ALL TOGETHER NOW RAR /BRING IN THE LINK, EVEN ODD TO LINK TAD (-400 /ZERO IF SPLIT AND LEFT SNA JMP .+4 /NOT NOW RAR /NOW EVEN ODD AND ALTER AND EVEN TAD (-4003 SNA CLA /WAS IT ALTER AND EVEN AND NOW IAC /NOW FOR SNESE TAD CHAPQF SNA CLA JMP I CHAPQ /NOT NOW TAD CHAPQF /HOW ARE WE DOING THIS? SZA CLA JMP .+3 TAD HDCHAR /HEADER CHARACTER FIRST - NUMBER, CHAPTER JMS OTSAVE JMS MOVEL CHBUFF-1 /OK, MOVE IT IN JMP I CHAPQ /HOW ABOUT THAT, NOTHING THERE ISZ CHAPQF /CHECK FLAG AGAIN JMP I CHAPQ /WE ALREADY DID IT TAD HDCHAR JMS OTSAVE /SAVE THE DIVIDER JMP I CHAPQ /AND RETURN CHAPQF, 0 PAGE / .TAB STOPS N1,N2,...,N32 / SETS TAB STOPS IN TAB TABLE (MAX OF 32(10)) TABGET, TABSTP, TAD NOFLG SKIPYES /NO TABS? JMP NOTABS /OK, DO IT TAD (TABS-1) /INTIALIZE PTR, CTR, INITIAL CHAR DCA TABPTR TAD (-40) DCA TABCTR DCA TABCOL /NOT AT ANY COLUMN NOW TABG2, DCA I [CMDLINE] /SO WE CAN GET A NEW NUMBER NUMCHK /GET A NUMBER MAYBE JMP TABG3 /NOTHING TO CONVERT, TRY NEXT NUMBER TAD I TABPTR /USE CURRENT TAB STOP SETTING INC TABPTR RELQ DCA I TABPTR /AND SAVE IT TABG3, TAD I TABPTR /CHECK FOR LEGALITY OF ORDER SPA JMP TABG4 /NO TABS CAN BE < 0 CIA TAD TABCOL /CURRENT TAB COLUMN SMA CLA JMP TABG4 /TABS OUT OF ORDER TAD CHAR /GOOD TAB STOP, CHECK ENDING CHAR EOCQ JMP TABG5 /END OF COMMAND, RETURN TAD I TABPTR /CURRENT TAB STOP DCA TABCOL ISZ TABCTR /ALL TABS CHECKED? JMP TABG2 /NO, GET ANOTHER ONE TABG4, ERROR /TOO MANY TAB STOPS TEXT \TS\ *.-1 DCA I TABPTR /CLEAR LAST ONE OUT TABG5, EOCGO NOTABS, DCA I (TABS) /ZERO THE FIRST ONE JMP TABG5 /AND RETURN TABPTR, 0 TABCTR, 0 / .TABS ABSOLUTE OR .TABS RELATIVE OR JUST TABS OR TABS STOPS TABSAR, COMCHK /CHECK FOR ANYTHING AFTER "TABS" TABSLJ-1 TABSJS-1 TAD I [CMDLINE] SNA /ANYTHING AT ALL JMP TABSTP /ASSUME TAB STOPS BADCMD /NOPE, ILLEGAL COMMAND TABREL, STA /SET FOR RELATIVE TAB STOPS TABABS, DCA TABFLG /SET FOR ABSOLUTE TAB STOPS JMP TABG5 /CONVENIENTLY ON THIS PAGE /CODE TO PLACE SEQUENCE NUMBERS IN BINDING MARGIN IF REQUESTED SEQMRC, /NUMBERS OVERSTRUCK ON UNDERLINED LINES PUTSEQ, 0 TAD SEQFLG SKIPYES /ARE WE DOING THIS? JMP I PUTSEQ /NO, JUST RETURN WITH HIS ARG DCA SEQCTR /ZERO THE CHAR COUNT TAD INPAGE /FIRST THE INPUT PAGE BINPRT SEQSAV /OUR OWN OUTPUT ROUTINE TAD (". /TO SEPARATE PAGE FROM LINE PUT TAD INLINE /NOW THE LINE BINPRT SEQSAV TAD SEQCTR /HOW MANY NUMBERS CMA /OFF BY THE "." TAD SEQMRG /HOW MUCH SHOULD WE USE SMA /ERROR IF PAST IT JMP SEQSPC ERROR TEXT \SM\ *.-1 SEQSPC, JMS TSPACE JMP I PUTSEQ SEQTMP, SEQSAV, 0 ISZ SEQCTR PUT JMP I SEQSAV SEQMRG, 6 /NORMALLY 2 PAGE 1 DOT 2 LINE SEQCTR=CTR2 / SUBROUTINE TO CONVERT NUMBER IN ACC TO DECIMAL ASCII CHARACTERS / LEADING ZEROES ARE IGNORED TABCOL, /TRY TO CLEAN THIS UP LATER????? BINASC, 0 CDF 10 /NUMBER FOR ROUTINE IN FLD 1 DCA BINNUM /SAVE THE NUMBER CDF 0 /NOW GET OUTPUT ARG TAD I BINASC /GET OUTPUT ROUTINE DCA BINOTR ISZ BINASC /SKIP OVER ARG BINALP, CDF 0 /FOR THE LOOP CIF 10 /ROUTINE IN FLD 1 JMS BINCHR /GET A CHAR SNA /NULL ENDS NUMBER JMP I BINASC /SO RETURN JMS I BINOTR /OUTPUT THE NUMBER JMP BINALP /GET NEXT CHAR BINOTR, OTSAVE /THIS IF NONE OTHER / USE NUMBER IN ACC AS BASE OF LAST CONVERSION / DEPENDING UPON SETTINGS OF "CVRTQ" AND "RELFLG" RELQX, 0 DCA RELQTM /SAVE ACC AS WE MIGHT USE IT TAD CVRTQ /DID CONVERSION TAKE PLACE? SNA CLA JMP RELQ2 /NO, JUST USE NUMBER WE CAME IN WITH TAD RELFLG /YES, WAS IT RELATIVE? SZA CLA TAD RELQTM /YES, ADD OR SUBTRACT BASE NUM TAD NUMBER /NO, ABSOLUTE: USE THE NEW NUMBER JMP I RELQX RELQ2, TAD RELQTM /NO CONVERSION JMP I RELQX /USE WHAT WE ENTERED WITH RELQTM, 0 /CONTINUATION OF FOOTNOTE TO SET UP PARAMETERS AND RETURN TO INPUT FIXRET, CLA IAC DCA LMARG /SET LEFT MARGIN TO 1 TAD PWIDTH DCA RMARG /SET RIGHT MARGIN TO PAGE WIDTH STA DCA LSPACE /SET SINGLE SPACING DCA PARAGN /NO PARAGRAPH INDENTION STA DCA MODE /SET LOWER CASE MODE STA DCA CFMODE /NO CAPITALIZATION STA DCA UNMODE /NO UNDERLINING DCA SWJUST /JUSTIFY MODE DCA SWFILL /FILL MODE JMS NLPARM /SET UP NEW PARAMETERS RETURN /TO DO THE FOOTNOTE PAGE / IGNORE SPACES OR TABS ON COMMAND LINE / OR LEADING SPACES OR TABS AT BEGINNING OF PARAGRAPH. SPNORX, 0 TAD CHAR TAD [-" ] SNA JMP .+4 /SPACE, IGNORE IT TAD (" -211) SZA CLA JMP I SPNORX /NON-SPACE OR TAB, RETURN GETC /TAB OR SPACE, IGNORE IT JMP SPNORX+1 / .INDENT N / USE AS INDENTION FOR THIS LINE INDENT, GETNUM /GET NO. TO INDENT LEFT MARG BREAK JMS INDEN3 /CHECK FOR MARGIN VIOLATIONS TAD NUMBER /OK, DO IT JMS NLPARM /SET UP LINE FOR THIS LINE EOCGO INDEN3, 0 /CHECK ROUTINE USED BY PARAG TOO STA TAD NUMBER TAD LMARG SMA CLA /ILLEGAL LEFT MARG? JMP INDEN2 /NO, USE AS LEFT MARG FOR THIS LINE INDEN1, ERRORC /BAD MARGIN TEXT \BM\ *.-1 INDEN2, TAD RMARG /CHECK AGAINST RIGHT MARGIN CIA TAD NUMBER TAD LMARG SMA CLA JMP INDEN1 /PAST RIGHT MARGIN, ERROR JMP I INDEN3 /OK, RETURN FOR ACTION /SUBROUTINE TO CONVERT NUMBER TO ROMAN NUMERALS /NUMBERS WRAP AT 2047 BINROM, 0 AND (3777 /STRIP OFF SIGN BIT IF SET DCA ROMNUM /OUR NUMBER SAVING PLACE ISZ BINROM /SKIP THE JMS BINASC ON RETURN ISZ BINROM TAD (BNRT /INIT THE VALUE POINTER DCA PTR1 /A GENERAL POINTER TAD (BNRC /THE CHARACTER LIST DCA CTR1 /WE USE IT AS A POINTER TAD (BNRC+2 /SUBTRACTING CHAR DCA CTR2 /LIKEWISE ABOVE JMP BNRI /ENTER ROUTINE IN THE MIDDLE BNR0, TAD I PTR1 /GET A VALUE 0F MINUS FIVER TAD ROMNUM /CHECK THE NUMBER SPA /LARGER? JMP BNR1 /NO, CHECK MORE DCA ROMNUM /YES, REPLACE IT TAD I CTR1 /GET THIS CHAR JMS OTSAVE /AND SAVE IT STL CLA RAR /AC4000 TO SKIP NEXT TEST BNR1, ISZ PTR1 /CHECK REGULAR VALUE TAD I PTR1 /IS IT 1 LESS THAN FIVER SPA JMP BNR2 /NO, IT IS LESS THAN THAT DCA ROMNUM /YES, SAVE THIS VALUE TAD I CTR2 /GET REVERSE COUPLE JMS OTSAVE TAD I CTR1 JMS OTSAVE /I.E. "CD" OR "IV" BNR2, ISZ CTR1 /MOVE UP THE POINTERS NOW ISZ CTR2 ISZ CTR2 BNRI, CLA /COME HERE FIRST TAD I PTR1 /CHECK FOR UNIT DROPS CIA /MAKE DROP NEGATIVE TAD ROMNUM SPA /LARGER? JMP BNR3 /NO, CHECK REVERSE DCA ROMNUM /YES, SAVE REDUCED NUMBER TAD I CTR1 /AND OUTPUT THE CHAR JMS OTSAVE JMP BNRI /CHECK THIS SOME MORE BNR3, ISZ PTR1 /BUMP TO NEXT UNIT ISZ PTR1 /OVER THE FIVER TAD I PTR1 /CHECK FOR SUCH AS "IX" SPA /DID IT MAKE IT? JMP BNR4 /NO, CLEAN UP DCA ROMNUM /YES, SAVE ADJUSTED NUMBER TAD I CTR2 /AND PRINT REVERSE PAIR JMS OTSAVE TAD I CTR1 JMS OTSAVE BNR4, CLA /CHECK FOR ALL DONE TAD ROMNUM /IS IT ZERO SNA SPA CLA /OR NEGATIVE??? JMP I BINROM /ZERO IS NOT ROMAN STA /NO, DECREMENT BACK TO FIVER TAD PTR1 DCA PTR1 /THE VALUE POINTER ISZ CTR1 /ADJUST THE OTHER CHAR POINTER JMP BNR0 /AND DO IT ALL SOME MORE DECIMAL BNRT, 1000 -500 100 -50 10 -5 1 OCTAL ROMNUM, 0 ROMZRO, 0 /MUST BE HERE FOR CONVERSION BNRC, "M+40; "D+40; "C+40; "L+40; "X+40; "V+40; "I+40 / POPJ RETURN FROM LAST PUSHJ POPJX, POPA /GET RETURN FROM TOP OF STACK DCA PPTEMP /SAVE IT FOR JUMP JMP I PPTEMP /RETURN TO CALLER /.FIRST TITLE - PRINT HEADER INFORMATION OF FIRST PAGE FSTTL, WORDCK TITWRD /"TITLE" JMP FSTTL1 BADCMD FSTTL1, TAD NOFLG DCA TFIRSW /SET OR CLEAR THE FLAG EOCGO PAGE /.NOTE, .NT, .LS, .EN, .ELS /CONVENIENCE COMMANDS FOR NOTE AND TEMPORARY LEFT MARGIN /CURRENT MARGINS SAVED ON STACK. THE TWO COMMANDS USE A COMMON COUNT /AND A COMMON MARGIN RESTORATION ROUTINE NOTEDO, JMS NTLSUB /SET UP AND SAVE CURRENT MARGS TAD TXTFLG /ANY TEXT YET? SKIPNO CRLF /ANOTHER BLANK LINE TAD NUMBER /EITHER HIS OR THE DEFAULT CIA TAD RMARG DCA RMARG /NEW RIGHT MARGIN JMS CKMRGS /DON'T LET MARGINS INTERSECT TAD LMARG /GET PARAMETER FOR CENTERING TAD RMARG DCA CWIDTH /SAVE FOR CENTERING PUSHJ CENTNT /CENTER LINE OR NEXT CRLF /LEAVE ANOTHER BLANK LINE RETURN LSDO, JMS NTLSUB /LIST COMMAND JMS CKMRGS / JMP NOFILL /SET NOFILL AND SET UP NEW LINES BREAK /PUT IN NEW MARGS JMP LSGO /DECSYSTEM-10 LEAVES FILL ALONE NTLSUB, 0 /SET UP AND SAVE MARGS FOR NOTE BREAK /OUTPUT THE CURRENT LINE TAD (-5) /ONLY 5 ALLOWED TAD NTCNT SMA CLA JMP NTERR /TOO MANY NOTES TAD TXTFLG /ANY TEXT ON PAGE? SKIPNO CRLF /LEAVE A BLANK LINE TAD (LMARG+3 /SAVE THE LEFT MARGIN SAVELIST /SAVE THE MARGS -4 /SAVE JUSTIFY AND FILL ALSO NUMCHK SKP /NO NUMBER THERE JMP NTL6 /YES, USE HIS NUMBER TAD NTCNT /IS THIS THE FIRST NOTE OR LS SNA CLA TAD (5) /10 FOR FIRST, 5 FOR REST TAD (4) DCA NUMBER /SAVE IT WHERE HE WANT'S IT NTL6, INC NTCNT /MOVE UP COUNT TAD NUMBER TAD LMARG DCA LMARG /NEW LEFT MARGIN JMP I NTLSUB /RETURN TO DO IT CKMRGS, 0 /CHECK FOR VALID MARGINS TAD LMARG CIA TAD (-5) TAD (-5) TAD RMARG /AT LEAST 10 SPACES ON LINE SMA SZA CLA JMP I CKMRGS /IT IS OK ERROR TEXT \NM\ *.-1 RESTORE /DON'T CHANGE THE MARGS TAD (LMARG+3 SAVELIST /SAVE THEM BACK -4 JMP I CKMRGS /PRETEND NO ERROR ENNOTE, STA /DECREMENT THE NOTE COUNT TAD NTCNT SPA /ARE WE OK? JMP NTER1 DCA NTCNT /SAVE THE NEW COUNT RESTORE /PUT THE MARGS BACK BREAK /SET UP THE MARGS AND PRINT CURRENT CRLF /LEAVE A TRAILING BLANK LINE LSGO, EOCGO NTCNT, 0 NTERR, NTER1, ERRORC TEXT \NS\ *.-1 / .END / CHECK OUT NEXT WORD FOR LEGAL COMMAND END, COMCHK /CHECK WORD AFTER "END" ENDWORD-1 ENDWJ-1 TAD I [CMDLINE] SNA /NONE AT ALL JMP ENNOTE /JUST END IS END NOTE BADCMD /BAD SPELLING, ILLEGAL COMMAND /RESET COMMAND FOR MULTIPLE DOCUMENTS RESET, BREAK /DUMP LINE IF ANY DCA TOPSW /GO TOP OF PAGE JMP PRTGO /SET UP ALMOST EVERYTHING / SUBROUTINE TO MOVE A BUFFER TO OUTPUT LINE /SKIPS IF ANYTHING IS MOVED MOVEL, 0 STA DCA MOVTMP /MARK THE FLAG TAD I MOVEL /ADDR-1 OF BUFF INC MOVEL DCA AUTOX2 MOVLP, CDF 10 /LINES IN FLD 1 TAD I AUTOX2 CDF 0 SNA JMP MOVLRT /0 ENDS THE STRING JMS OTSAVE /SAVE THE TITLE WAY DCA MOVTMP /WE DID IT JMP MOVLP MOVLRT, ISZ MOVTMP /SKIPS IF NO MOVE ISZ MOVEL JMP I MOVEL MOVTMP, 0 / SAVE A CHAR IN OUTPUT BUFFER FROM OTITLE ROUTINES OTSAVE, 0 OSAVE /SAVE IN OUTPUT BUFFER JMP I OTSAVE /RETURN IF O.K. ERROR /LONG TITLE OR WHATEVER, NO MORE ROOM TEXT \LH\ *.-1 JMP OHEAD6 /NOW PREPARE TO RETURN /.TABS QUOTE, .NTQ, .NO TABS QUOTE NTBQOT, STA DCA NOFLG TABQOT, TAD NOFLG /ON OR OFF? SKIPNO /OFF TAD [400] /SET QUOTE BIT TAD [" ] /OR JUST SPACE DCA TABCHR /FOR THE TAB CHARACTER EOCGO PAGE / PUT CHAR TO OS/8 OUTPUT FILE PUTX, 0 DCA PUTCHR /SAVE THE OUTPUT CHAR TAD USWITC /FORCE UPPER CASE? SNA CLA JMP PUTX2 /NO, JUST PASS CHAR TAD PUTCHR JMS TSTALS /TEST FOR SMALL ALPHABETICS JMP PUTX2 /NOT SMALL CHAR TAD PUTCHR /GET THE CHAR AND [7737] DCA PUTCHR /MAKE THE UPPER CASE CHAR PUTX2, CLA CLL TAD PUTCHR /GET THE GOOD OUTPUT CHAR CIF 10 JMS I (XXPUT) /OUTPUT TO OS/8 FILE JMP I PUTX PUTCHR, 0 /PART OF GETC STUFF FOR UPPER CASE AND LOWER CASE GETUP, TAD UCFLAG SKIPYES JMP GETCX4 /NOT USING UPPER CASE FLAG CHARACTER JMP GETUP2 /LOCK OR UPPER = 0000 GETLOW, TAD LCFLAG SKIPYES JMP GETCX4 /NOT USING LOWER CASE FLAG CHARACTER STA /UNLOCK OR LOWER = 7777 GETUP2, DCA LOWONE /SAVE UPPER OR LOWE SET GET DCA CHAR /GET CHAR AFTER ^ OR \ TAD CHAR SORTJ /CHECK IT OUT AGAINST UPLOWC-1 / ^, &, ', \ 0 JMP GETMODE /YES IT IS TAD LOWONE CMA DCA UPONE /SET UPONE AS COMPLEMENT OF LOWONE JMP GETCX3 /NOT, JUST PLAY WITH CHARACTER /ROUTINES TO COMPLETE THE GETC CODING FOR INDEX AND HYPHEN GETHYP, TAD HYPFLG /CHECK IF HYPHENATING SKIPYES JMP GETCX4 /NO, A NORMAL CHAR TAD (HYPINT /GET INTERNAL HYPHEN CODE TRANGO, DCA CHAR /AND USE IT INSTEAD JMP GETCX7+1 /AND RETURN IT GETCSB, TAD SUBFLG /ARE WE IN A SUBINDEX COMMAND? SKIPYES JMP SDXSUB /NO, CHECK FOR INDEX DCA SBCFLG /YES, MAKE FLAG YES JMP GETCX2 /AND GET NEXT CHAR SDXSUB, TAD CHAR SORTJ /CHECK REST OF CHARS AGAIN NDXCHR-1 SUBJMP-NDXCHR JMP GETCX4 /NO, IT'S NOT THE SAME GETCDX, TAD NDXFLG /ARE WE USING INDEX SKIPYES JMP GETCX4 /NO, JUST NORMAL / TAD ANGINT /YES TRANSLATE TO INTERNAL / JMP TRANGO /USE OTHER RETURN JMP GETCX1 /IGNORE FOR NOW SBCFLG, 0 /THIS CODE IS NOT EXECUTED IN 8K MACHINES IFNZRO DOINDX < /.INDEX, .FLAG INDEX, .SUBINDEX ETC. /.FLAG INDEX MUST BE STUBBED, THE OTHERS CAN ALL BE NOT YET IMPLEMENTED /THE CODE WILL NOT BE EXECUTED ALTHOUGH PRESENT /MAJOR INDEX CODE IS IN FIELD 1 /CODE FOR .INDEX COMMAND NDXIN, PUSHA /PUT A ZERO ON THE STACK NDXGO, GETC /GET NEXT CHAR SZA /IS IT THE EOL JMP NDXIN /NO, KEEP GETTING JMS I NDXMKL /OK, MAKE THE ENTRY RETURN /NEXT LINE /CODE FOR SUBINDEX COMMAND SUBIDX, PUSHA /PUT ON A ZERO FOR FIELD 1 DCA SUBFLG /LET GETC KNOW WE ARE HERE GETC /GET ANOTHER CHAR SUBNDX, TAD SBCFLG /SUB, SUB? SKIPNO JMP SUBNTY /GO TO A SUBENTRY TAD CHAR /IS IT AN END OF COMMAND CHAR? EOCQ JMP ENDNTY /YES, END IT TAD CHAR /NO, SAVE IT ON STACK PUSHA JMP SUBNDX-1 /GET ANOTHER CHAR SUBNTY, STA DCA SBCFLG /TURN IT OFF NOW CIF 10 /GO TO INDEX SEARCH FOR BRANCH JMP I NDXLCL /DON'T PUT IN PAGE BLOCK ENDNTY, STA DCA SUBFLG /TURN OFF SUBINDEX FLAG CIF 10 /AND MARK THIS ENTRY JMS I NDXMKL /PUT IT IN THE INDEX EOCGO SUBLNG=.-SUBIDX /HOW LONG WAS THAT? NDXMKL, HLTINS NDXLCL, HLTINS /SIMILAR CODE FOR NDXPUT TO ACTUALLY LOCATE ENTRIES IN THE INDEX /THE CONSTRUCTION ..FOO..BAR DENOTES A SUBINDEX ELEMENT /SIMILARLY TO .X FOO..BAR /THE CONSTRUCTION BOO#BOO CREATES THE INDEX ENTRY BOO BOO /THIS CODE WILL BE OVERLAYED IN THE 12K VERSIONS AT RUN TIME NDXPUT, 0 /CALLED FROM THE SAVE ROUTINE FOR INDEX TAD SAVCHR /STUB FOR NOW, JUST CHECK THE CHAR SNA /THE END? JMP SAVCL2 /YES, BACK TO NORMAL JMP I NDXPUT /NO, MORE CHARS TO THE BIT BUCKET ZBLOCK SUBLNG /RESERVE ENOUGH ROOM NDXEND=. NDXOUT=200 NDXPRT, CDF CIF 10 /PRINT OUT INDEX CODING IS IN FIELD 1 JMP I .+1 /IT WILL LIE IN THE CURRENT FOOTNOTE NDXOUT /AND FUNCTION BY FOOLING THE GET > / .UPPER CASE (.UC) / .LOWER CASE (.LC) LOWER, STA /LOWER = 7777 UPPER, DCA NUMBER /UPPER = 0000 WORDCK /MAKE SURE OF COMMAND CASEWD JMP ULCASE /IS GOOD COMMAND BADCMD /ILLEGAL COMMAND LCASE, STA /LOWER CASE = 7777 UCASE, DCA NUMBER /UPPER CASE = 0000 ULCASE, TAD NUMBER /GET THE APPROPRIATE CASE DCA MODE /SET MODE EOCGO / .AUTOCAPITALIZE / .NO AUTOCAPITALIZE NAUTOC, STA DCA NOFLG /SET "NO" FLAG AUTCAP, TAD NOFLG DCA SWCAP /SET AUTOCAP-NOAUTOCAP FLAG TAD SWCAP DCA CAPSW /SAVE THE FLAG, TOO COVGO, EOCGO CAPSW, 0 /A LITTLE ROUTINE TO SAVE SOME SPACE BY CHECKING NUMBERS NUMCKX, 0 GETNUM /CONVERT A NUMBER MAYBE TAD CVRTQ /DID WE GET ONE? SZA CLA ISZ NUMCKX /SKIP IF YES JMP I NUMCKX /OTHERWISE TO REGULAR /THE OVER COMMAND MAY BE INCLUDED IN THE FILE BUT IF IT /APPEARS ON THE COMMAND LINE, OVER IN THE DOCUMENT IS IGNORED COVER, TAD KOVERE /DID WE GET ONE IN COMMAND LINE? SZA CLA /WE ONLY TAKE THE FIRST JMP COVNO /YES, DON'T DO IT NUMPOS /GET A GOOD POSITIVE NUMBER NOP DCA KOVERE /EITHER A GOOD ONE OR 0 DCA I [CMDLINE NUMPOS /IS THERE ANOTHER? JMP COVGO /NO, GO ON BACK DCA KOVERO /SAVE IT TAD KOVERE /GET LEFT EVEN CIA TAD KOVERO DCA KOVERO /SAVE THE DIFFERENCE JMP COVGO COVNO, NUMPOS /GET THE POSITIVE NUMBER JMP COVGO /THERE WASN'T ONE CLA /TO GET ANOTHER ARG MAYBE DCA I [CMDLINE NUMPOS /WAS THERE ANOTHER JMP COVGO CLA JMP COVGO /IGNORE IT ANYWAY PAGE GETRJM, GETCX1 GETCX1 GETCFL GETCX1 CMDJMP, GETSP GETCHR GETCWD GETHYP GETCSB SUBJMP, GETCDX GETUP GETUN GETCFL GETLOW / CONSTANTS USED THROUGHOUT PROGRAM CMDLST, ", EOCLST, "! "; ". 240 211 0 /THE EOL CHAR CMDLJ, GTCOM COMMENT CMDEND CMDEND GETNOQ GETNOQ CMDEND /0 (EOL) = SPACE / SOME LEFTOVER SPACE FOR MISCELLANEOUS CMDLINE,ZBLOCK 20 /THE COMMAND LINE BUFFER / COMMAND FLAGS / 0 = CHARACTER USED, 7777 = CHAR FLAG NOT USED /ALL FLAGS ARE ASSEMBLED OFF FOR THE EXTENDED OPTION CHECKING /THEIR ACTUAL INITIAL VALUES ARE SET BY THE INIT CODE /AND MAY BE SEEN IN THE BACKUP TABLE WHICH FOLLOWS CMDFLAGS, CTFLAG, YES /., COMMAND FLAG (ALWAYS USED) EFFLAG, YES /!, END OF FOOTNOTE FLAG (ALWAYS USED) SPFLAG, NO /#, FORCED SPACE CHARACTER QUFLAG, NO /_, QUOTE CHARACTER PRECEDENT CQFLAG, NO /<, CAPITALIZE ENTIRE WORD HYPFLG, NO /-, HYPHENATE OPTIONALLY SUBFLG, NO />, SUBINDEX INDICATOR NDXFLG, NO />, INLINE INDEX INDICATOR ULFLAGS, /ONLY LOCKABLE FLAGS BELOW HERE UCFLAG, NO /^, UPPER CASE PRECEDENT UNFLAG, NO /&, UNDERLINE CHAR PRECEDENT CFFLAG, NO /', CAPITALIZE FIRST CHARS /THIS MUST BE THE LAST LOCATION IN THE FLAG TABLE LCFLAG, NO /\, LOWER CASE PRECEDENT FLGEND=. / BACKUP FLAG TABLE / 0 = CHARACTER USED, 7777 = CHAR FLAG NOT USED /TABLE MUST DUPLICATE THE ACTIVE FLAG TABLE FLGBKU, YES /., COMMAND FLAG (ALWAYS USED) YES /!, END OF FOOTNOTE FLAG (ALWAYS USED) YES /#, FORCED SPACE CHARACTER YES /_, QUOTE CHARACTER PRECEDENT NO /", CAPITALIZE ENTIRE WORD NO /-, HYPHENATE OPTIONALLY NO />, SUBINDEX INDICATOR NO />, INLINE INDEX INDICATOR YES /^, UPPER CASE PRECEDENT YES /&, UNDERLINE CHAR PRECEDENT NO /', CAPITALIZE FIRST CHARS YES /\, LOWER CASE PRECEDENT /FLAG CHARACTERS CTLCHR, ". EFCHAR, "! CMDCHR, "# "_ "< CMDHYP, "- SUBCHR, "> NDXCHR, "> UPLOWC, "^ /FROM HERE DOWN, LOCKABLE "& "' "\ 0 /END OF FLAG CHARACTERS /LOWER CASE PRECEDENT FLAG IS LAST CTRLS, 211; 212; 213; 214; 215; 0 MODES, MODE UNMODE CFMODE MODE / DO NOT PUT A "PAGE" PSEUDO-OP HERE!!! EJECT MAXWIDTH=204 /132(10) = WIDTH OF LONGEST OUTPUT LINE DOT=. TABS=DOT; DOT=DOT+40+1 /32 TAB STOPS LINE=DOT; DOT=DOT+MAXWIDTH /MAX SIZE IS 132(10) IFNZRO 6600-DOT&4000 < HNDSPC, 0 ZZZZ > *TABS+200&7600 /SIZE THE CORE SO WE CAN OPTIMIZE SOME BUFFERS AND MAYBE ADD SOME FEATURES /WE ONLY NEED TO DO THIS ONCE HENCE IT IS IN THE HANDLER SPACE GETCOR, 0 CLA CLL /THIS IS A STRAIGHT LIFT FROM THE BOOK TAD I (7777 /EXCEPT THIS OF COURSE, CHECK SOFTWARE CORE SIZE AND COR70 /IS IT SET? SNA JMP CORO /NO, CALCULATE IT CLL RTR;RAR /YES, JUST USE IT IAC /IT IS ONE LARGER THOUGH JMP COREX+1 CORO, CDF 0 TAD CORSIZ RTL;RAL /GET IT UP IN PLACE AND COR70 /JUST THE FIELD TAD COREX /AN INSTRUCTION DCA .+1 /EXECUTE IT HERE COR1, CDF /THIS GETS THE ONE THAT SAVES THE LOC MAYBE TAD I CORLOC COR2, NOP /HACK FOR PDP-8 IT MIGHT SKIP DCA COR1 /SAVE THIS A MINUTE TAD COR2 /7000 IS A GOOD PATTERN DCA I CORLOC /NOW TRY A STORE COR70, 70 /ANOTHER NOP AND HACK FOR THE 8 TAD I CORLOC /CAN WE GET IT BACK CORX, 7400 /ONCE MORE THE POSSIBLE SKIP TAD CORX /OK, CHECK IT TAD CORV SZA CLA JMP COREX /DIDN'T GET THAT ONE TAD COR1 /GOT IT, RESTORE THE LOCATION DCA I CORLOC ISZ CORSIZ /TRY ANOTHER JMP CORO COREX, TAD CORSIZ CDF 10 /THIS IS TO PUT IT IN FLD 1 DCA I (HOWBIG CDF CIF 10 JMP I GETCOR /OK, GO ON BACK CORLOC, CORX CORV, 1400 CORSIZ, 1 PRINTR, JMP CHNRES /CHECK IF REAL CHAIN OR RESTART JMS VERPRT /PRINT OUT WHO WE ARE GETCD, CIF 10 JMS I (7700) /GET USR TO MEMORY 10 CIF 10 JMS I (200) /USR STILL IN MEMORY 5 /CALL COMMAND DECODER TEXT \RO\ /ASSUMED INPUT EXTENSION *.-1 /KILL THE 0 NOCD, CIF 10 JMS I (SETIO) /SET UP I/O FOR US TO WORK WITH CIF 10 /OPTIONS IN FLD 1 TOO JMS OPTION /GET OPTION SWITCHES TAD (7604 /DISABLE RESTART DCA I (SLOC JMP PRTGO+1 /OK, GO DO IT CHNRES, CDF 10 TAD I (MPARAM-1) /CHECK ALTMODE FLAG CDF 0 SMA CLA /REAL OR RESTART JMP GETCD /RESTART JMP NOCD /WE REALLY WERE CHAINED PAGE /WE ONLY PRINT THE VERSION ONCE TOO VERPRT, 0 /PRINT OUT VERSION MESSAGE TAD (VERMESS-1) /PREPARE TO GIVE CURRENT VERSION NO. DCA AUTOX1 PRTV, TAD I AUTOX1 /GET AN ASCII CHAR SNA JMP VERLNQ /LONG OR SHORT ID JMS TYPEIT /PRINT THE CHAR JMP PRTV /KEEP PRINTING CHARS VERLNQ, KSF /PRINT IT? JMP I VERPRT /NO, FORGET IT KCC /YES, BUT KILL HIS CHAR JMP PRTV VERMESS, "R;"U;"N;"O;"F;"F;" ;"V VERS1; VERS2; PATCH; 215; 212; 0 "C;"O;"P;"Y;"R;"I;"G;"H;"T;" ;"1;"9;"7;"5; 215; 212 "W;"E;"S;"T;" ;"V;"I;"R;"G;"I;"N;"I;"A;" "U;"N;"I;"V;"E;"R;"S;"I;"T;"Y; 215; 212 "M;"A;"I;"N;"T;"A;"I;"N;"E;"R;":;" "T;".;" ;"W;".;" ;"M;"C;"I;"N;"T;"Y;"R;"E;215;212;0 PAGE INDEVH=6600 /INPUT DEVICE HANDLER ADDR OUDEVH=7200 /OUTPUT DEVICE HANDLER ADDR EJECT / THESE ARE THE PAGE ZERO LITERALS FOR FIELD 0 FIELD 1 FNBUFF=0 /THE FOOTNOTE BUFFER IS IN FIELD 1 FNBEND=1777 /BELOW THE GENERAL I/O ROUTINES / GENERALIZED I/O PACKAGE / BY: CLYDE G. ROBY, JR. / DEPARTMENT OF MEDICINE / WEST VIRGINIA UNIVERSITY / MORGANTOWN, WEST VIRGINIA / MARCH 24, 1972 FIELD 1 /EXECUTES IN FIELD 1 *2000 / ENTRY POINT IN FIELD 1 CALLED FROM FIELD 0 SETIO, 0 CDF 10 /WE'RE WORKING IN FIELD 1 DCA USRSTAT /USR IS IN CORE TAD I (7604) /EXT FOR FIRST OUTPUT FILE SNA TAD OUFEXT /ASSUME .WU FOR WRITE-UP DCA I (7604) TAD I (7600) SZA CLA /IS THERE A MAIN OUTPUT FILE? JMP SETIO4 /YES, CHECK IF 2ND OUTPUT FILE DCA LPTDEV+1 /NO, TRY TO GET "LPT" JMS I (200) 12 /INQUIRE WITHOUT FETCH LPTDEV, LP+T0!4000 /COMPRESSED CODE FOR 'LPT' 0 /DEVICE NUMBER GOES HERE 0 /ADDR IF HANDLER IN CORE JMP TRYTTY /LPT: NOT AVAILABLE, TRY TTY: TAD LPTDEV+1 /GET THE DEVICE NUMBER JMP GOTDEV /WE HAVE THE DEVICE TRYTTY, DCA TTYDEV+1 /TRY TO GET "TTY" JMS I (200) 12 /INQUIRE WITHOUT FETCH TTYDEV, TT+Y0!4000 /COMPRESSED CODE FOR 'TTY' 0 0 HLT /WHAT!, NO TTY!!! TAD TTYDEV+1 /GET THE DEVICE NUMBER GOTDEV, DCA I (7600) /SAVE AS OUTPUT DEVICE NO. SETIO4, TAD (7600) DCA OFILE2 /USE MAIN OUTPUT FILE SETIO5, JMS I (OOPEN) /INITIALIZE OUTPUT ROUTINE SMA CLA /DID OUTPUT ENTER FAIL? JMP SETIO7 /OK STA /INHIBIT OUTPUT IF NO OUTPUT DCA OUTINH JMS ERRPRT TEXT \OO\ *.-1 SETIO7, JMS I (IOPEN) /INITIALIZE INPUT ROUTINE JMS I (OTYPE) /GET "TYPE" OF OUTPUT DEVICE TAD (-PTP) /IS IT THE PAPER TAPE PUNCH? SZA CLA JMP SETIO6 /NO, GO RETURN TAD (-200) DCA SETIO9 JMS XXPUT /OUTPUT SOME NULL CHARS ISZ SETIO9 JMP .-2 SETIO6, JMS PUTUSR /OUTPUT THE USR CDF CIF 00 JMP I SETIO SETIO9, 0 OFILE2, 0 OUFEXT, WU WU="W-300^100+"U-300 TT="T-300^100+"T-300 Y0="Y-300^100 LP="L-300^100+"P-300 T0="T-300^100 HOWBIG, 0 /HERE FOR NOW IT GETS THE MEMORY SIZE /THE FOLLOWING CODE CHECKS FOR END OF LINE OR COMMAND /IT IS ALWAYS CALLED FROM FLD ZERO AND RETURNS ON FINDING ITS THING ENDCHK, 0 /**PATCH A--FIX PROBLEM WITH COMMENT...NOWICKI SZA CLA /NON ZERO LOOK AT LAST CHAR JMP EOLCHK /AND ONLY CHECK EOL CDF 10 /GET THE DF UP HERE NOW FOR XXGET ENDCKL, JMS XXGET /GET THE NEXT CHAR TAD (-"; /IS THIS IT? SNA JMP ENDCKR /YES, GO ON BACK NOW TAD ("; /RESTORE THE CHAR JMS EOLQQ /MAYBE IT ENDED WITH EOL JMP ENDCKL /NO, LOOK SOME MORE EOLCHK, TAD I (CHAR /DF IS STILL 0 HERE CDF 10 SNA CLA /DID WE ALREADY GET IT? JMP ENDCKR JMS XXGET /GET NEXT CHAR JMS EOLQQ /CHECK FOR EOL JMP .-2 /NOT YET EOLQQ, 0 /CHECK FOR EOL CHARS, LF, FF, VT TAD (-215 /THIS IS ONE BOUNDARY SMA JMP I EOLQQ /THAT WASN'T IT TAD (4 SPA CLA JMP I EOLQQ /THAT WASN'T EITHER ENDCKR, CDF CIF 00 /WE ALWAYS GO BACK TO 0 DCA I (CHAR) /CHAR IS NOW AN EFFECTIVE EOL JMP I ENDCHK PAGE / IOPEN: INITIALIZE INPUT FILES IN7400, 7400 /*****MUST BE FIRST LOC OF PAGE***** IOPEN, 0 CLA CMA DCA INCHCT /SET INCHCT TO FORCE A READ ISZ INEOF /SET E-O-F FLAG TO FORCE A NEW FILE TAD (7617 DCA INFPTR /RESET FILE POINTER RDF TAD INCDIF DCA .+1 INPTR, HLT /RESTORE CALLING FIELDS JMP I IOPEN / ICHAR: GET A CHAR FROM INPUT FILES / RETURN TO .+1 IF ERROR (<0) / OR IF END-OF-FILE (>0) / RETURN TO .+2 WITH CHAR IN ACC ICHAR, 0 IN7600, 7600 RDF TAD INCDIF DCA INRTRN /SAVE CALLING FIELDS INCHRX, CDF INFLD ISZ INJMP /BUMP THREE-WAY UNPACK SWITCH ISZ INCHCT INJMPP, JMP INJMP TAD INEOF SNA CLA /DID LAST READ YIELD END-OF-FILE? JMP INGBUF /NO - DO ANOTHER GETNEW, JMP INNEWF /OPEN A NEW INPUT FILE INGBUF, TAD INKTR CLL TAD (INRECS SNL DCA INKTR /RESTORE INKTR IF IT HASN'T OVERFLOWED SZL /IS THIS THE LAST READ? ISZ INEOF /YES - SET END-OF-FILE FLAG CLL CML CMA RTR /CONSTRUCT A CTRL WORD FOR THE READ RTR /FROM THE AMOUNT OF THE OVERFLOW RTR /(IF ANY) AND THE STANDARD CTRL WORD TAD (INCTL+1 DCA INCTLW INCDIF, CDF CIF 0 CDF 10 JMS I INHNDL /CALL THE DEVICE HANDLER INCTLW, 0 INBUFP, INBUF INREC, 0 JMP INERRX /INPUT HANDLER ERROR INBREC, TAD INREC TAD (INRECS DCA INREC /UPDATE THE RECORD NUMBER TAD INCTLW AND IN7600 CLL RAL TAD INCTLW AND IN7600 CMA DCA INCHCT /COMPUTE THE NEW CHARACTER COUNT TAD INJMPP DCA INJMP /RESET THE CHARACTER SWITCH TAD INBUFP DCA INPTR /AND THE WORD POINTER JMP INCHRX /GO BACK AND MAKE BELIEVE / THIS NEVER HAPPENED INERRX, ISZ INEOF /EITHER AN END-OF-FILE OR A BADDIE SMA CLA /WHICH TYPE WAS IT? JMP INBREC /END OF FILE - RESUME THY PROCESSING INERR, CLA CLL CML RAR /BADDIE - GIVE ERR RETURN WITH NEG AC EOFERR, JMP INRTRN INJMP, HLT /THIS IS THE 3 - WAY CHARACTER SWITCH JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD INJMPP DCA INJMP TAD I INPTR IN200, AND IN7400 CLL RTR RTR /COMBINE THE HIGH-ORDER FOUR BITS OF TAD INCTLW RTR /THE TWO WORD TO FORM THE 3RD CHAR RTR ISZ INPTR JMP INCOMN ICHAR2, TAD I INPTR AND IN7400 DCA INCTLW /SAVE HI-ORDER BITS FOR THE 3RD CHAR ISZ INPTR /BUMP THE WORD POINTER ICHAR1, TAD I INPTR INCOMN, AND (177 TAD (-32 SNA /IS THE CHARACTER A ^Z? JMP GETNEW /YES - GET A NEW FILE TAD (232 /RESTORE THE CHARACTER TO 8 BITS ISZ ICHAR /BUMP RETURN TO NORMAL RETURN INRTRN, 0 /RESTORE CALLING FIELDS JMP I ICHAR /AND RETURN /IOPEN IS UNNECESSARY. INCHCT, -1 /INPUT CHARACTER COUNT INNEWF, CDF 10 /NEW INPUT FILE JMS CHKHND /IS IT THE SAME HANDLER DCA INHNDL /INITIALIZE HANDLER ADDRESS TAD I INFPTR /GET NEXT CD INPUT FILE ENTRY SNA /ANY MORE? JMP EOFERR /NO - OUT OF INPUT JMS FETCHH /FETCH DEVICE HANDLER INHNDL, 0 /WILL HOLD RETURN ADDR JMS PUTUSR /RESTORE CORE TAD I INFPTR AND (7760 /GET LENGTH PART OF WORD SZA /LENGTH OF 0 MEANS LENGTH >=256 TAD (17 /ADD HIGH-ORDER BITS CLL CML RTR RTR DCA INKTR /STORE LENGTH OF FILE ISZ INFPTR TAD I INFPTR DCA INREC /STORE STARTING RECORD NUMBER OF FILE ISZ INFPTR DCA INEOF /ZERO END-OF-FILE FLAG JMP INGBUF /GO READ INKTR=IOPEN INFPTR, 7617 /INPUT FILE POINTER INEOF, 0 /INPUT END-OF-FILE INDICATOR PAGE / OOPEN: SET UP OUTPUT FILE OOPEN, 0 CLA IAC TAD OFILE2 DCA OFNMC /POINTS TO OUTPUT FILE NAME TAD OFILE2 DCA OOFILE /POINTS TO DEVICE NO. OF OUTPUT SPECS TAD OFNMC DCA OUBLK TAD (OUDEVH+1 DCA OUHNDL CDF 10 TAD I OOFILE /GET DEV NUM WORD OF OUTPUT FILE ENTRY AND (17 /STRIP OFF ANY LENGTH INFO SNA /IS THERE AN OUTPUT DEVICE? JMP ONOFIL /NO - INHIBIT OUTPUT JMS FETCHH /FETCH DEVICE HANDLER OUHNDL, 0 /OUTPUT DEVICE HANDLER ENTRY OUENTR, TAD I OOFILE JMS I (200 3 /ENTER OUTPUT FILE OUBLK, 0 /REPLACED WITH STARTING BLOCK OUELEN, 0 /REPLACED WITH LENGTH OF HOLE JMP OEFAIL /FAILED - MAYBE WE ASKED TOO MUCH DCA OUCCNT DCA I (OUTINH /ZERO OUTPUT INHIBIT FLAG JMS I (OUSETP ISZ OOPEN OORETN, JMP I OOPEN OEFAIL, TAD I OOFILE AND (7760 /GET REQUESTED LENGTH SNA CLA /WAS IT AN INDEFINITE REQUEST JMP ONTERR /YES - CANNOT ENTER THE FILE TAD I OOFILE AND (17 /MAKE THE REQUESTED LENGTH ZERO DCA I OOFILE JMP OUENTR /TRY, TRY AGAIN ONTERR, CLA CLL CML RAR JMP OORETN /TAKE THE ERROR RETURN WITH AC<0 ONOFIL, ISZ I (OUTINH JMP OORETN /TAKE THE ERROR RETURN WITH AC=0 OOFILE, 0 / OUTPUT A BUFFER LOAD OUTDMP, 0 DCA OUCTLW /STORE THE CONTROL WORD TAD I (OUTINH SZA CLA JMP OUNOWR TAD OUCCNT SNA ISZ OUCTLW TAD OUBLK DCA OUREC /COMPUTE START BN OF THIS TRANSFER TAD OUCTLW CLL RTL RTL RTL AND (17 /COMPUTE THE NUMBER OF RECORDS TAD OUCCNT /UPDATE NUMBER OF BLOCKS IN THE FILE DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN SNL SZA CLA /DOES LENGTH EXCEED GIVEN LENGTH JMP I OUTDMP /YES - SIGNAL OUTPUT ERROR CIF 00 /HANDLERS IN FIELD 0 JMS I OUHNDL OUCTLW, 0 OUBUF OUREC, 0 JMP OUERRX /OUTPUT HANDLER ERROR OUNOWR, ISZ OUTDMP /BUMP OUTDMP TO NORMAL RETURN OUERRX, JMP I OUTDMP /.+1 IF ERROR RTN / OCLOSE: CLOSE THE OUTPUT FILE / RETURN TO .+1 IF ERROR / RETURN TO .+2 IF A.O.K. OCLOSE, 0 TAD I (OUTINH SZA CLA /IS OUTPUT INHIBITED? JMP OCISZ /YES - CLOSE IS A NOP JMS I (OTYPE AND (770 TAD (-PTP /CHECK FOR PAPER TAPE PUNCH OUTPUT SZA CLA /AND SKIP ^Z OUTPUT IF TRUE TAD EOFCHR /OUTPUT A ^Z JMS I (OCHAR JMP OCRET JMS I (OCHAR JMP OCRET FILLLP, JMS I (OCHAR JMP OCRET JMS I (OTYPE /GET TYPE OF OUTPUT DEVICE SPA CLA TAD (100 /IF ITS A DIRECTORY DEV FORCE A RECORD TAD (77 /BOUNDARY - OTHERWISE A HALF-RECORD AND I (OUDWCT SZA CLA /UP TO THE BOUNDARY YET? JMP FILLLP /NO - FILL WITH ZEROS TAD I (OUDWCT /GET DOUBLEWORD COUNT LEFT TAD (OUCTL&3700 SNA /A FULL WRITE LEFT? JMP NODUMP /YES, DON'T DO IT; THE ^Z IS ALREADY OUT TAD (4000+OUFLD /PUT IN THE FIELD BITS AND THE WRITE BIT JMS OUTDMP JMP OCRET /AN ERROR OCCURRED WHILE DUMPING BUFFER NODUMP, NOP /CATCHES SOME PORNO FOR FORCED DMP TAD I OOFILE /GET THE DEVICE NUMBER JMS I (7700 /JUST A ONE-SHOT 4 /CLOSE THE OUTPUT FILE OFNMC, 0 /POINTER TO THE OUTPUT FILE NAME OUCCNT, 0 SKP /ERROR WHILE CLOSING THE FILE - BAD! OCISZ, ISZ OCLOSE OCRET, CDF CIF 10 /RESTORE CALLING FIELDS JMP I OCLOSE EOFCHR, "Z-100 PAGE OUSETP, 0 /ROUTINE TO INITIALIZE CHAR POINTERS TAD (OUCTL&3700 /GET SIZE OF BUFFER IN DOUBLEWORDS CIA /NEGATE IT (PAL10 BLOWS) DCA OUDWCT TAD (OUBUF DCA OUPTR /INITIALIZE WORD POINTER TAD OUJMPE DCA OUJMP /INITIALIZE THREE-WAY CHARACTER SWITCH JMP I OUSETP / OCHAR: OUTPUT A CHAR TO OUTPUT DEVICE / RETURN .+1 IF ERROR OR NO ROOM / RETURN TO .+2 IF CHAR WENT OUT O.K. OCHAR, 0 AND (377 DCA OUTEMP RDF TAD (CDF CIF 0 DCA OUCRET TAD OUTINH SZA CLA /IS THERE AN OUTPUT FILE? JMP OUCOMN /NO - EXIT OUCHAR, CDF OUFLD /SET DATA FIELD TO BUFFER'S FIELD ISZ OUJMP /BUMP THE CHARACTER SWITCH OUJMP, HLT /THREE WAY CHARACTER SWITCH JMP OCHAR1 JMP OCHAR2 OCHAR3, TAD OUTEMP CLL RTL RTL AND (7400 TAD I OUPOLD DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH /ORDER 4 BITS OF THIRD CHAR TAD OUTEMP CLL RTR RTR RAR AND (7400 TAD I OUPTR DCA I OUPTR /UPDATE 2ND WORD FROM LOW ORDER 4 BITS TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUMP DOUBLEWORD COUNTER EVERY 3 CHARS JMP OUCOMN TAD (OUCTL /LOAD CONTROL WORD FOR A FULL WRITE JMS I (OUTDMP /DUMP THE BUFFER JMP OUCRET /OUTPUT ERROR - GIVE ERROR RETURN JMS OUSETP /RE-INITIALIZE THE POINTERS JMP OUCOMN OCHAR2, TAD OUPTR DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO ISZ OUPTR /BUMP WORD POINTER TO 2ND WORD OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, ISZ OCHAR OUCRET, HLT /RESTORE CALLING FIELDS JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OUTINH, 0 / OTYPE: GET DEVICE TYPE OF OUTPUT DEVICE OTYPE, 0 RDF TAD (CDF CIF 0 DCA OTRTN CDF 10 TAD I (7600 AND (17 TAD (DCB-1 DCA OUTEMP TAD I OUTEMP OTRTN, HLT JMP I OTYPE / GET USR INTO CORE GETUSR, 0 TAD USRSTAT /IS USR ALREADY IN CORE? SNA CLA JMP I GETUSR /YES, JUST RETURN JMS I (7700 /NO, GET USR INTO CORE 10 DCA USRSTAT /USR NOW IN CORE JMP I GETUSR USRSTAT, 7777 /7777 NOT IN CORE; 0 IN CORE / PUT USR BACK OUT OF CORE FETCHD, /FETCH HANDLER DEVICE NUMBER PUTUSR, 0 /SAVES A LOC ON PAGE TAD USRSTAT /IS USR ALREADY OUT? SZA CLA JMP I PUTUSR /YES, JUST RETURN JMS I (200 /NO, PUT USR AWAY 11 STA DCA USRSTAT /NOW USR IS NOT IN CORE JMP I PUTUSR / FETCH DEVICE HANDLER FETCHH, 0 DCA FETCHD /SAVE DEVICE NUM TO FETCH JMS GETUSR /MAKE SURE USR IS IN CORE TAD I FETCHH /GET LOC TO LOAD HANDLER DCA FETCHA TAD FETCHD /GET DEVICE TO LOAD JMS I (200 1 /FETCH DEVICE HANDLER FETCHA, 0 /HANDLER ADDR GOES HERE HLT /HUH!! TAD FETCHA DCA I FETCHH /SAVE FOR ROUTINE TO USE ISZ FETCHH JMP I FETCHH /RETURN PAGE / PUT AS USER SEES IT XXPUT, 0 AND (377) /JUST WANT ASCII CHAR DCA XXPUTC /SAVE OUTPUT CHAR RDF TAD (CDF CIF) DCA XXPUTR /SAVE CALLING FIELDS CDF 10 /WE'RE IN FIELD 1 TAD XXPUTC JMS I (OCHAR /OUTPUT THE CHAR JMP XXPUTE /ERROR ON OUTPUT TAD XXPUTC TAD (-214 /SPECIAL CHAR CHECKING SNA JMP XXPFF /FORM FEED IAC /213 SNA JMP XXPVT /VERTICAL TAB TAD (213-211 SNA CLA JMP XXPHT /HORIZONTAL TAB XXPUTR, HLT /RESET USER FIELDS JMP I XXPUT /RETURN O.K. XXPFF, TAD (11-5 /FORM FEED, OUTPUT 9ZROS XXPVT, TAD (5-2 /VERTICAL TAB, OUTPUT 5 RUBOUTS XXPHT, TAD (2 /HORIZONTAL TAB, OUTPUT 2 RUBOUTS CIA JMS XXRUB /OUTPUT RUBOUTS OR ZEROES JMP XXPUTR XXPUTC, 0 /SAVE CHAR HERE / SUBROUTINE TO DUMP THE CURRENT BUFFER OUT / OUTPUT DEVICE SHOULD BE NON-DIRECTORY IF THIS ROUTINE USED PORNO=OCRET&177+5200 XXDUMP, 0 /ROUTINE TO FORCE BUFFER OUT CLA /WITHOUT CLOSING FILE RDF TAD (CDF CIF 0 DCA XXDMPR CDF 10 TAD (PORNO /SET UP TO NOT CLOSE DCA NODUMP /REPLACES OUR NOP DCA EOFCHR /DON'T SEND ^Z JMS OCLOSE /DOES EVERYTHING ELSE BUT TAD (NOP /RESTORE PORNO LOC DCA NODUMP TAD ("Z-100 /RESTORE ^Z DCA EOFCHR JMS OUSETP /START OVER AT BEGINNING XXDMPR, HLT /IF DIRECTORY DEV. HE'S CRAZY ANYWAY JMP I XXDUMP /GO ON BACK CHKHND, 0 /CHECK IF NEW HANDLER IS NEEDED. CDF 0 /LOCS IN FLD 0 TO RESET DCA I (INPAGE) /WE ARE GETTING A NEW FILE DCA I (INLINE) CDF 10 TAD INFPTR /WE NEED THE POINTER DCA CHKPTR /GET IT HERE TAD I CHKPTR /NEXT FILE SNA /NO MORE FILES? JMP EOFERR AND (17 /JUST THE HANDLER CIA /TO COMPARE TAD OLDHND SNA CLA /IF ZERO, NO CHANGE JMP INHNDL+2 /JUST GET NEW BLK NUM TAD I CHKPTR /GET NEW HANDLER AND (17 /JUST THE HANDLER DCA OLDHND /AND SAVE FOR NEXT TIME TAD (INDEVH+1 /GET HIS HANDLER ADDR. JMP I CHKHND /GO ON BACK OLDHND, 0 CHKPTR, 0 / GET ROUTINE AS USER SEES IT XXGET, 0 CLA RDF TAD (CDF CIF) DCA XXGETR /SAVE FIELD FRO M WHENCE WE WERE CALLLED CDF 10 /WE'RE IN FIELD 1 XXGET1, JMS I (ICHAR) JMP XXGETX /ERROR RETURN DCA SELTMP TAD SELFLG /ARE WE IN SELECT MODE? SKIPNO JMP SELECT /YES, CHECK CHAR XXGGOO, TAD SELTMP /NO, OR WE HAVE COME BACK AND (177) /STRIP TO 7 BIT ASCII SZA TAD (-177) SNA JMP XXGET1 /IGNORE NULL AND RUBOUT TAD (377) /GENERATE 8-BIT ASCII CHAR XXGETR, HLT /CHANGE FIELDS BACK TO USER JMP I XXGET /O.K., RETURN WITH CHAR IN AC XXGETX, SMA CLA /FINAL END-OF-FILE? JMP EOFGO /YES, GO TO USER EXIT ROUTINE XXGETE, JMS ERRPRT /NO, IS HARDWARE ERROR TEXT \IE\ *.-1 HLTINS, HLT /DIAGNOSTIC HALT FROM FIELD 0 WILD CODE /IT CANNOT HAPPEN PAGE /JUMP TARGETS FOR HEADER WORDS HEADJ, HSTYLE HSTYLE HSTYLE HSTYLE HPOSIT HPOSIT HPOSIT HPOSIT HPLACE HPLACI HBASE HBASI HSPLIT HNSPLT / PUT OR CLOSE ERROR ROUTINE XXCLSE, XXPUTE, JMS ERRPRT TEXT \OE\ *.-1 / END-OF-FILE ROUTINE EOFGO, CDF CIF 00 JMP I .+1 /THEN EXECUTE E-O-F PROCEDURE EOFLOC, EOFILE /INITIALIZED FOR FIRST TIME / OUTPUT NO. OF RUBOUTS OR NULLS IN AC / UNLESS OUTPUT IS TO A DIRECTORY DEVICE XXRUB, 0 DCA XXXTMP /SAVE COUNT JMS I (OTYPE /GET TYPE OF OUTPUT DEV SPA CLA JMP I XXRUB /DIRECTORY DEVICE - DON'T BOTHER XXRUBL, TAD XXPUTC /GET THE CHAR TAD (-214) SNA CLA /IS THE CTRL CHAR A FORM-FEED? IAC /YES - OUTPUT BLANK TAPE INSTEAD TAD (377 /OTHERWISE, OUTPUT RUBOUTS JMS I (OCHAR /OUTPUT THEM JMP XXPUTE /ERROR RETURN ISZ XXXTMP JMP XXRUBL /LOOP FOR THE REQUIRED COUNT JMP I XXRUB XXXTMP, 0 /USED AS COUNTER AND POINTER XXXTTY, 0 TLS TSF JMP .-1 XXXCLA, 7600 /LOC TO RETURN TO PS/8 SYSTEM JMP I XXXTTY /NOT DEVICE INDEPENDENT - TOUGH BLEEP /SELECTION CODE - WE TRAP ALL CHARS EXCEPT THOSE PASSED BY CERTAIN /SWITCH CHARACTERS SELFLG, NO /NOT NOW ANYWAY SELSTP, SELST1 /SELECT STRING POINTER SELPBK, SELST1 SELTNG, 0 /FLAG FOR CURRENT LINE SELBLK, 0 /FLAG FOR BLOCK SELECT SELTMP, 0 /HOLD THE CHAR FOR ROUTINE SELST1, -"/; -"&; "&-"+; "+-"- SELST2, -"!; -"&; "&-"+; "+-"- SELGO, JMS ICHAR /GET NEXT CHAR JMP XXGETX /WHAT KIND OF ERROR? DCA SELTMP /SAVE IT FOR NOW SELECT, TAD SELPBK /RESTORE SELECT STRING POINTER DCA SELSTP /NORMAL ENTRY FROM XXGET TAD SELTNG /ARE WE SELECTING NOW? SKIPNO JMP SELEOL /YES, SHOULD WE CONTINUE? TAD I SELSTP /NO, SHOULD WE START? TAD SELTMP /LOOK AT CHAR SZA CLA JMP SELGO /NO, LOOP A WHILE JMS ICHAR /MAYBE, LOOK AT NEXT CHAR JMP XXGETX DCA SELTMP ISZ SELSTP /BUMP POINTER TAD I SELSTP /IS IT & SNA JMP SELNOW /YES, SELECT THIS LINE ISZ SELSTP /NO, CHECK BLOCK SELECT CHAR TAD I SELSTP SNA JMP SELBON /YES, SELECT BLOCK ON ISZ SELSTP TAD I SELSTP /NO, MAYBE TURN IT OFF SNA CLA JMP SELBOF /YES, TURN IT OFF AFTER THIS LINE TAD SELBLK /IS SELECT BLOCK ON NOW? SKIPYES JMP SELGO /NO, IGNORE THIS STUFF SELON, DCA SELTNG /YES, START SELECTING JMP XXGGOO /RETURN WITH THIS CHAR SELBOF, TAD SELBLK /IF IT IS ON, TURN IT OFF SKIPYES JMP SELGO /IT IS NOT ON STA /TURN OFF SELBLK SELBON, DCA SELBLK /TURN ON SELBLK SELNOW, JMS ICHAR /GET NEXT CHAR JMP XXGETX /CHECK THE ERROR DCA SELTMP JMP SELON /DO OTHER STUFF AND RETURN SELEOL, TAD SELTMP /IS IT AN EOL CHAR? TAD (-214 /IS IT FF? SZA IAC SZA /IS IT VT IAC /MAYBE LF SNA CLA /IF NOT ONE KEEP SELECTING STA /IT YES, TURN IT OFF JMP SELON /DO WHICH PAGE RNOCHN, TAD CHAINB /ARE WE ON SYS? SNA CLA JMP .+6 /NO, RETURN TO MONITOR CDF 10 JMS GETUSR /GET THE USR IN CORE JMS I (200 /NOW, GET US 6 /CHAIN CHAINB, 0 /GETS RUNOFF BLOCK CDF CIF 00 CLA JMP I (7605 XZPUT, 0 /OUTPUT TO FILE OR LOG DEVICE OR BOTH DCA XZTEMP /SAVE CHAR TAD LFLAG /OUTPUT TO TTY? SNA CLA /NON ZERO IF YES JMP XZPT1 /NO, JUST OUTFILE TAD XZTEMP /GET CHAR BACK JMS XXXTTY /PRINT IT TAD KFLAG /ONLY ON TTY? SZA CLA JMP I XZPUT /YES, NO ERRORS TO FILE XZPT1, TAD XZTEMP /GET IT FOR THE FILE JMS XXPUT JMP I XZPUT /TAKE CARE OF CHAR XZTEMP, 0 LFLAG, 0 KFLAG, 0 ERRPTR, 0 ERRSTR, 0 /PRINT ERR STRING DCA ERRPTR /SAVE POINTER ERRSLP, TAD I ERRPTR /GET FIRST DOUBLET RTR;RTR;RTR /GET IT DOWN JMS ERRSTP /PUT CHAR TAD I ERRPTR JMS ERRSTP ISZ ERRPTR JMP ERRSLP ERRSTP, 0 AND (77) /STRIP TO 6 SNA /IS IT THE END JMP I ERRSTR /RETURN TAD (" ) /ADD 240 AND (77) /BACK TO 6 TAD (" ) /SEEMS LIKE MAGIC JMS XZPUT JMP I ERRSTP SUMMSG, TEXT \TOTAL ERRORS.\ /COME HERE FROM FIELD 0 EOF CHECKING EOFCK1, ISZ NCOPY /ANY MORE COPIES? SKP JMP EOFIL3 /NO CDF 10 TAD NCOPY /HOW MANY COPIES LEFT CIA /MAKE IT POSITIVE JMS ERBASC /PRINT IT FOR DICK JMS I (IOPEN) /OPEN INPUT FILES AGAIN CDF CIF 00 DCA TOPSW CLA IAC /INIT PAGE NUMBER JMP PRTGO EOFIL3, CDF 10 JMS I (ERRSUM) /PRINT SUMMARY JMS I (OCLOSE) /CLOSE CURRENT OUTPUT FILE JMP XXCLSE /CLOSE ERROR TAD I (7642) /CD ENDED WITH CR OR ALTMODE? SMA CLA JMP RNOCHN /CHAIN CODE IN FIELD 1 JMP CHAINB+1 /RETURN TO MONITOR NCOPY, 0 ERBASC, 0 /OUTPUT NUMBER TO ERROR ROUTINE DCA BINNUM /SAVE THE NUMBER TAD (". /PRINT THE SEPARATOR JMS XZPUT /PUT IT WHEREVER JMS BINCHR /GET THE ASCII DIGIT SNA /NULL ENDS IT JMP I ERBASC /DONE, RETURN JMS XZPUT /PUT IT WHEREVER ALSO JMP .-4 /AND LOOP UNTIL DONE PAGEL, "P+40; "A+40; "G+40; "E+40; " +400; 0 PAGEU, "P;"A;"G;"E;" +400;0 PAGEM, "P; "A+40; "G+40; "E+40;" +400;0 TABSJS, TABREL TABABS TABSTP TABQOT PAGJMP, PAGTOP PAGBOT PAPERJ, PAGSIZE PEVEN PODD PAGE ERRPRT, 0 /ROUTINE FOR FATAL IOPACK ERRORS CDF 10 /ARGS UP HERE TAD I ERRPRT DCA ERRPRC /SAVE THE CHARS IAC DCA KFLAG /ONLY LOG THESE FATAL ERRORS IAC /ON THE TTY DCA LFLAG CIF 0 /FATAL ERROR ROUTINE IN FLD 0 JMS ERRFX /IT WILL NOT RETURN ERRPRC, 0 /GETS THE ERROR CODE ERROUT, 0 TAD I ERROUT DCA ERRCHR CDF 10 JMS CROUT TAD (ERHEAD JMS ERRSTR /PRINT ERROR INCLUDING SPECIFIC TAD INFPTR /GET THE FILE NUMBER TAD K321 /MAGIC CONVERTER CLL RAR JMS XZPUT /PRINT THE FILE NUMBER CDF 00 /ARGS IN FLD 0 TAD I (INPAGE) /INPUT FILE PAGE CDF 10 JMS ERBASC /PRINT THE NUMBER CDF 00 TAD I (INLINE) /GET THE LINE CDF 10 JMS ERBASC /AND OUTPUT THAT NUMBER TOO JMS CROUT /ON ITS OWN LINE INC ERRCTR /ANOTHER ERROR WE HAVE ENCOUNTERED K321, 321 /MAGIC NUMBER IS A NOP STA DCA NCOPY /JUST THIS COPY BINCIF, CDF CIF 0 INC ERROUT /SKIP THE CHARS JMP I ERROUT /AND RETURN ERRSUM, 0 /PRINT ERROR SUMMARY TAD ERRCTR SNA CLA /ANY ERRORS? JMP ERSRTN /NO, FORGET IT JMS CROUT /FRESH LINE TAD (SUMMSG /GET OUR MESSAGE JMS ERRSTR /PRINT THE STRING TAD ERRCTR /GET THE COUNT AGAIN JMS ERBASC /AND PRINT THEM JMS CROUT ERSRTN, JMP I ERRSUM CROUT, 0 TAD (215 JMS XZPUT TAD (212 JMS XZPUT JMP I CROUT ERRCTR, 0 ERRCHR=.+3 / XX IS ERRCHR ERHEAD, TEXT \??RNO.XX.\ / SUBROUTINE TO CONVERT NUMBER IN ACC TO DECIMAL ASCII CHARACTERS / LEADING ZEROES ARE IGNORED /ROUTINE IS CALLABLE FROM ANY FIELD /RETURNS WITH NULL WHEN NUMBER IS EXHAUSTED BINCHP, 0 BINCHC, 0 BINCHD, 0 BINCHR, 0 RDF /WHERE IS HE? TAD BINCIF /MAKE CIF INSTRUCTION DCA BINRIF /FOR RETURN CDF 10 /UP HERE NOW JMP I BINCHO /TO APPROPRIATE PLACE BINCHO, BINCH1 /INIT TO START BINRIF, HLT /CDF CIF FOR RETURN VECTOR JMP I BINCHR /RETURN TO CALLER JMS BINCHO /RESET POINT BINCH1, TAD (DTABL /SET UP POINTERS DCA BINCHP CLL STA RTL /AND COUNTERS DCA BINCHC BINCH0, DCA BINCHD /INIT DIGIT EACH TIME JMP .+3 /DON'T COUNT FIRST TRY BINCH2, DCA BINNUM /SAVE NEW NUMBER INC BINCHD /AND COUNT DIVIDE CLL /WE GO UP TO 4095 TAD BINNUM /GET OUT INPUT NUMBER TAD I BINCHP /SUBTRACT CURRENT POWER OF 10 SZL /DID IT OVERFLOW? JMP BINCH2 /NO, DO IT AGAIN CLA INC BINCHP /NEXT POWER OF 10 TAD BINCHD /GET THE COUNT SNA /DID IT GO AT ALL? JMP BINCH3 /NO, IGNORE LEADING 0 TAD ("0 /MAKE IT AN ASCII DIGIT AND (377 /MAYBE STRIP OFF FLAG BIT JMS BINCHO /SEND HIM THIS ONE STL CLA RAR /SET FLAG FOR 0 BINCH3, ISZ BINCHC /ARE WE DONE? JMP BINCH0 /NO, NEXT DIGIT TAD BINNUM /YES, OUTPUT LAST DIGIT TAD ("0 /MAKE IT A DIGIT AND (377 /NO VERY GOOD REASON JMS BINCHO /OUTPUT THE LAST ONE CLA JMP BINCH1-1 /SEND NULL AND RESET THIS BINNUM, 0 DECIMAL DTABL, -1000 -100 -10 OCTAL PAGE / MAJOR INITIALIZATION ROUTINE INIT, 0 JMS PUTUSR /WE WILL DIDDLE USR LOCS TAD (ZEROS-1) /FIRST CLEAR THE ZEROABLE VARIABLES DCA AUTOX1 TAD (ZEROS-ZEROEND) DCA COUNT CDF 0 /TARGETS IN FLD 0 DCA I AUTOX1 ISZ COUNT JMP .-3 TAD (OTHERS-1) /THEN INITIALIZE SPECIALIZED VARIABLES DCA AUTOX1 TAD (INITS-1) DCA AUTOX2 TAD (OTHERS-OTHEREND) DCA COUNT CDF 10 /LIST IN THIS FIELD TAD I AUTOX2 CDF 0 /TARGETS IN FIELD 0 DCA I AUTOX1 ISZ COUNT JMP .-5 TAD (CMDFLAGS-1) /INIT THE FLAGS DCA AUTOX1 TAD (FLGBKU) /AND THEIR BACKUPS DCA PTR1 TAD (CMDFLAGS-FLGEND) /RANGE OF FLAGS DCA COUNT INITXX, CDF 10 /INITIAL VALUES UP HERE TAD I AUTOX2 /CONTINUING FROM OTHER INITS CDF 0 DCA I PTR1 /SAVE THE BACKUP TAD I PTR1 /AND GET IT BACK FOR ACTIVE DCA I AUTOX1 INC PTR1 /INC THE POINTER ISZ COUNT /CHECK THE COUNT JMP INITXX TAD (TABS) DCA PTR1 /PREPARE TO INITIALIZE TAB TABLE TAD (-40) /32 TABS IN TABLE DCA CTR1 CLA IAC /1 IS INITIAL TAB SETTING INIT3, DCA I PTR1 TAD (10) /AND EVERY 8 THEREAFTER TAD I PTR1 INC PTR1 ISZ CTR1 /ALL TABS IN? JMP INIT3 CLA CLL /YES DCA I PTR1 /0 TO END THE TABLE CDF 10 /NOW INIT THE INTERNAL BUFFERS DCA I (TITLEB) DCA I (SBTTLB) DCA I (CHBUFF) DCA I (EVBUFF) DCA I (ODBUFF) CDF CIF 0 /BACK TO FIELD 0 STA /CAPITALIZE FIRST CHAR DCA I (SVECAP) /NEEDED FOR RESET COMMAND JMP I INIT /THEN RETURN INITS, FNBUFF /FNPTR 0 /SUBPGN IPWIDE, 120 /PWIDTH 0 /COPYWD IPLONG, 102 /PLENGTH STACK /STKPTR -1 /PARAGV 2 /PARAGP ITABCH, 640 /TABCHR 0005 /HWORD 1;2 /TOP 3;2 /BOTTOM NO /TFIRSW ISWPAR, NO /SWPARA YES /SWHEAD ISWPAG, YES /SWPAGE NO /SWSBPG ICCSW, NO /SWCC YES /SWCAP YES /SWPER YES /SWPNUM 7777 /UNCASE 7777 /CQCASE 1 /ALMARG /THE INITIAL VALUES OF THE FOOTNOTE PRESERVATION GROUP 1 /LMARG 106 /RMARG - MARGIN GROUP YES /SWJUST YES /SWFILL - NOTE LIST GROUP ILSPAC, -1 /LSPACE 5 /PARAGN IMODE, 7777 /MODE 7777 /UNMODE 7777 /CFMODE 7777 /HFILL /THE FLAGS ARE HANDLED SEPARATELY, BUT FOLLOW AFTER THE OTHERS /DO NOT SEPARATE YES /CTFLAG YES /EFFLAG YES /SPFLAG YES /QUFLAG NO /CQFLAG NO /HYPFLG NO /SUBFLG NO /NDXFLG YES /UCFLAG YES /UNFLAG NO /CFFLAG YES /LCFLAG PAGE CENTW, TEXT "WIDTH" TEXT "MARGINS" 0 CENTJ, CWDTH CMARG / THE JUMP LIST FOR THE LEGAL COMMANDS CMDJ, AUTCAP / "AC" AUTOP / "AP" AUTCAP / "AUTOCAPITALIZE" AUTOP / "AUTOPARAGRAPH" BLANK / "B" BLANK / "BLANK" BREAKC / "BR" BREAKC / "BREAK" CENTC / "C" CHARCC / "CC" CENTC / "CENTER" CENTC / "CENTRE" CHAPTER / "CHAPTER" CMARG / "CM" CMDCOM / "COMMENT" CCHARS / "CONTROL" CWDTH / "CW" CDOWN / "DOWN" ENNOTE / "ELS" END / "END" ESUBPG / "ES" EVEN / "EVEN" FILLC / "F" FIGDEF / "FD" FIGURE / "FG" FIGURE / "FIGURE" FILLC / "FILL" FSTTL / "FIRST" FLAGC / "FLAGS" FNOTE / "FN" FNOTE / "FOOTNOTE" FSTTL1 / "FT" HEADER / "HEADER" HEADER / "HD" INDENT / "I" NYIMPL / "IF" IFCOND INDENT / "INDENT" NYIMPL / "INDEX" JUST / "JUSTIFY" LEFT / "L" LCASE / "LC" LEFT / "LEFT" LSDO / "LIST" NYIMPL / "LITERAL" LMARGC / "LM" LOWER / "LOWER" LSDO / "LS" MARGNS / "MARGINS" NAUTOC / "NAC" NAUTOP / "NAP" NOCCHR / "NCC" NOFILL / "NF" NOFLGC / "NFL" NOHEAD / "NHD" NOJUST / "NJ" NUMCMD / "NM" NONUM / "NNM" NOTEDO / "NOTE" NOPAGE / "NPA" NOPER / "NPR" NYIMPL / "NSL" NOTEDO / "NT" NTBQOT / "NTQ" NOTABS / "NTS" NOTABS NUMCMD / "NUMBER" ODD / "ODD" COVER / "OVER" PARAGRAPH / "P" PAGING / "PA" PAGEC / "PAGE" PAGING / "PAGING" PAGEC / "PAPER" PARAGRAPH / "PARAGRAPH" PAGBOT /"PB" PERIOD / "PERIOD" PAGEC / "PG" PERIOD / "PR" NYIMPL / "PRINT" INDEX PAGSIZE / "PS" PAGTOP / "PT" RIGHT / "R" RESET / "RESET" REINITIALIZE RIGHT / "RIGHT" RMARGC / "RM" SKIP / "S" NYIMPL / "SD" SET DEFAULTS NYIMPL / "SELECTION" SKIP / "SKIP" NYIMPL / "SL" SPACING / "SPACING" SUBPG / "SPG" NYIMPL / "SUBINDEX" SUBPG / "SUBPAGE" SBTTLC / "ST" SBTTLC / "SUBTTL" SBTTLC / "SUBTITLE" TITLEC / "T" TABABS / "TA" TABSAR / "TABS" TESTPG / "TEST" TITLEC / "TITLE" TSTPG / "TP" TABQOT / "TQ" TABREL / "TR" TABGET / "TS" UCASE / "UC" UPPER / "UPPER" NYIMPL / "X" SUBINDEX / THE COMMANDS THAT ARE CURRENTLY RECOGNIZED IN THIS VERSION CMDS, TEXT "AC" TEXT "AP" TEXT "AUTOCAPITALIZE" TEXT "AUTOPARAGRAPH" TEXT "B" TEXT "BLANK" TEXT "BR" TEXT "BREAK" TEXT "C" TEXT "CC" TEXT "CENTER" TEXT "CENTRE" TEXT "CHAPTER" TEXT "CM" TEXT "COMMENT" TEXT "CONTROL" TEXT "CW" TEXT "DOWN" TEXT "ELS" TEXT "END" TEXT "ES" TEXT "EVEN" TEXT "F" TEXT "FD" TEXT "FG" TEXT "FIGURE" TEXT "FILL" TEXT "FIRST" TEXT "FLAGS" TEXT "FN" TEXT "FOOTNOTE" TEXT "FT" TEXT "HEADER" TEXT "HD" TEXT "I" TEXT "IF" TEXT "INDENT" NDXWRD, TEXT "INDEX" TEXT "JUSTIFY" TEXT "L" TEXT "LC" TEXT "LEFT" TEXT "LIST" TEXT "LITERAL" TEXT "LM" TEXT "LOWER" TEXT "LS" MARGWD, TEXT "MARGINS" TEXT "NAC" TEXT "NAP" TEXT "NCC" TEXT "NF" TEXT "NFL" TEXT "NHD" TEXT "NJ" TEXT "NM" TEXT "NNM" TEXT "NOTE" TEXT "NPA" TEXT "NPR" TEXT "NSL" TEXT "NT" TEXT "NTQ" TEXT "NTS" TEXT "NUMBER" TEXT "ODD" TEXT "OVER" TEXT "P" TEXT "PA" TSTPGL, TEXT "PAGE" TEXT "PAGING" TEXT "PAPER" TEXT "PARAGRAPH" TEXT "PB" TEXT "PERIOD" TEXT "PG" TEXT "PR" TEXT "PRINT" TEXT "PS" TEXT "PT" TEXT "R" TEXT "RESET" TEXT "RIGHT" TEXT "RM" TEXT "S" TEXT "SD" TEXT "SELECT" TEXT "SKIP" TEXT "SL" TEXT "SPACING" TEXT "SPG" TEXT "SUBINDEX" TEXT "SUBPAGE" TEXT "ST" TEXT "SUBTTL" TEXT "SUBTITLE" TEXT "T" TEXT "TA" TEXT "TABS" TEXT "TEST" TITWRD, TEXT "TITLE" TEXT "TP" TEXT "TQ" TEXT "TR" TEXT "TS" TEXT "UC" TEXT "UPPER" TEXT "X" 0 / FLAG WORDS FOR .FLAG COMMANDS FLGWDS, TEXT "ALL" TEXT "CONTROL" TEXT "ENDFOOTNOTE" TEXT "SPACE" TEXT "QUOTE" TEXT "CAPITALIZE" TEXT "HYPHEN" TEXT "SUBINDEX" TEXT "INDEX" TEXT "UPPERCASE" TEXT "UNDERLINE" TEXT "FIRSTCAPITALIZE" TEXT "LOWERCASE" 0 /JUMP TARGETS FOR .END EXTENSIONS ENDWJ, ESUBPG ENNOTE ENNOTE /END LIST = END NOTE NYIMPL /NO LITERAL BLOCKS NYIMPL /NO CONDITIONALS NYIMPL /NO END FOOTNOTE NYIMPL /NO END BLOCK NYIMPL /NO END MACRO /SECOND WORD FOR .END COMMAND ENDWORD, TEXT "SUBPAGE" TEXT "NOTE" TEXT "LIST" TEXT "LITERAL" TEXT "IF" TEXT "FOOTNOTE" TEXT "BLOCK" TEXT "MACRO" 0 / SECOND WORD FOR .TABS COMMANDS TABSLJ, TEXT "RELATIVE" TEXT "ABSOLUTE" TEXT "STOPS" TEXT "QUOTE" 0 / COMMAND WORDS FOR .HEADER COMMAND HEADWD, TEXT "NUMBER" TEXT "UPPER" TEXT "LOWER" TEXT "MIXED" TEXT "LEFT" TEXT "RIGHT" TEXT "CENTER" TEXT "ALTER" TEXT "TOP" TEXT "BOTTOM" TEXT "ARABIC" TEXT "ROMAN" TEXT "SPLIT" TEXT "SOLID" 0 FIGWD, TEXT "DEFERRED" CASEWD, TEXT "CASE" CCHRS, TEXT "CHARACTERS" / ARGUMENTS FOR "PAGE" COMMAND PAGCMD, TEXT "TOP" TEXT "BOTTOM" PAPERL, TEXT "SIZE" TEXT "EVEN" TEXT "ODD" 0 DOT=. CHLENGTH=20 /LENGTH OF CHAPTER BUFFER STLENGTH=100 /LENGTH OF SUB-TITLE BUFFER TLENGTH=100 /LENGTH OF TITLE BUFFER SBTTLB=DOT; DOT=DOT+STLENGTH+1 /SUBTITLE BUFFER TITLEB=DOT; DOT=DOT+TLENGTH+1 /TITLE BUFFER CHBUFF=DOT; DOT=DOT+CHLENGTH+1 /CHAPTER BUFFER EVBUFF=DOT; DOT=DOT+TLENGTH+1 /EVEN PAGE TITLE BUFFER ODBUFF=DOT; DOT=DOT+TLENGTH+1 /ODD PAGE TITLE BUFFER STKEND=DOT STACK=6577 /THE STACK FOR THIS PROGRAM IFNZRO STACK-STKEND-MAXWIDTH-30&4000 < SHSTCK, 0 /PROTECT THE STACK ZZZZ /US ON SHORT STACK > DOT=STACK+1 *DOT /OPTION CODE IN THE BUFFER AREA /OPTIONS FETCHING CODE /SLOPPY BUT WE NEED ROOM IN FIELD 0 /VALUES FOR ALTERNATE AND DEFAULT CHARS SPACINGS ETC KBSDIF, ALBSCH-BSCH /DEFINED AT BEGINNING KBSCH, BSCH /NORMAL BACKSPACE CHAR KLONGD, LONG2-LONG1 /DIFFERENCE IN ALTERNATE LENGTHS KLONG1, LONG1 /ALTERNATE LENGTH /SUBROUTINE TO STORE ACC IN FLD 0 LOCATION STOZRO, 0 DCA STOACC /SAVE ACC TAD I STOZRO /WHERE DO WE PUT IT DCA STOPTR /FOR PUTTING IT ISZ STOZRO /SKIP OVER ARG CDF 0 /IT GOES TO ZERO TAD STOACC /GET THE VALUE DCA I STOPTR /AND STORE IT CDF 10 /NOW BACK TO HERE JMP I STOZRO /AND RETURN STOACC, 0 STOPTR, 0 RNONAM, FILENAME RUNOFF.SV OPTION, 0 CLA IAC CDF 10 JMS I (7700 2 /LOOK UP RNOARG, RNONAM /OURSELVES FOR CHAINING 0 /WE DON'T REALLY CARE HOW LONG /BUT WE COULD CHECK TO PREVENT ERRORS SKP CLA /IF AN ERROR MAKE BLOCK 0 TAD RNOARG DCA CHAINB /WE WILL CHAIN TO HERE LATER /NOW GET THE OPTION SWITCHES TAD I (MPARAM) SMA CLA /A SWITCH IS SIGN - AUTOPARA STA /MAKE FLAG NO IF NOT SET DCA ISWPAR /SET UP FOR INIT AND RESET CLA STL RTR /AC2000 AND I (MPARAM /B FOR BACKSPACE CHAR SZA CLA /IS IT SET TAD KBSDIF /YES, SELECT ALTERNATE TAD KBSCH /NO, SELECT NORMAL JMS STOZRO /PUT IT IN FIELD 0 BSPCHR TAD I (MPARAM AND (1000 /C - INITIAL CASE UPPER SNA CLA /IS IT SET STA /MAKE MODE NO DCA IMODE /INITIALLY AND RESET TAD I (MPARAM AND (400 /D FOR DOWN SNA CLA /IS IT SET JMP .+10 /NO, GET NEXT TAD I (MPARAM-1 /YES, GET NUMERIC ARG RTR;RTR;RTR /MOVE IT DOWN AND (37 /ONLY DOWN JMS STOZRO /SAVE IN FIELD 0 KDOWN /E SWITCH IS CHECKED LAST TAD I (MPARAM AND (100) /LOOK FOR /F OPTION SZA CLA /DO WE DISABLE PAGING STA /YES DCA ISWPAG /OR MAYBE NO /G NOT USED TAD I (MPARAM /FOR FARLEY ALLOW OLD STYLE BREAK AND (20 SNA CLA /IS IT SET? TAD (2000+LSPACE /LOAD FAKE INSTR. TAD (NOP /YES, REPLACE WITH NOP JMS STOZRO BRKMOD /NOT CLEAN, BUT EFFECTIVE TAD I (MPARAM AND (10 /LOOK FOR I SNA CLA STA /NO, DON'T SEQUENCE JMS STOZRO /PUT IT IN FIELD 0 SEQFLG CLA CLL IAC RTL /AC0004 AND I (MPARAM /CHECK J SZA CLA TAD (" -"-) /BLANK OUT BREAK CHAR? TAD ("-) JMS STOZRO BRKCHR /WHICHEVER, PUT IT CLA IAC CLL RAL /ACC EQ 2 AND I (MPARAM) /IS K SET DCA KFLAG /IF SO FLAG IS NONZERO CLA IAC AND I (MPARAM /L LENGTH SZA CLA /IS IT SET TAD KLONGD /SELECT ALTERNATE LENGTH TAD KLONG1 /SELECT STANDARD DCA IPLONG /SET FOR INIT CLA STL RTR /AC2000 AND I (MPARAM+1 /N SWITCH DCA LFLAG /IF SET LFLAG NONZERO JMS OPTG2 /MORE OPTIONS NEXT PAGE CDF CIF 00 /DOWN TO FIELD 0 NOW JMP I OPTION PAGE KULCHD, ULCH2-ULCH1 KULCH1, ULCH1 KWIDD, WID2-WID1 KWID1, WID1 EXT12=6162 EXTPA=2001 INFEXT, EXTPA /STAR MODE LOOKUPS MAYBE LATER /THEY WILL STORE THE FIRST EXTENSION HERE MKPA, -EXTPA MKPA12, EXTPA-EXT12 OPTG2, 0 OPTEM, TAD I (MPARAM+1 /SINCE THIS IS ONCE ONLY CODE THIS IS OK AND (1000 /O SWITCH FOR OVER SNA CLA JMP OVERNO /NO OVER TAD I (MPARAM-1 /IN TOP HALF AND (77 /BOTTOM 6 BITS DCA OPTEM TAD OPTEM JMS STOZRO KOVERE /PUT IT IN FLD 0 TAD I (MPARAM+3 /SECOND OPTION NUMBER RTR;RTR;RTR AND (77 /IS THERE ANYTHING THERE? CIA /WE WANT THE DIFFERENCE SZA /OR 0 IF NO ARG TAD OPTEM /USE THE OTHER ONE CIA /WE WANT ODD - EVEN NOT EVEN - ODD JMS STOZRO KOVERO /THE OVER FOR ODD PAGES OVERNO, TAD (400) /LOOK FOR /P AND I (MPARAM+1) SNA CLA /IS IT SET? JMP NOPSWT TAD (" ) /GET A SPACE JMS STOZRO /STORE IT FOR THE BRKCHR /PAGE BREAK CHAR STA /MAKE FLAG NONZERO NOPSWT, JMS STOZRO /SET THE PAUSE FLAG PSWITC TAD I (MPARAM+1 AND (200 /Q UNDERLINE CHAR SZA CLA TAD KULCHD /SELECT 1ST CHAR TAD KULCH1 /OR SECOND JMS STOZRO ULCHR /R NOT USED TAD I (MPARAM+1 AND (40 /S SEL ALTERNATE SPACING SZA CLA /IS IT SET? STA /YES ACC=-1 TAD (-1 /OR JUST -1 DCA ILSPAC /FOR INITIAL LINE SPACING TAD I (MPARAM+1 AND (20 /T CHANGE TO NOTABS QUOTE SNA CLA /IS IT? TAD (400 /NO, SET THE QUOTE TAD (" ) /SET THE SPACE CHAR DCA ITABCH /FOR INIT TAD I (MPARAM+1 AND (10 /U CHANGE UNDERLINE MODE SZA CLA CLL STA RAR /AC3777 IAC /EITHER 1 OR 4000 JMS STOZRO /SAVE IT UNSWIT CLA CLL IAC RTL /AC0004 AND I (MPARAM+1 JMS STOZRO FSWITCH /SIMULATE FORM FEED SWITCH CLA CLL IAC RAL /AC0002 AND I (MPARAM+1 /W PAGE WIDTH ALTERNATE SZA CLA TAD KWIDD TAD KWID1 DCA IPWIDE /STORE FOR INIT CODE CLA IAC /AC0001 AND I (MPARAM+1 /X NO LOWER CASE TO OUTPUT JMS STOZRO USWITCH /UPPER CASE ONLY TAD MPARAM+2 SMA CLA STA /NO CONTROL CHARS DCA ICCSW /ALLOW CONTROL CHARS? CLA STL RTR /AC2000 AND I (MPARAM+2 /Z SELECT STRING SNA CLA /IS IT SET JMP NSLOPT /NO SELECT OPTION TAD INFEXT /GET FIRST INPUT FILE EXTENSION TAD MKPA /IS IT .PA SZA TAD MKPA12 /OR .12 SNA CLA TAD (SELST1-SELST2 TAD (SELST2 /IF NOT ASSUME !&+- DCA SELSTP /OTHERWISE /&+- DCA SELFLG /SET THE FLAG FOR SELECTION NSLOPT, JMP MOROPT /MORE OPTIONS ON NEXT PAGE OPEXIT, JMP I OPTG2 /RETURN NOW PAGE MOROPT, TAD I (MPARAM+1 /CHECK MULTI NOW SO WE CAN SET K AND L FLAGS SMA CLA /M IS SIGN BIT JMP MULFIX STA DCA KFLAG STA DCA LFLAG TAD I (NPARAM /GET THE NUMBER AND (377 /255 IS PLENTY SNA /AT LEAST 1 MULFIX, IAC /OR WE GET 4095 CIA /MAKE IT NEGATIVE DCA NCOPY TAD I (MPARAM AND (200 /E EXTENDED OPTION DECODING SZA CLA JMP EXTOPT /NEXT SIZE CORE CDF CIF 0 JMS GETCOR /THIS WILL RETURN SIZE IN HOWBIG STA CLL RAL /AC= -2 TAD HOWBIG SPA SNA CLA /JUST A LITTLE CHECK CODE FOR NOW JMP JSTONE /ONLY 8K TAD KCDF2 /12K OR MORE, FIX IT UP JMS STOZRO FNTFLD+1 /FIX THE CDF INSTRUCTION TAD KCDF2 /FIX IT FOR THE STACK TOO JMS STOZRO STKFLD+1 TAD (7577 /THE UPPER END OF STACK IN FLD 2 FOR NOW JMS STOZRO KSTACK TAD (7577 /NEED IT IN THE POINTER TOO JMS STOZRO STKPTR TAD (2000 /THE BOTTOM OF THE STACK JMS STOZRO KSTKEN JMP OPEXIT /ALL DONE NOW JSTONE, JMP OPEXIT /HA HA KCDF2, CDF 20 EXTOPT, JMP OPEXIT /NOT YET / DEFINE SOME PARAMETERS FOR GENERAL I/O OBUFL=400 /LENGTH OF OUTPUT BUFFER AOBUFL=OBUFL^3%2 /NO. OF CHARS IN OUTPUT BUFFER IBUFL=400 /INPUT BUFFER LENGTH OUBUF=DOT /MUST BE LOWER THAN INBUF OUCTL=OBUFL%2!4010 /OUTPUT BUFFER CTRL WORD INBUF=OUBUF+OBUFL INCTL=IBUFL%2!0010 /INPUT BUFFER CTRL WORD INRECS=INCTL%200 /NO. OF INPUT RECORDS INFLD=INCTL&70 /GET FIELD OF INPUT BUFFER OUFLD=OUCTL&70 /DITTO OUTPUT BUFFER /EQUIVALENCES NECESSARY TO INTERFACE WITH MONITOR DCB=7760 MPARAM=7643 /CD PARAMETER AREA NPARAM=MPARAM+3 /CD =N ARGUMENT PTP=20 /INTERNAL TYPE CODE: PAPER TAPE PUNCH DOT=INBUF+IBUFL $ * $ * $ * $