TITLE XEROX RUNLENGTH ENCODER .MLLIT==1 A=1 B=2 C=3 D=4 E=5 F=6 G=7 X=10 Z=11 Y=12 X0=13 Y0=14 XY=15 Q=16 P=17 OPTCMD==40000 IN==1 OUT==2 TI==3 TO==4 ERRI==5 XORG==0 YORG==0 XBITL==54.*32. YBITL==54.*32. ;=1728 WDPSL==<+35.>/36. NPGS==<*WDPSL+1777>/2000 BUFL==40 INOP: SIXBIT / &DSK PLX/ FRMSNM: 0 CHSTS: BLOCK 10 ;FOR .FDELE OUTP: SIXBIT / 'DSK> SCN/ TOSSNM: 'COMMON TTIPN: SIXBIT / TTY/(30) 0 0 TTOPN: 1,,(SIXBIT/TTY/) 0 0 NMSWT: 0 ;FILE NAME SWITCH FRMTSW: 0 ;FROM-TO SWITCH QDL: "! BLOCK 100. PDL: BLOCK 40 START: .OPEN TI,TTIPN .VALUE .OPEN TO,TTOPN .VALUE SETZM JCLFLG' SKIPN FRMSNM ;AVOID DOING AGAIN ON RESTART .SUSET [.RSNAM,,FRMSNM] MOVEI P,PDL SETZM GOFLG' SETZM GOTONE MOVEI G,[SIXBIT /XPLT RUN-ENCODED!/] PUSHJ P,TYPIT TTINR: MOVE A,[[SIXBIT / 'DSK> SCN COMMON/],,OUTP] BLT A,TOSSNM SETZM NMSWT SETOM FRMTSW MOVE Q,[-100,,QDL] SKIPE JCLFLG JRST CNTRLX ;EXIT NOW AFTER JCL PROCESSED .SUSET [.ROPTION,,A] TLNE A,OPTCMD JRST [ SETZM QDL+1 ;FOR COMMAND BUFFER MOVE Q,[QDL+1,,QDL+2] BLT Q,QDL+20 MOVSI Q,(^M_35) ;CR FOR FENCE MOVEM Q,QDL+21 .BREAK 12,[5,,QDL+1] SETOM JCLFLG' MOVE Q,[440700,,QDL+1] JRST AGAIN] .IOT TO,[15] .IOT TO,[12] .IOT TO,[52] AGAST: SKIPE GOFLG JRST GOGO .IOT TI,A ;ASSEMBLE ONE LINE OF INPUT CAIN A,^R ;REPEAT LAST DRAWING JRST REPETR CAIN A,30 JRST CNTRLX CAIN A,^G ;GO!!!! JRST GOGO CAIN A,77 ;QUESTION HELP JRST HELPME CAIE A,177 ;RUBOUT JRST NOOUT POP Q,A CAIN A,"! JRST KILLIT .IOT TO,A CAMGE Q,[-100,,QDL] MOVE Q,[-100,,QDL] JRST AGAST NOOUT: PUSH Q,A SKIPL Q JRST KILLIT CAIE A,15 ;RETURN CARRIAGE JRST AGAST .IOT TO,[15] .IOT TO,[12] HRRZ Q,Q CAMN Q,QDL+1 JRST TTINR ;HE DID RET CAR ONLY MOVE Q,[444400,,QDL+1] ;COMPATIBLE WITH 7 BIT FROM JCL AGAIN: SETZM B RLOP: ILDB A,Q ;GET A CHARACTER JUMPE A,RETCR ;NUL AT END... CAIN A,40 ;TEST IT JRST SPACE CAIN A,72 ;COLON JRST COLON CAIN A,137 JRST ARROW CAIN A,15 JRST RETCR CAIN A,73 JRST SMCLN CAIL A,140 SUBI A,40 ;LOWER CASE FROM JCL? SUBI A,40 LSH B,F IOR B,A JRST RLOP; NOTHING SPECIAL, GET NEXT LFTJST: SKIPN B ;LEFT ADJUST ROUTINE POPJ P, TLNE B,770000 POPJ P, LSH B,F JRST LFTJST SPACE: PUSHJ P,SPCOUT JRST AGAIN SPCOUT: PUSHJ P,LFTJST SKIPN B POPJ P, SKIPE NMSWT; SKIP IF FIRST FILE NAME JRST NM2 SKIPE FRMTSW; SKIP IF 'TO' FILE NAME JRST TOOWRD MOVEM B,OUTP+1 JRST AGAINS TOOWRD: MOVEM B,INOP+1 JRST AGAINS NM2: SKIPE FRMTSW JRST TOWORD MOVEM B,OUTP+2 JRST AGAINS TOWORD: MOVEM B,INOP+2 JRST AGAINS AGAINS: SETOM NMSWT; SWITCH TO SECOND N POPJ P, COLON: PUSHJ P,LFTJST SKIPE FRMTSW JRST TODVC HLRM B,OUTP JRST AGAIN TODVC: HLRM B,INOP JRST AGAIN ARROW: PUSHJ P,SPCOUT SETOM FRMTSW SETZM NMSWT JRST AGAIN SMCLN: PUSHJ P,LFTJST SKIPE FRMTSW JRST TOSNM MOVEM B,TOSSNM JRST AGAIN TOSNM: MOVEM B,FRMSNM JRST AGAIN KILLIT: .IOT TO,[77] JRST TTINR RETCR: PUSHJ P,SPCOUT JRST ALLOV GOGO: SETOM GOFLG MOVE A,[SIXBIT /+NPGS .CORE (A) .VALUE SKIPE GOTONE ;DONT WASTE TIME IF NOT FILLED YET. PUSHJ P,BUFZAP JRST LOOP BUFZAP: SETZM BBUF MOVE A,[BBUF,,BBUF+1] BLT A,BBUF+-1 POPJ P, LOOP: SETZM CHARCT SETOM CHARBCT' MOVEI A,40 DPB A,[D1] DPB A,[D2] DPB A,[D3] PICLUP: MOVE A,[D1] PUSHJ P,ASCAOS CAIN B,"0 ;CARRY PUSHJ P,[MOVE A,[D2] JRST ASCAOS] CAIN B,"0 PUSHJ P,[MOVE A,[D3] JRST ASCAOS] SETZM MARKS MOVEI A,BFNMCT EXCH A,CHARCT MOVEM A,CHARBCT' MOVE A,[BFNM] EXCH A,CHARPT MOVEM A,CHARBPT' MOVEI X0,XORG MOVEI Y0,YORG+100. JRST CHRLUP GETCH1: SKIPL A,CHARBCT ;BACKED UP POINTER FOR HEADER FUDGE JRST [MOVEM A,CHARCT MOVE A,CHARBPT MOVEM A,CHARPT SETOM CHARBCT SETZM MARKS JRST GETCH] MOVE A,[-BUFL,,BUF] .IOT IN,A MOVEI A,-BUF(A) JUMPE A,FINSH IMULI A,5 MOVEM A,CHARCT' MOVE A,[440700,,BUF] MOVEM A,CHARPT' GETCH: SOSGE CHARCT JRST GETCH1 ILDB A,CHARPT POPJ P, ; ARDS - 35 = POINT, 36 = VECTOR, 37 = SHORT VECTOR GRFMOD: MOVEI B,-35(A) MOVEM B,ARDMOD' PUSHJ P,GETCH ARDSP1: MOVE B,ARDMOD JRST ARDISP(B) JRST NORM ARDISP: JRST POINT JRST VECTOR JRST SHORTV POINT: SETZM LOBITS SETZM LOBITS+1 PUSHJ P,GET3A MOVEI X0,850.(X) HRREI Y0,-850.(Y) ; TRANSLATE ORIGIN MOVNS Y0 ; INVERT AXIS ARDLUP: PUSHJ P,GETCH CAIGE A,100 JRST CHRLP1 JRST ARDSP1 SHORTV: PUSHJ P,GET1A MOVNS Y JRST SHORTW VECTOR: PUSHJ P,GET3A MOVNS Y SKIPE INVIS JRST [ ADD X0,X ADD Y0,Y JRST ARDLUP] SHORTW: MOVEM X0,XEND' ADDM X,XEND MOVEM Y0,YEND' ADDM Y,YEND MOVM A,X MOVM B,Y CAMGE A,B JRST DDAY DDAX: HRLZ A,Y IDIV A,X HRLE B,Y0 MOVM C,X JUMPL X,DDAXN DDAXP: AOS X0 ADD B,A HLRE Y0,B PUSHJ P,MARK SOJGE C,DDAXP JRST VECEND DDAXN: SOS X0 SUB B,A HLRE Y0,B PUSHJ P,MARK SOJGE C,DDAXN JRST VECEND DDAY: HRLZ A,X IDIV A,Y HRLZ B,X0 MOVM C,Y JUMPL Y,DDAYN DDAYP: AOS Y0 ADD B,A HLRE X0,B PUSHJ P,MARK SOJGE C,DDAYP JRST VECEND DDAYN: SOS Y0 SUB B,A HLRE X0,B PUSHJ P,MARK SOJGE C,DDAYN VECEND: MOVE X0,XEND MOVE Y0,YEND JRST ARDLUP MARK: CAIGE X0,XBITL CAIGE X0,XORG POPJ P, CAIGE Y0,YBITL CAIGE Y0,YORG POPJ P, AOS MARKS' MOVE X,X0 MOVE Y,Y0 IDIVI X,36. IMULI Y,WDPSL ADD X,Y MOVE Z,BTB(Z) IORM Z,BBUF(X) POPJ P, GET3A: MOVEI XY,0 PUSHJ P,GETXY MOVE X,Y PUSHJ P,GETCH AOS XY GETXY: ROT A,-1 MOVEM A,SIGN' ANDI A,37 MOVE Y,A PUSHJ P,GETCH ;GET SECON HALF OF X OR Y COORD SETZM AFLAG(XY) TRNE A,40 ;SKIP IF NOT FLAGGED SETOM AFLAG(XY) DPB A,[050500,,Y] SKIPGE SIGN MOVNS Y GETXYZ: IMUL Y,SCALE(XY) ;SCALING ADD Y,LOBITS(XY) ;FOR EXTRA ACCURACY HRRM Y,LOBITS(XY) HLRES Y ;MAKE BACK TO FULL WORD POPJ P, GET1A: PUSHJ P,GETXY1 MOVE X,Y PUSHJ P,GETCH GETXY1: ANDI A,77 ROT A,-1 HRRZ Y,A SKIPGE A MOVNS Y JRST GETXYZ ;DO SCALING AFLAG:: ;FLAGS FOR "ARDS" DATA INVIS: 0 ;X DATA HAS INVIS FLAG DOTTED: 0 ;Y DATA HAS "DOTTED" FLAG - HOPE NO-ONE USES IT LOBITS: BLOCK 2 ;FOR ROUNDOFF AFTER SCALING SCALE: 3000000/2 ;3/2 IN X 3000000/2*24./25. ;3/2 IN Y * 192/200 FOR XGP ; - - - - - - -- - ; HERE FOR NORMAL CHARS TO MARK UP PAPER CHRLUP: PUSHJ P,GETCH CHRLP1: SETOM ARDMOD' NORM: CAIGE A,40 JRST [ SKIPN CTLTAB(A) JRST .+1 XCT CTLTAB(A) JRST CHRLUP] SKIPN A,CHRTAB(A) JRST CHRLUP ;IGNORE BLANK CHAR MOVEM Y0,ENDY' SUB Y0,CBASE ;LIFT CHAR UP SO HANGS FROM LOWER LEFT HRRZ X,2(A) ;CHAR WIDTH ADD X,X0 MOVEM X,ENDX' HLRZ X,1(A) ;LEFT KERN ADD X,COLADJ SUBM X0,X MOVEM X,LEFTX' HLRZ B,2(A) ;RASTER WIDTH MOVEM B,NBITS' MOVE C,HEIGHT HRLI A,440800 ADDI A,3 NXTLN1: MOVE X0,LEFTX MOVE B,NBITS NXTBYT: TLNN A,700000 ;SKIP IF NOT ABOUT TO GO INTO NEXT WORD JRST [ MOVE D,1(A) ;CHECK NEXT WORD FOR FENCE TRNE D,1 JRST ENDCHR JRST .+1] ILDB D,A JUMPE D,[SUBI B,8 ADDI X0,8 JUMPG B,NXTBYT JRST NXTLIN] REPEAT 8,[TRNE D,1_.RPCNT PUSHJ P,MARK AOS X0 SOJLE B,NXTLIN ] JRST NXTBYT NXTLIN: AOS Y0 SOJG C,NXTLN1 ENDCHR: MOVE X0,ENDX MOVE Y0,ENDY JRST CHRLUP CTRL.L: PUSHJ P,RLEOUT PUSHJ P,BUFZAP JRST PICLUP ;FRESH PICTURE WHEN GET "FORM FEED" ASCAOS: LDB B,A ;AOS AN ASCII CHAR 0-9 CAIN B,40 ;SPACE MEANS 0 MOVEI B,"0 AOS B CAILE B,"9 ;9+1 CARRIES TO 0 MOVEI B,"0 DPB B,A ;PUT IT BACK POPJ P, .BYTE 7 BFNM: "P ? "A ? "G ? "E ? 40 D3: 40 D2: 40 D1: 40 40 ? "F ? "I ? "L ? "E ? 40 AFNM: IRPC A,,[......:...... ...... ......; ] "A TERMIN BFNMCT==.BYTC .BYTE CTLTAB: 0 ? 0 ? 0 ;@ A B 0 ;C 0 ? 0 ? 0 ? 0 ;D E F G SUB X0,WIDTH ;H 0 ;I ADD Y0,HEIGHT ;J 0 ;K JRST CTRL.L ;L MOVEI X0,XORG ;M 0 ? 0 ;N O 0 ? 0 ? 0 ? 0 ? 0 ? 0 ? 0 ? 0 0 ? 0 ? 0 ? 0 SETOM ARDMOD ;\ JRST GRFMOD ;] JRST GRFMOD ;^ JRST GRFMOD ;_ IFN .-CTLTAB-40,.ERR SHOULD BE 40 CTL CHARS DEFINE CONC A,B A!B!TERMIN CHRTAB: REPEAT 40,0 REPEAT 140,[ CONC CC,\.RPCNT+40 ] CBASE: 24 HEIGHT: 31 COLADJ: 0 WIDTH: 16 DEFINE CH B,C,D CC!B=.-1 1 C IRP DD,,[D] DD!0 TERMIN TERMIN CH 177,16000016,[0,0,3600001000,1600161000,42200211000,42000160034,10400042 10400034] CH 176,16000016,[0,0,0,0,70060,77006346016,40601400000] CH 175,16000016,[0,14000140000,60000300000,60000300000,60000300000,40000400006 3000006,40000700000,60000300000,60000300000,60000140000,14000000000] CH 174,16000016,[300000,60000300000,60000300000,60000300000,60000300000 60000300000,60000300000,60000300000,60000300000,60000300000,60000300000 60000300000] CH 173,16000016,[0,40001700000,30000140000,30000140000,30000140000,14000030000 3000030000,14000140000,30000140000,30000140000,30000300000,40001400000] CH 172,16000016,[0,0,0,370036,76007400030,3000006,40000700000,30000060000 6000014000,77007774036] CH 171,16000016,[0,0,0,6060,3006014030,6003030014,14003160006,30001740006 60000700002,60000300000,71400146000,37400074000] CH 170,16000016,[0,0,0,6030,3407014014,6001660002,74000740000,70000260002 6001434016,3407006030] CH 167,16000016,[0,0,0,6030,1406006030,1406106030,71406356034,73003354014 57003670006,6001430006] CH 166,16000016,[0,0,0,6030,1406014014,3003014014,6001430006,6001660002 54000760002,70000340000] CH 165,16000016,[0,0,0,14030,3006014030,3006014030,3006014030,3006014030 3006034034,76007760030] CH 164,16000016,[0,140000,30000140000,77001774006,30000140000,30000140000 30000140000,30000140000,30004140030,70007700016] CH 163,16000016,[0,0,0,340006,76003430014,6000170000,74000700006,40003400016 3014014,77001770002] CH 162,16000016,[0,0,0,230016,76007570030,16006030000,6000030000,6000030000 6000030000,6000030000] CH 161,16000016,[0,0,0,0,74006370036,7007014030,3006014030,3006014030 3006034034,76007760030,6000030,6000030,6000000] CH 160,16000016,[0,0,0,0,63001774016,7007014030,3006014030,3006014030 3006034014,77003714006,3000014000,3000014000,3000000000] CH 157,16000016,[0,0,0,360006,76003434034,3006014030,3006014030,3006014030 3006034034,76003760006] CH 156,16000016,[0,0,0,314006,77003434034,3006014030,3006014030,3006014030 3006014030,3006014030] CH 155,16000016,[0,0,0,163016,77407756072,61414306060,61414306060,61414306060 61414306060,61414306060] CH 154,16000016,[0,74000760002,40000600002,40000600002,40000600002,40000600002 40000600002,40000600002,40000600002,40000600002] CH 153,16000016,[0,6000030000,6000030000,6000030000,6003030016,46001730002 76000170000,76000330002,46001430016,6007030060] CH 152,16000016,[0,0,3000014,0,70003740016,3000014,3000014,3000014,3000014 3014014,7003370016,70001400000] CH 151,16000016,[0,6,1400000,360006,74001400006,1400006,1400006,1400006 1400006,1400006] CH 150,16000016,[0,3000014000,3000014000,3000014000,3000314006,77003434034 3006014030,3006014030,3006014030,3006014030] CH 147,16000016,[0,0,0,0,74006370036,7007014030,3006014030,3006014030 3006034034,76007760030,6000030,7014016,77001400000] CH 146,16000016,[0,70003760036,14006060000,14000060000,77000774002,14000060000 14000060000,14000060000,14000060000,14000060000] CH 145,16000016,[0,0,0,360002,76001434016,3007014030,77007774036,3000014000 3000034034,76003760006] CH 144,16000016,[0,3000014,3000014,3360014,76003434016,3003014014,3003014014 3003014014,3003034016,76003760014] CH 143,16000016,[0,0,0,340016,74007470030,7000014000,3000014000,3000014000 7000070030,74007740016] CH 142,16000016,[0,3000014000,3000014000,3000354002,77001434016,3007014030 3006014030,3006014030,3007034016,77001754002] CH 141,16000016,[0,0,0,74000770006,6003400600,3360014,76003434016,3003014014 3003034016,76007760072] CH 140,16000016,[6000,3000030000,14000140000,60000200002] CH 137,16000016,[0,0,0,0,0,0,0,0,0,0,0,377176,77637400000] CH 136,16000016,[0,60000300000,70000460006,14001430014,6003014030,3006000000] CH 135,16000016,[76003770016,3000014,3000014,3000014,3000014,3000014,3000014 3000014,3000014,3000014,3370016,76003400000] CH 134,16000016,[14000,3000030000,6000060000,14000140000,30000300000,60000200002 40000400006,1400014,3000030,6000060,14000040] CH 133,16000016,[77001774006,3000014000,3000014000,3000014000,3000014000 3000014000,3000014000,3000014000,3000014000,3000014000,3000374006,77001400000] CH 132,16000016,[0,77007774036,6000014,3000006,1600002,40000700000,60000140000 30000060000,14000030000,77017774076] CH 131,16000016,[0,1414006060,3416014030,6003070016,74001740002,60000300000 60000300000,60000300000,60000300000,60000300000] CH 130,16000016,[0,1414016070,1406014014,3003034016,6001670006,74000740000 74000660002,56001434016,3003016034,1416006060] CH 127,16000016,[0,1414006060,1414006060,1414006060,1414006060,23416116070 73006354030,73006774036,16003430014,6003030014] CH 126,16000016,[0,1414006060,3416016070,1406014034,3003014014,3003030006 6001430006,54000660002,54000760002,70000340000] CH 125,16000016,[0,3006014030,3006014030,3006014030,3006014030,3006014030 3006014030,3006014030,3006034034,76003760006] CH 124,16000016,[0,77417776076,60000300000,60000300000,60000300000,60000300000 60000300000,60000300000,60000300000,60000300000] CH 123,16000016,[0,74000770006,7003414014,3000034000,16000160000,70000700006 40003400034,6000030,7016016,77401774002] CH 122,16000016,[0,77000774016,3007014030,3006014030,3007014016,77001774002 73000314002,43001414016,3007014070,3014014060] CH 121,16000016,[0,70000760006,16003434034,3006006060,1414006060,1414006060 1414006060,1414014030,7007070016,74001740002,40001400016,3000000] CH 120,16000016,[0,77000774016,3007014030,3006014030,3007014016,77001774002 3000014000,3000014000,3000014000,3000014000] CH 117,16000016,[0,70000760006,16003434034,3006006060,1414006060,1414006060 1414006060,1414014030,7007070016,74001740002] CH 116,16000016,[0,7006034030,17006074030,37006154030,73006314030,63006314030 43006614036,3007414036,3007014034,3006014030] CH 115,16000016,[0,1414016070,3416036074,7417076076,15415466066,71414746062 61414006060,1414006060,1414006060,1414006060] CH 114,16000016,[0,3000014000,3000014000,3000014000,3000014000,3000014000 3000014000,3000014000,3000014000,77007774036] CH 113,16000016,[0,3004014030,3007014016,43001714002,73000174000,17000074000 37000354000,63000614006,3003414034,3016014060] CH 112,16000016,[0,70017740076,3000014,3000014,3000014,3000014,3000014 3003014014,3003634006,76000760000] CH 111,16000016,[0,74001760006,60000300000,60000300000,60000300000,60000300000 60000300000,60000300000,60000300000,74001760006] CH 110,16000016,[0,3006014030,3006014030,3006014030,3006374036,77007414030 3006014030,3006014030,3006014030,3006014030] CH 107,16000016,[0,70001760016,16007014030,1400006000,1400006000,1400306036 61407406030,1406006030,1406016034,77007770032] CH 106,16000016,[0,77003774016,3000014000,3000014000,3000374006,77001414000 3000014000,3000014000,3000014000,3000014000] CH 105,16000016,[0,77003774016,3000014000,3000014000,3000374006,77001414000 3000014000,3000014000,3000014000,77007774036] CH 104,16000016,[0,77000374006,3003014030,3006014030,3006014030,3006014030 3006014030,3006014030,3006014014,77001774000] CH 103,16000016,[0,70001760016,16007034030,3400006000,1400006000,1400006000 1400006000,1400016000,7006070034,74003740006] CH 102,16000016,[0,77000374002,3001414006,3001414006,3001774002,77001414006 3003014030,3006014030,3003014016,77001774002] CH 101,16000016,[0,70000340000,54000660002,54000660002,6001430006,6001430006 77003774016,3003016034,1406006030,614003060] CH 100,16000016,[0,0,74000770006,7003414030,43007514030,23006114030,23006114030 23006214016,3000014000,7000370036,74007400000] CH 77,16000016,[0,70000760006,16003430034,6000034,3600006,60000740000 30000140000,30000000000,140000,74000140000] CH 76,16000016,[0,14000,6000060000,30000300000,40000400006,3000030,6000014 1600002,60000140000,14000030000,1400000000] CH 75,16000016,[0,0,0,0,370036,76007400000,0,76007770036] CH 74,16000016,[0,60,6000014,1600002,60000140000,14000030000,6000060000 30000300000,40000400006,3000030,14000000] CH 73,16000016,[0,0,0,0,60000340002,60000000000,0,0,300000,70000740002 40000700000,30000000000] CH 72,16000016,[0,0,0,0,60000340002,60000000000,0,0,300000,70000700000] CH 71,16000016,[0,74000770006,7001414014,3003014014,3003034016,76003760014 3000014,3000014,3014014,77001770000] CH 70,16000016,[0,74000770006,7003414014,3003014014,6001770006,77003416034 1406006030,1406006030,1406016034,77003770006] CH 67,16000016,[0,76007770036,6000030,3000014,1400006,40000600002,60000300000 30000140000,14000060000,6000030000] CH 66,16000016,[0,60001740016,14003030014,6000014000,3000354002,77001434014 3006014030,3006014030,3007034016,76001760002] CH 65,16000016,[200000000,76007770036,6000030000,6000030000,6000370006 76003430034,6000030,6000030,3003034006,76001760002] CH 64,16000016,[0,40001700006,30001540006,14001460006,6001430006,3001414006 1401776036,77407400006,1400006,1400006] CH 63,16000016,[0,74000770006,6003400014,3000016,40001760002,74001400016 3000030,6000030,3003034016,76001760002] CH 62,16000016,[0,70001760016,6007014030,3006000030,7000016,40001700002 70000160000,16000034000,3000014000,77007774036] CH 61,16000016,[0,74000370000,60000300000,60000300000,60000300000,60000300000 60000300000,60000300000,60000300000,76003770016] CH 60,16000016,[0,74000770006,6001414014,3003014014,3003014014,3003014014 3003014014,3003014014,3003030006,76001760002] CH 57,16000016,[60,6000030,3000014,1400006,40000600002,60000300000,30000140000 14000060000,6000030000,3000014000,1400006000] CH 56,16000016,[0,0,0,0,0,0,0,0,300000,70000700000] CH 55,16000016,[0,0,0,0,0,374016,77003400000] CH 54,16000016,[0,0,0,0,0,0,0,0,300000,70000740002,40000700000,30000000000] CH 53,16000016,[0,0,0,140000,30000140000,30000140000,77607777036,30000140000 30000140000,30000000000] CH 52,16000016,[0,0,40000,30000142010,31403154006,76000760000,76000634006 3001406014,402000000] CH 51,16000016,[14000060000,30000140000,60000300000,40000600002,40000400006 1400006,1400006,1400006,40000600002,40000700000,60000140000,30000060000] CH 50,16000016,[40000600002,60000300000,30000140000,14000060000,14000030000 6000030000,6000030000,6000030000,14000060000,14000140000,30000300000,60000200002] CH 47,16000016,[6,40000700000,30000060000,6000014000] CH 46,16000016,[0,0,160000,76000334002,43000734002,76000160000,76000334032 43407406016,41401716016,77407174030] CH 45,16000016,[0,70030,33006104014,21003154006,16001600002,40000700000 60000140000,30000060016,54006630020,46004214032,3003400000] CH 44,16000016,[0,20000100000,74000770006,23003106000,21400114000,36000340002 20003500030,20006100030,21403374006,76000500000,20000000000] CH 43,16000016,[0,60014,14003060014,14003060014,77437776176,14003060014 14003376176,77437460014,14003060014,14003060014,14003000000] CH 42,16000016,[0,14003060014,14003060014,14003060014,14003000000] CH 41,16000016,[300000,60000300000,60000300000,60000300000,60000300000 60000300000,60000300000,60000000000,300000,70000700000] CH 40,16000016,[0] 1 ;FUDGE TO TERMINATE LAST CHAR REPETR: SKIPL GOTONE JRST TTINR ;HAVENT MADE ANY YET,CANT REPEAT IT FINSH: SETOM GOTONE' .CLOSE IN, PUSHJ P,RLEOUT SKIPE GOFLG JRST DELPLX SKIPE JCLFLG JRST CNTRLX ;JCL PROCESSED - EXIT IMMEDIATE WITHOUT DELETION MOVEI G,[SIXBIT /DELETE INPUT FILE NOW?!/] PUSHJ P,TYPIT .IOT TI,A CAIL A,140 SUBI A,40 CAIE A,"Y JRST TTINR DELPLX: SETZM CHSTS+3 .FDELE CHSTS JFCL JRST TTINR BTB: REPEAT 36.,1_<35.-.RPCNT> ONES: REPEAT 36.,<-1>_<-.RPCNT> RLEOUT: SKIPG MARKS POPJ P, MOVSI Y, MOVE A,[002000,,CBUF-1] MOVEM A,RLEPNT' SETZM RLECNT' RLELUP: HRRZ A,Y IMULI A,WDPSL ADDI A,BBUF ;A POINTS TO ACTUAL ADDRESS HRLI A,-WDPSL PUSH P,RLEPNT ;SAVE POINTERS IN CASE WANT TO IGNORE THIS LINE PUSH P,RLECNT ;OR RE WRITE IT IN IMAGE MODE PUSHJ P,RLEMAX ;SET UP COUNT LIMIT FOR MAX BLOCK MOVEI D,0 ;PLACE HOLDER PUSHJ P,RLEPT2 MOVEI D,100(Y) ;SCAN LINE = Y POSITION (LEAVE BORDER) PUSHJ P,RLEPT2 MOVEI D,0 ;BYTES TO GO TO RUN-LENGTH MODE PUSHJ P,RLEPT2 SETZB D,E ;COUNT FOR CONSECUTIVE SAME BITS D/1'S E/0'S RLEUP: MOVE B,(A) ;PEN "UP" LOOK FOR "1" RLEUP1: JFFO B,RLEGDN ;FIND A 1 => GO DOWN ADDI E,36. ;WORD FULL OF ZEROES, COUNT THEM AOBJN A,RLEUP ; FALL THRU, OR JUMP HERE WHEN END OF LINE RLELIN: MOVE A,RLECNT ;SEE HOWMANY WERE PUT IN SUB A,(P) ;COUNT AT START CAIG A,3 ;3 pairs of bytes FOR HEADER ALREADY KNOWN THERE JRST [ POP P,RLECNT POP P,RLEPNT JRST RLELN2] ;NO DATA ON THIS LINE - SKIP IT MOVEI D,0 PUSHJ P,RLEPT2 ;2 0'S TO ESCAPE MOVEI D,1_8 ;TERMINATE LINE PUSHJ P,RLEPT2 MOVEI D,0 ;IN CASE NEED TO FILL WORD MOVEI A,1 TDNE A,RLECNT ;SKIP IF DO NOT NEED TO FILL a pair of BYTES PUSHJ P,RLEPT2 SKIPGE RLELIM ;SKIP IF LINE FITS MAXIMUM ALLOWED JRST RLEIMG ;IMAGE IT IF NOT FITTING AS ENCODED POP P,A ;COUNT AT START OF LINE SUB A,RLECNT ;CURR COUNT MOVMS A POP P,B ;POINTER TO BEGIN OF LINE HRLI B,002000 ;LEFT 16 BITS (AFTER IDPB) IDPB A,B ;STASH COUNT ;NOTE THAT THE LAST 2 POPS ALSO ARE NEEDED TO UNWIND THE STACK RLELN2: AOBJN Y,RLELUP PUSHJ P,RLEMAX MOVEI D,2 ;HEADER FOR EOF - CUT. PUSHJ P,RLEPT2 MOVEI D,100000+192.*11. ;CUT, 11 INCH PAGE, 192 LINES/IN PUSHJ P,RLEPT2 JRST RLECLS RLEDN: SETCM B,(A) ;PEN DOWN - COMPLEMENT TO LOOK FOR ZEROES RLEDN1: JFFO B,RLEGUP ;FOUND, GO UP ADDI D,36. ;COUNT 36 "1"S (D/1'S E/0'S) AOBJN A,RLEDN ; FALL THRU WHEN END OF LINE AND PEN STILL MARKING MOVEI C,0 ;JUMP HERE WHEN GOING FROM 1'S TO 0'S RLEGUP: ADD D,C ;C/ # OF LEADING 1'S (D/1'S E/0'S) EXCH E,D ;D/0 E/1 CAILE D,377 ;SKIP IF FITS IN ONE BYTE JRST [ MOVSI D,-377(D) HRRI D,377 ;0 BLACK, 377 WHITE PUSHJ P,RLEPT2 HLRZS D ;RESTORE JRST .-1] EXCH E,D ;E/LEFTOVER WHITE CAILE D,377 JRST [ MOVSI D,-377(D) HRRI D,377_8(E) ;377 BLACK, ANY LEFTOVER WHITE PUSHJ P,RLEPT2 HLRZS D MOVEI E,0 JRST .-1] LSH D,8 ADDI D,(E) PUSHJ P,RLEPT2 ;NOW OUTPUT THE LAST BYTES JUMPGE A,RLELIN ;JUMP IF ENDED BECAUSE OF END OF LINE SETCMM B AND B,ONES(C) ;FLUSH LEADING ONES NOW MOVEI D,0 ;COUNT OF 1'S IS 0 MOVN E,C ;COMPENSATE FOR THOSE ALREADY OUTPUT JRST RLEUP1 ;JUMP HERE WHEN GOING FROM 0'S TO 1'S RLEGDN: ADD E,C ;UPDATE COUNT OF 0'S SETCMM B AND B,ONES(C) MOVN D,C ;INITIAL COUNT OF 1'S JRST RLEDN1 ;CLOSE THE OUTPUT NOW RLECLS: MOVE A,RLECNT ADDI A,2000*2-1 ;ROUND UP TO NEXT BLOCK LSH A,8-1 ;PAGE COUNT TO LEFT HALF HRRI A,CBUF_-10. MOVEM A,RLEPGS' MOVN A,RLECNT LSH A,-1 ;/2 MOVSI A,(A) MOVEI B,17 ANDCAM B,CBUF(A) AOBJN A,.-1 ;FLUSH LOW ORDER 4 BITS MOVE B,RLEPNT ANDI B,1777 HRLI A,-2000(B) SETZM CBUF(A) AOBJN A,.-1 ;CLEAR OUT REST OF BLOCK .SUSET [.SSNAM,,TOSSNM] .OPEN OUT,OUTP JRST OPOUFL MOVN A,RLECNT LSH A,18.-1 HRRI A,CBUF .IOT OUT,A ;OUTPUT THE WHOLE THING .CLOSE OUT, POPJ P, ;SET MAXIMUM pairs of BYTES TO PUT FOR A SCAN LINE RLEMAX: PUSH P,[54.*2] ;54 WORDS PDP10 IS MAX PER TK POP P,RLELIM' POPJ P, ;HERE TO PUT OUT A LINE IN IMAGE MODE RLEIMG: POP P,RLECNT POP P,RLEPNT ; RESET NUMBER OF BYTES OUTPUT AND BYTE POINTER PUSHJ P,RLEMAX HRRZ A,Y IMULI A,WDPSL ADDI A,BBUF ; POINT TO DATA HRLI A,440400 MOVE D,RLELIM ; NUMBER OF PDP-11 WORDS IN TOTAL PUSHJ P,RLEPT2 MOVEI D,100(Y) ; LINE NUMBER PUSHJ P,RLEPT2 MOVEI D,2_8 ; ENTER IMAGE MODE PUSHJ P,RLEPT2 MOVEI E,WDPSL*9 ; TAKE ONLY THIS MANY 4-BIT BYTES RLEIM2: SETZM D REPEAT 4,[ ILDB C,A MOVE C,BITRVS(C) ; LOOKUP TO REVERSE THE FOUR BITS. LSHC C,-4 ] LSH D,-36.+16. ; RIGHT JUSTIFY 16 BITS ACCUMULATED SUBI E,4 ; CHECK IF RAN OUT OF SOURCE DATA DURING ILDBS JUMPL E,RLEIM3 ; YES PUSHJ P,RLEPT2 ; NO STORE THE DATA SKIPL RLELIM ; CHECK IF OUTPUT LINE FILLED UP JRST RLEIM2 ; NO JRST RLELN2 ; FILLED UP. IGNORE REST OF LINE. GO TO NEXT LINE. ; JUMP HERE IF RAN OUT OF SOURCE DATA AND NEED TO FILL UP OUTPUT LINE RLEIM3: AND D,BLAPOUT+4(E) ; CLOBBER GARBAGE GOTTEN FROM NEXT LINE OF SOURCE DATA RLEIM4: PUSHJ P,RLEPT2 SKIPGE RLELIM ; CONTINUE UNTIL OUTPUT LINE FULL JRST RLELN2 SETZM D JRST RLEIM4 BLAPOUT: 0 17 377 7777 BITRVS: 0 ; TABLE TO MAP INDEX (IN BINARY) wxyz INTO VALUE zyxw 10 4 14 2 12 6 16 1 11 5 15 3 13 7 17 ;PUT 2 8-bit bytes (one 16-bit byte) IN OUTPUT BUFFER RLEPT2: SOSGE RLELIM ;DONT HACK (store) IF TOOMANY BYTES ON LINE POPJ P, IDPB D,RLEPNT AOS RLECNT POPJ P, TYPIT: .IOT TO,[15] .IOT TO,[12] MOVE F,TEMP MOVEM F,BYTPNT MORTP: ILDB A,BYTPNT CAIN A,1 POPJ P, ADDI A,40 .IOT TO,1 JRST MORTP OPINFL: SKIPE GOFLG JRST CNTRLX MOVEI G,[SIXBIT /OPEN OF INPUT FAILED !/] JRST TTINN OPOUFL: MOVEI G,[SIXBIT /OPEN OF OUTPUT FAILED !/] .CLOSE IN, TTINN: PUSHJ P,TYPIT .OPEN ERRI,ERRO .VALUE TTINN1: .IOT ERRI,A CAIN A,14 JRST TTINR .IOT TO,A JRST TTINN1 ERRO: (SIXBIT /ERR/) 1 0 BYTPNT: 0 TEMP: 440600+G,,0 STATUS: 0 CNTRLX: .VALUE KILLCD KILLCD: ASCIZ /:KILL / HELPME: MOVEI D,EXPTBL TYPMRE: MOVE G,(D) AOS D SKIPN G JRST TTINR PUSHJ P,TYPIT JRST TYPMRE EXPTBL: [SIXBIT /FILE TO PLOT!/] [SIXBIT /^X TO REPEAT A PLOT!/] [SIXBIT /^G FOR MULTIPLE FILES OF SAME SECOND NAME (DELETES THEM)!/] 0 LITTER: CONSTA VARS:: VARIAB BUF: BLOCK BUFL LOC .&776000+2000 CBUF: BLOCK 2000 ;ENOUGH TO GET IN PHASE, I HOPE BBUF: BLOCK NPGS END START