;POINT.FAI.93, 15-NOV-75 18:07:33, EDIT BY HELLIWELL VERSION(POINT,8) ;STRAIGHTEN LINES (D) CHECK FOR COINCIDENT POINTS MD,< STRAIGHTEN: TRO MCHG!NEEDCL SKIPN A,PONPNT POPJ P, STRTN1: FETCH(TT,A,PXY) ;X,Y PUSHJ P,PMOVX ;STRAIGHTEN X PUSHJ P,PMOVY ;STRAIGHTEN Y FETCH(A,A,PNXT) JUMPN A,STRTN1 POPJ P, >;MD ;STOP MOVING POINT - CHECK FOR TWO COINCIDENT POINTS STOPM: MPC,< FETCHL(TT,A,PBIT) EQV TT,SID JUMPL TT,SAMSTP SKIPE B,PONPN2 JRST STOPM0 POPJ P, SAMSTP: >;MPC SKIPN B,PONPNT POPJ P, STOPM0: FETCH(T,A,PXY) MD,< HRLM B,(P) PUSHJ P,STOPM4 ;CHECK THIS POINT POPJ P, ;FOUND LOSER MOVE C,A ; BECAUSE STRAIGHTEN MIGHT HAVE MOVED THEM DEFINE STPMAC ' (DIR) < FETCH(A,C,PN'DIR) JUMPE A,STPM'DIR FETCH(T,A,PXY) HLRZ B,(P) PUSHJ P,STOPM4 POPJ P, ;A LOSER! STPM'DIR: > STPMAC(U) STPMAC(D) STPMAC(L) STPMAC(R) POPJ P, >;MD STOPM4: CAMN T,ADDR(B,PXY) JRST STOPM3 ;SAME X,Y STOPM1: FETCH(B,B,PNXT) JUMPN B,STOPM4 MD,< JRST CPOPJ1 > MPC,< POPJ P, > STOPM3: CAMN A,B ;SAME POINT THOUGH? JRST STOPM1 OUTSTR[ASCIZ/ YOU JUST PUT ONE POINT ON TOP OF ANOTHER, YOU'D BETTER FIX IT! /] POPJ P, ;ONLY SAY IT ONCE ;PNTPUT ;CALL WITH ;T = X,Y FOR NEW POINT ;RETURNS WITH ;D = POINTER TO POINT HSHPUT: AOSA HSHFLG# ;MAKE FAST HASH ENTRY FOR NOW PNTPUT: SETZM HSHFLG PUSH P,A PUSH P,B ;SAVE B SETZB A,B PUSH P,T ;SAVE X,Y PUSHJ P,PUTPN0 ;CREATE ENTRY POP P,T STORE(T,D,PXY) ;DEPOSIT X,Y JRST POPBAJ ;PUTPNT: CREATES A POINT ENTRY ... ;CALL WITH: ; A = (TEXT?),,BPLOC ; B = BITS,,BODY POINTER ;RETURNS ; D = POINT CREATED PUTPNT: SETZM HSHFLG# PUTPN0: PUSH P,T PUSH P,TT PUSH P,E TRO NEEDCL ;MAY NEED ANOTHER CLOSES MPC,< TLZ B,FRONT ;CLEAR THIS BIT IOR B,SID ;PUT IT ON CURRENT SIDE ROUTE,< TLZ M,%ROUTE ;MAKE HIM ROUTE AGAIN> >;MPC TLNE B,ISPIN ;BODY POINT? JRST [ PUSHJ P,MAKPIN ;MAKE BODY PIN MOVE D,TT STORE(B,D,BBODY) STORE(A,D,BPLOC) ;PTR TO TYPE PINLOC BLOCK HLRZ TT,A ;MAYBE TEXT PTR STORE(TT,D,BPTXT) HLRZ TT,B ;BITS STORE(TT,D,BPBIT) JRST PUTPN1] PUSHJ P,MAKPNT ;MAKE NORMAL POINT MOVE D,TT AOS E,PID ;NEW POINT ID STORE(E,D,PID) ;SAVE PID STORE(A,D,PLOC) ;MAYBE CPIN HLRZ TT,B ;BITS STORE(TT,D,PBIT) HLRZ TT,A ;MAYBE TEXT PTR STORE(A,D,PTXT) PUTPN1: SKIPE HSHFLG ;FAST ENTRY? JRST PUTPN4 MOVE T,D HRLI T,PONPNT MOVEM T,LSTPNT ;LAST POINT STORED AND ITS LAST MOVE T,PONPNT HRRZM D,PONPNT HRRM T,(D) PUTPN4: POP P,E POP P,TT POP P,T POPJ P, ;ONSCR - CHECK T FOR ONSCREEN POINT ONSCR: CAML T,LEFT CAMLE T,RIGHT POPJ P, HRRE TTT,T ;GET Y CAML TTT,BOTTOM CAMLE TTT,TOP POPJ P, AOS (P) ;DO THIS FOR SPEED POPJ P, ;ALTMODE, SPACE PNALT: TRZE INLIN TRO NEEDCL CLRMOV: TRZE INMOV ;TURN OFF MOVING TRO NEEDCL POPJ P, MD,< PNSPC: TRNN INLIN JRST CLRMOV TRC ZIGZAG ;COMPLIMENT THE WAY THE ZIG ZAGS POPJ P, >;MD ;NOT (D) MD,< PNOT: TRNE INLIN ;CHECK DRAWING LINE PUSHJ P,GETCLS JRST PERRET ;NO PUSHJ P,PNOT1 JRST PERRET POPJ P, ;A = POINT PNOT1: MOVE B,LINING FETCH(T,A,PXY) ;X,Y OF START POINT ADJUST(SUB,T,) ;- X,Y OF DESTINATION HRRE TT,T HLRES T MOVEI E,0 MOVEI F,2 SKIPGE T MOVEI E,1 SKIPGE TT MOVEI F,3 MOVMS T MOVMS TT CAMN T,TT ;45 DEGREES? TRNN ZIGZAG ;YES, TAKE HINT FROM ZIGZAG CAMLE T,TT ;HORZ OR VERT? MOVE F,E ;HORZ, USE HORZ DISP. JRST @(F)[ NRIGHT NLEFT NUP NDOWN] NRIGHT: FETCH(T,B,PNR) JUMPN T,CPOPJ ;ONE THERE ALREADY, LOSE FETCH(T,A,PNL) JUMPN T,CPOPJ ;ONE LEFT OF DEST., LOSE STORE(A,B,PNR) STORE(B,A,PNL) JRST NOUT NLEFT: FETCH(T,B,PNL) JUMPN T,CPOPJ FETCH(T,A,PNR) JUMPN T,CPOPJ STORE(A,B,PNL) STORE(B,A,PNR) JRST NOUT NUP: FETCH(T,B,PNU) JUMPN T,CPOPJ FETCH(T,A,PND) JUMPN T,CPOPJ STORE(A,B,PNU) STORE(B,A,PND) JRST NOUT NDOWN: FETCH(T,B,PND) JUMPN T,CPOPJ FETCH(T,A,PNU) JUMPN T,CPOPJ STORE(A,B,PND) STORE(B,A,PNU) NOUT: TRZ INLIN TRO MCHG!NEEDCL JRST CPOPJ1 ;MINUS, PLUS (D) PNMNS: TRNE INLIN ;CHECK DRAWING LINE PUSHJ P,GETCLS JRST PERRET PUSHJ P,PNMNS1 ;TRY THE WAY WE ARE NOW TRCA ZIGZAG ;CAN'T GO THIS WAY POPJ P, PUSHJ P,PNMNS1 ;TRY THE OTHER WAY TOO TRCA ZIGZAG ;PUT IT BACK THE WAY WE FOUND IT POPJ P, JRST PERRET PNMNS1: MOVE B,LINING ;POINT COMING FROM FETCH(TT,B,PXY) FETCH(T,A,PXY) XOR TT,T TLNE TT,-1 TRNN TT,-1 JRST PNOT1 ;ONLY DIFFERENT IN ONE DIMENSION, GO DO PNOT FETCH(TT,B,PXY) SUB TT,T ;COMPUTE DIF BETWEEN POINTS, PLUS MEANS D OR L SETZ C, TRNE ZIGZAG ;WHICH WAY ARE WE GOING? TROA C,1 ;VERT/THEN/HORIZ MOVSS TT ;HORIZ/THEN/VERT TLNN TT,400000 XCT (C)[FETCH(TTT,A,PNU) ;ENDING DOWN FETCH(TTT,A,PNR)] ;ENDING LEFT TLNE TT,400000 XCT (C)[FETCH(TTT,A,PND) ;ENDING UP FETCH(TTT,A,PNL)] ;ENDING RIGHT JUMPN TTT,CPOPJ ;LINE ENDS THERE ALREADY? TRNN TT,400000 ;NOW CHECK POINT WE ARE COMING FROM XCT(C)[ FETCH(TTT,B,PNL) ;STARTING LEFT FETCH(TTT,B,PND)] ;STARTING DOWN TRNE TT,400000 XCT(C)[ FETCH(TTT,B,PNR) ;STARTING RIGHT FETCH(TTT,B,PNU)] ;STARTING UP JUMPN TTT,CPOPJ ;LINE STARTS THERE ALREADY? PUSH P,CURSE MOVEM T,CURSE PUSH P,A PUSHJ P,PLPNT ;MAKE A CORNER POINT MOVE B,LINING ;GET POINTER TO NEW OLD POINT POP P,D PUSHJ P,PLENT ;ENTER THE LAST LINE POP P,CURSE TRZ INLIN TRO NEEDCL!MCHG JRST CPOPJ1 PPLUS: PUSHJ P,CLRMOV TRNE INLIN ;ARE WE ALREADY DRAWING A LINE? JRST PLPNT ;YES PUSHJ P,GETCLS ;NO, DRAW IT TO CLOSEST POINT? JRST PERRET DOPLUS: MOVEM A,LINING ;... TRZ ZIGZAG!INMOV ;START OUT HORIZ/THEN/VERT TRO NEEDCL!INLIN POPJ P, ;MINUS, PLUS SUBRS (D) ;PLPNT - PLANT A CORNER POINT ;LINING = POINT COMING FROM PLPNTF: TRC ZIGZAG ;TRY THE OTHER WAY PLPNT: MOVE B,LINING ;GET POINT WE ARE COMING FROM MOVE T,CURSE ;GET CURSOR POSITION CAMN T,ADDR(B,PXY) ;SHOULD BE DIFFERENT POPJ P, TRNN ZIGZAG ;WHICH WAY ARE WE GOING? MOVE T,1(B) ;HORIZ, MAKE END-Y = START-Y HLL T,CURSE ;GET CURSOR X TRNE ZIGZAG ;WHICH WAY ARE WE GOING? HLL T,1(B) ;VERT, MAKE END-X = START-X CAMN T,1(B) ;STILL SHOULD BE DIFFERENT JRST PLPNTF ;TRY THE OTHER WAY PUSHJ P,PNTPUT ;CREATE THE POINT ;D = NEW POINT ;B = OLD POINT PLENT: FETCH(T,D,PXY) MOVEI A, FETCH(TT,B,PXY) ;GET X,Y FOR OLD POINT TRNE ZIGZAG ;WHICH WAY? JRST PLENT1 ;VERT MOVEI A,1 ;_ INSTEAD OF ^ MOVSS T ;X,Y OF END-POINT MOVSS TT ;LOOK AT X INSTEAD OF Y PLENT1: SUB T,TT ;GET DIRECTION OF DIFFERENCE MOVE TT,A TRNN T,400000 ;WAS SIGN NEGATIVE? ADDI A,2 ;NO, SWITCH WHICH IS LEFT & WHICH IS RIGHT XCT (A)[FETCH(F,B,PND) ;GET OLD POINTER FROM OLD FETCH(F,B,PNL) ;SEE ROT0 FOR COMMENTS:::: FETCH(F,B,PNU) FETCH(F,B,PNR)] JUMPN F,PERRET ;LOSE IF LINE THERE ALREADY XCT (A)[STORE(B,D,PNU) ;NEW TO OLD STORE(B,D,PNR) STORE(B,D,PND) STORE(B,D,PNL)] XCT (A)[STORE(D,B,PND) ;OLD TO NEW STORE(D,B,PNL) STORE(D,B,PNU) STORE(D,B,PNR)] TRC ZIGZAG ;CHANGE THE WAY WE GO MOVEM D,LINING ;GO FROM NEW POINT MOVEM D,MOVED ;BETTER CHECK IF ON TOP OF ANOTHER POINT TRO MCHG POPJ P, >;MD ;MAKE FEEDTHROUGH(|), PLUS (PC) MPC,< ;SIMULATE +$1F1R+ PLFEED: PUSHJ P,CLRMOV ;CAN'T BE MOVING TRNE INLIN ;IF NOT DRAWING LINE JRST PLFEDL PUSHJ P,GETCLS ;FIND CLOSEST JRST PERRET ;NONE FETCH(T,A,PBIT) TRNE T,ISPIN!CPIN!FEEDTH JRST PERRET MOVEM A,LINING ;THE REST IS THE SAME TRO INLIN ;NOW IN LINE DRAWING MODE JRST PLFDL0 PLFEDL: PUSHJ P,PPLUS0 ;SIMULATE PLUS JRST PERRET ;CAN'T + PLFDL0: MOVE G,LINING PUSHJ P,RDFEED ;SIMULATE 1F PUSHJ P,FUCKUP ;JUST MADE POINT, CAN'T LOSE MOVE G,LINING FETCH(B,G,PFEED) ;POINTER TO OTHER SIDE FETCH(T,G,PBIT) TRNN T,FEEDTH ;DID IT REALLY FEED THROUGH? JRST PERRET HRRZM B,LINING ;GO FROM OTHER SIDE NOW SWITCH ;NOW WE'RE ON THE OTHER SIDE POPJ P, PPLUS: PUSHJ P,PPLUS0 JRST PERRET POPJ P, PPLUS0: TRNE INLIN JRST PLPNT PUSHJ P,GETCLS POPJ P, MOVEM A,LINING TRZ INMOV TRO NEEDCL!INLIN JRST CPOPJ1 ;PLANT A POINT PLPNT: MOVE T,CURSE MOVE B,LINING CAMN T,ADDR(B,PXY) ;WILL THIS MAKE COINCIDENT POINTS? POPJ P, PUSHJ P,PNTPUT GETFS(E) STORE(E,D,PNEB) ;WILL NEED NEIGHBOR BLOCK SETZM 1(E) HRLZM B,(E) ;LINK NEW TO OLD MOVE T,B PUSHJ P,FRLINK ;FIND LINK FOR OLD TO NEW XCT (T)[PUTAB: HRLM D,(B) HRRM D,1(B) HRLM D,1(B)] MOVEM D,LINING MOVEM D,MOVED ;BETTER CHECK IF ON TOP OF ANOTHER POINT TRO MCHG JRST CPOPJ1 ;WIN RETURN ;MINUS, FNDLNK (PC) PNMNS: TRNE INLIN PUSHJ P,GETCLS JRST PERRET PNMNS1: MOVE B,LINING ;ENTER HERE FROM LATTL FETCH(B,B,PNEB) PUSHJ P,FNDLNK ;ALREADY GOT A POINTER TO IT? TRZA INLIN ;NO, MAKE IT! JRST PERRET ;YES, SCREW HIM! PUSH P,A MOVE T,A PUSHJ P,FRLINK MOVE D,LINING XCT (T)PUTAB MOVE T,D PUSHJ P,FRLINK POP P,D XCT (T)PUTAB TRO MCHG!NEEDCL MOVEI T,ANGLPG JRST HYDPOG ;FNDLNK - FIND MATCHING LINK ;B = PNEB LIST ;A = ITEM TO FIND ;SKIPS IF FOUND ;RETURNS B(PTR) T(SLOT#) (Suitable for PUTAB, GETAB) FNDL2: MOVEI T,2 FNDL1: XCT (T)[GETAB: HLRZ TT,(B) HRRZ TT,1(B) HLRZ TT,1(B)] CAIN TT,(A) JRST CPOPJ1 SOJGE T,FNDL1 MOVE TT,B HRRZ B,(B) FNDLNK: JUMPN B,FNDL2 POPJ P, ;FIND FREE LINK (PC) ;T = POINT FRLINK: FETCH(B,T,PNEB) JUMPN B,FRLNK1 GETFS(B) SETZM 1(B) SETZM (B) STORE(B,T,PNEB) FRLNK1: SETZ A, PUSHJ P,FNDLNK CAIA POPJ P, GETFS(B) HRRM B,(TT) SETZM (B) SETZM 1(B) MOVEI T,2 ;USE LAST FIRST POPJ P, ;OLD ROUTINE, USE FRLINK INSTEAD NIL,< FRELNK: HLRZ B,1(T) JUMPN B,FRLNK1 GETFS(B) SETZM 1(B) SETZM (B) HRLM B,1(T) JRST FRLNK1 >;NIL >;MPC ;PLANT STUB (D) MD,< STUBCC: TLOA T,400000 ;CCW AROUND BODY STUBCW: MOVEI T,1 ;CW AROUND BODY CAIA STUB: SETZ T, MOVEM T,CCW ;0 NO MOTION, - CCW, + CW PUSHJ P,STBPIN ;FIND BODY PIN WE'RE AT NOW JRST PERRET PUSHJ P,STBSTP ;GET NEXT STUBB1: PUSHJ P,DOPLUS ;START STUB FROM THERE FETCH(T,A,BPX) FETCH(TT,A,BPY) ANDI E,3 XCT MOVSTB(E) ;MOVE STUB OFF A LITTLE HRLS T HRR T,TT JRST CHKON ;STBPIN - FIND THE PIN WE ARE NEAR ;SKIPS IF FOUND ;A = PIN STBPIN: HRRZ A,LINING TRNE INLIN ;DOING ANGLE? JRST STBPI1 PUSHJ P,GETCLS POPJ P, STBPI1: FETCH(T,A,PBIT) TRNE T,ISPIN JRST CPOPJ1 PUSHJ P,FNDPIN ;FIND PIN FROM POINT POPJ P, JRST CPOPJ1 ;FNDPIN - FIND PIN FROM POINT ;A = POINT ;SKIPS IF FOUND ;A = PIN FNDPIN: MOVEI D,20 ;CROCK, ELIMINATE INFINITE RECURSION PINPN0: FETCH(T,A,PBIT) TRNE T,ISPIN JRST CPOPJ1 SOJL D,PINPN1 HRLM A,(P) FOR I IN (PNR,PND,PNU,PNL) < HLRZ A,(P) FETCH(A,A,I) SKIPE A PUSHJ P,PINPN0 CAIA JRST CPOPJ1 > PINPN1: AOS D POPJ P, ;STEP STUB CW/CCW ;A = CURRENT PIN ;CCW = MOTION, 0:THIS PIN, -:CCW, +:CW ;RETURNS ;A = NEW PIN ;E = SIDE OF BODY PIN ON STBSTP: MOVEM A,STBPNT MOVE G,A FETCH(H,G,BBODY) MOVEM H,STBBDY FETCH(H,H,BTYP) PUSHJ P,CALSET ;CALC BODY'S X,Y CENTER PUSHJ P,CALPIN ;WHICH SIDE OF BODY? trc f,4 ;because of old convention MOVE E,F LSH E,-1 ;1,3,5,7  D,R,U,L SKIPGE CCW TRO E,4 SKIPN CCW ;NEED TO STEP? POPJ P, MOVE G,STBPNT FETCH(G,G,BPLOC) FETCH(T,G,TPX) MOVEM T,STUBX FETCH(T,G,TPY) MOVEM T,STUBY JRST STBST0 STUBB: PUSHJ P,GETCLS ;START STUB ON BODY JRST PERRET MOVEM A,STBBDY MOVEI T,PNTM PUSHJ P,CHNGMD MOVEI E,3+4 ;START ON LEFT SIDE, GO CCW PUSHJ P,STBST1 JRST STUBB1 ;FIND NEXT PIN ALONG AROUND BODY ;E = SIDE OF BODY, DIRECTION OF TRAVEL (CW/CCW) ;STBBDY = BODY ;STBPNT = LAST POINT (IF ANY) ;(C,D = X,Y OF LAST POINT) ;RETURNS ;A = PIN STBST1: SETOM STBPNT ;ALLOW FIND OF ORIGINAL POINT STBST0: MOVE A,STBBDY FETCH(A,A,BLNK) SETZM STBLAS XCT STBMAX(E) ;INIT BEST SO FAR TO WORST STBST2: CAMN A,STBPNT ;FIND NEXT PIN FOR STUB JRST STBST9 FETCH(B,A,BPLOC) FETCH(T,B,TPX) FETCH(TT,B,TPY) XCT STBTST(E) ;FIND MIN POINT IN DIRECTION OF TRAVEL JRST STBST9 SKIPGE STBPNT ;STEPPING FROM A POINT? JRST STBST3 XCT STBLIM(E) ;FIND POINT BELOW OLD POINT JRST STBST9 STBST3: MOVE G,A ;YES, ALSO STILL ON SAME SIDE? PUSHJ P,CALPIN trc f,4 ;because of old convention LSH F,-1 XOR F,E TRNE F,3 ;SAME SIDE? JRST STBST9 FETCH(C,B,TPX) FETCH(D,B,TPY) MOVEM A,STBLAS STBST9: FETCH(A,A,BPLNK) JUMPN A,STBST2 SKIPE A,STBLAS ;FOUND ONE MORE ON THAT SIDE? POPJ P, ;YES HRRZ E,STBNXT(E) ;LOOK ON THE NEXT SIDE JRST STBST1 ;TABLES FOR STUB STEPPER ;E = STUB SIDE, AND STEP DIRECTION ; 0 BOTTOM ; 1 RIGHT SIDE ; 2 TOP ; 3 LEFT SIDE ;+4 MEANS STEP IN CCW ;SETUP FOR WORST, WE'RE LOOKING FOR MINIMUM IN DIRECTION OF TRAVEL STBMAX: MOVSI C,400000 MOVSI D,400000 HRLOI C,377777 HRLOI D,377777 HRLOI C,377777 HRLOI D,377777 MOVSI C,400000 MOVSI D,400000 ;TEST FOR BETTER MIN IN DIRECTION OF TRAVEL STBTST: CAMGE T,C ;CW-BOTTOM, MIN IS BIGGEST X CAMGE TT,D CAMLE T,C CAMLE TT,D CAMLE T,C CAMLE TT,D CAMGE T,C CAMGE TT,D ;BUT MINIMUM JUST BEFORE PREVIOUS POINT STBLIM: CAMLE T,STUBX CAMLE TT,STUBY CAMGE T,STUBX CAMGE TT,STUBY CAMGE T,STUBX CAMGE TT,STUBY CAMLE T,STUBX CAMLE TT,STUBY STBNXT: 3 ;NEXT DIR, CW 0 1 2 4+1 ;NEXT DIR, CCW 4+2 4+3 4+0 MOVSTB: SUB TT,STBSIZ ;DOWN ADD T,STBSIZ ;RIGHT ADD TT,STBSIZ ;UP SUB T,STBSIZ ;LEFT >;MD ;PNTPLC, PN2DEL PNTPLC: TRNE INMOV!INLIN JRST PERRET MOVE T,CURSE ;GET CURSOR POSITION PUSHJ P,PNTPUT ;MAKE A POINT MOVE T,LSTPNT ;GET NEW POINT AND PREVIOUS POINTER JRST SCLOSE ;DELETE POINT, MERGE LINE IF POSSIBLE PN2DEL: PUSHJ P,GETCLS POPJ P, MOVE B,CLAST EXCH B,A ;ThePoint in B, back-pointer in A MD,< MOVE T,ADDR(B,PND) MOVE TT,ADDR(B,PNL) JUMPE T,[JUMPE TT,DELPNT ;NO NEIGHBORS TLNE TT,-1 ;NO VERT LINE THRU POINT TRNN TT,-1 ;HORIZ LINE GOES THRU? JRST PERRET PUSHJ P,LMER1 ;YES MERGE SETOM CLOSUP JRST DELPNT] TLNE T,-1 TRNN T,-1 JRST PERRET ;NO VERT LINE THRU POINT JUMPE TT,[PUSHJ P,LMER0 ;ONLY VERT LINE SETOM CLOSUP JRST DELPNT] TLNE TT,-1 TRNN TT,-1 JRST PERRET SETOM CLOSUP ;BOTH HORIZ AND VERT PUSHJ P,LMER0 PUSHJ P,LMER1 JRST DELPNT ;MERGE TWO VERT LINES ;B = POINT LMER0: FETCH(D,B,PNU) ;D = POINT TO TOP FETCH(T,B,PND) ;T = POINT TO BOTTOM STORE(D,T,PNU) STORE(T,D,PND) POPJ P, ;MERGE TWO HORIZ LINES ;B = POINT LMER1: FETCH(D,B,PNL) ;D = POINT TO LEFT FETCH(T,B,PNR) ;T = POINT TO RIGHT STORE(D,T,PNL) STORE(T,D,PNR) POPJ P, >;MD ;DELETE POINT, MERGE LINES (PC) ;FALLS THRU MPC,< FETCH(C,B,PNEB) JUMPE C,PERRET ;Look for two lines leaving from this point, error if not exactly 2 SETZM 1(P) SETZM 2(P) D2LIN: MOVEI E,2 D2LIN1: XCT (E)DELTAB ;Fetch(D,C,PNx) JUMPE D,D2LIN2 EXCH D,1(P) ;ADVANCE THE WORLD EXCH D,2(P) JUMPN D,PERRET ;NON-ZERO IF TOO MANY D2LIN2: SOJGE E,D2LIN1 HRRZ C,(C) JUMPN C,D2LIN SKIPN 2(P) ;FIND 2? JRST PERRET ;NO ;Link left and right neighbors, omiting current point AOBJN P,.+1 ;Save first neigbor MOVE D,1(P) ;The second " PUSH P,A ;(Save back-pointer of point for DELPNT) MOVE A,B ;Current point MOVE B,-1(P) ;Link first neighbor (B) to second (D) PUSHJ P,D2LIN4 MOVE B,D MOVE D,-1(P) ;Now the other way PUSHJ P,D2LIN4 ;Then delete the point POP P,B ;Restore back-pointer POP P,(P) EXCH A,B ;Get a and b in right places SETOM CLOSUP JRST DELPNT ;AND DELETE ;Link point (B) to (D), using slot that contained D D2LIN4: FETCH(B,B,PNEB) PUSHJ P,FNDLNK PUSHJ P,FUCKUP XCT (T)PUTAB POPJ P, >;MPC ;DELPNT ;PNTDEL - DELETE CLOSEST POINT PNTDEL: PUSHJ P,GETCLS ;GET POINTER TO CLOSEST POINT JRST PERRET MOVE B,CLAST ;ALSO LAST POINTER EXCH B,A ;INTO CORRECT AC'S TRZ TFLG ;DON'T DELETE PINS TRZE INMOV TRO NEEDCL JRST DELPNT ;THEN LEAP IN ;DELPNL - DELETE POINT ;B = POINT ;DELPNT - DELETE POINT ;B = POINT ;A = PREVIOUS DELPNL: PUSHJ P,LNKSET ;SETUP A WITH LAST POINTER DELPNT: TRO MCHG TRZ INMOV PUSH P,A ;SAVE LAST FETCH(T,A,PNXT) CAME T,B ;LAST SHOULD POINT TO THIS PUSHJ P,FUCKUP PUSHJ P,REMPNT ;REMOVE POINT FROM ANY SETS PUSHJ P,KILPNT ;KILL LINES, TEXT POP P,A ;RESTORE LAST FETCHL(F,B,PBIT) TRNE TFLG ;DELETE PINS? JRST DELPOK ;YES TLNE F,MPC,ISPIN ;IS IT A PIN? POPJ P, ;YES, DON'T DELETE DELPOK: TRO NEEDCL FETCH(T,B,PNXT) STORE(T,A,PNXT) MPC,< FETCH(T,B,PFEED) HRR F,T ;SAVE FEED THRU >;MPC TLNN F,CPIN JRST NTCPIN FETCH(T,B,PLOC) ;RETURN CPIN LOC BLOCK FSTRET(T) NTCPIN: PUSH P,B FETCH(B,B,PTXT) PUSHJ P,PUTFS ;RETURN TEXT POP P,B RETBLK(B,POINT) ;RETURN POINT MPC,< TLNN F,FEEDTH ;IS IT A FEED THROUGH? POPJ P, ;NO CLRBIT(FEEDTH,TT,F,PBIT) ;MAKE SURE HE DOESN'T TRY TO GET BACK HRRZ B,F SWITCH PUSHJ P,DELPNL ;DELETE POINT ON OTHER SIDE SWITCH >;MPC POPJ P, ;DELPNT SUBRS KILPNT: PUSHJ P,KILTXT ;FLUSH TEXT ROUTE,> ;MAKE HIM ROUTE AGAIN MD,< FOR LINK IN (PND,PNU,PNL,PNR) < FETCH(D,B,LINK) JUMPE D,.+3 PUSHJ P,REMLIN CLEAR(B,LINK) > >;MD ;FOR PC, THERE MAY BE MORE THAN 4 NEIGHBORS MPC,< MOVE A,B FETCH(C,B,PNEB) JUMPE C,DELMER PUSH P,C DELIN: MOVEI E,2 DELIN1: XCT (E)[DELTAB: HLRZ D,(C) HRRZ D,1(C) HLRZ D,1(C)] JUMPE D,.+2 PUSHJ P,REMLIN SOJGE E,DELIN1 HRRZ C,(C) JUMPN C,DELIN POP P,C DELMER: PUSH P,B CLEAR(B,PNEB) MOVE B,C JUMPE B,.+2 PUSHJ P,PUTFS ;RETURN MULTIPLE NEIGHBOR LIST POP P,B >;MPC FETCH(E,B,PNXT) POPJ P, ;PINPNT - CHANGE PIN TO POINT ;B = PIN PINPNT: FETCH(T,B,BPBIT) TRNN T,ISPIN PUSHJ P,FUCKUP DBG,< MOVE T,[SIXBIT /POINT/] ;CHANGE STORAGE BLOCK TYPE MOVEM T,-1(B) >;DBG AOS T,PID STORE(T,B,PID) MPC,< CLEAR(B,PFEED) > CLEAR(B,PIN) CLEAR(B,PLOC) CLRBIT(ISPIN>,TT,B,PBIT) POPJ P, ;REMOVE LINE MPC,< ;A = POINT BEING FLUSHED ;D = POINT TO UNLINK REMLIN: PUSH P,B FETCH(B,D,PNEB) PUSHJ P,FNDLNK CAIA XCT (T)[ HRRZS(B) HLLZS 1(B) HRRZS 1(B)] POP P,B SETOM CLOSUP POPJ P, >;MPC ;REMOVE LINE ;B = POINT BEING FLUSHED ;D = POINT TO UNLINK MD,< REMLIN: DEFINE FOO (LINK) < FETCH(TT,D,LINK) CAMN TT,B CLEAR(D,LINK) > FOO (PND) FOO (PNU) FOO (PNL) FOO (PNR) SETOM CLOSUP POPJ P, >;MD ;LNKSET - SETUP A TO POINT TO PREVIOUS LINK ;B = POINT LNKSET: MPC,< FETCHL(T,B,PBIT) EQV T,SID JUMPL T,LNKSTF ;WHICH SIDE IS IT ON?? MOVEI A,PONPN2 ;OTHER SIDE JRST LNKST1 LNKSTF: >;MPC MOVEI A,PONPNT ;CURRENT SIDE LNKST1: FETCH(T,A,PNXT) CAIN T,(B) ;DOES THIS GUY POINT TO US? POPJ P, ;YES, RETURN MOVE A,T JUMPN A,LNKST1 PUSHJ P,FUCKUP MOVE A,B ;LINK BACK TO SELF POPJ P, ;DELNUL DELNUL: TRZE INLIN!INMOV TRO NEEDCL TRZ TFLG ;DON'T DELETE PINS!!!!! SETZM COUNT ;ZERO COUNT TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/TYPE Y TO MARK NULL POINTS FOR FIND, (ELSE ALL NULL POINTS WILL BE DELETED)/] PUSHJ P,YORN POPJ P, ;ALTMODE JRST DELALL ;DELETE ALL TLO ASK SETZM FIND ;NONE FOUND YET SKIPE E,PONPNT PUSHJ P,ACLRP ;CLEAR FIND MARK BITS MOVEI B,PONPNT PUSHJ P,DNULL ;NOW MARK NULL POINTS MPC,< SKIPE E,PONPN2 PUSHJ P,ACLRP MOVEI B,PONPN2 PUSHJ P,DNULL >;MPC JRST FNDCNT DNULLA: PUSH P,A ;SAVE LAST POINTER MD,< SKIPN ADDR(B,PND) SKIPE ADDR(B,PNL) JRST NODEL >;MD MPC,< FETCH(TT,B,PNEB) JUMPE TT,DLNCK1 DLINCK: HLRZ TTT,(TT) JUMPN TTT,NODEL SKIPE 1(TT) JRST NODEL HRRZ TT,(TT) JUMPN TT,DLINCK DLNCK1: >;MPC FETCHL(TT,B,PBIT) TDNE TT,[MPC,ISPIN,,MPC,<-1>] JRST NODEL FETCH(TT,B,PTXT) JUMPN TT,NODEL TLNN ASK JRST NOASK MOVSI TT,FOUNDP ;MARK POINT IORM TT,ADDR(B,PBIT) AOS FIND ;COUNT ANOTHER FOUND JRST NODEL NOASK: MOVE A,(P) ;SETUP LAST POINTER PUSHJ P,DELPNT AOS COUNT POP P,B JRST DNULL NODEL: POP P,B ;PREVIOUS POINT FETCH(B,B,PNXT) ;BACK TO THIS POINT DNULL: MOVE A,B ;NOW ADVANCE FETCH(B,B,PNXT) JUMPN B,DNULLA POPJ P, ;DELETE ALL DELALL: MOVEI T,1 LSH T,@MODE TDNE T,[1ALTM] JRST PERRET TLZ ASK MOVEI B,PONPNT PUSHJ P,DNULL MPC,< MOVEI B,PONPN2 PUSHJ P,DNULL >;MPC CNTOUT: TRO NEEDCL TLNE M,DSKACT!MACACT POPJ P, OUTSTR[ASCIZ/ /] MOVE T,COUNT PUSHJ P,DECOUT OUTSTR[ASCIZ/ NULL POINTS DELETED!/] POPJ P, ;FIND DANGLING POINTS DANGLE: TRZE INLIN!INMOV TRO NEEDCL SETZM COUNT SETZM FIND SKIPE E,PONPNT PUSHJ P,DODANG MPC,< SKIPE E,PONPN2 PUSHJ P,DODANG >;MPC TLNN M,DSKACT!MACACT SKIPN T,COUNT JRST FNDCNT PUSHJ P,DECOUT OUTSTR[ASCIZ/ COINCIDENT POINTS OUT OF /] JRST FNDCNT DODANG: PUSH P,E PUSHJ P,ACLRP ;CLEAR MARK BITS POP P,E DANGA: SETO TTT, ;PREPARE COUNT FETCHL(T,E,PBIT) TDNE T,[MPC,ISPIN,,MPC,<-1>] JRST COINA TLNE T,MPC,CPIN AOJG TTT,COINA MD,< SKIPE ADDR(E,PND) ;ONLY COUNT EACH DIMENSION AS ONE AOJG TTT,COINA SKIPE ADDR(E,PNL) AOJG TTT,COINA FETCH(T,E,PTXT) JUMPE T,DANGST ;NO CORNER, AND NO TEXT AOJLE TTT,DANGST ;NO LINES AT ALL >;MD MPC,< FETCH(T,E,PTXT) JUMPN T,COINA FETCH(T,E,PNEB) JUMPE T,DANGST DANG0: MOVE TT,1(T) TLNE TT,-1 AOJG TTT,COINA TRNE TT,-1 AOJG TTT,COINA MOVE T,(T) TLNE T,-1 AOJG TTT,COINA TRNE T,-1 JRST DANG0 JRST DANGST >;MPC ;APPEARS OK, SEE IF IT IS COINCIDENT WITH ANY OTHER POINT COINA: FETCH(T,E,PXY) MOVE TT,E JRST COINB COINC: CAMN T,ADDR(TT,PXY) JRST DANGSC COINB: FETCH(TT,TT,PNXT) JUMPN TT,COINC DANGB: FETCH(E,E,PNXT) JUMPN E,DANGA POPJ P, DANGSC: AOS COUNT ;COINCIDENT POINT DANGST: AOS FIND ;DANGLING POINT MOVSI T,FOUNDP IORM T,ADDR(E,PBIT) JRST DANGB ;CHANGE PAD TYPES MPC,< CPADS: TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/TYPE PAD NUMBER TO CHANGE. /] PUSHJ P,READNC MOVEM T,COUNT TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/TYPE NEW PAD NUMBER. /] PUSHJ P,READNC MOVEM T,COUNT2 TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/TYPE Y TO BE ASKED ABOUT EACH ONE/] PUSHJ P,YORN POPJ P, TLZA ASK TLO ASK MOVEI A,PONPNT PUSHJ P,CPADSD POPJ P, TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/DO OTHER SIDE/] PUSHJ P,YORN POPJ P, POPJ P, SWITCH MOVEI A,PONPNT PUSHJ P,CPADSD JFCL SWITCH POPJ P, ;COUNT = OLD PAD ;COUNT2 = NEW PAD CPADS1: FETCH(T,A,PIN) CAME T,COUNT ;IS THIS ONE TO CHANGE? JRST CPADSD ;NO FETCHL(T,A,PBIT) TLNN T,FEEDTH ;IF DRILL HOLE SKIPN COUNT ;OR FINDING OTHER THAN TYPE 0 CAIA ;GO AHEAD JRST CPADSD TLNN ASK JRST CPADS2 ;DON'T ASK FETCH(T,A,PXY) PUSHJ P,ONSCR ;ON SCREEN PUSHJ P,PICSET ;NO, GET IT ON FETCH(T,A,PXY) MOVEM T,STARLOC ;LOC TO DISPLAY TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/THIS ONE/] MOVEI T,UPSTAR MOVEM T,SPDISP MOVE T,[ASCID/CP/] MOVEM T,SPMODT MOVEI T,SPM ;SPECIAL POINTER MODE PUSHJ P,TCHNGM ;TEMPORARY CHANGE PUSHJ P,YORN JFCL JFCL ;IGNORE RETURN, WILL CHECK C AGAIN PUSHJ P,RCHNGM ;RESTORE MODE CAIE C,"Y" CAIN C,"y" JRST CPADS2 CAIE C,ALTMOD JRST CPADSD ;JUST SKIP THIS ONE POPJ P, ;GIVE QUIT RETURN CPADS2: MOVE T,COUNT2 STORE(T,A,PIN) ;STORE NEW PAD TYPE TRO MCHG CPADSD: FETCH(A,A,PNXT) JUMPN A,CPADS1 JRST CPOPJ1 >;MPC ;MAKE AND BREAK INNER PLANE CONNEX (PC) MPC,< PLANE: PUSHJ P,GETCLS JRST PERRET FETCHL(B,A,PBIT) TLNN B,FEEDTH!ISPIN JRST PERRET TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/ PLANE NUMBER?/] PUSHJ P,READNC ADDI T,1 CAILE T,7 JRST PERRET ;LOSE UNPLN1: TRO MCHG!NEEDCL DPB T,[%%PLANES,,ADDR(A,PBIT)] TLNN B,ISPIN JRST CHKFED ;ASSIGN ALL BODY PINS WITH SAME PIN # FETCH(TTT,A,BPLOC) FETCH(TTT,TTT,TPID) ;SAME PIN #? FETCH(B,A,BBODY) FETCH(B,B,BLNK) JUMPE B,CPOPJ PLOOP2: FETCH(C,B,BPLOC) FETCH(C,C,TPID) CAMN C,TTT ;SAME PIN NUMBER? DPB T,[%%PLANES,,ADDR(B,PBIT)] ;YES, SET PLANE NUMBER PLOOP1: FETCH(B,B,BPLNK) JUMPN B,PLOOP2 POPJ P, CHKFED: TLNN B,FEEDTH POPJ P, FETCH(TT,A,PFEED) DPB T,[%%PLANES,,ADDR(TT,PBIT)] POPJ P, UNPLAN: PUSHJ P,GETCLS JRST PERRET FETCHL(B,A,PBIT) TLNN B,ISPIN!FEEDTH JRST PERRET MOVEI T,0 ;NO PLANE JRST UNPLN1 ;SET PAD TYPE, MAKE AND BREAK FEEDTHROUGHS (PC) NPFEED: PUSHJ P,GETCLS JRST PERRET TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/PAD TYPE NUMBER?/] PUSHJ P,READNC STORE(T,A,PIN) ;SET NEW PAD TYPE TRO MCHG POPJ P, FEED: PUSHJ P,GETCLS JRST PERRET MOVE G,A PUSHJ P,RDFEED JRST PERRET POPJ P, ;RDFEED - CREATE FEEDTHROUGH TO OTHER SIDE ;G = POINT RDFEED: FETCH(A,G,PBIT) TRNE A,FEEDTH!ISPIN!CPIN POPJ P, SWITCH ;MAKE POINT ON OTHER SIDE FETCH(T,G,PXY) PUSHJ P,PNTPUT MOVE A,D SWITCH MOVSI T,FEEDTH IORM T,ADDR(A,PBIT) IORM T,ADDR(G,PBIT) FETCH(T,A,PIN) JUMPN T,.+3 MOVEI T,1 ;DEFAULT PAD TYPE 1 STORE(T,A,PIN) FETCH(T,G,PIN) JUMPN T,.+3 MOVEI T,1 STORE(T,G,PIN) STORE(D,G,PFEED) STORE(G,D,PFEED) TRO MCHG JRST CPOPJ1 UNFEED: PUSHJ P,GETCLS ;UNLINK FEEDTHRU JRST PERRET FETCH(B,A,PBIT) TRNN B,FEEDTH JRST PERRET TRZ B,FEEDTH!PLANES STORE(B,A,PBIT) CLEAR(A,PIN) ;ZERO PAD# FETCH(B,A,PFEED) CLEAR(A,PFEED) CLEAR(B,PFEED) ;UNLINK OTHER SIDE OF FEEDTHRU FETCH(A,B,PBIT) TRZ A,FEEDTH!PLANES STORE(A,B,PBIT) CLEAR(B,PIN) ;ZERO PAD# TRO MCHG!NEEDCL POPJ P, >;MPC ;PIN #'S, CONNECTOR AND BODY (D) MD,< SETCPN: PUSHJ P,GETCLS JRST PERRET FETCH(B,A,PBIT) TRNE B,ISPIN JRST STPINN ;BODY PIN MOVE T,[PUSHJ P,GETLCH] MOVEM T,GTCHRX CAGAIN: TLNN M,DSKACT!MACACT OUTSTR @CPCUE PUSHJ P,GTCONP JRST INNERR JRST [ LAY,< CAIN C,TEXIST JRST [ PUSHJ P,GETLIN ;SNARF LF CAIE C,12 JRST INNERR SKIPG T,LAYLOC ;PICK UP CLOC PASSED FROM PC PROG JRST [ SKIPN T OUTSTR[ASCIZ/NO CONNECTOR LOC PASSED FROM PC PROG! /] SKIPE T OUTSTR[ASCIZ/TOO MANY CONNECTOR LOC'S FOUND IN PC PROG! /] JRST CAGAIN] HRRZM T,LETTER JRST LNNLY] >;LAY CAIE C,12 JRST INNERR FETCH(B,A,PLOC) ;GET CPIN POINTER JUMPE B,CPOPJ CLEAR(A,PLOC) FSTRET (B) CLRBIT(CPIN!FIXCON!CPNBTS,T,A,PBIT) CLEAR(A,PIN) ;CLEAR BITS AND BACKUP PIN NAME SETOM CLOSUP TRO MCHG TRNE LMOVE TRZN INMOV POPJ P, TRO NEEDCL POPJ P,] MD,< JFCL > ;DON'T CARE ABOUT BRS CAIE C,12 JRST INNERR ;SETLET - SET LOCATION ONTO POINT ;LETTER = B-R-S,,PIN-LOC ;A = POINT ;FALLS THRU SETLET: LNNLY: MOVE TT,LETTER TLNE TT,-1 SKIPN T,CRDLOC JRST NOGLBC XOR T,TT TLNE T,-1 ;SAME CARD LOC OR NO GLOBAL? JRST [ OUTSTR[ASCIZ/SORRY, CANNOT CHANGE CARD LOCATION WHILE GLOBAL CARD LOC IS IN FORCE! /] POPJ P,] HRRZS LETTER NOGLBC: FETCH(B,A,PLOC) ;GET OLD CPIN POINTER JUMPN B,GOTFST FETCH(B,A,PBIT) TRZ B,CPNBTS TRO B,FIXCON!CPIN ;MAKE IT GET FIXED INTIALLY STORE(B,A,PBIT) CLEAR(A,PIN) ;CLEAR BACKUP PIN NAME GETFS(B) STORE(B,A,PLOC) ;ADD LOCATION BLOCK SETZM 1(B) ;CLEAR OFFSET SETOM CLOSUP GOTFST: PUSHJ P,UBACK MOVE T,LETTER MOVEM T,(B) PUSHJ P,CPNBCK ;CHECK AND SET BITS TRO MCHG!NEEDCL FETCH(T,A,PBIT) TRNN T,FIXCON ;CON NEED FIXING? POPJ P, JRST OFFCON ;UBACK - SAVE BACKUP PIN IF SETTING WILD ;A = POINT ;LETTER = PIN LOCATION UBACK: PUSH P,A MOVE A,LETTER PUSHJ P,QUPIN ;IS NEW PIN NAME WILD? JRST UBACK0 MOVE A,(P) FETCH(B,A,PLOC) ;CPIN LOCATION BLOCK MOVE A,(B) PUSHJ P,QUPIN JRST UBACK2 JRST UBACK1 UBACK0: MOVE A,(B) PUSHJ P,QUPIN JRST UBACK1 ;OLD ONE NOT WILD, NO BACKUP UBACK2: MOVE B,(B) MOVE A,(P) STORE(B,A,PIN) UBACK1: POP P,A POPJ P, ;CPNBCK - CHECK FOR RULE ON WILD PIN ;A = CPIN ;T = PIN LOCATION CPNBCK: PUSH P,A MOVE A,T PUSHJ P,QUPIN JRST NUPIN MOVE T,(P) ;THE CPIN FETCH(T,T,PBIT) DPB A,[POINT CPNBSZ,T,CPNBPS] ;ALWAYS SET RULE FROM LAST U PIN TYPED MOVE A,(P) STORE(T,A,PBIT) NUPIN: POP P,A POPJ P, ;SET TERMINATION RULE STTRUL: PUSHJ P,GETCLS JRST PERRET FETCH(T,A,PBIT) TRNN T,CPIN JRST PERRET TLNE M,DSKACT!MACACT JRST STTRL0 OUTSTR[ASCIZ/CURRENT RULE NUMBER = /] LDB T,[POINT CPNBSZ,T,CPNBPS] PUSHJ P,DECOUT OUTSTR[ASCIZ/ /] STTRL0: TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/TYPE RULE NUMBER (0-3)?/] PUSHJ P,READN CAIN C,12 JRST STTRL1 CAIE C,"?" JRST INNERR PUSHJ P,GETCHR CAIE C,12 JRST INNERR TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/0 NO RULE 1 NO TERMINATION (U001-U199) 2 ?? (U200-U399) 3 TERMINATED (U400-U599) /] JRST STTRUL STTRL1: CAILE T,3 JRST INNERR PUSH P,A FETCH(A,A,PBIT) DPB T,[POINT CPNBSZ,A,CPNBPS] MOVE T,(P) STORE(A,T,PBIT) POP P,A POPJ P, ;COPY TERMINATION RULE INTO MACRO CLTRUL: PUSHJ P,GETCLS JRST PERRET FETCH(T,A,PBIT) TRNN T,CPIN JRST PERRET MOVE B,A PUSHJ P,SETTT FETCH(B,B,PBIT) LDB B,[POINT CPNBSZ,B,CPNBPS] PUSHJ P,PUTTTN JRST ITSTUF ;SET BODY PIN # ;A = BPOINT STPINN: TLNE M,DSKACT!MACACT JRST STPIN0 OUTSTR[ASCIZ/PIN NAME(/] OUTSTR @PINCUE OUTSTR[ASCIZ/)?/] STPIN0: MOVE T,[PUSHJ P,GETLCH] MOVEM T,GTCHRX PUSHJ P,RPNAM JRST INNERR CAIE C,12 JRST INNERR ;CALLED BY SWPPIN, SET PIN NAME ;A = PIN ;T = NEW PIN NAME STPNN1: TLNE M,PLOCS TRO MCHG ;Now set all BODY PINs that have same default PIN NAME FETCH(B,A,BBODY) MOVEI B,RADDR(B,BLNK,BPLNK) FETCH(TT,A,BPLOC) FETCH(TT,TT,TPNAM) JRST STPIN1 STPIN2: FETCH(D,B,BPLOC) FETCH(D,D,TPNAM) CAMN D,TT ;SAME DEFAULT PIN NAME? STORE(T,B,BPPN) STPIN1: FETCH(B,B,BPLNK) JUMPN B,STPIN2 POPJ P, >;MD STOCLC: PUSHJ P,GETCLS JRST PERRET PUSHJ P,SETTT ;SETUP MACRO TEXT POINTER PUSHJ P,STFPLC ;STUFF IN CON OR PIN SPEC JFCL JRST ITSTUF ;IF NOT CPIN, STUFF A NULL MACRO ;A = POINT STFPLC: MOVE E,A FETCHL(B,A,PBIT) TLNE B,CPIN JRST STFCLC TLNN B,ISPIN POPJ P, FETCH(D,A,BBODY) ;GET PIN'S BODY AOS (P) PUSH P,A MD,< FETCH(T,D,BLOC) ;ANY LOCN SET? JUMPE T,NSTFBL MOVE A,ADDR(D,BSOC) >;MD MPC,< FETCH(T,D,BLN) ;LN SET? JUMPE T,NSTFBL MOVE A,ADDR(D,BLN) >;MPC PUSHJ P,SLTLPN ;STUFF BODY LOCATION NSTFBL: MD,< FETCH(A,E,BPPN) ;ANY PIN SET? JUMPN A,STFPL1 >;MD FETCH(A,E,BPLOC) ;DEFAULT NAME FROM TYPE MD,< FETCH(A,A,TPNAM) > MPC< FETCH(A,A,TNAM) > STFPL1: PUTBYT "(" PUSHJ P,BPINPN PUTBYT ")" POP P,A POPJ P, STFCLC: AOS (P) PUSH P,A FETCH(A,A,PLOC) MOVE A,(A) PUSHJ P,CSLTLP ;PRINT THE BAY/RACK/SLOT/LOC/PIN POP P,A POPJ P, BJUMP: PUSHJ P,GETCLS JRST PERRET FETCHL(C,A,PBIT) TLNN C,ISPIN JRST PERRET FETCH(A,A,BBODY) MOVEI T,BODM PUSHJ P,CHNGMD ;CHANGE TO BODY MODE FETCH(T,A,BXY) ;GET LOC OF BODY JRST CHKON ;MUNGING SUBROUTINES (PC) MPC,< MUSH: SKIPE A,DBODPN ;BODY POINTER PUSHJ P,MUSHB SKIPE A,PONPNT PUSHJ P,MUSHP TRO MCHG!NEEDCL TRNE BTHSDS ;IF ON BOTH SIDES, MUNG BOTH SIDES SKIPN A,PONPN2 POPJ P, ; MUSH POINTS MUSHP1: FETCHL(T,A,PBIT) TLNE T,ISPIN!CPIN POPJ P, FETCH(TTT,A,PXY) PUSHJ P,MUSHIT STORE(T,A,PXY) POPJ P, MUSHP: PUSHJ P,MUSHP1 FETCH(A,A,PNXT) JUMPN A,MUSHP POPJ P, ;MUSH BODIES MUSHB1: FETCH(F,A,BORI) FETCH(B,A,BLNK) JUMPE B,CPOPJ ;NO PINS, NO MUSH FETCH(TTT,B,BPXY) PUSHJ P,MUSHIT ;MUSH THE PIN MOVE TTT,T ;SAVE NEW X,Y OF PIN FETCH(B,B,BPLOC) FETCH(T,B,TPXY) ;X,Y FROM PIN TYPE BLOCK ADDI F,2 ;ROTATE BACK TO BODY CENTER ANDI F,3 ;MAKE SURE WE DON'T OVERFLOW PUSHJ P,ORIENT ADJUST(ADD,T,TTT) STORE(T,A,BXY) ;STORE AS NEW BODY X,Y PUSH P,A PUSHJ P,BODFIX POP P,A POPJ P, MUSHB: PUSHJ P,MUSHB1 FETCH(A,A,BNXT) JUMPN A,MUSHB POPJ P, MUSHIT: HRRE T,TTT ASH T,-1 IDIV T,STPSIZ IMUL T,STPSIZ ASH T,1 HLRE TT,TTT ASH TT,-1 IDIV TT,STPSIZ IMUL TT,STPSIZ ASH TT,1 HRL T,TT POPJ P, ;SET MUSH STMUSH: PUSHJ P,GETCLS JRST PERRET TRO MCHG!NEEDCL MOVE G,A HLRZ G,(G) STMSH1: HRRZ A,1(G) JUMPE A,.+2 PUSHJ P,MUSHP1 HLRZ A,1(G) JUMPE A,.+2 PUSHJ P,MUSHB1 HRRZ G,(G) JUMPN G,STMSH1 POPJ P, >;MPC ;LINE EDIT TEXT STANFO,< LODED: JUMPE T,CPOPJ ;DONE WHEN WE GET A ZERO SETZ B, HLRZ C,(T) ;SIZE JUMPE C,LODED2 CAIN C,1 ;SIZE 1? JRST LODED2 ;YES, NO SPECIAL EFFECT PTWR1S [ 0 "\"] JFCL TRZE C,400000 PTWR1S [ 0 "V"] JFCL ADDI C,60 ;MAKE IT ASCIZ PTWR1S B JFCL LODED2: ADD T,[POINT 7,1] LODED1: ILDB C,T PTWR1S B JFCL ;IGNORE IF NOT SENT TLNE T,760000 JRST LODED1 HRR T,-1(T) TRNE T,-1 JRST LODED1 POPJ P, LODPNT: HLRZ T,(A) ;TO DATA BLOCK HRRZ T,1(T) ;TO TEXT BLOCK HLRZ T,(T) ;TO TEXT JUMPE T,CPOPJ ;DON'T LOAD NO TEXT! HRRZ T,(T) JRST LODED ;LOAD IT PNTQ: PUSHJ P,GETCLS ;CURRENT POINT JRST PERRET ;NONE PUSHJ P,LODPNT ;LOAD IT UP ZORQ: PUSHJ P,TXREAD ;READ IT BACK CAIN C,ALTMOD ;END WITH ALTMOD? JRST PUTFS ;JUST PUT BACK THIS STRING, NO CHANGE SKIPG T MOVE T,STDBIG HRLM T,(B) SKIPN 1(B) JRST [ PUSHJ P,PUTFS ;NULL STRING, GIVE IT BACK JRST PTKIL1] ;AND KILL ANY EXISTING TEXT PUSH P,B ;SAVE STRING POINTER HLRZ C,(A) HRRZ C,1(C) HLRZ D,(C) NIL,< FETCH(D,A,PTXT) > JUMPN D,[HRRZ B,(D) PUSHJ P,PUTFS JRST GTTBLK] GETFS(D) SETZM 1(D) ;0 INITIAL OFFSET HRLM D,(C) ;LINK IT IN NIL,< STORE(D,A,PTXT) > GTTBLK: POP P,(D) ;STORE NEW STRING POINTER TRO MCHG!NEEDCL MD,< JRST FIXEM > ;FIX OFFSETS IF BITS ON MPC,< POPJ P, > PNTZ: PUSHJ P,GETCLS ;CURRENT POINT JRST PERRET ;NONO PUSHJ P,LODPNT ;LOAD IT UP PTWRS9 [ 0 [BYTE(9)271,271,271,377,0]] ;CTRL1 999 BACKSPACE JRST ZORQ ;AND READ IT BACK >;STANFO SUBTTL POINT TEXT ; PUT TEXT ON POINT PNTTXT: PUSHJ P,GETCLS ;GET POINTER TO CLOSEST POINT JRST PERRET ;NONE PNTTX3: TRNE INLIN ;DRAWING LINE? PUSHJ P,[PUSHJ P,PLPNT ;MAKE CORNER MOVE T,LINING PUSHJ P,PNALT ;STOP LINE PUSHJ P,SCLOSP ;AND SET CLOSEST POINT TO LINING MOVE A,CLOSES POPJ P,] TLNN M,DSKACT!MACACT OUTSTR [ASCIZ /TEXT? /] PUSHJ P,TXREAD ;READ IN THE TEXT CAIN C,ALTMOD JRST PUTFS ;JUST GIVE BACK FREE STORAGE AND LEAVE FETCH(D,A,PTXT) ;GET OLD TEXT POINTER SKIPN 1(B) ;NULL TEXT? JRST [ PUSHJ P,PUTFS ;GIVE BACK NULL STRING JRST PTKIL1] ;JUST KILL ORIGINAL TEXT(IF ANY) TRO MCHG!NEEDCL ;THIS CHANGES SCREEN JUMPE D,PNTTX1 ;CAN'T COPY IF NO OLD JUMPGE T,PNTTX1 ;DON'T COPY IF EXPLICIT SIZE TYPED FETCH(T,D,TCSTR) FETCH(T,T,TSSIZ) ;GET OLD SIZE PNTTX1: SKIPG T ;MAKE SURE WE HAVE POSITIVE SIZE MOVE T,STDBIG STORE(T,B,TSSIZ) ;STORE SIZE GETBLK(T,TEXCOF) STORE(B,T,TCSTR) CLEAR(T,TCXY) ;0 INITIAL OFFSET STORE(T,A,PTXT) ;DEPOSIT TEXT POINTER ;DEC, MAYBE DEFAULT THE POLARITY LETTERS MD,< DEC,< PUSH P,D ;FIND DEFAULT POLARITY IF NEEDED PUSH P,A MOVE A,B ADD A,[POINT 7,1] PUSHJ P,PERMUT ;PERMUT SIGNAL TO GET H OR L OR ! SKIPGE POLAR ;GOT H OR L? JRST PNTTX4 ;YES, DONE SKIPG POLAR ;IS IT ! JRST NOEXCL ;NO ;Got "!", don't try to default H,L ;Delete the "!" off of the string, though. MOVE A,(P) ;A = POINT FETCH(A,A,PTXT) FETCH(A,A,TCSTR) ;ACTUAL STRING ADD A,[POINT 7,1] PNTEX1: MOVE B,A ;REMEMBER 1 BEFORE START OF WHAT WE WANT PUSHJ P,GETITZ JRST PNTTX4 ;OH WELL, I THOUGHT IT WAS THERE CAIE T," " ;FIND FIRST SPACE JRST PNTEX1 PNTEX3: PUSHJ P,GETITZ JRST PNTTX4 CAIN T," " ;SKIP OVER SPACES JRST PNTEX3 CAIE T,"!" ;! JRST PNTEX1 ;GO BACK AND TRY AGAIN PUSHJ P,GETITZ SETZ T, JUMPN T,PNTEX1 ;SHOULD BE AT END NOW CAIA PNTEX4: IDPB T,B TLNE B,760000 JRST PNTEX4 HRRZ TTT,-1(B) HLLZS -1(B) SKIPE B,TTT PUSHJ P,PUTFS ;RETURN REST OF STRING JRST PNTTX4 GETITZ: TLNN A,760000 JRST [ HRR A,-1(A) TRNN A,-1 POPJ P, JRST .+1] ILDB T,A JUMPE T,GETITZ CAIE T,";" ;THIS IS THE COMMENT CHAR AOS (P) POPJ P, ;Default the H,L polarity NOEXCL: MOVSI C,1 ;CLEAR MARKING BITS FOR DEFPOL SKIPE A,PONPNT PUSHJ P,CLRBTS SETZM WDOLST ;CLEAR DO LIST MOVE T,(P) MOVE H,[1,,DEFPOL] PUSHJ P,RECUR0 ;INSERT THIS PIN IN LIST PUSHJ P,RECCHK ;NOW CHECK IT AND ITS CONNECTIONS FOR DEFAULT POLARITY JRST PNTTX4 ;NONE FOUND MOVE B,(P) ;PTR TO POINT FETCH(B,B,PTXT) PNTTX5: HRRZ B,(B) ;TEXT PTR JUMPE B,PNTTX6 ;FOUND LAST BLOCK? MOVE C,B JRST PNTTX5 PNTTX7: TLNE C,760000 ;AT END OF WORD? JRST PNTTX8 ;NO GETFS(D) ;YES, TACK ON A NEW BLOCK SETZM (D) SETZM 1(D) HRRM D,-1(C) ;LINK HRR C,D PNTTX8: ILDB D,C ;FIND FIRST NULL JUMPN D,PNTTX7 POPJ P, PNTTX6: ADD C,[POINT 7,1] PUSHJ P,PNTTX7 ;FIND WHERE TO PUT IN POLARITY MOVEI D," " DPB D,C ;PUT IN SEPERATOR PUSHJ P,PNTTX7 MOVEI D,"H" ;ASSUME H TRNN A,ASSH ;H OR L? MOVEI D,"L" ;L DPB D,C PNTTX4: POP P,A POP P,D >;DEC >;MD ;MAYBE CHECK FOR NULL TEXT AND TEXT WITH TABS HERE JUMPE D,CPOPJ MOVE B,D ;PUT THE OLD TEXT BACK... JRST PUTFS ;... ON FREE STORAGE ;STORE TEXT IN MACRO STOTXT: PUSHJ P,GETCLS JRST PERRET FETCH(T,A,PTXT) SKIPE T FETCH(T,T,TCSTR) STOTXB: PUSHJ P,SETTT JUMPE T,ITSTUF FETCH(B,T,TSSIZ) CAMN B,STDBIG ;OR STANDARD JRST STOTX0 ;WE DON'T NEED ANYTHING IN FRONT PUTBYT "\" TRZE B,400000 ;IS IT VERTICAL PUTBYT "V" PUSHJ P,PUTTTN ;AND THE SIZE STOTX0: ADD T,[POINT 7,1] STOTX1: PUSHJ P,GETTT JRST ITSTUF PUTBYT (C) JRST STOTX1 MD,< ;T PNTTX2: PUSHJ P,GETCLS JRST PERRET PUSHJ P,PNTTX3 JRST PTTOFF ;NOW GO FIX IT ;Z PUTOFF: PUSHJ P,GETCLS JRST PERRET PTTOFF: PUSHJ P,SETFXT JRST FIXEM ;Q CONOFF: PUSHJ P,GETCLS JRST PERRET CNCOFF: PUSHJ P,SETFXC JRST OFFCON ;THIS CAN'T AFFECT TEXT SETFXT: FETCH(TT,A,PTXT) JUMPE TT,CPOPJ ;CAN'T SET IF NO TEXT FETCH(TT,A,PBIT) TRO TT,FIXTXT SKIPE MOVFLG TROA TT,FIXRHT TRZ TT,FIXRHT STORE(TT,A,PBIT) POPJ P, SETFXC: FETCH(TT,A,PBIT) TRNN TT,CPIN POPJ P, TRO TT,FIXCON STORE(TT,A,PBIT) POPJ P, ;Z UNOFFT: PUSHJ P,GETCLS JRST PERRET CLRFXT: CLRBIT(FIXTXT!FIXRHT,TT,A,PBIT) POPJ P, ;Q UNOFFC: PUSHJ P,GETCLS JRST PERRET CLRFXC: CLRBIT(FIXCON,TT,A,PBIT) POPJ P, ;OFFALL, OFFTXT, OFFCON (D) OFFRHT: SETOM MOVFLG POPJ P, NOFRHT: SETZM MOVFLG POPJ P, OFFALL: SKIPN A,PONPNT POPJ P, OFFAL1: PUSHJ P,SETFXT PUSHJ P,SETFXC PUSHJ P,FIXEM HRRZ A,(A) JUMPN A,OFFAL1 POPJ P, ;ROUTINE TO RE-FIX ALL Z POINTS FIXEM0: SKIPN A,PONPNT POPJ P, FIXEM1: PUSHJ P,FIXEM HRRZ A,(A) JUMPN A,FIXEM1 POPJ P, ;OFFSET TEXT ;A = POINT OFFTXT: FETCH(B,A,PTXT) JUMPE B,CPOPJ ;NO TEXT FETCHL(D,A,PBIT) ;GET BITS FOR LATER TLNE D,FIXTXT ;FIXING TEXT AT ALL? PUSHJ P,LINSET ;DIRECTION TO HANG TEXT OFF END OF LINE POPJ P, ;TOO COMPLEX, DON'T CHANGE IT PUSHJ P,OFFCAL ;COUNT CHARS, GET MAX WIDTH, # LINES, CHAR SCALE FACTOR SKIPE ULNFLG ;POSITION SO IT GETS UNDERLINED? TLNE D,ISPIN ;NOT PINS WE DON'T JRST NOULN ADDI C,HMOVU-HMOVE NOULN: TLNE D,ISPIN ;IS THIS A PIN? ADDI C,HMOVP-HMOVE CAIG C,1 ;L OR R? (AND NOT PIN OR UNDERLINE) MOVE TT,TTT ; MAKE HEIGHT LOOK LIKE ONE LINE XCT HMOVE(C) ;OFFSET X,Y XCT MOVEV(C) ;OFFSET X (1 LINE, 1/2 LINE, ...) SUB TT,TTT ;NORMALIZE VERTICAL DOWN 1 LINE FETCH(TTT,B,TCSTR) FETCH(TTT,TTT,TSSIZ) ;TEXT SIZE MOVE TTT,VIRPTX(TTT) ;PT WIDTH OF ONE CHAR ASH TTT,-1 ;NOW 1/2 XCT HFUDGE(C) ;POSSIBLY FUDGE X PART HRL TT,T SKIPN ISVERT ;VERTICAL TEXT? JRST NOFVRT MOVS TT,TT ;YES, MAP TO -Y,X TLC TT,-1 ADD TT,[1,,0] NOFVRT: CAMN TT,ADDR(B,TCXY) POPJ P, EXCH TT,ADDR(B,TCXY) TRO MCHG SKIPE ISVERT POPJ P, ;QUIT NOW IF VERT TLNE D,FIXRHT ;DOES HE WANT FIX RIGHT? CAIE C,1 ;go LEFT? ( WON'T BE 1 IF WAS PIN!!) POPJ P, ;ALL DONE ;Move point so that left edge of text stays in place SUB TT,ADDR(B,TCXY) ;TEXT TO LEFT, BUT MOVE POINT, NOT LEFT EDGE OF TEXT HLRE T,TT ;HOW MUCH MOVED IN X FETCH(TTT,B,TCSTR) FETCH(TTT,TTT,TSSIZ) ;SIZE OF TEXT IMUL T,PLTPTX(TTT) IDIV T,VIRPTX(TTT) ;ADJUST FOR DEVIATION OF PLOT CHARACTER SIZE UNSCAL T ;CONVERT TO INTERNAL COORDS COMMENT  The character offset (TCXY) is in III display coords (!) that is so that it doesn't get scaled with the drawing. We have to convert it to internal drawing coords somehow to adjust the point position. This conversion is a function of the current drawing scale. When this is done at the scale where text looks "right", this will adjust the point so that the left edge of the text stays fixed.  HRLZ T,T ADD T,ADDR(A,PXY) ;ADJUST X OF POINT FETCH(TT,A,PNR) ;NOW LOOK AT OTHER END OF WIRE FETCH(TT,TT,PXY) ;X,Y OF OTHER END! SUB TT,[4,,0] CAML T,TT MOVE T,TT ;TO FAR, LIMIT TO JUST TO LEFT OF RIGHT END STORE(T,A,PXY) TRO NEEDCL ;MAYBE CHANGED CLOSEST POPJ P, ;OFFSET CONNECTOR BOX ;OFFCON - OFFSET CONNECTOR BOX ;A = CONNECTOR PIN FIXEM: PUSHJ P,OFFTXT OFFCON: FETCH(D,A,PBIT) TRNE D,FIXCON ;FIXING CON? TRNN D,CPIN ;CON? POPJ P, ;NO, QUIT NOW FETCH(B,A,PTXT) PUSHJ P,LINSET ;SEE WHICH WAY LINE GOES POPJ P, ;TOO COMPLEX, LEAVE IT ALONE MOVE D,STDBIG XCT CONTAB(C) ;T gets deltaX,,deltaY JUMPE B,GOTCOF ;ANY TEXT? PUSH P,T ;SAVE CON BOX OFFSET PUSHJ P,OFFCAL ;CALC TEXT LENGTH, HEIGHT XCT CTOTAB(C) ADD TTT,(P) HLRE TT,(P) ADD T,TT HRLZS T HRR T,TTT POP P,(P) SKIPN ISVERT ;VETICAL TEXT? JRST GOTCOF ;NO MOVS T,T ;YES, MAP TO -Y,X TLC T,-1 ADD T,[1,,0] GOTCOF: FETCH(B,A,PLOC) CAMN T,1(B) POPJ P, MOVEM T,1(B) ;SET OFFSET TRO MCHG POPJ P, ; ;THESE 3 TABLES MUST MATCH THE ONES FOR PINS HMOVE: SETZ T, ;go RIGHT no offset X JFCL ;go LEFT full offset X ASH T,-1 ;go UP center X ASH T,-1 ;go DOWN center X ASH T,-1 ;center center X MOVEV: ASH TT,-1 ;go RIGHT center Y ASH TT,-1 ;go LEFT center Y JFCL ;go UP full offset Y SETZ TT, ;go down no offset ASH TT,-1 ;center center Y HFUDGE: ADD T,TTT ;go RIGHT 1/2 char right fudge SUB T,TTT ;go LEFT 1/2 char left fudge JFCL JFCL JFCL ;OFFSET TEXT, SO THAT IT IS UNDERLINED ;THESE 3 TABLES MUST MATCH THE ONES FOR POINTS HMOVU: JFCL ;go RIGHT full offset left SETZ T, ;go LEFT no offset ASH T,-1 ;go UP center X ASH T,-1 ;go DOWN center X ASH T,-1 ;center center X VMOVU: JFCL ;go RIGHT full offset up JFCL ;go LEFT " JFCL ;go UP " SETZ TT, ;go DOWN no offset ASH TT,-1 ;center center Y HFUDGU: JFCL ;no fudges for underline mode JFCL JFCL JFCL JFCL ;OFFSET TEXT ON PINS - put on top of line coming in ;THESE 3 TABLE MUST MATCH THE ONE FOR POINTS HMOVP: JFCL ;go RIGHT left/up, over line coming in SETZ T, ;go LEFT right/up, over " SETZ T, ;go UP right, from line coming in SETZ T, ;go DOWN up/right, next to line coming in ASH T,-1 ;center VMOVP: JFCL ;UP 1 JFCL ;UP 1 SETZ TT, JFCL ;UP 1 ASH TT,-1 HFUDGP: SUB T,TTT ;LEFT ANOTHER HALF CHAR ADD T,TTT ;RIGHT ANOTHER HALF CHAR JFCL JFCL JFCL ;CONNECTOR OFFSET TABLES FOR NO TEXT ;A = POINT ;D = STDBIG CHAR SIZE ;RETURNS T= deltaX,,deltaY to position connector box ; (positions the first char of the connector string, ; connector boxes are drawn relative to that) CONTAB: PUSHJ P,CONR ;go RIGHT PUSHJ P,CONL ;go LEFT PUSHJ P,CONU ;go UP PUSHJ P,COND ;go DOWN PUSHJ P,CONU ;center ;CONNECTOR BOXES ARE DRAWN WITH VECTORS PTY,,PTY SIZE. ;go RIGHT - offset X=CH-Height/2, Y=-CH-Height/2 CONR: MOVE T,VIRPTY(D) ;HEIGHT OF STD CHAR ASH T,-1 MOVN TTT,T HRLZ T,T HRR T,TTT POPJ P, ;go LEFT - offset X= -Text-Width - CH-Height/2, Y= -CH-Height/2 CONL: PUSHJ P,CONCAL IMUL T,VIRPTX(D) ;WIDTH OF CONNECTOR NAME IN PTS MOVNS T MOVN TT,VIRPTY(D) ASH TT,-1 ADD T,TT HRLZ T,T HRR T,TT POPJ P, ;go UP - offset X= -Text-Width/2, Y= 0 CONU: PUSHJ P,CONCAL IMUL T,VIRPTX(D) ;TIMES STD CHAR WIDTH ASH T,-1 MOVN T,T HRLZ T,T POPJ P, ;go DOWN - offset X= -Text-Width/2, Y= -CH-Height COND: PUSHJ P,CONCAL IMUL T,VIRPTX(D) ASH T,-1 MOVN T,T HRLZ T,T MOVN TT,VIRPTY(D) HRR T,TT POPJ P, ;CONNECTOR BOX OFFSET TABLES, WITH TEXT ON POINT ;T = - WIDTH OF TEXT (IN PTS) ;TT = HEIGHT OF TEXT (IN PTS) ;TTT = HEIGHT OF 1 LINE OF TEXT ;RETURNS ;T = X DELTA ;TTT = Y DELTA CTOTAB: PUSHJ P,CTOR ;go RIGHT PUSHJ P,CTOL ;go LEFT PUSHJ P,CTOU ;go UP PUSHJ P,CTOD ;go DOWN PUSHJ P,CTOU ;center ;TEXT-WIDTH+1/2,,0 CTOR: MOVE TT,VIRPTX(D) ;WIDTH OF STANDARD CHAR ASH TT,-1 MOVNS T ADD T,TT SETZ TTT, POPJ P, ;-TEXT.WIDTH-1/2,,0 CTOL: MOVN TT,VIRPTY(D) ;BOX STICKS OUT PT-Y ASH TT,-1 ADD T,TT SETZ TTT, POPJ P, ;0,,-TEXT.HEIGHT-1/2 CTOD: SETZ T, MOVNS TTT ASH TTT,-1 SUB TTT,TT POPJ P, ;0,,TEXT.HEIGHT+1/2 CTOU: SETZ T, ASH TTT,-1 ADD TTT,TT POPJ P, SUBTTL CALC HEIGHT AND LENGTH OF TEXT IN VIRTUAL CHAR POINTS (D) ;OFFCAL ;B = TEXT STRING WITH OFFSET BLOCK ;COUNT # OF LINES OF TEXT, LENGTH OF LONGEST LINE ;T = - WIDTH OF LONGEST LINE * CHAR SIZE FACTOR ;TT = # OF LINES HIGH * CHAR SIZE FACTOR ;TTT = CHARACTER SIZE FACTOR OFFCAL: FETCH(TT,B,TCSTR) ADD TT,[POINT 7,1] PUSH P,[0] PUSH P,[1] ;AT LEAST ONE LINE SETZ T, ;count # lines, max wid line OFFCL1: TLNN TT,760000 JRST [ HRR TT,-1(TT) TRNN TT,-1 JRST OFFCL2 JRST .+1] ILDB TTT,TT JUMPE TTT,OFFCL1 CAIN TTT,DBLARR ;LINE BREAK? JRST [ CAMGE T,-1(P) MOVEM T,-1(P) SETZ T, AOS (P) JRST OFFCL1] SOJA T,OFFCL1 ;COUNT CHARS IN CURRENT LINE OFFCL2: CAMGE T,-1(P) MOVEM T,-1(P) FETCH(TTT,B,TCSTR) FETCH(TTT,TTT,TSSIZ) ;CHAR SIZE TRZ TTT,400000 ;CLEAR VERT BIT POP P,TT ;# LINES POP P,T ;WIDTH OF BIGGEST LINE IMUL TT,VIRPTY(TTT) ;HEIGHT OF TEXT IN PTS IMUL T,VIRPTX(TTT) ;WIDTH OF TEXT IN PTS MOVE TTT,VIRPTY(TTT) ;HEIGHT OF ONE LINE POPJ P, ;CONCAL - CALCULATE CONNECTOR PRINT SIZE ;A = POINT ;RETURNS T = CHARACTER COUNT CONCAL: SETZM CHRCNT PUSH P,A PUSH P,TT PUSH P,B PUSH P,PUTCHR MOVE B,[AOS CHRCNT] MOVEM B,PUTCHR FETCH(A,A,PLOC) MOVE A,(A) ;B-R-S,,PIN-LOC PUSHJ P,CSLTLP ;PRINT CONN PIN NAME POP P,PUTCHR POP P,B POP P,TT POP P,A MOVE T,CHRCNT POPJ P, ;LINSET - COMPUTE DIRECTION OFF END OF LINE (IF ANY) ;A = POINT ;SKIPS ;RETURNS C = DIRECTION TO PUT CONNECTOR ; 0 - go RIGHT ; 1 - go LEFT ; 2 - go UP ; 3 - go DOWN ; 4 - no lines, center ;ISVERT = FLAG FOR VERT TEXT LINSET: SETZ C, MOVEI T,ADDR(A,PNU) ;POINTER TO NEIGHBOR BLOCK SKIPN TT,1(T) ;L OR R ? JRST NOLROF TLNE TT,-1 TRO C,1 ;L TRNE TT,-1 TRO C,2 ;R NOLROF: SKIPN TT,(T) ;UP OR DWN ? JRST NOUDOF TLNE TT,-1 TRO C,4 ;DWN TRNE TT,-1 TRO C,10 ;UP NOUDOF: XCT SETCTB(C) SETZM ISVERT ;ASSUME NO VERT TEXT FETCH(B,A,PTXT) JUMPE B,CPOPJ1 ;LEAVE NOW IF NO TEXT FETCH(TT,B,TCSTR) ;STRING SKIPL (TT) ;VERT TEXT? JRST CPOPJ1 ;NO SETOM ISVERT ;IT IS VERTICAL CAIN C,4 ;NO CHANGE IF NO LINES JRST CPOPJ1 TRCN C,2 ;MAP 90 DEGREES CW TRC C,1 JRST CPOPJ1 SETCTB: MOVEI C,4 MOVEI C,0 ;LINE TO LEFT, GO RIGHT MOVEI C,1 ;LINE TO RIGHT, GO LEFT POPJ P, MOVEI C,2 ;LINE DOWN, GO UP POPJ P, POPJ P, POPJ P, MOVEI C,3 ;LINE UP, GO DOWN POPJ P, POPJ P, POPJ P, POPJ P, POPJ P, POPJ P, POPJ P, >;MD ;KILL TEXT (D,PC) PTKILL: PUSHJ P,GETCLS ;GET POINTER TO CLOSEST POINT JRST PERRET ;NONE PTKIL1: TRNE TMOVE ;MOVING TEXT OFFSET? PUSHJ P,CLRMOV ;YES, CLEAR MOVING MOVE B,A KILTXT: PUSH P,B MOVE T,B FETCH(B,B,PTXT) JUMPE B,NKLTXT ;LEAVE IF NONE CLEAR(T,PTXT) CLRBIT(FOUNDP>,TT,T,PBIT) TRO MCHG!NEEDCL ;CHANGES SCREEN AND BLINKING LETTER PUSHJ P,PUTFS MD,< PUSH P,A PUSH P,C PUSH P,D MOVE A,-3(P) PUSHJ P,OFFCON ;MAYBE FIX CON POP P,D POP P,C POP P,A >;MD NKLTXT: POP P,B POPJ P, ;DELETE LINE (D) ;A = FIRST POINT,,OTHER POINT MD,< LINDEL: PUSHJ P,GETCLS ;CLOSEST LINE? JRST PERRET TRO MCHG!NEEDCL HLRZ B,A DEFINE FOO (PND,PNU) < FETCH(C,B,PND) CAIN C,(A) JRST [ CLEAR(B,PND) CLEAR(A,PNU) POPJ P,] > FOO(PND,PNU) FOO(PNU,PND) FOO(PNL,PNR) FOO(PNR,PNL) POPJ P, ;LINES, SET MIDPOINT, MAKE JOG, ATTACH POINT (D) NIL,< BENDL1: BENDL2: LATTP1: LATTP2: >;NIL DEFINE BENDIT # (CBIT) < BENDL#CBIT: PUSHJ P,GETCLS JRST PERRET ;NO CLOSEST LINE. MOVE T,CURSE ;USE CURSOR POS FOR MIDPOINT CALC LATTP#CBIT: ;ENTRY POINT FOR A IN LINE MODE MOVEM T,DX3 ;SAVE POS TO BREAK LINE AT TRO MCHG HLRZ C,A FETCH(E,A,PNU) CAIN E,(C) JRST BENDY#CBIT ;VERT LINE, C ABOVE A FETCH(E,A,PNR) CAIN E,(C) JRST BENDX#CBIT ;HORZ LINE, C RIGHT OF A EXCH A,C FETCH(E,A,PNU) CAIN E,(C) JRST BENDY#CBIT FETCH(E,A,PNR) CAIN E,(C) JRST BENDX#CBIT POPJ P, ; BENDX BENDY ; ; P1 ==== C C ; | | ; | | ; A ==== P2 P2 ==== P1 ; | ; | ; A ; ;IN THE CASE OF ONLY ONE MIDPOINT, P2 IS OMITTED DEFINE GARPLY $ (H1,PND,PNU,PNL,PNR) < PUSH P,A ;POINT BELOW, OR TO LEFT PUSH P,C ;POINT ABOVE, OR TO RIGHT FETCH(T,C,PXY) H$H1$H1 T,DX3 ;SET Y:(P1 IS DIRECTLY ABOVE C) PUSHJ P,PNTPUT IFE CBIT-2, ;REMEMBER POINT FOR HIGHER UPS! PUSH P,D ;P1 IFE CBIT-1,< FETCH(T,A,PXY) H$H1$H1 T,DX3 ;SET Y:(P1 IS DIRECTLY BELOW A) PUSHJ P,PNTPUT MOVE T,D ;T=P2 > POP P,E ;E=P1 IFN CBIT-1,< MOVE T,E ;ONLY MAKING ONE POINT > POP P,C POP P,A STORE(T,A,PNU) ;LINK A - P2 STORE(A,T,PND) IFE CBIT-1,< STORE(E,T,PNR) ;LINK P2 - P1 STORE(T,E,PNL) > STORE(E,C,PND) ;LINK P1 - C STORE(C,E,PNU) POPJ P, > BENDX#CBIT: GARPLY(L,PNL,PNR,PND,PNU) BENDY#CBIT: GARPLY(R,PND,PNU,PNL,PNR) > BENDIT(1) ;MAKE DOUBLE MIDPOINT BENDIT(2) ;MAKE SINGLE MIDPOINT ;ATTACH POINT TO LINE (D) LATT: MOVE A,CLOSES ;IF MOVING TRZE INMOV ;STOP MOVING JRST INATT ;BUT USE THE ONE WE WERE MOVING SETZ A, ;FOR INLIN TRNE INLIN JRST INATT PUSHJ P,GETCLS JRST PERRET INATT: MOVEM A,SAVP MOVEI T,LINM PUSHJ P,TCHNGM PUSHJ P,GETCLS ;FIND CLOSEST LINE JRST [ PUSHJ P,RCHNGM SKIPN SAVP TRO INLIN!NEEDCL JRST PERRET] TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/THIS ONE/] MOVEI T,UPSTAL MOVEM T,SPDISP MOVE T,[ASCID/AL/] MOVEM T,SPMODT MOVEI T,SPM ;SPECIAL POINTER MODE PUSHJ P,TCHNGM MOVE T,IPOINT ;GET INTERSECTION POINT MOVEM T,STARLOC ;THIS IS LOC OF STAR PUSHJ P,YORN JFCL JFCL PUSHJ P,RCHNGM ;GET BACK OLD MODE CAIE C,"Y" CAIN C,"y" CAIA JRST [ SKIPN SAVP ;WERE WE INLIN? TRO INLIN!NEEDCL;YES, STAY THERE POPJ P,] SKIPE T,SAVP ;IS THIS THE INLIN GUY JRST GOTINT ;ALREADY GOT INTERSECTION POINT MOVE T,IPOINT ;PUT POINT AT PERPENDICULAR INTERSECTION POINT PUSHJ P,LATTP2 ;MAKE MIDPOINT TRO INLIN ;TELL HIM ITS OK MOVE A,SAVP ;SETUP A FOR LINE CALLS PUSHJ P,PNMNS1 ;TRY - CAIA ;LOSE JRST ATTDON ;THEN IT WORKED TRC ZIGZAG ;ELSE TRY THE OTHER WAY MOVE A,SAVP PUSHJ P,PNMNS1 CAIA ;LOSE JRST ATTDON ;YES MOVE A,SAVP PUSHJ P,PNOT1 ;TRY A STRAIGHT (SLANTED) LINE! CAIA JRST ATTDON OUTSTR[ASCIZ/SORRY, YOU'LL HAVE TO HAVE ANOTHER TICKET TO MAKE THIS CONNECTION. /] TRO INLIN!NEEDCL POPJ P, ATTDON: TRO NEEDCL!MCHG TRZ INMOV!INLIN POPJ P, GOTINT: MOVEM T,LINING ;SAVE ORIGINAL POINT HERE FETCH(T,T,PXY) ;USE THIS AS PLACE TO MAKE NEW POINT PUSHJ P,LATTP2 ;MAKE A MIDPOINT MOVE A,SAVP MOVE T,LINING FETCHL(T,T,PBIT) TLNN T,ISPIN ;CAN'T REVERSE IF LINING IS ALREADY PIN EXCH A,LINING ;MOVE TO LINE! JRST LATTP ;ATTACH TO POINT WILL DO THE REST ;ATTACH POINT TO POINT (D) PATT: TRZE INMOV JRST [ MOVE A,CLOSES ;USE THE ONE WE WERE MOVING JRST PATT1] TRNN INLIN PUSHJ P,GETCLS JRST PERRET PATT1: MOVEM A,LINING TRO INLIN!NEEDCL PUSHJ P,GETCLS ;FIND CLOSEST(NOT INCLUDING CURRENT CLOSEST) JRST [ TRZ INLIN TRO NEEDCL JRST PERRET] ;NO, JUST ONE POINT ON SCREEN FETCH(T,A,PXY) FETCHL(TT,A,PBIT) TLNE TT,ISPIN JRST [ EXCH A,LINING ;TRY IT THE OTHER WAY FETCHL(TT,A,PBIT) TLNN TT,ISPIN JRST .+1 OUTSTR[ASCIZ/SORRY, BOTH ARE PINS! /] TRZ INLIN TRO NEEDCL JRST PERRET] TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/THIS ONE/] TRZ INLIN MOVEM T,STARLOC MOVEI T,UPSTAR MOVEM T,SPDISP MOVE T,[ASCID/AP/] MOVEM T,SPMODT MOVEI T,SPM PUSHJ P,TCHNGM PUSHJ P,YORN JFCL JFCL TRO NEEDCL PUSHJ P,RCHNGM CAIE C,"Y" CAIN C,"y" CAIA POPJ P, TRO MCHG ;FALLS THRU ; LATTP: MOVEM A,DX1 MOVE B,LINING DEFINE FOO (LINK,OTHER) < FETCH(C,B,LINK) ;SIFT OUT THE INCESTUOUS LINKS CAIN C,(A) SETZ C, ;B pointed to A, flush JUMPE C,[FETCH(C,A,LINK) ;B's link no good, use A's link CLEAR(B,LINK) CAIN C,(B) SETZ C, ;A pointed to B, flush JRST .+1] STORE(C,B,LINK) SKIPE C STORE(B,C,OTHER) > FOO(PND,PNU) ;DOWN FOO(PNU,PND) ;UP FOO(PNL,PNR) ;LEFT FOO(PNR,PNL) ;RIGHT ;TEXT MOVE B,DX1 ;OLD MOVE A,LINING ;NEW FETCH(T,A,PTXT) ;ANY TEXT ON NEW? JUMPN T,LGTXT1 ;YES, KEEP IT FETCH(T,B,PTXT) CLEAR(B,PTXT) STORE(T,A,PTXT) ;COPY TEXT TO NEW MOVSI TTT,FIXTXT!FIXRHT ;COPY BITS ALSO ANDCAM TTT,ADDR(A,PBIT) AND TTT,ADDR(B,PBIT) IORM TTT,ADDR(A,PBIT) LGTXT1: FETCH(T,A,PLOC) ;ANY CON OR PIN ON NEW? JUMPN T,LGTXT2 ;YES MOVSI TTT,CPIN TDNN TTT,ADDR(B,PBIT) ;CPIN ON OLD? JRST LGTXT2 ;NO ANDCAM TTT,ADDR(B,PBIT) ;YES, TURN OFF IORM TTT,ADDR(A,PBIT) ;AND TURN ON IN NEW FETCH(T,B,PLOC) STORE(T,A,PLOC) CLEAR(B,PLOC) MOVSI TTT,FIXCON!CPNBTS ANDCAM TTT,ADDR(A,PBIT) AND TTT,ADDR(B,PBIT) IORM TTT,ADDR(A,PBIT) LGTXT2: PUSHJ P,DELPNL ;DELETE B=OLD POINT MOVE A,LINING SETZM LINING TRO NEEDCL!MCHG TRZ INLIN!INMOV FETCH(TT,A,PXY) PUSHJ P,PMOVX JRST PMOVY ;BREAK JUNCTION OF 3 OR 4 LINES (D) BREAKH: TRZA TFLG ;ZERO INDEX FOR HORZ BREAKV: TRO TFLG ;20 INDEX FOR VERT TRNN INLIN ;CAN'T BE INLIN PUSHJ P,GETCLS JRST PERRET MOVE B,A PUSHJ P,SETBTO ;SET MARK BITS FOR NON-EX NEIGHBORS HLRZ F,F ;GET BITS ANDI F,17 ;JUST LINE BITS FETCH(T,B,PXY) ;SETUP FOR LIKELY CALL ON PNTPUT XCT PERMIT(F) ;CHECK OK AND WHERE TO GO TRZE INMOV ;SIMPLE CASES TRO NEEDCL TRO MCHG PUSHJ P,PNTPUT ;D=NEW POINT JRST (F)@[BRKNUP ;NO UP POINT BRKNDN ;NO DOWN BRKNRT ;NO RIGHT BRKNLF] ;NO LEFT DEFINE FOO(PNU,PND,PNR,PNL) < FETCH(T,B,PNR) ;PICKUP LINK TO FOLLOW NEW POINT CLEAR(B,PNR) STORE(T,D,PNR) ;MAKE IT "RIGHT" OF NEW POINT STORE(D,T,PNL) ;MAKE NEW "LEFT" OF IT STORE(D,B,PNU) ;MAKE NEW "UP" OF OLD STORE(B,D,PND) ;MAKE OLD "DOWN" OF NEW POPJ P, > BRKNUP: FOO(PNU,PND,PNR,PNL) ;PLACE NEW UP OF OLD BRKNDN: FOO(PND,PNU,PNR,PNL) ;PLACE " DOWN " BRKNRT: FOO(PNR,PNL,PNU,PND) ;PLACE " RIGHT " BRKNLF: FOO(PNL,PNR,PNU,PND) ;PLACE " LEFT " WAY4: TRZE INMOV ;FLAGS TRO NEEDCL TRO MCHG PUSHJ P,PNTPUT ;MAKE ANOTHER POINT THERE FETCH(T,B,PNR) ;COPY OUR OLD RIGHT STORE(T,D,PNR) ; MAKE THAT NEW POINT'S RIGHT STORE(D,T,PNL) CLEAR(B,PNR) FETCH(T,B,PNU) STORE(T,D,PNU) ;MAKE NEW POINT'S UP OUR OLD UP STORE(D,T,PND) CLEAR(B,PNU) TRNN TFLG ;HOW TO CONNECT US? JRST [ STORE(D,B,PNR) ;PUT NEW TO RIGHT STORE(B,D,PNL) POPJ P,] STORE(D,B,PNU) ;PUT NEW POINT UP STORE(B,D,PND) POPJ P, ;CASES FOR BREAKING JUNCTION PERMIT: JRST WAY4 ;_   ^ CAN'T CALL IT 4WAY MOVEI F,0 ;_   NO UP MOVEI F,1 ;_  ^ NO DOWN MOVEI F,0 ;_  DO LIKE NO UP MOVEI F,2 ;_  ^ NO RIGHT JRST PERRET ;_  JRST PERRET ;_ ^ JRST PERRET ;_ MOVEI F,3 ;   ^ NO LEFT JRST PERRET ;   JRST PERRET ;  ^ JRST PERRET ;  MOVEI F,2 ;  ^ DO LIKE NO RIGHT JRST PERRET ;  JRST PERRET ; ^ JRST PERRET >;MD ;JUMP LINE TO OTHER SIDE OF CARD (PC) MPC,< LJUMP1: TLZA WFLAG ;USE WIRE LIST FLAG HERE LJUMP2: TLO WFLAG ;AND HERE (WHOLE LINE) TRZE INLIN!INMOV TRO NEEDCL PUSHJ P,GETCLS JRST PERRET PUSH P,A HLRZ B,A HRRZS A TRZ TYPNEG PUSHJ P,LSWITCH ;SWITCH THIS LINE AND IN ONE DIRECTION POP P,A TRZ TFLG TRNE TYPNEG TRO TFLG ;USE FEED THROUGH IF THERE PUSHJ P,LSWA TRO MCHG!NEEDCL POPJ P, LSWA: TLNN WFLAG ;ARE WE DOING WHOLE LINE POPJ P, FETCHL(T,A,PBIT) TLNE T,ISPIN!CPIN POPJ P, ;IMPOSSIBLE TRNN TFLG TLNN T,FEEDTH CAIA POPJ P, FETCH(C,A,PNEB) ;CHECK FOR ONLY ONE SEGMENT LEAVING SETZ B, ;NOW COUNT SEGMENTS FROM THIS POINT LSWA1: MOVEI T,2 LSWA2: XCT (T)[HLRZ TT,(C) HLRZ TT,1(C) HRRZ TT,1(C)] JUMPE TT,LSWA3 JUMPN B,CPOPJ ;MORE THAN ONE MOVE B,TT LSWA3: SOJGE T,LSWA2 HRRZ C,(C) JUMPN C,LSWA1 JUMPE B,CPOPJ ;NO MORE SEGMENTS? LSWITCH:PUSH P,A PUSH P,B PUSHJ P,KILSEG ;KILL SEGMENT ON THIS SIDE MOVE A,(P) MOVE B,-1(P) PUSHJ P,KILSEG ;BOTH DIRECTIONS MOVE A,-1(P) TRZ TFLG PUSHJ P,OPNT ;MAKE SURE OF POINT ON OTHER SIDE SETZM -1(P) ;THIS POINT WAS DELETED PUSH P,B ;SAVE ITS POINTER MOVE A,-1(P) ;AND OTHER END TRZE TFLG TRO TYPNEG PUSHJ P,OPNT SETZM -1(P) ;THIS POINT WAS DELETED PUSH P,B MOVE D,-1(P) PUSHJ P,MAKSEG ;NOW MAKE SEGMENT ON NEW SIDE POP P,D POP P,B PUSHJ P,MAKSEG ;BOTH DIRECTIONS POP P,A POP P,(P) JUMPN A,LSWA ;LOOP TO NEXT SEGMENT POPJ P, ;POINT WAS FEED THROUGH, AND WAS DELETED ;LJUMP SUBRS (PC) ;CLEAR POINTER TO A FROM B KILSEG: FETCH(B,B,PNEB) PUSHJ P,FNDLNK JRST KILLOS XCT (T)[HRRZS (B) HLLZS 1(B) HRRZS 1(B)] POPJ P, KILLOS: PUSHJ P,FUCKUP POPJ P, ;ADD POINTER TO D TO B MAKSEG: MOVE T,B PUSHJ P,FRLINK XCT (T)PUTAB POPJ P, ;OPNT ;FIND POINT ON OTHER SIDE, OR MAKE ONE, AND POSSIBLY DELETE ONE ONE THIS SIDE ;A = POINT ;RETURNS - SKIPS UNLESS POINT WAS DELETED ;B = POINT ON OTHER SIDE ;TFLG = WE MADE A FEEDTHRU OPNT: FETCHL(B,A,PBIT) TLNN B,FEEDTH ;FEEDTHRU TO OTHER SIDE? JRST OPNT1 FETCH(TT,A,PFEED) PUSH P,TT ;GET POINT ON OTHER SIDE FETCH(TT,A,PNEB) TLNN B,PLANES ;DON'T DELETE IF CONNECTED TO INNER PLANES OPNTB: SKIPE 1(TT) ;DON'T DELETE IF STILL HAS LINES ON IT JRST OPNTA SKIPN TT,(TT) JRST OPNTC ;ALL NULL SEGMENTS, OK TO DELETE TLNE TT,-1 JRST OPNTA JRST OPNTB OPNTC: TLZ B,FEEDTH STOREL(B,A,PBIT) CLEAR(A,PFEED) CLEAR(A,PIN) ;CLEAR PAD TYPE HRRZ T,(P) ;POINT ON OTHER SIDE CLEAR(T,PFEED) ;CLEAR POINTER BACK CLRBIT(FEEDTH,TT,T,PBIT) CLEAR(T,PIN) ;CLEAR PAD TYPE HRRZ B,A PUSHJ P,DELPNL ;DELETE ONE ON THIS SIDE OPNTA: POP P,B ;AND RETURN POINTER TO ONE ON OTHER SIDE POPJ P, OPNT1: TLNN B,ISPIN JRST OPNT2 ;GUESS WE HAVE TO MAKE ONE FETCH(T,A,BPLOC) ;TRY TO FIND COPY OF PIN ON OTHER SIDE FETCH(B,A,BBODY) FETCH(B,B,BLNK) ;PIN LIST FROM BODY OPNT3: CAIN B,(A) ;SKIP THE SAME PIN JRST OPNT4 FETCH(TTT,B,BPLOC) CAMN TTT,T JRST CPOPJ1 ;SAME PIN IN DEF, IT MUST BE THE ONE OPNT4: FETCH(B,B,BPLNK) JUMPN B,OPNT3 PUSHJ P,FUCKUP ;NOT THERE?!! POPJ P, OPNT2: TLNN B,CPIN JRST OPNT5 SWITCH FETCH(TTT,A,PXY) PUSHJ P,FIND.P ;TRY TO FIND CONNECTOR PIN ON OTHER SIDE SWITCH HRRZ B,D JRST CPOPJ1 OPNT5: MOVE G,A PUSHJ P,RDFEED ;MAKE FEED THROUGH PUSHJ P,FUCKUP ;CAN'T BE IMPOSSIBLE HRRZ B,D TRO TFLG ;TELL THEM WE MADE THIS FEED THROUGH JRST CPOPJ1 ;DELETE LINE, DELETE WIRE LINDEL: PUSHJ P,GETCLS ;CLOSEST LINE? JRST PERRET TRO MCHG!NEEDCL FLSHLN: HLRZ B,A FETCH(B,B,PNEB) PUSHJ P,FNDLNK POPJ P, XCT (T)[CLRTAB:HRRZS (B) HLLZS 1(B) HRRZS 1(B)] MOVS A,A HLRZ B,A FETCH(B,B,PNEB) PUSHJ P,FNDLNK POPJ P, XCT (T)CLRTAB POPJ P, ;DELETE WHOLE WIRE LINDL2: PUSHJ P,GETCLS JRST PERRET TRO MCHG!NEEDCL PUSHJ P,FLSHLN ;FLUSH LINE HLRZM A,LINING ;SAVE ONE END HERE HLLI A, ;CLEAR LEFT HALF PUSHJ P,DELWIR ;DELETE THE WIRE SKIPN A,LINING ;NOW THIS ONE POPJ P, DELWIR: FETCH(C,A,PNEB) JUMPE C,DELWR1 SETZ TTT, DELWRA: MOVEI T,2 DELWRB: XCT (T)[HLRZ TT,(C) HRRZ TT,1(C) HLRZ TT,1(C)] JUMPE TT,DELWRC JUMPN TTT,CPOPJ ;LEAVE IF SECOND MOVE TTT,TT DELWRC: SOJGE T,DELWRB HRRZ C,(C) JUMPN C,DELWRA ;DELETE WIRE BETWEEN A,C MOVE C,TTT DELWR1: FETCHL(TT,A,PBIT) TLNN TT,FEEDTH ;FEED THROUGH? JRST DELWR2 JUMPN C,CPOPJ ;2 THINGS, QUIT HERE FETCH(C,A,PFEED) ;UNFEEDTHRU THE TWO POINTS CLEAR(A,PFEED) CLRBIT(FEEDTH,TTT,A,PBIT) CLEAR(C,PFEED) CLRBIT(FEEDTH,TTT,C,PBIT) DELWR2: CAMN A,LINING SETZM LINING ;NOTE WE DELETED THIS ONE PUSH P,C TRZ TFLG MOVE B,A PUSHJ P,DELPNL POP P,A JUMPN A,DELWIR POPJ P, ;PUT MIDPOINT IN LINE (PC) BENDL: PUSHJ P,GETCLS JRST PERRET MOVE T,CURSE ;WHERE TO PUT MIDPOINT PUSHJ P,BENDLP JFCL POPJ P, ;ENTER HERE WITH LOCATION YOU WISH MIDPOINT TO BE PLACED IN T ;A = POINT1,,POINT2 ;T = WHERE TO PUT MIDPOINT BENDLP: PUSH P,A PUSHJ P,PNTPUT GETFS(E) SETZM (E) SETZM 1(E) STORE(E,D,PNEB) PUSH P,D HLRZ A,-1(P) HRRZ B,-1(P) FETCH(B,B,PNEB) PUSHJ P,FNDLNK ;FIND LINK FROM POINT2 TO POINT1 JRST [ OUTSTR[ASCIZ/MOBY LOSSAGE AT BENDL! /] SUB P,[2,,2] POPJ P,] TRO MCHG MOVE D,(P) XCT (T)PUTAB ;LINK POINT2 TO NEW-POINT FETCH(B,A,PNEB) HRRZ A,-1(P) ;FIND LINK FROM POINT1 TO POINT2 PUSHJ P,FNDLNK PUSHJ P,FUCKUP ;LOSE BIG IF NOT FOUND POP P,D XCT (T)PUTAB ;LINK POINT1 TO NEW-POINT FETCH(T,D,PNEB) MOVE A,(P) MOVEM A,1(T) ;LINK NEW-POINT TO BOTH MOVE T,LSTPNT PUSHJ P,SCLOSE ;SET CLOSES POP P,(P) ;LOSE OLD CLOSEST MOVEI T,PNTM ;MUST BE IN POINT MODE FOR THIS PUSHJ P,CHNGMD PUSHJ P,DOPMOV ;START MOVING MID-POINT MOVEI T,BIGPG AOS (P) ;INDICATE SUCCESS JRST HYDPOG ;ATTACH POINT TO POINT (PC) PATT: TRZE INMOV JRST [ MOVE A,CLOSES ;USE THE ONE WE WERE MOVING JRST PATT1] TRNN INLIN PUSHJ P,GETCLS JRST PERRET PATT1: MOVEM A,LINING TRO INLIN!NEEDCL PUSHJ P,GETCLS JRST [ TRZ INLIN TRO NEEDCL JRST PERRET] FETCH(T,A,PXY) FETCHL(TT,A,PBIT) TLNE TT,ISPIN!CPIN!FEEDTH JRST [ EXCH A,LINING ;TRY IT THE OTHER WAY FETCHL(TT,A,PBIT) TLNN TT,ISPIN!CPIN!FEEDTH JRST .+1 OUTSTR[ASCIZ/SORRY, BOTH ARE PINS OR FEEDTHROUGHS! /] TRZ INLIN TRO NEEDCL POPJ P,] TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/ THIS ONE?/] TRZ INLIN MOVEM T,STARLOC MOVEI T,UPSTAR MOVEM T,SPDISP MOVE T,[ASCID/AP/] MOVEM T,SPMODT MOVEI T,SPM PUSHJ P,TCHNGM PUSHJ P,YORN JFCL JFCL TRO NEEDCL PUSHJ P,RCHNGM CAIE C,"Y" CAIN C,"y" CAIA POPJ P, PATTL: HRLM A,LINING ;POINT-TO-MOVE,,POSSIBLE PIN HRRZ A,LINING HLRZ C,LINING FETCH(D,C,PNEB) JUMPE D,NOMOVL MOVE T,D TLOOPS: SKIPE 1(T) ;CHECK FOR ANY NEIGHBORS TO COPY JRST TLOOP0 SKIPN T,(T) JRST NOMOVL TLNN T,-1 JRST TLOOPS TLOOP0: CLEAR(C,PNEB) ;MOVE NEIGHBORS ONTO IMMOVABLE POINT FETCH(T,A,PNEB) JUMPE T,[STORE(D,A,PNEB) ;WERE NONE, JUST STORE IN JRST TLOOP9] MOVE TT,T HRRZ T,(T) ;NCONC TO OLD NEIGHBOR LIST JUMPN T,.-2 HRRM D,(TT) ;NOW FIND ANY SEGMENTS BETWEEN THE TWO ATTACHING POINTS TLOOP9: MOVE C,D ;OLD NEIGHBOR BLOCK HRRZ D,LINING ;KEPT POINT HLRZ A,LINING ;POINT GOING AWAY TLOOP: MOVEI TTT,2 TLOOP1: XCT (TTT)[HLRZ B,(C) HRRZ B,1(C) HLRZ B,1(C)] JUMPE B,TLOOPE CAMN B,D ;DID THESE 2 POINT TO EACH OTHER? JRST [ XCT (TTT)[HRRZS (C) ;YES, FLUSH THAT SEGMENT HLLZS 1(C) HRRZS 1(C)] FETCH(B,B,PNEB) ;FIND BACK LINK PUSHJ P,FNDLNK JRST TLOOPE XCT (T)[HRRZS (B) HLLZS 1(B) HRRZS 1(B)] JRST TLOOPE] FETCH(B,B,PNEB) ;CLOBBER BACK LINK THAT WAS TO OLD POINT PUSHJ P,FNDLNK CAIA XCT (T)PUTAB ;MAKE IT POINT TO KEPT POINT TLOOPE: SOJGE TTT,TLOOP1 HRRZ C,(C) JUMPN C,TLOOP NOMOVL: HRRZ A,LINING ;KEPT POINT HLRZ B,LINING ;GOING AWAY POINT FETCH(T,A,PTXT) ;ANY TEXT ALREADY ON KEPT POINT JUMPN T,LOSTXT ;YES FETCH(T,B,PTXT) STORE(T,A,PTXT) CLEAR(B,PTXT) LOSTXT: HLRZ B,LINING PUSHJ P,DELPNL SETZM LINING TRO MCHG!NEEDCL TRZ INLIN!INMOV POPJ P, ;ATTACH POINT TO LINE (PC) LATT: MOVE A,CLOSES TRZE INMOV ;STOP MOVING JRST INATT SETZM SAVP TRNE INLIN JRST INATT0 PUSHJ P,GETCLS JRST PERRET INATT: MOVEM A,SAVP ;THIS IS POINT WE WILL ATTACH TO JUMPE A,INATT0 FETCHL(T,A,PBIT) TLNE T,ISPIN!CPIN ;NOT THESE PLEASE! JRST PERRET INATT0: MOVEI T,LINM PUSHJ P,TCHNGM TRO NEEDCL PUSHJ P,GETCLS JRST [ PUSHJ P,RCHNGM JRST ATTERR] TLNN M,DSKACT!MACACT OUTSTR[ASCIZ/THIS ONE/] MOVEI T,UPSTAL MOVEM T,SPDISP MOVE T,[ASCID/AL/] MOVEM T,SPMODT MOVEI T,SPM ;SPECIAL POINTER MODE PUSHJ P,TCHNGM MOVE T,IPOINT MOVEM T,STARLOC ;THIS IS LOC OF STAR PUSHJ P,YORN JFCL JFCL PUSHJ P,RCHNGM ;GET BACK OLD MODE SKIPN T,SAVP SKIPA T,IPOINT MOVE T,1(T) CAIE C,"y" CAIN C,"Y" PUSHJ P,BENDLP JRST ATTERR TRZ INMOV SKIPN A,SAVP JRST LATTL MOVEM A,LINING MOVE A,CLOSES EXCH A,LINING ;MOVE POINT TO LINE! JRST PATTL ;PATT DOES THE REST LATTL: MOVE A,CLOSES TRZ INLIN TRO NEEDCL JRST PNMNS1 ;MINUS TO MIDPOINT ATTERR: SKIPN SAVP TRO INLIN!NEEDCL TRZ INMOV JRST PERRET >;MPC