perm filename PPCP.FAI[NET,GUE] blob
sn#014265 filedate 1972-11-29 generic text, type T, neo UTF8
;AC'S, BITS, RETICLES(PC), BOX SIZES
ITSSW←←0
IFDEF .IOT,<ITSSW←←-1>
IFNDEF PCSW{DSW←←1
PCSW←←0}
IFN PCSW,<DSW←←0>
DEFINE ITS<IFN ITSSW>
DEFINE NOITS<IFE ITSSW>
DEFINE MD<IFN DSW>
DEFINE MPC<IFN PCSW>
MD,{TITLE P}
MPC,{TITLE PCP}
EXTERNAL PLOTS,PLOT,SYMBOL,WHERE,SETXY,REF,JOBFF,JOBREL,ROTIT
ITS,<
EXTERNAL ITSGO
>;ITS
OPDEF DSKPPN[CALLI 400071]
MAXVER←←2 ;MAXIMUM VERSION # WE KNOW ABOUT
;AC'S:
A←1
B←2
C←3
D←4
E←5
F←6
G←7
H←10
I←11
FLAG←12 ;FLAG WORD
T←13
TT←14
TTT←15
P←17
ITS,<NOLIT↔XALL>
;FLAG BITS FOUND IN FLAG
MPC,{
DOMAG←←1 ;MAKING TRW MAGTAPE
DOTAPE←←2 ;MAKING DRILL TAPE
PLANE←←4 ;THIS IS AN INNER PLANE
TRWDRL←←10 ;DRILL HOLES ONLY
};MPC
MD,{
PRODUCE←←1 ;FR80 PRODUCTION RUN!
};MD
FR80←←20 ;FR80 OUTPUT
IKNOW←←40 ;I KNOW WHERE I WAS LAST
%DOPLT←←100 ;PLOTTING ON CALCOMP
IFLAG←←400 ;READING INDIRECT DESCRIPTOR
IREAD←←1000 ;READING INDIRECT FILE
RSTENB←←2000 ;ENABLE RESTART CAPABILITY
MPC,{
;1/2 WIDTH OF CONNECTOR FINGER IN MILS
FWIDTH←←=40
;RETICLE DEFINITIONS
LINRET←←1 ;LINE DRAWING
TXTRET←←2 ;TEXT DRAWING
IPBRET←←3 ;INNER PLANE BORDER
FNGRET←←4 ;FINGERS
TARRET←←5 ;TARGETS
DONUT←←6 ;FIRST PAD MUST BE DONUT
;7 NORMAL PAD
;8 INNER PLANE CLEARANCE
;9 PIN 1 SQUARE
};MPC
MD,{
;DRAWING SIZES ***********
;A 8.5 X 11
AH←←(=8500-=500)/5
AW←←(=11000-=500)/5
;B 11 X 17
BH←←(=11000-=1000)/5
BW←←(=17000-=1000)/5
;C 17 X 22
CH←←(=17000-=1000)/5
CW←←(=22000-=1000)/5
;D 22 X 28
DH←←(=22000-=1000)/5
DW←←(=34000-=1000)/5
};MD
;PRACTICAL BOUNDS OF FR80 FRAME
FRMAX←←400000 ;SIZE OF FR80 IMAGE SQUARE (16384)
;MUST BE POWER OF 2!!!!!!
FRXFDG←←0 ;FULL X
FRYFDG←←=2000 ;TAKE OFF 2000 POINTS ON TOP AND BOTTOM
TFLG←←2
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
;IO CHANNEL ASSIGNMENTS
TRWCHN←←0
SIG←←1
F80CHN←←2
ICHN←←3
DAT←←5
TAP←←6
;DEFINITIONS FOR SORT PACKAGE
TEXP←←5 ;NUMBER OF BITS OF SIGNIFICANCE IN X,Y'S
TSIZ←←1⊗TEXP ;NUMBER OF TABLE ENTRIES PER DIMENSION
TSQR←←TSIZ*TSIZ ;TOTAL SIZE OF TABLE
DEFINE GETFS(AC)
< SKIPN AC,FSTPNT
PUSHJ P,NOFST
PUSH P,(AC)
POP P,FSTPNT
>
DEFINE FSTRET(AC)
< HLLI AC,
EXCH AC,FSTPNT
HRRZM AC,@FSTPNT
>
;DATA AND MACROES
DEFINE DATA(LABEL,D.PC,SIZE)
{
IFIDN {D.PC}{D}{
MD,{SDATA(LABEL,SIZE)}
}
IFIDN {D.PC}{PC}{
MPC,{SDATA(LABEL,SIZE)}
}
IFIDN {D.PC}{BOTH}{
SDATA(LABEL,SIZE)
}
};DATA
DEFINE SDATA(LABEL,SIZE)
{
LABEL:
IFIDN {SIZE}{}{0}
IFDIF {SIZE}{}{BLOCK SIZE}
};SDATA
DOPLT: REF
INTERNAL DOPLT
DATA TOPS,BOTH,TSQR
DATA FSTPNT,BOTH
DATA FSTTOP,BOTH
DATA T1SI,BOTH
DATA T2SI,BOTH
DATA LOOPY,BOTH
DATA MINX,BOTH
DATA MINY,BOTH
DATA MAXX,BOTH
DATA MAXY,BOTH
DATA DIVX,BOTH
DATA DIVY,BOTH
DATA DRAWL,BOTH
DATA CURX,BOTH
DATA CURY,BOTH
DATA VALBST,BOTH
DATA POSBST,BOTH
DATA %ROTIT,BOTH
DATA PDL,BOTH,200
DATA INBUF,BOTH,3
DATA IBUF,BOTH,210*2
DATA STR0,D,10
DATA STR1,D,10
DATA STR2,D,40
DATA STR3,D,40
DATA LSTRET,PC
DATA BIGPAD,PC
DATA STRING,PC,=200/5
DATA MAGBUF,PC,3
DATA MAGBFR,PC,210*2
DATA TAPHD,PC,3
DATA TAPBUF,PC,210*2
DATA FRBUF,BOTH,3
DATA FRBFR,BOTH,210*2
DATA LASTX,BOTH
DATA LASTY,BOTH
DATA LSTROT,BOTH
DATA LSTSPC,BOTH
DATA FRFUDG,BOTH
DATA SAVNAM,BOTH
DATA SAVEXT,D
DATA SAVPPN,BOTH
DATA FILNAM,BOTH
DATA FILEXT,BOTH
DATA FILDAT,BOTH
DATA FILPPN,BOTH
DATA IBUFR,BOTH,3
DATA IBUFRD,BOTH,210
DATA CRDNUM,PC
DATA THING1,BOTH
DATA T3S,BOTH
DATA T3P,BOTH
DATA T2S,BOTH
DATA T2P,BOTH
DATA T1S,BOTH
DATA T1P,BOTH
DATA XOFF,BOTH
DATA YOFF,BOTH
DATA PVER,BOTH
DATA DOTXT,PC
DATA ANGLE,BOTH
DATA CSIZZ,BOTH
DATA Y,BOTH
DATA X,BOTH
DATA MAGWRD,PC
DATA EXTSAV,BOTH
DATA SMLY,BOTH
DATA SMLX,BOTH
DATA LRGX,BOTH
DATA LRGY,BOTH
DATA CURSE,BOTH
DATA SCALE,BOTH
DATA ANYTXT,PC
DATA CSIZ,PC
DATA MTAB,PC,5
DATA WIDTH,D
DATA OFFSET,D
DATA HEIGHT,D
DATA BRDPNT,D
DATA SIGNAM,D
DATA SIGEXT,D
DATA SIGDAT,D
DATA SIGPPN,D
DATA DRWDAT,D
DATA STOP,D
DATA START,D
DATA PADNUM,PC
DATA DIALOC,D
DATA CENTER,BOTH
DATA PARG,D
DATA PATCH,BOTH,100
DATA SAVEP,BOTH
DATA SX,BOTH
DATA SY,BOTH
DATA RSTCNT,BOTH
DATA RSTSET,BOTH
SWAP: 'DSK '
'PLOT00'
0
SIZE: XWD 0,PLTRST
0
;RESTART CODE!
SAVE: MOVE T,RSTSET ;TRY 100 COMMANDS FOR NOW
MOVEM T,RSTCNT
TRNN FLAG,RSTENB ;CAN HE DO THIS?
POPJ P,
PUSHJ P,FORCE
OUTSTR[ASCIZ/SAVING/]
FOR I←0,16
< PUSH P,I
>
MOVEM P,SAVEP
MOVE T,JOBREL
ADDI T,1777
LSH T,-12
HRLM T,SIZE
JSA 16,WHERE
JUMP SX
JUMP SY
MOVE 1,SY
HRL 1,SX
MOVSI 3,SWAP
CALLI 3,400004
MERGE: JSA 16,PLOTS
JUMP THING1
SKIPE THING1
JRST [ OUTSTR[ASCIZ/FAILURE TO RESTART, PLOTTER NOT AVAILABLE!
/]
HALT MERGE]
SKIPE %ROTIT
SETOM ROTIT ;PRESERVE ORIENTATION
JSA 16,SETXY ;SET X,Y TO CONTENTS OF 1
MOVE P,SAVEP
FOR I←16,0,-1
< POP P,I
>
OUTSTR[ASCIZ/
/]
POPJ P,
PLTRST:
MD,{ MOVE 1,START }
MPC,{ SETZ 1, }
JRST MERGE
;ASK FR80, ASK TRW(PC), ASK SCALE(PC), ASK OFFSET(PC), ASK PLOT
;SET PLOT FILE INPUT
FRSET: OUTSTR[ASCIZ/FR-80 PLOT TAPE?/]
PUSHJ P,GETYES
POPJ P,
TRO FLAG,FR80 ;FLAG FOR FR80 OUTPUT
MPC,{ OUTSTR[ASCIZ/AT FR80 SCALE OF 3.7 FRAME IS ABOUT 22X17.
FR80 SCALE*10 ?/]
};MPC
MD,{ OUTSTR[ASCIZ/IS THIS A PRODUCTION RUN (ALL DEFAULT ANSWERS)?/]
PUSHJ P,GETYES
CAIA
JRST [ TRO FLAG,PRODUCE
MOVEI TTT,=37
JRST SETFDG]
OUTSTR[ASCIZ/AT FR80 SCALE OF 3.7 SIZE C JUST FITS (22X17).
FR80 SCALE*10 ?/]
};MD
PUSHJ P,DECIN
JRST [ OUTSTR[ASCIZ/HO HO HO!
TRY AGAIN!/]
PUSHJ P,IERR
JRST .-1]
JUMPN TTT,SETFDG
OUTSTR[ASCIZ/USING 37!
/]
MOVEI TTT,=37
SETFDG: MOVEM TTT,FRFUDG
CAIN TTT,=37 ;DID HE USE STANDARD?
POPJ P, ;YES, THAT'S ALL
OUTSTR[ASCIZ/FR80 FRAME IS /]
MOVE T,[FRMAX*=50]
IDIV T,FRFUDG
PUSHJ P,MILOUT
OUTSTR[ASCIZ/ X /]
MOVE T,[(FRMAX-2*FRYFDG)*=50]
IDIV T,FRFUDG
PUSHJ P,MILOUT
OUTSTR[ASCIZ/ INCHES.
/]
POPJ P,
MPC,{
TRWSET: OUTSTR[ASCIZ/TRW PLOT TAPE?/]
PUSHJ P,GETYES
POPJ P,
TRO FLAG,DOMAG
OUTSTR[ASCIZ/ADD SYMBOL DEFINITIONS?/]
PUSHJ P,GETYES
POPJ P,
OUTSTR[ASCIZ/SYMBOL DEFINITIONS LIVE FOR EVER (IN THIS CORE IMAGE).
BE SURE TO MAKE A SKETCH OF THE SYMBOL INDICATING THE "D" CODE.
/]
MOVEI A,=60 ;START AT 60
CHRDEF: MOVEI B,177 ;SCAN TABLE FOR THIS ONE
CAME A,ONETAB(B) ;THERE ALREADY?
SOJGE B,.-1 ;NO, LOOP
JUMPGE B,ISDEF ;FIND ONE?
OUTCHR["D"]
MOVE T,A
PUSHJ P,DECOUT
OUTCHR["?"]
PUSHJ P,GETCH
OUTSTR[ASCIZ/
/]
ANDI T,177
CAIN T,12
POPJ P, ;QUIT ON CRLF
SKIPE ONETAB(T)
JRST [ OUTSTR[ASCIZ/ALREADY DEFINED AS "D/]
MOVE T,ONETAB(T)
PUSHJ P,DECOUT
OUTSTR[ASCIZ/"
/]
JRST CHRDEF]
MOVEM A,ONETAB(T)
JRST NEWDEF
ISDEF: OUTCHR["D"]
MOVE T,A
PUSHJ P,DECOUT
OUTCHR["="]
OUTCHR B
OUTSTR[ASCIZ/
/]
NEWDEF: CAIGE A,=99
AOJA A,CHRDEF ;LOOP UP TO 99
POPJ P,
GETSCL: OUTSTR[ASCIZ/SCALE FACTOR?/]
PUSHJ P,DECIN
JRST [ PUSHJ P,IERR
JRST GETSCL]
JUMPN TTT,.+3
MOVEI TTT,1
OUTSTR[ASCIZ/USING SIZE 1!
/]
MOVEM TTT,SCALE
POPJ P,
GETOFF: OUTSTR[ASCIZ/POSITIVE X,Y OFFSET (IN INCHES, DECIMAL POINT OK!)?/]
PUSHJ P,MILIN
CAIE T,","
JRST [ CAIN T,12
JUMPE TTT,DEFOFF
ILLOUT: PUSHJ P,IERR
JRST GETOFF]
MOVEM TTT,XOFF
PUSHJ P,MILIN
CAIE T,12
JRST ILLOUT
MOVEM TTT,YOFF
TRNE FLAG,FR80
OUTSTR[ASCIZ/OFFSET IS IGNORED FOR FR80 OUTPUT!
/]
POPJ P,
DEFOFF: TRNE FLAG,DOMAG
JRST TRWOFF
SETZM XOFF
SETZM YOFF
POPJ P,
TRWOFF: OUTSTR[ASCIZ/USING 12 X 10!
/]
MOVEI T,=12000/5
MOVEM T,XOFF
MOVEI T,=10000/5
MOVEM T,YOFF
POPJ P,
};MPC
NAMSET: SETZM SAVNAM ;FORGET SAVED NAME FOR NEW FILE
MPC,{ ANDI FLAG,DOMAG!FR80!%DOPLT!IREAD }
MD,{ ANDI FLAG,PRODUCE!FR80!%DOPLT!IREAD }
INIT DAT,10
SIXBIT /DSK/
PZE INBUF
JRST [OUTSTR [ASCIZ /DSK NOT AVAIL -- WHAT THE FUCK?/]
HALT NAMSET]
ASKHIM: OUTSTR[ASCIZ/PLOT /]
PUSHJ P,SETPLT
JRST .-1
MOVE T,FILNAM
MOVEM T,SAVNAM ;SAVE FILENAME FOR PLOT BOX AND FR80 NAME
MD,{
MOVE T,FILEXT
MOVEM T,SAVEXT
};MD
MOVE T,FILPPN
MOVEM T,SAVPPN
LOOKUP DAT,FILNAM
JRST [OUTSTR [ASCIZ /CAN'T FIND IT!
/]
JRST ASKHIM]
MOVE T,JOBFF
ADDI T,4000
CALLI T,11
JRST 4,.-3
MOVEI TT,IBUF
EXCH TT,JOBFF
INBUF DAT,2
MOVEM TT,JOBFF
ADDI TT,10
MOVE T,JOBREL
SUB T,TT
MOVEM TT,T3S
MOVEM TT,T3P
IDIVI T,3
MOVE TT,T
ADD TT,T3S
MOVEM TT,T2S
MOVEM TT,T2P
ADD T,TT
MOVEM T,T1S
MOVEM T,T1P
HRLOI T,377777
MOVEM T,SMLY
MOVEM T,SMLX
MOVSI T,400000
MOVEM T,LRGY
MOVEM T,LRGX
MPC,{ SETOM BIGPAD }
POPJ P,
;READ A WORD FROM FILE
IN: SOSG INBUF+2
IN DAT,
CAIA
HALT .+1
ILDB A,INBUF+1
POPJ P,
;INPUT LOOP, PUT LINES IN TABLES
MAIN: PUSHJ P,IN
HLRZ T,A
CAIE T,400001
JRST MAINLP
SETZM LRGX
SETZM LRGY
SETZM SMLX
SETZM SMLY
POPJ P,
MAINLP: HLRZ T,A
CAIN T,400001 ;END OF FILE?
JRST [ HLRES LRGX
HLRES SMLX
POPJ P,]
TLNE A,1 ;TEXT?
JRST INTXT ;YES, GET IT IN
TDZ A,[(1)1]
MOVE T,A
PUSHJ P,PUT1 ;PUT X,Y IN TABLE 1
MOVE T,T3P ;GET TABLE 3 POINTER (POINT TO START OF LINE)
HRLI T, ;0 MEANS START OF LINE
PUSHJ P,PUT2 ;PUT POINTER IN TABLE 2
INLLOP: MOVE T,A
PUSHJ P,SCHECK ;CHECK MAX'S
PUSHJ P,PUT3 ;PUT IN TABLE 3
PUSHJ P,IN ;GET NEXT THING
TRZN A,1 ;STILL IN THIS LINE?
JRST INLDON ;NO, FINISH UP
TDZ A,[(1)1] ;YES, CLEAR EXTRA BITS
JRST INLLOP
INLDON: PUSHJ P,PUT1 ;PUT LAST X,Y IN TABLE 1
MOVE T,T3P ;GET POINTER TO IT IN...
SUBI T,1 ;TABLE 3
HRLI T,1 ;1 MEANS END OF LINE
PUSHJ P,PUT2 ;PUT POINTER IN TABLE 2
JRST MAINLP
;PUT TEXT INTO TABLES, SCHECK
INTXT: TDZ A,[(1)1]
MOVE T,A ;GET X,Y OF TEXT
MOVE B,A ;SAVE IN B ALSO
PUSHJ P,SCHECK
PUSHJ P,PUT1 ;PUT IT IN TABLE 1
MOVE T,T3P ;GET POINTER TO TABLE 3
HRLI T,2 ;2 MEANS TEXT
PUSHJ P,PUT2 ;PUT POINTER IN TABLE 2
PUSHJ P,IN
MOVE T,A
PUSHJ P,PUT3 ;STORE SIZE (OR WHATEVER) AWAY
HLRZ T,A
JUMPN T,ISNTXT ;TEXT?
MPC,{ TRZE A,16
OUTSTR[ASCIZ/ODD CHAR SIZE, I EVENED IT!
/]
MOVE T,A
ANDI T,377776
LSH T,-4
CAILE T,4 ;ALLOW HIM TO USE OUR SPECIAL SIZE
JRST [ OUTSTR[ASCIZ/CHAR SIZE TO LARGE, WILL USE 4!
/]
MOVEI T,4
DPB T,[POINT 13,A,31]
JRST .+1]
SKIPG MTAB(T)
JRST [ SOS T1P
SOS T2P
SOS T3P
SETOM MTAB(T) ;NOTE THAT WE FLUSHED SOME
SKPTXT: PUSHJ P,IN
TRZE A,1
JRST SKPTXT
JRST MAINLP]
SETOM ANYTXT ;NOTE THAT WE FOUND SOME TEXT
};MPC
PUSH P,A
PUSH P,B ;SAVE INITIAL X,Y
MOVNI T,2 ;MAKE BELIEVE LAST WORD FULL!
SETZ B, ;NO WORDS YET!
TXTIN: PUSHJ P,IN
TRZN A,1 ;END?
SOJA B,TXTFIX ;YES
MOVE T,A
PUSHJ P,PUT3
AOJA B,TXTIN ;COUNT 1 WORD AND LOOP
TXTFIX: MOVE A,T
TRNN A,376 ;LAST WORD END IN 0?
JRST TXTFX1 ;YES
SETZ T, ;NO, PUT 0
PUSHJ P,PUT3 ;IN TABLE 3
TXTFX1: MOVE T,T3P
ADD T,[2,,-1] ;3,,T3 POINTER
PUSHJ P,PUT2 ;TO TABLE 2
IMULI B,5 ;COUNT 5 CHARS PER WORD READ
JUMPE A,TXTFX2 ;0 WORD?
TXTFX3: ADDI B,1 ;NO, COUNT ANOTHER CHAR
LSH A,7 ;SHIFT THAT CHAR OUT
JUMPN A,TXTFX3 ;LOOP TILL 0
TXTFX2: POP P,T ;GET BACK INITIAL X,Y
POP P,TTT ;GET BACK CHAR SIZE
TRNN TTT,400000 ;VERT?
TLOA B,1 ;YES, NEG TO LEFT HALF
TLOA B,1 ;NO, POS TO LEFT HALF
MOVS B,B ;SWAP FOR HORZ TEXT
MOVE TT,TTT ;GET COPY OF SIZE
MD,{ ANDI TT,377777
LSH TT,-1 ;NORMALIZE IT
IMUL B,TT ;MULT BY APPROPRIATE CONSTANT
};MD
MPC,{ ANDI TT,377777
LSH TT,-4
IMUL B,MTAB(TT) ;MULT BY APPROPRIATE CONSTANT
IDIV B,SCALE
};MPC
ADD B,T ;ADD INITIAL X,Y
TLZ B,1
MOVE A,B
PUSHJ P,SCHECK ;CHECK OTHER CORNER OF BOX
TRNE TTT,400000
JRST [ HRR T,B
JRST .+2]
HLL T,B
PUSHJ P,PUT1 ;STORE END OF TEXT IN TABLE 1
LDB A,INBUF+1
JRST MAINLP
ISNTXT:
MPC,{ HRRZ T,A
LSH T,-1
CAMLE T,BIGPAD ;BIGGEST PAD NUMBER?
MOVEM T,BIGPAD ;NO, SAVE AS BIGGEST SO FAR
};MPC
MOVE T,T2P
MOVEI TT,4
HRLM TT,-1(T) ;CHANGE CODE
PUSHJ P,IN
JRST MAINLP ;NEXT WHAT EVER
SCHECK: CAMGE A,SMLX
MOVEM A,SMLX
CAMLE A,LRGX
MOVEM A,LRGX
HRRES A
CAMGE A,SMLY
MOVEM A,SMLY
CAMLE A,LRGY
MOVEM A,LRGY
POPJ P,
;TABLE SUBRS
PUT1: MOVEM T,@T1P
AOS TT,T1P ;GET POINTER & INCREMENT
CAMG TT,JOBREL ;OVERFLOW OF TABLE?
POPJ P, ;NO
JRST GETCOR
PUT2: MOVEM T,@T2P ;DEPOSIT WORD
AOS TT,T2P ;GET POINTER AND INCREMENT
CAMGE TT,T1S ;OVERFLOW OF TABLE?
POPJ P, ;NO
MOVE TT,T1S ;GET TABLE 1 START POINTER
HRLS TT
ADDI TT,2000
HRRZM TT,T1S
PUSHJ P,DOBLT ;MOVE TABLE 1 DOWN
MOVEI TT,2000
ADDM TT,T1P ;UPDATE TABLE 1 POINTER
POPJ P,
PUT3: MOVEM T,@T3P ;DEPOSIT WORD
AOS TT,T3P ;GET AND INCREMENT POINTER
CAMGE TT,T2S ;TABLE OVERFLOW?
POPJ P, ;NO
MOVE TT,T2S
HRLS TT
ADDI TT,2000
HRRZM TT,T2S
PUSHJ P,DOBLT
MOVEI TT,2000
ADDM TT,T2P
ADDM TT,T1P
ADDM TT,T1S
POPJ P,
DOBLT: PUSHJ P,GETCOR
MOVE TTT,JOBREL
DOBLOP: CAIGE TTT,2000(TT);MORE THAT 1K TO BLT?
JRST JUSTDO ;NO
PUSH P,TT
MOVE TT,TTT
SUBI TT,3777
HRLS TT
ADDI TT,2000
BLT TT,(TTT)
SUBI TTT,2000
POP P,TT
JRST DOBLOP
JUSTDO: BLT TT,(TTT)
POPJ P,
GETCOR: MOVE TTT,JOBREL
ADDI TTT,2000
CALLI TTT,11
CAIA
POPJ P,
OUTSTR[ASCIZ/NO CORE AVAILABLE, CONTINUE TO TRY AGAIN!
/]
HALT GETCOR
;FREE STORAGE ROUTINES
FSTINI: SETZM FSTPNT
MOVE T,T1P ;GET TOP OF CORE
MOVEM T,FSTTOP ;SET AS CURRENT NXM
POPJ P,
NOFST: SOS (P)
SOS (P) ;RETURN TO SKIPN
PUSH P,T ;SAVE AN AC
NOFST2: MOVE T,FSTTOP
MOVEM T,FSTPNT ;NEW FREE STORAGE POINTER
ADDI T,1777 ;GET AT LEAST 1K
CALLI T,11
HALT NOFST2
AOS T,FSTTOP
NOFST1: HRRZM T,-1(T)
CAMG T,JOBREL
AOJA T,NOFST1
SETZM -1(T)
MOVEM T,FSTTOP ;NEW NXM
POP P,T
POPJ P,
;FIND CLOSEST
CLFND: SKIPN A,DRAWL
POPJ P, ;END
HRRZ T,(A)
MOVEM T,DRAWL
MOVE B,A
HLRZ A,(A)
ADD A,T2S
FSTRET(B)
POPJ P,
;SORT TABLES T1 AND T2 INTO LIST DRAWL
SORT: MOVE I,T1S
TLO I,I ;INDEX BY I
MOVEM I,T1SI ;INITIALIZE
SUB I,T1P
HRLZ I,I
MOVEM I,LOOPY
JUMPE I,[ SETZM DRAWL ;EMPTY LIST
POPJ P,]
HLRE E,@T1S
MOVE G,E
HRRE F,@T1S
MOVE H,F
MAMI: HLRE B,@T1SI ;FIND MIN, MAX X,Y
HRRE C,@T1SI
CAML E,B
MOVE E,B
CAMG G,B
MOVE G,B
CAML F,C
MOVE F,C
CAMG H,C
MOVE H,C
AOBJN I,MAMI ;SAVE THEM
MOVEM E,MINX
MOVEM F,MINY
MOVEM G,MAXX
MOVEM H,MAXY
SUB G,E
ASH G,-TEXP ;CALCULATE MAPPING
ADDI G,1 ;CONSTANTS
MOVEM G,DIVX
SUB H,F
ASH H,-TEXP
ADDI H,1
MOVEM H,DIVY
MOVE D,[XWD TOPS,TOPS+1] ;CLEAR MAP
SETZM TOPS
BLT D,TOPS+TSQR-1
MOVE I,T2S
TLO I,I
MOVEM I,T2SI
MOVE I,LOOPY
PUSHR:
MPC,{
HLRZ D,DOTXT ;PICKUP INDEX OF WHAT WE SHOULD DO
HLRZ B,@T2SI
XCT (D)1+[ CAIN B,3 ;EVERY THING BUT END TEXT
CAILE B,1 ;0
CAILE B,1 ;1
CAIE B,2 ;2
JFCL ;3
PUSHJ P,[HRRZ B,@T2SI
HRRZ B,(B)
LSH B,-1 ;SHIFT IT!
TLO B,4
CAMN B,DOTXT ;SAME PAD #?
AOS (P)
POPJ P,]];4
};MPC
MD,{
HLRZ B,@T2SI
CAIN B,3 ;DON'T LOOK AT END OF TEXT
};MD
JRST SKIPIT
HLRE B,@T1SI ;PUT ALL POINTS
SUB B,E ;INTO THE MAP
IDIV B,G
HRRE C,@T1SI
SUB C,F
IDIV C,H
LSH C,44-TEXP
LSHC B,TEXP
MOVE C,TOPS(B)
HRL C,I
GETFS D
MOVEM C,(D)
MOVEM D,TOPS(B)
SKIPIT: AOBJN I,PUSHR
SETZM DRAWL
HLRE F,CURSE ;GET OUR INITIAL POS.
HRRE G,CURSE
CAMGE F,MINX ;NOW GENERATE DRAWING LIST
MOVE F,MINX
CAMLE F,MAXX
MOVE F,MAXX
CAMGE G,MINY
MOVE G,MINY
CAMLE G,MAXY
MOVE G,MAXY
MOVEI E,DRAWL
NEWPNT: MOVEM F,CURX
MOVEM G,CURY
SUB F,MINX
IDIV F,DIVX
MOVE B,F
MOVE G,CURY
SUB G,MINY
IDIV G,DIVY
MOVE C,G
LSH G,44-TEXP
LSHC F,TEXP
MOVEI H,TSQR*4
MOVEI I,0
TRYUM: MOVEI G,TOPS(F) ;SPIRAL SCAN IF GRID POINT
SKIPE (G) ;WAS EMPTY
JRST CONTIN
MT1: ADDI I,1
MOVE D,I
LP1: SOJLE H,DONEM
ADDI B,1
ADDI F,TSIZ
TRNN B,-TSIZ
TRNE C,-TSIZ
JRST NT1
MOVEI G,TOPS(F)
SKIPE (G)
JRST CONTIN
NT1: SOJG D,LP1
MOVE D,I
LP2: SOJLE H,DONEM
ADDI C,1
ADDI F,1
TRNN B,-TSIZ
TRNE C,-TSIZ
JRST NT2
MOVEI G,TOPS(F)
SKIPE (G)
JRST CONTIN
NT2: SOJG D,LP2
ADDI I,1
MOVE D,I
LP3: SOJLE H,DONEM
SUBI B,1
SUBI F,TSIZ
TRNN B,-TSIZ
TRNE C,-TSIZ
JRST NT3
MOVEI G,TOPS(F)
SKIPE (G)
JRST CONTIN
NT3: SOJG D,LP3
MOVE D,I
LP4: SOJLE H,DONEM
SUBI C,1
SUBI F,1
TRNN B,-TSIZ
TRNE C,-TSIZ
JRST NT4
MOVEI G,TOPS(F)
SKIPE (G)
JRST CONTIN
NT4: SOJG D,LP4
JRST MT1
CONTIN: HRLZI I,200000 ;INFINITY
MOVEM I,VALBST ;FIND CLOSEST
FINDR: MOVE H,G ;POINT IN THIS
HRRZ G,(G)
HLRZ I,(G)
HLRE B,@T1SI
SUB B,CURX
IMUL B,B
HRRE C,@T1SI
SUB C,CURY
IMUL C,C
ADD B,C
CAML B,VALBST ;THIS PNT BETTER?
JRST NXT
MOVEM H,POSBST ;IF S, RECORD IT
MOVEM B,VALBST
NXT: HRRZ I,(G)
JUMPN I,FINDR ;GO BAK IF NOT FINSHD
PUTIN: MOVE G,POSBST ;SET UP BEST POINT
MOVE H,(G) ;FOR DRAWING
HRRZ D,(H)
HRRM D,(G)
HLRM D,(H)
HRRM H,(E)
MOVE E,H
HLRZ I,(H)
HLRZ D,@T2SI ;WHAT TYPE OF 'POINT'
CAIN D,4 ;A REAL ONE ?
JRST SETNEW
JUMPN D,L1 ;BEGINING OF A LINE?
ADDI I,1 ;IF SO, REMOVE THE
OUTOUT: HLRE B,@T1SI ;OTHER END OF IT
SUB B,MINX
IDIV B,DIVX
HRRE C,@T1SI
SUB C,MINY
IDIV C,DIVY
LSH C,44-TEXP
LSHC B,TEXP
MOVEI G,TOPS(B)
NTR: MOVE H,G
MOVE G,(G)
HLRZ D,(G)
CAIE I,(D)
JRST NTR
MOVE D,(G)
HRRM D,(H)
FSTRET G
JRST SETNEW
L1: CAIE D,1 ;END OF LINE?
JRST L2
SUBI I,1
JRST OUTOUT
L2: ADDI I,1
SETNEW: HLRE F,@T1SI ;GET READY FOR
HRRE G,@T1SI ;NEXT POINT
JRST NEWPNT
DONEM: POPJ P,
;SQRT: FINDS THE SQUARE ROOT OF THE INTEGER IN T. USES TT AND TTT
SQRT: JFFO T,.+2 ;FIND THE HIGH ORDER BIT
POPJ P, ;ZERO?
SUBI TT,=37
MOVNS TT
LSH TT,-1
MOVEI TTT,1
LSH TTT,-1(TT) ;MAKE WORD WITH HALF AS MANY LOW ORDER BITS
TRO TFLG ;TURN ON TEMP (COUNT) FLAG
SLOP1: MOVE TT,TTT ;GET APROXIMATE SQRT
IDIVM T,TT ;DIVIDE IT INTO THE SQUARE
ADD TT,TTT ;ADD APROX.
ASH TT,-1 ;DIVIDE BY 2. THIS IS THE NEW APPROX.
MOVE TTT,TT ;GET APPROX.
IDIVM T,TTT ;DIVIDE IT INTO THE SQUARE
ADD TTT,TT ;ADD APPROX.
ASH TTT,-1 ;DIVIDE BY 2. THIS IS THE NEW APPROX.
TRZE TFLG ;GONE THROUGH TWICE?
JRST SLOP1 ;NO
MOVE T,TTT
POPJ P,
;PRINT CORESIZE, GET SCALE AND TELL BOX SIZE(D)
PCORE: MOVE T,JOBREL
SUB T,JOBFF
LSH T,-12
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ K CORE
/]
POPJ P,
MD,{
GETSCL: TRNE FLAG,%DOPLT
OUTSTR[ASCIZ/PUT PEN BOTTOM CENTER.
/]
SKIPE PARG
JRST [ MOVEI TTT,1
JRST GOTSCL]
TRNE FLAG,PRODUCE
JRST [ MOVEI TTT,2
JRST GOTSCL]
ASK: OUTSTR[ASCIZ/SCALE FACTOR?/]
PUSHJ P,DECIN
JRST [ PUSHJ P,IERR
JRST ASK]
JUMPN TTT,.+3
MOVEI TTT,2 ;MAKE CR-LF INTO SIZE 2
OUTSTR[ASCIZ/USING SIZE 2!
/]
GOTSCL: MOVEM TTT,SCALE
SETZM %ROTIT ;ASSUME UPRIGHT
MOVE T,LRGX
SUB T,SMLX
IMUL T,SCALE
IMULI T,5
TRNN FLAG,%DOPLT ;GOING TO CALCOMP?
JRST .+3
CAIL T,=28000
JRST [ OUTSTR[ASCIZ/X TOO LARGE, ROTATING FOR CALCOMP!
/]
SETOM %ROTIT
JRST .+1]
OUTSTR[ASCIZ/THAT'S /]
PUSHJ P,MILOUT
OUTSTR[ASCIZ/ INCHES WIDE, AND /]
MOVE T,LRGY
SUB T,SMLY
IMUL T,SCALE
IMULI T,5
TRNN FLAG,%DOPLT
JRST WILFIT
CAIL T,=28000
SKIPN %ROTIT
JRST WILFIT
OUTSTR[ASCIZ/X AND Y BOTH TOO BIG FOR CALCOMP HORIZONTAL, LOSE BIG!
/]
JRST ASK
WILFIT: PUSHJ P,MILOUT
OUTSTR[ASCIZ/ INCHES HIGH.
/]
MOVE T,LRGX
SUB T,SMLX
MOVEM T,WIDTH
MOVE T,LRGY
SUB T,SMLY
MOVEM T,HEIGHT
SKIPE T,PARG
JRST [ ADDI T,"A"-1
OUTSTR[ASCIZ/USING BOX SIZE /]
OUTCHR T
OUTSTR[ASCIZ/
/]
JRST BOXGOT]
TRNE FLAG,PRODUCE
JRST [ MOVEI T,"C"
JRST BOXGOT]
MOVE T,WIDTH
IMUL T,SCALE
MOVE TT,HEIGHT
IMUL TT,SCALE
CAIG T,AW
CAILE TT,AH-=1000/5
CAIA
JRST [ OUTSTR[ASCIZ/SIZE A IS BIG ENOUGH!
/]
JRST ASKSIZ]
CAIG T,BW
CAILE TT,BH-=1000/5
CAIA
JRST [ OUTSTR[ASCIZ/SIZE B IS BIG ENOUGH!
/]
JRST ASKSIZ]
CAIG T,CW
CAILE TT,CH-=1000/5
CAIA
JRST [ OUTSTR[ASCIZ/SIZE C IS BIG ENOUGH!
/]
JRST ASKSIZ]
CAIG T,DW
CAILE TT,DH-=1000/5
CAIA
JRST [ OUTSTR[ASCIZ/SIZE D IS BIG ENOUGH!
/]
JRST ASKSIZ]
OUTSTR[ASCIZ/NO SIZE IS BIG ENOUGH!
/]
;ASK BOX SIZE AND SETUP BOX INFO(D)
ASKSIZ: OUTSTR[ASCIZ/A, B, C, OR D (OR SET:S OR FIT:F OR NONE:<CR>)?/]
PUSHJ P,GETYES
JFCL
BOXGOT: SETZ E,
CAIN T,12
JRST NOBRDA
CAIN T,"A"
MOVE E,[AW,,AH]
CAIN T,"B"
MOVE E,[BW,,BH]
CAIN T,"C"
MOVE E,[CW,,CH]
CAIN T,"D"
JRST [ MOVE E,[DW,,DH]
SKIPE %ROTIT ;ALREADY ROTATED?
JRST NOBRDA
SETOM %ROTIT
OUTSTR[ASCIZ/ROTATING SIZE "D" FOR CALCOMP!
/]
JRST NOBRDA]
CAIN T,"F"
JRST [ MOVE E,HEIGHT
IMUL E,SCALE
ADDI E,=2000/5 ;HALF INCH AT TOP AND BOT + BOX
MOVE T,WIDTH
IMUL T,SCALE
ADDI T,=1000/5
CAIGE T,AW
MOVEI T,AW
HRL E,T
JRST NOBRDA]
CAIN T,"S"
JRST [ OUTSTR[ASCIZ/BOX SIZE (X,Y IN INCHES "." OK)?/]
PUSH P,%ROTIT
PUSHJ P,MILIN
CAIL TTT,AW ;MUST BE WIDE ENOUGH FOR BOX
CAIE T,","
JRST [BXERR:PUSHJ P,IERR
POP P,%ROTIT
OUTSTR[ASCIZ/INPUT ERROR!
/]
JRST ASKSIZ]
MOVS E,TTT
CAILE TTT,=28000/5 ;OVERFLOW IN X?
PUSHJ P,[SKIPE %ROTIT
POPJ P,
SETOM %ROTIT
OUTSTR[ASCIZ/ROTATING FOR THIS SIZE BOX!
/]
POPJ P,]
PUSHJ P,MILIN
CAIE T,12
JRST BXERR
HRR E,TTT
SKIPE %ROTIT
CAIG TTT,=28000/5
JRST [ POP P,(P)
JRST NOBRDA]
OUTSTR[ASCIZ/TOO BIG IN BOTH X AND Y!
/]
POP P,%ROTIT
JRST ASKSIZ]
JUMPE E,ASKSIZ
NOBRDA: MOVEM E,BRDPNT
JUMPE E,NOBRDB
OUTSTR[ASCIZ/DRAWN BY= /]
SKIPE STR1
JRST [ OUTSTR STR1+1
XNSTR1: OUTSTR[ASCIZ/
/]
JRST NSTR1]
TRNE FLAG,PRODUCE
JRST XNSTR1
MOVE A,[POINT 7,STR1+1]
MOVEI D,4 ;SIZE 4
PUSHJ P,PLTSTR
MOVEM B,STR1
NSTR1: OUTSTR[ASCIZ/DRAWING TITLE, LINE 1= /]
SKIPE STR2
JRST [ OUTSTR STR2+1
XNSTR2: OUTSTR[ASCIZ/
/]
JRST NSTR2]
TRNE FLAG,PRODUCE
JRST XNSTR2
MOVE A,[POINT 7,STR2+1]
MOVEI D,4 ;SIZE 4
PUSHJ P,PLTSTR
MOVEM B,STR2
NSTR2: OUTSTR[ASCIZ/DRAWING TITLE, LINE 2= /]
SKIPE STR3
JRST [ OUTSTR STR3+1
XNSTR3: OUTSTR[ASCIZ/
/]
JRST NOBRDB]
TRNE FLAG,PRODUCE
JRST XNSTR3
MOVE A,[POINT 7,STR3+1]
MOVEI D,4 ;SIZE 4
PUSHJ P,PLTSTR
MOVEM B,STR3
NOBRDB: SKIPN E,BRDPNT
JRST [ MOVE E,HEIGHT
IMUL E,SCALE
MOVE T,WIDTH
IMUL T,SCALE
HRL E,T
JRST .+1]
MOVE T,SMLY
ADD T,LRGY
IMUL T,SCALE
SKIPE BRDPNT ;MAYBE NO BOX
SUBI T,=1000/5
SUBI T,(E)
ASH T,-1
MOVEM T,OFFSET
MOVE T,LRGX
ADD T,SMLX
IMUL T,SCALE
HLRZ TT,E
ADD T,TT
ASH T,-1
HRLM T,OFFSET
SKIPN %ROTIT
JRST [ HRRE T,OFFSET
SUBI T,=2000/5
MOVE TT,LRGX
ADD TT,SMLX
ASH TT,-1
IMUL TT,SCALE
HRL T,TT
JRST GTSTRT]
SKIPE TT,BRDPNT
JRST [ HLRE TTT,OFFSET
HLRZ TT,TT
SUBM TTT,TT
HRRZ T,BRDPNT
ASH T,-1
ADD T,OFFSET
SUBI TT,=2000/5
HRL T,TT
JRST GTSTRT]
MOVE T,LRGY
ADD T,SMLY
ASH T,-1
IMUL T,SCALE
MOVE TT,MINX
IMUL TT,SCALE
SUBI TT,=2000/5
HRL T,TT
GTSTRT: MOVEM T,START
MOVEM T,STOP ;ASSUME STOPPING THERE
HRREM T,Y
HLREM T,X
PUSHJ P,UNFIX
MOVEM T,CURSE
TRNN FLAG,%DOPLT ;PLOTTING?
POPJ P, ;NO, DON'T ASK
TRNN FLAG,PRODUCE
SKIPE PARG
JRST STSTOP
OUTSTR[ASCIZ/REPOSITION AT END PLOT?/]
PUSHJ P,GETYES
POPJ P,
STSTOP: HRRZ T,BRDPNT
JUMPN T,.+3
MOVE T,HEIGHT
IMUL T,SCALE
ADD T,OFFSET
TLZ T,1
SKIPN %ROTIT
JRST [ ADDI T,=5000/5
HLL T,START ;STOP AT SAME X
JRST GTSTOP]
ADD T,[XWD =5000/5,0]
HRR T,START ;SAME Y
GTSTOP: MOVEM T,STOP
POPJ P,
ASKSIG: OUTSTR[ASCIZ/SIGNATURE /]
SETZM SIGNAM ;NONE YET!
PUSHJ P,SETSIG
POPJ P,
MOVE T,FILNAM
MOVEM T,SIGNAM
MOVE T,FILEXT
MOVEM T,SIGEXT
MOVE T,FILPPN
MOVEM T,SIGPPN
INIT SIG,0
'DSK '
0
HALT .-3
LOOKUP SIG,FILNAM
JRST [ SKIPE T,SIGPPN
JRST NOSIGX
DSKPPN T,
CAMN T,['DATRPH']
JRST NOSIGX
MOVE T,['DATRPH']
MOVEM T,SIGPPN
MOVEM T,FILPPN
JRST .-1
NOSIGX: OUTSTR[ASCIZ/CAN'T FIND IT!
/]
RELEASE SIG,
JRST ASKSIG]
RELEASE SIG,
POPJ P,
};MD
;PRINT MAX X,Y'S AND BIGPAD (PC)
MPC,{
PSIZE: OUTSTR[ASCIZ/PUT PEN AT 0,0.
FROM FILE, MIN X= /]
MOVE T,SMLX
MOVE TT,XOFF
PUSHJ P,POSOUT
OUTSTR[ASCIZ/ MAX X= /]
MOVE T,LRGX
MOVE TT,XOFF
PUSHJ P,POSOUT
OUTSTR[ASCIZ/ MIN Y= /]
MOVE T,SMLY
MOVE TT,YOFF
PUSHJ P,POSOUT
OUTSTR[ASCIZ/ MAX Y= /]
MOVE T,LRGY
MOVE TT,YOFF
PUSHJ P,POSOUT
OUTSTR[ASCIZ/
/]
MOVE T,LRGX
SUB T,SMLX
CAILE T,=30000*2/5
OUTSTR[ASCIZ/THIS WILL OVERFLOW THE PLOTTER!!!!!!
/]
SKIPGE T,BIGPAD
POPJ P,
OUTSTR[ASCIZ/BIGPAD = /]
PUSHJ P,DECOUT
OUTSTR[ASCIZ/
/]
POPJ P,
POSOUT: ASH T,-1
IMUL T,SCALE
ADD T,TT
IMULI T,5
JRST MILOUT
;SET CHARACTER SCALE(PC), ASK DRILL PLOT(PC), SETUP TRW OUTPUT
CHRSCL: MOVEI T,=120*2/5 ;HEIGHT OF SIZE 5 (DEFAULT FOR TITLE LINES
MOVEM T,MTAB ;SET IT
MOVEI C,1
OUTSTR[ASCIZ/CHAR "M" HEIGHT
SCALE CODE (IN MILS)
0 M50 120
/]
CHRSC1: MOVE T,C
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ M5/]
MOVE T,C
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ /]
PUSHJ P,DECIN
JRST CHRLOS
MOVE T,TTT
IDIVI T,5
JUMPN TT,[OUTSTR[ASCIZ/MUST BE MULTIPLE OF 5 MILS!
/]
JRST CHRSC1]
LSH T,1
MOVEM T,MTAB(C)
TRNN FLAG,DOMAG ;TRW OUTPUT?
JRST CHRSC2
IDIVI T,6
JUMPE TT,CHRSC2
OUTSTR[ASCIZ/MUST BE MULTIPLE OF 15 MILS FOR TRW!!
/]
JRST CHRSC1
CHRSC2: CAIGE C,4 ;DONE LAST?
AOJA C,CHRSC1
SETZM ANYTXT ;NO TEXT YET
POPJ P,
CHRLOS: PUSHJ P,IERR
JRST CHRSC1
PSETUP:
OUTSTR[ASCIZ/IS THIS A DRILL PLOT?/]
PUSHJ P,GETYES
CAIA
TRO FLAG,TRWDRL
TRNE FLAG,TRWDRL ;IF DRILL PLOT
TRZ FLAG,PLANE ;TURN OFF PLANE BIT
TRNE FLAG,PLANE ;IS IT AN INNER PLANE?
OUTSTR[ASCIZ/THIS IS AN INNER PLANE.
/]
TRNN FLAG,DOMAG ;DOING MAGTAPE?
JRST CHKDRL ;NO ASK ABOUT DRILL TAPE
INIT TRWCHN,10 ;FULL WORD MODE
'DSK '
XWD MAGBUF,0
JRST [ OUTSTR[ASCIZ/CAN'T GET MTA0!
/]
HALT .-3]
MOVEI T,6 ;6 BIT BYTES
DPB T,[POINT 6,MAGBUF+1,11]
MOVEI T,MAGBFR
EXCH T,JOBFF
OUTBUF TRWCHN,2
MOVEM T,JOBFF
OUTSTR[ASCIZ/TRW /]
PUSHJ P,SETTRW
JRST .-2
ENTER TRWCHN,FILNAM
JRST [ OUTSTR[ASCIZ/TRW ENTER FAILED!
/]
HALT .+1]
;TRW MESSAGES(PC), DRILL TAPE SETUP(PC), RETICLE SELECT ROUTINE(PC)
MOVEI T,TXTRET
PUSHJ P,DORET ;SELECT TEXT RETICLE
MOVEI T,=100 ;UP AND OVER 1/2 INCH TO CLEAR FILM EDGE
MOVEM T,X
MOVEM T,Y
PUSHJ P,MAGLNS ;INVISIBLE TO 1,1 INCHES
MOVE TT,[POINT 7,[ASCIZ/***M50G58D10STANFORD A.I. FOONLY GROUP. */]]
PUSHJ P,MAGSTR
OUTSTR[ASCIZ/OPERATOR MESSAGES, 40 CHARS PER LINE (MAX). END WITH BLANK LINE.
THESE WILL BE PLOTTED AT THE BOTTOM OF THE FILM AS WELL AS TYPED.
MESSAGES SHOULD NOT EXTEND PAST HERE..←
STANFORD A.I. FOONLY GROUP. <ALREADY ON TAPE>
/]
DOMES: PUSHJ P,GETMES
JUMPE B,CHKDRL ;END WITH NULL STRING
ADDI B,14 ;14 OTHER CHARS
CAML B,MAGBUF+2
PUSHJ P,ENDREC
MOVE TT,[POINT 7,[ASCIZ/M50G58D10/]]
PUSHJ P,MAGSTR
MOVE TT,[POINT 7,STRING]
PUSHJ P,MAGSTR
PUSHJ P,MGSTAR
JRST DOMES
CHKDRL: TRNN FLAG,TRWDRL ;ONLY DO DRILL TAPE IF DRILL PLOT ALREADY
JRST NODRIL
OUTSTR[ASCIZ %CINCH/VOSTRON/CIRCO DRILL TAPE?%]
PUSHJ P,GETYES
JRST NODRIL
TRO FLAG,DOTAPE
INIT TAP,10
'DSK '
XWD TAPHD,0
JRST [ OUTSTR[ASCIZ/CAN'T GET DISK!!!
/]
HALT .-3]
OUTSTR[ASCIZ/DRILL TAPE /]
TAPNAM: PUSHJ P,SETDRL
JRST .-1
ENTER TAP,FILNAM
JRST [ OUTSTR[ASCIZ/ENTER FAILED.
/]
HALT TAPNAM]
MOVEI T,TAPBUF
EXCH T,JOBFF
OUTBUF TAP,2
MOVEM T,JOBFF
NODRIL: MOVN T,XOFF
IDIV T,SCALE
ASH T,1
HRLM T,CURSE
MOVN T,YOFF
IDIV T,SCALE
ASH T,1
HRRM T,CURSE
POPJ P,
RETSEL: HLRZ T,DOTXT
XCT (T)[MOVEI T,LINRET
HALT .+1
MOVEI T,TXTRET
HALT .+1
JRST [ HRRZ T,DOTXT
ADDI T,DONUT ;LEAVE OFFSET FOR STANDARD RETICLES
JRST .+1]
]
DORET: CAMN T,LSTRET ;DIFFERENT FROM LAST?
POPJ P, ;NO
CAILE T,=24 ;LARGEST LEGAL
JRST [ OUTSTR[ASCIZ/I'M SORRY THE RETICLE YOU HAVE REQUESTED....
USING 24 INSTEAD OF /]
PUSHJ P,DECOUT
OUTSTR[ASCIZ/.
/]
MOVEI T,=24
JRST .+1]
MOVEM T,LSTRET
OUTSTR[ASCIZ/WHEEL POS = /]
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ CODE = D/]
MOVE T,LSTRET
OUTSTR RETTAB-1(T)
OUTCHR [40]
CAILE T,=9
JRST [ SUBI T,DONUT-1
OUTSTR[ASCIZ/PAD TYPE /]
PUSHJ P,DECOUT
JRST .+2]
OUTSTR @RETTXT-1(T)
OUTSTR[ASCIZ/
/]
TRNN FLAG,DOMAG ;REALLY DOING MAGTAPE?
POPJ P, ;NO
MOVE T,MAGBUF+2
CAIG T,=14 ;14 CHARS
PUSHJ P,ENDREC
MOVE TT,[POINT 7,[ASCIZ/G01D02*G54D/]]
PUSHJ P,MAGSTR
MOVE TT,LSTRET
ADD TT,[POINT 7,RETTAB-1]
JRST MAGSTR
DEFINE R(T)
{ ASCIZ/T/
}
RETTAB:
R 10*
R 11*
R 12*
R 13*
R 14*
R 15*
R 16*
R 17*
R 18*
R 19*
R 70*
R 71*
R 20*
R 21*
R 22*
R 23*
R 24*
R 25*
R 26*
R 27*
R 28*
R 29*
R 72*
R 73*
DEFINE R(T)
< [ASCIZ/T/]
>
RETTXT: R LINES
R TEXT
R INNER PLANE EDGE
R FINGERS
R TARGETS
R DRILL DONUTS
R PADS
R CLEARANCES
R PIN 1 SQUARES ;9
};MPC
;SETUP FR80 OUTPUT
FRSET1: INIT F80CHN,10
'DSK '
XWD FRBUF,0
JRST [ OUTSTR[ASCIZ/CAN'T GET DSK!
/]
HALT FRSET1]
MOVEI T,FRBFR
EXCH T,JOBFF
OUTBUF F80CHN,2
MOVEM T,JOBFF
MD,{
TRNE FLAG,PRODUCE
JRST [ MOVE T,SAVNAM
MOVEM T,FILNAM
MOVSI T,'F80'
MOVEM T,FILEXT
SETZM FILDAT
SETZM FILPPN
JRST GOTFNM]
};MD
OUTSTR[ASCIZ/FR80 /]
PUSHJ P,SETF80
JRST .-2
GOTFNM: ENTER F80CHN,FILNAM
JRST [ OUTSTR[ASCIZ/FR80 ENTER FAILED!
/]
HALT .+1]
MOVE T,[POINT 18,FRBFR+2,35]
MOVEM T,FRBUF+1
SETOM LSTROT ;ROTATION STARTS UNKNOWN
MOVEI T,777777
MOVEM T,LASTY
MOVEM T,LASTX
SETOM LSTSPC ;LAST SPACING
MOVEI T,(<BYTE(3)2(6)6(2)0(4)0(3)0>) ;SPOT SIZE 0
PUSHJ P,FROUT
MOVEI T,(<BYTE(3)2(6)5(2)0(4)0(3)7>) ;INTENSITY 7
JRST FROUT
;TOP LEVEL, CALL ALL THE SUBRS
R: JRST @130 ;RETURN FROM RAID
STRT: MOVEI FLAG,%DOPLT
MPC,{
SETZM CRDNUM
};MPC
MOVE P,[XWD -200,PDL-1]
ITS,< PUSHJ P,ITSGO>
CALLI
OUTSTR[ASCIZ/CALCOMP PLOT?/]
PUSHJ P,GETYES
TRZ FLAG,%DOPLT
MPC,{ SETZM %ROTIT
TRNE FLAG,%DOPLT
JRST [ OUTSTR[ASCIZ/ROTATE CALCOMP OUTPUT?/]
PUSHJ P,GETYES
JRST .+1
SETOM %ROTIT
JRST .+1]
PUSHJ P,TRWSET ;TRW PLOT? }
PUSHJ P,FRSET ;FR80?
MPC,{
PUSHJ P,GETSCL ;GET SCALE
PUSHJ P,GETOFF ;AND OFFSET
};MPC
MD,{ PUSHJ P,ASKSIG ;ASK ABOUT SIG NOW!}
PCLOOP: PUSHJ P,NAMSET ;GET DISK AND FILE NAME
MPC,{ PUSHJ P,CHRSCL }
PUSHJ P,MAIN ;READ FILE
MD,{
HRRZS A
LSH A,-1
MOVEM A,PARG ;SAVE ARG FROM DRAWING PROG
};MD
MPC,{
TRZE A,200000 ;PC TELLING US IT IS?
TRO FLAG,PLANE ;YES
HRRZM A,CRDNUM ;SAVE CARD NUMBER(AND SIDE INDICATOR)
};MPC
PUSHJ P,IN ;GET FINAL WORD
CAILE A,MAXVER
JRST [ MOVEI A,MAXVER
OUTSTR[ASCIZ/VERSION # TOO LARGE, WILL USE LARGEST!
/]
JRST .+1]
MOVEM A,PVER ;THIS IS PVER
MD,{ XCT (A)[PUSHJ P,TITCLR ;JUST CLEAR
PUSHJ P,DOTIT ;READ AND/OR CLEAR
PUSHJ P,DOTITD] ; " + DATE&TIME
PUSHJ P,PCORE
PUSHJ P,GETSCL ;GET SCALE AND BOX INFO
};MD
CLOSE DAT, ;LET GO OF FILE
MPC,{ PUSHJ P,PSIZE
MOVEI C,4
CHRSCX: SKIPL MTAB(C)
JRST CHRSCY
OUTSTR[ASCIZ/I FLUSHED SOME SCALE /]
MOVE T,C
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ TEXT!
/]
CHRSCY: SOJGE C,CHRSCX
SETOM LSTRET ;CLEAR LAST RETICLE
PUSHJ P,PSETUP
};MPC
TRNE FLAG,FR80
PUSHJ P,FRSET1 ;INITIALIZE FR80 STUFF
TRZ FLAG,RSTENB ;NO RESTART ENABLE YET
SETZM ROTIT
TRNN FLAG,%DOPLT
JRST NOPTP
GETPTP: JSA 16,PLOTS
JUMP THING1
SKIPE THING1
JRST [OUTSTR [ASCIZ /PLOTTER NOT AVAIL.
/]
HALT GETPTP]
MD,{
MOVE 1,START ;GET STARTING POS.
JSA 16,SETXY ;SET PLOTTER THERE
};MD
SKIPE %ROTIT
SETOM ROTIT ;TELL PLOTS
TRNE FLAG,MPC,{DOMAG!DOTAPE!}FR80!IREAD ;THIS IO WOULD GET BLOWN
JRST NOPTP
OUTSTR[ASCIZ/NUMBER OF LINES OR TEXT STRINGS
BETWEEN SAVES (0 DISABLES SAVING)?/]
PUSHJ P,DECIN
JRST [ OUTSTR[ASCIZ/ILLEGAL NUMBER!
/]
PUSHJ P,IERR
JRST .-2]
JUMPE TTT,NOPTP
MOVEM TTT,RSTSET
SETZM RSTCNT
TRO FLAG,RSTENB
CALLI T,30 ;GET JOB NUMBER
DPB T,[POINT 3,SWAP+1,35]
LSH T,-3
DPB T,[POINT 3,SWAP+1,29]
MD,{ MOVE T,START }
MPC,{ SETZ T, }
SKIPE %ROTIT
JRST [ ADD T,[XWD =1250/5,0]
JRST .+2]
ADDI T,=1250/5
TLZ T,1
HRREM T,Y
HLREM T,X
JSA 16,PLOT
JUMP X
JUMP Y
JUMP [2]
MOVNI T,=250/5
ADDM T,X
SKIPE %ROTIT
MOVN T,T
ADDM T,Y
JSA 16,PLOT
JUMP X
JUMP Y
JUMP [3]
SKIPE %ROTIT
JRST [ MOVNI T,=500/5
ADDM T,Y
JRST .+3]
MOVEI T,=500/5
ADDM T,X
JSA 16,PLOT
JUMP X
JUMP Y
JUMP [2]
NOPTP:
PUSHJ P,FSTINI
MPC,{ MOVSI T,400000 ;VERY SMALL NUMBER
MOVEM T,LRGX
MOVEM T,LRGY
HRLOI T,377777 ;VERY LARGE NUMBER
MOVEM T,SMLX
MOVEM T,SMLY
SKIPGE T,BIGPAD ;ANY PADS OR DRILL HOLES?
JRST BEGTXT
TRNE FLAG,TRWDRL;TRW DRILL PLOT ONLY?
SETZ T, ;YES, START WITH DRILL HOLES
HRLI T,4 ;PAD AND DRILL HOLE CODE
MOVEM T,DOTXT
TRNE FLAG,TRWDRL!DOTAPE!DOMAG
JRST PLOP0
OUTSTR[ASCIZ/SKIP PLOTTING OF ALL PADS?/]
PUSHJ P,GETYES
JRST PLOP0
BEGTXT: SKIPE T,ANYTXT ;DOING TEXT?
MOVSI T,2 ;YES, TEXT CODE
MOVEM T,DOTXT
};MPC
PLOP0: PUSHJ P,SORT ;SORT BY DOTXT
;MAIN LOOP, PLOT LINES, TEXT, ETC.
PLOP: SOSN RSTCNT ;TIME TO SAVE YET?
PUSHJ P,SAVE
PUSHJ P,CLFND ;FIND CLOSEST THING TO WHERE WE ARE
JUMPE A,OUTDON ;DONE?
MPC,{
PUSHJ P,RETSEL ;YES, SETUP RETICLE
};MPC
MOVE B,A ;CALC TABLE 2 POINTER...
SUB A,T2S
ADD A,T1S ;......
HRRZ C,(B) ;GET TABLE 3 POINTER
HLRZ D,(B) ;GET TYPE BITS
JRST @(D)[OUTLS
OUTLE
OUTTXT
. ;THIS IS AN ERROR
OUTTXT]
MPC,{
OUTDON:
HLRZ T,DOTXT
XCT FINTAB(T)
FINTAB: JRST OUTDN1
HALT TDONE
JRST TDONE
HALT PDONE
JRST PDONE
TDONE: SETZM DOTXT
TRNN FLAG,TRWDRL ;JUST DRILL PLOT?
JRST PLOP0 ;LOOP TO RETICLE SELECT
JRST OUTDN1
PDONE: SOS T,DOTXT
TLNE T,4
JRST [ TRNN FLAG,TRWDRL
JRST [ TRNE T,-1
JRST PLOP0
TRNN FLAG,DOTAPE
JRST PDONE
MOVEI T,DONUT ;PBASE MUST BE DONUT PAD FOR DRILL PLOT!
MOVEM T,LSTRET ;INHIBIT RETICLE SELECT
JRST PLOP0]
TRNE T,-1
JRST PDONE
JRST PLOP0]
TRNN FLAG,DOTAPE
JRST PDONE1
MOVEI T,=30
MOVEI TTT,=12 ;X,Y ZERO, FOLLOWED BY =30
PUSHJ P,FIVDEC
MOVEI T,200
PUSHJ P,PTAPE
OUTSTR[ASCIZ/DRILL TAPE FILE COMPLETE, BUT MUST BE PROCESSED BY TD!
/]
RELEASE TAP, ;CLOSE TAPE CHANNEL
TRZ FLAG,DOTAPE ;MAKE SURE IT'S DONE
PDONE1: SKIPN ANYTXT
JRST TDONE ;TEXT DONE INSTANTLY IF NOT DOING IT
MOVSI T,2
MOVEM T,DOTXT
JRST PLOP0
OUTDN1: PUSHJ P,FORCE ;FINISH CURRENT STUFF AND RAISE PEN
SKIPE E,CRDNUM ;DID HE WANT A CARD?
JRST GOTCRD
JRST CRDN
};MPC
;LINES
OUTLS: HRRZ E,1(B) ;GET POINTER TO END OF LINE
MOVEI TTT,1 ;INCREMENT
JRST DOLINE
OUTLE: HRRZ E,-1(B) ;GET POINTER TO START OF LINE
MOVNI TTT,1 ;INCREMENT
DOLINE: MOVE T,(C) ;GET X,Y
CAMN T,CURSE ;ARE WE THERE?
TRNN FLAG,IKNOW ;DO WE REALLY KNOW WHERE WE ARE?
CAIA ;NO
JRST WETHER ;YES
PUSHJ P,FIXXY ;NO, GET X AND Y
PUSH P,TTT
TRNE FLAG,FR80
PUSHJ P,FRLNS ;INVISIBLE
MPC,{ TRNE FLAG,DOMAG ;DO MAG TAPE?
PUSHJ P,MAGLNS ;YES, START LINE
};MPC
POP P,TTT
TRNN FLAG,%DOPLT
JRST WETHER
JSA 16,PLOT ;MOVE TO STARTING POSITION
JUMP X
JUMP Y
JUMP [3] ;PEN UP
WETHER: ADD C,TTT ;GO TO NEXT LINE
MOVE T,(C) ;GET X,Y
PUSHJ P,FIXXY ;GET X AND Y
PUSH P,TTT
TRNE FLAG,FR80
PUSHJ P,FRLIN
MPC,{ TRNE FLAG,DOMAG
PUSHJ P,MAGLIN
};MPC
POP P,TTT
TRNN FLAG,%DOPLT
JRST NOPLT1
JSA 16,PLOT ;PLOT IT
JUMP X
JUMP Y
JUMP [2] ;PEN DOWN
NOPLT1: CAME C,E ;DONE?
JRST WETHER ;NO
MOVE T,(C) ;YES, GET LAST X,Y
MOVEM T,CURSE ;DEPOSIT AS CURRENT X,Y
TRO FLAG,IKNOW ;NOW WE KNOW WHERE WE ARE
JRST PLOP ;LOOP
;TEXT
OUTTXT:
HLRZ T,(C) ;GET CODE
LSH T,-1
XCT (T)TDIS
MOVE T,(A) ;GET X,Y
PUSHJ P,FIXXY ;GET X AND Y
MOVE T,(C) ;GET SIZE
LSH T,-1
SETZM ANGLE ;ASSUME HORZ
TRZE T,200000 ;VERT MAYBE?
AOS ANGLE ;YES
MPC,{ LSH T,-3
MOVEM T,CSIZ
MOVE T,MTAB(T) ;GET HEIGHT (SPACING)
};MPC
MD,{ IMUL T,SCALE ; " }
MOVEM T,CSIZZ
MD,{ ASH T,-1
ADDM T,Y ;OFFSET Y BY THIS (4*SIZE)
MOVE T,(C) ;GET SIZE AGAIN
TRNN T,400000 ;VERT TEXT?
SKIPA T,CSIZZ ;NO, POS
MOVN T,CSIZZ ;YES, NEG
ASH T,-1
ADDM T,X ;OFFSET X BY THIS (4*SIZE)
};MD
ADDI C,1
HRRM C,TTPNT ;DEPOSIT TEXT POINTER
MOVEI TT,FRTXT1 ;POINTER TO TEXT WE ARE GOING TO DO
TRNE FLAG,FR80
PUSHJ P,FRTXT
MPC,{ TRNE FLAG,DOMAG
PUSHJ P,MAGTXT
};MPC
TRNN FLAG,%DOPLT
JRST TXTDN1
JSA 16,SYMBOL ;PLOT THE TEXT
FRTXT1: JUMP X
JUMP Y
JUMP CSIZZ ;SIZE
JUMP ANGLE
TTPNT: JUMP 0 ;TEXT POINTER
JUMP [XWD 5,5] ;TYPE (UNTIL NULL)
TXTDN1: MOVE T,1(A) ;APPROX END OF TEXT
MOVEM T,CURSE
TRZ FLAG,IKNOW ;FLAG THAT WE DON'T KNOW WHERE WE ARE!
JRST PLOP
PADDN1: TRZ FLAG,IKNOW
PADDN2: JRST PLOP ;LOOP
TDIS: JFCL ;FALL THROUGH FOR TEXT
MD,{ JRST DIAMOND }
MPC,{ JRST HOLE
JRST PAD }
;FIX X,Y'S
FIXXY: PUSH P,T
HLRE TT,T ;GET X
HRRES T ;GET Y
MPC,{ ASH TT,-1 }
IMUL TT,SCALE
MPC,{ ADD TT,XOFF }
MPC,{ ASH T,-1 }
IMUL T,SCALE
MPC,{ ADD T,YOFF }
MOVEM T,Y
CAMGE T,SMLY
MOVEM T,SMLY
CAMLE T,LRGY
MOVEM T,LRGY
MOVEM TT,X
CAMGE TT,SMLX
MOVEM TT,SMLX
CAMLE TT,LRGX
MOVEM TT,LRGX
POP P,T
POPJ P,
UNFIX: MOVE T,X ;GET X
MPC,{ SUB T,XOFF }
IDIV T,SCALE ;ADJUST
MD,{ TRZ T,1 }
MPC,{ ASH T,1 }
MOVEM T,1(P) ;STUFF AWAY HERE TEMPORARILY
MOVE T,Y
MPC,{ SUB T,YOFF }
IDIV T,SCALE
MD,{ TRZ T,1 }
MPC,{ ASH T,1 }
HRL T,1(P)
POPJ P,
;PAD SIMULATION TABLES
MPC,{
DEFINE XY(X,Y)
{ XWD <X>/5*2,<Y>/5*2 }
RADIX =10
XTAB: XY 0,-20
XY 0,20
XY 0,0
XY 20,0
XY -20,0
XLEN←←.-XTAB
PADTAB:
XY -5,-25
XY -20,-20
XY -25,-5
XY -25,5
XY -20,20
XY -5,25
XY 5,25
XY 20,20
XY 25,5
XY 25,-5
XY 20,-20
XY 5,-25
XY -5,-25
PADLEN←←.-PADTAB
CLRTAB:
XY 10,-35
XY 20,-30
XY 30,-20
XY 35,-10
XY 35,10
XY 30,20
XY 20,30
XY 10,35
XY -10,35
XY -20,30
XY -30,20
XY -35,10
XY -35,-10
XY -30,-20
XY -20,-30
XY -10,-35
XY 10,-35
CLRLEN←←.-CLRTAB
SQRTAB:
XY 25,25
XY 25,-25
XY -25,-25
XY -25,25
XY 25,25
SQRLEN←←.-SQRTAB
TGTAB: XY -20,-90
XY -50,-80
XY -80,-50
XY -90,-20
XY -90,20
XY -80,50
XY -50,80
XY -20,90
XY 20,90
XY 50,80
XY 80,50
XY 90,20
XY 90,-20
XY 80,-50
XY 50,-80
XY 20,-90
XY -20,-90
XY -20,-60
XY -40,-50
XY -50,-40
XY -60,-20
XY -60,20
XY -50,40
XY -40,50
XY -20,60
XY 20,60
XY 40,50
XY 50,40
XY 60,20
XY 60,-20
XY 50,-40
XY 40,-50
XY 20,-60
XY -20,-60
XY -10,-30
XY -30,-10
XY -30,10
XY -10,30
XY 10,30
XY 30,10
XY 30,-10
XY 10,-30
XY -10,-30
XY 0,-5
XY -5,0
XY 0,5
XY 5,0
XY 0,0
TGLEN←←.-TGTAB
RADIX 8
;DO PADS AND DRILL HOLES(PC)
PAD: HRRZ T,(C)
LSH T,-1
MOVEM T,PADNUM
MOVE T,(A)
MOVEM T,CURSE
PUSHJ P,DOPAD
JRST PADDN1
HOLE: SETZM PADNUM
MOVE T,(A)
MOVEM T,CURSE
PUSHJ P,DOHOLE
JRST PADDN1
DOHOLE: TRNN FLAG,DOTAPE
JRST QQTAPE
MOVE T,CURSE
PUSHJ P,FIXXY
MOVE T,Y ;INVERT BY INTERCHANGING X AND Y.
IMULI T,5
MOVEI TTT,5
PUSHJ P,[FIVDEC:IDIVI T,=10
HRLM TT,(P)
SOJLE TTT,FIVDC1
PUSHJ P,FIVDEC
FIVDC1: HLRZ T,(P)
MOVE T,(T)[ 40
1
2
23
4
25
26
7
10
31]
JRST PTAPE]
MOVE T,X
IMULI T,5
MOVEI TTT,5
PUSHJ P,FIVDEC
MOVEI T,40
PUSHJ P,PTAPE ;MACHINE FUNCTION
MOVEI T,1
PUSHJ P,PTAPE ;DRILL SIZE
MOVEI T,200
PUSHJ P,PTAPE ;END OF BLOCK
QQTAPE: TRNN FLAG,TRWDRL ;FAKING UP A DRILL PLOT FOR TRW
POPJ P, ;NO, ALL DONE
DOPAD: TRNE FLAG,DOMAG
PUSHJ P,MAGPAD
MOVE E,PADNUM
CAIL E,MXPLEN ;LEGAL FOR TABLE
MOVEI E,MXPLEN-1 ;NO, USE LAST ENTRY
MOVE E,PTAB(E)
STRTPD: MOVEI D,3 ;FIRST MOVE INVISIBLE
PUTPAD: MOVE T,(E)
ADD T,CURSE
TLZ T,1
PUSHJ P,FIXXY
PUSHJ P,PLOTIT
MOVEI D,2
AOBJN E,PUTPAD
POPJ P,
TARGET: MOVEI C,[0]
TRNE FLAG,DOMAG
PUSHJ P,MAGPAD ;SAME AS PAD'S (JUST FLASH COMMAND)
MOVE E,[XWD -TGLEN,TGTAB]
JRST STRTPD
PTAB: XWD -XLEN,XTAB
XWD -PADLEN,PADTAB
XWD -CLRLEN,CLRTAB
XWD -SQRLEN,SQRTAB
XWD -PADLEN,PADTAB ;JUST LOTS OF THESE FOR NOW
MXPLEN←←.-PTAB
>
;DO DIAMONDS(D)
MD,{
DIAMOND:MOVE C,(A)
MOVE T,C
EXCH C,CURSE
PUSHJ P,FIXXY
HRR T,Y
HRL T,X
MOVEM T,DIALOC
MOVE E,[XWD -DIALEN,DIATAB]
MOVEI D,2
CAMN E,CURSE
TRNN FLAG,IKNOW ;DO WE REALLY KNOW WHERE WE ARE
CAIA
JRST DIAPLT
TRNE FLAG,FR80
PUSHJ P,FRLNS
TRNN FLAG,%DOPLT
JRST DIAPLT
JSA 16,PLOT
JUMP X
JUMP Y
JUMP [3]
DIAPLT: MOVE T,(E)
ADD T,DIALOC
HRREM T,Y
HLREM T,X
PUSHJ P,PLOTIT
AOBJN E,DIAPLT
JRST PADDN1
DIATAB: XWD 5,0
XWD 0,5
XWD -5,0
XWD 0,-5
XWD 5,0
XWD 0,0
DIALEN←←.-DIATAB
};MD
FORCE: TRNN FLAG,%DOPLT
POPJ P,
JSA 16,WHERE
JUMP X
JUMP Y
JSA 16,PLOT
JUMP X
JUMP Y
JUMP [3]
CLOSE 17, ;FORCE COMPLETION
CALLI 17,10 ;WAIT FOR IT TO FINISH
POPJ P,
PLOTIT: TRNE FLAG,FR80
PUSHJ P,FRLINS
PLOTIA: TRNN FLAG,%DOPLT
POPJ P,
JSA 16,PLOT
JUMP X
JUMP Y
JUMP D
POPJ P,
;PC CARD (PC)
MPC,{
CRDN: PUSHJ P,FORCE ;FINISH CURRENT BUSINESS
OUTSTR[ASCIZ/CARD NUMBER?/]
PUSHJ P,DECIN
JRST [ PUSHJ P,IERR
JRST CRDN]
JUMPE TTT,NOCARD
MOVE E,TTT
LSH E,1 ;ACCOUNT FOR SHIFT LATER
GOTCRD: HLLZS CRDNAM+1
SETZM CRDNAM+2
MOVE T,['DATRPH']
MOVEM T,CRDNAM+3
LOOKUP 5,CRDNAM
JRST [ OUTSTR[ASCIZ/CAN'T FIND CARD.TAB!
/]
HALT NOCARD]
MOVEI D,3
TRZ E,400000 ;CLEAR SIDE INDICATOR
LSH E,-1 ;COMPENSATE FOR OFFSET
CRDLOP: SOJLE E,CRDFND
PUSHJ P,IN
CAIN A,400000
JRST [ OUTSTR[ASCIZ/NO SUCH CARD!
/]
JRST CRDN]
PUSHJ P,IN
CAIE A,400000
JRST .-2
JRST CRDLOP
CRDFND: MOVE T,T3S
MOVEM T,T3P
SETZ F,
CRDFN4: PUSHJ P,IN
CAME A,[(400000)]
CAIN A,400000
JRST CRDFN3
MOVE T,T3P
CAMG T,JOBREL
JRST CRDFOK
CALLI T,11
JRST 4,.-4
CRDFOK: ADD F,A
TLZ F,1
MOVEM A,@T3P
AOS T3P
JRST CRDFN4
CRDFN3: MOVEM A,@T3P
MOVE T,T3P
SUB T,T3S ;NUMBER OF ENTRIES
HRRE TT,F
IDIV TT,T
HRRM TT,CENTER
HLRE TT,F
IDIV TT,T
HRLM TT,CENTER
CRDLP1: MOVE A,@T3S
CAMN A,[(400000)]
JRST CRDFNG
CAIN A,400000
JRST NOCARD
TRNE FLAG,PLANE ;INNER PLANE?
SKIPA T,[IPBRET] ;WIDE SWATCH
MOVEI T,LINRET
PUSHJ P,DORET
MOVE T,A
TRNE FLAG,PLANE ;FUDGE IF OUTER PLANE
JRST NOPLAN
MOVE TT,A
TLO TT,1
SUB TT,CENTER
BFUDGE←←5 ;FUDGE BY 5 MILS
MOVE TTT,[XY BFUDGE,BFUDGE]
TLNE TT,400000 ;X NEGATIVE?
HRLI TTT,-=BFUDGE/5*2
TRNE TT,400000
HRRI TTT,-=BFUDGE/5*2
ADD T,TTT
TLZ T,1
NOPLAN: TRZE T,1
MOVEI D,3
PUSHJ P,FIXXY
TRNN FLAG,DOMAG
JRST NNMAG
CAIN D,3
JRST [ PUSHJ P,MAGLNS
JRST .+2]
PUSHJ P,MAGLIN
NNMAG: PUSHJ P,PLOTIT
MOVEI D,2
AOS T3S
JRST CRDLP1
;CARD FINGERS, SHORTING BARS, TARGETS(PC)
CRDFNG: TRNN FLAG,TRWDRL ;THIS GUY ONLY DOES DRILL HOLES, SKIP FINGERS
TRNE FLAG,PLANE ;INNER PLANE
JRST [ PUSHJ P,CSKIP ;SKIP FRONT FINGERS
PUSHJ P,CSKIP ;SKIP BACK FINGERS
PUSHJ P,CSKIP ;SKIP FRONT SHORTING BARS
PUSHJ P,CSKIP ;SKIP BACK SHORTING BARS
JRST DOTAR2] ;GO DO TARGETS!
MOVE T,CRDNUM
TRNN T,400000
PUSHJ P,CSKIP ;SKIP OVER FRONT SIDE
PUSHJ P,CRDFN1
PUSHJ P,CSKIP ;SKIP BACK SIDE OR FRONT SHORTING BARS
DONIT: PUSHJ P,IN
CAME A,[(400000)]
CAIN A,400000
JRST DOTARG
MOVE C,A
PUSHJ P,IN
CAME A,[(400000)]
CAIN A,400000
JRST DOTARG
MOVE B,A
PUSHJ P,SHORT
JRST DONIT
DOTARG: MOVE T,CRDNUM
TRNE T,400000 ;DO WE STILL HAVE TO SKIP SOME SHORTING BARS?
PUSHJ P,CSKIP ;YES
DOTAR2: PUSHJ P,IN
CAME A,[(400000)]
CAIN A,400000
JRST NOCARD ;NO TARGETS!
CAIA ;SKIP CALL TO IN
DOTAR1: PUSHJ P,IN
DOTAR3: CAME A,[(400000)]
CAIN A,400000
JRST NOCARD
MOVEM A,CURSE
MOVEI T,TARRET
PUSHJ P,DORET
PUSHJ P,TARGET
JRST DOTAR1
CRDFN1: PUSHJ P,IN
CAME A,[(400000)]
CAIN A,400000
POPJ P,
MOVE C,A
PUSHJ P,IN
CAME [(400000)]
CAIN A,400000
POPJ P,
MOVE B,A
PUSH P,A
PUSHJ P,IN ;READ PIN# AND CONNECTOR ID AND IGNORE!
POP P,A
PUSHJ P,SHORT
JRST CRDFN1
CSKIP: PUSHJ P,IN
CAME A,[(400000)]
CAIN A,400000
POPJ P,
JRST CSKIP
SHORT: MOVEI T,FNGRET
PUSHJ P,DORET
TRNN FLAG,DOMAG
JRST XXXMAG
MOVE T,C
PUSHJ P,FIXXY
PUSHJ P,MAGLNS
MOVE T,B
PUSHJ P,FIXXY
PUSHJ P,MAGLIN
XXXMAG: TLO A,1
SUB A,C
TDZ A,[(1)1]
MOVEI E,0
MOVEI F,2
TLNE A,400000
MOVEI E,1
TRNE A,400000
MOVEI F,3
HLRE TT,A
MOVMS TT
HRRE T,A
MOVMS T
CAML TT,T
MOVE F,E
JRST @(F)[ FRIGHT
FLEFT
FUP
FDOWN]
;CHEATING BOX FOR LINE
DEFINE XYZ(X,Y)
{ RADIX =10
ADD T,[XY X,Y]
TDZ T,[(1)1]
RADIX =8
}
FRIGHT: MOVE T,C
XYZ -FWIDTH,FWIDTH
PUSHJ P,AIVECT
MOVE T,C
XYZ -FWIDTH,-FWIDTH
PUSHJ P,AVECT
MOVE T,B
XYZ FWIDTH,-FWIDTH
PUSHJ P,AVECT
MOVE T,B
XYZ FWIDTH,FWIDTH
PUSHJ P,AVECT
MOVE T,C
XYZ -FWIDTH,FWIDTH
JRST AVECT
FLEFT: MOVE T,B
XYZ -FWIDTH,FWIDTH
PUSHJ P,AIVECT
MOVE T,B
XYZ -FWIDTH,-FWIDTH
PUSHJ P,AVECT
MOVE T,C
XYZ FWIDTH,-FWIDTH
PUSHJ P,AVECT
MOVE T,C
XYZ FWIDTH,FWIDTH
PUSHJ P,AVECT
MOVE T,B
XYZ -FWIDTH,FWIDTH
JRST AVECT
FUP: MOVE T,C
XYZ -FWIDTH,-FWIDTH
PUSHJ P,AIVECT
MOVE T,C
XYZ FWIDTH,-FWIDTH
PUSHJ P,AVECT
MOVE T,B
XYZ FWIDTH,FWIDTH
PUSHJ P,AVECT
MOVE T,B
XYZ -FWIDTH,FWIDTH
PUSHJ P,AVECT
MOVE T,C
XYZ -FWIDTH,-FWIDTH
JRST AVECT
FDOWN: MOVE T,B
XYZ -FWIDTH,-FWIDTH
PUSHJ P,AIVECT
MOVE T,B
XYZ FWIDTH,-FWIDTH
PUSHJ P,AVECT
MOVE T,C
XYZ FWIDTH,FWIDTH
PUSHJ P,AVECT
MOVE T,C
XYZ -FWIDTH,FWIDTH
PUSHJ P,AVECT
MOVE T,B
XYZ -FWIDTH,-FWIDTH
JRST AVECT
AIVECT: PUSHJ P,FIXXY
MOVEI D,3
JRST PLOTIT
AVECT: PUSHJ P,FIXXY
MOVEI D,2
JRST PLOTIT
NOCARD:
};MPC
;BOX SUBR(D)
MD,{
OUTDON:
PUSHJ P,FORCE
SKIPN BRDPNT
JRST NOBRD
OUTSTR[ASCIZ/DOING BOX!
/]
MOVEI T,1
MOVEM T,SCALE
MOVE T,OFFSET
MOVEI D,3
PUSHJ P,FIXXY
PUSHJ P,PLOTIT
HLLZ T,BRDPNT
MOVN T,T
ADD T,OFFSET
TLZ T,1
MOVEI D,2
PUSHJ P,FIXXY
PUSHJ P,PLOTIT
HLLZ T,BRDPNT
MOVN T,T
ADD T,OFFSET
HRRZ TT,BRDPNT
ADD T,TT
TLZ T,1
PUSHJ P,FIXXY
PUSHJ P,PLOTIT
HRRZ T,BRDPNT
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
PUSHJ P,PLOTIT
MOVE E,[XWD -BOXLEN,BOXTAB]
BRDLOP: MOVE T,(E)
MOVEI D,2
TRZE T,1
MOVEI D,3 ;REALLY INVISIBLE
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
PUSHJ P,PLOTIT
AOBJN E,BRDLOP
MOVE T,(E)
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
MOVEI TT,FRTXT2
TRNE FLAG,FR80
PUSHJ P,FRTXT
TRNN FLAG,%DOPLT
JRST NOPLT2
JSA 16,SYMBOL
FRTXT2: JUMP X
JUMP Y
JUMP [40]
JUMP [0] ;ANGLE
JUMP [ASCIZ/STANFORD ARTIFICIAL/]
JUMP [XWD 5,5] ;END ON NULL
NOPLT2: MOVE T,1(E)
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
MOVEI TT,FRTXT3
TRNE FLAG,FR80
PUSHJ P,FRTXT
TRNN FLAG,%DOPLT
JRST NOPLT3
JSA 16,SYMBOL
FRTXT3: JUMP X
JUMP Y
JUMP [40]
JUMP [0]
JUMP [ASCIZ/INTELLIGENCE PROJECT/]
JUMP [XWD 5,5]
NOPLT3: MOVE T,2(E)
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
MOVEI T,STR2+1
HRRM T,STRPNT
MOVE B,STR2
MOVEI D,40 ;SIZE 4
PUSHJ P,STRDON
;MORE BOX SUBR(D)
MOVE T,3(E)
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
MOVEI T,STR3+1
HRRM T,STRPNT
MOVE B,STR3
PUSHJ P,STRDON
MOVE A,[POINT 7,STR0]
MOVEI B,3 ;NUM CHARS PUT OUT BY SIXLOP
MOVE T,11(E)
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
MOVE TT,SAVNAM
PUSHJ P,[SIXLOP:SETZ T,
LSHC T,6
JUMPE T,SIXLP1
ADDI T,40
IDPB T,A
ADDI B,1
SIXLP1: JUMPN TT,SIXLOP
POPJ P,]
MOVEI T,"."
SKIPN TT,SAVEXT
JRST NOPEXT
IDPB T,A
ADDI B,1
PUSHJ P,SIXLOP
NOPEXT: MOVEI T,"["
IDPB T,A
SKIPN TT,SAVPPN
DSKPPN TT,
HLLZS TT
PUSHJ P,SIXLOP
MOVEI T,","
IDPB T,A
SKIPN TT,SAVPPN
DSKPPN TT,
HRLZS TT
PUSHJ P,SIXLOP
MOVEI T,"]"
IDPB T,A
MOVEI T,0
IDPB T,A ;END WITH NULL
MOVEI D,30
CAILE B,=16
MOVEI D,22
MOVEI B,0
MOVEI T,STR0
HRRM T,STRPNT
PUSHJ P,STRDON
MOVE A,[POINT 7,STR0]
MOVE T,4(E)
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
LDB T,[POINT 12,DRWDAT,35]
IDIVI T,=31
ADDI TT,1
IDIVI TT,=10
ADDI TT,60
IDPB TT,A
ADDI TTT,60
IDPB TTT,A
MOVEI TT,"-"
IDPB TT,A
IDIVI T,=12
LDB TTT,[POINT 7,MONTAB(TT),6]
IDPB TTT,A
LDB TTT,[POINT 7,MONTAB(TT),13]
IDPB TTT,A
LDB TTT,[POINT 7,MONTAB(TT),20]
IDPB TTT,A
MOVEI TT,"-"
IDPB TT,A
ADDI T,=64
IDIVI T,=10
ADDI T,60
IDPB T,A
ADDI TT,60
IDPB TT,A
MOVEI TT,0
IDPB TT,A
MOVEI B,0
MOVEI D,30
MOVEI T,STR0
HRRM T,STRPNT
PUSHJ P,STRDON
;MORE BOX SUBR(D)
MOVE T,5(E) ;APPROVED BY
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
MOVEI TT,FRTXT5
TRNE FLAG,FR80
PUSHJ P,FRTXT
TRNN FLAG,%DOPLT
JRST NOPLT5
JSA 16,SYMBOL
FRTXT5: JUMP X
JUMP Y
JUMP [14]
JUMP [0]
JUMP [ASCIZ/APPROVED BY:/]
JUMP [XWD 5,5]
NOPLT5: MOVE T,6(E) ;DRAWN BY
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
MOVEI TT,FRTXT6
TRNE FLAG,FR80
PUSHJ P,FRTXT
TRNN FLAG,%DOPLT
JRST NOPLT6
JSA 16,SYMBOL
FRTXT6: JUMP X
JUMP Y
JUMP [14]
JUMP [0]
JUMP [ASCIZ/DRAWN BY:/]
JUMP [XWD 5,5]
NOPLT6: MOVE T,7(E)
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
MOVEI D,40
MOVEI T,STR1+1
HRRM T,STRPNT
MOVE B,STR1
PUSHJ P,STRDON
;SIGNATURE(D)
DOSIG: SKIPN SIGNAM
JRST NOBRD
INIT DAT,10
SIXBIT /DSK/
PZE INBUF
JRST [OUTSTR [ASCIZ /DSK NOT AVAIL -- WHAT THE FUCK?/]
HALT NAMSET]
MOVEI TT,IBUF
EXCH TT,JOBFF
INBUF DAT,2
MOVEM TT,JOBFF
MOVE T,SIGNAM
MOVEM T,FILNAM
DOSIG1: MOVE T,SIGEXT
HLLZM T,FILEXT
MOVE T,SIGPPN
MOVEM T,FILPPN
SETZM FILEXT+1
LOOKUP DAT,FILNAM
JRST [ OUTSTR[ASCIZ/CAN'T FIND SIGNATURE FILE!
/]
PUSHJ P,ASKSIG ;ASK HIM AGAIN
JRST DOSIG1]
MOVE T,T3S
MOVEM T,T2S
MOVEM T,T2P
SUB T,JOBREL ;CALC DIST FROM HERE TO TOP OF CORE
ASH T,-1 ;HALF IT
ADD T,JOBREL ;NOW HALFWAY FROM T2S TO JOBREL
MOVEM T,T1S
MOVEM T,T1P
PUSH P,E ;SAVE E
SIGLP1: PUSHJ P,IN
HLRZ T,A
CAIN T,400001
JRST SIGLP2
MOVE T,A
PUSHJ P,PUT1 ;USE TABLE 1 FOR SIGNATURE X,Y
TRNN A,1
TDZA T,T
MOVSI T,1
PUSHJ P,PUT2 ;MAKE SEGMENTS IN TABLE 2
JRST SIGLP1
SIGLP2: MOVE T,[XWD -=2000,-=500]
MOVEM T,CURSE ;FIND CLOSEST TO HERE
TRZ FLAG,IKNOW ;DON'T KNOW WHERE WE ARE YET
PUSHJ P,FSTINI ;REINITIALIZE FREE STORAGE POINTER
PUSHJ P,SORT ;SORT SIGNATURE
POP P,F ;GET SAVED E INTO F
SIGLP3: PUSHJ P,CLFND
JUMPE A,NOBRD
SUB A,T2S
ADD A,T1S
MOVE T,(A)
TRZN T,1
JRST SIGLP4
MOVEI D,3
CAMN T,CURSE
TRNN FLAG,IKNOW
CAIA
MOVEI D,2
PUSHJ P,[FIXSIG:
ASH T,-1
TRNE T,200000
TROA T,400000
TRZ T,400000
ADD T,10(F)
TLZ T,1
ADD T,OFFSET
TLZ T,1
PUSHJ P,FIXXY
JRST PLOTIT]
MOVE T,-1(A)
TRZ T,1
MOVEM T,CURSE
TRO FLAG,IKNOW ;NOW WE KNOW
MOVEI D,2
PUSHJ P,FIXSIG
JRST SIGLP3
SIGLP4: MOVEI D,3
CAMN T,CURSE
TRNN FLAG,IKNOW ;DO WE REALLY KNOW
CAIA
MOVEI D,2
PUSHJ P,FIXSIG
MOVEI D,2
MOVE T,1(A)
TRZ T,1
MOVEM T,CURSE
TRO FLAG,IKNOW
PUSHJ P,FIXSIG
JRST SIGLP3
NOBRD:
MOVEI T,1
MOVEM T,SCALE
MOVE T,STOP
PUSHJ P,FIXXY
TRNN FLAG,%DOPLT
JRST NOPLT7
JSA 16,PLOT
JUMP X
JUMP Y
JUMP [3]
NOPLT7: OUTSTR[ASCIZ/PLOT DONE!
/]
JRST ENDPLT
};MD
;END PC, PRINT ACTUAL MAX X,Y'S(PC), STRING SUBRS(D)
MPC,{
TRNN FLAG,%DOPLT
JRST NOPLT8
JSA 16,PLOT
JUMP [0]
JUMP [0]
JUMP [-3]
NOPLT8:
OUTSTR[ASCIZ/ACTUAL MIN X = /]
MOVE T,SMLX
IMULI T,5
PUSHJ P,MILOUT
OUTSTR[ASCIZ/ MAX X = /]
MOVE T,LRGX
IMULI T,5
PUSHJ P,MILOUT
OUTSTR[ASCIZ/ MIN Y = /]
MOVE T,SMLY
IMULI T,5
PUSHJ P,MILOUT
OUTSTR[ASCIZ/ MAX Y = /]
MOVE T,LRGY
IMULI T,5
PUSHJ P,MILOUT
OUTSTR[ASCIZ/
PLOT DONE!
/]
RELEAS 5,
RELEAS 17,
TRNN FLAG,DOMAG
JRST ENDPLT
MOVE TT,MAGBUF+2
CAIG TT,=30
PUSHJ P,ENDREC
MOVE TT,[POINT 7,[ASCIZ/G57D10END OF PLOT, THANK YOU!*/]]
PUSHJ P,MAGSTR
MOVE TT,MAGBUF+2
CAIG TT,=11
PUSHJ P,ENDREC
MOVE TT,[POINT 7,[ASCIZ/G01D02*M00********/]]
PUSHJ P,MAGSTR
RELEASE 0,
JRST ENDPLT
CRDNAM: 'CARD '
'TAB '
0
'DATRPH'
};MPC
ENDPLT: TRNN FLAG,FR80
JRST PCLOOP ;NOTHING ELSE TO DO
MOVEI T,(<BYTE(4)0(3)7(11)1>) ;END WITH FRAME ADVANCE
PUSHJ P,FROUT
RELEASE F80CHN, ;RELEASE FR80 CHANNEL
JRST PCLOOP
MD,{
PLTSTR: SETZ B,
STRLOP: PUSHJ P,GETCHL
CAIN T,12
JRST STRDN1
IDPB T,A
SOJA B,STRLOP
STRDN1: MOVEI T,0
IDPB T,A
IMULI B,=20/5
IMUL B,D
POPJ P,
TITCLR: SETZM STR1
SETZM STR2
SETZM STR3
DATDEF: CALLI A,14
MOVEM A,DRWDAT
CALLI A,22
IDIVI A,=1000 ;GET MINUTES
DPB A,[POINT 24,DRWDAT,23]
POPJ P,
DOTIT: PUSHJ P,RTIT
JRST DATDEF
DOTITD: PUSHJ P,RTIT
PUSHJ P,IN
MOVEM A,DRWDAT ;READ DATE OF DRW FILE
POPJ P,
RTIT: MOVEI B,STR1
PUSHJ P,BRSTR
MOVEI B,STR2
PUSHJ P,BRSTR
MOVEI B,STR3
BRSTR: MOVEI C,1(B)
BRSTR1: PUSHJ P,IN
MOVEM A,(C)
TRNE A,376
AOJA C,BRSTR1
SUBI C,1(B)
IMUL C,[-5]
TLNE A,774000
SUBI C,1
TLNE A,3760
SUBI C,1
TDNE A,[17700000]
SUBI C,1
TRNE A,77400
SUBI C,1
IMULI C,=20/5*4 ;SIZE 4
MOVEM C,(B)
POPJ P,
STRDON: ADDM B,X
MOVEI TT,FRTXT7
TRNE FLAG,FR80
PUSHJ P,FRTXT
TRNN FLAG,%DOPLT
POPJ P,
JSA 16,SYMBOL
FRTXT7: JUMP X
JUMP Y
JUMP D
JUMP [0]
STRPNT: JUMP 0
JUMP [XWD 5,5]
POPJ P,
MONTAB: ASCIZ/JAN/
ASCIZ/FEB/
ASCIZ/MAR/
ASCIZ/APR/
ASCIZ/MAY/
ASCIZ/JUN/
ASCIZ/JUL/
ASCIZ/AUG/
ASCIZ/SEP/
ASCIZ/OCT/
ASCIZ/NOV/
ASCIZ/DEC/
;BOX DEFINITIONS
DEFINE BXY(X,Y,FLAVOR)
{
%I←←0
IFIDN{FLAVOR}{I}{%I←←1}
XWD -(X)/10*2,(Y)/10*2+%I
}
BOXWID←←AW*5
RADIX =10
BOXTAB:
BXY 0,0
BXY 0,1000,I
BXY BOXWID,1000
BXY BOXWID,0
BXY BOXWID-3500,0,I
BXY BOXWID-3500,1000
BXY 3000,1000,I
BXY 3000,0
BXY 3000,600,I
BXY 0,600
BXY 1000,600,I
BXY 1000,0
BXY 1000,300,I
BXY 3000,300
BOXLEN←←.-BOXTAB
BXY BOXWID-250,600 ;STANFORD ARTIFICIAL
BXY BOXWID-150,200 ;INTELLIGENCE PROJECT
BXY <(BOXWID-500)/2>,600;TITLE 1
BXY <(BOXWID-500)/2>,200;TITLE 2
BXY 2500,100 ;DATE
BXY 2800,900 ;APPROVED BY
BXY 900,500 ;DRAWN BY
BXY 500,200 ;INITIALS
BXY 1250,600 ;SIGNATURE
BXY 2875,350 ;FILENAME
RADIX =8
};MD
;MAGTAPE OUTPUT ROUTINES
MPC,{
MAGSTR: ILDB T,TT
JUMPE T,CPOPJ
PUSHJ P,MAGCHR
JRST MAGSTR
MAGLNS: PUSHJ P,ENDCHK
PUSHJ P,MAGG01
PUSHJ P,MAGD0
MOVEI T,"2"
PUSHJ P,MAGCHR
MGSTAR: MOVEI T,"*"
JRST MAGCHR
MAGLIN: PUSHJ P,ENDCHK
PUSHJ P,MAGG01
PUSHJ P,MAGD0
MOVEI T,"1"
PUSHJ P,MAGCHR
JRST MGSTAR
MAGPAD: MOVE T,CURSE
PUSHJ P,FIXXY
PUSHJ P,MAGLNS ;MOVE INVISIBLE
MOVE T,MAGBUF+2
CAIG T,7
PUSHJ P,ENDREC
MOVE TT,[POINT 7,[ASCIZ/G55D03*/]]
JRST MAGSTR ;FLASH
MAGTXT: PUSHJ P,MAGLNS ;MOVE INVISIBLE
MOVE TTT,TTPNT
HRLI TTT,(<POINT 7,0>)
SETZ T,
MAGTX1: ILDB TT,TTT
JUMPE TT,.+2
AOJA T,MAGTX1
IMULI T,4 ;4 OUT FOR 1 IN
ADDI T,6+7 ;6 OTHER CHARS + 7 ENDING CHARS
CAML T,MAGBUF+2 ;ENOUGH ROOM?
PUSHJ P,ENDREC ;NO SPACE, FLUSH TO RECORD END
MOVEI T,"M"
PUSHJ P,MAGCHR
MOVE TT,CSIZ ;GET CHAR SIZE FROM HERE
ADDI TT,=50
CAILE TT,=54
JRST [ OUTSTR[ASCIZ/CHAR. SIZE TO LARGE, USING SIZE 5
/]
MOVEI TT,=54
JRST .+1]
PUSHJ P,MAGDEC
MOVE TT,[POINT 7,[ASCIZ/G52/]]
SKIPE ANGLE ;HORZ OR VERT?
MOVE TT,[POINT 7,[ASCIZ/G53/]]
PUSHJ P,MAGSTR
MOVE TTT,TTPNT
HRLI TTT,(<POINT 7,0>)
MAGHV1: ILDB T,TTT
JUMPE T,MAGTXE ;DONE
SKIPN TT,ONETAB(T)
JRST [ OUTSTR[ASCIZ/NO "D" CODE FOR "/]
OUTCHR T
OUTSTR[ASCIZ/"
/]
JRST MAGHV1]
PUSH P,TTT
MOVEI T,"D"
PUSHJ P,MAGCHR
PUSHJ P,MAGDEC ;PUT OUT "D" CODE
PUSHJ P,MGSTAR ;AND STAR
POP P,TTT
JRST MAGHV1
MAGTXE: MOVE TT,[POINT 7,[ASCIZ/G01D02*/]]
JRST MAGSTR ;USE THIS TO TERMINATE TEXT
MAGG01: MOVE TT,[POINT 7,[ASCIZ/G01X/]]
PUSHJ P,MAGSTR
MOVE TT,X
IMULI TT,5
PUSH P,TT
SKIPGE (P)
PUSHJ P,[MINUS: MOVEI T,"-"
JRST MAGCHR]
POP P,TT
MOVMS TT
PUSHJ P,[MAGDEC:IDIVI TT,=10
HRLM TTT,(P)
JUMPE TT,MAGDC1
PUSHJ P,MAGDEC
MAGDC1: HLRZ T,(P)
ADDI T,60
JRST MAGCHR]
MOVEI T,"Y"
PUSHJ P,MAGCHR
MOVE TT,Y
IMULI TT,5
PUSH P,TT
SKIPGE (P)
PUSHJ P,MINUS
POP P,TT
MOVMS TT
JRST MAGDEC
MAGD0: MOVEI T,"D"
PUSHJ P,MAGCHR
MOVEI T,"0"
JRST MAGCHR
ENDCHK: MOVE T,MAGBUF+2
CAILE T,=19
POPJ P,
ENDREC: PUSH P,A
MOVE A,MAGBUF+2
ADDI A,2 ;3 INTO NEXT RECORD
ENDRC1: PUSHJ P,MGSTAR
SOJG A,.-1
POP P,A
POPJ P,
BCDTAB: REPEAT 40,<0>
20 ;SPACE
16 ;!
37 ;"
0 ;#
53 ;$
75 ;%
0 ;&
14 ;'
34 ;(
74 ;)
54 ;*
60 ;+
33 ;,
40 ;-
73 ;.
21 ;/
12 ;0
1 ;1
2 ;2
3 ;3
4 ;4
5 ;5
6 ;6
7 ;7
10 ;8
11 ;9
15 ;:
52 ;;
57 ;<
13 ;=
17 ;>
0 ;?
0 ;@
61 ;A
62 ;B
63 ;C
64 ;D
65 ;E
66 ;F
67 ;G
70 ;H
71 ;I
41 ;J
42 ;K
43 ;L
44 ;M
45 ;N
46 ;O
47 ;P
50 ;Q
51 ;R
22 ;S
23 ;T
24 ;U
25 ;V
26 ;W
27 ;X
30 ;Y
31 ;Z
55 ;[
76 ;\
36 ;]
72 ;↑
77 ;←
REPEAT 40,<0>
ONETAB:
FOR I←0,37
< 0
>
=10 ;SPACE
FOR I←41,53
< 0
>
=51 ;,
=39 ;-
=50 ;.
=37 ;/
FOR I←=40,=49
< I
>
FOR I←72,100
< 0
>
FOR I←=11,=36
< I
>
FOR I←133,177
< 0
>
0
MAGCHR: MOVE T,BCDTAB(T) ;AGG!
JUMPE T,BITCH
SOSG MAGBUF+2
OUT TRWCHN,
CAIA
JRST [ OUTSTR[ASCIZ/MAGTAPE OUTPUT ERROR.
START OVER./]
HALT .+1]
IDPB T,MAGBUF+1
POPJ P,
BITCH: OUTSTR[ASCIZ/CHAR. WITH NO BCD EQUIVALENT, THIS IS IMPOSSIBLE!
/]
HALT CPOPJ
PTAPE: SOSG TAPHD+2
OUT TAP,
CAIA
JRST [ OUTSTR[ASCIZ/DRILL TAPE OUTPUT ERROR!
/]
HALT .+1]
IDPB T,TAPHD+1
POPJ P,
GETMES: MOVEI B,0 ;NO CHARS YET!
SETZ C,
MOVE A,[POINT 7,STRING]
CHRGET: PUSHJ P,GETCHL
ANDI T,177
CAIN T,12
JRST CHRDON
CAIN T,"*" ;CAN'T BE IN MESSAGE
AOJ C,
SKIPE BCDTAB(T) ;MUST HAVE BCD EQUIVALENT
SKIPN ONETAB(T) ;AND MUST BE PLOTTABLE!
AOJ C,
IDPB T,A
AOJA B,CHRGET
CHRDON: JUMPE B,NOSPCX
LDB T,A
CAIN T,40 ;SPACE ALREADY?
JRST NOSPCX
MOVEI T,40
IDPB T,A
IDPB T,A
ADDI B,2
NOSPCX: MOVEI T,0
IDPB T,A
CAIG B,=40 ;TOO MANY CHARS?
JUMPE C,CPOPJ ;NO, ILL CHAR?
CAILE B,=40
OUTSTR[ASCIZ/TOO MANY CHARS.
/]
JUMPE C,.+2
OUTSTR[ASCIZ/ILLEGAL CHAR. IN STRING!
/]
OUTSTR[ASCIZ/TRY AGAIN!
/]
JRST GETMES
};MPC
FROUT: SOSG FRBUF+2
OUT F80CHN,
CAIA
JRST [ OUTSTR[ASCIZ/FR-80 OUTPUT ERROR!
/]
HALT FROUT]
IDPB T,FRBUF+1
POPJ P,
MPC,{
FRFIXX:
FRFIXY:
PUSH P,TT
IMUL T,FRFUDG
IDIVI T,=10 ;ACCOUNT FOR EXTRA FACTOR OF TEN IN FRFUDG
POP P,TT
ADDI T,20000 ;16384/2
};MPC
MD,{
FRFIXX: PUSH P,TT
HLRE TT,OFFSET
SUB T,TT
IMUL T,FRFUDG
IDIVI T,=10
POP P,TT
ADDI T,FRMAX-100-FRXFDG ;KEEP AWAY FROM EDGE
JRST FRFIX
FRFIXY: PUSH P,TT
HRRE TT,OFFSET
SUB T,TT
IMUL T,FRFUDG
IDIVI T,=10 ;ACCOUNT FOR EXTRA FACTOR OF TEN IN FRFUDG
ADDI T,FRYFDG+100 ;KEEP AWAY FROM EDGE
POP P,TT
FRFIX:
};MD
CAIGE T,FRMAX
JUMPGE T,.+2
OUTSTR[ASCIZ/FR80 WRAP-AROUND!
/]
ANDI T,FRMAX-1
POPJ P,
FRLNS: TDZA TT,TT ;INVISIBLE
FRLIN: MOVEI TT,(<BYTE(4)10>) ;VISIBLE
MOVE T,X
CAMN T,LASTX
JRST YONLY
MOVEM T,LASTX
MPC,{ SUB T,XOFF };RE-CENTER
PUSHJ P,FRFIXX
TRO T,(<BYTE(4)2>)
TDO T,TT
PUSHJ P,FROUT ;X PART
MOVE T,Y
CAMN T,LASTY ;NEED Y PART?
POPJ P, ;NO
MOVEM T,LASTY
MPC,{ SUB T,YOFF };RE-CENTER
PUSHJ P,FRFIXY
CAIG T,FRMAX-FRYFDG
CAIGE T,FRYFDG
OUTSTR[ASCIZ/FR80 Y VALUE OVERFLOW!
/]
TRO T,(<BYTE(4)1>)
JRST FROUT ;AND Y PART
YONLY: MOVE T,Y
CAMN T,LASTY
POPJ P,
MOVEM T,LASTY
MPC,{ SUB T,YOFF }
PUSHJ P,FRFIXY
CAIG T,FRMAX-FRYFDG
CAIGE T,FRYFDG
OUTSTR[ASCIZ/FR80 Y VALUE OVERFLOW!
/]
TRO T,(<BYTE(4)3>)
TDO T,TT
JRST FROUT
FRLINS: CAIN D,2
JRST FRLIN ;VISIBLE
JRST FRLNS ;INVISIBLE
FRTXT: PUSH P,TT
PUSHJ P,FRLNS ;INVISIBLE
MOVEI T,777777
MOVEM T,LASTY
MOVEM T,LASTX ;FLUSH THESE
POP P,TT
MOVE T,@3(TT) ;GET ROTATION
CAMN T,LSTROT ;DIF?
JRST OLDROT
MOVEM T,LSTROT
LSH T,1
ANDI T,7
TRO T,(<BYTE(3)2(6)10>)
PUSHJ P,FROUT
OLDROT: MOVE T,@2(TT)
IMUL T,FRFUDG
PUSH P,TT
IDIVI T,=10 ;ACCOUNT FOR EXTRA FACTOR OF 10 IN FRFUDG
CAILE T,777
MOVEI T,777
CAMN T,LSTSPC ;NEW CHAR SPACING?
JRST OLDSPC
MOVEM T,LSTSPC
TRO T,(<BYTE(3)2(6)11>) ;SET CHAR SPACING
PUSHJ P,FROUT
MOVE T,LSTSPC ;GET CHAR SPACING
MOVE TT,LSTSPC ;AND ANOTHER COPY
LSH TT,-3 ;TO 1/8
SUB T,TT
CAILE T,777
MOVEI T,777
TRO T,(<BYTE(3)2(6)24>) ;SET CHAR HEIGHT 7/8 TIMES SPACING
PUSHJ P,FROUT
OLDSPC: POP P,TT
MOVEI T,(<BYTE(3)2(6)4>)
PUSHJ P,FROUT ;TYPE MODE
PUSH P,A
SKIPA A,4(TT)
FRSTR: PUSH P,A
HRLI A,(<POINT 7,0>)
SETZ T,
FRSLOP: ILDB TT,A
JUMPE TT,FRSTDN
MOVEM TT,1(P)
MOVE TT,IIITAB(TT)
JUMPE TT,[ OUTSTR[ASCIZ/ILLEGAL CHAR "/]
OUTCHR 1(P)
OUTSTR[ASCIZ/"
/]
JRST FRSLOP]
PUSHJ P,FRCHR
JRST FRSLOP
FRSTDN: POP P,A
MOVEI TT,203
PUSHJ P,FRCHR
JUMPE T,CPOPJ
MOVEI TT,0
FRCHR: LSH T,9
IOR T,TT
TRNN T,777000
POPJ P,
PUSHJ P,FROUT
SETZ T,
POPJ P,
IIITAB: 0
436 ;↓
401 ;α
402 ;~
660 ;∧
657 ;¬
405 ;ε
413 ;π
410 ;λ
0 ;TAB
0 ;LF
424 ;INTEGRAL SIGN
425 ;PLUS MINUS
0 ;CR
0 ;∞
427 ;∂
0 ;⊂
0 ;⊃
420 ;∩ PRINT AS OMEGA
0 ;∪
0 ;∀
0 ;∃
0 ;⊗
0 ;↔
537 ;_
434 ;→
534 ;!~!
650 ;≠
647 ;≤
651 ;≥
0 ;≡
652 ;∨
FOR I←40,77
< 400+I
>
540 ;@
FOR I←101,133
< 400+I
>
437 ;\
535 ;]
435 ;↑
433 ;←
500 ;`
FOR I←141,173
< 400+I
>
576 ;|
0 ;ALTMODE
575 ;RIGHT CURLY BRACKET
536 ;HAT
MPC,{
SETTRW: MOVSI T,'MAG'
JRST SETIT
SETDRL: MOVSI T,'DRL'
JRST SETIT
};MPC
SETF80: MOVSI T,'F80'
JRST SETIT
MD,{
SETSIG: MOVSI T,'SIG'
JRST SETIT
};MD
SETPLT:
MD,{ MOVSI T,'PLT' }
MPC,{ MOVSI T,'PCP' }
SETIT: MOVEM T,EXTSAV
SETNAM: OUTSTR [ASCIZ/FILENAME?/]
SETIT1: MOVE T,EXTSAV
MOVEM T,FILEXT
SETZM FILEXT+1 ;CLEAR THIS WORD
SETZM FILPPN ;HIS OWN AREA
PUSHJ P,GETWRD ;SCAN FILENAME
CAIN T,"@"
JUMPE TT,INDIR
CAIN T,12
JUMPE TT,CPOPJ ;LET HIM OUT IF HE TYPES NOTHING
JUMPN TT,NOLSTG
CAIE T,"∃"
JRST NOLSTG
PUSHJ P,GETWRD
JUMPN TT,ILLNAM
SKIPN TT,SAVNAM
JRST ILLNAM
NOLSTG: MOVEM TT,FILNAM ;SAVE FILENAME
CAIN T,"[" ;ANY EXTENSION?
JRST NOEXT ;NO
CAIN T,12
JRST NOEXT ;NO
CAIE T,"."
JRST [ ILLNAM: PUSHJ P,IERR;ILLEGAL BREAK CHARACTER
JRST SETNAM]
PUSHJ P,GETWRD ;SCAN EXTENSION
HLLZM TT,FILEXT ;SAVE IT.
NOEXT: CAIN T,12 ;HERE TO SCAN PPN
JRST CPOPJ1 ;LEAVE NOW
CAIE T,"["
JRST ILLNAM ;MUST BE [
PUSHJ P,GETWRD ;SCAN P.
JUMPE TT,ILLNAM
PUSHJ P,RJUST
HRLZM TT,FILPPN ;AND SAVE
CAIE T,"," ;BETTER BE COMMA
JRST ILLNAM
PUSHJ P,GETWRD ;SCAN PN.
JUMPE TT,ILLNAM
PUSHJ P,RJUST
HRRM TT,FILPPN ;AND SAVE
CAIE T,"]" ;BETTER END WITH THIS
JRST ILLNAM
PUSHJ P,GETWRD ;MAKE SURE HE DIDN'TT TYPE TO MUCH
JUMPN TT,ILLNAM ;LOSE IF HE DID
CAIE T,12
JRST ILLNAM ;DIDN'TT END WITH LF
JRST CPOPJ1
RJUST: TRZ TT,-1 ;THREE LETTERS ONLY
CAIA
LSH TT,-6
TRNN TT,77 ;RIGHT JUSTIFIED YET?
JRST .-2 ;NO
POPJ P,
GETWRD: SETZ TT, ;WORD WILL ACCUMULATE HERE
MOVE A,[POINT 6,TT] ;BYTE POINTER TO DEPOSIT CHARACTERS
MOVEI TTT,6 ;MAX CHAR COUNT
GETCHR: PUSHJ P,GETCHL ;READ A CHAR
CAIN T,40 ;AND SPACES
JRST GETCHR
CAIL T,"0" ;NUMBERS ARE LEGAL
CAILE T,"9"
CAIA
JRST CHROK
CAILE T,"z"
POPJ P, ;BREAK CHAR.
CAIL T,"a"
SUBI T,40 ;CHANGE LOWER CASE TO UPPER
CAIL T,"A" ;NOW ONLY UPPER CASE LETTERS ARE LEGAL
CAILE T,"Z"
POPJ P, ;BREAK
CHROK: SOJL TTT,GETCHR ;HAVE WE DONE SIX ALREADY
SUBI T,40 ;NO, MAKE IT SIXBIT
IDPB T,A ;STORE
JRST GETCHR
MILIN: PUSHJ P,DECIN
JFCL
IMULI TTT,=200 ;HIGH PART(INCHES) TO PLOTTER STEPS
CAIN T,"." ;ANY FRACTIONAL PART?
PUSHJ P,DIGIN
POPJ P,
IMULI T,=20
ADDM T,TTT
PUSHJ P,DIGIN
POPJ P,
IMULI T,=2
ADDM T,TTT
PUSHJ P,DIGIN
POPJ P,
JRST .-2
DIGIN: PUSHJ P,GETCHL
CAIL T,"0"
CAILE T,"9"
POPJ P,
SUBI T,60
JRST CPOPJ1
DECIN: SETZ TTT,
READN: PUSHJ P,GETCHL
CAIL T,"0"
CAILE T,"9"
JRST ENDNUM
IMULI TTT,=10
ADDI TTT,-60(T)
JRST READN
ENDNUM: CAIN T,12
JRST CPOPJ1
POPJ P,
MILOUT: SKIPGE T
OUTCHR["-"]
MOVMS T
IDIVI T,=1000
HRLM TT,(P)
PUSHJ P,DECOUT
OUTCHR["."]
HLRZ T,(P)
CAIGE T,=100
OUTCHR["0"]
CAIGE T,=10
OUTCHR["0"]
DECOUT: IDIVI T,=10
HRLM TT,(P)
JUMPE T,.+2
PUSHJ P,DECOUT
HLRZ T,(P)
ADDI T,60
OUTCHR T
POPJ P,
↑GETYES:
PUSHJ P,GETCHL
CAIE T,"Y"
CAIN T,"y"
AOS (P)
PUSH P,T
CAIA
GETCR: PUSHJ P,GETCHL
CAIE T,12
JRST GETCR
POP P,T
POPJ P,
INDIR: TROE FLAG,IFLAG
JRST IERR
PUSH P,EXTSAV
MOVSI T,'PIF'
MOVEM T,EXTSAV
PUSHJ P,SETIT1
JRST [ TRZ FLAG,IFLAG
POP P,EXTSAV
POPJ P,]
POP P,EXTSAV
TRZ FLAG,IFLAG
INIT ICHN,0
'DSK '
IBUFR
HALT .-3
LOOKUP ICHN,FILNAM
JRST [ OUTSTR[ASCIZ/INDIRECT FILE NOT FOUND!
/]
TRZ FLAG,IREAD
JRST SETNAM]
MOVEI T,IBUFRD
EXCH T,JOBFF
INBUF ICHN,1
MOVEM T,JOBFF
TRO FLAG,IREAD
JRST SETNAM
IERR: TRZE FLAG,IREAD
JRST IERR1
CLRBFI
POPJ P,
IERR1: OUTSTR[ASCIZ/ERROR IN INDIRECT FILE!
/]
IERR2: OUTSTR[ASCIZ/END OF INDIRECT FILE!
/]
RELEASE ICHN,
POPJ P,
GETCH: TRNE FLAG,IREAD
JRST GETCHF
INCHRW T
CAIN T,15
JRST .-2
POPJ P,
GETCHL: TRNE FLAG,IREAD
JRST GETCHF
INCHWL T
CAIN T,15
JRST .-2
POPJ P,
GETCHF: SOSG IBUFR+2
IN ICHN,
CAIA
JRST [ STATO ICHN,1B22
OUTSTR[ASCIZ/INPUT ERROR ON I-FILE!
/]
TRZ FLAG,IREAD
PUSHJ P,IERR2
JRST GETCHL]
ILDB T,IBUFR+1
JUMPE T,GETCHF
MOVE T,@IBUFR+1
TRNN T,1
JRST NOSKIP
MOVNI T,5
ADDM T,IBUFR+2
AOS IBUFR+1
JRST GETCHF
NOSKIP: LDB T,IBUFR+1
CAIE T,12
CAIN T,15
JRST GETCHF
CAIE T,"∀"
JRST ECHO
OUTCHR [15]
MOVEI T,12
ECHO: OUTCHR T
POP