1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-28 09:27:41 +00:00
Files
PDP-10.its/src/draw/rep.337
2018-05-05 19:19:09 +02:00

702 lines
15 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;<DRAW>REP.FAI.42, 15-NOV-75 18:07:41, EDIT BY HELLIWELL
VERSION(REP,2)
;REPLACEMENT FOR BODIES
; USES A CORRESPONDENCE LIST
; TPIN IN OLD TYPE ,, link
; PIN-ID ,, TPIN IN NEW TYPE
;INITIALIZE CORLST FOR ALL PINS ON OLDTYP
REPLST: SKIPE B,CORLST
PUSHJ P,PUTFS ;RECLAIM OLD LIST, IF ANY
SETZM CORLST
MOVEI G,CORLST ;POINT TO IT
MOVE A,OLDTYP ;OLD BODY
FETCH(A,A,TPIN)
JUMPE A,CPOPJ
CORNXT: GETFS(T)
SETZM 1(T)
HRRM T,(G) ;LINK NEW BLOCK
MOVE G,T
HRLZM A,(G) ;SAVE TYPE PIN POINTER
CORPIN: FETCH(A,A,TPNX)
JUMPN A,CORNXT
POPJ P,
;REPSET - SET CORRESPONDENCES FOR REPLACEMENT
;A = TYPE TO REPLACE
REPSET: MOVEM A,OLDTYP
MD,< MOVEI T,[ASCIZ/TYPE NEW BODY NAME
/]
>;MD
PUSHJ P,BODYGT
POPJ P, ;ALTMODE
POPJ P, ;NULL
JRST OOPS1 ;NX
MOVEM A,NEWTYP
REPST1: PUSHJ P,REPLST ;INTIALIZE CORLST
MD,< MOVE T,[ASCID/BR/]
MOVEM T,SPMODT
MOVEI T,SPM
PUSHJ P,TCHNGM
MOVEI T,UPREP
MOVEM T,SPDISP
PUSHJ P,PUSHM ;SET PIN IDS ON
PUSH P,H
PUSHJ P,REPAGN
CAIA
AOS -1(P)
POP P,H
PUSHJ P,POPM ;RESTORE STATE OF PIN IDS
JRST RCHNGM ;RESTORE OLD MODE
>;MD
;REPAGN - ASK FOR REPLACEMENT MODE
REPAGN: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/REPLACEMENT MODE (H FOR HELP)?/]
MD,< SETZM KEEPIN ;CLEAR KEEP PINS FLAG
SETZM COPPRP ; " COPY PROPERTIES FLAG
>;MD
MAINTP: PUSHJ P,GETCHR
CAIL C,"A"+40
CAILE C,"Z"+40
CAIA
SUBI C,40
CAIE C,12
TLNE M,DSKACT!MACACT
CAIA
OUTSTR[ASCIZ/
/]
CAIE C,"H"
CAIN C,"?"
JRST [ TVOFF
TLNN M,DSKACT!MACACT
MD,< OUTSTR[ASCIZ/CHAR MODE
E EXACT MATCH BY DEFAULT PIN NAME
N CLOSEST MATCH BY DEFAULT PIN NAME
L EXACT GEOMETRIC OVERLAY
C CLOSEST GEOMETRIC OVERLAY
<CR> ASK ABOUT EACH PIN
<ALT> ABORT
M MAINTAIN PIN NAMES (PRECEEDS OTHER COMMANDS)
P COPY BODY TEXT AND PROPERTIES
/]
>;MD
MPC,< OUTSTR[ASCIZ/CHAR MODE
N MATCH BY PIN #
L EXACT GEOMETRIC OVERLAY
C CLOSEST GEOMETRIC OVERLAY
<CR> ASK ABOUT EACH PIN
<ALT> ABORT
/]
>;MPC
TVON
JRST MAINTP]
MD,< CAIN C,"M"
JRST [ SETOM KEEPIN
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/MAINTAINING PIN NAMES./]
JRST MAINTP]
CAIN C,"P"
JRST [ SETOM COPPRP
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/COPYING PROPERTIES AND TEXT./]
JRST MAINTP]
>;MD
CAIN C,ALTMOD
POPJ P,
MPC,< CAIN C,"N"
JRST SAME
>;MPC
MD,< CAIN C,"N"
JRST CNMAT
CAIN C,"E"
JRST ENMAT
>;MD
CAIN C,"L"
JRST REPLOC
CAIN C,"C"
JRST REPCLS ;MORE FORGIVING THAN L
CAIE C,12
JRST [ PUSHJ P,PERRET
JRST REPAGN]
;Set correspondences manually
MOVEI G,CORLST
TLNN M,DSKACT!MACACT
MD,< OUTSTR[ASCIZ/TYPE CORRESPONDENCE FOR PIN ID'S.
/]
>;MD
MPC,< OUTSTR[ASCIZ/TYPE CORRESPONDENCE FOR PIN NAMES.
/]
>;MPC
JRST GETIN
;GETPIN - ASK FOR CORRESPONDENCES
GETPIN: TLNE M,DSKACT!MACACT
JRST NOTALK
MD,< OUTSTR[ASCIZ/OLD PIN ID /] >
MPC,< OUTSTR[ASCIZ/OLD PIN NAME /] >
HLRZ T,(G) ;PIN IN DEF
FETCH(T,T,TPID)
MD,< PUSHJ P,DECOUT ;PRINT PIN ID
>;MD
MPC,< HRRZ A,T
PUSH P,PUTCHR
MOVE T,[OUTCHR TTT]
MOVEM T,PUTCHR
PUSHJ P,BPINPN ;PRINT AS BODY PIN#
POP P,PUTCHR
>;MPC
OUTSTR[ASCIZ/=/]
NOTALK:
MPC,< MOVE C,[PUSHJ P,GETLCH]
MOVEM C,GTCHRX
PUSHJ P,RPNAM
CAIA
>;MPC
MD,< PUSHJ P,READN >
CAIE C,12
JRST [ PUSHJ P,SCARF
JRST REPST1
JRST GETPIN]
SETZ A,
JUMPE T,NEWOK
MOVEI A,CORLST
JRST CHKNUM
;Check if the new PIN# already asked for
CHKNXT: HLRZ TT,1(A) ;NEW PIN NUMBERS ASKED FOR ALREADY
CAMN TT,T
JRST [ TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/ALREADY USED!
/]
JRST GETPIN]
CHKNUM: HRRZ A,(A)
JUMPN A,CHKNXT
MOVE A,NEWTYP
FETCH(A,A,TPIN)
JRST NEWCH1
;Check if the PIN# asked for is in new TYPE
NEWNXT: FETCH(TT,A,TPID)
CAMN TT,T
JRST NEWOK
NEWCHK: FETCH(A,A,TPNX)
NEWCH1: JUMPN A,NEWNXT
TLNN DSKACT!MACACT
OUTSTR[ASCIZ/NO SUCH PIN IN NEW TYPE!
/]
JRST GETPIN
NEWOK: HRLM T,1(G) ;PIN# ASKED FOR
HRRM A,1(G) ;THAT PIN IN NEW TYPE
GETIN: MOVE H,G
HRRZ G,(G)
JUMPN G,GETPIN
;SAMEDN - FINISH UP CORLST WITH ALL OTHER PINS ON NEWTYP
;FALLS THRU
SAMEDN: MOVE G,NEWTYP
FETCH(G,G,TPIN)
JRST REPNW9
REPNEW: GETFS(T)
HRRZM G,1(T)
EXCH T,CORLST
HRRZM T,@CORLST
REPNW1: FETCH(G,G,TPNX)
REPNW9: JUMPE G,CPOPJ1
FETCH(T,G,TPID) ;A PIN ON NEW TYPE
SKIPN A,CORLST ;CHECK IF ALREADY ON CORLST
JRST REPNEW
REPNW3: HLRZ TT,1(A)
CAMN TT,T
JRST REPNW1 ;OK, IT'S THERE
REPNW2: HRRZ A,(A)
JUMPN A,REPNW3
JRST REPNEW ;NOT THERE, CONS NEW ENTRY ONTO CORLST
;SAME - CORRESPOND TO SAME PIN# IN NEWTYP
MPC,<
;SETUP CORRESPENDENCES - SAME PIN# IN NEWTYP
SAME: SKIPN G,CORLST ;RUN DOWN CORLST
JRST SAMEDN
SAME4: HLRZ T,(G) ;OLD PIN (IN TYPE)
FETCH(T,T,TPID) ;ITS PIN #
MOVE A,NEWTYP
FETCH(A,A,TPIN)
JUMPE A,SAME3
SAME2: FETCH(TT,A,TPID)
CAME T,TT ;SAME PIN IN NEW TYPE?
JRST SAME1
HRRZM A,1(G) ;REMEMBER NEW PIN (IN TYPE)
HRLM T,1(G) ; " PIN #
SAME3: HRRZ G,(G)
JUMPE G,SAMEDN
JRST SAME4
SAME1: HRRZ A,(A)
JUMPN A,SAME2
JRST SAME3
>;MPC
;AUTO REPLACE
MPC,<
REPCL1: PUSHJ P,REPLST ;INITIALIZE CORLST
>;MPC
REPLOC: ;OFFSET CRAP GOES HERE
PUSHJ P,REPCL4
JRST RPLERR
JRST SAMEDN
RPLERR: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/
SORRY, NO EXACT MATCH BY GEOMETRIC OVERLAY POSSIBLE.
/]
JRST REPST1
;FIND CLOSEST PIN YET UNREPLACED
;A = PIN IN NEW TYPE
;RETURNS
;CURPIN = PIN FOUND CLOSEST
;CURDIS = DISTANCE "
FCLONE: SETZM CURPIN ;NO CLOSEST YET!
HRLOI T,77777 ;LARGE NUMBER
MOVEM T,CURDIS ;CURRENT CLOSEST DISTANCE
REPL3: SKIPE 1(G) ;HAVE WE FOUND THIS ONE YET?
JRST REPL2 ;YES, SKIP IT
HLRZ T,(G) ;POINTER TO OLD PIN TYPE BLOCK
FETCH(T,T,TPXY) ;OLD PIN LOCATION
ADJUST(SUB,T,<ADDR(A,TPXY)>)
HLRE TT,T
HRRES T
IMUL T,T
IMUL TT,TT
ADD T,TT ;SQUARE OF DISTANCE
CAML T,CURDIS ;SMALLER?
JRST REPL2 ;NO
MOVEM T,CURDIS ;UPDATE
MOVEM G,CURPIN
REPL2: HRRZ G,(G) ;ANOTHER MEMBER OF CORLST
JUMPN G,REPL3
POPJ P,
;GEOMETIC OVERLAY FOR DIFF NUMBER OF PINS
%MAX__20 ;MAX SEPARATION BETWEEN PINS IN ORDER TO MATCH!
REPCLS: ;OFFSET STUFF GOES HERE ???
PUSHJ P,REPCL4
JFCL ;THIS VERSION DOESN'T CARE
JRST SAMEDN
REPCL4: SKIPN CORLST
POPJ P,
MOVE A,NEWTYP
FETCH(A,A,TPIN)
JUMPE A,CPOPJ
HRLOI B,77777
SETZ H, ;NONE FOUND YET
REPCL2: FETCH(T,A,TPID)
HRL A,T ;PIN#,,PIN
TRZ TFLG
MOVE G,CORLST
REPCL5: CAMN A,1(G) ;IS IT MAPPED YET?
JRST REPCL3 ;YES, TRY ANOTHER
HRRZ G,(G)
JUMPN G,REPCL5
TRO TFLG ;FLAG UN-MAPPED NEW PIN SEEN
MOVE G,CORLST ;NOT USED YET, CHECK DISTANCE
PUSHJ P,FCLONE ;FIND ONE
SKIPN CURPIN ;DID WE FIND ONE
POPJ P, ;NO, RAN OUT OF CORLST I GUESS
CAMG B,CURDIS ;IS IT CLOSEST YET?
JRST REPCL3 ;NO
MOVE B,CURDIS
MOVE H,CURPIN ;SAVE CLOSEST YET
HRL H,A ;SAVE BOTH POINTERS
REPCL3: HRRZ A,(A)
JUMPN A,REPCL2 ;LOOP THROUGH ALL
JUMPE H,REPCL6
CAILE B,%MAX*%MAX ;TO FAR APART?
POPJ P,
HLRZ A,H ;GET POINTER TO NEW PIN
FETCH(T,A,TPID)
HRL A,T ;AND PIN ID
MOVEM A,1(H) ;AND SAVE HERE
JRST REPCL4 ;LOOP UNTIL ALL ASSIGNED
REPCL6: TRNE TFLG ;ALL NEW PINS MAPPED?
POPJ P, ;NO, LOSE RETURN
MOVE H,CORLST
REPCL7: SKIPN 1(H) ;THIS OLD PIN MAPPED?
POPJ P, ;NO, LOSE
HRRZ H,(H)
JUMPN H,REPCL7
JRST CPOPJ1 ;ALL OLD PINS MAPPED, WIN
;MAP BY DEFAULT PIN NAMES
MD,<
CNMAT: PUSHJ P,DONMAT ;BEST MATCH BY DEFAULT PIN NAMES
JFCL
JRST SAMEDN
;AUTO REPLACE
REPCL1: PUSHJ P,REPLST ;INITIALIZE CORLST
SETOM KEEPIN ;MAKE SURE WE KEEP PINS
SETOM COPPRP ;AND PROPERTIES
ENMAT: PUSHJ P,DONMAT ;EXACT MATCH ONLY, BY DEFAULT PIN NAMES
JRST ENERR
JRST SAMEDN
ENERR: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/
SORRY, NO EXACT MATCH BY DEFAULT PIN NAME POSSIBLE.
/]
JRST REPST1
;DONMAT - MATCH PINS BY DEFAULT PIN NAMES, TRIES ITS DAMNDEST
DONMAT: SKIPN CORLST
POPJ P,
TRZ TFLG!ATLP ;TFLG MEANS MATCH WASN'T EXACT
;Clear mark bits on all PINs of new TYPE
MOVE A,NEWTYP
FETCH(A,A,TPIN)
JUMPE A,CPOPJ
DONMT0: CLRBIT(DPTMP1!DPTMP2,TT,A,TPBIT)
FETCH(A,A,TPNX)
JUMPN A,DONMT0
MOVE A,NEWTYP
FETCH(A,A,TPIN)
DONMT1: FETCH(T,A,TPBIT) ;FIND A PIN NOT ASSIGNED YET
TRNE T,DPTMP1
JRST DONMT6
ANDI T,BASSLH
FETCH(TT,A,TPNAM) ;DEFAULT NAME
HRL T,TT ;T = DEF NAME,,BASSLH
FETCH(B,A,TPNX)
JUMPE B,DONMT3
;Check for any other PINS with same default on the new type
DONMT2: FETCH(TTT,B,TPBIT)
ANDI TTT,BASSLH
FETCH(TT,B,TPNAM)
HRL TTT,TT
CAMN TTT,T ;SAME DEFAULT, BUSSED, L/H ?
JRST [ TRO TFLG ;YES, MATCH ISN'T EXACT
JRST DONMT3]
FETCH(B,B,TPNX)
JUMPN B,DONMT2
;Check for only one pin on old type with matching default
DONMT3: MOVE G,CORLST
SETZM CURPIN
DONMT4: SKIPE 1(G) ;NOT MATCHED YET?
JRST DONMT5
HLRZ TT,(G)
FETCH(TTT,TT,TPNAM)
PUSH P,TTT
FETCH(TTT,TT,TPBIT)
ANDI TTT,BASSLH
HRL TTT,(P)
SUB P,[1,,1]
CAME TTT,T
JRST DONMT5
SKIPE CURPIN
JRST [ TRO TFLG ;MORE THAN ONE POSSIBLE MATCH ON OLD BODY
JRST DONMTB]
MOVEM G,CURPIN
DONMT5: HRRZ G,(G)
JUMPN G,DONMT4
DONMTB: SKIPN G,CURPIN
JRST [ TRO ATLP ;NEW PIN NOT MATCHED ON OLD BODY
JRST DONMT6]
FETCH(T,A,TPID)
HRL A,T
MOVEM A,1(G) ;UNIQUE MATCH, SET CORRESPONDENCE
SETBIT(DPTMP1,TT,A,TPBIT)
DONMT6: FETCH(A,A,TPNX)
JUMPN A,DONMT1
;FALLS THRU
;TRY LOOSER MATCH
TRNN ATLP ;ANY NOMATCH ON A NEW PIN ?
JRST REPCL6 ; NO, CHECK IF ANY ERRORS IN MATCHING
;PASS2 - Try looser match, for those pins that weren't found above
MOVE A,NEWTYP
FETCH(A,A,TPIN)
DONMA1: FETCH(T,A,TPBIT)
TRNE T,DPTMP2!DPTMP1 ;UNMATCHED?
JRST DONMA6
NODEC,< FETCH(T,A,TPNAM) > ;LOOK FOR ANY PIN WITH SAME DEFAULT PIN NAME
DEC,< ANDI T,BUSSED ;DEC, A LITTLE STRICTER, SINCE WE DID L/H LAST TIME
FETCH(TT,A,TPNAM)
HRL T,TT
>;DEC
FETCH(B,A,TPNX)
JUMPE B,DONMA3
DONMA2:
NODEC,< FETCH(TTT,B,TPNAM) > ;,,TPNAM
DEC,< ANDI TTT,BUSSED
FETCH(TT,B,TPNAM)
HRL TTT,TT ;TPNAM,,BUSSED
>;DEC
CAMN TTT,T
JRST [ FETCH(TTT,B,TPBIT) ;SAME DEFAULT
TRNE TTT,DPTMP1 ; APPEARS UNMATCHED TWICE ON NEW TYPE?
JRST .+1
TRO TFLG ;LOOSER MATCH IS AMBIGUOUS
JRST DONMA3]
FETCH(B,B,TPNX)
JUMPN B,DONMA2
;Now see if there is a single pin in old TYPE that matches this looser eqv
DONMA3: MOVE G,CORLST
SETZM CURPIN
DONMA4: SKIPE 1(G) ;NOT MATCHED YET?
JRST DONMA5
HLRZ TT,(G)
NODEC,< FETCH(TTT,TT,TPNAM) > ;,,TPNAM
DEC,< FETCH(TTT,TT,TPBIT)
ANDI TTT,BUSSED
PUSH P,TTT
FETCH(TTT,TT,TPNAM)
HRLM TTT,(P)
POP P,TTT ;TPNAM,,BUSSED
>;DEC
CAME TTT,T
JRST DONMA5
SKIPE CURPIN ;MATCHES TOO MANY IN OLD TYPE?
JRST [ TRO TFLG ;MATCH NOT EXACT, BUT DO OUR BEST
JRST DONMA7]
MOVEM G,CURPIN
DONMA5: HRRZ G,(G)
JUMPN G,DONMA4
DONMA7: SKIPN G,CURPIN
JRST [ TRO TFLG ;NO MATCH FOR THIS PIN, ERROR
JRST DONMA6]
FETCH(T,A,TPID)
HRL A,T
MOVEM A,1(G)
SETBIT(DPTMP2,TT,A,TPBIT) ;NOT NEEDED?
DONMA6: FETCH(A,A,TPNX)
JUMPN A,DONMA1
JRST REPCL6
;THERE SHOULD PROBABLY BE N PASSES, IN ORDER OF INCREASING LOOSENESS
>;MD
REPONE: PUSHJ P,GETCLS
POPJ P,
PUSH P,A
FETCH(A,A,BTYP)
PUSHJ P,REPSET ;SET UP CORRESPONDENCE
JRST [ POP P,(P)
JRST CLRREP]
POP P,G
PUSHJ P,REPIT
TRO MCHG
JRST CLRREP
IFN 0,< PUSHJ P,CLRREP ;STRAIGHTEN AUTOMATICALLY?
MD,< JRST STRAIGHTEN >
MPC,< POPJ P, >
>;IFN 0
REPALL:
MD,< MOVEI T,[ASCIZ/TYPE OLD BODY NAME
/]
>;MD
PUSHJ P,BODYGT
POPJ P, ;ALTMODE
POPJ P, ;NULL
JRST OOPS1 ;NX
PUSHJ P,REPSET
JRST CLRREP
REPLOP:
TRO MCHG
SKIPN G,DBODPN
JRST CLRREP
REPLP2: FETCH(B,G,BTYP)
CAMN B,OLDTYP ;DOES THIS BODY HAVE THE RIGHT TYPE?
PUSHJ P,REPIT
REPLP1: FETCH(G,G,BNXT)
JUMPN G,REPLP2
JRST CLRREP
IFN 0,< PUSHJ P,CLRREP
MD,< JRST STRAIGHTEN >
MPC,< POPJ P, >
>;IFN 0
;REPSOME - SELECTIVE REPLACE BODY
REPSOME:
MD,< MOVEI T,[ASCIZ/TYPE OLD BODY NAME
/]
>;MD
PUSHJ P,BODYGT
POPJ P, ;ALTMODE
POPJ P, ;NULL
JRST OOPS1 ;NX
PUSHJ P,REPSET
JRST CLRREP ;LET HIM OUT
MOVEI T,UPSTAR ;WHERE TO GO IN UPCLOS
MOVEM T,SPDISP
MOVE T,[ASCID/BR/]
MOVEM T,SPMODT
MOVEI T,SPM
PUSHJ P,TCHNGM ;GET INTO SPECIAL POINTER MODE
SKIPN G,DBODPN
JRST REPALT
JRST REPSP1
REPSPC: MOVE G,CURREP
HRRZ G,(G)
JUMPE G,REPALT
REPSP1: MOVEM G,CURREP
FETCH(A,G,BTYP)
CAME A,OLDTYP
JRST REPSPC ;KEEP LOOKING
MOVEI T,BIGPG
MOVEM T,PGLASS
PUSHJ P,DPYSET
PUSHJ P,SETBRT
FETCH(T,G,BXY)
TLNE M,DSKACT!MACACT
JRST ISON ;NO, ALL BODIES ARE ON
PUSHJ P,ONSCR ;IS IT ON SCREEN?
PUSHJ P,PICSET ;NO, GET IT ON
ISON: MOVEM T,STARLOC
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/
THIS ONE/]
PUSHJ P,YORN
JRST REPALT
JRST REPSPC
MOVE G,CURREP
PUSHJ P,REPIT
TRO MCHG
IFN 0,<MD,< PUSHJ P,STRAIGHTEN >>
JRST REPSPC
REPALT: PUSHJ P,RCHNGM ;RESTORE OLD MODE
CLRREP: SKIPE B,CORLST
PUSHJ P,PUTFS
SETZM CORLST
POPJ P,
;REPLACE BODY
; G = OLD BODY
; NEWTYP = NEW TYPE
; OLDTYP = TYPE OF OLD BODY
REPIT: PUSH P,G
MOVE T,NEWTYP
STORE(T,G,BTYP)
MD,< CAMN T,OLDTYP ;DON'T COPY PROPERTIES IF SAME BODY
JRST REPITP
HRRZ T,(P)
PUSHJ P,OFFBLO ;FIX CHAR OFFSET IF BIT ON
FETCH(T,G,BBIT)
TRNN T,FIXLOC ;LOCN FOLLOWING DEFAULT?
JRST NFXBLC
FETCH(B,G,BLOC) ;YES, AND THERE IS LOCN?
JUMPE B,NFXBLC ;JUST IN CASE
MOVE A,G
PUSHJ P,STLCOF ;SET LOCN OFFSET FROM NEW TYPE
NFXBLC: FETCH(C,G,BTXT) ;BODY PROP LIST
CLEAR(G,BTXT) ;ZERO POINTER TO IT
SKIPN COPPRP ;COPY PROPERTIES?
JRST [ PUSHJ P,TXTREL ;NO, RELEASE PROP LIST STG IN C
JRST REPITP]
JUMPE C,REPITP ;NOTHING TO DO IF NO LOCAL PROPS
;Now merge local PROP/TEXT with those from TYPE def
MOVE A,G ;GET BODY POINTER
PUSHJ P,COPLTP ;COPY TYPE'S TEXT/PROPERTIES INTO BODY'S INDIRECT LIST
MOVE B,C ;OLD PROP LIST IN B
PUSHJ P,MERGEP ;MERGE OLD PROPS ONTO NEW
PUSHJ P,TXTREL ;RECLAIM OLD PROP LIST (C)
REPITP:
>;MD
MPC,< SWITCH
MOVEI G,RADDR(G,BLNK,BPLNK) ;MAKE FIRST PTR LOOK LIKE REST OF LIST
HRRZ F,(P) ;BODY
PUSHJ P,REPIT1 ;DO BACK SIDE FIRST
HRRZ G,(P)
SWITCH
>;MPC
MOVEI G,RADDR(G,BLNK,BPLNK) ;MAKE FIRST PTR LOOK LIKE REST OF LIST
HRRZ F,(P) ;BODY
PUSHJ P,REPIT1 ;DO IT
HRRZ A,(P) ;BODY POINTER
PUSHJ P,BODFIX ;FIX ALL THE PINS ON IT!
POP P,G ;RESTORE BODY POINTER
POPJ P,
;REPIT1 - REPLACE PINS ON BODY BEING REPLACED
;G = RADDR(,BLNK,BPLNK)
;F = BODY POINTER
;REPIT2
;G = BPOINT
;H = PREVIOUS
;A = CORRESPONDENCE BLOCK
REPIT2: HRRZ T,1(A)
JUMPN T,REPDL5 ;REPLACE?
MOVE B,G
FETCH(G,G,BPLNK) ;NO, TURN INTO POINT
STORE(G,H,BPLNK) ;LINK THIS PIN OUT
PUSHJ P,PINPNT ;CHANGE PIN TO PLAIN POINT
JRST REPDL4
REPDL5: STORE(T,G,BPLOC) ;NEW TYPE PIN POINTER
MD,< SKIPN KEEPIN ;KEEPING PIN #'S?
CLEAR(G,BPPN) ;NO, FLUSH THEM
>;MD
PUSH P,F
FETCH(B,G,BBODY) ;BODY POINTER
FETCH(F,B,BORI) ;GET ORIENTATION FROM OLD BODY
FETCH(T,T,TPXY) ;X,Y FROM PIN TYPE BLOCK
PUSHJ P,ORIENT ;ORIENT IT
ADJUST(ADD,T,<ADDR(B,BXY)>) ;ADJUST TO BODY LOCATION
MOVE A,SAVEG
MD,< PUSH P,G
PUSHJ P,PMOVRL ;MOVE TO NEW POS!
POP P,G
>;MD
POP P,F
REPIT1: MOVE H,G ;SAVE POINTER TO PREVIOUS FOR LINK OUT
FETCH(G,G,BPLNK)
REPDL4: JUMPE G,REPMAK ;DONE WITH OLD PINS, NOW MAKE EXTRA PINS
MOVEM G,SAVEG
MPC,< FETCHL(TT,G,BPBIT)
EQV TT,SID
JUMPGE TT,REPIT1 ;SAME SIDE?
>;MPC
FETCH(T,G,BPLOC)
MOVEI A,CORLST ;CORRESPONDENCE LIST
JRST REPIT3
REPIT4: HLRZ TT,(A)
CAMN TT,T ;SAME PIN IN TYPE?
JRST REPIT2
REPIT3: HRRZ A,(A)
JUMPN A,REPIT4
OUTSTR[ASCIZ/POINT NOT FOUND AT REPIT4!!
/]
PUSHJ P,FUCKUP
JRST REPIT1 ;THIS SHOULDN'T HAVE HAPPENED
;REPMAK - MAKE EXTRA PINS IN NEW BODY
;H = END OF BPOINT LIST
;F = BODY
REPMAK: MOVEI G,CORLST ;MAKE EXTRA PINS REQUIRED BY REPLACEMENT
PUSH P,F ;BODY
JRST REPMK1
REPMK2: HLRZ A,(G) ;TPIN OF OLD PIN
JUMPN A,REPMK1 ;NOT A NEW PIN?
HRRZ A,1(G) ;POINTER TO NEW TPIN BLOCK
MOVE B,(P) ;BODY POINTER
HRLI B,ISPIN ;PIN
PUSHJ P,PUTPNT ;MAKE IT (D RETURNED = POINT CREATED)
MPC,< FETCH(TT,A,TPID) ;PIN # FROM DEF
MOVEI T,1 ;INITIALLY USE NORMAL PAD FOR PIN
CAIN TT,1 ;PIN 1?
MOVEI T,3 ;MAKE IT END UP PAD TYPE 3 (SQUARE)
STORE(T,D,BPPN)
>;MPC
STORE(D,H,BPLNK) ;LINK ONTO END OF OLD PIN LIST
MOVE H,D ;MAKE THIS NEW ONE END OF LIST
REPMK1: HRRZ G,(G)
JUMPN G,REPMK2
POP P,F
POPJ P,