From b96902c7288f80734afd67f1dd32bd86fbd544ea Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Sat, 28 Apr 2018 21:20:12 +0200 Subject: [PATCH] SCNV - convert plotter files to XGP SCAN files. --- build/sail.tcl | 4 + doc/programs.md | 1 + src/draw/scnv.185 | 1675 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1680 insertions(+) create mode 100644 src/draw/scnv.185 diff --git a/build/sail.tcl b/build/sail.tcl index e136dca0..6f2c971a 100644 --- a/build/sail.tcl +++ b/build/sail.tcl @@ -34,6 +34,7 @@ respond "*" ":link draw; ug61c 999999, wl; ug61c >\r" respond "*" ":link sys1; ts d, datdrw; d bin\r" respond "*" ":link sys1; ts wl, datdrw; wl bin\r" respond "*" ":link sys1; ts pc, datdrw; pc bin\r" +respond "*" ":link sys1; ts scnv, datdrw; scnv bin\r" # The drawing program needs WL; BOARDS REL respond "*" ":cwd wl\r" @@ -115,3 +116,6 @@ respond "*" "XRESIDENT\r" respond "GO ON." "Y\r" respond "WL BIN" "\r" respond "*" ":kill\r" + +respond "*" ":midas datdrw;_draw; scnv\r" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index 7877d28f..4786df2e 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -145,6 +145,7 @@ - SALV, old file system tool for KA and KL. - SCANDL, TTY OUTPUT SPY. - SCHEME, Scheme interpreter. +- SCNV, convert plotter files to XGP scan files. - SCRAM, encypt/decrypt file. - SCRMBL/UNSCR, scramble/unscramble file. - SEND, REPLY, replacements for DDT :SEND. diff --git a/src/draw/scnv.185 b/src/draw/scnv.185 new file mode 100644 index 00000000..aa345846 --- /dev/null +++ b/src/draw/scnv.185 @@ -0,0 +1,1675 @@ +TITLE PLTSCN +;CONVERT PLT FILES TO XGP SCAN FILES. + +.MLLIT==1 + +GOULDP==0 ;ASSEMBLY SWITCH FOR THE GOULD 5200 PRINTER + +DEFINE CONC A,B +A!B!TERMIN + +ZR==0 +A=1 +B=2 +C=3 +D=4 +X1=5 +Y1=6 +X2=7 +Y2=10 +DX=11 +DY=12 +T=13 ;GETS CLOBBERED BY IDIVI DY, +TT=14 +W=15 + +P=17 + +INCH==1 ;INPUT CHNL +OUTCH==2 ;OUTPUT CHNL +FNTICH==3 ;FONT INPUT CHNL + + ;PLOT FILE FORMAT AND VERSION NUMBERS + +%VERL==13 ;LOWEST VERSION KNOW ABOUT + +%VERH==15 ;HIGHEST IO VERSION THIS KNOW ABOUT + + +IFN 0,[ +'PLT' 'PCP' FILE FORMAT + +LOW ORDER BIT OFF ALWAYS STARTS NEW COMMAND! + +VERSION# ;PLTVER=15 +LINES: +-------- +! XWD X*2,Y*2 LOW ORDER BIT OF LEFT HALF OFF MEANS +! XWD X*2,Y*2+1 THIS COMMAND IS A BUNCH OF POINTS +! XWD X*2,Y*2+1 JOINED BY VECTORS. ENDS WITH START OF +! . NEW COMMAND (LOW ORDER BIT OFF AGAIN) +! . +! . +! XWD X*2,Y*2+1 +-------- + +TEXT: +-------- +! XWD X*2+1,Y*2 ONE IN LEFT HALF MEANS TEXT +! XWD 0,ROTATION+SIZE*2+1 ZERO IN LH MEANS TEXT, NOT DIAMOND OR DRILL HOLE +! ASCII/5 CHARS OF TEXT/+1 +-------- + +;PLTVER(15) SIZE IS WIDTH OF CHAR ON PTS +;ROTATION = 0 NORMAL UPRIGHT CHARS +;ROTATION = 400000 ROTATED 90 DEGREES CCW + +SMALL DIAMOND TO INDICATE JUNCTION OF 3 OR 4 LINES (PLT) + OR +DRILL HOLE (PCP): +-------- +! XWD X*2+1,Y*2 +! XWD 2,1 2 IN LEFT HALF MEANS DIAMOND (OR DRILL HOLE) +-------- + +MPC,< +-------- +! XWD X*2+1,Y*2 +! XWD 4,*2+1 +-------- +THE PLOT PROGRAM KNOWS ABOUT THE VARIOUS PAD TYPES +>;MPC + +******** THE PRECEEDING FORMATS MAY BE MIXED IN ANY ORDER UNTIL + A WORD WITH LEFT HALF = 400001 IS SEEN. THEN THE + FILE ENDS WITH THE FOLLOWING: + +MPC,< 400001,,0 +400000 IF FRONT SIDE + +200000 IF INNER PLANE + BITS BIT 35 = FLIPPED PLOT + + CARD FILENAME: --------! + CRDNAM ! + CRDEXT !---- OR 0 IF NONE + CRDPPN ! + --------! +>;MPC +MD,< 400001,,*2 0=NONE + 1=A + 2=B ETC. + + ASCIZ/STRING TO GO IN BOX MARKED "DRAWN BY"/ + + ASCIZ/FIRST LINE TO GO IN TITLE BOX/ + + ASCIZ/SECOND LINE TO GO IN TITLE BOX/ + 'DRW' FILE DATE AND TIME LAST WRITTEN + 'DRW' FILE NAME + 'DRW' FILE EXTENSION,,0 + 'DRW' FILE PPN + CARD LOCATION + + ASCIZ/REVISION STRING/ + + ASCIZ/drawing number STRING/ ;MODULE-VARIABLE-PREFIX + + ASCIZ/PROJECT STRING/ + + ASCIZ/PAGE STRING/ + + ASCIZ/OF STRING/ + + ASCIZ/DCODE STRING/ + + ASCIZ/SITE LINE 1 STRING/ + + ASCIZ/SITE LINE 2 STRING/ + +DEC,< + + ASCIZ/NEXT HIGHER ASSEMBLY NUMBER STRING/ + + 0 OR DRNNAM + DRNEXT,,DRNDAT + DRNPPN + + 0 OR CHKNAM + CHKEXT,,CHKDAT + CHKPPN + + 0 OR ENGNAM + ENGEXT,,ENGDAT + ENGPPN + +>;DEC +>;MD +];IFN 0 + ;RASTER DEFINITIONS + +RASGRP==100. ;RASTER LINES IN A RASTER GROUP. IE + ;LENGTH OF RASTAB = + ; / RASGRP +IFE GOULDP,[ +PAGLIN==110. ;PAGE LENGTH IN TENTHS OF AN INCH +PAGWID==85. ;PAGE WIDTH IN TENTHS OF AN INCH +] +.ELSE [ +PAGLIN==150. +PAGWID==110. +] +PAGRES==200. ;RESOLUTION IN POINTS PER INCH +LRASTB==/RASGRP + +DEFINE BBX X,Y,OP + <<*PAGRES/100.>&77777>_25+<<*PAGRES/100.>&77777>_6+OP +TERMIN + +IFE GOULDP,[ +XGPLAB==30. ;LABELING BOX HEIGHT IN HUNDREDTHS OF AN INCH +BXTXOF==11. ;LABELLING TEXT OFFSET (HUNDREDTHS) +BXLLX==15. ;BOX LOWER LEFT X COORD IN HUNDREDTHS OF AN INCH +BXLLY==10. ;BOX LOWER LEFT Y COORD +BXURX==820. ;BOX UPPER RIGHT X COORD +BXURY==1055. ;BOX UPPER RIGHT Y COORD +BFNLN==200. ;LENGTH OF FILE NAME BOX +BDALN==200. ;LENGTH OF DATE BOX +] +.ELSE [ +XGPLAB==40. ;LABELING BOX HEIGHT IN HUNDREDTHS OF AN INCH +BXTXOF==0 ;LABELLING TEXT OFFSET +BXLLX==20. ;BOX LOWER LEFT X COORD IN HUNDREDTHS OF AN INCH +BXLLY== 50. ;BOX LOWER LEFT Y COORD +BXURX==1000. ;BOX UPPER RIGHT X COORD +BXURY==1450. ;BOX UPPER RIGHT Y COORD +BFNLN==265. ;LENGTH OF FILE NAME BOX +BDALN==265. ;LENGTH OF DATE BOX +] +BDTLN==-BFNLN-BDALN ;LENGTH OF BOX FOR TITLES 1 AND 2 + +IFE GOULDP,[ +LSCNBF==55. ;ENUF FOR ONE XGP RASTER LINE +BYTMAX==52.*4 ;MAX ALLOWABLE BYTES IN DATA OUTPUT +] +.ELSE [ +LSCNBF==65. +BYTMAX==65.*4 +] +FSL==100000 +INBFSZ==100 ;SIZE OF INPUT BUFFER +LPDL==100 +RDFBFL==100 ;LENGTH OF READ FONT BUFFER +LASCZB==40 ;SIZE OF ASCIZ STRING BUFFER (FOR BOX TITLES, ETC) + +;THIS PROGRAM BASICALLY KNOWS ABOUT TWO SORTS OF THINGS, CHARACTER STRINGS +; AND VECTORS. THE PROGRAM OPERATES BY READING THE ENTIRE PLT FILE INTO +; CORE, IN THE PROCESS ENTERING EACH STRING OR VECTOR IN THE APPROPRIATE +; PLACE IN THE RASTAB WHICH IS ORDERED BY SCAN LINE GROUP. IT THEN ENTERS THE +; OUTPUT PHASE, MUNGING OVER THE RASTAB AND WRITING THE PLT FILE. TO GENERATE +; EACH OUTPUT SCAN LINE, THE PROGRAM MUST GRUBBLE DOWN THE ENTIRE LIST +; STORED IN THE RASTAB OF WHICH THE GIVEN OUTPUT LINE IS A MEMBER. AS WELL +; AS INTERSECTING THIS SCAN LINE WITH EACH ELEMENT OF THAT LIST, IF THIS +; SCAN LINE IS THE LAST ONE OF ITS RASTER GROUP AND IF THE ELEMENT IS ALSO +; GOING TO NEED TO BE DISPLAYED ON THE NEXT SCAN LINE, THE OUTPUT PROGRAM +; MUST DETACH IT FROM THIS RASTAB LIST AND ADD IT TO THE NEXT ONE. + +;RASTAB FORMATS: +; HORIZONAL LINES IN THE PAGE IMAGE ARE DIVIDED INTO "GROUPS" WITH +; NUMBER OF CONSECUTIVE LINES PER GROUP. +; EACH GROUP HAS A ONE WORD ENTRY IN THE RASTAB WHICH POINTS TO A LINKED +; LIST OF ALL ITEMS STARTING IN THAT GROUP OF LINES. THIS LINKED LIST +; IS TERMINATED BY A 0 LINK. ELEMENTS OF THE LIST CAN BE EITHER CHARACTERS +; STRINGS OR VECTORS. +; WD0 4.9-4.4-> OBJECT TYPE +; ;0 ERR + %EVEC==10000 ;1 VECTOR, + %ECHAR==20000 ;2 CHARACTER STRING, + %EDIA==30000 ;3 DIAMOND, + %EHVEC==40000 ;4 HORIZONAL VECTOR (DELTA Y = 0) + %EVVEC==50000 ;5 VERTICAL VECTOR (DELTA X = 0) + MXITEM==6 ; ITEM FIELD HAD BETTER BE LESS THAN THIS + +; 4.3 - 3.1 AVAIABLE FOR CHARACTER FONT, ROTATION, ETC. NOT USED NOW. +; RH -- LINK OUT +; IF VECTOR: +; WD1: Y1,, +; WD2: X1,, +; WD3: DY (PER STEP) * 2**18 (MUST BE POSITIVE) +; WD4: DX (PER STEP) * 2**18 (MAY BE POSITIVE OR NEGATIVE) +; WD5: NUMBER OF STEPS LEFT + +; IF HORIZONAL VECTOR: +; WD1: X,,Y (OF LEFT HAND POINT) +; WD2: DELTA X (MUST BE POSITIVE) + +; IF VERTICAL VECTOR: +; WD1: X,,Y (OF TOP POINT) +; WD2: DELTA Y (MUST BE POSITIVE) + +; IF CHARACTER STRING: NOTE: A CHARACTER STRING MUST BE PRINTED ENTIRELY +; ON THE SAME HORIZONAL LINE AND MUST BE ALL IN THE SAME FONT. +; IF THE CHARACTER IS "ROTATED 90 DEGREES CCW", THE CHARACTER +; STRING MUST BE EXACTLY ONE CHARACTER LONG. "SOMEBODY" MUST +; SPLIT UP INPUT CHARACTER STRING TO CONFORM TO THESE RESTRICTIONS +; IF IT DOESNT ALREADY. +; WD1: X,,Y +; WD2: FONT NUMBER (RH) +; WD3-N: ASCII STRING TERMINATED BY 0 CHARACTER + +; IF DIAMOND: +; WD1: X,,Y + +;INTERNAL COORDINATES: +; Y COORDINATE IS SCAN LINE NUMBER, 0 FOR TOP OF PAGE, ETC +; X COORDINATE IS BIT NUMBER IN SCAN LINE, 0 AT LEFT EDGE OF PAGE. +; THESE X ES AND Y ES ARE SWAPPED FROM THOSE REFER ED TO IN THE PLT +; FILE SINCE THE LONG AXIS OF THE PAGE RUNS VERTICALLY ON THE XGP +; BUT IS THE X AXIS IN THE PLT FILE +; ALSO, SINCE THE DRAWING SYSTEM USES 0,0 AS THE CENTER OF THE PICTURE, +; APPROPRIATE OFFSETS MUST BE APPLIED. + YCOFF==10200. ; ORIGINAL X DIRECTION (Y AFTER SWAPPING) + XCOFF==870. ; ORIGINAL Y DIRECTION (X AFTER SWAPPING) + ISCALE==.25_35. ; INITIAL SCALE 4 TO 1 + +;FONT STORAGE +NFONTS==5 ;NUMBER FONTS +; FNTPTR IS A TABLE INDEX OF FONT NUMBER WHICH POINTS AT N TH FONT TABLE. +; IF FNTPTR IS 0, FONT IS NOT LOADED. OTHERWISE LH CONTAINS FONT INFO +; AND RH POINTS TO BASE OF CHARACTER TABLE FOR FONT. +; EA CHARACTER TABLE ENTRY IS 0 IF CHAR UNDEFINED IN FONT. +; IF NON-ZERO, THE RH POINTS AT THE CHAR BIT RASTER AND THE LH CONTAIN +; INFO ABOUT THE CHARACTER. THE BIT RASTER IS STORED "PDP-10" STYLE +; 36 BITS PER WORD. HOWEVER, IT IS STORED ROTATED 90 CCW TO THE +; USUAL ORIENTATION. THIS IS DONE BECAUSE MOST NORMAL TEXT IN DRAWINGS +; WINDS UP COMING OUT VERTICALLY ON THE XGP SINCE THE X AND Y AXES ARE SWAPPED. +; THUS ONLY ONE WORD VECTOR WILL BE REQUIRED PER UNIT OF CHARACTER WIDTH +; UNLESS THE FONT IS MORE THAN 36 HIGH (IN WHICH CASE 2 UP TO 72 WIDE, ETC). +; THERE ARE AS MANY OF THESE ENTIRES AS THE CHARACTER IN QUESTION IS WIDE +; ALSO, SINCE X RASTER ADDRESSES ASCEND TO THE RIGHT, THE BITS MUST BE +; INVERTED WORDWISE. IE THE HIGH ORDER BIT OF THE FIRST WORD IS THE LOWER +; LEFT BIT OF THE CHARACTER RASTER, ETC + +; NOW FOR THE DETAILS: +; PER FONT: +; FONTHT(FONT) HAS FONT HEIGHT IN RASTER UNITS +; FONTHW(FONT) HAS FONT NUMBER OF WORDS PER UNIT WIDTH (IE . +; FONTBS(FONT) HAS FONT BASE LINE +; FONTMW(FONT) HAS MAX WIDTH OF ANY CHAR IN FONT +; PER CHARACTER: + %CHWD==360600 ; CHARACTER WIDTH + %CHRWD==300600 ; RASTER WIDTH + %CHRLC==220600 ; LEFT KERN (A 2 S COMP NUMBER) + +;INTERNAL DISPLAY LIST FORMAT: +; INTERNAL DISPLAY LISTS ARE USED AS A CONVIENT METHOD OF REPRESENTING +;SETS OF VECTORS AND/OR CHARACTERS FOR "INTERNAL PURPOSES" (FOR NOW). +;(FOR EXAMPLE, DRAWING THE "BOX", ETC). THE FORMAT HAS SOME SIMILARITY +;TO VARIOUS DISPLAY PROCESSORS, VARIOUS SUBPARTS OF DPLT FILES, ETC. +; EACH 36 BIT WORD REPRESENTS AN "INSTRUCTION". +; IF THE LOW ORDER BIT IS OFF, THE HIGH 35 BITS ARE 5 ASCII CHARACTERS. +; OTHERWISE THE HIGH 1.4-1.6 ARE AN "OP CODE". (1.2 AND 1.3 ARE +; "MODIFIER BITS", NOT IMMEDIATELY DECODED.) +; IF A PARTICULAR INSTRUCTION SPECIFIES AN X AND Y COORDINATE, +; THESE ARE 15 BITS EACH AND STORED X IN 4.9-3.4 AND Y IN 3.3-1.7 +; IF A PARTICULAR INSTRUCTION SPECIFIES AN ADDRESS, +; THIS IS FOUND IN THE LEFT HALF. + +;THE FOLLOWING OP CODES ARE DEFINED SO AS TO ADD DIRECTLY IN WITHOUT SHIFTING +;THEY INCLUDE THE LOW BIT SET TO "AVOID" CHARACTER MODE. +DHALT==01 ;OP CODE 0 IS OPERATE, ALL ZERO IS HALT +DFNTSL==03 ; FONT SELECT (FONT NUMBER IN LH) +VEC== 11 ;VISIBLE VECTOR FROM "CURRENT POINT" TO CURRENT POINT +DX,DY +IVEC==15 ;"INVISIBLE" VECTOR (SETS CURRENT POINT) +AVEC==21 ;ABSOLUE VISIBLE VECTOR (FROM CURRENT POINT TO X,Y) +AIVEC==25 ;"INVISIBLE" ABSOLUTE VECTOR +MXVOP==2 ;HIGHEST OP USED + +GO: MOVE P,[-LPDL,,PDL-1] + .OPEN INCH,INO + JRST [ .VALUE [ASCIZ /: NO PLT FILES  +/] + JRST GO] + MOVEI A,FS + MOVEM A,FSP ;FREE STORAGE POINTER. + MOVE A,FONTN + PUSHJ P,RDFONT ;READ DRAWING FONT + MOVE A,LAFONT + CAME A,FONTN + PUSHJ P,RDFONT ;READ LABELLING FONT + MOVE A,FSP + MOVEM A,SFSP + MOVE A,[FNTPTR,,SFNTP] + BLT A,SFNTP+NFONTS-1 +RCYCLE: CLEARM IDCX + CLEARM IDCY + CLEARM ITMLST + CLEARM RASTAB + MOVE A,[RASTAB,,RASTAB+1] + BLT A,RASTAB+LRASTB-1 ;CLEAR OUT RASTER TABLE + MOVEI A,INBUF+INBFSZ + MOVEM A,INBUFP + MOVSI A,200000 + MOVEM A,MINYC ;OBTAIN MIN AND MAX X AND Y IN ENTIRE PICTURE + MOVEM A,MINXC ;SO AS TO BE ABLE TO CENTER IT. + MOVNM A,MAXYC + MOVNM A,MAXXC + PUSHJ P,INWD ;READ IO VERSION # + MOVEM A,PLTVER + CAIL A,%VERL + CAILE A,%VERH + .VALUE [ASCIZ/: IO VERSION WRONG, $P TO TRY TO WIN ANYWAY î/] +CMDL: PUSHJ P,INWD ;RETN WD IN A +CMDL1: TRNE A,1 + .VALUE ;LOW BIT SHOULD BE OFF FOR START OF COMMAND + HLRZ B,A + CAIN B,400001 + JRST INFN ;READ TRAILING STUFF OF FILE + TLNN A,1 + JRST PNTLST ;READ LIST OF POINTS + JRST CHARS ;GOBBLE TEXT BLOCK (OR MAYBE DIAMOND ...) + + +CAXY1U: HRRE X1,A ;SWAPPED LEAVE RESULT IN X1,Y1 + ASH X1,-1 ;FLUSH BIT USED FOR COMMAND DECODE + MUL X1,SCALE + ADDI X1,XCOFF ;OFFSET SINCE DRAWING PRGM 0 0 IS AT CENTER + HLRE Y1,A + ASH Y1,-1 + MUL Y1,SCALE ;CLOBBERS X2 + ADDI Y1,YCOFF + POPJ P, + +CAXY1: PUSHJ P,CAXY1U +MXMNU1: CAMLE X1,MAXXC ;SAVE IF THIS MIN OR MAX COORD EVER SEEN + MOVEM X1,MAXXC + CAMGE X1,MINXC + MOVEM X1,MINXC + CAMLE Y1,MAXYC + MOVEM Y1,MAXYC + CAMGE Y1,MINYC + MOVEM Y1,MINYC + POPJ P, + +CAXY2: HRRE X2,A ;LEAVE RESULT IN X2,Y2 + ASH X2,-1 + MUL X2,SCALE + ADDI X2,XCOFF + HLRE Y2,A + ASH Y2,-1 + MUL Y2,SCALE ;CLOBBERS DX + ADDI Y2,YCOFF + CAMLE X2,MAXXC + MOVEM X2,MAXXC + CAMGE X2,MINXC + MOVEM X2,MINXC + CAMLE Y2,MAXYC + MOVEM Y2,MAXYC + CAMGE Y2,MINYC + MOVEM Y2,MINYC + POPJ P, + +PNTLST: PUSHJ P,CAXY1U ;CONVERT DRAWING PROG COORDINATES IN A AND + PUSHJ P,INWD ;LEAVE THEM IN X1 AND Y1 + TRNN A,1 + JRST CMDL1 ;THAT REALLY STARTED "NEW COMMAND" + PUSHJ P,MXMNU1 ;REALLY GOING TO USE THEM, SO UPDATE MAX, MIN + PUSHJ P,CAXY2 ;CONVERT COORDS IN A AND LEAVE THEM IN X2,Y2 + PUSHJ P,VECTAD ;INSERT VECTOR FROM X1,Y1 TO X2,Y2 INTO ITMLST + JRST PNTLST + +VECTAD: CAMLE Y1,Y2 ;ASSURE Y1 LESS OR EQUAL TO Y2 + EXCH X1,X2 + CAMLE Y1,Y2 + EXCH Y1,Y2 + MOVE DY,Y2 + SUB DY,Y1 ;MUST BE POSITIVE + MOVE DX,X2 + SUB DX,X1 ;CAN BE POSITIVE OR NEGATIVE + MOVE C,FSP + HRRZ D,ITMLST + JUMPE DX,SVVEC ;STORE VERTICAL VECTOR + JUMPE DY,SHVEC ;STORE HORIZONAL VECTOR + TLO D,%EVEC + MOVEM D,(C) + HRRZM C,ITMLST + + HRLZM Y1,1(C) + HRLZM X1,2(C) + + MOVM B,DX + CAMGE B,DY + MOVE B,DY + MOVEM B,5(C) ;GREATER DY OR = NUMBER STEPS + AOS 5(C) ;TAKE ONE EXTRA STEP TO HIT BOTH ENDPOINTS + ASH DY,18. + ASH DX,18. + IDIV DY,B + ADDI DY,400 ;MAKE SURE DONT LOSE DUE TO TRUNCATION + MOVEM DY,3(C) + IDIV DX,B + ADDI DX,400 + MOVEM DX,4(C) + + ADDI C,6 +SVVECX: +SHVECX: MOVEM C,FSP + CAIL C,FS+FSL + .VALUE +CPOPJ: POPJ P, ;LOOP AROUND FOR NEXT VECTOR, REPROCESSING + ;FIRST POINT WHICH IS STILL IN A +CHARS: PUSHJ P,CAXY1 + PUSHJ P,INWD + MOVE C,FSP + HRRZ D,ITMLST + HLRZ ZR,A + JUMPE ZR,CHARS1 ;REAL CHAR STRING + CAIN ZR,2 + JRST DIAM ;CONNECTION DIAMOND + .VALUE ;FORMAT ERROR + +SVVEC: JUMPE DY,CPOPJ ;0 LENGTH VECTOR, FLUSH + TLO D,%EVVEC + MOVEM D,(C) + HRRZM C,ITMLST + HRLM X1,1(C) + HRRM Y1,1(C) + AOS DY ;EXTRA STEP TO HIT BOTH ENDPOINTS + MOVEM DY,2(C) + ADDI C,3 + JRST SVVECX + +SHVEC: TLO D,%EHVEC + MOVEM D,(C) + HRRZM C,ITMLST + JUMPGE DX,SHVEC1 + MOVE X1,X2 + MOVNS DX +SHVEC1: HRLM X1,1(C) + HRRM Y1,1(C) + AOS DX ;EXTRA STEP TO HIT BOTH ENDPOINTS + MOVEM DX,2(C) + ADDI C,3 + JRST SHVECX + +;CHAR WIDTH IN A, FIND FONT #, RETURN IN X2 +INTERP: MOVE X2,A + ANDI X2,377777 ;FLUSH VERT BIT + LSH X2,-1 ;GET CHAR WIDTH WANTED (IS *8) + PUSH P,B + PUSH P,C + PUSH P,D + MOVSI D,-NFONTS + MOVSI C,377777 +INTERL: HRRZ B,FONTOP(D) + HRRZ B,-1(B) ;CLAIMED RASTER WIDTH FOR THIS FONT + LSH B,3 ;CHAR SCALE IS REPRESENTED *8 + SUBI B,(X2) + MOVMS B + CAMGE B,C ;BEST SO FAR? + JRST [ MOVE C,B + HRL X2,D ;FONT # + JRST .+1] + AOBJN D,INTERL + HLRZS X2 + POP P,D + POP P,C + POP P,B + JRST INTERD + +CHARS1: MOVE X2,PLTVER + CAIL X2,15 ;VERSION WITH NEW CHAR STUFF + JRST INTERP ;INTERPOLATE CHAR WIDTH TO SELECT FONT + MOVE X2,A + LSH X2,-4 + SOS X2 ;THIS SEEMS TO GIVE CHRS ABOUT RIGHT SIZE.. + ANDI X2,3 +INTERD: SKIPN FNTPTR(X2) + JRST [ MOVEM 16,ACSAV+16 ;FONT NOT IN READ IN FONT NOW + MOVEI 16,ACSAV + BLT 16,ACSAV+15 + MOVE A,X2 + PUSHJ P,RDFONT + MOVSI 16,ACSAV + BLT 16,16 + MOVE C,FSP + JRST .+1] + TLO D,%ECHAR + MOVEM D,(C) + HRRZM C,ITMLST + HRLM X1,1(C) + HRRM Y1,1(C) +; MOVE X2,FONTN ;FONT NUMBER + MOVEM X2,2(C) + ADD X1,FONTHT(X2) ;GET MAX X COORD + ADDI C,3 +CHARS3: PUSHJ P,INWD + TRNN A,1 + JRST CHARS2 + MOVE Y2,[440700,,A] +CHRSL1: ILDB T,Y2 ;FIGURE OUT MAX Y COORD + JUMPE T,CHRSL2 +;CHARACTER TRANSLATION TO ACCOMODATE DRAWING PROGRAM. +;INTERCHANGE UPARROW AND CIRCUMFLEX, LEFTARROW AND UNDERSCORE. + CAIE T,13 + CAIN T,136 + XORI T,13#136 + CAIE T,30 + CAIN T,137 + XORI T,30#137 + DPB T,Y2 +;END OF CHARACTER TRANSLATION + ADD T,FNTPTR(X2) + LDB ZR,[%CHWD,,(T)] + ADD Y1,ZR + TLNE Y2,760000 + JRST CHRSL1 +CHRSL2: MOVEM A,(C) + AOBJP C,CHARS3 + +CHARS2: PUSHJ P,MXMNU1 ;UPDATE MAX, MIN X,Y FROM X1,Y1 + TLNN C,-1 + JRST CHARS5 ;NULL STRING + MOVE ZR,-1(C) ;LAST WD STORED + TRNN ZR,377 + JRST CHARS4 ;OK IT ENDED IN A 0 +CHARS5: CLEARM (C) + AOS C +CHARS4: HRRZM C,FSP + HRRZS C + CAIL C,FS+FSL + .VALUE + JRST CMDL1 + +DIAM: TLO D,%EDIA + MOVEM D,(C) + HRRZM C,ITMLST + HRLM X1,1(C) + HRRM Y1,1(C) + ADDI C,2 + CAIL C,FS+FSL + .VALUE + MOVEM C,FSP + JRST CMDL + +DTXINI: +DSXINI: +RASCZI: MOVE A,[440700,,ASCZBF] + MOVEM A,ASCBFP + CLEARM ASCZBF ;CLEAR OUT ASCZBF TO ASSURE LOW BIT CLEAR + MOVE A,[ASCZBF,,ASCZBF+1] + BLT A,ASCZBF+LASCZB-1 + CLEARM ASCCNT + POPJ P, + +DSIX: MOVE B,[440600,,A] +DSIXL: ILDB C,B + JUMPE C,CPOPJ + PUSHJ P,DSIXCH + TLNE B,770000 + JRST DSIXL + POPJ P, + +DSIXCH: ADDI C,40 +DTXCHR: IDPB C,ASCBFP + AOS ASCCNT + POPJ P, + +DTXP2: IDIVI A,10. + MOVEI C,"0(A) + PUSHJ P,DTXCHR + MOVEI C,"0(B) + PUSHJ P,DTXCHR + POPJ P, + +DTXWD: MOVE B,[440700,,A] +DTXW1: ILDB C,B + JUMPE C,CPOPJ + PUSHJ P,DTXCHR + TLNE B,760000 + JRST DTXW1 + POPJ P, + +RASCZ: PUSHJ P,RASCZI +RASCZ1: PUSHJ P,INWD ;READ IN ASCIZ STRING FROM INPUT. LEAVE IT STARTING AT + MOVE B,[440700,,A] +RASCZ2: ILDB C,B + JUMPE C,RASCZ3 ;HIT TERMINATOR IN INPUT + AOS ASCCNT + IDPB C,ASCBFP + TLNE B,760000 + JRST RASCZ2 + JRST RASCZ1 + +RASCZ3: MOVEI C,DHALT + AOS ASCBFP + MOVEM C,@ASCBFP ;ASSURE STOP AT END OF DISPLAY + POPJ P, + +DTXCA: +DSXTC: PUSHJ P,RASCZ3 ;ACTIVATE STORED SIXBIT TEXT +DTEXTC: MOVE D,FONTMW(A) ;DISPLAY TEXT IN ASCZBF CENTERED AT + ;X AND Y COORDINATES IN B (IN INTERNAL DISPLAY + ;PROCESSOR FORM, 15 BITS EA, LEFT ADJUSTED) + IMUL D,ASCCNT ;USING FONT NUMBER IN A + LSH D,-1 ;GET 1/2 LENGTH OF TEXT + LSH D,6 ;MOVE INTO W COORD POS + SUB B,D +DTEXT: HRLM A,ASCBFT + TRO B,AIVEC + MOVEM B,ASCB0 + MOVEI W,ASCB0 + PUSHJ P,IDLST + POPJ P, + +DBOX: MOVEI W,BOXTAB + PUSHJ P,IDLST ;INTERPRET DISPLAY LIST + POPJ P, + +IDLST: MOVE A,(W) ;INTERPRET DISPLAY LIST, PC IN W + TRNN A,1 + JRST IDLCH ;IN LINE CHARACTERS + LDB B,[30300,,A] + CAILE B,MXVOP + .VALUE + JRST @IDLDT(B) + +IDLDT: IDOPR + IDVEC + IDAVEC + +IDLCH: MOVE X1,IDCX + MOVE Y1,IDCY + SUB X1,XCENOF ;COMPENSATE FOR ADDS THAT WILL HAPPEN LATER + SUB Y1,YCENOF + MOVE C,FSP + HRRZ D,ITMLST + TLO D,%ECHAR + MOVEM D,(C) + HRRZM C,ITMLST + HRLM X1,1(C) + HRRM Y1,1(C) + MOVE X2,IDFNTN + MOVEM X2,2(C) + ADD X1,FONTHT(X2) ;MAX X COORD + ADDI C,3 +IDLCH1: MOVE A,(W) + TRNE A,1 + JRST IDLCH4 + MOVE Y2,[440700,,A] +IDLCH3: ILDB T,Y2 + JUMPE T,IDLCH2 + ADD T,FNTPTR(X2) + LDB ZR,[%CHWD,,(T)] + ADD Y1,ZR + TLNE Y2,760000 + JRST IDLCH3 +IDLCH2: MOVEM A,(C) + AOS W + AOBJP C,IDLCH1 + +IDLCH4: CLEARM (C) + TLNN C,-1 + JRST IDLCH5 ;NULL STRING MUST BE TERMINATED + MOVE Y2,-1(C) + TRNE Y2,177*2 +IDLCH5: AOS C ;ASSURE STRING TERMINATED BY 0 (LEAVE EXTRA WORD IF NEC) + HRRZM C,FSP + HRRZS C + CAIL C,FS+FSL + .VALUE + MOVEM C,FSP + JRST IDLST + +IDOPR: CAIN A,1 + POPJ P, ;END OF LIST + LDB B,[10200,,A] + CAIN B,1 + JRST [ HLRZM A,IDFNTN ;STORE FONT NUMBER TO USE + AOJA W,IDLST] + .VALUE + +IDVEC: .VALUE + +IDAVEC: TRNE A,4 + JRST IDVEC1 ;INVISIBLE, JUST DO SET POINT + MOVE X2,IDCX + MOVE Y2,IDCY + LDB X1,[251700,,A] + TRNE X1,40000 + ORCMI X1,37777 + LDB Y1,[61700,,A] + TRNE Y1,40000 + ORCMI Y1,37777 + MOVEM X1,IDCX ;THESE BECOME CURRENT POINT + MOVEM Y1,IDCY + SUB X1,XCENOF ;COMPENSATE FOR ADD S THAT WILL HAPPEN LATER + SUB X2,XCENOF + SUB Y1,YCENOF + SUB Y2,YCENOF + PUSHJ P,VECTAD + AOJA W,IDLST + +IDVEC1: LDB X1,[251700,,A] + TRNE X1,40000 + ORCMI X1,37777 + LDB Y1,[61700,,A] + TRNE Y1,40000 + ORCMI Y1,37777 + MOVEM X1,IDCX + MOVEM Y1,IDCY + AOJA W,IDLST + +DBUCKS: MOVE A,ITMLST ;RELOCATE EVERYTHING BY XCENOF AND YCENOF AND +DBUCKL: JUMPE A,CPOPJ ;PUT THINGS IN THEIR APPROPRIATE BUCKET + LDB C,[360600,,(A)] ;ITEM TYPE + CAIN C,%EVEC_-12. + JRST DBUCKV ;GENERAL VECTOR ONLY ONE THAT DOESNT HAVE X,Y IN WD1 + HLRE X1,1(A) + HRRE Y1,1(A) + ADD X1,XCENOF + ADD Y1,YCENOF + HRLM X1,1(A) + HRRM Y1,1(A) +DBUCV1: CAIN C,%EDIA_-12. + SUBI Y1,DIAMSZ ;DIAMONDS SORTED BY POS OF TOP NOT CENTER + SKIPG Y1 + TDZA Y1,Y1 + IDIVI Y1,RASGRP + MOVE C,A + HRRZ A,(A) + CAIL Y1,LRASTB + JRST DBUCKL ;STARTS OFF Y RASTER, FLUSH + MOVE B,RASTAB(Y1) + HRRM B,(C) + HRRZM C,RASTAB(Y1) + JRST DBUCKL + +DBUCKV: HLRE X1,2(A) + HLRE Y1,1(A) + ADD X1,XCENOF + ADD Y1,YCENOF + HRLM X1,2(A) + HRLM Y1,1(A) + JRST DBUCV1 + +INFN: MOVE A,MAXXC + ADD A,MINXC ;X CENTER OF PICT AS IS IN RASTER POINTS + ASH A,-1 + MOVEI B,>*/2 ;X CENTER OF BOX + SUB B,A + MOVEM B,XCENOF ;X OFFSET TO CENTER PICTURE + MOVE A,MAXYC + ADD A,MINYC + ASH A,-1 + MOVEI B,*/2 + SUB B,A + MOVEM B,YCENOF ;Y OFFSET TO CENTER PICTURE + PUSHJ P,DBOX ;PUT IN BOX AND STUFF. DONT COUNT THEM IN + ; MINXC, ETC. + PUSHJ P,RASCZ ;DRAWN BY +; MOVE A,LAFONT ;LABELLING FONT NUMBER +; MOVE B,DWBXY ;X Y POSITION OF CENTER OF DRAWN BY TEXT +; PUSHJ P,DTEXTC + PUSHJ P,RASCZ ;FIRST TITLE LINE + MOVE A,LAFONT + MOVE B,1TTLXY + PUSHJ P,DTEXTC + PUSHJ P,RASCZ ;SECOND TITLE LINE + MOVE A,LAFONT + MOVE B,2TTLXY + PUSHJ P,DTEXTC + PUSHJ P,INWD ;READ DATE WORD + PUSHJ P,INWD ;FILE NAME + MOVEM A,FILENA + MOVE A,PLTVER + CAIGE A,14 + JRST INFN1 + PUSHJ P,INWD ;FILE EXT +INFN1: PUSHJ P,INWD ;FILE PPN + MOVEM A,FILEPP + PUSHJ P,DSXINI ;INITIALIZE 6 BIT TEXT DISPLAYER + MOVE A,FILEPP + PUSHJ P,DSIX + MOVEI C,'; + PUSHJ P,DSIXCH + MOVEI C,0 + PUSHJ P,DSIXCH + MOVE A,FILENA + PUSHJ P,DSIX + MOVE B,FILNXY + MOVE A,LAFONT + PUSHJ P,DSXTC + .CALL [ SETZ ;ATTEMPT TO GET CREATION DATE OF DRAW FILE + SIXBIT /OPEN/ + 5000,,0 + 1000,,0 ;CHNL 0 + [SIXBIT /DSK/] + FILENA + [SIXBIT /DRW/] + SETZ FILEPP] + JRST DFDAT1 + .CALL [ SETZ + SIXBIT /RFDATE/ + 1000,,0 + 402000,,FILEDA] + JRST DFDAT2 + PUSHJ P,DTXINI + LDB A,[220500,,FILEDA] + PUSHJ P,DTXP2 ;2 DIGIT DECIMAL PRINT + MOVEI C,"- + PUSHJ P,DTXCHR + LDB A,[270400,,FILEDA] + MOVE A,MONTHS-1(A) + PUSHJ P,DTXWD + MOVEI C,"- + PUSHJ P,DTXCHR + LDB A,[331000,,FILEDA] + PUSHJ P,DTXP2 + MOVEI C,40 + PUSHJ P,DTXCHR + HRRZ A,FILEDA + IDIVI A,120. ;CONVERT 1/2 SECONDS INTO MINUTES + IDIVI A,60. + PUSH P,B + PUSHJ P,DTXP2 + MOVEI C,": + PUSHJ P,DTXCHR + POP P,A + PUSHJ P,DTXP2 + MOVE B,DATEXY + MOVE A,LAFONT + PUSHJ P,DTXCA +DFDAT2: .CLOSE 0, +DFDAT1: PUSHJ P,DBUCKS ;PUT EVERYTHING IN ITS BUCKET .. + .OPEN OUTCH,OUTO ;OUTPUT PHASE + .LOSE %LSFIL + MOVEI A,0 +SCNG: CAIL A,LRASTB + JRST FIN + MOVE B,A + IMULI B,RASGRP ;GET SCAN LINE NUMBER THAT IS BASE OF GROUP + CLEARM SCNBUF + MOVE C,[SCNBUF,,SCNBUF+1] + BLT C,ESCNBF-1 + HRRZ D,RASTAB(A) + JUMPE D,ESCNG ;THAT GROUP NULL + MOVEI T,RASTAB(A) ;WHERE D CAME FROM + MOVEI ZR,1 ;FOR DPB ING +ITML: LDB C,[360600,,(D)] ;GET ITEM TYPE + CAIL C,MXITEM + .VALUE + JRST @ITMDIS(C) ;POINTER TO ITEM IN D, GROUP BASE LINE IN B + ;GROUP INDEX IN A +FLSITM: HRRZ D,(D) ;FLUSH ITEM (IE DELINK IT FROM LIST) + HRRM D,(T) ;SMASH WHAT THIS ONE POINTS TO IN PLACE + JRST NXITM1 ;THAT POINTED TO THIS ONE + +NXITM: MOVE Y1,RASTAB+1(A) ;SHIFT THIS GUY INTO NEXT GROUP + HRRZM D,RASTAB+1(A) + MOVE DX,D + HRRZ D,(D) + HRRM D,(T) ;PATCH OUT + HRRM Y1,(DX) ;PATCH IN +NXITM1: JUMPN D,ITML +ESCNG: PUSHJ P,WRTGRP ;OUTPUT STUFF + AOJA A,SCNG + + +ITMDIS: [.VALUE] + ITMVEC + ITMCHR + ITMDIA + ITMHV + ITMVV + +ITMVEC: HLRE Y1,1(D) + JUMPL Y1,[ SOSGE 5(D) ;IGNORE NEGATIVE PART OF VECTOR + JRST FLSITM + JRST ITMVE1] + CAIL Y1,RASGRP(B) + JRST NXITM ;HAVE DONE ALL OF THIS LINE THAT BELONGS IN THIS + SOSGE 5(D) ;RASTER GROUP + JRST FLSITM ;THAT ONE THRU WITH + HLRZ DX,2(D) ;X POSITION + IDIVI DX,32. + CAIL DX,LSCNBF + JRST ITMVE1 ;X POSITION OUT OF RANGE + SUB Y1,B + IMULI Y1,LSCNBF + ADD DX,Y1 ;DISPLACE FOR SCAN LINE WITHIN GROUP + DPB ZR,SCNPTR(DY) +ITMVE1: MOVE DX,3(D) + ADDM DX,1(D) + MOVE DX,4(D) + ADDM DX,2(D) + JRST ITMVEC + +ITMVV: HRRE Y1,1(D) ;DRAW PART OF VERTICAL VECTOR THAT IS PART + ;OF CURRENT GROUP + JUMPL Y1,[ ADDB Y1,2(D) ;REDUCE DY BY AMT Y IS NEG + JUMPL Y1,FLSITM ;IT LOSES + HLLZS 1(D) ;NOW Y = 0 + MOVEI Y1,0 + JRST .+1] + SUB Y1,B + CAIL Y1,RASGRP ;Y1 NOW HAS NUMBER LINES IN THIS GROUP THAT ARE NOT + ;PART OF LINE + .VALUE ;THAT SHOULDNT HAPPEN + HLRZ DX,1(D) ;PICK UP X + IDIVI DX,32. ;GET WORD, BIT ADR + CAIL DX,LSCNBF + JRST FLSITM + MOVE X1,BITTAB(DY) + HRRZ Y2,Y1 + ADD Y2,2(D) + CAIGE Y2,RASGRP + JRST ITMVV1 ;VECTOR DOES NOT EXTEND THRU REST OF GROUP ONCE IT STARTS + JRST ITMVVT(Y1) +ITMVVT: REPEAT RASGRP, IORM X1,SCNBUF+(DX) + SUBI Y1,RASGRP ;GET - # POINTS TURNED ON + ADDB Y1,2(D) ;DECREMENT DY + JUMPLE Y1,FLSITM + MOVEI Y1,RASGRP(B) + HRRM Y1,1(D) ;UPDATE Y TO START ON NEXT GROUP + JRST NXITM + +ITMVV1: IMULI Y1,LSCNBF + ADD Y1,DX +ITMVV2: SOSGE 2(D) + JRST FLSITM + IORM X1,SCNBUF(Y1) + ADDI Y1,LSCNBF + JRST ITMVV2 + +ITMHV: HRRE Y1,1(D) ;DRAW HORIZONAL VECTOR + JUMPL Y1,FLSITM + SUB Y1,B ;GET LINE NUMBER WITHIN GROUP + HLRE DX,1(D) + JUMPL DX,[ ADDB DX,2(D) ;REDUCE DX BY AMOUNT X IS NEG + JUMPL DX,FLSITM + HRRZS 1(D) + MOVEI DX,0 + JRST .+1] + MOVE X1,DX + ADD X1,2(D) ;ENDING X + SUBI X1,LSCNBF*32. ;SUBTRACT MAX ALLOWABLE + MOVNS X1 + SKIPGE X1 + ADDM X1,2(D) ;REDUCE DX BY ENUF TO STAY IN BOUNDS + SKIPG 2(D) + JRST FLSITM + IDIVI DX,32. ;DY GETS # POINTS AT LEFT EDGE OF WORD THAT ARE NOT + CAIL DX,LSCNBF ; PART OF THIS VECTOR + JRST FLSITM ; STARTING X OFF TO HIGH SIDE + HRRZ Y2,DY ;BIT OFFSET OF START OF VECTOR + ADD Y2,2(D) ;LENGTH OF VECTOR + LSH Y2,-5 ;GET WORD VECTOR ENDS IN (RELATIVE TO ITS START) + IMULI Y1,LSCNBF + ADD Y1,DX ;NOTE: STORING ROUTE MUST ASSURE DX DOESNT TAKE US + ;OUT OF RANGE Y1 NOW HAS START SCNBUF WORD INDEX + JUMPE Y2,ITMHV1 ;SAME AS IT STARTS? JUMP ON YES DO IT THE SLOW WAY + MOVE X1,RTBTTB(DY) ;GET RIGHT BIT MASK + IORM X1,SCNBUF(Y1) + SUBI DY,32. +ITMHV3: AOS Y1 + ADDB DY,2(D) ;DECREMENT DX FOR BITS DRAWN SO FAR + CAIGE DY,32. + JRST ITMHV2 ;LESS THAN A WORD FULL OF BITS LEFT + MOVNI X1,20 + MOVEM X1,SCNBUF(Y1) + MOVNI DY,32. + JRST ITMHV3 + +ITMHV2: MOVE X1,LFBTTB(DY) + IORM X1,SCNBUF(Y1) + JRST FLSITM + +ITMHV1: MOVE X1,BITTAB(DY) + IORM X1,SCNBUF(Y1) + SOSG 2(D) + JRST FLSITM + AOJA DY,ITMHV1 + +INWD: HRRZ A,INBUFP + CAIL A,INBUF+INBFSZ + JRST INWD1 + MOVE A,(A) + AOS INBUFP + POPJ P, + +ITMCHR: HLRE X1,1(D) ;PLOT CHR STRING + HRRE Y1,1(D) ;THIS X,Y ARE COORDINATES OF LOWER LEFT CORNER OF + ;RASTER OF FIRST CHARACTER + HRRZ X2,2(D) ;FONT NUMBER + MOVEI C,3(D) + HRLI C,440700 ;BYTE POINTER TO CHAR STRING + MOVEM C,CSBYP + CLEARM KPSTF ;SET THIS IF WANT TO "KEEP" STRING + MOVE Y2,X1 ; IE IF IT EXTENDS BEYOND CURRENT RASTER GROUP + JUMPL Y2,FLSITM ;OUT OF RANGE + ADD Y2,FONTHT(X2) + CAIL Y2,LSCNBF*32. + JRST FLSITM ;OUT OF RANGE + MOVE DX,X1 + IDIVI DX,32. + MOVEM DX,CSXWDO ;X WORD OFFSET + MOVEM DY,CSXBTO ;X BIT OFFSET IE FIRST BIT OF RASTER SHOULD BE + MOVNS DY ;SHIFTED RIGHT THIS MUCH + HRRZM DY,CSXSFT ;NEGATIVE NUMBER SUITABLE FOR LSHC @ +ICHLP: ILDB Y2,CSBYP ;PICK UP CHAR + JUMPE Y2,ICHLPX ;THRU + SKIPN C,FNTPTR(X2) + .VALUE ;FONT NOT LOADED? + ADD Y2,C + SKIPN TT,(Y2) ;CHAR DEFINED IN THAT FONT? + MOVE TT,"?(C) + JUMPL Y1,ICHLP1 ;IS THIS CHAR COMPLETELY OFF RASTER? + LDB W,[%CHWD,,TT] ;WIDTH OF CHARACTER + MOVE DX,W + ADD DX,Y1 ;Y COORD OF END OF CHAR + CAIGE DX,(B) + JRST ICHLP1 ;ENDS BELOW CURRENT RASTER GROUP + CAIL Y1,RASGRP(B) + JRST NXITM ;STARTS ABOVE CURRENT RASTER GROUP + ; (SO REST OF STRING WILL BE IN NEXT GROUP) + LDB DY,[%CHRLC,,TT] ;GET LEFT KERN + TRNE DY,40 + ORCMI DY,77 + SUB Y1,DY +ICHLP9: LDB DX,[%CHRWD,,TT] ;GET RASTER WIDTH + SUBM W,DX ;ANY RIGHT SIDE NULLNESS? + ADD DX,DY + MOVEM DX,ICHRNL ;# RIGHT SIDE BLANK LINES + LDB W,[%CHRWD,,TT] ;REAL RASTER WIDTH +ICHLP2: CAIGE Y1,(B) ;ACTUAL LOOP TO PUT CHAR IN. LOOP ONCE FOR EACH + JRST ICHLP4 ;UNIT CHAR WIDTH (SPACE OVER RASTER WD WOULD HAVE USED) + CAIL Y1,RASGRP(B) + JRST [ SETOM KPSTF ;WANT TO SET BITS IN NEXT RASTER GROUP + JRST ICHLPX] + MOVE DX,(TT) ;GET BITS + AOS TT ;MOVE TO NEXT WD OF CHAR + MOVEI DY,0 + LSHC DX,@CSXSFT ;SHIFT THEM RIGHT + LSHC DX,-4 ;CREATE "HOLE" IN RIGHT PLACE + LSH DX,4 + MOVE C,Y1 + SUB C,B ;SCAN LINE WITHIN GROUP + CAIL C,RASGRP + .VALUE + IMULI C,LSCNBF + ADD C,CSXWDO + IORM DX,SCNBUF(C) + IORM DY,SCNBUF+1(C) +ICHLP3: AOS Y1 + SOJG W,ICHLP2 +ICHLPB: SKIPLE ICHRNL + ADD Y1,ICHRNL + JRST ICHLP + +ICHLP4: HRRZ DX,B ;SPACE PAST PART OF CHAR NOT IN CURRENT RASTER + SUB DX,Y1 ;GROUP + CAMLE DX,W + MOVE DX,W + ADD TT,DX + ADD Y1,DX + SUB W,DX + JUMPG W,ICHLP2 + JRST ICHLPB + +ICHLP1: ADD Y1,W ;SPACE PAST CHAR WITHOUT TRYING TO PUT IT IN + JRST ICHLP + +ICHLPX: SKIPE KPSTF + JRST NXITM ;REENTER STRING IN NEXT GROUP + JRST FLSITM ;FLUSH STRING + +DIAMSZ==4 ;RADIUS OF A DIAMOND +ITMDIA: HLRE X1,1(D) ;GET CENTER COORDS OF DIAMOND + HRRE Y1,1(D) + MOVE Y2,B ;FIRST SCAN LINE THIS RASTER GROUP +DIAMO1: MOVE DX,Y1 + SUB DX,Y2 ;NUMBER OF LINES ABOVE CENTER + JUMPL DX,DIAMO2 ;BELOW CENTER + SUBI DX,DIAMSZ ;- NUMBER OF LINES BELOW TOP (= HALF WIDTH) + JUMPGE DX,DIAMO9 ;ABOVE TOP, NO INK + MOVE X2,DX +DIAMO3: LSH X2,1 ;- # POINTS IN THIS RASTER LINE + ADD DX,X1 ;FIRST POINT + IDIVI DX,32. ;DX WD NO, DY BIT NO + MOVE W,Y2 + SUB W,B + IMULI W,LSCNBF ;ORIGIN THIS SCAN LINE + ADDI DX,SCNBUF(W) ;ABSOLUTE WORD NO + SETO TT, + SETZ W, + LSHC TT,(X2) ;W GETS LEFT-ADJUSTED BIT MASK + MOVE TT,W + SETZ W, + MOVNS DY + LSHC TT,(DY) ;ALIGN MASK + MOVE DY,TT ;FIRST WORD + TRZ DY,17 + LSHC TT,-4 ;TT GETS SECOND WORD + IORM DY,(DX) ;STORE + IORM W,1(DX) ;.. +DIAMO9: CAIGE Y2,RASGRP-1(B) + AOJA Y2,DIAMO1 ;NEXT RASTER LINE WITHIN GROUP + MOVEI TT,DIAMSZ(Y1) ;LAST LINE THIS DIAMOND WRITES ON + SUBI TT,RASGRP(B) ;NUMBER OF LINES OF NEXT GROUP NEEDED + JUMPL TT,FLSITM ;DONE + JRST NXITM ;NEED TO DO MORE ON THIS ONE NEXT GROUP + +DIAMO2: ADDI DX,DIAMSZ ;NUMBER OF LINES ABOVE BOTTOM (= HALF WIDTH) + JUMPLE DX,DIAMO9 ;BELOW BOTTOM, NO INK + MOVNS X2,DX ;REFLECT ABOUT EQUATOR + JRST DIAMO3 ;REJOIN UPPER CASE + +FIN: HRROI A,[2_<16.+4>+<100000+<*PAGRES>/10.>_4] ;CAUSE XGP PAPER CUT + .IOT OUTCH,A + .CLOSE OUTCH, + SKIPL DELSW + .VALUE + MOVE A,[INCH,,B] + .RCHST A, + HRLZS B ;LEFT ADJUST DEVICE NAME + .CALL [ SETZ + SIXBIT /DELETE/ + B + C + D + SETZ X1] + JFCL +RINI: MOVE A,SFSP + MOVEM A,FSP + MOVE A,[SFNTP,,FNTPTR] + BLT A,FNTPTR+NFONTS-1 ;RESTORE STATE OF FONTS IN WHEN RESETTING + ;FREE STORAGE + .OPEN INCH,INO + JRST [ .VALUE [ASCIZ /: SCNV FINISHED  +/] + JRST .-1] + JRST RCYCLE + +INWD1: MOVE A,[-INBFSZ,,INBUF] + .IOT INCH,A + MOVEI A,INBUF + MOVEM A,INBUFP + JRST INWD + +RDFONT: CAIL A,NFONTS + .VALUE + MOVE B,FONTOP(A) + .CALL FNOPEN ;READ IN FONT INDEX IN A + .LOSE %LSFIL + CLEARM RDFWC + PUSHJ P,RDFW ;READ FONT WD, RETN IN C + MOVEM C,FONTID(A) + PUSHJ P,RDFW + HRRZM C,FONTHT(A) ;FONT HEIGHT + LDB ZR,[221100,,C] + MOVEM ZR,FONTBS(A) ;BASE LINE + LDB ZR,[331100,,C] + MOVEM ZR,FNTCPA(A) ;COLUMN POSITION ADJUSTMENT + MOVEI X2,35.(C) + IDIVI X2,36. + MOVEM X2,FONTHW(A) ;# WDS REQD PER UNIT OF CHAR WIDTH + CLEARM FONTMW(A) + MOVEI D,36. ;COMPUTE SHIFT FOR FIRST ROW + SUBI D,(C) ;SUCH THAT LAST ROW COMES OUT IN HIGH + HRRZM D,RDFSH1 ;ORDER BIT POSITION + MOVE D,FSP + MOVEI X1,200(D) + CAIL X1,FS+FSL + .VALUE + MOVEM X1,FSP + MOVEM D,FNTPTR(A) + HRLI ZR,(D) + HRRI ZR,1(D) + CLEARM (D) + BLT ZR,177(D) ;CLEAR FONT TABLE +RDFCH: PUSHJ P,RDFW + CAIE C,1 + JRST RDFCH1 + PUSHJ P,RDFW + HRRZ X1,C ;CHAR CODE + HLRE ZR,C ;LEFT KERN + ADD ZR,FNTCPA(A) ;COLUMN POSITION ADJUSTMENT + PUSH P,ZR + ADD X1,FNTPTR(A) ;GET INDEX IN FONT TABLE + PUSHJ P,RDFW + HLRZ Y1,C ;RASTER WIDTH + MOVE T,FSP + DPB Y1,[%CHRWD,,T] ;WIDTH OF RASTER + DPB C,[%CHWD,,T] ;WIDTH OF CHAR + POP P,ZR + DPB ZR,[%CHRLC,,T] ;LEFT KERN OF CHAR + CAMLE Y1,FONTMW(A) + MOVEM Y1,FONTMW(A) ;THIS WIDEST CHAR SO FAR + MOVE X2,Y1 + IMUL X2,FONTHW(A) ;# WDS PER UNIT OF CHAR WIDTH + MOVE C,X2 + ADDI C,(T) + CAIL C,FS+FSL + .VALUE + HRRZM C,FSP + HRLI ZR,(T) + HRRI ZR,1(T) + CLEARM (T) + BLT ZR,-1(C) ;CLEAR OUT STG TO BE USED FOR CHAR + MOVEM T,(X1) ;STORE POINTER IN CHAR TABLE + CLEARM RDFRWC ;ROW COORDINATE + CLEARM RDFBYC ;BYTES LEFT IN CURRENT WORD +RDFWL1: CLEARM RDFWDC ;WIDTH COORDINATE + CLEARM RDFBTC ;BITS LEFT IN CURRENT BYTE +RDFWL: PUSHJ P,RDFGBT ;GET BIT, RETURN IN C + LSH C,@RDFSH1 ;SHIFT INTO POSITION FOR FIRST ROW + LSH C,@RDFRWC ;NOW SHIFT FOR WHAT ROW THIS IS + HRRZ Y2,T + ADD Y2,RDFWDC + IORM C,(Y2) + AOS Y2,RDFWDC + CAMGE Y2,Y1 + JRST RDFWL + AOS Y2,RDFRWC + CAMGE Y2,FONTHT(A) + JRST RDFWL1 + JRST RDFCH ;THRU WITH CHAR + +RDFCH1: .CLOSE FNTICH, + POPJ P, + +RDFGBT: MOVE C,RDFBTC + TLNN C,770000 + JRST RFGBT1 ;GOBBLE NEW BYTE + ILDB C,RDFBTC ;RETURN BIT + POPJ P, + +RFGBT1: MOVE C,RDFBYC + TLNN C,700000 + JRST RFGBT2 ;NO MORE BYTES THIS WD + ILDB D,RDFBYC + MOVEI C,0 + CIRC C,8 ;REVERSE BITS IN BYTE + MOVEM C,RDFBYT + MOVE C,[100100,,RDFBYT] + MOVEM C,RDFBTC + JRST RDFGBT + +RFGBT2: PUSHJ P,RDFW + MOVEM C,RDFWDT + MOVE C,[441000,,RDFWDT] + MOVEM C,RDFBYC + JRST RFGBT1 + +RDFW: SOSGE RDFWC + JRST RDFW1 + AOS C,RDFP + MOVE C,-1(C) + POPJ P, + +RDFW1: MOVE C,[-RDFBFL,,RDFBF] + HRRZM C,RDFP + .IOT FNTICH,C + SUBI C,RDFBF + HRRZM C,RDFWC + SKIPE RDFWC + JRST RDFW + .VALUE + +WRTGRP: MOVEM A,WRTGPN ;WRITE SCAN GROUP IN A. + CLEARM WRTLIG ;LINE WITHIN GROUP +WRTGL: MOVE A,WRTLIG + IMULI A,LSCNBF ;GET AOBJN POINTER TO ORIGIN OF SCAN LINE WE WANT TO WRITE + HRLI A,-LSCNBF + ADDI A,SCNBUF +IFE GOULDP,[ + PUSHJ P,CNVRT ;CONVERT THOSE BIT FOR XGP (EITHER RUN LENGTH OR IMAGE, + ; WHICHEVER IS SHORTER. STORE CONVERTED BYTE STRING + ; IN BYTBF. RETURN LENGTH OF STRING (IN PDP-10 WDS) + ; IN B (0 -> NULL RASTER LINE) + JUMPE B,WRTGL1 + MOVE D,B + ADDI D,1 ;FOR THE EXTRA POSITION/LENGTH WORD + LSH D,1+16.+4 ;CONVERT TO PDP11 WDS (AND MOVE INTO HIGH PDP11 WD POSITION) + MOVE ZR,WRTGPN + IMULI ZR,RASGRP + ADD ZR,WRTLIG ;COMPUTE RASTER LINE NUMBER + AOS ZR ;ALWAYS ADD 1 TO AVOID A SPEC OF 0 WHICH WOULD BE EOF + DPB ZR,[042000,,D] + HRROI C,D + .IOT OUTCH,C + MOVNS B + HRLZS B + HRRI B,BYTBF +] +.ELSE MOVE B,A ;DO SOME COMPRESSION HERE SOMEDAY + .IOT OUTCH,B ;OUTPUT CONVERTED SCAN LINE +WRTGL1: AOS B,WRTLIG + CAIGE B,RASGRP + JRST WRTGL + MOVE A,WRTGPN + POPJ P, + +WRTGPN: 0 ;GROUP NUMBER +WRTLIG: 0 ;LINE IN GROUP + +CNVRT: MOVEM A,CVSCP + SETZM LSTBB' ;AOBJN POINTER IN A TO SCAN LINE TO BE CONVERTED + SETZM BYTCNT' + SETZB TT,D ;BIT COUNT, LAST DIFFERENT BIT COUNT + MOVEI C,0 + JSP T,DEP + JFCL + MOVEI C,0 + JSP T,DEP + JFCL +W1: MOVE B,(A) +W2: JFFO B,DOW ;FOUND A BLACK BIT +W3: ADDI D,32. ;ALL BITS OF THIS WORD WHITE + AOBJN A,W1 + MOVE C,LSTBB + MOVEM C,BYTCNT ;BACKUP BYTE BUFFER TO LAST BLACK BITS +REPEAT 3,[ MOVEI C,0 ;ESCAPE CODE + JSP T,DEP + JRST IMSL +] + MOVEI C,1 + JSP T,DEP + JRST IMSL + JRST ESL + +B1: SETCM B,(A) +B2: JFFO B,DOB ;FOUND A WHITE BIT +B3: ADDI D,32. + AOBJN A,B1 + MOVEI C,0 + JRST DOB ;PRETEND WE JUST GOT A WHITE BIT + +DOW: ANDCA B,MTB(C) + CAIL C,40 + JRST W3 + ADD C,D ;BIT POSITION OF THIS BIT + EXCH C,TT ;LAST CHANGE UPDATE + SUBM TT,C ;DIFFERENCE IN C +DOW2: CAILE C,377 + JRST DOW1 + JSP T,DEP + JRST IMSL + JRST B2 + +DOW1: MOVEM C,TEMP' + MOVEI C,377 + SUBM C,TEMP + JSP T,DEP + JRST IMSL + JSP T,DEP + JRST IMSL + MOVN C,TEMP + JRST DOW2 + +DOB: ANDCA B,MTB(C) + CAIL C,40 + JRST B3 + ADD C,D + EXCH TT,C + SUBM TT,C +DOB2: CAILE C,377 + JRST DOB1 + JSP T,DEP + JRST IMSL + MOVE C,BYTCNT + MOVEM C,LSTBB ;SAVE LAST BYTE USED FOR BLACKNESS + JRST W2 + +DOB1: MOVEM C,TEMP + MOVEI C,377 + SUBM C,TEMP + JSP T,DEP + JRST IMSL + JSP T,DEP + JRST IMSL + MOVN C,TEMP + JRST DOB2 + +MTB: REPEAT 36.,[ + <-1>_<-.RPCNT> +] + +DEP: MOVE X1,BYTCNT + CAIL X1,BYTMAX ;CAN WE DO BETTER IN IMAGE MODE? + JRST (T) ;YES + MOVE Y1,X1 + ANDI Y1,3 + LSH X1,-2 + DPB C,BYTAB(Y1) ;DEPOSIT IN THE KLUDGY FORMAT WANTED BY THE XGP + MOVEI C,0 + AOS BYTCNT + JRST 1(T) + +BYTAB: 241000,,BYTBF(X1) + 341000,,BYTBF(X1) + 041000,,BYTBF(X1) + 141000,,BYTBF(X1) + +BYTBF: BLOCK LSCNBF + +;GET HERE WHEN THE RUN LENGTH ENCODED VERSION IS LONGER THAN AN IMAGE SCAN LINE, +;AND WE WANT TO CONVERT THE BIT MAP INTO AN IMAGE SCAN LINE. + +IMSL: MOVE A,CVSCP ;POINTER TO SCAN LINE + SETOM LSTBB ;WE HAVE BLACKNESS IN THIS LINE + SETZM BYTCNT ;START AT BEG OF THE BYTCOUNT + MOVEI C,0 ;ESC + JSP T,DEP + JFCL + MOVEI C,2 ;ENTER IMAGE MODE + JSP T,DEP + JFCL +IMSL1: MOVE C,(A) ;PICKUP WORD FROM BIT MAP + CIRC C,44 ;REVERSE BIT ORDER + MOVE C,D ;PICKUP FIRST 8 BITS + JSP T,DEP + JFCL + LSH D,-8 ;NEXT 8, ETC. + MOVE C,D + JSP T,DEP + JFCL + LSH D,-8 + MOVE C,D + JSP T,DEP + JFCL + LSH D,-8 + MOVE C,D + JSP T,DEP + JFCL + AOBJN A,IMSL1 ;BACK FOR THE NEXT BIT MAP WORD +ESL: MOVE B,BYTCNT + ADDI B,3 ;ROUND OFF TO NEXT HIGHER WORD + LSH B,-2 ;FOUR BYTES/WORD + SKIPN LSTBB + MOVEI B, ;RETURN ZERO IF THIS LINE IS NULL + POPJ P, + +CVSCP: 0 ;AOBJN POINTER TO SCAN LINE CONVERTING + + + +FILENA: 0 ;DRW FILE NAME (SIXBIT) +FILEPP: 0 ;DRW FILE PPN (SIXBIT) +FILEDA: 0 ;DRW FILE TIME OF CREATION (OBTAINED BY OPENING IT, ETC) +ASCBFP: 0 ;POINTER TO ASCIZ STRING BUFFER +ASCCNT: 0 ;# NON ZERO CHARS IN BUFFER + +LAFONT: 3 ;FONT TO DO LABELLING IN + +PLTVER: 0 ;IO VERSION OF 'PLT' FILE + +1TTLXY: BBX BXLLX+BXTXOF,BXLLY+BDTLN/4 +2TTLXY: BBX BXLLX+BXTXOF,BXLLY+3*BDTLN/4 +FILNXY: BBX BXLLX+BXTXOF,BXURY-BFNLN/2 +DATEXY: BBX BXLLX+BXTXOF,BXURY-BFNLN-BDALN/2 + +ASCB0: 0 ;STORE INVISIBLE POINT TO LOCATE STRING HERE +ASCBFT: 0,,DFNTSL ;SELECT APPROPRIATE FONT +ASCZBF: BLOCK LASCZB ;ASCIZ STRING BUFFER + +SCALE: ISCALE ;RATIO OF PLOTTER STEPS TO XGP STEPS. FRACTION + ;WITH BINARY POINT AT 4.8. INITIALLY .25_35. + +KPSTF: 0 ;-1 IF TRIED TO SET RASTER BITS IN NEXT RASTER GROUP + ; IE RESCHEDULE THIS STRING IN NEXT GROUP AFTER FINISH + ; WITH IT IN THIS GROUP +CSXWDO: 0 ;X WORD OFFSET FOR STRING +CSXBTO: 0 ;X BIT OFFSET FOR STRING +CSXSFT: 0 ;AMT TO LSHC (,-CSXBTO) +CSBYP: 0 ;BYTE POINTER TO STRING +ICHRNL: 0 ;# BLANK LINES TO RIGHT OF CHR + +FONTN: 0 ;FONT NUMBER TO REALLY USE FOR NOW + +MINXC: 0 ;MINIMUM X COORD IN ENTIRE PICTURE +MAXXC: 0 ;MAX -- NOTE THESE ARE AFTER AXIS SWAPPING AND INITIAL +MINYC: 0 ;MIN Y -- SCALING AND OFFSETTING. +MAXYC: 0 ;MAX Y + +XCENOF: 0 ;AMOUNT TO ADD TO ALL X COORDINATES TO CENTER PICT +YCENOF: 0 ;AMOUNT TO ADD TO ALL Y " + +ITMLST: 0 ;INITIAL LIST OF ALL ITEMS. HOLD THEM HERE UNTIL KNOW + ;XCENOF AND YCENOF AND CAN PUT THEM IN RASTAB LISTS. + +IDCX: 0 ;CURRENT X IN INTERNAL DISPLAY PROC +IDCY: 0 ;CURRENT Y +IDFNTN: 0 ;FONT NUMBER TO USE FOR DISPLAY PROCESSOR CHARS + +MONTHS: ASCIZ /JAN/ + ASCIZ /FEB/ + ASCIZ /MAR/ + ASCIZ /APR/ + ASCIZ /MAY/ + ASCIZ /JUN/ + ASCIZ /JUL/ + ASCIZ /AUG/ + ASCIZ /SEP/ + ASCIZ /OCT/ + ASCIZ /NOV/ + ASCIZ /DEC/ + +FNTPTR: BLOCK NFONTS +FONTHT: BLOCK NFONTS +FONTHW: BLOCK NFONTS +FONTBS: BLOCK NFONTS +FONTMW: BLOCK NFONTS ;MAX RASTER WIDTH OF ALL CHARS +FONTID: BLOCK NFONTS +FNTCPA: BLOCK NFONTS ;COLUMN POSITION ADJUSTMENT + +RDFRWC: 0 ;ROW COORDINATE +RDFBYC: 0 ;BYTE POINTER TO PENDING WORD +RDFWDC: 0 ;WIDTH COORDINATE +RDFBTC: 0 ;BYTE POINTER TO PENDING BYTE +RDFBYT: 0 ;PENDING BYTE +RDFWDT: 0 ;PENDING WORD +RDFSH1: 0 ;SHIFT FOR FIRST ROW OF FONT SUCH THAT LAST ROW COMES + ;OUT IN HIGH ORDER BIT POSITION +RDFWC: 0 ;WDS LEFT IN RDFBF +RDFP: 0 ;POINTER TO RDFBF +RDFBF: BLOCK RDFBFL + +FONTOP: REPEAT NFONTS,CONC FNTO,\.RPCNT, + +FNOPEN: SETZ + SIXBIT /OPEN/ + 5000,,6 + 1000,,FNTICH + [SIXBIT /DSK/] + (B) + 1(B) + SETZ 2(B) + + 9. +FNTO0: SIXBIT /13FG/ + SIXBIT /KST/ + SIXBIT /FONTS/ + + 12. +FNTO1: SIXBIT /20FG/ + SIXBIT /KST/ + SIXBIT /FONTS/ + + 16. +FNTO2: SIXBIT /25FG/ + SIXBIT /KST/ + SIXBIT /FONTS/ + + 23. +FNTO3: SIXBIT /33FR/ + SIXBIT /KST/ + SIXBIT /FONTS/ + + 30. +FNTO4: SIXBIT /40VSHD/ + SIXBIT /KST/ + SIXBIT /FONTS/ + + +INO: 6,,(SIXBIT /DSK/) + SIXBIT />/ + SIXBIT /PLT/ + 0 + +OUTO: 7,,(SIXBIT /DSK/) + SIXBIT />/ + SIXBIT /SCN/ + 0 + +BOXTAB: BBX BXLLX,BXLLY,AIVEC ;XGP BOX + BBX BXLLX,BXURY,AVEC + BBX BXURX,BXURY,AVEC + BBX BXURX,BXLLY,AVEC + BBX BXLLX,BXLLY,AVEC + BBX BXLLX+XGPLAB,BXLLY,AIVEC + BBX BXLLX+XGPLAB,BXURY-BFNLN-BDALN,AVEC + BBX BXLLX,BXURY-BFNLN-BDALN,AVEC + BBX BXLLX+XGPLAB,BXURY-BFNLN-BDALN,AIVEC + BBX BXLLX+XGPLAB,BXURY-BFNLN,AVEC + BBX BXLLX,BXURY-BFNLN,AVEC + BBX BXLLX+XGPLAB,BXURY-BFNLN,AIVEC + BBX BXLLX+XGPLAB,BXURY,AVEC + BBX 0,0,DHALT + +BITTAB: REPEAT 32.,SETZ_-.RPCNT +RTBTTB: REPEAT 32.,<<-1>_-.RPCNT>&-20 +LFBTTB: REPEAT 32.,<-20_<32.-.RPCNT>> + +INBUFP: 0 +DELSW: -1 ;IF -1, DELETE INPUT AND RECYCLE +FSP: FS +SFSP: 0 ;FSP AFTER READING IN FONTS +ACSAV: BLOCK 17 ;SAVE AC S WHEN READING FONT IN MIDDLE OF PLT INPUT +SFNTP: BLOCK NFONTS ;SAVED STATE OF FNTPTR AFTER INITIAL FONT READIN + ;RESET WHEN RESETTING FSP +SCANLN: 0 ;SCAN LINE NUMBER +LINGRP: 0 ;IF -1, THIS SCAN LINE IS LAST IN ITS GROUP, AND ANY ITEMS + ;REMAINING ACTIVE MUST BE MOVED INTO LIST OF NEXT GROUP. + +SCNPTR: REPEAT 32., <43-.RPCNT>_12.+100,,SCNBUF(DX) + +CONSTANTS +VARIABLES + +PATCH: PAT: BLOCK 100 + +PDL: BLOCK LPDL + +INBUF: BLOCK INBFSZ + +SCNBUF: BLOCK LSCNBF*RASGRP ;BUFFERS A GROUP WORTH OF SCAN LINES +ESCNBF: + +RASTAB: BLOCK LRASTB + 0 ;GARBAGE WORD, MUST FOLLOW RASTAB + +FS: BLOCK FSL + + 105 +END GO +