mirror of
https://github.com/PDP-10/its.git
synced 2026-05-23 05:52:16 +00:00
1900 lines
51 KiB
Plaintext
1900 lines
51 KiB
Plaintext
;<WIRELIST>WLROUT.FAI.16, 6-NOV-75 17:35:06, EDIT BY HELLIWELL -*- MODE:MIDAS -*-
|
||
SUBTTL DEC ROUTER SUBRS
|
||
;ROUTER PINSIN
|
||
;PINSIN - PINS READ IN
|
||
;READS IN THE PINS FOR ONE RUN AND COMPUTES THE DISTANCES
|
||
;BETWEEN EACH PAIR OF PINS.
|
||
|
||
ROUTE,<
|
||
PINSIN: SETZM SCTR ;SET TO LOOK FOR SOURCE AND CABLE PINS
|
||
SETZM HNDOSW ;CLEAR THE HAND ORDERING SWITCH
|
||
SKIPLE ORDFLG ;HAND ORDERING BY NUMBER?
|
||
SETOM HNDOSW ;YES, FLAG IT
|
||
|
||
PINSI2: MOVEI B,1 ;INDEX FOR MAKING DISTANCE TABLE
|
||
PINSI3: SETZ C, ;COMPUTE DISTANCES TO PIN C(B)
|
||
;FOR PINS 0 .LE. N .LE. C(B)-1
|
||
PINSI4: MOVE A,B
|
||
PUSH P,B
|
||
PUSH P,C
|
||
MOVSI T,RERPIN ;CHECK FOR PIN IN ERROR
|
||
TDNN T,PNTBL(B)
|
||
TDNE T,PNTBL(C)
|
||
JRST PINSIL ;Route pin at far end of run
|
||
MOVE A,PNTBL1(B)
|
||
MOVE C,PNTBL1(C)
|
||
PUSHJ P,DSTCLC ;CALCULATE DISTANCE (IN WW FILE)
|
||
PINSIM: POP P,C
|
||
POP P,B
|
||
PUSHJ P,MAKDST
|
||
CAILE B,1(C) ;DONE THIS ROW?
|
||
AOJA C,PINSI4 ;NO, GET NEXT DISTANCE
|
||
MOVE C,NUMPIN
|
||
CAILE C,(B) ;DONE THIS TABLE?
|
||
AOJA B,PINSI3 ;NO, MAKE NEXT ROW LONGER
|
||
POPJ P,
|
||
|
||
MAKDST: MOVE E,C ;GET S/C COLUMNS FOR BOTH PINS
|
||
LDB TTTT,ORDPTR ;SAVE THE ORDER CODE
|
||
LDB TTT,SCPTR
|
||
MOVE E,B
|
||
LDB D,ORDPTR ;GET THE ORDER CODE FOR THE OTHER PIN
|
||
SUB TTTT,D ;AND SAVE THE DIFFERENCE
|
||
LDB D,SCPTR
|
||
CAMN D,TTT ;LETTERS THE SAME?
|
||
JRST SCHECK ;YES, CHECK IF LEGAL
|
||
ADD D,TTT ;NO, ADD IN FUDGE FACTOR
|
||
ADD G,FUDGE(D)
|
||
PINSI5: MOVMS TTTT ;GET MAGNITUDE OF ORDER CODE DELTA
|
||
SKIPE NOHND
|
||
JRST PINSIG
|
||
SKIPE HNDOSW ;HAND ORDERING?
|
||
HRL G,TTTT ;YES, USE HAND ORDER DELTA
|
||
PINSIG: MOVEM G,@PTRTBL-1(B) ;DEPOSIT IN TRIANGULAR TABLE
|
||
POPJ P, ;VIA PHANTOM DOUBLE INDEX
|
||
|
||
SCHECK: CAIN D,4 ;CHECK FOR MULTIPLE Sources'S
|
||
SETOM SCTR ;SET ERROR FLAG
|
||
CAIN D,1 ;CHECK FOR MULTIPLE Term'S
|
||
ADD G,[XWD 700,0] ;YES, ADD IN T-TO-T FUDGE FACTOR
|
||
JRST PINSI5 ;SAVE DISTANCE
|
||
|
||
FUDGE_.-1 ;TABLE OF DISTANCE FUDGE FACTORS
|
||
;SO THAT SELECTED PINS GO TO THE ENDS
|
||
XWD 400,0 ;T TO ORDINARY
|
||
XWD 100,0 ;C TO ORDINARY
|
||
XWD 400,0 ;C TO T
|
||
XWD 100,0 ;S TO ORDINARY
|
||
XWD 400,0 ;S TO T
|
||
XWD 300,0 ;S TO C
|
||
|
||
PINSIL: MOVSI G,10000 ;KLUDGE A LARGE DISTANCE ON ERROR
|
||
JRST PINSIM
|
||
; TOP LEVEL
|
||
ROUTER: PUSHJ P,PINSIN ;MAKE DISTANCE TABLE
|
||
IFN 0,< MOVE A,BAYNUM
|
||
SKIPG B,IBWLNK(A) ;CHECK FOR ANOTHER BAY TO BE ROUTED
|
||
JRST ROUTR1 ;NONE, GO ROUTE THIS ONE
|
||
PUSH P,SCTR ;SAVE FLAGS
|
||
PUSH P,NUMPIN
|
||
PUSH P,BAYNUM
|
||
PUSHJ P,LINKER ;INITIALIZE THE OTHER BAY
|
||
PUSHJ P,PINSIN
|
||
POP P,BAYNUM
|
||
POP P,A ;MERGE THE 2 PIN COUNTS
|
||
POP P,B ;MERGE THE 2 SCTR FLAGS
|
||
IORM B,SCTR
|
||
JUMPL A,ROUTR1 ;CHECK FOR FIRST BAY EMPTY
|
||
SETCMM A
|
||
ADDM A,RUNPTR ;RESTORE ORIGINAL RUN POINTER
|
||
MOVNS A
|
||
ADDM A,NUMPIN
|
||
CAMLE A,NUMPIN ;CHECK FOR SECOND BAY EMPTY
|
||
JRST ROUTR1
|
||
MOVE B,CBDELT ;ADJUST BOUNDRIES OF SECOND BAY
|
||
ASH B,-11
|
||
ADDM B,BNDRY1
|
||
ADDM B,BNDRY3
|
||
ADD A,RUNPTR ;COMPUTE CROSS-BAY DISTANCES
|
||
MOVE B,A
|
||
|
||
ROUTR2: MOVE C,RUNPTR
|
||
HLRZ T,PNTBL(B) ;GET COORD OF PIN IN SECOND BAY
|
||
ADD T,CBDELT ;ADJUST RELATIVE TO THE FIRST BAY
|
||
|
||
ROUTR3: HLRZ TT,PNTBL(C) ;GET COORD OF PIN IN FIRST BAY
|
||
PUSHJ P,CBDST ;GET WIRING DISTANCE
|
||
PUSHJ P,MAKDST ;ADJUST AND SAVE
|
||
CAILE A,1(C)
|
||
AOJA C,ROUTR3
|
||
MOVE C,NUMPIN
|
||
ADD C,RUNPTR
|
||
CAMLE C,B
|
||
AOJA B,ROUTR2
|
||
>;END IFN 0
|
||
ROUTR1: SKIPG A,NUMPIN ;DETECT 0 AND 1 PIN RUNS
|
||
POPJ P, ;JRST RUNERR
|
||
AOS (P) ;SKIP TO INDICATE WINNING RUN
|
||
AOS A
|
||
SKIPL ORDFLG ;HAND ORDERING BY ORDER PIN?
|
||
JRST PHS1 ;NO,ENTER ROUTING ALGORITHMS.
|
||
; BY ORDER PIN
|
||
; THE FOLLOWING ROUTINE ORDERS THE RUN BY ORDER PIN ENTRIES.THE
|
||
;WIRING PATH IS DEFINED BY THE POINTER TABLE-RUNLST AND POINTERS
|
||
;CORRESPONDING TO THE END PINS OF THE RUN ARE SAVED IN 'ENDS',THUS
|
||
;DEFINING THE WIRE PATH IN THE SAME MANNER AS THE ROUTING ALGORITHMS.
|
||
;AFTER DEFINING THE PATH,A POPJ IS EXECUTED TO BY PASS THE REST OF THE ROUTER.
|
||
; IF THE RUN IS NOT WELL DEFINED BY THE ORDER PINS,HAND ORDERING IS IGNORED
|
||
;AND THE RUN IS GIVEN TO THE ROUTING ALGORITHMS FOR PATH DEFINITION.
|
||
|
||
IFN 0,<
|
||
ILOOP0: SETCM B,NUMPIN ;INIT THE ORDER PIN ROUTING LOOPS.
|
||
HRLZS B ;B IS THE OUTER LOOP INDEX.
|
||
HRR B,RUNPTR
|
||
MOVEM B,INITLP ;SAVE FOR INIT OF INNER LOOPS.
|
||
SETOM F ;BLANK ORDER PIN FLAG.
|
||
ILOOP1: MOVE D,PNTBL(B) ;GET PINTBL INDEX FOR PIN I.
|
||
MOVE T,PINTBL(D) ;SAVE PIN NAME FOR PIN I.
|
||
SKIPE D,PINTB1(D) ;IS THERE AN ORDER PIN ENTRY?
|
||
JRST JLOOP0 ;YES,MOVE ON TO THE NEXT LOOP.
|
||
AOJG F,PHS1 ;NO,THIS CAN HAPPEN ONLY ONCE.
|
||
;HOWEVER THERE MUST BE ONE BLANK.
|
||
HRROS RUNLST(B) ;1ST BLANK ORDER PIN,THIS IS AN END.
|
||
HRLM B,ENDS ;PLACE POINTER 'I' IN ENDS.
|
||
JRST KLOOP0 ;BYPASS J LOOP.
|
||
JLOOP0: MOVE E,INITLP ;INIT LOOP TO SEARCH FOR PIN 'J',
|
||
;A PIN NAME MATCHING THE ORDER PIN.
|
||
JLOOP1: CAMN E,B ;IS PIN J REALLY PIN I?
|
||
JRST JLOOP2 ;YES,BYPASS.
|
||
HRRZ C,PNTBL(E) ;GET THE PIN NAME FOR J.
|
||
CAMN D,PINTBL(C) ;IS PIN J ORDER PIN I?
|
||
JRST JLOOP3 ;YES,TERMINATE SEARCH.
|
||
JLOOP2: AOBJN E,JLOOP1 ;NO,SET UP INDEX FOR NEW PIN J.
|
||
JRST PHS1 ;NOMATCHES,IGNORE HAND ORDERING.
|
||
JLOOP3: HRLM E,RUNLST(B) ;SAVE J AS I'S NEIGHBOR.
|
||
HRRM B,RUNLST(E) ;SAVE I AS J'S NEIGHBOR.
|
||
KLOOP0: MOVE E,INITLP ;INIT LOOP TO SEARCH FOR ORDER PIN K.
|
||
KLOOP1: CAMN E,B ;IS PIN K REALLY PIN I?
|
||
JRST KLOOP2 ;YES,BYPASS.
|
||
HRRZ C,PNTBL(E) ;NO,GET INDEX FOR PIN K.
|
||
CAMN D,PINTB1(C) ;IS ORDER PIN I ORDER PIN K?
|
||
JRST PHS1 ;YES,DUPLICATE ORDER PINS,IGNORE HND ORDER.
|
||
CAMN T,PINTB1(C) ;IS PIN I THE SAME AS ORDER PIN K?
|
||
JRST ILOOP2 ;YES,TERMINATE SEARCH.
|
||
KLOOP2: AOBJN E,KLOOP1 ;SET INDEX FOR NEXT ORDER PIN.
|
||
MOVE D,RUNLST(B) ;NO MATCHES FOUND,CAN ONLY HAPPEN ONCE.
|
||
TRNE D,777777 ;IS THIS THE FIRST TIME?
|
||
JRST PHS1 ;NO,TERMINATE HAND ORDERING.
|
||
HRRM B,ENDS ;YES,THIS MUST BE AN END PIN.
|
||
HLLOS RUNLST(B) ;DESIGNATE AS AND END PIN.
|
||
ILOOP2: AOBJN B,ILOOP1 ;TRY NEXT PIN AS THE I PIN.
|
||
SKIPGE F ;ALL DONE WITH APPARENT SUCCESS.
|
||
JRST PHS1 ;NO END PINS?-FORGET IT!
|
||
SETOM HNDOSW ;RUN OK ACCEPT AS HAND ORDERED.
|
||
POPJ P, ;EXIT TO BYPASS ROUTING ALGORITHMS.
|
||
>;IFN 0
|
||
; PHS1
|
||
;PHS1 - PHASE ONE OF RUN OPTIMIZING
|
||
;PUTS PIN 0 INTO THE RUN, THEN FINDS THE PIN NEAREST PIN 0 AND
|
||
;PUTS THAT INTO THE RUN. FROM THEN ON, IT KEEPS TRACK OF THE TWO
|
||
;END PINS OF THE RUN. THE PIN NEAREST EITHER OF THE TWO END PINS
|
||
;IS ALWAYS THE NEXT PIN PUT INTO THE RUN. THE PROCESS CONTINUES
|
||
;UNTIL THE RUN INCLUDES ALL THE PINS. THIS RUN FORMS THE FIRST
|
||
;APPROXIMATION FOR PHASE TWO WHICH FOLLOWS.
|
||
|
||
;THE RUN TABLE HAS ONE WORD FOR EACH PIN IN THE RUN. THE RIGHT
|
||
;AND LEFT HALVES OF THIS WORD HAS THE PIN NUMBERS OF THE TWO
|
||
;NEIGHBORING PINS. -1 MEANS THE END OF THE RUN.
|
||
|
||
PHS1: SETZM ENDS ;SET BOTH ENDS OF RUN TO FIRST PIN
|
||
SETOM RUNLST ;SET BOTH NEIGHBORS OF FIRST PIN TO ENDS
|
||
MOVE B,[XWD RUNLST,RUNLST+1] ;WIPE OUT THE WHOLE RUN TABLE
|
||
BLT B,RUNLST+MAXP-1
|
||
SETZM TOTDST ;SET CUMULATIVE DISTANCE TO 0
|
||
SETZM LSTLNG ;CLEAR COUNT OF NO. PINS IN RUN
|
||
SETOM PHSSW ;SET SWITCH TO EXAMINE 1 END
|
||
MOVSI TTT,ROUMRK ;BIT FOR MARKING PINS IN THE RUN
|
||
ORM TTT,PNTBL ;MARK FIRST PIN
|
||
|
||
PHS10: HRLOI T,377777 ;SET MIN LENGTH TO INFINITY
|
||
MOVEM T,LNGMIN
|
||
HRRZ T,ENDS ;GET ONE END OF THE RUN
|
||
|
||
PHS11: MOVEI TT,-1(A) ;INDEX THROUGH ALL PINS
|
||
PHS13: TDNE TTT,PNTBL(TT) ;THIS PIN MARKED YET?
|
||
JRST PHS12 ;YES, SKIP TO NEXT PIN
|
||
MOVE B,T ;GET THE TWO INDICES
|
||
MOVE C,TT
|
||
CAMG B,C ;SMALLER INDEX MUST BE IN C
|
||
EXCH B,C
|
||
MOVE B,@PTRTBL-1(B) ;GET DISTANCE BETWEEN PINS
|
||
CAML B,LNGMIN ;IS IT SHORTER?
|
||
JRST PHS12 ;NO, TRY ELSEWHERE
|
||
SETZM LSTEMP ;FLAG NEW WINNER FOUND
|
||
MOVEM B,LNGMIN ;YES, SAVE NEW RECORD
|
||
MOVEM TT,LSTCND ;SAVE CANDIDATE FOR INCLUSION
|
||
|
||
PHS12: SOJGE TT,PHS13 ;TRY NEXT PIN (DONE?)
|
||
SOS B,PHSSW ;PERHAPS, CHECK SWITCH
|
||
AOJN B,PHS14 ;DONE THIS PASS?
|
||
SETOM LSTEMP ;NO, HALF DONE. FLAG 1ST HALF
|
||
HLRZ T,ENDS ;GET OTHER END OF LIST
|
||
JRST PHS11 ;REPEAT
|
||
|
||
PHS14: MOVE T,LSTCND ;GET THE WINNER
|
||
ORM TTT,PNTBL(T) ;MARK IT
|
||
SKIPL LSTEMP ;WINNER CONNECTED TO RIGHT END?
|
||
MOVSS ENDS ;NO, MAKE IT THE RIGHT END
|
||
HRL T,ENDS ;GET OLD END
|
||
HRRM T,ENDS ;SAVE NEW END
|
||
PUSHJ P,CNEND ;CONNECT POINTERS TO NEIGHBORS
|
||
MOVE B,LNGMIN ;ADD LENGTH INTO CUMULATIVE TOT
|
||
ADDM B,TOTDST
|
||
SETZM PHSSW ;RESET SWITCH
|
||
AOS B,LSTLNG ;COUNT PINS IN RUN
|
||
CAILE A,1(B) ;DONE PHASE 1?
|
||
JRST PHS10 ;NO, REPEAT AD INFINITUM
|
||
SKIPN FASRAY ;CHEAT, DON'T DO FULL ROUTING
|
||
CAIG A,3 ;FILTER OUT 2 &3 PIN RUNS.
|
||
POPJ P,
|
||
; PHS2
|
||
;PHS2 - PHASE TWO
|
||
;EACH PIN, STARTING WITH PIN 0, IS IN TURN TAKEN OUT OF
|
||
;THE RUN THUS LEAVING TWO DISCONNECTED PIECES IN GENERAL.
|
||
; FIRST A NEW SITE FOR THE CHOSEN PIN IS LOOKED FOR BY
|
||
;SQUEEZING THE PIN BETWEEN EACH OF THE REMAINING PAIRS
|
||
;OF PINS. THEN THE TWELVE WAYS OF RECONNECTING THE PIN
|
||
;AND THE TWO PIECES ARE TRIED. OF ALL THESE, THE MINIMUM
|
||
;CONFIGURATION IS PRESERVED AND THE PROCESS IS REPEATED
|
||
;ON PIN N+1. A PASS TERMINATES WHEN ALL PINS HAVE BEEN
|
||
;THUS EXAMINED. IF ANY IMPROVEMENTS WERE DISCOVERED,
|
||
;ANOTHER PASS IS MADE.
|
||
|
||
PHS2: SETOM IMPRV3 ;SET FLAG TO GO THRU PHASE 3
|
||
PHS2A: MOVE A,NUMPIN ;START THE PASS WITH HIGHEST PIN
|
||
SETZM IMPRV ;CLEAR THE IMPROVEMENT FLAG
|
||
|
||
PHS29: HRRZ T,ENDS ;START AT ONE END OF THE RUN
|
||
CAMN T,A ;ALREADY FOUND THE REMOVED PIN?
|
||
HLRZ T,ENDS ;YES, SO START AT THE OTHER END
|
||
HRLOI B,77777 ;SET BEST DISTANCE TO INFINITY
|
||
MOVEM B,MINLNG
|
||
MOVNI TTT,1 ;T HAS THIS PIN - TT HAS
|
||
;NEXT PIN - TTT HAS PREVIOUS PIN
|
||
|
||
PHS26: HRRE TT,RUNLST(T) ;FIND NEXT PIN
|
||
CAMN TT,TTT ;FOUND PREV. PIN INSTEAD?
|
||
HLRE TT,RUNLST(T) ;YES, SO TAKE OTHER PIN
|
||
CAMN TT,A ;FOUND THE REMOVED PIN?
|
||
JRST PHS20 ;YES, THE ENDS OF THE 2 PIECES
|
||
;ARE NOW IDENTIFIABLE
|
||
SKIPGE C,TT ;FOUND THE FAR END OF THE RUN?
|
||
JRST PHS21 ;YES, GO CLEAN UP
|
||
MOVE B,T ;COMPUTE DISTANCE COST IF PIN
|
||
;SQUEEZED IN HERE
|
||
CAMG B,C
|
||
EXCH B,C
|
||
MOVN D,@PTRTBL-1(B) ;DISTANCE SAVED BY BREAKING
|
||
;CONNECTION BETWEEN NEIGHBORS
|
||
PUSHJ P,PHS22 ;ADD IN 2 NEW LEGS GENERATED
|
||
CAML D,MINLNG ;MORE BETTERER??
|
||
JRST PHS24 ;NO, GO TO NEXT PAIR
|
||
MOVEM D,MINLNG ;YES, SAVE NEW RECORD
|
||
HRRM T,BSTSPT ;SAVE THIS PAIR
|
||
HRLM TT,BSTSPT
|
||
|
||
PHS24: MOVE TTT,T ;THIS PIN BECOMES PREV. PIN
|
||
MOVE T,TT ;NEXT PIN BECOMES THIS PIN
|
||
JRST PHS26 ;REPEAT
|
||
; PHS22, PHS20
|
||
;PHS22 - SUBROUTINE FOR PHASE 2
|
||
;ADDS UP THE DISTANCES FOR THE TWO LEGS PUT IN WHEN A PIN
|
||
;IS SQUEEZED IN BETWEEN TWO NEIGHBORING PINS
|
||
|
||
PHS22: MOVE C,T ;ADD IN LEG FROM THIS PIN
|
||
PUSHJ P,PHS221
|
||
MOVE C,TT ;ADD IN LEG FROM NEXT PIN
|
||
PHS221: MOVE B,A ;GET OTHER INDEX
|
||
CAMG B,C
|
||
EXCH B,C
|
||
ADD D,@PTRTBL-1(B) ;ADD IN APPROPRIATE DISTANCE
|
||
POPJ P, ;RETURN
|
||
|
||
;PHS20 - A PIECE OF PHASE 2 LOGIC
|
||
;COMES HERE WHEN THE FIRST OF THE TWO DISCONNECTED PIECES IS
|
||
;SCANNED. AT THIS POINT, BUT NOT BEFORE, THE FOUR ENDS OF THE
|
||
;TWO PIECES ARE IDENTIFIABLE. THE MINIMUM WAY TO HOOK
|
||
;UP THE TWO PIECES WITHOUT INVOLVING THE REMOVED PIN IS FOUND
|
||
|
||
PHS20: MOVE TT,RUNLST(A) ;THE NEIGHBORS OF THE REMOVED PIN
|
||
;ARE THE CUT ENDS OF THE 2 PIECES
|
||
CAIN T,(TT) ;MAKE THE END ALREADY FOUND
|
||
;BE IN THE LEFT HALF
|
||
MOVSS TT
|
||
TRNE TT,400000 ;IS THE SELECTED PIN AN END?
|
||
JRST PHS201 ;YES, WE ARE DONE
|
||
MOVE TTT,ENDS ;GET THE REAL ENDS
|
||
ROTC TT,22 ;PUT APPROPRIATE ENDS TOGETHER
|
||
MOVEM TT,SEG1 ;SAVE ENDS OF 1ST SEGMENT
|
||
MOVEM TTT,SEG2 ;LIKEWISE THE 2ND SEGMENT
|
||
PUSHJ P,PHS25 ;FIND THE MINIMUM LINK TO
|
||
;HOOK UP THE TWO PIECES
|
||
MOVEM D,LNKDST ;SAVE THE RESULT
|
||
MOVEI D,0
|
||
PUSHJ P,PHS23 ;FIND THE DISTANCE SAVED BY
|
||
;CUTTING THE CHOSEN PIN OUT OF
|
||
;THE RUN
|
||
MOVEM D,SUBTOT ;SAVE THIS RESULT
|
||
HRRZ T,TT ;CONTINUE TO THE OTHER SEGMENT
|
||
MOVE TTT,A
|
||
JRST PHS26
|
||
; PHS201
|
||
;PHS201 - A PIECE OF PHASE 2 LOGIC
|
||
;COME HERE WHEN THE SELECTED PIN IS AT AN END
|
||
|
||
PHS201: SETZB D,LNKDST ;REMOVING SELECTED PIN FORM 1 PIECE
|
||
PUSHJ P,PHS23 ;FIND DISTANCE SAVED BY REMOVAL
|
||
MOVEM D,SUBTOT ;SAVE THE GAIN
|
||
HRRZ B,ENDS ;TRY THIS PIN AT THE OTHER END
|
||
CAMN B,A ;OTHER END FOUND?
|
||
MOVSS ENDS ;NO, SO SWAP
|
||
HRRZ B,ENDS ;GET THE OTHER END
|
||
MOVE C,A ;GET THE LENGTH
|
||
CAMG B,C
|
||
EXCH B,C
|
||
MOVE D,@PTRTBL-1(B)
|
||
CAML D,MINLNG ;IS THIS THE LOWEST COST?
|
||
JRST PHS202 ;NO, GO FINISH UP
|
||
MOVEM D,MINLNG ;YES, SAVE NEW PARAMS
|
||
MOVSS D,ENDS ;MAKE IT EASY TO UPDATE ENDS
|
||
HLROM D,BSTSPT ;SAVE NEW LOCATION FOR THE PIN
|
||
|
||
PHS202: MOVE D,MINLNG ;HAVE WE FOUND A REAL IMPROVEMENT?
|
||
CAML D,SUBTOT
|
||
JRST PHS28 ;NO, TRY THE NEXT PIN
|
||
SUB D,SUBTOT ;COMPUTE NEW RUN LENGTH
|
||
ADDM D,TOTDST
|
||
PUSHJ P,TKOUT ;RECONNECT THE RUN
|
||
MOVE B,BSTSPT
|
||
EXCH B,RUNLST(A)
|
||
SKIPL B
|
||
MOVSS B
|
||
HRLM B,ENDS ;UPDATE THE NEW END
|
||
JRST PHS212 ;FINISH UP AND TRY THE NEXT PIN
|
||
; PHS25, PHS23
|
||
;PHS25 - SUBROUTINE FOR PHASE 2
|
||
;FINDS THE MINIMUM PATH FOR CONNECTING THE TWO
|
||
;DISCONNECTED PIECES OF THE RUN
|
||
|
||
PHS25: HRLOI D,377777 ;SET MIN DISTANCE TO INFINITY
|
||
PUSHJ P,PHS252 ;TRY TWO OF THE WAYS TO HOOK UP
|
||
MOVSS TT ;TRY THE OTHER TWO WAYS
|
||
PHS252: PUSHJ P,PHS251 ;HOOK UP ENDS AS THEY STAND
|
||
MOVSS TTT ;TURN SEGMENT 2 AND TRY AGAIN
|
||
|
||
PHS251: HLRZ B,TT ;GET ONE END
|
||
HLRZ C,TTT ;AND THE OTHER
|
||
CAMG B,C
|
||
EXCH B,C
|
||
CAMG D,@PTRTBL-1(B) ;IS THIS LEG SHORTER?
|
||
POPJ P, ;NO, SO RETURN
|
||
MOVE D,@PTRTBL-1(B) ;SAVE THIS DISTANCE
|
||
HRRM B,ENDCON ;SAVE WHICH LINK TO MAKE
|
||
HRLM C,ENDCON
|
||
POPJ P, ;RETURN
|
||
|
||
;PHS23 - SUBROUTINE FOR PHASE 2
|
||
;FINDS THE DISTANCE SAVED BY CUTTING THE SELECTED PIN OUT
|
||
;OF THE RUN
|
||
|
||
PHS23: HLRE C,RUNLST(A) ;GET ONE NEIGHBOR
|
||
SKIPL C ;IGNORE IF IT IS AN END
|
||
PUSHJ P,PHS221 ;GET THAT DISTANCE
|
||
HRRE C,RUNLST(A) ;GET THE OTHER
|
||
JUMPGE C,PHS221 ;GET THAT DISTANCE AND RETURN
|
||
POPJ P, ;UNLESS IT IS AN END
|
||
; PHS21
|
||
;PHS21 - A PIECE OF PHASE 2 LOGIC
|
||
;COME HERE WHEN ALL WAYS TO SQUEEZE BACK THE SELECTED PIN
|
||
;HAVE BEEN TRIED. PHS21 TRIES THE 12 WAYS TO RECONNECT THE
|
||
;TWO PIECES AND THE SELECTED PIN WITHOUT SQUEEZING BETWEEN
|
||
;ALREADY CONNECTED PINS.
|
||
|
||
PHS21: MOVE D,LNKDST ;COMPUTE REAL DISTANCE TO BEAT
|
||
ADDM D,MINLNG
|
||
PUSHJ P,PHS27 ;TRY THE 12 REMAINING PATTERNS
|
||
MOVE D,MINLNG ;GET THE MINIMUM COST
|
||
CAML D,SUBTOT ;COMPARE WITH THE SAVINGS
|
||
JRST PHS28 ;NOT GOOD ENOUGH, TRY AGAIN
|
||
SUB D,SUBTOT ;COMPUTE THE NEW TOTAL LENGTH
|
||
ADDM D,TOTDST
|
||
PUSHJ P,TKOUT ;TAKE OUT THE SELECTED PIN
|
||
MOVE T,ENDCON ;MAKE THE SELECTED BRIDGE
|
||
PUSHJ P,CNEND
|
||
MOVE B,BSTSPT ;SQUEEZE THE PIN BACK IN
|
||
EXCH B,RUNLST(A)
|
||
PUSHJ P,UPDEND ;UPDATE THE NEW ENDS
|
||
SKIPL E,RUNLST(A) ;IS THE NEW CANDIDATE AN END?
|
||
JRST PHS212 ;N0.
|
||
HRRZ D,ENDS ;YES,ADJUST ENDS.
|
||
CAIE D,(E)
|
||
HRLM A,ENDS
|
||
CAIN D,(E)
|
||
HRRM A,ENDS
|
||
PHS212: PUSHJ P,PUTIN
|
||
SETOM IMPRV ;FLAG AN IMPROVEMENT
|
||
; PHS28, UPDEND
|
||
PHS28: SOJGE A,PHS29 ;STEP TO NEXT PIN (DONE?)
|
||
SKIPGE IMPRV ;YES, ANY IMPROVEMENTS?
|
||
JRST PHS2 ;YES, REPEAT THIS PHASE
|
||
SKIPGE IMPRV3 ;SKIP PHASE 3 FOR 2 FAILURES
|
||
PUSHJ P,PHS3 ;NOW SEE WHAT PHASE 3 CAN DO
|
||
AOSN IMPRV3 ;DID PHASE 3 DO ANY GOOD?
|
||
JRST PHS2A ;YES, REDO PHASE 2
|
||
POPJ P, ;DONE, RETURN FOR FINAL OUTPUT
|
||
|
||
;UPDEND - UPDATE ENDS
|
||
;CHECKS THAT THE OLD ENDS OF THE RUN ARE STILL ENDS. IF NOT,
|
||
;IT LOOKS FOR NEWLY GENERATED ENDS IN THE 2 HALVES OF B.
|
||
|
||
UPDEND: MOVE C,[XWD 400000,400000] ;CODE FOR TESTING SIGN
|
||
;BITS OF BOTH HALVES
|
||
PUSHJ P,.+2 ;CHECK ONE OLD END
|
||
MOVSS ENDS ;SWAP ENDS
|
||
HRRZ D,ENDS ;GET ONE END
|
||
TDNE C,RUNLST(D) ;EITHER SIGN BIT ON? IE. IS=END?
|
||
POPJ P, ;YES, RETURN
|
||
UPDEN1: MOVSS B ;NO, CHECK ONE HALF OF B, SWAP
|
||
;TO CHECK OTHER HALF NEXT TIME
|
||
HLRZ E,ENDS ;DONT LET BOTH ENDS BE EQUAL
|
||
CAIE E,(B)
|
||
TDNN C,RUNLST(B) ;IS THIS THE REAL NEW END?
|
||
JRST UPDEN1 ;NO, IT MUST BE THE OTHER HALF
|
||
HRRM B,ENDS ;REPLACE WITH THE NEW END
|
||
POPJ P, ;RETURN
|
||
; PHS27
|
||
;PHS27 - SUBROUTINE FOR PHASE 2
|
||
;IN EFFECT, PHS27 TAKES THE TWO SEGMENTS IN SOME PARTICULAR
|
||
;ORIENTATION, CONNECTS THE TWO PIECES AND THE SINGLE PIN
|
||
;INTO A LOOP, AND THROWS OUT THE LONGEST LINK IN THE LOOP. THEN
|
||
;THE ORIENTATION OF ONE OF THE PIECES IS SWITCHED AND THE PROCESS
|
||
;REPEATED. THE SMALLEST RESULT IS KEPT.
|
||
|
||
PHS27: PUSHJ P,PHS274 ;TRY 2 OF THE 4 ORIENTATIONS
|
||
MOVSS SEG2 ;TRY THE OTHER 2
|
||
PHS274: PUSHJ P,PHS271 ;TRY THIS ORIENTATION
|
||
MOVSS SEG1 ;THEN TRY ANOTHER
|
||
|
||
PHS271: SETZB D,T ;CLR TOT DISTANCE AND MAX
|
||
HLR TT,SEG1 ;CALCULATE FINAL RESULTS IN
|
||
;CASE THIS LINK IS LONGEST
|
||
HLL TT,SEG2
|
||
HRRO TTT,SEG2
|
||
HRRZ C,SEG1 ;CONNECT PIN TO THIS END
|
||
PUSHJ P,PHS272 ;GET DISTANCE AND COMPARE
|
||
HRRZ C,SEG2 ;CONNECT PIN TO OTHER END
|
||
HRRO TTT,SEG1 ;FINAL RESULT IF ...
|
||
PUSHJ P,PHS272 ;GET DISTANCE AND COMPARE
|
||
HLRZ B,SEG1 ;CONNECT 2 ENDS TOGETHER
|
||
HLRZ C,SEG2
|
||
HRR TT,SEG1 ;FINAL RESULTS IF ...
|
||
HRL TT,SEG2
|
||
MOVE TTT,TT
|
||
PUSHJ P,PHS273 ;GET DISTANCE AND COMPARE
|
||
SUB D,T ;SUBTRACT OFF BIGGEST LINK
|
||
CAML D,MINLNG ;IS THIS THE BEST SO FAR?
|
||
POPJ P, ;NO, RETURN
|
||
MOVEM D,MINLNG ;YES, SO SAVE RESULTS
|
||
MOVEM TTTT,ENDCON
|
||
MOVEM G,BSTSPT
|
||
POPJ P, ;RETURN
|
||
|
||
PHS272: MOVE B,A ;PICK UP OTHER INDEX
|
||
PHS273: CAMG B,C ;GET DISTANCE
|
||
EXCH B,C
|
||
ADD D,@PTRTBL-1(B) ;ADD INTO TOTAL
|
||
CAML T,@PTRTBL-1(B) ;BIGGEST SO FAR?
|
||
POPJ P, ;NO SO RETURN
|
||
MOVE T,@PTRTBL-1(B) ;YES, SO SAVE THIS DISTANCE
|
||
MOVEM TT,TTTT ;SAVE RESULT
|
||
MOVEM TTT,G
|
||
POPJ P, ;RETURN
|
||
; TKOUT, PUTIN, CNEND
|
||
;TKOUT - TAKE OUT
|
||
;SUBROUTINE TO CUT A PIN OUT OF THE RUN
|
||
|
||
TKOUT: HLRE B,RUNLST(A) ;PICK UP ONE NEIGHBOR TO CUT OUT
|
||
PUSHJ P,.+2 ;DO IT
|
||
HRRE B,RUNLST(A) ;PICK UP THE OTHER
|
||
JUMPL B,CPOPJ ;DO NOTHING AT AN END
|
||
HRRZ C,RUNLST(B) ;CLOBBER RIGHT HALF?
|
||
CAMN C,A
|
||
HLLOS RUNLST(B) ;YES
|
||
CAME C,A ;CLOBBER LEFT HALF?
|
||
HRROS RUNLST(B) ;YES
|
||
POPJ P, ;RETURN
|
||
|
||
;PUTIN - PUT A PIN BACK IN
|
||
|
||
PUTIN: HLRE B,RUNLST(A) ;GET THE COMPONENTS OF THE
|
||
;BRIDGE TO BREAK
|
||
HRRE C,RUNLST(A)
|
||
PUSHJ P,.+2 ;RECONNECT ONE NEIGHBOR
|
||
EXCH B,C ;DO SAME FOR OTHER NEIGHBOR
|
||
JUMPL B,CPOPJ ;DO NOTHING IF NEIGHBOR IS END
|
||
HRRE D,RUNLST(B) ;CLOBBER RIGHT HALF?
|
||
CAMN C,D
|
||
HRRM A,RUNLST(B) ;YES, SO DO IT
|
||
CAME C,D ;CLOBBER LEFT HALF?
|
||
HRLM A,RUNLST(B) ;YES, SO DO IT
|
||
POPJ P, ;RETURN
|
||
|
||
;CNEND - CONNECT ENDS
|
||
|
||
CNEND: PUSHJ P,CNEND1 ;CONNECT ONE LINK
|
||
MOVSS T ;CONNECT THE OTHER WAY
|
||
CNEND1: SKIPL RUNLST(T) ;END MARKED IN LEFT HALF?
|
||
HLRM T,RUNLST(T) ;NO, SO CLOBBER RIGHT HALF
|
||
SKIPGE RUNLST(T) ;END MARKED IN LEFT HALF?
|
||
HLLM T,RUNLST(T) ;YES, SO CLOBBER IT
|
||
POPJ P, ;RETURN
|
||
; PHS3
|
||
;PHS3 - PHASE 3
|
||
;THE RUN IS BROKEN IN TWO PLACES TO FORM THREE PIECES. THE
|
||
;THREE PIECES ARE THEN RECONNECTED IN ALL 24 POSSIBLE WAYS.
|
||
;ANY WAY THAT PROVIDES A REDUCTION IN RUN LENGTH IS KEPT.
|
||
;THE PROGRAM KEEPS TRACK OF THE ENDS OF THE THREE PIECES
|
||
;AND ONLY CLOBBERS POINTERS WHEN AN IMPROVEMENT IS FOUND.
|
||
|
||
PHS3: SETZM IMPRV3 ;CLEAR THE IMPROVEMENT FLAG
|
||
PHS300: MOVE A,ENDS ;SET UP THE INITIAL 3 SEGMENTS
|
||
HRLM A,SEG1 ;SEG1 IS THE "LEFTMOST" PIN
|
||
HLLM A,SEG3 ;SEG3 CONTAINS THE "RIGHTMOST" PINS
|
||
SETOM C ;DUMMY UP A POINTER FOR THE
|
||
;FIRST ADVANCE
|
||
SETZM MINLNG ;SET NET IMPROVEMENT TO 0
|
||
PUSHJ P,PHS30 ;GO DO ALL THE WORK
|
||
SKIPL A,MINLNG ;WAS AN IMPROVEMENT FOUND?
|
||
POPJ P, ;NO, SO QUIT
|
||
ADDM A,TOTDST ;UPDATE THE TOTAL DISTANCE
|
||
HRRZ B,SEG1 ;REALLY BREAK THE RUN INTO 3
|
||
HLRZ C,SEG2 ;MAKE THE FIRST CUT
|
||
PUSHJ P,DCON
|
||
HRRZ B,SEG2 ;MAKE THE OTHER CUT
|
||
HRRZ C,SEG3
|
||
PUSHJ P,DCON
|
||
MOVE T,LSEG1 ;RECONNECT THE PIECES INTO A LOOP
|
||
HLL T,LSEG2
|
||
PUSHJ P,CNEND
|
||
MOVE T,LSEG2
|
||
HLL T,LSEG3
|
||
PUSHJ P,CNEND ;MAKE THE SECOND LINK
|
||
MOVE T,LSEG3
|
||
HLL T,LSEG1
|
||
PUSHJ P,CNEND ;CLOSE THE LOOP
|
||
MOVE B,DCNECT ;NOW BREAK THE APPROPRIATE LINK
|
||
HRRZ C,ENDS ;START AT A DIFFERENT END NEXT TIME
|
||
CAIN C,(B)
|
||
MOVSS B
|
||
MOVEM B,ENDS ;THIS BREAK FORMS THE NEW ENDS
|
||
HLRZ C,B
|
||
HRRZS B
|
||
PUSHJ P,DCON
|
||
SETOM IMPRV3 ;TELL THE WORLD THE GOOD NEWS
|
||
JRST PHS300
|
||
; PHS32, PHS30
|
||
;PHS32 - A WRAPPED LOOP FOR PHS30
|
||
;PHS30 - A SUBROUTINE FOR PHASE 3
|
||
;PHS30 CYCLES THROUGH A POSSIBLE PAIRS OF PLACES TO BREAK THE
|
||
;RUN. PHS31 IS CALLED TO TRY THE WAYS TO RECONNECT THE PIECES.
|
||
;AS SOON AS PHS31 FINDS AN IMPROVEMENT, PHS30 RETURNS
|
||
;TO THE TOP LEVEL.
|
||
|
||
PHS32: HRRM B,SEG2 ;UPDATE THE END OF SEGMENT 2
|
||
HRRM C,SEG3 ;LIKEWISE SEG3
|
||
CAMG B,C ;FIND THE DISTANCE SAVED BY
|
||
EXCH B,C ;MAKING THE TWO CUTS
|
||
MOVE D,@PTRTBL-1(B)
|
||
HRRZ B,SEG1
|
||
HLRZ C,SEG2
|
||
CAMG B,C
|
||
EXCH B,C
|
||
ADD D,@PTRTBL-1(B)
|
||
MOVEM D,SUBTOT ;SAVE THE SAVINGS
|
||
PUSHJ P,PHS31 ;TRY RECONNECTING
|
||
SKIPGE MINLNG ;IMPROVEMENTS?
|
||
POPJ P, ;YES!
|
||
MOVE A,SEG2 ;SHRINK SEG3, EXPAND SEG2
|
||
HRRZ B,SEG3
|
||
PHS33: HRRE C,RUNLST(B) ;GET THE NEW END FOR SEG3
|
||
CAIN C,(A) ;GOT THE WRONG LINK?
|
||
HLRE C,RUNLST(B) ;YES, GET THE OTHER
|
||
JUMPGE C,PHS32 ;SEG3 SQUEEZED OFF THE END?
|
||
MOVE C,SEG1 ;YES, SO EXPAND SEG1, MAKE SEG2
|
||
MOVS A,SEG2 ;BE EXACTLY 1 PIN, SEG3 BE THE
|
||
;REST
|
||
PHS30: HRRZ B,RUNLST(A) ;GET THE NEW END FOR SEG2
|
||
CAIN B,(C) ;GOT THE WRONG LINK?
|
||
HLRZ B,RUNLST(A) ;YES, GET THE OTHER
|
||
MOVS C,ENDS ;IS SEG2 SHOVED ONTO THE END PIN?
|
||
CAIN B,(C)
|
||
POPJ P, ;YES, SO WE ARE DONE
|
||
HRRM A,SEG1 ;UPDATE THE NEW END OF SEG1
|
||
HRLM B,SEG2 ;LIKEWISE SEG2
|
||
JRST PHS33 ;TIE DOWN THE LOOSE ENDS
|
||
; PHS31
|
||
;PHS31 - SUBROUTINE FOR PHASE 3
|
||
;PHS31 CYCLES THROUGH THE 8 PERMUTATIONS OF THE THREE
|
||
;SEGMENTS BY FLIPPING EACH SEGMENT IN TURN IN A BINARY
|
||
;SEQUENCE. IF A SEGMENT CONTAINS ONLY 1 PIN, THE SEQUENCE
|
||
;IS SHORTENED BY NOT FLIPPING THAT SEGMENT.
|
||
;PHS313 CONNECTS THE RESULTING PERMUTATION INTO A LOOP ANDS
|
||
;FINDS AND THROWS AWAY THE LONGEST LINK.
|
||
|
||
PHS31: MOVE T,SEG1 ;TRY SEG1 UNFLIPPED
|
||
PUSHJ P,PHS311
|
||
MOVSS T ;FLIP SEG1 AND TRY AGAIN
|
||
CAMN T,SEG1 ;BUT NOT IF SEG1 HAS 1 PIN
|
||
POPJ P,
|
||
PHS311: MOVE TT,SEG2 ;TRY SEG2 UNFLIPPED
|
||
PUSHJ P,PHS312
|
||
MOVSS TT ;FLIP SEG2 AND TRY AGAIN
|
||
CAMN TT,SEG2 ;BUT NOT IF SEG2 HAS 1 PIN
|
||
POPJ P,
|
||
PHS312: MOVE TTT,SEG3 ;TRY SEG3 UNFLIPPED
|
||
PUSHJ P,PHS313
|
||
MOVSS TTT ;FLIP SEG3 AND TRY AGAIN
|
||
CAMN TTT,SEG3 ;BUT NOT IF SEG3 HAS 1 PIN
|
||
POPJ P,
|
||
|
||
PHS313: MOVNI E,1 ;SET LONGEST LINK NEGATIVE
|
||
MOVN A,SUBTOT ;START COMPUTING NET GAIN
|
||
MOVEI B,(T) ;GET LENGTH OF 1ST LINK
|
||
HLRZ C,TT
|
||
PUSHJ P,PHS34
|
||
MOVEI B,(TT) ;REPEAT FOR SECOND LINK
|
||
HLRZ C,TTT
|
||
PUSHJ P,PHS34
|
||
MOVEI B,(TTT) ;REPEAT FOR THIRD LINK
|
||
HLRZ C,T
|
||
PUSHJ P,PHS34
|
||
SUB A,E ;THROW AWAY THE LONGEST LINK
|
||
CAML A,MINLNG ;IS THE IMPROVEMENT REALLY?
|
||
POPJ P, ;NO, TRY AGAIN
|
||
MOVEM A,MINLNG ;SAVE THE SAVING
|
||
MOVE A,[XWD T,LSEG1] ;SAVE POINTERS FOR RECONSTRUCTING
|
||
BLT A,DCNECT ;THIS SOLUTION
|
||
POPJ P, ;TRY AGAIN
|
||
; PHS34, DCON
|
||
;PHS34 - SUBROUTINE FOR PHASE 3
|
||
;PHS34 FINDS THE MAXIMUM LINK FOR PHS31 AND ADDS UP THE
|
||
;LINKS AS IT GOES ALONG.
|
||
|
||
PHS34: CAMG B,C ;GET LENGTH OF THE SELECTED LINK
|
||
EXCH B,C
|
||
MOVE D,@PTRTBL-1(B)
|
||
ADD A,D ;CUMULATE THE DISTANCES
|
||
CAMG D,E ;IS THIS THE LONGEST?
|
||
POPJ P, ;NO, DO NOTHING
|
||
MOVE E,D ;YES, SAVE THIS LENGTH
|
||
HRL C,B ;SAVE POINTERS FOR THROWING
|
||
MOVE TTTT,C ;THIS LINK AWAY
|
||
POPJ P,
|
||
|
||
;DCON - DISCONNECT
|
||
;BREAKS THE CONNECTION BETWEEN TWO PINS BY CHANGING THE LINKS
|
||
;TO END POINTERS
|
||
|
||
DCON: PUSHJ P,DCON1 ;BREAK ONE POINTER
|
||
EXCH B,C ;BREAK THE OTHER
|
||
DCON1: HRRZ A,RUNLST(B) ;IS THE LEFT HALF THE VICTIM?
|
||
CAMN A,C
|
||
HLLOS RUNLST(B) ;NO, CLOBBER THE RIGHT HALF
|
||
CAME A,C
|
||
HRROS RUNLST(B) ;YES, CLOBBER THE LEFT HALF
|
||
POPJ P, ;RETURN
|
||
; STORAGE
|
||
;TEMPORARY STORAGE
|
||
|
||
NUMPIN: 0 ;THE HIGHEST PIN NUMBER READ IN
|
||
ENDS: 0 ;LEFT AND RIGHT HALVES CONTAIN
|
||
;THE TWO ENDS OF THE RUN
|
||
TOTDST: 0 ;THE CURRENT LENGTH OF THE RUN
|
||
LSTLNG: 0 ;THE NUMBER OF PINS INCLUDED
|
||
PHSSW: 0 ;A FLAG FOR PHASE 1
|
||
LNGMIN: 0 ;SHORTEST LINK FOUND IN PHASE 1
|
||
LSTCND: 0 ;CURRENT CANDIDATE TO GO NEXT
|
||
;INTO THE RUN
|
||
LSTEMP: 0 ;TEMPORARY FOR LSTCND DURING
|
||
;THE SECOND HALF OF PHASE 1
|
||
IMPRV_PHSSW ;A FLAG FOR PHASE 2
|
||
MINLNG_LNGMIN ;SHORTEST ADDITION TO THE LENGTH
|
||
;OF THE RUN FOUND IN PHASE 2
|
||
BSTSPT_LSTCND ;BEST PLACE TO SQUEEZE IN THE
|
||
;SELECTED PIN
|
||
LNKDST_LSTLNG ;LENGTH ADDED BY BRIDGING
|
||
;ACROSS CUT ENDS
|
||
ENDCON_LSTEMP ;THE TWO ENDS TO BRIDGE ACROSS
|
||
SUBTOT: 0 ;DISTANCE SAVED BY CUTTING THE
|
||
;SELECTED PIN OUT OF THE RUN
|
||
SEG1: 0 ;THE TWO ENDS OF ONE OF THE CUT
|
||
;PIECES
|
||
SEG2: 0 ;THE TWO ENDS OF THE OTHER PIECE
|
||
SEG3_BSTSPT ;THE 3RD SEGMENT FOR PHASE 3
|
||
LSEG1: 0 ;THE RECOMMENDED PERMUTATION
|
||
LSEG2: 0 ;FOR PHASE 3
|
||
LSEG3: 0 ;...
|
||
DCNECT: 0 ;THE UNRECOMMENDED CONNECTION
|
||
IMPRV3: 0 ;IMPROVEMENT FLAG FOR PHASE 3
|
||
INITLP_SUBTOT ;TEMP LOC USED FOR LOOP INIT.
|
||
|
||
SCTR: 0 ;COUNTER FOR NUMBER OF S-PINS
|
||
HNDOSW: 0 ;FLAG FOR HAND ORDERED RUNS
|
||
SCPTR: POINT 3,PNTBL(E),17 ;BYTE PTR TO S/C NUMBER
|
||
ORDPTR: POINT 10,PNTBL(E),14 ;POINTER TO ORDER CODE
|
||
; TABLES
|
||
|
||
;PTRTBL - POINTER TABLE
|
||
;TABLE OF POINTERS FOR PHANTOM DOUBLE INDEXING ON THE
|
||
;TRIANGULAR DISTANCE MATRIX. ACCUMULATOR C MUST HAVE THE
|
||
;SMALLER PIN NUMBER. IF AC HAS THE OTHER PIN NUMBER, REFER
|
||
;TO THE DISTANCE TABLE BY - MOVE X,@PTRTBL-1(AC).
|
||
|
||
PTRTBL: FOR I_0,MAXP-1
|
||
<C,,DISTBL+I*(I+1)/2
|
||
>
|
||
PTRTB1_PTRTBL-1
|
||
|
||
;DISTBL - DISTANCE TABLE
|
||
;A TRIANGULAR MATRIX OF THE LENGTH OF WIRE REQUIRED
|
||
;TO CONNECT ALL POSSIBLE PAIRS OF PINS. ROW 1 HAS DISTANCE
|
||
;BETWEEN PINS 1-0, ROW 2 HAS DISTANCE BETWEEN PINS 2-0, 2-1,
|
||
;ROW 3 HAS 3-0, 3-1, 3-2, ETC.
|
||
;DISTBL SPACE IS TAKEN FROM THE FREE SPACE AT JOBFF.
|
||
|
||
DISTBL: BLOCK MAXP*(MAXP+1)/2 ;ASSEMBLE IN FOR NOW
|
||
|
||
;PNTBL - PIN TABLE
|
||
;CONTAINS PIN POINTERS, "SCT" INFO, ORDER #, AND MARK BIT
|
||
;BITS IN PNTBL WORD USED BY ROUTER
|
||
;RPGPIN__400000 ;THIS IS A POWER OR GROUND PIN, IT IS NOT IN WIRE LIST
|
||
;RERPIN__200000 ;THIS PIN IS IN ERROR IN SOME WAY, DON'T WIRE IT!
|
||
;ROUMRK__100000 ;MARK BIT FOR ROUTER
|
||
;BITS 5-14 ORDER #
|
||
;BITS 15-17 "SCT" CHARS
|
||
;BITS 18-35 PIN POINTER
|
||
|
||
;SCT "CHARS" USED TO FORCE A PIN TO END OF RUN
|
||
; 1 - TERMINATOR PIN
|
||
; 2 - CONNECTOR
|
||
; 4 - SOURCE
|
||
|
||
PNTBL: BLOCK MAXP ;PIN POINTER
|
||
PNTBL1: BLOCK MAXP ;PIN-SPEC (FLAGS+PIN#,,SLOT#)
|
||
|
||
COMMENT
|
||
;BITS USED IN PNTBL1 FOR PIN IDENTIFICATION
|
||
MAPCON__400000 ;THIS IS A CON (MUST BE SIGN BIT)
|
||
MAPSOC__40000 ;THIS IS NOW A POST-LOC, HAS BEEN MAPPED ONTO BOARD
|
||
;777 ;PIN # FOR BODIES IN LEFT HALF
|
||
%%PINN__221100
|
||
$$PINN__777
|
||
;( In some board types, the format for V or G pins is pin# 0, with MAPPWR or MAPGND set.)
|
||
|
||
|
||
;RUNLST - RUN LIST
|
||
;A table of pointers representing the order in which to wire
|
||
;a run. The n'th entry has the two neighbors of pin n (as indices into PNTBL) in
|
||
;the right and left halves. -1 means the end of run.
|
||
|
||
RUNLST: BLOCK MAXP+1
|
||
SUBTTL ROUTER INTERFACE SUBRS
|
||
;SUBROUTINES TO INTERFACE WL WITH ROUTER
|
||
|
||
;WIRSET - ROUTINE TO FILL PNTBL WITH PROPER ENTRIES FOR ROUTING
|
||
;CALL WITH POINTER TO WIRE IN W, FIRST PIN IN H
|
||
;RETURNS
|
||
; ILLEGAL (1 PIN RUN)
|
||
; TOO MANY PINS IN RUN (H IS CURRENT POINT IN PIN LIST)
|
||
|
||
WIRSET: MOVEI G,PNTBL-1 ;PUSHDOWN POINTER FOR PINS
|
||
MOVEI F,MAXP
|
||
WIRST1: FETCH(TTT,H,PBIT)
|
||
TRNE TTT,DUP
|
||
JRST WIRSTD
|
||
PUSHJ P,WIRSTP ;GRONK ONE PIN
|
||
JRST CPOPJ1 ;TABLE FULL
|
||
WIRSTD: FETCH(H,H,NXTP)
|
||
JUMPN H,WIRST1
|
||
WIRSTE: HLRZ G,G
|
||
SOJLE G,CPOPJ ;SKIP TRIVIAL RUNS
|
||
MOVEM G,NUMPIN
|
||
AOS (P)
|
||
JRST CPOPJ1
|
||
|
||
WIRSTP: SOJL F,CPOPJ ;LOSE IF RUN OUT OF SPACE
|
||
PUSHJ P,NAMMAP ;FLAG AND MAP PIN!
|
||
JRST [ TLO TTT,RERPIN ;MARK AS ERROR
|
||
MOVEI T,RFBAD
|
||
MOVEM T,LOSFLG
|
||
JRST .+1]
|
||
PUSH G,TTT ;STORE FLAGS AND PIN POINTER IN SECONDARY TABLE
|
||
MOVEM A,PNTBL1-PNTBL(G)
|
||
JRST CPOPJ1
|
||
|
||
|
||
;NAMMAP - CONVERT A PIN# AND DIP LOCN INTO ACTUAL SOCKET POST
|
||
;NAMMAP - H = PIN
|
||
;PNAMEP - B = BODY, TT = PINN
|
||
;SKIPS IF GOOD PIN
|
||
;A = PIN SPEC (MBIT+PINN,,LOC) OF SOCKET PIN
|
||
;TTT(LH) = ROUTER FLAGS (NONE FOR NOW)
|
||
;TTT(RH) = PTR TO PIN BLOCK
|
||
|
||
NAMMAP: HRRZ TTT,H
|
||
IFN 0,< ;DISABLE FEATURE FOR PUTTING CONNECTORS
|
||
; OR OUTPUTS AT END OF RUN
|
||
FETCH(T,H,PTYP)
|
||
JUMPE T,[FETCH(T,H,PBDY)
|
||
FETCH(T,T,BBIT)
|
||
TRNE T,CBODY
|
||
TLO TTT,2 ;YES
|
||
JRST PNAME]
|
||
FETCH(T,T,DPBIT)
|
||
TRNE T,OUTLD
|
||
TLO TTT,4 ;YES, MARK AS SOURCE
|
||
PNAME:
|
||
>;IFN 0
|
||
FETCH(B,H,PBDY) ;BODY POINTER
|
||
FETCH(TT,H,PINN)
|
||
PNAMEP: FETCH(A,B,BLOC)
|
||
FETCH(T,B,BBIT)
|
||
JUMPE A,CPOPJ ;ANY LOC?
|
||
TRNE T,BWILD ;WILD CONNECTOR?
|
||
POPJ P, ;YES, CAN'T ROUTE
|
||
HRL A,TT
|
||
TRNE T,CBODY ;CON?
|
||
TLO A,MAPCON
|
||
FETCH(B,B,BPAK) ;GET PACKAGE CODE
|
||
PUSH P,TTT ;REMEMBER ROUTER FLAGS, IF ANY
|
||
PUSHJ P,MAPOST ;SKIPS IF SUCCESSFUL
|
||
CAIA
|
||
AOS -1(P)
|
||
POP P,TTT
|
||
POPJ P,
|
||
|
||
RUNFIX: MOVEI A,-1
|
||
HRRZ B,ENDS
|
||
RUNFX1: HLRZ C,RUNLST(B)
|
||
CAME C,A ;DOES LEFT HALF POINT TO LAST?
|
||
MOVSS RUNLST(B) ;NO, SWAP
|
||
MOVE A,B
|
||
HRRE B,RUNLST(B)
|
||
JUMPGE B,RUNFX1 ;CONTINUE TO OTHER END OF RUN
|
||
POPJ P,
|
||
|
||
NOHND: 0
|
||
ORDFLG: 0 ;< 0 BY ORDER PIN
|
||
;= 0 ROUTE
|
||
;> 0 BY ORDER #
|
||
|
||
ZLEVN: 0 ;Z LEVEL FOR RUN
|
||
RAYLVL: 0 ;Z LEVEL USED BY RATHEON ROUTINES
|
||
INCHES: 0 ;TOTAL WIRE LENGTH ACCUMULATED HERE
|
||
WIRELN: 0 ;LENGTH OF WIRE FROM THIS PIN TO NEXT
|
||
NWIRES: 0 ;NUMBER OF WIRES
|
||
NRUNS: 0 ;NUMBER OF WIRES
|
||
TINCHS: 0 ;TOTAL NUMBER OF INCHES OF WIRE
|
||
|
||
WINDSP: 0 ;PLACE TO GO FROM ROUWIR ON WIN
|
||
LOSDSP: 0 ; " LOSE
|
||
FASRAY: 0 ;-1, don't actually run the router
|
||
AUGFORM: 0 ;Print AUGAT card format
|
||
ISRAY: 0 ;INHIBIT PRINTING FOR RAY FILE OUTPUT
|
||
FDSP: 0 ;PLACE TO GO TO FIND PWR OR GND
|
||
FBIT: 0 ;BIT TO TEST IN PIN TYPE BITS OF DIP DEF FOR PWR OR GND
|
||
SOURCE: 0 ;THE CARD PIN FOR THIS ELEM ON CPGLST
|
||
|
||
NOTDON: 0 ; NOT DONE WITH RUN, RUN TOO LONG
|
||
ROUSVH: 0 ;TEMP PLACE IN RUN, IF RUN TOO LONG
|
||
SAVH: 0
|
||
SAVW: 0
|
||
|
||
PGDSP: 0 ;PLACE TO DISPATCH TO FROM PGSPEC
|
||
PGBIT: 0 ;BIT WE ARE TESTING IN PGSPEC
|
||
|
||
CPGLST: 0 ;LIST OF CARD POWER OR GROUNDS WE WILL USE
|
||
LOSFLG: 0 ;THIS RUN IS LOSING, KEEP COLLECTING BUT PRINT AS LOSER
|
||
; ROUTER SETUP, NORMAL RUN
|
||
;ROUWIR - ROUTE AND LIST A WIRE
|
||
;W = WIRE LIST HEADER
|
||
;H = WIRE
|
||
;T = Success-printer
|
||
;TT = Failure-printer
|
||
; T has code for failure
|
||
; 0 Success
|
||
; 1 Run was too long
|
||
; 2 Run was single pin
|
||
;If the run is too long, it is broken into separately routed pieces,
|
||
; and several call to the failure printer are made.
|
||
RFTOOL__1
|
||
RFSING__2
|
||
RFBAD__3
|
||
RFMAX__3
|
||
RFUCK__<1RFSING>+1 ;INTERNAL ERRORS
|
||
|
||
RFERR: [ASCIZ /WIRELISTER BUG/]
|
||
[ASCIZ /RUN TOO LONG/]
|
||
[ASCIZ /SINGLE PIN RUN/]
|
||
[ASCIZ /BAD PINS ON RUN/]
|
||
CHECK RFERR,RFMAX
|
||
|
||
PGZY:
|
||
ROUWR2: MOVEI T,ZLEVPW ;FOR 'WLZ'
|
||
MOVEI TT,ROUNPN ;ERROR MESSAGE
|
||
SETZM FASRAY
|
||
JRST ROUWIR
|
||
|
||
RPGY:
|
||
ROUWR1: MOVEI T,ROUPNT ;FOR 'WLR'
|
||
MOVEI TT,ROUNPN ; ERROR "CAN'T ROUTE RUN"
|
||
SETZM FASRAY
|
||
ROUWIR: MOVEM T,WINDSP
|
||
MOVEM TT,LOSDSP
|
||
MOVEM W,SAVW ;W= "WIRE LIST HEADER"
|
||
MOVEM H,SAVH ;H=WIRE
|
||
FETCH(T,H,WBIT) ;GET WIRE BITS
|
||
TRNE T,SPWR!SGND ;PWR OR GND RUN?
|
||
JRST ROUPG ;YES, ROUTE DIFFERENTLY
|
||
SETZM FBIT ;CLEAR THIS FOR PRINT ROUTINE
|
||
FETCH(H,H,WPIN) ;SET H TO FIRST PIN OF RUN FOR WIRSET
|
||
SETZM LOSFLG
|
||
ROUWR3: SETZM NOTDON
|
||
PUSHJ P,WIRSET
|
||
JRST ROUWR4 ;1 PIN RUN
|
||
JRST [ SETOM NOTDON ;TOO MANY PINS IN RUN
|
||
MOVEI T,RFTOOL
|
||
MOVEM T,LOSFLG
|
||
JRST .+1]
|
||
MOVEM H,ROUSVH ;TAIL OF PIN LIST, IF OVERLEW TABLE SIZE
|
||
PUSHJ P,ROUTER
|
||
JRST [ OUTSTR[ASCIZ/BARF, SOMEONE CALLED ROUWIR WITH SINGLE PIN RUN!
|
||
/]
|
||
JRST ROUWR4] ;IGNORE 1 PIN RUNS
|
||
AOS NRUNS ;COUNT A RUN ROUTED
|
||
PUSHJ P,RUNFIX ;NOW FIX RUNLST POINTERS
|
||
SKIPN T,LOSFLG
|
||
JRST ROUWIN
|
||
PUSHJ P,ROULEV ;GIVE IT TO APPROPRIATE OUTPUT
|
||
MOVE H,ROUSVH
|
||
SKIPE NOTDON
|
||
JRST ROUWR3
|
||
POPJ P,
|
||
|
||
ROUWIN: MOVE H,SAVH
|
||
MOVE W,SAVW
|
||
JRST @WINDSP
|
||
|
||
ROUWR4: MOVEI T,RFSING ;SINGLE WIRE RUN
|
||
ROULEV: MOVE H,SAVH
|
||
MOVE W,SAVW
|
||
JRST @LOSDSP
|
||
; ROUTER SETUP, POWER OR GROUND RUN
|
||
;DO PWR, GND ON DIPS ONLY, NO RUN EXISTS
|
||
;PGBIT = SPWR or SGND
|
||
|
||
ROUPG: TRNN T,SPWR ;WHICH?
|
||
JRST [ MOVE T,[GND,,FGND] ;DPBIT,,ROUTINE TO FIND CLOSEST G PIN ON BOARD
|
||
SKIPN WIRGND
|
||
TLZ T,GND ;NO BITS IF NOT WIRING
|
||
JRST ROUPGF]
|
||
MOVE T,[PWR,,FPWR]
|
||
ROUPGF: HRRZM T,FDSP
|
||
HLRZM T,FBIT
|
||
SKIPE B,CPGLST ;Reclaim old list of GND sources
|
||
PUSHJ P,PUTFS
|
||
SETZM CPGLST
|
||
HRRZ A,H
|
||
PUSHJ P,CLEARA ;CLEAR PIN MARK BITS IN RUN
|
||
|
||
;First, find set of card PWR/GND pins that this run will be split up on.
|
||
PUSHJ P,FNDONE ;FIND A CARD PWR OR GND WE WILL NEED
|
||
JRST FNDALL ;FOUND ALL
|
||
MOVEI T,CPGLST
|
||
JRST FPGLP1
|
||
|
||
FPGLP2: CAMN A,ADDR(T,PNAM) ;DO WE HAVE THIS ONE ALREADY?
|
||
POPJ P, ;YES, CO-ROUTINE RETURN TO FNDONE
|
||
FPGLP1: MOVE TT,T
|
||
FETCH(T,T,NWRD)
|
||
JUMPN T,FPGLP2
|
||
GETFS(T,WBLK)
|
||
STORE(A,T,PNAM) ;STORE PIN NAME
|
||
CLEAR(T,NWRD) ;CLEAR OUR LINK OUT
|
||
STORE(T,TT,NWRD) ;STORE US AS LAST LINK OUT
|
||
POPJ P, ;CO-ROUTINE RETURN TO FNDONE
|
||
|
||
|
||
;Next, map down card P/G pins, finding all pins on run that are connected on that P/G pin
|
||
FNDALL: SKIPN T,CPGLST ;ANY CARD PINS LEFT?
|
||
JRST ROUSOM ;NO, NOW CATCH ALL THE UNROUTED PINS IN RUN
|
||
FETCH(TT,T,NWRD)
|
||
MOVEM TT,CPGLST ;TAKE US OFF LIST
|
||
FETCH(TT,T,PNAM)
|
||
FSTRET(T,WBLK) ;RETURN FREE BLOCK
|
||
MOVSI T,RPGPIN ;MARK AS GENERATED PIN
|
||
MOVEM T,PNTBL ;PUT CARD PIN IN TABLE FIRST
|
||
MOVEM TT,PNTBL1
|
||
MOVEM TT,SOURCE
|
||
MOVE G,[1,,PNTBL] ;ALREADY STORED FIRST ENTRY
|
||
MOVEI F,MAXP-1 ;COUNT DOWN NUMBER OF PINS (DON'T COUNT CARD PIN)
|
||
SETZM LOSFLG ;LOSFLG IF WE OVERFLOW ROUTER TABLE
|
||
PUSHJ P,FNDONE ;NOW FIND THEM AGAIN
|
||
JRST RUNEND ;DONE, NOW ROUTE IT
|
||
CAME A,SOURCE ;This pin connects to the card-pin were wiring now?
|
||
POPJ P, ;NO
|
||
FETCH(T,H,PBIT)
|
||
TRO T,PTMP1 ;MARK SO WON'T BE DONE LATER
|
||
STORE(T,H,PBIT) ;MARK AS DONE
|
||
CAMN A,C ;IS THE PIN DEDICATED ON THE BOARD?
|
||
POPJ P, ;YES, DOESN'T NEED WIRING THEN
|
||
PUSHJ P,ADDPIN ;ADD TO PNTBL, CHECK FOR OVERFLOW
|
||
POPJ P, ;CO-RETURN
|
||
|
||
ADDPIN: PUSH G,TTT ;STORE FLAGS,,POINTER TO PIN BLOCK
|
||
MOVEM C,PNTBL1-PNTBL(G) ;STORE PIN NAME
|
||
SOSLE F ;FILLED TABLE?
|
||
POPJ P, ;CO-ROUTINE RETURN, FIND ANOTHER
|
||
MOVEI T,RFTOOL
|
||
MOVEM T,LOSFLG ;RUN TOO LONG
|
||
PUSHJ P,DUMPIT
|
||
POPJ P, ;CO-ROUTINE RETURN, FIND ANOTHER
|
||
|
||
DUMPIT: HLRZ T,G
|
||
SKIPN LOSFLG ;Second chunk of one run?
|
||
CAILE T,1
|
||
CAIA
|
||
POPJ P, ;FLUSH NULL OR SINGLE RUNS
|
||
JUMPE T,CPOPJ ;NO PINS
|
||
SOJLE T,[SETZM NUMPIN ;ONE PIN RUN
|
||
PUSHJ P,ROUEST ;FIXUP RUNLST POINTERS
|
||
MOVEI T,RFSING
|
||
JRST ROUPG1]
|
||
MOVEM T,NUMPIN
|
||
PUSHJ P,ROUTER ;NOW ROUTE IT
|
||
PUSHJ P,FUCKUP ;LOSE (ONE PIN RUN, CAN'T HAPPEN)
|
||
PUSHJ P,RUNFIX
|
||
SKIPN T,LOSFLG
|
||
JRST ROUWIN ;SUCCESS CALL FOR OUTPUT
|
||
ROUPG1: PUSH P,H
|
||
PUSH P,W
|
||
PUSHJ P,ROULEV ;RETURN THESE PINS IN ERROR
|
||
POP P,W
|
||
POP P,H
|
||
MOVEI G,PNTBL-1 ;MORE PINS ON THIS RUN, BUT BROKEN OFF
|
||
MOVEI F,MAXP
|
||
POPJ P, ;CO-ROUTINE RETURN
|
||
|
||
RUNEND: PUSHJ P,DUMPIT
|
||
JRST FNDALL ;GET RUN FOR NEXT CARD PIN
|
||
;ROUSOM - catch all pins that we couldn't find a P/G pin for.
|
||
; (Only if we were trying to route a signal SPWR or SGND)
|
||
ROUSOM: SETOM NUMPIN
|
||
SKIPN H,SAVH ;WAS THIS A NAMED RUN
|
||
PUSHJ P,FUCKUP ;BETTER BE
|
||
SETZM LOSFLG
|
||
MOVEI G,PNTBL-1
|
||
MOVEI F,MAXP
|
||
FETCH(H,H,WPIN)
|
||
JUMPE H,ROUPGW
|
||
ROUPG5: FETCH(T,H,PBIT)
|
||
TRNN T,DUP
|
||
TROE T,PTMP1
|
||
JRST ROUPG6
|
||
STORE(T,H,PBIT)
|
||
PUSHJ P,NAMMAP ;MAP INTO SOCKET PIN
|
||
JRST [ TLO TTT,RERPIN
|
||
MOVEI T,RFBAD
|
||
MOVEM T,LOSFLG
|
||
JRST .+1]
|
||
MOVE C,A
|
||
PUSHJ P,ADDPIN
|
||
ROUPG6: FETCH(H,H,NXTP)
|
||
JUMPN H,ROUPG5
|
||
PUSHJ P,DUMPIT
|
||
ROUPGW: MOVE H,SAVH
|
||
MOVE W,SAVW
|
||
POPJ P,
|
||
|
||
ROUEST: MOVEI T,-PNTBL(G)
|
||
HRLZM T,ENDS
|
||
ROUES1: HRLI TT,-1(T)
|
||
HRRI TT,1(T)
|
||
MOVEM TT,RUNLST(T)
|
||
MOVSI TT,RERPIN
|
||
IORM TT,PNTBL(T) ;FLAG ALL PINS AS ERRORS
|
||
SOJGE T,ROUES1
|
||
HLLOS RUNLST-PNTBL(G)
|
||
POPJ P,
|
||
|
||
ROUPGE: OUTSTR[ASCIZ/ERROR RETURN FROM WIRSTP OR WIRSTE AT ROUPG!
|
||
/]
|
||
POPJ P,
|
||
|
||
;FNDONE - coroutine to generate all pins connecting to pwr or gnd
|
||
; IFN 0,<first searches all DIP definitions for P/G pins >
|
||
; then searches the wire (H) which should be GND, +5.0V, etc.
|
||
; returns:
|
||
; A= card pin-spec to wire pin to (flags+pin#,,slot#)
|
||
; TTT= Router flags (RPGPIN,...)
|
||
; C= pin-spec that needs to be wired to PWR/GND
|
||
; H = Pin that got this PWR,GND pin (Dip pin if RPGPIN)
|
||
|
||
FNDONE: AOS (P)
|
||
IFN 0,< ;SINCE THE ADVENT OF INVENTED SIGNAL NAMES FOR PWR,GND
|
||
;WE SHOULDN'T NEED THIS FIRST PART
|
||
SKIPN FBIT
|
||
JRST FNDRUN ;NO DIP PINS, JUST DO RUN
|
||
MOVE W,SAVW ;GET WIRE LIST HEADER POINTER
|
||
FETCH(W,W,WBDY) ;BODY POINTER - search occupied DIP slots
|
||
JUMPE W,FNDRUN ;ANY?
|
||
SETZM LSLOT ;NO LAST SLOT YET
|
||
ROUP12: FETCH(T,W,BLOC) ;BODY LOCATION
|
||
JUMPE T,ROUPG9 ;ANY?
|
||
CAMN T,LSLOT
|
||
JRST ROUPG9
|
||
FETCH(H,W,DIPT) ;GET DIP TYPE
|
||
JUMPE H,ROUPG9
|
||
MOVEM T,LSLOT ;NEW LOCATION
|
||
MOVEI H,RADDR(H,DPIN,DPNXT)
|
||
JRST ROUP11
|
||
|
||
ROUP10: FETCH(T,H,DPBIT) ;GET TYPE BITS
|
||
TDNN T,FBIT ;IS IT ONE WE WANT?
|
||
JRST ROUP11
|
||
FETCH(TT,H,DPNM)
|
||
MOVE B,W ;BODY POINTER
|
||
PUSHJ P,PNAMEP
|
||
JRST ROUP11 ;NEXT PIN
|
||
MOVE C,A
|
||
FETCH(B,H,LLOW) ;IN CASE THIS IS PWR PIN, WE NEED VOLTAGE
|
||
PUSHJ P,@FDSP ;FIND THE CARD PIN
|
||
JUMPE A,ROUP11 ; NONE!!
|
||
MOVSI TTT,RPGPIN ;MARK AS GENERATED PIN
|
||
PUSHJ P,@(P) ;CALL AS CO-ROUTINE
|
||
ROUP11: FETCH(H,H,DPNXT) ;CHECK ALL PINS
|
||
JUMPN H,ROUP10
|
||
ROUPG9: FETCH(W,W,NXTB) ;CHECK ALL BODIES
|
||
JUMPN W,ROUP12
|
||
>;IFN 0
|
||
|
||
FNDRUN: SKIPN H,SAVH ;GET RUN POINTER
|
||
JRST FNDNRN ;NONE
|
||
FETCH(H,H,WPIN)
|
||
JUMPE H,FNDNRN
|
||
FNDRN2: FETCH(TTT,H,PBIT)
|
||
TRNE TTT,DUP
|
||
JRST FNDRN1
|
||
PUSHJ P,NAMMAP ;TRY NAMING IT
|
||
JRST FNDRN1 ;NO
|
||
MOVE E,TTT ;SAVE ROUTE FLAGS
|
||
MOVE C,A
|
||
MOVE B,SAVH ;GET SIGNAL NAME
|
||
FETCH(B,B,WVOL) ;GET VOLTS IN CASE WE'RE LOOKING FOR PWR PIN
|
||
PUSHJ P,@FDSP ;FIND ITS CARD PIN
|
||
JUMPE A,FNDRN1 ;DIDN'T GET ONE
|
||
MOVE TTT,E
|
||
PUSHJ P,@(P)
|
||
FNDRN1: FETCH(H,H,NXTP)
|
||
JUMPN H,FNDRN2
|
||
FNDNRN: SOS (P) ;TAKE OFF SKIP RETURN
|
||
POPJ P, ;NO MORE
|
||
|
||
; SUBR TO DO PWR AND GND RUNS FIRST
|
||
;Looks for all signals that are SPWR or SGND.
|
||
PGSPEC: MOVEM T,PGDSP
|
||
MOVEI T,SGND
|
||
PUSHJ P,PGSPC1
|
||
MOVEI T,SPWR
|
||
PGSPC1: MOVEM T,PGBIT
|
||
MOVEI H,RADDR(W,WIRES,ALPH)
|
||
JRST PGSPC2
|
||
|
||
PGSPC3: FETCH(T,H,WBIT)
|
||
TRNN T,NAM2ND ;ONLY HEADER BLOCK PLEASE
|
||
TDNN T,PGBIT ;FOUND ONE?
|
||
JRST PGSPC2
|
||
SKIPN ISRAY
|
||
JRST [ SKIPL LINCNT
|
||
PUSHJ P,PUTHDR
|
||
MOVE A,H
|
||
PUSHJ P,GCANON
|
||
PUTSIG ADDR(A,SPNT)
|
||
JRST .+1]
|
||
PUSH P,H
|
||
HLRZ T,PGDSP
|
||
PUSHJ P,(T) ;ROUTE ALL THESE
|
||
POP P,H
|
||
PGSPC2: FETCH(H,H,ALPH)
|
||
JUMPN H,PGSPC3
|
||
IFN 0,< ;ALL DIP PWR REQUIREMENTS SHOULD BE ON SIGNAL NAMES
|
||
HRRZ T,PGDSP
|
||
JRST (T) ;DISPATCH TO NOT FOUND ROUTINE
|
||
>;IFN 0
|
||
POPJ P,
|
||
|
||
IFN 0,<
|
||
PGSIG: SKIPL LINCNT
|
||
PUSHJ P,PUTHDR
|
||
PGSIG0: MOVE T,PGBIT
|
||
TRNN T,SPWR
|
||
JRST [ PUTSTR[ASCIZ/GND/]
|
||
POPJ P,]
|
||
PUTSTR[ASCIZ/PWR/]
|
||
POPJ P,
|
||
>;IFN 0
|
||
SUBTTL 'WLR' ROUTING SUBR FOR WIRE LIST OUTPUT
|
||
|
||
;HERE TO PRINT ERROR MESSAGE ON TTY IF RUN NOT ROUTED FOR SOME REASON
|
||
|
||
ROUNPN: PUSHJ P,RAYRNR
|
||
ERRSTR 0,@RFERR(T)
|
||
POPJ P,
|
||
|
||
RAYRNR: OUTSTR ADDR(H,SPNT)
|
||
OUTSTR [ASCIZ / RUN NOT ROUTED! - /]
|
||
OUTSTR @RFERR(T)
|
||
OUTSTR [ASCIZ /
|
||
/]
|
||
MOVEI TT,1
|
||
LSH TT,(T)
|
||
TDNE TT,[RFUCK] ;INTERNAL ROUTER ERROR?
|
||
PUSHJ P,FUCKUP
|
||
PUSH P,T ;ERROR CODE
|
||
PUSHJ P,@WINDSP ;PRINT RUN
|
||
POP P,T
|
||
POPJ P,
|
||
|
||
ROUPNT: MOVE G,H
|
||
PUSHJ P,LOPSET ;SETUP FOR WIRE PRINT
|
||
MOVE T,FBIT
|
||
TRNE T,PWR
|
||
AOS NPWR ;MAKE THIS RUN PRINT
|
||
TRNE T,GND
|
||
AOS NGND ;ALSO THIS ONE
|
||
SETZM INCHES ;CLEAR TOTAL WIRE LENGTH
|
||
MOVE T,NUMPIN ;GET NUMBER OF PINS IN RUN
|
||
TRNE T,1 ;ODD OR EVEN? (0 IS ODD!)
|
||
SKIPA T,[3] ;EVEN, START AT 3 (Z 1)
|
||
MOVEI T,2 ;ODD, START AT 2 (Z 2)
|
||
MOVEM T,ZLEVN
|
||
HRRZ G,ENDS ;START AT THIS END
|
||
ROUTIO: HRLM G,(P) ;SAVE INDEX INTO PNTBL
|
||
MOVEI T,4
|
||
SOSGE NUMPIN ;LAST PIN?
|
||
MOVEM T,ZLEVN ;SET END Z LEVEL CODE
|
||
HLRZ T,(P)
|
||
HLRE B,RUNLST(T) ;GET LAST PIN
|
||
JUMPL B,[SETZM WIRELN ;NO WIRE LENGTH ON FIRST PIN
|
||
JRST ROUTDO] ;AND PRINT LAST PIN
|
||
HRRZ C,G
|
||
PUSHJ P,DSTSTR ;CALC AND STORE DIST IN WIRELN
|
||
ROUTDO: MOVSI T,RPGPIN
|
||
TDNE T,PNTBL(G) ;CHECK IF PIN HAS PIN BLOCK
|
||
JRST RPGPNT ;NO, GENERATED FROM DIP DEF
|
||
HRRZ G,PNTBL(G)
|
||
PUSHJ P,WIRLP0
|
||
ROUTDN: HLRZ G,(P)
|
||
HRRE G,RUNLST(G)
|
||
JUMPGE G,ROUTIO
|
||
SKIPE G,SAVH
|
||
JRST FINWIR
|
||
SKIPE LCOUNT
|
||
CRLF
|
||
SKIPE T,INCHES
|
||
CAMN T,WIRELN
|
||
JRST NONWLN
|
||
MOVEM T,WIRELN
|
||
MOVEI A,=48
|
||
PUSHJ P,FILL
|
||
PUSHJ P,DOWLEN
|
||
NONWLN: CRLF
|
||
POPJ P,
|
||
|
||
; Print pin, but it is without signal name, a PWR pin on DIP
|
||
RPGPNT: MOVE T,LCOUNT
|
||
CAIL T,8
|
||
CRLF
|
||
PUTBYT 11
|
||
MOVE A,PNTBL1(G)
|
||
PUSHJ P,PINBIT
|
||
TLNE A,PWR ;IS THIS A PWR PIN?
|
||
AOS NPWR
|
||
TLNE A,GND ;HOW ABOUT GROUND?
|
||
AOS NGND
|
||
SETZM TCOUNT
|
||
PUSHJ P,LOCPIN ;CALL CARD SUBR TO PRINT
|
||
SETZ T, ;AVOID STAR
|
||
PUSHJ P,PTAB
|
||
SKIPN WIRELN
|
||
JRST ROUTDN
|
||
MOVEI A,=48
|
||
PUSHJ P,FILL
|
||
PUSHJ P,DOWLEN
|
||
JRST ROUTDN
|
||
|
||
|
||
DSTSTR: CAMG B,C
|
||
EXCH B,C
|
||
HRRZ T,@PTRTB1(B) ;GET DISTANCE FROM THIS PIN TO NEXT
|
||
MOVEM T,WIRELN ;AND STORE HERE FOR PRINT
|
||
JUMPE T,CPOPJ
|
||
MOVSI TT,RERPIN ;ERROR BIT
|
||
TDNN TT,PNTBL(B)
|
||
TDNE TT,PNTBL(C)
|
||
JRST [ SETZM WIRELN ;IF ONE IN ERROR, FLUSH THIS WIRE
|
||
POPJ P,]
|
||
ADDM T,INCHES
|
||
ADDM T,TINCHS
|
||
AOS NWIRES ;COUNT ANOTHER WIRE
|
||
POPJ P,
|
||
|
||
NOITS,<
|
||
DOWLEN: MOVE T,WIRELN ;YES, ANY WIRE?
|
||
IDIV T,FRACTN ;MAKE IT INCHES
|
||
PUSH P,TT ;SAVE THE FRACTION
|
||
PUSHJ P,DECOUT ;AND PRINT
|
||
POP P,T
|
||
MOVE TT,FRACTN
|
||
CAIN TT,=10
|
||
JRST [ PUTBYT "."
|
||
PUTBYT "0"(T)
|
||
POPJ P,]
|
||
CAIN TT,=100
|
||
JRST [ PUTBYT "."
|
||
IDIVI T,=10
|
||
PUTBYT "0"(T)
|
||
PUTBYT "0"(TT)
|
||
POPJ P,]
|
||
JUMPE T,CPOPJ
|
||
PUTBYT "+"
|
||
PUSHJ P,DECOUT
|
||
PUTBYT "/"
|
||
MOVE T,FRACTN
|
||
JRST DECOUT
|
||
>;NOITS
|
||
ITS,<
|
||
DOWLEN: MOVEI T,=1000
|
||
IDIV T,FRACTN
|
||
MOVE TTT,T ;YES, I KNOW ITS A CONSTANT
|
||
IMUL T,WIRELN ;DO THE FIGURING IN THOUSANDTHS OF INCHES
|
||
SUB T,POSTMG ;SUBTRACT OFF POST MARGIN
|
||
MOVE TT,T
|
||
SUB TT,WRAPMG ;THE REAL DISTANCE BETWEEN PINS
|
||
CAMG TT,TTT ;ARE PINS NEXT TO EACH OTHER?
|
||
JRST [ PUTSTR [ASCIZ /BARE/]
|
||
POPJ P,]
|
||
IDIVI T,=1000 ;LENGTH IN INCHES
|
||
PUSH P,TT
|
||
SKIPE T
|
||
PUSHJ P,DECOUT ;PRINT INCHES
|
||
PUTBYT "."
|
||
POP P,T
|
||
IDIVI T,=100 ;PRINT TENTH
|
||
PUTBYT "0"(T)
|
||
POPJ P,
|
||
>;ITS
|
||
SUBTTL 'WLZ' ROUTER Z LEVEL OUTPUT SETUP
|
||
ZLEVP: SKIPN ISWW
|
||
JRST NXWW
|
||
MOVE L,DEFLST
|
||
PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD!
|
||
POPJ P,
|
||
FETCH(T,W,WIRES)
|
||
JUMPE T,[OUTSTR[ASCIZ/NO WIRES!
|
||
/]
|
||
POPJ P,]
|
||
MOVSI T,'WLZ' ;WIRE LIST Z LEVEL FILE EXTENSION
|
||
MOVEI TT,0 ;DATA MODE
|
||
MOVSI TTT,'DSK'
|
||
PUSHJ P,OUTSET
|
||
POPJ P,
|
||
PUSHJ P,FILLST
|
||
PUTHDR
|
||
SETZM NWIRES
|
||
SETZM TINCHS
|
||
SETZM ISRAY
|
||
MOVEI T,WLZMAR
|
||
MOVEM T,MARGIN
|
||
MOVEI T,[ASCIZ/ WRAP LIST -- PWR AND GND -- Z LEVEL 1
|
||
FROM........TO..........WIRE...CHECK...LENGTH....SIGNAL NAME/]
|
||
MOVEM T,HEADER
|
||
SETZM LINCNT
|
||
TLZ TFLG
|
||
MOVE T,[PGZY,,FUCKUP]
|
||
PUSHJ P,PGSPEC
|
||
MOVEI T,[ASCIZ/ WRAP LIST -- PWR AND GND -- Z LEVEL 2
|
||
FROM........TO..........WIRE...CHECK...LENGTH....SIGNAL NAME/]
|
||
MOVEM T,HEADER
|
||
SETZM LINCNT
|
||
TLO TFLG
|
||
MOVE T,[PGZY,,FUCKUP]
|
||
PUSHJ P,PGSPEC
|
||
MOVEI T,[ASCIZ/ WRAP LIST -- Z LEVEL 1
|
||
FROM........TO..........WIRE...CHECK...LENGTH....SIGNAL NAME/]
|
||
MOVEM T,HEADER
|
||
SETZM PGBIT
|
||
SETZM LINCNT
|
||
TLZ TFLG ;FLAG TO DO Z LEVEL 1
|
||
ZLEVPN: FETCH(H,W,WIRES)
|
||
ZLEVP0: FETCH(T,H,WBIT)
|
||
TRNE T,NAM2ND!WNULL!WSINGL!SNC!SPWR!SGND
|
||
JRST ZLEVP1
|
||
FETCH(G,H,WPIN)
|
||
PUSHJ P,ROUWR2 ;Route, but don't print router errors
|
||
ZLEVP1: FETCH(H,H,ALPH)
|
||
JUMPN H,ZLEVP0
|
||
TLOE TFLG
|
||
JRST ZLEVPE
|
||
MOVEI T,[ASCIZ/ WRAP LIST -- Z LEVEL 2
|
||
FROM........TO..........WIRE...CHECK...LENGTH....SIGNAL NAME/]
|
||
MOVEM T,HEADER
|
||
SETZM LINCNT
|
||
SETZM NRUNS ;COUNT RUNS ONLY ON Z 2
|
||
JRST ZLEVPN
|
||
|
||
ZLEVPE: RELEAS LST,
|
||
MOVE T,[OUTCHR TTT]
|
||
MOVEM T,PUTCHR
|
||
PUSHJ P,PTOTS ;PRINT TOTALS ON TTY
|
||
POPJ P,
|
||
; Z LEVEL PRINT ROUTINE
|
||
ZLEVPW: SETZM INCHES
|
||
HRRZ G,ENDS ;GET AN END
|
||
MOVE T,NUMPIN ;GET NUMBER OF PINS -1
|
||
TRNN T,1 ;SKIP IF EVEN NUMBER OF PINS
|
||
TLOA SEMFLG ;FIRST IS 1-2
|
||
TLZ SEMFLG ;FIRST IS NOT 1-2
|
||
TLNE TFLG ;LEVEL 1 OR 2? (OFF FOR 1)
|
||
TRCA T,1 ;LEVEL 2, INVERT SENSE OF TEST
|
||
TLZ SEMFLG ;LEVEL 1, CAN'T BE 1-2
|
||
TRNN T,1 ;EVEN OR ODD (0 IS ODD)
|
||
HRRE G,RUNLST(G) ;ODD, START WITH NEXT PIN IN RUN
|
||
TRZ FLAG ;NOTE FIRST PIN OF RUN
|
||
ZLEVPA: HRRE F,RUNLST(G) ;GET ONE FOLLOWING US
|
||
JUMPL F,CPOPJ ;QUIT IF NO NEXT
|
||
MOVE B,G
|
||
MOVE C,F
|
||
PUSHJ P,DSTSTR
|
||
SKIPN WIRELN ;ANY WIRE HERE?
|
||
JRST ZLEVPD
|
||
TROE FLAG ;ANY PINS OF THIS WIRE OUT YET?
|
||
JRST ZLEVPB
|
||
SKIPL LINCNT
|
||
PUSHJ P,PUTHDR
|
||
ZLEVPB: CRLF ;KEEP THEM SEPERATED
|
||
MOVE E,G
|
||
PUSHJ P,PLCPNT
|
||
MOVE E,F
|
||
PUSHJ P,PLCPNT
|
||
PUTSTR[ASCIZ/( )....( ) /]
|
||
SETZM TCOUNT
|
||
PUSHJ P,DOWLEN
|
||
MOVEI A,=12
|
||
SUB A,TCOUNT
|
||
PUTBYT "."
|
||
SOJG A,.-1
|
||
PUTSIG ADDR(H,SPNT)
|
||
CRLF
|
||
ZLEVPD: HRRE G,RUNLST(F)
|
||
JUMPGE G,ZLEVPA
|
||
POPJ P,
|
||
|
||
;PLCPNT - PRINT PIN LOCATION
|
||
PLCPNT: SETZM TCOUNT
|
||
MOVSI T,RPGPIN
|
||
TDNE T,PNTBL(E)
|
||
JRST [ MOVE A,PNTBL1(E) ;A SOCKET PIN GENERATED TO WIRE TO
|
||
PUSHJ P,LOCPIN
|
||
JRST PLCPN3]
|
||
HRRZ E,PNTBL(E)
|
||
FETCH(D,E,PBDY) ;D GETS BODY POINTER
|
||
FETCH(A,D,BLOC)
|
||
FETCH(T,E,PINN)
|
||
HRLI A,(T)
|
||
FETCH(T,D,BBIT)
|
||
TRNN T,CBODY
|
||
JRST PLCPN1
|
||
AOS NCONS
|
||
PUSHJ P,LOCPNW
|
||
JRST PLCPN3
|
||
|
||
PLCPN1: PUSH P,B
|
||
FETCH(B,D,BPAK)
|
||
PUSHJ P,LOCPNM
|
||
POP P,B
|
||
PLCPN3: TLZE SEMFLG
|
||
STAN,< PUTBYT "" >
|
||
NOSTAN,<PUTBYT "\" >
|
||
MOVEI A,=12
|
||
SUB A,TCOUNT
|
||
PUTBYT "."
|
||
SOJG A,.-1
|
||
POPJ P,
|
||
|
||
;SUBTTL RAYTHEON OUTPUT STUFF
|
||
|
||
SUBTTL 'RAY' ROUTER RAYTHEON WIRE WRAP OUTPUT "TO-TO" FORMAT
|
||
RAYTT: SETZM AUGFORM ;Not AUGAT format file
|
||
MOVE L,DEFLST
|
||
PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD!
|
||
POPJ P,
|
||
FETCH(T,W,WIRES)
|
||
JUMPE T,[OUTSTR[ASCIZ/NO WIRES!
|
||
/]
|
||
POPJ P,]
|
||
MOVSI T,'WTT' ;RAYTHEON WIRE WRAP EXTENSION
|
||
MOVEI TT,0 ;DATA MODE
|
||
MOVSI TTT,'DSK'
|
||
PUSHJ P,OUTSET
|
||
POPJ P,
|
||
MOVE T,[PUSHJ P,F4OUT] ;FLUSH TABS, SPECIAL CHARS
|
||
MOVEM T,PUTCHR
|
||
SETZM NRUNS
|
||
SETZM NWIRES
|
||
SETZM TINCHS
|
||
SETZM MARGIN ;NO MARGIN
|
||
SETZM LINCNT
|
||
SETOM ISRAY
|
||
MOVE T,[PGRAYY,,FUCKUP] ;ROUTE AND PRINT POWER AND GROUND
|
||
PUSHJ P,PGSPEC
|
||
SETZM PGBIT ;PRINT SIGNAL NAMES WHERE POSSIBLE
|
||
FETCH(H,W,WIRES)
|
||
RAYP0: FETCH(T,H,WBIT)
|
||
TRNE T,NAM2ND!WNULL!WSINGL!SNC!SPWR!SGND
|
||
JRST RAYP1
|
||
FETCH(G,H,WPIN)
|
||
PUSHJ P,PGRAYY ;ROUTE AND PRINT NORMAL RUN
|
||
RAYP1: FETCH(H,H,ALPH)
|
||
JUMPN H,RAYP0
|
||
RELEAS LST, ;THAT'S ALL FOLKS!
|
||
MOVE T,[OUTCHR TTT]
|
||
MOVEM T,PUTCHR
|
||
PUSHJ P,PTOTS ;PRINT TOTALS ON TTY
|
||
POPJ P,
|
||
|
||
;RAYTHEON NORMAL ROUTER SETUP
|
||
|
||
PGRAYY: MOVEI T,RAYPW
|
||
MOVEI TT,RAYRNR ;PRINT RUN NOT ROUTED ON TTY
|
||
SETZM FASRAY
|
||
JRST ROUWIR
|
||
|
||
;SUBTTL RAYTHEON OUTPUT STUFF
|
||
|
||
SUBTTL 'RAY' ROUTER RAYTHEON WIRE WRAP OUTPUT "FROM-TO" FORMAT
|
||
|
||
AUGP: SETOM AUGFORM
|
||
JRST RAYP10
|
||
|
||
RAYP: SETZM AUGFORM
|
||
RAYP10: MOVE L,DEFLST
|
||
PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD!
|
||
POPJ P,
|
||
FETCH(T,W,WIRES)
|
||
JUMPE T,[OUTSTR[ASCIZ/NO WIRES!
|
||
/]
|
||
POPJ P,]
|
||
MOVSI T,'RAY' ;RAYTHEON WIRE WRAP EXTENSION
|
||
SKIPE AUGFORM
|
||
MOVSI T,'AUG'
|
||
MOVEI TT,0 ;DATA MODE
|
||
MOVSI TTT,'DSK'
|
||
PUSHJ P,OUTSET
|
||
POPJ P,
|
||
MOVE T,[PUSHJ P,F4OUT] ;FLUSH TABS, SPECIAL CHARS
|
||
MOVEM T,PUTCHR
|
||
SETZM NRUNS
|
||
SETZM NWIRES
|
||
SETZM TINCHS
|
||
SETZM MARGIN ;NO MARGIN
|
||
SETZM LINCNT
|
||
SETOM ISRAY
|
||
MOVE T,[PGWFTY,,FUCKUP] ;ROUTE AND PRINT POWER AND GROUND
|
||
PUSHJ P,PGSPEC
|
||
SETZM PGBIT ;PRINT SIGNAL NAMES WHERE POSSIBLE
|
||
FETCH(H,W,WIRES)
|
||
RAYFT0: FETCH(T,H,WBIT)
|
||
TRNE T,NAM2ND!WNULL!WSINGL!SNC!SPWR!SGND
|
||
JRST RAYFT1
|
||
FETCH(G,H,WPIN)
|
||
PUSHJ P,PGWFTY ;ROUTE AND PRINT NORMAL RUN
|
||
RAYFT1: FETCH(H,H,ALPH)
|
||
JUMPN H,RAYFT0
|
||
RELEAS LST, ;THAT'S ALL FOLKS!
|
||
MOVE T,[OUTCHR TTT]
|
||
MOVEM T,PUTCHR
|
||
PUSHJ P,PTOTS ;PRINT TOTALS ON TTY
|
||
POPJ P,
|
||
|
||
;RAYTHEON NORMAL ROUTER SETUP
|
||
|
||
PGWFTY: MOVEI T,RAYFW
|
||
MOVEI TT,RAYRNR
|
||
SETZM FASRAY
|
||
JRST ROUWIR
|
||
|
||
;PRINT RUN IN CARD IMAGE FORMAT
|
||
|
||
LVLCOL__=68 ;THE COLUMN USED TO INDICATE LEVEL OF WRAP
|
||
LVLAUG__=55 ; " FOR AUGAT FORMAT
|
||
|
||
RAYMAX__=17 ;LONGEST WIRE RAYTHEON MACHINE CAN WRAP IS 24" (CITY BLOCK DISTANCE)
|
||
;16.97=24*(SQRT(2)/2)
|
||
RAYNCH__=12 ;MAX OF 12. CHARS IN SIGNAL NAME
|
||
|
||
;TABS TO CARD COLUMN
|
||
|
||
DEFINE RAYTAB (COLUM)
|
||
< MOVEI A,COLUM-1
|
||
CAMG A,LCOUNT
|
||
JRST .+3
|
||
PUTBYT " "
|
||
JRST .-3
|
||
>
|
||
|
||
RAYFW: SETZM LCOUNT
|
||
SETZM INCHES
|
||
SETZM RAYLVL ;KEEP TRACK OF LEVEL OF WIRE
|
||
AOS RAYLVL ; AND START WIRING ON LEVEL 1
|
||
HRRZ G,ENDS ;THE BEGINING OF THE RUN
|
||
MOVE T,NUMPIN ;GET NUMBER OF PINS -1
|
||
TRNN T,1 ;IS NUMBER OF PINS EVEN OR ODD (ODD IS 0)
|
||
JRST [ HRRE G,RUNLST(G) ;ODD, START WITH NEXT PIN IN RUN
|
||
PUSHJ P,RAYPA
|
||
HRRE G,ENDS ;END OF WIRE
|
||
HRRE F,RUNLST(G) ;OTHER END OF WIRE
|
||
MOVEI B,2 ;THIS WIRE IS ON LEVEL 2
|
||
MOVEM B,RAYLVL
|
||
JRST RAYFRM]
|
||
RAYPA: HRRE F,RUNLST(G) ;GET ONE FOLLOWING US
|
||
JUMPL F,CPOPJ ;QUIT IF NO NEXT
|
||
PUSHJ P,RAYFRM ;PRINT LINE FOR THIS WIRE
|
||
RAYPB: HRRE G,RUNLST(F) ;Two pins later, the first pin of next level 1 wire
|
||
JUMPL G,CPOPJ ;JUMP IF NONE THERE
|
||
HRRE F,RUNLST(G) ;OTHER END OF NEXT LEVEL 1 WIRE
|
||
JUMPL F,[JRST 4,.] ;ERROR, LAST WIRE ON RUN SHOULD ALWAYS BE LEVEL 1
|
||
PUSHJ P,RAYFRM
|
||
HLRE F,RUNLST(G) ;Back one pin, the level two wire
|
||
AOS RAYLVL
|
||
PUSHJ P,RAYFRM
|
||
SOS RAYLVL ;THE NEXT WIRE IS PROBABLY LEVEL 1
|
||
HRRE F,RUNLST(G) ;GET F BACK
|
||
JRST RAYPB
|
||
|
||
;RAYFRM - from,to pins
|
||
;G = RUNLST index for first pin of wire
|
||
;F = RUNLST index for second pin of wire
|
||
|
||
RAYFRM: PUSHJ P,RAYDST ;KEEP TRACK OF RUN LENGTHS
|
||
SKIPE AUGFORM
|
||
JRST AUGFRM
|
||
RAYTAB (=15)
|
||
MOVE E,G ;ONE END OF THE WIRE
|
||
PUSHJ P,RAYPNT
|
||
MOVE E,F ;THE OTHER END OF THE WIRE
|
||
PUSHJ P,RAYPNT ;PRINT PIN SPECIFICATION
|
||
RAYTAB (=31)
|
||
PUSHJ P,RAYSIG ;PRINT SIGNAL NAME AND RETURN
|
||
RAYTAB (LVLCOL) ;PRINT LEVEL OF WIRE
|
||
MOVE T,RAYLVL
|
||
PUSHJ P,DECOUT
|
||
RAYTAB (=72)
|
||
JRST RAYSEQ ;PRINT CARD SEQUENCE # AND RETURN
|
||
|
||
AUGFRM: RAYTAB(=2)
|
||
PUSHJ P,RAYSIG
|
||
RAYTAB(=20)
|
||
MOVE E,G
|
||
PUSHJ P,RAYPNT
|
||
RAYTAB(=40)
|
||
MOVE E,F
|
||
PUSHJ P,RAYPNT
|
||
RAYTAB(LVLAUG)
|
||
MOVE T,RAYLVL
|
||
PUSHJ P,DECOUT
|
||
RAYTAB(=72)
|
||
JRST RAYSEQ
|
||
|
||
RAYPNT: MOVE A,PNTBL1(E) ;SOCKET POST LOC
|
||
MOVSI T,RPGPIN ;Count # conn pins,
|
||
TDNE T,PNTBL(E)
|
||
JRST RAYPN1 ; can't be if was a generated pin
|
||
HRRZ E,PNTBL(E)
|
||
FETCH(D,E,PBDY)
|
||
FETCH(T,D,BBIT)
|
||
TRNE T,CBODY ;CONNECTOR PIN?
|
||
AOS NCONS ;COUNT CONNECTOR PINS ON RUN
|
||
RAYPN1: SKIPE AUGFORM
|
||
JRST AUGDIP
|
||
JRST RAYDIP ;PRINT PIN IN FORTRAN FORMAT
|
||
|
||
;Print signal name, truncating to 12 characters if necessary
|
||
RAYSIG: MOVEI TTT,ADDR(H,SPNT) ;PRINT THIS SIGNAL NAME
|
||
HRLI TTT,440700 ;MAKE IT A BYTE POINTER
|
||
SETZ T,
|
||
RAYS2: ILDB TT,TTT
|
||
SKIPE TT
|
||
AOJA T,RAYS2
|
||
CAILE T,RAYNCH
|
||
JRST [
|
||
; OUTSTR ADDR(H,SPNT)
|
||
; OUTSTR [ASCIZ / LONGER THAN 12 CHARACTERS
|
||
;/]
|
||
PUTBYT GENCHR ;PRINT "SERIAL NUMBER" INSTEAD OF NAME
|
||
PUTBYT GENCHR ;UNIQUE FROM ANY UNAMED RUNS
|
||
MOVE A,PNTBL1 ;USE PIN NAME AS GENERATED SIGNAL NAME
|
||
PUSHJ P,LOCPIN
|
||
JRST RAYFR2]
|
||
SKIPN PGBIT ;IS IT A SIGNAL THAT IS SPLIT UP?
|
||
JRST RAYFR3
|
||
;Print signal as GND1A01 - unique version of GND name
|
||
MOVE A,H
|
||
PUSHJ P,GCANON ;get canonical version of name
|
||
PUTSTR ADDR(A,SPNT)
|
||
MOVE A,PNTBL1 ;YES, THEN ADD SOMETHING TO MAKE EACH UNIQUE
|
||
PUSHJ P,LOCPIN
|
||
JRST RAYFR2
|
||
|
||
RAYFR3: PUTSTR ADDR(H,SPNT)
|
||
RAYFR2: SKIPN WIRELN ;WIRE IN ERROR?
|
||
PUTSTR [ASCIZ / **** WIRE IN ERROR/]
|
||
POPJ P,
|
||
|
||
;GCANON - Get canonical name of wire
|
||
;A = wire
|
||
|
||
GCANON: FETCH(TT,A,WBIT)
|
||
TRNE TT,NAM2ND
|
||
FETCH(A,A,WPIN) ;GET REAL HEADER
|
||
MOVE T,A
|
||
GCANO1: FETCH(TT,T,WBIT)
|
||
TRNE TT,SCANON ;Is this the canonical name?
|
||
JRST [ MOVE A,T
|
||
POPJ P,]
|
||
FETCH(T,T,NNAM)
|
||
JUMPN T,GCANO1
|
||
POPJ P,
|
||
|
||
;PRINT THE SEQUENCE # OF THE CARD
|
||
RAYSEQ:
|
||
ITS,< PUTSTR [ASCIZ /MIT/] >
|
||
CMU,< PUTSTR [ASCIZ /CMU/] >
|
||
MOVEI A,5
|
||
MOVEM A,NDIG
|
||
MOVE T,LINCNT
|
||
AOJ T,
|
||
PUSHJ P,NDECOUT
|
||
RAYTAB(=80)
|
||
CRLF
|
||
SETZM TCOUNT ;COUNT CHARACTERS ON LINE
|
||
SETZM LCOUNT
|
||
POPJ P,
|
||
|
||
; RAYTHEON WIRE WRAP TO-TO FORMAT PRINTER
|
||
|
||
RAYPW: SETZM INCHES
|
||
SETZM LCOUNT ;YOU CAN'T BE TOO CAREFUL
|
||
HRRZ G,ENDS ;GET AN END
|
||
RAYPT1: RAYTAB (=15)
|
||
MOVE E,G
|
||
PUSHJ P,RAYPNT ;PRINT THIS PIN
|
||
PUSHJ P,RAYSIG ;PRINT THE SIGNAL NAME
|
||
PUSHJ P,RAYSEQ ;PRINT THE CARD SEQUENCE #
|
||
HRRE F,RUNLST(G)
|
||
JUMPL F,CPOPJ ;END OF RUN
|
||
PUSHJ P,RAYDST ;LOG THIS WIRE AND TOTAL UP WIRE LENGTH
|
||
MOVE G,F ;ADVANCE TO NEXT PIN
|
||
JRST RAYPT1 ;GET NEXT PIN ON RUN
|
||
|
||
RAYDST: MOVE B,G ;COMPUTE LENGTH OF WIRE
|
||
MOVE C,F
|
||
PUSHJ P,DSTSTR
|
||
MOVE T,WIRELN
|
||
IDIV T,FRACTN
|
||
SKIPE T ;ANY WIRE HERE?
|
||
CAILE T,RAYMAX ;INSURE THAT WIRE DOES NOT EXCEED MAXIMUM LENGTH
|
||
CAIA
|
||
POPJ P,
|
||
;;Run too long, or failed somehow.
|
||
OUTSTR [ASCIZ /LINE #/]
|
||
PUSH P,T
|
||
PUSH P,PUTCHR
|
||
MOVE T,[OUTCHR TTT]
|
||
MOVEM T,PUTCHR
|
||
MOVE T,LINCNT
|
||
SUBI T,1
|
||
PUSHJ P,DECOUT
|
||
POP P,PUTCHR
|
||
POP P,T
|
||
OUTCHR [40] ;THROW IN A SPACE
|
||
OUTSTR ADDR(H,SPNT) ;PRINT SIGNAL NAME
|
||
SKIPN T
|
||
OUTSTR [ASCIZ / WIRE IN ERROR
|
||
/]
|
||
SKIPE T
|
||
OUTSTR [ASCIZ / POINT TO POINT DISTANCE EXCEEDS 17"
|
||
/]
|
||
POPJ P,
|
||
|
||
SUBTTL 'ANADU' ROUTER TEXT OUTPUT
|
||
|
||
ANANO: SETOM FASRAY ;Quickie, don't actually route the wires
|
||
JRST ANADU9
|
||
ANADU: SETZM FASRAY
|
||
ANADU9: MOVE L,DEFLST
|
||
PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD!
|
||
POPJ P,
|
||
FETCH(T,W,WIRES)
|
||
JUMPE T,[OUTSTR[ASCIZ/NO WIRES!
|
||
/]
|
||
POPJ P,]
|
||
MOVSI T,'XAN' ;RAYTHEON WIRE WRAP EXTENSION
|
||
MOVEI TT,0 ;DATA MODE
|
||
MOVSI TTT,'DSK'
|
||
PUSHJ P,OUTSET
|
||
POPJ P,
|
||
MOVE T,[PUSHJ P,F4OUT] ;FLUSH TABS, SPECIAL CHARS
|
||
MOVEM T,PUTCHR
|
||
SETZM NRUNS
|
||
SETZM NWIRES
|
||
SETZM TINCHS
|
||
SETZM MARGIN ;NO MARGIN
|
||
SETZM LINCNT
|
||
SETOM ISRAY
|
||
MOVE T,[ANAFTY,,FUCKUP] ;ROUTE AND PRINT POWER AND GROUND
|
||
PUSHJ P,PGSPEC
|
||
SETZM PGBIT ;PRINT SIGNAL NAMES WHERE POSSIBLE
|
||
FETCH(H,W,WIRES)
|
||
ANAFT0: FETCH(T,H,WBIT)
|
||
TRNE T,NAM2ND!WNULL!WSINGL!SNC!SPWR!SGND
|
||
JRST ANAFT1
|
||
FETCH(G,H,WPIN)
|
||
PUSHJ P,ANAFTY ;ROUTE AND PRINT NORMAL RUN
|
||
ANAFT1: FETCH(H,H,ALPH)
|
||
JUMPN H,ANAFT0
|
||
RELEAS LST, ;THAT'S ALL FOLKS!
|
||
MOVE T,[OUTCHR TTT]
|
||
MOVEM T,PUTCHR
|
||
PUSHJ P,PTOTS ;PRINT TOTALS ON TTY
|
||
POPJ P,
|
||
|
||
;RAYTHEON NORMAL ROUTER SETUP
|
||
|
||
ANAFTY: MOVEI T,ANAPNT
|
||
MOVEI TT,RAYRNR
|
||
JRST ROUWIR
|
||
|
||
ANAPNT: SETZM INCHES
|
||
HRRZ G,ENDS ;GET AN END
|
||
PUTSTR ADDR(H,SPNT) ;PRINT SIGNAL NAME
|
||
SKIPN PGBIT ;IS IT GND OR VCC?
|
||
JRST ANAPT3
|
||
PUTBYT "-"
|
||
MOVE A,PNTBL1
|
||
PUSHJ P,LOCPIN ;ADD SOMETHING TO MAKE IT UNIQUE
|
||
ANAPT3: PUTSTR [ASCIZ / \ /] ;SEPARATE SIGNAL FROM PINS
|
||
ANAPT1: MOVE A,PNTBL1(G)
|
||
PUSHJ P,LOCPIN ;PRINT PIN NAME
|
||
HRRE F,RUNLST(G)
|
||
JUMPL F,ANAPT2 ;END OF RUN
|
||
PUTBYT ","
|
||
PUSHJ P,RAYDST ;LOG THIS WIRE AND TOTAL UP WIRE LENGTH
|
||
MOVE G,F ;ADVANCE TO NEXT PIN
|
||
JRST ANAPT1 ;GET NEXT PIN ON RUN
|
||
|
||
ANAPT2: CRLF
|
||
POPJ P,
|
||
|
||
>;ROUTE
|