1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-27 20:47:38 +00:00
Files
PDP-10.its/src/wl/wlin.332
2018-05-05 19:19:09 +02:00

2366 lines
53 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.
;<WIRELIST>WLIN.FAI.177, 26-NOV-75 10:22:37, EDIT BY HELLIWELL
SUBTTL 'WD' 'WPC' 'BAC' 'BEQ' SETUP
;BACK PANEL EQUIVALENCE INPUT
READEQ: MOVSI T,'BEQ'
TRZ PCNOTD!DOPRTL
TRO ISBACK!DOBEQ
JRST WREAD
;BACK PANEL INPUT SETUP (OR JUST PARTS IN)
RDPART: TROA DOPRTL
BREADD: TRZ DOPRTL
MOVSI T,'BAC'
TRZ PCNOTD!DOBEQ
TRO ISBACK
JRST WREAD
;WIRE LIST EQUIVALENCE INPUT
RDWEQ: MOVSI T,'WEQ'
TRZ PCNOTD!ISBACK!DOPRTL
TRO DOBEQ
JRST WREAD
;WIRE LIST INPUT SETUP
WREADD: MOVSI T,'WD '
TRZ PCNOTD!ISBACK!DOBEQ!DOPRTL
JRST WREAD
WREADP: MOVSI T,'WPC'
TRO PCNOTD
TRZ ISBACK!DOBEQ!DOPRTL
WREAD: MOVEM T,DEFEXT
MOVE TT,[PUSHJ P,TTYOUT]
MOVEM TT,PUTCHR
MOVE L,DEFLST
SKIPGE NOMTYP
JRST [ OUTSTR[ASCIZ/NO NOMENCLATURE TYPE SET.
/]
PUSHJ P,NOMSET
SKIPGE NOMTYP
JRST ERRET
OUTSTR[ASCIZ/
/]
JRST .+1]
PUTSIX DEFEXT
OUTSTR[ASCIZ/ INPUT FILENAME?/]
PUSHJ P,MAKLST ;NEVER RETURNS HERE ON ERRORS
HRRZ T,DIRLST
JUMPE T,CPOPJ ;QUIT NOW IT NOTHING IN LIST
TRNN DOWIE ;DOING WIRELIST ERROR FILE?
JRST NOWIE ;NO, GO TO TTY
MOVSI T,'WIE' ;WIRELIST INPUT ERRORS
MOVEI TT,0
MOVSI TTT,'DSK' ;FILE IT!
PUSHJ P,OUTSET
CAIA
JRST GOTWIE
NOWIE: SETOM TTYFLG
GOTWIE: SKIPE TTYFLG
RELEASE LST, ;IF TTY OUTPUT, WILL USE TTYUUO'S
MOVE TT,[PUSHJ P,TTYOUT] ;START OUTPUTTING TO TTY
MOVEM TT,PUTCHR
TRNE ISBACK
JRST XNDIPS ;DON'T NEED DIPS FOR BACK PANEL
PUSHJ P,DIPCHK
OUTSTR[ASCIZ/COULDN'T GET DIPS IN, WILL GO ON ANYWAY!
/]
XNDIPS: TRNE DOBEQ ;EQUIVALENCE FILE INPUT?
JRST [ PUSHJ P,IN0
POPJ P,
JRST IN0DON]
PUSHJ P,IN10
POPJ P,
;PROCESS EACH INPUT SPEC
;FALLS THRU
IN0DON: HRRZ H,DIRLST
NXTDIR: MOVEI G,RADDR(H,CVAR,NSLC)
SETZM SLICEL
SETZM CDSKPC ;CLEAR UN-CRDLOC'D COUNT
FETCH(T,G,NSLC) ;DO NEXT SLICE CHECK NOW
JUMPE T,NOSLC ;IS THERE EVEN ONE?
MOVE G,T ;YES, USE IT
SLCNXT: FETCH(T,G,CDLC)
HRLZM T,SLICEL
FETCH(T,G,VLST)
JUMPE T,[SETZM VARLST
MOVEI T,377777
MOVEM T,UPPER
MOVEM T,WIDTH
MOVNI T,400000
MOVEM T,LOWER
JRST NOSLC]
FETCH(TTT,G,LBND)
MOVEM TTT,LOWER
FETCH(TTT,G,UBND)
MOVEM TTT,UPPER
SUB TTT,LOWER
ADDI TTT,1
MOVEM TTT,WIDTH
MOVEM T,VARLST
SETZM VARERR ;NO ERRORS ON THIS LIST YET
NOSLC: FETCH(T,H,DFIL)
MOVEM T,FILNAM
FETCH(T,H,DEXT)
HRLZM T,FILEXT
FETCH(T,H,DPPN)
MOVEM T,FILPPN
SETZM FILDAT
MOVE T,[PUSHJ P,TTYIN]
MOVEM T,GETCHR
PUSHJ P,PTERM
MOVE T,FILPPN
LOOKUP DAT,FILNAM
JRST [ OUTSTR[ASCIZ/, LOOKUP FAILED, CODE= /]
HRRZ T,FILEXT
PUSHJ P,DECOUT
OUTSTR[ASCIZ/
/]
FETCH(T,H,DIRNXT)
JUMPE T,DIRDON
PUSHJ P,IERR ;CHECK DSKIN ERROR
ASK[ASCIZ/GO ON?/]
JRST DIRDON
JRST DIRDON
JRST GOON]
MOVEM T,FILPPN
MOVE TT,[PUSHJ P,BYTIN]
MOVEM TT,GETCHR
PUSH P,H
PUSH P,G ;THIS GETS CLOBBERED
PUSHJ P,DOREAD
MOVE T,[PUSHJ P,TTYOUT] ;OUTPUT TO TTY
MOVEM T,PUTCHR
POP P,G
POP P,H
FETCH(G,G,NSLC) ;NEXT SLICE BLOCK
JUMPN G,SLCNXT
GOON: TRNE ISBACK
SKIPN T,CDSKPC
JRST NOCDPN
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ CARDS SKIPPED DUE TO NO LOC.
/]
NOCDPN: FETCH(H,H,DIRNXT)
JUMPN H,NXTDIR
DIRDON: RELEASE DAT,
POPJ P,
PSLICL: PUSH P,A
PUSH P,TTT
HLRZ A,SLICEL
PUSHJ P,SLTOUT
POP P,TTT
POP P,A
POPJ P,
PTERM: PUSH P,A
MOVEI A,FILNAM
PUSHJ P,FILPNT
POP P,A
PSLVAR: SKIPN SLICEL
JRST NOLOCL
PUTBYT 11
PUSHJ P,PSLICL
NOLOCL: SKIPN VARLST
POPJ P,
SKIPN SLICEL
PUTBYT 11
PUTBYT "("
MOVE T,LOWER
CAMN T,[-400000]
JRST BTNUPR
PUSHJ P,DECOUT
PUTBYT 74
BTNUPR: MOVE T,UPPER
CAIN T,377777
JRST BTNLP1
PUSHJ P,DECOUT
PUTBYT 76
BTNLP1: SKIPN A,VARLST
JRST NOVARS
CAIA
BTNLOP: PUTBYT ","
FETCH(T,A,LET)
PUTBYT @T
PUTBYT "="
FETCH(T,A,WID)
MOVEM T,NDIG
FETCH(T,A,VAL)
PUSHJ P,NDECOUT
FETCH(A,A,NVAR)
JUMPN A,BTNLOP
NOVARS: PUTSTR[ASCIZ/)/]
POPJ P,
; MAKE LIST, READ FILE INFO
;READ ONE SLICE OF A WIRE LIST
MAKHED: PGETFS(W,WLBLOCK)
BCLEAR(T,W,WLBLOCK) ;CLEAR OUT BLOCK
MOVEI T,RADDR(W,WIRES,ALPH);INITIAL GENLAST
HRL T,T
STORE(T,W,HASHTB) ;0 WORD OF HASH TABLE IS INITED TO WIRE HEADER
POPJ P,
DOREAD: TRNE ISBACK
JRST BAKIN
MOVEI W,RADDR(L,WIRL,NXTWL)
TRNE PCNOTD
MOVEI W,RADDR(L,PCWL,NXTWL)
TRNE DOBEQ
JRST FNDSLQ ;BACKPANEL EQUIV INPUT
XCT GETCHR
JRST ILLEND
TRNN PCNOTD
JRST CKWDVR
;RIGHT PC VERSION # ?
CAIN TTT,WPCVER
JRST CKCLOC
OUTSTR[ASCIZ/
VERSION # MISMATCH, MAYBE YOU SHOULD REWRITE IT!
/]
TRNN TTT,400000
OUTSTR[ASCIZ/
THIS IS A 'WD' FILE, NOT A 'WPC' FILE!
/]
JRST ERRET
;RIGHT D VERSION # ?
CKWDVR: CAIN TTT,WDVER
JRST CKCLOC
OUTSTR[ASCIZ/
VERSION # MISMATCH, MAYBE YOU SHOULD REWRITE IT!
/]
TRNE TTT,400000
OUTSTR[ASCIZ/
THIS IS A 'WPC' FILE, NOT A 'WD' FILE!
/]
JRST ERRET
CKCLOC: XCT GETCHR
JRST ILLEND
HLLZ TTT,TTT ;SOMEHOW THIS GOT CRUFT IN IT, GET RID OF THE CRUFT
JUMPE TTT,FNDSL0
EXCH TTT,SLICEL
JUMPE TTT,FNDSLP
CAMN TTT,SLICEL
JRST FNDSL0 ;CARD LOC IN FILE = CARD LOC CALLED FOR?
OUTSTR[ASCIZ/
CARD LOC FROM FILE = /]
PUSH P,TTT
PUSHJ P,PSLICL
POP P,SLICEL ;USE WHAT HE TYPED
OUTSTR[ASCIZ/, USING WHAT YOU TYPE INSTEAD!
/]
JRST FNDSL0
FNDSLP: OUTCHR[11]
PUSHJ P,PSLICL
FNDSL0: OUTSTR[ASCIZ/
/]
JRST FNDSL1
;FNDSLQ - FIND WIRELIST THAT SLICE GOES INTO
FNDSLQ: SKIPE SLICEL ;ZERO CARD LOC?
JRST FNDSL1 ;NO
FETCH(T,W,NXTWL)
JUMPE T,FNDSL1
FETCH(T,T,NXTWL)
JUMPN T,FNDSL1 ;MORE THAN ONE?
FETCH(W,W,NXTWL) ;NO, USE SINGLE CARD
FETCH(T,W,FCRD)
HRLZM T,SLICEL
OUTCHR[11]
PUSHJ P,PSLICL
JRST BODLP0 ;MAKE OUTPUT TESTS
;find place in sorted list of WIRELISTs that this card goes
FNDSLC: FETCH(T,W,FCRD)
MOVS T,T
CAML T,SLICEL ;IS THIS WHERE WE GO?
JRST [ CAMN T,SLICEL ;YES, EXACT MATCH?
JRST BODLP0 ;YES
JRST MAKHD1]
FNDSL1: MOVE A,W
FETCH(W,W,NXTWL)
JUMPN W,FNDSLC
MAKHD1: PUSHJ P,MAKHED
FETCH(T,A,NXTWL) ;LINK IN SORTED
STORE(T,W,NXTWL)
STORE(W,A,NXTWL)
HLRZ T,SLICEL
STORE(T,W,FCRD)
;PROCESS SINGLE WIRELIST
;FALLS THRU
BODLP0: PUSHJ P,WIESTR ;SETUP INPUT ERROR LISTING
TRNE DOBEQ
JRST EQVSGW
PGETFS(B,FBLK)
BCLEAR(T,B,FBLK)
MOVEM B,THSFIL ;CURRENT FILENAME!
HLRZ T,SLICEL
MOVEM T,PINLOC
PUSHJ P,FVCOPY ;COPY CARDLOC AND VARIABLE STUFF INTO FILE BLOCK
TRNE PCNOTD
JRST [ MOVE T,FILNAM
STORE(T,B,FILN)
HLRZ T,FILEXT
STORE(T,B,FEXT)
MOVE T,FILPPN
STORE(T,B,FPPN)
JRST PCONLY]
FOR I IN(FPOL,FDAT,FILN)
< XCT GETCHR
JRST ILLEND
STORE(TTT,B,I)
>
XCT GETCHR
JRST ILLEND
HLRZ T,TTT ;EXT ONLY FOR NOW
STORE(T,B,FEXT)
XCT GETCHR
JRST ILLEND
STORE(TTT,B,FPPN)
PCONLY: MOVEI A,RADDR(W,FILS,FNXT)
PUSHJ P,FILMER ;CHECK FOR DUPLICATE FILES
FETCH(TTT,B,FPRF)
JUMPE TTT,MORE5A ;PREFIX ?
HRRZ T,(TTT)
JUMPE T,MORE5A
MOVE T,1(T)
TRNE T,376
JRST MORE5B ;PREFIX TOO LONG
MORE5A: FETCH(TTT,B,FMOD)
JUMPE TTT,BODLOP
HRRZ T,(TTT)
JUMPE T,NOMDTL
MORE5B: PUTSTR[ASCIZ\MODULE NAME AND/OR DRAWING PREFIX
WITH TOO MANY CHARS FROM FILE:
\]
PUSHJ P,FBLKPN
FETCH(TTT,B,FMOD)
NOMDTL: TRZ FLAG ;NO OTHER STRINGS SEEN YET
FETCH(A,W,FILS)
MODCK1: CAIN A,(B)
JRST MODCK2 ;DON'T CHECK US
FETCH(T,A,FMOD)
JUMPE T,MODCK2
TRO FLAG ;SEEN ONE
FETCH(TT,B,FMOD)
PUSHJ P,TXTMAT
JFCL
SKIPA C,A
JRST BODLOP
MODCK2: FETCH(A,A,FNXT)
JUMPN A,MODCK1
TRNN FLAG
JRST BODLOP
PUTSTR[ASCIZ/MULTIPLE MODULE NAMES ON THIS CARD FROM FILES:
/]
PUSHJ P,FBLKPN
MOVE B,C
PUSHJ P,FBLKPN
;FALL INTO BODLOP
; READ BODIES
BODLOP: XCT GETCHR ;READ A WORD
JRST ILLEND
JUMPE TTT,DOWIRES ;YES, GO DO WIRES
PUSH P,TTT ;SAVE LH (LOC ON DRWING) FOR LATER
HRRZM TTT,BID
XCT GETCHR ;READ LOC (AND BODY BITS (PC))
JRST ILLEND
HRRZM TTT,PINLOC
TRNE PCNOTD
JRST [ HLRZM TTT,FACTR1 ;STORE BODY BITS HERE
SETZM STRTAB ;CLEAR BODY NAME
POP P,TTT
HLLM TTT,FACTR1 ;STORE # OF PINS HERE
JRST RDDIP] ;MAKE BODY AND READ DIP TYPE
HRRI TTT, ;GET JUST BAY-RACK-SLOT
JUMPE TTT,LOOKT1 ;BLANK OR
CAME TTT,SLICEL ;SAME CARD
JRST [ POP P,(P) ;NO, IGNORE THIS BODY
XCT GETCHR ;SKIP BITS,,0
JRST ILLEND
PUSHJ P,SKPSTR ;SKIP BODY NAME
JFCL
BDSKP1: PUSHJ P,SKPSTR ;SKIP PACKAGE NAME, OR VALUE PART OF PROPERTY
JFCL
PUSHJ P,SKPSTR ;SKIP PROPERTY NAME
JRST BDSKP1 ;NOT NULL, SKIP VALUE ALSO
JRST BODLOP]
LOOKT1: POP P,T ;APPROX X,Y OF BODY ON DRWING
XCT GETCHR ;GET BODY BITS
JRST ILLEND
TRZ TTT,-1 ;NOTHING IN RH
HLRZ TT,T ;NOW STUFF X,Y POS INTO BITS
JUMPE TT,XANYPS ;SKIP IF NONE
SUBI TT,1001
DPB TT,[POINT BXPOSL,TTT,35-BXPOSB];STO X POS
LSH TT,-9
DPB TT,[POINT BYPOSL,TTT,35-BYPOSB];STO Y POS
TRO TTT,BANYPOS ;MARK AS HAVING POS BITS
XANYPS: HRRZM TTT,FACTR1 ;STORE BODY BITS AND POS HERE
PUSHJ P,TRSTR ;READ BODY NAME INTO STRTAB
JRST ILLEND
JRST ILLEND ;SHOULDN'T HAPPEN
RDDIP: PUSHJ P,BODFND
JRST RDDIP1 ;NOT FOUND, AS IT SHOULD BE
TRNE PCNOTD ;OK IF PC CARD
JRST RDDIP1
PUTSTR[ASCIZ/LOSE BIG, BODY "/]
PUTSTR STRTAB ;PRINT BODY NAME
PUTSTR[ASCIZ/" ALREADY EXISTS AT BODY INPUT TIME!
/]
RDDIP1: PUSHJ P,BODMK2 ;MAKE AND LINK BODY, NAME WILL BE COPIED FROM STRTAB
TRNE PCNOTD ;ONLY FOR D
JRST [ PUSHJ P,RSTR ;READ DIP NAME
JRST BODLOP ;NONE
MOVEM T,STRING
PUSHJ P,BODDIP ;GET DIP TYPE SETUP
JRST [ PUSHJ P,DPLOST
JRST BODLOP]
JRST RPRPDN]
MOVE TTT,FACTR1
STORE(TTT,A,BBIT) ;STORE BODY BITS (SHOULDN'T BE ANY OTHERS ON YET)
; Read D's idea of Package Name and compile into Package code
PUSHJ P,RSTR ;GET PACKAGE NAME
JRST RDDIP8
MOVE B,T ;SAVE STRING
PUSH P,A ;SAVE BODY
PUSHJ P,MATPAK
JRST [ PUTSTR [ASCIZ /UNKNOWN PACKAGE TYPE "/]
MOVE T,B
PUSHJ P,STROUT
PUTSTR [ASCIZ /" ON /]
MOVE A,(P)
PUSHJ P,PBODY
CRLF
SETZ A,
JRST .+1]
PUSHJ P,PUTFS
MOVE T,A ;PACKAGE CODE
POP P,A
STORE(T,A,BPAK)
; Read the bodies properties (including DIPTYPE)
RDDIP8: PUSHJ P,GETPRP
MOVE B,PRPLST
STORE(B,A,PRPX)
MOVE B,LSTPART
STORE(B,A,PRTN)
JUMPE B,RPRP12
FETCH(T,B,PRBT)
TRO T,PNUSED
STORE(T,B,PRBT)
RPRP12: MOVE B,LSTDIP
STORE(B,A,DIPT)
FETCH(T,A,PRPX)
SKIPN T,PRPLST
JRST RPRPDN
JUMPE T,RPRPDN ;JUMP IF NO EXTRA PROPERTIES
; See if this PROP list is already on this DIP
SETZM TMPCN1
RPRPX0: AOS TMPCN1
FETCH(T,T,NXTT)
JUMPN T,RPRPX0
;TRY TO INTERN THIS PRPLST, TO SAVE SPACE I SUPPOSE
MOVEI G,RADDR(W,WBDY,NXTB)
RPRPX1: FETCH(G,G,NXTB)
JUMPE G,RPRPDN
RPRPX2: CAIN G,(A)
JRST RPRPX1 ;DON'T LOOK AT OURSELVES
FETCH(T,G,BBIT)
TRNE T,PRX2ND ;THE PRIME COPY ?
JRST RPRPX1 ; PROBABLY WON'T BE NEW POSSIBILITY OTHERWISE
FETCH(E,G,PRPX)
JUMPE E,RPRPX1
PUSHJ P,PRXMAT
JRST RPRPX1
FETCH(F,G,PRPX) ;FOUND ALREADY THERE, COPY IT
STORE(F,A,PRPX)
FETCH(T,A,BBIT) ;MARK AS 2ND COPY
TRO T,PRX2ND
STORE(T,A,BBIT)
;READ BODIES - CHECK DIP TYPE
RPRPDN: FETCH(B,A,DIPT) ;GET DIP TYPE POINTER BACK
JUMPE B,BODLOP
TRNN PCNOTD
JRST DOINVT ;GO INVENT POWER/GROUND
FETCH(T,B,DPNN)
HLRZ TT,FACTR1 ;# OF PINS FROM PC
CAMN TT,T ;PC AND WL AGREE ABOUT SIZE OF DIP ?
JRST BODLOP
FETCH(A,B,DNAM) ;DIPNAME POINTER
PUSHJ P,STROUT ;DIPNAME
PUTSTR[ASCIZ/ (/]
FETCH(T,B,DPNN)
PUSHJ P,DECOUT ;# OF PINS ON DIP
PUTSTR[ASCIZ/ PINS) IN /]
HLRZ T,FACTR1
PUSHJ P,DECOUT ;# OF PINS ON SOCKET
PUTSTR[ASCIZ/ PIN SOCKET/]
SKIPN PINLOC
JRST NCLOC
PUTSTR[ASCIZ/ AT /]
MOVE A,PINLOC
PUSHJ P,LOCOUT ;LOC
NCLOC: PUTSTR[ASCIZ/!
/]
JRST BODLOP
DIPCHECK
DIPFND: HLRZ T,(B)
MOVE TT,STRING
PUSHJ P,DSORT
JFCL
CAIA
JRST CPOPJ1
HRRZ B,(B)
JUMPN B,DIPFND
POPJ P,
BODDIP: SKIPN B,DIPLST
POPJ P,
DIPCHECK
PUSHJ P,DIPFND
POPJ P,
STORE(B,A,DIPT) ;STORE DIP TYPE POINTER
JRST CPOPJ1 ;SUCCESS
DPLOST: FETCH(A,A,BLOC)
JUMPE A,[PUTSTR[ASCIZ/BODY WITH NO LOCATION/]
JRST DPLST1]
PUTSTR[ASCIZ/BODY AT LOCATION /]
PUSHJ P,LOCOUT
DPLST1: PUTSTR[ASCIZ/, DIPTYPE "/]
MOVE A,STRING
PUSHJ P,STROUT ;DIPNAME
PUTSTR[ASCIZ/", NOT FOUND!
/]
MOVE B,STRING
JRST PUTFS
;CREATE INVENTED SIGNAL NAMES FOR GND, AND ALL FLAVORS OF PWR ON DIP
; The invented pins may be removed later if explicit drawing
DOINVT: TRNE FLAG ;FIRST BODY IN THIS LOC?
JRST BODLOP ;NO, SKIP IT
MOVEM A,BSLOT ;SAVE BODY POINTER HERE
FETCH(A,B,DPIN) ;GET DIP PIN LIST
JUMPE A,BODLOP ;QUIT IF NONE
DOINV1: FETCH(T,A,DPBIT) ;GET PIN BITS
TRNN T,PWR!GND ;POWER OR GROUND PIN?
JRST DOINV2 ;NO, SKIP IT
HRLM A,BSLOT ;SAVE PIN POINTER HERE
SETZM PID
SETZM PINTMP
FETCH(TT,A,DPNM)
MOVEM TT,PINNUM
SETZB G,WQNWRD ;NO WIRE YET
TRNE T,GND
JRST [ PUSHJ P,MAKGND
JRST DOINV5]
FETCH(T,A,LLOW) ;THE VOLTAGE
PUSHJ P,MAKPWR
DOINV5: HRRZ F,BSLOT ;GET BODY POINTER
PUSHJ P,PMAKE
PUSHJ P,PMERGE
FETCH(T,E,PBIT)
TRO T,INVENT
STORE(T,E,PBIT)
HLRZ A,BSLOT
DOINV2: FETCH(A,A,DPNX)
JUMPN A,DOINV1
JRST BODLOP
;MAKPWR - GENERATE NEW SIGNAL FOR GND OR PWR RUN AND ADD TO CURRENT WIRE
;T = VOLTAGE
MAKGND: MOVE T,[ASCII /GND/]
MOVEM T,STRTAB ;THIS IS SIGNAL NAME "GND"
JRST DOINV3
MAKPWR: MOVE B,[POINT 7,STRTAB] ;CREATE SIGNAL NAME FOR PWR
MOVEM B,TMPCN1
MOVE B,[IDPB TTT,TMPCN1]
EXCH B,PUTCHR
SKIPL T
PUTBYT "+"
SKIPGE T
PUTBYT "-"
MOVM T,T
IDIVI T,=100
PUSH P,TT
PUSHJ P,DECOUT
PUTBYT "."
POP P,T
IDIVI T,=10
PUTBYT "0"(T)
SKIPE TT
PUTBYT "0"(TT)
PUTBYT "V"
MOVEM B,PUTCHR ;RESTORE OLD PUTCHR
MOVE T,TMPCN1
SETZ TT,
DOINV4: IDPB TT,T ;FILL OUT SIGNAL NAME WITH 0'S
TLNE T,760000
JRST DOINV4
DOINV3: PUSHJ P,TGRONK ;ADD NAME TO CURRENT WIRE
POPJ P,
; PROPERTY READING SUBRS
GETPRP: SETZM LSTDIP
BAKPRP: SETZM LSTPART
SETZM PRPLST ;SAVE OTHER PROPERTIES HERE
; Read PROP-VALUE pairs into PRPLST (making values canonical)
RDDIP5: PUSHJ P,RSTR
JRST RDDIP4 ;ALL DONE
MOVE B,T ;SAVE COPY OF STRING
PUSHJ P,RSTR
JRST [ PUSHJ P,PUTFS ;RETURN PROPERTY NAME IF NO VALUE
JRST RDDIP5]
PUSHJ P,VALFIX ;FIX VALUE STRING (RETURNS STRING IN T)
GETFS(TT,TBLK) ;GET TEMP BLOCK
BCLEAR(TTT,TT,TBLK) ;CLEAR BLOCK
STORE(B,TT,TLFT) ;STORE PROPERTY NAME HERE
STORE(T,TT,TRHT) ;STORE PROPERTY VALUE HERE
MOVE T,PRPLST
STORE(T,TT,NXTT) ;LINK INTO LIST OF PROPERTIES
MOVEM TT,PRPLST
JRST RDDIP5
RDDIP4: SKIPE DIPLST ;ANY DIPS IN?
TRNE ISBACK
JRST BRPRP1
; Look for DIPTYPE property
MOVEI F,PRPLST-ADDR(0,NXTT)
RDDIP7: MOVE E,F
FETCH(F,F,NXTT)
JUMPE F,BRPRP1
RDDIP6: FETCH(T,F,TLFT)
MOVEI TT,[ASCIZ/DIPTYPE/]
PUSHJ P,ASCMAT ;IS THIS DIPTYPE ?
JRST GETPR1
FETCH(T,F,TRHT)
MOVEM T,STRING
MOVE B,DIPLST
PUSHJ P,DIPFND
JRST GETPR1
MOVEM B,LSTDIP
FETCH(B,F,TLFT) ;FOUND DIPTYPE,
PUSHJ P,PUTFS ; REMOVE "DIPTYPE" FROM PRPLST
FETCH(B,F,TRHT)
PUSHJ P,PUTFS
FETCH(B,F,NXTT)
STORE(B,E,NXTT)
FSTRET(F,TBLK)
MOVE F,E
JRST RDDIP7
GETPR1: FETCH(T,F,TLFT)
MOVEI TT,[ASCIZ/PACKAGE/]
PUSHJ P,ASCMAT ;IS THIS "PACKAGE" ?
JRST RDDIP7
FETCH(T,A,BBIT) ;MARK BODY HAS PACKAGE PROPERTY
TRO T,BPACKP
STORE(T,A,BBIT)
JRST RDDIP7
;MATCH BODIES PROP LIST AGAINST DIP'S PROP/PART# DECISION TREE
; Allow bodies properties to specify down tree, until
; 1) next prop in tree not mentioned in PRPLST, and no default value
; 2) next prop in tree mentioned, but value not equal to any of choices
;FALLS THRU
BRPRP1: SKIPN B,LSTDIP
POPJ P,
FETCH(H,B,PRPV) ;GET POINTER TO PROPERTY VALUES
SETZ G, ;CLEAR PREVIOUS LEVEL
RPRP1: JUMPE H,RPRP4
MOVEI F,PRPLST-ADDR(0,NXTT)
JRST RPRP2
; ASSQ down PRPLST, looking for next prop in tree
RPRP3: FETCH(T,F,TVAL) ;GET FLAG
JUMPN T,RPRP2 ;SKIP IF ALREADY MATCHED
FETCH(T,F,TLFT) ;GET PROPERTY NAME
JUMPE T,RPRP2 ;SKIP IF WAS DIPTYPE
FETCH(TT,H,PRNB)
FETCH(TT,TT,PRNS)
PUSHJ P,TXTMAT
JRST RPRP2
JRST RPRP2
SETO T, ;PROP WAS FOUND
STORE(T,F,TVAL) ;FLAG THIS PROPERTY MATCHED
; Got a match on next decision, look for value match
RPRP7:
; FETCH(T,H,PRBT)
; TRNE T,NULVAL
; JRST RPRP8
FETCH(T,F,TRHT) ;NOW GET VALUE STRING
FETCH(TT,H,PRVS)
PUSHJ P,VALMAT
JRST [RPRP8: FETCH(H,H,PRNV)
JUMPN H,RPRP7
JRST RPRP4]
RPRP6: MOVE G,H ;VALUE MATCHED TOO, STEP DOWN IN TREE
FETCH(H,G,PRNP)
JRST RPRP1
RPRP2: FETCH(F,F,NXTT) ;NEXT TEMP BLOCK
JUMPN F,RPRP3 ;AND LOOP
; No item on PRPLST matches next node of tree, look for default value
RPRP5: FETCH(T,H,PRBT) ;GET PROPERTY VALUE BITS
TRNE T,DEFPRP ;IS IT THE DEFAULT?
JRST RPRP6 ;YES, STEP DOWN TREE TO NEXT NODE
FETCH(H,H,PRNV)
JUMPN H,RPRP5
; Matched as far as we can
RPRP4: JUMPE G,CPOPJ ;IF NOTHING FOUND,
FETCH(T,G,PRBT)
TRNN T,PARTNM ;DID WE GET ALL THE WAY TO THE PART NUMBER ?
POPJ P,
MOVEM G,LSTPART ;YES, SOME MEASURE OF SUCCESS
MOVEI F,PRPLST-ADDR(0,NXTT)
JRST RPRP9 ;DELETE ALL PRPLST ENTRIES THAT WERE USED TO MATCH
RPRP14: FETCH(T,F,TVAL) ;USED TO MATCH PROP TREE ?
JUMPE T,RPRP9
FETCH(B,F,TLFT) ;YES, DELETE FROM PRPLST
PUSHJ P,PUTFS
FETCH(B,F,TRHT)
PUSHJ P,PUTFS
FETCH(B,F,NXTT)
STORE(B,E,NXTT)
FSTRET(F,TBLK)
MOVE F,E
RPRP9: MOVE E,F
FETCH(F,F,NXTT)
JUMPN F,RPRP14
POPJ P,
;PRXMAT - MATCH TWO EXTRA-PROP LISTS
;F = TEST LIST
;E = LIST TO MATCH
;SKIPS, RECLAIMS TEST LIST IF MATCH FOUND
PRXMAT: MOVE T,E
SETZ TT, ;COUNT NUMBER OF EXTRA PROPS
RPRPX3: ADDI TT,1
FETCH(T,T,NXTT)
JUMPN T,RPRPX3
CAME TT,TMPCN1 ;SAME NUMBER OF PROPERTIES?
POPJ P,
MOVE F,PRPLST
RPRPX4: MOVE D,E
RPRPX5: FETCH(T,D,TLFT) ;PROPERTY NAME
FETCH(TT,F,TLFT)
PUSHJ P,TXTMAT ;SAME PROP NAME ?
JRST RPRPX6
JRST RPRPX6
FETCH(T,D,TRHT)
FETCH(TT,F,TRHT)
PUSHJ P,VALMAT ;SAME PROP VALUE ?
POPJ P, ;LOSE ON THIS BODY
JRST RPRPX7
RPRPX6: FETCH(D,D,NXTT)
JUMPN D,RPRPX5
POPJ P, ;LOSE, PROPERTY NOT FOUND
RPRPX7: FETCH(F,F,NXTT)
JUMPN F,RPRPX4
MOVE F,PRPLST ;FOUND SAME LIST, RETURN OTHER ONE
RPRPX8: FETCH(B,F,TLFT)
PUSHJ P,PUTFS
FETCH(B,F,TRHT)
PUSHJ P,PUTFS
MOVE D,F
FETCH(F,F,NXTT)
FSTRET(D,TBLK)
JUMPN F,RPRPX8
JRST CPOPJ1
; BACKPANEL FILE INFO INPUT
BAKIN: TRNE DOBEQ
JRST EQVSIG
OUTSTR[ASCIZ/
/]
XCT GETCHR
JRST ILLEND
CAIE TTT,BACVER ;CURRENT VERSION?
JRST [ OUTSTR[ASCIZ/
VERSION # MISMATCH, MAYBE YOU SHOULD REWRITE THIS FILE!
/]
JRST ERRET]
PUSHJ P,WIESTR ;SETUP INPUT ERROR LISTING
FETCH(W,L,BLST) ;GET BACK PANEL LIST POINTER
JUMPN W,DOFILS ;IF ALREADY GOT HEADER, GO READ FILE BLOCKS
PUSHJ P,MAKHED ;MAKE A HEADER BLOCK
STORE(W,L,BLST)
DOFILS: XCT GETCHR ;READ CARD LOC
JRST ILLEND
JUMPL TTT,CPOPJ ;NEG IS END
TRNE DOPRTL ;PARTS ONLY?
JRST [ SETZM BSLOT ;YES, DON'T CARE ABOUT LOC
JRST DOFIL1]
SKIPN T,TTT ;ANY CARD LOC?
HLRZ T,SLICEL ;NO, USE WHAT HE TYPED
JUMPE T,SKPFIL
MOVEM T,PINLOC ;THIS IS WHERE SLOTFN LOOKS
TRNE DOPRTL ;READING PARTS ONLY?
TDZA A,A ;YES, DON'T FIND SLOT
PUSHJ P,SLOTFN ;FIND OR MAKE SLOT BODY
MOVEM A,BSLOT ;AND SAVE IT
DOFIL1: XCT GETCHR
JRST ILLEND
JUMPE TTT,FILDON ;DONE WITH FILES?, DO WIRES
PGETFS(B,FBLK) ;MAKE A FILE BLOCK
BCLEAR(T,B,FBLK)
STORE(TTT,B,FILN)
XCT GETCHR
JRST ILLEND
HLRZ T,TTT ;EXT ONLY FOR NOW
STORE(T,B,FEXT)
FOR I IN(FPPN,FDAT)
< XCT GETCHR
JRST ILLEND
STORE(TTT,B,I)
>
PUSHJ P,FVCOPY ;COPY CARD LOC AND VARIABLE STUFF
MOVEI A,RADDR(L,BKNM,FNXT)
PUSHJ P,FILMER
FETCH(T,B,FMOD) ;TAKE LAST MODULE NAME
MOVEM T,MODULE ;AND SAVE FOR DIP COUNTS STUFF LATER
JRST DOFIL1
FILDON: TRNN DOPRTL ;PARTS ONLY?
JRST DOWIRES ;NO
PUSHJ P,SKP2CNT ;SKIP TO DIP COUNTS
JRST ENDIN ;AND READ THEM
;READ SIGNAL EQUIVALENTS, ALL SIGNALS ON LINE ARE EQUIV
EQVSIG: SETZM BAKOLD
SETZM BAKILD
SETZM BAKSFL
SETZM BAKBIT ;MAKE SURE NO BITS GET INTO WIRE HEADERS
FETCH(W,L,BLST) ;GET BACK PANEL LIST POINTER
JUMPN W,EQVSGB ;IF ALREADY GOT HEADER, GO READ WIRES
PUSHJ P,MAKHED ;MAKE A HEADER BLOCK
STORE(W,L,BLST)
EQVSGB: SKIPE SLICEL ;DID HE GIVE A CARD SLOT?
OUTSTR[ASCIZ/ IGNORING CARD SLOT!/]
EQVSGW: OUTSTR[ASCIZ/
/]
EQVSG0: SETZB G,WQNWRD
EQVSG1: PUSHJ P,SIGIN ;READ A SIGNAL
POPJ P, ;EOF
PUSH P,TTT ;SAVE TERMINATOR
PUSHJ P,TGRONK ;ADD NEW SIGNAL TO WIRE
POP P,TTT
CAIE TTT,12
JRST EQVSG1 ;GET NEXT EQUIVALENT
JRST EQVSG0 ;EOL, GET NEXT SET OF EQUIVS
;SKIP OVER PORTIONS OF 'BAC' FILE
;SKPFIL - SKIP ALL AFTER WORD WITH CARD LOCN
SKPFIL: AOS CDSKPC
SKPFL1: XCT GETCHR ;DRWNAM ?
JRST ILLEND
JUMPE TTT,SKPRUN
FOR I IN(FEXT,FPPN,FDAT)
< XCT GETCHR
JRST ILLEND
>
FOR I IN(FREV,FMOD,FVAR,FPRF,AUTHOR,TIT1,TIT2,FPROJ,FPAGE,FOF,FNXH)
< PUSHJ P,SKPSTR
JFCL
>
PUSHJ P,SKPSTR ;SKIP NOMENCLATURE TYPE
JFCL
PUSHJ P,SKPSTR ;SKIP BOARD TYPE
JFCL
JRST SKPFL1
SKPRUN: PUSHJ P,SKP2CNT
SKPCNT: PUSHJ P,SKPSTR ;DIPTYPE STRING?
JRST SKPCN1
JRST DOFILS
SKPCN1: XCT GETCHR ;APPROX COUNT
JRST ILLEND
AOJE TTT,SKPCNT ;ENDS ON -1
XCT GETCHR ;REAL COUNT
JRST ILLEND
SKPCN2: PUSHJ P,SKPSTR ;PROP NAME, VALUE
CAIA
JRST SKPCN1
PUSHJ P,SKPSTR
JFCL
JRST SKPCN2
; Skip to parts counts in BAC file
SKP2CNT:
XCT GETCHR ;WBITS,,TBITS
JRST ILLEND
JUMPE TTT,CPOPJ
MOVEI T,2
SKPRN1: XCT GETCHR ;IN, OUT LOADING
JRST ILLEND
SOJG T,SKPRN1
XCT GETCHR ;SOURCE PIN DRWING NAME,EXT,PPN ?
JRST ILLEND
JUMPE TTT,SKPRN9 ;NO
XCT GETCHR ;EXT
JRST ILLEND
XCT GETCHR ;PPN
JRST ILLEND
SKPRN9: PUSHJ P,SKPSTR ;SIGNAL NAME(S)
JRST .-1
SKPRN2: XCT GETCHR ;PPS,,CPIN ?
JRST ILLEND
JUMPE TTT,SKP2CNT
MOVEI T,4 ;X,Y NAME,EXT,PPN
SKPRN3: XCT GETCHR
JRST ILLEND
SOJG T,SKPRN3
JRST SKPRN2
SKPSTR: XCT GETCHR
JRST ILLEND
JUMPE TTT,CPOPJ1
SKPST1: TRNN TTT,376
POPJ P,
XCT GETCHR
JRST ILLEND
JRST SKPST1
; SETUP INPUT ERROR FILE, FILE BLOCK SORT ROUTINE, READ BOARD TYPE
WIESTR: SKIPN TTYFLG
SKIPA T,[PUSHJ P,BYTOUT]
MOVE T,[PUSHJ P,TTYOUT]
MOVEM T,PUTCHR
SKIPE TTYFLG ;IF TTY
POPJ P, ;TERM ALREADY PRINTED
PUSHJ P,PTERM
PUTSTR[ASCIZ/
/]
POPJ P,
;FILMER - MERGE NEW FILE BLOCK, CHECK FOR DUPLICATE FILE NAMES
FILMER: TRNE PCNOTD
JRST FILMR1
FOR I IN(FREV,FMOD,FVAR,FPRF,AUTHOR,TIT1,TIT2,FPROJ,FPAGE,FOF,FNXH)
< PUSHJ P,RSTR ;READ STRING
SETZ T,
STORE(T,B,I)
>
PUSHJ P,RDNOM
PUSHJ P,RDWW
JRST FILMR1
FILMR2: FETCH(T,A,FILN)
CAMGE T,ADDR(B,FILN)
JRST FILMR1
CAME T,ADDR(B,FILN)
JRST FILMR3
TRNN ISBACK
JRST [ PUTSTR[ASCIZ/DRW FILES WITH SAME NAME:
/]
JRST FILMR4]
FETCH(T,A,FPPN)
CAMN T,ADDR(B,FPPN)
JRST [ FETCH(T,A,FEXT)
FETCH(TTT,B,FEXT)
CAMN T,TTT
JRST FILMR3
JRST .+1]
PUTSTR[ASCIZ\DRW FILES WITH SAME NAME, BUT DIFFERENT EXTENSION AND/OR PPN:
\]
FILMR4: PUSH P,TT
PUSHJ P,FBLKPN
EXCH A,B
PUSHJ P,FBLKPN
EXCH A,B
POP P,TT
FETCH(T,A,FEXT)
FETCH(TTT,B,FEXT)
CAMGE T,TTT
JRST FILMR1
FETCH(T,A,FPPN)
CAML T,ADDR(B,FPPN)
JRST FILMR3
FILMR1: MOVE TT,A
FETCH(A,A,FNXT)
JUMPN A,FILMR2
FILMR3: STORE(B,TT,FNXT)
STORE(A,B,FNXT)
POPJ P,
;HERE TO READ AND DECODE BOARD TYPE
RDNOM: PUSH P,B ;SAVE POINTER TO THIS BLOCK
PUSHJ P,RSTR
JRST [ PUTSTR[ASCIZ/NO NOMENCLATURE TYPE FROM FILE:
/]
JRST RDWNX1]
STORE(T,B,FNOM)
MOVE B,T
PUSHJ P,FNDNOM
JRST [ PUTSTR [ASCIZ /UNKNOWN NOMENCLATURE TYPE FROM FILE:
/]
JRST RDWNX1]
MOVEI C,-LNAMES(C)
CAMN C,NOMTYP ;DO BOARD TYPES AGREE?
JRST RDWNX2
MOVE T,NOMTYP
MOVE T,LOCTVV(T) ;GET NOMENCLATURE TABLE POINTER
CAMN T,LOCTVV(C) ;SAME NOMENCLATURE?
JRST RDWNX2 ;YES
PUTSTR [ASCIZ /NOMENCLATURE TYPE FROM FILE IS DIFFERENT FROM CURRENT ONE:
/]
JRST RDWNX1
RDWW: TRNE PCNOTD
POPJ P, ;NO BOARD TYPE FOR PC
PUSH P,B ;SAVE POINTER TO THIS BLOCK
PUSHJ P,RSTR
JRST [ SETO C,
JRST RDWW1]
STORE(T,B,FWWT) ;STORE STRING BOARD TYPE
MOVE B,T
PUSHJ P,FNDWW
JRST [ PUTSTR [ASCIZ /UNKNOWN BOARD TYPE FROM FILE:
/]
JRST RDWNX1]
MOVEI C,-WNAMES(C)
RDWW1: CAMN C,WWTYP ;DO BOARD TYPES AGREE?
JRST RDWNX2
PUTSTR [ASCIZ /BOARD TYPE FROM FILE IS DIFFERENT FROM CURRENT ONE:
/]
RDWNX1: POP P,B
JRST FBLKPN
RDWNX2: POP P,B
POPJ P,
; READ SIGNAL NAMES
DIDWIR: JUMPE G,DOWIRES ;ANY WIRE SEEN?
FETCH(T,G,WBIT)
TRNE T,GENSIG
PUSHJ P,FINGEN ;FINISH GENERATED NAME
DOWIRES:SETZB G,WQNWRD ;INIT WIRE POINTER
SETZM LOSBIT ;INIT GEN NAME CELLS
SETZM LOSNAM
TRNN ISBACK ;BACK PANEL INPUT?
JRST DOTEXT
XCT GETCHR
JRST ILLEND
JUMPE TTT,ENDIN ;END ON 0 HERE (THIS COUNTS ON BITS NEVER BEING 0)
MOVEM TTT,BAKBIT ;SAVE BITS HERE
XCT GETCHR
JRST ILLEND
MOVEM TTT,BAKOLD
XCT GETCHR
JRST ILLEND
MOVEM TTT,BAKILD
SETZM BID ;CLEAR THIS
SETZM BAKSFL ;CLEAR SOURCE FILE POINTER
XCT GETCHR
JRST ILLEND
JUMPE TTT,DOTEXT ;0 MEANS NO SOURCE
MOVE E,TTT
XCT GETCHR
JRST ILLEND
HLRZ F,TTT ;EXT ONLY FOR NOW
XCT GETCHR
JRST ILLEND
EXCH F,TTT
PUSHJ P,BPFFIL ;FIND FILE BLOCK
MOVEM T,BAKSFL ;SAVE HERE
DOTEXT: PUSHJ P,TRSTR
JRST ILLEND
JRST [ XCT GETCHR ;NULL, GET NEXT WORD
JRST ILLEND
JUMPN TTT,PINLPA ;ANY PINS?
POPJ P,] ;NULL STRING AND NULL LIST, END
JRST DOTXTS
DOTXTA: PUSHJ P,TRSTR
JRST ILLEND
JRST [ TRNN ISBACK ;DONE, GO DO PINS
JRST PINLOP
JRST BPINLP]
DOTXTS: PUSHJ P,TGRONK
JRST DOTXTA
;ASSEMBLE NAME (STRTAB) INTO CURRENT WIRE
;RETURNS
;G = CURRENT ACTIVE HEAD OF THIS WIRE
TGRONK: MOVE A,[POINT 7,STRTAB] ;POINTER TO BEGINNING OF STRING
PUSHJ P,PERMUT ;MAKE CONONICAL FORM, CONVERT VARIABLES
SKIPN CMPWRD
JRST [ SKIPE WQNWRD ;DID WE PICKUP QN?
JUMPN G,QNMERG ;YES, MERGE IF WE HAVE HEADER
POPJ P,] ;NO (ALWAYS 0 IF NOT BP)
MOVEI T,CMPWRD
MOVEM T,SAVET
PUSHJ P,TXTFND ;FIND THIS SIGNAL NAME OR WHERE IT GOES
JRST NEQ ;MUST INSERT NEW STRING
JRST ISEQV ;JUST MERGE COMMENTS!!!!!
; Name was found, merge it if we already have a wire (G)
WASEQ: FETCH(T,C,WBIT)
IOR T,SAVBIT ;ADD THESE BITS
STORE(T,C,WBIT)
JUMPN G,WASEQV ;WIRES TO MERGE?
TRNN T,NAM2ND ;IS IT HEADER BLOCK?
SKIPA G,C ; YES, MAKE IT THE CURRENT WIRE
FETCH(G,C,WPIN) ;NO, GET REAL HEAD
QNMERG: TRNN ISBACK ;WR FOR BP ONLY
POPJ P,
FETCH(T,G,WRN)
HRRZ TT,WQNWRD
PUSHJ P,WHCHRN
PUSHJ P,WHERRP
STORE(T,G,WRN)
POPJ P,
; A second name for this wire (G) already had a wire of its own (C)
; Merge the two wires into one
WASEQV: MOVE B,C
FETCH(T,B,WBIT)
TRNE T,NAM2ND
FETCH(B,B,WPIN)
CAIE B,(G) ;ON CURRENT WIRE?
PUSHJ P,LMERGE ;NO, MERGE THEM
JRST QNMERG ;PICKUP QN
; This name is new, but is equivalent to an existing wire,
; sort this name into signal list, and merge with the equivalent.
ISEQV: PUSH P,E ;THE EQUIVALENT SIGNAL
PUSH P,C
PUSHJ P,NEQSET ;MAKE WIRE HEADER AND NAME
POP P,C ; WHERE TO INSERT
POP P,E ; WHERE EQUIVALENT NAME IS
EXCH C,E ;C WANTS EQUIVALENT ONE REGARDLESS
CAME C,E ;WILL EQUIVALENT ONE BE OUR NEXT ?
JRST ISEQV1 ;NO, THEN WE CAN'T BE FIRST
FETCH(T,C,WBIT) ;YES, GET ITS BITS
TRZN T,SIG1 ;IS IT SIG 1?
JRST ISEQV1 ;NO, WE AREN'T EITHER
STORE(T,C,WBIT) ;YES, TURN IT OFF
JRST WASEQV ;NOW WE ARE FIRST
ISEQV1: FETCH(T,G,WBIT) ;WE AREN'T FIRST, TURN OFF BIT
TRZ T,SIG1
STORE(T,G,WBIT)
JRST WASEQV
; Completely new name, add to current wire
NEQ: MOVE T,G
SKIPE T
FETCH(T,G,WBIT)
PUSH P,T ;SAVE OLD STATE OF SPWR
PUSHJ P,NEQSET ;WILL TURN ON SIG1 WHICH IS CORRECT
POP P,TT
FETCH(T,G,WBIT) ;WIRE NOW IS A PWR RUN?
TRNE T,SPWR
TRNE TT,SPWR ;AND WASN'T BEFORE
JRST QNMERG
FETCH(A,G,WVOL) ;THIS DOESN'T CHECK FOR TWO VOLTAGES ON SAME WIRE
PUSHJ P,FNDPWR ;FIND CANONICAL FORM OF THAT PWR (+5.0V = +5.00V = VCC)
JRST [ FETCH(T,G,WVOL) ;DOESN'T EXIST, MAKE IT!
JRST MAKPWR]
JRST WASEQV ;YES, MERGE IT ONTO THAT POWER RUN
; Un-Interned name, enter it, as a 2nd name if wire already started
NEQSET: JUMPE G,SETG ;NOT STARTED, JUST ENTER
PUSH P,G
PUSHJ P,SETG ;GET HEADER BLOCK FOR SECOND NAME
FETCH(T,G,WBIT)
TRO T,NAM2ND ;MARK AS SECOND BLOCK
STORE(T,G,WBIT)
MOVEM G,SAVET ;SAVE THIS POINTER HERE
POP P,G ;RESTORE REAL WIRE POINTER
JRST TMERGE ;SORT IN NEW SIGNAL NAME
;NULTXT - NO NAME FOR WIRE, CREATE ONE
;RETURNS
;G = CREATED WIRE HEADER
NULTXT: PUSH P,TTT
TRNN ISBACK
TRNN PCNOTD
SKIPA TT,[GENLEN+1+5]
MOVEI TT,GNPCLN+1+5 ;ENOUGH FOR GEN NAME + % + 0
PUSH P,TT
FETCH(T,W,NGEN) ;IN CASE WE HAVE TO USE THIS
ADDI T,1
MOVEI TTT,1+5 ;% + 0
NULTX1: IDIVI T,=10
ADDI TTT,1
JUMPN T,NULTX1
POP P,TT
CAMGE TT,TTT
MOVE TT,TTT ;USE LARGEST
IDIVI TT,5
SETOM CMPWRD
SOS CMPWRD ;LEAVE US NOT GET THE LOW ORDER BIT ON
MOVE T,[CMPWRD,,PERMTB]
BLT T,CMPWRD-1(TT) ;MARK ENOUGH SPACE
SETZM PERMTB-1(TT) ;FOR GEN NAME LATER
SETZM SAVBIT ;SIMULATE BITS FROM PERMUT
PUSHJ P,SETGEN ;WILL TURN ON SIG1 AS IT SHOULD
CLEAR(G,NNAM) ;CLEAR NEXT NAME POINTER (THIS IS ONLY ONE)
FETCH(TTT,G,WBIT)
TRO TTT,GENSIG ;MARK AS GENERATED
STORE(TTT,G,WBIT)
POP P,TTT
POPJ P,
;FINGEN - FINISH GENERATED NAME
FINGEN: PUSHJ P,FNSNGL ;FIRST TRY TO FIND ANOTHER UNAMED RUN WITH SAME PIN
POPJ P, ;FOUND ONE
;Make generated name, try to make it the name of some pin on run
MOVE B,[POINT 7,STRTAB]
MOVE T,[IDPB TTT,B]
EXCH T,PUTCHR
MOVEM T,SVPTCH
PUTBYT GENCHR
FETCH(T,G,TBIT) ;WIRE TYPE BITS
TRNE ISBACK
JRST FINGNC ;FOR BACK, BODY LOCN, PINN IS SLOT, PADDLE-PIN
TRNN PCNOTD ;ONLY FOR WD FILES
TRNN T,ANYCON ;AND CONNECTOR
JRST FINGN0
FETCH(A,W,FCRD) ;UNNAMED BACKPANEL RUN, ADD SLOT TO MAKE UNIQUE
JUMPE A,FINGNA ; NO SLOT
PUSHJ P,SLTOUT ;PREFIX SLOT ON NAME
PUTBYT 40
FINGNA: PUSHJ P,FINGN0 ;FINISH NAME BEFORE PRINTING IT
FINGNB: PUTSTR[ASCIZ/UNNAMED BACKPANEL RUN:
/]
PUTSIG ADDR(G,SPNT)
PUTSTR[ASCIZ/
/]
POPJ P,
FINGNC: PUSHJ P,FINGN5
JRST FINGNB
FINGN5: FETCH(A,G,WPIN)
JUMPE A,FINGN3 ;USE NUMBER IF NO PIN!!!!
FETCH(T,A,PBDY)
FETCH(T,T,BLOC)
FETCH(A,A,PINN)
HRL A,T
SETZ T, ;NO OFFSET
PUSHJ P,BPNPIN
JRST FINGN1
FINGN3: FETCH(T,W,NGEN) ;NOTHING BETTER THAN GENSYM
ADDI T,1
STORE(T,W,NGEN)
PUSHJ P,DECOUT
JRST FINGN1
FINGN0: MOVE A,LOSNAM ;PIN#,,LOC OF BEST LABELING FOR THIS RUN
JUMPE A,FINGN3 ; NONE
MOVE T,LOSBIT
TRNE T,ANYCON ;CON?
JRST [ PUSHJ P,LOCPNC
JRST FINGN1]
PUSHJ P,LOCPIN
FINGN1: SETZ T, ;FINISH OFF GENERATED NAME
IDPB T,B
TLNE B,760000
JRST .-2
MOVE T,SVPTCH
MOVEM T,PUTCHR
SETZM SAVBIT
MOVE T,STRTAB
STORE(T,G,SCMP)
MOVEI T,-1+ADDR(G,SPNT)
MOVEI TT,STRTAB-1
FINGN4: ADDI T,1
ADDI TT,1
MOVE TTT,(TT)
TRNN TTT,376
JRST [ MOVEM TTT,(T) ;WIN
JRST GALPH]
EXCH TTT,(T)
TRNE TTT,376 ;DOES OLD STRING END?
JRST FINGN4
PUTSTR[ASCIZ/MOBY LOSSAGE, I THOUGHT I ALLOCATED ENOUGH SPACE
BUT I RAN OUT, TRUNCATED SIGNAL IS:
/]
PUTSIG ADDR(G,SPNT)
PUTSTR[ASCIZ/
/]
GALPH: MOVEI T,ADDR(G,SCMP)
MOVEM T,SAVET
PUSHJ P,GENFND ;FIND PLACE FOR IT
JFCL ;DON'T CARE IF NEQ, EQV, EQU
JFCL
STORE(G,B,ALPH)
STORE(C,G,ALPH) ;LINK IN
JRST GENHSH ;FIX HASH TABLE ENTRIES
; FIND ANOTHER WSINGL!GENSIG WITH SAME PIN
FNSNGL: FETCH(T,G,WBIT)
TRNN T,WSINGL ;ARE WE SINGLE PIN?
JRST CPOPJ1 ;NO
FETCH(E,G,WPIN) ;GET POINTER TO FIRST PIN
FETCH(A,E,PBDY)
FETCH(T,E,PINN)
MOVEM T,PINNUM
FETCH(T,E,PBIT)
TRNE T,PIDPIN
JRST CPOPJ1
FETCH(T,A,BBIT)
TRNN T,CBODY ;CON?
JRST FNPBDY ;NO, FIND BODIES
PUSHJ P,FNSNPN ;CHECK THIS BODY FOR PIN
POPJ P, ;FOUND
JRST CPOPJ1 ;NOT FOUND, BUT NO MORE BODIES TO CHECK
FNPBDY: FETCH(T,A,BLOC)
JUMPE T,CPOPJ1
MOVEM T,PINLOC
FETCH(T,A,DIPT)
MOVEM T,LSTDIP
MOVEI A,RADDR(W,WBDY,NXTB)
JRST FNPB1
FNPB2: FETCH(T,A,BBIT)
TRNE T,CBODY ;CON?
JRST CPOPJ1 ;YES, LOSE
FETCH(T,A,BLOC)
CAMGE T,PINLOC
JRST FNPB1
CAME T,PINLOC
JRST CPOPJ1 ;NO MORE BODIES
FETCH(T,A,DIPT)
CAME T,LSTDIP
JRST FNPB1
PUSHJ P,FNSNPN ;SEARCH FOR PIN
POPJ P, ;FOUND AND MERGED
FNPB1: FETCH(A,A,NXTB)
JUMPN A,FNPB2
JRST CPOPJ1
FNSNPN: MOVEI C,RADDR(A,BPIN,NXBP)
JRST FNPN1
FNPN2: FETCH(T,C,PINN)
CAMGE T,PINNUM
JRST FNPN1
CAME T,PINNUM
JRST CPOPJ1
FETCH(T,C,PBIT)
TRNE T,PIDPIN
JRST FNPN1
FETCH(B,C,HPNT)
CAIN B,(G)
JRST FNPN1
FETCH(T,B,WBIT)
TRC T,WSINGL!GENSIG
TRCN T,WSINGL!GENSIG
JRST GENMER ;MERGE PINS
FNPN1: FETCH(C,C,NXBP)
JUMPN C,FNPN2
JRST CPOPJ1 ;NOT FOUND
GENMER: EXCH B,G ;USE OLD ONE (MAY ALREADY HAVE MULTIPLE PINS)
FETCH(T,B,WPIN)
HRLM T,(P) ;SAVE PIN LIST HERE TO MERGE LATER
GENMR1: HLRZ E,(P)
JUMPE E,CPOPJ
FETCH(T,E,NXTP)
HRLM T,(P)
PUSHJ P,PMERGE
JRST GENMR1
; SETG, TXTFND, TMERGE, LMERGE
SETGEN: PGETFS(G,WHEAD)
BCLEAR(T,G,WHEAD)
JRST SETGN1
;SETG - splice in new Wire Header between B and C
; uses contents of CMPWRD, PERMTB, VOLTAGE, and SAVBIT
SETG: PGETFS (G,WHEAD)
BCLEAR(T,G,WHEAD) ;CLEAR OUT BLOCK
STORE(G,B,ALPH)
STORE(C,G,ALPH)
PUSHJ P,FIXHSH ;FIXUP HASH TABLE POINTERS
SETGN1: MOVE TTT,CMPWRD
MOVEM TTT,ADDR(G,SCMP) ;COMPARE WORD
MOVEI T,PERMTB
MOVEI TT,ADDR(G,SPNT) ;START OF PRINT NAME
SETG1: MOVE TTT,(T)
CAMLE TT,.JBREL
JSR MORCOR
MOVEM TTT,(TT)
USAGE,< AOS FSTCNT >
ADDI TT,1
TRNE TTT,376
AOJA T,SETG1
USAGE,< SOS FSTCNT >
MOVEM TT,FSTOP ;THIS COUNTS ON PGETFS BEING USED ABOVE
MOVEI T,SIG1!WNULL ;ASSUME THESE (CALLER WILL FIX)
IOR T,SAVBIT ;AND ADD THESE
STORE(T,G,WBIT) ;STORE IN WIRE HEADER
TRNN T,SPWR
POPJ P,
MOVE T,VOLTAG
STORE(T,G,WVOL)
POPJ P,
;GENHSH, FIXHSH
;Fixup hash table pointers
;CMPWRD = asciz for entry just made
;B = previous pointer for the entry just made
GENHSH: TDZA T,T
FIXHSH: LDB T,[POINT HASHB,CMPWRD,HASHB-1]
ADDI T,ADDR(W,HASHTB)
SKIPN TTT,(T)
JRST [ HRLM B,(T) ;THIS IS LAST FOR LAST LIST
JRST FXHSH1] ;NOW STORE US AS LAST FOR THIS LIST AND FIX NEXT BUCKET
CAIE B,(TTT) ;IS OUR LAST THE OLD LAST FOR THIS LIST?
POPJ P,
FXHSH1: HRRM G,(T) ;YES, MAKE US NEW LAST
ADDI T,1 ;ADVANCE TO NEXT BUCKET
FXHSH2: CAIL T,HASHL+ADDR(W,HASHTB) ;NO MORE BUCKETS?
POPJ P, ;NOPE, LEAVE NOW
SKIPN (T) ;FIND NEXT NON-ZERO BUCKET
AOJA T,FXHSH2 ;KEEP LOOKING
HRLM G,(T) ;FIX IT'S LAST LAST POINTER TO OUR LAST POINTER
POPJ P,
;GENFND, TXTFND - Find cmpwrd in SAVET, PERMTB in hash table for wirelist (W)
; (May find SPWR in SAVBIT, use VOLTAG)
; PUSHJ P,TXTFND
; Wasn't found - insert here
; Wasn't found, but equivalent is in E
; Found
; Returns C = matching wire header, or place to insert
; B = previous entry
GENFND: SETZ T,
JRST GENFN1
TXTFND: MOVE T,SAVET
LDB T,[POINT HASHB,(T),HASHB-1] ;GET HASH VALUE
GENFN1: ADDI T,ADDR(W,HASHTB) ;ADD ADDRESS OF HASH TABLE
SKIPN A,(T) ;PICKUP HASH TABLE ENTRY
JRST TXTFST ;THIS IS FIRST IN THIS BUCKET
HLRZ C,A
SETZ E,
JRST TXTFN2
TXTFN1: MOVEI TT,ADDR(C,SCMP) ;GET SIGNAL NAME POINTER
MOVE T,SAVET
PUSHJ P,ALPHA
JRST TXTFNT ;T LESS THAN TT, IT GOES HERE
JRST TXTFN2 ;T GREATER THAN TT, KEEP LOOKING
JRST TXTFNF ;T EQV TT, T LESS THAN TT
JRST TXTFNE ;T EQV TT, TT LESS THAN T
JRST CPOPJ2 ;T EQUAL TT
TXTFNF: MOVE E,C ;THIS IS THE ONE
JRST CPOPJ1
TXTFNE: MOVE E,C ;SAVE POINTER TO EQUIVALENT ONE
TXTFN2: MOVE B,C
FETCH(C,C,ALPH)
CAIE B,(A) ;WAS THAT THE LAST ONE?
JUMPN C,TXTFN1 ;NO, END OF LIST?
TXTFNT: JUMPN E,CPOPJ1 ;IF EQUIVALENT SEEN, SKIP
POPJ P, ;NOT FOUND, B,C IS WHERE IT GOES
TXTFST: MOVE A,T
SKIPN B,(A)
SOJA A,.-1 ;BACK UP TO FIRST NON-ZERO ENTRY
HLLI B,
FETCH(C,B,ALPH) ;NEXT FROM HIM
POPJ P, ;RETURN POINTERS
;FNDPWR - FIND AN SPWR SIGNAL WITH GIVEN VOLTAGE
;A = VOLTAGE
;SKIPS IF FOUND
;C = MATCHING SIGNAL
FNDPWR: HRRZS A
MOVEI C,RADDR(W,WIRES,ALPH)
JRST FNDPW1
FNDPW2: FETCH(T,C,WBIT)
TRNE T,SCANON ;THE CANONICAL FORM?
TRNN T,SPWR ;AND POWER?
JRST FNDPW1
FETCH(TT,C,WVOL)
CAIN A,(TT)
JRST CPOPJ1
FNDPW1: FETCH(C,C,ALPH)
JUMPN C,FNDPW2
POPJ P,
;TMERGE - Merge signal block in SAVET into NAM2ND list of G
TMERGE: PUSH P,B
PUSH P,C
MOVE B,G ;START HERE
TMERG1: MOVEI TT,ADDR(B,SCMP)
MOVE T,SAVET
MOVEI T,ADDR(T,SCMP)
PUSHJ P,ALPHA
JRST LNKTXT ;WE'RE HERE
JRST TMERG2 ;NOT YET
JRST LNKTXT
JRST TMERG2
FETCH(T,B,WBIT)
TRNE T,GENSIG ;THESE MAY BE EQUAL
JRST LNKTXT
PUTSTR[ASCIZ/LOSE BIG, EQUAL RETURN FROM ALPHA AT TMERGE, SIGNAL IS :
/]
PUTSIG ADDR(B,SPNT)
PUTSTR[ASCIZ/
/]
JRST LNKTXT
TMERG2: MOVE C,B
FETCH(B,B,NNAM)
JUMPN B,TMERG1 ;NEXT?
LNKTXT: CAIN B,(G) ;WILL NEW SIGNAL BE AHEAD OF G ?
JRST LNKTX1 ;YES, IT'S THE NEW HEADER
; The new name is an altername of header (G), link in and absorb its wire
MOVE TTT,SAVET
LNKTX2: STORE(B,TTT,NNAM) ;LINK NEW BLOCK INTO NAME LIST
STORE(TTT,C,NNAM)
TRNN ISBACK ;ONLY BP HAS WRN
JRST LNKT2A
FETCH(T,G,WRN) ;MERGE WIRE-RULES
FETCH(TT,TTT,WRN)
PUSHJ P,WHCHRN
PUSHJ P,WHERRP
STORE(T,G,WRN)
LNKT2A: FETCH(T,TTT,WBIT) ;MERGE SIGNAL BITS
ANDI T,SIGBIT
FETCH(TT,G,WBIT)
IOR TT,T
STORE(TT,G,WBIT) ;INTO HEADER BLOCK
FETCH(T,TTT,WBIT)
TRON T,NAM2ND ;MARK AS SECOND
JRST LNKTX3 ;HAS WIRE, STORE BITS AND MERGE WIRES
STORE(G,TTT,WPIN) ;ALREADY SECOND, LINK BACK TO NEW HEADER POINTER
TMERGX: POP P,C
POP P,B
POPJ P,
; New signal is new wire header, replace old header, update 2ND name links
LNKTX1: MOVE TTT,SAVET
FETCH(T,TTT,WBIT)
TRZE T,NAM2ND ;NEW WILL NO LONGER BE SECOND
JRST [ CLEAR(TTT,WPIN) ;CLEAR POINTER IF WAS SECOND (NO PINS)
TRZ T,WSINGL ;NOT SINGLE
TRO T,WNULL ;AND IS NULL (TO START WITH)
JRST .+1]
STORE(T,TTT,WBIT) ;STORE BITS BACK
FETCH(T,G,NNAM) ;COPY OVER HEADER'S LIST OF 2ND NAMES
STORE(T,TTT,NNAM)
JUMPE T,LNKTXA
LNKTXB: STORE(TTT,T,WPIN) ;POINT SECOND NAMES TO NEW HEADER
FETCH(T,T,NNAM)
JUMPN T,LNKTXB
LNKTXA: EXCH TTT,G ;MAKE NEW THE HEADER, AND MERGE OLD HEADER AFTER IT
MOVE C,G ;SETUP LINKS
FETCH(B,C,NNAM)
JRST LNKTX2
; Absorb pins of new 2ND name onto header's wire
LNKTX3: STORE(T,TTT,WBIT) ;STORE BACK BITS
FETCH(E,TTT,WPIN) ;PIN LIST POINTER
STORE(G,TTT,WPIN) ;REPLACE WITH HEADER POINTER
JUMPE E,TMERGX ;DONE IF NO WIRES
LNKTX4: FETCH(T,E,NXTP)
HRLM T,(P) ;SAVE NXTP
PUSHJ P,PMERGE ;MERGE PIN IN B INTO LIST G
HLRZ E,(P) ;GET NXTP BACK
JUMPN E,LNKTX4
JRST TMERGX
;LMERGE - Merge 2 wires, pointer to current in G, other in B
LMERGE: MOVEM B,SAVET
FETCH(T,B,NNAM) ;GET NEXT LINK NOW
HRLM T,(P) ;SAVE IT
PUSHJ P,TMERGE ;MERGE, LOOKING FORWARD FROM HERE
HLRZ B,(P) ;GET NEXT POINTER
JUMPN B,LMERGE ;LOOP FOR ALL THE TEXT
POPJ P,
; READ PINS AND FIND THEIR BODIES
PINLOP: XCT GETCHR ;READ NEXT PIN ON WIRE
JRST ILLEND
JUMPN TTT,PINLP2 ; MORE PINS?
XCT GETCHR ;ALL PINS IN, GET 0,,RUNBITS
JRST ILLEND
JUMPE G,DIDWIR ;NO PLACE TO PUT THEM IF NO RUN
TRNN TTT,CABBDY ;THIS IS ONLY INTERESTING BIT FOR NOW
JRST DIDWIR
FETCH(T,G,WBIT)
TRO T,CABRUN ;FLAG AS CABLE RUN
STORE(T,G,WBIT)
JRST DIDWIR
PINLPA: TRNE ISBACK ;ALREADY GOT FIRST WORD IN TTT
JRST BPNLP0 ;BACK PANEL STUFF?
PINLP2: SKIPN G ;ADD PIN TO WIRE BEING READ IN
PUSHJ P,NULTXT ;CREATE GENERATED WIRE (INTO G)
TLNE TTT,-1 ;CONNECTOR PIN?
JRST DOBODQ ; YES
MOVEM TTT,BID ;NO, THIS IS BODY ID
XCT GETCHR ;GET PIN ID,,PIN #
JRST ILLEND
HRRZM TTT,PINNUM
HLRZM TTT,PID
SETZM PINTMP
TRNE PCNOTD
JRST NOPTMP
XCT GETCHR
JRST ILLEND
HLLZM TTT,PINTMP ;STORE PIN BITS (NOTHING IN RIGHT HALF YET)
NOPTMP: PUSHJ P,BODFNB ;FIND BY BID ALONE
JRST PINLOP ;NOT FOUND, MUST NOT BE ON THIS CARD, LOOP BACK
JRST NCNPIN
DOBODQ: MOVS TTT,TTT ;SWAP IT BACK
MOVE T,TTT
PUSHJ P,CPNSEP ;SEPARATE BODY LOC AND PIN NUMBER
MOVEM TT,PINNUM
MOVEM T,PINLOC
SETZM BID
PUSH P,TTT
XCT GETCHR ;APPROX X,Y ,, CPIN ID
JRST ILLEND
HRRZM TTT,PID
HLRZM TTT,PINTMP
TRNE PCNOTD
JRST DOBDQ1
XCT GETCHR ;GET BITS,,0
JRST ILLEND
HLLM TTT,PINTMP ;STORE BITS HERE
DOBDQ1: POP P,TTT ;B-R-S,,CPIN LOC/PIN
HRRI TTT,
JUMPE TTT,BLNKCD ;BLANK OR
CAME TTT,SLICEL ;RIGHT SLICE?
JRST PINLOP ;NO, SKIP IT
BLNKCD: PUSHJ P,BODFNC ;FIND BODY FOR CON
NCNPIN: MOVE F,A ;PUT BODY POINTER IN SAFE PLACE
PUSHJ P,PMAKE ;NOW MAKE PIN BLOCK, AND SETUP TYPE POINTER
PUSHJ P,PMERGE ;AND MERGE IT INTO THE WIRE
JRST PINLOP
; READ PINS (BACKPANEL)
BPINLP: XCT GETCHR ;READ PPS,,CPIN ID
JRST ILLEND
JUMPE TTT,DIDWIR ;QUIT ON 0
BPNLP0: SKIPN G
PUSHJ P,NULTXT ;NO SIGNAL NAME BLOCK YET, MAKE ONE
HRRZM TTT,PID
HLRZM TTT,PINNUM
XCT GETCHR
JRST ILLEND
MOVEM TTT,PINTMP ;STORE 0,,APPROX X/Y
XCT GETCHR ;FILENAME
JRST ILLEND
MOVE E,TTT
XCT GETCHR
JRST ILLEND
HLRZ F,TTT ;EXT ONLY FOR NOW
XCT GETCHR ;PPN
JRST ILLEND
EXCH F,TTT
PUSHJ P,BPFFIL ;FIND FILE BLOCK
MOVEM T,THSFIL ;FILE POINTER
MOVE F,BSLOT ;SLOT BODY POINTER
PUSHJ P,PMAKE ;MAKE PIN BLOCK
PUSHJ P,PMERGE ;MERGE WITH OTHERS
JRST BPINLP ;AND LOOP BACK FOR MORE
;BPFFIL - FIND BP FILE BLOCK
;CALL WITH FILNAME IN E
;AND PPN IN F
BPFFIL: MOVEI T,RADDR(L,BKNM,FNXT)
PUSH P,TTT ;SAVE EXT ON STACK
JRST BPNLP2
BPNLP1: CAMGE E,ADDR(T,FILN)
JRST BPNLOS
CAME E,ADDR(T,FILN)
JRST BPNLP2
FETCH(TTT,T,FEXT)
CAMLE TTT,(P)
JRST BPNLOS
CAME TTT,(P)
JRST BPNLP2
CAMGE F,ADDR(T,FPPN)
JRST BPNLOS
CAMN F,ADDR(T,FPPN)
JRST [ POP P,(P)
POPJ P,]
BPNLP2: MOVE TT,T
FETCH(T,T,FNXT)
JUMPN T,BPNLP1
BPNLOS: PGETFS(T,FBLK)
BCLEAR(TTT,T,FBLK)
FETCH(TTT,TT,FNXT)
STORE(TTT,T,FNXT)
STORE(T,TT,FNXT)
STORE(E,T,FILN)
POP P,TTT
STORE(TTT,T,FEXT)
STORE(F,T,FPPN)
MOVE B,T
PUTSTR[ASCIZ/NO FILE BLOCK FOR /]
PUTSIX ADDR(B,FILN)
PUTBYT "."
FETCH(T,B,FEXT)
HRLZ T,T
PUTSIX T
PUTBYT "["
HLLZ TT,ADDR(B,FPPN)
PUSHJ P,LSIXOUT
PUTBYT ","
HRLZ TT,ADDR(B,FPPN)
PUSHJ P,LSIXOUT
PUTBYT "]"
PUTSTR[ASCIZ/, SO I MADE ONE!
/]
MOVEI A,RADDR(L,BKNM,FNXT)
PUSHJ P,FILMR1 ;SORT INTO LIST
MOVE T,B
POPJ P,
;PMAKE - MAKE POINT ENTRY
;G = WIRE
;F = BODY
;WQNWRD = Qualifier/rule number stuff
;BAKBIT = Bits from on-board wirelist
;RETURNS PIN POINTER IN E
PMAKE: TRNN ISBACK ;BACK PANEL?
JRST PMAKEA
GETFS(E,BPHEAD)
BCLEAR(TTT,E,BPHEAD) ;CLEAR OUT BLOCK
SETZ TT,
PUSHJ P,CAPPXY ;GET CON APPROX X,Y
STORE(TT,E,PBIT)
MOVE TTT,PINNUM
STORE(TTT,E,PINN)
HLRZ TT,WQNWRD ;ANY Q FOR THIS PIN?
JUMPN TT,BPMAK0 ;YES
HLRZ TT,BAKBIT ;GET WBITS FROM BOARD WIRELIST
TRNN TT,CABRUN ;CABLE RUN?
JRST BPMAK1 ;NO
FETCH(TT,E,PBIT)
TRNE TT,QBITS ;ALREADY GOT Q LETTER?
JRST BPMAK1 ;YES, SKIP
MOVE TT,QL2N+"C" ;GET Q NUMBER FOR "C"
BPMAK0: FETCH(TTT,E,PBIT)
TRZ TTT,QBITS
ANDI TT,QBITS
TRO TTT,(TT)
STORE(TTT,E,PBIT)
BPMAK1: HRRZ TT,BAKBIT
JUMPE TT,BACMAK
HLLZS BAKBIT ;MAKE SURE ONLY ONE PIN PER CARD PER RUN
STORE(TT,E,CBIT) ;STORE CON/CARD BITS
HLRE T,BAKOLD ;HI IN
STORE(T,E,HILD)
HRRE T,BAKOLD ;LOW IN
STORE(T,E,LILD)
HLRE T,BAKILD ;HI OUT
STORE(T,E,HOLD)
HRRE T,BAKILD ;LOW OUT
STORE(T,E,LOLD)
MOVE T,BAKSFL
STORE(T,E,FILO) ;STORE SOURCE FILE BLOCK POINTER
JRST BACMAK
CAPPXY: HRRZ TTT,PINTMP
JUMPE TTT,CPOPJ
TRO TT,CANYPOS
SUBI TTT,1001
DPB TTT,[POINT CXPOSL,TT,35-CXPOSB]
LSH TTT,-9
DPB TTT,[POINT CYPOSL,TT,35-CYPOSB]
POPJ P,
PMAKEA: PGETFS(E,PHEAD)
BCLEAR(TTT,E,PHEAD) ;CLEAR OUT BLOCK
FETCH(TT,F,BBIT)
TRNE TT,CBODY
JRST [ LDB TT,[POINT CPNBSZ,PINTMP,CPNBPS]
LSH TT,=18-(TRMBPS+1) ;POSITION TO ADD POS INFO
PUSHJ P,CAPPXY
JRST PMAKPN]
MOVE TTT,PINTMP
TLNN TTT,DEFPIN
TDZA TT,TT
MOVEI TT,PIDPIN
PMAKPN: MOVE TTT,PINNUM
STORE(TTT,E,PINN)
STORE(TT,E,PBIT) ;STO BITS
MOVE TTT,PID
STORE(TTT,E,PID)
BACMAK: MOVE TTT,THSFIL ;FILE POINTER
STORE(TTT,E,FILP)
STORE(F,E,PBDY)
;PMAKE - CONT'D
;NOW SORT INTO BODY PIN LIST BY PIN #
MOVEI T,RADDR(F,BPIN,NXBP)
JRST PMAKE1
PMAKE2: FETCH(TTT,T,PINN)
CAMGE TTT,PINNUM ;THERE YET?
JRST PMAKE1
TRNN PCNOTD
CAME TTT,PINNUM
JRST PMAKE3 ;YES, STICK US IN
PMAKE1: MOVE TT,T
FETCH(T,T,NXBP)
JUMPN T,PMAKE2
PMAKE3: FETCH(T,TT,NXBP)
STORE(T,E,NXBP)
STORE(E,TT,NXBP)
TRNE ISBACK ;NOT FOR BACK PANEL LIST
POPJ P, ;ALL DONE IF BACK PANEL LIST
;FALL INTO PTLINK
;PTLINK - FIND PIN TYPE POINTER --
; BODY IN F, PIN BLOCK IN E
;PIN # IN PINNUM
;(Returns T = 0 if link fails )
PTLINK: FETCH(T,F,DIPT) ;DIP POINTER
JUMPE T,CPOPJ ;LEAVE NOW IF NONE
MOVEI T,RADDR(T,DPIN,DPNXT)
JRST PTLNK2
PTLNK1: FETCH(TTT,T,DPNM)
CAMN TTT,PINNUM
JRST ISPNTR
PTLNK2: FETCH(T,T,DPNXT)
JUMPN T,PTLNK1
POPJ P,
;Found pointer, store it and collect bits and pin types
ISPNTR: STORE(T,E,PTYP)
MOVEM T,TMPCN1 ;SAVE FOR COMPARISON LATER
FETCH(TT,T,DPBIT) ;GET DIP PIN TYPE BITS
TRNN TT,PWR!GND ;ARE WE ADDING A POWER/GROUND PIN?
POPJ P,
; Remove invented PWR/GND pin if explicit in drawing
FETCH(T,F,BLOC) ;GET BODY LOC
MOVEM T,PINLOC ;SAVE HERE
MOVEI T,RADDR(W,WBDY,NXTB)
JRST UNINV2
UNINV1: FETCH(TT,T,BBIT)
TRNE TT,CBODY
JRST UNINV2
FETCH(TT,T,BLOC)
CAMGE TT,PINLOC ;GOT TO RIGHT LOC YET?
JRST UNINV2 ;NO
CAME TT,PINLOC ;YES, AT OR PAST?
JRST UNINVX ;PAST
MOVEI TT,RADDR(T,BPIN,NXBP)
JRST UNINV4
;Found body in same loc, look for invented version of same pin
UNINV3: FETCH(TTT,TT,PBIT)
TRNN TTT,INVENT ;INVENTED PIN?
JRST UNINV4 ;NO
FETCH(TTT,TT,PTYP)
CAMN TTT,TMPCN1 ;SAME DIP PIN?
JRST UNINV5 ;YES
UNINV4: MOVEM TT,TMPCN2
FETCH(TT,TT,NXBP)
JUMPN TT,UNINV3
UNINV2: FETCH(T,T,NXTB)
JUMPN T,UNINV1
UNINVX: MOVE T,TMPCN1 ;RETURN TYPE BLOCK
POPJ P,
;Remove invented pin from Body's pin list
UNINV5: MOVE T,TMPCN2
FETCH(TTT,TT,NXBP)
STORE(TTT,T,NXBP) ;LINK PIN OUT OF BODY LIST
FETCH(T,TT,HPNT) ;GET WIRE HEADER
MOVEI T,RADDR(T,WPIN,NXTP)
JRST UNINV7
;Also remove invented pin from it's wire
UNINV6: CAIN T,(TT) ;GET TO US YET?
JRST UNINV8
UNINV7: MOVE TTT,T
FETCH(T,T,NXTP)
JUMPN T,UNINV6
OUTSTR [ASCIZ /MOBY LOSSAGE - PIN NOT FOUND IN ITS WIRE AT UNINV7.
/]
JRST UNINVX
UNINV8: FETCH(T,TT,NXTP)
STORE(T,TTT,NXTP) ;LINK PIN OUT OF WIRE
FSTRET(TT,PHEAD) ;RETURN PIN
JRST UNINVX
;PMERGE - MERGE PIN ONTO WIRE
;ENTER WITH PIN POINTER IN E, WIRE POINTER IN G
PMERGE: FETCH(F,E,PBDY) ;BODY POINTER
FETCH(T,F,BLOC)
MOVEM T,PINLOC
STORE(G,E,HPNT)
FETCH(T,E,PINN)
MOVEM T,PINNUM
;SORT INTO WIRE BY LOC AND PIN #
MOVEI T,RADDR(G,WPIN,NXTP)
FETCH(A,E,PBDY)
FETCH(TT,A,DIPT)
MOVEM TT,LSTDIP
FETCH(A,A,BBIT)
MKPBK: MOVE TT,T
FETCH(T,TT,NXTP)
JUMPE T,MKPBK1
FETCH(TTT,T,PBDY)
FETCH(TTT,TTT,BBIT)
TRNN TTT,CBODY
JRST [ TRNE A,CBODY
JRST MKPBK ;NOT THERE YET
JRST MKPBKC]
TRNN A,CBODY
JRST MKPBK1
MKPBKC: FETCH(TTT,T,PBDY)
FETCH(TTT,TTT,BLOC)
CAMLE TTT,PINLOC ;HAVE WE PASSED IT?
JRST MKPBK1 ;YES
CAME TTT,PINLOC ;EQUAL?
JRST MKPBK ;NO, GO ON
FETCH(TTT,T,PINN) ;YES, CHECK PIN #
CAMGE TTT,PINNUM ;THIS IT?
JRST MKPBK ;NO, LOOP
FETCH(TTT,E,PBIT)
TRNN TTT,PIDPIN ;NO DUP IF PID HERE
SKIPN PINLOC
JRST MKPBK1 ;NO DUP IF NO LOC
FETCH(TTT,T,PINN) ;SETUP PIN # AGAIN
TRNN PCNOTD ;NO SUCH FEATURE FOR PC CARDS
CAME TTT,PINNUM ;SAME PIN AS WELL AS LOC?
JRST MKPBK1 ;NO, DO NORMAL THING
FETCH(TTT,T,PBIT)
TRNE TTT,PIDPIN ;IF HE IS PID
JRST MKPBK ;THEN KEEP LOOKING
FETCH(TTT,T,PBDY)
FETCH(TTT,TTT,DIPT)
CAME TTT,LSTDIP ;MUST BE SAME DIP TYPE
JRST MKPBK
FETCH(A,E,PBIT)
TRO A,DUP
STORE(A,E,PBIT)
FETCH(TT,T,NXTP) ;PUT IT AFTER MATCH PIN
STORE(TT,E,NXTP)
STORE(E,T,NXTP)
POPJ P,
MKPBK1: FETCH(TTT,G,WBIT)
TRZE TTT,WNULL ;CERTAINLY NOT NULL ANY MORE
TROA TTT,WSINGL ;IF WAS NULL, NOW IS SINGLE
TRZ TTT,WSINGL ;APPARENTLY NOT SINGLE EITHER
STORE(TTT,G,WBIT)
MKPBK2: STORE(T,E,NXTP)
STORE(E,TT,NXTP)
TRNE ISBACK ;BACK PANEL DOESN'T DO THE REST
JRST BBITOR ;OR BITS INTO INTO HEADER
;LBCOPY - COPY BITS AND LOADING INTO HEADER
;ENTER WITH E POINTER TO PIN, G POINTER TO WIRE, SET PSHARE IF SECOND SHARE PIN!
;FALLS THRU
LBCOPY: FETCH(TT,E,PBIT)
TRNE TT,DUP
POPJ P,
TRZ TT,PSHARE ;CLEAR THIS BIT
STORE(TT,E,PBIT)
FETCH(A,E,PTYP)
JUMPE A,NSHARE ;NO SHARING IF NO POINTER
FETCH(T,A,DPBIT) ;GET TYPE BITS
TRNN T,SHARE ;SHARE PIN?
JRST NSHARE
FETCH(TT,G,TBIT)
TRNN TT,SHARE ;ANY SHARE PINS IN WIRE YET?
JRST NSHARE ;NO, SKIP REST OF THIS
FETCH(T,A,PSWP) ;THIS IS SHARE #
MOVEM T,SHRNUM ;SAVE HERE
FETCH(F,E,PBDY) ;GET BODY
MOVEI F,RADDR(F,BPIN,NXBP);FOLLOW BODY PIN LIST
JRST LBCPY1
LBCPY2: CAIN F,(E) ;THIS US?
JRST LBCPY3 ;YES, GO TO OTHER LOOP
FETCH(T,F,HPNT)
CAIE T,(G) ;SAME WIRE?
JRST LBCPY1 ;NO
FETCH(T,F,PTYP) ;PIN TYPE POINTER
JUMPE T,LBCPY1 ;ANY?
FETCH(TT,T,DPBIT)
TRNN TT,SHARE ;SHARE PIN?
JRST LBCPY1 ;NO
FETCH(TT,T,PSWP)
CAMN TT,SHRNUM ;SAME SHARE NUMBER?
JRST LBCPYS
LBCPY1: FETCH(F,F,NXBP)
JUMPN F,LBCPY2
PUTSTR[ASCIZ/DIDN'T SEE OURSELVES AT LBCOPY!
/]
JRST NSHARE
LBCPY4: FETCH(T,F,HPNT)
CAIE T,(G) ;SAME WIRE?
JRST LBCPY3 ;NO
FETCH(T,F,PTYP)
JUMPE T,LBCPY3 ;ANY TYPE POINTER?
FETCH(TT,T,DPBIT)
TRNN TT,SHARE ;SHARE PIN?
JRST LBCPY3
FETCH(TT,T,PSWP)
CAMN TT,SHRNUM
JRST LBCPYT
LBCPY3: FETCH(F,F,NXBP)
JUMPN F,LBCPY4
JRST NSHARE
LBCPYT: FETCH(T,F,PBIT)
TRO T,PSHARE ;MAKE LATER ONE A SHARE PIN
STORE(T,F,PBIT)
JRST NSHARE
; SHARED PIN ?
LBCPYS: FETCH(T,E,PBIT)
TRO T,PSHARE
STORE(T,E,PBIT)
NSHARE: JUMPE A,CONCHK ;PIN TYPE POINTER? IF NOT, CHECK IF CON PIN
FETCH(T,A,DPBITS) ;PIN TYPE BITS
FETCH(B,G,TBIT)
IOR B,T
STORE(B,G,TBIT)
SETLOS: FETCH(TTT,G,WBIT)
TRNN TTT,GENSIG ;does this run need a generated signal name?
POPJ P,
; Try to remember something to make the name of this pin unique
; In order of preference: Loc of output, connector, input, any other pin
MOVE TTT,LOSBIT ;get DPBITS from last pass thru STOLOS
TRNE TTT,OUTLD
POPJ P, ;GOT GOOD GUY
TRNE T,OUTLD
JRST STOLOS
TRNE TTT,ANYCON
POPJ P,
TRNE T,ANYCON
JRST STOLOS
TRNE TTT,INLD
POPJ P,
TRNE T,INLD
JRST STOLOS
TRNE TTT,-1
POPJ P,
TRNN T,-1
SKIPN LOSNAM
JRST STOLOS
POPJ P,
STOLOS: MOVEM T,LOSBIT ;TRY TO REMEMBER SOME LOCN TO LABEL RUN IF NONAME
FETCH(T,E,PBDY)
FETCH(T,T,BLOC)
JUMPE T,CPOPJ ;DON'T USE IF NO BLOC
HRRM T,LOSNAM
FETCH(T,E,PINN)
HRLM T,LOSNAM
POPJ P,
CONCHK: FETCH(F,E,PBDY)
FETCH(TTT,F,BBIT)
TRNN TTT,CBODY ;CON?
JRST [ SETZ T,
JRST SETLOS] ;MAYBE USE THIS PIN IF NOTHING ELSE
FETCH(T,G,TBIT)
TRO T,ANYCON ;MARK AS HAVING CON IN RUN
STORE(T,G,TBIT)
JRST SETLOS ;STORE WORD WITH ANYCON ON IN LOSBIT
BBITOR: FETCH(A,E,CBIT)
JUMPE A,CPOPJ
FETCH(TT,G,TBIT)
IOR TT,A ;OR CON BITS INTO HEADER BITS
STORE(TT,G,TBIT)
POPJ P,
; FIND BODIES, MAKE THEM
;FIND BODY BY BODY ID ONLY
BODFNB: MOVEI A,RADDR(W,WBDY,NXTB)
MOVE TTT,BID
JRST BDFNB1
BDFNB2: FETCH(T,A,BID)
CAME TTT,T
JRST BDFNB1 ;NOT IT
FETCH(T,A,FILB)
CAMN T,THSFIL ;FROM THIS FILE?
JRST CPOPJ1 ;THIS IS IT
BDFNB1: FETCH(A,A,NXTB)
JUMPN A,BDFNB2
POPJ P, ;NOT FOUND
;FIND BODY BY LOCATION
BODFND: TRZ FLAG ;FLAG NO OTHER BODIES IN THIS LOC YET
MOVEI A,RADDR(W,WBDY,NXTB)
BODFN2: MOVE B,A ;SAVE PREVIOUS POINTER
FETCH(A,A,NXTB)
JUMPE A,CPOPJ ;END? GOES HERE
FETCH(TT,A,BBIT)
TRNE TT,CBODY
POPJ P, ;ALWAYS GOES BEFORE CONS
FETCH(TT,A,BLOC) ;GET HIS LOC
CAMGE TT,PINLOC ;ARE WE THERE YET?
JRST BODFN2 ;NO
CAME TT,PINLOC ;YES, SAME?
POPJ P, ;GOES HERE
TRO FLAG ;FLAG LOC ALREADY EXISTS
FETCH(T,A,BID)
CAMGE T,BID
JRST BODFN2
CAME T,BID
POPJ P,
FETCH(TT,A,FILB)
CAMGE TT,THSFIL
JRST BODFN2
CAMN TT,THSFIL
AOS (P) ;THIS IS IT, SKIP
POPJ P,
;FIND CONNECTOR BODY
BODFNC: MOVEI A,RADDR(W,WBDY,NXTB)
BDFNC1: MOVE B,A
FETCH(A,A,NXTB)
JUMPE A,BODMKC ;NOT FOUND, MAKE IT
FETCH(T,A,BBIT)
TRNN T,CBODY
JRST BDFNC1 ;ALWAYS GOES AFTER BODIES
FETCH(T,A,BLOC)
CAMGE T,PINLOC
JRST BDFNC1
CAMN T,PINLOC
POPJ P, ;FOUND IT
JRST BODMKC
;FIND BACK PANEL SLOT BODY
SLOTFN: MOVEI A,RADDR(W,WBDY,NXTB)
JRST SLOTF1
SLOTF2: FETCH(T,A,BLOC)
CAML T,PINLOC
JRST [ CAME T,PINLOC ;EXACT MATCH?
JRST BODMK1 ;NO, MAKE ONE
POPJ P,]
SLOTF1: MOVE B,A
FETCH(A,A,NXTB)
JUMPN A,SLOTF2
JRST BODMK1
;MAKE BODIES
;B,A = POINT IN LIST TO INSERT BODY
BODMK0: PGETFS(T,BHEAD) ;YES, MAKE NEW BODY
BCLEAR(TTT,T,BHEAD) ;CLEAR OUT BLOCK
STORE(T,B,NXTB)
STORE(A,T,NXTB)
MOVE A,T
MOVE TTT,BID
STORE(TTT,A,BID)
MOVE TTT,PINLOC
STORE(TTT,A,BLOC)
POPJ P,
BODMK1: PUSHJ P,BODMK0
MOVE T,THSFIL ;NO, USE FILE POINTER
BDMKST: STORE(T,A,FILB)
POPJ P,
;MAKE A BODY BLOCK FOR A CONNECTOR PIN
BODMKC: PUSHJ P,BODMK0
PUSH P,A
MOVE A,PINLOC
PUSHJ P,QUPIN
SKIPA T,[BEDGE]
MOVEI T,BWILD
POP P,A
STORE(T,A,BBIT)
MOVEI T,[0] ;POINTER TO 0 FILENAME(FILB)
JRST BDMKST
;THIS COUNTS ON BODMK1 USING PGETFS, NOT GETFS, SO BODY NAME GOES AT FSTOP
BODMK2: PUSHJ P,BODMK1 ;MAKE AND LINK BASIC BODY BLOCK
MOVEI T,ADDR(A,BNAM) ;POINTER TO WHERE TO PUT BODY NAME
MOVEI TT,STRTAB
BODMK3: MOVE TTT,(TT)
CAMLE T,.JBREL
JSR MORCOR ;NEED SOME MORE
MOVEM TTT,(T)
USAGE,< AOS FSTCNT >
ADDI T,1
TRNE TTT,376 ;END OF STRING?
AOJA TT,BODMK3
MOVEM T,FSTOP ;NEW FSTOP
USAGE,< SOS FSTCNT >
POPJ P,
ILLEND: PUTSTR[ASCIZ/ILLEGAL END OF INPUT FILE!
NO MORE INPUT WILL BE DONE!
/]
JRST ERRET
; READ DIP COUNTS FROM BAC FILE
ENDIN: SKIPE MODULE ;THEORY HAS IT THIS WON'T HAPPEN
SKIPN DIPLST
JRST SKPCNT ;IF NO DIPS, SKIP COUNTS
MOVEI A,MODLST-ADDR(0,MNXT)
JRST MODLP1
MODLP2: FETCH(T,A,MNAM)
MOVE TT,MODULE
PUSHJ P,TXTMAT
JRST MODLP1
JRST MODLP3
JRST SKPCNT ;IF MODULE ALREADY IN LIST, SKIP IT
;WE ONLY WANT COUNTS FOR ONE BOARD
MODLP1: MOVE B,A
FETCH(A,A,MNXT)
JUMPN A,MODLP2
MODLP3: PGETFS(A,BMOD)
BCLEAR(T,A,BMOD)
MOVE T,MODULE
STORE(T,A,MNAM)
FETCH(T,B,MNXT)
STORE(T,A,MNXT)
STORE(A,B,MNXT)
MOVEM A,MODULE
ENDIN1: PUSHJ P,RSTR ;READ STRING DIPNAME
JRST DOFILS
MOVEM T,STRING
MOVE B,DIPLST
PUSHJ P,DIPFND
JRST [ MOVE A,STRING
PUSHJ P,STROUT
PUTSTR[ASCIZ/, DIPTYPE NOT FOUND!
/]
SETZ B,
JRST .+1]
MOVEM B,LSTDIP
MOVE B,STRING
PUSHJ P,PUTFS
ENDIN2: XCT GETCHR
JRST ILLEND
AOJE TTT,ENDIN1 ;END IS -1
SUBI TTT,1
MOVEM TTT,TMPCN2 ;SAVE APPROX COUNT HERE
XCT GETCHR
JRST ILLEND
MOVEM TTT,TMPCN1 ;SAVE REAL COUNT HERE
PUSHJ P,BAKPRP ;READ PROPERTIES AND FIND PART NUMBER
SKIPN LSTPART
JRST ENDIN6 ;USE NULL PART NUMBER BLOCK
SKIPN H,PARTLIST
JRST ENDIN4
ENDIN3: FETCH(T,H,PLPT)
CAMN T,LSTPART ;FIND OUR PART?
JRST ENDIN5
FETCH(H,H,NXPL)
JUMPN H,ENDIN3
ENDIN4: OUTSTR[ASCIZ/MOBY LOSSAGE, PART NUMBER NOT FOUND IN PARTLIST.
/]
ENDIN6: MOVEI H,NULPART-ADDR(0,MDCN);SET NULL PART HEADER BLOCK
ENDIN5: MOVEI G,RADDR(H,MDCN,MDNX)
JRST ENDNA1
ENDNA2: FETCH(TT,G,MDIP)
SKIPN T,LSTDIP
JRST [ JUMPN TT,ENDNA1
JRST ENDNA4]
JUMPE TT,ENDNA3
FETCH(T,T,DNAM)
FETCH(TT,TT,DNAM)
PUSHJ P,DSORT
JRST ENDNA3
JRST ENDNA1
JRST ENDNA4
ENDNA1: MOVE F,G
FETCH(G,G,MDNX)
JUMPN G,ENDNA2
ENDNA3: GETFS(T,MDBLOCK)
BCLEAR(TT,T,MDBLOCK)
MOVE TT,LSTDIP
STORE(TT,T,MDIP)
STORE(T,F,MDNX)
STORE(G,T,MDNX)
MOVE G,T
ENDNA4: MOVEI E,RADDR(G,MXPT,MXNX)
FETCH(F,G,MXPT)
JUMPE F,ENDNB3
SKIPE PRPLST
JRST ENDNB2
FETCH(T,F,MPRX)
JUMPN T,ENDNB3
JRST ENDNB4
ENDNB2: FETCH(E,F,MPRX)
PUSH P,F
JUMPE E,ENDNB1
PUSHJ P,PRXMAT
JRST ENDNB1
POP P,F
JRST ENDNB4
ENDNB1: POP P,E
FETCH(F,E,MXNX)
JUMPN F,ENDNB2
ENDNB3: GETFS(T,MXBLOCK)
BCLEAR(TT,T,MXBLOCK)
MOVE TT,PRPLST
STORE(TT,T,MPRX)
STORE(T,E,MXNX)
STORE(F,T,MXNX)
MOVE F,T
ENDNB4: MOVEI E,RADDR(F,MCPT,MCNX)
JRST ENDNC1
ENDNC2: FETCH(T,E,MODC)
FETCH(T,T,MNAM)
MOVE TT,MODULE
FETCH(TT,TT,MNAM)
PUSHJ P,TXTMAT
JRST ENDNC1
JRST ENDNC3
JRST ENDNC4
ENDNC1: MOVE D,E
FETCH(E,E,MCNX)
JUMPN E,ENDNC2
ENDNC3: GETFS(T,MCBLOCK)
BCLEAR(TT,T,MCBLOCK)
MOVE TT,MODULE
STORE(TT,T,MODC)
STORE(T,D,MCNX)
STORE(E,T,MCNX)
MOVE E,T
ENDNC4: FETCH(T,E,MREA)
ADD T,TMPCN1
STORE(T,E,MREA)
FETCH(T,E,MAPP)
ADD T,TMPCN2
STORE(T,E,MAPP)
JRST ENDIN2