diff --git a/src/syseng/tj6.138 b/src/syseng/tj6.138 new file mode 100644 index 00000000..5e7af381 --- /dev/null +++ b/src/syseng/tj6.138 @@ -0,0 +1,2913 @@ + +TITLE TJ6 + +Z=0 ;FLAG REGISTER USED IN CMD + +A=1 +B=2 ;ADDRESS OF COMMAND ROUTINE AT TIMES +C=3 ;USUALLY POINTS INTO BUFF +D=4 +E=5 ;USUALLY USED TO INDEX CMSW TABLE (CMSW1) +F=6 ;LOGICAL LINES OUT +G=7 ;LOGICAL COLUMNS OUT + +H=10 ;JSP TO CHRC, ALSO FS POINTER BRIEFLY +I=11 ;ANSWER FROM LETP AND RLETP +J=12 ;JSP TO SCNR1 +K=13 ;TEMPORARY IN COMMANDS FROM FILE E.G. +L=14 ;TELLS SCAN DIRECTION IN SCNR1 +M=15 ;MECHANICAL LINES OUT +N=16 ;MECHANICAL COLUMNS OUT + +P=17 ;PDL POINTER + + +SFS==300 ;SIZE OF FREE STORAGE (FS) +PDLL==40 ;SIZE OF PDL +BUFSIZ==400 ;SIZE OF BUFF +CMSWL==20 ;SIZE OF END-OF-LINE CALL BUFFER + +AUTOB==1 ;COMMAND BREAKS + +ERR==1000 ;UUO FOR PRINTING ERROR COMMENTS +EGG==2000 ;PRINT UUO +VAL==3000 ;DOES .VALUE'S + +TYIC==1 ;TYPE IN +TYOC==2 ;TYPE OUT +UTYIC==3 ;FILE INPUT +UTYOC==4 ;FILE OUTPUT +ERRC==5 ;ERROR DEVICE IN + + +ZZ=. +LOC 41 +JSR ERRH +JSR TSINT +LOC ZZ + +DEFINE PRINT ARG\ + EGG,,[ASCIZ /!ARG!/] +TERMIN + +DEFINE BARF ARG\ + ERR,,[ASCIZ /!ARG!/] +TERMIN + TSINT: 0 ;INTERUPT HAS TO BE TYPE IN + 0 + MOVEM A,TSINTA' + MOVEI A,TYIC + .ITYIC A, + JRST DINT ;NOTHING +; CAIN A,^Z +; .LOGOUT + CAIN A,^G + JRST CNTRLG +DINT: MOVE A,TSINTA + .DISMISS TSINT+1 + +CNTRLG: SKIPN FFFF ;QUIT + .RESET UTYOC, + .RESET TYIC, + .DISMISS [ENDAR] + +NOCOR: MOVEI A,30. + .SLEEP A, +BEG: .CORE CORSIZ ;START HERE + JRST NOCOR + .OPEN TYOC,[SIXBIT / !TTYTJ6 OUTPUT/] + VAL + .OPEN TYIC,[30,,SIXBIT / TTYTJ6 INPUT /] + VAL + .SUSET [.SMASK,,[1]] ;TYPE IN BIT ON + .SUSET [.SPICL,,[-1]] ;ENABLE ALL + MOVEI P,PDL + PRINT _TJ6.120 + .SUSET [.RSNAME,,A] ;GET SNAME + MOVEM A,ISYSNM + MOVEM A,OSYSNM +BEGGAR: MOVEI P,PDL ;SET UP PDL + .IOPDL ;RESET I/O PDL IN CASE + PUSHJ P,MANHND ;FLUSH ANY GOODIES IN BUFF + MOVEI N,0 ;RESET COLUMN OUT COUNT + SETOM TLKFLG ;INPUT FROM TTY AT FIRST + SETZM IDUPF ;JUST IN CASE IT WAS ON + PUSHJ P,CMD ;GET FILE SPECS + PUSHJ P,TYOCRR ;RETURN HIS CARRIAGE + MOVEI A,BKSTB + MOVEM A,BKSPP ;BACKSPACE SIMULATOR POINTER + SETOM OUTFLS + SETOM FFFF + SETZM WAITF + HRRZ A,ONAM + MOVE B,A + LSH B,-12. ;FLUSH LAST TWO CHARACTERS + CAIN B,'T ;TTY OR TNM + JRST GO2A ; + CAIN A,(SIXBIT /LPT/) +ENDR2: CLEARM FFFF ;FORM FEED NOT NEEDED FOR LPT AND TTY + PUSHJ P,WINIT ;OPEN OUTPUT FILE + JRST ENDAR ;IF FAILED TO OPEN +ENDR1: PUSHJ P,OPNRD ;OPEN INPUT FILE + JRST ENDAR ;IF FAILED TO OPEN + SETZM ZROINT ;RESET THE WORLD + MOVE K,[ZROINT,,ZROINT+1] + BLT K,ZROEND-1 + MOVEI A,"# + MOVEM A,NQUOTE + +;DOES NOT RESET PAGE AND LINE SIZE PARAMETERS AND HEADING BUFFER + MOVSI A,-200 + MOVEM A,TRNTBL(A) + AOBJN A,.-1 + MOVEI K,PPA + MOVEM K,TYRFL + SETOM SP15F ;MARGIN NEEDED + SETOM PGNMBS + SETOM DUMMY + SKIPE FFFF + SETOM TABFLG ;IF IT CAN TAKE FF'S IT MIGHT AS WELL GET TABS TOO ... + SETZB N,G ;LOGICAL POSITION + SETZB M,N ;MECHANICAL PORSITION + MOVEI A,SPACEX + MOVEM A,SPCDUM + MOVEI K,CMSW + MOVEM K,CMSTR + MOVEI K,0 + PUSHJ P,AHYPH1 + PUSHJ P,APERI1 + PUSHJ P,NOISTZ ;PERHAPS WAIT FOR A SPACE BEFORE STARTING + JRST MNLPR ;START ANALYSING FILE + +GO2A: SETOM WAITF ;SET WAIT FLAG FOR TTY AND TNM + JRST ENDR2 + +ENDER: JUMPN C,DUPLXT ;IF NOT ALL FLUSHED FROM BUFFER (UNLIKELY ?) + SOSL IOPUSD + JRST NDTPOP ;NEED TO POP A IO INPUT + MOVE B,PL + SUB B,PGPOS + PUSHJ P,RATCER + PUSHJ P,NPAGER ;FINISH LAST PAGE - GET HERE FOR .END COMMAND +; SKIPE BDNDFL ;SEE IF NO .END STATEMENT FOUND +; BARF NO .END +; SOSL COPIES +; JRST ENDR1 ;MORE COPIES NEEDED +ENDAR: PUSHJ P,CLOFIL ;CLOSE FILES + .LOGOUT ;FLUSH IF TOP LEVEL (DISOWNED) + JRST BEGGAR + +NDTPOP: .CLOSE UTYIC, + .IOPOP UTYIC, + MOVEI A,15 + MOVEM A,LCHAR + SETOM UNRCHF + POPJ P, ;?? + +TYI: .IOT TYIC,A + CAIL A,40 + POPJ P, + CAIE A,15 + CAIN A,12 + POPJ P, + CAIE A,^Q ;IGNORE OTHER CONTROL CHARACTERS AT THIS LEVEL + JRST TYI + POPJ P, + +TYO: .IOT TYOC,A + POPJ P, + +TYIICE: PUSHJ P,TYI + CAIN A,15 + PUSHJ P,TYOCRR ;ECHO CR AND LF + JRST RPAP + + +RCH1: MOVE A,LCHAR ;USE SAVED LAST CHR + POPJ P, + +RPAK: AOS PGINCN ;COUNT PAGES IN INPUT FILE + SETZM PGINPS ;RESET INPUT PAGE POSITION + JRST RPA ;AND IGNORE FORM FEED + +RCH: AOSN UNRCHF ;READS A CHAR FROM INPUT FILE + JRST RCH1 +RSCH: SKIPE TLKFLG + JRST TYIICE ;GET INPUT FROM TTY +RPA: .IOT UTYIC,A + CAIN A,^L + JRST RPAK + JUMPL A,BDEND ;END OF FILE +RPAP: MOVEM A,LCHAR + CAIN A,12 ;COUNT LF'S + AOS PGINPS + SKIPL IDUPF ;COPY INPUT TEXT ? + POPJ P, ;NO + JRST PPA ; + +BDEND: +; SETOM BDNDFL + MOVEI K,ENDER + PUSHJ P,CMONE + JRST RDL2X + +OPNRD: MOVEI A,0 ;OPEN INPUT FILE + HRLM A,DNAM + .SUSET [.SSNAME,,ISYSNM] + .OPEN UTYIC,DNAM + JRST IPFAIL + AOS (P) + POPJ P, + +IPFAIL: PRINT INPUT + MOVEI B,DNAM +FAILD: PUSHJ P,FILPNT + .OPEN ERRC,[SIXBIT / ERR ! /] + VAL +FAILLP: .IOT ERRC,A + CAIN A,14 ;CONTROL L + JRST TYOCRR + PUSHJ P,TYO ;OUTPUT REASON + JRST FAILLP + +FILPNT: SOS B + HRLI B,440600 + PUSHJ P,FILPN1 ;USER NAME + MOVEI A,"; + PUSHJ P,TYO + PUSHJ P,FILPN1 ;DEVICE AND OPEN CODE + MOVEI A,": + PUSHJ P,TYO + PUSHJ P,FILPN1 ;FIRST FILE NAME + MOVEI A,40 + PUSHJ P,TYO + PUSHJ P,FILPN1 ;SECOND FILE NAME + MOVEI A,40 + JRST TYO + +FILPN1: ILDB A,B + ADDI A,40 ;CHANGE TO ASCII + CAIE A,40 + PUSHJ P,TYO + TLNE B,770000 + JRST FILPN1 + POPJ P, + +WINIT: MOVEI A,5 ;IMAGE MODE IF LPT + HRRZ B,ONAM + CAIE B,(SIXBIT /LPT/) + MOVEI A,1 ;OTHERWISE ASCII MODE + HRLM A,ONAM + .SUSET [.SSNAME,,OSYSNM] + .OPEN UTYOC,ONAM + JRST OPFAIL + AOS (P) + POPJ P, + +OPFAIL: PRINT OUTPUT + MOVEI B,ONAM + JRST FAILD + +CLOFIL: .CLOSE UTYIC, ;CLOSE FILES + .CLOSE UTYOC, + POPJ P, + +PPA: AOSN SP15F ;PUT CHR IN OUTPUT FILE - DO WE NEED MARGIN ? + JRST PPA2 ;YES - BEGINNING OF LINE +PPA1: SKIPGE OUTFLS + POPJ P, ;OUTPUT FLUSHED + ANDI A,177 ;FLUSH EXTRA FLAGS +DAMSL: CAMN A,DUMMY ;IS IT A DUMMY SPACE ? + MOVE A,SPCDUM@ + SKIPN DUPC + HRRZ A,TRNTBL(A) +DAMSL1: .IOT UTYOC,A + CAIL A,40 + AOJA N,POPJP ;COUNT COLUMNS + CAIN A,15 + JRST PPA4 ;END OF LINE + CAIN A,12 + AOJA M,POPJP ;COUNT LINES + CAIN A,10 + SOJA N,POPJP ;BS + CAIE A,0 ;IDLES + CAIN A,^L ;FORM FEEDS + POPJ P, + CAIE A,11 ;TAB + POPJ P, ;DON'T KNOW + ANDCMI N,7 ;'COUNT' TAB + ADDI N,10 + POPJ P, + + +PPA4: SETZM N ;END OF LINE - RESET COLUMN COUNT + POPJ P, ;NO + +PPA2: SKIPN DUPC ;NO MARGIN WHEN DUPLICATING INPUT + CAIN A,15 ;BEGINNING OF LINE ? + JRST PPA1 ;OUTPUT CR FIRST + PUSH P,A + PUSH P,B + MOVE B,MARGIN + PUSHJ P,SPAZEN + POP P,B + POP P,A + JRST PPA1 ;NOW OUTPUT FIRST CHR + + +SPAZIR: SKIPE DUPC ;NO MARGIN IN COPY MODE + JRST SPAZIG + AOSN SP15F ;BEGINNING OF LINE ? + ADD B,MARGIN +SPAZIG:SPAZEN: MOVEI A,40 + JUMPLE B,POPJP + PUSHJ P,PPA1 + SOJG B,.-1 + POPJ P, + TSTOUT: MOVEI A,40 +TSTOU1: PUSHJ P,RETCAT + PUSHJ P,RETCAT +TSTOU2: PUSHJ P,DAMSL1 + AOS A + TRNE A,37 + JRST TSTOU2 + CAIGE A,200 + JRST TSTOU1 +RETCAT: PUSH P,A + MOVEI A,15 + PUSHJ P,DAMSL1 + MOVEI A,12 + PUSHJ P,DAMSL1 + JRST POPAJ + +SIF=400000 ;ON AT SYLLABLE END (?) +COLF=200000 ;COLON +NAMF=100000 ;NAME1 +NAM2F=40000 ;NAME2 (IMPLIES NAMF ON) +DEVF=20000 ;DEVICE-FLAG +SCOLF=10000 ;SEMI-COLON +SYSNF=4000 ;SNAME-FLAG + +RCHA: ILDB A,CMPTR ;INPUT FROM TTY - ASSEMBLES IN CMBUF + JUMPN A,POPJP ;RETURN IF SOMETHING WAS STILL IN BUFFER +RCHA1: SKIPE TLKFLG + PUSHJ P,TYOCRR ;ELSE READ FROM TTY + MOVE B,[10700,,CMBUF-1] + MOVEM B,CMPTR + MOVEI A,137 ;PROMPT USER WITH _ +RCHA2: SKIPE TLKFLG + PUSHJ P,TYO +RCHA4: PUSHJ P,RSCH ;READ IN LOOP + CAIN A,177 + JRST RCHA3 ;RUB-OUT + IDPB A,B + CAIN A,12 + JRST SPUFS + CAIE A,15 + JRST RCHA4 + SETZM TLKFLG +RCHA5: MOVEI A,0 ;END OFF WITH 0-BYTE + IDPB A,B + JRST RCHA + +SPUFS: +; SETOM TLKFLG ;INDICATE INPUT INITIALLY FROM TTY + JRST RCHA5 + +RCHA3: CAMN B,[10700,,CMBUF-1] ;BUFFER EMPTY AFTER RUBOUTS ? + JRST RCHA1 + LDB A,B + ADD B,[70000,,] ;NO, SO DECREMENT BYTE-POINTER + SKIPGE B + SUB B,[XOR 1] + JRST RCHA2 + +CMD: PUSHJ P,SWOPF ;? +; MOVE A,RSYSNM ;READ HIS FILE-SPECS +; MOVEM A,ISYSNM +; MOVEM A,OSYSNM +; MOVSI A,(SIXBIT/>/) +; MOVEM A,FNAM2 ;DEFAULT FROM-FNAM2 IS > + SETZB Z,CMPTR + SETOM CHRCNN ;CHARACTER COUNT +CMDB: CLEARM SUBNM + MOVE E,[10600,,SUBNM-1] +CMDL: PUSHJ P,RCHA ;GET A CHR-(WILL INPUT WHOLE STRING ON FIRST GO) + CAIE A,40 + AOSE CHRCNN + SKIPA + MOVEM A,EXLQST ;SAVE FIRST CHR + CAIL A,140 ;FIX LOWER CASE + SUBI A,40 + CAIN A,^Q + JRST CMDQ ;QUOTES NEXT CHR + CAIGE A,40 + JRST CMDE ;END OF COMMAND + CAIN A,": + JRST CMDCOL ;DEVICE + CAIN A,"; + JRST CMDSC ;SNAME + CAIN A,"_ + JRST CMDLA ;CHANGE TO FROM-FILE SPECS + CAIN A,40 + JRST CMDS ;SYLLABLE ENDED ON SPACE +CMDL1: SUBI A,40 ;CHANGE TO SIXBIT + PUSHJ P,SYLEND ;SEE IF SYLLABLE WAITING TO BE PUT AWAY + TLNE E,770000 ;IGNORE AFTER FIRST SIX CHRS + IDPB A,E + JRST CMDL + +CMDQ: PUSHJ P,RCHA + JRST CMDL1 + +CMDSC: TLOA Z,SCOLF +CMDCOL: TLO Z,COLF +CMDS: CAMN E,[10600,,SUBNM-1] + JRST CMDL ;WE READ NOTHING SO IGNORE + TLO Z,SIF ;INDICATE END OF SYLLABLE JUST HAPPENED + MOVE C,SUBNM ;SAVE SUBNAME IN C + JRST CMDB + +SYLEND: TLZN Z,SIF ;IS SYLLABLE WAITING IN C ? + POPJ P, ;NO +SYLE2: TLZE Z,COLF ;DIRECT IT TO APPROPRIATE ROUTINE DEPENDING ON DELIMITER LAST SEEN + JRST SYLDV + TLZE Z,SCOLF + JRST SYLSN + TLOE Z,NAMF + JRST NAM2 + MOVEM C,FNAM1 + POPJ P, + +NAM2: TLON Z,NAM2F ;IGNORE IF WE ALREADY HAVE FNAM2 + MOVEM C,FNAM2 + POPJ P, + +SYLSN: TLO Z,SYSNF ;SNAME + MOVEM C,ISYSNM + POPJ P, + +SYLDV: TLO Z,DEVF ;DEVICE + LDB D,[360600,,C] + CAIG D,'9 + CAIGE D,'0 + JRST SYLDV1 + TLNN C,7777 ;FOR NUMBER E WE GENERATE UTN + MOVSI C,(SIXBIT /UT/+D) +SYLDV1: HLRZM C,DNAM + POPJ P, + +CMDLA: PUSHJ P,SYLE1 ;GET HERE FOR _ + TRNE Z,-1 + JRST TWOARR + HLRZS Z ;PUT FLAGS FOR TO-FILE IN LEFT HALF +; MOVE D,[DNAM,,ONAM] ;MOVE IN TO-FILE-NAME +; BLT D,ONAM+3 + PUSHJ P,SWOPF ;? + JRST CMDB ;GO BACK TO GOBBLE FROM-FILE SPECS + +TWOARR: PRINT _TOO MANY ARROWS +CMDE: CAIN A,15 ;ENDED ON CR ? + JRST EXCLAR ;SEE IF POSSIBLY ! +CMDEF: PUSHJ P,SYLE1 ;END OF FILE SPECS +; TRNE Z,-1 ;ANY OUTPUT SPECS AT ALL ? + TLNN Z,NAMF + JRST CMDBXT ;NO FROM-FILE NAME, TRY AGAIN +; MOVEI D,(SIXBIT /DSK/) +; TLNN Z,DEVF +; MOVEM D,DNAM ;DEFAULT DEVICE IS DSK + +; MOVE D,RSYSNM +; TLNN Z,SYSNF +; MOVEM D,ISYSNM +; TRNN Z,SYSNF +; MOVEM D,OSYSNM ;DEFAULT SNAMES ARE CURRENT SNAME + +; MOVE D,DNAM +; TRNN Z,DEVF +; MOVEM D,ONAM ;DEFAULT TO-DEVICE IS FROM-DEVICE + + TRNE Z,NAM2F ;IS TO-FNAM2 MISSING ? + POPJ P, ;NO + MOVE D,FNAM1 + EXCH D,ONAM+1 ;COPY IN FROM-FNAM1 + TRNN Z,NAMF ;IS TO-FNAM1 IN EXISTENCE ? + MOVE D,[SIXBIT /(MEMO)/] ;NO-USE (MEMO) AS FNAM2 + MOVEM D,ONAM+2 + POPJ P, + +CMDBXT: PRINT _NO FROM FILE ? +CMDBAT: SETOM CHRCNN + SETOM TLKFLG + JRST CMDB + + +EXCLAR: MOVE A,CHRCNN + CAIE A,1 ;ONE CHARACTER BEFORE CR ? + JRST CMDEF + MOVE A,EXLQST + CAIE A,40+"Q ;LOWER CASE + CAIN A,"Q + VAL,,KILLT ;WIPE SELF OUT + CAIN A,"! + VAL,,EXCLAM ;WIPE OUT HACTRN + JRST CMDEF + +EXCLAM: ASCIZ /:DDT I SYS @ HACTRN SYS TS TJ6îU./ +KILLT: ASCIZ /:KILL / + +;FORMAT TO-FILE _ FROM-FILE CR +; ONAM DNAM +; RIGHT LEFT OF Z + +SYLE1: CAMN E,[10600,,SUBNM-1] ;CALLED ON _ OR CR - SIMULATES SPACE + JRST SYLEND ;NO CHRS ASSEMBLED + MOVE C,SUBNM + JRST SYLE2 ;USE SUBNAME IN APPROPRIATE WAY + +ISYSNM: -1 +DNAM: 0,,(SIXBIT /DSK/) ;FROM-FILE NAME +FNAM1: 0 +FNAM2: SIXBIT /(MEMO)/ + +OSYSNM: -1 +ONAM: 0,,(SIXBIT /DSK/) ;TO-FILE NAME + 0 + SIXBIT />/ + +SUBNM: 0 ;SUBNAME +CMPTR: 0 ;BYTE-POINTER TO CMBUF + +CHRCNN: 0 ;CHARCTER COUNT +EXLQST: 0 ;FIRST CHARACTER + + +SWOPF: MOVE A,DNAM + EXCH A,ONAM + MOVEM A,DNAM + MOVE A,DNAM+1 + EXCH A,ONAM+1 + MOVEM A,DNAM+1 + MOVE A,DNAM+2 + EXCH A,ONAM+2 + MOVEM A,DNAM+2 + MOVE A,ISYSNM + EXCH A,OSYSNM + MOVEM A,ISYSNM + POPJ P, + +FLS: MOVE A,BUFF(C) ;FLUSH CHR IN BUFF POINTED TO BY C + CLEARM BUFF(C) + CAIGE A,500 + POPJ P, ;JUST SINGLE CHR +FLS2: HRRZ B,(A) ;CDR + EXCH A,FF + HRRZM A,@FF ;ADD FREED WORDS TO FREE STORAGE CHAIN + JUMPE B,POPJP ;RETURN IF END OF CHAIN + MOVE A,B + JRST FLS2 + +SLT: CAIN A,^H ;C HAS BUFF POINTER, (A) IS CHR + SOJA C,RDL1 ;HACK BACK-SPACE + CAIN A,12 + JRST RDL3 ;LF + CAIN A,15 + JRST RDL2 ;CR + CLEARM CRFI ;CLEAR LAST-WAS-CR FLAG + CAIN A,11 ;TAB + MOVEI A,40 ;IS CHANGED TO SPACE (IN FILL OR ADJUST MODE) + CAMN A,QST + JRST RDL4 + CAME A,EXL + CAMN A,DTS ;IS IT . OR ? OR : + JRST RDL4 ;GO SEE WHAT KIND OF .'S + CAME A,COL + CAMN A,SMC + JRST RDL4 + CAMN A,NQUOTE ;GOBBLE NEXT UNCONDITIONALLY + JRST RDLABS + CAME A,HYPCHR + CAMN A,STPCHR + SOS C ;THESE GO ON TOP OF LAST CHARACTER + SKIPGE C + AOS C ;IN CASE LOSER LOST AT BEGINNING OF LINE + PUSHJ P,BE ;PUT GOODIE IN A INTO BUFFER +; SKIPN ADJF ;ARE WE ADJUSTING ?? UNCLEAR ?? +; JRST MNCHRR ;NO, SO WE GO ON UNPERTURBED + CAIE A,40 ;AND IS IT A SPACE + JRST MNCHRR ;NO, SO WE GO ON UNPERTURBED +RDL5: PUSHJ P,RCH + CAIE A,11 + CAIN A,40 + JRST RDL6 ;TREAT SERIES OF SPACES AND TABS LIKE ONE + CAIN A,15 + JRST RDL2F ;WE HIT END OF LINE, NEED TO TEST IF NEXT LINE IS A COMMAND ETC. + SETOM UNRCHF +RDL2C1: CAMGE C,LNL ;HAVE WE GOT ENOUGH FOR ONE LINE OF OUTPUT + JRST MNCHRR ;NO + JRST MNBRR ;YES, NEED TO DO ADJUSTING, OUTPUTTING ETC. + +RDL6: SKIPLE NJMODE ;SKIPE ADJF + JRST RDL5 ;IN ADJUST MODE SERIES OF SPACES AND TABS IS LIKE ONE + CAIL C,BUFSIZ + JRST MNCHOR ;TOO MUCH ! + AOS C + PUSHJ P,BE ;STOW IT + JRST RDL5 + +RDLABS: SKIPN DUPC + JRST RDLUBS + PUSHJ P,BE ;SALT IT AWAY TOO IN DUPC MODE + AOS C +RDLUBS: PUSHJ P,RCH ;JUST READ AND STUFF IN BUFFER + ADDI A,200 ;MARK IT + PUSHJ P,BE + JRST MNCHRR + +;THIS AND NEXT PAGE DECIDES IF THE . IS OF THE TYPE FOUND ENDING SENTENCES (FOR JUSTIFICATION PURPOSES) +;IF SO IT STORES IT AS ". OR 400+". , OTHERWISE WITH A MARK (200+".) + +;AB.CD + +;THE POINT WILL NOT BE USED IN JUSTIFYING ( . OR 400+".) +;AND WILL NOT HAVE TWO MARKED SPACES PUT AFTER IT, IF: + +;1. C IS A LETTER OR DIGIT +;2. B IS A LETTER AND A IS A SPACE OR . +;3. NOT-ADJUSTING AND C IS NOT CR +;4. ADJUSTING AND C IS NOT CR OR SPACE OR LF OR HT +; ?AND D IS .? + +;OTHERWISE IT WILL BE PUT IN AS 200+". FOLLOWED BY TWO MARKED +;SPACES (240) AND WILL BE USED IN JUSTIFYING + + +RDL4: MOVEM A,DOTPOS ;SAVE THE . OR ? OR : + SOJL C,RDL4A ;SEE WHAT THE CHR BEFORE THE . IS + + JSP H,CHRC + RDL4B ;TRAP OUT ON NOT LETTER + + SOJL C,RDL4C ;LOOK AT CHR BEFORE THAT + + JSP H,CHRC + RDL4D ;TRAP OUT ON NOT SPACE OR . + + ADDI C,2 +RDL4F: MOVEI A,200 + ADD A,DOTPOS + PUSHJ P,BE ;JUST STORE A MARKED . + JRST MNCHRR ;GO ON AS USUAL + +RDL4B: ANDI A,177 ;PREDICATE USED BY RDL4 - REMOVE MARKERS + PUSHJ P,RLETP ;IS IT A LETTER ? + JUMPN I,POPJP ;RETURN IF IT IS + SUB P,[1,,1] +RDL4A: AOJA C,RDL4E + + +RDL4D: ANDI A,177 ;PREDICATE USED BY RDL4 - REMOVE MARKERS + CAIE A,". ;IS IT A SPACE OR . + CAIN A,40 + POPJ P, ;RETURN IF IT IS + SUB P,[1,,1] +RDL4C: AOJA C,RDL4A + +RDL4E: PUSHJ P,RCH ;STILL HACKING THIS . , READ NEXT CHR + SETOM UNRCHF + CAMN A,NQUOTE + JRST RDL4F + PUSHJ P,LETP ;IS IT A LETTER OR DIGIT + JUMPN I,RDL4F ;. FOLLOWED BY LETTER OR DIGIT + SKIPLE NJMODE ;SKIPE ADJF ;ARE WE ADJUSTING + CAIE A,40 ;YES + CAIN A,15 + JRST RDL4G ;CR OR (SPACE WHEN ADJUSTING) + SKIPG NJMODE ;SKIPN ADJF + JRST RDL4F ;WE ARE NOT ADJUSTING + CAIE A,12 + CAIN A,11 + JRST RDL4G ;LF OR TAB + PUSH P,A ;SAVE IT + CLEARM UNRCHF ;READ NEXT CHR + PUSHJ P,RCH + SETOM UNRCHF +; CAIN A,". ; + JRST RDL4I ;NEXT WAS . + + MOVEI A,400 + ADD A,DOTPOS + PUSHJ P,BE ;PUT IN A SUPER . + AOS C + POP P,A + PUSHJ P,BE + AOJA C,RDL4H + +RDL4I: MOVEI A,200 + ADD A,DOTPOS + PUSHJ P,BE ;PUT IN A MARKED . + AOS C + POP P,A + PUSHJ P,BE + JRST MNCHRR + +RDL4G: MOVE A,DOTPOS + PUSHJ P,BE ;PUT IN A REAL . + AOS C +RDL4H: MOVEI A,240 + PUSHJ P,BE + AOS C + PUSHJ P,BE ;AND TWO MARKED SPACES + JRST RDL5 + +RDL3: SKIPGE CRFI ;JUST READ CR ? - GET HERE ON LF + JRST MNLP1 ;YES +RDL2: SETOM CRFI ;END OF LINE - SET LAST-WAS-CR FLAG + JUMPE C,RDL2F ;O LENGTH LINE DOESN'T DESERVE IT + MOVEI A,40 + CAMN A,BUFF-1(C) ;IF SPACE ALREADY THERE + SOSA C,MXPF + PUSHJ P,BE ;NO, PUT SPACE AT END +RDL2F: +RDL2B: CAML C,LNL + JRST RDL2FL ;FIRST FINISH OFF LAST LINE AVAILABLE + SKIPE CONTEN ;LISTING CONTENTS ? + JRST CONTES +RDL2B1: PUSHJ P,RCH ;FIRST CHAR OF NEXT INPUT LINE + CAIN A,12 + PUSHJ P,RCH ;IGNORE ONE LF + CAIN A,". + JRST RDL2A ;ITS A COMMAND (PERHAPS) +; SETZM LITF +RDL2C: CAIE A,40 + CAIN A,11 + JRST RDL2D1 ;SPACE OR TAB + CAIN A,15 + JRST RDL2B ;ANOTHER CR HAPPENED IMMEDIATELY + SETZM LITF ;? + SETOM UNRCHF + JUMPE C,MNLP1 ;MNLP1 IF BUFFER EMPTY + SKIPGE JMODE + JRST MNBRR ;NO JUSTIFICATION OR FILLING + JRST RDL2C1 + +RDL2FL: SETOM UNRCHF ;REREAD THE CR + JRST MNBRR ;ADJUSTING ETC. + +RDL2D1: SKIPE TLKFLG + JRST ROOTFT ;TIME TO KILL TLKFLG (SPACE AT BEGINNING OF LINE) + MOVE J,NXLSPC ;KEEP TRACK OF SPACES LEADING NEXT LINE +RDL2D: MOVEI K,1 + CAIN A,40 + JRST RDL2E ;SPACE + MOVEI K,10 ;TAB COUNTS AS 8. SPACES + CAIN A,11 + JRST RDL2E ;TAB + CAIN A,15 + JRST RDL2G ;CR + SETOM UNRCHF + JUMPE C,MNLP ;MNLP IF BUFFER EMPTY + JRST MNBRR + +CONTES: SKIPN OUTFLS + AOSG CNTFL + JRST RDL2B1 ;NOT HACKING A SECTION TITLE NOW + SETOM CONFLG ;TO ENSURE CR DO NOT GO IN + SETOM UNRCHF + JUMPN C,MNBRR ; MNLPD1 ? OUTPUT CRUFT + SETZM CONFLG + PUSHJ P,SECTY ;PUT IN PAGE NUMBER + JRST RDL2B1 + +ROOTFT: SETZM TLKFLG ;SWITCH BACK TO FILE FROM TTY + SKIPN OUTDFL + JRST RDL2B ;?? + MOVEI N,0 +AOUT1: .IOT UTYIC,A ;READ A CHARACTER FROM INPUT FILE + SKIPL A + CAIN A,^C + JRST ENDAR ;END OF FILE + CAIN A,^L + JRST AOUT2 ;TOP OF PAGE + CAIN A,^I + JRST AOUT7 ;TABS +AOUT6: PUSHJ P,DAMSL + JRST AOUT1 + +AOUT2: SKIPE FFFF + JRST AOUT6 ;WANTS FORM FEEDS SO OK + PUSHJ P,NOISTZ ;MAY WAIT FOR HIM + JRST AOUT1 + +AOUT7: MOVEI A,40 +AOUT9: PUSHJ P,DAMSL + TRNE N,7 ;TO MULTIPLE OF 8. + JRST AOUT9 + JRST AOUT1 + + +RDL2G: PUSHJ P,RCH ;CR - SO READ NEXT + CAIE A,12 ;IGNORE ONE LF + SETOM UNRCHF + MOVEM J,NXLSPC ;RESET OLD SPACE COUNT + JRST RDL2B + +RDL2E: ADDB K,NXLSPC ;ADD IN SPACE COUNT + CAML K,NLL + PUSHJ P,RDBUST + PUSHJ P,RCH + JRST RDL2D + +RDBUST: BARF TOO MANY SPACES AT BEGINNING OF LINE + SETZM NXLSPC + POPJ P, + +RDL2A: AOSN LITF ;GET HERE IF FIRST ON NEW LINE IS . + JRST RDL2C ;ITS A LITERAL LINE + SKIPE DUPC ;ARE COMMANDS TO BE DUPLICATED + JRST RDL2A1 + PUSHJ P,GCOM + SKIPA + JRST RUDDER ;LOST ON COMMAND + TLNE B,AUTOB + JRST POWB + PUSHJ P,COMMA1 +RUDDER: JUMPN C,RDL2B ;?? USED TO BE RDL2D2 + SKIPN CMSW + JUMPE C,MNLPR ;BUFFER IS EMPTY AND NO END OF LINE CALL +RDL2X: JUMPE C,MNLP ;BUFFER IS EMPTY AND AN END OF LINE CALL + JRST MNBRR ;BUFFER NOT EMPTY + +POWB: MOVEI K,POWER + SKIPA +RDL2A1: MOVEI K,DUPCX ;INDICATE NEED TO DUPLICATE WHEN WE HIT END OF LINE + PUSHJ P,CMONE + JRST RDL2X ;IN THIS MODE BREAKING SEEMS UNAVOIDABLE ANYWAY ? + +POWER: JUMPN C,DUPLXT + MOVE B,ROTPNT + MOVE B,COMDT1(B) + PUSHJ P,COMMA1 + SUB P,[1,,1] + SETOM (E) + JRST RDL2X + +DUPLXT: SOS C,MXPF + SUB P,[1,,1] ;STILL SOME LEFT IN BUFFER AFTER ALL + JRST MNBRR + +RDL1: JUMPL C,RDL1A ;WE GET HERE FROM SLT ON BS + + JSP H,CHRC ;SEE IF PREVIOUS CHR IS SPACE + RDL1B + +RDL1C: JRST MNLP1 + +RDL1A: BARF BACKSPACED TOO FAR + JRST RDL1C + +RDL1B: CAIN A,40 ;PREDICATE USED BY RDL1 + BARF BACKSPACED OVER SPACE + POPJ P, + +DUPCX: JUMPN C,DUPLXT + PUSHJ P,NATASH +COMMAN: PUSHJ P,GCOM ;READ THE COMMAND !! +COMMA1: PUSHJ P,(B) ;EXECUTE IT (MAY BE SKIPPED IF B IS ZERO + PUSHJ P,FINLIN ;GOT TO END OF LINE + SKIPN IDUPF + POPJ P, + MOVEI A,12 + SETZM IDUPF ;SWITCH OFF COMMAND LINE COPYING + JRST PPA1 + +;(H) ;TEST PREDICATE (EITHER RETURNS OR GOES OF ON ITS OWN) +;1(H) ;RETURN + +CHRC: MOVE A,BUFF(C) ;APPLY TEST TO CHR IN BUFFER AT C + CAIL A,500 + JRST CHRC1 ;ITS NOT A SIMPLE CHR + PUSHJ P,@(H) ;CALL TEST FUNCTION + JRST 1(H) ;RETURN + +CHRC2: MOVE A,I +CHRC1: HRRZ I,(A) ;CDR + HLRZ A,(A) ;GET CHRACTER + PUSHJ P,@(H) + JUMPN I,CHRC2 ;NOT END OF CHAIN + JRST 1(H) + + +BE: SKIPE B,BUFF(C) ;PUT (A) IN BUFFER AT C + JRST BE1 ;NEED TO GROVEL ALONG CHAIN + MOVEM A,BUFF(C) ;SPACE EXISTED, JUST PUT IT IN + POPJ P, + +BE1: CAIL B,500 ;NEED TO MAKE SPACE IN BUFFER + JRST BE2 ;ALREADY POINTS OUT OF BUFFER + PUSHJ P,CONS ;FREE SPACE POINTED TO BY H + HRLM B,(H) ;STORE CHR IN LEFT + MOVEM H,BUFF(C) ;PUT POINTER IN BUFFER +BE4: MOVE B,H +BE2: HLRZ D,(B) ;GRAB CHR OFF CHAIN + CAMGE A,D + JRST BE3 ;GOOD PLACE TO PUT NEW CHR + HRRZ H,(B) ;CDR + JUMPN H,BE4 ;NOT END OF CHAIN + PUSHJ P,CONS ;ADD WORD TO END OF CHAIN + HRLM A,(H) + HRRM H,(B) + POPJ P, + +BE3: PUSHJ P,CONS ;ADD WORD SOMEWHERE IN CHAIN + MOVE I,(B) + MOVEM I,(H) + HRRZM H,(B) + HRLM A,(B) + POPJ P, + +CONS: MOVE H,FF ;'EXPAND' BUFFER STORAGE + JUMPE H,SCE + HRRZ I,(H) ;BY GRABBING TAIL OF FREE STORAGE CHAIN + MOVEM I,FF + CLEARM (H) ;FREE WORD POINTED TO BY H + POPJ P, + +SCE: BARF FREE STORAGE EXCEEDED + JRST ENDAR + +GCOM: PUSHJ P,GSYL ;READ A COMMAND - GET SYLLABLE INTO H + JUMPE H,GCOM6 + SKIPN LTF + JRST GCOM5 ;IT WAS A NUMBER + MOVSI B,-COML +GCOM2: CAMN H,COMT(B) ;COMPARE WITH VALID COMMANDS + JRST GCOM1 ;FOUND IT + AOBJN B,GCOM2 + PUSHJ P,GCOM7 ;OUTPUT COMMAND + BARF UNKNOWN COMMAND +GCOM8: MOVEI B,0 + AOS (P) ;SKIP THE EXECUTION + POPJ P, + +FINLIN: SETOM UNRCHF ;JUST IN CASE +FANLAN: PUSHJ P,RCH ;IGNORE REST OF COMMAND LINE + CAIN A,12 + POPJ P, ;? + CAIE A,15 + JRST FANLAN +; PUSHJ P,RCH +; CAIE A,12 ;IGNORE ONE LF AT BEGINNING OF LINE + SETOM UNRCHF + POPJ P, + +GCOM1: MOVEM B,ROTPNT ;SAVE FOR POSSIBLE ERROR OUTPUT + MOVE B,COMDT1(B) ;GET APPROPRIATE ROUTINE + POPJ P, + +GCOM5: PUSHJ P,GCOM7 + BARF NUMERIC COMMAND + JRST GCOM8 + +GCOM6: BARF BLANK COMMAND + JRST GCOM8 + +GCOM7: PUSH P,A ;OUTPUT ASSEMBLED COMMAND + PUSH P,I + MOVE I,[440600,,H] +ILDERP: ILDB A,I + ADDI A,40 ;CHANGE TO ASCII + PUSHJ P,TYO + TLNE I,770000 + JRST ILDERP + POP P,I + JRST POPAJ + +MNLPR: SKIPGE JMODE ;GET HERE AT START OF NEW OUTPUT LINE (?) + JRST MNLP ;NO JUSTIFY OR FILL + MOVEI A,15 ;CAUSE CR TO APPEAR AS NEXT CHR READ + MOVEM A,LCHAR + SETOM UNRCHF +MNLP: CLEARB C,MXPF ;INITIALISE POINTERS TO BEGINNING OF BUFFER +MNLPA: + SKIPE C,MXPF + SKIPN NXLSPC ;NEXT LINE SPACES + SKIPA A,NLL + SOJA C,MNLPC1 ;FINISH OUT REST OF LINE + MOVE B,NJMODE ;MOVE IN NEW FLAGS NOW + CAME B,JMODE + JUMPN C,MNLPD1 ;FIX UP - WE ARE CHANGING JUSTIFICATION MODE (POSSIBLE ??) + MOVEM B,JMODE + SUB A,NXLSPC ;CALCULATE NEW LINE LENGTH + SUB A,NINDS + JUMPLE A,NONPLS +NOPLTR: MOVEM A,LNL ;LNL=NLL-NXLSPC-NINDS + PUSHJ P,NINDC + SKIPE CMSW ; + JRST CMSW1 ;NEED TO DO END OF LINE CALL + SKIPGE JMODE + JRST NJMN1 ;NO JUSTIFICATION OR FILLING + CAMLE C,LNL + SOJA C,MNBRR1 +MNLP1: CAMLE C,MXPF + MOVEM C,MXPF + PUSHJ P,RCH ;READ A CHR + JRST SLT ;INSPECT IT + +NONPLS: BARF LINE LENGTH < 0 + MOVEI A,10 + JRST NOPLTR + +;IF WE ARE JUSTIFYING OR FILLING THE NORMAL PATH IS MNCHRR, MNLP1, SLT, MNCHRR, ... +;UNTIL BUFFER FULL, OR ENOUGH FOR ONE LINE OF OUTPUT, OR END OF INPUT LINE, OR SOME OTHER TRAGEDY. + +NINDC: MOVE A,NXLSPC ;NUMBER OF SPACES TO ADD TO BEGINNING OF LINE + MOVEM A,NXLC1 ;FACTOR IN INDS DUE TO NXLSPC + ADD A,NINDS ;IF INDS WAS UNLOCKED + CLEARM NXLSPC + MOVEM A,INDS ;SPACES TO INDENT + POPJ P, ;INDS=NINDS+NXLSPC + +MNLPD1: PUSHJ P,NINDC ;FROM MNLPD & CMSW1 & MANWEN + SOJA C,MNLPC + +MNLPC1: MOVN B,NXLC1 ;FROM MNLPD + ADDM B,INDS + CLEARM NXLC1 + JRST MNLPC + + MNCHRR: CAIGE C,BUFSIZ + AOJA C,MNLP1 +MNCHOR: BARF LINE TOO LONG + SETOM UNRCHF ;? + SOS C + JRST MNLPC ;? + +ILLIN: ;ILLEGAL LINE - SORT OF A BUG I SUPPOSE +MNBRR1: MOVEM C,MXPF +MNBRR: CAMGE C,MXPF ;GET HERE WHEN ENOUGH FOR ONE OUTPUT LINE (?) + JRST ILLIN ;BARF BUG - ILLEGAL LINE +MNLPC: MOVEM C,MXPF + CAMGE C,LNL ;DID WE END BECAUSE WE HAD ENOUGH FOR OUTPUT ? + JRST MNLP4A ;NO, BREAK OR SOMETHING NO JUSTIFICATION NEEDED. +MNLP3: JUMPE C,MNLP ;MOVE BACK OVER SPACES WHICH BROKE-UNLESS LINE WAS BLANK + + JSP H,CHRC ;TEST IF LAST WAS A SPACE + MNLP2 ;TRAPS TO MNLP4A,4E,2D ON NON-SPACE (DEPENDS ON SPACE LEFT) + + SOJA C,MNLP3 ;SEARCH UNTIL FIND NON-SPACE + + +MNLP2: CAIE A,240 ;PREDICATE USED BY MNLP3 + CAIN A,40 ; + POPJ P, ;ITS A SPACE OR MARKED SPACE + SUB P,[1,,1] + MOVE D,LNL ;FULL LINE LENGTH + CAIGE D,1(C) + JRST MNLP2D ;TOO MUCH LEFT - SEARCH LEFT ANOTHER WORD + CAMN A,HYPCHR + JRST HYPTSO + SETZM HYPOP' + CAMN A,MNS ;?? +MNCOM2: PUSHJ P,BEMIN ;?? PUT MARKED SPACE AFTER HYPHEN + CAIE D,1(C) + JRST MNLP2E ;WE HAVE LESS THAN A FULL LINE +MNLP4A: MOVEM C,MXPF1 ;UP TO WERE WE ARE USING FOR THIS OUTPUT LINE + JRST MNLP4 ;NO NEED TO ADJUST + +MNLP2D: + CAME A,HYPCHR + CAMN A,MNS ;HYPHEN + SOS C ;? TO GET PAST HYPHEN + + JSP H,CHRC ;MOVE BACK TO LAST SPACE OR HYPHEN + MNLP2C ;PREDICATE EVENTUALLY GOES TO MNLP3 AGAIN + + SOJG C,MNLP2D ;SEARCH UNTIL FIND A SPACE OR HYPHEN + MOVE C,MXPF ;THE WHOLE LOT + MOVEM C,MXPF1 ;UP TO + JRST MNLP4 ;SINGLE WORD TOO LONG PRINT ANYWAY (ITS THE WHOLE LINE !) + +BEMIN: MOVEI A,240 ;PUT IN MARKED SPACE +; AOS SOMETHING (?) + JRST BE ;? + +HYPTSO: CAIGE D,2(C) + JRST MNLP2D + SETOM HYPOP' ;INDICATE WE BROKE ON HIDDEN HYPHEN + SOJA D,MNCOM2 + MNLP2C: ;PREDICATE USED BY MNLP2D - - MOVE BACK TO SPACE + CAME A,HYPCHR + CAMN A,MNS ;HYPHEN + JRST MYPHN + ANDI A,177 + CAIE A,40 ; + POPJ P, ;ITS NOT ANY KIND OF SPACE +MYPHN: SUB P,[1,,1] + JRST MNLP3 + +MNLP2E: MOVEM C,MXPF1 ;POINTER TO END OF WHAT IS TO GO ON NEXT LINE + SKIPN NVRADJ + SKIPG NJMODE ;SKIPN ADJF + JRST MNLP4 ;? ONLY FILL-MODE, NO NEED TO ADJUST + CLEARB C,NBRKS ;COUNT SPACES AND .'S IN LINE + CLEARM NPRDS +MNLP2A: CAMLE C,MXPF1 + JRST MNLP2B ;END OF PORTION OF BUFFER OF CONCERN + + JSP H,CHRC ;TEST CHR AND COUNT BREAKS + MNLP5 + + AOJA C,MNLP2A + +;COUNTING PLACES USED FOR JUSTIFYING +MNLP5: CAIN A,40 ;PREDICATE USED BY MNLP2A + AOS NBRKS ;COUNT BREAKS - ONLY REAL SPACES + CAMN C,MXPF1 ;END OF INTERESTING TEXT ? + POPJ P, ;DONT COUNT .'S AT END OF LINE + TRZ A,400 ;REMOVE SUPER MARK + CAMN A,QST + JRST MNLP5X + CAME A,EXL + CAMN A,DTS ; +MNLP5X: AOS NPRDS ;WAS . OR 400+". + POPJ P, + +CMSW1: MOVEI E,CMSW ;CALL END OF LINE ROUTINES +CMSW2: CAML E,CMSTR ;ANY LEFT TO DO ? + JRST CMSW3 ;NO + SKIPLE K,(E) + PUSHJ P,(K) + SETOM (E) + AOJA E,CMSW2 + +CMSW3: MOVEI K,CMSW ;RESET POINTER + MOVEM K,CMSTR + SETZM CMSW ;INDICATE ALL DONE + SKIPL JMODE ;? + SKIPE DUPC + JRST MNLPR + SKIPLE C + SOS C,MXPF ;? + JRST RDL2B + +MANHND: MOVEI C,0 + PUSHJ P,FLS ;FLUSH BUFFER-DONE THIS WAY TO ALSO FREE UP CHAINED SPACE + CAMGE C,MXPF + AOJA C,.-2 + POPJ P, + +MNLP2B: SKIPN NVRADJ ;?? + SKIPG NJMODE ;SKIPN ADJF ;FROM MNLP2A ?? + JRST MNLP4A ;NO ADJUSTING ?? UNCLEAR + MOVE H,LNL + SUB H,MXPF1 + SKIPE HYPOP + SOS H + SOSGE H ;USED TO BE SOSG + BARF BUG - < 0 SPACES IN JUSTIFYING + MOVEM H,SPN ;SPACES TOTAL NEEDED + JUMPE H,MNLP4 ;? IN CASE + SKIPN NPRDS + SKIPE NBRKS + SKIPA + JRST MNLP4A ;RANDOM DECISION FOR 1 WORD TOO SHORT AND 2 TOO LONG FOR LINE +MNJ1B: SETCMM DIRSCN ;COMPLEMENT SCAN DIRECTION + SKIPN NPRDS + JRST MNJ1 ;NO .'S + HRLZS H ;INSERT SPACES AT PERIODS FIRST + IDIV H,NPRDS ;SPACES PER PERIOD _18. + PUSHJ P,SINCRC + + JSP J,SCNR1 ;PUT SPACES AFTER PERIODS + MNJ2 + +MNJ1: SKIPN NBRKS + JRST MNJ9 ;NO SPACES EXIST + HRLZ H,SPN + JUMPE H,MNLP4 ;NEED NO MORE SPACES + IDIV H,NBRKS ;SPACES PER SPACE _18. + PUSHJ P,SINCRC + + JSP J,SCNR1 ;PUT SPACES AFTER SPACES + MNJ4 + +MNJ9: SKIPE H,SPN ;HAVE WE PUT IN ALL NEEDED JUSTIFICATION SPACES ? + JRST MNJ1A ;NO +MNLP4: PUSHJ P,PRNTR ;GO OUTPUT LINE AT LAST + MOVEI C,0 + PUSHJ P,FLS ;FLUSH ALL IN BUFFER-DONE THIS WAY TO ALSO FREE UP CHAINED SPACE + CAMGE C,MXPF1 + AOJA C,.-2 + AOS C +MNJ6L: CAMLE C,MXPF ;ANYTHING LEFT AT END OF BUFFER ? + JRST MNLP ;NO + + JSP H,CHRC ;FLUSH SPACES AT END BEFORE REMAINING TEXT + MNJ6 + + MOVEI D,0 +MNJ5: CAMLE C,MXPF + JRST MNJ5A + MOVE H,BUFF(C) ;MOVE REST OF BUFFER TO BEGINNING + MOVEM H,BUFF(D) + CLEARM BUFF(C) ;WIPE OUT OLD COPY + AOS D + AOJA C,MNJ5 ;CONTINUE UNTIL WE REACH END OF USED PORTION OF BUFFER + +MNJ1A: AOSN JERRF ;NEEDED MORE THAN ONE SPACE PER BREAK ? + JRST MNJ1B ;YES, SO GO IT ONCE MORE + BARF BUG - JUSTIFICATION ERROR + JRST MNLP4 + +SINCRC: CLEARM JERRF ;CALCULATE SPACE INCREMENT + ADDI H,100 + CAML H,[1,,] ;MORE THAN ONE PER BREAK ? + JRST SINCR1 ;YES +SINCR2: MOVEM H,SINCR + POPJ P, + +SINCR1: MOVSI H,1 ;PUT IN ONE SPACE PER BREAK THIS TIME ROUND + SETOM JERRF ;INDICATE WE NEED TO REPEAT THIS PERFORMANCE + JRST SINCR2 + +MNJ5A: MOVEI C,-1(D) ;FROM MNJ5 + + JSP H,CHRC + MNJ5B ;TRAPS TO MNLPB IF ENDS WITH SPACE, 240 OR . + + MOVEI A,40 ;DELIMITED REMAINDER WITH SPACES + MOVEM A,BUFF+1(C) + AOJA C,MNLPB + +MNJ5B: ;SEE IF TEXT ENDS ON SPACE, 240 OR .(ELSE END IT IN SPACE) + CAME A,QST + CAMN A,EXL + JRST MNJ5C + CAME A,DTS ;PREDICATE USED BY MNJ5A + CAIN A,40 + JRST MNJ5C +; CAME A,COL +; CAMN A,SMC +; JRST MNJ5C + CAIE A,240 + POPJ P, ;NOT (SPACE OR MARKED SPACE OR .) +MNJ5C: SUB P,[1,,1] +MNLPB: AOS C + MOVEM C,MXPF + JRST MNLPA ;GRAND EXIT AT LAST + +MNJ6: CAIN A,40 ;PREDICATE USED BY MNJ6L TO FLUSH SPACES AT END + JRST MNJ6L1 + CAIE A,240 + JUMPN A,POPJP ;NOT SPACE OR MARKED SPACE OR BLANK +MNJ6L1: SUB P,[1,,1] + PUSHJ P,FLS ;FLUSH IT + AOJA C,MNJ6L + + +;(J) ROUTINE TO TEST CHR +;1(J) RETURN + +SCNR1: CLEARB K,L ;SCAN AND PUT IN SPACES FOR JUSTIFICATION + SKIPGE DIRSCN + MOVEI L,1 ;L SET TO SCAN DIRECTION + XCT SCNT1(L) ;GET STARTING VALUE FOR C +SCNR3: XCT SCNT3(L) ;TEST C FOR END + JRST 1(J) ;DONE + + JSP H,CHRC + @(J) + + JRST SCNR2 ;CONDITION NOT MATCHED + ADD K,SINCR ;SPACING INCREMENT + TLZN K,-1 + JRST SCNR2 ;DON'T PUT ONE IN YET + SOS SPN ;REDUCE COUNT OF SPACES STILL NEEDED + MOVEI A,240 + PUSHJ P,BE ;PUT IN A MARKED SPACE +SCNR2: XCT SCNT2(L) ;INCREMENT C AND JRST SCNR3 + + +;THESE ARE EXECUTED BY SCNR1 ETC. + +SCNT1: MOVEI C,0 ;SET C TO STARTING VALUE + MOVE C,MXPF1 + +SCNT2: AOJA C,SCNR3 ;INCREMENT C AND JRST TO SCNR3 + SOJA C,SCNR3 + +SCNT3: CAMLE C,MXPF1 ;TEST C FOR COMPLETION + SKIPN C + +;FOLLOWING TWO PREDICATES USED WHILE INSERTING JUSTIFYING SPACES + +MNJ4: CAIE A,40 ;PREDICATE FOR SPACE USED IN MNJ1B (SCNR3) + POPJ P, +MNJ4R: SUB P,[1,,1] + JRST 2(H) ;CONDITION MET, REAL SPACE (OR .) + +MNJ2: SUBI A,400 + CAMN A,QST + JRST MNJ2A + CAME A,EXL + CAMN A,DTS + JRST MNJ2A ;ITS (. OR : OR ?)+400 + ADDI A,400 + CAMN C,MXPF1 ;AT END OF LINE + POPJ P, + CAMN A,QST + JRST MNJ4R + CAME A,EXL + CAMN A,DTS + JRST MNJ4R ;ITS . OR : OR ? NOT AT END OF LINE + POPJ P, + +MNJ2A: ADDI A,400 ;? + CAMN C,MXPF1 + POPJ P, ;AT END OF LINE, IGNORE + SUB P,[1,,1] + ADD K,SINCR ;ADD SPACING INCREMENT + TLZN K,-1 + JRST SCNR2 ;DON'T SPACE YET + SOS SPN ;DECREMENT SPACES STILL NEEDED + MOVEI A,240 + AOS C + PUSHJ P,BE ;PUT IN A MARKED SPACE AHEAD OF THIS . + SOJA C,SCNR2 + +NPAG: PUSHJ P,NPAGER + SKIPN PGCMFL + JRST PRNTR + SETZM PGCMFL + JRST PRNTR9 + +NPAGER: SKIPE PGCMFL ;SKIP IF NOT DOING A .PAGE NOW + CLEARM NLFS ;SAY NO MORE LINES TO DO + MOVE B,MAXPL ;FULL PAGE SIZE + SUB B,FPGPOS ;FULL PAGE POSITION + SOS B + PUSHJ P,RATCER ;FINISH OFF PAGE + SKIPE DOTFLG + PUSHJ P,DOTLIN ;DOTTED LINE + SKIPE DUPC + SKIPL JMODE ;? + PUSHJ P,CRR ;FINAL CR + CLEARM PGPOS ;RESET PAGE POSITION + MOVEI A,14 + CLEARM FPGPOS ;FULL PAGE POSITION + SKIPE FFFF ;NEED FORM FEED ? + JRST PPA1 ;YES, AND NO WAIT FOR TYPE IN (NOT LPT OR TTY) +NOISTZ: SKIPE WAITF +NOISTY: SKIPE FFFF + POPJ P, ;NO NEED TO WAIT + SKIPN TLKFLG + SKIPGE OUTFLS + POPJ P, + SKIPG SWITFL ;SWITCH HACK + JRST FOO69X ;? + PUSHJ P,TYI + CAIE A,12 + POPJ P, + MOVEI A,15 + MOVEM A,LCHAR + SETOM UNRCHF + SETOM TLKFLG + POPJ P, +FOO69X: MOVEI A,30. + .SLEEP A, + DATAI 420,A ;COLOR SCOPE (SIGH) + TLNN A,20000 + JRST FOO69X ;SWITH OFF + MOVEI A,4 + .SLEEP A, ;REQUIRE SWITCH TO BE ON FOR 4/30 + DATAI 420,A + TLNN A,20000 + JRST FOO69X + POPJ P, + +RATCER: SKIPE DUPC ;OMIT ALL THESE CR'S IF IN DUPC MODE + POPJ P, + SKIPLE B + PUSHJ P,CRR + SOJG B,.-1 + POPJ P, + +DOTLIN: SKIPE DUPC ;NO DOTTED LINE IN DUPC MODE + POPJ P, + MOVE B,MAXLNL ;GENERATE A LINE STARTING AND ENDING WITH . + MOVEI A,". + PUSHJ P,PPA1 + SOS B + PUSHJ P,SPAZIG + MOVEI A,". + JRST PPA1 + +PRNTRA: SETOM CENTF ;CALL FROM .SPACE & .CENTER & .PAGE GOES HERE - TEST ONLY NOT LINE OUTPUT +PRNTR: MOVE A,PGPOS ;OUTPUT A LINE + CAML A,PL + JRST NPAG ;TIME FOR A NEW PAGE + MOVE A,FPGPOS + JUMPE A,HEADTY ;TIME FOR HEADING +PRNTR9: AOSN CENTF + POPJ P, ;NO HAIR SINCE WE ARE DOING A .SPACE OR .CENTER OR .PAGE + MOVE B,INDS + SKIPE DUPC ;NO INDENTATION IN DUPC MODE + SUB B,NINDS + SKIPE CONTEN + SETZM SP15F ;NO MARGIN WHEN CONDENTING + SKIPGE JMODE + JRST PRNTS1 ;NO-FILL MODE + PUSHJ P,SPAZIR ;INDENT + MOVEI C,0 +PRN4: CAMLE C,MXPF1 + JRST PRNXAS ;DONE + MOVE A,BUFF(C) + CAIL A,500 + JRST PRN3 ;POINTER, NOT CHR, SO NEED TO GROVEL + SKIPE A ;TO STOP CRETENOUS _@ CAUSED BY BUG + PUSHJ P,PPA ;OUTPUT IT + AOJA C,PRN4 + +PRNXAS: SKIPN HYPOP + JRST PRNXES + SETZM HYPOP + MOVEI A,"- + PUSHJ P,PPA ;OUTPUT HIDDEN HYPHEN +PRNXES: SKIPN OUTFLS + SKIPN CONTEN + JRST PRNX + SKIPE CONFLG + POPJ P, ;LAST LINE OF SECTION TITLE + SETOM DUPC ;TO STOP MORE THAN ONE CR FROM APPEARING + PUSHJ P,PRNX + SETZM DUPC + POPJ P, + +PRNTS1: SKIPE CBUFC ;BUFFER EMPTY ? + PUSHJ P,SPAZIR ;NO, PUT IN MARGIN ETC. + JRST NJP1 + NJP1: + JSP H,PSTRG ;OUTPUT WHATS IN CBUF + 440700,,CBUF + + JRST PRNXES + +PRNX: SKIPE SPMD + PUSHJ P,CRR ;DOUBLE SPACING CR + SKIPE SPMD + SKIPN DUPC ;SINGLE RETURNS ONLY IN DUPC MODE + JRST CRR ;AND SINGLE SPACING CR + AOS PGPOS + AOS FPGPOS + POPJ P, + +NJMN1: PUSHJ P,RCH + CAIE A,15 + JRST NJAMT + PUSHJ P,RCH + CAIN A,12 + PUSHJ P,RCH ;NO JUSTIFICATION-DO THIS INSTEAD OF MNCHRR, MNLP1, RCH,SLT,... +NJAMT: CAIN A,40 + SETZM TLKFLG + CAIN A,". + JRST NJMN2 ;ITS A COMMAND LINE +NJMN3: SETOM UNRCHF + + JSP H,RSTRG ;PUT INPUT IN CBUF RATHER THAN BUFF + CBUFC + CBUFP + 440700,,CBUF + + MOVE A,CBUFC + CAIL A,280. ;PROBABLY DETROYED PDL TOO + BARF UNFILLED LINE TOO LONG + SKIPE CONTEN + JRST CONTEX +NJMN9: PUSHJ P,PRNTR ;OUTPUT LINE + JRST MNLP + +NJMN2: AOSN LITF + JRST NJMN3 ;ITS A LITERAL LINE + SKIPE DUPC + PUSHJ P,NATASH + PUSHJ P,COMMAN + JRST MNLP ;NO FILL SO WE DON'T NEED TO TEST AUTOB + +CONTEX: AOSE CNTFL + JRST NJMN9 + SETOM CONFLG + PUSHJ P,PRNTR + SETZM CONFLG + PUSHJ P,SECTY + SETOM UNRCHF + JRST MNLP + +NATASH: PUSHJ P,PRNTRA + SETOM IDUPF + MOVEI A,". + JRST PPA1 + +PRN3: SETZM WAITHR' + MOVE B,A ;GROVELING ALONG CHAINS (FROM PRN4) + CLEARM C240S ;RESET NUMBER OF MARKED SPACES (240) + SETOM PRNCRS ;RESET NUMBER OF CHRS IN POSITION +PRN3A: HLRZ A,(B) + CAIN A,240 + JRST PRN5 ;AHA, GOT ONE + CAMN A,HYPCHR + JRST PRN5B + CAMN A,STPCHR + JRST WAITER + MOVE D,A + AOSN PRNCRS + JRST PRN3B ;FIRST CHARACTER + MOVEI A,^H ;MORE THAN ONE CHR IN THIS POSITION + PUSHJ P,PPA ;OUTPUT A BACKSPACE + MOVE A,D ;NOW +PRN3B: PUSHJ P,PPA ;OUTPUT CHR +PRN5A: MOVE D,B +PRN5B: HRRZ B,(B) ;CDR + JUMPN B,PRN3A + MOVEI A,40 ;FOUND END OF CHAIN + AOS C + CAML C,MXPF1 + JRST PRN4 + SKIPLE B,C240S + PUSHJ P,PPA ;OUTPUT ALL THE MARKED SPACES + SOJG B,.-1 + SKIPE WAITHR + PUSHJ P,NOISTY + JRST PRN4 ;GO ON TO NEXT CHR + +WAITER: SETOM WAITHR' + JRST PRN5B + +PRN5: AOS C240S ;COUNT THE MARKED SPACE + JRST PRN5A + +CRR: AOS PGPOS ;OUTPUT A CR AND LF AND ADVANCE THE PAGE POSITION + AOS FPGPOS +CRROF: MOVEI A,15 ;HERE FOR OUTPUT WHICH DOESN'T WANT TO BE COUNTED + PUSHJ P,PPA1 + MOVEI A,12 + PUSHJ P,PPA1 + SETOM SP15F ;INDICATE LEFT MARGIN NEEDED + POPJ P, + +FIGTP: SKIPN PGCMFL ;ARE WE DOING A .PAGE ? + POPJ P, ;NO + AOS B,PAGN ;YES - SO DO .EPAGE IN EFFECT + SETZM NLFS + SETZM TPNLFS + POPJ P, + +HEADTY: MOVE A,EPGIN + ADDM A,PAGN ;ADD IN EPAGE INCREMENT + SETZM EPGIN + AOS B,PAGN ;GOODIES TO DO AT TOP OF PAGE + CAML B,PNST ;TIME TO START OUTPUT ? + PUSHJ P,AHAON ;YEP + SOJE B,TPGT ;ON FIRST PAGE GO TO TPGT + SKIPE TPNLFS ;NEED TO PUT EXTRA LINES AT TOP OF PAGE DUE TO .FIGURE ? + PUSHJ P,FIGTP ;YES + SKIPE DUPC + JRST HTYI9 ;COPY MODE - OMITT TWO EXTRA LINES + AOS B + SKIPE THSFLG + JRST HTYIA ;DON'T PUT HEADING AND PAGE NUMBER IN YET + PUSHJ P,CRR ;TWO BLANK LINES ABOVE HEADING + PUSHJ P,CRR + PUSHJ P,HICTOR ;LINE OF HEADING + JRST HTYIA + +HTYI9: SKIPL JMODE ;IN NOFILL AND DUPC DON'T EVEN CR + PUSHJ P,CRR +HTYIA: MOVE B,TPMAR + SKIPN THSFLG + SUBI B,3 ;TWO BLANK LINES AND HEADING + PUSHJ P,RATCER + CLEARM PGPOS ;RESET PAGE POSITION + SKIPE THSFLG + PUSHJ P,HICTOS + SKIPE DUPC + JRST DUPFIL ;NO FIGURE SPACES IN COPY MODE + MOVE B,TPNLFS + PUSHJ P,RATCER +HIGTY: SETZM TPNLFS + JRST PRNTR9 + +HICTOR: SKIPN PGNMBS ;DO WE WANT HEADING AND PAGE NUMBERS ? + JRST CRR ;NO + MOVEI A,1(B) + MOVE B,NLL + ADD B,MARGIN + SKIPE NDHDFL + MOVE B,MAXLNL ;PUT AT RIGHT HAND OF FULL PAGE + SUB B,HBUFC + SOS B + SETZM SP15F + PUSHJ P,FXFRM ;SPACE UP TO HEADING + MOVE B,[440700,,HBUF] +HTYI3: ILDB A,B + JUMPE A,HTYI2 + PUSHJ P,PPA ;OUTPUT HEADING + JRST HTYI3 + +HTYI2: MOVE A,PAGN + PUSHJ P,DPT ;OUTPUT PAGE NUMBER IN DECIMAL + JRST CRR + +HICTOS: SKIPE DUPC + JRST HICTOA + MOVE B,PAGN + PUSHJ P,HICTOR + PUSHJ P,CRR + JRST CRR + +HICTOA: MOVEI B,3 + ADDM B,PGPOS + POPJ P, + +DUPFIL: MOVE B,TPNLFS + ADDM B,PGPOS + JRST HIGTY + +DOTYN: MOVEI A,15 ;FIRST DOTTED LINE + PUSHJ P,PPA1 + SKIPE DUPC + POPJ P, + PUSHJ P,DOTLIN + PUSHJ P,CRR + MOVEI A,14 + CLEARM FPGPOS + SKIPE FFFF + JRST PPA1 ;FORM FEED FOR DISK + POPJ P, + +TPGT: MOVE B,TPMAR ;FIRST PAGE TOP MARGIN + PUSHJ P,RATCER + CLEARM PGPOS + MOVE B,TPGTM ;GENERATE EXTRA TITLE PAGE MARGIN + SKIPE THSFLG + ADDI B,3 ;TO LINE UP WITH FUTURE PAGES + SKIPE DUPC + JRST TPGTA + PUSHJ P,RATCER + JRST PRNTR9 + +TPGTA: ADDM B,PGPOS + JRST PRNTR9 + +AHAON: SETZM OUTFLS ;SWITCH OUTPUT ON NOW + PUSH P,B + SKIPE DOTFLG + PUSHJ P,DOTYN + POP P,B + MOVEI A,-1 ;LARGE NUMBER + MOVEM A,PNST ;TO AVOID COMING HERE AGAIN + POPJ P, + +;6 CHRS ARE ASSEMBLED IN H, A NUMBER IN K +;IF TERMINATED BY CR, GME WILL BE SET, IF LITERAL, LTF WILL BE SET + +GSALV: MOVEI A,40 + PUSHJ P,TYO + MOVEI A,"? + PUSHJ P,TYO + MOVEI A,40 + PUSHJ P,TYO +GSYL: CLEARB H,LTF ;READ A SYLLABLE FROM INPUT FILE + CLEARB K,GME ;RESET CR INDICATOR + CLEARM GMINF ;RESET - INDICATOR + MOVE I,[440600,,H] +GSYL3: PUSHJ P,RCH + CAIN A,177 ;RUBOUT + JRST GSALV + CAIL A,"A + CAILE A,"Z + JRST GSYL1 +GSYL5: SETOM LTF ;ITS A LETTER +GSYL2: SUBI A,40 + TLNE I,770000 + IDPB A,I + JRST GSYL3 + +GSYL1: CAIL A,141 ;\LA + CAILE A,172 ;\LZ + JRST GSYL4 + SUBI A,40 ;CONVERT TO UPPER CASE + JRST GSYL5 ;AND TREAT LIKE LETTER + +GSYL4: CAIL A,"0 + CAILE A,"9 + JRST GSYL6 + IMULI K,10. ;ASSEMBLE DECIMAL NUMBER + ADDI K,-"0(A) + JRST GSYL2 ;ALSO ADD TO CHR STRING + + +GSYL7: SKIPGE LTF ;FOUND A - + POPJ P, ;BUT WE ARE ASSEMBLING A LITERAL-SO GIVE UP + SETOM GMINF ;INDICATE MINUS SIGN FOUND + JRST GSYL3 ;READ MORE + + +GSYL6: CAIN A,"- ;NOT LETTER OR NUMBER, IS IT - ? + JRST GSYL7 + SKIPN H + MOVEI K,1 + SKIPGE GMINF ;NO - SO END OF SYLLABLE + MOVNS K ;NEGATE IT +;COULD ALSO HACK TERMINATING SPACES HERE + CAIE A,15 + POPJ P, ;ENDED STRANGELY + SETOM GME + ;IF NOT TEXT, RETURN THE NUMBER 1 (DEFAULT VALUE) + SETOM UNRCHF + POPJ P, + +RSTR3: SOS @(H) ;BACKSPACE + JRST RSTR2 + +;(H) PLACE TO PUT NUMBER OF COLUMNS TAKEN +;1(H) PLACE TO PUT BYTE-POINTER WHILE IT GETS UPDATED +;2(H) BYTE-POINTER TO OUTPUT BUFFER +;3(H) RETURN +;INPUT TAKEN FROM INPUT FILE + + +RSTRG: CLEARM @(H) ;BUFFER LOADING ROUTINE + MOVE A,2(H) + MOVEM A,@1(H) ;COPY BYTE POINTER +RSTR2: PUSHJ P,RCH + CAME A,SEPCHR + CAIN A,15 + JRST RSTR1 ;CR ENDS STRING + CAIN A,11 + JRST RSTR4 + IDPB A,@1(H) ;DEPOSITE CHR + CAIN A,^H + JRST RSTR3 + AOS @(H) ;INCREMENT COLUMNS TAKEN + JRST RSTR2 + +RSTR4: MOVEI A,40 ;REPLACE TAB BY SPACES WHEN NOT JUSTIFYING OR FILLING + IDPB A,@1(H) + AOS @(H) + LDB A,[300,,@(H)] ;SEE IF COLUMN COUNT IS MULTIPLE OF 8. + JUMPN A,RSTR4 ;NO PUT IN MORE SPACES + JRST RSTR2 + +RSTR1: MOVEM A,TERMC ;SAVE TERMINATOR +; PUSHJ P,RCH ;HIT CR +; CAIE A,12 ;IGNORE ONE LF + SETOM UNRCHF + MOVEI A,0 + IDPB A,@1(H) ;END BYTE-STREAM WITH ONE 0 + JRST 3(H) ;RETURN + +;THE TWO TYPES OF ERROR OUTPUT ROUTINES + +ERRH: 0 + PUSH P,A + PUSH P,B + LDB B,[331100,,40] + CAIN B,3 + JRST EVALRT + CAIN B,2 + JRST EGGH2 + SOJE B,ERRH2 ;UU0 1 LONG FORM +ILLUUO: SETZM 40 ;BAD UUO + +EVALRT: .RESET TYOC, ;RESET TTY OUTPUT BUFFER (IN SYSTEM) + .LOGOUT ;GO AWAY IF TOP LEVEL + HRRZ B,40 ;NORMAL ERROR MESSAGE OUTPUT ROUTINE + .VALUE (B) + .DISMISS [ENDAR] ;START AGAIN IF RETURN FROM DDT + +EGGH2: SETZM BRFFLG + SKIPA +ERRH2: SETOM BRFFLG + HRRZ B,40 ;NORMAL ERROR MESSAGE OUTPUT ROUTINE + HRLI B,440700 +ERRH2B: ILDB A,B + JUMPE A,ERRH2A + CAIN A,"_ ;GLITCH CHR FOR CR + JRST RARCR + PUSHJ P,TYO + JRST ERRH2B +ERRH2A: SKIPE BRFFLG + PUSHJ P,PLACET ;TYPE OUT IN FILE( PAGE AND LINE) OUT FILE( PAGE AND LINE) + POP P,B + POP P,A + JRST 2,@ERRH ;RETURN + +RARCR: PUSHJ P,TYOCRR + JRST ERRH2B + +PLACET: PUSHJ P,PRNTRA ;TO AVOID HASSLE OVER TOP OF PAGE + MOVEI A,TYO + MOVEM A,TYRFL + MOVE A,PGINCN ;INPUT FILE PAGE COUNT + AOS A + MOVE B,PGINPS + PUSHJ P,PAIRP + MOVE A,PAGN + MOVE B,PGPOS + SKIPN FPGPOS ;SHOULDN'T EVER BE NON-ZERO, BUT ... + AOS A + PUSHJ P,PAIRP + PUSHJ P,TYOCRR + MOVEI A,PPA + MOVEM A,TYRFL + POPJ P, + +PAIRP: PUSH P,A + MOVEI A,40 + PUSHJ P,TYO + MOVEI A,"( + PUSHJ P,TYO + POP P,A + PUSH P,B + PUSHJ P,DPT ;OUTPUT IT + MOVEI A,", + PUSHJ P,TYO + POP P,A + PUSHJ P,DPT + MOVEI A,") + JRST TYO + +DPT: IDIVI A,10. ;DECIMAL OUTPUT ROUTINE + HRLM B,(P) ;STORE DIGITS IN LEFTHALF OF PDL WORDS + JUMPE A,.+2 + PUSHJ P,DPT ;MORE DIGITS TO COME + HLRZ A,(P) ;GET DIGITS OFF PDL AGAIN + ADDI A,"0 + JRST TYRFL@ + +DPTBE: AOS C + JRST BE + +TYOCRR: PUSH P,A ;TYPE A CR AND LF + MOVEI A,15 + PUSHJ P,TYO + MOVEI A,12 + PUSHJ P,TYO + JRST POPAJ + +;USED BY RDL4 ETC. TO SEE WHETHER . IS SPECIAL IN SOME WAY: + +;CAN IMPROVE THIS BY USING TABLES + +RLETP: MOVEI I,0 ;IS IT A LETTER ? (SET I=1 IF SO) + CAMN A,DUMMY + AOJA I,POPJP ;DUMMY ACTS LIKE LETTER + JRST RLETP1 + +LETP: MOVEI I,0 ;IS IT A LETTER OR DIGIT (SET I=1 IF SO) + CAMN A,DUMMY + AOJA I,POPJP + CAIGE A,"0 + POPJ P, + CAIG A,"9 + AOJA I,POPJP ;ITS A NUMBER +RLETP1: CAIGE A,"A + POPJ P, + CAIG A,"Z + AOJA I,POPJP ;ITS A LETTER + CAIGE A,141 + POPJ P, + CAIG A,172 + AOJA I,POPJP ;ITS A LOWER CASE LETTER + POPJ P, + +;VARIABLES + +BP: 0 + +FS: REPEAT SFS,.+1 ;FREE STORAGE CHAIN + 0 ;END OF CHAIN + +FF: FS ;POINTER TO TAIL OF CURRENT FS + +ZROINT: ;FROM HERE TO ZROEND IS RESET TO ZERO AT START +SPMD: 0 ;0 SINGLE SPACE 1 DOUBLE SPACE -SET BY .SINGLE AND .DOUBLE +;INDSS: 0 ;-1 DONT RESET INDS +INDS: 0 ;AMOUNT TO INDENT +NINDS: 0 ;NEW +CRFI: 0 ;-1 IF LAST CHR WAS CR - IN SLT +LCHAR: 0 ;LAST CHR +UNRCHF: 0 ;REREAD LAST CHR IF NOT ZERO +MXPF: 0 ;MAX POSITION USED IN BUFF SO FAR (SEE MXPF1 ALSO) +MXPF1: 0 ;LENGTH OF LINE UP TO WHERE WE CUT OFF FOR FULL LINE OUTPUT +LITF: 0 ;LITERAL FLAG +NLFS: 0 ;NUMBER LINE FEEDS EXTRA AFTER NEXT LINE +NBRKS: 0 ;NUMBER SPACES IN LINE +NPRDS: 0 ;NUMBER OF PERIODS IN LINE +SPN: 0 ;NUMBER SPACES NEEDED IN JUSTIFYING +SINCR: 0 ;SPACE INCREMENT (LEFT HALF INTEGER) +GME: 0 ;CR INDICATOR - IN GSYL +LTF: 0 ;LETTER FLAG FROM GSYL +NXLSPC: 0 ;NUMBER OF SPACES TO ADD TO NEXT LINE AFTER CURRENT OUTPUT LINE +NXLC1: 0 ;NUMBER OF SPACES AT BEGINNING OF LINE (INCLUDES INDENTATION) +DOTFLG: 0 ;GENERATE A LINE STARTING AND ENDING WITH . TO SEPERATE PAGES +TPNLFS: 0 ;NEW LINES AT TOP OF PAGE AFTER A .FIGURE THAT DIDN'T FIT +TPNLFN: 0 ;NEW OF SAME +BSINHB: 0 ;IF NON-ZERO BACKSPACES ARE OUTPUT DIRECTLY +;ADJF: 0 ;ADJUST FLAG: -1 = ADJUST, 0 = NO ADJUST +PGCMFL: 0 ;ON DURING .PAGE COMMAND +PGSPFL: 0 ;ON DURING .SPACE OR .PAGE +PGPOS: 0 ;LINE NUMBER ON PAGE, 1 = FIRST LINE +PAGN: 0 ;PAGE NUMBER 1 = FIRST PAGE +JERRF: 0 ;SET IF MORE THAN ONE SPACE NEEDED PER SPACE +C240S: 0 ;COUNT OF 240S (MARKED SPACES INSERTED BY JUSTIFIER) +PRNCRS: 0 ;COUNT OF PRINTED CHRS IN A POSITION +CBUFC: 0 ;NUMBER OF COLUMNS TAKEN IN CBUF +CBUFP: 0 ;BYTE POINTER INTO CBUF +GMINF: 0 ;SYLLABLE HAS MINUS SIGN - IN GSSYL +PNST: 0 ;0 OR PAGE TO START WITH +OUTFLS: 0 ;-1 TO FLUSH OUTPUT +AUNDT: 0 ;AMOUNT TO UNDENT +CENTF: 0 ;ON DURING .SPACE & .CENTER +GENNUM: 0 ;NUMBER GENED +CONTEN: 0 ;ON FOR TABLE OF CONTENTS +DOTPOS: 0 ;. OR : OR ? STORED +PGINCN: 0 ;COUNT OF PAGES IN INPUT FILE +PGINPS: 0 ;LINE COUNT ON INPUT FILE +FPGPOS: 0 ;LINE COUNT ON OUTPUT FROM VERY TOP OF PAGE +ROTPNT: 0 ;SAVED POINTER TO COMMAND FOR ERROR OUTPUT +BLCKNT: 0 ;.BLOCK COUNT +;BDNDFL: 0 ;BAD END FLAG +TYRFL: 0 ;OUTPUT SWITCH FOR DPT, TTY, OUTPUT FILE,TO INTERNAL BUFFER +BRFFLG: 0 ;TELLS IF ERROR OR STANDARD PRINTING UUO +EPGIN: 0 ;EPAGE INCREMENT +EPGINN: 0 ;NEW EPAGE INCREMENT +DUPC: 0 ;-1 SAYS DUPLICATE COMMANDS +RGHCN: 0 ;0 FOR CENTER, -1 FOR RIGHT +THSFLG: 0 ;CAUSES PAGE-NUMBERS TO BE INSIDE TOPMARGIN +NDHDFL: 0 ;PAGE NUMBERS LINED UP TO MAXLNL +OUTDFL: 0 ;MERELY COPY INPUT FILE +CASE: 0 ;0 INITIALLY 200-LOWER, 400 UPPER +TABFLG: 0 ;TO OUTPUT TABS +JMODE: 0 ;1 JUSTIFY AND FILL, 0 FILL, -1 DO NOTHING +NJMODE: 0 ;NEW JMODE +CONFLG: 0 ;ON DURING LAST LINE OF SECTION TITLE +CNTFL: 0 ;COUNTS NUMBER OF TIMES WE GO TO RDL2B DURING SECTION TITLE +UPTOPT: 0 ;OUT OF PHASE INDICATOR +NVRADJ: 0 ;NON-ZERO TO CAUSE NO ADJUSTING AT ALL TO HAPPEN +IOPUSD: 0 ;COUNTER OF HOW MANY LEVELS WE WENT VIA .INSRT'S +APPFLG: 0 ;0 FOR INSRT, -1 FOR APPND +OFSTCN: 0 ;OFFSET COUNT +STPCHR: 0 ;CHARACTER TO STOP ON +HYPCHR: 0 ;CHARACTER TO HIDE HYPHEN +DUMMY: 0 ;CHARACTER TO BE REPLACED BY SPACE ON OUTPUT +SEPCHR: 0 ;TERMINATOR IN SPREAD +ZROEND: + + +NQUOTE: "# ;QUOTE CHARACTER +EXL: "! ;OR -1 +QST: "? ;OR -1 +DTS: ". ;OR -1 +COL: ": ;OR -1 +SMC: "; ;0R -1 +MNS: "- ;OR -1 +SPACEX: 40 ;SPACE +LNL: 73. ;LINE LENGTH -SET BY .LINE ACTUALLY MODIFIED BY NXLSPC AND INDS +NLL: 73. ;NEW LINE LENGTH +MAXLNL: 79. ;FULL PAGE WIDTH IN CHRS -SET BY .PAPERW +PL: 50. ;PAPER LENGTH -SET BY .PAPER +;NPL: 50. ;NEW PAPER LENGTH +MAXPL: 66. ;FULL PAGE LENGTH IN LINES -SET BY .PSIZE +SWITFL: 1 ;USE SWITCH IF NEG +DIRSCN: -1 ;DIRECTION OF JUSTIFING SCAN +PGNMBS: -1 ;ALLOWS HEADING AND PAGE NUMBERING TO APPEAR +BKSGB: 0 ;LST CHR WAS A BACKSPACE +BKSPP: 0 ;POINTER INTO BKSTB (BS BUFFER) +TLKFLG: 0 ;TO CAUSE INPUT FROM TTY +FFFF: 0 ;-1 SAYS SUPPLY FF AT END OF PAGE (NOT ON FOR LPT AND TTY) +SP15F: -1 ;SUPPLY MARGIN FLAG +;COPIES: 0 ;NUMBER OF COPIES TO BE GENERATED +WAITF: -1 ;-1 SAYS WAIT AT TOP OF EACH NEW PAGE +MARGIN: 3 ;LEFT (AND HOPEFULLY RIGHT) MARGIN +HBUFC: 5 ;NUMBER COLUMNS TAKEN BY TEXT IN HBUF +HBUFP: 0 ;BYTE-POINTER INTO HBUF +TPMAR: 8 ;TOP MARGIN IN LINES COUNTING HEADING +BMAR: 8 ;BOTTOM MARGIN IN LINES +TPGTM: 0 ;EXTRA TOP MARGIN OF TITLE PAGE +IDUPF: 0 ;-1 SAYS DUP INPUT +PRCNT: 60. ;PERCENT OF PAGING MARGIN WHICH GOES AT TOP OF PAGE +PRSNT: 60. ;PERCENT OF LINE MARGIN WHICH GOES ON LEFT SIDE +CMSTR: CMSW ;POINTER INTO END OF LINE ARRAY +NOHCKS: 0 ;INDICATES SPACE EVEN AT TOP OF PAGE AND DON'T LEAVE OUT POSSIBLE LAST LINE +SPCDUM: SPACEX ;RESET BY .COPY TO DUMMY +TERMC: 0 ;TERMINATOR IN RSTRG +CBUF1: 0 ;COUNT FOR FIRST FIELD IN SPREAD +CBUF2: 0 ;SECOND FIELD +CBUF3: 0 ;THIRD FIELD + +GNUM: PUSHJ P,GSYL ;READ A NUMBER, LEAVE IN K + SKIPN LTF + POPJ P, + PUSHJ P,AERLIN + BARF NON-NUMERIC ARGUMENT + POPJ P, + +CMONE: MOVEM K,CMSTR@ ;STORE END OF LINE ROUTINE ADDRESS + AOS K,CMSTR + CAIGE K,CMSW+CMSWL + POPJ P, + BARF TOO MANY EOL CALLS + SOS CMSTR + POPJ P, + +AERLIN: MOVE B,ROTPNT ;OUTPUT COMMAND + MOVE H,COMT(B) + JRST GCOM7 + +;VARIOUS ROUTINES TO HANDLE COMMANDS + +;SOME COMMANDS LIKE TO DO THINGS AT THE END OF THE NEXT OUTPUT LINE +;THIS CAN BE DONE IN TWO WAYS: +;SAVE PARAMTERS NOW, THEN SWAP THEM IN IN MNLP OR +;GENERATE AN END OF LINE ROUTINE AND PUT ITS ADRESS INTO CMSW + +ALINE: PUSHJ P,GNUM ;.LINE, SETS LNL + MOVEM K,NLL +ALIN2: SUB K,MAXLNL +ALIN1: IMUL K,PRSNT + IDIVI K,100. + MOVNM K,MARGIN ;IF MARGIN < 0, NONE APPEARS + POPJ P, ;SO IN EFFECT MAXLNL > OR = LNL. + +APAPER: PUSHJ P,GNUM ;.PAPERW, SETS MAXLNL + MOVEM K,MAXLNL + SUB K,NLL + MOVNS K + JRST ALIN1 + +ALIT: SETOM LITF ;.LITERA + POPJ P, + +APS: PUSHJ P,GNUM ;.PSIZE, SETS MAXPL + MOVEM K,MAXPL + SUB K,PL + JRST APL1 + +APL: PUSHJ P,GNUM + MOVEM K,PL +APL2: SUB K,MAXPL + MOVNS K +APL1: MOVEM K,BMAR + IMUL K,PRCNT + IDIVI K,100. + CAIGE K,5 ;DO WE HAVE 5 LINES FOR TOP + MOVEI K,5 ;NO + MOVEM K,TPMAR ;PRCNT OF EXTRA LINES IN TOP MARGIN + SUB K,BMAR ;REST IN BOTTOM MARGIN + MOVNM K,BMAR + POPJ P, ;IF MARGIN < 0 IT, NONE APPEARS + ;SO IN EFFECT MAXPL > OR = PL+5 + +ARIN: PUSHJ P,GNUM ;.RINDEN + ADDM K,NINDS + POPJ P, + +AIND: PUSHJ P,GNUM ;.INDENT + MOVEM K,NINDS + POPJ P, + +AUND: PUSHJ P,GNUM ;.UNDENT + MOVNM K,AUNDT + MOVEI K,AUND1 ;DO AUND1 AT END OF LINE TO PUT IN UNDENTING + JRST CMONE + +AOFSE1: SKIPA K,OFSTCN +AUND1: MOVE K,AUNDT ;CALL AT END OF LINE AFTER .UNDENT + ADDB K,INDS ;HOW ABOUT JUST ADDM K,NINDS - POPJ P, + SKIPGE K + CLEARB K,INDS ;IF INDENTATION WORKS OUT NEGATIVE, SET IT TO ZERO + MOVE A,NLL ;RECALCULATE LINE-LENGTH + SUB A,NXLSPC + SUB A,INDS ;? + MOVEM A,LNL ;LNL=NLL-NXLSPC-INDS + POPJ P, + +AOFFSE: PUSHJ P,GNUM + ADDM K,NINDS + MOVEM K,OFSTCN + MOVEI K,AOFSE1 + JRST CMONE + +ASS: SKIPA K,[0] ;.SINGLE +ADS: MOVEI K,1 ;.DOUBLE + MOVEM K,SPMD + POPJ P, + +ADUMM: PUSHJ P,RCH ;.DUMMY + SKIPN DUPC ;DON'T .DUMMY WHILE IN .COPY MODE + MOVEM A,DUMMY + POPJ P, + +AQUOTE: PUSHJ P,RCH + CAIE A,15 + CAIN A,12 + SETOM A + MOVEM A,NQUOTE + POPJ P, + +ACOPY: PUSHJ P,GNUM ;.COPY + MOVNM K,DUPC + MOVEI A,SPACEX + SKIPE K + MOVEI A,DUMMY + MOVEM A,SPCDUM ;PREVENT DUMMYS FROM ACTUALLY BEING REPLACED IN OUTPUT + JUMPE K,POPJP + SKIPE FFFF + SETOM BSINHB + SETOM MNS + SETOM HYPCHR + POPJ P, + +ANVRAD: MOVNM K,NVRADJ ;.NVRADJ + POPJ P, + +ANF: SETOM NJMODE ;.NOFILL +ANJ: SKIPLE NJMODE ;.NOJUST + SETZM NJMODE + POPJ P, + +AADJ: MOVEI A,1 ;.ADJUST + MOVEM A,NJMODE + POPJ P, + +AFILL: SKIPGE NJMODE ;.FILL + AOS NJMODE + POPJ P, + +ARIGHT: MOVEI K,ACNUT1 ;.RIGHT + JRST CMONE + +ACENT: MOVEI K,ACNET1 ;.CENTER + JRST CMONE + +ACNUT1: SETOM RGHCN + SKIPA +ACNET1: SETZM RGHCN + PUSHJ P,PRNTRA ;DO AT END OF LINE AFTER .CENTER +ACNET3: PUSHJ P,RCH + CAIE A,15 + CAIN A,12 + JRST ACNET3 + CAIE A,40 ;IGNORE LEADING SPACES AND TABS + CAIN A,11 + JRST ACNET3 + SETOM UNRCHF + + JSP H,RSTRG ;SET UP LINE IN CBUF + CBUFC + CBUFP + 440700,,CBUF + + MOVE B,NLL ;LINE LENGTH + SUB B,CBUFC ;LENGTH OF TEXT TO BE CENTERED + SKIPN RGHCN ;DON'T HALF FOR .RIGHT + ASH B,-1 ;CALCULATE SPACES NEEDED + SKIPGE B + BARF CENTERED LINE TOO LONG + PUSHJ P,SPAZIR + + JSP H,PSTRG ;PUT IN OUTPUT + 440700,,CBUF + + JRST PRNX ;PUT IN CR(S) + +;(H) IS BYTE POINTER TO STRING DELIMITED BY 0 BYTE +;1(H) RETURN + +PSTRG: MOVE B,(H) ;PUT BYTE-STREAM IN OUTPUT +PSTRG1: ILDB A,B + JUMPE A,1(H) ;RETURN ON ZERO BYTE + CAMN A,STPCHR + JRST WAITIN + CAME A,HYPCHR + PUSHJ P,PPA ;PUT IT IN OUTPUT + JRST PSTRG1 + +WAITIN: PUSHJ P,NOISTY + JRST PSTRG1 + + +AHEAD: SETZM UNRCHF + PUSHJ P,RCH + CAIE A,12 + SETOM UNRCHF + ;.HEADIN - + JSP H,RSTRG ;PUT IT IN HEADIN HBUF + HBUFC + HBUFP + 440700,,HBUF + + MOVE A,HBUFC + CAIL A,120. + BARF HEADING TOO LONG + SETOM UNRCHF + POPJ P, + +APAUSE: .IOT A,TYIC + CAIN A,177 + VAL + CAIE A,15 + JRST APAUSE + POPJ P, + +ABLOCK: PUSHJ P,GNUM ;.BLOCK + SKIPE SPMD + LSH K,1 + SKIPE SPMD + AOS K + CAML K,PL + POPJ P, ;CHOMP, HEWITT !! + MOVEM K,BLCKNT + MOVEI K,ABLO1 + JRST CMONE + +ABLO1: MOVE K,PL + SUB K,PGPOS + CAML K,BLCKNT + POPJ P, ;ENOUGH SPACE + SETOM PGSPFL ;NEED TO DO .PAGE + JRST ASPC3 + +AEPAGE: PUSHJ P,GNUM ;.EPAGE + ADDM K,EPGINN + MOVEI K,AEPA1 + JRST CMONE + +AEPA1: MOVE K,EPGINN + SETZM EPGINN + ADDM K,EPGIN + POPJ P, + +APD: MOVEI K,ASP3O ;ODD PAGE FORCE + JRST AUPYR + +APV: MOVEI K,ASP3E ;EVEN PAGE FORCE + JRST AUPYR + +AENDP: PUSHJ P,GNUM ;? + SOS K + ADDM K,EPGIN + MOVEI K,ASPC3 ;.PAGE + JRST AUPYR + +ASP3E: MOVE K,PAGN + ADD K,EPGIN + TRNN K,1 + AOS EPGIN + JRST ASPC3 + +ASP3O: MOVE K,PAGN + ADD K,EPGIN + TRNE K,1 + AOS EPGIN + JRST ASPC3 + +ASPC: PUSHJ P,GNUM ;.SPACE + SKIPE SPMD ;DOUBLE LFS IN DOUBLE MODE + ASH K,1 + ADDM K,NLFS + MOVEI K,ASPC1 +AUPYR: SETOM PGSPFL + JRST CMONE + +ASPC3:ASPC4: MOVE K,PL ;USED BY .PAGE AT END OF LINE + SUB K,PGPOS + ADDI K,2 + MOVEM K,NLFS ;LINES AFTER PRESENT ONE + SETOM PGCMFL ;INDICATE THAT WE ARE DOING A .PAGE + SKIPA +ASPC1:; JUMPN C,MANWEN +ASPC1A: PUSHJ P,PRNTRA + SKIPE PAGN ;? SKIP IF PAGE ONE SKIPE NOHCKS + JRST ASPAS1 + MOVE A,NLFS + SKIPE SPMD + LSH A,-1 + ADD A,PGPOS + SKIPE THSFLG + SUBI A,3 ;FOR THREE LINES IN THESIS MODE + SOSLE A ;IF ONLY ONE OR TWO LINES TO DO, ?? ... +ASPAS1: SKIPG NLFS + JRST ASPC2 + PUSHJ P,PRNXYZ ;SPACE DOWN PAGE (UNTIL NLFS RESET TO 0 BY NPG) + SOS NLFS + SKIPE SPMD + SOS NLFS + JRST ASPC1A + +PRNXYZ: SKIPN DUPC + JRST PRNX + AOS PGPOS + AOS FPGPOS + SKIPN SPMD + POPJ P, + AOS PGPOS + AOS FPGPOS + POPJ P, + +ASPC2: SKIPE NOHCKS + JRST ASPAS2 + MOVE A,PL + SUB A,PGPOS + SKIPE SPMD + LSH A,-1 + SOJLE A,ASPC4 ;CLOSE TO BOTTOM ? ? +ASPAS2: CLEARM NLFS + POPJ P, ;GO HERE IF .SPACE OR .PAGE IS HAPPENING + +AFIGUR: PUSHJ P,GNUM ;.FIGURE + SKIPE SPMD + ASH K,1 + ADDM K,TPNLFN + SETZM PGSPFL + MOVEI K,ASPC5 + JRST CMONE + +ASPC5: MOVE K,TPNLFN + SETZM TPNLFN + MOVEM K,TPNLFS + MOVE K,PL ;USED BY .FIGURE AT END OF LINE + SUB K,PGPOS ;LINES LEFT ON PAGE + CAMG K,TPNLFS ;ENOUGH SPACE ? + POPJ P, ;NO - SO LET HAPPEN AT TOP OF NEXT PAGE + + MOVE K,TPNLFS + SETZM TPNLFS + PUSH P,NLFS + MOVEM K,NLFS + PUSHJ P,ASPC1A + POP P,NLFS + POPJ P, + +ATRANS: PUSH P,B +ATRAN1: PUSHJ P,RCH + MOVE B,A + PUSHJ P,RCH + MOVEM A,TRNTBL(B) + PUSHJ P,RCH + CAIN A,", + JRST ATRAN1 + SETOM UNRCHF + POP P,B + POPJ P, + +ASTPCH: PUSHJ P,RCH + MOVEM A,STPCHR + POPJ P, + +AHYPCH: PUSHJ P,RCH + SKIPN DUPC ;? + MOVEM A,HYPCHR + POPJ P, + +ADOTS: PUSHJ P,GNUM + SKIPN DUPC + MOVNM K,DOTFLG ;.DOTS + POPJ P, + +ABSPDI: PUSHJ P,GNUM + SKIPN DUPC ;? + MOVNM K,BSINHB ;BSPDIR + POPJ P, + +AEND: +; SETZM BDNDFL ;INDICATE GOOD END + MOVEI K,ENDER ;.END + JRST CMONE + +ABEGIN: PUSHJ P,GNUM ;.BEGIN + MOVEM K,PNST ;PAGE TO START OUTPUT AT + SETOM OUTFLS ;SWITCH OFF OUTPUT + POPJ P, + +APGN: PUSHJ P,GNUM ;.GPN + SOS K + MOVEM K,PGNMBS + POPJ P, + +AGENNU: SKIPE DUPC + POPJ P, + PUSHJ P,GNUM ;GENNUM + ADDM K,GENNUM + MOVE A,GENNUM + MOVEI K,DPTBE + SKIPGE JMODE + JRST NOFULA + SKIPG C + SETOM C ;AT BEGINNING OF NEW LINE +NOFUNA: MOVEM K,TYRFL + PUSHJ P,DPT ;OUTPUT GENED NUMBER + MOVEI K,PPA + MOVEM K,TYRFL + SKIPGE JMODE + JRST PRNX ;NEW LINE IF IN NOFILL MODE + AOS C + MOVEI A,40 ;ELSE PUT IN SPACE + JRST BE + +NOFULA: PUSHJ P,PRNTRA ;IN CASE AT TOP OF PAGE + MOVEI K,PPA + MOVE A,GENNUM + JRST NOFUNA + +ACONT: PUSHJ P,GNUM + MOVNM K,OUTFLS + MOVNM K,CONTEN + MOVEI A,-1 + SKIPN K + MOVEI A,0 + MOVEM A,PNST + JUMPE K,POPJP + SETZM TABFLG + POPJ P, + AHYPH: PUSHJ P,GNUM ;HYPHEN +AHYPH1: MOVEI A,-1 + SKIPN DUPC + SKIPN K + MOVEI A,"- + MOVEM A,MNS + POPJ P, + +APERI: PUSHJ P,GNUM +APERI1: MOVEI A,-1 + SKIPN K + MOVEI A,"! + MOVEM A,EXL + SKIPN K + MOVEI A,"? + MOVEM A,QST + SKIPN K + MOVEI A,": + MOVEM A,COL + SKIPN K + MOVEI A,". + MOVEM A,DTS + SKIPN K + MOVEI A,"; + MOVEM A,SMC + POPJ P, + +ASECT: SKIPN CONTEN ;SECT + POPJ P, ;IGNORE IF NOT LISTING TABEL OF CONTENTS + MOVEI K,SECTX + JRST CMONE + +SECTX: PUSHJ P,PRNTRA ;TO AVOID TOP OF PAGE HASSLE + PUSHJ P,RCH ;IGNORE CR + PUSHJ P,RCH ;GOBBLE LF + CAIN A,12 + PUSHJ P,RCH ;IGNORE LF + SETZM OUTFLS + CAIN A,15 + JRST SECTYX + SETOM UNRCHF + SETZM SP15F + SETOM CNTFL ;COUNTS TIMES WE GOT TO RDL2B + POPJ P, + +ATABS: +AT2741: +AK2741: +AC2741: +AS2741: +A27COM: POPJ P, + +AOUTDI: PUSHJ P,GNUM + MOVNM K,OUTDFL + POPJ P, + +SECTYX: PUSHJ P,RCH + CAIE A,12 + SETOM UNRCHF + SKIPGE JMODE + JRST SECTOM + PUSHJ P,CRROF + SETOM OUTFLS + POPJ P, + +SECTOM: SETOM DUPC + PUSHJ P,PRNX ;TO MAKE SURE WE GET RIGHT COUNT IN NOFILL MODE + SETZM DUPC + SETOM OUTFLS + POPJ P, + +SECTY: PUSH P,A ;AT END OF COPYING SECTION HEADING + PUSH P,B +SECTY1: MOVE B,NLL + SUB B,N + SOJLE B,NWLINS + MOVE A,PAGN + SKIPN FPGPOS ;SHOULDN'T EVER BE ZERO, BUT ... + AOS A + PUSHJ P,FXFRM + PUSHJ P,DPT + SETOM DUPC + PUSHJ P,PRNX + SETZM DUPC + SETOM OUTFLS + JRST POPBJ + +FXFRM: CAILE A,9. + SOS B + CAILE A,99. + SOS B + PUSH P,A + PUSHJ P,SPAZIG + JRST POPAJ + +NWLINS: PUSHJ P,CRROF ;WON'T FIT ON ONE LINE + SETZM SP15F + JRST SECTY1 + +ATOPP: PUSHJ P,GNUM ;TOPM + MOVEM K,PRCNT + MOVE K,PL + JRST APL2 + +ASIDP: PUSHJ P,GNUM ;SIDM + MOVEM K,PRSNT + MOVE K,NLL + JRST ALIN2 + +ATHES: PUSHJ P,GNUM ;THESIS + MOVNM K,THSFLG + POPJ P, + +AGENST: PUSHJ P,GNUM ;GENSET + MOVEM K,GENNUM + POPJ P, + +APGNR: PUSHJ P,GNUM ;PGNRGH + MOVNM K,NDHDFL + POPJ P, + +ATABSE: POPJ P, + +AQUICK: POPJ P, + +ANOWT: PUSHJ P,GNUM + SOS K + MOVEM K,WAITF + POPJ P, + +AAPPND: SETOM APPFLG + SKIPA +AINSRT: SETZM APPFLG + PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,D + PUSH P,E + SETZM UNRCHF + TRO Z,-1 ;TO STOP ARROWS + PUSHJ P,CMD + SKIPE APPFLG + .CLOSE UTYIC, + SKIPN APPFLG + PUSHJ P,FILPUH + PUSHJ P,OPNRD + JRST ENDAR ;IF FAILED TO OPEN +POPEJ: POP P,E +POPDJ: POP P,D +POPCJ: POP P,C +POPBJ: POP P,B +POPAJ: POP P,A +POPJP: POPJ P, + + +FILPUH: AOS A,IOPUSD + CAIL A,10 + JRST PSHFAR + .IOPUSH UTYIC, + POPJ P, + +PSHFAR: PRINT _TOO MANY NESTED INSRTS_ + SOS IOPUSD + SUB P,[1,,1] + POP P,E + POP P,D + POP P,C + POP P,B + POP P,A + JRST ENDER ;? NO WIN ? + +ASTOP: SKIPN FFFF + PUSHJ P,NOISTZ + POPJ P, + +ALS: PUSHJ P,GNUM ;LS + MOVNM K,NOHCKS + POPJ P, + +ASPREA: MOVEI K,ASPRE1 + JRST CMONE + +ASPRE1: PUSHJ P,PRNTRA +ASPRE2: SKIPE DUPC + JRST ANOTH ;IN COPY MODE,JUST COPY NEXT LINE + PUSHJ P,RCH + CAIE A,15 + CAIN A,12 + JRST ASPRE2 + MOVEM A,SEPCHR + + JSP H,RSTRG + CBUF1 + CBUFP + 440700,,CBUF + + JSP H,PSTRG + 440700,,CBUF + + SETZM UNRCHF + MOVE A,TERMC + CAIN A,15 + JRST ASPRE4 ;ONLY ONE ARG + + JSP H,RSTRG + CBUF2 + CBUFP + 440700,,CBUF + + MOVE B,NLL + SUB B,CBUF2 + ASH B,-1 + SUB B,CBUF1 + SKIPGE B + SETZM B + ADDM B,CBUF2 + PUSHJ P,SPAZIR ;PUT IN SPACES + + JSP H,PSTRG + 440700,,CBUF + + SETZM UNRCHF + MOVE A,TERMC + CAIN A,15 + JRST ASPRE4 + + JSP H,RSTRG + CBUF3 + CBUFP + 440700,,CBUF + + MOVE B,NLL + SUB B,CBUF3 + SUB B,CBUF2 + SUB B,CBUF1 + SKIPGE B + SETZM B + ADDM B,CBUF3 + + PUSHJ P,SPAZIR ;PUT IN SPACES + + JSP H,PSTRG + 440700,,CBUF + + SETZM UNRCHF + MOVE A,TERMC +ASPRE3: CAIN A,15 + JRST ASPRE4 + PUSHJ P,RCH + JRST ASPRE3 + +ASPRE4: SETOM UNRCHF + SETOM SEPCHR + JRST PRNX + +ANOTH: + JSP H,RSTRG + CBUFC + CBUFP + 440700,,CBUF + + JSP H,PSTRG + 440700,,CBUF + + SETOM UNRCHF + JRST PRNX + +ASWITC: MOVNS SWITFL + POPJ P, + +COMT: SIXBIT /SP/ ;SEARCHED LINEARLY FROM THIS END + SIXBIT /SPACE/ + SIXBIT /PA/ + SIXBIT /PAGE/ + SIXBIT /BR/ + SIXBIT /BREAK/ + SIXBIT /IN/ + SIXBIT /INDENT/ + SIXBIT /UN/ + SIXBIT /UNDENT/ + SIXBIT /RIN/ + SIXBIT /RINDEN/ + SIXBIT /SS/ + SIXBIT /SINGLE/ + SIXBIT /DS/ + SIXBIT /DOUBLE/ + SIXBIT /BP/ + SIXBIT /BEGIN/ + SIXBIT /NC/ + SIXBIT /NF/ + SIXBIT /NOFILL/ + SIXBIT /FI/ + SIXBIT /CO/ + SIXBIT /FILL/ + SIXBIT /NJ/ + SIXBIT /NOJUST/ + SIXBIT /FO/ + SIXBIT /AD/ + SIXBIT /ADJUST/ + SIXBIT /L/ + SIXBIT /LL/ + SIXBIT /LINE/ + SIXBIT /LIT/ + SIXBIT /LITERA/ + SIXBIT /PL/ + SIXBIT /PAPER/ + SIXBIT /EP/ + SIXBIT /EPAGE/ + SIXBIT /HE/ + SIXBIT /HEADER/ + SIXBIT /HEADIN/ + SIXBIT /CE/ + SIXBIT /CENTER/ + SIXBIT /COPY/ + SIXBIT /CONTEN/ + SIXBIT /SECT/ + SIXBIT /SECTIO/ + SIXBIT /GENNUM/ + SIXBIT /GENSET/ + SIXBIT /END/ + SIXBIT /C/ + SIXBIT /CM/ + SIXBIT /COMMEN/ + SIXBIT /PGN/ + SIXBIT /PAPERW/ + SIXBIT /PL/ + SIXBIT /PS/ + SIXBIT /PSIZE/ + SIXBIT /PGNRGH/ + SIXBIT /DUMMY/ + SIXBIT /DUMCHR/ + SIXBIT /DOTS/ + SIXBIT /BSPDIR/ + SIXBIT /FIGURE/ + SIXBIT /CP/ + SIXBIT /BLOCK/ + SIXBIT /HYPHEN/ + SIXBIT /PERIOD/ + SIXBIT /RA/ + SIXBIT /RIGHT/ + SIXBIT /TOPM/ + SIXBIT /SIDM/ + SIXBIT /THESIS/ + SIXBIT /S2741/ + SIXBIT /SBALL/ + SIXBIT /C2741/ + SIXBIT /CBALL/ + SIXBIT /T2741/ + SIXBIT /TBALL/ + SIXBIT /K2741/ + SIXBIT /KBALL/ + SIXBIT /OUTDIR/ + SIXBIT /TABS/ + SIXBIT /TABSET/ + SIXBIT /QUICK/ + SIXBIT /QUOTE/ + SIXBIT /QTECHR/ + SIXBIT /TSTOUT/ + SIXBIT /NOWAIT/ + SIXBIT /TR/ + SIXBIT /TRANS/ + SIXBIT /NVRADJ/ + SIXBIT /IM/ + SIXBIT /INSRT/ + SIXBIT /AP/ + SIXBIT /APPND/ + SIXBIT /STOP/ + SIXBIT /OF/ + SIXBIT /PV/ + SIXBIT /PD/ + SIXBIT /LS/ + SIXBIT /STPCHR/ + SIXBIT /HYPCHR/ + SIXBIT /SPREAD/ + SIXBIT /SWITCH/ + SIXBIT /PAUSE/ +COML==.-COMT + +DEFINE CM A/ + A + A +TERMIN + +DEFINE DM A/ + A + A + A +TERMIN + +COMDT1: CM AUTOB,,ASPC ;SPACE + CM AUTOB,,AENDP ;PAGE + CM AUTOB,,POPJP ;BREAK + CM AUTOB,,AIND ;INDENT + CM AUTOB,,AUND ;UNDENT + CM AUTOB,,ARIN ;RINDEN + CM AUTOB,,ASS ;SINGLE + CM AUTOB,,ADS ;DOUBLE + CM AUTOB,,ABEGIN ;BEGIN + DM AUTOB,,ANF ;NOFILL + DM AUTOB,,AFILL ;FILL + CM AUTOB,,ANJ ;NOJUST + DM AUTOB,,AADJ ;ADJUST + DM AUTOB,,ALINE ;LINE + CM ALIT ;LITERA + CM AUTOB,,APL ;PAPER + CM AEPAGE ;EPAGE + DM AHEAD ;HEADER + CM AUTOB,,ACENT ;CENTER + AUTOB,,ACOPY ;COPY + AUTOB,,ACONT ;CONTEN + CM AUTOB,,ASECT ;SECT + AGENNU ;GENNUM + AGENST ;GENSET + AUTOB,,AEND ;END + DM POPJP ;COMMEN + AUTOB,,APGN ;PGN + AUTOB,,APAPER ;PAPERW + DM AUTOB,,APS ;PSIZE + AUTOB,,APGNR ;PGNRGH + CM AUTOB,,ADUMM ;DUMMY + AUTOB,,ADOTS ;DOTS + AUTOB,,ABSPDI ;BSPDIR + AFIGUR ;FIGURE + CM AUTOB,,ABLOCK ;BLOCK + AUTOB,,AHYPH ;HYPHEN + AUTOB,,APERI ;PERIOD + CM AUTOB,,ARIGHT ;RIGHT + AUTOB,,ATOPP ;TOPM + AUTOB,,ASIDP ;SIDM + AUTOB,,ATHES ;THESIS + CM AUTOB,,AS2741 ;S2741 + CM AUTOB,,AC2741 ;C2741 + CM AUTOB,,AT2741 ;T2741 + CM AUTOB,,AK2741 ;K2741 + AUTOB,,AOUTDI ;OUTDIR + AUTOB,,ATABS ;TABS + AUTOB,,ATABSE ;TABSET + AUTOB,,AQUICK ;QUICK + CM AUTOB,,AQUOTE ;QUOTE + AUTOB,,TSTOUT ;TSTOUT + AUTOB,,ANOWT ;NOWAIT + CM AUTOB,,ATRANS ;TRANS + AUTOB,,ANVRAD ;NVRADJ + CM AINSRT ;INSRT + CM AAPPND ;APPND + AUTOB,,ASTOP ;STOP + AUTOB,,AOFFSE ;OFFSET + AUTOB,,APV ;PV-EVEN PAGE FORCE + AUTOB,,APD ;PD-ODD PAGE FORCE + AUTOB,,ALS ;LS-LEADING BLANK LINES + AUTOB,,ASTPCH ;STPCHR + AUTOB,,AHYPCHR ;HYPCHR + AUTOB,,ASPREA ;SPREAD + AUTOB,,ASWITC + AUTOB,,APAUSE + +IFN .-COMDT1-COML,[ + PRINTC /COMMANDS DONT MATCH + / +] + + CONSTANTS + VARIABLES + +TRNTBL: BLOCK 200 +HBUF: ASCIZ /PAGE / + BLOCK 30 ;HEADIN BUFFER - 120. CHARACTERS +CBUF: ;CENTERED LINE GETS ASSEMBLED HERE, ALSO USED FOR UNFILLED TEXT +CMBUF: BLOCK 70 ;COMMAND (FILE SPEC) BUFFER - 280. CHARACTERS +BUFF: BLOCK BUFSIZ ;CONTAINS CHRS, MARKED CHRS AND POINTERS INTO CHAINS +PDL: BLOCK PDLL +CMSW: BLOCK CMSWL ;CALLS AT END OF LINE GET SAVED HERE +BKSTB: BLOCK 100 ;LHS COLUMN CHR OCCURED IN, RHS IS CHR - BACKSPACED +PAT: PATCH: BLOCK 20 + +CORSIZ==<.+1777>_-10. + +END BEG +  \ No newline at end of file