1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-17 00:33:22 +00:00
PDP-10.its/src/wl/wldip.329
2018-05-05 19:19:09 +02:00

2638 lines
49 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>WLDIP.FAI.146, 20-NOV-75 10:14:55, EDIT BY HELLIWELL
SUBTTL 'DIP' CHANGE DIP FILENAME, PRINT DIP FILENAME
CNAME: MOVSI T,'DIP'
MOVEM T,DEFEXT
PUSHJ P,CFILE
POPJ P, ;NO CHANGE
MOVE T,FILNAM
MOVEM T,DIPNAM
MOVE T,FILEXT
MOVEM T,DIPNAM+1
SKIPN T,FILPPN
DSKPPN T,
MOVEM T,DIPPPN
JRST CPOPJ1
NDNAME: PUSHJ P,CNAME
JFCL
PUSHJ P,DNPNT
CRLF
POPJ P,
DNPNT: MOVE T,[OUTCHR TTT]
MOVEM T,PUTCHR
DNPNT1:
NOITS,<
PUTSIX DIPNAM
PUTBYT "."
HLLZ TTT,DIPNAM+1
PUTSIX TTT
IFE LIBPPN,<
SKIPN DIPPPN
POPJ P,
>;IFE LIBPPN
PUTBYT "["
NOCMU,<
HLLZ TT,DIPPPN
PUSHJ P,LSIXOUT
PUTBYT ","
HRLZ TT,DIPPPN
PUSHJ P,LSIXOUT
>;NOCMU
CMU,<
MOVE T,[DIPPPN,,PPNBUF]
DECCMU T,
JRST [ PUTSIX DIPPPN
JRST .+2 ]
PUTSTR PPNBUF
>;CMU
PUTBYT "]"
>;NOITS
ITS,<
SKIPN T,DIPNAM+3
DSKPPN T,
PUTSIX T
PUTBYT ";"
PUTSIX DIPNAM
PUTBYT 40
HLLZ T,DIPNAM+1
PUTSIX T
>;ITS
POPJ P,
; READ DIP FILE
DIPIN: SKIPE RESIDENT
JRST [NOMODR: OUTSTR[ASCIZ/SORRY, CAN'T MODIFY RESIDENT DIPS /]
JRST ERRET] ;FLUSH REST OF LINE
PUSHJ P,CNAME ;CHECK FOR NAME CHANGE
JFCL
SKIPE DIPLST ;GO AHEAD AND READ IF NONE AT ALL
JRST [ PUSHJ P,IERR
ASK[ASCIZ/SOME DIPS ALREADY IN, TYPE Y TO ADD MORE./]
POPJ P,
POPJ P,
JRST .+1]
PUSHJ P,DIPINS
OUTSTR[ASCIZ/ COULDN'T GET IT IN!
/]
POPJ P,
;READ DIP FILE
DIPCHK: SKIPE DIPLST ;ALREADY IN?
JRST CPOPJ1 ;NO
DIPINS: PUSHJ P,IN10 ;SET FOR IFULL WORD INPUT
POPJ P,
DIPINT: MOVE T,DIPPPN
MOVEM T,DIPNAM+3
DIPIN2: SETZM DIPNAM+2
HLLZS DIPNAM+1
MOVE T,DIPNAM+3
LOOKUP DAT,DIPNAM ;FIND FILE!
JRST [
IFN LIBPPN,< JUMPE T,DIPIN3 >
MOVEM T,DIPNAM+3
PUSHJ P,DNPNT
OUTSTR[ASCIZ/, LOOKUP FAILED.
TRY ANOTHER DIP FILENAME?/]
PUSHJ P,CNAME
JRST [ RELEASE DAT,
POPJ P,]
SKIPA T,DIPPPN
DIPIN3: MOVE T,[LIBPPN]
MOVEM T,DIPNAM+3
JRST DIPIN2]
MOVEM T,DIPNAM+3
PUSHJ P,DNPNT
MOVE T,[PUSHJ P,BYTIN]
MOVEM T,GETCHR
SETZM FACTR1 ;NO DIPS READ YET
MOVE T,.JBREL
LSH T,-12
MOVEM T,FACTR2
SETZM DVER ;ASSUME VERSION 0
PUSHJ P,BYTIN ;READ VERSION #
JRST DIPER1
JUMPGE TTT,DVER0
CAMGE TTT,[-DIPVER]
JRST [ OUTSTR[ASCIZ/I DON'T RECOGNIZE THIS VERSION #.
/]
JRST DIPER0]
MOVMS TTT
MOVEM TTT,DVER ;VERSION NUMBER IS -
CAIGE TTT,5 ;**DVER
OUTSTR [ASCIZ /
Old DIPVER, I'm setting package types from defaults,
maybe you should write this back out!
/]
;READ IN DIPS FROM DIPS.DIP
GTPINN: PUSHJ P,BYTIN ;READ NUMBER OF PINS ON THIS DIP!
JRST DIPER1
DVER0: JUMPE TTT,[ RELEASE DAT,
PUTBYT " "
MOVE T,FACTR1
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ DIPS READ/]
MOVE T,.JBREL
LSH T,-12
SUB T,FACTR2
JUMPE T,NXCOR
OUTSTR[ASCIZ/, /]
PUSHJ P,DECOUT
OUTSTR[ASCIZ/K CORE USED/]
NXCOR: OUTSTR[ASCIZ/.
/]
JRST CPOPJ1] ;DONE
GETFS (H,DHEAD)
BCLEAR(TT,H,DHEAD) ;CLEAN IT UP
STORE(TTT,H,DPNN) ;#PINS AS READ FROM FILE
PUSHJ P,RSTR
JRST [ OUTSTR[ASCIZ/ILLEGAL NULL DIPNAME!
/]
FSTRET(H,DHEAD)
POPJ P,]
STORE(T,H,DNAM) ;STO DIPNAME
MOVE T,DVER
CAIL T,5 ;**DVER
JRST GOTPAK
MOVSI A,-NPACK ;DEFAULT PACKAGE FROM # PINS
FETCH(TT,H,DPNN)
CAMN TT,PACKPN(A)
JRST GOTPK1
AOBJN A,.-2
JRST NOPAK
GOTPAK: PUSHJ P,RSTR
JRST NOPAK
MOVE B,T
PUSHJ P,MATPAK ;TRY TO FIND PACKAGE NAME
JRST [ PUSH P,T
FETCH(A,H,DNAM)
PUSHJ P,STROUT
OUTSTR [ASCIZ / has illegal package type - /]
POP P,A
PUSHJ P,STROUT
CRLF
SETZ A,
JRST .+1]
PUSHJ P,PUTFS ;RETURN NAME
GOTPK1: STORE(A,H,DPAK)
NOPAK: SKIPN T,DVER ;**DVER IS THERE A PART NUMBER STRING?
JRST NODPRT ;NO
CAILE T,1 ;OLDER VERSION HAS ONLY PART NUMBER
JRST NEWPRP ;ELSE NEW PROPERTY STUFF
PUSHJ P,RSTR ;READ PART NUMBER
JRST NODPRT ;IF NONE, ITS EASY
MOVE A,T ;SAVE PART NUMBER STRING
GETFS(B,PNBK) ;GET PROPERTY NAME BLOCK
BCLEAR(T,B,PNBK) ;CLEAR IT
STORE(B,H,PRPN) ;PUT IT INTO PROPERTY NAME LIST
MOVEI TT,[ASCIZ/PART NUMBER/]
PUSHJ P,ASCCOP ;MAKE INTERNAL STRING OF "PART NUMBER"
STORE(T,B,PRNS) ;STORE PROPERTY NAME
GETFS(C,PVBK) ;GET PROPERTY VALUE BLOCK
BCLEAR(T,C,PVBK) ;CLEAR IT
MOVEI T,DEFPRP!PARTNM ;MAKE IT A DEFAULT PROPERTY AND PART NUMBER
STORE(T,C,PRBT) ;STORE IN BITS
STORE(C,H,PRPV) ;PUT INTO PROPERTY VALUE LIST
STORE(A,C,PRVS) ;STORE PROPERTY VALUE STRING
STORE(B,C,PRNB) ;STORE POINTER TO PROPERTY NAME BLOCK
MOVE G,C
PUSHJ P,THRDPN ;THREAD NEW PART NUMBER
JRST NODPRT ;ALL DONE
;NEWPRP - New property list stuff
COMMENT 
A DIP's properties are arranged in a hierarchy of increasing
specification, which is terminated in a unique part number. (?)
At each level, a further specific property may be specified which
may assume a set of values. Sub-properties may appear under each
property value, until the part is completely specified. The depth
of the tree, and the sub-property's name at the next level are fixed
by the DIP's property name list. For example:
TTLDLY Delay Drive Part-number
10 ns 4 TTLDLY-10-4
10 TTLDLY-10-10
20 ns 10 TTLDLY-20-10
...

NEWPRP: MOVEI G,RADDR(H,PRPN,PRNN)
PRPNM1: PUSHJ P,RSTR
JRST PRPNMD ;0, DONE
GETFS(A,PNBK) ;GET PROPERTY NAME BLOCK
BCLEAR(TT,A,PNBK) ;CLEAR IT
STORE(A,G,PRNN) ;PUT IT AT END OF LIST
MOVE G,A ;MAKE IT END OF LIST
STORE(T,G,PRNS) ;STORE PROPERTY NAME IN BLOCK
JRST PRPNM1
PRPNMD: PUSHJ P,RSTR
JRST NODPRT ;NO VALUES
GETFS(F,PVBK)
BCLEAR(TT,F,PVBK)
STORE(T,F,PRVS) ;STORE PROPERTY VALUE STRING
MOVE TTT,DVER ;**DVER
CAIG TTT,2 ;MIT HAS VERSION WHICH DOESN'T READ/WRITE BITS
JRST [ MOVEI TTT,PARTNM!DEFPRP
JRST DV2A]
PUSHJ P,BYTIN
SETZ TTT, ;CATCH ERROR LATER
DV2A: STORE(TTT,F,PRBT) ;STORE BITS
STORE(F,H,PRPV) ;START PROPERTY VALUE LIST
FETCH(T,H,PRPN) ;GET START OF PROPERTY NAME LIST
STORE(T,F,PRNB) ;AND STORE IT
MOVE G,F
TRNE TTT,PARTNM ;IF PART NUMBER
PUSHJ P,THRDPN ;THEN ADD TO PARTLIST (SORTED)
PRPVL1: PUSHJ P,RSTR ;PUSH FOR NEXT DEEPER VALUE?
JRST PRPVL2 ;NO, READ MORE AT SAME LEVEL
; Push for sub-property value,
; which is named by next entry on PRNN property name list
GETFS(A,PVBK)
BCLEAR(TT,A,PVBK)
STORE(T,A,PRVS)
MOVE TTT,DVER ;**DVER
CAIG TTT,2 ;MIT HAS VERSION WHICH DOESN'T READ/WRITE BITS
JRST [ MOVEI TTT,PARTNM!DEFPRP
JRST DV2B]
PUSHJ P,BYTIN
SETZ TTT, ;CATCH ERROR LATER
DV2B: STORE(TTT,A,PRBT)
STORE(F,A,PRPP)
STORE(A,F,PRNP) ;MAKE US NEXT LEVEL DOWN
FETCH(T,F,PRNB)
SKIPE T
FETCH(T,T,PRNN) ;CDR PROPERTY NAME LIST
STORE(T,A,PRNB)
MOVE F,A ;MAKE US THE CURRENT LEVEL
MOVE G,F
TRNE TTT,PARTNM ;MAY HAVE REACHED THE PART NUMBER
PUSHJ P,THRDPN ; MAKE NEW ENTRY IN PARTLIST
JRST PRPVL1
;Continue reading alternate values for same property
;
PRPVL2: PUSHJ P,RSTR ;AT SAME LEVEL, READ NEXT VALUE
JRST PRPVL3 ;NONE, POP UP
GETFS(A,PVBK)
BCLEAR(TT,A,PVBK)
STORE(T,A,PRVS) ;STORE VALUE STRING
PUSHJ P,BYTIN
SETZ TTT, ;CATCH ERROR LATER
STORE(TTT,A,PRBT)
STORE(A,F,PRNV)
FETCH(T,F,PRPP) ;SIBLINGS SHARE SAME PARENT
STORE(T,A,PRPP)
FETCH(T,F,PRNB) ; AND SAME PROPERTY NAME
STORE(T,A,PRNB)
MOVE F,A
JRST PRPVL1
PRPVL3: FETCH(F,F,PRPP) ;BACK UP TO PREVIOUS LEVEL
JUMPN F,PRPVL2 ;LOOP BACK IF NOT TOP
;Have read DIPNAME and properties, now read DIP pins
NODPRT: MOVEI G,RADDR(H,DPIN,DPNXT)
FETCH(F,H,DPNN) ;NUMBER OF PINS
SETZM TMPCN1 ;CLEAR GENERATED PIN NAMES
AOJA F,NCLRSP ;GO DO END TEST
GTPINS: MOVE TT,DVER
CAIGE TT,4 ;**DVER NEW FORMAT?
JRST [ AOS TTT,TMPCN1 ;NO, MUST GENERATE
JRST GTPIN1] ;LOOK LIKE WE JUST READ IT
PUSHJ P,BYTIN
JRST DIPER2 ;ILL EOF
GTPIN1: MOVEM TTT,TMPCN2 ;SAVE HERE
PUSHJ P,BYTIN ;READ BITS,,PS#
JRST DIPER2
MOVE TT,TTT ;SAVE HERE
PUSHJ P,BYTIN ;READ HI,,LOW LOADING
JRST DIPER2
GETFS (T,DPHEAD)
BCLEAR(A,T,DPHEAD)
STORE(T,G,DPNXT)
MOVE G,T ;G NOW POINTS TO PIN HEADER
HRRZ T,TMPCN2 ;GET PIN NAME
STORE(T,G,DPNM) ;STORE IT
STORE(TT,G,PSWP)
HLRZ TT,TT
STORE(TT,G,DPBIT)
STORE(TTT,G,LLOW)
HLRZ TTT,TTT
STORE(TTT,G,LHI)
PUSHJ P,BYTIN ;READ USE
JRST DIPER2
STORE(TTT,G,DUSE)
PUSHJ P,BYTIN ;READ SECT BITS,,SECT PIN #
JRST DIPER2
STORE(TTT,G,SCTP) ;SECT PIN #
HLRZ TTT,TTT
STORE(TTT,G,SCTB) ;SECT BITS
FETCH(B,G,DPBIT)
TRNE B,INLD!OUTLD!TERM
JRST NCLRSP
CLEAR(G,SCTB)
CLEAR(G,SCTP)
CLEAR(G,PSWP)
NCLRSP: SOJG F,GTPINS
FETCH(T,H,DNAM)
MOVEM T,DSTRNG
DIPCHECK
PUSHJ P,DALPHA
JRST ISNEWD
FETCH(A,H,DNAM)
PUSHJ P,STROUT
OUTSTR[ASCIZ/ ALREADY EXISTS, WILL SKIP IT!
/]
PUSHJ P,RELH2 ;RELEASE DEFINITION
JRST GTPINN ;AND LOOP BACK
ISNEWD: STORE(H,F,NXTD)
STORE(G,H,NXTD)
AOS FACTR1 ;COUNT A DIP READ
JRST GTPINN
;DIPER - Error reading DIP, release storage and ignore
DIPER2: PUSHJ P,RELH2
DIPER1: OUTSTR[ASCIZ/UNEXPECTED EOF ON DIP FILE!
/]
DIPER0: RELEASE DAT,
POPJ P,
RELH2: FETCH(B,H,DNAM)
SKIPE B
PUSHJ P,PUTFS
FETCH(G,H,DPIN)
JUMPE G,RELH22
RELH21: MOVE B,G
FETCH(G,G,DPNXT)
FSTRET(B,DPHEAD)
JUMPN G,RELH21
RELH22: FETCH(A,H,PRPN)
JUMPE A,RELH24
RELH23: FETCH(B,A,PRNS)
SKIPE B
PUSHJ P,PUTFS
MOVE B,A
FETCH(A,A,PRNN)
FSTRET(B,PNBK)
JUMPN A,RELH23
RELH24: FETCH(A,H,PRPV)
SKIPE A
PUSHJ P,RELPRP
FSTRET(H,DHEAD)
POPJ P,
RELPRP: MOVE B,A
FETCH(A,A,PRNP)
JUMPN A,RELPRP ;GET TO BOTTOM
FETCH(A,B,PRNV) ;FOLLOW THIS LEVEL
SKIPN A
JRST [ FETCH(A,B,PRPP) ;END THIS LEVEL, GO UP 1 LEVEL
JUMPE A,.+1
CLEAR(A,PRNP)
JRST .+1]
MOVE T,B
PUSHJ P,UNTHRD
FSTRET(B,PVBK)
JUMPN A,RELPRP
POPJ P,
; WRITE DIP FILE
DIPWRT: PUSHJ P,CNAME ;CHECK FOR NAME CHANGE
JFCL
SKIPN DIPLST
JRST [ OUTSTR[ASCIZ/NO DIPS IN DIPLST!
/]
POPJ P,]
INIT LST,10
'DSK ' ;ALWAYS USE DISK!
XWD LSTHD,0
JRST [ OUTSTR[ASCIZ/INIT FAILED ON DISK!
/]
JRST ERRET]
MOVEI T,LSTBUF
EXCH T,.JBFF
OUTBUF LST,2
MOVEM T,.JBFF
MOVE T,DIPPPN
MOVEM T,DIPNAM+3
SETZM DIPNAM+2
HLLZS DIPNAM+1
PUSHJ P,DNPNT
ENTER LST,DIPNAM ;FIND FILE!
JRST [ OUTSTR[ASCIZ/ENTER FAILED CODE = /]
HRRZ T,DIPNAM+1
PUSHJ P,DECOUT
OUTSTR[ASCIZ/
/]
RELEASE LST,
POPJ P,]
MOVNI TTT,DIPVER
PUSHJ P,WORDOUT ;WRITE VERSION #
MOVE H,DIPLST
DIPCHECK
SETZM FACTR1
DIPWR1: AOS FACTR1
FETCH(G,H,DPNN) ;# OF PINS
MOVE TTT,G
PUSHJ P,WORDOUT
FETCH(T,H,DNAM)
PUSHJ P,WSTR ;WRITE DIP NAME
FETCH(T,H,DPAK)
JUMPE T,[PUSHJ P,WRTZERO
JRST DIPWR4]
HRRZ T,PACKNM(T)
PUSHJ P,WASCIZ ;WRITE PACKAGE NAME
DIPWR4: FETCH(F,H,PRPN)
JUMPE F,DPWPN1
DIPWPN: FETCH(T,F,PRNS)
PUSHJ P,WSTR
FETCH(F,F,PRNN)
JUMPN F,DIPWPN
DPWPN1: PUSHJ P,WRTZERO
FETCH(F,H,PRPV)
JUMPE F,[PUSHJ P,WRTZERO
JRST DPWPV1]
DIPWPV: FETCH(T,F,PRVS)
PUSHJ P,WSTR ;PROPERTY VALUE
FETCH(TTT,F,PRBT)
TRZ TTT,PNUSED!PRTMP1 ;CLEAR MARK BITS
PUSHJ P,WORDOUT ;PROPERTY VALUE BITS
FETCH(T,F,PRNP)
JUMPN T,DPWPV2
PUSHJ P,WRTZERO
DPWPV3: FETCH(T,F,PRNV)
JUMPN T,DPWPV2
PUSHJ P,WRTZERO
FETCH(F,F,PRPP)
JUMPN F,DPWPV3
JRST DPWPV1
DPWPV2: MOVE F,T
JUMPN F,DIPWPV
DPWPV1: MOVEI F,RADDR(H,DPIN,DPNXT)
JUMPE G,DIPWR3 ;JUMP IF NO PINS
DIPWR2: FETCH(F,F,DPNXT)
FETCH(TTT,F,DPNM) ;PIN NAME
PUSHJ P,WORDOUT ;WRITE 0,,PIN NAME
FETCH(TTT,F,PSWP)
FETCH(TT,F,DPBIT)
HRL TTT,TT
PUSHJ P,WORDOUT ;BITS,,PS #
FETCH(TTT,F,LLOW)
FETCH(TT,F,LHI)
HRL TTT,TT
PUSHJ P,WORDOUT ;LOADING
FETCH(TTT,F,DUSE)
PUSHJ P,WORDOUT ;USE
FETCH(TTT,F,SCTP)
FETCH(TT,F,SCTB)
HRL TTT,TT
PUSHJ P,WORDOUT ;SECT BITS,,SECT PIN #
SOJG G,DIPWR2
DIPWR3: FETCH(H,H,NXTD)
JUMPN H,DIPWR1
PUSHJ P,WRTZERO
RELEASE LST,
PUTBYT " "
MOVE T,FACTR1
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ DIPS WRITTEN.
/]
POPJ P,
; SORT DIP NAMES
DIPCHECK
;Sort the dip name in DSTRNG into DIPLST
;returns:
;+1 new name (insert after F)
;+2 found
DALPHA: MOVEI G,DIPLST-ADDR(0,NXTD)
;loop scans by 10.
DALPH2: MOVE F,G
DALPH4: FETCH(G,G,NXTD)
JUMPE G,DALPH5 ;MIGHT HAVE GONE BY, RECHECK LAST SEGMENT
FETCH(TT,G,DNAM)
MOVE T,DSTRNG
PUSHJ P,DSORT
JRST DALPH5 ;.LT. CURRENT, GO OVER LAST SEGMENT
CAIA ;.GT. CURRENT, SKIP 10
JRST CPOPJ1 ;.EQ. CURRENT, WIN
MOVE F,G
MOVEI T,=10 ;SKIP PAST 10 ENTRIES
DALPH1: FETCH(G,G,NXTD)
JUMPE G,DALPH5
SOJG T,DALPH1
JRST DALPH4
;loop scans by 1
DALPH5: SKIPA G,F ;BACK TO LAST SEGMENT
DALPH3: MOVE F,G
FETCH(G,G,NXTD)
JUMPE G,CPOPJ ;NEW, BELONGS AT END OF LIST
FETCH(TT,G,DNAM)
MOVE T,DSTRNG
PUSHJ P,DSORT
POPJ P, ;LESS THAN CURRENT, IS NEW
JRST DALPH3
JRST CPOPJ1
;SPECIAL SORT ROUTINE FOR DIPNAMES
; COMPARE STRING IN T VS. TT
; PUSHJ P,DSORT
; T is alpha less than TT
; T is alpha greater than TT
; T is alpha equal to TT
^DSORT: PUSH P,A
PUSH P,B
PUSH P,C
ADD T,[POINT 7,1]
ADD TT,[POINT 7,1]
CAIA
DSORT1: JUMPE TTT,DSRTD2 ;EQUAL IF END OF STRING
PUSHJ P,GET ;GET CHAR IN TTT FROM T
PUSHJ P,GETT ;GET CHAR IN A FROM TT
CAIL TTT,"0"
CAILE TTT,"9"
JRST DSORT2 ;NON DIGIT, COMPARE
CAIL A,"0"
CAILE A,"9"
JRST DSORT2 ;NON DIGIT, COMPARE
SETZB B,C ;BOTH DIGITS, INIT NUMBERS
DSORT3: IMULI B,=10
ADDI B,-60(TTT)
PUSHJ P,GET
CAIL TTT,"0"
CAILE TTT,"9"
JRST DSORT4
JRST DSORT3
DSORT4: IMULI C,=10
ADDI C,-60(A)
PUSHJ P,GETT
CAIL A,"0"
CAILE A,"9"
JRST DSORT5
JRST DSORT4
DSORT5: CAMN B,C ;SAME NUMBERS?
JRST DSORT2 ;YES, CHECK LETTERS
CAMLE B,C
JRST DSRTD1
JRST DSRTD0
DSRTD2: AOS -3(P)
JRST DSRTD1
DSORT2: CAMN TTT,A
JRST DSORT1 ;STILL EQUAL
CAML TTT,A
DSRTD1: AOS -3(P) ;TT LESS THAN T SKIP
DSRTD0: POP P,C ;T LESS THAN TT DIRECT
POP P,B
POP P,A
POPJ P,
; GET, GETT
GET: TLNN T,760000
JRST [ HRR T,-1(T)
TRNE T,-1
JRST .+1
SETZ TTT,
POPJ P,]
ILDB TTT,T
POPJ P,
GETT: TLNN TT,760000
JRST [ HRR TT,-1(TT)
TRNE TT,-1
JRST .+1
SETZ A,
POPJ P,]
ILDB A,TT
POPJ P,
; RENAME, PRINT, MODIFY
;MODIFY A DIP DEFINITION
;CHECK FOR RIDICULOUSLY LONG DIP NAMES
TEST7: HRRZ T,(B)
JUMPE T,CPOPJ1
MOVE T,1(T)
TDNN T,[BYTE(7)0,0,177]
JRST CPOPJ1
PUSHJ P,IERR
ASK[ASCIZ/MORE THAN 7 CHARS IN DIPNAME, ARE YOU SURE?/]
POPJ P,
POPJ P,
JRST CPOPJ1
DIPSET: MOVE B,[PUSHJ P,TTYIN]
MOVEM B,GETCHR
PUSHJ P,TREADU
POPJ P,
JRST [NONULL:OUTSTR[ASCIZ/SORRY - YOU MUST TYPE A DIP NAME.
/]
POPJ P,]
MOVEM B,DSTRNG
DIPCHECK
PUSHJ P,DALPHA
JRST [
NODIPY: MOVE B,DSTRNG
OUTSTR[ASCIZ/NO SUCH DIP!
/]
JRST PUTFS]
MOVE H,G
MOVE B,DSTRNG
AOS (P)
JRST PUTFS
; DIPREN - Dip rename
DIPREN: SKIPE RESIDENT
JRST NOMODR
PUSHJ P,DIPSET ;FIND THE DIP
POPJ P,
OUTSTR[ASCIZ/NEW NAME?/]
HRLM F,(P) ;SAVE PREVIOUS POINTER
PUSHJ P,TREADU
POPJ P,
POPJ P,
PUSHJ P,TEST7
JRST PUTFS
MOVEM B,DSTRNG
DIPCHECK
PUSHJ P,DALPHA
JRST RENOK
OUTSTR[ASCIZ/SORRY, NAME ALREADY IN USE!
/]
MOVE B,DSTRNG
JRST PUTFS
RENOK: HLRZ G,(P) ;GET POINTER TO OLD PREVIOUS
FETCH(H,G,NXTD) ;POINTER TO CURRETN DIP DEF
FETCH(TT,F,NXTD) ;GET NEW NEXT FROM NEW PREVIOUS
CAIE TT,(H) ;ARE WE ALREADY IN RIGHT PLACE?
CAIN F,(H) ;CHECK BOTH
JRST RENSAM ;YES
FETCH(T,H,NXTD) ;OLD NEXT
STORE(T,G,NXTD) ;LINK US OUT
STORE(TT,H,NXTD) ;STORE NEXT
STORE(H,F,NXTD) ;STORE US
RENSAM: FETCH(B,H,DNAM) ;OLD NAME
MOVE T,DSTRNG
STORE(T,H,DNAM) ;NEW NAME
JRST PUTFS
DIPPRN: PUSHJ P,DIPSET
POPJ P,
MOVE T,[OUTCHR TTT]
MOVEM T,PUTCHR
JRST ONEDIP
; MODIFY - Modify DIP definition
MODIFY: SKIPE RESIDENT
JRST NOMODR
SETZ W, ;ASSUME MODIFY ALL
SETZM PININC ;NO AUTO INC TO START WITH
PUSHJ P,TREADU ;READ STRING
POPJ P,
JRST NONULL
MOVEM B,DSTRNG ;SAVE HERE
MOVE T,[PUSHJ P,TTYIN]
MOVEM T,GETCHR
MOVE T,[OUTCHR TTT]
MOVEM T,PUTCHR
DIPCHECK
PUSHJ P,DALPHA
JRST MAKDIP
MOVE B,DSTRNG
PUSHJ P,PUTFS ;GIVE BACK STRING
MOVE H,G ;PUT POINTER TO DIP INTO H
GOTDIP:
TTYBT,< SETO T,
GETLIN T
TLO T,100
SETLIN T
MOVEI T,[000620,,ITS,<40>0 ;TAB,CR,LF,ALTMODE FOR ITS
0
0
NOITS,<1>,,0 ];ALTMODE FOR STANFORD
SETACT T ;SET AS SPECIAL ACTIVATION TABLE
PTJOBX [03] ;ECHOING OFF
>;TTYBT
NOTTYBT,<
INIT TTYCHN,700
'TTY '
0
JRST [ OUTSTR[ASCIZ/INIT FAILED ON TTY.
/]
EXIT 1,
JRST .-3]
SETOM SAVLIN
PUSHJ P,LINCLR
>;NOTTYBT
PUSHJ P,FSTLIN
MOVEI F,1 ;SET F TO 1 FOR TYPE 0
FETCH(G,H,DPIN) ;GET POINTER TO FIRST PIN
MODLOP: OUTCHR [11] ;INDENT
HLR W,W ;RESET MODE
XCT TAB1(W)
CAIA
JRST MODEND ;SKIPS IF DONE
OUTCHR [11]
XCT TAB2(W)
FETCH(T,G,DPBIT)
TRNE T,NULLD!GND
JRST MDCRLF
OUTCHR [11]
XCT TAB3(W)
OUTCHR [11]
XCT TAB4(W)
FETCH(T,G,DPBIT)
TRNE T,PWR
JRST MDCRLF
OUTCHR [11]
XCT TAB5(W)
OUTCHR [11]
XCT TAB6(W)
MDCRLF: OUTSTR[ASCIZ/
/]
JRST MODLOP
MODEND: OUTSTR [ASCIZ /
/]
PUSHJ P,DUPCHK ;CHECK FOR SECTION PIN DUPLICATION
JRST [ OUTSTR[ASCIZ/SECTION PIN # USED MORE THAN ONCE.
YOU MUST FIX IT BEFORE YOU CAN EXIT.
/]
JRST MODLOP]
TTYBT,< SETO T,
GETLIN T
TLZ T,100
SETLIN T
PTJOBX [04] ;ECHOING ON
>;TTYBT
NOTTYBT,<
SETSTS TTYCHN,0
RELEASE TTYCHN,
SETZM SAVLIN
>;NOTTYBT
PUSHJ P,SECCHK ;SECTIONS ALLOCATED SEQUENTIALLY?
PUSHJ P,SECFIX ;NO, MAYBE FIX
PUSHJ P,SCPCHK ;SECTION PIN #'S ALLOCATED SEQUENTIALLY?
PUSHJ P,SCPFIX ;NO, RE-ALLOCATE MAYBE
PUSHJ P,ANYSEC ;ANY SECTIONS ASSIGNED?
PUSHJ P,SECONE ;NO, ASSIGN ONE MAYBE
POPJ P,
NODPIN: OUTSTR [ASCIZ /NO SUCH PIN!
/]
MODERN: POP P,(P)
JRST MODER1
MODERP: POP P,(P)
MODERR: OUTSTR[ASCIZ/INPUT ERROR!
/]
MODER1: CLRBFI ;AVOID ANY EMBARASSMENT
NOTTYBT,< PUSHJ P,LINCLR >
SETZM PININC ;FLUSH AUTO-INC
JRST MODLOP
PUSHJ P,GETPIN
TAB1:
REPEAT 5,<PUSHJ P,GETPIN>
PUSHJ P,PNTTYP
TAB2:
PUSHJ P,GETTYP
REPEAT 4,<PUSHJ P,PNTTYP>
PUSHJ P,PNTLOD
TAB3:
REPEAT 2,<PUSHJ P,GETLOD>
REPEAT 3,<PUSHJ P,PNTLOD>
PUSHJ P,PNTUSE
TAB4:
REPEAT 3,<PUSHJ P,GETUSE>
REPEAT 2,<PUSHJ P,PNTUSE>
PUSHJ P,PNTPS
TAB5:
REPEAT 4,<PUSHJ P,GETPS>
PUSHJ P,PNTPS
PUSHJ P,PNTSCT
TAB6:
REPEAT 5,<PUSHJ P,GETSCT>
; MODIFY AND DIPIN CHECK ROUTINES
DUPCHK: FETCH(G,H,DPIN)
JUMPE G,CPOPJ1
DUPCK1: FETCH(F,G,DPNXT)
JUMPE F,CPOPJ1 ;ALL DONE?
FETCH(T,G,SCTP)
FETCH(TT,G,SCTB)
DUPCK2: FETCH(TTT,F,SCTP)
CAME TTT,T ;SAME SECTION PIN #?
JRST DUPCK3 ;NO
FETCH(TTT,F,SCTB) ;YES, GET SECTION BITS
TRNE TTT,(TT) ;ANY COMMON SECTIONS?
POPJ P, ;YES, DUPLICATE SECTION PIN.
DUPCK3: FETCH(F,F,DPNXT)
JUMPN F,DUPCK2
FETCH(G,G,DPNXT)
JRST DUPCK1
ANYSEC: TRZ FLAG ;NO IN OR OUT SEEN YET
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST ANYSC2
ANYSC1: FETCH(T,G,DPBIT)
TRNN T,INLD!OUTLD!TERM
JRST ANYSC2
TRO FLAG
FETCH(TT,G,SCTB)
JUMPN TT,CPOPJ1 ;HAS SOME SECTION BITS
ANYSC2: FETCH(G,G,DPNXT)
JUMPN G,ANYSC1
TRNN FLAG
AOS (P)
POPJ P,
SECONE: ASK[ASCIZ/NO SECTIONS ASSIGNED, SHALL I ASSIGN SECTION 0?/]
POPJ P,
POPJ P,
MOVEI T,1
MOVEI TT,400000 ;SECTION 0
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST SECON2
SECON1: FETCH(TTT,G,DPBIT)
TRNN TTT,INLD!OUTLD!TERM
JRST SECON2
STORE(T,G,SCTP)
STORE(TT,G,SCTB)
ADDI T,1 ;INCREMENT ONLY WHEN USED
SECON2: FETCH(G,G,DPNXT)
JUMPN G,SECON1
POPJ P,
SECCHK: MOVSI A,-1
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST SECCK2
SECCK1: FETCH(T,G,SCTB)
JUMPE T,SECCK2
TRO A,(T)
SECCK2: FETCH(G,G,DPNXT)
JUMPN G,SECCK1
IORI A,-1(A)
AOJE A,CPOPJ1
POPJ P,
;CALL AFTER SECCHK (LEAVES BITS IN A)
SECFIX:ASK[ASCIZ/SECTION NUMBERS NOT ALLOCATED SEQUENTIALLY FROM 0,
SHALL I RE-ALLOCATE THEM FOR YOU?/]
POPJ P,
POPJ P,
HRLOI A,-1(A)
SETCA A, ;MAKE WORD OF HOLES
SECFX1: JFFO A,.+1
TDZ A,SCTTAB(B) ;CLEAR A HOLE
LSH A,1 ;ACCOUNT FOR SHIFT WE ARE DOING
MOVE B,SCTTAB(B)
SUBI B,1 ;MAKE A MASK
HLRZ B,B
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST SECFX3
SECFX2: FETCH(TT,G,SCTB)
MOVE TTT,TT
ANDCM TT,B
AND TTT,B
LSH TTT,1
IOR TT,TTT
STORE(TT,G,SCTB)
SECFX3: FETCH(G,G,DPNXT)
JUMPN G,SECFX2
JUMPN A,SECFX1
POPJ P,
;CHECK THAT SECTION PIN #'S ARE ALLOCATED SEQUENTIALLY
SCPCHK: PUSHJ P,SCBGET ;GET MAX SECTION #
JUMPL A,CPOPJ1
SCPCK0: PUSHJ P,SCPGET ;GET MAX SCTP
SCPCK1: PUSHJ P,SCPCKF ;FIND THIS ONE
POPJ P, ;NONE, RETURN
SOJG T,SCPCK1 ;CHECK THEM ALL
SOJGE A,SCPCK0 ;AND ALL SECTIONS
JRST CPOPJ1
;HERE TO RE-ALLOCATE SECTION PIN #'S
SCPFIX: ASK[ASCIZ/SECTION PIN #'S NOT ASSIGNED SEQUENTIALLY FROM 1
SHALL I RE-ALLOCATE THEM FOR YOU?/]
POPJ P,
POPJ P,
PUSHJ P,SCBGET
SCPFX0: PUSHJ P,SCPGET ;GET MAX
SCPFX1: PUSHJ P,SCPCKF ;FIND THIS VALUE
PUSHJ P,SCPALC ;RE-ALLOCATE IF HOLE HERE!
SOJG T,SCPFX1
SOJGE A,SCPFX0
POPJ P,
SCPCKF: movn tt,a
movei ttt,400000
lsh ttt,(tt) ;make bit for section we are checking
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST SCPF2
SCPF1: fetch(tt,g,sctb) ;get this pins section bits
trnn ttt,(tt)
JRST SCPF2
FETCH(TT,G,SCTP)
CAMN TT,T ;FOUND ONE?
JRST CPOPJ1 ;YES, ONE SKIP
SCPF2: FETCH(G,G,DPNXT)
JUMPN G,SCPF1
POPJ P,
SCPALC: MOVEI G,RADDR(H,DPIN,DPNXT)
JRST SCPA2
SCPA1: FETCH(TT,G,SCTB)
JFFO TT,.+1
CAIE TTT,=18(A)
JRST SCPA2
FETCH(TT,G,SCTP)
CAML TT,T ;NEED RE-ALLOCATING?
SUBI TT,1 ;YES, REDUCE IT
STORE(TT,G,SCTP)
SCPA2: FETCH(G,G,DPNXT)
JUMPN G,SCPA1
POPJ P,
SCBGET: SETO A, ;INIT TO -1
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST SCBG2
SCBG1: FETCH(TT,G,SCTB)
HRLZ TT,TT
JFFO TT,.+2
JRST SCBG2
CAMLE TTT,A
MOVE A,TTT
SCBG2: FETCH(G,G,DPNXT)
JUMPN G,SCBG1
POPJ P,
SCPGET: SETZ T, ;COLLECT MAX SECTION PIN # HERE
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST SCPG2
SCPG1: FETCH(TT,G,SCTB)
JFFO TT,.+1
CAIE TTT,=18(A)
JRST SCPG2
FETCH(TT,G,SCTP) ;GET SECTION PIN #
CAMLE TT,T
MOVE T,TT
SCPG2: FETCH(G,G,DPNXT)
JUMPN G,SCPG1
POPJ P,
; MODIFY SUBRS
MODTAB: "T" ;START WITH TYPE
"L" ;START WITH LOADING
"U" ;START WITH USE
"P" ;START WITH INPUT SHARING
"S" ;START WITH SECTION SCHTICK
MODLEN__.-MODTAB
TTTICK: XCT GETCHR
JFCL
TTTCHK: CAIN TTT,11
JRST CPOPJ1
CAIN TTT,ALTMOD
JRST [ SETZM PININC
JRST .+2] ;SAME AS CR, EXCEPT FLUSHES PININC
CAIN TTT,12
TROA W,-1 ;INDICATE PRINT ONLY
POPJ P,
JRST CPOPJ1
GETPIN: SKIPN G,PININC
JRST GETPN1
MOVEI TTT,11 ;IF STILL INCREMENTING, MAKE IT LOOK LIKE <N><TAB>
MOVE G,PININC ;GET LAST PIN
FETCH(G,G,DPNXT) ;GET NEXT
MOVEM G,PININC ;MAKE IT LAST
JUMPN G,GOTPNM ;GO PROCESS UNLESS END
GETPN1: XCT GETCHR
JFCL
CAIL TTT,"A"+40
CAILE TTT,"Z"+40
CAIA
SUBI TTT,40 ;ACCEPT LOWER CASE
CAIN TTT,12
JRST CPOPJ1 ;SKIP TO INDICATE DONE
CAIN TTT,"D"
JRST DELPIN
CAIE TTT,"H"
CAIN TTT,"?"
JRST MODHLP
CAIE TTT,"A"
JRST GETPN2
PUSHJ P,RPNAMA
JRST MODERP
CAIE TTT,12
JRST MODERP
MOVEI TTT,11
JUMPN A,GETPN3
FETCH(G,H,DPIN) ;BLANK, START WITH FIRST
JUMPE G,[OUTSTR [ASCIZ /NO PINS!
/]
JRST MODERN]
JRST GETPN4
GETPN3: PUSHJ P,FNPNAM ;FIND PIN
JRST NODPIN
GETPN4: MOVEM G,PININC
JRST GOTPNM
GETPN2: MOVSI T,-MODLEN
GETPNM: CAME TTT,MODTAB(T)
AOBJN T,GETPNM
JUMPGE T,GETPN5
PUTBYT @TTT
XCT GETCHR
JFCL
CAIE TTT,12
JRST MODERP
HRR W,T
HRL W,T
OUTSTR[ASCIZ/
/]
JRST GETPIN
GETPN5: PUSHJ P,TRPNAM ;READ PIN NAME
JRST MODERP
PUSHJ P,TTTCHK
JRST MODERP
PUSHJ P,FNPNAM ;FIND PIN
JRST MAKPIN ;NOT FOUND, MAKE IT
GOTPNM: FETCH(F,G,DPNM) ;GET PIN NAME IN F
CAIN TTT,12 ;PRINTING LINE ONLY?
JRST PNTPIN ;JUST ECHO PIN#
PUSHJ P,ONELN
OUTCHR [11]
JRST PNTPIN ;NOW ECHO PIN#
;DELETE PIN
DELPIN: PUSHJ P,RPNAM ;READ NAME OF PIN TO DELETE
JRST MODERP
CAIE TTT,12
JRST MODERP
PUSHJ P,FNPNAM ;FIND PIN
JRST NODPIN ;ERROR IF NONE
PUTBYT "D" ;NOW ECHO COMMAND
PUSHJ P,PNTPIN
OUTSTR [ASCIZ /
/]
FETCH(T,G,DPNXT) ;GET HIS NEXT POINTER
STORE(T,F,DPNXT) ;LINK HIM OUT
FSTRET(G,DPHEAD)
FETCH(T,H,DPNN)
SUBI T,1 ;DECREASE PIN IN DIP
STORE(T,H,DPNN)
JRST GETPIN ;AND GET PIN AGAIN
MAKPIN: CAIE TTT,11 ;ONLY TAB CAN CREATE PIN
JRST MODERP
GETFS(T,DPHEAD) ;GET BLOCK FOR NEW PIN
BCLEAR(TT,T,DPHEAD)
STORE(G,T,DPNXT) ;LINK INTO PIN LIST
STORE(T,F,DPNXT)
MOVE G,T
MOVEI TTT,NULLD ;INITIALIZE TO NULL PIN
STORE(TTT,G,DPBIT)
STORE(A,G,DPNM)
FETCH(T,H,DPNN)
ADDI T,1
STORE(T,H,DPNN) ;UPDATE NUMBER OF PINS
JRST GOTPNM
FNPNAM: MOVEI G,RADDR(H,DPIN,DPNXT)
JRST FNPNM2
FNPNM1: FETCH(T,G,DPNM)
CAMN T,A
JRST CPOPJ1
CAML T,A
POPJ P,
FNPNM2: MOVE F,G
FETCH(G,G,DPNXT)
JUMPN G,FNPNM1
POPJ P,
GETTYP: PUSHJ P,TTTICK
CAIA
JRST PNTTYP
MOVE T,DEFECL ;ASSUME DEFAULT
CAIN TTT,"E" ;ECL?
JRST [ MOVEI T,ECL
JRST ISECL]
CAIE TTT,"T"
JRST ISNTET
MOVEI T,TTL
ISECL: XCT GETCHR ;GET NEXT CHAR
JFCL
ISNTET: MOVEM T,ECLBIT ;SAVE HERE FOR ORING
PUSHJ P,GETWRT
JFCL
PUSHJ P,TTTCHK
JRST MODERP
JUMPE A,PNTTYP
MOVSI T,-TYPLEN
CAMN A,TYPTAB(T)
JRST GETTY1
AOBJN T,.-2
JRST MODERP
GETTY1: MOVE T,TYPBIT(T)
TRNN T,GND!NULLD
IOR T,ECLBIT ;TURN ON ECL OR TTL OR NOTHING
STORE(T,G,DPBIT)
TRNE T,GND!NULLD
CLEAR(G,DUSE)
TRNE T,OPENC!GND!NULLD
CLEAR(G,LHI) ;CLEAR HI LOADING
TRNE T,PULL!GND!NULLD
CLEAR(G,LLOW)
TRNN T,INLD!OUTLD!TERM ;ONLY THESE SHOULD HAVE SECTION STUFF
CLEAR(G,SCTB)
TRNN T,INLD!OUTLD!TERM
CLEAR(G,SCTP)
TRNN T,INLD!OUTLD!TERM
CLEAR(G,PSWP)
FETCH(TT,G,DUSE)
TLC TT,'CLK'
TLNE TT,-1
JRST PNTTYP
TRO T,CLK
STORE(T,G,DPBIT)
JRST PNTTYP
TYPTAB: 'I '
'IS '
'IP '
'ISP '
'IF '
'IFS '
'IFP '
'IFSP '
'O '
'OT '
'OC '
'OP '
'OF '
'OTF '
'OCF '
'OPF '
'PWR '
'P '
'V '
'GND '
'G '
'Z '
'N '
'NC '
TYPLEN__.-TYPTAB
TYPBIT: INLD!DRVREQ
INLD!SHARE!DRVREQ
INLD
INLD!SHARE
INLD!FFIN!DRVREQ
INLD!FFIN!SHARE!DRVREQ
INLD!FFIN
INLD!FFIN!SHARE
OUTLD
OUTLD!TRI
OUTLD!OPENC
OUTLD!PULL
OUTLD!FFOUT
OUTLD!FFOUT!TRI
OUTLD!FFOUT!OPENC
OUTLD!FFOUT!PULL
PWR
PWR
PWR
GND
GND
TERM
NULLD
NULLD
GETLOD: FETCH(T,G,DPBIT)
TRNE T,PULL ;PULLUPS HAVE NO LOW LOAD
JRST [ PUTBYT 11
JRST GETLD3]
PUSHJ P,TTTICK
CAIA
JRST GETLD1
PUSHJ P,SLDECIN
JFCL
MOVM T,A
CAIG T,377777
PUSHJ P,TTTCHK
JRST MODERP
STORE(A,G,LLOW)
GETLD1: FETCH(T,G,LLOW)
PUSH P,TTT
PUSHJ P,LDOUT
FETCH(T,G,DPBIT)
TRNE T,PWR
PUTBYT "V"
PUTBYT 11
POP P,TTT
CAIE TTT,11
JRST GETLD2
TRNE T,OPENC ;OPEN COLLECTOR?
POPJ P,
GETLD3: PUSHJ P,TTTICK
CAIA
JRST GETLD2
PUSHJ P,SLDECIN
JFCL
MOVM T,A
CAIG T,377777
PUSHJ P,TTTCHK
JRST MODERP
STORE(A,G,LHI)
GETLD2: FETCH(T,G,DPBIT)
TRNE T,OPENC
POPJ P,
FETCH(T,G,LHI)
PUSHJ P,LDOUT
FETCH(T,G,DPBIT)
TRNE T,PWR
PUTSTR[ASCIZ/MA/]
POPJ P,
GETUSE: PUSHJ P,TTTICK
CAIA
JRST PNTUSE
PUSHJ P,GETWRT
JFCL
PUSHJ P,TTTCHK
JRST MODERP
STORE(A,G,DUSE)
FETCH(T,G,DPBIT)
TLC A,'CLK'
TLNE A,-1
TRZA T,CLK ;CANt BE CLK
TRO T,CLK ;IS CLK
STORE(T,G,DPBIT)
JRST PNTUSE
GETPS: PUSHJ P,TTTICK
CAIA
JRST PNTPS
PUSHJ P,TDECIN
JFCL
PUSHJ P,TTTCHK
JRST MODERP
STORE(A,G,PSWP)
JRST PNTPS
GETSCT: PUSHJ P,TTTICK
CAIA
JRST PNTSCT
PUSHJ P,TDECIN
JFCL
CAIE TTT,"/" ;THIS MUST BE SECT PIN #
JRST GETSC2
JUMPE A,MODERP
CAILE A,777777 ;THIS IS A REASONABLE UPPER BOUND
JRST MODERP
HRRZM A,SECTMP ;TMP CELL FOR SECT STUFF
GETSC1: PUSHJ P,DECIN
JFCL
CAILE A,=17 ;MAX # ALLOWED
JRST MODERP
MOVN A,A
MOVSI T,400000
LSH T,(A)
TDNE T,SECTMP ;ALREADY USED?
JRST MODERP
IORM T,SECTMP
CAIN TTT,","
JRST GETSC1
GETSC3: PUSHJ P,TTTCHK
JRST MODERP
MOVE T,SECTMP
STORE(T,G,SCTP)
HLRZ T,SECTMP
STORE(T,G,SCTB)
JRST PNTSCT
GETSC2: JUMPN A,MODERP
SETZM SECTMP
JRST GETSC3
MODHLP: XCT GETCHR
JFCL
CAIE TTT,12
JRST MODERP
OUTSTR [ASCIZ \HELP:
? TYPE THIS LIST
H TYPE THIS LIST
A<N> AUTO INCREMENT THROUGH PINS STARTING WITH <N>.
IF <N> IS LEFT OUT, STARTS AT FIRST PIN.
TYPE <ALT> TO EXIT AUTO INCREMENTING.
D<N> DELETE PIN <N>.
<N><CR> PRINT LINE FOR PIN <N>.
<N><TAB> PRINT LINE FOR PIN <N>, THEN START ACCEPTING NEW INFO
FOR THIS PIN STARTING AS CURRENTLY SELECTED COLUMN.
T START AT TYPE COLUMN
L START AT LOADING COLUMN
U START AT USE COLUMN
P START AT INPUT/OUTPUT SHARE NUMBER COLUMN
S START AT SECTION COLUMN
<CRLF> EXIT MODIFY MODE
\]
JRST GETPIN
; PRINT SUBRS
FSTLIN: FETCH(A,H,DNAM)
PUSHJ P,STROUT
PUTBYT 11
FETCH(T,H,DPNN)
PUSHJ P,DECOUT
PUTSTR[ASCIZ/ PINS DEFINED, /]
FETCH(T,H,DPAK)
PUTSTR @PACKNM(T)
PUTSTR [ASCIZ / Package
PIN # TYPE LOW HI USE PS SECTION(S)
/]
POPJ P,
PNTPIN: FETCH(T,G,DPNM)
JRST PUTDEC
PNTTYP: FETCH(A,G,DPBIT)
PNTYPE: TRNE A,ECL
PUTBYT "E"
TRNE A,TTL
PUTBYT "T"
TRNE A,OUTLD
PUTBYT "O"
TRNE A,FFOUT
PUTBYT "F"
TRNE A,TRI
PUTBYT "T"
TRNE A,OPENC
PUTBYT "C"
TRNE A,PULL
PUTBYT "P"
TRNE A,INLD
PUTBYT "I"
TRNE A,FFIN
PUTBYT "F"
TRNE A,SHARE
PUTBYT "S"
TRNN A,DRVREQ
TRNN A,INLD
CAIA
PUTBYT "P"
TRNE A,TERM
PUTBYT "Z"
TRNE A,GND
PUTBYT GNDCHR
TRNE A,PWR
PUTBYT PWRCHR
TRNE A,NULLD
PUTBYT "N"
POPJ P,
PNTLOD: FETCH(T,G,LLOW)
FETCH(TT,G,DPBIT)
TRNN TT,PULL
PUSHJ P,LDOUT
FETCH(T,G,DPBIT)
TRNE T,PWR
PUTBYT "V"
PUTBYT 11
TRNE T,OPENC
POPJ P,
FETCH(T,G,LHI)
PUSHJ P,LDOUT
FETCH(T,G,DPBIT)
TRNE T,PWR
PUTSTR[ASCIZ/MA/]
POPJ P,
PNTUSE: FETCH(A,G,DUSE)
PUTSIX A
POPJ P,
PNTPS: FETCH(T,G,PSWP)
JUMPN T,DECOUT
POPJ P,
PNTSCT: FETCH(T,G,SCTB)
JUMPE T,CPOPJ ;ANY SECTION STUFF AT ALL?
FETCH(T,G,SCTP)
PUSHJ P,DECOUT
PUTBYT "/"
FETCH(A,G,SCTB)
MOVS A,A
CAIA
PNTSC1: PUTBYT ","
MOVE T,A
JFFO T,.+1
TDZ A,SCTTAB(TT) ;CLEAR BIT
MOVE T,TT
PUSHJ P,DECOUT ;PRINT #
JUMPN A,PNTSC1
POPJ P,
ONELIN: PUTBYT 11
ONELN: PUSHJ P,PNTPIN
PUTBYT 11
PUSHJ P,PNTTYP
FETCH(T,G,DPBIT)
TRNE T,GND!NULLD
JRST ONELN1
PUTBYT 11
PUSHJ P,PNTLOD
PUTBYT 11
PUSHJ P,PNTUSE
FETCH(T,G,DPBIT)
TRNE T,PWR
JRST ONELN1
PUTBYT 11
PUSHJ P,PNTPS
PUTBYT 11
PUSHJ P,PNTSCT
ONELN1: PUTSTR[ASCIZ/
/]
POPJ P,
ONEDIP: PUSHJ P,FSTLIN
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST ONEDP2
ONEDP1: PUSHJ P,ONELIN
ONEDP2: FETCH(G,G,DPNXT)
JUMPN G,ONEDP1
CRLF
POPJ P,
SCTTAB:
FOR I_0,=17
< <400000,,0>-I
>
; COPY DIP DEF
;MAKE NEW DIP FROM OLD
DIPCOP: SKIPE RESIDENT
JRST NOMODR
PUSHJ P,DIPSET
POPJ P,
MOVE W,H
OUTSTR[ASCIZ/NEW DIP NAME?/]
PUSHJ P,TREADU
POPJ P,
JRST ERRET
PUSHJ P,TEST7
JRST PUTFS
MOVEM B,DSTRNG
DIPCHECK
PUSHJ P,DALPHA
TDZA H,H ;NOTHING TO GIVE BACK LATER
JRST [ MOVE B,DSTRNG
ASK[ASCIZ/ALREADY EXISTS, REPLACE?/]
JRST PUTFS
JRST PUTFS
FETCH(H,F,NXTD)
FETCH(G,H,NXTD)
JRST GTFACT]
GTFACT: OUTSTR[ASCIZ/LOADING CONVERSION FACTOR?/]
MOVEI T,1
MOVEM T,FACTR1 ;INITIALIZE FACTORS
MOVEM T,FACTR2
MOVE T,[PUSHJ P,TTYIN]
MOVEM T,GETCHR
PUSHJ P,DECIN ;READ FIRST FACTOR
JFCL
CAIN TTT,12
JUMPE A,USEONE ;CRLF IS 1/1
MOVEM A,FACTR1
CAIE TTT,"/"
JRST USEONE
PUSHJ P,DECIN
JFCL
JUMPE A,FACTER
MOVEM A,FACTR2
USEONE: CAIE TTT,12
JRST FACTER
GETFS(T,DHEAD)
BCLEAR(TT,T,DHEAD)
MOVE TT,DSTRNG
STORE(TT,T,DNAM)
STORE(T,F,NXTD)
STORE(G,T,NXTD)
FETCH(TTT,W,DPNN)
STORE(TTT,T,DPNN)
FETCH(TTT,W,DPAK)
STORE(TTT,T,DPAK)
MOVEI T,RADDR(T,DPIN,DPNXT)
MOVEI W,RADDR(W,DPIN,DPNXT)
JRST COPLP1
COPLOP: GETFS (TT,DPHEAD)
STORE(TT,T,DPNXT)
MOVE T,TT
FETCH(TTT,W,DPNM)
STORE(TTT,T,DPNM)
FETCH(TTT,W,DUSE)
STORE(TTT,T,DUSE)
FETCH(TTT,W,PSWP)
STORE(TTT,T,PSWP)
FETCH(TTT,W,SCTB)
STORE(TTT,T,SCTB)
FETCH(TTT,W,SCTP)
STORE(TTT,T,SCTP)
FETCH(TTT,W,DPBIT)
STORE(TTT,T,DPBIT)
FETCH(A,W,LHI)
TRNN TTT,PWR
PUSHJ P,FACTOR ;SCALE HI
STORE(A,T,LHI)
FETCH(A,W,LLOW)
TRNN TTT,PWR
PUSHJ P,FACTOR ;SCALE LOW
STORE(A,T,LLOW)
COPLP1: FETCH(W,W,DPNXT)
JUMPN W,COPLOP
CLEAR(T,DPNXT) ;CLEAR LAST LINK
JUMPN H,RELH2 ;ANYTHING TO GIVE BACK?
POPJ P,
FACTOR: IMUL A,FACTR1
IDIV A,FACTR2
ASH B,1
CAML B,FACTR2
ADDI A,1 ;ROUND UP
POPJ P,
FACTER: OUTSTR[ASCIZ/INPUT ERROR!
/]
CLRBFI
JRST GTFACT
DIPDEL: SKIPE RESIDENT
JRST NOMODR
PUSHJ P,DIPSET
POPJ P,
RELDIP: FETCH(H,F,NXTD)
FETCH(G,H,NXTD) ;GET HIS NEXT POINTER
STORE(G,F,NXTD) ;LINK HIM OUT
JRST RELH2 ;AND GIVE HIM BACK
MAKDIP: PUSHJ P,TEST7
JRST TOLONG
ASK [ASCIZ /DIP DOES NOT EXIST, CREATE? /]
JRST TOLONG
JRST TOLONG
GETFS (H,DHEAD)
BCLEAR(TT,H,DHEAD)
MOVE TT,DSTRNG
STORE(TT,H,DNAM)
STORE(H,F,NXTD)
STORE(G,H,NXTD)
PUSHJ P,GETPAK
JRST TOLONG
JRST GOTDIP
STORE(A,H,DPAK)
JRST GOTDIP
TOLONG: MOVE B,DSTRNG
JRST PUTFS
;GETPAK - READ PACKAGE NAME
;RETURNS
; - FAILS
; - LET HIM OUT
; -WIN
;A = PACKAGE CODE
GETPAK: OUTSTR [ASCIZ /PACKAGE TYPE (# OF PINS)? /]
PUSHJ P,TREADU
POPJ P,
JRST CPOPJ1
MOVE T,B
PUSHJ P,MATPAK ;DO WE KNOW ABOUT THIS PACKAGE ?
JRST [ PUSHJ P,PUTFS
OUTSTR [ASCIZ /Unknown package name
/]
PUSHJ P,IERR
POPJ P,]
PUSHJ P,PUTFS
JRST CPOPJ2
SETPAK: SKIPE RESIDENT
JRST NOMODR
PUSHJ P,DIPSET
POPJ P,
PUSHJ P,GETPAK
POPJ P,
POPJ P,
STORE(A,H,DPAK)
POPJ P,
SUBTTL DIP PROPERTY ROUTINES
;VALFIX - FIX VALUE STRING TO BE CONONICAL FORM
; OHM, M - MEG, m - MILLI,  - UMICRO
VALFIX: PUSH P,A
PUSH P,B
PUSH P,T
HRRZ A,T
ADD A,[POINT 7,1]
MOVE B,[POINT 7,STRTAB]
VALFX1: PUSHJ P,VALGET
JRST VALFX2
CAIN TTT,""
JRST VALOHM
CAIN TTT,"M"
JRST VALMEG
CAIN TTT,"M"+40
JRST VALMIL
CAIN TTT,""
MOVEI TTT,"U"
VALFX3: PUSHJ P,VPUTIT
JRST VALFX1
VALOHM: MOVEI T,[ASCIZ/OHMS/]
VALSTR: MOVEI TTT,40
LDB TT,B
CAIE TT,40
PUSHJ P,VPUTIT
HRLI T,(<POINT 7,0>)
VALST1: ILDB TTT,T
JUMPE TTT,VALFX1
PUSHJ P,VPUTIT
JRST VALST1
VALMEG: PUSHJ P,VALCHK
JRST VALFX3
MOVEI T,[ASCIZ/MEG/]
JRST VALSTR
VALMIL: PUSHJ P,VALCHK
JRST VALFX3
MOVEI T,[ASCIZ/MILLI/]
JRST VALSTR
VALCHK: LDB TT,B
CAIL TT,"A"
CAILE TT,"Z"
SKIPN TT ;NOT PRECEEDED BY LETTER, NULL?
POPJ P, ;LETTER OR BEGINNING OF STRING
PUSH P,A
PUSH P,TTT
PUSHJ P,VALGET
SETZ TTT,
CAIL TTT,"A"
CAILE TTT,"Z"
JRST [ MOVE TT,TTT
POP P,TTT
POP P,A
CAIL TT,"0" ;IF FOLLOWED BY
CAILE TT,"9" ;A DIGIT, THEN NO
AOS (P)
POPJ P,]
PUSHJ P,VALGET
SETZ TTT,
MOVE TT,TTT
POP P,TTT
POP P,A
CAIL TT,"A"
CAILE TT,"Z"
AOS (P)
POPJ P,
VALGET: TLNN A,760000
JRST [ TRNE A,-1
HRR A,-1(A)
TRNN A,-1
POPJ P,
JRST .+1]
ILDB TTT,A
JUMPE TTT,VALGET
CAIN TTT,""
MOVEI TTT,40
CAIL TTT,"A"+40
CAILE TTT,"Z"+40
JRST CPOPJ1
SUBI TTT,40
JRST CPOPJ1
VALFX2: SETZ TTT,
PUSHJ P,VPUTIT
TLNE B,760000
JRST VALFX2
POP P,B ;GET BACK ORIGINAL STRING
PUSHJ P,PUTFS
POP P,B
POP P,A
MOVEI TT,STRTAB
JRST ASCCOP
VPUTIT: CAMN B,[POINT 7,STRTAB+MXSTLN-1,34]
JRST [ OUTSTR[ASCIZ/EXPANDED STRING TOO LONG, TRUNCATED!
/]
POPJ P,]
CAIL TTT,"a"
CAILE TTT,"z"
CAIA
SUBI TTT,40 ;CONVERT LOWER CASE TO UPPER CASE
IDPB TTT,B
POPJ P,
VALMAT: ADD T,[POINT 7,1]
ADD TT,[POINT 7,1]
PUSH P,A
VALMT1: PUSHJ P,VGETT
JRST [ PUSHJ P,VGETTT
JRST VALMTW
JRST VALMTE]
PUSHJ P,VGETTT
JRST VALMTE
CAMN TTT,A
JRST VALMT1
VALMTE: POP P,A
POPJ P,
VALMTW: POP P,A
JRST CPOPJ1
VGETT: TLNN T,760000
JRST [ HRR T,-1(T)
TRNN T,-1
POPJ P,
JRST .+1]
ILDB TTT,T
JUMPE TTT,VGETT
CAIN TTT,40
JRST VGETT
JRST CPOPJ1
VGETTT: TLNN TT,760000
JRST [ HRR TT,-1(TT)
TRNN TT,-1
POPJ P,
JRST .+1]
ILDB A,TT
JUMPE A,VGETTT
CAIN A,40
JRST VGETTT
JRST CPOPJ1
;Setup PARTLIST, entries must be sorted
; also clears PNUSED bits
THREAD: SKIPN H,DIPLST
POPJ P,
THRD1: FETCH(G,H,PRPV)
JUMPE G,THRD2
THRD3: FETCH(T,G,PRBT)
TRZ T,PNUSED ;CLEAR THIS BIT EVERYWHERE
STORE(T,G,PRBT)
TRNE T,PARTNM
PUSHJ P,THRDPN ;SORT IN PART NUMBER
FETCH(T,G,PRNP)
JUMPN T,[MOVE G,T
JRST THRD3]
THRD4: FETCH(T,G,PRNV)
JUMPN T,[MOVE G,T
JRST THRD3]
FETCH(G,G,PRPP)
JUMPN G,THRD4
THRD2: FETCH(H,H,NXTD)
JUMPN H,THRD1
POPJ P,
;THRDPN - Enter part number property in G onto PARTLIST, in alphasorted order.
THRDPN: PUSH P,F
PUSH P,E
MOVEI F,PARTLIST-ADDR(0,NXPL)
JRST THRDP1
THRDP2: FETCH(TT,F,PLPT) ;GET PART NUMBER BLOCK POINTER
FETCH(TT,TT,PRVS) ;GET VALUE STRING AT LIST
FETCH(T,G,PRVS) ;GET OUT VALUE STRING (G)
PUSHJ P,DSORT ;COMPARE
JRST THRDP3 ; New Property value is less, insert here
JRST THRDP1 ; still larger, scan further
FETCH(T,F,PLBT) ; exactly equal
TRO T,PL2ND ;MARK OLD AS SECOND OCCURANCE OF PART NUMBER
STORE(T,F,PLBT)
THRDP3: GETFS(T,PLBK) ;INSERT NEW ENTRY ON PARTS LIST
BCLEAR(TT,T,PLBK)
STORE(F,T,NXPL)
STORE(T,E,NXPL) ; (E)  (T.NEW)  (F)
STORE(G,T,PLPT)
POP P,E
POP P,F
POPJ P,
THRDP1: MOVE E,F ;SCAN PARTLIST THREAD BLOCKS
FETCH(F,F,NXPL)
JUMPN F,THRDP2
JRST THRDP3 ;END OF PARTLIST, PUT ONTO END
;UNTHRD - Remove part number in T from PARTLIST
UNTHRD: FETCH(TT,T,PRBT)
TRNN TT,PARTNM
POPJ P,
PUSH P,T
MOVEI TT,PARTLIST-ADDR(0,NXPL)
JRST UTHRD1
UTHRD2: FETCH(TTT,TT,PLPT)
CAMN TTT,(P)
JRST UTHRD3
UTHRD1: MOVE T,TT
FETCH(TT,TT,NXPL)
JUMPN TT,UTHRD2
POP P,T
OUTSTR[ASCIZ/PROGRAM ERROR - PART NUMBER BLOCK NOT FOUND AT UNTHRD.
/]
POPJ P,
UTHRD3: FETCH(TTT,TT,NXPL)
STORE(TTT,T,NXPL)
FETCH(TTT,TT,PLBT)
;NOTE!!! HERE WE LOSE ANY FREE STORAGE POINTED TO BY MDCN
FSTRET(TT,PLBK)
TRNE TTT,PL2ND ;ARE WE A SECOND?
JRST UTHRD4 ;YES, DON'T CHANGE NEXT
FETCH(TT,T,NXPL) ;next block can't be second, unless we were also.
FETCH(TTT,TT,PLBT)
TRZ TTT,PL2ND ;THIS IS NO LONGER A SECOND
STORE(TTT,TT,PLBT)
UTHRD4: POP P,T
POPJ P,
; ENTER DIP PROPERTY MODE
DIPPRP: SKIPE RESIDENT
JRST NOMODR
PUSHJ P,DIPSET
POPJ P,
MOVEM H,CURDIP
MOVEI T,[PUSHJ P,PRPLOP]
MOVEM T,DISPWD
MOVEI T,[ASCIZ/**/]
MOVEM T,PROMPT
OUTSTR[ASCIZ/DIP PROPERTY SUB-MODE!
/]
POPJ P,
PRPLOP: MOVE H,CURDIP ;SET THIS UP FOR ROUTINES
CAIN A,12
JRST [ OUTCHR[15]
POPJ P,]
CAIN A,"E"
JRST DIPMOD ;RETURN TO DIP MODE
CAIN A,"I"
JRST PRPADD
CAIN A,"R"
JRST PRPDEL
CAIN A,"A"
JRST PRPNEW
CAIN A,"D"
JRST PRPFLU
CAIN A,"C"
JRST PRPCHG
CAIN A,"P"
JRST PRPPNT
JRST CPOPJ1 ;ERROR RETURN
;Print out properties
PRPPNT: PUSHJ P,TREAD
POPJ P, ;QUIT ON ALTMODE
CAIA
JRST [ PUSHJ P,PUTFS
JRST ERRET] ;NO ARGUMENT
SETZM LCOUNT ;INITIALIZE LINE COUNT
MOVE T,[PUSHJ P,TTYOUT]
MOVEM T,PUTCHR
PRPPN0: FETCH(G,H,PRPN)
JUMPE G,[PUTSTR[ASCIZ/NO PROPERTIES.
/]
POPJ P,]
SETZM DEPTH
PRPPN1: FETCH(A,G,PRNS)
PUSHJ P,STROUT
FETCH(G,G,PRNN)
JUMPE G,PRPPN2
AOS A,DEPTH
IMULI A,=16
CAMG A,LCOUNT
CRLF
PUSHJ P,FILL
JRST PRPPN1
PRPPN2: CRLF
CRLF ;MAKE A BLANK LINE
FETCH(G,H,PRPV)
JUMPE G,[PUTSTR[ASCIZ/NO VALUES.
/]
POPJ P,]
SETZM DEPTH
PRPPN3: MOVEI A,40
FETCH(T,G,PRBT)
TRNE T,DEFPRP
MOVEI A,"*"
PUTBYT (A)
TRNE T,NULVAL
PUTBYT "!"
FETCH(A,G,PRVS)
PUSHJ P,STROUT
FETCH(T,G,PRNP)
JUMPN T,[AOS DEPTH
JRST PRPPN4]
PRPPN5: FETCH(T,G,PRNV)
JUMPN T,PRPPN4
FETCH(G,G,PRPP)
JUMPE G,[CRLF
POPJ P,]
SOS DEPTH
JRST PRPPN5
PRPPN4: MOVE G,T
MOVE A,DEPTH
IMULI A,=16
CAMG A,LCOUNT
CRLF
JUMPE A,PRPPN3
PUSHJ P,FILL
JRST PRPPN3
;Change properties
PRPCHG: OUTSTR[ASCIZ/NOT IMPLEMENTED YET.
/]
POPJ P,
;Add new property
PRPNEW: MOVE TT,[PUSHJ P,TTYOUT]
MOVEM TT,PUTCHR
MOVE TT,[PUSHJ P,TTYIN]
MOVEM TT,GETCHR
SETZM PRPLST
MOVEI F,PRPLST-ADDR(0,PRNP)
TRZ FLAG
FETCH(G,H,PRPN)
JUMPN G,PRPNW1
GETFS(G,PNBK) ;NOW MAKE NAME BLOCK FOR "PART NUMBER"
BCLEAR(T,G,PNBK)
MOVEI TT,[ASCIZ/PART NUMBER/]
PUSHJ P,ASCCOP
STORE(T,G,PRNS)
STORE(G,H,PRPN) ;LINK IN
PRPNW0: PUSHJ P,RPRVAL
JRST PRPADE ;QUIT
CAIA ;NULL LINE
JRST PRPNW4 ;NOT NULL LINE
CAIE TTT,12
JRST PRPNW0
TRO FLAG ;NO ARG, PROMPT FOR VALUES
PRPNW1: TRNN FLAG
JRST PRPNW2
FETCH(A,G,PRNS)
PUSHJ P,STROUT
OUTSTR[ASCIZ/: /]
PRPNW2: PUSHJ P,RPRVAL
JRST PRPNWA ;QUIT
JRST [ CAIE TTT,12 ;NULL
JRST PRPNW2
TRON FLAG
JRST PRPNW1
JRST PRPNWA] ;LET HIM OUT LIKE ALTMODE
PRPNW4: CAIN TTT,12
TRO FLAG
CAIN TTT,11
TRZ FLAG
GETFS(A,PVBK)
BCLEAR(T,A,PVBK)
STORE(G,A,PRNB)
STORE(A,F,PRNP)
STORE(B,A,PRVS)
STORE(TT,A,PRBT) ;STORE BITS FROM RPRVAL
STORE(F,A,PRPP)
MOVE F,A
FETCH(G,G,PRNN)
JUMPN G,PRPNW1
TRNN FLAG ;DID WE END WITH LF?
JRST PRPNWB ;NO, TOO MANY VALUES
PRPNW5: FETCH(T,F,PRBT)
TRO T,DEFPRP!PARTNM
STORE(T,F,PRBT) ;MAKE SURE LAST BLOCK IS PART NUMBER AND DEFAULT
MOVE G,F
PUSHJ P,THRDPN ;THREAD NEW PART NUMBER
MOVEI G,RADDR(H,PRPV,PRNV)
SETZ D, ;CLEAR SAVED PRPP
MOVE E,PRPLST
JRST PRPNW7
PRPNW8: FETCH(T,G,PRBT)
TRNE T,PARTNM ;IF THIS IS PART NUMBER,
JRST PRPNP2 ;THEN WE ARE CHANGING PART NUMBER, NOT ADDING NEW ONE
FETCH(T,E,PRVS)
FETCH(TT,G,PRVS)
PUSHJ P,DSORT
JRST PRPNP1
JRST PRPNW7
MOVE A,E
FETCH(E,E,PRNP)
FSTRET(A,PVBK)
JUMPE E,[OUTSTR[ASCIZ/RAN OUT OF NEW VALUES BEFORE GETTING TO PART NUMBER!
/]
JRST ERRET]
MOVE D,G ;SAVE FOR PRPP
MOVEI G,RADDR(G,PRNP,PRNV)
PRPNW7: MOVE F,G
FETCH(G,G,PRNV)
JUMPN G,PRPNW8
PRPNP1: STORE(G,E,PRNV)
STORE(D,E,PRPP)
STORE(E,F,PRNV)
POPJ P,
PRPNP2: FETCH(B,G,PRVS)
PUSHJ P,PUTFS
FETCH(B,E,PRVS)
STORE(B,G,PRVS)
FETCH(B,E,PRBT)
STORE(B,G,PRBT)
FSTRET(E) ;THERE THEORETICALLY SHOULDN'T BE ANY BELOW HERE
POPJ P,
PRPNWB: OUTSTR[ASCIZ/MORE VALUES THAN PROPERTIES.
/]
PUSHJ P,IERR
PRPNWA: SKIPN G,PRPLST
JRST PRPADE
PRPNWC: MOVE A,G
FETCH(G,G,PRNP)
FSTRET(A,PVBK)
JUMPN G,PRPNWC
JRST PRPADE
;Read property value
RPRVAL: SETZ TT,
RPRVL1: XCT GETCHR
POPJ P, ;EOF
CAIN TTT,"*" ;STAR MEANS
JRST [ TRO TT,DEFPRP ;DEFAULT
JRST RPRVL1]
CAIN TTT,"!" ;EXCLAIM MEANS
JRST [ TRO TT,NULVAL ;NULL VALUE
JRST RPRVL1]
HRLM TT,(P)
CAIN TTT,40 ;SPACE IS KLUDGE TO ALLOW "*" OR "!"
JRST [ XCT GETCHR
POPJ P,
JRST .+1]
PUSHJ P,TISTRU
POPJ P,
POPJ P,
JRST CPOPJ1
HLRZ TT,(P)
JRST CPOPJ2
;Flush properties
PRPFLU: PUSHJ P,TREADU
POPJ P,
JRST [ OUTSTR[ASCIZ/PART NUMBER?/]
PUSHJ P,TREADU
POPJ P,
POPJ P,
JRST .+1]
MOVEM B,STRING
FETCH(G,H,PRPV)
JUMPE G,PRPFLA
SETZ F, ;NO PARTIAL MATCH YET
TRZ FLAG ;NOT AMBIGUOUS YET
PRPFL1: FETCH(T,G,PRBT)
TRNN T,PARTNM
JRST PRPFL2
HRRZ T,STRING
FETCH(TT,G,PRVS)
PUSHJ P,TXTPAR
JRST PRPFL3
JRST PRPFL3
JRST PRPFL4
MOVE F,G
JRST PRPFL6
PRPFL4: SKIPE F
TRO FLAG ;AMBIGUOUS
MOVE F,G
JRST PRPFL3
PRPFL2: FETCH(T,G,PRNP)
JUMPN T,[MOVE G,T
JRST PRPFL1]
PRPFL5: FETCH(T,G,PRNV)
JUMPN T,[MOVE G,T
JRST PRPFL1]
PRPFL3: FETCH(G,G,PRPP)
JUMPN G,PRPFL5
TRNE FLAG
JRST PRPFLB
JUMPN F,PRPFL6
PRPFLA: OUTSTR[ASCIZ/NO SUCH PART NUMBER.
/]
JRST PRPADA
PRPFLB: OUTSTR[ASCIZ/AMBIGUOUS PART NUMBER.
/]
JRST PRPADA
PRPFL6: FETCH(A,F,PRPP)
JUMPE A,[FETCH(B,H,PRPV)
JRST PRPFL7]
FETCH(B,A,PRNP)
PRPFL7: CAME B,F
JRST PRPFL8
FETCH(C,F,PRNV)
JUMPN C,PRPFL9
JUMPE A,PRPFL9
MOVE F,A
JRST PRPFL6
PRPFL8: FETCH(C,B,PRNV)
PRPFM3: CAMN C,F
JRST PRPFM2
MOVE B,C
FETCH(C,C,PRNV)
JUMPN C,PRPFL8
OUTSTR[ASCIZ/VALUE BLOCK NOT FOUND AT PRPFL8!
/]
JRST PRPADA
PRPFM2: FETCH(C,F,PRNV)
STORE(C,B,PRNV)
PRPFM1: CLEAR(F,PRPP)
CLEAR(F,PRNV)
MOVE A,F
PUSHJ P,RELPRP
JRST PRPADA
PRPFL9: JUMPE A,[STORE(C,H,PRPV)
JRST PRPFM1]
STORE(C,A,PRNP)
JRST PRPFM1
;Set new property name
PRPSET: PUSHJ P,TREADU
POPJ P, ;ALTMODE
JRST [ OUTSTR[ASCIZ/PROPERTY NAME?/]
PUSHJ P,TREADU
POPJ P,
POPJ P,
JRST .+1]
MOVEM B,STRING ;SAVE NEW PROPERTY NAME
JRST CPOPJ1
;FIND PROPERTY
;RADDR(H,PRPN,PRNN) IN F
;PRNN OF F IN G
;STRING IN T
;RETURNS: +1 NO SUCH PROPERTY
; +2 AMBIGUOUS
; +3 FOUND BY PARTIAL MATCH
; +4 FOUND BY EXACT MATCH
PRPFND: PUSH P,T
SETZ A,
TLZ TFLG
PRPFN1: MOVE T,(P)
FETCH(TT,G,PRNS)
PUSHJ P,TXTPAR
JRST PRPFN2
JRST PRPFN2
JRST PRPFN3
POP P,T
JRST CPOPJ3 ;EXACT MATCH RETURN
PRPFN3: SKIPE A ;ANY OTHER PARTIALS?
TLO TFLG ;YES, FLAG IT
MOVE A,G
HRL A,F
PRPFN2: MOVE F,G
FETCH(G,G,PRNN)
JUMPN G,PRPFN1
POP P,T
TLNE TFLG
JRST CPOPJ1
JUMPE A,CPOPJ
HRRZ G,A
HLRZ F,A
JRST CPOPJ2
PRPADD: PUSHJ P,PRPSET
POPJ P,
HRRZ T,STRING
MOVEI F,RADDR(H,PRPN,PRNN)
FETCH(G,F,PRNN)
JUMPE G,PRPADX
PUSHJ P,PRPFND
JRST PRPAD0
JRST PRPAD0
JRST [ ASK[ASCIZ/PROPERTY IS PARTIAL MATCH TO EXISTING PROPERTY,
ARE YOU SURE YOU WANT TO CREATE IT?/]
JRST PRPADA
JRST PRPADA
JRST PRPAD0]
PRPADY: OUTSTR[ASCIZ/SORRY - PROPERTY ALREADY EXISTS.
/]
JRST PRPADA
PRPADX: MOVEI TT,[ASCIZ/PART NUMBER/]
PUSHJ P,ASCPAR
JRST PRPAD0
JRST PRPAD0
JRST PRPADY
PRPAD0: OUTSTR[ASCIZ/NAME OF OLD PROPERTY TO
INSERT NEW PROPERTY BEFORE?
/]
PUSHJ P,TREADU
JRST PRPADA
JRST PRPADA
HRLM B,STRING
MOVEI F,RADDR(H,PRPN,PRNN)
FETCH(G,F,PRNN)
JUMPN G,PRPAD1 ;IF WE HAVE LIST, JUST SEARCH IT
HLRZ T,STRING
MOVEI TT,[ASCIZ/PART NUMBER/]
PUSHJ P,ASCPAR ;IF NO LIST YET, MUST BE "PART NUMBER"
JRST PRPADB ;NOT EXACT OR PARTIAL MATCH, ERROR
JFCL ;PARTIAL MATCH
HLRZ B,STRING ;GIVE THIS BACK, IT MAY ONLY BE A PARTIAL MATCH
PUSHJ P,PUTFS
GETFS(G,PNBK) ;NOW MAKE NAME BLOCK FOR "PART NUMBER"
BCLEAR(T,G,PNBK)
MOVEI TT,[ASCIZ/PART NUMBER/]
PUSHJ P,ASCCOP
STORE(T,G,PRNS)
STORE(G,F,PRNN) ;LINK IN
JRST PRPAD3
PRPAD1: HLRZ T,STRING
PUSHJ P,PRPFND
JRST PRPADB ;NOT FOUND
JRST PRPADC ;AMBIGUOUS
HLRZ B,STRING ;EXACT MATCH
PUSHJ P,PUTFS
PRPAD3: FETCH(E,H,PRPV) ;GET PROPERTY VALUE POINTER
JUMPE E,PRPAD7 ;ALL DONE IF NO VALUES YET.
OUTSTR[ASCIZ/VALUE OF THIS PROPERTY FOR EXISTING PARTS?
/]
PUSHJ P,RPRVAL
JRST PRPADA ;QUIT
JRST PRPADA ;NULL (SOMEDAY WE WILL PROMPT FOR THIS)
HRLM B,STRING
MOVEM TT,TMPCN1 ;SAVE BITS HERE
PRPAD7: GETFS(A,PNBK)
BCLEAR(T,A,PNBK)
HRRZ T,STRING
STORE(T,A,PRNS)
STORE(G,A,PRNN)
STORE(A,F,PRNN) ;NOW WE HAVE THE NEW PROPERTY NAME
JUMPE E,CPOPJ ;DON'T HAVE TO INSERT NEW IF NO VALUES YET
HLRZS STRING
MOVE F,A ;SAVE OUR PROPERTY HERE
PRPAD4: FETCH(T,E,PRNB)
CAME T,G ;IS THIS WHERE TO INSERT IT?
JRST PRPAD5
FETCH(D,E,PRPP) ;GET PREVIOUS POINTER
GETFS(A,PVBK)
BCLEAR(T,A,PVBK)
MOVE TT,STRING
PUSHJ P,LSTCOP ;COPY VALUE
STORE(T,A,PRVS) ;STORE INTO BLOCK
FETCH(T,A,PRBT)
TDO T,TMPCN1 ;ADD BITS FROM RPRVAL
STORE(T,A,PRBT)
STORE(F,A,PRNB) ;STORE POINTER TO PROPERTY NAME BLOCK
STORE(D,A,PRPP) ;STORE PREVIOUS POINTER
MOVE B,E ;NOW SPREAD NEW BLOCK THROUGH LOWER LEVEL
PRPAD8: STORE(A,B,PRPP)
FETCH(B,B,PRNV)
JUMPN B,PRPAD8
STORE(E,A,PRNP)
SKIPE D
STORE(A,D,PRNP) ;IF NOT TOP, STORE US IN PREVIOUS
SKIPN D
STORE(A,H,PRPV) ;IF TOP, STORE IN DIP DEF
SKIPN E,D
POPJ P,
JRST PRPAD6
PRPAD5: FETCH(T,E,PRNP)
JUMPN T,[MOVE E,T
JRST PRPAD4]
PRPAD6: FETCH(T,E,PRNV)
JUMPN T,[MOVE E,T
JRST PRPAD5]
FETCH(E,E,PRPP)
JUMPN E,PRPAD6
POPJ P,
PRPADC: OUTSTR[ASCIZ/AMBIGUOUS PROPERTY.
/]
CAIA
PRPADB: OUTSTR[ASCIZ/NO SUCH PROPERTY.
/]
HLRZ B,STRING
PUSHJ P,PUTFS
PRPADA: HRRZ B,STRING
PUSHJ P,PUTFS
PRPADE: FETCH(T,H,PRPV)
JUMPN T,CPOPJ ;LEAVE IF ANY VALUES
FETCH(A,H,PRPN)
FETCH(T,A,PRNN)
JUMPN T,CPOPJ ;IF MORE THAN ONE PROPERTY NAME, LEAVE LIST
FSTRET(A,PNBK) ;ELSE RETURN BLOCK (WHICH MUST BE "PART NUMBER" BLOCK)
CLEAR(H,PRPN) ;AND POINTER TO IT
POPJ P,
;Delete property
PRPDEL: PUSHJ P,PRPSET
POPJ P,
MOVEI F,RADDR(H,PRPN,PRNN)
FETCH(G,F,PRNN)
JUMPE G,PRPDLA
HRRZ T,STRING
PUSHJ P,PRPFND
JRST PRPDLA
JRST PRPDLB
JFCL ;PARTIAL MATCH
MOVE B,STRING ;EXACT MATCH
PUSHJ P,PUTFS
FETCH(T,G,PRNN)
JUMPE T,[FETCH(T,H,PRPN) ;GET FIRST PROPERTY NAME
CAMN T,G
JRST .+1 ;ALLOW DELETION OF "PART NUMBER" IF IT IS ONLY ONE.
OUTSTR[ASCIZ/SORRY - CAN'T DELETE "PART NUMBER" UNLESS ONLY PROPERTY.
/]
POPJ P,]
FETCH(E,H,PRPV) ;GET VALUE LIST
JUMPE E,PRPDLX ;DONE IF NONE
TRZ FLAG
MOVE T,[PUSHJ P,TTYOUT]
MOVEM T,PUTCHR
PUSHJ P,PRPCLR ;CLEAR TEMP MARK BITS
PRPDL2: FETCH(T,E,PRNB)
CAME T,G ;IS THIS A VALUE TO DELETE
JRST PRPDL9 ;NO
FETCH(B,E,PRBT)
FETCH(T,E,PRNV)
JUMPE T,[TRO B,PRTMP1
STORE(B,E,PRBT)
JRST PRPDL4]
TRON FLAG
OUTSTR[ASCIZ/TYPE Y FOR BRANCH OF TREE YOU WANT PRESERVED.
/]
PRPDL8: SKIPA D,E
PRPDL5: PUTBYT 11
FETCH(A,D,PRVS)
PUSHJ P,STROUT
FETCH(D,D,PRPP)
JUMPN D,PRPDL5
ASK[ASCIZ/?/]
POPJ P, ;LET HIM OUT
JRST PRPDL6
TRO B,PRTMP1 ;YES = SAVE THIS BRANCH
STORE(B,E,PRBT)
PRPDL4: FETCH(E,E,PRPP) ;NOW BACK OUT
JUMPE E,PRPDL7
PRPDL3: FETCH(T,E,PRNV)
JUMPE T,PRPDL4
MOVE E,T
PRPDL9: FETCH(T,E,PRNP)
JUMPE T,PRPDL3
MOVE E,T
JRST PRPDL2
PRPDL6: FETCH(T,E,PRNV)
JUMPE T,[OUTSTR[ASCIZ/SORRY - YOU DIDN'T CHOSE ONE, TRY AGAIN.
/]
FETCH(E,E,PRPP)
JUMPE E,[FETCH(E,H,PRPV)
JRST PRPDL8]
FETCH(E,E,PRNP)
JRST PRPDL8]
MOVE E,T
JRST PRPDL8
PRPDL7: FETCH(E,H,PRPV)
PRPDM1: FETCH(T,E,PRNB)
CAME T,G
JRST PRPDM2
MOVE D,E
FETCH(E,D,PRPP)
PRPDM5: FETCH(T,D,PRBT)
TRNN T,PRTMP1
JRST PRPDM3
FETCH(A,D,PRNP)
JUMPE A,PRPDN1
PRPDN2: STORE(E,A,PRPP) ;FIXUP BACK POINTERS FOR LOWER LEVEL
FETCH(A,A,PRNV)
JUMPN A,PRPDN2
FETCH(A,D,PRNP)
PRPDN1: JUMPE E,[STORE(A,H,PRPV)
JRST PRPDM4]
STORE(A,E,PRNP)
PRPDM4: MOVE C,D
FETCH(D,D,PRNV)
MOVE T,C
PUSHJ P,UNTHRD
FSTRET(C,PVBK)
JRST PRPDM6
PRPDM3: MOVE A,D
FETCH(D,D,PRNV)
CLEAR(A,PRPP)
CLEAR(A,PRNV)
PUSHJ P,RELPRP
PRPDM6: JUMPN D,PRPDM5
CAIA
PRPDM8: FETCH(E,E,PRPP)
JUMPE E,PRPDLX
PRPDM7: FETCH(T,E,PRNV)
JUMPE T,PRPDM8
MOVE E,T
PRPDM2: FETCH(T,E,PRNP)
JUMPE T,PRPDM7
MOVE E,T
JRST PRPDM1
PRPDLX: FETCH(T,G,PRNN)
STORE(T,F,PRNN)
FSTRET(G,PNBK)
POPJ P,
PRPDLB: OUTSTR[ASCIZ/AMBIGUOUS PROPERTY.
/]
CAIA
PRPDLA: OUTSTR[ASCIZ/NO SUCH PROPERTY.
/]
MOVE B,STRING
JRST PUTFS
PRPCLR: FETCH(A,H,PRPV)
JUMPE A,CPOPJ
PRPCL1: FETCH(T,A,PRBT)
TRZ T,PRTMP1
STORE(T,A,PRBT)
FETCH(T,A,PRNP)
JUMPN T,[MOVE A,T
JRST PRPCL1]
PRPCL2: FETCH(T,A,PRNV)
JUMPN T,[MOVE A,T
JRST PRPCL1]
FETCH(A,A,PRPP)
JUMPN A,PRPCL2
POPJ P,
SUBTTL 'LSD' LIST DIP DEFS
;LIST ALL DIP DEFINITIONS INTO FILE
DIPPRA: PUSHJ P,DIPCHK
JRST ERRET
PUSHJ P,TREADu
POPJ P,
JRST DIPPRB
MOVE A,1(B)
PUSHJ P,PUTFS
CAMN A,[ASCIZ/PARTS/]
JRST DIPPTA
JRST ERRET
DIPPRB: MOVSI T,'LSD'
MOVEI TT,0
MOVSI TTT,'DSK'
PUSHJ P,OUTSET
POPJ P,
MOVE H,DIPLST
PNTAL2: SKIPN T,LCOUNT
JRST PNTAL3
CAILE T,=64
JRST [ CRLF ;LEAVE LOTS OF SPACE
CRLF
JRST PNTAL3]
PUTBYT 11
PNTAL3: FETCH(A,H,DNAM)
PUSHJ P,STROUT
FETCH(H,H,NXTD)
JUMPN H,PNTAL2
MOVE H,DIPLST
DIPCHECK
PNTALL: PUSHJ P,DIPHDR ;PRINT TOP LINE
PUSHJ P,FSTLIN ;FIRST LINE OF DIP DEF
MOVEI G,RADDR(H,DPIN,DPNXT)
JRST PNTAL4
PNTAL1: CRLF ;EXTRA CRLF
PUSHJ P,ONELIN
PNTAL4: FETCH(G,G,DPNXT)
JUMPN G,PNTAL1
CRLF
CRLF
PUSHJ P,PRPPN0
FETCH(H,H,NXTD)
JUMPN H,PNTALL
RELEASE LST,
POPJ P,
DIPHDR: PUTSTR[BYTE(7)15,14]
PUTSTR[ASCIZ/DIP DEFINITIONS FROM /]
PUSHJ P,DNPNT1
MOVEI A,=64
PUSHJ P,FILL ;FILL TO END OF 8TH COLUMN
FETCH(A,H,DNAM)
PUSHJ P,STROUT ;PRINT DIP NAME
CRLF
CRLF
CRLF
POPJ P,
SUBTTL 'PTL' LIST DIP DEFS
;LIST ALL DIP DEFINITIONS INTO FILE
DIPPTA: MOVSI T,'PTL'
MOVEI TT,0
MOVSI TTT,'DSK'
PUSHJ P,OUTSET
POPJ P,
TLO SIMTAB ;SO IT CAN BE SORTED
MOVE H,DIPLST
DIPPT1: FETCH(T,H,PRPV) ;PART TREE
JUMPE T,DIPPT2
DIPPT3: MOVE G,T
FETCH(T,G,PRNP)
JUMPN T,DIPPT3
FETCH(T,G,PRBT)
TRNN T,PARTNM
JRST DIPPT4
FETCH(A,G,PRVS)
PUSHJ P,STROUT
MOVEI A,=16
PUSHJ P,FILL
FETCH(A,H,DNAM)
PUSHJ P,STROUT
FETCH(F,G,PRPP)
JUMPE F,DIPPT6
MOVEI A,=32
PUSHJ P,FILL
CAIA
DIPPT7: PUTSTR[ASCIZ/, /]
FETCH(A,F,PRNB)
FETCH(A,A,PRNS)
PUSHJ P,STROUT
PUTBYT ":"
FETCH(T,F,PRBT)
TRNE T,DEFPRP
PUTBYT "*"
TRNE T,NULVAL
PUTBYT "!"
FETCH(A,F,PRVS)
PUSHJ P,STROUT
FETCH(F,F,PRPP)
JUMPN F,DIPPT7
DIPPT6: CRLF
DIPPT4: FETCH(T,G,PRNV)
JUMPN T,DIPPT3
FETCH(T,G,PRPP)
JUMPN T,[MOVE G,T
JRST DIPPT4]
DIPPT5: FETCH(H,H,NXTD)
JUMPN H,DIPPT1
RELEASE LST,
POPJ P,
DIPPT2: PUTSTR[ASCIZ/ /]
FETCH(A,H,DNAM)
PUSHJ P,STROUT
CRLF
JRST DIPPT5