diff --git a/Makefile b/Makefile index b21ef1f6..c5d70904 100644 --- a/Makefile +++ b/Makefile @@ -9,10 +9,12 @@ SRC = system syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \ inquir acount gz sys decsys ecc alan sail kcc kcc_sy c games archy dcp \ spcwar rwg libmax rat z emaxim rz maxtul aljabr cffk das ell ellen \ jim jm jpg macrak maxdoc maxsrc mrg munfas paulw reh rlb rlb% share \ - tensor transl wgd zz graphs lmlib pratt quux scheme gsb ejs mudsys + tensor transl wgd zz graphs lmlib pratt quux scheme gsb ejs mudsys \ + draw wl DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \ - chprog sail -BIN = sys2 emacs _teco_ lisp liblsp alan inquir sail comlap c decsys moon graphs + chprog sail draw wl pc +BIN = sys2 emacs _teco_ lisp liblsp alan inquir sail comlap c decsys moon \ + graphs draw datdrw SUBMODULES = dasm itstar klh10 mldev simh sims supdup tapeutils diff --git a/README.md b/README.md index abf3f8ba..4b7ee75c 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ Some major applications: - PDP-11 simulator - Scheme, interpreter - Spacewar!, game +- Stanford University Drawing System - TECO, editor - TOPS-10 and WAITS emulator diff --git a/bin/datdrw/ndips.dip b/bin/datdrw/ndips.dip new file mode 100755 index 00000000..9b4885fd Binary files /dev/null and b/bin/datdrw/ndips.dip differ diff --git a/bin/draw/dips.dip b/bin/draw/dips.dip new file mode 100644 index 00000000..d1e96794 Binary files /dev/null and b/bin/draw/dips.dip differ diff --git a/bin/draw/random.dip b/bin/draw/random.dip new file mode 100644 index 00000000..95918071 Binary files /dev/null and b/bin/draw/random.dip differ diff --git a/build/sail.tcl b/build/sail.tcl index 22f8a6fb..e136dca0 100644 --- a/build/sail.tcl +++ b/build/sail.tcl @@ -16,3 +16,102 @@ respond "*" ".jbsa/strt\r" respond ":" "56/1000\r" respond "\n" "\033y sail; fail bin\r" respond "*" ":kill\r" + +# Make links needed for SUDS. +respond "*" ":link wl; switch 999999, draw; switch >\r" +respond "*" ":link wl; first 999999, draw; first >\r" +respond "*" ":link wl; sigsub 999999, draw; sigsub >\r" +respond "*" ":link draw; board0 999999, wl; board0 >\r" +respond "*" ":link draw; board1 999999, wl; board1 >\r" +respond "*" ":link draw; board2 999999, wl; board2 >\r" +respond "*" ":link draw; decloc 999999, wl; decloc >\r" +respond "*" ":link draw; lg627 999999, wl; lg627 >\r" +respond "*" ":link draw; lg684 999999, wl; lg684 >\r" +respond "*" ":link draw; mpg21 999999, wl; mpg21 >\r" +respond "*" ":link draw; mpg216 999999, wl; mpg216 >\r" +respond "*" ":link draw; ncp13 999999, wl; ncp13 >\r" +respond "*" ":link draw; ug61c 999999, wl; ug61c >\r" +respond "*" ":link sys1; ts d, datdrw; d bin\r" +respond "*" ":link sys1; ts wl, datdrw; wl bin\r" +respond "*" ":link sys1; ts pc, datdrw; pc bin\r" + +# The drawing program needs WL; BOARDS REL +respond "*" ":cwd wl\r" +respond "*" ":fail boards\r" +respond ";^C" ";\003" + +# The PC program needs WL; PCBOARDS REL +respond "*" "PCBOARDS_BOARDS\r" +respond ";^C" "PC\r" +respond "SELECTED" ";\003" +respond "*" "\032:kill\r" + +# SUDS drawing program +respond "*" ":cwd draw\r" +respond "*" ":fail d\r" +respond ";^C" ";\003" +respond "*" "\032:kill\r" +respond "*" ":stink d\r" +respond "STINK." "\177" +respond "??" "\033\0331L decsys; decbot bin\r" +respond "*" ".jbsa/strt\r" +respond ":" "56/107\r" +respond "\n" ":pdump datdrw; d bin\r" +respond "*" ":kill\r" + +# SUDS ... PC +respond "*" ":fail pc_d\r" +respond ";^C" "PC\r" +respond "SELECTED" ";\003" +respond "*" "\032:kill\r" +respond "*" ":stink pc\r" +respond "STINK." "\177" +respond "??" "\033\0331L decsys; decbot bin\r" +respond "*" ".jbsa/strt\r" +respond ":" "56/107\r" +respond "\n" ":pdump datdrw; pc bin\r" +respond "*" ":kill\r" + +# SUDS layout program. +respond "*" ":fail layd_d\r" +respond ";^C" "ONE\r" +respond "SELECTED" "D\r" +respond "\n" ";\003" +respond "*" "laypc_d\r" +respond ";^C" "ONE\r" +respond "SELECTED" "PC\r" +respond "SELECTED" ";\003" +respond "*" "\032:kill\r" +respond "*" ":stink lay\r" +respond "STINK." "\177" +respond "??" "\033\0331L decsys; decbot bin\r" +respond "*" ".jbsa/strt\r" +respond ":" "56/107\r" +respond "\n" ":pdump datdrw; lay bin\r" +respond "*" ":kill\r" + +# SUDS wirelist program. +respond "*" ":cwd wl\r" +respond "*" ":fail wl\r" +respond "*" "wboard\r" +respond "*" "\032:kill\r" +respond "*" ":stink wl\r" +respond "STINK." "\177" +respond "??" "\033\0331L decsys; decbot bin\r" +respond "*" ".jbsa/strt\r" +respond ":" "56/107\r" +respond "\n" ":pdump datdrw; nodips bin\r" +respond "*" ":go\r" +expect { + "PDP-6 not available" { + respond "*" "C" + # Display not available + respond "*" "C" + expect "TOP MODE" + } + "TOP MODE" {} +} +respond "*" "XRESIDENT\r" +respond "GO ON." "Y\r" +respond "WL BIN" "\r" +respond "*" ":kill\r" diff --git a/doc/draw/-read-.-this- b/doc/draw/-read-.-this- new file mode 100644 index 00000000..72c8f5cf --- /dev/null +++ b/doc/draw/-read-.-this- @@ -0,0 +1,14 @@ +These are the sources for the draw program of the Stanford drawing system. +Questions to H, JLK. +SUDS maintenance is now being done on MC. The appropriate directories are: + DRAW; -- drawing system files + WL; -- wirelister files + PC; -- PC program files + DATDRW; -- Bin files, bodies librarys, DIP info, SUDS documentation, etc. + +On AI, the directories DRAW, DRAW1, DRAW2, WL, NEWWL, NEWDRW, and DATRPH +have been flushed. The canonical place for bin files for TS D, TS WL, etc. +is now DATDRW; (this includes the SCNV program). + +Info on dumping out a new D, PC or WL is recorded in MC:DRAW;D INFO, +MC:DRAW;PC INFO and MC:WL;WL INFO respectively. diff --git a/doc/draw/d.info b/doc/draw/d.info new file mode 100644 index 00000000..6b3f8c38 --- /dev/null +++ b/doc/draw/d.info @@ -0,0 +1,48 @@ + Creating a new D + + DRAW^S +Assemble new REL: + :FAIL D +In answer to query for assembly switches: (Assemble just plain D) + ;^C +If necessary, assemble new BOARDS file + WL$$^S + :FAIL BOARDS +Load binary: + :STINK D ;Uses D LOADER +Merge in DECUUO boot: + 1L DECSYS;DECBOT BIN + .JBSA/ STRT + 56/ 107 ;SAIL + META + SYMS + ... + +; [DATDRW !!!] + + :DELETE DATDRW;D OBIN + :RENAME DATDRW;D BIN, D OBIN + :PDUMP DATDRW;D BIN ; This is the file linked to by SYS1;TS D + + + +------------------------------------------------------------ + + Create debug version +Assemble new REL: + DRAW$$^S + :FAIL + DD_D +If necessary, assemble new BOARDS file + WL$$^S + :FAIL + DBOARDS_BOARDS +In answer to query for assembly switches: + DEBUG + ;^C +Load binary: + :STINK DD ;Uses DD LOADER +Merge in DECUUO boot: + 1L DECSYS;DECBOT BIN + .JBSA/ STRT + 56/ 107 ;SAIL + META + SYMS + ... + + + :PDUMP DRAW;TS DD diff --git a/doc/draw/dscr.313 b/doc/draw/dscr.313 new file mode 100644 index 00000000..7c7604d5 --- /dev/null +++ b/doc/draw/dscr.313 @@ -0,0 +1,1200 @@ +STANFORD DRAWING SYSTEM DATA STRUCTURES + +THE FOLLOWING IS AN EXAMPLE OF THE DOCUMENTATION FORMAT +FOR BINARY FILES DESCRIBED HEREIN: + +-------- +! A +! B +! C +-------- +D + +THIS FORMAT MEANS THAT THE SEQUENCE OF WORDS A, B, AND C IS +REPEATED UNTIL THE VALUE OF A IS EQUAL TO D. + DWG PROG BODIES ***INSTANCE OF TYPE*** +DBODPN -------- + ! / ! \ + !-------! \ + \!/ + ------- V -------> NEXT + / ! \ / ! / + ! ! ! ! ! + ! !-------!-------! + ! ! ! + ! ! X Y ! + ! !-------!-------! + ! + !--> -------> PIN LINK + ! ORIEN- / ! + ! TATION ! ! + !-------!-------! + ----!--- ---!---> TYPE (body def - see page 6) + / ! \ / ! + ! !-------!-------! + ! + ! + !--> ! ! +PC ! BID L-N ! BYTE(6)L(12)N +PROG !-------!-------! + ! ! BODY ---!---> DIP TYPE NAME STRING + ! ! BITS / ! + ! !-------!-------! + ! + !--> ! ---!--- (0 IF NO BODY LOC SET) +LOGIC ! BID / ! \ +PROG !-------!-------! ! + ! BODY ! ! + ! BITS ---!----!--- + !-------!-------! ! \ + ------------------------/ ! + / \ FORM 1: FORM 2: + ! --->! ---!------>! ---!----> NEXT + ! ------!--- ! ! 0 ! + ! / !-------!-------! !-------!-------! + ! ! ! MAIN LOC. ! ! ! + ! ! ! X Y ! ! ---!----> POINTER INTO BODY TO + ! ! !-------!-------! !-------!-------! PROPERTY OR TEXT BLOCK + ! ! + ! \ --------------->TEXT PROPERTY NAME (0 IF NONE) + ! ----->! / ! FOR PROPERTY "DIPTYPE" LEFT HALF OF FIRST BLOCK IS DIP DEF LIST + ! ! ! ---!---->TEXT VALUE + ! !-------!-------! (0 SIZE FOR NORMALLY NOT DISPLAYED) + ! !CONSTANT OFFSET! + ! ! X Y ! + ! !-------!-------! + ! --------------- + ! / \ + !--> ! / ! \------>! ! + ! ! ! ! B-R-S ! L-N ! + !-------!-------! !-------!-------! + ! ! ! ! + ! X Y ! CONSTANT ! X Y ! CONSTANT + !-------!-------! OFFSET !-------!-------! CHAR OFFSET + +STANDARD TEXT FORMAT: + +------------> ! ----!------> ! CHAR ----!---> NEXT 5 + ! ! ! SIZE ! CHARS + !-------!-------! !-------!-------! + !CONSTANT OFFSET! ! ! + ! X Y ! ! 5 CHARS ! + !-------!-------! !---------------! +OFFSET IS SCALED WITH TEXT SIZE, NOT DRAWING SCALE. + POINTS +PONPNT ------- + ! / ! \ + !-------! ! + / + / + \!/ + ------ V ------ (*** BODY PIN ***) + / ! \ / ! \ + ! ! ! ! ! ! + ! !-------!-------! ! + ! ! ! ! + ! ! X Y ! ! + ! !-------!-------! ! + ! ! + !-> -------!--> PIN LINK + ! / ! ! + ! BODY ! ! ! POINT-VALUE BLOCK + !-------!-------! ! + --!--- ---!---!--> ! ---!-------> PINLOC BLOCK + / ! \ / ! ! ! TEXT / ! IN TYPE + ! !-------!-------! ! !-------!-------! + ! ! ! PIN OR! + !--> ! ! BITS PAD # ! + ! ! ! !-------!-------! + ! NEIGHBORS ! ! + !-------!-------! ! + ! ! ! + ! NEIGHBORS ! ! + !-------!-------! ! + \!/ + V + NEXT POINT + + FROM LAST POINT + ! + ------/ + / + / + \!/ + ------ V -----------> NEXT + / ! \ / ! + ! ! ! ! ! + ! !-------!-------! + ! ! ! + ! ! X Y ! + ! !-------!-------! + ! + !-> + ! FEED ! (If a POINT or CPIN) + ! OR 0 PID ! + !-------!-------! + --!--- ---!------> ! ---!-- IF CPIN + / ! \ / ! ! TEXT / ! \ ON IN + ! !-------!-------! !-------!-------! ! BITS, + ! ! PIN OR! ! ELSE 0 + !--> ! BITS PAD # ! ! + ! ! !-------!-------! ! + ! NEIGHBORS ! / + !-------!-------! --------------/ + ! ! / + ! NEIGHBORS ! \!/ + !-------!-------! V + + LOGIC DRAWINGS PC CARD DRAWINGS + ! ! ! ! + ------------>!N-L-X-N L-L-N ! ! 0 L-L-N ! + / !-------!-------! !-------!-------! + ! ! ! ! ! OTHER END + ! ! X Y ! ! X Y ! OF FINGER + ! !-------!-------! !-------!-------! + ! CONSTANT OFFSET +BYTE(4)N(5)L(3)X(6)N,L,L,N + +WHERE X IS THE HEIGHT OF THE CARD IN PADDLES -1 + INTERNAL PC CARD FORMAT + +CRDLST -------------------> OTHER SIDE EDGE LIST + / + ! ! ! ---!--- + !-------!-------! \ + ! + ----------/ + / + ! + \!/ + V + + ! ! + ! ! ---!--------> NEXT POINT ON EDGE + !-------!-------! + ! ! + ! X ! Y ! LOW ORDER BIT = 1 MEANS INVISIBLE + !-------!-------! VECTOR TO THIS POINT + + + +BARLST -------------------> OTHER SIDE SHORTING BAR LIST + / + ! ! ! ---!--- + !-------!-------! \ + ! + / + ---------- + / + ! PAIRS OF ENDPOINTS OF SHORTING BARS + \!/ + V + + ! ! ! ! + ! ! ---!-----> ! ! ---!---> NEXT PAIR OF + !-------!-------! !-------!-------! ENDPOINTS + ! ! ! ! + ! X ! Y ! ! X ! Y ! + !-------!-------! !-------!-------! + TYPE (BODY DEF'S) FOR LOGIC DRAWING VERSION + -------- + ! / ! \ + !-------! ! + ! + \!/ + V + ----------------------> LIBRARY + / POINTER + ! ! ! + ! ! ----!----------> TYPE NAME (LEFT HALF FIRST WORD + !-------!-------! IS DIP TYPE NAME POINTER) + ---!-- ---!----------> NEXT + / ! \ / ! TYPE + ! !-------!-------! ------------> SEE PIN + ! / BLOCK BELOW + -!------- / + / ! \ --------------> ! / ---!---> NEXT + ! ! ! \ / ! / ! / / ! PIN + ! !--->! ! ! ! !-------!-------! + ! !-------!-------! ! ! (PINLOC BLOCK) + ! ---!-- ---!---- ! X Y ! + ! / ! \ / ! \ !-------!-------! + ! ! !-------!-------! ! + ! ! ! + ! ! !----> ! ---!---> NEXT + ! ! ! / ! POINT + ! ! !-------!-------! + ! ! ! ! + ! ! ! X ! Y ! LOW ORDER BIT + ! ! !-------!-------! =0 VISIBLE + ! ! =1 INVISIBLE + ! \ + ! \ + ! ----------------->! ---!---->NEXT PROPERTY/TEXT + ! ------!--- ! + ! / !-------!-------! + ! ! ! MAIN LOC. ! + ! ! ! X Y ! + ! ! !-------!-------! + ! ! + ! \ --------------->TEXT PROPERTY NAME (0 IF NONE) + ! ----->! / ! FOR PROPERTY "DIPTYPE" LEFT HALF OF FIRST BLOCK IS DIP DEF LIST + ! ! ! ---!--\ + ! !-------!-------! ---> TEXT VALUE + ! !CONSTANT OFFSET! (0 SIZE FOR NORMALLY NOT DISPLAYED) + ! ! X Y ! + ! !-------!-------! + ! + \ + \ + \--->! ! 0 IF USING ! ! + ! BITS ----!-------------->! UNUSED ! + !-------!-------! DEFAULT !-------!-------! + !DEF LOC OFFSET ! !DEF CHAR OFFSET! + ! X Y ! ! X Y ! + !-------!-------! !-------!-------! + +DIP DEF LIST (SEE ABOVE): + ! actual ---!----------> ! PIN ---!---> NEXT + ! # pins ! ! NAME ! PIN + !-------!-------! !-------!-------! + ! ! ! SECT. SECT. ! + ! MAX SEC # ! ! BITS PIN # ! + !---------------! !-------!-------! + +PIN BLOCK: + ! PIN PIN ! + ! BITS ID ! + !-------!-------! + ! PIN PIN ! + ! POS NAME ! + !-------!-------! + +PIN POS: + BYTE(7)X(7)Y(4) 8 POSITION CODE + +X,Y ARE 2'S COMPLEMENT + + +TEXT IS STANDARD FORMAT + BODY DEF'S PC CARD DRAWINGS + ----- +! / ! \ +!-------! ! + ! + \!/ + V + ------------> NEXT BODY + ! # OF / ! + ! PINS ! ! + !-------!-------! + ---!--- ---!-----------> ! ---!------->NEXT PIN + / ! \ / ! ! PIN # / ! + ! !-------!-------! !-------!-------! + ! ! ! + ! ! X Y ! OF PIN LOCATION + !--->! ! !-------!-------! + ! ---!------> + !-------!-------! NEXT X,Y + ! ! + ! X Y ! + !-------!-------! X,Y'S OF BOX APPROXIMATING BODY + CORLST DATA BLOCK FORMATS + +TRANSPOSITION: + + !OLD TYPE ---!-------> NEXT BLOCK + !PIN BLK / ! + !-------!-------! + ! NEW TYPE! + ! PIN ID PIN BLK! + !-------!-------! + +DELETION: + + !OLD TYPE ---!-------> NEXT BLOCK + !PIN BLK / ! + !-------!-------! + ! ! + ! 0 0 ! + !-------!-------! + +NEW PIN: + + ! ---!-------> NEXT BLOCK + ! 0 / ! + !-------!-------! + ! NEW TYPE! + ! PIN ID PIN BLK! + !-------!-------! + SETS +SETPNT + ----- +! / ! \ +!-------! ! + ! + \!/ + V + -------------> NEXT SET + ---!--- / ! + / ! \ ! ! + ! !-------!-------! + ! ! ! + ! ! X Y ! SET CENTER + ! !-------!-------! + ! + ! + !--->! ---!---------> NEXT MEMBERS OF THIS SET + ! / ! + !-------!-------! + ! ! + ! BODY POINT ! + !-------!-------! + WIRLST + +WIRLST ! ---!--- + !--------! \ + ! + / + --- + / + ! + \!/ + V + ! ---!-------> NEXT WIRE + ! ! / ! -----------> PIN POINTER + !-------!-------! / + ! TYPE ---!------>! / ! ---!-------> NEXT BLOCK + ! BITS ! / ! ! ! / ! THIS WIRE + !-------!-------! !-------!-------! + ! ---!-------> AZ1 OR EZ1 + ! \ ! ! + !----\--!-------! + \--------------> A SIGNAL NAME + 'DRW' FILE FORMAT +LOGIC DRAWINGS +DESCRIPTION OF FILE DATA STRUCTURE + + + +VERSION # (OLDEST VERSION DOES NOT HAVE THIS, BUT STARTS WITH A BODY NAME) + ;IOVER = 27 +ASCIZ /NOMENCLATURE TYPE/ +ASCIZ /BOARD TYPE/ + +-------- +! ASCIZ/TYPE NAMES OF LIBRARY BODIES ACTUALLY USED IN THIS DWG/ +-------- +0 +-------- +! FILENAME +! EXT,,BITS ------- LIBRARIES +! PPN +-------- +0 +-------- +! ASCIZ STRING NAME OF BODY DEF +! ASCIZ /PACKAGE NAME/ ;DEFAULT VALUE FROM DIPS.DIP FILE +! BITS,, +! X,Y INITIAL BODY LOC OFFSET +! X,Y INITIAL BODY LOC CHAR OFFSET (400000 IF USING DEFAULT) +! -------- +! ! loc of pin (x,y) +! ! bits,,pinid (pinid is generated by program) +! ! pin pos,,pin name (default) +! -------- +! 400000 +! -------- +! ! POINTS DESCRIBING LINES IN TYPE (LOW ORDER BIT =1 IF VISIBLE LINE TO THIS POINT) +! -------- +! 400000 +! -------- +! ! ASCIZ VALUE TEXT +! ! ASCIZ PROPERTY NAME TEXT (0 IF TEXT ONLY) +! ! TEXT SIZE (0 IF NOT NORMALLY DISPLAYED) +! ! TEXT LOCATION +! ! CONSTANT OFFSET +! -------- +! 0 +-------- +0 +-------- +! ASCIZ/MACRO NAME/ +! BYTE(9)MACRO BODY ENDING WITH 0 BYTE +-------- +0 +-------- +! LOC OF BODY +! ORIENTATION+400000(IF LOCATION FOLLOWS) +! BYTE(4)N(5)L(3)X(6)N,L(12)N +! X,Y CONSTANT OFFSET OF LOCATION +! X,Y CHAR OFFSET OF LOCATION +! XWD BODY BITS , BODY ID (GENERATED) +! NAME OF TYPE USED TO GENERATE BODY (IN ASCIZ) +! -------- +! ! ASCIZ VALUE TEXT +! ! ASCIZ PROPERTY NAME TEXT (0 FOR TEXT ONLY) (THESE ARE PROPERTIES WHICH DIFFER FROM DEFINITION) +! ! TEXT SIZE +! ! TEXT LOCATION +! ! CONSTANT OFFSET +! -------- +! 0 +-------- +400000 +-------- +! LOC OF POINT +! POINT ID (GENERATED) +! ID OF DOWN(0 IF NONE) +! ID OF UP(0 IF NONE) +! ID OF LEFT(0 IF NONE) +! ID OF RIGHT(0 IF NONE) +! XWD BITS,PIN # +! SIZE OF TEXT (0 IF NONE) +! X,Y CONSTANT OFFSET FROM POINT LOC +! ASCIZ TEXT(IF ANY) +! BYTE (4)N(5)L(3)X(6)N,L,L,N------\ IF CPIN ON IN BITS +! X,Y CONSTANT OFFSET--------------/ (6)L,L,N REPLACED BY (6)L(12)4000+N FOR "U" PIN +-------- +400000 +-------- +! LOC OF SET CENTER +! -------- +! ! BODY ID +! -------- +! 0 +! -------- +! ! POINT ID +! -------- +! 0 +-------- +400000 + +ASCIZ STRING DRAWN BY +ASCIZ STRING TITLE LINE 1 +ASCIZ STRING TITLE LINE 2 +BYTE(4)N(5)L(3)X(6)N(18)0 CARD LOC FOR WHOLE DWG +ASCIZ REVISION STRING +ASCIZ MODULE STRING +asciz variable string +asciz prefix string +ASCIZ PROJECT STRING +ASCIZ PAGE STRING +ASCIZ OF STRING +ASCIZ SITE LINE 1 STRING +ASCIZ SITE LINE 2 STRING +DEC,< +ASCIZ NEXT HIGHER ASSEMBLY NUMBER STRING + 0 OR DRNNAM + DRNEXT,,DRNDAT + DRNPPN + 0 OR CHKNAM + CHKEXT,,CHKDAT + CHKPPN + 0 OR ENGNAM + ENGEXT,,ENGDAT + ENGPPN +>;DEC + +0 + +POINT ID IS GENERATED FOR POINTS OR XWD PIN ID,BID FOR PINS + 'PC' FILE FORMAT +PC CARD DRAWINGS +DESCRIPTION OF FILE DATA STRUCTURE + + +VERSION # + +ASCIZ /NOMENCLATURE TYPE/ +ASCIZ /BOARD TYPE/ + +-------- +! ASCIZ/MACRO NAME/ +! BYTE(9)MACRO BODY ENDING WITH 0 BYTE +-------- +0 +-------- +! LOC OF BODY +! ASCIZ STRING NAME OF DIP TYPE +! BYTE (6)L(12)N(18)ORIENTATION +! XWD BODY BITS, BODY ID +! XWD ,# OF PINS ON THIS DIP +-------- +400000 +-------- +! LOC OF POINT +! POINT ID +! -------- +! ! ID OF A NEIGHBOR +! -------- +! 0 +! XWD BITS,PAD NUMBER +! SIZE OF TEXT (0 IF NONE) +! X,Y CONSTANT OFFSET FROM POINT LOC +! ASCIZ TEXT(IF ANY) +! ID OF FEED THROUGH(0 IF NONE) +-------- +400000 +-------- +! +! SIDE 2 POINTS +! +-------- +400000 +-------- +! LOC OF SET CENTER +! -------- +! ! BODY ID +! -------- +! 0 +! -------- +! ! POINT ID +! -------- +! 0 +-------- +400001 + +CARD LOCATION BYTE (4)N(5)L(3)X(6)N(18)0 + + --------! +CARD FILENAME: FILNAM ! + EXT,,0 !--- OR 0 IF NONE + PPN ! + --------! + +0 + +POINT ID IS EITHER GENERATED NUMBER OR XWD PIN ID,BID + 'PLT' 'PCP' FILE FORMAT + +LOW ORDER BIT OFF ALWAYS STARTS NEW COMMAND! + +The first word of an item is X*2,,Y*2 where the low bits +are decoded as commands: + +Bit 17,35 Meaning +------------------------------ +00 Start vector string, 1st point +01 ... next point +01 ... etc + +10 Start text, pad, or diamond; all following words have bit 35=1 +x1 Following words in text,.. item + +VERSION# ;PLTVER=14 +LINES: +-------- +! XWD X*2,Y*2 LOW ORDER BIT OF LEFT HALF OFF MEANS +! XWD X*2,Y*2+1 THIS COMMAND IS A BUNCH OF POINTS +! XWD X*2,Y*2+1 JOINED BY VECTORS. ENDS WITH START OF +! . NEW COMMAND (LOW ORDER BIT OFF AGAIN) +! . +! . +! XWD X*2,Y*2+1 +-------- + +TEXT: +-------- +! XWD X*2+1,Y*2 ONE IN LEFT HALF MEANS TEXT +! XWD 0,VERT+ROTATION+SIZE*2+1 ZERO IN LH MEANS TEXT, NOT DIAMOND OR DRILL HOLE +! ASCII/5 CHARS OF TEXT/+1 +-------- + +;ROTATION = 0 NORMAL UPRIGHT CHARS +;ROTATION = 400000 ROTATED 90 DEGREES CCW + +SMALL DIAMOND TO INDICATE JUNCTION OF 3 OR 4 LINES (PLT) + OR +DRILL HOLE (PCP): +-------- +! XWD X*2+1,Y*2 +! XWD 2,1 2 IN LEFT HALF MEANS DIAMOND (OR DRILL HOLE) +-------- + +MPC,< +-------- +! XWD X*2+1,Y*2 +! XWD 4,*2+1 +-------- +THE PLOT PROGRAM KNOWS ABOUT THE VARIOUS PAD TYPES +>;MPC + +******** THE PRECEEDING FORMATS MAY BE MIXED IN ANY ORDER UNTIL + A WORD WITH LEFT HALF = 400001 IS SEEN. THEN THE + FILE ENDS WITH THE FOLLOWING: + +MPC,< 400001,,0 +400000 IF FRONT SIDE + +200000 IF INNER PLANE + BITS BIT 35 = FLIPPED PLOT + + CARD FILENAME: --------! + CRDNAM ! + CRDEXT !---- OR 0 IF NONE + CRDPPN ! + --------! +>;MPC +MD,< 400001,,*2 0=NONE + 1=A + 2=B ETC. + + ASCIZ/STRING TO GO IN BOX MARKED "DRAWN BY"/ + + ASCIZ/FIRST LINE TO GO IN TITLE BOX/ + + ASCIZ/SECOND LINE TO GO IN TITLE BOX/ + 'DRW' FILE DATE AND TIME LAST WRITTEN + 'DRW' FILE NAME + 'DRW' FILE EXTENSION,,0 + 'DRW' FILE PPN + CARD LOCATION + + ASCIZ/REVISION STRING/ + + ASCIZ/drawing number STRING/ ;MODULE-VARIABLE-PREFIX + + ASCIZ/PROJECT STRING/ + + ASCIZ/PAGE STRING/ + + ASCIZ/OF STRING/ + + ASCIZ/DCODE STRING/ + + ASCIZ/SITE LINE 1 STRING/ + + ASCIZ/SITE LINE 2 STRING/ + +DEC,< + + ASCIZ/NEXT HIGHER ASSEMBLY NUMBER STRING/ + + 0 OR DRNNAM + DRNEXT,,DRNDAT + DRNPPN + + 0 OR CHKNAM + CHKEXT,,CHKDAT + CHKPPN + + 0 OR ENGNAM + ENGEXT,,ENGDAT + ENGPPN + +>;DEC +>;MD + 'WD' 'WPC' FILE FORMAT + +VERSION # ;WDVER=15, WPCVER=400002 + +BYTE(4)N(5)L(3)X(6)N(18)0 LOC OF WHOLE DWG OR PC CARD (IF ANY) + +MD,< + XWD 0,# OF POLARITY ERRORS IN THIS DRAWING + DRWDAT + DRWNAM + DRWEXT,,0 + DRWPPN + ASCIZ/REVISION STRING/ + ASCIZ/MODULE STRING/ + asciz/variable string/ + asciz/prefix string/ + ASCIZ/AUTHOR STRING/ + ASCIZ/TITLE LINE 1/ + ASCIZ/TITLE LINE 2/ + ASCIZ/PROJECT STRING/ + ASCIZ/PAGE STRING/ + ASCIZ/OF STRING/ + ASCIZ/NEXT HIGHER REVISION/ + ASCIZ/NOMENCLATURE TYPE/ + ASCIZ/BOARD TYPE/ +-------- +! BYTE(9)APPROX X,APPROX Y(18)BODY ID +! B-R-S,, SOCKET LOC OF BODY +! XWD BODY BITS , 0 +! ASCIZ/BODY NAME/ +! ASCIZ /PACKAGE NAME/ ;EITHER DEFAULT FORM DIPS.DIP, OR USER SPECIFIED +! -------- +! ! asciz/property name/ (like "diptype") +! ! asciz/property value/ (like "10101") +! -------- +! 0 +-------- +0 +>;MD + +MPC,< + ASCIZ/NOMENCLATURE TYPE/ +-------- +! XWD # OF PINS , BODY ID +! XWD BODY BITS , BYTE(6)L(12)N LOC OF BODY +! ASCIZ/DIP NAME/ +-------- +0 +>;MPC +-------- +! -------- +! ! ASCIZ/SIGNAL NAME/ +! -------- +! 0 +! --- PIN CPIN +! ! 0,,BODY ID CPIN-LOC,,B-R-S +! ! md,,,pin # byte(9)approx x,approx y(18)CPIN ID +! ! md, +! --- +! 0 (6)L,L,N REPLACED BY (6)L(12)4000+N FOR "U" PIN +! RUN BITS +-------- +0 +0 + 'DAT' ROUTER INPUT/OUTPUT FILES + +FOR20.DAT +-------- +! I4 I4 I4 +! ------------------------- +! ! ! ! ! PINS AND SIGNAL #'S TO +! ! X ! Y ! SIG # ! CONNECT TO THEM. +! !-------!-------!-------! 0 FOR NO CONNECTION +! X=2 FOR LEFT END EDGE FRONT +! X=255 FOR RIGHT END EDGE FRONT +! X=258 FOR LEFT END EDGE BACK +! X=511 FOR RIGHT END EDGE BACK +! Y=CLOSEST GRID TO CONNECTOR +! Y=201 MEANS WILD +!------- SIG # OF 1023 FOR NEVER CONNECT HERE + + 0 0 0 + +-------- +! I4 I4 I4 I4 +! --------------------------------- +! ! ! ! ! ! +! ! X ! Y ! X ! Y ! ENDPOINTS OF EXISTING SEGMENTS +! !-------!-------!-------!-------! +!------- + + 0 0 0 0 + + +WIREA.DAT . . . ETC. ********************** + +-------- +! -------- I4 I4 +! ! ----------------- +! ! ! ! ! +! ! ! X ! Y ! INTERMEDIATE POINTS ON RUN +! ! !-------!-------! +! !------- +! +! 0 0 END OF RUN +!------- + + 0 0 END OF FILE + CARD.TAB FILE FORMAT + +FMARK= 400000,,0 +CMARK= 0,,400000 +-------- +! -------- +! ! X,Y'S OF CARD OUTLINE +! -------- +! FMARK +! -------- +! ! X,Y START FINGER (CONNECTION END) +! FRONT ! X,Y END FINGER +! ! BYTE (6)0,0,0,L,L,N +! -------- +! FMARK +! -------- +! ! X,Y START FINGER (CONNECTION END) +! BACK ! X,Y END FINGER +! ! BYTE (6)0,0,0,L,L,N +! -------- +! FMARK +! -------- +! FRONT ! X,Y START OF SHORTING BAR +! ! X,Y END +! -------- +! FMARK +! -------- +! BACK ! X,Y START OF SHORTING BAR +! ! X,Y END +! -------- +! CMARK +-------- +CMARK + WIRELISTER DATA STRUCTURES + +SEE PAGE 4 OF WL FOR DATA STRUCTURES + DIPS.DIP FILE FORMAT + +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 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 + ... + + +- ;DIPVER = 5 +-------- +! # OF PINS +! ASCIZ/DIPNAME/ +! ASCIZ/PACKAGE NAME/ ;If any +! ------------ +! ! ASCIZ /property names/ ;In order of greater specificity +! ------------ +! 0 +! ------------ ;Sub-property values correspond to sequence +! ! ; of property names above +! ! ASCIZ /property value/ ;Most significant property +! ! 0 ,, +! ! ------------ +! ! ! ASCIZ /sub-property/ ;Next most significant property +! ! ! 0 ,, +! ! ! ... (subtree) ... +! ! ------------ +! ! 0 +! ------------ +! 0 +! ------------ +! ! 0 ,, PIN NAME +! ! BITS ,, PS # +! ! HI ,, LOW LOADING ;SIGNED HALFWORDS, IN .01 MA UNITS +! ! SIXBIT/USE/ ;FOR POWER PINS, HI IS REPLACED +! ! ; BY VOLTAGE IN .01 VOLT UNITS +! ! ; LOW BY SUPPLY CURRENT IN .01 MA UNITS +! ! SECT BITS,,1ST SECT PIN # +! ------------ +-------- +0 + 'WWC' FILE FORMAT + +1--------------------------..........---- +! ! +! ! +!-------!-------!-------!--..........---! + . + . +1 9---------------25------33------41------49------57------65------73------81------89----------101---------113 + ! ! !! TYPE> ! ! NAME> ! POS.>! !!LEN.&Z>! ! + !-------!-------!-------!-------!-------!-------!-------!-------!-------!-------!-----------!-----------! +EXAMPLE: + B10(06+2) OC 74S113 CLKFOO ARS (B3) 5.000 7.150 TFU 16.1 ^ B10(G3) Z3 B10(G3) Z2 + + ANY STRING OF CHARS NOT INCLUDING TAB + + LN(N) PLAIN DIP PIN + LN(N+) ADD 1 TO PIN # TO GET SOCKET PIN # + LN(N+2) ADD 2 TO PIN # TO GET SOCKET PIN # + L(LN) CONNECTOR PIN + + I INPUT + IS INPUT (LOAD SHARING) + O OUTPUT + OT OUTPUT (TRI-STATE) + OC OUTPUT (OPEN COLLECTOR) + OP OUTPUT (PULLUP) + VCC POWER + GND GROUND + NC NO CONNECTION (ERROR) + CON CONNECTOR + UN UNDEFINED + + FIRST 7 CHARS OF NAME + + 0-6 CHARS + + 1-6 CHARS + + + + 1-5 DIGITS X OR Y OF PIN (IN MILS) + + 0-7 LETTERS (SINGLE LETTER FLAGS) + + LENGTH OF WIRE FROM THIS PIN TO NEXT + + I.E. LNN(GNN) Z3 + 'DAT' PARTITION OUTPUT FILE FORMAT + +PARTITION FILE FROM WL TO WAGNERS PARTITIONING PROG +DIP INFO AND LOGIC DESCRIPTION IN ONE FILE! + +DIP INFO: + + I5 I5 I5 I5 I5 I5 A5 A5 +----------------------------------------------------------------- +! ! PINS/ !UNITS/ ! ! ! ! ! ! +! DIP # ! UNIT ! PKG ! #PINS ! VCC # ! GND # ! DIP NAME ! +!-------!-------!-------!-------!-------!-------!-------!-------! + + I5 I5 I5 +----------------- --------- +! PIN 1 ! PIN 2 ! ! PIN N ! +! SEC 1 ! SEC 1 !.......................................................! SEC M ! +!-------!-------! !-------! + +ENDS WITH 0 DIP # + +LOGIC DESCRITION: + + O12 O12 I5 I5 I5 +--------------------------------------------------------- +! ! ! ! ! ! ! ! Y 1-16 PRE-PLACED +!SLICE #!BODY ID! FILE NAME ! DIP # ! X ! Y ! Y 22 PRE-PLACED WILD LOC +!-------!-------!-------!-------!-------!-------!-------! + + I5 I5 I5 +----------------- --------- +! PIN 1 ! PIN 2 ! ! PIN N ! +! SIG # ! SIG # !.......! SIG # ! +!-------!-------! !-------! + + O6 O6 O6 +----------------- --------- +! PIN 1 ! PIN 2 ! ! PIN N ! +! ID ! ID !.......! ID ! +!-------!-------! !-------! + +ENDS WITH 0 SLICE # AND 0 BODY ID + + O6 O12 I3 I5 +----------------------------------------- +! ! ! !PADDLE#! ! PADDLE # = 1-6 +!CPIN ID! FILE NAME !& PIN #! SIG # ! PIN # = 1-36 +!-------!-------!-------!-------!-------! ODD ON FRONT, EVEN ON BACK + 0 PIN # MEANS "WILD CARD" +ENDS WITH 0 CPIN ID + +SPECIAL SIG #'S: + 1 NC + 2 VCC + 3 GND + 'DAT' PARTITION INPUT FILE FORMAT + +------ I5 I5 A5 A5 +! --------------------------------- +! ! ! ! ! ! +! ! X POS ! Y POS ! DIP NAME ! +! !-------!-------!-------!-------! +! ------ +! ! O12 O12 +! ! --------------------------------- +! ! ! ! ! ! ! +! ! !SLICE #!BODY ID! FILE NAME ! +! ! !-------!-------!-------!-------! +! ! +! ! O6 I5 O6 I5 O6 I5 +! ! --------------------------------- ---------------- +! ! ! PIN 1 ! PIN 2 ! ! PIN N ! +! ! ! ID ! # ! ID ! # !.......! ID ! # ! +! ! !-------!-------!-------!-------! !-------!-------! +! ------ +! +! 0 +------ + 0 0 + +------ O6 O12 I3 +! --------------------------------- +! ! ! ! !PADDLE#! +! !CPIN ID! FILE NAME !& PIN #! +! !-------!-------!-------!-------! +------ + 0 + 'BAC' BACK PANEL WIRE LIST FILE + + VERSION # +-------- +! card loc +! -------- ONE OF THESE BLOCKS FOR EACH DWG OF this card +! ! DRWNAM +! ! DRWEXT,,0 +! ! DRWPPN +! ! DRWDAT +! ! ASCIZ/REVISION STRING/ +! ! ASCIZ/MODULE STRING/ +! ! asciz/variable string/ +! ! asciz/prefix string/ +! ! ASCIZ/AUTHOR STRING/ +! ! ASCIZ/TITLE LINE 1/ +! ! ASCIZ/TITLE LINE 2/ +! ! ASCIZ/PROJECT STRING/ +! ! ASCIZ/PAGE STRING/ +! ! ASCIZ/OF STRING/ +! ! ASCIZ/NEXT HIGHER ASSEMBLY/ ?? +! ! ASCIZ/NOMENCLATURE TYPE/ +! ! ASCIZ/BOARD TYPE/ +! -------- +! 0 +! -------- +! ! WBITS,,TBITS +! ! HI,,LOW INPUT LOADING +! ! HI,,LOW OUTPUT LOADING +! ! DRWNAM --------! +! ! DRWEXT,,0 !----- OF SOURCE PIN OR SINGLE 0 IF NONE +! ! DRWPPN --------! +! ! -------- +! ! ! ASCIZ/SIGNAL NAME/ +! ! -------- +! ! 0 +! ! -------- +! ! ! PPS,,CPIN ID +! ! ! 0,,byte(9)approx x,approx y +! ! ! DRWNAM +! ! ! DRWEXT,,0 +! ! ! DRWPPN THESE ARE MATCHED AGAINST FILE BLOCKS ABOVE +! ! -------- +! ! 0 +! -------- +! 0 +! -------- +! ! asciz/diptype/ +! ! -------- +! ! ! APPROX COUNT (0 MEANS REAL COUNT IS CORRECT) +! ! ! REAL COUNT +! ! ! -------- +! ! ! ! asciz/property name/ +! ! ! ! asciz/property value/ +! ! ! -------- +! ! ! 0 +! ! -------- +! ! -1 +! -------- +! 0 +-------- +400000,,0 + +BRS= BAY-RACK-SLOT INFO + +PPS= PADDLE-PIN-SIDE INFO + 'TST' FILE FORMAT + +-------- +! ASCIZ/String name of dip type/ +! XWD 0, +! BYTE (4)N(5)L(3)X(6)N,L,N,0 location of body +-------- + 0 +-------- +! -------- +! ! ASCIZ/SIGNAL NAME/ +! -------- +! SIGNAL CODE +! +! ------ /-------BODY PIN---------------------\ /--CONNECTOR PIN---\ +! ! XWD , XWD 0,BYTE (6) L,L,N +! ------ +! 0 +-------- + 0 + + +SIGNAL CODE: + 0 REGULAR SIGNAL + 1 GND + 2 HI + 3 VCC + 'WDR' FILE FORMAT + +VERSION # +------ +! ----- +! ! ASCIZ/SIGNAL NAME/ +! ----- +! 0 +! --- PIN CPIN +! ! BODY ID BYTE(6)L,L,N(4)N(5)L(3)X(6)N +! ! TYPE BITS,,PIN # OR ID . . . . . . . . . . . . . . . OF SOCKET NOT DIP +! ! BYTE(4)N(5)L(3)X(6)N,L(12)N +! --- +! 0 +------ +0 +0 + (6)L,N,N REPLACED BY (6)N(12)4000+N FOR "U" PINS + 'LES' FILE FORMAT + +FORMAT OF LOGIC ERROR SUMMARY FROM WL TO D: + +VERSION # + +-------- +! ERROR CODE # +! -------- +! ! ERROR LIST (SEE BELOW) +! -------- +-------- + 0 + +ERROR CODES AND LIST FORMATS: + +ERROR CODE = 1 WIRES + + ASCIZ/ERROR HEADING/ + -------- + ! -------- + ! ! ASCIZ/SIGNAL NAME/ + ! -------- + ! 0 + ! -------- + ! ! PIN ID + ! ! FILENAME + ! -------- + ! 0 + -------- + 0 + 'REF' INTERNAL FORMAT + +SIGLST ! ---!--- + ! / ! \ + !-------! ! + / + -- + / + ! + \!/ + ------- V + --!-->! \ ---!-------> NEXT SIGNAL NAME + / ! ! ! ! / ! ALPHABETICALLY +! ! !-------!-------! +! ! -!--- ---!-------> STRING SIGNAL NAME +! ! ! ! \ ! / ! +! ! ! !-------!-------! +! ! \ +! ! \-------> NEXT SIGNAL NAME +! ! FOR THIS WIRE +! \--------- +! \ +! ! WIRE +! \!/ HEADER +! V +! ! ---!---- +! ! ! ! \ +! !-------!-------! ! + \------!--- ! ! + ! \ ! ! ! + !-------!-------! ! + ! + -----------/ + / + ! + \!/ + V ONE OF THESE PER FILE + --------------------------------->! ! + ! / ! ! ! + ! ! ! ---!-------> NEXT FILE !---------------! + !-------!-------! ENTRY ! ! + ! COUNTS ! ! FILENAME ! + !SIGS !PINS!CONS! !---------------! + !-----!----!----! diff --git a/doc/draw/dscr.txt b/doc/draw/dscr.txt new file mode 100644 index 00000000..642b6d70 --- /dev/null +++ b/doc/draw/dscr.txt @@ -0,0 +1,1139 @@ +STANFORD DRAWING SYSTEM DATA STRUCTURES + +THE FOLLOWING IS AN EXAMPLE OF THE DOCUMENTATION FORMAT +FOR BINARY FILES DESCRIBED HEREIN: + +-------- +! A +! B +! C +-------- +D + +THIS FORMAT MEANS THAT THE SEQUENCE OF WORDS A, B, AND C IS +REPEATED UNTIL THE VALUE OF A IS EQUAL TO D. + DWG PROG BODIES +DBODPN -------- + ! / ! \ + !-------! \ + \!/ + ------- V -------> NEXT + / ! \ / ! / + ! ! ! ! ! + ! !-------!-------! + ! ! ! + ! ! X Y ! + ! !-------!-------! + ! + !--> -------> PIN LINK + ! / ! + ! ORI ! ! + !-------!-------! + ----!--- ---!---> TYPE + / ! \ / ! + ! !-------!-------! + ! + ! + !--> ! ! +PC ! BID L-N ! BYTE(6)L(12)N +PROG !-------!-------! + ! ! BODY ---!---> DIP TYPE NAME STRING + ! ! BITS / ! + ! !-------!-------! + ! + !--> ! ---!--- +LOGIC ! BID / ! \ +PROG !-------!-------! ! + ! BODY ! ! + ! BITS ---!----!--- + !-------!-------! ! \ + ------------------------/ ! + / \ FORM 1: FORM 2: + ! --->! ---!------>! ---!----> NEXT + ! ------!--- ! ! 0 ! + ! / !-------!-------! !-------!-------! + ! ! ! MAIN LOC. ! ! ! + ! ! ! X Y ! ! ---!----> POINTER INTO BODY TO + ! ! !-------!-------! !-------!-------! PROPERTY OR TEXT BLOCK + ! ! + ! \ --------------->TEXT PROPERTY NAME (0 IF NONE) + ! ----->! / ! FOR PROPERTY "DIPTYPE" LEFT HALF OF FIRST BLOCK IS DIP DEF LIST + ! ! ! ---!---->TEXT VALUE + ! !-------!-------! (0 SIZE FOR NORMALLY NOT DISPLAYED) + ! !CONSTANT OFFSET! + ! ! X Y ! + ! !-------!-------! + ! --------------- + ! / \ + !--> ! / ! \------>! ! + ! ! ! !N-L-X-N L-N ! BYTE(4)N(5)L(3)X(6)N,L(12)N + !-------!-------! !-------!-------! WHERE X IS THE HEIGHT OF THE CARD + ! ! ! ! + ! X Y ! CONSTANT ! X Y ! CONSTANT + !-------!-------! OFFSET !-------!-------! CHAR OFFSET + +STANDARD TEXT FORMAT: + +------------> ! ----!------> ! CHAR ----!---> NEXT 5 + ! ! ! SIZE ! CHARS + !-------!-------! !-------!-------! + !CONSTANT OFFSET! ! ! + ! X Y ! ! 5 CHARS ! + !-------!-------! !---------------! +OFFSET IS SCALED WITH TEXT SIZE, NOT DRAWING SCALE. + POINTS +PONPNT ------- + ! / ! \ + !-------! ! + / + / + \!/ + ------ V ------ + / ! \ / ! \ + ! ! ! ! ! ! + ! !-------!-------! ! + ! ! ! ! + ! ! X Y ! ! + ! !-------!-------! ! + ! ! + !-> -------!--> PIN LINK + ! / ! ! + ! BODY ! ! ! + !-------!-------! ! + --!--- ---!---!--> ! ---!-------> PIN BLOCK + / ! \ / ! ! ! TEXT / ! IN TYPE + ! !-------!-------! ! !-------!-------! + ! ! ! PIN OR! + !--> ! ! BITS PAD # ! + ! ! ! !-------!-------! + ! NEIGHBORS ! ! + !-------!-------! ! + ! ! ! + ! NEIGHBORS ! ! + !-------!-------! ! + \!/ + V + NEXT POINT + + FROM LAST POINT + ! + ------/ + / + / + \!/ + ------ V -----------> NEXT + / ! \ / ! + ! ! ! ! ! + ! !-------!-------! + ! ! ! + ! ! X Y ! + ! !-------!-------! + ! + !-> + ! FEED ! + ! OR 0 PID ! + !-------!-------! + --!--- ---!------> ! ---!-- IF CPIN + / ! \ / ! ! TEXT / ! \ ON IN + ! !-------!-------! !-------!-------! ! BITS, + ! ! PIN OR! ! ELSE 0 + !--> ! BITS PAD # ! ! + ! ! !-------!-------! ! + ! NEIGHBORS ! / + !-------!-------! --------------/ + ! ! / + ! NEIGHBORS ! \!/ + !-------!-------! V + + LOGIC DRAWINGS PC CARD DRAWINGS + ! ! ! ! + ------------>!N-L-X-N L-L-N ! ! 0 L-L-N ! + / !-------!-------! !-------!-------! + ! ! ! ! ! OTHER END + ! ! X Y ! ! X Y ! OF FINGER + ! !-------!-------! !-------!-------! + ! CONSTANT OFFSET +BYTE(4)N(5)L(3)X(6)N,L,L,N + +WHERE X IS THE HEIGHT OF THE CARD IN PADDLES -1 + INTERNAL PC CARD FORMAT + +CRDLST -------------------> OTHER SIDE EDGE LIST + / + ! ! ! ---!--- + !-------!-------! \ + ! + ----------/ + / + ! + \!/ + V + + ! ! + ! ! ---!--------> NEXT POINT ON EDGE + !-------!-------! + ! ! + ! X ! Y ! LOW ORDER BIT = 1 MEANS INVISIBLE + !-------!-------! VECTOR TO THIS POINT + + + +BARLST -------------------> OTHER SIDE SHORTING BAR LIST + / + ! ! ! ---!--- + !-------!-------! \ + ! + / + ---------- + / + ! PAIRS OF ENDPOINTS OF SHORTING BARS + \!/ + V + + ! ! ! ! + ! ! ---!-----> ! ! ---!---> NEXT PAIR OF + !-------!-------! !-------!-------! ENDPOINTS + ! ! ! ! + ! X ! Y ! ! X ! Y ! + !-------!-------! !-------!-------! + BODY DEF'S FOR LOGIC DRAWING VERSION + -------- + ! / ! \ + !-------! ! + ! + \!/ + V + ----------------------> LIBRARY + / POINTER + ! ! ! + ! ! ----!----------> TYPE NAME (LEFT HALF FIRST WORD + !-------!-------! IS DIP TYPE NAME POINTER) + ---!-- ---!----------> NEXT + / ! \ / ! TYPE + ! !-------!-------! ------------> SEE PIN + -!------- / BLOCK BELOW + / ! \ --------------> ! / ---!---> NEXT + ! ! ! \ / ! / ! / / ! PIN + ! !--->! ! ! ! !-------!-------! + ! !-------!-------! ! ! + ! ---!-- ---!---- ! X Y ! + ! / ! \ / ! \ !-------!-------! + ! ! !-------!-------! ! + ! ! ! + ! ! !----> ! ---!---> NEXT + ! ! ! / ! POINT + ! ! !-------!-------! + ! ! ! ! + ! ! ! X ! Y ! LOW ORDER BIT + ! ! !-------!-------! =0 VISIBLE + ! ! =1 INVISIBLE + ! \ + ! \ + ! ----------------->! ---!---->NEXT + ! ------!--- ! + ! / !-------!-------! + ! ! ! MAIN LOC. ! + ! ! ! X Y ! + ! ! !-------!-------! + ! ! + ! \ --------------->TEXT PROPERTY NAME (0 IF NONE) + ! ----->! / ! FOR PROPERTY "DIPTYPE" LEFT HALF OF FIRST BLOCK IS DIP DEF LIST + ! ! ! ---!---->TEXT VALUE + ! !-------!-------! (0 SIZE FOR NORMALLY NOT DISPLAYED) + ! !CONSTANT OFFSET! + ! ! X Y ! + ! !-------!-------! + ! + \ + \ + \--->! ! 0 IF USING ! ! + ! BITS ----!-------------->! UNUSED ! + !-------!-------! DEFAULT !-------!-------! + !DEF LOC OFFSET ! !DEF CHAR OFFSET! + ! X Y ! ! X Y ! + !-------!-------! !-------!-------! + +DIP DEF LIST (SEE ABOVE): + ! MAX ---!----------> ! SEC # ---!---> NEXT + ! SEC # ! ! BITS ! PIN + !-------!-------! !-------!-------! + ! ! ! ! + ! # OF PINS ! ! SECTION PIN # ! + !---------------! !---------------! + +PIN BLOCK: + ! PIN PIN ! + ! BITS ID ! + !-------!-------! + ! PIN PIN ! + ! POS NAME ! + !-------!-------! + +PIN POS: + BYTE(7)X(7)Y(4) 8 POSITION CODE + +X,Y ARE 2'S COMPLEMENT + + +TEXT IS STANDARD FORMAT + BODY DEF'S PC CARD DRAWINGS + ----- +! / ! \ +!-------! ! + ! + \!/ + V + ------------> NEXT BODY + ! # OF / ! + ! PINS ! ! + !-------!-------! + ---!--- ---!-----------> ! ---!------->NEXT PIN + / ! \ / ! ! PIN # / ! + ! !-------!-------! !-------!-------! + ! ! ! + ! ! X Y ! OF PIN LOCATION + !--->! ! !-------!-------! + ! ---!------> + !-------!-------! NEXT X,Y + ! ! + ! X Y ! + !-------!-------! X,Y'S OF BOX APPROXIMATING BODY + CORLST DATA BLOCK FORMATS + +TRANSPOSITION: + + !OLD TYPE ---!-------> NEXT BLOCK + !PIN BLK / ! + !-------!-------! + ! NEW TYPE! + ! PIN ID PIN BLK! + !-------!-------! + +DELETION: + + !OLD TYPE ---!-------> NEXT BLOCK + !PIN BLK / ! + !-------!-------! + ! ! + ! 0 0 ! + !-------!-------! + +NEW PIN: + + ! ---!-------> NEXT BLOCK + ! 0 / ! + !-------!-------! + ! NEW TYPE! + ! PIN ID PIN BLK! + !-------!-------! + SETS +SETPNT + ----- +! / ! \ +!-------! ! + ! + \!/ + V + -------------> NEXT SET + ---!--- / ! + / ! \ ! ! + ! !-------!-------! + ! ! ! + ! ! X Y ! SET CENTER + ! !-------!-------! + ! + ! + !--->! ---!---------> NEXT MEMBERS OF THIS SET + ! / ! + !-------!-------! + ! ! + ! BODY POINT ! + !-------!-------! + WIRLST + +WIRLST ! ---!--- + !--------! \ + ! + / + --- + / + ! + \!/ + V + ! ---!-------> NEXT WIRE + ! ! / ! -----------> PIN POINTER + !-------!-------! / + ! TYPE ---!------>! / ! ---!-------> NEXT BLOCK + ! BITS ! / ! ! ! / ! THIS WIRE + !-------!-------! !-------!-------! + ! ---!-------> AZ1 OR EZ1 + ! \ ! ! + !----\--!-------! + \--------------> A SIGNAL NAME + 'DRW' FILE FORMAT +LOGIC DRAWINGS +DESCRIPTION OF FILE DATA STRUCTURE + + + +IOVER (OLDEST VERSION DOES NOT HAVE THIS, BUT STARTS WITH A BODY NAME) +-------- +! ASCIZ/TYPE NAMES OF LIBRARY BODIES ACTUALLY USED IN THIS DWG/ +-------- +0 +-------- +! FILENAME +! EXT,,BITS ------- LIBRARIES +! PPN +-------- +0 +-------- +! ASCIZ STRING NAME OF BODY DEF +! ASCIZ STRING NAME OF DIP TYPE +! BITS,,UNUSED +! X,Y INITIAL BODY LOC OFFSET +! X,Y INITIAL BODY LOC CHAR OFFSET (400000 IF USING DEFAULT) +! -------- +! ! loc of pin (x,y) +! ! bits,,pinid (pinid is generated by program) +! ! pin pos,,pin name (default) +! -------- +! 400000 +! -------- +! ! POINTS DESCRIBING LINES IN TYPE (LOW ORDER BIT =1 IF VISIBLE LINE TO THIS POINT) +! -------- +! 400000 +! -------- +! ! ASCIZ VALUE TEXT +! ! ASCIZ PROPERTY NAME TEXT (0 IF TEXT ONLY) +! ! TEXT SIZE (0 IF NOT NORMALLY DISPLAYED) +! ! TEXT LOCATION +! ! CONSTANT OFFSET +! -------- +! 0 +-------- +0 +-------- +! ASCIZ/MACRO NAME/ +! BYTE(9)MACRO BODY ENDING WITH 0 BYTE +-------- +0 +-------- +! LOC OF BODY +! ORIENTATION+400000(IF LOCATION FOLLOWS) +! BYTE(4)N(5)L(3)X(6)N,L(12)N +! X,Y CONSTANT OFFSET OF LOCATION +! X,Y CHAR OFFSET OF LOCATION +! XWD BODY BITS , BODY ID (GENERATED) +! NAME OF TYPE USED TO GENERATE BODY (IN ASCIZ) +! -------- +! ! ASCIZ VALUE TEXT +! ! ASCIZ PROPERTY NAME TEXT (0 FOR TEXT ONLY) (THESE ARE PROPERTIES WHICH DIFFER FROM DEFINITION) +! ! TEXT SIZE +! ! TEXT LOCATION +! ! CONSTANT OFFSET +! -------- +! 0 +-------- +400000 +-------- +! LOC OF POINT +! POINT ID (GENERATED) +! ID OF DOWN(0 IF NONE) +! ID OF UP(0 IF NONE) +! ID OF LEFT(0 IF NONE) +! ID OF RIGHT(0 IF NONE) +! XWD BITS,PIN # +! SIZE OF TEXT (0 IF NONE) +! X,Y CONSTANT OFFSET FROM POINT LOC +! ASCIZ TEXT(IF ANY) +! BYTE (4)N(5)L(3)X(6)N,L,L,N------\ IF CPIN ON IN BITS +! X,Y CONSTANT OFFSET--------------/ (6)L,L,N REPLACED BY (6)L(12)4000+N FOR "U" PIN +-------- +400000 +-------- +! LOC OF SET CENTER +! -------- +! ! BODY ID +! -------- +! 0 +! -------- +! ! POINT ID +! -------- +! 0 +-------- +400000 + +ASCIZ STRING DRAWN BY +ASCIZ STRING TITLE LINE 1 +ASCIZ STRING TITLE LINE 2 +BYTE(4)N(5)L(3)X(6)N(18)0 CARD LOC FOR WHOLE DWG +ASCIZ REVISION STRING +ASCIZ MODULE STRING +asciz variable string +asciz prefix string +ASCIZ PROJECT STRING +ASCIZ PAGE STRING +ASCIZ OF STRING +ASCIZ SITE LINE 1 STRING +ASCIZ SITE LINE 2 STRING +DEC,< +ASCIZ NEXT HIGHER ASSEMBLY NUMBER STRING + 0 OR DRNNAM + DRNEXT,,DRNDAT + DRNPPN + 0 OR CHKNAM + CHKEXT,,CHKDAT + CHKPPN + 0 OR ENGNAM + ENGEXT,,ENGDAT + ENGPPN +>;DEC + +ASCIZ BOARD TYPE + +0 + +POINT ID IS GENERATED FOR POINTS OR XWD PIN ID,BID FOR PINS + 'PC' FILE FORMAT +PC CARD DRAWINGS +DESCRIPTION OF FILE DATA STRUCTURE + + +IOVER +-------- +! ASCIZ/MACRO NAME/ +! BYTE(9)MACRO BODY ENDING WITH 0 BYTE +-------- +0 +-------- +! LOC OF BODY +! ASCIZ STRING NAME OF DIP TYPE +! BYTE (6)L(12)N(18)ORIENTATION +! XWD BODY BITS, BODY ID +! XWD ,# OF PINS ON THIS DIP +-------- +400000 +-------- +! LOC OF POINT +! POINT ID +! -------- +! ! ID OF A NEIGHBOR +! -------- +! 0 +! XWD BITS,PAD NUMBER +! SIZE OF TEXT (0 IF NONE) +! X,Y CONSTANT OFFSET FROM POINT LOC +! ASCIZ TEXT(IF ANY) +! ID OF FEED THROUGH(0 IF NONE) +-------- +400000 +-------- +! +! SIDE 2 POINTS +! +-------- +400000 +-------- +! LOC OF SET CENTER +! -------- +! ! BODY ID +! -------- +! 0 +! -------- +! ! POINT ID +! -------- +! 0 +-------- +400001 + +ASCIZ BOARD TYPE + +CARD LOCATION BYTE (4)N(5)L(3)X(6)N(18)0 + + --------! +CARD FILENAME: FILNAM ! + EXT,,0 !--- OR 0 IF NONE + PPN ! + --------! + +0 + +POINT ID IS EITHER GENERATED NUMBER OR XWD PIN ID,BID + 'PLT' 'PCP' FILE FORMAT + +LOW ORDER BIT OFF ALWAYS STARTS NEW COMMAND! + +VERSION# +LINES: +-------- +! XWD X*2,Y*2 LOW ORDER BIT OF LEFT HALF OFF MEANS +! XWD X*2,Y*2+1 THIS COMMAND IS A BUNCH OF POINTS +! XWD X*2,Y*2+1 JOINED BY VECTORS. ENDS WITH START OF +! . NEW COMMAND (LOW ORDER BIT OFF AGAIN) +! . +! . +! XWD X*2,Y*2+1 +-------- + +TEXT: +-------- +! XWD X*2+1,Y*2 ONE IN LEFT HALF MEANS TEXT +! XWD 0,ROTATION+SIZE*2+1 ZERO IN LH MEANS TEXT, NOT DIAMOND OR DRILL HOLE +! ASCII/5 CHARS OF TEXT/+1 +-------- + +;ROTATION = 0 NORMAL UPRIGHT CHARS +;ROTATION = 400000 ROTATED 90 DEGREES CCW + +SMALL DIAMOND TO INDICATE JUNCTION OF 3 OR 4 LINES (PLT) + OR +DRILL HOLE (PCP): +-------- +! XWD X*2+1,Y*2 +! XWD 2,1 2 IN LEFT HALF MEANS DIAMOND (OR DRILL HOLE) +-------- + +MPC,< +-------- +! XWD X*2+1,Y*2 +! XWD 4,*2+1 +-------- +THE PLOT PROGRAM KNOWS ABOUT THE VARIOUS PAD TYPES +>;MPC + +******** THE PRECEEDING FORMATS MAY BE MIXED IN ANY ORDER UNTIL + A WORD WITH LEFT HALF = 400001 IS SEEN. THEN THE + FILE ENDS WITH THE FOLLOWING: + +MPC,< 400001,,0 +400000 IF FRONT SIDE + +200000 IF INNER PLANE + BITS BIT 35 = FLIPPED PLOT + + CARD FILENAME: --------! + CRDNAM ! + CRDEXT !---- OR 0 IF NONE + CRDPPN ! + --------! +>;MPC +MD,< 400001,,*2 0=NONE + 1=A + 2=B ETC. + + ASCIZ/STRING TO GO IN BOX MARKED "DRAWN BY"/ + + ASCIZ/FIRST LINE TO GO IN TITLE BOX/ + + ASCIZ/SECOND LINE TO GO IN TITLE BOX/ + 'DRW' FILE DATE AND TIME LAST WRITTEN + 'DRW' FILE NAME + 'DRW' FILE PPN + CARD LOCATION + + ASCIZ/REVISION STRING/ + + ASCIZ/drawing number STRING/ + + ASCIZ/PROJECT STRING/ + + ASCIZ/PAGE STRING/ + + ASCIZ/OF STRING/ + + ASCIZ/SITE LINE 1 STRING/ + + ASCIZ/SITE LINE 2 STRING/ + +DEC,< + + ASCIZ/NEXT HIGHER ASSEMBLY NUMBER STRING/ + + 0 OR DRNNAM + DRNEXT,,DRNDAT + DRNPPN + + 0 OR CHKNAM + CHKEXT,,CHKDAT + CHKPPN + + 0 OR ENGNAM + ENGEXT,,ENGDAT + ENGPPN + +>;DEC +>;MD + 'WD' 'WPC' FILE FORMAT + +VERSION # + +BYTE(4)N(5)L(3)X(6)N(18)0 LOC OF WHOLE DWG OR PC CARD (IF ANY) + +MD,< + XWD 0,# OF POLARITY ERRORS IN THIS DRAWING + DRWDAT + DRWNAM + DRWPPN + ASCIZ/REVISION STRING/ + ASCIZ/MODULE STRING/ + asciz/variable string/ + asciz/prefix string/ + ASCIZ/AUTHOR STRING/ + ASCIZ/TITLE LINE 1/ + ASCIZ/TITLE LINE 2/ + ASCIZ/PROJECT STRING/ + ASCIZ/PAGE STRING/ + ASCIZ/OF STRING/ + + ASCIZ/BOARD TYPE/ +-------- +! BYTE(9)APPROX X,APPROX Y(18)BODY ID +! BYTE(4)N(5)L(3)X(6)N,L(12)N LOC OF BODY +! XWD BODY BITS , 0 +! ASCIZ/BODY NAME/ +! -------- +! ! asciz/property name/ (like "diptype") +! ! asciz/property value/ (like "10101") +! -------- +! 0 +-------- +0 +>;MD + +MPC,< + ASCIZ/BOARD TYPE/ +-------- +! XWD # OF PINS , BODY ID +! XWD BODY BITS , BYTE(6)L(12)N LOC OF BODY +! ASCIZ/DIP NAME/ +-------- +0 +>;MPC +-------- +! -------- +! ! ASCIZ/SIGNAL NAME/ +! -------- +! 0 +! --- PIN CPIN +! ! 0,,BODY ID BYTE(6)L,L,N(4)N(5)L(3)X(6)N +! ! md,,,pin # byte(9)approx x,approx y(18)CPIN ID +! ! md, +! --- +! 0 (6)L,L,N REPLACED BY (6)L(12)4000+N FOR "U" PIN +! RUN BITS +-------- +0 +0 + 'DAT' ROUTER INPUT/OUTPUT FILES + +FOR20.DAT +-------- +! I4 I4 I4 +! ------------------------- +! ! ! ! ! PINS AND SIGNAL #'S TO +! ! X ! Y ! SIG # ! CONNECT TO THEM. +! !-------!-------!-------! 0 FOR NO CONNECTION +! X=2 FOR LEFT END EDGE FRONT +! X=255 FOR RIGHT END EDGE FRONT +! X=258 FOR LEFT END EDGE BACK +! X=511 FOR RIGHT END EDGE BACK +! Y=CLOSEST GRID TO CONNECTOR +! Y=201 MEANS WILD +!------- SIG # OF 1023 FOR NEVER CONNECT HERE + + 0 0 0 + +-------- +! I4 I4 I4 I4 +! --------------------------------- +! ! ! ! ! ! +! ! X ! Y ! X ! Y ! ENDPOINTS OF EXISTING SEGMENTS +! !-------!-------!-------!-------! +!------- + + 0 0 0 0 + + +WIREA.DAT . . . ETC. ********************** + +-------- +! -------- I4 I4 +! ! ----------------- +! ! ! ! ! +! ! ! X ! Y ! INTERMEDIATE POINTS ON RUN +! ! !-------!-------! +! !------- +! +! 0 0 END OF RUN +!------- + + 0 0 END OF FILE + CARD.TAB FILE FORMAT + +FMARK= 400000,,0 +CMARK= 0,,400000 +-------- +! -------- +! ! X,Y'S OF CARD OUTLINE +! -------- +! FMARK +! -------- +! ! X,Y START FINGER (CONNECTION END) +! FRONT ! X,Y END FINGER +! ! BYTE (6)0,0,0,L,L,N +! -------- +! FMARK +! -------- +! ! X,Y START FINGER (CONNECTION END) +! BACK ! X,Y END FINGER +! ! BYTE (6)0,0,0,L,L,N +! -------- +! FMARK +! -------- +! FRONT ! X,Y START OF SHORTING BAR +! ! X,Y END +! -------- +! FMARK +! -------- +! BACK ! X,Y START OF SHORTING BAR +! ! X,Y END +! -------- +! CMARK +-------- +CMARK + WIRELISTER DATA STRUCTURES + +SEE PAGE 4 OF WL FOR DATA STRUCTURES + DIPS.DIP FILE FORMAT + + + +-------- +! # OF PINS +! ASCIZ/DIPNAME/ +! ASCIZ/PART NUMBER STRING/ +! -------- +! ! XWD BITS,PS # +! ! XWD HI,LOW LOADING SIGNED HALFWORDS, IN .01 MA UNITS +! ! SIXBIT/USE/ FOR POWER PINS, HI IS REPLACED BY VOLTAGE IN .01 VOLT UNITS + LOW BY SUPPLY CURRENT IN .01 MA UNITS +! ! SECT BITS,,1ST SECT PIN # +! -------- +-------- +0 + 'WWC' FILE FORMAT + +1--------------------------..........---- +! ! +! ! +!-------!-------!-------!--..........---! + . + . +1 9---------------25------33------41------49------57------65------73------81------89----------101---------113 + ! ! !! TYPE> ! ! NAME> ! POS.>! !!LEN.&Z>! ! + !-------!-------!-------!-------!-------!-------!-------!-------!-------!-------!-----------!-----------! +EXAMPLE: + B10(06+2) OC 74S113 CLKFOO ARS (B3) 5.000 7.150 TFU 16.1 ^ B10(G3) Z3 B10(G3) Z2 + + ANY STRING OF CHARS NOT INCLUDING TAB + + LN(N) PLAIN DIP PIN + LN(N+) ADD 1 TO PIN # TO GET SOCKET PIN # + LN(N+2) ADD 2 TO PIN # TO GET SOCKET PIN # + L(LN) CONNECTOR PIN + + I INPUT + IS INPUT (LOAD SHARING) + O OUTPUT + OT OUTPUT (TRI-STATE) + OC OUTPUT (OPEN COLLECTOR) + OP OUTPUT (PULLUP) + VCC POWER + GND GROUND + NC NO CONNECTION (ERROR) + CON CONNECTOR + UN UNDEFINED + + FIRST 7 CHARS OF NAME + + 0-6 CHARS + + 1-6 CHARS + + + + 1-5 DIGITS X OR Y OF PIN (IN MILS) + + 0-7 LETTERS (SINGLE LETTER FLAGS) + + LENGTH OF WIRE FROM THIS PIN TO NEXT + + I.E. LNN(GNN) Z3 + 'DAT' PARTITION OUTPUT FILE FORMAT + +PARTITION FILE FROM WL TO WAGNERS PARTITIONING PROG +DIP INFO AND LOGIC DESCRIPTION IN ONE FILE! + +DIP INFO: + + I5 I5 I5 I5 I5 I5 A5 A5 +----------------------------------------------------------------- +! ! PINS/ !UNITS/ ! ! ! ! ! ! +! DIP # ! UNIT ! PKG ! #PINS ! VCC # ! GND # ! DIP NAME ! +!-------!-------!-------!-------!-------!-------!-------!-------! + + I5 I5 I5 +----------------- --------- +! PIN 1 ! PIN 2 ! ! PIN N ! +! SEC 1 ! SEC 1 !.......................................................! SEC M ! +!-------!-------! !-------! + +ENDS WITH 0 DIP # + +LOGIC DESCRITION: + + O12 O12 I5 I5 I5 +--------------------------------------------------------- +! ! ! ! ! ! ! ! Y 1-16 PRE-PLACED +!SLICE #!BODY ID! FILE NAME ! DIP # ! X ! Y ! Y 22 PRE-PLACED WILD LOC +!-------!-------!-------!-------!-------!-------!-------! + + I5 I5 I5 +----------------- --------- +! PIN 1 ! PIN 2 ! ! PIN N ! +! SIG # ! SIG # !.......! SIG # ! +!-------!-------! !-------! + + O6 O6 O6 +----------------- --------- +! PIN 1 ! PIN 2 ! ! PIN N ! +! ID ! ID !.......! ID ! +!-------!-------! !-------! + +ENDS WITH 0 SLICE # AND 0 BODY ID + + O6 O12 I3 I5 +----------------------------------------- +! ! ! !PADDLE#! ! PADDLE # = 1-6 +!CPIN ID! FILE NAME !& PIN #! SIG # ! PIN # = 1-36 +!-------!-------!-------!-------!-------! ODD ON FRONT, EVEN ON BACK + 0 PIN # MEANS "WILD CARD" +ENDS WITH 0 CPIN ID + +SPECIAL SIG #'S: + 1 NC + 2 VCC + 3 GND + 'DAT' PARTITION INPUT FILE FORMAT + +------ I5 I5 A5 A5 +! --------------------------------- +! ! ! ! ! ! +! ! X POS ! Y POS ! DIP NAME ! +! !-------!-------!-------!-------! +! ------ +! ! O12 O12 +! ! --------------------------------- +! ! ! ! ! ! ! +! ! !SLICE #!BODY ID! FILE NAME ! +! ! !-------!-------!-------!-------! +! ! +! ! O6 I5 O6 I5 O6 I5 +! ! --------------------------------- ---------------- +! ! ! PIN 1 ! PIN 2 ! ! PIN N ! +! ! ! ID ! # ! ID ! # !.......! ID ! # ! +! ! !-------!-------!-------!-------! !-------!-------! +! ------ +! +! 0 +------ + 0 0 + +------ O6 O12 I3 +! --------------------------------- +! ! ! ! !PADDLE#! +! !CPIN ID! FILE NAME !& PIN #! +! !-------!-------!-------!-------! +------ + 0 + 'BAC' BACK PANEL WIRE LIST FILE + + VERSION # +-------- +! card loc +! -------- ONE OF THESE BLOCKS FOR EACH DWG OF this card +! ! DRWNAM +! ! DRWPPN +! ! DRWDAT +! ! ASCIZ/REVISION STRING/ +! ! ASCIZ/MODULE STRING/ +! ! asciz/variable string/ +! ! asciz/prefix string/ +! ! ASCIZ/AUTHOR STRING/ +! ! ASCIZ/TITLE LINE 1/ +! ! ASCIZ/TITLE LINE 2/ +! ! ASCIZ/PROJECT STRING/ +! ! ASCIZ/PAGE STRING/ +! ! ASCIZ/OF STRING/ +! ! +! ! ASCIZ/BOARD TYPE/ +! -------- +! 0 +! -------- +! ! WBITS,,TBITS +! ! HI,,LOW INPUT LOADING +! ! HI,,LOW OUTPUT LOADING +! ! -------- +! ! ! ASCIZ/SIGNAL NAME/ +! ! -------- +! ! 0 +! ! -------- +! ! ! PPS,,CPIN ID +! ! ! 0,,byte(9)approx x,approx y +! ! ! DRWNAM +! ! ! DRWPPN THESE ARE MATCHED AGAINST FILE BLOCKS ABOVE +! ! -------- +! ! 0 +! -------- +! 0 +! -------- +! ! asciz/diptype/ +! ! -------- +! ! ! APPROX COUNT (0 MEANS REAL COUNT IS CORRECT) +! ! ! REAL COUNT +! ! ! -------- +! ! ! ! asciz/property name/ +! ! ! ! asciz/property value/ +! ! ! -------- +! ! ! 0 +! ! -------- +! ! -1 +! -------- +! 0 +-------- +400000,,0 + +BRS= BAY-RACK-SLOT INFO + +PPS= PADDLE-PIN-SIDE INFO + 'TST' FILE FORMAT + +-------- +! ASCIZ/String name of dip type/ +! XWD 0, +! BYTE (4)N(5)L(3)X(6)N,L,N,0 location of body +-------- + 0 +-------- +! -------- +! ! ASCIZ/SIGNAL NAME/ +! -------- +! SIGNAL CODE +! +! ------ /-------BODY PIN---------------------\ /--CONNECTOR PIN---\ +! ! XWD , XWD 0,BYTE (6) L,L,N +! ------ +! 0 +-------- + 0 + + +SIGNAL CODE: + 0 REGULAR SIGNAL + 1 GND + 2 HI + 3 VCC + 'WDR' FILE FORMAT + +VERSION # +------ +! ----- +! ! ASCIZ/SIGNAL NAME/ +! ----- +! 0 +! --- PIN CPIN +! ! BODY ID BYTE(6)L,L,N(4)N(5)L(3)X(6)N +! ! TYPE BITS,,PIN # OR ID . . . . . . . . . . . . . . . OF SOCKET NOT DIP +! ! BYTE(4)N(5)L(3)X(6)N,L(12)N +! --- +! 0 +------ +0 +0 + (6)L,N,N REPLACED BY (6)N(12)4000+N FOR "U" PINS + 'LES' FILE FORMAT + +FORMAT OF LOGIC ERROR SUMMARY FROM WL TO D: + +VERSION # + +-------- +! ERROR CODE # +! -------- +! ! ERROR LIST (SEE BELOW) +! -------- +-------- + 0 + +ERROR CODES AND LIST FORMATS: + +ERROR CODE = 1 WIRES + + ASCIZ/ERROR HEADING/ + -------- + ! -------- + ! ! ASCIZ/SIGNAL NAME/ + ! -------- + ! 0 + ! -------- + ! ! PIN ID + ! ! FILENAME + ! -------- + ! 0 + -------- + 0 + 'REF' INTERNAL FORMAT + +SIGLST ! ---!--- + ! / ! \ + !-------! ! + / + -- + / + ! + \!/ + ------- V + --!-->! \ ---!-------> NEXT SIGNAL NAME + / ! ! ! ! / ! ALPHABETICALLY +! ! !-------!-------! +! ! -!--- ---!-------> STRING SIGNAL NAME +! ! ! ! \ ! / ! +! ! ! !-------!-------! +! ! \ +! ! \-------> NEXT SIGNAL NAME +! ! FOR THIS WIRE +! \--------- +! \ +! ! WIRE +! \!/ HEADER +! V +! ! ---!---- +! ! ! ! \ +! !-------!-------! ! + \------!--- ! ! + ! \ ! ! ! + !-------!-------! ! + ! + -----------/ + / + ! + \!/ + V ONE OF THESE PER FILE + --------------------------------->! ! + ! / ! ! ! + ! ! ! ---!-------> NEXT FILE !---------------! + !-------!-------! ENTRY ! ! + ! COUNTS ! ! FILENAME ! + !SIGS !PINS!CONS! !---------------! + !-----!----!----! + \ No newline at end of file diff --git a/doc/draw/notes.4 b/doc/draw/notes.4 new file mode 100644 index 00000000..20a95e8b --- /dev/null +++ b/doc/draw/notes.4 @@ -0,0 +1,109 @@ +;BODY/TYPE PROPERTY ROUTINES + +;FPROP - FIND BODY DEF PROPERTY + ;T = STRING PROPERTY NAME + ;A = TYPE + ;SKIP RETURNS + ;T = PROPERTY BLOCK POINTER + ; (TTT NOW CONTAINS STRING POINTER) +;FPROPX - FIND PROPERTY NAME IN LIST SUPPLIED + ;TTT = BODY OR TYPE DEF PROPERTY LIST POINTER +;FNDDIP - FIND DIP TYPE + ;A = BODY POINTER + ;SKIP RETURNS + ;T = DIPTYPE BLOCK POINTER +;BFPROP - FIND PROPERTY FOR BODY + ;A = BODY POINTER + ;T = STRING PROPERTY NAME + ;SKIP RETURNS + ;T = PROPERTY BLOCK POINTER + ;SKIPS 1 IF FOUND IN BODY DEF (NO INDIRECT LIST IN BODY) + ;SKIPS 2 IF FOUND IN BODY (INDIRECT OR DIRECT) + ;PROPERTY NAME STRING IS RETURNED TO FS IF FOUND +;BFCPRP - FIND BODY OR BODY DEF PROPERTY BY CLOSEST MATCH NAME + ;TTT = POINTER TO PROPERTY LIST + ;T = RETURNS PROPERTY BLOCK OR INDIRECT POINTER +;MPROP - MAKE A PROPERTY BLOCK AND ADD TO TYPE DEF + ;T = STRING PROPERTY NAME IN T + ;A = TYPE + ;RETURNS + ;T = NEW BLOCK (WITH NO VALUE STRING YET) +;MAKTXT - MAKE TEXT/PROPERTY BLOCK, POINTER RETURNED IN TT +;FBTPTR - FIND INSTANCE OF PROPERTY/TEXT INDIRECT POINTER + ;B = LAST BODY FOUND + ;A = BODY DEF PROPERTY/TEXT BLOCK POINTER + ;SKIP RETURNS + ;B = NEW BODY + ;(C = PREVIOUS) + ; POINTER TO INDIRECT BLOCK IN D +;COPLTP - MAKE INDIRECT LIST TO BODY DEF TEXT/PROPERTIES + ;A = BODY POINTER + ;(IF E POINTS TO BODY DEF PROPERTY, IT IS CHANGED TO POINT TO INDIRECT BLOCK) + ;RETURNS + ;E = POSSIBLY UPDATED POINTER TO INDIRECT BLOCK + ;T = PTR TO END OF LIST +;ASCCOP - MAKE INTERNAL FORMAT STRING FROM ASCIZ STRING + ;TT = ASCIZ STRING POINTER + ;RETURNS + ;T = INTERNAL FORMAT STRING POINTER +;MERGEP - MERGE PROP LIST INTO BODY'S PROP LIST + ;A = PTR TO BODY + ;B = PROP LIST TO MERGE +;TXTREL - RELEASE PROPERTY LIST FROM TYPE OR BODY + ; C = PROPERTY LIST +;CPYPRP - COPY CONTENTS OF ONE TEXT BLOCK ONTO ANOTHER + ;A = SOURCE TEXT BLOCK + ;B = DESTINATION " +;CMPBDY,CMPTYP - COMPILE PROPERTIES ON BODY OR TYPE + ;A = BODY OR TYPE + ;LH A = FLG -1 MEANS TYPE +;CMPIT - COMPILE PROPERTY FOR BODY OR TYPE + ;A = BODY (0 LH) OR TYPE (-1 LH) + ;B = PROPERTY +;FLSBDY, FLSTYP - DELETING PROPERTY, CHECK AND FLUSH MAYBE + ;A = BODY OR TYPE + ;B = PROP BEING FLUSHED +;VERPRP - CHECK BODY, TYPE FOR CONSISTENCY W.R.T. COMPILED SPECIAL PROPS + ;A = BODY (0 IN LH), TYPE (-1 IN LH) + + + ;;;;;; +CONBOX(E=POINT) + CONCAL(A=POINT) + CSLTLP(PIN#,,B-R-S) + +CONNUM(E=POINT) + CSLTLP + +CALCOF(E=POINT) + +OFFCON + + +;;;;; + +VERIFY X-COMMAND TO SEE IF PROP COMPILATIONS ARE CONSISTENT + +CHECK FETCH-STORES + 1) STARTING LOOP WITH "LOCATIVE" - ALL NXT TYPE + FETCHES ARE LEGAL IF THEY RESULT IN A PTR + THAT IS NULL, OR TO TYPE FETCHED. + 2) BODY DELETE CAN CHANGE PINS INTO POINTS! + +SOME THINGS ARE ASSOCIATED WITH DIPTYPE +WHICH MAY BE HUNG OFF OF BODIES, OR INHERITED FROM TYPES + - # OF SECTIONS + - # OF PINS DEFINED + DIP DEF LIST GIVING + - PIN NAME + - SECTION(S) + - SECTION PIN # + - PACKAGE TYPE + - # OF PINS IN PACKAGE + +SETTING "DIPTYPE" PROP SHOULD CLEAR ALL DEFINITIONS + MAYBE LOOK TO SEE IF DIPTYPE IS IN CORE +GETDEF READS DIPS.DIP AND DEFINES INFO FOR TYPE, AND ALL BODIES WITH + THE SAME DIPTYPE +SETTING "PACKAGE" SHOULD OVERIDE PACKAGE DEF FROM DIPS.DIP + THATS WHAT TXBIT IS THERE FOR diff --git a/doc/draw/pc.info b/doc/draw/pc.info new file mode 100644 index 00000000..bb9aae6f --- /dev/null +++ b/doc/draw/pc.info @@ -0,0 +1,29 @@ + Creating a new PC + ----------------- + + +To assemble new PCBOARDS if needed: + WL^S + :FAIL PCBOARDS_BOARDS + ;In answer to query for assembly switches: + PC + ;^C + +Assemble new REL: + DRAW + :FAIL PC_D + ;In answer to query for assembly switches: + PC + ;^C + + +Load binary: + DRAW^S + :STINK PC ;Uses PC LOADER + 1L DECSYS;DECBOT BIN ;Merge in DECUUO boot: + .JBSA/ STRT + 56/ 107 ;SAIL + META + SYMS + ... + + :DELETE DATDRW;PC OBIN + :RENAME DATDRW;PC BIN, PC OBIN + :PDUMP DATDRW;PC BIN ; This is the file linked to by SYS1;TS PC diff --git a/doc/draw/random.info b/doc/draw/random.info new file mode 100644 index 00000000..5a968c5b --- /dev/null +++ b/doc/draw/random.info @@ -0,0 +1,1181 @@ +DSK:DRAW;SUDS 7 Page 22 + +HOW TO DO IT -- PC CARDS + +Start here when you have completely finished wiring +your pc card. + + You are now in the PC program. You must now generate +4 plot files. The 2 outer planes (component and solder) +and the 2 inner planes (power and ground). +You should try to use the following form for plot filenames. +End the name with "C" for component, "S" for solder, "P" +for power, and "G" for ground. + To generate the component and solder plane plots +get on the appropriate side and say W. Then +type the filename. + Now for inner planes. If you want anything but +clearances in your inner planes, STOP and see RPH. Otherwise +you now type INNER to the extended scanner. This deletes +all lines and points except dip pins and feed throughs, and +sets the pad type for these to 2 (clearances). Currently the +plane connections aren't indicated by the absence of pads. + To make the inner plane plots, use the extended mode +PPLOT command, which asks for the plane number, then the +filename. The plane number is the same as the one you gave +to attach to the plane in the first place. + DSK:DRAW;SUDS 7 Page 23 + +MORE PC CARDS -- PCP + Now you have 4 plot files (if not see RPH). Now run PCP. + + The following indicates program prompts in upper case, +then a description of your response in loser case. +It is suggested that you run PCP on a teletype when doing a TRW +run, and save the output for transfering to a planning sheet. + +When program starts up, it asks: + +OUTPUT MODE(S)? + + If you respond "?", the following list will be typed: + +CHAR EFFECT +? TYPE THIS LIST +C CALCOMP OUTPUT +F FR80 OUTPUT +X XGP OUTPUT +G GO DIRECTLY TO X PROG +W SPOOL X OUTPUT, "R XS" WHEN ALL DONE +S ENABLE RESTART CAPABILITY +R ROTATE PLOT +T TRW OUTPUT +M MAP RETICLES +A ADD SYMBOL DEFINITIONS +D MAKE DRILL TAPE FIRST TIME THROUGH + + You may type any of the characters in the first column + all on one line, the program will warn you of any + conflicting modes. + + Here is a brief description of each of the modes: + +? Obvious + +C This causes a plot to be made on the calcomp plotter. + +F This causes a file to be written on the current area + with the extension 'F80'. This file when copied onto + a magtape (see description, end of page), will produce + FR80 microfilm of the pc card. + +X Instead of driving the calcomp plotter, plotter commands + go into a file with the extension 'PLX'. This file when + processed by the 'X' program will produce XGP output of + your pc card. + +G This specifies that when the first plot is done, the + program should link directly to the 'X' program, which + will then produce the XGP output. + +W This causes output to the XGP to be generated and 'X' to + be run, but 'X' writes its output on the disk again. Later + when you have run all your cards through 'PCP', you run + 'XS' which finds, prints on the XGP, and deletes all the + temporary files. This saves time and paper on the XGP. + +DSK:DRAW;SUDS 7 Page 23-1 + +S This command, intended for use exclusively with calcomp + plotter output, plots a cross 2" above the intial pen + position, and during the processing of the plot, + accasionally saves a core image (it will ask how often to + do this). If for some reason you must start over, mearly + position the bullseye on the pen carraige over the cross + and run file called "PLTSAV.DMP", which will continue + the plot from the place where it left off. + +R This will cause the plot to be rotated 90 degrees CCW. + +T This will write a file with the extension 'MAG'. When + copied to a magtape (see next page) the tape can be + sent to TRW in L.A. and plotted on film on their gerber + plotter system. This also generates a 'LOG' file which + should be XGP'd and stuck in the plot log book. + +M When this mode is selected, the program will ask for + pad types which want to be the same wheel pos as another + pad type, or the same as some position not accessible by + pad types directly. + +A This causes PCP to accept extra symbol definitions other + than the standard ones. + +D A drill tape file is made from the first file processed. + +If you select both "T" and "D" modes, the trw output will be a drill +plot. That is, no lines, text, or pads are drawn and donut pads are +plotted at the location of each drill hole. + +If you selected the "T" output mode: + + and "M" mode, + + If you have a pad type in your pc card, and you want + to use one of the standard reticles (i.e. nortronics + target), this allows you to map the pad type into a + different wheel position than usual. If you answer + "Y", you are asked the following: + + RETICLE MAPPING LIVES FOR EVER IN THIS CORE IMAGE! + PAD TYPE NUMBER? + + Here you respond with the pad type number which you + set in the pc prog. If you respond , you get out. + + WHEEL POS? + + Now you tell which wheel position you wish selected + for this pad type. Then you loop back to the pad + type prompt. + + and "A" mode, + + If you are using any characters not in the TRW + standard character set (see RPH for character + set), say Y. If you say Y, the following +DSK:DRAW;SUDS 7 Page 23-2 + + will be asked: + SYMBOL DEFINITIONS LIVE FOR EVER (IN THIS CORE IMAGE). + BE SURE TO MAKE A SKETCH OF THE SYMBOL INDICATING THE "D" CODE. + D60? + Type the single character for this code (no ). + Any previously assigned codes will be printed followed + their character, then you will be asked to assign the + first unassigned code. Type the character you used when + you placed the text in the PC prog. + D61? + This will continue until you answer . + +If you selected the "F" output mode: + + AT FR80 SCALE OF 3.7 FRAME IS ABOUT 22X17. + FR80 SCALE*10 ? + + This is exactly what it seems, if your card is somewhat + smaller than this, you may use a larger scale. Use AID + to calculate the appropriate scale. will get you + 37 (scale of 3.7). + + FR80 FRAME IS 22X17. + + The frame size will be printed if you give a scale other than 37. + +SCALE FACTOR? + + Scale of 1 is real size (you get this if you type alone). + Don't use anything else if you are making a TRW plot or an FR80 + plot. This may be used to make detail plots. + +POSITIVE X,Y OFFSET (IN INCHES, DECIMAL POINT OK!)? + + This must be used to generate TRW plot tapes, and CINCH + drill tapes. Both systems have 0,0 at the lower left. + The standard film we are using at TRW is 24 x 20 inches. + Thus the offset should be 12,10. The CINCH drill frame + size we will use is 20 x 20 inches, so use 10,10 for drill + tape. If is typed, and you are making a TRW plot, + 12,10 will be used. Otherwise 0,0 is used. + This offset is not used for FR80 output. FR80 output is + centered automatically. + +The preceeding information is asked only once every time the program +is started. The rest is asked in a loop starting here. When done type +^C (call). + +FILENAME? + + Type the plot filename, default extension is "PCP". + +CHAR "M" HEIGHT +SCALE CODE (IN MILS) +0 M50 120 +1 M51 +2 M52 +3 M53 +DSK:DRAW;SUDS 7 Page 23-3 + +4 M54 + + This controls the character size, the typeout actually + stops at the end of each line, suppresses text + of this scale. If this is a TRW tape, the height must be + divisible by 15. Otherwise it must be divisible by 5. + This number is the height and spacing of the characters + of that scale. Scale 0 (M50) is used for the messages, + which are plotted across the bottom of the film. + If you respond with altmode, the rest of the char. size + promts are suppressed. + +PUT PEN AT 0,0. +LINES, TEXT, AND PADS MAX X= 0.000 MIN X= 0.000 MAX Y= 0.000 MIN Y= 0.000 + + This information is calculated from the plot file, and does not + include the card outline. If any of the numbers are abnormally + large, STOP and get RPH immediately. + +If this is a TRW plot tape the following is asked: + + OPERATOR MESSAGES, 40 CHARS PER LINE (MAX). END WITH . + STANFORD A.I. PROJECT. + + This puts messages on the tape which are typed + to the operator at TRW at this point in the plot. + These messages are also plotted across the bottom + of the film for identification purposes. + The first line always identifies us, subsequent + lines should identify the plane number (0 to 4, + top to bottom) and what it is. End with a blank + line. + +If you specified "D" mode: + + TYPE X,Y OF HOLES TO ADD TO DRILL TAPE + DECIMAL POINT OK, OFFSET WILL BE ADDED. + + Then loop asking the question: + + X,Y OF HOLE? + + Until you type just return. + The hole are placed on the front of the drill tape + in the order in which you typed them. + +If this is not a drill plot (pads for drill holes only), the following +question is asked (unless this is a TRW run): + + SKIP PLOTTING OF ALL PADS? + + This is only useful on calcomp for overlaying plots with the same + pads. + +Now the program will spew out various things about how far along it is. +If the card number was available when the plot files were written, it +was passed in the file. If not, the following question will be asked: + +DSK:DRAW;SUDS 7 Page 23-4 + + CARD NUMBER? + + Here you type the number of the card you want to use. + If you type 0 or just , no card will be done. + +Here progress on the card is indicated. +Now the program will type: + +ACTUAL MAX X = 0.000 MIN X = 0.000 MAX Y = 0.000 MIN Y = 0.000 + +These numbers include the card outline as well as lines, text, etc. +They must be copied to the TRW planning sheet if this is a TRW plot. + +Then it says: + +PLOT DONE! + +And here we loop back to the plot filename prompt! +Unless the "G" output mode was selected, in which case we go to the +'X' prog which runs automatically. + DSK:DRAW;SUDS 7 Page 24 + +MORE PC CARDS -- AFTER PCP + +At completion of plots, the following command should be typed to +generate an FR80 tape: + +COPY MTA0:FOO_STANFO.F80[DAT,RPH],,STANFO.F80[DAT,RPH] + +To punch paper tape from an XXX.DRL file, run TD[F,RPH] and type the filename +XXX, this is a separate program because the tape must be punched in binary. + +To make a TRW magtape from your 'MAG' files, type: + +COPY MTA0:/EVEN_XXC.MAG,XXS.MAG,XXP.MAG,XXG.MAG,XXD.MAG + +Were the file names are the appropriate files you have just generated. + +The order is not important, but should agree with the file numbers on the +planning sheets and any messages on the tape itself. + +You should also XGP all the 'LOG' files and put the file #'s on them. + +fin + DSK:DRAW;SUDS 7 Page 25 + +RUNNING WL + + How to run the wire lister + + or + + Easy little steps for muddy little feet + + Commands are single letters with or without control or meta. The command +may be preceeded by any of the following: + + DEC NODEC + (NOTHING) (nothing) + ONE ALT control + TWO ALTS Meta + THREE ALTS control-meta +ˆ doesn't matter + +If more than one of the above appear, then all will satisfy command. +In all but the "I" command, if only one wire list exists, the "WIRE +LIST ID?" prompt will be skipped. + +Commands: + +ˆE EXIT. + + +ˆ@ SAME AS "XDSKIN". + + +D Enter DIP SUB-MODE. See next page for commands in DIP SUB-MODE. + + +_ + Set default wire list id. This is the wire list which is used + for all commands requiring single wire lists. The 2 wire list + id's are "D" and "PC". + + +_ Toggle wire list id's. (switch from D to PC or back). + + +I OR I + ASKS: + FILENAME? + + You may type a filename (default extension is ='WD' and ='WPC') + or @filename (default extension is "DIR"). The format of + a "DIR" file will be explained later. + If you type "" you get wire list with id "D". If you type "" + you get the wire list with id "PC". + + The file(s) are read, signal names are compared and the + wire list is built. + + After the file name you may type a module location which takes + effect for any dips or pins which do not already specify a + module location. You may also type variable settings enclosed +DSK:DRAW;SUDS 7 Page 25-1 + + in parentheses, separated by commas. See the end of this writeup + for exact information. Example: + IFOO 1AE3 (N0,M0) 1AE4 (N6,M1) + This reads file FOO.WD twice, once (called slice 1) for + module location 1AE3 with N=0 and M=0, and once for location + 1AE4 with N=6 and M=1. + The file(s) are read, signal names are compared and the + wire list is built. + +I Asks: + + FILENAME? + + Same options as reading 'WD' or 'WPC' files, default extension is 'WEQ'. + This file contains some number of signal names on each line, seperated + by tabs. The effect of this file is that each line is treated as a wire. + So you may cause certain wires to be grounded or connected to HI, or even + connected to other wires. Please note: The card location of the wire list + you wish to affect should appear with the filename, just like reading a + wire list. + + +U Asks: + + CARD(NLLN)? if necessary + + This copies the dips from the default wire list (a logic + wire list), to the other wire list (a pc wire list). The + locations are used for matching. + + +N OR N + Asks: + + WIRE LIST TITLE? + + The string you type will be used on listings involving + this wire list. + +L Asks: + + CARD (NLLN)? if necessary + + This lists a wire list onto a file. The default + extension is 'WL'. + All sorts of neat things are indicated on + the wire list, the best way to find out what + they are is to make one. + Any unnamed signals are given unique numbers + which are printed preceeded by a "#". + +L Asks: + + CARD (LN)? if necessary + + This makes the following summaries: + + Summarizes all dip types used in this wire list +DSK:DRAW;SUDS 7 Page 25-2 + + totaling the different body names and total number + of sections used. + + UNGENERATED SIGNALS + + UNUSED SIGNALS + + Each of these catagories is listed, only one + of the names of a wire fitting the catagory + is listed. The default extension is 'WLS'. + + +L Asks: + + CARD (NLLN)? if necessary + + Then asks for a filename. The default extension is 'WLU'. + Writes a listing file which is sorted by dip number. Under each + dip number is listed the signals connected to each pin. + At the end of the listing, the edge connector fingers are listed + in alphabtical order along with the signal connected to each. + + This prints out the following info: + + LOC DIPTYPE BODY POS FILE + + For each body followed by: + + PIN # TYPE HI LOW USE SIGNAL NAME + + For each pin of body. + + Then: + + CONNECTORS + PIN FILE SIGNAL NAME + + For all connector pins. + + This allows you to find out a signal name from the LOC(PIN #). + + +P + or +P which asks for signal name + + Then prints for that the signal name, the information which + would be printed for that signal in L. Prints on TTY. + + +P Asks: + + CARD (LN)? if necessary + + Then asks: + + DIP OR CONNECTOR LOCATION? + +DSK:DRAW;SUDS 7 Page 25-3 + + Then prints info for that loc which you would have gotten in + a L listing. Prints on TTY. + + +P Asks: + + SIGNAL NAME? + + Then does P for this signal for each card currently read in. + + + In addition, if (NODEC) OR ? (DEC) appears in front of the signal name both the + hi and low versions of the signal will be printed. This works + for P, P, and P. + + +W Asks: + + CARD (LN)? if necessary + + This writes a file for input to the PC prog for generating + router files which are read by wagner's router prog. + The default extension is "WDR". + + +W This writes a back panel wirelist file from all the cards in + the default wirelist. The default extension is 'BAC'. + + +B Reads a back panel wire list written with W (default extension + is 'BAC'). You may now make back panel listings using ˆX commands. + + +B READS A 'BAC' FILE, BUT ONLY INPUTS FILENAME AND TITLE INFO, + AND DIP COUNTS FOR MAKING AN 'MPL' FILE. + + +B Reads a file of the same format as a 'WEQ' file, however default + extension is 'BEQ'. It has the same effect on the back panel as + a 'WEQ' file has on a card wire list. Except there is no problem + with the card location, it applies to the whole back panel. + + +C Asks: + + CARD (LN)? if necessary + + Then asks for a filename. The default extension is 'WLC'. + The card specified is found in D wire list and PC wire list. + The two wire lists are compared and an error listing is + produced. Make one to find out the format. The info from C + is included in C. + + +C Asks: + + CARD (LN)? if necessary + +DSK:DRAW;SUDS 7 Page 25-4 + + This compares D and PC wire list as in C, but it only checks + if you have placed the right dip sockets on the pc card for + the dips you are using in the logic drawing. Also checks that + you have not pre-assigned an illegal connector pin #. This + be done only after a L verify has been done with no errors + because the kinds of errors found by this check will confuse + C. + DSK:DRAW;SUDS 7 Page 26 + + + EXTEND MODE COMMANDS +ˆX If any control bits held down asks: + + Si? + + Now type a 1 to 6 (or more) letter command possibly preceded by + a "-". The meanings of these commands are explained below: + A "D" at the left means available in dip sub-mode only, a "B" + means available in both top-mode and dip sub-mode, nothing means + available only in top mode. + +B RESIDENT Reads in the dip defintion file at the bottom of free + core, and marks the last loc used. + now whenever you type ^c start, the dips + stay in the core image. All other data in program + free storage is cleared. + +B -RESIDENT Release dips from bottom of core. Now when + you type ^c start the dips go away. + +B DDT Enters DDT if loaded. + +B SAVE Asks for a filename, (default extension is 'DMP') + then executes a swap uuo to save the current core + image. If DSKIN is in progress, it is suspended + during the save and restarted (using DSKCON) after- + wards. However, when the saved core image is run + again, the DSKIN is not continued. It may be + continued manually by a DSKCON command. +DEC AT DEC NO SWAP UUO IS USED, THE PROGRAM MERELY + EXITS TO THE MONITOR AND YOU MAY SAVE IT, THEN + START OR RUN IT LATER. + +B DSKIN Asks for a filename, (default extension is 'TXT') + then takes input from there instead of tty. If an + error is encountered, input reverts to the tty. + +B DSKHLD Releases disk input file, remembering where it was. + later you can give a DSKCON command to continue. + +B DSKCON If the last dskin was held by a DSKHLD command or + an error, the command causes the file to be reopened + and the appropriate chars skipped to get it back where + it was. DSKHLD and DSKCON are used by SAVE to get + around the fact that the swap uuo does a reset. + +B DSKSKP If no file open, asks for name and opens it. + Reads to the next line feed echoing + characters as it goes. Then asks "STOP?". + If you respond with "y", then skipping stops and + control reverts to who ever had it last. + If you respond with altmode then + skipping stops and control reverts to tty. + Anything else causes then next line to be + printed, skipped, and the prompt repeated. + + DEFPPN Accepts a p,pn to use when none is specified (input only). +DSK:DRAW;SUDS 7 Page 26-1 + + + -DEFPPN Resets defppn to 0. this is the default. + the effect of 0 is that it is used for the p,pn + on input unless you are reading filenames from + and indirect file. in that case, the p,pn used are + those of the indirect file. + +B CLEAR This command is equivalent to "^C START" except + that it doesn't flush DSKIN. + + STATUS Prints out current program status, like SPACES, REFERENCES, + PAGE, EXTENT, and default wire ID. + + SPACES Makes spaces in signal names significant. + Affects the I and I commands only. + + -SPACES Spaces in signal names are no longer significant + except when they seperate 2 digits. + This is the default. + + REFERENCE This enables the feature in 'WL' files which + causes all signal names for a wire to appear + in each alphabetical sorting of each name, + but only one of them will have the pin + information printed. All the others will print + "_____ REFERENCE" next to the signal with which + the pins appear. + + -REFERENCE Disable references in 'WL' file. Signal names + appear only once, with the pins. + + IERROR Enable output of errors on wirelist file input + to go to a file. When you do I, I, I, and B + you are asked for a filename (default extension + is 'WIE'). This file contains the filename of the + file being processed and any errors which cannot + be indicated later. If you respond with to + the WIE filename prompt, output will go to TTY + as if no IERROR command had been done. + + -IERROR Disable input errors going to file, they will + go to the TTY instead. This is the default. + + + PART Write a "PARTITION" file, default extension is + 'PAR'. This is the file for input to Wagner's + partitioning program. + + SIGSUM Write signal summary listing for entire wire list. + Default extension is 'WSS'. These files may be + merged by the program "M.DMP[WL,RPH]" to form a + master signal summary ('MSS'). + + ERRSUM This writes a file (default extension is 'LES') + which has each run of some of the categories from + the wire list summary output. The difference is + that this is a binary file which goes back into + D and allows you to flash the runs from each +DSK:DRAW;SUDS 7 Page 26-2 + + error category. + + CONSUM Write connector pins needed summary. This lists + signals in same format as SIGSUM but only those + which need to get from one card to another, but + don't. Default extension is 'WCS'. + + WLSSEL LIKE L, EXCEPT THAT YOU ARE ASKED ABOUT EACH + CATEGORY BEFORE IT IS WRITTEN INTO THE FILE. + + BSSEL LIKE BSUM, EXCEPT ASKS ABOUT EACH CATEGORY. + + MAKALL ASKS FOR ONE NAME AND POSSIBLE A CARD NAME, THEN + DOES L, L, L (WRITES 3 FILES). + + BMAKALL LIKE MAKALL, BUT DOES BLIST, AND BSUM. + + UMAKE WRITES 'UML' FILE FOR INPUT TO "D" PROGRAM WHICH + REPLACES ALL EDGE PINS WITH GENERATED "U" PINS. + + STUFF WRITES 'STF' FILE WHICH TELLS FOR EACH DIP TYPE ON + A BOARD WHERE IT IS USED (WHAT LOCATION). + + LPART WRITES 'PRT' FILE WHICH TELLS FOR EACH DIP TYPE ON + A BOARD WHAT ITS PART NUMBER IS AND HOW MANY ARE USED. + + UML Prints a module map for the card you select. Also + prints edge signals in boxes for each paddle. + Default extension is 'UML' + + TEST Asks: + + CARD (LN)? if necessary + + This writes a card tester file for P. Petit's simulator. + The default extension is "TST". + + ROUTE Asks: + + CARD (LN) ? if necessary + + This routes all runs on the specified card and then + produces a listing (default extension 'WLR'). The + listing is like a 'WL' listing except that the pins + are ordered and a pseudo Z-level is indicated in an + extra column. + + ZLEVEL Asks: + + CARD (LN) ? if necessary + + This routes all runs on the specified card and then + produces a listing (default extension 'WLZ'). The + listing is 4 from-to listings. First is PWR and GND + Z-level 1 and Z-level 2. Then signals, Z-level 1 + and Z-level 2. + + BLIST Write back panel wirelist, default extension is 'BL'. +DSK:DRAW;SUDS 7 Page 26-3 + + + BSUM Write back panel wirelist summary, similar to 'WLS' + for normal wirelist. Default extension is 'BS'. + + BPRINT Asks for a signal name, and prints the run on the tty. + DI (NODEC) OR ? (DEC) works here as in "P" commands. + + SIMPLE Writes back panel information necessary for running the + DEC wirelist package over the back panel. + + ASIMPLE WRITES SAME INFO AS SIMPLE COMMAND, BUT ASSIGNS + REAL PIN NAMES IN PLACE OF "U" PIN NAMES. + + REDAC Writes a REDAC-compatible wirelist. First, + the REDAC master library is read (filename LIBRY.RDC) + automatically. If the library is not found, you are + asked for the correct filename. Respond with if none + exists. WL then asks: + + CARD (NLLN)? if necessary + + Then asks for a filename. The default extension is 'CON'. + If terminators are discovered in the wirelist, you will be + asked whether or not you want them in the REDAC output. + This writes a pc card interconnection list in the correct + format for input to REDAC. + + + STRAPS Reads a 'C2C' file which has 2 card locations on each line + seperated by a tab, specifying which cards have their back + strap connectors strapped together. A special format allows + each paddle to be mentioned explicitly so you can strap + different paddles in different directions. + An attempt is made to look at each wire which has a back + connector on it. If it has no name, lose. Otherwise find + the same named wire on the other card. If found then try + to match edge pins on this wire with edge pins on that + wire. A match occurs if they are the same pin, or if one + or both are "wild" specified pins. This allows errors to + be avoided when only one card is placed. + + CSTRAP Asks for "CARD nlln" if necessary (should be). Then writes + a file with the default extension 'DAT'. The file contains + the back connector locations which are gotten by taking + a wild back connector from this card and finding the + matching connector on the other card. This allows pre- + placement of pins which have been previously assigned + on one of a pair of cards. The file is suitable for reading + with the "IPINS" command in the drawing prog. + + EXTENT This is the number of paddles to assume make it to the back + panel for card with no location. It is initialized to 4. + + -EXTENT This resets the extent to 4 (the default). + + PAGE This allows you to set the number of lines per page to assume + when making listings, in case output will not go to LPT. + +DSK:DRAW;SUDS 7 Page 26-4 + + -PAGE Resets page length to 52 (the default, to allow for spooler or + other headings). + + OLD Sets mode for reading "old" format DIPS.DIP files. + + -OLD Clears mode set by OLD. + + ECL Sets default for ECL dips during dip definition. + + -ECL Clears ECL default. + + TTL Sets default for TTL dips during dip definition. + + -TTL Clears TTL default. + DSK:DRAW;SUDS 7 Page 27 + + + DIP SUB-MODE + + +ˆE Exit to TOP MODE (commands on previous page). + +ˆ@ SAME AS "XDSKIN". + +ˆI Input dip file into internal structure. If filename + is omitted, last one used for I or W command is used. + Name starts as "DIPS.DIP[]". Default extension + is always 'DIP'. + +ˆW Write internal list into file. Filename same as for I. + +ˆN Change (or just print if no filename arg) the default + dip filename. + +ˆL Asks: + + FILENAME? + + Default extension is 'LSD'. This makes a listing of all + dip definitions. + +ˆD Delete definition of . If is blank + you get DDT. + +ˆP Print definition of on TTY. + +ˆR Rename dip with name . Asks for new name. + +ˆS SET PART NUMBER STRING FOR DIP . + + +ˆC Copy definition of . + Asks: + + NEW DIP NAME? + + If it already exists, you are asked: + + ALREADY EXISTS, REPLACE? + + Then you are asked: + + LOADING CONVERSION FACTOR? + + The format is or /. This + is the scale which is applied to all loadings of + the old dip definition to get the new one. + +ˆM Modify definition of . + If no definition exists for this dip name, it TYPES: + + NEW NAME # OF PINS? + + Answer with . +DSK:DRAW;SUDS 7 Page 27-1 + + If a definition already exists, types out the number + of pins. Then a heading line is typed and echoing is + turned off. It tabs to the PIN # column and waits for + a command. Now you may type: + + Types the information for pin . + Types the information for pin then tabs to + the "TYPE" column. You can now change any or all + of the data items for this pin. Type to + fill in the rest of the line with the old stuff. + Type to get to the next column. Bad format + is filtered out and only good data is echoed. To + leave a column unchanged, just to the next + column without typing anything. + Asks for a new DIPNAME. You can either + edit another dip or get back to DIP SUB-MODE by + typing . + A Types pin automatically when you type + for pin . You get out of automatic mode + by typing or reaching last pin. + T L U P S + Automatically copies all columns to the left + of the TYPE, LOAD, USE, PS, and SECTION columns + respectively when you type the + command above. + + In all the above ALTMODE is equivalent to . + Legal TYPES are: + I input OP pull up output + IS input with load sharing VCC or P power + O output GND or G ground + OT tri-state output NC or N no connection + OC open collector output + You may prefix any of the above types with the letter + "T" for TTL or "E" for ECL. YOU MAY FOLLOW AN I OR IS WITH + "P" IF THIS PIN HAS AN INTERNAL PULLUP OR PULLDOWN. + YOU MAY FOLLOW AN OUTPUT (O, OC, OT, OP) BY "F" IF + IT IS A FLIP-FLOP OUTPUT. If the X commands ECL or TTL + have been performed, the prefix "E" or "T" is assumed + automatically. With no prefix, the pin definition is + neutral with respect to TTL vs ECL. + + The USE column is for comments such as "S1" or "S4" on + an ALU dip. PS is an arbitrary number which you assign + to identify pins that share load. Give the same number + to all pins that share with eachother. SECTION is for + defining the sections of the dip and for specifying + equivalent pins in other sections. The section information + is: /
. The equivalent pins + in different sections are identified by having equal + logical pin numbers. + DSK:DRAW;SUDS 7 Page 28 + +WL FILE FORMATS + +In this part: + +() means optional +<> syntactic entity +()* 0 or more of + single letter + 1 or more digits + Carriage return - linefeed + + +Argument to I or I TOP MODE commands: + + ( . ) ( [

,] ) ( ( )* ) + +"DIR" files: + +( ( . ) ( [

,] ) ( ( )* ) )* + + + ::= ( ( ) ( ) ) ( "(" ( ) + ( ) ( , )* ")" )* + +"(" and ")" stand for a parenthesis pair. + +This is a list of files to read for "I" or "U" commands. + +The first part of the slicespec allows you to specify the + +for any unspecified dip locations. In addition the filespec for the indirect +file may include a construct which will be used on any filespec's +in the file which don't have their own. The rest is for the special construct in +signal names which we will call expressions. The sets the lower +bound of values to , the sets the upper bound. +The sets variable to . The format of a signal name +which uses an expression is as follows: + + + ::= ( ( )* ( [ ] ) )* ( )* + + ::= | | + + ::= ( , )* + + ::= ( "{" "}" )* ( ) + + ::= | + + ::= | + + ::= "(" ")" | - | + | A-Z | + + ::= + | - + + ::= / | * + + ::= 0-9 | 0-9 +DSK:DRAW;SUDS 7 Page 28-1 + + +The "()" pair in the primary definition may be replaced by a "<>" pair, +but you must close with the same thing with which you opened. + +If = the expression is evaluated. Then the thing +in [] is replaced by the I'th string (where value of =I). If +I less than or equal to zero, or I greater than the number of strings, +the thing in brackets is replaced with null. + +If = the first expression is evaluated. If the value +is non-zero, the string contain in the following "{}" pair is the result +of the expr. Otherwise, the evaluation of the expression after +the "}" is done and so on until on becomes true or the "]" is reached. + +If = the thing in [] is replaced by the decimal value +of the expression with leading zeroes added to make the length of the +result equal to the length of the longest variable in the expression. + +The following is the format of a "STRAP" file, it tells which +paddles of which cards are strapped together: + +{}* + + + ::= + | + + ::= {} + + ::= + + ::= 0-15 + + ::= {} + + ::= A-Z + + ::= A-Z + + ::= 1-63 + + ::= A-Z + + +SEMANTICS: + + The construct is used if the back strap connectors +of both cards correspond on a one-to-one basis. The is +used when different height cards are being described or strapping is +going to either side of a single card on different paddles. + DSK:DRAW;SUDS 7 Page 29 + +RUNNING MAGGOT + +MAGGOT READS MAGTAPE ON MTA0 AND SIMULATES GERBER +PLOTTER PACKAGE ON CALCOMP. ALSO MAKES LINE PRINTER LISTING. + +ASKS IF YOU WANT A CALCOMP PLOT +ASKS IF YOU WANT A LINE PRINTER LISTING + +THE FIRST TIME ANY SCALE IDENTIFIER IS ENCOUNTERED YOU +WILL BE ASKED TO TYPE ITS HEIGHT. + DSK:DRAW;SUDS 7 Page 30 + +RUNNING PDRILL + +PDRILL READS PAPER TAPE AND PLOTS X'S ON CALCOMP +FOR EACH DRILL HOLE, ALSO LISTS X,Y'S OF HOLES ON +LINE PRINTER + +ASKS IF YOU WANT A CALCOMP PLOT +ASKS IF YOU WANT A LINE PRINTER LISTING +ASK YOU TO LOAD TAPE BEFORE STARTING + DSK:DRAW;SUDS 7 Page 31 + +RUNNING FR80 + +ASKS IF YOU WANT A CALCOMP PLOT. +ASKS IF YOU WANT LPT OUTPUT. +ASKS FOR A FILENAME. (DEFAULT EXT IS "F80") +MAKES PLOT AND LISTING IF APPROPRIATE. + DSK:DRAW;SUDS 7 Page 32 + +HOW TO RUN REF + +REF IS A PROGRAM TO GOBBLE DOWN 'WD' FILES +AND PRODUCE A LISTING, ORDERED BY SIGNAL NAME +SHOWING EACH FILE IT IS USED IN AND HOW MANY +TIMES IT IS USED. + +THE PROG STARTS BY ASKING: + +WD FILENAME? + +TO WHICH YOU MAY TYPE EITHER + +FILNAM.EXT[P,PN] DEFAULT EXT IS 'WD' + + OR + +@FILNAM.EXT[P,PN] DEFAULT EXT IS 'DIR' + +IF THE "@" CONSTRUCT IS USED, ANOTHER FILENAME IS SCANNED +FROM THE FILE, AND SO ON UNTIL END OF FILE (BLANK LINES ARE +IGNORED). + +FILENAMES ARE GOBBLED AND THE FILES READ UNTIL YOU TYPE +A BLANK FILENAME FROM THE TTY. + +IT THEN ASKS: + +REF FILENAME? + +YOU NOW MAY TYPE THE OUTPUT FILENAME (DEFAULT EXT IS 'REF'). +IF BLANK NAME IS TYPED, OUTPUT GOES TO THE TTY. + DSK:DRAW;SUDS 7 Page 33 + +MISCELANEOUS +DRAWING PITFALLS: + +1. LINES WHICH APPEAR TO TOUCH MAY NOT INTERSECT IN THE DATA + STRUCTURE. TO INSURE CONTINUITY YOU MUST EITHER: + A. USE THE "-" METHOD TO HAVE A LINE YOU ARE DRAWING + INTERSECT A POINT YOU CAN SEE. + B. USE THE "A" OR "A" METHOD TO ATTACH TO A POINT OR + LINE RESP. + +(IN CASE OF DIFFICULTY, LEARN THE "B" AND "B" FUNCTIONS.) + +2. LABELS (LOGICAL NAMES) MAY APPEAR NEAR A WIRE AND NOT BE + ASSOCIATED WITH IT. TO FORCE ASSOCIATION, YOU MUST: + A. GET ON THE POINT AT THE END OF THE WIRE AND PLACE THE + TEXT THERE. MOVE THE WIRE IF THE TEXT GETS GARBAGED BY + SOME NEARBY OBJECT. + +3. USE "XDANGLE" TO FIND MOST ERRORS OF FORM 1 AND 2. + +(YOU MIGHT USE THE "A" FUNCTION TO ATTACH SOME TEXT TO THE NEAREST POINT) + +PC CARD LAYOUT RESTRICTIONS (BY MCGUIRE): + + THE FOLLOWING LAYOUT TECHINQUES ARE TO BE CONSIDERED +MANDITORY UNTIL PROVEN OTHERWISE: + + THE STANDARD STEP SIZE (50 MILS) WILL BE USED IN ALL PC CARDS +EXCEPT FOR SPECIAL PURPOSE ONES. THIS ALLOWS EXACTLY ONE WIRE TO PASS +DIRECTLY BETWEEN TWO PADS. + + WIRES BETWEEN PADS SHOULD BE WITHIN 15 DEGREES OF STRAIGHT +THROUGH TO ALLOW 18 MILS OF CLEARANCE BETWEEN WIRE AND PAD, 30 +DEGREES GIVES 15 MILS OF CLEARANCE, STRAIGHT THROUGH GIVES 20 MILS OF +CLEARANCE. + + WIRES BETWEEN PADS ARE ALLOWED ONLY ON THE TOP (DIP INSERTION) +SIDE OF PC CARDS OWING TO TROUBLE WITH SOLDER BRIDGING ON THE BOTTOM. + + SPACING BETWEEN WIRES MAY BE THE MINIMUM, THAT IS 50 MILS. +CONSIDER PADS AND FEED THROUGH TO BE 52 MILS IN DIAMETER AND WIRES TO +BE 10 MILS WIDE (AFTER ETCHING). + + IF A FEED THROUGH IS TO BE PLACED BETWEEN TWO WIRES THE WIRES +MUST BE AT LEAST 100 MILS APART IN ORDER THAT THE 20 MILS CLEARANCE +BE MAINTAINED AROUND THE FEED THROUGH. + +PLANE DESIGNATIONS: + +IN ORDER TO AVOID CONFUSION THE FOLLOWING PLANE DESIGNATIONS +WILL BE USED IN ALL PC CARDS: + + PLANE USE + + 0 GROUND PLANE. + 1 FIRST POWER PLANE(USE THIS IF ONLY ONE) + 2 SECOND POWER PLANE(USE THIS AND 1 IF TWO POWER PLANES) + 3 THIRD POWER PLANE. +DSK:DRAW;SUDS 7 Page 33-1 + + +IF SOMEBODY NEEDS MORE THAN 4 PLANES, HE IS CRAZY AND SHOULD SEE +RPH FOR TREATEMENT. + +EXTERIOR PLANES!!!!!!!! + + THE SIDE OF THE BOARD INTO WHICH DIPS ARE INSERTED WILL BE +REFERED TO AS THE TOP. THE OTHER SIDE WILL BE REFERED TO AS THE OTHER +SIDE. + + + \ No newline at end of file diff --git a/doc/draw/storag.doc b/doc/draw/storag.doc new file mode 100644 index 00000000..8e30c7fe --- /dev/null +++ b/doc/draw/storag.doc @@ -0,0 +1,299 @@ +SUBTTL DATA STRUCTURES + +;********** STRUCTURE DEFINTIONS ********** + +FSTLEN__2 ;THIS WILL ACCUMULATE LONGEST BLOCK + +COMMENT  +Normally, items must have the same format for the first two words: +This is depended on in many routines (like FNDCLS) + +SBLOCK QOMMON +HWDS (QLH,QNXT) ;... NEXT POINTER +HWDS (QX,QY,E,E)  INDEX__INDEX-1 + FWD (QXY)  INDEX__INDEX-1 + HWDS (Q2LH,Q2RH) +EBLOCK QOMMON +NIL, + +;ARGUMENT LIST FOR DIPRED, LIST OF BODIES, AND DIPTYPES TO GET +; FROM DIPS.DIP FILE + +SBLOCK GETDIP +HWDS (GDIP,GNXT) ;PTR TO DIPNAME NEXT +HWDS (GFLAG,GBDY) ;FLAG BODY OR TYPE + INDEX__INDEX-1 + FWD (GFBDY) +EBLOCK GETDIP + + ;FLAG is -1 if diptype came from type + + ;TYPE - BODY DEFINITIONS +MD,< +;***************************** +;*** TYPE DEFINITION BLOCK *** +;***************************** + +SBLOCK TYPE +HWDS (TLIB,TNAM) ;LIBRARY POINTER NAME (LH 1ST WD IS DIP TYPE NAME PTR)?? +HWDS (TYP1,TNXT) ;*+1, OR 0 NEXT TYPE +HWDS (TYP2,TPIN) ;*+2 PINLOC LIST +HWDS (TPROP,TLIN) ;PROPERTY LIST DISPLAY DEFINITION +HWDS (TBIT,TYP3) ;TYPE BITS *+2 (0 IF USING DEFAULT CHAR OFFSET) +HWDS (TX,TY,E,E) ;DEFAULT LOC OFFSET (X,Y) + INDEX__INDEX-1 + FWD (TXY) ; FOR SIMUL ACCESS +HWDS (TPAK,TDEF) ;PACKAGE CODE DIP DEF LIST (0 IF NOT IN) +HWDS (TOX,TOY,E,E) ;DEFAULT CHAR OFFSET (X,Y) + INDEX__INDEX-1 + FWD (TOXY) +EBLOCK TYPE +NIL, ;FOR @CREF LISTING + + ;IF TYP1 IS 0, THEN ONLY FIRST 2 WDS ARE PRESENT, TYPES ARE ABBREVIATED IF + ;PRESENT IN LIBRARY BUT NOT USED IN DRAWING + +SBLOCK STYP +HWDS (SLIB,SNAM) +HWDS (SYP1,SNXT) +EBLOCK STYP + + ;DISPLAY DEFINITION + ; --,, next + ; X,, Y + ; low order bit + ; 0 = invisible + ; 1 = visible + +;***************************** +;*** TPIN BLOCK (D) *** +;***************************** + +SBLOCK TYPIN +HWDS (TP1,TPNX) ;*+2 NEXT +HWDS (TPX,TPY,E,E) ; LOCATION OF PIN ON BODY + INDEX__INDEX-1 + FWD (TPXY) ;FOR FULL REFERENCE +HWDS (TPBIT,TPID) ;PIN BITS PIN ID +HWDS (TPPOS,TPNAM) ;PIN POS PIN NAME +EBLOCK TYPIN +NIL, + ;TPNX MUST BE IN 1ST WORD + + ;PIN POS: + ; BYTE (7)X(7)Y(4) 8 POSITION CODE + ; X,Y ARE 2'S COMPL + + +;******************************************************** +;*** TYPE DIP DEF LIST - DIP DEFINITION FROM DIPS.DIP *** +;******************************************************** +SBLOCK DDEF +HWDS (DDNPN,DDNXT) ;# PINS DEFINED DIPDEF LIST +HWDS (,DDMAX) ; MAX SEC # +EBLOCK DDEF +NIL, + +SBLOCK DIPDEF +HWDS (DPNM,DPNXT) ;PIN NAME NEXT +HWDS (DPSEC,DPPIN) ;SECTION BITS SECTION PIN # +EBLOCK DIPDEF +NIL, +>;MD + + ;TYPE DEFINITIONS (PC) + +MPC,< +;******************************************************** +;*** TYPE DEFINITION (PC) *** +;******************************************************** + +SBLOCK TYPE +HWDS (TNAM,TNXT) ;NAME (=# PINS USUALLY) NEXT POINTER +HWDS (TDPY,TPIN) ;APPROX BOX TPIN LIST +EBLOCK TYPE +NIL, + +;******************************************************** +;*************** TPIN BLOCK (PC) ****************** +;******************************************************** + +SBLOCK TYPIN +HWDS (TPID,TPNX) ;PIN ID NEXT PTR +HWDS (TPX,TPY,E,E) ;PIN OFFSET + INDEX__INDEX-1 + FWD (TPXY) ;FOR FULL REFERENCE +EBLOCK TYPIN +NIL, +>;MPC + + ;POINTS + +;BPBIT and PBIT are assumed to be in LH in many places + +;******************************************************** +;*************** BODY POINT ********************* +;******************************************************** + +SBLOCK BPOINT +HWDS (BP1,BPNXT) ;*+2 NEXT +HWDS (BPX,BPY,E,E) ;POINT LOC X,Y + INDEX__INDEX-1 + FWD (BPXY) +HWDS (BBODY,BPLNK) ;BODY PIN LINK +HWDS (BPNEB,BP3) ;NEIGHBORS *+1 +HWDS (BPTXT,BPLOC) ;POINT TEXT PINLOC BLOCK IN TYPE +HWDS (BPBIT,BPPN) ;BITS PIN# OR PAD# +MD,< ;NEIGHBOR BLOCK ONLY FOR D + ;PC HAS LIST OF POSSIBLY MORE THAN 4 NEIGHBORS +HWDS (BPND,BPNU) ;NEIGHBORS +HWDS (BPNL,BPNR) +>;MD +EBLOCK BPOINT +NIL, + + ;IF PC, PAD# IS 1 OR 3 + ;IF PC, BPNEB IS LIST OF FORM: + ; NEIGHBOR1,, NEXT + ; NEIGHBOR3,, NEIGHBOR2 + +;******************************************************** +;*** POINT OR CPIN *** - MUST BE CONGRUENT WITH BPOINT +;******************************************************** + +SBLOCK POINT +HWDS (P1,PNXT) ;*+2 NEXT +HWDS (PX,PY,E,E) ;POINT LOCN X,Y + INDEX__INDEX-1 + FWD (PXY) +HWDS (PFEED,PID) ;0 OR FEEDTHRU POINT ID +HWDS (PNEB,P3) ;NIGHBORS *+1 +HWDS (PTXT,PLOC) ;TEXT LOCATION +HWDS (PBIT,PIN) ;POINT BITS PIN # OR PAD # +MD,< +HWDS (PND,PNU) ;NEIGHBORS L,R +HWDS (PNL,PNR) ;NEIGHBORS UP,DOWN ? +>;MD +EBLOCK POINT +NIL, + +;PLOC IS 0 UNLESS CPIN ON IN PBIT +;FORMAT OF LOCN BLOCK IN D +; B-R-S,, CPIN-LOC/PIN# (18 PIN FORMAT) +; CONSTANT OFFSET X,Y +;FORMAT OF LOCN BLOCK IN PC +; 0,, SOCKET# ??? +; CONSTANT OFFSET X,Y + + + + ;TEXT STRINGS AND PROPERTY BLOCKS + +;******************************************************** +;*************** TYPE TEXT/PROPERTY BLOCK *************** +;******************************************************** + +SBLOCK TEXT +HWDS (TXBIT,TXNXT) ;BITS NEXT +HWDS (T.X,T.Y,E,E) ;TEXT LOC X TEXT LOC Y + INDEX__INDEX-1 + FWD (TXXY) + INDEX__INDEX-1 + HWDS (,TXIND) ; -- INDIRECT POINTER +HWDS (TXNAM,TXVAL) ;PROPERTY NAME (0 IF NONE) PROPERTY VALUE +HWDS (TXOX,TXOY,E,E) ;CONSTANT OFFSET X,Y + INDEX__INDEX-1 + FWD (TXOFF) +EBLOCK TEXT +NIL, + + ;If TXBIND is on in TXBIT, then is indirect. TXIND points to TEXT block in type. + ;low bit of TXXY is used to mean auto-offset + ;1,, bit of TXXY is sometimes used for flag + + ;"0" size text not displayed unless IDENTS is on. + +COMMENT  +STANDARD TEXT FORMAT: + +------------ ! ----!------ ! CHAR ----!--- NEXT 5 + ! ! ! SIZE ! CHARS + !-------!-------! !-------!-------! + !CONSTANT OFFSET! ! ! + ! X Y ! ! 5 CHARS ! + !-------!-------! !---------------! +OFFSET IS SCALED WITH TEXT SIZE, NOT DRAWING SCALE. + + +SBLOCK TEXCOF +HWDS (,TCSTR) ;... BARE TEXT STRING +HWDS (TCX,TCY,E,E) ;CONSTANT OFF. X Y + INDEX__INDEX-1 + FWD (TCXY) +EBLOCK TEXCOF + +SBLOCK TEXSTR +HWDS (TSSIZ,TSNXT) ;CHAR-SIZE NEXT +FWD (TSASC) ; ASCII CHARS +EBLOCK TEXSTR + + ;BODY INSTANCE + +;************************************************** +;*************** BODY INSTANCE ************ +;************************************************** + +SBLOCK BODY +HWDS (BOD1,BNXT) ;*+2 NEXT +HWDS (BX,BY,E,E) ;BODY LOCN X,Y + INDEX__INDEX-1 +FWD (BXY) ; FOR REFERENCE TOGETHER +HWDS (BORI,BLNK) ;ORIENTATION PIN LINK - THRU ALL PINS ON BODY +HWDS (BOD2,BTYP) ;*+1 TYPE +MPC,< +HWDS (BID,BLN) ;BODY ID BYTE (6)L(12)N +HWDS (BBIT,BNAM) ;BODY BITS DIP TYPE NAME STRING +>;MPC +MD,< +HWDS (BID,BLOC) ;BODY ID *+2 (0 IF NO LOC SET) +HWDS (BBIT,BTXT) ;BODY BITS BODY TEXT/PROPERTY LIST (MUST BE RH) +HWDS (BOD3,) ;*+2 UNUSED +HWDS (BLX,BLY,E,E) ;BODY LOCN CONSTANT OFFSET X,Y + INDEX__INDEX-1 + FWD (BLXY) +HWDS (BBRS,BSOC) ;LOC BAY-RACK-SLOT SOCKET # + INDEX__INDEX-1 + FWD (BRSLOC) ;B-R-S,,BODY-LOC +HWDS (BLOX,BLOY,E,E) ;BODY LOCN CHAR OFFSET X,Y + INDEX__INDEX-1 + FWD (BLO) +HWDS (BPAK,BDEF) ;PACKAGE CODE DIP DEF LIST (IF BODY HAS DIPTYPE) +>;MD +EBLOCK BODY +NIL, + +;If TXBIND is set in TXBIT, then this is indirect pointer to text/prop block +;in type. TXIND is pointer. +;If a BODY has any props at all, then it contains also indirect pointers +;to all props that were in its type. All or none. + +DEFINE FETPAK (A,B) +< FETCH(A,B,BPAK) + JUMPN A,.+3 + FETCH(A,B,BTYP) + FETCH(A,A,TPAK) +> +IFIDN < PUSH P,A + FETCH(A,A,BPAK) + JUMPE A,[POP P,A + FETCH(A,A,BTYP) + FETCH(A,A,TPAK) + JRST .+2] + SUB P,[1,,1] +> +> diff --git a/doc/draw/suds.404 b/doc/draw/suds.404 new file mode 100644 index 00000000..87f4b47e --- /dev/null +++ b/doc/draw/suds.404 @@ -0,0 +1,3576 @@ +Introduction: + +Latest revision of this document: 05 may 78 + +This document describes the STANFORD UNIVERSITY DESIGN SYSTEM, originally +developed at the Stanford University Artificial Intelligence Lab +by Dick Helliwell. It has been exported to several sites, as +described below: + +Stanford Artificial Intelligence Lab + Maintained by: JEFF RUBIN (DRAWING PROGRAM) + TOM GAFFORD (WIRELISTER) + Mail to: JBR @ SU-AI (RUBIN) + TAG @ SU-AI (GAFFORD) + Documentation: SUDS.RPH[UP,DOC] + Source on: [D,DRW], [WL,DRW], [PLT,DRW] + Object on: SYS: + +M.I.T. Artificial Intelligence Lab + Maintained by: Jack Holloway + Mail to: H @ MIT-AI + Documentation: DRAW2; SUDS > + Source on: NEWDRW;, NEWWL;, DRAW2; + Object on: SYS: + +Carnegie-Mellon University + Maintained by: Rick Gumpertz + Mail to: RG02 @ CMU-10B + Documentation: W.CMD[E130DP00]/B (LOOK comand file) + Source on: [E130DP00], [E130RG02] (both SPCH: & DSKC:) + Object on: [E130DP00] + +Digital Equipment Corporation + Maintained by: DICK HELLIWELL + Mail to: Digital Equipment Corporation + 200 FOREST ST. + MARLBORO, MASS. 01752 + Documentation: <10-ENGINEERING-LIBARY>SUDS.TXT + Source on: , , , + Object on: <10-ENGINEERING-LIBRARY> + + + Changes in the newer Drawing program + +Packages: + +The drawing system needs to know what package +each body is in in order to display the actual +post on the board. This handles 14 pin DIPs in +16 pin sockets, DIP adaptors, and other hair. + +The packages are mostly defined in the NDIPS.DIP +file. (When the wirelister reads in an old version +NDIPS.DIP the first time, it default the package +type from the number of pins actually defined. Thhis +may have to be fixed by hand in some cases.) + +The wirelister in Dip sub-mode allows you to set +the package type by + S + +Since the package information is needed to correctly +display a body, the information in the .DIP file +must be read into the body library by the INDIP command +in D. This updates all the unspecified package types +so that they default to what the .DIP file says. + +An explicit PACKAGE property on the body will +supercede the .DIP value however. This is the way +that you indicate a DIP adaptor, which is a package +type. The PACKAGE property should be the name +as typed out by APACK which lists all available +packages. + + +Board types: + +The new boards are listed by AVAIL: + + MPG216 - the MIT 180 pattern board w/ 20 pin sockets. + LG684 - a Hex plug in board with 20 pin sockets + MUPAC - the kludgey S.Gray board. + +Selecting a BOARD will default the NOMENCLATURE to the same name. + +One thing different about the nomenclature, is that +body locations accept an "offset", which allows 14 pin dips +to be adjusted vertically within the 20 pin socket. +For instance: + 1A01@2 + specifies a DIP in 1A1 with pin1 of the DIP in pin2 +of the socket. This is also useful for mini-dips and SIPs. +A SIP at @1 or @20 will be in 1st or 2nd column of DIP socket. + +The SOCKET (D) command forces all pin names to be the board pin +names, the DIP pin name is suppressed. + +To allow special .DIP files, there is a DIPFILE command in D +which specifies which file to read for INDIP and the section +numbering command m-N. + +There is a command XANADU in the wirelister that produces a routed +wirelist, in a format amenable to post-processing. + +------------------------- + +New Drawing prgm features: + +m-O (Body) Puts a stub on the "first" pin of the body + You are now in point mode drawing a line + +c-O (Point) Starts a stub from the "closest" pin. +m-O +c-m-O (Point) Moves the stub forwards/backwards around + the body from the current pin. + + The size of the stub can be varied with the + STUB command. + +c-^W (Body) cntrl-W, makes a set of the closest body, + and all points connected to it that + aren't connected to some other body. + This makes it convenient to move a body + horizontally, without overruning the + stubs that are connected to it. + + CHARACTER SET: + +THE FOLLOWING CHART SHOWS THE SPECIAL GRAPHIC CHARACTERS AVAILABLE +ON THE STANFORD KEYBOARD AND WHAT YOU MUST TYPE TO OBTAIN THEM ON A +TELETYPE KEYBOARD. CERTAIN CHARACTERS REQUIRE THE USE OF THE ";L" MACRO +COMMAND. FOR THESE CHARACTERS, YOU MUST TYPE ";L" FOLLOWED BY THE +NUMBER GIVEN IN THE CHART FOLLOWED BY . +OBSERVE THE MINUS SIGN CAREFULLY. + +GRAPHIC KEYSTROKE ;L OCTAL VALUE +--------------------------------------------------- +DOWN ARROW ^A -63 001 +ALPHA ^B -62 002 +BETA NONE -61 003 +LOGICAL AND ^D -60 004 +LOGICAL NOT ^E -59 005 +EPSILON ^F -58 006 +PI ^G (BELL) -57 007 +LAMBDA ^H (BACKSPACE) -56 010 +GAMMA ^I (TAB) -55 011 +INTEGRATION ^K (VERT TAB) -53 013 +PLUS/MINUS ^L (FORM FEED) -52 014 +INFINITY ^N -50 016 +SMALL DELTA NONE -49 017 +LEFT HORSESHOE ^P -48 020 +RIGHT HORSESHOE ^Q -47 021 +DOWN HORSESHOE ^R -46 022 +UP HORSESHOE ^S -45 023 +FOR ALL SIGN ^T -44 024 +THERE EXISTS NONE -43 025 +MU (MICRO) ^V -42 026 +DOUBLE ARROW ^W (SEE NOTE) -41 027 +OMEGA (OHMS) ^X -40 030 +RIGHT ARROW ^Y -39 031 +TILDA ^Z -38 032 +NOT EQUAL NONE -37 033 +LESS OR EQUAL ^\ -36 034 +GREATER OR EQ ^] -35 035 +IDENTITY ^^ -34 036 +LOGICAL OR ^_ -33 037 +VERTICAL BAR NONE 60 174 +CIRCUMFLEX NONE 61 175 +RIGHT BRACE NONE 62 176 + +NOTE:  (DOUBLE ARROW) MEANS CARRIAGE RETURN LINE FEED IN TEXT. + +NOTE: ^R AND ^T MAY NOT BE TYPED TO THE DRAWING PROGRAM + AND ^W MAY NOT BE TYPED IN LINE MODE. + WRITEUP FOR THE STANFORD DRAWING SYSTEM. + +THE CHARACTERS "", "", "", AND "" STAND FOR , , +, AND RESPECTIVELY (NOT AT DEC). AT DEC THEY +STAND FOR 1, 2, AND 3 'S REPECTIVELY. "", "", AND "" +ARE ALWAYS INTERPRETED BY THE SCANNER AS THESE THINGS! FOR DEC, THE +TERM "ALTMODE" WILL BE USED TO MEAN 4 'S. + WILL BE USED IN THIS WRITEUP TO MEAN THE EXISTS CHARACTER. +AT DEC IT IS ^E, ELSEWHERE IT IS . + +THE LETTER "D" PRECEDING ANY DESCRIPTION MEANS THIS IS FOR THE LOGIC +DRAWING PROGRAM ONLY, "PC" MEANS PC CARD PROGRAM ONLY. +"L" MEANS THIS IS A FEATURE OF THE LAYOUT VERSION ONLY. +"R" MEANS THIS IS A FEATURE OF THE ROUTING VERSION ONLY. +"DEC" MEANS AT DEC. +"NODEC" MEANS ELSEWHERE. +"STANFO" MEANS STANFORD ONLY. +"NOSTANFO" MEANS ELSEWHERE. +"U" MEANS CONDITIONAL UNDER "UML" ASSEMBLY SWITCH. + +HERE ARE SOME MONITOR LEVEL COMMANDS: + +REE ASKS "RESTART?". IF YOU TYPE "Y", WHATEVER YOU WERE + DOING WILL BE ABORTED AND THE PROGRAM RESTARTED IN THE MAIN + COMMAND LOOP. THE DRAWING IS NOT FLUSHED. EXTREME CAUTION + SHOULD BE USED WITH THIS COMMAND BECAUSE ^C TO THE PROGRAM + CAN LEAVE THE DATA STRUCTURE IN AN INCONSISTENT STATE. + IN GENERAL IF THE PROGRAM IS IN INPUT WAIT, OR UPDATING + THE DISPLAY, IT IS SAFE. + IF YOU DON'T TYPE "Y", YOU WILL BE ASKED A SECOND + QUESTION. "FLUSH MACROS?". IF YOU TYPE "Y" TO THIS + ANY MACROS IN PROGRESS WILL BE TERMINATED AS SOON AS POSSIBLE. + IN ANY CASE THE PROGRAM CONTINUES FROM THE POINT AT WHICH + YOU TYPED ^C. + +FIRST THE FOUR BASIC MODE SWITCHING COMMANDS: + + EACH OF THE FOLLOWING COMMANDS FINDS THE CLOSEST PRIMITIVE + IN THE DRAWING AND MAKES IT THE "CLOSEST" PRIMITIVE. IF YOU + ARE FINDING BODIES YOU MAY NOT DO OPERATIONS ON POINTS, ETC. + + P FIND THE CLOSEST POINT. A LARGE P INDICATES THE POINT. + IF THE POINT HAS TEXT ON IT A LARGE T IS USED. + + T SAME AS P EXCEPT THAT THE ONLY POINTS WHICH WILL + BE FOUND ARE THOSE WITH TEXT ON THEM. + + L FIND THE CLOSEST LINE. A LINE IS NOT "CLOSE" TO A POINT + UNLESS THE PERPENDICULAR FROM THE POINT TO THE LINE + INTERSECTS THE SEGMENT WHICH IS THE LINE. A LARGE L + INDICATES THE MIDPOINT OF THE LINE. + + B FIND THE CLOSEST BODY. A LARGE B IS PLACED + AT THE CENTER OF THE BODY. + + S FIND THE CLOSEST SET. A LARGE S IS PLACED AT THE + CENTER OF THE SET. THE CENTER OF A SET IS THE + AVERAGE OF THE LOCATIONS OF ITS MEMBERS. + +THE FOLLOWING 4 CHARACTERS INDICATE WHICH KIND OF INPUT YOU ARE DOING: + +* WAITING FOR SINGLE LETTER COMMAND +_ WAITING FOR SINGLE LETTER, NOT COMMAND +^ (AT DEC) + (NOT AT DEC) + WAITING IN LINE MODE (ONLY USED DURING MACROES TO INDICATE THIS, + OTHERWISE NO CHARACTER). +: WAITING IN LINE MODE FOR A MULTI-STRING VARIABLE + +SPECIAL CONTROL CHARACTERS AT ALL LEVELS! + + ! REFRESH DISPLAY. + NOW FOR THE COMMANDS YOU CAN GIVE ANYTIME: + +THE FOLLOWING MOVE THE DRAWING UP, DOWN, LEFT, AND RIGHT. +THE AMOUNT IS DETERMINED BY THE FOLLOWING: + + 1/8 WINDOW +  1/4 WINDOW +  1/2 WINDOW +  1 WINDOW + + AT DEC NOT AT DEC MOVEMENT + + < _ LEFT + >  RIGHT + [ ^ UP + ]  DOWN + + SIZE CONTROLS: + + * MAKE THE DRAWING SMALLER. +  MAKE THE DRAWING LARGER. + CHAR NEW SCALE + + * SCALE-1 + * SCALE*4/5 + * SCALE*2/3 + * SCALE*1/2 +  SCALE+1 +  SCALE*5/4 +  SCALE*3/2 +  SCALE*2 + +CURSOR MOVING AMOUNTS: + + 1 STEP +  2 STEPS +  4 STEPS +  8 STEPS + 16 STEPS +  32 STEPS +  64 STEPS +  128 STEPS + +AT STANFORD AND MIT, USE INSTEAD OF + +AT DEC CHAR SHIFTED CHAR MOVEMENT + 8 ( LEFT + 9 ) RIGHT + 6 & UP + 7 ' DOWN + +NODEC CHAR SHIFTED CHAR MOVEMENT + ( [ LEFT + ) ] RIGHT + /  UP + \  DOWN + + +L V IN PC PROG GO TO LOGIC PROG, IN LOGIC PROG GO TO PC PROG. + + % (DEC) + & (NODEC) + ZERO "CURRENT" SET POINTER. THE "CURRENT" SET IS THE ONE + WHICH GETS THINGS ADDED TO IT BY &. + + P FIND CLOSEST POINT. SEE ABOVE. + + T FIND CLOSEST POINT WITH TEXT ON IT. SEE ABOVE. + + L FIND CLOSEST LINE. SEE ABOVE. + + B FIND CLOSEST BODY. SEE ABOVE. + + @ SAME AS "XDSKIN". + + C MOVE THE CURSOR TO THE PHYSICAL CENTER OF THE SCREEN + + C MOVES THE CURSOR AND THE POINT IN THE DRAWING AT WHICH IT + RESIDES TO THE PHYSICAL CENTER OF THE SCREEN. + + C SET THE OFFSET AND THE CURSOR POS TO 0. (i.e. MOVE THE + CURSOR AND LOGICAL 0,0 TO THE CENTER OF THE SCREEN). + +D E EDIT (OR CREATE) A BODY. YOU ARE ASKED "BODY TYPE?" THEN + "DIP TYPE?". FIRST MAY NOT BE NULL, BUT SECOND CAN. + YOU ENTER THE EDITOR WITH IT (OR EMPTY). IF THE BODY DID + NOT EXIST BEFORE IT DOES NOW. + + +D I INPUT BODY DEFINITIONS FROM A DRAWING FILE. THIS ALLOWS YOU TO DEFINE + BODIES ONLY ONCE AND USE THEM IN ALL DRAWINGS. + +PC I LIKE I EXCEPT THAT ANY UNPADDED DRILL HOLES ARE GIVEN PAD + TYPE 1, BECAUSE UNPADDED HOLES DON'T WORK. + + I INPUT A DRAWING. + +D I INPUT BODY DEFINITIONS ONLY. WHEN A CONFLICT ARISES (BODY + ALREADY EXISTS), REPLACEMENT IS AUTOMATICALLY EFFECTED BY + A GEOMETRIC MAPPING! + +PC I INPUT A ROUTE FILE (FROM WAGNER'S ROUTING PROGRAM). ASKS FOR + FILENAME (DEFAULT EXTENSION IS "DAT"). FILENAME IS USUALLY + FOR21. THERE SHOULD ALREADY BE IN THE DRAWING THE DIPS + WHICH WERE ROUTED TO, IN THE EXACT POSITIONS AS WHEN + THE FILE TO THE ROUTER (FOR20.DAT) WAS WRITTEN. + +D L LIST ALL THE BODY TYPES ON THE TTY. FOR LIBRARY BODIES THE + LIBRARY NAME IS ALSO LISTED. + +D L LIST ALL THE BODY TYPES INTO A FILE WITH DEFAULT EXTENSION 'LST'. + ALSO LISTED IN THE FILE ARE ALL THE PLOT LABEL STRINGS. + + W WRITE OUT A WHOLE DRAWING IF THE FILENAME HAS NO + "." IN IT THE EXTENSION ".DRW" (OR ".PC" FOR PC PROG) WILL BE ATTACHED. + IF YOU SAY IN PLACE OF THE FILENAME THE LAST ONE USED + ON MAJOR INPUT OR OUTPUT WILL BE USED; IF NO PPN ARE GIVEN, + THEY ALSO WILL BE THE LAST ONES USED ON INPUT. IF OTHER + THAN THE LAST FILENAME AND PPN USED ON INPUT IS GIVEN, + A CHECK IS MADE TO SEE IF IT EXISTS ALREADY. + + W WRITE A WIRE LIST FILE. THE EXTENSION ".WD" (OR ".WPC" FOR PC PROG) IS + THE DEFAULT. + + W WRITE A PLOT FILE. THE EXTENSION "".DPL" AT DEC, .PLT" NOT AT DEC + (OR ".PCP" FOR PC PROG) WILL BE USED IF NONE IS SPECIFIED. + +PC R CHANGE THE WORKING SIDE OF THE PC CARD TO THE OTHER SIDE. + +PC R LEAVE "BOTH SIDES" MODE. + +PC R ENTER "BOTH SIDES" MODE. THE CURRENT WORKING SIDE IS + DISPLAYED AT BRIGHTNESS 7 AND THE OTHER SIDE AT CURRENT + BRIGHTNESS. + +PC ? USED IN CONJUNCTION WITH "SHORT" COMMAND. CAUSES NEXT SHORT + ERROR TO BE DISPLAYED. EACH POINT ASSOCIATED WITH THE ERROR + HAS A NUMBER FROM 1-4 ON IT. THIS NUMBER MAY BE USED IN THE + "J" COMMAND IN POINT MODE TO JUMP TO THE POINTS IN ERROR. + +D ? USED IN CONJUNCTION WITH "IWIRES" OR "IERRORS" COMMANDS. + STEPS THROUGH THE SIGNALS IN THE INTERNAL LIST ONE AT A TIME + WHICH ALLOWS YOU TO CORRECT THE ERRORS (IERRORS) OR JUST LOOK + AT ALL SIGNALS (IWIRES). THE IWIRES IS USEFUL FOR LOOKING + AT ROUTER ERRORS BY RUN # SINCE THE RUN # IS DETERMINED BY + THE ORDER OF THE WDR FILE. + + H ASKS FOR A VARIABLE NAME AND INCREMENTS THE VARIABLE. + NUMERIC VARIABLES GET THE NEXT VALUE; STRING + VARIABLES ARE SEARCHED FOR A NUMBER AND +1 IS ADDED; + MULTI-STRING VARIABLES GET SET TO THE NEXT STRING. + UPON REACHING THE LAST STRING, A MULTI-STRING VARIABLE + BECOMES A NULL STRING. (SEE ALSO ;H UNDER MACRO COMMANDS.) + + H DEFINES A VARIABLE. ASKS FOR A DEFINITION. TYPE + _ TO DEFINE A STRING VARIABLE OR + :... TO + DEFINE A MULTI-STRING VARIABLE OR + = TO DEFINE A NUMERIC VARIABLE. + IS ANY LENGTH AND CONSISTS OF THE CHARACTERS + A-Z, 0-9, . (PERIOD), %, $ (DOLLAR SIGN). + CONSISTS OF A STRING OF 'S OR + 'S SEPARATED BY COMMAS AND ENDING WITH + CARRIAGE RETURN. IS AN ALPHABETIC CHARACTER OR + A NUMBER (WITH OPTIONAL MINUS SIGN IN FRONT). + IS () + OR (). + + IF IS ALPHABETIC IN AN ITERATION SPEC, THEN + MUST ALSO BE ALPHABETIC. INCREMENTING AN + ALPHABETIC CHARACTER IS DONE ACCORDING TO THE DEC + ALPHABET. IF ADDING THE INCREMENT TO THE CURRENT VALUE + EXCEEDS (OR EQUALS) THE ENDVALUE, THEN THE VARIABLE IS + EQUAL TO THE ENDVALUE. IF THE CURRENT VALUE IS >0, THE + CURRENT VALUE IS PADDED WITH ENOUGH LEADING ZEROS TO + MATCH THE LENGTH OF THE INITIAL OF THE ITERATION + SPEC. IF THE IS OMITTED AT THE END OF THE + DEFINITION, THE LAST () GETS USED + INDEFINITELY. (THIS IS THE ONLY PLACE WHERE A ZERO + INCREMENT IS LEGAL.) IF THE DEFINITION ENDS WITH + A OR AND INCREMENTING IS CONTINUED + BEYOND THE END OF THE DEFINITION, +1 BECOMES THE DEFAULT + INCREMENT. + + H TYPES ALL VARIABLES AND THEIR CURRENT VALUES ON THE TTY. + + ****************************** PATTERN MATCHING ******************** + + THERE ARE A NUMBER OF COMMANDS WHICH SEARCH FOR TEXT + STRINGS THAT MATCH A USER SUPPLIED PATTERN. (GENERALLY F) + HERE IS HOW THE MATCHING IS DONE: + IF THE FLAG FOR "SPACES" IS OFF (DEFAULT) THEN ANY + SPACES IN EITHER THE STRING OR THE SEARCH STRING + ARE IGNORED, OTHERWISE THEY ARE NORMAL CHARS. +  IS CONVERTED TO A SPACE. IF THE FLAG "EXACT" + IS OFF (DEFAULT) THEN LOWER CASE CHARS ARE CONVERTED + TO UPPER CASE. + THE FOLLOWING SPECIAL CHARS ARE CURRENTLY RECOGNIZED: + + | BEGINNING OR END OF LINE. + +  ANY CHARACTER. + + ~ INVERT MATCH CONDITION ON NEXT THING. + +  ANY NUMBER OF NEXT THING WILL MATCH, INCLUDING 0. + SMALLEST NUMBER OF CHARACTERS NECESSARY WILL BE USED. + +  QUOTE NEXT CHARACTER. + +  DOLLAR SIGN) MATCH ANY LETTER. + + % MATCH ANY DIGIT (0-9). + +  MATCH ANY ALPHANUMERIC. + X TYPES "WELL?" TO WHICH YOU MAY TYPE ANY OF THE + COMMANDS IN THE FOLLOWING LIST, SEPARATED BY COMMAS ENDING WITH + . THE ENTIRE LINE IS SCANNED BEFORE EXCUTING ANY OF THE COMMANDS. + + THE EXTENDED SCANNER IS FOR SETTING THE VALUE OF VARIABLES. + TYPE ONE OF THE FOLLOWING TEXT STRINGS: + + HELP START EXIT BOOP- INIT- FDIP EXACT- LOWER- + IMACRO WMACRO- AMACRO SMACRO- QUIT SPACES- CENTER- AUTOSA- + AUTOWR- ESAVE EWRITE ELIST EPLOT ENAME- MAKEWD SAVE + SETWRT WRTSET DPY- MACRO RMACRO DMACRO- PMACRO CLEAR + CURSOR- DDT BRIGHT- CURBRT- MOVE SCALE SIZE XOFF + YOFF TEXT- WINDOW- LWINDO- DELNUL DANGLE DELSET SETCEN + COUNT DSKIN DSKINH IFLUSH DSKOUT CLOSE NEWID PINS- + LOCS- CLOCS- CPINS- LINES- LOCATE- CLOCAT- SETLOC- FLASH- + ERROR- IDENTS- LIBPPN- BOARD- NOMENC- AVAILA IWIRES- LSIGNA + NFLASH LPROPS IDEFS RDEFS IERROR- FIXEM PTEXT- BTEXT- + TMOVE LMOVE TERMRU- SETPIN- SLICE TSLICE- DELLIB LOCLIB + GETLIB TYPLIB LIBTYP MODLIB- MAPLIB- LIBMAP- GETBOD RENAME + TYPDEL DELTYP DIAMON- PBOX SHOWBO- PICCEN DEFPIN- RPINID- + UNHIDE- HIDE- FIXALL OUTSID- TITLE- SITE- AUTHOR- REVISI- + MODULE- VARIAB- PREFIX- NUMBER- PROJEC- PAGE- DCODE- LTITLE + TRANSP OFFALL OFFRIG- OFFLOC DISLOC- CHANGE ICHANG ICPINS + UNDERL- CBOX- IPINS CEXCHA MUNG FSIGNA FLNAME FLDIP + FLNEXT FLPIN FLPNEX RSPINI + + + HELP LISTS ALL EXTENDED COMMAND NAMES IN A SUITABLY COLUMNATED FORMAT. + +DEC TIME PRINTS THE RUNTIME, RUN QUEUE TIME, % SERVICE, AND REALTIME + SINCE LAST "TIME" OR "-TIME" COMMAND. RUN QUEUE + TIME IS THE AMOUNT OF TIME YOU SPENT IN THE RUN QUEUE + REGARDLESS OF WHETHER YOU WERE RUNNING OR NOT. + % SERVICE IS (RUNTIME * 100)/(RUN QUEUE TIME). + ALL TIMES ARE IN SECONDS. + +DEC -TIME RESET TIME CELLS (START ACCUMULATING FOR NEXT TIME COMMAND). + + BOOP ASKS FOR TIME IN SECONDS AFTER WHICH TO BOOP. + THEN IF THAT MANY SECONDS ELAPSE BETWEEN INPUT OF + THE LAST CHARACTER AND GOING INTO INPUT WAIT FOR THE + NEXT, THE BOOPER IS BOOPED (RING THE BELL). + + -BOOP DISABLE BOOPING. + + SLICE ASKS FOR "LOWER BOUND?" THIS SETS THE + UPPER AND LOWER BOUNDS ON RESULTS OF EXPRESSIONS IN + BRACKETS. THE BOUNDS ARE INCLUSIVE AND UPPER BOUND + MINUS LOWER BOUND MINUS ONE IS ADDED(SUBTRACTED) + TO(FROM) THE RESULT UNTIL IT IS INSIDE THE BOUNDS. + RETURN WILL SET THEM TO - AND + INFINITY RESPECTIVELY. + NOW YOU ARE ASKED FOR "SET VARIABLES, LN?". YOU MAY + TYPE A STRING OF LETTER NUMBER PAIRS SEPARATED BY + COMMAS. WHENEVER THE LETTER IS ENCOUNTERED IN AN + EXPRESSION IT IS REPLACED BY ITS VALUE (THE NUMBER). + +PC INNER THIS IS TO MAKE A "INNER PLANE FILE". IT DELETES ALL + TEXT, LINES, AND POINTS WHICH ARE NOT DRILL HOLES + AND PADS ALL DRILL HOLES WITH PAD TYPE 2 (CLEARANCE) + THIS IS THE NORMAL INPUT TO THE "PPLOT" COMMAND TO + MAKE INNER PLANE PLOTS. AFTER GIVING THIS COMMAND + TEXT AND LINES MAY BE ADDED, PAD TYPES MAY BE CHANGED + ETC., THE "CURRENT" SIDE IS STILL THE ONE WHICH GETS + PLOTTED. + + CLEAR THIS DELETES "ALL" BODIES, POINTS, SETS, AND + DEFINITIONS OF BODIES. + IT ALSO RESETS ALL SCREEN PARAMETERS TO THEIR DEFAULTS + WHEN THE PROGRAM STARTS UP. FLAGS LIKE "LOWER" (LOWER CASE) + AND "OUTSIDE" (OFFSET PIN #S OUTSIDE BODY) ARE NOT + RESET. + + + DSKIN ASKS FOR A FILE NAME. THEN USES SAID FILE IN PLACE OF + TELETYPE INPUT. USE SAME FORMAT IN FILE AS FROM TTY. + AT STANFORD, USE NOT EQUAL (OCTAL 33) IN PLACE OF ALTMODE + IN FILE. , , REPLACE AND . + DISK INPUT BREAKS CAN BE GENERATED BY CHARACTER SPECIFIED + IN ;Y MACRO COMMAND. + IF AN ERROR OCCURS (THAT WHICH CAUSES ??? TO BE TYPED) + AN AUTOMATIC DISK INPUT BREAK WILL BE GENERATED! + + DSKINH DSKINHOLD. THIS IS EXACTLY LIKE DSKIN, EXCEPT THAT + AFTER SETTING UP THE INPUT FILE, IT GENERATES A DSK + INPUT BREAK. + + IFLUSH THIS COMMAND WILL FLUSH DISK INPUT BEFORE END OF FILE. + + DSKOUT ASKS FOR FILE NAME. ALL TELETYPE INPUT IS COPIED TO + THE OUTPUT FILE. THE FILE IS NOW OF THE FORM TO USE + WITH "DSKIN". + + CLOSE CLOSES THE FILE ENTERED BY "DSKOUT". + +NODEC SAVE ASK FOR A FILENAME, THEN SAVES THE CURRENT CORE IMAGE + UNDER THAT FILENAME, THE DEFAULT EXTENSION IS DMP. + THE STARTUP ADDRESS IS SET TO RESTORE THE AC'S AND + RETURN AS IF YOU HAD JUST GIVEN THE SAVE COMMAND. + +DEC SAVE SAVES THE ACS AND SETS START ADDRESS TO SPECIAL PLACE + THEN EXITS TO MONITOR. YOU CAN SAVE THE CORE IMAGE + AND RUN IT LATER. YOU MAY ALSO START THIS CORE IMAGE + AND CONTINUE ON. IN ANY CASE YOU COME BACK AFTER THE + SAVE COMMAND. + +L RESAVE LIKE SAVE COMMAND, BUT CAUSES THE PROGRAM TO RESTART + WHEN IT IS RUN AGAIN. THIS IS GOOD FOR PATCHING + AND NOT HAVING THE NAME "L.DMP[1,3]" REMEMBERED AS + THE NAME. + +NODEC ESAVE THIS DOES A SAVE WITH THE REMEMBERED NAME () + + AUTOSAVE THIS ASKS "HOW MANY COMMANDS BETWEEN ESAVES?" AND + EVERY TIME THAT MANY TOP LEVEL COMMANDS ARE PROCESSED + IT DOES AN "ESAVE". + + -AUTOSAVE DISABLE AUTOSAVE. + + EWRITE THIS WRITES OUT THE DRAWING WITH THE REMEMBERED NAME () + + AUTOWRITE THIS ASKS "HOW MANY COMMANDS BETWEEN EWRITES?" AND + EVERY TIME THAT MANY TOP LEVEL COMMANDS ARE PROCESSED + IT DOES AN "EWRITE". + + -AUTOWRITE DISABLE AUTOWRITE. + + ELIST WRITES A WIRE LIST FILE ('WD') WITH THE CURRENT + DEFAULT NAME. THE DEFAULT PPN IS NOT USED, + THE CURRENT AREA IS USED INSTEAD. IF YOU WANT + THE DEFAULT AREA, USE W INSTEAD. + + EPLOT WRITES A PLOT FILE ('DPL') WITH THE SAME NAME + CRITERIA AS IN ELIST. + + ENAME ACCEPTS A FILE SPECIFICATION TO USE AS THE NAME. + ALONE WILL CLEAR THE NAME. + + MAKEWD SETS BODY MODE AND DOES A CLEAR. + ASKS FOR A FILENAME, THEN IF THE DATE + OF THE 'WD' FILE CORRESPONDING TO THE 'DRW' FILE + WHOSE NAME YOU TYPED IS OLDER THAN THAT OF THE 'DRW' FILE, + THE 'DRW' FILE IS READ IN AND THE 'WD' FILE + WRITTEN OUT. + + SETWRT + WRTSET + LIKE W, EXCEPT THAT ONLY THE PINS AND BODIES IN + THE CLOSEST SET ARE WRITTEN INTO THE FILE. + + IWIRES THIS READS A LOGIC DRAWING WIRE LIST (ASKS FOR FILENAME) + AND BUILDS AND INTERNAL LIST OF POINTERS TO THE APPROPRIATE + PINS ON THE PC CARD (MUST HAVE ALREADY READ IN THE PC + CARD DRAWING). THIS COMMAND IS CURRENTLY ONLY USED WITH + THE "WROUTE" COMMAND. THE DEFAULT EXTENSION IS "WDR" + WHICH IS GENERATED BY THE UML "W" COMMAND. + +D IERRORS READS A 'LES' FILE IN AND PRINTS THE CATEGORY TITLE + THEN A "?". IF YOU TYPE "Y" IT READS IN THE RUNS IN + THE CATEGORY. OTHERWISE IT SKIPS THAT CATEGORY AND + GOES TO THE NEXT ONE. ONLY ONE CATEGORY IS READ IN + AT ANY TIME. + + -IWIRES +D -IERRORS THIS RELEASES THE STORAGE USED BY THE "IWIRES" + AND "IERRORS" COMMANDS. + +PC WROUTE ASKS FOR FILENAME, THEN WRITES THE FILE FOR INPUT TO + WAGNER'S ROUTING PROGRAM. IF THERE IS NO INTERNAL + POINTER LIST, YOU GET AN ERROR MESSAGE. THE NORMAL + FILENAME THAT WAGNER'S PROGRAM USES IS "FOR20". + THIS COMMAND DOES NOT PASS ANY WIRES WITH THE SIGNAL + NAMES "VCC" OR "GND". + ANY EXISTING WIRES OR FEED THROUGHS ARE PASSED TO THE + ROUTING PROGRAM, BUT WAGNER WILL NOT NOTICE IF THEY + PARTIALLY OR COMPLETELY CONNECT PINS WHICH NEED CONNECTING. + +D IUML THIS READS A FILE FOR UPDATING DIP LOCATIONS AND + CONNECTOR PIN NUMBERS. IT ASKS FOR A FILENAME. THE + DEFAULT EXTENSION IS .UML. THE FILE IS THEN READ AND + THE UPDATES ARE MADE. THE FILE FORMAT IS AS FOLLOWS: + BODIES + + PINS + + END + EACH TIME THE WORD "BODIES" OR "PINS" IS SEEN, THE + PROGRAM MAKES A LIST OF CURRENT BODY OR PIN LOCATIONS. + AFTER AN UPDATE, THE UPDATED BODY OR PIN IS REMOVED + FROM THE LIST SO THERE IS NO CHANCE OF CONFUSION. + AS MANY BODIES OR PINS AS DESIRED MAY BE LISTED UNDER + THE WORD "BODIES" OR "PINS". THE BODIES SECTION AND + THE PINS SECTION MAKE BE OMITTED OR REVERSED IN ORDER + BUT THE WORD "END" MUST BE PRESENT ELSE AN ERROR + MESSAGE WILL BE FORTHCOMING. + SINCE THE DRAWING PROGRAM WAS DESIGNED TO HANDLE + THE CASE WHERE MORE THAN ONE CARD MAY APPEAR IN + A SINGLE DRAWING. IF THE PERMANENT CARD LOC + IS SET FOR THIS DRAWING, YOU WON'T BE ASKED. + OTHERWISE YOU MUST TYPE THE CARD LOCATION OF THE + BODIES AND CPINS TO BE UPDATED. IF THE DRAWING ONLY + CONTAINS ONE CARD BUT NO PERMANENT CARD LOC + IS SET, YOU MAY TYPE TO THE CARD LOC PROMPT. + +D IPINS THIS READS A FILE FROM WAGNER'S PARTIONING PROGRAM + IT ASKS FOR A FILENAME (PROBABLY FOR20.DAT) THEN ASKS + IF WANT A FILENAME OTHER THAN THE CURRENT DEFAULT ONE. + THE CURRENT DEFAULT FILE NAME IS THE ONE YOU GET WHEN + YOU USE AN . IF THE FILENAME WHICH APPEARED IN THE + "FILE" COLUMN OF THE WIRE LIST FOR THE PINS YOU WANT + IS DIFFERENT THAN THE "CURRENT" ONE, TYPE T. ELSE + JUST TYPE CR. + + CEXCHANGE + EXCHANGE BACKUP CONNECTOR PIN NAME WITH CURRENT CONNECTOR + PIN NAME. BACKUP PIN NAME IS SET WHENEVER THE CURRENT CONNECTOR + PIN NAME IS A "U" PIN AND THE ONE BEING SET IS NOT. + + LSIGNALS TYPES OUT ALL THE SIGNAL NAMES ASSOCIATED WITH WIRES + IN WIRLST. + +PC FLASH ASKS FOR A SIGNAL NAME, THEN FINDS THAT WIRE AND FLASHES + IT. THE FLASHING POINTS MAY NOW BE USED IN THE SAME + WAY AS IF YOU GOT THEM FROM THE LOGIC PROG. + WILD PINS IN RUN ARE INDICATED ON LABEL LINE AT TOP. + + -FLASH TURNS OFF ANYTHING THAT IS FLASHING!!! + +PC NFLASH ASKS FOR A WIRE NUMBER. THE NUMBER IS THE ONE + WHICH WAS PASSED TO THE ROUTER IN THE DAT FILE. + THEN FINDS THE WIRE AND DOES THE SAME AS FLASH. + + ERROR RE-ENABLE ERROR DISPLAY. + + -ERROR THE . (THAT'S ) IN D&PC + (LAYOUT VERSION ONLY) AND "FLASH" AND "NFLASH" COMMANDS + IN PC, MAY ATTEMPT TO SHOW ERRONEOUS PINS BY DISPLAYING + "O_??" WITH THE "O" CENTERED ON THE PIN. THIS IS VERY + CONFUSING, SO THE "ERROR" COMMAND CAN ENABLE AND DISABLE + THE DISPLAYING OF THIS INDICATOR. + + MACRO TYPES THE NAMES OF ALL DEFINED MACRO'S! + + AMACRO ASKS FOR MACRO NAME, IF IT EXISTS, YOU ARE NOW IN ALTER + MODE WITH THE MACRO. THE FOLLOWING CONVERSIONS WERE MADE + TO PUT THE 9 BIT MACRO INTO THE 7 BIT TEXT EDITOR: + + MACRO CHAR TEXT EDITOR CHAR + ^K +

^L + ^T +NODEC ^[ +DEC ^G + + QUIT LEAVE MACRO ALTER MODE WITHOUT MODIFYING ORIGINAL MACRO + + WMACRO WRITES ALL CURRENTLY DEFINED AND NAMED MACROES INTO A FILE + THE DEFAULT EXTENSION IS 'MCR'. ALSO WRITES OUT ALL VARIABLE + DEFINITIONS (H). + + IMACRO READS A FILE WRITTEN BY "WMACRO" COMMAND AND DEFINES ALL THE + MACROES FOUND THEREIN, ALSO VARIABLE DEFINITIONS. + + RMACRO RENAME A MACRO. ASK FOR OLD NAME, THEN NEW NAME. NEW NAME + MUST NOT BE IN USE ALREADY. + + DMACRO DELETE A MACRO. ASK FOR MACRO NAME. MUST BE AT MACRO LEVEL + 0 (I.E. NO MACROS IN PROGRESS). + + PMACRO TYPE NAME OF MACRO, MACRO IS PRINTED ON CONSOLE INTERPRETING + CONTROL BITS INTO THEIR , , AND  REPRESENTATION. + + SMACRO ASKS FOR A MACRO NAME. ENABLES THE NAMED MACRO TO BE SAVED + IN THE DRW OR PC FILE. A SPECIAL FEATURE INVOLVED IN THIS + IS AFTER COMPLETION OF INPUT, THE MACRO NAMED "INIT" IS + CALLED (IF DEFINED). THIS ALLOWS YOU TO HAVE THE WORLD SET + IN A CERTAIN STATE WHEN A PARTICULAR DRAWING IS READ IN. + NOTE: THESE MACROES ARE READ IN FROM LIBRARIES ALSO! + ALSO, THE MACRO NAMED "INIT" AUTOMATICALLY HAS AN "SMACRO" + COMMAND DONE TO IT WHEN IT IS DEFINED (;M OR ;D). + + -SMACRO THIS DISABLES THE NAMED MACRO FROM BEING SAVED. + + INIT ENABLE THE CALLING OF MACRO NAMED "INIT" WHEN DRAWING IS + READ IN (THIS IS THE DEFAULT). + + -INIT DISABLE THE CALLING OF THE MACRO NAMED "INIT". + + DPY ENABLE DISPLAYING. + + -DPY DISABLE ALL DISPLAYING. + +PC FLIP INVERTS THE X COORDINATES OF THE DISPLAY SO YOU + CAN LOOK AT THE CARD FROM THE "OTHER" SIDE. + ALSO AFFECTS PLOTTING, SO YOU CAN READ THE TEXT + THAT YOU PUT ON THE SOLDER SIDE OF THE BOARD + WHEN IT IS ETCHED. + + PINS ENABLE DISPLAY AND PLOTTING OF PIN #'S. + THIS INCLUDES CONNECTOR PINS. + + -PINS DISABLE PINS. + + LOCS ENABLE DISPLAY AND PLOTTING OF BODY LOC'S. + + -LOCS DISABLE LOCS. + +D DISLOC SEE EDIT MODE. + +D -DISLOC SEE EDIT MODE. + +D IDENT ENABLE DISPLAYING OF BODYNAMES NEAR BODIES! +D&PC ALSO DISPLAYS DIPNAME IF ANY! + + -IDENT DISABLE SAME. + +D CLOCS + CPINS TURN ON CONNECTOR PIN LOCS. + +D -CLOCS + -CPINS TURN OFF CLOCS. + +D CBOX ENABLE DISPLAYING OF BOXES AROUND CONNECTOR + PIN DESIGNATIONS (THIS IS THE DEFAULT MODE). + +D -CBOX NO BOXES PLEASE. + +D DEFPINS ENABLE DISPLAYING OF DEFAULT PIN NAMES FROM DEFINITION. + +D -DEFPINS DISABLE DISPLAYING OF DEFAULT PIN NAMES. + +D RPINID ENABLE DISPLAYING OF PIN IDS. THESE ARE GENERATED NUMBERS + USED TO UNIQUELY IDENTIFY PINS. THEY ARE NOT TO BE CONFUSED + WITH DEFAULT PIN NAMES. + +D -RPINID DISABLE DISPLAYING OF PIN IDS. + + LINES ENABLE DISPLAYING OF LINES. + + -LINES DISABLE DISPLAYING OF LINES. + +PC DIPS ENABLE DISPLAYING OF DIP PADS ABOVE SCALE OF 5. + +PC -DIPS DISABLE DISPLAYING OF DIP PADS, SHOW BOX + APPROXIMATING PADS. + +PC FINGERS ENABLE DISPLAYING OF CARD FINGERS AND SHORTING BARS + +PC -FINGERS DISABLE SAME. + +PC FEEDTHROUGH ENABLE DISPLAYING OF "X" "" "O" ETC AT FEEDTHROUGHS AND PADS + +PC -FEEDTHROUGH DISABLE SAME, + +PC COMPONENT FORCE CURRENT SIDE TO BE COMPONENT SIDE + +PC SOLDER FORCE CURRENT SIDE TO BE SOLDER SIDE + + TEXT ENABLE TEXT. + + -TEXT DISABLE TEXT. + +D PTEXT ENABLE POINT TEXT SEPARATELY FROM BODY TEXT. + +D -PTEXT DISABLE POINT TEXT SEPARATELY. + +D BTEXT ENABLE BODY TEXT SEPARATELY. + +D -BTEXT DISABLE BODY TEXT SEPARATELY. + +D SETPINS DOES A P TO ALL BODIES IN THE DRAWING. SEE P IN + BODY MODE. + +D -SETPINS CLEARS ALL DIP PIN #'S (SO DEFAULT PIN NAMES GET USED). + +D TRANSPOSE ASKS FOR BODY NAME, THEN "L" OR "R" AND DOES T FOR + ALL BODIES OF THE NAME YOU TYPED. + +PC SETDIP ASKS FOR DIP TYPE NAME, AND REMEMBER THAT FOR THE + CLOSEST BODY FOR WIRE LISTER. + +D OFFALL DOES AN Q AND AN Z TO EVERY POINT IN THE DRAWING. + + XTHICK SETS A FLAG SO THAT Z AND Q ASSUME THAT YOU ARE GOING + TO PLOT YOUR FILE IN EXTRA THICK MODE WITH P OR PCP (THE + E COMMAND). IT CAUSES IT TO THINK THAT POINT TEXT IN SCALE + ONE AND CONNECTOR PIN TEXT ARE ONE BIT WIDER THAN ORDINARILY. + THIS DOESN'T YET DO THE RIGHT THING FOR BODY TEXT. + +D OFFRIGHT CAUSES ANY Z COMMANDS TO ALSO SET A BIT WHICH CAUSES + THE LINE TO BE MOVED TO THE RIGHT INSTEAD OF MOVING THE POINT + LEFT. + +D -OFFRIGHT TURN OFF OFFRIGHT FEATURE (DEFAULT STATE). + + FDIP ASKS FOR A DIP TYPE NAME, THEN FINDS ALL + BODIES IN DRAWING WHICH USE THAT DIP TYPE AND + MARKS THEM FOR THE "F" COMMAND IN BODY MODE. + + FLNAME ASKS FOR A BODY DEFINITION NAME, THEN FINDS + ALL BODY DEFINITIONS IN DRWING WHICH HAVE THAT + NAME. USE "XFLNEXT" TO EDIT THEM. + + FLDIP SAME AS FLNAME, BUT FINDS DEFINTIONS BY DIP TYPE NAME + INSTEAD OF BODY NAME. + + FLNEXT IF NOT IN EDIT OR ALTER MODE, FIND NEXT MARKED BODY + DEFINITION AND ENTER THE EDITOR WITH IT. + + FLPIN SEE EDIT PIN MODE. + + FLPNEXT SEE EDIT PIN MODE. + +D TMOVE MOVE TEXT OFFSET USING CURSOR MOVING COMMANDS, BUT + THE OFFSET IS CHANGED DIRECTLY. THAT IS THE CURSOR MOVE + COMMAND IS NOT SCALED BUT IS 1, 2, 4, 8, 16, 32, OR 64 + INCREMENTS (AND INCREMENT IS 1/8 OF A SIZE 1 CHAR WIDTH). + TO EXIT THIS MODE, TYPE SPACE OR ALTMODE. ANY OTHER CHAR + IS AN ERROR. WORKS FOR POINT TEXT AND EDIT TEXT. + +D LMOVE SAME AS TMOVE, BUT MOVES CONNECTOR PIN LOCATION OFFSET. + +D OFFLOCS THIS CAUSES THE LOCATION OFFSETS FOR ALL BODY LOCATIONS + CURRENTLY SET IN THIS DRAWING TO BE SET TO THE VALUE FROM + THE BODY DEFINITION. AND SETS THE BIT TO CAUSE THIS + OFFSET TO REMAIN WITH THAT OF THE DEFINITION. + +D FIXALL DO F (EDIT PIN MODE COMMAND) TO ALL BODIES.. + +D OUTSIDE SET MODE TO PUT PIN #'S OUTSIDE DURING AUTO PLACING. + (DEFAULT AT DEC) + +D -OUTSIDE SET MODE TO PUT PIN #'S INSIDE DURING AUTO PLACING. + (DEFAULT NOT AT DEC) + + WINDOW LIMIT OPERATIONS TO THE ON SCREEN PORTION OF THE + DRAWING.(THIS IS THE DEFAULT FOR NODEC) + + -WINDOW ALL OPERATIONS APPLY TO THE ENTIRE DRAWING + NOT JUST THOSE THINGS ON SCREEN. (THIS IS DEFAULT FOR DEC) + + LWINDOW ANY LINE SEGMENT WHICH HAS ONE OR MORE ENDPOINTS + OFF SCREEN IS SOFTWARE WINDOWED. THIS CAUSES + A NOTICABLE AMOUNT OF COMPUTING SO BE CAREFUL! + + -LWINDOW DISABLE LWINDOW (AND SAVE TIME). + + NEWID RE-ALLOCATE ALL BODY AND POINT ID'S, THIS MAY BE + NECESSARY IF A LOT OF SET COPYING AND DELETIONS + ARE DONE. + +D DIAMONDS + ENABLE PLOTTING OF DIAMONDS AT THE INTERSECTION + OF FOUR LINE SEGMENTS (NOT SHOWN ON DISPLAY). + ASKS IF YOU WANT DIAMONDS AT THE INTERSECTION OF + THREE LINES! + +D -DIAMONDS + DISABLE DIAMONDS + + CURSOR ENABLE LIGHT PEN TRACKER. + + -CURSOR DISABLE LIGHT PEN TRACKER. + + CLOCATE SHORT DASHED LINES, ONE HORIZONTAL AND ONE VERTICAL + INDICATE THE CURRENT CURSOR POSITION. + + -CLOCATE DISABLE CLOCATE. + + LOCATE LONGER DASHED LINES, ONE HORIZONTAL AND ONE VERTICAL + INDICATE THE LOCATION OF THE "CLOSEST" THING. + + -LOCATE DISABLE LOCATE. + + CENTER CENTERS FLASHING POINTS(PC PROG) OR LINES(DRAWING PROG) + AND SETS APPROPRIATE SCALE FACTOR TO SEE ALL FLASHING + PINS. THIS IS DONE WHEN YOU TYPE THE COMMAND IF ANY + PINS ARE FLASHING, AND WHEN YOU START FLASHING ANY + NEW ONES. + + -CENTER DISABLE CENTERING. + + SPACES MAKES SPACES SIGNIFICANT FOR ALL COMPARISONS. + THIS APPLIES TO ALL F COMMANDS, F IN ALTER MODE, + AND "FLASH" EXTENDED COMMAND. + + -SPACES SPACES ARE NOT SIGNIFICANT, IN THIS MODE "" IS TREATED + AS A SPACE. + + EXACT MAKES MATCH ROUTINE FOR ALL F, AND F COMMANDS, F IN ALTER MODE, AND + "FLASH", FDIP, ETC. EXTENDED COMMAND, TREATING + ALL CHARACTERS AS THEY ARE, DOESN'T CONVERT LOWER CASE + TO UPPER OR  TO SPACE. + + -EXACT SEE UPPER AND LOWER CASE AS SAME. THIS IS THE DEFAULT. + + DDT ENTERS DDT(RAID) IF PRESENT. TO RETURN + TYPE "RG". + + SCALE SET SCALE FACTOR.(GUARANTEED TO PUT GRID POINTS + ON SCOPE POINTS.) + ORIGINALLY SCALE=16 (8 AT DEC) (2 FOR PC) + +PC STEP SET THE MINIMUM DISTANCE THE CURSOR WILL MOVE + FOR SMALLEST STEP (MUST BE DIVISIBLE BY 5 (MILS)). +D SIZE ASKS FOR PLOTING SCALE, THEN TELLS YOU HEIGHT + AND WIDTH OF DRAWING AND THE SMALLEST BOX WHICH + WILL FIT AROUND IT. AT DEC, THE BOX SIZE IS INDEPENDENT + OF THE PLOT SCALE. VALUES GIVEN ARE WITH RESPECT TO + CURRENT DRAWING SCALE. + +PC SIZE TELLS YOU HOW WIDE YOUR PC CARD WILL BE (NOT + COUNTING THE CARD OUTLINE) WHEN PLOTTED AT A + SCALE OF 1 (REAL SIZE). + + BRIGHT ASKS: + + NORMAL BRIGHTNESS? + + ADDITIONAL BLINKING BRIGHTNESS? + (BLINKING BRIGHTNESS REFERS TO THE + THE BRIGHNESS OF FLASHING ITEMS.) + + PC BOTH SIDES BRIGHTNESS? + + + -BRIGHT RESETS ALL OF THE ABOVE TO THEIR DEFAULTS + AT STARTUP TIME. + + + CURBRT SETS CURSOR BRIGHTNESS + + -CURBRT SETS CURSOR BRIGHTNESS BACK TO DEFAULT AT STARTUP TIME. + + MOVE MOVES CURSOR X,Y(IN MILS) RELATIVE TO + ITS CURRENT POSITION. IN DAWING PROG + IT MOVES IN HALF GRID STEPS. + + XOFF SETS ABSOLUTE X OFFSET. + + YOFF SETS ABSOLUTE Y OFFSET. + +D TITLE ASKS FOR 2 STRINGS, "TITLE LINE 1" AND "TITLE LINE 2" + THESE ARE REMEMBERED AND USED FOR PLOT FILES SO YOU + DON'T HAVE TO TYPE IT TO THE PLOT PROG. IF NULL STRING + IS GIVEN, THE PLOT PROG WILL ASK FOR THAT ONE. + At CMU only the first title line is actually plotted. + +D -TITLE STORE TITLE LINES IN MACRO SEPERATED BY CRLF. + +D SITE SIMILAR TO "TITLE", NAMELY IT ASKS FOR 2 STRINGS. + "SITE LINE 1" AND "SITE LINE 2". THESE APPEAR + IN THE BOX TO THE LEFT OF THE TITLE LINES ON A PLOT. + NO LONGER USED AT DEC. + +D -SITE STORE SITE LINES IN MACRO SEPERATED BY CRLF. + +D AUTHOR LIKE TITLE BUT SETS STRING TO BE USED IN THE + FRONT OF WIRELISTS ONLY. + +D -AUTHOR STORE AUTHOR LINE IN MACRO. + +D MODULE SET A STRING WHICH IS THE MODULE NAME. THIS STRING + WILL APPEAR ON PLOTS IN BOX LABELED "NUMBER". + THIS WILL ALSO APPEAR IN FRONT OF WIRE LISTS AND + WILL BE CHECKED FOR CONSISTENCY ON EACH CARD. + +D -MODULE STORE MODULE LINE IN MACRO. + +D VARIABLE SET A STRING WHICH IS THE VARIABLE PART OF THE DRAWING + NUMBER. IT APPEARS AFTER THE MODULE NAME SEPERATED BY + A DASH. + +D -VARIABLE STORE VARIABLE LINE IN MACRO. + +D PREFIX SET A STRING WHICH IS THE REFERENCE PART OF THE DRAWING + NUMBER. IT APPEARS AFTER THE VARIABLE PART AND IS SEPERATED + BY A DASH. AT SOME POINT THIS MAY BE CHECKED AGAINST THE + BEGINNING OF ALL SIGNAL NAMES WHICH ORIGINATE ON THIS DRAWING + TO SEE THAT THEY ARE PREFIXED CORRECTLY. + +D -PREFIX STORE PREFIX LINE IN MACRO. + +D REVISE SET A STRING WHICH IS THE REVISION LEVEL. THIS + STRING WILL APPEAR ON PLOTS IN BOX LABELED "REV.". + IT WILL ALSO APPEAR IN THE FRONT OF WIRE LISTS. + +D -REVISE STORE REVISION LINE IN MACRO. + +D SHEET +D PAGE SET 2 STRINGS, "SHEET" AND "OF". THESE ARE PLOTTED + IN THE PLOT LABEL BOX AND ON WIRELISTS INDICATING + WHAT PRINT OF A GROUP THIS IS. + +D -SHEET +D -PAGE STORE PAGE AND OF STRINGS IN MACRO SEPERATED BY CRLF. + +D DCODE SET DRAWING CODE FOR PLOT PROGRAM. THIS STRING SHOULD + BE NO MORE THAN 2 LETTERS. IT INDICATES THE TYPE + OF DRAWING THIS IS. IF NO STRING IS SET, "CS" WILL BE + USED BY THE PLOT PROG. "CS" STANDS FOR CIRCUIT SCHEMATIC. + BEFORE INVENTING A NEW CODE, CONSULT THE APPROPRIATE + DEC STANDARD TO SEE IF ONE ALREADY EXISTS. + +D -DCODE STORE DRAWING CODE LINE IN MACRO. + +D NEXTHI SET STRING TO APPEAR IN "NEXT HIGHER ASSEMBLY:" BOX + IN PLOT BOX. + +D -NEXTHI STORE NEXTHI STRING IN MACRO. + +D DRAWN THIS SETS A SIGNATURE FILE NAME (DEFAULT EXTENSION + 'SIG'). THE SIGNATURE WILL BE PLOTTED IN THE BOX + LABELED "DRN." THE DATE ON WHICH YOU GIVE THIS COMMAND + WILL ALSO BE PLOTTED IN THE CORRESPONDING "DATE" BOX. + +D -DRAWN STORE DRAWN SIGNATURE FILENAME STRING IN MACRO. + +D ENGINEER LIKE DRAWN BUT APPEARS IN BOX LABELED "ENG.". + +D -ENGINEER LIKE -DRAWN. + +D LTITLE LISTS ALL THE PLOT BOX LABEL INFO. + +D PBOX ASKS FOR BOX SIZE (TYPE SINGLE LETTER A-D OR + PRECEDE WITH "V" TO GET VERTICAL STYLE BOX). + SCALES DRAWING AND TEXT TO JUST FIT INTO BOX + BUT MAINTAINS RATIO BETWEEN TEXT AND LINES + WHICH YOU SEE ON THE SCREEN. WILL NOT BE SCALED + LARGER THAN THAT WHICH MAKES TEXT LARGER THAN + SIZE 3 ON PLOTTER. TELLS YOU SCALES BEFORE ASKING + FOR FILE NAME. + +D SHOWBOX ASKS FOR "/?" + THESE INDICATE THE BOX YOU WILL USE, THE DRAWING SCALE + AT WHICH YOU WILL MAKE THE PLOT FILE (THE ONE IT LOOKS + GOOD AT), AND THE PLOT SCALE YOU WILL USE LATER (USUALLY + CONTROLLED BY THE CHAR SIZE YOU WANT). PLOT SCALE + IS NOT REQUIRED (IN FACT NOT ALLOWED) AT DEC. THIS PUTS UP A + BOX EXACTLY WHERE THE PLOT PROG WILL PLOT IT (DOESN'T + INCLUDE THE ID BOX AT THE BOTTOM, JUST THE USABLE SPACE). + THE BOX DOESN'T CHANGE RELATIVE TO THE DRAWING WHEN YOU + SHIFT OR SCALE IT. IF DRAWING SCALE IS LEFT OUT CURRENT + SCALE IS USED. IF PLOT SCALE IS LEFT OUT, 2 IS USED. + YOU MAY USE BOXES A-E, OR VB-VE (OR X AT STANFORD). + +D PICCEN CALCULATES A SHOWBOX, THEN MOVES ENTIER DRAWING SO THAT + THE BOX WOULD BE CENTERED AROUND THE ABSOLUTE ORIGIN. + +PC PPLOT PLOT AN INNER PLANE. ASKS FOR PLANE NUMBER. DOESN'T PLOT + PADS WHICH TOUCH THE PLANE IN QUESTION. LINES ARE + PLOTTED. WILL ALSO PLOT TEXT. + +D MUNG MASSAGE. TRIES TO MAKE ALL LINES IN THE DRAWING EITHER + HORZ. OR VERT. + +PC MUNG FORCES ALL POINTS AND DIPS ONTO GRID POINTS. + THIS IS DONE BY TAKING THE X AND Y LOCATIONS + OF ALL THE DIPS AND POINTS IN THE DRAWING AND + MAKING THEM MULTIPLES OF THE CURRENT STEP SIZE. + IF IN SET MODE ONLY THE CURRENT SET IS MUNGED. + (I WONDER WHY I CALLED THIS "MUNG"?) + + COUNT TELLS YOU HOW MANY POINTS THERE ARE IN THE ENTIRE + DRAWING. ALSO TELLS YOU HOW MANY OF EACH TYPE OF BODY. +PC ALSO TELLS YOU HOW MANY OF THE POINTS ARE DRILL HOLES + AND SUMMARIZES AMOUNT OF ETCH. + + + DELNULL ASKS IF YOU WISH TO MARK OR DELETE + ALL NULL POINTS, THEN DOES THAT. A NULL POINT + IS ONE WITH NO LINES, NO TEXT AND NO PIN + CONNECTIONS. IF YOU CHOSE MARKING, USE THE F + POINT MODE CMMAND TO FIND THEM AFTERWARDS. + + DANGLE FINDS ALL POINTS IN THE DRAWING WHICH SATISFY + ONE OF THE FOLLOWING: + 1) TWO COLINEAR LINES (ONLY TWO) + 2) ONE LINE AND NO TEXT OR CPIN + 3) TEXT AND NO LINES + 4) NO TEXT OR LINES + 5) CPIN AND NO LINES + + DELSET DELETE ALL SETS, DOESN'T DELETE CONTENTS. + + SETCEN RECALCULATE CENTERS OF ALL SETS. + +D TYPDEL + DELTYP ASKS "TYPE BODY NAME" THEN DELETE ALL INSTANCES AND + THE DEFINITION. IF FROM LIBRARY, DEFINITION IS NOT + DELETED. + +D RENAME ASKS "TYPE BODY NAME" THEN ASKS "TYPE NEW + BODY NAME" THE BODY IS GIVEN THAT NAME IF + IT IS NOT IN USE. + +D GETLIB ASKS FOR A "LIBRARY FILENAME?" THEN READS THE BODIES + FROM THAT FILE AND MAINTAINS A POINTER TO THE FILE + INSTEAD OF WRITING OUT THE BODY DEFINITIONS EACH TIME. + REDUNDANT LIBRARY REFERENCES ARE IGNORED WHEN POSSIBLE. + +D DELLIB DELETES ALL REFERENCES TO BODIES IN THE LIBRARY YOU + MENTION, AND FLUSHES THE POINTER TO THE FILE. + +D LOCLIB SAME AS DELLIB, EXCEPT THAT ANY BODY WHICH IS USED IN + THE DRAWING IS MADE LOCAL INSTEAD OF BEING DELETED. + +D TYPLIB TYPES ALL LIBRARY FILENAMES. + +D LIBMAP ASKS FOR OLD LIBRARY FILENAME, THEN NEW LIBRARY + FILENAME. YOU SHOULD TYPE THE PPN + EXPLICITLY AS THE DEFAULT FOR 0 + IS SET ONLY TO THAT OF THE CURRENT AREA, NOT FROM + THE CURRENT PATH. THIS ALL SETS UP A MAPPING OF LIBRARY + NAMES. WHEN A LIBRARY NAME IS READ FROM A DRW FILE, + THE LIBMAP LIST IS CHECKED FOR AN OLD LIBRARY NAME + THAT IS THE SAME. IF ONE IS FOUND, THE NEW LIBRARY + NAME IS SUBSTITUTED FOR IT. TO CLEAR + A SINGLE MAPPING TYPE + FOR THE NEW LIBRARY NAME. + +D -LIBMAP CLEAR ALL LIBRARY NAME MAPPINGS. + + LIBPPN ACCEPTS A PPN WHICH IS USED AS THE PLACE + TO FIND THE FILE "DIPS.DIP" WHICH HAS THE + DIP DEFINITIONS IN IT AND "XXX.CRD" WHICH HAS THE + PC CARD DEFINITION (PC PROG). LATER ON IT MAY ALSO + BE USED AS A PLACE TO LOOK FOR LIBRARIES. + + -LIBPPN RESET LIBPPN TO 0 (WILL LOOK ON CURRENT AREA + AND CURRENT PATH. + +D GETBOD ASK FOR A TYPE NAME, THEN A FILENAME + THEN TRIES TO READ IT IN USING THE NORMAL + IO ROUTINES (MAY HAVE TO REPLACE, ETC.). + +D MODLIB THIS COMMAND SHOULD BE USED VERY CAREFULLY. IT ALLOWS YOU + TO EDIT BODY DEFINITIONS, AND MAKE ANY OTHER CHANGES NORMALLY + NOT ALLOWED DUE TO THE EXISTANCE OF A LIBRARY. YOU MUST THEN + MAKE EXACTLY THE SAME CHANGES TO THE LIBRARY FILE SO AS TO + MAINTAIN CONTINUITY. + +PC CARD ASKS FOR CARD NUMBER, THEN READS IN THE SPECIFIED + CARD. THE CARD CONTAINS THE CARD IMAGE ALL PINS, + PIN #'S, CONNECTOR LOC'S, AND SHORTING BARS. + ANY POINT WHICH IS NOT A FEED THROUGH OR A DIP PIN + AND IS FOUND AT THE SAME LOCATION AS A CONNECTOR + PIN WILL BECOME THAT CONNECTOR PIN. IF THE NUMBER + YOU ASK FOR IS THE SAME AS THE CURRENT CARD, THEN + IT IS MERELY DISPLAYED AGAIN. ARGUMENT OF 0 (OR + JUST CR.) WILL CAUSE THE CARD TO BE FLUSHED! + THE CARD NUMBER IS REMEMBERED WHEN THE CARD IS WRITTEN + OUT! + +PC -CARD DISABLE DISPLAYING OF CARD. CARD NUMBER IS STILL + WRITTEN OUT. TO REDISPLAY THE CARD TYPE "X" THEN + "CARD" CR FOLLOWED BY THE SAME CARD NUMBER AND IT + WILL BE RE-DISPLAYED. + +PC SETLOC SET #LL# (MODULE SLOT) FOR LOCATION OF THIS CARD ON BACK PANEL. +D ASKS IF THIS IS PERMANENT CARD LOC FOR DRAWING + IN WHICH CASE IT IS STORED IN ONE PLACE ELSE IT IS + SPREAD THROUGH ALL LOCATIONS OF BODIES AND + CONNECTOR PINS IN THIS DRAWING. + + -SETLOC CLEAR LOCATIONS ON ALL BODIES. THIS DOES NOT UNDO + SETLOC. TO UNDO SETLOC, TYPE "XSETLOC" AND . + +PC UML WILL ASK FOR THE LETTER OF THE UPPERMOST DIP AND + THE NUMBER OF THE RIGHTMOST DIP. THEN IT WILL SLICE + UP THE CARD INTO ROWS AND COLUMNS AND ASSIGN DIP + LOCATIONS. + +PC VCC ALLOWS CONNECTION OF HIGHEST NUMBERED PIN OF DIP + TO PROPER INNER PLANE. ONLY ON DIPS WITH MORE THAN + 3 PINS. +U WILL ALSO CONNECT VCC RUN TO INNER PLANE IF FOUND IN + WIRLST. + +PC GND SAME AS VCC EXCEPT GROUND PINS AND RUN (U). + +RPC ROUTE INITIALIZE ROUTING SYSTEM. THIS MAY BE DONE + IF YOU THINK THE PROGRAM ISN'T KEEPING THE + TABLES UP TO DATE, THE PROGRAM WILL TRY TO + REINITIALIZE THE TABLES WHEN NECESSARY. + +RPC RDISP DISPLAY A POINT IN EACH OCCUPIED SQUARE ON THE + PC CARD. THIS IS ONLY A DEBUGGING AID. + +RPC -RDISP DISABLE DISPLAYING OF POINTS. + +RPC RCODE ASKS FOR "ROUTE CODE". YOU MAY TYPE A NUMBER + FROM 0-3. THEY HAVE THE FOLLOWING MEANINGS: + + 0 ROUTE ON COMPONENT SIDE ONLY + 1 ROUTE ON SOLDER ONLY + 2 HORIZONTAL ON COMPONENT, VERTICAL ON SOLDER + 3 VERTICAL ON COMPONENT, HORIZONTAL ON SOLDER + + STARTING THE PROG SETS RCODE TO 3! + +RPC THE FOLLOWING COMMANDS ALLOW MODIFICATION OF THE ROUTING + ALGORITHM BY CHANGING THE WEIGHTING FACTORS OF CERTAIN + TYPES OF ROUTES. THE COMMAND IS THE VARIABLE NAME. + THIS CAUSES THE OLD VALUE TO BE PRINTED AND THEN + ASK FOR THE NEW VALUE. SETS THE VARIABLE + TO NUMBER. ANYTHING FUNNY LEAVES THE VARIABLE UNCHANGED + THE FOLLOWING VARIABLES EXIST AND HAVE THE FOLLOWING + MEANINGS: + + CNR THE COST OF MAKING A CORNER (NOT INCLUDING + FEED THROUGHS). + + FED THE COST OF MAKING A FEED THROGH. + + BAK THE COST OF GOING AWAY FROM THE DESTINATION + POINT. + + SID THE COST OF ONE STEP ON THE WRONG SIDE OF + THE BOARD (RCODE= 2 OR 3). NOT CHARGED AT + CORNER! + +PC SHORT THIS COMMAND SORTS EACH SIDE OF THE PC CARD + INTO INTERNAL LISTS THEN CHECKS FOR SHORTS + BETWEEN POINTS, POINT TO LINE, AND LINES + CROSSING. ALL ERRORS ARE STORED IN A LIST + WHICH MAY NOW BE SEARCHED USING THE "?" + COMMAND (SEE "COMMANDS WHICH WORK ANYTIME"). + THEN FOLLOWING COMMANDS ALLOW YOU TO DIDLE THE + VALUES USED FOR LINE WIDTHS, ETC. + +PC -SHORT SHUT OFF SHORT ERROR DISPLAY (ERROR IS LOST). + +PC WIDTH REPORTS OLD LINE WIDTH, ACCEPTS NEW. + +PC HOLE CHANGE DIAMETER OF A BARE DRILL HOLE. + +PC CONNECTOR CHANGE PSEUDO-DIAMETER USED FOR CONNECTOR PIN + +PC PADDIAMETER ASK FOR "PAD TYPE NUMBER" THEN REPORTS + OLD VALUE, AND ACCEPTS NEW. + +PC SEPARATION CHANGE MINIMUM SEPERATION TO PREVENT SHORTING + +PC FTXT FIND TEXT, SAME AS F IN D IN POINT MODE. + +PC FCPIN FIND CONNECTOR PIN, SAME AS F IN D IN POINT MODE. + + FDIP FIND DIP, LIKE F IN BODY MODE, BUT MATCHES DIP + TYPE STRING INSTEAD OF BODY NAME. + POINT MODE: +THE FOLLOWING APPLY IF THE LAST PRIMITIVE SEARCH COMMAND WAS P OR T +AND A POINT WAS FOUND. + + P PLACE A POINT AT THE CURRENT CURSOR POSITION. + +D + START A RIGHT ANGLE FOLLOWING THE CURSOR FROM THE CLOSEST + POINT. A STAR IS PLACED AT THE CLOSEST POINT EXCLUDING + THE ONE YOU ARE DRAWING FROM. + +D $ (ALTMODE) STOP RIGHT ANGLE WITHOUT PLACING ANY + MORE POINTS AND RETURN TO MAIN SCANNER. + +D - ATTACH THE RIGHT ANGLE TO THE CLOSEST POINT + (FOUND ABOVE) AND RETURN TO THE MAIN SCANNER. + ??? IS TYPED IF THIS WOULD REQUIRE THE DELETION + OF AN EXISTING LINE, AND NOTHING IS DONE! + +D  MAKE A SINGLE SEGMENT FROM THE POINT THE RIGHT + ANGLE IS COMING FROM TO THE CLOSEST POINT.(MAY + NOT NECESSARILY BE HORZ. OR VERT., SO STRAIGHTEN + IT.). + +D + MAKE THE CORNER OF THE ANGLE INTO A POINT THEN + START A NEW RIGHT ANGLE FROM THERE. + +D SPACE CAUSES THE SENSE OF THE ANGLE TO CHANGE. + +D A SEE A BELOW. + +PC + START A LINE FOLLOWING THE CURSOR FROM THE CLOSEST POINT + +PC $ LEAVE LINE DRAWING MODE WITHOUT PLACING LAST LINE. + +PC - ATTACH LINE TO POINT WITH STAR ON IT. + +PC + PUT DOWN END OF LINE AT CURSOR POSITION AND START + NEW LINE. + +PC | SIMULATES THE FOLLOWING, "+ F R +". + IF YOU ARE NOT IN LINE DRAWING MODE, IT SIMULATES + "FR+" ONLY. + +PC A SEE A BELOW. + +PC F MAKE THE CLOSEST POINT INTO A FEED THROUGH. CREATE A POINT + ON THE OTHER SIDE IF ONE DOES NOT ALREADY EXIST. PAD TYPE + # IS SET TO 0. + +PC F LEGAL ONLY FOR FEED THROUGHS AND PINS. ATTACHES THE POINT + TO THE INTERIOR PLANE SPECIFIED(0-3) AND INDICATES THIS ON + THE POINT. 0 SHOULD BE USED FOR GROUND. 1 FOR TTL SUPPLIES. + +PC F LEGAL FOR ALL POINTS. ASKS "PAD TYPE #?" THE NUMBER YOU + TYPE IS THE IDENTIFICATION # FOR THE TYPE OF PAD TO PLOT + HERE. 0 IS NO PAD. 1 IS DEFAULT FOR DIP PADS. 2 IS DEFAULT + FOR INNER PLANE CLEARANCES, THESE ARE SET ON BOTH SIDES + OF DRILL HOLES WHEN THE EXTEND MODE COMMAND "INNER" IS USED. + PAD TYPE 3 IS 50 MIL SQUARE USED FOR DIP PIN 1! + +PC U MAKE THIS FEED THROUGH NOT A FEED THROUGH. + +PC U DETACH THIS POINT FROM ANY INTERIOR PLANES. + + D DELETE CLOSEST POINT AND ALL LINES DIRECTLY ATTACHED TO IT. + IF THE POINT IS A BODY ATTACHEMENT PONT IT DOESN'T REALLY + GO AWAY JUST THE LINES, AND TEXT. + +D D SAME AS D EXCEPT THAT COLINEAR SEGMENTS ARE MERGED. + THIS WILL REVERSE A B OPERATION ON A LINE! + +PC D SAME AS D EXCEPT IN THE CASE WHERE EXACTLY 2 LINES LEAVE + THE POINT. IN THIS CASE THE TWO LINES ARE MERGED INTO ONE + BETWEEN THE REMAINING 2 POINTS. + + M PUTS THE CURSOR ON THE CLOSEST POINT. THEN MAKES IT FOLLOW + THE CURSOR UNTIL A SPACE IS TYPED. THE LINES ARE MASSAGED + AS YOU GO. + + M PUTS CURSOR AT CURRENT TEXT OFFSET (IF ANY TEXT) AND ALLOWS + YOU TO CHANGE IT BY MOVING THE TEXT. IN D THE OFFSET IS RELATIVE + TO THE CHARACTER SIZE, IN PC THE OFFSET IS TO AN ABSOLUTE + POSITION ON THE CARD. +D TURNS OFF BIT(S) TURNED ON BY Z. + + M LIKE M, EXCEPT THAT THE CURSOR IS NOT MOVED TO THE POINT + SO THE POINT IS MOVED TO THE CURSOR. + + A ATTACH THE CLOSEST POINT TO THE CLOSEST OTHER POINT. A STAR + IS PLACED ON THE OTHER POINT AND YOU ARE ASKED "THIS ONE?" + TYPE "Y" TO ATTACH, ANYTHING ELSE TO RETURN TO COMMAND MODE. + YOU MAY NOT ATTACH 2 BODY ATTACHEMENT POINTS. + + A PUTS A STAR ON THE CLOSEST LINE AND ASKS "THIS ONE?" + IF YOU SAY "Y" THEN THE CLOSEST POINT WILL BECOME THE + INTERSECTION-POINT OF THE LINE. + IN POINT MODE WHEN DRAWING A LINE THE CLOSEST OTHER LINE + WILL GET A POINT ON IT AT THE PLACE WHERE THE LINE YOU + ARE DRAWING INTERSECTS IT. THEN A MINUS IS DONE TO THAT + POINT. + + B IF THE CLOSEST POINT HAS 3 LINES ATTACHED TO IT, ONE OF + THE 2 COLINEAR LINES IS BROKEN OFF FROM THE THE POINT + AND ATTACHED TO A NEW POINT. THE NEW POINT IS THEN + CONNECTED TO THE OLD ONE BY A SEGMENT IN THE OTHER + DIRECTION. + IF THE POINT HAS 4 LINES ATTACHED TO IT, THE UP ND RIGHT + ARE RECONNECTED TO A NEW POINT WHICH IS THEN JOINED TO + THE OLD POINT BY A HORIZONTAL SEGMENT. + POINT WITH 2 HORZ LINES, OR 2 VERT LINES, IS DONE LIKE 3 + LINES. IF NOT 2, 3 OR 4 LINES, THEN ERROR. + + B THIS IS PRECISELY LIKE B, EXCEPT IN THE CASE OF 4 LINES + THE NEW SEGMENT CREATED IS VERTICAL INSTEAD OF HORIZONTAL. + + T ASKS "TEXT?" AND ATTACHES THE STRING TO THE POINT. + IF "" APPEARS IN THE STRING, A CRLF IS INVENTED. + IF THE CHARACTER "\" IS THE FIRST IN THE STRING + THE FOLLOWING CHARACTER IS INTERPRETED AS THE CHAR. + SIZE. NEITHER CHARACTER APPEARS IN THE STRING. + IF A "V" APPEARS JUST BEFORE THE CHAR. SIZE THEN THE + TEXT WILL BE PLOTTED VERTICALLY. A POINT IS DISPLAYED + AT THE BEGINNING OF SUCH TEXT. +DEC IF WHAT YOU TYPE IN HAS AN EXPLICIT H OR L AT THE END, + THAT IS RETAINED. OTHERWISE ALL LINES CONNECTED TO THIS + POINT ARE TRACED LOOKING FOR A BODY PIN HAVING A DEFAULT + POLARITY. IF ONE IS FOUND, AN " H" OR " L" IS APPENDED + TO THE TEXT STRING. IF THE STRING ENDS WITH " !", IT + IS REMOVED AND NO POLARITY IS INVENTED. + +D Z CALCULATES A GOOD OFFSET FOR THE TEXT IF THE POINT HAS ONLY + ONE SEGMENT ATTACHED TO IT. ALSO SETS A BIT WHICH CAUSES + THIS OFFSET TO BE UPDATED WHEN THE TEXT CHANGES. ALSO IF + CURRENTLY IN OFFRIGHT STATE, A BIT IS TURNED ON TO CAUSE + THIS POINT TO MOVE RIGHT INSTEAD OF THE TEXT LEFT WHEN + THE LINE LEAVES GOING TO THE RIGHT. + +D Z TURNS OFF THE BIT TURNED ON BY Z. + +D Q CALCULATES A GOOD OFFSET FOR THE CONNECTOR PIN DESIGNATION + UNDER THE SAME CONDITIONS AS Z. ALSO SETS A BIT TO CAUSE + THE CPIN DESIGNATION TO FOLLOW THE TEXT (OR THE POINT IF + NO TEXT) WHEN EITHER THE CPIN # OR THE TEXT IS CHANGED. + +D Q TURNS OFF THE BIT TURNED ON BY Q. + +D T T FOLLOWED BY Z. + + K IF THE CLOSEST POINT HAS TEXT ON IT THE TEXT IS DELETED. +D POINT IS REMOVED FROM "TXTLST". + +STANFO Z LOADS THE TEXT INTO THE LINE EDITOR. THEN INPUTS THE + RESULTANT STRING AND REPLACES THE TEXT WITH IT. + +STANFO Q SAME AS "Z" EXCEPT THE LINE EDITORS CURSOR IS AT THE END + OF THE LINE. + +D N IF POINT OR CONNECTOR PIN: + + SET CONNECTOR PIN NUMBER. + PIN NUMBER IS OF THE FOLLOWING FORM: + + #LL#LL# (BAY/TOPRACK/BOTTOMRACK/SLOT/PADDLE/PIN/SIDE) + OR + LL# (PADDLE/PIN/SIDE) + + BOTTOMRACK MAY BE LEFT OUT AND IT WILL BE ASSUMED TO BE + THE SAME AS TOPRACK. PADDLE MAY BE LEFT OUT AND IT WILL BE + ASSUMED TO BE "A". IF NOT PREVIOUSLY A CONNECTOR + PIN, A Q IS PERFORMED. + + IF BODY ATTACHEMENT POINT: + JUST TYPE PIN NUMBER. +L IF YOU TYPE AND ONE AND ONLY ONE CONNECTOR PIN WAS + FOUND ON THE LAST RUN TRACED IN THE PC PROG, ITS LOCATION + IS USED FOR THIS CONNECTOR PIN #. + +D N FOR CPIN'S ONLY. PUTS YOU AT THE CURRENT OFFSET FOR THE + LOC TEXT AND LETS YOU MOVE IT. OFFSET IS RELATIVE TO CHAR + SIZE OF LOC TEXT NOT PIC SCALE. ILLEGAL IF Q DONE TO THIS + POINT. + + COMMANDS TO MOVE ALONG WIRES: + PC SEGMENT CHOSEN IS THE ONE WHICH MOST NEARLY POINTS IN THE + CORRECT DIRECTION. IF NONE IN RIGHT DIRECTION, WILL CHOSE + AN ORTHOGONAL ONE IF ONLY ONE EXISTS. + D CHOSES SEGMENT IN THE SPECIFIED DIRECTION. IF NONE EXISTS + WILL CHOSE ONE IN ORTHOGONAL DIRECTION IF ONLY ONE. + + NODEC DEC DIRECTION + +  3 LEFT +  4 RIGHT +  2 DOWN +  1 UP + + " IF TEXT ON THIS POINT, ASKS FOR TEXT MACRO NAME. THEN + STORES A COPY OF THE THE TEXT IN THE MACRO. NULL MACRO + IF NOT TEXT. + + " ASKS FOR MACRO NAME, THEN STUFFS A STRING IN IT + REPRESENTING THE PIN NAME ON THIS POINT. IF NOT + PIN, NULL STRING RESULTS. + FOR CPIN STRING IS: + BAY/TOPRACK/BOTTOMRACK/SLOT/PADDLE/PIN/SIDE + + FOR DIP PIN STRING IS: + BAY/TOPRACK/BOTTOMRACK/SLOT/DIPLETTER/DIPNUMBER"("PINNUMBER")" + +NODEC & +DEC % _ UNION + POINT MAY NOT BE A BODY ATTACHEMENT POINT. IN PC + POINT MAY NOT BE A CONNECTOR PIN. + +NODEC & +DEC % TRACE CONNECTIONS TO THIS POINT THROUGH BODIES AND POINTS + AND PUT EVERYTHING FOUND IN A SET, ENTER SET MODE AND MOVE + CURSOR TO SET CENTER AND MAKE SURE IT IS ON SCREEN. + +NODEC & +DEC % CLEAR . + + # REMOVE POINT FROM CURRENT SET. + + # REMOVE POINT FROM ALL SETS. + +D F ASKS "SEARCH STRING". IF ENDED WITH ALTMODE NOTHING IS DONE. + IF NULL STRING, OLD ONE WILL BE USED IF ANY. SEARCHES FOR + ALL POINTS WHOSE TEXT HAVE THE SEARCH STRING AS A SUBSTRING. + THE SPECIAL CHARS ALLOWED ARE DESCRIBE IN THE "F" COMMAND + IN ALTER MODE DESCRIPTION. IF A MATCH IS FOUND, THE POINT + IS MARKED FOR LATER REFERENCE. + +D F ASKS "SEARCH STRING". CONNECTOR AND DIP PIN NAMES + ARE CONVERTED TO STRINGS AS IN " AND MATCHED AGAINST + THE STRING YOU TYPE AS IN F. The search has implicit + beginning/end-of-line charcters, so you must search + for a complete pin name string. + +D F FIND A MARKED POINT. IF ON SCREEN, MOVE CURSOR THERE. IF NOT + MOVE IT TO SCREEN CENTER AND MOVE CURSOR THERE. + +L . SAVE NAME OF THIS PIN (MUST BE BODY PIN OR CONNECTOR + PIN), AND GO TO THE OTHER PROG. IT IS THEN LOOKED UP + IN THE OTHER PROG. IF IT IS FOUND, IT AND THE CURSOR + ARE BROUGHT TO THE CENTER OF THE SCREEN. IF PC AND + A CONNECTOR PIN, YOU ARE PLACED ON THE PROPER SIE OF + THE CARD. + + . (PERIOD) TRACE WIRE ATTACHED TO THIS POINT AND FLASH IT. + TRACING INCLUDES WIRES WITH SAME SIGNAL NAMES (D ONLY). + IF ANY CONS ARE ON THE WIRE, BUT OFF SCREEN, ONE OF THEM + IS FLASHED IN THE UPPER RIGHT CORNER OF THE SCREEN(D ONLY). +L ALL PINS FOUND ARE PUT IN A LIST AND LOOKED UP IN THE + OTHER PROG THE NEXT TIME YOU GO THERE, THEN THEY AND + ANY POINTS THEY CONNECT TO ARE FLASHED. + + . EQUIVALENT TO "." FOLLOWED BY "V" IF LAYOUT VERSION + OTHERWISE SAME AS ".". + +LRPC . ENTER ROUTING MODE FOR FLASHING PINS. + PROGRAM RESPONDS WITH "ROUTING PAIR = ". + YOU WILL NOTICE THAT THE FLASHING PINS HAVE + LETTERS ON THEM. TYPING TWO OF THE LETTERS + FOLLOWED BY CR, CAUSES THE ROUTING ROUTINE + TO BE ENTERED WITH THESE TWO PINS AS THE + ENDPOINTS. ALL THE NORMAL COMMANDS APPLY TO THE ROUTING + ROUTINE (NORMALLY ENTERED BY "E") UP UNTIL THE TIME + THAT YOU LEAVE IT. TYPING "ALTMODE" CAUSES YOU TO LEAVE + ROUTING MODE. ANYTHING FUNNY GETS YOU THE + QUERY AGAIN! + +LRD . EQUIVALENT TO "V" FOLLOWED BY "."! + + J FINDS LETTER OF FLASHING PINS AND MOVES + CURSOR THERE (IF POSSIBLE). ONLY WORKS WHEN LETTERS ARE + BEING SHOWN! (ALSO WORKS FOR JUMPING TO "SHORT" ERRORS + IF YOU TYPE A NUMBER INSTEAD OF A LETTER). + J_ + THIS FINDS THE nTH FLASH CONNECTOR PIN (DEFAULT IS 1) + AND JUMPS TO IT. + + A IF THE CLOSEST POINT HAS TEXT ON IT YOU ENTER ALTER MODE! + ALTER MODE IS A TEXT EDITOR DESCRIBED BELOW + +RPC E SET ENDPOINT ONE FOR ROUTING. A "_" INDICATES ENDPOINT ONE. + +RPC E SET ENDPOINT TWO FOR ROUTING. A "" INDICATES ENDPOINT TWO. + +RPC E MAKE A ROUTE FROM ENDPOINT ONE TO TWO. THE ALGORITHM + COMPUTES SCORES FOR ROUTES. IT TRIES TO FIND ROUTES WITH + SCORES OF 0 FIRST, THEN 1, ETC. WHEN A ROUTE IS FOUND YOU + WILL BE ASKED "HOW ABOUT THIS ONE" AND THE ROUTE WILL BE + BLINKED. WIRES ON THE CURRENT SIDE WILL BE BRIGHTER THAN + THOSE ON THE OTHER. IF YOU RESPOND "Y" THE ROUTE WILL BE + MADE AND MARKED. IF YOU SAY " " (SPACE) THE ROUTE WILL BE + DISCARDED AND ANOTHER FOUND. IF YOU SAY " " (CTRL SPACE) + THE PROGRAM WILL SHIFT TO THE NEXT HIGHEST SCORE AND + CONTINUE LOOKING. IF YOU SAY "$" ALTMODE THE PROGRAM WILL + JUST QUIT. ANYTHING ELSE WILL GET YOU "???" AND THE + QUESTION REPEATED. ALTMODE AND CTRL SPACE WILL WORK EVEN + WHEN THE PROGRAM IS RUNNING (KEYBOARD INPUT ONLY)! + BODY MODE: +THE FOLLOWING COMMANDS APPLY IF THE LAST PRIMITIVE SEARCH COMMAND WAS +B AND A BODY WAS FOUND. + P PLACE A BODY AT THE CURRENT CURSOR POSITION. YOU + ARE THEN PLACED IN MOVE MODE ON THAT BODY. +PC PIN 1 GETS PAD TYPE 3 ALL THE OTHERS GET PAD TYPE 1. + +D E EDIT THE CLOSEST BODY. + +D R REPLACE THE CLOSEST BODY. YOU WILL BE ASKED FOR NEW BODY +PC G NAME THEN THE YOU MAY SET THE REPLACEMENT MODE. IF YOU + ANSWER "E", OR "N", THEN THE CORRESPONDENCE IS MADE BETWEEN + PINS WITH IDENTICAL DEFAULT PIN NAMES (INCLUDING /B-L PART). + ONLY PINS WHICH MATCH UNIQUELY ARE DONE, IF ALL PINS CANNOT + BE UNIQUELY MATCHED IN "E" MODE, THEN YOU GET AN ERROR MESSAGE + AND NOTHING IS DONE. IF YOU ANSWER "L" TO THE REQUEST, THEN A GEOMETRIC + (CLOSEST PIN) MAPPING IS USED. IF YOU ANSWER "C" TO THE + REQUEST A GEOMETRIC MAPPING WHICH WORKS FOR DIFFERENT #S + OF PINS WILL BE USED. IF YOU ANSWER THEN YOU WILL BE + ASKED FOR THE CORRESPONDENCE PIN BY PIN. ANY UNSPECIFIED + PINS ON THE OLD BODY ARE DELETED, ANY UNSPECIFIED PINS ON + THE NEW BODY ARE CREATED. IN "L" MODE, IF EACH PIN CANNOT + BE MATCHED TO ANOTHER YOU WILL BE THROWN OUT. DURING THE ASKING + OF THE CORRESPONDENCE QUESTION, BOTH THE OLD AND NEW BODIES + WILL BE DISPLAYED WITH PIN IDS SHOWN FOR REFERENCE. THE OLD + BODY WILL BE ON THE LEFT. + + +D R REPLACE SOME. ASKS FOR OLD BODY NAME, THEN NEW BODY NAME, +PC G THEN SETS UP CORRESPONDENCE AS IN R, THEN PUTS A "*" ON + EACH INSTANCE OF THE OLD BODY AND ASKS "THIS ONE?" IF YOU + SAY "Y", IT IS REPLACED, OTHERWISE IT IS NOT. IF YOU SAY + ALTMODE YOU GET BACK TO BODY MODE. + +D R REPLACE ALL. LIKE REPLACE SOME EXCEPT YOU AREN'T ASKED. +PC G " + + D DELETE THE CLOSEST BODY. + + D DELETE THE CLOSEST BODY, PINS ARE TURNED INTO POINTS + INSTEAD OF BEING DELETED. + + M MOVE THE CLOSEST BODY. THE CURSOR IS PUT AT THE CENTER OF + THE BODY. THEN ALL PINS ON THE BODY ARE MASSAGED AS THE + BODY IS MOVED. ANY CHARACTER STOPS YOU MOVING. + + N "NUMBER" THE CLOSEST BODY. NUMBERS MAY BE OF THE FOLLOWING + FORM: + +D #LL#L# (BAY/TOPRACK/BOTTOMRACK/SLOT/DIP COORDS LETTER/NUMBER) + OR + L# (DIP COORDS LETTER/NUMBER) + + IF THE LOCATION OFFSET IS FOLLOWED BY "-n" THEN n IS USED + TO DO AN N TO THIS BODY. ALSO AN "L", "R", OR "*" MAY FOLLOW, + WHICH WILL BE USED TO DO A T TO THE BODY. THE OFFSET OF + THE LOCATION STUFF IS SET TO THAT IN THE BODY DEFINITION, + ALSO A BIT IS TURNED ON WHICH CAUSES ANY CHANGES TO THAT + OFFSET IN THE DEFINITION TO BE UPDATED IN EACH BODY WITH + THE BIT ON. THE BIT IS TURNED OFF BY THE N COMMAND. + +D N LEGAL ONLY IF N DONE PREVIOUSLY. PUTS YOU AT CURRENT + OFFSET FOR LOC TEXT AND LETS YO MOVE IT. THIS OFFSET + IS SCALED BY DRAWING SCALE, NOT CHAR SIZE. THIS COMMAND + TURNS OFF THE BIT WHICH CAUSES THIS LOC TO FOLLOW THE + OFFSET SET IN THE BODY DEFINITION. + +D N IF THERE IS A DIP TYPE SET, READS THE DIP DEFINITION + FROM THE FILE DIPS.DIP ON THE LIBRARY AREA. THEN ASKS WHICH SECTION + YOU WANT THE PINS FROM, AND USES THE DEFAULT PIN NAMES AS A MASK + TO MAP THE PIN #'S AND SET THEM. + + O ROTATE CLOSEST BODY 90 DEGREES COUNTER CLOCKWISE. + MIRROR IMAGE THE BODY AFTER ROTATING 360 DEGREES. + + S SWAP. ASKS FOR TWO PIN ID'S (PIN #'S IN PC). IF + THEY EXIST ON THIS BODY ALL LINES, TEXT, AND + ANYTHING ELSE ARE SWAPPED BETWEEN THESE TWO POINTS. + WHILE ASKING FOR PIN IDS, THEY ARE DISPLAYED ON THE BODY. + +D S SWAP PIN #'S. ANY PIN #'S ASSOCIATED WITH THE ID'S + YOU TYPE WILL BE INTERCHANGED. + +D T ASK FOR AN "L", "R", OR "*". "L" MEANS PIN 1 OF DIP GOES TO + PIN 2 OF SOCKET. "R" MEANS PIN 1 OF DIP GOES TO PIN + 1 OF SOCKET. "*" MEANS TURN OFF PREVIOUS "R" OR "L". + THIS MERELY SETS BITS IN THE BODY WHICH + ARE PASSED TO THE WIRE LISTER WITH THE PIN#. IF A PIN + # NEEDS 1 ADDED TO IT TO GET THE SOCKET PIN # THEN + A "+" WILL APPEAR AFTER IT, IF IT NEEDS 2 ADDED TO IT + A "+2" WILL APPEAR AFTER IT. + +D P SET PIN #'S FROM DEFAULT PIN NAMES. + +NODEC & +DEC % _ UNION + +NODEC & +DEC % TRACE CONNECTIONS TO THIS BODY THROUGH POINTS AND BODIES + AND PUT EVERYTHING FOUND IN A SET, ENTER SET MODE AND MOVE + CURSOR TO SET CENTER AND MAKE SURE IT IS ON SCREEN. + +NODEC & +DEC % CLEAR . + +NODEC  +DEC 5 TRACE ALL PINS ON THIS BODY TO THE NEXT POINT. + IF IT IS NOT A PIN ON ANOTHER BODY, PUT IT + IN A SET WITH THIS BODY. THEN ENTER SET MODE AND + PLACE CURSOR AT SET CENTER. + + # REMOVE BODY FROM CURRENT SET. + + # REMOVE BODY FROM ALL SETS. + + F ASKS "SEARCH STRING". IF ALTMODE TYPED NOTHING IS DONE. + IF NULL STRING, PREVIOUS SEARCH IS REPEATED. + FOR EACH BODY, THE NAME (D) OR A STRING OF DIGITS REPRESENTING + THE # OF PINS (PC) IS MATCHED AGAINST THE SEARCH STRING. + IF A MATCH OCCURS, THE BODY IS MARKED FOR LATER. + + F ASKS "SEARCH STRING". IF ALTMODE TYPED NOTHING IS DONE. + IF NULL STRING, PREVIOUS SEARCH IS REPEATED. + CONVERTS THE LOCATION OF EACH BODY INTO A STRING AND MATCHES + IT AGAINST THE SEARCH STRING. MATCHES ARE MARKED. Match + has implicit beginning/end-of-line search characters, so + you must search for a complete location string. + + F FIND NEXT BODY. SEARCHES DOWN THE BODY LIST FOR A MARKED BODY. + IF ONE IS FOUND, THE CURSOR IS PLACED ON IT AND IT IS + BROUGHT ON SCREEN (IF OFF). + +D " PUT BODY NAME INTO MACRO. + +PC " MAKE MACRO OF # OF PINS (STRING OF DIGITS). IF 2 PIN DIP, + A AND THE SEPARATION IN MILS IS ALSO ADDED. + + " MAKE MACRO WITH LOCATION TEXT IN IT. NULL MACRO IF NO LOC. + + " MAKE MACRO OUT OF DIP NAME. NULL MACRO IF NO DIP TYPE. + +D T PLACE BODY TEXT (SEE BODY TEXT/PROPERTY MODE). + +D Y PLACE BODY PROPERTY (NEW OR OLD). (SEE BODY TEXT/PROPERTY MODE) + +D Y CHANGE BODY PROPERTY (OLD). (SEE BODY TEXT/PROPERTY MODE) + +D Y ENTER BODY TEXT/PROPERTY MODE. + THE CLOSEST BODY BECOMES THE "CURRENT" BODY, THAT IS + THE ONE WHOSE TEXT/PROPERTIES YOU ARE MANIPULATING. + BODY TEXT/PROPERTY MODE: + +CLOSEST BODY TEXT IS INDICATED BY A "BT". +INVISIBLE BODY TEXT WILL NOT BE FOUND UNLESS MADE VISIBLE ("XIDENTS"). + + +D T LIKE T IN EDIT TEXT/PROPERTY MODE, BUT TEXT IS + ASSOCIATED WITH THE CURRENT BODY NOT THE DEFINITION. + +D Y LIKE Y IN EDIT TEXT/PROPERTY MODE, BUT IF PROPERTY + ALREADY EXISTED IN BODY DEF, THAT VERSION OF THE + PROPERTY IS NO LONGER DISPLAYED. ALSO THE NEW PROPERTY + TEXT IS NOT AFFECTED BY CHANGES TO THE BODY DEFINITION. + +D Y LIKE Y IN EDIT TEXT/PROPERTY MODE, BUT WITH SAME + DIFFERENCES AS Y IN BODY TEXT/PROPERTY MODE. + +D K STOP DISPLAYING. IF TEXT, DELETE. IF PROPERTY, MAKE + IT INVISIBLE. + +D D DELETE TEXT OR PROPERTY. + +D D MAKE PROPERTY INTO ORDINARY TEXT. + +D M MOVE TEXT. TEXT FOLLOWS CURSOR UNTIL YOU TYPE + SPACE OR ALTMODE. + +D M MOVE TEXT OFFSET. + +D M MOVE TEXT, BUT START BY MOVING TEXT TO CURSOR. + +D A ENTER ALTER MODE WITH CLOSEST TEXT. + +D +STANFO Z LINE EDIT TEXT. LINE EDITOR CURSOR IS AT BEGINNING OF LINE. + +D +STANFO Q LINE EDIT TEXT. LINE EDITOR CURSOR IS AT END OF LINE. + +D Z RECALCULATE TEXT OFFSET TO CENTER IT OVER MOVE POINT. + TEXT IS NOW AUTOMATICALLY OFFSET WHEN CHANGED. + +D $ ALTMODE +D STOP MOVING. + +D " STORE TEXT INTO MACRO. + +D " STORE PROPERTY NAME INTO MACRO. + +D F FIND NEXT TEXT/PROPERTY WHICH WAS MARKED BY F OR F. + +D F FIND AND MARK ALL PROPERTIES WHICH HAVE THE STRING + YOU TYPE AS A SUBSTRING OF THEIR PROPERTY NAMES. + +D F FIND AND MARK ALL TEXT/PROPERTIES WHICH HAVE THE STRING + YOU TYPE AS A SUBSTRING OF THEIR TEXT. + +D E ENTER BODY EDITOR WITH CURRENT BODY. + + BODY TEXT/PROPERTY MODE EXTENDED COMMANDS: + +D TMOVE MOVE TEXT OFFSET WITH CURSOR COMMANDS. + SET MODE: +THE FOLLOWING COMMANDS APPLY IF THE LAST PRIMITIVE SEARCH COMMAND WAS +S AND A SET WAS FOUND + + + DRAW A BOX AROUND THE POINTS AND BODIES YOU WOULD + LIKE IN THE SET, USING + LIKE WITH DRAWING LIES. + SAY - TO CLOSE THE BOX AND THE SET IS DEFINED. + ALL MEMBERS OF THE SET WILL HAVE B'S OR P'S ON THEM. + PSEUDO-CENTER IS INDICATED BY AN S. + + P MAKES A COPY OF THE CLOSEST SET AT + THE CURRENT CURSOR LOCATION, THEN + PUTS YOU IN MOVE-THE-SET MODE (SEE BELOW). + + M POSITIONS THE CURSOR ON THE CENTER OF THE + SET. THE SET NOW FOLLOWS THE + CURSOR. THE SET MEMBERS ARE AGAIN INDICATED. + + M LIKE M, EXCEPT THAT THE SET IS MOVED TO + THE CURSOR BEFORE MOVING IS STARTED. + + D DELETE THE CLOSEST SET. + + D DELETE ALL ELEMENTS OF THE CLOSEST SET FROM THE PICTURE. + + D DELETE ANYTHING NOT IN CLOSEST SET. + THE NAME IS FORGOTTEN. + +PC O ROTATE SET 90 DEGREES COUNTER CLOCKWISE. + + K DELETE ALL TEXT ON POINTS IN SET! + +NODEC & +DEC % _ UNION + THIS MAKES A NEW SET IF THERE IS NO CURRENT SET. + +NODEC & +DEC % _ DOESN'T MAKE NEW SET + +NODEC & +DEC % CLEAR . + + # REMOVE ALL MEMBERS OF CLOSEST SET FROM CURRENT SET. + ILLEGAL IF CURRENT SET IS CLOSEST. + + # REMOVE ALL MEMBERS OF CLOSEST SET FROM ALL SETS. + THEN DELETE CLOSEST SET. + + J MOVE CURSOR TO CURRENT SET AND MAKE IT CLOSEST. + LINE MODE: +THE FOLLOWING COMMANDS APPLY IF THE LAST PRIMITIVE SEARCH COMMAND WAS +L AND A LINE WAS FOUND. + + D DELETE THE LINE. DOES NOT AFFECT ITS ENDPOINTS. + +PC D DELETE A WIRE. DELETES THE CLOSEST LINE, THEN FOLLOWS + LINES LEAVING THE ENPOINTS OF THE ORIGINAL LINE, DELETING + AS IT GOES. IT ALSO FOLLOW FEEDTHROUGHS THROUGH THE + BOARD, BUT NOT DIP PINS. THIS PROGRESSES UNTIL A JUNCTION + IS REACHED. + + B PUTS A BEND ON THE LINE EVEN WITH THE CURSOR (MAKES IT + INTO 3 SEGMENTS). YOU ARE THEN MOVING THE MID-POINT. + +D B PUTS A POINT ON THE LINE EVEN WITH THE CURSOR. + +PC J "JUMPS" SEGMENT TO OTHER SIDE OF PC CARD, CREATING OR + DELETING FEED THROUGHS AS NECESSARY. + +PC J "JUMPS" A "WIRE" TO THE OTHER SIDE OF THE PC CARD, CREATING + OR DELETING FEED THROUGHS AS NECESSARY. A "WIRE" IS THE + CLOSEST SEGMENT TRACED THROUGH ADJOINING SEGMENTS UNTIL + ONE OF THE FOLLOWING IS REACHED; A FEED THROUGH, A PIN, + OR A JUNCTION! + ALTER MODE: + + + 0-9 NUMBERS ARE REMEBERED AND USED AS REPEAT FACTORS + FOR SOME COMMANDS. THESE COMMANDS ARE PRECEEDED + BY . + + - PRECEDES USED IN SOME COMANDS TO DO + BACKWARDS DELETE, MOVE,ETC. USE IN COMMAND + INDICATED BY <->. + + \ Text alter mode and edit alter mode only. This sets + the character size of the this piece of text. The + format is the same as for text typin: + + = V + "V" IS OPTIONAL (FOR VERTICAL TEXT) + + S MOVE TO CHAR (END IF NOT FOUND) + IF FOUND POINTER IS AFTER CHARACTER. + + <->D DELETE n CHARACTERS (NO-OP AT END) + IF <->, N CHARACTER BEFORE POINTER ARE DELETED. + + C + CHANGES THE NEXT N CHARACTERS IN THE TEXT + TO THE NEXT N CAHRACTERS TYPED. ALT MODE ($) + OR TYPED IN CAUSES THE CORRESPONDING + TEXT CHARACTER TO BE UNCHANGED. + + <-> MOVE FORWARD n SPACES (NO-OP AT END OF LINE) + IF <->, MOVE BACKWARDS. + + <-> MOVE BACKWARD n SPACES (NO-OP AT BEGINNING OF LINE) + IF <->, MOVE FORWARDS. + + I ASKS "INSERT TEXT_" AND INSERTS THE STRING YOU TYPE. + TEXT IS INSERTED BEFORE THE CURRENT CHAR WHICH + REMAINS THE CURRENT CHAR. + + <->R EQUIVALENT TO "<->DI". + + $ LEAVE ALTER MODE. + + K DELETE UP TO AND INCLUDING THE NTH OCCURENCE OF + . NO DELETE IF NOT FOUND BUT LEAVES YOU AT + END OF LINE. + + N SEARCH TO nTH NUMBER (A NUMBER IS ANY CONTIGUOUS + SEGMENT OF DIGITS). END OF LINE IF NOT FOUND. + + # SEARCH TO nTH NUMBER. IF FOUND ASK FOR TEXT MACRO + NAME, AND STORE STRING OF DIGITS IN IT. + THIS MACRO MAY NOW BE CALLED WHERE EVER YOU NEED + A NUMBER! + + U SEARCH TO nTH NUMBER AND DELETE IT. + + F SEARCHES FOR THE Nth OCCURENCE OF AS A + SUBSTRING OF THE CURRENT TEXT. IF FOUND AND + t=ALTMODE THEN DELETE THIS OCCURENCE + OTHERWISE DONE. IF tALTMODE THEN t MUST = CRLF. +PC????? IF STRING IS NULL, NO SEARCH IS DONE +D IF STRING IS NULL, THEN "SEARCH STRING" IS USED + UNLESS IT IS ALSO NULL IN WHICH CASE NO SEARCH + IS DONE. + + HERE IS HOW THE MATCHING IS DONE: + IF THE FLAG FOR "SPACES" IS OFF (DEFAULT EXCEPT AT DEC) THEN ANY + SPACES IN EITHER THE STRING OR THE SEARCH STRING + ARE IGNORED, OTHERWISE THEY ARE NORMAL CHARS. +  IS CONVERTED TO A SPACE. IF THE FLAG "EXACT" + IS OFF (DEFAULT) THEN LOWER CASE CHARS ARE CONVERTED + TO UPPER CASE. + THE FOLLOWING SPECIAL CHARS ARE CURRENTLY RECOGNIZED: + + NODEC DEC + | | BEGINNING OR END OF LINE. + + ^T ? ANY CHARACTER. + +  ^E INVERT MATCH CONDITION ON NEXT THING. + +  ^N ANY NUMBER OF NEXT THING WILL MATCH, INCLUDING 0. + SMALLEST NUMBER OF CHARACTERS NECESSARY WILL BE USED. + +  ^^ QUOTE NEXT CHARACTER. + + $ $ (DOLLAR SIGN) MATCH ANY LETTER. + + % % MATCH ANY DIGIT (0-9). + +   MATCH ANY ALPHANUMERIC. + EDIT MODE: +THE EDITR STARTS UP IN "EDIT MODE". +LEGAL COMMANDS ANY TIME ARE: + + P ENTER PIN MODE. + + T ENTER TEXT/PROPERTY MODE. + + I ENTER INSERT MODE. THE CURRENT POINT IS SET TO THE FIRST + POINT OF THE BODY AND THE CURSOR IS PUT THERE. + + $(ALTMODE) RETURN TO EDIT MODE! + + P SET A PIN. POSITION THE CURSOR FIRST. YOU WILL BE ASKED + "PIN NAME?". TYPE A DECIMAL NUMBER. THE PIN WILL APPEAR AT + THE CURSOR POSITION. + YOU MAY ALSO FOLLOW THE THE PIN NAME WITH: + + ><-> + + <> PAIRS INDICATE OPTIONAL ARGUMENTS. THE MEANS + H, L, OR NOTHING. THE /B SETS THIS PIN AS A BUSSED THROUGH + OCCURENCE OF THE THE PINS WITH THIS DEFAULT NAME. / WITH + NO B AFTER IT CLEARS THIS. A BUSSED THROUGH PIN IS THE SAME + PHYSICAL PIN, BUT THE PIN # WON'T PLOT. - SETS + THE DEFAULT POLARITY TO HI, LOW, OR NONE RESPECTIVELY. + + T PLACE TEXT (SEE EDIT TEXT/PROPERTY MODE). + + Y PLACE NEW OR CHANGE OLD PROPERTY (SEE EDIT TEXT/PROPERTY MODE). + + Y CHANGE OLD PROPERTY, CLOSEST MATCH ON NAME. + (SEE EDIT TEXT/PROPERTY MODE). + + E EXIT THE EDITOR. (RETURN TO DRAWING LEVEL AND MODE LAST + USED THERE.) + + EXTENDED COMMANDS IN EDITOR: + + DISLOC ALWAYS DISPLAY LOCATION TEXT ON EACH INSTANCE + OF THIS BODY IN DRAWING. + + -DISLOC DON'T DISPLAY LOCATION TEXT ON AN INSTANCE OF + THIS BODY IF THE OFFSET IS FOLLOWING THE DEFINITION. + +EDIT MODE COMMANDS: + + DURING EDIT MODE, A STAR INDICATES THE CLOSEST POINT IN THE + BODY LINES FOR USE WITH R, M, I, D COMMANDS. + + " ASKS FOR A MACRO NAME, THEN DEFINES THAT MACRO TO BE + THE NAME OF THE BODY YOU ARE EDITING. + + " SAME AS " BUT MAKES MACRO OUT OF DIP TYPE NAME + INSTEAD OF BODY NAME. + + M + I ENTER INSERT MODE. THE CURRENT POINT IS SET TO + THE POINT WHICH PREVIOUSLY HAD A STAR ON IT. + + G "GET" A BODY DEF BY NAME AND ADD IT TO THE END OF THIS BODY. + YOU WILL BE ABLE TO MOVE IT(NORMAL CURSOR MOVING) AND + ROTATE IT (USING O) UNTIL YOU TYPE SPACE. ALTMODE WILL + FLUSH THE BODY WITHOUT PLACING IT. + + D DELETE "CLOSEST" POINT. + + R CHANGE FLAVOR OF CLOSEST POINT. WAITS FOR + OR -. + + N MOVES THE CURSOR TO THE CURRENT INITIAL LOCATION OFFSET AND + THEN LETS YOU MOVE IT UNTIL YOU TYPE SPACE OR ALTMODE. + +INSERT MODE COMMANDS: + + + THE CURRENT POINT ON THE BODY LINES FOLLOWS THE CURSOR UNTIL + YOU LEAVE INSERT MODE. + + + THIS TERMINATES THE CURRENT VECTOR FOLLOWING + THE CURSOR. AND STARTS A VISIBLE ONE FOLLOWING IT. + + - SAME AS + BUT AN INVISIBLE VECTOR IS STARTED. (FEAR NOT + YOU CANNOT WASTE SPACE BY PUTTING TWO INVISIBLE VECTORS + TOGETHER.) + + R WAITS FOR A "+" OR A "-" THEN CHANGES THE VECTOR "LEAVING" + THE CURRENT POINT TO THE CORRESPONDING TYPE. + + D DELETE THE CURRENT POINT. THIS WILL LEAVE A VECTOR JOINING + THE TWO NEIGHBORING POINTS THE TYPE WILL BE THAT OF THE + ONE ALREADY ON THE LAST POINT. HOWEVER THE CURSOR IS ON + THE NEXT POINT. + + SPACE MOVE THE CURSOR TO THE "NEXT" POINT. + + BACKSPACE MOVE THE CURSOR TO THE "PREVIOUS" POINT. + TEXT/PROPERTY MODE COMMANDS: + + A STAR INDICATES THE CLOSEST TEXT/PROPERTY. + AN INVISIBLE PROPERTY CANNOT BE CLOSE TO THE CURSOR + UNLESS "XIDENTS" HAS BEEN DONE (MAKING IT VISIBLE). + + + T PLACE BODY TEXT AT THE CURRENT CURSOR POSITION. + THE SIZE KLUDGE IN DRAWING MODE APPLIES HERE. + WHEN TEXT IS PLACED, THE OFFSET IS CALCULATED TO CENTER + THE TEXT OVER THE CURSOR POSITION. THIS OFFSET IS + MAINTAINED WHENEVER THE TEXT IS CHANGED, UNLESS YOU + EXPLICITLY MOVE IT YOURSELF. + + Y ASKS FOR PROPERTY NAME, THEN ASKS FOR TEXT TO ASSOCIATE + WITH PROPERTY. IF PROPERTY DOES NOT EXIST, TEXT IS PLACED + AS IN T, BUT MAY BE REFERRED TO BY ITS PROPERTY NAME. + IF PROPERTY EXISTS, ITS TEXT IS REPLACED BY THE TEXT + YOU TYPED. IF EITHER THE PROPERTY NAME OR THE TEXT IS + ENDED WITH ALTMODE ($) NOTHING IS DONE. + + Y ASKS FOR PROPERTY NAME, YOU DO NOT HAVE TO TYPE THE + FULL NAME OF THE PROPERTY, ONLY ENOUGH TO UNIQUELY + IDENTIFY IT. IF THE PROPERTY IS FOUND, THE FULL PROPERTY + NAME IS TYPED OUT. THEN YOU ARE ASKED FOR THE NEW TEXT + TO ASSOCIATE WITH IT. AGAIN ALTMODE ($) GETS YOU OUT. + + K STOP DISPLAYING TEXT/PROPERTY. IF TEXT, THIS DELETES IT. + IF IT IS A PROPERTY, IT IS NO LONGER DISPLAYED, BUT THE + BODY DEF STILL HAS THAT PROPERTY. PROPERTIES WHICH ARE + NOT BEING DISPLAYED WILL BECOME VISIBLE UNDER "XIDENTS". + + D DELETE TEXT OR PROPERTY COMPLETELY. + + D IF PROPERTY, CHANGE TO ORDINARY TEXT. IF INVISIBLE, + THEN CHARACTER SIZE IS SET TO THE STANDARD. + + M MOVE THE TEXT/PROPERTY. THE TEXT FOLLOWS THE CURSOR + UNTIL YOU TYPE A SPACE. + + M CHANGE TEXT OFFSET FROM TEXT LOC. + AFTER THIS COMMAND, OFFSET IS NOT AUTOMATICALLY + RECALCULATED WHEN TEXT IS CHANGED. + + M GRAB TEXT TO CURSOR. LIKE M, BUT TEXT MOVES TO CURSOR + INITIALLY. + +STANFO Z LINE EDIT TEXT. LINE EDITOR CURSOR STARTS AT + BEGGINNING OF LINE. + +STANFO Q LINE EDIT TEXT. LINE EDITOR CURSOR STARTS AT + END OF LINE. + + Z RECALCULATE OFFSET FOR TEXT TO CENTER IT OVER + MOVE POINT. TEXT CHANGES WILL AGAIN UPDATE OFFSET. + + " STORE TEXT INTO MACRO. + + " STORE PROPERTY NAM INTO MACRO. + + F FIND NEXT MARKED TEXT STRING. + + F ASKS FOR STRING, THEN FINDS AND MARKS ALL PROPERTIES + WHICH HAVE THE STRING AS A SUBSTRING OF THEIR PROPERTY + NAME. + + F ASKS FOR STRING, THEN FINDS AND MARKS ALL TEXT WHICH + HAS THAT STRING AS A SUBSTRING. + + EXTENDED COMMANDS FOR EDIT TEXT/PROPERTY MODE: + + TMOVE MOVE TEXT/PROPERTY OFFSET USING CURSOR + MOVE COMMANDS. THIS STOPS AUTOMATIC + RECALCULATION OF TEXT OFFSET. + +PIN MODE COMMANDS: + + A STAR INDICATES THE CLOSEST PIN. + + + D DELETE CLOSEST PIN + + M MOVE THE CLOSEST PIN. CURSOR IS PLACED ON PIN + AND PIN FOLLOWS IT UNTIL SPACE IS TYPED. + + N ASKS "NEW PIN NAME?", THEN CHANGES THE NUMBER OF THE CLOSEST + PIN TO WHAT EVER YOU TYPE. SAME RESTRICTIONS ON NUMBER + AS WHEN PLACING NEW PIN. + + N ASKS "LOCATION # (0-7)?" IF YOU TYPE "?" YOU WILL GET + A LIST OF THE OPTIONS. THIS NUMBER CONTROLS WHERE THE PIN + NUMBERS ARE SHOWN. + PIN DISPLACEMENTS ARE ACCORDING TO THIS CHART. + 0=UP RIGHT 4=DOWN LEFT + 1=UP 5=DOWN + 2=UP LEFT 6=DOWN RIGHT + 3=LEFT 7=RIGHT + + N USED TO BE "NIPPLE BIT". NOW IT IS MORE GENERAL. + YOU MAY NOW TYPE X,Y (OR JUST X) OFFSET FOR PIN NUMBER. + THE UNIT IS 1 CURSOR STEP. THE VALUES MAY BE SIGNED. + + F AUTOMATICALLY CALCULATES LOCATION #. IF IN OUTSIDE MODE + THEN WILL TRY TO PUT IT OUTSIDE, ELSE INSIDE. INSIDE IS + STARTUP DEFAULT. + + F DO F TO ALL PINS OF BODY. + +DEC P ASKS "POLARITY?" TYPE H OR L TO SET THE DEFAULT ON THE + NEAREST PIN. TYPE TO CLEAR THE DEFAULT. + TYPE $ TO ESCAPE WITH NO CHANGE. + + EXTENDED COMMANDS FOR EDIT PIN MODE: + + FLPIN ASKS FOR STRING, AND MARKS ALL PINS WHOSE + PIN NAME CONTAIN THE STRING AS A SUBSTRING. + + FLPNEXT FIND NEXT MARKED PIN. + MACRO'S: + + : EQUIVALENT TO ;R0 + + ;<-> MACRO COMMAND. <-> IS ARGUMENT, IS COMMAND. + <-> IS OPTIONAL. IF NOT AT COMMAND LEVEL (STAR PROMPT), + YOU MUST USE AT LEAST 1 BEFORE THE ";". + + +MACRO COMMANDS: + + S STOP ALL MACROS IMMEDIATELY. THIS IS WHAT TO DO WHEN + YOU ARE INSIDE A MACRO AND YOU DECIDE YOU HAVE SCREWED + UP. + + H SUBSTITUTE THE VALUE OF A VARIABLE AT THIS POINT. + ASKS FOR THE VARIABLE NAME. TERMINATE THE NAME WITH + A CARRIAGE RETURN. + + I INPUT FROM THE TTY. THE NEXT CARRIAGE RETURN TYPED + SIMULATES TYPING ";R0". + + Y ASKS FOR A CHARACTER, READS INPUT FROM + DSKIN FILE UNTIL THIS CHARACTER IS SEEN. THEN TURNS + OFF DSKIN AND PROCEEDS TO TAKE INPUT FOLLOWING THE ;Y. + + P START TEMPORARY MACRO. + + M START PERMANENT MACRO. EVERYTHING FROM HERE TO THE NEXT + WILL BE TAKEN TO BE THE MACRO NAME. ARGUMENT OF 1 BEFORE + M WILL CAUSE "SMACRO" TO HAPPEN TO THIS MACRO. + + D LIKE M, EXCEPT DOESN'T EXECUTE MACRO DURING DEFINITION. + IF REPEAT COUNT IS GREATER THAN 1, THE REST OF THE + ITERATIONS WILL BE IGNORED ALSO. ARGUMENT OF 1 + WILL CAUSE "SMACRO". + + R END MACRO. EVERYTHING FROM HERE TO THE NEXT WILL BE + TAKEN TO BE THE REPEAT FACTOR(INCLUDING DEFINITION OF + MACRO). FOR PERMANENT MACRO'S THE REPEAT FACTOR BECOMES + PART OF THE DEFINITION. AS A SPECIAL HACK IF THE CHARACTER + "#" IS USED INSTEAD OF A NUMBER, THE NUMBER OF MATCHES + FOUND BY THE LAST "F" OR "XFDIP", ETC. COMMAND WILL BE USED. + + C CALL MACRO BY NAME. EVERYTHING FROM HERE TO NEXT WILL + BE TAKEN AS THE MACRO NAME. + + A FOLLOWED BY: + + N,M,I + + SUBSTITUTE AT THIS POINT THE NUMBER N AND INCREMENT BY M + EVERY TIME THROUGH THE MACRO I LEVELS UP FROM THE CURRENT + ONE. N AND M MAY BE NEGATIVE. I, OR M AND I MAY BE LEFT + OUT, IF SO DEFAULT I WILL BE 0 DEFAULT M WILL BE 1. + IF A <-> ARG PRECEDED THE "A", IT WILL BE USED + AS THE MINIMUM WIDTH OF THE RESULTANT DIGIT STRING. + <-> IS CURRENTLY IGNORED. + + N SAME AS ";A" EXCEPT ALWAYS SIGNS THE NUMBER, EXCEPT FOR + ZERO WHICH EXPANDS INTO A NULL STRING! + + L FOLLOWED BY: + + + + ADDS 100 (OCTAL) TO NUMBER AND RETURNS IT AS A LETTER. + IF "D" PRECEEDS THE NUMBER, G,I,O, AND Q ARE SKIPPED. + THE "D" STANDS FOR "DEC" + + T WILL REQUEST TTY INPUT AT THIS POINT. + MUST BE TERMINATED BY ";R0". + + U LIKE ;T IF INPUT NOT COMING FROM MACRO, OTHERWISE + IT IS A NOOP. THIS IS USEFUL WHEN YOU GET INTO + A MACRO AND DISCOVER YOU WANTED TO INITIALZE A VARIABLE + OR SOMETHING. IT ALLOWS YOU TO DO SOMETHING WHILE YOU + ARE TYPING IN THE MACRO WHICH WILL NOT BE DONE ON + SUBSEQUENT ITERATIONS. + + V, + + THIS CAUSES TTY INPUT TO BE EXECUTED AND STORED IN THE + MACRO WHOSE NAME YOU TYPE, IF THE NEXT TIME THIS COMMAND + IS PROCESSED, ANY OF THE MACROS BETWEEN THE CURRENT LEVEL + AND THE LEVEL n UP FROM HERE (INCLUSIVE) ARE NOT IN THE + FIRST TIME THROUGH THE LOOP, A ";C" IS DONE WITH THE MACRO + NAME INSTEAD OF TAKING IN THE DEFINITION. + ANOTHER WAY OF LOOKING AT THIS IS THE CONSIDER THE MACRO + A VARIABLE ASSIGNED THE FIRST TIME YOU ENTER MACRO LEVEL + n UP FROM HERE. + + F + ::= | - + ::= + + IF IS TRUE, ALL CHARACTERS ARE EATEN UNTIL A MACRO + LEVEL LEVELS UP FROM THE CURRENT ONE IS LEFT. + TE FOLLOWING FLAGNAMES EXIST: + + FALSE ALWAYS FALSE (USE -FALSE FOR TRUE) + CLOSES TRUE IF CLOSE TO SOMETHING + FIND TRUE IF LAST "F" FOUND SOMETHING + AFIND TRUE IF LAST F, S, K, N, U, OR # COMMAND IN + ALTER MODE WAS SUCCESSFUL. + ENDMUL TRUE IF LAST H INCREMENTED A MULTI STRING + VARIABLE OFF THE END (VALUE OF STRING IS NOW NULL). + DSKEND TRUE IF NO DSKIN FILE OPEN. TO FACILLITATE THE + USE OF THIS FLAG, END OF FILE WILL LOOK LIKE A MATCH + FOR THE CARACTER IN ;Y. THIS IS SO CONTROL WILL + REVERT TO A MACRO ON END OF FILE. + LSTEXP TRUE IF LAST ;X RETURNED A NON-ZERO RESULT + AEOL TRUE IF AT END OF LINE IN ALTER MODE + ABOL TRUE IF AT BEGINNING OF LINE + EDGE TRUE IF LAST CURSOR MOVE HIT SCREEN EDGE + (NOT TRUE IF IN -WINDOW MODE) + + E + + EVERYTHING UP TO THE NEXT : IS STORED + IN THE NAMED MACRO AFTER EVALUATION BY MACRO PROCESSOR. + + X + + THIS ALLOWS ARITHMETIC EXPRESSIONS TO BE EVALUATED. THE + OPERATORS "+", "-", "/", "*" ARE RECOGNIZED, SUB-EXPRESSIONS + MAY BE FORMED USING MATCHING PAIRS OF "< >" OR "( )". + STANDARD PRECEDENCE IS USED IN EVALUATION. + + = + + RETURNS A STRING OF DIGITS REPRESENTING THE DECIMAL CODE + OF THE CHARACTER MINUS 64. + + # + + IF CHAR IS NOT A LETTER, DOES ;=. + ELSE CONVERTS LETTER TO NUMBER USING SEQUENTIAL NUMBERS + FOR THE DEC ALPHABET. + + G + + CONVERTS ALL LETTERS IN TO LOWER CASE. + + ^ + + RETURNS CHARACTER WHOSE ASCII CODE IS 100 LESS THAN + THAT OF THE CHARACTER TYPED. LOWER CASE IS CONVERTED + TO UPPER CASE BEFORE PROCESSING. THIS COMMAND ALLOWS + TYPIN OF CONTROL CHARACTERS BY USING THEIR LETTER. + FOR INSTANCE C CAN BE GOTTEN BY ;^C. + + O + + IF NOT TAKING INPUT FROM TTY, PRINTS STRING ON TTY + + MACRO'S MAY BE NESTED TO A LEVEL OF 102 DECIMAL THE ONLY REQUIREMENT + BEING THAT EACH MACRO CONTAIN AN EQUAL NUMBER OF ;P'S AND ;R'S. + HOW TO DO IT -- PC CARDS + +Start here when you have completely finished wiring +your pc card. + + You are now in the PC program. You must now generate +4 plot files. The 2 outer planes (component and solder) +and the 2 inner planes (power and ground). +You should try to use the following form for plot filenames. +End the name with "C" for component, "S" for solder, "P" +for power, and "G" for ground. + To generate the component and solder plane plots +get on the appropriate side and say W. Then +type the filename. + Now for inner planes. If you want anything but +clearances in your inner planes, STOP and see RPH. Otherwise +you now type INNER to the extended scanner. This deletes +all lines and points except dip pins and feed throughs, and +sets the pad type for these to 2 (clearances). Currently the +plane connections aren't indicated by the absence of pads. + To make the inner plane plots, use the extended mode +PPLOT command, which asks for the plane number, then the +filename. The plane number is the same as the one you gave +to attach to the plane in the first place. + MORE PC CARDS -- PCP + Now you have 4 plot files (if not see RPH). Now run PCP. + + The following indicates program prompts in upper case, +then a description of your response in loser case. +It is suggested that you run PCP on a teletype when doing a TRW +run, and save the output for transfering to a planning sheet. + +When program starts up, it asks: + +OUTPUT MODE(S)? + + If you respond "?", the following list will be typed: + +CHAR EFFECT +? TYPE THIS LIST +1-9 SET SCALE FACTOR +Q QUICK (ABBREVIATE PROMPTS). +N FLUSH ANY TEXT FROM INPUT FILE +Z DELETE FILE AFTER PLOT +C PLOTTER OUTPUT +F FR80 OUTPUT +X XGP OUTPUT +G RUN X PROG AUTOMATICALLY +W SPOOL X OUTPUT, "R XS" WHEN ALL DONE +E EXTRA THICK LINES (WORKS BEST ON XGP) +S ENABLE RESTART CAPABILITY +R ROTATE PLOTTER OUTPUT +T GERBER OUTPUT +M MAP RETICLES +A ADD SYMBOL DEFINITIONS +Y MAKE DRILL TAPE FIRST TIME THROUGH + + You may type any of the characters in the first column + all on one line, the program will warn you of any + conflicting modes. + + Here is a brief description of each of the modes: + +? Obvious + +C This causes a plot to be made on the calcomp plotter. + +F This causes a file to be written on the current area + with the extension 'F80'. This file when copied onto + a magtape (see description, end of page), will produce + FR80 microfilm of the pc card. + +X Instead of driving the calcomp plotter, plotter commands + go into a file with the extension 'PLX'. This file when + processed by the 'X' program will produce XGP output of + your pc card. + +G This specifies that when the first plot is done, the + program should link directly to the 'X' program, which + will then produce the XGP output. + +W This causes output to the XGP to be generated and 'X' to + be run, but 'X' writes its output on the disk again. Later + when you have run all your cards through 'PCP', you run + 'XS' which finds, prints on the XGP, and deletes all the + temporary files. This saves time and paper on the XGP. + +S This command, intended for use exclsively with calcomp + plotter output, plots a cross 2" above the intial pen + position, and during the processing of the plot, + accasionally saves a core image (it will ask how often to + do this). If for some reason you must start over, merely + position the bullseye on the pen carraige over the cross + and run file called "PLTSAV.DMP", which will continue + the plot from the place where it left off. + +R This will cause the plot to be rotated 90 degrees CCW. + +T This will write a file with the extension 'MAG'. When + copied to a magtape (see next page) the tape can be + sent to TRW in L.A. and plotted on film on their gerber + plotter system. This also generates a 'LOG' file which + should be XGP'd and stuck in the plot log book. + +M When this mode is selected, the program will ask for + pad types which want to be the same wheel pos as another + pad type, or the same as some position not accessible by + pad types directly. + +A This causes PCP to accept extra symbol definitions other + than the standard ones. + +Y A drill tape file is made from the first file processed. + +If you select both "T" and "Y" modes, the trw output will be a drill +plot. That is, no lines, text, or pads are drawn and donut pads are +plotted at the location of each drill hole. + +If you selected the "T" output mode: + + and "M" mode, + + If you have a pad type in your pc card, and you want + to use one of the standard reticles (i.e. nortronics + target), this allows you to map the pad type into a + different wheel position than usual. If you answer + "Y", you are asked the following: + + RETICLE MAPPING LIVES FOR EVER IN THIS CORE IMAGE! + PAD TYPE NUMBER? + + Here you respond with the pad type number which you + set in the pc prog. If you respond , you get out. + + WHEEL POS? + + Now you tell which wheel position you wish selected + for this pad type. Then you loop back to the pad + type prompt. + + and "A" mode, + + If you are using any characters not in the TRW + standard character set (see RPH for character + set), say Y. If you say Y, the following + will be asked: + SYMBOL DEFINITIONS LIVE FOR EVER (IN THIS CORE IMAGE). + BE SURE TO MAKE A SKETCH OF THE SYMBOL INDICATING THE "D" CODE. + D60? + Type the single character for this code (no ). + Any previously assigned codes will be printed followed + their character, then you will be asked to assign the + first unassigned code. Type the character you used when + you placed the text in the PC prog. + D61? + This will continue until you answer . + +If you selected the "F" output mode: + + AT FR80 SCALE OF 3.7 FRAME IS ABOUT 22X17. + FR80 SCALE*10 ? + + This is exactly what it seems, if your card is somewhat + smaller than this, you may use a larger scale. Use AID + to calculate the appropriate scale. will get you + 37 (scale of 3.7). + + FR80 FRAME IS 22X17. + + The frame size will be printed if you give a scale other than 37. + +SCALE FACTOR? + + Scale of 1 is real size (you get this if you type alone). + Don't use anything else if you are making a TRW plot or an FR80 + plot. This may be used to make detail plots. + +POSITIVE X,Y OFFSET (IN INCHES, DECIMAL POINT OK!)? + + This must be used to generate TRW plot tapes, and MCC drill tapes. + Both systems have 0,0 at the lower left. The standard film we are + using at TRW is 24 x 20 inches. Thus the offset should be 12,10. + The MCC drill frame size we will use is 20 x 20 inches, so use 10,10 + for drill tape. If is typed, and you are making a TRW plot, 12,10 + will be used. Otherwise 0,0 is used. If you are making a drill tape + for an Excellon drilling machine, the plot must be oriented so that + 0,0 on the drill tape corresponds to a point centered on the fingers + and 1" below their shorting bar, with the shorting bar oriented along + the x axis and the card extending upward along the positive y axis. + The foregoing applies to the Excellon machine at MBC Electronics of + Santa Clara, CA, at least. In order to obtain this orientation, one + must consult the pc card definition in CARD.FAI[DAT,DRW] and, after + producing a .DRL file from PCP, using scale 1, and with NO offset or + rotation, the proper rotation and then offset may be entered into TD + for generating a paper tape. For further details, see info on TD + below. FR80 output is centered automatically, independent of any + rotation or offset values entered in response to the aforementioned + prompts. + +The preceeding information is asked only once every time the program +is started. The rest is asked in a loop starting here. When done type +^C (call). + +FILENAME? + + Type the plot filename, default extension is "PCP". + +CHAR "M" HEIGHT +SCALE CODE (IN MILS) +0 M50 120 +1 M51 +2 M52 +3 M53 +4 M54 + + This controls the character size, the typeout actually + stops at the end of each line, suppresses text + of this scale. If this is a TRW tape, the height must be + divisible by 15. Otherwise it mustbe divisible by 5. + This number is the height and spacing of the characters + of that scale. Scale 0 (M50) is used for the messages, + which are plotted across the bottom of the film. + If you respond with altmode, the rest of the char. size + prompts are suppressed. + +PUT PEN AT 0,0. +LINES, TEXT, AND PADS MAX X= 0.000 MIN X= 0.000 MAX Y= 0.000 MIN Y= 0.000 + + This information is calculated from the plot file, and does not + include the card outline. If any of the numbers are abnormally + large, STOP and get RPH immediately. + +If this is a TRW plot tape the following is asked: + + OPERATOR MESSAGES, 40 CHARS PER LINE (MAX). END WITH . + STANFORD A.I. PROJECT. + + This puts messages on the tape which are typed + to the operator at TRW at this point in the plot. + These messages are also plotted across the bottom + of the film for identification purposes. + The first line always identifies us, subsequent + lines should identify the plane number (0 to 4, + top to bottom) and what it is. End with a blank + line. + +If you specified "Y" mode: + + TYPE X,Y OF HOLES TO ADD TO DRILL TAPE + DECIMAL POINT OK, OFFSET WILL BE ADDED. + + Then loop asking the question: + + X,Y OF HOLE? + + Until you type just return. + The hole are placed on the front of the drill tape + in the order in which you typed them. + +If this is not a drill plot (pads for drill holes only), the following +question is asked (unless this is a TRW run): + + SKIP PLOTTING OF ALL PADS? + + This is only useful on calcomp for overlaying plots with the same + pads. + +Now the program will spew out various things about how far along it is. +If the card number was available when the plot files were written, it +was passed in the file. If not, the following question will be asked: + + CARD NUMBER? + + Here you type the number of the card you want to use. + If you type 0 or just , no card will be done. + +Here progress on the card is indicated. +Now the program will type: + +ACTUAL MAX X = 0.000 MIN X = 0.000 MAX Y = 0.000 MIN Y = 0.000 + +These numbers include the card outline as well as lines, text, etc. +They must be copied to the TRW planning sheet if this is a TRW plot. + +Then it says: + +PLOT DONE! + +And here we loop back to the plot filename prompt! +Unless the "G" output mode was selected, in which case we go to the +'X' prog which runs automatically. + MORE PC CARDS -- AFTER PCP + +At completion of plots, the following command should be typed to +generate an FR80 tape: + +COPY MTA0:FOO_STANFO.F80[PLT,DRW], + ,STANFO.F80[PLT,DRW] + +To punch paper tape from an XXX.DRL file, run TD[F,RPH] and type the filename +XXX. This is a separate program because the tape must be punched in binary. +TD has the capability to massage .DRL files to make tapes that should fit +just about any conceivable NC drilling machine axis orientation. The two +types of machines it knows about are the MCC machine (used at CINCH, CIRCO, +and VOSTRON companies), which drills only one board at a time, but which can +select from several drill sizes under tape control, and the EXCELLON machine +(used at CBDC and MBC) which has three drill heads for doing three copies of the +board at one time, and does not have a facility for changing drill sizes under +tape control. The MCC machine (the one at CINCH, at least) wants a 20 inch square +drill frame with the board centered inside the frame. The EXCELLON machine needs +to have the coordinate of the center of the board's shorting bar be (0,1), and +the rest of the board must extend along the positive Y axis. TD prompts first +for rotation, and then in the new coordinate system, accepts an offset. PC +boards are defined in the source for a .CRD file as having their center be (0,0), +so the XXXXXX.FAI source file for the XXXXXX.CRD file used for the plot must be +consulted and the distance from the center to the edge connector shorting fingers +must be found, rounded up to the nearest inch, increased by one inch, and entered +as the "x,0" to TD's offset prompt. TD will finally ask whether the origin of the +plot is to be marked. This feature writes the string "S: +X +Y^" to unambiguously +verify the coordinate system present on the drill tape. + +To make a TRW magtape from your 'MAG' files, type: + +COPY MTA0:/EVEN_XXC.MAG,XXS.MAG,XXP.MAG,XXG.MAG,XXD.MAG + +Where the file names are the appropriate files you have just generated. + +The order is not important, but should agree with the file numbers on the +planning sheets and any messages on the tape itself. + +You should also XGP all the 'LOG' files and put the file #'s on them. + RUNNING WL + + How to run the wire lister + + or + + Easy little steps for muddy little feet + + Commands are single letters with or without control or meta. The command +may be preceeded by any of the following: + + DEC NODEC + (NOTHING) (nothing) +$ ONE ALT control + TWO ALTS Meta + THREE ALTS control-meta + doesn't matter + +If more than one of the above appear, then all will satisfy command. +In all but the "I" command if only one wire list exists, the "WIRE +LIST ID?" prompt will be skipped. + +Commands: + +E EXIT. + + +@ SAME AS "XDSKIN". + + +D Enter DIP SUB-MODE. See next page for commands in DIP SUB-MODE. + + +_ + Set default wire list id. This is the wire list which is used + for all commands requiring single wire lists. The 2 wire list + id's are "D" and "PC". + + +_ Toggle wire list id's. (switch from D to PC or back). + + +I OR I + ASKS: + FILENAME? + + You may type a filename (default extension is ='WD' and ='WPC') + or @filename (default extension is "DIR"). The format of + a "DIR" file will be explained later. + If you type "" you get wire list with id "D". If you type "" + you get the wire list with id "PC". + + The file(s) are read, signal names are compared and the + wire list is built. + + After the file name you may type a module location which takes + effect for any dips or pins which do not already specify a + module location. You may also type variable settings enclosed + in parentheses, separated by commas. See the end of this writeup + for exact information. Example: + IFOO 1AE3 (N0,M0) 1AE4 (N6,M1) + This reads file FOO.WD twice, once (called slice 1) for + module location 1AE3 with N=0 and M=0, and once for location + 1AE4 with N=6 and M=1. + The file(s) are read, signal names are compared and the + wire list is built. + +I Asks: + + FILENAME? + + Same options as reading 'WD' or 'WPC' files, default extension is 'WEQ'. + This file contains some number of signal names on each line, seperated + by tabs. The effect of this file is that each line is treated as a wire. + So you may cause certain wires to be grounded or connected to HI, or even + connected to other wires. Please note: The card location of the wire list + you wish to affect should appear with the filename, just like reading a + wire list. + + +U Asks: + + CARD(NLLN)? if necessary + + This copies the dips from the default wire list (a logic + wire list), to the other wire list (a pc wire list). The + locations are used for matching. + + +N OR N + Asks: + + WIRE LIST TITLE? + + The string you type will be used on listings involving + this wire list. + +L Asks: + + CARD (NLLN)? if necessary + + This lists a wire list onto a file. The default + extension is 'WL'. + All sorts of neat things are indicated on + the wire list, the best way to find out what + they are is to make one. + Any unnamed signals are given unique numbers + which are printed preceeded by a "#". + +L Asks: + + CARD (LN)? if necessary + + This makes the following summaries: + + Summarizes all dip types used in this wire list + totaling the different body names and total number + of sections used. + + UNGENERATED SIGNALS + + UNUSED SIGNALS + + Each of these catagories is listed, only one + of the names of a wire fitting the catagory + is listed. The default extension is 'WLS'. + + +L Asks: + + CARD (NLLN)? if necessary + + Then asks for a filename. The default extension is 'WLU'. + Writes a listing file which is sorted by dip number. Under each + dip number is listed the signals connected to each pin. + At the end of the listing, the edge connector fingers are listed + in alphabtical order along with the signal connected to each. + + This prints out the following info: + + LOC DIPTYPE BODY POS FILE + + For each body followed by: + + PIN # TYPE HI LOW USE SIGNAL NAME + + For each pin of body. + + Then: + + CONNECTORS + PIN FILE SIGNAL NAME + + For all connector pins. + + This allows you to find out a signal name from the LOC(PIN #). + + +P + or +P which asks for signal name + + Then prints for that the signal name, the information which + would be printed for that signal in L. Prints on TTY. + + +P Asks: + + CARD (LN)? if necessary + + Then asks: + + DIP OR CONNECTOR LOCATION? + + Then prints info for that loc which you would have gotten in + a L listing. Prints on TTY. + + +P Asks: + + SIGNAL NAME? + + Then does P for this signal for each card currently read in. + + + In addition, if (NODEC) OR ? (DEC) appears in front of the signal name both the + hi and low versions of the signal will be printed. This works + for P, P, and P. + + +W Asks: + + CARD (LN)? if necessary + + This writes a file for input to the PC prog for generating + router files which are read by wagner's router prog. + The default extension is "WDR". + + +W This writes a back panel wirelist file from all the cards in + the default wirelist. The default extension is 'BAC'. + + +B Reads a back panel wire list written with W (default extension + is 'BAC'). You may now make back panel listings using X commands. + + +B READS A 'BAC' FILE, BUT ONLY INPUTS FILENAME AND TITLE INFO, + AND DIP COUNTS FOR MAKING AN 'MPL' FILE. + + +B Reads a file of the same format as a 'WEQ' file, however default + extension is 'BEQ'. It has the same effect on the back panel as + a 'WEQ' file has on a card wire list. Except there is no problem + with the card location, it applies to the whole back panel. + + +C Asks: + + CARD (LN)? if necessary + + Then asks for a filename. The efault extension is 'WLC'. + The card specified is found in D wire list and PC wire list. + The two wire lists are compared and an error listing is + produced. Make one to find out the format. The info from C + is included in C. + + +C Asks: + + CARD (LN)? if necessary + + This compares D and PC wire list as in C, but it only checks + if you have placed the right dip sockets on the pc card for + the dips you are using in the logic drawing. Also checks that + you have not pre-assigned an illegal connector pin #. This + be done only after a L verify has been done with no errors + because the kinds of errors found by this check will confuse + C. + + EXTEND MODE COMMANDS +X If any control bits held down asks: + + Si? + + Now type a 1 to 6 (or more) letter command possibly preceded by + a "-". The meanings of these commands are explained below: + A "D" at the left means available in dip sub-mode only, a "B" + means available in both top-mode and dip sub-mode, nothing means + available only in top mode. + +B ? Prints all commands and a brief description of each. + +B RESIDENT Reads in the dip definition file at the bottom of free + core, and marks the last loc used. + now whenever you type ^c start, the dips + stay in the core image. All other data in program + free storage is cleared. + +B -RESIDENT Release dips from bottom of core. Now when + you type ^c start the dips go away. + +B DDT Enters DDT if loaded. + +B SAVE Asks for a filename, (default extension is 'DMP') + then executes a swap uuo to save the current core + image. If DSKIN is in progress, it is suspended + during the save and restarted (using DSKCON) after- + wards. However, when the saved core image is run + again, the DSKIN is not continued. It may be + continued manually by a DSKCON command. +DEC AT DEC NO SWAP UUO IS USED, THE PROGRAM MERELY + EXITS TO THE MONITOR AND YOU MAY SAVE IT, THEN + START OR RUN IT LATER. + +B DSKIN Asks for a filename, (default extension is 'TXT') + then takes input from there instead of tty. If an + error is encountered, input reverts to the tty. + +B DSKHLD Releases disk input file, remembering where it was. + later you can give a DSKCON command to continue. + +B DSKCON If the last dskin was held by a DSKHLD command or + an error, the command causes the file to be reopened + and the appropriate chars skipped to get it back where + it was. DSKHLD and DSKCON are used by SAVE to get + around the fact that the swap uuo does a reset. + +B DSKSKP If no file open, asks for name and opens it. + Reads to the next line feed echoing + characters as it goes. Then asks "STOP?". + If you respond with "y", then skipping stops and + control reverts to who ever had it last. + If you respond with altmode then + skipping stops and control reverts to tty. + Anything else causes then next line to be + printed, skipped, and the prompt repeated. + + DEFPPN Accepts a p,pn to use when none is specified (input only). + + -DEFPPN Resets defppn to 0. this is the default. + the effect of 0 is that it is used for the p,pn + on input unless you are reading filenames from + and indirect file. in that case, the p,pn used are + those of the indirect file. + +B CLEAR This command is equivalent to "^C START" except + that it doesn't flush DSKIN. + + STATUS Prints out current program status, like SPACES, REFERENCES, + PAGE, EXTENT, and default wire ID. + + SPACES Makes spaces in signal names significant. + Affects the I and I commands only. + + -SPACES Spaces in signal names are no longer significant + except when they seperate 2 digits. + This is the default. + + REFERENCE This enables the feature in 'WL' files which + causes all signal names for a wire to appear + in each alphabetical sorting of each name, + but only one of them will have the pin + information printed. All the others will print + "_____ REFERENCE" next to the signal with which + the pins appear. + + -REFERENCE Disable references in 'WL' file. Signal names + appear only once, with the pins. + + IERROR Enable output of errors on wirelist file input + to go to a file. When you do I, I, I, and B + you are asked for a filename (default extension + is 'WIE'). This file contains the filename of the + file being processed and any errors which cannot + be indicated later. If you respond with to + the WIE filename prompt, output will go to TTY + as if no IERROR command had been done. + + -IERROR Disable input errors going to file, they will + go to the TTY instead. This is the default. + + + PART Write a "PARTITION" file, default extension is + 'PAR'. This is the file for input to Wagner's + partitioning program. + + SIGSUM Write signal summary listing for entire wire list. + Default extension is 'WSS'. These files may be + merged by the program "M.DMP[WL,RPH]" to form a + master signal summary ('MSS'). + + ERRSUM This writes a file (default extension is 'LES') + which has each run of some of the categories from + the wire list summary output. The dfference is + that this is a binary file which goes back into + D and allows you to flash the runs from each + error category. + + CONSUM Write connector pins needed summary. This lists + signals in same format as SIGSUM but only those + which need to get from one card to another, but + don't. Default extension is 'WCS'. + + WLSSEL LIKE L, EXCEPT THAT YOU ARE ASKED ABOUT EACH + CATEGORY BEFORE IT IS WRITTEN INTO THE FILE. + + BSSEL LIKE BSUM, EXCEPT ASKS ABOUT EACH CATEGORY. + + MAKALL ASKS FOR ONE NAME AND POSSIBLE A CARD NAME, THEN + DOES L, L, L (WRITES 3 FILES). + + BMAKALL LIKE MAKALL, BUT DOES BLIST, AND BSUM. + + UMAKE WRITES 'UML' FILE FOR INPUT TO "D" PROGRAM WHICH + REPLACES ALL EDGE PINS WITH GENERATED "U" PINS. + + STUFF WRITES 'STF' FILE WHICH TELLS FOR EACH DIP TYPE ON + A BOARD WHERE IT IS USED (WHAT LOCATION). + + LPART WRITES 'PRT' FILE WHICH TELLS FOR EACH DIP TYPE ON + A BOARD WHAT ITS PART NUMBER IS AND HOW MANY ARE USED. + + UML Prints a module map for the card you select. Also + prints edge signals in boxes for each paddle. + Default extension is 'UML' + + TEST Asks: + + CARD (LN)? if necessary + + This writes a card tester file for P. Petit's simulator. + The default extension is "TST". + + ROUTE Asks: + + CARD (LN) ? if necessary + + This routes all runs on the specified card and then + produces a listing (default extension 'WLR'). The + listing is like a 'WL' listing except that the pins + are ordered and a pseudo Z-level is indicated in an + extra column. + + ZLEVEL Asks: + + CARD (LN) ? if necessary + + This routes all runs on the specified card and then + produces a listing (default extension 'WLZ'). The + listing is 4 from-to listings. First is PWR and GND + Z-level 1 and Z-level 2. Then signals, Z-level 1 + and Z-level 2. + + BLIST Write back panel wirelist, default extension is 'BL'. + + BSUM Write back panel wirelist summary, similar to 'WLS' + for normal wirelist. Default extension is 'BS'. + + BPRINT Asks for a signal name, and prints the run on the tty. + DI (NODEC) OR ? (DEC) works here as in "P" commands. + + SIMPLE Writes back panel information necessary for running the + DEC wirelist package over the back panel. + + ASIMPLE WRITES SAME INFO AS SIMPLE COMMAND, BUT ASSIGNS + REAL PIN NAMES IN PLACE OF "U" PIN NAMES. + +DEC REDAC Writes a REDAC-compatible wirelist. First, + the REDAC master library is read (filename LIBRY.RDC) + automatically. If the library is not found, you are + asked for the correct filename. Respond with if none + exists. WL then asks: + + CARD (NLLN)? if necessary + + Then asks for a filename. The default extension is 'CON'. + If terminators are discovered in the wirelist, you will be + asked whether or not you want them in the REDAC output. + This writes a pc card interconnection list in the correct + format for input to REDAC. + + + STRAPS Reads a 'C2C' file which has 2 card locations on each line + seperated by a tab, specifying which cards have their back + strap connectors strapped together. A special format allows + each paddle to be mentioned explicitly so you can strap + different paddles in different directions. + An attempt is made to look at each wire which has a back + connector on it. If it has no name, lose. Otherwise find + the same named wire on the other card. If found then try + to match edge pins on this wire with edge pins on that + wire. A match occurs if they are the same pin, or if one + or both are "wild" specified pins. This allows errors to + be avoided when only one card is placed. + + CSTRAP Asks for "CARD nlln" if necessary (should be). Then writes + a file with the default extension 'DAT'. The file contains + the back connector locations which are gotten by taking + a wild back connector from this card and finding the + matching connector on the other card. This allows pre- + placement of pins which have been previously assigned + on one of a pair of cards. The file is suitable for reading + with the "IPINS" command in the drawing prog. + + EXTENT This is the number of paddles to assume make it to the back + panel for card with no location. It is initialized to 4. + + -EXTENT This resets the extent to 4 (the default). + + PAGE This allows you to set the number of lines per page to assume + when making listings, in case output will not go to LPT. + + -PAGE Resets page length to 52 (the default, to allow for spooler or + other headings). + + OLD Sets mode for reading "old" format DIPS.DIP files. + + -OLD Clears mode set by OLD. + + ECL Sets default for ECL dips during dip definition. + + -ECL Clears ECL default. + + TTL Sets default for TTL dips during dip definition. + + -TTL Clears TTL default. + +note: the following commands were gleaned from dick's favorite documentation, the + wl code listing. i will fill in detailed descriptions when i have time-tag, 2/75. + +COMMANDS FOR TOP MODE ONLY + FILES PRINT FILE LIST FOR CARD + BFILES PRINT FILE LIST FOR BACKPANEL + BSIMPLE WRITE 'SP' FILE INCLUDING ALL PWR AND NC PINS + MPART MAKE MASTER PARTS LIST (FROM BAC FILES) + OUTSUM WRITE OUTPUT PIN TERMINATION SUMMARY + TERMLIST WRITE TERMINATOR TEST POINT LIST + WIREGND ENABLE WIRING OF GROUND PINS ON DIPS + LNGRID SWITCH DEC CARD TO A LETTER NUMBER GRID + RAYTHEON RAYTHEON WIRE WRAP LIST "TO-TO" FORMAT + RAYFT RAYTHEON WIRE WRAP LIST "FROM-TO" FORMAT + +COMMANDS FOR BOTH MODES + BOARD SET BOARD TYPE + WIDTH SET CHARACTERS PER LINE (FOR LISTINGS) + + DIP SUB-MODE + + +E Exit to TOP MODE (commands on previous page). + +@ SAME AS "XDSKIN". + +I Input dip file into internal structure. If filename + is omitted, last one used for I or W command is used. + Name starts as "DIPS.DIP[]". Default extension + is always 'DIP'. + +W Write internal list into file. Filename same as for I. + +N Change (or just print if no filename arg) the default + dip filename. + +L Asks: + + FILENAME? + + Default extension is 'LSD'. This makes a listing of all + dip definitions. + +D Delete definition of . If is blank + you get DDT. + +P Print definition of on TTY. + +R Rename dip with name . Asks for new name. + +S Set package type for dip . + + +C Copy definition of . + Asks: + + NEW DIP NAME? + + If it already exists, you are asked: + + ALREADY EXISTS, REPLACE? + + Then you are asked: + + LOADING CONVERSION FACTOR? + + The format is or /. This + is the scale which is applied to all loadings of + the old dip definition to get the new one. + +M Modify definition of . + If no definition exists for this dip name, it TYPES: + + DIP DOESN'T EXIST, CREATE? + + Type "y". + It then asks: + + PACKAGE TYPE (# OF PINS)= + + Type a Package name (see APACK). You may abbreviate, but + WL won't check for ambiguous matches. + + If a definition already exists, types out the number + of pins. Then a heading line is typed and echoing is + turned off. It tabs to the PIN # column and waits for + a command. Now you may type: + + Types the information for pin . + Types the information for pin then tabs to + the "TYPE" column. You can now change any or all + of the data items for this pin. Type to + fill in the rest of the line with the old stuff. + Type to get to the next column. Bad format + is filtered out and only good data is echoed. To + leave a column unchanged, just to the next + column without typing anything. + Asks for a new DIPNAME. You can either + edit another dip or get back to DIP SUB-MODE by + typing . + A Types pin automatically when you type + for pin . You get out of automatic mode + by typing or reaching last pin. + T L U P S + Automatically copies all columns to the left + of the TYPE, LOAD, USE, PS, and SECTION columns + respectively when you type the + command above. + + In all the above ALTMODE is equivalent to . + Legal TYPES are: + I input OP pull up output + IS input with load sharing PWR,P,or V power + O output GND or G ground + OT tri-state output NC or N no connection + OC open collector output Z terminator + + You may prefix any of the above types with the letter "T" for + TTL or "E" for ECL. You may follow an "I" or "IS" with "P" if + this pin has an internal pullup or pulldown and thus doesn't + require drive. The wirelister will complain if an "I" or "IS" + pin isn't connected to an output. You may follow an output + (O, OC, OT, OP) with "F" if you wish to mark it as a + flip-flop output. If the X commands ECL or TTL have been + performed, the prefix "E" or "T" is assumed automatically. + With no prefix, the pin definition is neutral with respect to + TTL vs ECL. This information lives at TYPTAB in WLDIP.FAI + and in the table following TYPTAB, in case desperation with + the dip editor forces you to seek the ultimate documentation. + + The USE column is for comments such as "S1" or "S4" on an ALU + dip, except that if the USE string begins with "CLK" the wire + lister will take note of this fact, but it isn't clear what + it will do about it (TAG, 1/21/75). PS is an arbitrary + number which you assign to identify pins that share load. + Give the same number to all pins that share with each other. + SECTION is for defining the sections of the dip and for + specifying equivalent pins in other sections. The section + information is: /
{,}. + The equivalent pins in different sections are identified by + having equal logical pin numbers. The subsection number is + used with the section number to describe a dip with more than + one level of structure, i.e., a 10100 ECL dip with four + identical sections, and where one pin of each section is tied + to a common enable line. In this case, the four gates sharing + the common enable line are considered to be in section 0, + with a seperate subsection number for each gate. Section and + subsection numbers must be sequentially assigned and must be + distinct, i.e., a number used as a section designator must + not also be used to number a section. If you're confused, + look at the definitions of gates like DM8838, 10100, etc.; if + still confused ask Tom Gafford, and if he confuses you, call + RPH around 3 a.m. some time and harass him because it's all + his fault. + WL FILE FORMATS + +In this part: + +() means optional +<> syntactic entity +()* 0 or more of + single letter + 1 or more digits + Carriage return - linefeed + + +Argument to I or I TOP MODE commands: + + ( . ) ( [

,] ) ( ( )* ) +ITS,< "|"(*) > + +"DIR" files: + +( ( . ) ( [

,] ) ( ( )* ) )* + + + ::= ( ( ) ( ) ) ( "(" ( ) + ( ) ( , )* ")" )* + +"(" and ")" stand for a parenthesis pair. + +This is a list of files to read for "I" or "U" commands. + +The first part of the slicespec allows you to specify the + +for any unspecified dip locations. In addition the filespec for the indirect +file may include a construct which will be used on any filespec's +in the file which don't have their own. The rest is for the special construct in +signal names which we will call expressions. The sets the lower +bound of values to , the sets the upper bound. +The sets variable to . The format of a signal name +which uses an expression is as follows: + + + ::= ( ( )* ( [ ] ) )* ( )* + + ::= | | + + ::= ( , )* + + ::= ( "{" "}" )* ( ) + + ::= | + + ::= | + + ::= "(" ")" | - | + | A-Z | + + ::= + | - + + ::= / | * + + ::= 0-9 | 0-9 + +The "()" pair in the primary definition may be replaced by a "<>" pair, +but you must close with the same thing with which you opened. + +If = the expression is evaluated. Then the thing +in [] is replaced by the I'th string (where value of =I). If +I less than or equal to zero, or I greater than the number of strings, +the thing in brackets is replaced with null. + +If = the first expression is evaluated. If the value +is non-zero, the string contain in the following "{}" pair is the result +of the expr. Otherwise, the evaluation of the expression after +the "}" is done and so on until on becomes true or the "]" is reached. + +If = the thing in [] is replaced by the decimal value +of the expression with leading zeroes added to make the length of the +result equal to the length of the longest variable in the expression. + +The following is the format of a "STRAP" file, it tells which +paddles of which cards are strapped together: + +{}* + + + ::= + | + + ::= {} + + ::= + + ::= 0-15 + + ::= {} + + ::= A-Z + + ::= A-Z + + ::= 1-63 + + ::= A-Z + + +SEMANTICS: + + The construct is used if the back strap connectors +of both cards correspond on a one-to-one basis. The is +used when different height cards are being described or strapping is +going to either side of a single card on different paddles. + RUNNING MAGGOT + +MAGGOT READS MAGTAPE ON WHICHEVER MAG TAPE (0 OR 1) YOU'VE ASSIGNED, AND +SIMULATES THE GERBER PLOTTER PROGRAM PACKAGE AT TRW. (ASKS YOU WHICH ONE IF +YOU'VE BOTH MTA'S ASSIGNED) + +HAS OPTIONS FOR OUTPUTTING GRAPHICS TO CALCOMP OR XGP, CONVERTING TO TEXT AND +LISTING ON LPT, READING MAG TAPE CONTINUOUSLY UNTIL ALL PLOTS ARE EXHAUSTED, +AND FLUSHING PLOTTED TEXT TO KEEP FROM REQUIRING TOO LARGE AN XGP PLOT TO FIT +IN CORE AT STANFORD. TYPING "?" AT THE PROMPT "MODES?" GIVES BRIEF +EXPLANATION OF COMMAND CHOICES. + +THE FIRST TIME ANY SCALE IDENTIFIER IS ENCOUNTERED YOU WILL BE ASKED TO TYPE +ITS HEIGHT. + RUNNING PDRILL + +PDRILL READS PAPER TAPE AND PLOTS X'S ON CALCOMP OR XGP +FOR EACH DRILL HOLE, ALSO LISTS X,Y'S OF HOLES ON +LINE PRINTER + +ASKS IF YOU WANT A PLOT +ASKS IF IT IS TO BE ON XGP (OTHERWISE CALCOMP) +ASKS IF YOU WANT A LINE PRINTER LISTING +ASK YOU TO LOAD TAPE BEFORE STARTING + +RUNS X PROGRAM AUTOMATICLLY AT END OF TAPE IF XGP MODE WAS SELECTED + RUNNING FR80 + +ASKS IF YOU WANT A CALCOMP PLOT. +ASKS IF YOU WANT LPT OUTPUT. +ASKS FOR A FILENAME. (DEFAULT EXT IS "F80") +MAKES PLOT AND LISTING IF APPROPRIATE. + HOW TO RUN REF + +REF IS A PROGRAM TO GOBBLE DOWN 'WD' FILES +AND PRODUCE A LISTING, ORDERED BY SIGNAL NAME +SHOWING EACH FILE IT IS USED IN AND HOW MANY +TIMES IT IS USED. + +THE PROG STARTS BY ASKING: + +WD FILENAME? + +TO WHICH YOU MAY TYPE EITHER + +FILNAM.EXT[P,PN] DEFAULT EXT IS 'WD' + + OR + +@FILNAM.EXT[P,PN] DEFAULT EXT IS 'DIR' + +IF THE "@" CONSTRUCT IS USED, ANOTHER FILENAME IS SCANNED +FROM THE FILE, AND SO ON UNTIL END OF FILE (BLANK LINES ARE +IGNORED). + +FILENAMES ARE GOBBLED AND THE FILES READ UNTIL YOU TYPE +A BLANK FILENAME FROM THE TTY. + +IT THEN ASKS: + +REF FILENAME? + +YOU NOW MAY TYPE THE OUTPUT FILENAME (DEFAULT EXT IS 'REF'). +IF BLANK NAME IS TYPED, OUTPUT GOES TO THE TTY. + MISCELANEOUS +DRAWING PITFALLS: + +1. LINES WHICH APPEAR TO TOUCH MAY NOT INTERSECT IN THE DATA + STRUCTURE. TO INSURE CONTINUITY YOU MUST EITHER: + A. USE THE "-" METHOD TO HAVE A LINE YOU ARE DRAWING + INTERSECT A POINT YOU CAN SEE. + B. USE THE "A" OR "A" METHOD TO ATTACH TO A POINT OR + LINE RESP. + +(IN CASE OF DIFFICULTY, LEARN THE "B" AND "B" FUNCTIONS.) + +2. LABELS (LOGICAL NAMES) MAY APPEAR NEAR A WIRE AND NOT BE + ASSOCIATED WITH IT. TO FORCE ASSOCIATION, YOU MUST: + A. GET ON THE POINT AT THE END OF THE WIRE AND PLACE THE + TEXT THERE. MOVE THE WIRE IF THE TEXT GETS GARBAGED BY + SOME NEARBY OBJECT. + +3. USE "XDANGLE" TO FIND MOST ERRORS OF FORM 1 AND 2. + +(YOU MIGHT USE THE "A" FUNCTION TO ATTACH SOME TEXT TO THE NEAREST POINT) + +PC CARD LAYOUT RESTRICTIONS (BY MCGUIRE): + + THE FOLLOWING LAYOUT TECHINQUES ARE TO BE CONSIDERED +MANDITORY UNTIL PROVEN OTHERWISE: + + THE STANDARD STEP SIZE (50 MILS) WILL BE USED IN ALL PC CARDS +EXCEPT FOR SPECIAL PURPOSE ONES. THIS ALLOWS EXACTLY ONE WIRE TO PASS +DIRECTLY BETWEEN TWO PADS. + + WIRES BETWEEN PADS SHOULD BE WITHIN 15 DEGREES OF STRAIGHT +THROUGH TO ALLOW 18 MILS OF CLEARANCE BETWEEN WIRE AND PAD, 30 +DEGREES GIVES 15 MILS OF CLEARANCE, STRAIGHT THROUGH GIVES 20 MILS OF +CLEARANCE. + + WIRES BETWEEN PADS ARE ALLOWED ONLY ON THE TOP (DIP INSERTION) +SIDE OF PC CARDS OWING TO TROUBLE WITH SOLDER BRIDGING ON THE BOTTOM. + + SPACING BETWEEN WIRES MAY BE THE MINIMUM, THAT IS 50 MILS. +CONSIDER PADS AND FEED THROUGH TO BE 52 MILS IN DIAMETER AND WIRES TO +BE 10 MILS WIDE (AFTER ETCHING). + + IF A FEED THROUGH IS TO BE PLACED BETWEEN TWO WIRES THE WIRES +MUST BE AT LEAST 100 MILS APART IN ORDER THAT THE 20 MILS CLEARANCE +BE MAINTAINED AROUND THE FEED THROUGH. + +PLANE DESIGNATIONS: + +IN ORDER TO AVOID CONFUSION THE FOLLOWING PLANE DESIGNATIONS +WILL BE USED IN ALL PC CARDS: + + PLANE USE + + 0 GROUND PLANE. + 1 FIRST POWER PLANE(USE THIS IF ONLY ONE) + 2 SECOND POWER PLANE(USE THIS AND 1 IF TWO POWER PLANES) + 3 THIRD POWER PLANE. + +IF SOMEBODY NEEDS MORE THAN 4 PLANES, HE IS CRAZY AND SHOULD SEE +RPH FOR TREATEMENT. + +EXTERIOR PLANES!!!!!!!! + + THE SIDE OF THE BOARD INTO WHICH DIPS ARE INSERTED WILL BE +REFERED TO AS THE TOP. THE OTHER SIDE WILL BE REFERED TO AS THE OTHER +SIDE. diff --git a/doc/draw/wl.doc b/doc/draw/wl.doc new file mode 100644 index 00000000..597ee1cb --- /dev/null +++ b/doc/draw/wl.doc @@ -0,0 +1,839 @@ +RUNNING WL + + How to run the wire lister + + or + + Easy little steps for muddy little feet + + Commands are single letters with or without control or meta. The command +may be preceeded by any of the following: + + DEC NODEC + (NOTHING) (nothing) +$ ONE ALT control +$$ TWO ALTS Meta +$$$ THREE ALTS control-meta +## doesn't matter + +If more than one of the above appear, then all will satisfy command. +In all but the "I" command, if only one wire list exists, the "WIRE +LIST ID?" prompt will be skipped. + +Commands: + +##E EXIT. + + +##@ SAME AS "XDSKIN". + + +$$$D Enter DIP SUB-MODE. See next page for commands in DIP SUB-MODE. + + +_ + Set default wire list id. This is the wire list which is used + for all commands requiring single wire lists. WHEN THE PROGRAM + STARTS UP, A SINGLE WIRELIST ID IS GENERATED. THE NAME IS "NIL". + IF WIRELIST ID DOES NOT EXIST, IT IS CREATED AND MADE THE + CURRENT ONE. EACH ID MAY HAVE A BACKPANEL WIRELIST, A DRAWING + WIRELIST, AND A PC WIRELIST ASSOCIATED WITH IT. + + +$_ MOVE FORWARD IN THE RING OF WIRELIST ID'S. + + +$$_ MOVE BACKWARD IN THE RING OF WIRELIST ID'S. + + +$$$_ LIST ALL WIRELIST ID'S IN RING STARTING WITH THE CURRENT ONE. + + +$I OR $$I + ASKS: + FILENAME? + + You may type a filename (default extension is $='WD' and $$='WPC') + or @filename (default extension is "DIR"). The format of + a "DIR" file will be explained later. + If you type "$" you get wire list with id "D". If you type "$$" + you get the wire list with id "PC". + + The file(s) are read, signal names are compared and the + wire list is built. + + After the file name you may type a module location which takes + effect for any dips or pins which do not already specify a + module location. You may also type variable settings enclosed + in parentheses, separated by commas. See the end of this writeup + for exact information. Example: + $IFOO 1AE3 (N0,M0) 1AE4 (N6,M1) +ITS $IFOO|1AE3 (N0,M0) 1AE4 (N6,M1) + This reads file FOO.WD twice, once (called slice 1) for + module location 1AE3 with N=0 and M=0, and once for location + 1AE4 with N=6 and M=1. + The file(s) are read, signal names are compared and the + wire list is built. + +$$$I Asks: + + FILENAME? + + Same options as reading 'WD' or 'WPC' files, default extension is 'WEQ'. + This file contains some number of signal names on each line, seperated + by tabs. The effect of this file is that each line is treated as a wire. + So you may cause certain wires to be grounded or connected to HI, or even + connected to other wires. Please note: The card location of the wire list + you wish to affect should appear with the filename, just like reading a + wire list. + + +$$$U Asks: + + CARD(NLLN)? if necessary + + This copies the dips from the default wire list (a logic + wire list), to the other wire list (a pc wire list). The + locations are used for matching. + + +$N OR $$N + Asks: + + WIRE LIST TITLE? + + The string you type will be used on listings involving + this wire list. + +$L Asks: + + CARD (NLLN)? if necessary + + This lists a wire list onto a file. The default + extension is 'WL'. + All sorts of neat things are indicated on + the wire list, the best way to find out what + they are is to make one. + Any unnamed signals are given unique numbers + which are printed preceeded by a "#". + +$$L Asks: + + CARD (LN)? if necessary + + This makes the following summaries: + + Summarizes all dip types used in this wire list + totaling the different body names and total number + of sections used. + + UNGENERATED SIGNALS + + UNUSED SIGNALS + + Each of these catagories is listed, only one + of the names of a wire fitting the catagory + is listed. The default extension is 'WLS'. + + +$$$L Asks: + + CARD (NLLN)? if necessary + + Then asks for a filename. The default extension is 'WLU'. + Writes a listing file which is sorted by dip number. Under each + dip number is listed the signals connected to each pin. + At the end of the listing, the edge connector fingers are listed + in alphabtical order along with the signal connected to each. + + This prints out the following info: + + LOC DIPTYPE BODY POS FILE + + For each body followed by: + + PIN # TYPE HI LOW USE SIGNAL NAME + + For each pin of body. + + Then: + + CONNECTORS + PIN FILE SIGNAL NAME + + For all connector pins. + + This allows you to find out a signal name from the LOC(PIN #). + + +P + or +$P which asks for signal name + + Then prints for that the signal name, the information which + would be printed for that signal in $L. Prints on TTY. + + +$$P Asks: + + CARD (LN)? if necessary + + Then asks: + + DIP OR CONNECTOR LOCATION? + + Then prints info for that loc which you would have gotten in + a $$$L listing. Prints on TTY. + + +$$$P Asks: + + SIGNAL NAME? + + Then does $P for this signal for each card currently read in. + + + In addition, if (NODEC) OR ? (DEC) appears in front of the signal name both the + hi and low versions of the signal will be printed. This works + for P, $P, and $$$P. + + +$W Asks: + + CARD (LN)? if necessary + + This writes a file for input to the PC prog for generating + router files which are read by wagner's router prog. + The default extension is "WDR". + + +$$W This writes a back panel wirelist file from all the cards in + the default wirelist. The default extension is 'BAC'. + + +$B Reads a back panel wire list written with $$W (default extension + is 'BAC'). You may now make back panel listings using ##X commands. + + +$$B READS A 'BAC' FILE, BUT ONLY INPUTS FILENAME AND TITLE INFO, + AND DIP COUNTS FOR MAKING AN 'MPL' FILE. + + +$$$B Reads a file of the same format as a 'WEQ' file, however default + extension is 'BEQ'. It has the same effect on the back panel as + a 'WEQ' file has on a card wire list. Except there is no problem + with the card location, it applies to the whole back panel. + + +$C Asks: + + CARD (LN)? if necessary + + Then asks for a filename. The default extension is 'WLC'. + The card specified is found in D AND PC PARTS OF THE CURRENT + WIRELIST. The two wire lists are compared and an error listing + is produced. Make one to find out the format. The info from $$C + is included in $C. + + +$$C Asks: + + CARD (LN)? if necessary + + This compares D and PC wire list as in $C, but it only checks + if you have placed the right dip sockets on the pc card for + the dips you are using in the logic drawing. Also checks that + you have not pre-assigned an illegal connector pin #. This + be done only after a $$L verify has been done with no errors + because the kinds of errors found by this check will confuse + $$C. + + +$$$C ASKS: + + OLD WIRELIST ID? + + THEN + + NEW WIRELIST ID? + + YOU SHOULD HAVE READ IN OLD AND NEW VERSIONS OF WD FILES + FOR A BOARD INTO 2 DIFFERENT WIRELIST ID'S. THIS COMMAND + COMPARES THE 2 VERSIONS OF THE BOARD AND INDICATES CHANGES + WHICH CHANGE OLD TO NEW. DEFAULT EXTENSION IS 'WDC'. + + EXTEND MODE COMMANDS +##X If any control bits held down asks: + + Si? + + Now type a 1 to 6 (or more) letter command possibly preceded by + a "-". The meanings of these commands are explained below: + A "D" at the left means available in dip sub-mode only, a "B" + means available in both top-mode and dip sub-mode, nothing means + available only in top mode. + +B RESIDENT Reads in the dip defintion file at the bottom of free + core, and marks the last loc used. + now whenever you type ^c start, the dips + stay in the core image. All other data in program + free storage is cleared. + +B -RESIDENT Release dips from bottom of core. Now when + you type ^c start the dips go away. + +B DDT Enters DDT if loaded. + +B SAVE Asks for a filename, (default extension is 'DMP') + then executes a swap uuo to save the current core + image. If DSKIN is in progress, it is suspended + during the save and restarted (using DSKCON) after- + wards. However, when the saved core image is run + again, the DSKIN is not continued. It may be + continued manually by a DSKCON command. +DEC AT DEC NO SWAP UUO IS USED, THE PROGRAM MERELY + EXITS TO THE MONITOR AND YOU MAY SAVE IT, THEN + START OR RUN IT LATER. + +B DSKIN Asks for a filename, (default extension is 'TXT') + then takes input from there instead of tty. If an + error is encountered, input reverts to the tty. + +B DSKHLD Releases disk input file, remembering where it was. + later you can give a DSKCON command to continue. + +B DSKCON If the last dskin was held by a DSKHLD command or + an error, the command causes the file to be reopened + and the appropriate chars skipped to get it back where + it was. DSKHLD and DSKCON are used by SAVE to get + around the fact that the swap uuo does a reset. + +B DSKSKP If no file open, asks for name and opens it. + Reads to the next line feed echoing + characters as it goes. Then asks "STOP?". + If you respond with "y", then skipping stops and + control reverts to who ever had it last. + If you respond with altmode then + skipping stops and control reverts to tty. + Anything else causes then next line to be + printed, skipped, and the prompt repeated. + + DEFPPN Accepts a p,pn to use when none is specified (input only). + + -DEFPPN Resets defppn to 0. this is the default. + the effect of 0 is that it is used for the p,pn + on input unless you are reading filenames from + and indirect file. in that case, the p,pn used are + those of the indirect file. + +B CLEAR This command is equivalent to "^C START" except + that it doesn't flush DSKIN. + + STATUS Prints out current program status, like SPACES, REFERENCES, + PAGE, EXTENT, and default wire ID. + + SPACES Makes spaces in signal names significant. + Affects the $I and $$I commands only. + + -SPACES Spaces in signal names are no longer significant + except when they seperate 2 digits. + This is the default. + + REFERENCE This enables the feature in 'WL' files which + causes all signal names for a wire to appear + in each alphabetical sorting of each name, + but only one of them will have the pin + information printed. All the others will print + "_____ REFERENCE" next to the signal with which + the pins appear. + + -REFERENCE Disable references in 'WL' file. Signal names + appear only once, with the pins. + + IERROR Enable output of errors on wirelist file input + to go to a file. When you do $I, $$I, $$$I, and $$$B + you are asked for a filename (default extension + is 'WIE'). This file contains the filename of the + file being processed and any errors which cannot + be indicated later. If you respond with to + the WIE filename prompt, output will go to TTY + as if no IERROR command had been done. + + -IERROR Disable input errors going to file, they will + go to the TTY instead. This is the default. + + + PART Write a "PARTITION" file, default extension is + 'PAR'. This is the file for input to Wagner's + partitioning program. + + SIGSUM Write signal summary listing for entire wire list. + Default extension is 'WSS'. These files may be + merged by the program "M.DMP[WL,RPH]" to form a + master signal summary ('MSS'). + + ERRSUM This writes a file (default extension is 'LES') + which has each run of some of the categories from + the wire list summary output. The difference is + that this is a binary file which goes back into + D and allows you to flash the runs from each + error category. + + CONSUM Write connector pins needed summary. This lists + signals in same format as SIGSUM but only those + which need to get from one card to another, but + don't. Default extension is 'WCS'. + + WLSSEL LIKE $$L, EXCEPT THAT YOU ARE ASKED ABOUT EACH + CATEGORY BEFORE IT IS WRITTEN INTO THE FILE. + + BSSEL LIKE BSUM, EXCEPT ASKS ABOUT EACH CATEGORY. + + MAKALL ASKS FOR ONE NAME AND POSSIBLE A CARD NAME, THEN + DOES $L, $$L, $$$L (WRITES 3 FILES). + + BMAKALL LIKE MAKALL, BUT DOES BLIST, AND BSUM. + + UMAKE WRITES 'UML' FILE FOR INPUT TO "D" PROGRAM WHICH + REPLACES ALL EDGE PINS WITH GENERATED "U" PINS. + + STUFF WRITES 'STF' FILE WHICH TELLS FOR EACH DIP TYPE ON + A BOARD WHERE IT IS USED (WHAT LOCATION). + + LPART WRITES 'PRT' FILE WHICH TELLS FOR EACH DIP TYPE ON + A BOARD WHAT ITS PART NUMBER IS AND HOW MANY ARE USED. + + UML Prints a module map for the card you select. Also + prints edge signals in boxes for each paddle. + Default extension is 'UML' + + TEST Asks: + + CARD (LN)? if necessary + + This writes a card tester file for P. Petit's simulator. + The default extension is "TST". + + ROUTE Asks: + + CARD (LN) ? if necessary + + This routes all runs on the specified card and then + produces a listing (default extension 'WLR'). The + listing is like a 'WL' listing except that the pins + are ordered and a pseudo Z-level is indicated in an + extra column. + + ZLEVEL Asks: + + CARD (LN) ? if necessary + + This routes all runs on the specified card and then + produces a listing (default extension 'WLZ'). The + listing is 4 from-to listings. First is PWR and GND + Z-level 1 and Z-level 2. Then signals, Z-level 1 + and Z-level 2. + + BLIST Write back panel wirelist, default extension is 'BL'. + + BSUM Write back panel wirelist summary, similar to 'WLS' + for normal wirelist. Default extension is 'BS'. + + BPRINT Asks for a signal name, and prints the run on the tty. + DI (NODEC) OR ? (DEC) works here as in "P" commands. + + SIMPLE Writes back panel information necessary for running the + DEC wirelist package over the back panel. + + ASIMPLE WRITES SAME INFO AS SIMPLE COMMAND, BUT ASSIGNS + REAL PIN NAMES IN PLACE OF "U" PIN NAMES. + + REDAC Writes a REDAC-compatible wirelist. First, + the REDAC master library is read (filename LIBRY.RDC) + automatically. If the library is not found, you are + asked for the correct filename. Respond with if none + exists. WL then asks: + + CARD (NLLN)? if necessary + + Then asks for a filename. The default extension is 'CON'. + If terminators are discovered in the wirelist, you will be + asked whether or not you want them in the REDAC output. + This writes a pc card interconnection list in the correct + format for input to REDAC. + + + STRAPS Reads a 'C2C' file which has 2 card locations on each line + seperated by a tab, specifying which cards have their back + strap connectors strapped together. A special format allows + each paddle to be mentioned explicitly so you can strap + different paddles in different directions. + An attempt is made to look at each wire which has a back + connector on it. If it has no name, lose. Otherwise find + the same named wire on the other card. If found then try + to match edge pins on this wire with edge pins on that + wire. A match occurs if they are the same pin, or if one + or both are "wild" specified pins. This allows errors to + be avoided when only one card is placed. + + CSTRAP Asks for "CARD nlln" if necessary (should be). Then writes + a file with the default extension 'DAT'. The file contains + the back connector locations which are gotten by taking + a wild back connector from this card and finding the + matching connector on the other card. This allows pre- + placement of pins which have been previously assigned + on one of a pair of cards. The file is suitable for reading + with the "IPINS" command in the drawing prog. + + EXTENT This is the number of paddles to assume make it to the back + panel for card with no location. It is initialized to 4. + + -EXTENT This resets the extent to 4 (the default). + + PAGE This allows you to set the number of lines per page to assume + when making listings, in case output will not go to LPT. + + -PAGE Resets page length to 52 (the default, to allow for spooler or + other headings). + + OLD Sets mode for reading "old" format DIPS.DIP files. + + -OLD Clears mode set by OLD. + + ECL Sets default for ECL dips during dip definition. + + -ECL Clears ECL default. + + TTL Sets default for TTL dips during dip definition. + + -TTL Clears TTL default. + + DIP SUB-MODE + + +##E Exit to TOP MODE (commands on previous page). + +##@ SAME AS "XDSKIN". + +##I Input dip file into internal structure. If filename + is omitted, last one used for I or W command is used. + Name starts as "DIPS.DIP[]". Default extension + is always 'DIP'. + +##W Write internal list into file. Filename same as for I. + +##N Change (or just print if no filename arg) the default + dip filename. + +##L Asks: + + FILENAME? + + Default extension is 'LSD'. This makes a listing of all + dip definitions. + +##LPARTS ASKS: + + FILENAME? + + DEFAULT EXTENSION IS 'PTL'. THIS MAKES A LISTING OF ALL + PART NUMBERS GIVING DIPTYPE AND PROPERTIES SUITABLE FOR + SORTING. + +##D Delete definition of . If is blank + you get DDT. + +##P Print definition of on TTY. + +##R Rename dip with name . Asks for new name. + +##S SET PART NUMBER STRING FOR DIP . + + +##C Copy definition of . + Asks: + + NEW DIP NAME? + + If it already exists, you are asked: + + ALREADY EXISTS, REPLACE? + + Then you are asked: + + LOADING CONVERSION FACTOR? + + The format is or /. This + is the scale which is applied to all loadings of + the old dip definition to get the new one. + +##M Modify definition of . + If no definition exists for this dip name, it TYPES: + + NEW NAME # OF PINS? + + Answer with . + If a definition already exists, types out the number + of pins. Then a heading line is typed and echoing is + turned off. It tabs to the PIN # column and waits for + a command. Now you may type: + + Types the information for pin . + Types the information for pin then tabs to + the "TYPE" column. You can now change any or all + of the data items for this pin. Type to + fill in the rest of the line with the old stuff. + Type to get to the next column. Bad format + is filtered out and only good data is echoed. To + leave a column unchanged, just to the next + column without typing anything. + Asks for a new DIPNAME. You can either + edit another dip or get back to DIP SUB-MODE by + typing . + A Types pin automatically when you type + for pin . You get out of automatic mode + by typing or reaching last pin. + T L U P S + Automatically copies all columns to the left + of the TYPE, LOAD, USE, PS, and SECTION columns + respectively when you type the + command above. + + In all the above ALTMODE is equivalent to . + Legal TYPES are: + I input OP pull up output + IS input with load sharing PWR or P OR V power + O output GND or G ground + OT tri-state output NC or N no connection + OC open collector output Z TERMINATOR + You may prefix any of the above types with the letter + "T" for TTL or "E" for ECL. YOU MAY FOLLOW AN I OR IS WITH + "P" IF THIS PIN HAS AN INTERNAL PULLUP OR PULLDOWN. + YOU MAY FOLLOW AN OUTPUT (O, OC, OT, OP) BY "F" IF + IT IS A FLIP-FLOP OUTPUT. If the X commands ECL or TTL + have been performed, the prefix "E" or "T" is assumed + automatically. With no prefix, the pin definition is + neutral with respect to TTL vs ECL. + + The USE column is for comments such as "S1" or "S4" on + an ALU dip. PS is an arbitrary number which you assign + to identify pins that share load. Give the same number + to all pins that share with eachother. SECTION is for + defining the sections of the dip and for specifying + equivalent pins in other sections. The section information + is: /

. The equivalent pins + in different sections are identified by having equal + logical pin numbers. + WL FILE FORMATS + +In this part: + +() means optional +<> syntactic entity +()* 0 or more of + single letter + 1 or more digits + Carriage return - linefeed + + +Argument to $I or $$I TOP MODE commands: + + ( . ) ( [

,] ) ( ( )* ) + +"DIR" files: + +( ( . ) ( [

,] ) ( ( )* ) )* + + + ::= ( ( ) ( ) ) ( "(" ( ) + ( ) ( , )* ")" )* + +"(" and ")" stand for a parenthesis pair. + +This is a list of files to read for "I" or "U" commands. + +The first part of the slicespec allows you to specify the + +for any unspecified dip locations. In addition the filespec for the indirect +file may include a construct which will be used on any filespec's +in the file which don't have their own. The rest is for the special construct in +signal names which we will call expressions. The sets the lower +bound of values to , the sets the upper bound. +The sets variable to . The format of a signal name +which uses an expression is as follows: + + + ::= ( ( )* ( [ ] ) )* ( )* + + ::= | | + + ::= ( , )* + + ::= ( "{" "~" )* ( ) + + ::= | + + ::= "(" ")" | | A-Z | + + ::= "&" \ "!" \ "*" \ "/" \ "'" \ "+" \ "-" \ "=" \ + \ "<" \ ">" \ + \ \ + \ + + ::= \ "" \ "-" \ "+" + + ::= 0-9 | 0-9 + +If = the expression is evaluated. Then the thing +in [] is replaced by the I'th string (where value of =I). If +I less than or equal to zero, or I greater than the number of strings, +the thing in brackets is replaced with null. + +If = the first expression is evaluated. If the value +is non-zero, the string contain in the following "{~" pair is the result +of the expr. Otherwise, the evaluation of the expression after +the "~" is done and so on until on becomes true or the "]" is reached. + +If = the thing in [] is replaced by the decimal value +of the expression with leading zeroes added to make the length of the +result equal to the length of the longest variable in the expression. + +CURRENT PRECEDENCE ORDER FOR IN EXPRESSIONS +(HIGHEST TO LOWEST BINDING POWER) + " +  + &! + */' + +- + =<> +  + + IS A UNARY OPERATOR. + +DOUBLE QUOTE OPERATOR RETURNS THE NUMERIC CHARACTER CODE +OF THE LETTER FOLLOWING IT. + RUNNING MAGGOT + +MAGGOT READS MAGTAPE ON MTA0 AND SIMULATES GERBER +PLOTTER PACKAGE ON CALCOMP. ALSO MAKES LINE PRINTER LISTING. + +ASKS IF YOU WANT A CALCOMP PLOT +ASKS IF YOU WANT A LINE PRINTER LISTING + +THE FIRST TIME ANY SCALE IDENTIFIER IS ENCOUNTERED YOU +WILL BE ASKED TO TYPE ITS HEIGHT. + RUNNING PDRILL + +PDRILL READS PAPER TAPE AND PLOTS X'S ON CALCOMP +FOR EACH DRILL HOLE, ALSO LISTS X,Y'S OF HOLES ON +LINE PRINTER + +ASKS IF YOU WANT A CALCOMP PLOT +ASKS IF YOU WANT A LINE PRINTER LISTING +ASK YOU TO LOAD TAPE BEFORE STARTING + RUNNING FR80 + +ASKS IF YOU WANT A CALCOMP PLOT. +ASKS IF YOU WANT LPT OUTPUT. +ASKS FOR A FILENAME. (DEFAULT EXT IS "F80") +MAKES PLOT AND LISTING IF APPROPRIATE. + HOW TO RUN REF + +REF IS A PROGRAM TO GOBBLE DOWN 'WD' FILES +AND PRODUCE A LISTING, ORDERED BY SIGNAL NAME +SHOWING EACH FILE IT IS USED IN AND HOW MANY +TIMES IT IS USED. + +THE PROG STARTS BY ASKING: + +WD FILENAME? + +TO WHICH YOU MAY TYPE EITHER + +FILNAM.EXT[P,PN] DEFAULT EXT IS 'WD' + + OR + +@FILNAM.EXT[P,PN] DEFAULT EXT IS 'DIR' + +IF THE "@" CONSTRUCT IS USED, ANOTHER FILENAME IS SCANNED +FROM THE FILE, AND SO ON UNTIL END OF FILE (BLANK LINES ARE +IGNORED). + +FILENAMES ARE GOBBLED AND THE FILES READ UNTIL YOU TYPE +A BLANK FILENAME FROM THE TTY. + +IT THEN ASKS: + +REF FILENAME? + +YOU NOW MAY TYPE THE OUTPUT FILENAME (DEFAULT EXT IS 'REF'). +IF BLANK NAME IS TYPED, OUTPUT GOES TO THE TTY. + MISCELANEOUS +DRAWING PITFALLS: + +1. LINES WHICH APPEAR TO TOUCH MAY NOT INTERSECT IN THE DATA + STRUCTURE. TO INSURE CONTINUITY YOU MUST EITHER: + A. USE THE "-" METHOD TO HAVE A LINE YOU ARE DRAWING + INTERSECT A POINT YOU CAN SEE. + B. USE THE "$A" OR "$$A" METHOD TO ATTACH TO A POINT OR + LINE RESP. + +(IN CASE OF DIFFICULTY, LEARN THE "$B" AND "$$B" FUNCTIONS.) + +2. LABELS (LOGICAL NAMES) MAY APPEAR NEAR A WIRE AND NOT BE + ASSOCIATED WITH IT. TO FORCE ASSOCIATION, YOU MUST: + A. GET ON THE POINT AT THE END OF THE WIRE AND PLACE THE + TEXT THERE. MOVE THE WIRE IF THE TEXT GETS GARBAGED BY + SOME NEARBY OBJECT. + +3. USE "XDANGLE" TO FIND MOST ERRORS OF FORM 1 AND 2. + +(YOU MIGHT USE THE "$A" FUNCTION TO ATTACH SOME TEXT TO THE NEAREST POINT) + +PC CARD LAYOUT RESTRICTIONS (BY MCGUIRE): + + THE FOLLOWING LAYOUT TECHINQUES ARE TO BE CONSIDERED +MANDITORY UNTIL PROVEN OTHERWISE: + + THE STANDARD STEP SIZE (50 MILS) WILL BE USED IN ALL PC CARDS +EXCEPT FOR SPECIAL PURPOSE ONES. THIS ALLOWS EXACTLY ONE WIRE TO PASS +DIRECTLY BETWEEN TWO PADS. + + WIRES BETWEEN PADS SHOULD BE WITHIN 15 DEGREES OF STRAIGHT +THROUGH TO ALLOW 18 MILS OF CLEARANCE BETWEEN WIRE AND PAD, 30 +DEGREES GIVES 15 MILS OF CLEARANCE, STRAIGHT THROUGH GIVES 20 MILS OF +CLEARANCE. + + WIRES BETWEEN PADS ARE ALLOWED ONLY ON THE TOP (DIP INSERTION) +SIDE OF PC CARDS OWING TO TROUBLE WITH SOLDER BRIDGING ON THE BOTTOM. + + SPACING BETWEEN WIRES MAY BE THE MINIMUM, THAT IS 50 MILS. +CONSIDER PADS AND FEED THROUGH TO BE 52 MILS IN DIAMETER AND WIRES TO +BE 10 MILS WIDE (AFTER ETCHING). + + IF A FEED THROUGH IS TO BE PLACED BETWEEN TWO WIRES THE WIRES +MUST BE AT LEAST 100 MILS APART IN ORDER THAT THE 20 MILS CLEARANCE +BE MAINTAINED AROUND THE FEED THROUGH. + +PLANE DESIGNATIONS: + +IN ORDER TO AVOID CONFUSION THE FOLLOWING PLANE DESIGNATIONS +WILL BE USED IN ALL PC CARDS: + + PLANE USE + + 0 GROUND PLANE. + 1 FIRST POWER PLANE(USE THIS IF ONLY ONE) + 2 SECOND POWER PLANE(USE THIS AND 1 IF TWO POWER PLANES) + 3 THIRD POWER PLANE. + +IF SOMEBODY NEEDS MORE THAN 4 PLANES, HE IS CRAZY AND SHOULD SEE +RPH FOR TREATEMENT. + +EXTERIOR PLANES!!!!!!!! + + THE SIDE OF THE BOARD INTO WHICH DIPS ARE INSERTED WILL BE +REFERED TO AS THE TOP. THE OTHER SIDE WILL BE REFERED TO AS THE OTHER +SIDE. + diff --git a/doc/pc/little.steps b/doc/pc/little.steps new file mode 100644 index 00000000..14b1ab8a --- /dev/null +++ b/doc/pc/little.steps @@ -0,0 +1,40 @@ +Producing PC's thru Lincoln Gerber + +1) Write PCP file + (also do INNER and PPLOT if a multi layer) + +2) :DRAW2;PCPLT + Modes(?) - type T[LL] for Lincoln Lab mag tape, or + X[LL] for PLX file for :XGP ;PLOT + This will produce a MAG file and LOG file for every + input file. The device is necessary to make aperture + equivalences the same for MAG or XGP + +3) Write MAG file on 9 track tape, 512 character (128 word) blocking. + On DM, type ":DRAW2;RAYTH" + "OutAscii/Rec[512]" + + +4) Read MAG file back to disk for comparison. + "InAscii" + TAP + Run MAGGOT over file. (?) + +5) :DRAW2;PCPLT + Modes(?) - type Y[LL] to produce drill tape file (DRL) + +6) :DRAW2;TD + Rotation ? Flip ? Offset ? Output to DSK + This produces a .PTP from the .DRL file + +7) On ML, do :Q AI:DRAW2;PUNCH (can't run punch directly from TD) + Setup paper tape punch, type file name in response to prompt, e.g. + Type input file in Lisp format: (FOO PTP AI DRAW2) + +8) When done, quit out of it, and type (YANK). Put tape in reader + and type output file [e.g. ...format: (FOO PTR AI DRAW2) ] + +9) When finished, go back to AI and do :DRAW2;PDRILL and + read in DRAW2;FOO PTR. Perhaps do PLOT (.PLX), probably do LISTING (.LST) + Null file name defaults to input first name. + The .LST can be SRCCOM'ed with a .LST generated from the FOO PTP. diff --git a/doc/pc/pc.info b/doc/pc/pc.info new file mode 100644 index 00000000..0fff5dc7 --- /dev/null +++ b/doc/pc/pc.info @@ -0,0 +1,29 @@ + Creating a new PC + ----------------- + + +To assemble new PCBOARDS if needed: + WL + :FAIL PCBOARDS_BOARDS + ;In answer to query for assembly switches: + PC + ;^C + +Assemble new REL: + DRAW + :FAIL PC_D + ;In answer to query for assembly switches: + PC + ;^C + + +Load binary: + DRAW^S + :STINK PC ;Uses PC LOADER + 1L DECSYS;DECBOT BIN ;Merge in DECUUO boot: + .JBSA/ STRT + 56/ 107 ;SAIL + META + SYMS + ... + + :DELETE DATDRW;PC OBIN + :RENAME DATDRW;PC BIN, PC OBIN + :PDUMP DATDRW;PC BIN ; This is the file linked to by SYS1;TS PC diff --git a/doc/programs.md b/doc/programs.md index a47da340..7877d28f 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -33,6 +33,7 @@ - CROSS, cross assembler for micros. - CTIMES, Chaosnet time server. - CTIMSR, Chaosnet time server. +- D, SUDS drawing program - DATE, print date and time. - DATSRV, server for RFC 867 Daytime protocol. - DCROCK, digital watch. @@ -82,6 +83,7 @@ - JEDGAR, counter spying tool. - JOBS, list jobs by category. - JOTTO, word-guessing game. +- LAY, SUDS layout program. - LIMERI, print limerics. - LIMSER, Chaosnet limeric service. - LISP, lisp interpreter and runtime library (autoloads only). @@ -109,6 +111,7 @@ - NAME, Shows logged in users and locations, aka FINGER. - NETIME, network time dragon. - NICNAM/NICWHO, look up someone in the ARPAnet directory. +- NODIPS, SUDS wirelister (without DIP definitions). - NUDIR, create user directory. - NWATCH, small watch display. - OBS, observe system activities. @@ -117,6 +120,7 @@ - OS, realtime TTY spy. - PALX, PDP-11 cross assembler. - PANDA, user account management program. +- PC, SUDS printed circuit board program. - PDSET, set time and date. - PEEK, system monitoring. - PFTHMG, Puff the magic dragon. @@ -190,5 +194,6 @@ - WHO%, list index/uname/jname/%time in sorted list. - WHOLIN, mode line for display terminals (with date/time/job/etc info). - WHOSEN, print author of last send. +- WL, SUDS wirelister. - WUMPUS, Hunt the Wumpus game. - X, Y, Z, remember DDT command and re-execute it. diff --git a/doc/wl/storag.doc b/doc/wl/storag.doc new file mode 100644 index 00000000..35a8d91c --- /dev/null +++ b/doc/wl/storag.doc @@ -0,0 +1,460 @@ +SUBTTL NOTES + +COMMENT  +NOTES: +-------------------------------------------------------------------------------- +WIRE FORMAT: + + (ALPH) (ALPH) +WIRES ---

------------- --------- ... other signals ... + SIG1 - \ -SIG1 + | \ + | (NNAM) | +  | + | + NAM2ND | + (WPIN) ------ + | + | (NNAM) +  + +Note: Only the "header" signal has the wire. The equivalents are alpha sorted + after the header, as is the NAM2ND list. + +--------------------------------------------------------------------------- + +Body list: + Bodies are in list (WBDY) sorted by BLOC, BID, and containing file. + Bodies with the same slot locn, but different BIDs are stored + separately. + + After all the normal bodies, there are "connector bodies" which + bundle all the pins for one paddle together. + +Locations: + The board slot is given by FCRD in the wirelist header. + For normal bodies the slot specification is stored in BLOC. + The pin location is found in PINN. + + For connector bodies the BLOC gives the paddle (or jack locn) and + the pin# is the pin locn within the jack. + However there is also an 18 bit format that combines the loc and pin#. + There exist routines, CPNMRG and CPNSEP to convert both ways. + The main reason this is different from DIPs is: + o In the drawing program, only 18 bits are allocated for + CPIN location on the board. Therefore the "dip location" + and pin name must fit in one halfword. + o For backpanel wirelists, the "body loc" is the card B-R-S, + and the PINN is the CPIN loc. + +--------------------------------------------------------------------------- + +HASHTB: +All the signals are strung onto one list, however segments are pointed to by +buckets in the hash table. +Each entry is: + Previous(List),, end of list + +(The first bucket is used for generated signal names.) +The first bucket is initialized to point to the wire header "WIRES" slot. + +--------------------------------------------------------------------------- +Invented PWR/GND signals. + +When the bodies are read in from a WD file, any DIPTYPE that has pins +marked as type PWR or GND will have a signal created for it, marked +by the INVENT bit. The Volts column of the DIP definition is used to +create a signal called "+5.0V" for example. + +When signal names are read-in, GND, VCC, HI, NC, and all forms like +5.0V +are checked for, and appropriate bits set in the signals flags. + +When a DIP pin that was V or G is explicitly wired in the input file, +the invented pin is found and deleted. This allows user wiring of DIP pins that +normally get automatically connected to power or ground. +--------------------------------------------------------------------------- + + SUBTTL DATA STRUCTURES +; STRUCTURE DEFINTIONS + +FSTLEN__2 ;THIS WILL ACCUMULATE LONGEST BLOCK + + +;PC OR D LIST HEADERS + +SBLOCK +HWDS (BKNM,BLST) ;BACK PANEL FILENAME LIST AND WIRE LIST + ;BKNM MUST BE LEFT HALF POINTER +HWDS (WLNM,WIRL) ;TITLE STRING AND D WIRELIST POINTER + ;WIRL MUST BE RIGHT HALF +HWDS (WLID,PCWL) ;ID STRING AND PC WIRELIST POINTER + ;PCWL MUST BE RIGHT HALF +HWDS (,INXT) ;NEXT WIRE LIST (ID) +EBLOCK LSTHEAD +NIL, + +;FILENAME BLOCK FOR LIST OF FILENAMES FOR BACK PANEL LIST +;AND SINGLE CARD WIRE LISTS + +SBLOCK +FWD (FILN) ;FILENAME +HWDS (FEXT,) ;EXT AND UNUSED +FWD (FPPN) ;PPN +FWD (FDAT) ;DATE AND TIME FROM LOOKUP OF DRW FILE +FWD (FPOL) ;NUMBER OF POLARITY CHECK ERRORS FOUND BY DWG PROG +HWDS (FNXT,FMOD) ;NEXT FILENAME LINK AND MODULE NAME POINTER + ;FNXT MUST BE LEFT HALF POINTER +HWDS (FVAR,FPRF) ;VARIABLE AND PREFIX +HWDS (TIT1,TIT2) ;TITLE LINES 1 AND 2 +HWDS (FREV,AUTHOR) ;REVISION STRING AND AUTHOR +HWDS (FPROJ,FPAGE) ;PROJECT AND PAGE STRINGS +HWDS (FOF,FNXH) ;OF STRING AND NEXT HIGHER ASSEMBLY STRING +HWDS (FWWT,FNOM) ;BOARD TYPE STRING AND NOMENCLATURE TYPE STRING +HWDS (MUBN,MLBN,E,E) ;VARIABLE UPPER, LOWER BOUNDS FROM INPUT TERM +HWDS (MCRD,MVLS) ;CARD LOC, VARIABLE LIST FROM INPUT TERM +EBLOCK FBLK +NIL, + + +;NORMAL WIRE LIST HEADER UNIT (ONE CARD) + +SBLOCK +HWDS (NGEN,NXTWL) ;GEN NUMBER AND NEXT WLBLOCK + ;NXTWL MUST BE RIGHT HALFWORD +HWDS (FILS,WIRES) ;FILENAME LIST AND SIGNAL LIST + ;WIRES MUST BE RIGHT HALFWORD +HWDS (FCRD,WBDY) ;LAST CARD AND LOC BLOCKS + ;WBDY MUST BE RIGHT HALFWORD +FWD(HASHTB) ;FIRST WORD OF HASH TABLE +INDEX__INDEX+HASHL-1 ;REST OF TABLE +EBLOCK WLBLOCK +NIL, + + +;BODY BLOCK + +SBLOCK +HWDS (DIPT,NXTB) ;DIPTYPE POINTER AND NEXT BODY +HWDS (BID,BPIN) ;BODY ID AND BODY PIN LIST + ;BPIN MUST BE RIGHT HALF POINTER +HWDS (BBIT,BPAK) ;BODY BITS,, PACKAGE CODE FROM D +HWDS (PRPX,PRTN) ;EXTRA PROPERTIES LIST AND PART NUMBER BLOCK POINTER +HWDS (BLOC,FILB) ;BODY LOC AND FILENAME POINTER +FWD (BNAM) ;FIRST WORD OF BODY NAME (THE REST FOLLOW SEQUENTIALLY) +EBLOCK BHEAD +NIL, + +;WIRE HEADER + +SBLOCK +HWDS (WBIT,ALPH) ;WIRE BITS AND TEXT LINK + ;ALPH MUST BE RIGHT HALF POINTER +HWDS (TBIT,WPIN) ;TYPE BITS AND PIN LIST + ;WPIN MUST BE RIGHT HALF POINTER +HWDS (NNAM,WTMP) ;NEXT NAME FOR WIRE AND TMP STORE +HWDS (WVOL,WRN,E,) ;VOLTAGE (SPWR) AND WIRE RULE NUMBER (BP ONLY) +FWD (SCMP) ;COMPARE WORD +FWD (SPNT) ;PRINT NAME (MUST FOLLOW SCMP) +EBLOCK WHEAD +NIL, +;WBIT - type bits for signal (SNC, etc.) +;TBIT - combined type bits for pins on this wire + +;PIN BLOCK + +SBLOCK +HWDS (PBDY,NXTP) ;BODY POINTER AND NEXT PIN + ;NXTP MUST BE RIGHT HALF POINTER +HWDS (HPNT,NXBP) ;POINTER TO WHEAD AND BODY PIN LINK +HWDS (PID,PINN) ;POINT ID AND PIN # +INDEX__INDEX-1 +HWDS (CBIT,) ;FOR BACK PANEL, PID IS REALLY CBIT +HWDS (PBIT,FILP) ;PIN BITS AND FILENAME POINTER +HWDS (PTYP,RDCN) ;TYPE POINTER AND REDAC LIBRARY NUMBER +INDEX__INDEX-1 +HWDS (HILD,LILD,E,E) ;HI LOADING FOR BP PIN, NOT PTYP, RDCN +EBLOCK PHEAD +HWDS (HOLD,LOLD,E,E) ;LOW LOADING FOR BP PIN. +HWDS (FILO,) ;SOURCE FILE BLOCK POINTER AND UNUSED +EBLOCK BPHEAD +NIL, + + ;DIP TYPE HEADER BLOCK + +SBLOCK +HWDS (DNAM,NXTD) ;DIPNAME AND NEXT POINTER +HWDS (DPNN,DPIN) ;NUMBER OF PINS ACTUALLY DEFINED ON DIP, DIP PIN LIST +FWD (DTMP) ;TMP CELL FOR DIP COUNTS +HWDS (PRPN,PRPV) ;PROPERTY NAME LIST, PROPERTY VALUE LIST +HWDS (DPAK,) ;PACKAGE CODE FOR DIP +EBLOCK DHEAD +NIL, + +;DIP PIN BLOCK + +SBLOCK +HWDS (DPBIT,DPNXT) ;BITS AND NEXT +FWD (DUSE) ;SIXBIT USE FIELD +HWDS (LHI,LLOW,E,E) ;HI AND LOW LOADING +HWDS (SCTB,SCTP) ;SECT BITS AND SECT PIN # +HWDS (PSWP,DPNM) ;PIN SWAPPING/SHARING # AND PIN NAME +EBLOCK DPHEAD +NIL, + +;PROPERTY NAME BLOCK + +SBLOCK +HWDS (PRNN,PRNS) ;NEXT PROPERTY NAME BLOCK AND PROPERTY NAME STRING +EBLOCK PNBK +NIL, + +;PROPERTY VALUE BLOCK + +SBLOCK +HWDS (PRBT,PRNV) ;PROPERTY VALUE BITS AND NEXT PROPERTY VALUE BLOCK +HWDS (PRPP,PRNP) ;PREVIOUS PROPERTY VALUE (UP TREE) AND NEXT PROPERTY VALUE (DOWN TREE) +HWDS (PRNB,PRVS) ;PROPERTY NAME BLOCK AND PROPERTY VALUE STRING +EBLOCK PVBK +NIL, + +;BACK PANEL MODULE INFO BLOCK + +SBLOCK +HWDS (MNUM,MNXT) ;MODULES PER MACHINE, NEXT MODULE BLOCK +HWDS (MNAM,) ;MODULE NAME STRING +EBLOCK BMOD +NIL, + +;PARTS LIST THREAD BLOCK + +SBLOCK +HWDS (PLBT,NXPL) ;PLBK BITS, NEXT PLBK +HWDS (PLPT,MDCN) ;POINTER TO PVBK OF PART NUMBER, MASTER PART COUNT LIST(MDBLOCK) +EBLOCK PLBK +NIL, + + ;MASTER COUNT DIPTYPE BLOCK + +SBLOCK +HWDS (MDIP,MDNX) ;DIPTYPE, NEXT (MDBLOCK) +HWDS (,MXPT) ;POINTER TO EXTRA PART BLOCK (MXBLOCK) +EBLOCK MDBLOCK +NIL, + +;MASTER COUNT EXTRA PROPERTY BLOCK + +SBLOCK +HWDS (MPRX,MXNX) ;EXTRA PROPERTY LIST, NEXT (MXBLOCK) +HWDS (,MCPT) ;PART COUNT BLOCK POINTER +EBLOCK MXBLOCK +NIL, + + +;MASTER COUNT PART COUNT BLOCK + +SBLOCK +HWDS (MODC,MCNX) ;MODULE COUNT BLOCK POINTER (BMOD), NEXT (MCBLOCK) +FWD (MAPP) ;APPROXIMATE COUNT +FWD (MREA) ;REAL COUNT +EBLOCK MCBLOCK +NIL, + + +;DIRECTORY LIST BLOCK + +SBLOCK +HWDS (DEXT,DIRNXT) +FWD (DFIL) +FWD (DPPN) +HWDS (,CVAR) ;CARD AND VARIABLE LIST POINTER (MUST BE RIGHT HALF) +EBLOCK DIRHEAD +NIL, + + +;CARD LOC AND BOUND BLOCK + +SBLOCK +HWDS (,NSLC) ;NEXT SLICE +HWDS (CDLC,VLST) ;CARD LOC AND VARIABLE LIST POINTER +HWDS (LBND,UBND,E,E) ;UPPER AND LOWER BOUNDS (EXTEND SIGN ON FETCH) +EBLOCK CBND +NIL, + + +;VARIABLE BLOCK IN VARLIST + +SBLOCK +HWDS (VAL,NVAR,E) ;VALUE(EXTEND SIGN ON FETCH) AND NEXT +HWDS (WID,LET) ;WIDTH,,LETTER +EBLOCK VBLK +NIL, + + +;GND AND VCC PIN BLOCKS FOR ROUTER + +ROUTE,< +SBLOCK +HWDS (PNTR,NWRD) ;PIN POINTER,,NEXT BLOCK +FWD (PNAM) ;PIN NAME +EBLOCK WBLK +>;ROUTE +NIL, + + +;CURRENT@VOLTAGE LIST FOR WLS FILE + +SBLOCK +HWDS (VLTS,NXTM,E) ;VOLTS (W/SIGN) AND NEXT BLOCK POINTER +FWD (MAMP) ;# OF MILLIAMPS AT VOLTS +EBLOCK MABLK +NIL, + + +;2 WORD TMP LIST BLOCK + +SBLOCK +HWDS (TVAL,NXTT) ;FLAG,, LINK +HWDS (TLFT,TRHT) ;LEFT AND RIGHT TEMP CELLS +EBLOCK TBLK +NIL, + + +;COUNT BLOCK FOR WSS, WCS, AND WLS PRINT SUBR +SBLOCK +HWDS (CFIL,NXTC) ;FILE POINTER AND NEXT +HWDS (ICNT,OCNT) ;# INPUTS, #OUTPUTS +HWDS (CCNT,ZCNT) ;# CONNECTORS+BITS, # TERMINATORS +EBLOCK CBLK +NIL, + SUBTTL BITS + + +; BODY ENTRY (BBIT) +BTMP1__400000 ;TEMP MARK BIT +PRX2ND__200000 ;SECOND OCCURENCE OF THIS PRPX POINTER +BPACKP__100000 ;PACKAGE PROP OTHER THAN DEFAULT WAS SEEN + +BWILD__1000 ;THIS IS A WILD CONNECTOR +BEDGE__400 ;EDGE PIN BODY + CBODY__BEDGE!BWILD ;CON BODY BITS +BANYPOS__200 ;INDICATES XPOS AND YPOS ARE VALID +BXPOSL__3 ;3 BITS WORTH +BXPOSB__4 ;4 FROM RIGHT +BYPOSL__2 ;2 BITS WORTH +BYPOSB__2 ;2 FROM RIGHT + +;BITS FROM D WHICH MUST BE STORED IN BODY BITS ABOVE + +;BITS IN PIN ENTRY IN WIRE LIST (PBIT) +PTMP1__400000 ;MARK BIT +PTMP2__200000 ;ANOTHER + +TRMBTS__140000 ;TERMINATOR RULE BITS (FOR CON ONLY) + TRMBSZ__2 ;NUMBER OF BITS + TRMBPS__3 ;LOW ORDER BIT +CANYPOS__20000 + ;17400 POS BITS +CXPOSL__3 +CXPOSB__12 ;DISTANCE FROM RIGHT EDGE OF HALFWORD +CYPOSL__2 +CYPOSB__10 ;DISTANCE FROM RIGHT EDGE OF HALFWORD + +DUP__200 ;THIS PIN IS A DUPLICATE OF ANOTHER PIN IN RUN +PIDPIN__100 ;NO PIN #, USED PID! +PSHARE__40 ;THIS INPUT LOAD IS ALREADY SHARED WITH ANOTHER PIN +INVENT__20 ;THIS IS AN INVENTED POWER OR GROUND PIN +;QBITS USED ONLY ON BP PINS +QBITS__37 ;BIT MASK TO GET QUALIFIER LETTER FROM THIS HALFWORD + ;LSB OF BIT MASK MUST EQUAL 17 + ; IS FOR TABLE TEST INSIDE SIGSUB + + +;POINT BITS FROM DRAWING PROG ('WD' FILE) +DEFPIN__4000 ;THIS PIN IS DEFAULTED, NOT EXPLICIT (BODY PINS ONLY) +CPNBTS__6000 ;BITS FOR TERMINATOR RULES (CPINS ONLY) + CPNBPS__7 ;LOW ORDER BIT POS + CPNBSZ__2 ;# OF BITS + +;BITS IN DPBIT, TBIT, AND CBIT (TYPE BITS) +INLD__400000 ;INPUT LOAD +OUTLD__200000 ;OUTPUT LOAD +NULLD__100000 ;NO LOADING AT PRESENT +GND__40000 ;GROUND CONNECTION +PWR__20000 ;POWER CONNECTION + VPWR__=500 ;TTL POWER +TRI__10000 ;TRI-STATE OUTPUT +SHARE__4000 ;SHARE INPUT LOAD BIT (OR EXTRA OUTPUT) +OPENC__2000 ;OPEN COLLECTOR OUTPUT +PULL__1000 ;THIS OUTPUT IS A PULLUP +ECL__400 ;ECL PIN +TTL__200 ;TTL PIN +CLK__100 ;CLK SEEN AS FIRST 3 CHARS OF USE +TERM__40 ;TERMINATOR PIN +FFOUT__20 ;FLIP-FLOP OUTPUT +DRVREQ__10 ;DRIVE REQUIRED FOR THIS INPUT +FFIN__4 ;FLIP-FLOP INPUT + +ANYCON__1 ;THERE IS A CONNECTOR IN THIS RUN (NOT USED IN DPBIT) + +;BITS FROM OLD VERSION DIP FILE +VEE__200 ;-5.5V ECL POWER + VEEVLT__-=520 +OTTL__100 ;OLD TTL BIT +VBB__40 ;-1.5V ECL THRESHOLD + VBBVLT__-=150 +VTT__20 ;-2V ECL TERMINATORS + VTTVLT__-=200 +OCLK__10 ;OLD CLK BIT + + +ALLTYP__INLD!OUTLD!NULLD!GND!PWR!TRI!SHARE!OPENC!PULL!TERM ;ALL TYPE BITS +INBITS__INLD!SHARE!NULLD ;ALL INPUT BITS + + + ;BITS IN WBIT (WIRE BITS) +SNC__400000 ;THIS WIRE HAS THE NAME "NC" +SHI__200000 ;THIS WIRE HAS THE NAME "HI" +SPWR__100000 ;THIS WIRE HAS THE NAME "VCC" +SGND__40000 ;THIS WIRE HAS THE NAME "GND" +SCANON__20000 ;THIS SIGNAL IS THE CANONICAL +5.00V + +CABRUN__400 ;PUT C QUALIFIER ON EDGE PINS +WNULL__200 ;COMPLETELY NULL WIRE +WSINGL__100 ;WIRE WITH ONLY 1 PIN +GLB2__40 ;THIS IS THE SIGNAL TO COME OUT IN THE SIMPLE FILE +GLB1__20 ;THIS IS ONLY SIGNAL TO GO TO BACK PANEL +GENSIG__10 ;THIS IS A GENERATED SIGNAL +WTMP1__4 ;TEMP MARK BIT FOR WIRE HEADER +SIG1__2 ;THIS SIGNAL BLOCK IS THE FIRST OF A SET OF EQUIVALENT NAMES +NAM2ND__1 ;INTERNAL WIRE HEADER BIT FOR SECOND NON-EQUIVALENT NAME OF SIGNAL + +SIGBIT__SNC!SHI!SPWR!SGND ;WIRE TYPE BITS + + +;RUN BITS FROM DRAWING PROG ('WD' FILE) +CABBDY__1 ;"CABLE" BODY PIN ON RUN + + +ROUTE,< +;BITS IN PNTBL WORD USED BY ROUTER +RPGPIN__400000 ;THIS IS A POWER OR GROUND PIN, IT IS NOT IN WIRE LIST +RERPIN__200000 ;THIS PIN IS IN ERROR IN SOME WAY, DON'T WIRE IT! +ROUMRK__100000 ;MARK BIT FOR ROUTER +;BITS 5-14 ORDER # +;BITS 15-17 "SCT" CHARS +>;ROUTE + + +;BITS IN PROPERTY VALUE BLOCKS +DEFPRP__400000 ;THIS IS THE DEFAULT PROPERTY AT THIS LEVEL +PARTNM__200000 ;THIS IS A PART NUMBER BLOCK +PNUSED__100000 ;THIS PART NUMBER BLOCK IN USE +NULVAL__40000 ;THIS IS A NULL VALUE STRING AND SHOULDN'T NORMALLY BE PRINTED + +PRTMP1__1 ;TEMP MARK BIT + + +;BITS IN PLBK FOR PARTS LIST THREAD +PL2ND__400000 ;THIS IS SECOND OCCURENCE OF SAME PART NUMBER diff --git a/doc/wl/wl.info b/doc/wl/wl.info new file mode 100644 index 00000000..4553852f --- /dev/null +++ b/doc/wl/wl.info @@ -0,0 +1,30 @@ + Creating a new WL + + WL^S +Assemble new REL: + :FAIL WL +If necessary, assemble new BOARDS file + WL$$^S + :FAIL WBOARD +Load binary: + :STINK WL ;Uses WL LOADER +Merge in DECUUO boot: + 1L DECSYS;DECBOT BIN + .JBSA/ STRT + 56/ 107 ;SAIL + META + SYMS + ... + + :DELETE DATDRW;NODIPS OBIN + :RENAME DATDRW;NODIPS BIN, NODIPS OBIN + :PDUMP DATDRW;NODIPS BIN ; This is the file linked to by SYS1;TS NODIPS + :GO + "TOP MODE" + XRESIDENT ;read in NDIPS.DIP and dump it out + +This should produce a new WL;WL BIN which should be copied or moved to +DATDRW; + +NOTE!! Don't save a WL OBIN! This can cause a complete screw if +someone later tries to "restore" this version, because it will +contain an old NDIPS DIP file, and the next dip creation/modification +cycle will clobber any dip definitions made since the WL OBIN. + diff --git a/src/draw/alt.314 b/src/draw/alt.314 new file mode 100644 index 00000000..0a3ad129 --- /dev/null +++ b/src/draw/alt.314 @@ -0,0 +1,720 @@ +VERSION(ALT,3) +;ENTER ALTER MODE -- POINT, EDIT, MACRO +MD,< +BTALTR: PUSHJ P,GETCLS + JRST PERRET + MOVEM A,REMMAC + MOVE T,CLAST + HRLM T,REMMAC ;SAVE LAST ALSO + FETCH(A,A,TXVAL) ;TEXT STRING + MOVEI T,BTALTM + JRST EALT0 + +EALTER: PUSHJ P,GETCLS + JRST PERRET + MOVEM A,REMMAC ;REMEMBER THE ONE WE ARE WORKING ON + FETCH(A,A,TXVAL) ;TEXT STRING + MOVEI T,EDTAM ;ENTER THIS MODE SO WE LEAVE PROPERLY + JRST EALT0 +>;MD + +ALTER: PUSHJ P,GETCLS + JRST PERRET + MOVEM A,ALTPNT ;FOR PTKIL1 + MOVE B,A + FETCH(A,B,PTXT) + JUMPN A,EALT1 ;ANY TEXT ON POINT? + GETBLK(A,TEXCOF) ;NO, GIVE HIM SOMETHING TO EDIT ANYWAY + CLEAR(A,TCXY) ;IT SHOULD NEVER GET SEEN IF IT STAYS NULL + STORE(A,B,PTXT) ; OFFSET HEADER,... + GETBLK(C,TEXSTR) + STORE(C,A,TCSTR) ; ...,TEXT STRING + CLEAR(C,TSNXT) + CLEAR(C,TSASC) + MOVE T,STDBIG + STORE(T,C,TSSIZ) +EALT1: MOVEI T,ALTM + FETCH(A,A,TCSTR) ;STRIP OFF OFFSET HEADER +EALT0: MOVEM A,TXTPNT + SETZM ALTLIN + MOVE TT,MODE + MOVEM TT,MODALT + PUSHJ P,CHNGMD + TRO MCHG + SETOM LPNTR + JRST TXTSET ;INITIALIZE POINTERS! + + ;MACRO ALTER + +MALTER: MOVEI T,1 + LSH T,@MODE + TDNE T,[ANYALT] + JRST PERRET + PUSHJ P,ITGET ;GET MACRO + JRST NXMAC ;NONE + MOVEM E,REMMAC + MOVE T,MODE + MOVEM T,MODALT + SETZM ALTLIN + MOVEI T,CRCHR + MOVEM T,EOLCHR + MOVEI T,MALTM + PUSHJ P,CHNGMD + TRO MCHG + SETOM LPNTR + MOVE T,B ;SAVE BYTE POINTER + PUSHJ P,SETTT7 ;SETUP FOR TEXT STRING + MOVEM A,TXTPNT +MALT1: PUSHJ P,GETTT + JRST TXTSET + TRZE C,200 + PUTBYT AMCTL + TRZE C,400 + PUTBYT AMMTA +IFN ALTCHR-ALTMOD,< + CAIN C,ALTMOD + MOVEI C,ALTCHR +>;IFN ALTCHR-ALTMOD + CAIN C,12 + MOVEI C,CRCHR ;USE THIS AS LF FOR NOW + PUTBYT (C) + JRST MALT1 + ;LEAVE ALTER MODE +MD,< +BTXALT: PUSHJ P,EBTALT + CAIA + JRST BTXDL1 ;A SETUP WITH LAST,,CLOSEST + MOVE B,A + MOVE A,BTBODY + JRST CMPBDT ;RECOMPILE NEW PROP + +ELTALT: PUSHJ P,EBTALT + CAIA + JRST EDTDL1 + MOVE B,A + MOVE A,CURBOD ;TYPE + JRST CMPTYT ;RECOMPILE NEW PROP + +;EBTALT - END OF EDIT BODY TEXT +;(SKIPS IF TEXT WENT AWAY) +EBTALT: MOVE T,MODALT + PUSHJ P,CHNGMD + TRO MCHG + SETOM LPNTR + MOVE B,TXTPNT + MOVE A,REMMAC ;GET THE ONE WE WERE WORKING ON + SKIPN ADDR(B,TSASC) ;DID TEXT GO AWAY? + JRST CPOPJ1 ;YES, TELL HIGHER UPS TO KILL IT + PUSHJ P,EALT2 + FETCH(T,A,TXXY) + TRNN T,1 ;AUTO OFFSET? + POPJ P, ;NO + JRST EDTTZA ;YES, RECALCULATE OFFSET +>;MD + +MALTALT:MOVE B,REMMAC + HLRZ B,1(B) + PUSHJ P,PUTFS ;GIVE OLD COPY OF MACRO BACK + MOVE T,TXTPNT + ADD T,[POINT 7,1] + PUSHJ P,SETTT + SETZ D, +MALTC1: PUSHJ P,GETTT + JRST MALTC2 + CAIN C,AMMTA + JRST [ TRO D,400 + JRST MALTC1] + CAIN C,AMCTL + JRST [ TRO D,200 + JRST MALTC1] + CAIN C,CRCHR + JRST [ MOVEI C,12 + JRST ISLF] ;DON'T ALLOW CTRLMETA ON LF +IFN ALTCHR-ALTMOD,< + CAIN C,ALTCHR + MOVEI C,ALTMOD +>;IFN ALTCHR-ALTMOD + TRO C,(D) +ISLF: PUTBYT (C) + SETZ D, + JRST MALTC1 + +MALTC2: MOVE E,REMMAC + MOVE A,SETSTR + HRLM A,1(E) + HRROS (A) ;MARK AS PERMANENT +MQUIT1: MOVE B,TXTPNT + PUSHJ P,PUTFS + TRO MCHG + MOVEI T,DBLARR + MOVEM T,EOLCHR ;RESTORE END OF LINE CHARACTER + MOVE T,MODALT + JRST CHNGMD + +MQUIT: MOVE T,MODE + CAIN T,MALTM ;CAN'T IF NOT DOING ANYTHING + JRST MQUIT1 + JRST PERRET + +ALTALT: MOVE T,MODALT ;GET BACK OLD MODE + PUSHJ P,CHNGMD + TRO MCHG + MOVE B,TXTPNT ;GET TEXT POINTER + MOVE A,ALTPNT + SKIPN ADDR(B,TSASC) ;DID IT GET CLEARED ENTIRELY? + JRST PTKIL1 ;KILL IT THE USUAL WAY +MD,< PUSHJ P,FIXEM ;FIX TEXT AND CON OFFSET (IF BITS ON)> +EALT2: MOVE B,TXTPNT +EALT3: MOVE T,B + FETCH(B,B,TSNXT) + JUMPE B,CPOPJ + SKIPE ADDR(B,TSASC) ;NULLS? + JRST EALT3 + CLEAR(T,TSNXT) + JRST PUTFS ;FLUSH THEM + +SETSIZ: TRZE TYPNEG + JRST MSORRY + PUSHJ P,READSZ ;READ SIZE ARG (RETURNS IN T) + JRST INNERR ;IF ERROR, JUST SAY SO + PUSHJ P,GETLIN ;GET LF + CAIE C,12 + JRST INNERR +MPC,< JUMPE T,INNERR > +MD,< JUMPN T,NOZERO + MOVEI TT,1 + LSH TT,@MODE + TDNN TT,[1EDTAM!1BTALTM] + JRST INNERR + MOVE TT,REMMAC + FETCH(TT,TT,TXNAM) ;TEXT HAS PROPERTY NAME? + JUMPE TT,INNERR ;ZERO SIZE NOT ALLOWED UNLESS PROPERTY +NOZERO: +>;MD + MOVE TT,TXTPNT + STORE(T,TT,TSSIZ) ;STORE IN TEXT HEADER + JRST COMCLR + +ALTMNS: SKIPE NOARG ;HAS HE ALREADY STARTED A NUMBER? + TROE TYPNEG ;NO, ARE WE ALREADY - ? + JRST PERRET ;YES, ERROR + POPJ P, + +ALTNUM: SETZM NOARG ;INDICATE ARG SPECIFIED + MOVE T,COMREP + IMULI T,=10 + ADDI T,-60(C) + MOVEM T,COMREP + POPJ P, + +TXTSET: MOVE T,TXTPNT + ADD T,[] + MOVEM T,TXTBYT ;INITIALIZE BYTE POINTER TO FIRST CHAR + MOVEI T,1 + MOVEM T,TXTCNT ;AND FIRST CHAR OF TEXT + TRO ATFP + TRZ ATLP ;ASSUME NOT AT LAST POINT YET + LDB T,TXTBYT + JUMPN T,COMCLR ;WE WERE RIGHT + TRO ATLP ;FLAG AT LAST POINT +COMCLR: SETZM COMREP ;CLEAR REPEAT COUNT + SETOM NOARG ;FLAG NO ARGUMENT YET + TRZ TYPNEG ;NOT - YET + SETZM AEOL + SETZM ABOL + TRNE ATLP + SETOM AEOL + TRNE ATFP + SETOM ABOL + POPJ P, + +MSORRY: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/SORRY, MINUS NOT IMPLEMENTED FOR THIS COMMAND. +/] + JRST COMCLR + ;GETONE, FORWRD, BAKWRD +GETONE: TRNE ATLP + POPJ P, ;DIRECT RETURN IF AT LAST POINT ALREADY + TRZ ATFP ;GUESS WE'RE NOT AT THE FIRST POINT ANY MORE + AOS TXTCNT ;MOVING FORWARD AT LEAST ONE + MOVE T,TXTBYT + TLNE T,760000 ;END OF WORD YET? + JRST SAMWRD ;YES + HRR T,-1(T) + TRNE T,-1 ;END OF STRING? + JRST SAMWRD + GETBLK(TT,TEXSTR) ;YES, CONS UP ADDITIONAL SPACE + CLEAR(TT,TSASC) + CLEAR(TT,TSNXT) + MOVE T,TXTBYT + HRRM TT,-1(T) + HRR T,TT +SAMWRD: ILDB C,T ;GET CHAR (MAY BE 0) + MOVEM T,TXTBYT + JUMPN C,CPOPJ1 ;SKIP RETURN IF AT END NOW + TRO ATLP ;NOT REALLY AT LAST POINT + POPJ P, + +FORWRD: TRZE TYPNEG + JRST BAKWRD + TRNE ATLP ;AT LAST CHR + JRST COMCLR ;YES, LEAVE + SKIPN COMREP ;ANY ARGUMENT? + AOS COMREP ;NO, USE ONE +FORLOP: SOSL COMREP + PUSHJ P,GETONE ;GET NEXT CHAR + JRST COMCLR + JRST FORLOP + +BAKONE: PUSH P,COMREP + SETZM COMREP + PUSHJ P,BAKWRD + POP P,COMREP + POPJ P, + +BAKWRD: TRZE TYPNEG + JRST FORWRD + TRNE ATFP ;AT FIRST POINT? + JRST COMCLR ;YES, LEAVE + SKIPN T,COMREP + MOVEI T,1 + SUB T,TXTCNT ;WHERE TO BACK UP TO, COUNTING FROM FRONT + PUSH P,T + PUSHJ P,TXTSET ;GET BACK TO FRONT + POP P,T + ADDI T,1 ;ACCOUNT FOR BEING AT FIRST ONE ALREADY + MOVNM T,COMREP + JRST FORLOP ;FORLOP WILL QUIT IF AT FRONT ALREADY + + +;SEARCH +SEARCH: TRZE TYPNEG + JRST NSEARC + PUSHJ P,SEARC0 + JRST COMCLR + PUSHJ P,GETONE + JRST COMCLR + JRST COMCLR + +SEARC0: SKIPN COMREP + AOS COMREP + PUSHJ P,GETCHR +SEARCL: SETZM AFIND + PUSH P,C ;SAVE CHAR TO SEARCH FOR + LDB C,TXTBYT ;START WITH CURRENT CHAR + JRST SEARC5 + +SEARC1: SOSG COMREP + JRST SEARC3 +SEARC2: PUSHJ P,GETONE + JRST SEARC4 ;AT END, LEAVE +SEARC5: CAME C,(P) ;IS THIS ONE? + JRST SEARC2 ;GET ANOTHER + JRST SEARC1 ;LOOP FOR COUNT + +SEARC3: AOS -1(P) + SETOM AFIND +SEARC4: POP P,(P) + POPJ P, + +NSEARC: PUSHJ P,NSEAR0 + JRST COMCLR + JRST COMCLR + + +NSEAR0: SKIPN COMREP + AOS COMREP + PUSHJ P,GETCHR +NSEARL: SETZM AFIND + PUSH P,C ;SAVE CHAR TO SEARCH FOR +NSEAR1: SOSGE COMREP + JRST SEARC3 +NSEAR2: TRNE ATFP ;DONE IF AT FIRST POINT + JRST SEARC4 + PUSHJ P,BAKONE + LDB C,TXTBYT + CAME C,(P) + JRST NSEAR2 + JRST NSEAR1 + ;END OF LINE SEARCHES +ELINE: TRO TFLG + TRNN TYPNEG + AOS COMREP ;FOR FORWARD, ADD 1 + JRST SLINE1 + +MSLINE: TRC TYPNEG +SLINE: TRZ TFLG + TRNE TYPNEG ;IF - SEARCH + JRST [ SKIPE NOARG ;IF NO ARG, + AOS COMREP ;THEN - = -1 + AOS COMREP ;THEN ADD 1 TO COUNT + JRST SLINE1] ;AND PROCESS + SKIPN NOARG ;IF ARG, + SKIPE COMREP ;AND IT IS 0 + JRST SLINE1 + TRO TYPNEG ;THEN BACKWARDS 1 EOL +SLINE1: SKIPN COMREP + AOS COMREP + MOVE C,EOLCHR ;THIS IS ALWAYS THE SEARCH CHARACTER + TRZE TYPNEG + JRST NSLINE + PUSHJ P,SEARCL + JRST COMCLR +NSLIN1: TRNN TFLG ;IF "E", LEAVE BEFORE CHAR + PUSHJ P,GETONE + JRST COMCLR + JRST COMCLR + +NSLINE: PUSHJ P,NSEARL + JRST COMCLR + JRST NSLIN1 + + ;ALTER MODE DELETE +;COMREP = DELETE COUNT, (TYPNEG MEANS -D) +;TXTBYT = BYTE POINTER TO ASCII (TSASC) +;TXTCNT = CHARACTER POSITION IN STRING + +DELETE: TRZN TYPNEG + JRST DELET0 + TRNE ATFP + JRST COMCLR + SKIPN T,COMREP + MOVEI T,1 + ADDI T,1 + CAMLE T,TXTCNT ;IS THERE ENOUGH THERE TO DELETE? + MOVE T,TXTCNT ;NO, DELETE JUST WHATS THERE + SUBI T,1 + MOVEM T,COMREP + PUSH P,COMREP + PUSHJ P,BAKWRD + POP P,COMREP +DELET0: TRNE ATLP + JRST COMCLR + SKIPN COMREP + AOS COMREP + PUSH P,TXTCNT + PUSH P,TXTBYT + MOVE A,TXTBYT + ADD A,[070000,,0] + SOS COMREP ;GET WILL DO ONE + PUSHJ P,FORLOP ;SKIP OVER CHARS WE WANT TO DELETE +DELET1: PUSHJ P,GETONE + JFCL + TLNN A,760000 ;END OF WORD? + HRR A,-1(A) ;YES, FOLLOW LINK (CAN'T LOSE). + IDPB C,A ;DEPOSIT CHAR + JUMPN C,DELET1 ;LOOP IF NOT AT END (C=0) + TRO MCHG + SETOM LPNTR + POP P,TXTBYT + POP P,TXTCNT + SOSN 1(P) ;TEST TXTCNT FOR 1 + TRO ATFP ;AND SET ATFP IF ON + CAME A,TXTBYT ;DID WE PUT A 0 IN THE CURRENT BYTE? + TRZ ATLP ;NO, FLUSH ATLP + TLNE A,760000 ;END OF WORD? + IDPB C,A ;ANOTHER 0 + TLNE A,760000 ;END OF WORD YET? + JRST .-2 + HRRZ B,-1(A) ;GET FORWARD LINK + HLLZS -1(A) + JRST PUTFS ;AND RETURN THE REST + +KILL: TRZE TYPNEG + JRST NKILL + PUSH P,0 ;SAVE FIRST-LAST BITS + PUSH P,TXTCNT + PUSH P,TXTBYT + PUSHJ P,SEARC0 ;FIND CHAR IN QUESTION + JRST [ SUB P,[3,,3] + JRST COMCLR] + POP P,TXTBYT + POP P,T ;GET BACK ORIGINAL COUNT + EXCH T,TXTCNT ;PUT THIS BACK NOW IN CASE AT END + POP P,TT ;GET BACK BITS + TRZ ATLP!ATFP ;CLEAR THESE + ANDI TT,ATLP!ATFP + TRO (TT) + SUB T,TXTCNT + ADDI T,1 ;KILL THROUGH CHARACTER WE FOUND. + MOVEM T,COMREP ;THIS IS HOW MANY TO DELETE + JRST DELETE + +NKILL: PUSH P,TXTCNT + PUSHJ P,NSEAR0 ;FIND CHAR IN QUESTION + JRST [ POP P,(P) + JRST COMCLR] + POP P,T + SUB T,TXTCNT + MOVEM T,COMREP ;THIS IS HOW MANY TO DELETE + JRST DELETE + +ALTC: TRZE TYPNEG + TROA TFLG + TRZ TFLG + SKIPN COMREP + AOS COMREP +ALTC1: PUSHJ P,GETCHR ;GET REPLACEMENT CHAR + CAIE C,12 + CAIN C,ALTMOD ;DIS-ALLOW STUPIDNESS + JRST ALTC3 + TRNN TFLG + JRST ALTC4 + TRNE ATFP + JRST ALTC2 + PUSH P,C + PUSHJ P,BAKONE + POP P,C + JRST ALTC5 + +ALTC4: TRNE ATLP + JRST ALTC2 +ALTC5: DPB C,TXTBYT + TRO MCHG + SETOM LPNTR +ALTC3: TRNN TFLG + PUSHJ P,GETONE ;MOVE FORWARD ONE + JFCL ;IF AT END, JUST GOBBLE REST OF CHARS +ALTC2: SOSLE COMREP + JRST ALTC1 + JRST COMCLR + ALTN: PUSHJ P,ALTNS + JRST COMCLR + TRNE TFLG + POPJ P, ;ALREADY AT FRONT IF -N +ALTNA: PUSHJ P,GETONE + JRST COMCLR + CAIL C,"0" + CAILE C,"9" + JRST COMCLR + JRST ALTNA + +SPALTN: PUSHJ P,ALTNS + JRST COMCLR ;DIDN'T FIND IT + PUSHJ P,COMCLR + PUSHJ P,SETTT ;SETUP OUTPUT STRING +SPALT1: PUTBYT (C) + PUSHJ P,GETONE + JRST SPALT2 + CAIL C,"0" + CAILE C,"9" + CAIA + JRST SPALT1 +SPALT2: TRNE TFLG + PUSHJ P,BAKDIG ;BACK UP TO FRONT IF -# + JRST ITSTUF + +ALTPLS: PUSHJ P,SREADN + CAIE C,12 + JRST INNERR + MOVE D,T + PUSHJ P,ALTNS + JRST COMCLR + SETZ B, +ALTPL1: LDB C,TXTBYT + CAIL C,"0" + CAILE C,"9" + JRST ALTPL2 + IMULI B,=10 + ADDI B,-"0"(C) + PUSH P,B + PUSHJ P,DELETE + POP P,B + JRST ALTPL1 + +ALTPL2: ADD B,D ;NOW ADD ARGUMENT + PUSHJ P,SETTT7 ;PREPARE TO MAKE STRING + PUSHJ P,PUTTTN ;MAKE NUMBER BACK INTO STRING + MOVE B,A ;PUT WHERE INSERT WILL FIND IT + PUSHJ P,ALTPL3 ;AND INSERT NEW DIGIT STRING + TRNE TFLG + PUSHJ P,BAKDIG + JRST COMCLR + +ALTU: PUSHJ P,ALTNS + JRST COMCLR +ALTU1: PUSHJ P,DELETE + LDB C,TXTBYT + CAIL C,"0" + CAILE C,"9" ;ALL DIGITS DELETED? + POPJ P, ;YES + JRST ALTU1 + +ALTNS: SETZM AFIND + SKIPN COMREP + AOS COMREP + TRZE TYPNEG + JRST NALTNS + TRZ TFLG + TRNE ATLP + POPJ P, + LDB C,TXTBYT ;IN CASE AT FRONT + TRNE ATFP + JRST ALTN2 ;YES, ASSUME CAN BE START OF DIGIT STRING + PUSHJ P,BAKONE ;BACK UP ONE + LDB C,TXTBYT ;GET CHAR WE NOW POINT AT +ALTN1: CAIL C,"0" + CAILE C,"9" + JRST ALTN3 ;FOUND NON-DIGIT +ALTN4: PUSHJ P,GETONE + POPJ P, + JRST ALTN1 + +ALTN3: PUSHJ P,GETONE ;GET ANOTHER + POPJ P, +ALTN2: CAIL C,"0" + CAILE C,"9" ;GET TO DIGIT YET? + JRST ALTN3 ;NO + SOSLE COMREP ;YES, HAVE WE FOUND ENOUGH? + JRST ALTN4 ;NO + SETOM AFIND + JRST CPOPJ1 ;YES + +NALTNS: TRO TFLG + TRNE ATLP + JRST NALTN1 ;CAN BE START OF DIGIT STRING IF END + LDB C,TXTBYT + CAIL C,"0" + CAILE C,"9" + JRST NALTN1 ;IF THIS CHAR NOT DIGIT, CAN ALSO BE START + PUSHJ P,BAKDIG +NALTN1: TRNE ATFP + POPJ P, ;NOT FOUND + PUSHJ P,BAKONE + LDB C,TXTBYT + CAIL C,"0" + CAILE C,"9" + JRST NALTN1 + PUSHJ P,BAKDIG ;BACKUP OVER DIGIT STRING + SOSLE COMREP + JRST NALTN1 ;NOT ENOUGH YET, LOOP BACK + SETOM AFIND + JRST CPOPJ1 ;FOUND IT + +BAKDIG: TRNE ATFP + POPJ P, ;IF AT FRONT, THEN DONE + PUSHJ P,BAKONE + LDB C,TXTBYT + CAIL C,"0" + CAILE C,"9" + CAIA + JRST BAKDIG ;KEEP GOING + PUSHJ P,GETONE ;POINT BACK AT FIRST DIGIT + JFCL ;CAN'T HAPPEN + POPJ P, + REPLAC: PUSHJ P,DELETE ;<->nD, THEN INSERT +INSERT: TRZE TYPNEG + JRST MSORRY + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/INSERT TEXT_/] + PUSHJ P,TREADC + POPJ P, + POPJ P, +ALTPL3: TRO MCHG + SETOM LPNTR +;Painfully splice new string into old +;TXTBYT:  ASCII WD1 (BLANK OUT WITH RUBOUTS)  NEW STRING ... +;TT: COPY WD1  OLD STRING'S TAIL ... + TRZ ATLP ;THERE IS AT LEAST ONE MORE CHAR COMING! + MOVE T,TXTBYT ;BYE PTR TO ASCII WD1 + GETBLK(TT,TEXSTR) + MOVE TTT,(T) + STORE(TTT,TT,TSASC) ;COPY ASCII-WD1 INTO NEW BLOCK + HRRZ TTT,-1(T) ;GET OLD TAIL + HRRM B,-1(T) ;INSERT NEW STRING + STORE(TTT,TT,TSNXT) ;OLD TAIL AFTER NEW BLOCK + PUSH P,TT ;SAVE END PIECE +;Delete trailing characters in ASCII WD1 + MOVEI TT,1 ;FILL OUT + MOVEI C,177 ;(CAN'T BE 0'S) + ADD T,[070000,,0] + IDPB C,T + TLNE T,760000 + AOJA TT,.-2 + MOVEM TT,COMREP ;SET AS DELETE COUNT + PUSH P,TT + PUSHJ P,DELETE +INS2: PUSHJ P,GETONE ;SKIP TO END OF SPLICED ON STRING + CAIA + JRST INS2 ;LOOP UNTIL END OF TEXT + TRZ ATLP + POP P,T + EXCH T,(P) ;EXCHANGE COUNT FOR REST OF TEXT + MOVE TT,TXTBYT + HRRM T,-1(TT) ;NCONC TRAILER JUST AFTER NEW STUFF +;Delete nulls at end of inserted string, and also leading characters +; in ascii word that was copied from insertion point + MOVNI T,1 + MOVEI C,177 + ADD TT,[070000,,0] + IDPB C,TT + TLNE TT,760000 + SOJA T,.-2 +INS3: SUBI T,5 ;-5-#NULLS + POP P,TT ;# CHARS AFTER POINT IN WD1 + ADD T,TT ;-#NULLS -#CHARS BEFORE POINT IN WD1 + MOVNM T,COMREP ;# TO DELETE + JRST DELETE + ;HERE WE SEARCH FOR A SUBSTRING OF THE CURRENT STRING +ALTZAP: SETOM CHRALT ;FLAG DELETE + CAIA +ALTFND: SETZM CHRALT ;FLAG NO DELETE + TRZE TYPNEG + JRST MSORRY + TLNN M,DSKACT!MACACT + SKIPN A ;WANT PROMPT? + CAIA + OUTSTR[ASCIZ/TYPE SEARCH STRING. +/] + PUSHJ P,TREADC + JRST COMCLR ;ALTMODE + JRST [ +MD,< + SKIPE B,FPTSTR ;YES, USE TEXT SEARCH STRING + JRST .+1 +>;MD + JRST PERRET] ;NO STRINGS AT ALL, ERROR + MOVEM B,ALTSTR ;SAVE POINTER HERE + PUSHJ P,ADZERO ;MAKE SURE THERE IS A ZERO ON THE END + SKIPN COMREP + AOS COMREP + SETZM AFIND ;NOTHING FOUND YET + TRNE ATLP ;AT END? + JRST ALTFN2 + MOVE A,TXTBYT ;BACK UP ONE INITIALLY + ADD A,[160000,,0] + SETOM BEGLIN ;START AT FRONT + TRNN ATFP ;IS IT TRUE? + SETZM BEGLIN ;NOT AT FIRST CHAR + SETOM FSTART +ALTFN1: PUSHJ P,MATCH ;TRY TO MATCH THEM + JRST ALTFN2 ;NO MATCH + SOSLE COMREP ;DONE? + JRST ALTFN1 ;NO, TRY AGAIN +ALTFN2: MOVE T,FSTART ;COUNT TO START + MOVEM T,COMREP + JUMPE T,.+2 ;MAY ALREADY BE THERE + PUSHJ P,FORWRD ;MOVE TO THERE + MOVE B,ALTSTR +MD,< CAME B,FPTSTR ;WAS THIS THE TEXT SEARCH STRING? > + PUSHJ P,PUTFS ;NO, GIVE BACK FREE STORAGE + SKIPE T,FLEN ;NON-ZERO STRING FOUND? + TRNE ATLP ;YES, AT END? + JRST COMCLR ;LOSE + MOVEM T,COMREP ;THIS IS HOW MANY TO DO + SETOM AFIND ;FLAG SOMETHING FOUND + SKIPN CHRALT ;NON-ZERO MEANS DELETE + JRST FORWRD ;ELSE JUST MOVE TO END + JRST DELETE + +ADZERO: MOVE T,B + HRRZ B,(B) + JUMPN B,.-2 + MOVE TT,1(T) + TRNN TT,376 + POPJ P, + GETFS (TT) + SETZM 1(TT) + SETZM (TT) + HRRM TT,(T) + POPJ P, diff --git a/src/draw/body.500 b/src/draw/body.500 new file mode 100644 index 00000000..b7b4f1b4 --- /dev/null +++ b/src/draw/body.500 @@ -0,0 +1,1515 @@ +;BODY.FAI.70, 19-NOV-75 19:34:58, EDIT BY HELLIWELL +VERSION(BODY,6) +SUBTTL PIN SWAPPING + +PSWAPA: +MD,< TRZA TFLG +PSWAPB: TRO TFLG ;PIN NUMBER SWAP ONLY +>;MD + PUSHJ P,PUSHM ;SET DISPLAY MODE + PUSHJ P,GETCLS + JRST POPME + TLNN M,DSKACT!MACACT +MD,< OUTSTR[ASCIZ/FIRST PIN ID?/] > +MPC,< OUTSTR[ASCIZ/FIRST PIN NAME?/] > + PUSHJ P,READP + JRST POPM ;ALTMODE + JRST POPME ;ERROR + JUMPE T,POPM ;LET HIM OUT ON 0 + MOVEM T,N1 + TLNN M,DSKACT!MACACT +MD,< OUTSTR[ASCIZ/SECOND PIN ID?/] > +MPC,< OUTSTR[ASCIZ/SECOND PIN NAME?/] > + PUSHJ P,READP + JRST POPM ;ALTMODE + JRST POPME ;ERROR + PUSHJ P,POPM + JUMPE T,CPOPJ ;LET HIM OUT ON 0 + MOVEM T,N2 + SETZM L1 + SETZM L2 + MOVEM A,CURBOD ;STO BODY POINTER HERE FOR NOW + MOVEI B,RADDR(A,BLNK,BPLNK) ;PIN LIST OFF OF BODY + JRST FNDPN2 + +FNDPN1: MOVE A,B ;CURRENT POINT + FETCH(T,B,BPLOC) ;GET PIN-LOC BLOCK IN TYPE + FETCH(T,T,TPID) ;WE'RE DISPLAYING "REAL" PINIDS + CAME T,N1 + JRST NOTN1 +MPC,< SKIPN L1 ;SAME PIN MAYBE ON BOTH SIDES + JRST [ MOVEM A,L1 + JRST FNDPN2] + HRLM A,L1 ;GOTH BOTH POINTS FOR #1 + SKIPN TT,L2 + JRST FNDPN2 + TLNE TT,-1 ;ALSO GOT BOTH FOR #2? + TLNN TT,-1 + JRST FNDPN2 + JRST GOTBOT + +NOTN1: CAME T,N2 + JRST FNDPN2 + SKIPN L2 + JRST [ MOVEM A,L2 + JRST FNDPN2] + HRLM A,L2 + SKIPN TT,L1 + JRST FNDPN2 + TLNE TT,-1 + TLNN TT,-1 + JRST FNDPN2 + JRST GOTBOT +>;MPC + +MD,< MOVEM A,L1 + SKIPN TT,L2 + JRST FNDPN2 + JRST GOTBOT + +NOTN1: CAME T,N2 + JRST FNDPN2 + MOVEM A,L2 + SKIPN TT,L1 + JRST FNDPN2 + JRST GOTBOT +>;MD + +FNDPN2: FETCH(B,B,BPLNK) + JUMPN B,FNDPN1 + OUTSTR[ASCIZ/CAN'T FIND BOTH PINS ON THIS BODY! +/] + POPJ P, + +GOTBOT: +MPC,< HRRZ T,L1 + FETCH(T,T,BPBIT) + HRRZ TT,L2 + FETCH(TT,TT,BPBIT) + EQV TT,T + TRNN TT,FRONT ;IF NOT ON SAME SIDE + MOVSS L1 ;MAKE THEM SUCH + PUSHJ P,SWPPIN + MOVSS L1 + MOVSS L2 + PUSHJ P,SWPPIN + MOVE A,CURBOD + PUSHJ P,BODFIX ;FIX BODY PINS + TRO MCHG!NEEDCL + POPJ P, +>;MPC +SWPPIN: MOVE T,L1 ;FIRST POINT + FETCH(TT,T,BPPN) + MOVE TTT,L2 ;SECOND POINT + FETCH(A,TTT,BPPN) +MD,< TRNE TFLG ;JUST CHANGING NUMBERS? + JRST PNCHNG +>;MD + STORE(A,T,BPPN) + STORE(TT,TTT,BPPN) ;PIN #'S STAY WITH ID'S IN CASE BUSSED THROUGH + FETCH(TT,T,BPLOC) + FETCH(A,TTT,BPLOC) + STORE(A,T,BPLOC) + STORE(TT,TTT,BPLOC) +MPC,< POPJ P, > +MD,< MOVE A,CURBOD + PUSHJ P,BODFIX ;FIX BODY PINS + MOVE A,L1 ;AND MOVE RESULTS + FETCH(TT,A,BPXY) + PUSHJ P,PMOVX + PUSHJ P,PMOVY + MOVE A,L2 + FETCH(TT,A,BPXY) + PUSHJ P,PMOVX + PUSHJ P,PMOVY + TRO MCHG!NEEDCL + POPJ P, + +PNCHNG: PUSH P,TT ;NEW NAME FOR PIN #2 + PUSH P,TTT ;PIN #2 + EXCH T,A ;SO THAT T = PIN#1, A = NEW PIN NAME + PUSHJ P,STPNN1 ;SPREAD PIN# OVER NEW ID (SECOND) + POP P,A + POP P,T + TRO MCHG + JRST STPNN1 ;AND FIRST ONE +>;MD + ;SAVE AND RESTORE FLAG REGISTER M +PUSHM: MOVE H,M ;SAVE COPY OF LH M + HRR H,0 ;AND RH 0 +MD,< TLZE M,PINIDS!PLOCS ;TURN OFF PINS + TRO MCHG + TLON M,RPINID + TRO MCHG +>;MD +MPC,< TLON M,PLOCS ;TURN ON PINS + TRO MCHG +>;MD + POPJ P, + +POPME: PUSHJ P,POPM + JRST PERRET + +POPM: +MD,< TRNN H,TFLG + TRZA TFLG + TRO TFLG + TLNE H,PINIDS + TLOA M,PINIDS + CAIA + TRO MCHG + TLNE H,PLOCS + TLOA M,PLOCS + CAIA + TRO MCHG + TLNN H,RPINID + TLZA M,RPINID +>;MD +MPC,< TLNN H,PLOCS + TLZA M,PLOCS +>;MPC + POPJ P, + TRO MCHG + POPJ P, + +READP: +MD,< PUSHJ P,READN > +MPC,< MOVE C,[PUSHJ P,GETLCH] + MOVEM C,GTCHRX + PUSHJ P,RPNAM + JRST CPOPJ1 +>;MPC + CAIE C,12 + JRST SCARF + MOVE B,T + JRST CPOPJ2 + SUBTTL PLACE A BODY +BODPLC: TRNE INMOV + JRST PERRET +MD,< MOVEI T,[ASCIZ/TYPE BODY NAME +/] > + PUSHJ P,BODYGT ;GET BODY NAME & POINTER + POPJ P, ;ALTMODE + POPJ P, ;NULL + JRST OOPS1 ;NX + TRZ INMOV + MOVEM A,CURBOD ;SAVE POINTER TO TYPE + SETZM CURORT ;ZERO ORIENTATION + PUSHJ P,BPYES ;PLANT BODY + MOVE T,LSTBOD + PUSHJ P,SCLOSE + MOVE A,CLOSES + JRST BMOVEP ;START MOVING NEW BODY + +;BPYES - PLANT BODY +;CURBOD = TYPE +;HSHFLG = 1 IF IN HASH BUCKET, ELSE JUST ON LIST + +BPYESF: AOSA HSHFLG +BPYES: SETZM HSHFLG + MOVE A,CURBOD ;GET POINTER TO TYPE + MOVEI T,BODM + PUSHJ P,CHNGMD ;GO BACK TO BODY MODE + TRO MCHG + PUSHJ P,MAKBDY ;GET BODY BLOCK IN B + MOVEM B,LSTBOD ;SAVE POINTER + AOS F,BID ;GET A UNIQUE BODY ID + SKIPE HSHFLG + JRST BPYES1 + MOVEI D,DBODPN + HRLM D,LSTBOD ;FOR CONSISTANCY SAKE + MOVE D,DBODPN ;GET BODY LIST POINTER + STORE (D,B,BNXT) ;PUT NEW ONE IN THE LIST + MOVEM B,DBODPN ;... +BPYES1: MOVE T,CURSE ;GET CURSOR POSITION + TDZ T,[1,,1] ;FOO ON INPUT! + STORE (T,B,BXY) ;STORE AS CENTER OF BODY + STORE (F,B,BID) + STORE (A,B,BTYP) ;DEPOSIT POINTER TO TYPE DEFINITION + MOVE F,CURORT ;GET ORIENTAION +MD,< ANDI F,7 > +MPC,< ANDI F,3 > + STORE (F,B,BORI) ;STORE ORIENTATION +;Now create all the POINTS on the BODY +MD,< + FETCH (A,A,TPIN) ;GET PIN/LOC LIST FROM TYPE + JUMPE A,CPOPJ + MOVEI C,RADDR(B,BLNK,BPLNK) ;LINK IN HERE + HRLI B,ISPIN +BLOPP1: FETCH(T,A,TPXY) ;POINT X,Y IN DEF + PUSHJ P,ORIENT + ADJUST(ADD,T,CURSE) ;TO BODY CENTER + PUSH P,T + PUSHJ P,PUTPNT ;CREATE THE POINT + POP P,T + STORE(T,D,BPXY) ;SET X,Y + STORE(D,C,BPLNK) ;ADD TO BODY POINT LIST + MOVE C,D + FETCH(A,A,TPNX) ;GET TO NEXT PIN + JUMPN A,BLOPP1 ;LOOP IF SOME LEFT + POPJ P, +>;MD +MPC,< + FETCH (A,A,TPIN) ;GET POINTER TO PINS + MOVEI C,RADDR(B,BLNK,BPLNK) + PUSH P,A + PUSHJ P,BLOPP2 + SWITCH + POP P,A + PUSHJ P,BLOPP2 + SWITCH + MOVEI T,ANGLPG + JRST HYDPOG + +BLOPP2: JUMPE A,CPOPJ ;NONE? + HRLI B,ISPIN ;ISPIN,,BODY +BLOPP1: FETCH(T,A,TPXY) + PUSHJ P,ORIENT + ADJUST(ADD,T,CURSE) ;TO BODY CENTER + PUSH P,T + PUSHJ P,PUTPNT ;CREATE THE POINT (TYPIN IN A) + POP P,T + STORE(T,D,BPXY) ;SET X,Y + FETCH(TT,A,TPID) ;PIN # FROM DEF + MOVEI T,1 ;INITIALLY USE NORMAL PAD FOR PIN + CAIN TT,1 ;PIN 1? + MOVEI T,3 ;MAKE IT END UP PAD TYPE 3 (SQUARE) + STORE(T,D,BPPN) + STORE(D,C,BPLNK) ;LINK ONTO END OF BODY'S POINTS + MOVE C,D + FETCH(A,A,TPNX) + JUMPN A,BLOPP1 ;LOOP IF SOME LEFT + POPJ P, +>;MPC + SUBTTL MAKE BODY + +;CONSTRUCT A BODY BLOCK, RETURN POINTER IN B + +MAKBDY: PUSH P,A + GETBLK (B,BODY) + BCLEAR (A,B,BODY) ;JUST TO MAKE SURE + MOVEI A,V.BORI(B) ;SETUP DUMMY POINTERS + STORE (A,B,BOD1) + MOVEI A,V.BID(B) + STORE (A,B,BOD2) +MD,< MOVEI A,V.BBRS(B) + STORE(A,B,BOD3) +>;MD + JRST POPAJ + + SUBTTL BODY AND DIP NAME STUFF SUBRS +MD,< +STODIP: PUSHJ P,GETCLS + JRST PERRET + FETCH(A,A,BTYP) +STTDIP: PUSHJ P,FNDIPT + TDZA T,T + FETCH(T,T,TXVAL) + JRST STODEF + +STONAM: PUSHJ P,GETCLS + JRST PERRET + FETCH(A,A,BTYP) +STTNAM: FETCH(T,A,TNAM) +STODEF: PUSHJ P,SETTT + JUMPE T,ITSTUF + JRST STOTX0 +>;MD +MPC,< +STODIP: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,BNAM) ;DIP TYPE POINTER +STODEF: PUSHJ P,SETTT + JUMPE T,ITSTUF + JRST STOTX0 + +STONAM: PUSHJ P,GETCLS + JRST PERRET + FETCH(D,A,BTYP) + PUSHJ P,SETTT + PUSHJ P,STFNAM + JRST ITSTUF + +STFNAM: FETCH(B,D,TNAM) ;# OF PADS + PUSHJ P,PUTTTN + FETCH(T,D,TNAM) + CAIE T,2 ;2 PIN DIP? + POPJ P, + PUTBYT 12 ;YES, GIVE SEPARATION + FETCH(T,D,TPIN) + FETCH(B,T,TPY) ;Y OF PIN1 + FETCH(T,T,TPNX) + FETCH(C,T,TPY) ;Y OF PIN2 + SUB B,C + MOVMS B + IMULI B,5 ;5 MILS PER POINT + ASH B,-1 + JRST PUTTTN +>;MPC + SUBTTL COPY PINIDS TO PIN #'S -- TRANSPOSE -- BROT -- BODFIX +MD,< +BPINS: PUSHJ P,GETCLS + JRST PERRET +BPINS0: FETCH(A,A,BLNK) ;DEFAULT ALL PINS ON BODY + JUMPE A,CPOPJ + TLNE M,PLOCS + TRO MCHG +BPINS1: FETCH(B,A,BPLOC) ;PIN IN TYPE DEF + FETCH(T,B,TPNAM) ;DEFAULT PIN NAME + STORE(T,A,BPPN) + FETCH(A,A,BPLNK) + JUMPN A,BPINS1 + POPJ P, + +;SET ALL DIP PIN NUMBERS (SETPINS) +BPINSA: SKIPN C,DBODPN + JRST PERRET +BPNSA1: MOVE A,C + PUSHJ P,BPINS0 + FETCH(C,C,BNXT) + JUMPN C,BPNSA1 + POPJ P, + +;CLEAR ALL DIP PIN NUMBERS (-SETPINS) +PINZ: SKIPN A,PONPNT + POPJ P, + TRO MCHG +PINZ1: FETCH(T,A,BPBIT) + TRNE T,ISPIN + CLEAR(A,BPPN) + FETCH(A,A,BPNXT) + JUMPN A,PINZ1 + POPJ P, + +NIL,< +;TRANSPOSE PIN NUMBERS FROM 14 PIN DIP TO 16 PIN SOCKET +;FOR "L" 12,1415 FOR "R" 11,1416 +TRANSPOSE: + PUSHJ P,GETCLS + JRST PERRET + PUSHJ P,GETLR + JRST PERRET +GOTPOF: HLRZ B,(A) + HLRZ B,1(B) + MOVE T,1(B) + TLZ T,L1416!R1416 + TDO T,C + MOVEM T,1(B) + TRO MCHG + POPJ P, + +GETLR: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/L, R, OR ?/] + PUSHJ P,GETCHR + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +/] + CAIE C,"L" + JRST CKR + MOVSI C,L1416 + JRST CPOPJ1 + +CKR: CAIE C,"R" + JRST CHKCR + MOVSI C,R1416 + JRST CPOPJ1 + +CHKCR: CAIE C,12 + POPJ P, + SETZ C, ;LET HIM CLEAR BITS + JRST CPOPJ1 +>;NIL + ;TRANSPOSE ALL BODIES OF A CERTAIN NAME +NIL,< +TRANALL: + MOVEI T,[ASCIZ/NAME OF BODY TO TRANSPOSE?/] + PUSHJ P,BODYGT + POPJ P, ;ALTMODE + POPJ P, ;NULL + JRST OOPS1 + PUSHJ P,GETLR + JRST PERRET + MOVEM A,DY1 ;STUFF AWAY HERE FOR NOW + SKIPN A,DBODPN + POPJ P, ;NOTHING TO DO +TRANA1: HLRZ T,(A) + HRRZ T,1(T) + CAMN T,DY1 ;SAME BODY? + PUSHJ P,GOTPOF ;YES + HRRZ A,(A) + JUMPN A,TRANA1 + POPJ P, +>;NIL +>;MD + +BROT: TRNE INMOV + JRST [ MOVE A,CLOSES + JRST BROTA] + PUSHJ P,GETCLS + JRST PERRET +BROTA: FETCH(T,A,BORI) + ADDI T,1 +MD,< ANDI T,7 > +MPC,< ANDI T,3 > + STORE(T,A,BORI) + TRO MCHG +MD,< FETCH(B,A,BLOC) ;ANY LOC SET ? + JUMPE B,BROTB + MOVE F,BLCROT(T) ;GET PROPER ROTATION NUMBER FROM TABLE + FETCH(T,A,BLXY) + PUSHJ P,ORIENT + STORE(T,A,BLXY) +BROTB: +>;MD + PUSHJ P,BODFIX +MD,< JRST STRAIGHTEN ;GO FIX THE WORLD NOW> +MPC,< POPJ P,> + +MD,< +BLCROT: 7 ;7 - 0 + 1 ;0 - 1 + 1 ;1 - 2 + 1 ;2 - 3 + 7 ;3 - 4 + 1 ;4 - 5 + 1 ;5 - 6 + 1 ;6 - 7 +>;MD + +;CALL WITH POINTER TO BODY IN A +BODFIX: FETCH(B,A,BLNK) + JUMPE B,CPOPJ + FETCH(D,A,BXY) + FETCH(F,A,BORI) +BODFX2: FETCH(T,B,BPLOC) + FETCH(T,T,TPXY) + PUSHJ P,ORIENT + ADJUST(ADD,T,D) +MPC,< STORE(T,B,BPXY) > +MD,< PUSH P,A + PUSH P,F + MOVE A,B ;POINTER TO POINT MUST BE IN A + PUSHJ P,PMOVRL + POP P,F + POP P,A +>;MD +BODFX1: FETCH(B,B,BPLNK) + JUMPN B,BODFX2 + POPJ P, + ;GET PIN #'S FROM DIP DEF FILE +MD,< +SETSEC: PUSHJ P,GETCLS + JRST PERRET + PUSHJ P,GETDEF ;GET DEFINITION FROM DIPS.DIP + POPJ P, ;LOSE +SECAGN: TLNE M,DSKACT!MACACT + JRST SETSCP + OUTSTR[ASCIZ/SECTION # (0-/] + FETCH(T,H,DDMAX) ;GET # OF SECTIONS + PUSHJ P,DECOUT + OUTSTR[ASCIZ/)?/] +SETSCP: PUSHJ P,READN + CAIN C,ALTMOD + POPJ P, ;LET HIM OUT ON ALTMODE + CAIE C,12 + JRST [ PUSHJ P,INNERR + JRST SECAGN] + ;Enter here with sec# in T after having called GETDEF +;FALLS THRU +SETSCN: FETCH(TT,H,DDMAX) + CAMLE T,TT + JRST [ OUTSTR[ASCIZ/SECTION # TOO LARGE! +/] + JRST SECAGN] + MOVE B,T ;SAVE SEC # + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR ;WHERE TO OUTPUT PIN NAME + MOVE D,TYPE ;BODY + MOVEI D,RADDR(D,BLNK,BPLNK) + JRST SETSC4 + +SETSC7: FETCH(A,D,BPLOC) + FETCH(A,A,TPNAM) + MOVEI TTT,RADDR(H,DDNXT,DPNXT) ;PREPARE TO SEARCH DEF LIST +STSC10: FETCH(TTT,TTT,DPNXT) ;DEFINITION MAKER MADE SURE THERE WERE ENOUGH PINS + JUMPE TTT,[STORE(A,D,BPPN) ;USE DEFAULT PIN NAME + TRO MCHG + TLNE M,DSKACT!MACACT + JRST SETSC4 + OUTSTR[ASCIZ/DEFAULT PIN /] + PUSHJ P,BPINPN ;PRINT AS BODY PIN + OUTSTR[ASCIZ/ DOES NOT EXIST ON THIS DIP. +WILL USE DEFAULT PIN NAME. +/] + JRST SETSC4] + FETCH(T,TTT,DPNM) + CAME T,A ;CORRECT PIN NAME? + JRST STSC10 ;NO, KEEP LOOKING + FETCH(T,TTT,DPPIN) ;SECTION PIN NAME + JUMPE T,[STORE(A,D,BPPN) ;USE DEFAULT PIN NAME + TRO MCHG + TLNE M,DSKACT!MACACT + JRST SETSC4 + OUTSTR[ASCIZ/DEFAULT PIN /] + PUSHJ P,BPINPN ;PRINT AS BODY PIN + OUTSTR[ASCIZ/, NO SECTION INFO, USING AS PIN #. +/] + JRST SETSC4] + FETCH(E,H,DDNXT) ;NOW FIND SAME PIN SECT # WITH CORRECT SECT BITS +SETSC5: FETCH(TTT,E,DPPIN) ;GET SECT PIN # + CAME T,TTT ;SAME AS OURS? + JRST SETSC6 ;NO + MOVN TTT,B ;GET NEG OF DESIRED SECTION + MOVEI TT,400000 ;GET BIT FOR SECTION 0 + LSH TT,(TTT) ;POSITION TO CORRECT SECTION + FETCH(TTT,E,DPSEC) ;IN THIS SECTION? + TDNE TT,TTT ;TEST FOR THAT SECTION ON THIS PIN + JRST [ FETCH(TT,E,DPNM) ;YES, GET PIN NAME + STORE(TT,D,BPPN) ;AND STORE FOR THIS PIN + TRO MCHG ;THIS CHANGES THINGS + JRST SETSC4] ;TRY ANOTHER PIN +SETSC6: FETCH(E,E,DPNXT) + JUMPN E,SETSC5 + OUTSTR[ASCIZ/DEFAULT PIN /] + PUSHJ P,BPINPN ;PRINT AS BODY PIN + OUTSTR[ASCIZ/, NOT IN THIS SECTION. +/] +SETSC4: FETCH(D,D,BPLNK) + JUMPN D,SETSC7 + POPJ P, + + ;GETDEF - GET BODY DEF FROM DIPS.DIP FILE + +SKPBDY: PUSHJ P,SKPBD2 ;SKIP PROPERTIES +SKPBD1: PUSHJ P,WORDIN ;SKIP PIN NAME + PUSHJ P,SKPSOM ;SKIP REG STUFF + PUSHJ P,WORDIN ;SKIP SECTS,,SECT PIN # + SOJG D,SKPBD1 ;SKIP THEM ALL + JRST SETSC1 + +SKPBD2: PUSHJ P,SKPSTR ;SKIP PACKAGE NAME + JFCL +SKPBD3: PUSHJ P,SKPSTR ;SKIP ALL PROPERTY NAMES + CAIA + JRST SKPBD3 + +; NOW SKIP RECURSIVELY NESTED + + MOVEI A,1 ;DEPTH +SKPTRE: PUSHJ P,SKPSTR + JRST [ SOJG A,SKPTRE + POPJ P,] + PUSHJ P,WORDIN ;SKIP VALUE BITS + AOJA A,SKPTRE + +SKPSOM: PUSHJ P,WORDIN ;BITS,,PS# + PUSHJ P,WORDIN ;HI,,LOW LOADING + JRST WORDIN ;USE + + ;GETDEF - GET DIPDEF LIST FROM DIPS.DIP FILE +;A = BODY POINTER +;SETS UP DIP DEF TABLE, SKIP RETURNS IF ALL OK +;H = DIPDEF LIST PTR + +GETDEF: HRRZM A,TYPE ;STORE BODY POINTER HERE +GETDF1: FETCH(H,A,BDEF) ;ALREADY IN? + JUMPN H,CPOPJ1 + FETCH(H,A,BTYP) ;MAYBE ON TYPE + FETCH(H,H,TDEF) + JUMPN H,CPOPJ1 + PUSHJ P,FNDDIP + JRST [OUTSTR [ASCIZ /NO DIPTYPE ON BODY!! +/] + POPJ P,] + GETBLK(H,GETDIP) ;PUT THIS BODY ON INPUT LIST + CLEAR(H,GNXT) + STORE(A,H,GBDY) + CLEAR(H,GFLAG) ;MARK AS BODY + JUMPGE T,GETDF2 ;DIPTYPE WAS ON BODY + FETCH(A,A,BTYP) ;FOUND DIPTYPE ON TYPE? + STORE(A,H,GBDY) + STOREL(T,H,GFLAG) ;THIS STUFF IS FOR TYPE +GETDF2: FETCH(T,T,TXVAL) ;VALUE OF "DIPTYPE" + STORE(T,H,GDIP) + MOVEM H,GETLST + PUSHJ P,DIPIN ;READ DIPDEF AND PACKAGE PROPS + JFCL + MOVE A,TYPE + FETCH(H,A,BDEF) ;ALREADY IN? + JUMPN H,CPOPJ1 + FETCH(H,A,BTYP) ;MAYBE ON TYPE + FETCH(H,H,TDEF) + JUMPN H,CPOPJ1 + POPJ P, + + ;INDIP - READIN PACKAGE AND DIPDEF STUFF FOR ALL TYPES + +INDIP: SETZ H, ;LIST OF TYPES TO READIN + SKIPN G,BODPNT ;BODIES + POPJ P, +INDIP1: FETCH(T,G,TYP1) ;USED? + JUMPE T,INDIP9 + MOVE A,G + PUSHJ P,FNDIPT ;ANY DIPTYPE? + JRST INDIP9 + FETCH(T,T,TXVAL) ;THE DIPTYPE + FETCH(TT,T,TSASC) + CAMN TT,[ASCII /*/] ;FLUSH COMMENT DIPS + JRST INDIP9 + GETBLK(A,GETDIP) + STORE(G,A,GBDY) + STORE(T,A,GDIP) + MOVEI T,400000 + STORE(T,A,GFLAG) ;FLAG AS FROM TYPE + STORE(H,A,GNXT) + MOVE H,A +INDIP9: FETCH(G,G,TNXT) + JUMPN G,INDIP1 + MOVEM H,GETLST + PUSHJ P,DIPIN + JFCL + POPJ P, + +;DIPIN - READ DIPDEF AND PACKAGE STUFF FOR THIS LIST OF BODIES +;GETLST - LIST OF BODIES/TYPES TO GET FOR +;SKIPS IF GOT ALL THE BODIES +; (RECLAIMS GETLST AS IT GOES) +; PUTS DIPDEF LIST, PACKAGE CODE ON BODY IF IT HAD DIPTYPE, +; ELSE PUTS STUFF ON TYPE, COMPLAINS ABOUT UPDATING PACKAGE CODE +; ON LIBRARY TYPE. + +DIPIN: PUSHJ P,PUSHIT + PUSHJ P,DIPRED + JFCL +DIPIN3: SKIPN G,GETLST + JRST [ PUSHJ P,POPIT + JRST CPOPJ1] + OUTSTR [ASCIZ /NOT ALL DIPS FOUND! /] +DIPIN4: FETCH(T,G,GDIP) + PUSHJ P,OUTTXT + OUTSTR [ASCIZ /, /] + FETCH(G,G,GNXT) + JUMPN G,DIPIN4 + OUTSTR [ASCIZ / +/] + MOVE B,GETLST + PUSHJ P,PUTFS + PUSHJ P,POPIT + POPJ P, + + ;DIPMAP - SET THE NAME OF THE DIPS.DIP FILE TO USE + +STORAGE(IMPURE) +DIPFNM: 0 +DIPEXT: 0 +DIPPPN: 0 +STORAGE(PURE) + +CLRDPF: SETZM DIPFNM + POPJ P, + +SETDIP: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/New DIPs /] + MOVSI T,EXTDIP + PUSHJ P,SETNAM + POPJ P, + ENTPPN + MOVE B,FILNAM + MOVEM B,DIPFNM + HLLZ C,FILEXT + MOVEM C,DIPEXT + MOVE D,FILPPN + MOVEM D,DIPPPN + POPJ P, + +;DIPRED - READ A DIP DEF LIST FROM DIPS.DIP FILE +;GETLST = LIST OF BODIES/TYPES (AND THEIR DIPTYPES) TO SEARCH FOR +;SKIPS IF DIPS.DIP FILE FOUND OK +; (REMOVES ENTRIES ON GETLST AS IT FINDS THEM) +; (CHECKS FOR UPDATING PACKAGE CODE ON LIBRARY TYPES) + +DIPRED: MOVEM P,PERRSAV ;RETURN UP FROM HERE + INIT DAT,10 + 'DSK ' + IOHD + JRST [ OUTSTR [ASCIZ/CAN'T GET DISK! +/] + JRST SECLEV] + MOVEI T,IOBUF ;USE COMPILED IN BUFFER + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + SKIPN T,DIPFNM ;ANY MAPPING SET? + MOVE T,['NDIPS '] ;NO, USE DEFAULT + MOVEM T,FILNAM + MOVSI T,EXTDIP + SKIPE DIPFNM + HLLZ T,DIPEXT + MOVEM T,FILEXT + SETZB T,FILDAT +NODEC,< +NOSTAN,< + DSKPPN T, ;TRY HIS PPN FIRST + TLOA A,400000 +>;NOSTAN +>;NODEC + SKIPE DIPFNM + MOVE T,DIPPPN +DIPRD2: MOVE T,LIBPPN + MOVEM T,FILPPN +DIPRD: TLNE M,DSKACT!MACACT + JRST DIPRD1 + OUTSTR [ASCIZ/READING /] + PUSH P,A + HRRI A,FILNAM + JSR FPRINT + POP P,A + OUTSTR[ASCIZ/ +/] +DIPRD1: MOVE T,FILPPN + LOOKUP DAT,FILNAM + JRST [ PUSHJ P,LOOKER +NODEC,< TLZE A,400000 ;WAS THIS LIBRARY? + JRST DIPRD2 ;NO, TRY LIBRARY +>;NODEC + OUTSTR[ASCIZ/TRY ANOTHER DIPS.DIP FILE /] + MOVSI T,EXTDIP + PUSHJ P,SETNAM + JRST SECLEV + SETZ A, + JRST DIPRD] +DEC,< JSR DAT,LOOKCK > + MOVEM T,FILPPN + PUSHJ P,WORDIN + MOVN TTT,TTT + CAIE TTT,DIPVER ;CORRECT VERSION? + JRST [ OUTSTR[ASCIZ/WRONG VERSION DIP DEFINITION FILE. +/] + JRST SECLEV] +;Scan thru file, inputing dips on GETLST +SETSC1: SKIPN G,GETLST ;STUFF TO GET FOR + JRST SECWIN + PUSHJ P,WORDIN + JUMPE TTT,SECWIN ;DONE! + MOVE D,TTT ;SAVE # OF PINS HERE + PUSHJ P,RSTR ;NEXT DIP NAME + JFCL + MOVEM T,TYPNAM +SETSE2: MOVE A,TYPNAM + FETCH(B,G,GDIP) + JUMPE B,SETSE1 ;DIDN'T HAVE DIPTYPE + PUSHJ P,TXTMAT + CAIA + JRST SETSC0 ;THIS IS THE DIP WE'RE GETTING FOR +SETSE1: FETCH(G,G,GNXT) + JUMPN G,SETSE2 + MOVE B,TYPNAM ;THIS ISN'T ONE WE'RE LOOKING FOR + PUSHJ P,PUTFS ;RETURN DIP TYPE + JRST SKPBDY ; SKIP THIS ONE + +SETSC0: GETBLK(H,DDEF) + STORE(D,H,DDNPN) ;SAVE # PINS DEFINED + CLEAR(H,DDMAX) ;MAX SEC # + PUSHJ P,RSTR ;GET PACKAGE NAME + JFCL + MOVEM T,PKGTEM + MOVEI E,RADDR(H,DDNXT,DPNXT) + PUSHJ P,SKPBD3 ;SKIP PROP STUFF +SETSC2: PUSHJ P,WORDIN ;PIN NAME + PUSH P,TTT + PUSHJ P,SKPSOM ;SKIP BORING STUFF + PUSHJ P,WORDIN ;SECT BITS,,SECT PIN # + GETBLK(T,DIPDEF) + STORE(T,E,DPNXT) + CLEAR(T,DPNXT) + MOVE E,T + POP P,T + STORE(T,E,DPNM) + STORE(TTT,E,DPPIN) + HLRZ T,TTT + STORE(T,E,DPSEC) + HLLZS TT,TTT + SUBI TT,1 + XOR TT,TTT + JFFO TT,SETSC8 ;THIS FINDS RIGHTMOST BIT FROM TTT + JRST SETSC3 ;NO BITS + +SETSC8: FETCH(T,H,DDMAX) + CAMLE TTT,T + STORE(TTT,H,DDMAX) ;STORE MAX SO FAR! +SETSC3: SOJG D,SETSC2 + MOVEM H,DEFLST + SETZM PKGCOD + SKIPN T,PKGTEM ;ANY PACKAGE PROP? + JRST SECPT1 + PUSHJ P,MATPAK ;LOOKUP PACKAGE TYPE + JRST [ OUTSTR [ASCIZ /PACKAGE TYPE I DON'T KNOW ABOUT!! /] + MOVE T,PKGTEM + PUSHJ P,OUTTCR + JRST SECPT1] + MOVEM A,PKGCOD +SECPT1: MOVEI G,GETLST-V.GNXT +SECPT0: MOVE H,G ;SAVE BACK POINTER + FETCH(G,G,GNXT) + JUMPE G,SECPT9 + FETCH(A,G,GDIP) ;UPDATE ALL TYPES/BODIES WITH THIS DIPTYPE + MOVE B,TYPNAM + PUSHJ P,TXTMAT + JRST SECPT0 +;store DIPDEF list on TYPE/BODY, check package code + FETCH(A,G,GFBDY) ;FLAG AND BODY/TYPE POINTER + MOVE B,DEFLST ;SETUP DIP DEF LIST IN ALL + MOVE C,PKGCOD + JUMPL A,SECPTT ;STUFF GOES ON TYPE + PUSHJ P,COPDEF ;MAKE COPY OF DIPDEF LIST + STORE(B,A,BDEF) + FETCH(T,A,BPAK) + CAMN C,T ;CHANGE PACKAGE? + JRST SECPT2 ;THIS GETLST ENTRY SATISFIED, DELETE + STORE(C,A,BPAK) + MOVEI T,CPAKAG + PUSHJ P,RECMPB ;YES, BUT MIGHT BE SUPERCEEDED BY EXPLICIT PROP + TRO MCHG + JRST SECPT2 ;THIS GETLST ENTRY SATISFIED, DELETE + +SECPTT: PUSHJ P,COPDEF + STORE(B,A,TDEF) + FETCH(T,A,TPAK) + CAMN C,T ;CHANGE PACKAGE? + JRST SECPT2 + FETCH(TT,A,TLIB) ;LIBRARY BODY? + SKIPN MODLIB + JUMPN TT,[OUTSTR [ASCIZ /PACKAGE WRONG ON LIBRARY BODY! /] + FETCH(T,A,TNAM) + PUSHJ P,OUTTCR + JRST SECPT2] + STORE(C,A,TPAK) + MOVEI T,CPAKAG + PUSHJ P,RECMPT ;BUT MIGHT HAVE EXPLICIT PACKAGE + TRO MCHG + FETCH(T,A,TPAK) + CAMN T,C + JRST SECPT2 + OUTSTR [ASCIZ /TYPE HAS DIFFERENT PACKAGE THAN DIPS.DIP! /] + FETCH(T,A,TNAM) + PUSHJ P,OUTTXT +SECPT2: FETCH(T,G,GNXT) + STORE(T,H,GNXT) + RETBLK(G,GETDIP) + MOVE G,H ;BACKUP + JRST SECPT0 + +SECPT9: MOVE B,TYPNAM + PUSHJ P,PUTFS + MOVE B,PKGTEM + PUSHJ P,PUTFS + MOVE B,DEFLST + PUSHJ P,PUTFS + JRST SETSC1 ;GET SOME MORE DIPS + +SECWIN: RELEASE DAT, ;RELEASE DEF FILE + JRST CPOPJ1 ;GIVE WIN RETURN + +SECLEV: RELEASE DAT, + POPJ P, + ;DDFREL - RECLAIM DIP DEF LIST +;C = DIP DEF LIST + +DDFREL: JUMPE C,CPOPJ + FETCH(T,C,DDNXT) + RETBLK(C,DDEF) +DDFRL1: JUMPE T,CPOPJ + MOVE C,T + FETCH(T,T,DPNXT) + RETBLK(C,DIPDEF) + JRST DDFRL1 + +;COPDEF - COPY DIPDEF LIST +;B = LIST + +COPDEF: JUMPE B,CPOPJ + PUSH P,C + PUSH P,D + GETBLK(C,DDEF) + FETCH(T,B,DDNPN) + STORE(T,C,DDNPN) + FETCH(T,B,DDMAX) + STORE(T,C,DDMAX) + MOVEI D,RADDR(C,DDNXT,DPNXT) +COPDF1: FETCH(B,B,DPNXT) + JUMPE B,COPDF2 + MOVE T,D + GETBLK(D,DIPDEF) + STORE(D,T,DPNXT) + FOR I IN (DPNM,DPSEC,DPPIN) +< FETCH(T,B,I) + STORE(T,D,I) +> + JRST COPDF1 + +COPDF2: CLEAR(D,DPNXT) + MOVE B,C + POP P,D + POP P,C + POPJ P, + +>;MD + SUBTTL SET BODY LOCATION +BNUMS: PUSHJ P,GETCLS + JRST PERRET + MOVEM A,CURBOD + MOVE T,[PUSHJ P,GETLCH] + MOVEM T,GTCHRX + TLNE M,DSKACT!MACACT + JRST BNUMS1 + OUTSTR [ASCIZ / Body location as "/] + OUTSTR @BODCUE + OUTSTR [ASCIZ /"? /] +BNUMS1: PUSHJ P,GTSLTL + JRST INNERR + JRST [ CAIE C,12 + JRST INNERR +MPC,< MOVE A,CURBOD + CLEAR(A,BLN) ;CLEAR LOCN + TRO MCHG + POPJ P, ] +>;MPC +MD,< MOVE A,CURBOD + FETCH(B,A,BLOC) + JUMPE B,CPOPJ + CLEAR(A,BLOC) + FETCH (T,A,BBIT) + TRO T,FIXLOC!FIXBLO + STORE (T,A,BBIT) + TLNE M,BLOCS + TRO MCHG + TRNE TMOVE!LMOVE ;IF WE WERE MOVING OFFSET, + TRZN INMOV ;THEN STOP AND FIND CLOSEST AGAIN + POPJ P, + TRO NEEDCL + POPJ P, ] +MD,< JFCL > ;WE DON'T CARE IF THERE WAS A BRS OR NOT + SETO T, ;ASSUME NO SEC STUFF + CAIE C,"-" ;SETTING SECTION #? + JRST SECNUM + PUSHJ P,GETLIN ;YES, GET IT + CAIL C,"A" + CAILE C,"Z" + JRST [ CAIL C,"0" ;ACCEPT NUMERIC SECTIONS TOO! + CAILE C,"9" + JRST INNERR + PUSHJ P,CREADN + JRST SECNUM ] + MOVEI T,-"A"(C) + PUSHJ P,GETLIN +SECNUM: MOVEM T,NUMBER ;SAVE SECTION # HERE +>;MD + CAIE C,12 ;NOW IT MUST BE A LF + JRST INNERR +MD,< MOVE TT,LETTER + TLNE TT,-1 + SKIPN T,CRDLOC + JRST NOGLOB + XOR T,TT + TLNE T,-1 + JRST [ OUTSTR[ASCIZ/SORRY, CAN'T CHANGE CARD LOC WHILE GLOBAL CARD LOC IS IN FORCE! +/] + JRST CHKSCN] ;GO CHECK SECTION ANYWAY + HRRZS LETTER +NOGLOB: +>;MD + ;FALLS THRU - PC + +MPC,< MOVE T,LETTER + STORE(T,A,BLN) ;STORE IT +>;MPC +MD,< FETCH(B,A,BLOC) + JUMPN B,GTNMBK ;DO WE HAVE A BLOCK ALREADY? + MOVEI B,-1+ADDR(A,BLXY) ;NO + STORE(B,A,BLOC) ;MARK AS LOCN SET + CLEAR(A,BLO) ;CLEAR CHARACTER OFFSET + FETCH(TT,A,BBIT) + TRO TT,FIXBLO ;DEFAULT IS RECENTER LOCATION TEXT + STORE(TT,A,BBIT) + PUSHJ P,STLCOF ;SET LOCATION OFFSET FROM TYPE DEF +GTNMBK: HLRZ T,LETTER + STORE(T,A,BBRS) ;SET BAY-RACK-SLOT + HRRZ T,LETTER + STORE(T,A,BSOC) ;SET SOCKET + MOVE T,CURBOD ;SETUP T FOR OFFBLO + PUSHJ P,OFFBLO ;CHECK FOR RECALC CHAR OFFSET +>;MD + TLNE M,BLOCS + TRO MCHG +MPC,< POPJ P, > +MD,< +CHKSCN: SKIPGE NUMBER ;ANY SECTION #? + POPJ P, + MOVE A,CURBOD + PUSHJ P,GETDEF + POPJ P, ;LOSE + MOVE T,NUMBER + JRST SETSCN ;TRY TO SET SECTION! + + ;OFFSET BODY LOCNS + +OFFLOC: SKIPN H,DBODPN + POPJ P, +OFFLC1: HRRZ A,H + FETCH(B,A,BLOC) ;ANY LOC SET?? + JUMPE B,OFFLC2 ;ANY? + PUSHJ P,STLCOF ;YES, SET TO FOLLOW DEFINITION + SETBIT(FIXBLO,TT,H,BBIT) ;CAUSE LOC TEXT TO BE AUTO CENTERED + MOVE T,H + PUSHJ P,OFFBLO ;OFFSET TEXT MAYBE +OFFLC2: HRRZ H,(H) + JUMPN H,OFFLC1 + TLNE M,BLOCS + TRO MCHG + POPJ P, + +;RESET LOCATION OFFSET OF CLOSEST BODY TO DEFAULT +BLCOFF: PUSHJ P,GETCLS + JRST PERRET + MOVEM A,CURBOD ;SAVE BODY HERE FOR OFFBLO + FETCH(B,A,BLOC) ;ANY LOCN SET? + JUMPE B,CPOPJ ;LEAVE IF NONE + TLNE M,BLOCS + TRO MCHG + PUSHJ P,STLCOF ;SET OFFSET + HRRZ T,CURBOD + SETBIT(FIXBLO,TT,T,BBIT) ;AND DEFAULT IS AUTO CENTER + JRST OFFBLO + +;STLCOF - SET LOCN TEXT POSITION FROM TYPE DEFINITION +; A = BODY PTR +STLCOF: PUSH P,T + PUSH P,TT + FETCH(TT,A,BTYP) ;TYPE + FETCH(T,TT,TXY) ;DEFAULT LOCN TEXT X,Y + FETCH(F,A,BORI) ;ORIENTATION + PUSHJ P,ORIENT ;ADJUST T FOR ROTATION IN F + STORE(T,A,BLXY) ;SET LOCN TEXT X,Y + FETCH(T,A,BBIT) + TRO T,FIXLOC ;CONTINUE FIXING OFFSET LOCN + STORE(T,A,BBIT) + POP P,TT + POP P,T + POPJ P, + +>;MD + +STOBLC: PUSHJ P,GETCLS + JRST PERRET + MOVE B,A + PUSHJ P,SETTT +MD,< FETCH(D,B,BLOC) ;ANY LOC SET? + JUMPE D,ITSTUF + PUSH P,A + FETCH(A,B,BRSLOC) +>;MD +MPC,< FETCH(D,B,BLN) + JUMPE D,ITSTUF + PUSH P,A + MOVE A,D +>;MPC + PUSHJ P,SLTLPN + POP P,A + JRST ITSTUF + + ;BODY LOCATION OFFSET (D) + +MD,< +;RESET LOCATION OFFSET OF CLOSEST BODY TO DEFAULT +BLOOFF: PUSHJ P,GETCLS + JRST PERRET + FETCH(B,A,BLOC) ;ANY LOC SET? + JUMPE B,CPOPJ ;LEAVE IF NONE + SETBIT(FIXBLO,TT,A,BBIT) + MOVE T,A +;FALLS THRU +;OFFBLO - CHAR OFFSET FOR BODY LOCN TEXT +;T = POINTER TO BODY + +OFFBLO: FETCHL(TT,T,BBIT) + TLNN TT,FIXBLO + POPJ P, ;NOT BEING FIXED + TLNE M,BLOCS + TRO MCHG + TLNN TT,FIXLOC ;DON'T FOLLOW BODY DEF OFFSET UNLESS FOLLOWING BODY DEF LOC + JRST OFFBL1 + FETCH(TT,T,BTYP) + FETCH(TTT,TT,TYP3) ;CHARACTER OFFSET IN TYPE DEF? + JUMPE TTT,OFFBL1 ; NO + FETCH(TTT,TT,TOXY) + STORE(TTT,T,BLO) ;YES, USE IT + POPJ P, + +OFFBL1: SETZM CHRCNT + PUSH P,PUTCHR + PUSH P,T + MOVE TTT,[AOS CHRCNT] + MOVEM TTT,PUTCHR + FETCH(A,T,BRSLOC) ;B-R-S,,BSOC + PUSHJ P,SLTLPN + POP P,T + POP P,PUTCHR + MOVN A,CHRCNT + MOVE TTT,STDBIG + IMUL A,VIRPTX(TTT) + ASH A,-1 + STORE(A,T,BLOX) ;X PART OF OFFSET + MOVN A,VIRPTY(TTT) + ASH A,-1 + STORE(A,T,BLOY) + POPJ P, +>;MD + SUBTTL DELETE BODY +C2BDEL: SETOM PINLEV + PUSHJ P,GETCLS + POPJ P, + MOVE B,CLAST + TRO NEEDCL + JRST BCLR1 + +BODDEL: PUSHJ P,GETCLS ;ANY TO DELETE? + JRST PERRET ;NO + MOVE B,CLAST + TRO NEEDCL +BDELET: SETZM PINLEV +BCLR1: PUSH P,B ;SAVE LAST + TRZE INMOV ;TURN OFF MOVING + TRO NEEDCL +ROUTE,> ;MAKE HIM ROUTE AGAIN + PUSHJ P,REMBOD ;REMOVE BODY FROM ANY SETS + TRO TFLG!MCHG ;DELETE PINS + PUSH P,A ;SAVE THIS + SKIPN PINLEV ;LEAVING PINS AS POINTS? + JRST [ MOVEI B,PONPNT ;NO, DELETING + PUSHJ P,BODDLP ;DELETE ALL PINS WHICH POINT TO THIS BODY + MPC,< MOVEI B,PONPN2 + PUSHJ P,BODDLP + >;MPC + JRST BODDLE] ;NOW GIVE BACK BODY + FETCH(B,A,BLNK) + JUMPE B,BODDLE +BODDL2: FETCH(A,B,BPLNK) + PUSHJ P,PINPNT ;CHANGE BPIN INTO POINT !!! + MOVE B,A +BODDL1: JUMPN B,BODDL2 +BODDLE: POP P,A ;HERE WE GIVE BACK THE BODY + FETCH(F,A,BNXT) ;GET POINTER TO NEXT BODY + POP P,B ;RESTORE LAST POINTER + STORE(F,B,BNXT) ;LINK AROUND +MD,< FETCH(C,A,BTXT) + PUSHJ P,TXTREL ;RELEASE PROPERTIES + FETCH(C,A,BDEF) + PUSHJ P,DDFREL +>;MD + RETBLK(A,BODY) + POPJ P, + +BODDLQ: FETCHL(T,B,PBIT) + TLNN T,ISPIN + JRST BODDLP + FETCH(T,B,BBODY) + CAME T,-1(P) ;THIS IS WHERE BODY POINTER WAS STORED + JRST BODDLP ;TRY ANOTHER + PUSH P,A ;SAVE LAST POINTER + TRO TFLG ;ALLOW DELETE PIN + PUSHJ P,DELPNT ;DELETE (CURRENT AND LAST ALREADY SETUP) + POP P,B +BODDLP: MOVE A,B ;SAVE LAST + FETCH(B,B,PNXT) + JUMPN B,BODDLQ + POPJ P, + + + SUBTTL BODY RENAME +MD,< +BODREN: MOVEI T,[ASCIZ/TYPE BODY NAME. +/] + PUSHJ P,BODYGT + POPJ P, ;ALTMODE + POPJ P, ;NULL + JRST OOPS1 ;NX + SKIPE MODLIB ;ALLOW MODIFICATION? + JRST RENOK + FETCH(T,A,TLIB) + JUMPE T,RENOK + OUTSTR[ASCIZ/CAN'T RENAME LIBRARY BODY! +/] + POPJ P, + +RENOK: MOVEI T,[ASCIZ/TYPE NEW BODY NAME. +/] + PUSH P,A + PUSHJ P,BODYGT + JRST RENOKB ;ALTMODE + JRST RENOKB ;NULL + JRST RENOKA ;NX + OUTSTR[ASCIZ/NAME ALREADY IN USE!!! +/] +RENOKB: POP P,(P) + POPJ P, + +RENOKA: POP P,C ;BODY TO RENAME + MOVE D,B + FETCH(B,C,TNAM) + PUSHJ P,PUTFS + STORE(D,C,TNAM) + TLNE M,%IDENT ;DISPLAYING NAMES? + TRO MCHG ;YES, REFRESH + POPJ P, +>;MD + SUBTTL GET BODY +;BODYGT - FIND BODY USER ASKS FOR +;T = PROMPT STRING +;RETURNS +; Alt +; Null string +; Not found +; Body found +;A = POINTER TO TYPE (previous in LH) +;(B = NAME STRING IF BODY NOT FOUND) + +MD,< +BODYGT: TLNN M,DSKACT!MACACT + OUTSTR (T) + SETZ A, ;IN CASE NO NAME + PUSHJ P,TREADU ;READ IN THE TEXT FOR THE BODY NAME + POPJ P, ;ALTMODE + JRST CPOPJ1 ;NULL STRING + AOS (P) + AOS (P) ;AT LEAST 2 SKIPS + MOVEI A,BODPNT-V.TNXT + JRST BLOP2 + +BLOP1: PUSH P,A + PUSH P,B ;BODY'S NAME + FETCH(A,A,TNAM) ;GET POINTER TO STRING + PUSHJ P,TXTMAT + JRST BLOP3 ;NO MATCH + POP P,B + POP P,A + PUSHJ P,PUTFS ;RETURN STRING + FETCH(T,A,TYP1) ;NON-ZERO IF BODY IN + JUMPE T,BDYGET ;GET BODY FROM LIBRARY IF NOT ALL IN + HRRZS A ;CLEAR PREVIOUS LINK + JRST CPOPJ1 ;FOUND + +BLOP3: POP P,B ;YES, MATCH, RESTORE B + POP P,A ;RESTORE A, THE POINTER TO THE FOUND BODY +BLOP2: MOVE T,A + FETCH(A,A,TNXT) ;GO TO NEXT BODY + HRL A,T ;SAVE OLD IN LH FOR BDYGET + TRNE A,-1 + JRST BLOP1 ;LOOP IF ANY LEFT TO COMPARE WITH + POPJ P, ;ELSE LEAVE +>;MD + +MPC,< +BODYGT: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /NO. OF PINS? +/] + SETZ A, ;THIS IS "NO" ANSWER + PUSHJ P,READN ;READ IN THE TEXT FOR THE BODY NAME + CAIN C,ALTMOD + POPJ P, + JUMPE T,[ CAIN C,12 ;JUST BLANK? + JRST CPOPJ1 ;LET HIM OUT + CAIN C,"R" + MOVEI T,=400/5 + CAIN C,"C" + MOVEI T,=300/5 + CAIN C,"T" + MOVEI T,3 + PUSHJ P,GETLIN + CAIE C,12 + JRST INNERR + JUMPE T,INNERR + CAIE T,3 ;3 PIN DIP? + JRST IS2PIN ;NO, 2 PIN AND WE HAVE SEPERATION + JRST BLOP0] + CAIE C,12 + JRST INNERR + CAIN T,2 ;2 PIN DIP? + JRST ASKWID +BLOP0: MOVE A,BODPNT ;GET POINTER TO THE STRING OF BODIES + AOS (P) + AOS (P) +BLOP1: JUMPE A,CPOPJ ;DOESN'T EXIST + FETCH(TT,A,TNAM) + CAIN TT,(T) + JRST CPOPJ1 ;EXISTS + FETCH(A,A,TNXT) + JRST BLOP1 + + +ASKWID: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PIN SEPERATION IN MILS (DIVISIBLE BY 10)?/] + PUSHJ P,READNC + IDIVI T,=10 + JUMPE T,INNERR + JUMPN TT,INNERR + ASH T,1 +IS2PIN: AOS (P) + AOS (P) + AOS (P) ;ALWAYS EXISTS +G2PIN: SKIPN A,BODPNT + JRST MAKE2D +B2LOP: FETCH(TT,A,TNAM) + CAIE TT,2 + JRST B2LOP1 + FETCH(TT,A,TPIN) + FETCH(TT,TT,TPY) ;HRRE? + CAIN TT,(T) + POPJ P, +B2LOP1: HRRZ A,(A) + JUMPN A,B2LOP +MAKE2D: PUSHJ P,MAKTYP + MOVE A,TT + MOVE TT,BODPNT + STORE(TT,A,TNXT) + MOVEM A,BODPNT + MOVEI TT,2 ;2 PIN DIP + STORE(TT,A,TNAM) + PUSHJ P,MAKTPN + STORE(T,TT,TPY) + STORE(TT,A,TPIN) + MOVEI TTT,1 ;PIN 1 + STORE(TTT,TT,TPID) + PUSH P,B + MOVE B,TT + PUSHJ P,MAKTPN + STORE(TT,B,TPNX) + MOVEI TTT,2 ;PIN 2 + STORE(TTT,TT,TPID) + MOVNS T + STORE(T,TT,TPY) + JRST POPBJ + + +;SET DIP TYPE +SETDIP: PUSHJ P,GETCLS + JRST PERRET + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TYPE DIP TYPE +/] + PUSHJ P,TREADU + POPJ P, ;ALTMODE + SETZ B, ;NULL + TLNE M,%IDENT + TRO MCHG + MOVE TT,B + FETCH(B,A,BNAM) + STORE(TT,A,BNAM) + JUMPN B,PUTFS + POPJ P, +>;MPC + +OOPS1: OUTSTR[ASCIZ/NO SUCH BODY, CHARLY +/] +MD,< JRST PUTFS ;PUT NON-EX NAME BACK IN FREE STORAGE > +MPC,< POPJ P, > + + SUBTTL ASSOCIATIVE BODY SET +;PUT THE BODY AND ALL LOOSE STUFF CONNECTED TO IT IN A SET + +ASSET: PUSHJ P,GETCLS + JRST PERRET + TRZE INMOV + TRO NEEDCL + GETFS(T) ;MAKE A NEW SET + HRLZM A,1(T) ;STARTING WITH THIS BODY + SETZM (T) + GETFS(TT) + HRLM T,(TT) + SETZM 1(TT) + EXCH TT,SETPNT + HRRM TT,@SETPNT + MOVE H,T ;SET LIST + MOVE G,H ;END OF THIS SET LIST + MOVEM A,TRCBDY + FETCH(A,A,BLNK) ;TRACE FROM ALL OF THIS BODY'S PINS + JRST ASSET5 + +ASSET2: PUSHJ P,ASSTRC ;TRACE FROM THIS POINT +ASSET1: FETCH(A,A,BPLNK) +ASSET5: JUMPN A,ASSET2 + MOVEI T,SETM + PUSHJ P,CHNGMD ;GO INTO SET MODE + MOVE A,SETPNT + PUSHJ P,RECNTR ;CALC CENTER + MOVE A,SETPNT + MOVE T,1(A) ;LOC OF CENTER + JRST CHKON + +;TRACE FROM POINT (A) AND ADD TO SET (H,G) +;(ALL OF WIRE FAILS IF IT TERMINATES IN ANOTHER BODY) + +ASSTRC: TRZ TFLG ;WIRE FAILS IF TRACED TO BODY + HRLM G,(P) ;CURRENT END OF SET LIST + PUSHJ P,ASSTR1 + TRNN TFLG ;RAN INTO SOMETHING? + POPJ P, + HLRZ G,(P) ;FLUSH THOSE ADDED POINTS + HRRZ B,(G) + HLLZS (G) + JRST PUTFS + +ASSTR1: JUMPE A,CPOPJ ;TRACE LINES FROM THIS POINT + HRLM A,(P) +MD,< FOR @' I IN (D,U,L,R) +< FETCH(C,A,PN'I) + PUSHJ P,ASSPUT + HLRZ A,(P) +> +>;MD +MPC,< FETCH(B,A,PNEB) + JUMPE B,CPOPJ +ASSET3: MOVEI D,2 +ASSET4: XCT (D)[HLRZ C,(B) + HRRZ C,1(B) + HLRZ C,1(B)] + PUSH P,B + HRLM D,(P) + PUSHJ P,ASSPUT + HLRZ D,(P) + POP P,B + SOJGE D,ASSET4 + HRRZ B,(B) + JUMPN B,ASSET3 + HLRZ A,(P) +>;MPC + POPJ P, + +ASSPUT: TRNE TFLG ;ALREADY FAILED? + POPJ P, + JUMPE C,CPOPJ + FETCH(T,C,BPBIT) +MPC,< TRNN T,CPIN ;CAN'T PICKUP WIRE TO CONNECTOR + JRST ASSPT4 +>;MPC + TRNN T,ISPIN ;STOP HERE? + JRST ASSPT3 + FETCH(T,C,BBODY) + CAME T,TRCBDY ;RAN INTO OURSELF? +ASSPT4: TRO TFLG ;THIS WIRE ISN'T LOOSE! + POPJ P, + +ASSPT3: MOVE T,H ;ALREADY IN SET? +ASSPT1: HRRZ TT,1(T) + CAMN TT,C + POPJ P, ;ALREADY IN, SKIP IT + MOVE TT,T + HRRZ T,(T) + JUMPN T,ASSPT1 + GETFS(T) + HRRM T,(TT) + SETZM (T) + SETZM 1(T) + MOVE G,T ;NEW END OF LIST +ASSPT2: HRRM C,1(T) + HRRZ A,C + JRST ASSTR1 ;RECURSE diff --git a/src/draw/btext.500 b/src/draw/btext.500 new file mode 100644 index 00000000..5c44e900 --- /dev/null +++ b/src/draw/btext.500 @@ -0,0 +1,1249 @@ +;BTEXT.FAI.64, 15-NOV-75 18:03:04, EDIT BY HELLIWELL +VERSION(BTEXT,3) +MD,< +;BODY TEXT MODE TEXT AND PROPERTY PLACEMENT +;TOP LEVEL COMMAND DISPATCH HERE + +ENTBTB: MOVE A,BTBODY + HLRZ A,(A) + HRRZ A,1(A) + JRST ALREAD ;ENTER EDITOR ON THIS BODY + +ENTBTM: PUSHJ P,GETCLS + JRST PERRET + MOVEM A,BTBODY + MOVEI T,BTXTM + JRST CHNGMD + +BTXPLB: PUSHJ P,GETCLS + JRST PERRET + CAIA +BTXPLC: MOVE A,BTBODY + SETZM BTEXT + PUSHJ P,BTXPUT + JFCL + POPJ P, + +;ADD NEW PROP TO BODY +;BTBODY = BODY TO ADD TO + +BTXPRB: PUSHJ P,GETCLS + JRST PERRET + CAIA +BTXPRP: MOVE A,BTBODY + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PROPERTY NAME? +/] + PUSHJ P,TREADU + POPJ P, + POPJ P, + MOVE T,B + PUSHJ P,BFPROP + JRST BTXPNW ;NOT FOUND + TROA TFLG ;REMEMBER FOUND IN BODY DEF + TRZ TFLG ;REMEMBER FOUND IN BODY + PUSHJ P,PUTFS ;RECLAIM TEXT STRING + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/OLD PROPERTY, NEW TEXT? +/] + + ;FALLS THRU +;BTXPR1 - PUT VALUE ON PROP IN T +;TFLG = PROP NAME FOUND IN TYPE, NOT BODY +;A = BODY +BTXPR1: MOVE E,T ;SAVE POINTER TO BLOCK + PUSHJ P,TXREAD + CAIE C,ALTMOD + SKIPN 1(B) + JRST PUTFS ;RETURN ANY TEXT READ + TRNE TFLG ;DID WE FIND IN BODY OR BODY DEF? + PUSHJ P,COPLTP ;COPY TEXT AND PROPERTIES INTO INDIRECT LIST + ;IF COPLTP CALLED, E SET TO INDIRECT POINTER BLOCK + FETCH(TT,E,TXBIT) ;INDIRECT ? + TRZN TT,TXBIND + JRST BTXPR2 ;NO +;Property being modified is indirect to TYPE, make copy of indirect's prop + STORE(TT,E,TXBIT) ;MAKE LOCAL PROP + FETCH(T,E,TXIND) ;GET TEXT BLOCK OF TYPE + FETCH(TTT,T,TXXY) ;COPY TYPE'S PROPERTY + STORE(TTT,E,TXXY) + FETCH(TTT,T,TXOFF) + STORE(TTT,E,TXOFF) + FETCH(T,T,TXNAM) ;PROPERTY NAME + PUSH P,B ;PROPERTY VALUE + PUSHJ P,LSTCOP ;COPY PROPERTY NAME + STORE(B,E,TXNAM) + POP P,B ;PROP VALUE + MOVE T,TEXSIZ ;TEXT SIZE + SKIPGE T + MOVE T,STDBIG ;WHEN COPYING FROM TYPE, MAKE STD SIZE +BTXPR2: TRO MCHG!NEEDCL + FETCH(TT,E,TXVAL) + SKIPGE T + FETCH(T,TT,TSSIZ) ;OLD TEXT SIZE + STORE(T,B,TSSIZ) + STORE(B,E,TXVAL) ;SET PROP VAL + SKIPE B,TT + PUSHJ P,PUTFS ;RETURN OLD PROP VAL + MOVE B,E + PUSHJ P,CMPBDT ;COMPILE SPECIAL PROPS (BDY IN A) + MOVE C,E + FETCH(T,E,TXXY) + TRNN T,1 + POPJ P, ;NO AUTO OFFSET + JRST EDTCEN ;GO CENTER IT + +BTXPNW: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW PROPERTY, /] + MOVEM T,BTEXT + PUSHJ P,BTXPUT + SKIPA B,BTEXT ;LOSE, MUST GIVE BACK PROPERTY NAME + POPJ P, ;WIN, RETURN + JRST PUTFS + + ;PUT PROPERTY ON BODY AT CURRENT CURSE LOC +;A = BODY POINTER +;BTEXT = PROPERTY NAME +;RETURNS +;SKIPS IF TEXT ENTERED SUCCESSFULLY +;C = POINTER TO TEXT/PROP BLOCK +;E = POINTER TO 2ND BLOCK OF TEXT BLOCK ??? + +BTXPUT: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TEXT? +/] + PUSHJ P,TXREAD + CAIE C,ALTMOD + SKIPN 1(B) + JRST PUTFS ;LOSE, GIVE BACK WHATEVER WAS READ + TRO MCHG!NEEDCL + PUSHJ P,MAKTXT ;GET TEXT BLOCK IN TT + MOVE C,TT ;TEXT BLOCK + MOVE T,CURSE + ADJUST(SUB,T,) + FETCH(F,A,BORI) + MOVE F,UNROT(F) + PUSHJ P,ORIENT + TRO T,1 ;AUTO OFFSET INITIALLY + STORE(T,C,TXXY) + FETCH(TT,A,BTXT) ;ANY PROP LIST NOW? + SKIPN TT ;YES, DON'T MAKE INITIAL INDIRECT LIST + PUSHJ P,COPLTP ;NO, COPY BODY DEF TEXT/PROPERTIES INTO INDIRECT LIST + FETCH(D,A,BTXT) + STORE(D,C,TXNXT) + STORE(C,A,BTXT) ;ADD NEW PROP TO HEAD OF LIST + MOVEI E,ADDR(C,TXNAM) ;COMPATIBILITY ** + STORE(B,C,TXVAL) ;DEPOSIT POINTER TO TEXT + MOVE T,TEXSIZ + SKIPGE T ;IF NO SIZE TYPED, + MOVE T,STDBIG ;USE STANDARD + STORE(T,B,TSSIZ) ;DEPOSIT CHR SIZE IN FIRST BLOCK OF TEXT + MOVE T,BTEXT ;GET PROPERTY NAME + STORE(T,C,TXNAM) + AOS (P) ;SKIP TO INDICATE SUCCESS, AND FALL INTO EDTCEN + MOVE B,C ;PROPERTY BLOCK + PUSHJ P,CMPBDT ;COMPILE ANY SPECIAL PROPS (BDY IN A) + JRST EDTCEN ;OFFSET TEXT + + ;BODY TEXT COPY PROPS + +BTCPRB: PUSHJ P,GETCLS + JRST PERRET + CAIA +BTCPRP: MOVE A,BTBODY + FETCH(TTT,A,BTXT) + JUMPE TTT,BTCPR1 ;NO PROP LIST NOW + PUSHJ P,BFCPRP + POPJ P, + TRZ TFLG ;FOUND IN BODY +BTCPR2: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW TEXT? +/] + JRST BTXPR1 + +BTCPR1: FETCH(TTT,A,BTYP) + FETCH(TTT,TTT,TPROP) + PUSHJ P,BFCPRP + POPJ P, + TRO TFLG + JRST BTCPR2 + + ;EDIT MODE TEXT AND PROPERTY PLACEMENT - FOR TYPES + +EDTXT: SETZM BTEXT + PUSHJ P,EDTPUT + POPJ P, ;DON'T DIDLE SIZE IF NO CHANGE + FETCH(TT,C,TXVAL) + FETCH(T,TT,TSSIZ) + JUMPN T,CPOPJ ;ZERO SIZE? + MOVE T,STDBIG ;YES, NOT ALLOWED, USE STANDARD + STORE(T,TT,TSSIZ) + POPJ P, + +EDTPRP: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PROPERTY NAME? +/] + PUSHJ P,TREADU + POPJ P, + POPJ P, + MOVE T,B + MOVE A,CURBOD + PUSHJ P,FPROP + JRST EDTPNW ;NEW PROPERTY, ADD + PUSHJ P,PUTFS ;OLD PROP, RECLAIM STRING + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/OLD PROPERTY, NEW TEXT? +/] +EDTPR1: MOVE A,T ;SAVE BLOCK FOUND + PUSHJ P,TXREAD + CAIE C,ALTMOD + SKIPN ADDR(B,TSASC) + JRST PUTFS ;LOSE, GIVE BACK WHATEVER WAS READ + TRO MCHG!NEEDCL + FETCH(TT,A,TXVAL) + SKIPGE T + FETCH(T,TT,TSSIZ) ;IF NO SIZE TYPED, COPY OLD + STORE(T,B,TSSIZ) + STORE(B,A,TXVAL) ;STORE NEW PROP VAL + MOVE B,TT + PUSHJ P,PUTFS ;RELEASE OLD + MOVE B,A ;TEXT/PROP BLOCK + MOVE A,CURBOD + PUSHJ P,CMPTYT ;CHECK FOR SPECIAL PROP ON TYPE + MOVE C,B ;PROP BLOCK POINTER + FETCH(T,C,TXXY) + TRNN T,1 ;AUTO OFFSET? + POPJ P, ;NO + JRST EDTCEN + +EDTPNW: MOVEM T,BTEXT + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW PROPERTY, /] + PUSHJ P,EDTPUT + SKIPA B,BTEXT ;HE QUIT, GIVE BACK STRING + POPJ P, ;ALL OK + JRST PUTFS + + ;PUT TEXT UNDER PROPERTY - EDIT +;ALSO PUTS ON ALL BODIES OF THIS TYPE (IF THEY HAVE EXPLICIT PROP LISTS) +;CURBOD = PTR TO TYPE DEFINITION +;BTEXT = PROPERTY NAME (0 IF JUST TEXT) +;SKIPS +;C = TEXT/PROP BLOCK + +EDTPUT: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /TEXT? +/] + PUSHJ P,TXREAD ;READ TEXT + CAIE C,ALTMOD ;IF ALTMODE TYPED, + SKIPN 1(B) ;OR NULL TEXT + JRST PUTFS ;LOSE, GIVE BACK WHATEVER WAS READ + AOS (P) ;INDICATE SUCCESS + TRO MCHG!NEEDCL + MOVE A,CURBOD ;GET POINTER TO CURRENT TYPE + PUSHJ P,MAKTXT + MOVE C,TT ;NEW TYPE PROP BLOCK + STORE(B,C,TXVAL) ;DEPOSIT POINTER TO TEXT + MOVE T,TEXSIZ + SKIPGE T ;IF NO SIZE TYPED, + MOVE T,STDBIG ;USE STANDARD + STORE(T,B,TSSIZ) ;DEPOSIT CHR SIZE IN FIRST BLOCK OF TEXT + MOVE T,BTEXT ;GET PROPERTY NAME + STORE(T,C,TXNAM) + MOVE B,C ;PROP BLOCK + MOVE D,CURSE ;GET CURRENT POSITION + TRO D,1 ;SET AUTO OFFSET BIT + TLZ D,1 ;CLEAR MARK BIT + STORE(D,C,TXXY) + MOVE B,C + PUSHJ P,ADDPRT ;ADD PROP(B) TO TYPE(A) + ;NOW CENTER TEXT + ;FALLS THRU +;EDTCEN - CENTER BODY TEXT +;C = PTR TO TEXT/PROP BLOCK +;TEXLIN = #LINES,,MAX LENGTH + +EDTCEN: TRO MCHG + FETCH(T,C,TXVAL) + FETCH(T,T,TSSIZ) + SKIPN T + MOVE T,STDBIG + PUSH P,T + ANDI T,377777 ;REMOVE VERT BIT + HRRZ TT,TEXLIN ;GET # CHARS + IMUL TT,VIRPTX(T) + ASH TT,-1 ;ONLY HALF FOR OFFSET + MOVNS TT + STORE(TT,C,TXOX) ;X PART + HLRZ TTT,TEXLIN ;GET # LINES-1 + SUBI TTT,1 + IMUL TTT,VIRPTY(T) + ASH TTT,-1 + STORE(TTT,C,TXOY) ;Y OF CONSTANT OFFSET + POP P,T + TRNN T,400000 ;VERT? + POPJ P, + MOVEI F,1 ;YES 90 DEGREES CCW + FETCH(T,C,TXOFF) + PUSHJ P,ORIENT + STORE(T,C,TXOFF) + POPJ P, + + ;OFFSET TEXT + +BTXTZ: +EDTTZ: PUSHJ P,GETCLS + JRST PERRET + MOVEI T,1 + IORM T,ADDR(A,TXXY) ;TURN ON AUTO OFFSET BIT +EDTTZA: MOVEI T,1 + LSH T,@MODE + TDNE T,[1EDTTM!1BTXTM] + TRNN TMOVE + JRST EDTTZ2 + CAME A,CLOSES + JRST EDTTZ2 + TRZE INMOV + TRO NEEDCL +EDTTZ2: FETCH(T,A,TXVAL) + ADD T,[POINT 7,1] + SETZB TT,TTT +EDTTZ1: PUSHJ P,GETTT + JRST [ CAILE TTT,(TT) + HRR TT,TTT + MOVEM TT,TEXLIN + MOVE C,A + JRST EDTCEN] + CAIE C,"" + AOJA TTT,EDTTZ1 + ADD TT,[1,,0] + CAILE TTT,(TT) + HRR TT,TTT + SETZ TTT, + JRST EDTTZ1 + +;$$Y IN EDIT MODES +EDCPRP: MOVE TTT,CURBOD + FETCH(TTT,TTT,TPROP) + PUSHJ P,BFCPRP + POPJ P, + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW TEXT? +/] + JRST EDTPR1 + +EDTENT: MOVEI T,EDTTM + JRST CHNGMD + +STOBTP: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,TXNAM) + PUSHJ P,SETTT + JUMPE T,ITSTUF + JRST STOTX0 + +STOBTX: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,TXVAL) + JRST STOTXB ;CALL ROUTINE FOR POINT TEXT + +;PRINT ALL PROPERTIES FOR THIS BODY OR BODY DEF +LPROPS: MOVEI T,1 + LSH T,@MODE + TDNE T,[ALLEDM!1EDTAM] + JRST EDTLPR + TDNE T,[1BTXTM] + JRST [ MOVE A,BTBODY + JRST BTXLPR] + TDNN T,[1BODM] + JRST PERRET + PUSHJ P,GETCLS + JRST PERRET +BTXLPR: TVOFF + MOVE H,A + OUTSTR [ASCIZ / +Package code: /] + FETCH(T,H,BPAK) + OUTSTR @PACKNM(T) + FETCH(G,H,BTXT) + JUMPE G,[OUTSTR[ASCIZ/ +NO LOCAL BODY PROPERTIES. +/] + JRST BTSLPE] + OUTSTR[ASCIZ/ +LOCAL BODY PROPERTIES: +* INDICATES PROPERTY FROM BODY DEF, +@ INDICATES PROPERTY FROM DIP DEF. +/] + PUSHJ P,LPROPL ;LIST PROPERTY LIST +BTSLPE: FETCH(H,H,BTYP) + JRST EDLPR1 + +EDTLPR: TVOFF + MOVE H,CURBOD ;LIST BODY DEF PROPERTIES +EDLPR1: OUTSTR[ASCIZ/ +BODY NAME: /] + FETCH(T,H,TNAM) ;BODY NAME + PUSHJ P,OUTTXT + FETCH(B,H,TLIB) ;on library? + JUMPE B,EDLPR9 + PUSHJ P,LIBTYP + OUTSTR [ASCIZ / from /] + OUTSTR NAMBUF +EDLPR9: OUTSTR [ASCIZ / +Type's package code: /] + FETCH(T,H,TPAK) + OUTSTR @PACKNM(T) + FETCH(G,H,TPROP) + JUMPE G,[OUTSTR[ASCIZ/ +NO BODY DEFINITION PROPERTIES. +/] + JRST LPROP9] + OUTSTR[ASCIZ/ +BODY DEFINITION PROPERTIES: +/] + PUSHJ P,LPROPL +LPROP9: TVON + POPJ P, + +LPROPL: OUTSTR[ASCIZ/! INDICATES INVISIBLE PROPERTY. +/] +LPROP0: MOVE C,[" ",," "] ;ASSUME LOCAL + MOVE B,G + FETCH(T,G,TXBIT) + TRNN T,TXBIND + JRST LPROP1 + HRLI C,"*" ;INDIRECT + FETCH(B,B,TXIND) +LPROP1: TRNE T,TXBDIP + HRRI C,"@" + FETCH(T,B,TXNAM) ;PROPERTY NAME + JUMPE T,LPROP2 ;SKIP TEXT + OUTCHR C + MOVSS C + OUTCHR C + FETCH(A,B,TXVAL) + HLRZ A,(A) + SKIPN A + OUTCHR["!"] + SKIPE A + OUTCHR[" "] + PUSHJ P,OUTTXT ;TYPE PROPERTY NAME + OUTCHR[":"] + FETCH(T,B,TXVAL) + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ +/] +LPROP2: HRRZ G,(G) + JUMPN G,LPROP0 + POPJ P, + ;LINE EDIT TEXT +STANFO,< +LODTPN: FETCH(T,A,TXVAL) + PUSHJ P,LODED ;LOAD IT + POPJ P, + +TPNTQ: PUSHJ P,TPNTQA + POPJ P, + JRST EDTDL1 + +BTPNTQ: PUSHJ P,TPNTQA + POPJ P, + JRST BTXDL0 + +TPNTQA: PUSHJ P,GETCLS + JRST PERRET ;NONE + PUSHJ P,LODTPN + JRST TPNTZ1 + +TPNTZ: PUSHJ P,TPNTZA + POPJ P, + JRST EDTDL1 + +BTPNTZ: PUSHJ P,TPNTZA + POPJ P, + JRST BTXDL0 + +TPNTZA: PUSHJ P,GETCLS + JRST PERRET + PUSHJ P,LODTPN ;LOAD IT + PTWRS9 [0 + [BYTE(9)271,271,271,377,0]] ;CTRL1 999 BACKSPACE +TPNTZ1: PUSHJ P,TXREAD ;READ TEXT BACK + CAIN C,ALTMOD + JRST PUTFS ;NO CHANGE + SKIPN 1(B) + JRST [ PUSHJ P,PUTFS + JRST CPOPJ1] + FETCH(TT,A,TXNAM) + JUMPN TT,ZSIZOK + SKIPN T + MOVE T,STDBIG ;IF TEXT ONLY, MUST HAVE SIZE +ZSIZOK: SKIPGE T + MOVE T,STDBIG ;NO SIZE, USE STANDARD + HRLM T,(B) ;STO SIZE + FETCH(T,A,TXVAL) ;OLD VAL + STORE(B,A,TXVAL) ;REPLACE BY NEW + MOVE B,T + PUSHJ P,PUTFS + TRO MCHG + FETCH(T,A,TXXY) + TRNN T,1 ;AUTO OFFSET? + POPJ P, ;NO + MOVE C,A + JRST EDTCEN ;TT STILL SETUP FROM TXREAD +>;STANFO + ;TEXT, KILL + +;KILL (STOP DISPLAYING PROPERTY) +EDTKIL: PUSHJ P,GETCLS + JRST PERRET + TRO MCHG!NEEDCL + TRZ INMOV + FETCH(TT,A,TXNAM) ;PROP NAM + JUMPE TT,EDTDL1 ;JUST TEXT, DELETE IT + FETCH(T,A,TXVAL) + SKIPN T + PUSHJ P,FUCKUP + HRRZS (T) ;0 CHAR SIZE = NO DISPLAY + POPJ P, + +;DELETE PROP FROM TYPE + +EDTDEL: PUSHJ P,GETCLS + JRST PERRET + TRO MCHG!NEEDCL + TRZ INMOV +;FIRST DELETE ALL INDIRECTS FROM BODY'S TO THIS TEXT/PROP +;A = TEXT/PROP BLOCK TO DELETE +EDTDL1: MOVEI B,DBODPN +FBT1: PUSHJ P,FBTPTR ;GET NEXT BODY WITH PROP IN A + JRST EDTDL2 + FETCH(TT,D,TXNXT) ;PATCH OUT INDIRECT BLOCK + STORE(TT,C,TXNXT) + RETBLK(D,TEXT) + JRST FBT1 + +;NEXT DELETE PROP FROM TYPE DEF +EDTDL2: FETCH(B,A,TXNAM) ;ANY PROP NAME? + JUMPE B,EDTDL3 ;NO, PLAIN TEXT + PUSH P,A + MOVE B,A ;PROP BLOCK + MOVE A,CURBOD + PUSHJ P,FLSTYP ;CLEAR ANY SPECIAL PROPS + POP P,A + FETCH(B,A,TXNAM) + PUSHJ P,PUTFS ;YES RETURN +EDTDL3: MOVE C,CURBOD + FETCH(B,C,TPROP) + CAMN B,A ;IS IT THE FIRST ONE? + JRST EDTKP1 ;YES +EDTKP2: MOVE C,B ;NO, PATCH IT OUT OF LIST + FETCH(B,C,TXNXT) + CAME B,A ;IS THIS IT? + JRST EDTKP2 + FETCH(TT,A,TXNXT) ;RPLACD IT OUT + STORE(TT,C,TXNXT) +EDTKP3: FETCH(B,A,TXVAL) + PUSHJ P,PUTFS ;RETURN PROP VAL + RETBLK(A,TEXT) ;RETURN PROP BLOCK + POPJ P, + +EDTKP1: FETCH(B,A,TXNXT) ;REMOVE FROM HEAD OF PROP LIST + STORE(B,C,TPROP) + JRST EDTKP3 + + ;KILL, UNKILL PROP ON BODY + +BTXKIL: PUSHJ P,GETCLS + JRST PERRET + TRO MCHG!NEEDCL + TRZ INMOV + FETCH(TT,A,TXNAM) ;A PROPERTY? + JUMPE TT,BTXDL0 ;NO, TEXT SO DELETE IT + FETCH(T,A,TXVAL) ;YES, SO MARK INVISIBLE + CLEAR(T,TSSIZ) + POPJ P, + +BTXUKL: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,TXVAL) + FETCH(TT,T,TSSIZ) + JUMPN TT,[TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ALREADY VISIBLE. +/] + POPJ P,] + MOVE TT,STDBIG ;SET SIZE TO STANDARD + STORE(TT,T,TSSIZ) + POPJ P, ;THIS SHOULDN'T CHANGE PICTURE + + ;DELETE BODY TEXT/PROP + +BTXDEL: PUSHJ P,GETCLS + JRST PERRET + TRO MCHG!NEEDCL +;DELETE BODY TEXT +;A = TEXT/PROP BLOCK TO DELETE +;CLAST = PREVIOUS PTR +;BTBODY = BODY + +BTXDL0: HRL A,CLAST ;LAST PTR IN PROP LIST +BTXDL1: FETCH(T,A,TXNAM) ;PROPERTY? + JUMPE T,BTXDL4 ;NO, ONLY TEXT, JUST FLUSH IT + PUSH P,A + MOVE A,BTBODY + FETCH(A,A,BTYP) + PUSHJ P,FPROP ;LOOK FOR THIS PROPERTY(T) IN BODY DEF + JRST BTXDL2 ;NOT IN DEF, JUST DELETE + MOVE A,BTBODY ;YES, CONS UP INDIRECT PTR + PUSHJ P,MAKTXT + STORE(T,TT,TXIND) + MOVEI T,TXBIND + STORE(T,TT,TXBIT) + FETCH(T,A,BTXT) + STORE(T,TT,TXNXT) + STORE(TT,A,BTXT) + MOVE B,TT + PUSHJ P,CMPBDT ;POSSIBLY RE-COMPILE NEW VALUE +BTXDL2: HRRZ B,(P) ;PROP BLOCK + MOVE A,BTBODY + PUSHJ P,FLSBDY ;FLUSH SPECIAL PROPS FROM BODY + POP P,A + FETCH(B,A,TXNAM) + PUSHJ P,PUTFS ;RETURN PROP NAME +BTXDL4: FETCH(B,A,TXVAL) + PUSHJ P,PUTFS ;RETURN PROP VAL + HLRZ B,A ;PREV POINTER + HRRZ TT,(B) + CAIE TT,(A) ;CORRECT LAST? + PUSHJ P,FUCKUP + FETCH(C,A,TXNXT) + HRRM C,(B) ;BACK POINTER MAY BE TO BODY + RETBLK(A,TEXT) +;Now check if entire body list is indirect + MOVE A,BTBODY + FETCH(B,A,BTXT) + JUMPE B,CPOPJ +BTXDL3: FETCH(T,B,TXBIT) + TRNN T,TXBIND ;INDIRECT? + POPJ P, ;NO, MUST KEEP LIST + FETCH(B,B,TXNXT) + JUMPN B,BTXDL3 + FETCH(C,A,BTXT) + CLEAR(A,BTXT) ;DELETE BODIES PROP LIST, ALL INDIRECT + JRST TXTREL + +;$$D DELETE PROPERTY NAME +BTNPRP: +EDNPRP: PUSHJ P,GETCLS + JRST PERRET + FETCH(B,A,TXNAM) + JUMPE B,PERRET ;NO PROPERTY NAME, LOSE + FETCH(T,A,TXVAL) + FETCH(TT,T,TSSIZ) + SKIPN TT + MOVE TT,STDBIG + STORE(TT,T,TSSIZ) + JRST PUTFS + + ;ALL NEW BODY/BODY DEF PROPERTY/TEXT ROUTINES. + +;FPROP - FIND BODY DEF PROPERTY +;T = STRING PROPERTY NAME +;A = TYPE +;SKIP RETURNS +;T = PROPERTY BLOCK POINTER +; (TTT NOW CONTAINS STRING POINTER) + +;FPROPX - FIND PROPERTY NAME IN LIST SUPPLIED +;TTT = BODY OR TYPE DEF PROPERTY LIST POINTER + +FPROP: FETCH(TTT,A,TPROP) + JUMPE TTT,CPOPJ +FPROPX: PUSH P,A + PUSH P,B + PUSH P,T +FPROP1: MOVE B,TTT + FETCH(T,B,TXBIT) + TRNN T,TXBIND + JRST FPROP3 + FETCH(B,B,TXIND) +FPROP3: FETCH(B,B,TXNAM) + JUMPE B,FPROP2 ;JUST TEXT + MOVE A,(P) + PUSHJ P,TXTMAT + JRST FPROP2 + POP P,T ;FOUND + POP P,B + POP P,A + EXCH T,TTT + JRST CPOPJ1 + +FPROP2: HRRZ TTT,(TTT) + JUMPN TTT,FPROP1 + POP P,T + POP P,B + POP P,A + POPJ P, + + ;FNDIPT - FIND DIP FROM TYPE +;A = TYPE POINTER +;SKIP RETURNS +;T = DIPTYPE BLOCK POINTER + +FNDIPT: MOVEI T,CDIPTY + PUSHJ P,FPROP + POPJ P, +FNDDP2: TLO T,400000 + JRST CPOPJ1 + +;FNDDIP - FIND DIP TYPE FROM BODY OR TYPE +;A = BODY POINTER ,( -1,,TYPE IF TYPE POINTER) +;SKIP RETURNS +;T = DIPTYPE BLOCK POINTER (LH NEG IF FOUND ON TYPE) + +FNDDIP: JUMPL A,FNDIPT ;FIND ON TYPE? + MOVEI T,CDIPTY + PUSHJ P,BFPROP + POPJ P, + JRST FNDDP2 ;FOUND IN TYPE + FETCH(TT,T,TXBIT) ;FOUND IN BODY, CHECK FOR INDIRECT + TRNN TT,TXBIND + JRST CPOPJ1 + FETCH(T,T,TXIND) + JRST FNDDP2 ;MARK AS FROM TYPE + +CDIPTY: XWD 0,.+2 + ASCII /DIPTY/ + 0 + ASCIZ /PE/ + ;BFPROP - FIND PROPERTY FOR BODY +;A = BODY POINTER +;T = STRING PROPERTY NAME +;SKIP RETURNS +;T = PROPERTY BLOCK POINTER +;SKIPS 1 IF FOUND IN BODY DEF (NO INDIRECT LIST IN BODY) +;SKIPS 2 IF FOUND IN BODY (INDIRECT OR DIRECT) + +BFPROP: FETCH(TTT,A,BTXT) + PUSH P,A + JUMPE TTT,BFPRP4 ;NO BODY PROPERTIES + PUSH P,B ;YES, (LIST ALSO HAS INDIRECTS TO TYPE PROPERTIES) + PUSH P,T +BFPRP2: MOVE B,TTT + FETCH(T,B,TXBIT) + TRNN T,TXBIND + JRST BFPRP3 ;DIRECT PROP + FETCH(B,B,TXIND) ;NO, INDIRECT FROM TYPE DEF +BFPRP3: FETCH(B,B,TXNAM) ;PROPERTY NAME + JUMPE B,BFPRP1 + MOVE A,(P) + PUSH P,TTT + PUSHJ P,TXTMAT + JRST BFPRP9 + POP P,TTT + POP P,B ;MATCH STRING + POP P,B + POP P,A + MOVE T,TTT + JRST CPOPJ2 + +BFPRP9: POP P,TTT +BFPRP1: FETCH(TTT,TTT,TXNXT) + JUMPN TTT,BFPRP2 + POP P,T + POP P,B + POP P,A + POPJ P, + +BFPRP4: FETCH(A,A,BTYP) ;NO PROPERTIES ON BODY + PUSHJ P,FPROP ;LOOK IN BODY DEF + CAIA + AOS -1(P) ;SIGNAL FOUND + POP P,A + POPJ P, + + ;BFCPRP - FIND BODY OR BODY DEF PROPERTY BY CLOSEST MATCH NAME +;TTT = POINTER TO PROPERTY LIST +;T = RETURNS PROPERTY BLOCK OR INDIRECT POINTER + +BFCPRP: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PROPERTY NAME (ENOUGH TO UNIQUELY SPECIFY IT)? +/] + JUMPE TTT,[PUSHJ P,SCARF + POPJ P, + JRST NXPROP] + PUSHJ P,TREADU + POPJ P, + JRST NXPROP + PUSH P,A + PUSH P,B + TRZ TFLG ;NO MATCHS YET +EDCPR2: MOVE A,TTT + FETCH(B,A,TXBIT) + TRNN B,TXBIND + JRST EDCPR4 + FETCH(A,A,TXIND) +EDCPR4: FETCH(A,A,TXNAM) + JUMPE A,EDCPR3 + MOVE B,(P) + ADD A,[POINT 7,1] + ADD B,[POINT 7,1] +EDCPR5: PUSHJ P,BTGETB ;GET A MATCH CHARACTER + JRST EDCPR6 ;MATCH + PUSHJ P,BTGETA ;GET A PROPERTY NAME CHARACTER + JRST EDCPR3 ;NO MATCH + CAMN T,TT ;MATCH? + JRST EDCPR5 ;YES, LOOP + JRST EDCPR3 ;NO MATCH + +EDCPR6: TROE TFLG ;FLAG ONE FOUND, CHECK FOR MORE THAN ONE + JRST AMBIGP ;AMBIGUOUS PROPERTY + MOVEM TTT,BTEXT ;SAVE MATCH HERE + PUSHJ P,BTGETA ;GET ONE MORE CHAR OF PROPERTY NAME + JRST EXPROP ;EXACT MATCH, WIN NOW +EDCPR3: HRRZ TTT,(TTT) + JUMPN TTT,EDCPR2 +EXPROP: POP P,B + PUSHJ P,PUTFS + POP P,A + MOVE T,BTEXT ;GET MATCH (IF ANY) + TRNE TFLG ;WAS THERE A MATCH? + JRST EDCPR7 ;YES, PRINT NAME AND RETURN IT +NXPROP: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/SORRY, NO SUCH PROPERTY. +/] + POPJ P, + +EDCPR7: TLNE M,DSKACT!MACACT + JRST CPOPJ1 + PUSH P,T + MOVE TT,T + FETCH(TTT,TT,TXBIT) + TRNN TTT,TXBIND + JRST EDCPR8 + FETCH(TT,TT,TXIND) +EDCPR8: FETCH(T,TT,TXNAM) + PUSHJ P,OUTTCR + POP P,T + JRST CPOPJ1 + +AMBIGP: POP P,B + PUSHJ P,PUTFS + POP P,A + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/SORRY, AMBIGUOUS PROPERTY NAME. +/] + POPJ P, + +BTGETA: TLNN A,760000 + JRST [ HRR A,-1(A) + TRNN A,-1 + POPJ P, + JRST .+1] + ILDB T,A + JUMPE T,CPOPJ + JRST CPOPJ1 + +BTGETB: TLNN B,760000 + JRST [ HRR B,-1(B) + TRNN B,-1 + POPJ P, + JRST .+1] + ILDB TT,B + JUMPE TT,CPOPJ + JRST CPOPJ1 + + ;MPROP - MAKE A PROPERTY BLOCK AND ADD TO TYPE DEF +;T = STRING PROPERTY NAME IN T +;A = TYPE +;RETURNS +;T = NEW BLOCK (WITH NO VALUE STRING YET) + +MPROP: PUSHJ P,MAKTXT + MOVEI TTT,1 + STORE(TTT,TT,TXXY) ;INITIALIZE TO AUTO OFFSET + CLEAR(TT,TXOFF) ;NO CHAR OFFSET + STORE(T,TT,TXNAM) + FETCH(TTT,A,TPROP) + STORE(TTT,TT,TXNXT) + STORE(TT,A,TPROP) + MOVE T,TT + POPJ P, + +;MAKTXT - MAKE TEXT/PROPERTY BLOCK, POINTER RETURNED IN TT + +MAKTXT: PUSH P,A + GETBLK(TT,TEXT) + BCLEAR(A,TT,TEXT) + JRST POPAJ + + +;FBTPTR - FIND INSTANCE OF PROPERTY/TEXT INDIRECT POINTER +;B = LAST BODY FOUND +;A = BODY DEF PROPERTY/TEXT BLOCK POINTER +;SKIP RETURNS +;B = NEW BODY +;D = POINTER TO INDIRECT BLOCK +;(C = PREVIOUS) + +FBTPT1: FETCH(T,B,BTYP) + CAME T,CURBOD + JRST FBTPTR + MOVEI D,RADDR(B,BTXT,TXNXT) + JRST FBTPT3 + +FBTPT2: FETCH(T,D,TXBIT) + TRNN T,TXBIND + JRST FBTPT3 ;IGNORE LOCAL PROP/TEXT + FETCH(T,D,TXIND) ;SEE IF THIS USE OF THE TEXT FROM + CAMN T,A ;THE TYPE IS THE ONE WE WANT + JRST CPOPJ1 +FBTPT3: MOVE C,D + FETCH(D,D,TXNXT) + JUMPN D,FBTPT2 +FBTPTR: FETCH(B,B,BNXT) + JUMPN B,FBTPT1 + POPJ P, + + ;COPLTP - MAKE INDIRECT LIST TO BODY DEF TEXT/PROPERTIES +;A = BODY POINTER +;(IF E POINTS TO BODY DEF PROPERTY, IT IS CHANGED TO POINT TO INDIRECT BLOCK) +;RETURNS +;E = POSSIBLY UPDATED POINTER TO INDIRECT BLOCK +;T = PTR TO END OF LIST + +COPLTP: FETCH(T,A,BTYP) + FETCH(TTT,T,TPROP) + MOVEI T,ADDR(A,BTXT) ;POINT T TO NEW LISTHEAD + JUMPE TTT,CPOPJ ;LEAVE IF NO BODY DEF LIST TO COPY +CPLTP1: PUSHJ P,MAKTXT + HRRM TT,(T) ;LINK IN INDIRECT BLOCK + MOVEI T,TXBIND ;MARK AS INDIRECT + STORE(T,TT,TXBIT) + MOVE T,TT ;GET NEW END OF LIST + STORE(TTT,TT,TXIND) ;PUT IN INDIRECT POINTER + CAMN E,TTT ;DOES E POINT TO IT? + MOVE E,TT ;YES, POINT E TO INDIRECT BLOCK + HRRZ TTT,(TTT) + JUMPN TTT,CPLTP1 + POPJ P, + + ;ASCCOP - MAKE INTERNAL FORMAT STRING FROM ASCIZ STRING +;TT = ASCIZ STRING POINTER +;RETURNS +;T = INTERNAL FORMAT STRING POINTER + +ASCCOP: GETFS(T) + HRLM T,(P) + JRST ASCCP2 + +ASCCP1: GETFS(TTT) + HRRZM TTT,(T) + MOVE T,TTT +ASCCP2: MOVE TTT,(TT) + MOVEM TTT,1(T) + TRNN TTT,376 + JRST ASCCP3 + SKIPE 1(TT) + AOJA TT,ASCCP1 +ASCCP3: SETZM (T) + HLRZ T,(P) + POPJ P, + + ;GETPRV - GET PREVIOUS LINK POINTER +;T = PTR TO LIST TO SEARCH +;TT = BLOCK TO LOOK FOR +; SKIPS OF FOUND + +GETPRV: JUMPE T,CPOPJ ;?? +GETPR1: HRRZ TTT,(T) + JUMPE TTT,CPOPJ + CAMN TT,TTT + JRST CPOPJ1 + MOVE T,TTT + JRST GETPR1 + + ;MERGEP - MERGE PROP LIST INTO BODY'S PROP LIST +;A = PTR TO BODY +;B = PROP LIST TO MERGE + +MERGEP: PUSH P,C + PUSH P,D + MOVE D,B ;OLD PROP LIST IN D +PRPCP1: MOVE C,D ;GET NEXT TEXT/PROP OFF OLD LIST + FETCH(D,D,TXNXT) + FETCH(T,C,TXBIT) + TRNE T,TXBIND + JRST PRPCP2 + FETCH(T,C,TXNAM) + JUMPE T,PRPCP3 ;NOT PROP, JUST TEXT + FETCH(TTT,A,BTXT) ;CHECK IF PROP IS ALREADY ON BODY + SKIPE TTT ;IF NO PROPS IN NEW BODY, JUST INSERT + PUSHJ P,FPROPX ;LOOK FOR THIS PROPERTY (T) ALREADY IN BODY (TTT) + JRST PRPCP3 ;NOT FOUND, INSERT NEW PROPERTY + FETCH(TTT,T,TXBIT) ;CHECK FOUND DUPLICATE FOR INDIRECT + TRNN TTT,TXBIND + JRST PRPCP2 ;NOT INDIRECT, BUG CHECK FOR DUPLICATE PROPERTY ON BODY +;Old local prop matches indirect to TYPE def, clobber the indirect + PUSH P,A + MOVE A,C ;NEW PROP + MOVE B,T ;OLD INDIRECT BLOCK + PUSHJ P,CPYPRP ;COPY NEW TEXT BLOCK ONTO OLD + POP P,A + PUSHJ P,CMPBDT ;CHECK FOR SPECIAL PROPS (A=BODY, B=PROP BLOCK) + JRST PRPCP2 + +PRPCP3: PUSHJ P,MAKTXT + FETCH(TTT,A,BTXT) ;SIMPLE, JUST ADD TO PROP LIST + STORE(TTT,TT,TXNXT) ;CONS OLD TEXT/PROP ONTO BODY'S LIST + STORE(TT,A,BTXT) + PUSH P,A + PUSH P,B + MOVE A,C + MOVE B,TT + PUSHJ P,CPYPRP + POP P,B + POP P,A + JRST PRPCP2 + +PRPCP2: JUMPN D,PRPCP1 ;LOOP IF MORE + POP P,D + POP P,C + POPJ P, + + ;ADDPRT - ADD PROPERTY TO TYPE +;A = TYPE +;B = PROPERTY +ADDPRT: FETCH(T,A,TPROP) ;PUT NEW BLOCK ON TYPE + STORE(T,B,TXNXT) + STORE(B,A,TPROP) + PUSHJ P,CMPTYT ;CHECK FOR SPECIAL PROPS +;Now also add indirects to all BODIES + PUSH P,D + PUSH P,E + SKIPN D,DBODPN + JRST ADDPR1 ;NO BODIES TO INSERT INTO +BTXINS: FETCH(TTT,D,BTYP) + CAME TTT,A ;THIS BODY OF OUR TYPE? + JRST BTXIN1 ;NO + FETCH(E,D,BTXT) ;YES, GET BODIES CURRENT PROP + JUMPE E,BTXIN1 ;NO CURRENT LIST, DON'T HAVE TO ADD TO IT + FETCH(T,B,TXNAM) ;PROPERTY NAME + JUMPE BTXIN2 ; ONLY TEXT, MAKE INDIRECT + FETCH(TTT,D,BTXT) ;BODY PROPERTY LIST + PUSHJ P,FPROPX ;SEE IF BODY ALREADY HAS THIS PROPERTY + JRST BTXIN2 ;BODY DOESN'T HAVE IT, ADD IT + JRST BTXIN1 ;BODY ALREADY HAS ONE, DON'T ADD IT + +BTXIN2: PUSHJ P,MAKTXT ;MAKE IND PTR BLK + MOVEI TTT,TXBIND + STORE(TTT,TT,TXBIT) ;0 MEANS INDIRECT + STORE(B,TT,TXIND) ;PTR TO TYPE'S PROP BLOCK + FETCH(E,D,BTXT) ;ADD INDIRECT TO BODY + STORE(E,TT,TXNXT) + STORE(TT,D,BTXT) +BTXIN1: HRRZ D,(D) ;NEXT BODY + JUMPN D,BTXINS +ADDPR1: POP P,E + POP P,D + POPJ P, + + ;TXTREL - RELEASE PROPERTY LIST FROM TYPE OR BODY +; C = PROPERTY LIST + +TXTREL: JUMPE C,CPOPJ ;DONE IF NO TEXT + PUSH P,A + PUSH P,B +GIVTXT: MOVE A,C + FETCH(B,A,TXBIT) + TRNE B,TXBIND ;INDIRECT? + JRST GIVTX1 ;YES, NO STRINGS TO FLUSH + FETCH(B,A,TXNAM) + PUSHJ P,PUTFS + FETCH(B,A,TXVAL) + PUSHJ P,PUTFS +GIVTX1: FETCH(C,A,TXNXT) + RETBLK(A,TEXT) + JUMPN C,GIVTXT + POP P,B + POP P,A + POPJ P, + + + ;CPYPRP - COPY CONTENTS OF ONE TEXT BLOCK ONTO ANOTHER +;A = SOURCE TEXT BLOCK +;B = DESTINATION " + +CPYPRP: FETCH(T,A,TXBIT) + STORE(T,B,TXBIT) + TRNE T,TXBIND + JRST [ FETCH(T,A,TXIND) + STORE(T,B,TXIND) + POPJ P,] + PUSH P,B + FETCH(T,A,TXNAM) + PUSHJ P,LSTCOP ;COPY IT OVER + MOVE T,(P) + STORE(B,T,TXNAM) + FETCH(T,A,TXVAL) + PUSHJ P,LSTCOP + MOVE T,(P) + STORE(B,T,TXVAL) + POP P,B + FETCH(T,A,TXXY) + STORE(T,B,TXXY) + FETCH(T,A,TXOFF) + STORE(T,B,TXOFF) + POPJ P, + + ;SPECIAL PROPERTIES + +DEFINE PROPS +< PROPS1(PACKAGE,CMPPAK,CLRPAK) + PROPS1(DIPTYPE,CMPDIP,CLRDIP) +> + +DEFINE PROPS1(NAME,COMPILER,CLEARER) +< [ASCIZ \NAME\] +> +PROPNT: PROPS + +DEFINE PROPS1(NAME,COMPILER,CLEARER) +< COMPILER +> +PROPX: PROPS ;SKIPS IF OK + +DEFINE PROPS1(NAME,COMPILER,CLEARER) +< CLEARER +> +PROPCL: PROPS ;CONTACT, PROP CLEAR + +MXPROP__0 +DEFINE PROPS1(NAME,COMPILER,CLEARER) +< MXPROP__MXPROP+1 +> + PROPS + + ;CLRDIP - REMOVE POSSIBLY OLD DIPDEF LIST +;A = BODY/TYPE (-1 IN LH MEANS TYPE) + +CMPDIP: AOS (P) ;ALWAYS SUCCEEDS +CLRDIP: JUMPL A,[FETCH(C,A,TDEF) + PUSHJ P,DDFREL + CLEAR(A,TDEF) + POPJ P,] + FETCH(C,A,BDEF) + PUSHJ P,DDFREL + CLEAR(A,BDEF) + POPJ P, + + ;CMPBDY,CMPTYP - COMPILE PROPERTIES ON BODY OR TYPE +;A = BODY OR TYPE +;LH A = FLG -1 MEANS TYPE + +CMPBDY: TLZ A,-1 + PUSH P,B + FETCH(B,A,BTXT) ;ANY PROPS ON BODY +CMPBD3: JUMPE B,CMPBD1 +CMPBD2: PUSHJ P,CMPIT + FETCH(B,B,TXNXT) + JUMPN B,CMPBD2 +CMPBD1: POP P,B + POPJ P, + +CMPTYP: TLO A,-1 + PUSH P,B + FETCH(B,A,TPROP) + JRST CMPBD3 + +;CMPIT - COMPILE PROPERTY FOR BODY OR TYPE +;A = BODY (0 LH) OR TYPE (-1 LH) +;B = PROPERTY + +CMPBDT: TLZA A,-1 ;COMPILE ONE PROP ON BODY +CMPTYT: TLO A,-1 ; " ON TYPE +CMPIT: JUMPL A,CMPIT3 ;TYPE'S CAN'T HAVE INDIRECT + FETCH(T,B,TXBIT) ;BODY WITH INDIRECT? + TRNE T,TXBIND + POPJ P, ;DON'T COMPILE PROPS THAT ARE REALLY ON TYPE +CMPIT3: PUSH P,C + PUSH P,D + FETCH(C,B,TXNAM) + MOVSI D,-MXPROP +CMPIT1: HRRZ T,PROPNT(D) + PUSHJ P,MATTXT + JRST [ AOBJN D,CMPIT1 + JRST CMPIT4] + FETCH(C,B,TXVAL) + PUSHJ P,@PROPX(D) ;A:BODY/TYPE, B:PROP, C:VALUE + JRST [ OUTSTR [ASCIZ / +PROPERTY: /] + FETCH(T,B,TXNAM) + PUSHJ P,OUTTXT + OUTSTR [ASCIZ /, WITH STRANGE VALUE - /] + FETCH(T,B,TXVAL) + PUSHJ P,OUTTXT + JRST CMPIT4] +CMPIT4: POP P,D + POP P,C + POPJ P, + + ;FLSBDY, FLSTYP - DELETING PROPERTY, CHECK AND FLUSH MAYBE +;A = BODY OR TYPE +;B = PROP BEING FLUSHED + +FLSTYP: TLOA A,-1 +FLSBDY: TLZ A,-1 + PUSH P,C + PUSH P,D + FETCH(C,B,TXNAM) + MOVSI D,-MXPROP +FLSIT1: HRRZ T,PROPNT(D) + PUSHJ P,MATTXT + JRST FLSIT2 + PUSHJ P,@PROPCL(D) +FLSIT2: AOBJN D,FLSIT1 + POP P,D + POP P,C + POPJ P, + + ;VERPRP - CHECK BODY, TYPE FOR CONSISTENCY W.R.T. COMPILED SPECIAL PROPS +;A = BODY (0 IN LH), TYPE (-1 IN LH) + + ;RECMP - RECOMPILE PROPERTY ON BODY/TYPE +;A = BODY/TYPE (LH NEG MEANS TYPE) +;T = STRING NAME OF PROPERTY +;(ONLY RECOMPILES THOSE BODY PROPS THAT ARE LOCAL TO BODY, NOT ON TYPE) + +RECMPT: TLOA A,-1 +RECMPB: TLZ A,-1 +RECMP: JUMPL A,[PUSHJ P,FPROP + POPJ P, + JRST RECMP1] + PUSHJ P,BFPROP + POPJ P, + POPJ P, ;FOUND ON TYPE, IGNORE +RECMP1: MOVE B,T + JRST CMPIT + +CPAKAG: 0,,.+2 + ASCII/PACKA/ + 0 + ASCII/GE/ + + ;MATTXT - MATCH ASCIZ AGAINST STRING +;C IS TEXT STRING +;T IS ASCIZ + +MATTXT: MOVE TT,(T) + CAME TT,1(C) + POPJ P, + HRRZ C,(C) + TRNE TT,376 + JRST [ JUMPE C,CPOPJ + AOJA T,MATTXT] + SKIPN C + AOS (P) + POPJ P, +>;MD diff --git a/src/draw/close.312 b/src/draw/close.312 new file mode 100644 index 00000000..cfed3c95 --- /dev/null +++ b/src/draw/close.312 @@ -0,0 +1,790 @@ +;CLOSE.FAI.58, 15-NOV-75 18:03:22, EDIT BY HELLIWELL +VERSION(CLOSE,2) +GETCLS: TRNE STBOX + POPJ P, + MOVE A,CURSE + EXCH A,LSTCUR ;SET CURRENT CURSOR POS AS LAST FOUND! + TRZN NEEDCL + CAME A,CURSE ;MOVED SINCE LAST FIND? + JRST GETCL1 + JRST GETCL2 ;NO +GETCL1: PUSHJ P,PUSHIT + PUSHJ P,FNDCLS + PUSHJ P,POPIT + SETOM CLOSUP +GETCL2: SKIPN A,CLOSES + POPJ P, + JRST CPOPJ1 + +SCLOSP: PUSHJ P,SCLOSL + MOVE T,1(T) + TDZ T,[1,,1] ;CLEAR THESE BITS +MD,< MOVE TTT,MODE + CAIE TTT,BTXTM + JRST SCLSP1 + MOVE TTT,BTBODY + PUSH P,F + FETCH(F,TTT,BORI) + PUSHJ P,ORIENT + POP P,F + ADJUST(ADD,T,) +SCLSP1: +>;MD + MOVEM T,LSTCUR ;THIS IS NOW CURSOR POS OF LAST CLOSEST + JRST CHKON + +SCLOSL: PUSH P,TT + MOVE TT,MODE + XCT CLOSLT(TT) +SCLOS1: HRL T,TT + HRRZ TT,(TT) + CAIN TT,(T) + JRST SCLOSX + JUMPN TT,SCLOS1 + POP P,TT + PUSHJ P,FUCKUP + POPJ P, + +CLOSLT: MOVEI TT,SETPNT ;S + MOVEI TT,DBODPN ;B +MD,< MOVEI TT,PONPNT > ;P +MPC,< PUSHJ P,PONSID > ;P + PUSHJ P,FUCKUP ;L +MD,< MOVEI TT,PONPNT > ;T +MPC,< PUSHJ P,PONSID > ;T + PUSHJ P,FUCKUP ;A + PUSHJ P,FUCKUP ;MA + PUSHJ P,FUCKUP ;SP +MD,< PUSHJ P,BTLAST ;BT + PUSHJ P,FUCKUP ;BTA + PUSHJ P,FUCKUP ;E + PUSHJ P,FUCKUP ;EI + JRST SCLOSX ;ET DOESN'T USE CLAST + JRST SCLOSX ;EP " + PUSHJ P,FUCKUP ;EG + PUSHJ P,FUCKUP ;EA +>;MD +REPEAT NUMODES-<.-CLOSLT>, + +MD,< +BTLAST: MOVE TT,BTBODY + MOVEI TT,ADDR(TT,BTXT) + POPJ P, ;RETURN POINTER TO LIST HEAD +>;MD + +MPC,< +PONSID: FETCHL(TT,T,PBIT) + EQV TT,SID + SKIPL TT ;ON CURRENT SIDE? + SKIPA TT,[PONPN2] ;NO + MOVEI TT,PONPNT ;YES + POPJ P, +>;MPC + +SCLOSX: POP P,TT +SCLOSE: HRRZM T,CLOSES + HLRZM T,CLAST + PUSH P,T + MOVE T,CURSE + MOVEM T,LSTCUR ;NOTE LAST PLACE WE SET CLOSEST + POP P,T + SETOM CLOSUP + TRZ NEEDCL ;IF SETTING CLOSEST, DON'T NEED NEW ONE + POPJ P, + +FNDCLS: TRNE INMOV + POPJ P, ;DON'T GAFROTZ CLOSES + MOVE T,MODE + JRST @FNDTAB(T) + +FNDTAB: FNDSET ;S + FNDBOD ;B + FNDPNT ;P + FNDLIN ;L + FNDPNT ;T + NOFNDS ;A + NOFNDS ;MA + CPOPJ ;SP +MD,< BTXFND ;BT + NOFNDS ;BTA + EDIFND ;E + NOFNDS ;EI + EDTFND ;ET + EDPFND ;EP +> +REPEAT NUMODES+, + +NOFNDS: SETZM CLOSES ;NO CLOSEST ANYTHING + POPJ P, + FNDLIN: SETZM CLOSES ;CLEAR CLOSEST POINTER + PUSHJ P,CLSLIN ;FIND CLOSEST LINE + MOVEM A,CLOSES ;SAVE AS CLOSEST LINE (DON'T USE CLAST HERE) + POPJ P, + +CLSLIN: SETZ A, ;NO CLOSEST YET + SKIPN B,PONPNT ;NO POINTS? + POPJ P, + MOVSI T,177777 ;FAR ENOUGH + MOVEM T,DIFSOF +FLLOP: +MD,< + FETCH(E,B,PND) + JUMPE E,.+2 ;NONE? + PUSHJ P,ISCLLN ;SEE IF CLOSER + FETCH(E,B,PNR) + JUMPE E,.+2 ;NONE? + PUSHJ P,ISCLLN ;SEE IF CLOSER +>;MD +MPC,< FETCH(D,B,PNEB) + JUMPE D,FLLOP2 +FLLOP1: HLRZ E,(D) + JUMPE E,.+2 + PUSHJ P,ISCLLN + HRRZ E,1(D) + JUMPE E,.+2 + PUSHJ P,ISCLLN + HLRZ E,1(D) + JUMPE E,.+2 + PUSHJ P,ISCLLN + HRRZ D,(D) + JUMPN D,FLLOP1 +FLLOP2: +>;MPC + FETCH(B,B,PNXT) + JUMPN B,FLLOP + POPJ P, + +ISCLLN: FETCH(C,B,PXY) ;GET X,Y OF FIRST POINT +MPC,< CAMGE C,ADDR(E,PXY) ;DO SEGMENT ONCE ONLY + POPJ P, +>;MPC + FETCH(F,E,PXY) ;GET X,Y OF SECOND POINT + MOVE TTT,CURSE ;GET CURSOR X,Y + MOVE T,F + XOR T,C ;GET DIFFERENCE + TLNN T,-1 ;LEFT HALF ZERO? + JRST [TRNN T,-1 ;YES, RIGHT HALF ZERO TOO? + POPJ P, ;YES + MOVEI TT,1 ;NO, LEFT HALF ONLY, ZERO. VERT. LINE + HRRZM TTT,TPOINT + HLLM F,TPOINT + JRST LRTCON] + TRNE T,-1 ;RIGHT HALF ZERO? + JRST LRSLAN ;NO, SLANTY LINE + MOVEI TT,2 ;YES, HORIZ. LINE + HLLZM TTT,TPOINT + HRRM F,TPOINT + MOVSS F + MOVSS C ;SWAP HALVES + MOVSS TTT +LRTCON: HLRE T,C ;GET THE PART THAT'S THE SAME (X OR Y) + HRRES F + HRRES C + HRRE G,TTT +MD,< CAME F,G ;WELL IF PHIL SAYS SO! + CAMN C,G ;EITHER END SAME AS CURSOR? + POPJ P, ;YES, CAN'T BE CLOSE +>;MD + CAML F,G ;GREATER THAN ONE BUT LESS THAN THE OTHER? + JRST [CAMG C,G + JRST ISPOSS + POPJ P,];NO, NOT CLOSE + CAMG C,G + POPJ P, ;NO, NOT CLOSE +ISPOSS: HLRES TTT ;GET OTHER THING + SUB TTT,T ;GET DIFFERENCE + IMUL TTT,TTT ;SQUARE IT + CAML TTT,DIFSOF ;DISTANCE SMALLER? + POPJ P, ;NO +ITCLSS: TLNE M,XWINDOW!MACACT!DSKACT + JRST ITCLSX + MOVE T,TPOINT ;TAKE INTERSECTION POINT + PUSH P,TTT + PUSHJ P,ONSCR + JRST [ POP P,(P) + POPJ P,] ;NOT ON + POP P,TTT +ITCLSX: MOVEM TTT,DIFSOF;YES, DEPOSIT NEW DISTANCE + MOVE A,B ;GET POINTERS + HRL A,E + MOVE T,TPOINT + TDZ T,[1,,1] + MOVEM T,IPOINT + POPJ P, + LRSLAN: HLRE T,CURSE + MOVEM T,DX1 ;STORE HERE TERMPORARILY + HRRE T,CURSE + PUSHJ P,CALINE ;RETURN LENGTH IN TTT + POPJ P, ;OFF ONE END OR OTHER + DIV TT,L2 ;DO FINAL CALC + MOVM TTT,TT + CAML TTT,DIFSOF + POPJ P, + CAML T,L2 + JRST [ FETCH(T,E,PXY) + MOVEM T,TPOINT + JRST ITCLSS] + PUSH P,TTT + DIV T,L2 ;CALC SCALE + FETCH(TTT,B,PY) + FETCH(TT,E,PY) + SUB TT,TTT + MULM T,TT + ADD TT,TTT + MOVEM TT,TPOINT + HLRE TTT,1(B) + HLRE TT,1(E) + SUB TT,TTT + MULM T,TT + ADD TT,TTT + HRLM TT,TPOINT + POP P,TTT + JRST ITCLSS + +CALINE: FETCH(TT,B,PY) + SUB T,TT + MOVEM T,DY1 + FETCH(T,E,PY) + SUB T,TT + MOVEM T,DY3 + FETCH(TT,B,PX) + MOVE T,DX1 + SUB T,TT + MOVEM T,DX1 + FETCH(T,E,PX) + SUB T,TT + MOVEM T,DX3 + MOVE T,DX3 + IMUL T,DX3 + MOVE TT,DY3 + IMUL TT,DY3 + ADD T,TT + MOVEM T,L2 + MOVE T,DX1 + IMUL T,DX3 + MOVE TT,DY1 + IMUL TT,DY3 + ADD T,TT + JUMPLE T,CPOPJ ;NEGATIVE MEANS OFF ONE END + MOVMS T + CAML T,L2 + POPJ P, + MOVE TT,DX1 ;INSIDE LINE, CALC LENGTH + IMUL TT,DY3 + MOVE TTT,DX3 + IMUL TTT,DY1 + SUB TT,TTT + MUL TT,TT ;PRODUCE DOUBLE LENGTH RESULT + JRST CPOPJ1 + ;SQRT: FINDS THE SQUARE ROOT OF THE INTEGER IN T. USES TT AND TTT +SQRT: JFFO T,.+2 ;FIND THE HIGH ORDER BIT + POPJ P, ;ZERO? + SUBI TT,=37 + MOVNS TT + LSH TT,-1 + MOVEI TTT,1 + LSH TTT,-1(TT) ;MAKE WORD WITH HALF AS MANY LOW ORDER BITS + SETOM SQRFLG ;TURN ON TEMP (COUNT) FLAG +SLOP1: MOVE TT,TTT ;GET APROXIMATE SQRT + IDIVM T,TT ;DIVIDE IT INTO THE SQUARE + ADD TT,TTT ;ADD APROX. + ASH TT,-1 ;DIVIDE BY 2. THIS IS THE NEW APPROX. + MOVE TTT,TT ;GET APPROX. + IDIVM T,TTT ;DIVIDE IT INTO THE SQUARE + ADD TTT,TT ;ADD APPROX. + ASH TTT,-1 ;DIVIDE BY 2. THIS IS THE NEW APPROX. + AOSG SQRFLG ;GONE THROUGH TWICE? + JRST SLOP1 ;NO + MOVE T,TTT + POPJ P, + ;FNDSET, FNDBOD, FNDPNT, EDTFND, EDPFND, EDIFND +FNDSET: MOVEI F,SETPNT ;GET SET POINTER + JRST CLFNDA ;FIND CLOSEST SET. + +FNDBOD: MOVEI F,DBODPN ;GET POINTER TO LIST OF BODIES + JRST CLFNDA ;FIND BODY WHICH IS CLOSEST TO CURSOR + +FNDPNT: MOVEI F,PONPNT ;GET POINTER TO POINTS WHICH ARE ON THE SCREEN + JRST CLFNDA ;FIND POINT WHICH IS CLOSEST OT CURSOR + +MD,< +BTXFND: MOVE F,BTBODY + MOVEI F,RADDR(F,BTXT,QNXT) + JRST CLFNDA + +EDTFND: MOVE A,CURBOD ;GET POINTER TO CURRENT BODY (TYPE) DEFINITION + FETCH(B,A,TPROP) ;last won't be right if first prop!! + JRST CLFND ;FIND PIECE OF TEXT CLOSEST TO CURSOR + +EDIFND: MOVE A,CURBOD + MOVEI F,RADDR(A,TLIN,QNXT) + JRST CLFNDA ;FIND CLOSEST POINT IN LINES + +EDPFND: MOVE A,CURBOD ;GET POINTER TO CURRENTLY-BEING-EDITED TYPE DEF. + MOVEI F,RADDR(A,TPIN,QNXT) + JRST CLFNDA +>;MD + ;CLFNDA - FIND GEOMETRICALLY CLOSEST +;F = Pointer before list of POINTS, BODIES, SET, DISPLAY LIST, ... +;Returns closest item in A and CLOSES +;CLOSES = ITEM +;CLAST = PREVIOUS ITEM +; (Note: if Closest to TYPE property, CLAST may not have the right +; thing if that is the first prop on list. The pointer +; to the prop list is in the LH for a type! Crock) + +CLFNDA: FETCH(B,F,QNXT) ;NEXT ITEM OF POINT (OR BODY OR SET) +CLFND: HRLOI TT,177777 ;MAKE A LARGE NUMBER(LARGE ENOUGH) + MOVE E,TT + SETZB A,CLOSES ;CLEAR CLOSEST POINTERS + JUMPE B,CPOPJ +CLOP1: FETCH(T,B,QXY) ;GET X,Y WORD + TDZ T,[1,,1] + TRNE INLIN ;DRAWING A LINE? + CAME B,LINING ;YES, IS THIS THE POINT FROM WHICH WE ARE DRAWING? + CAIA + JRST CLOP2 ;YES, IGNORE IT + MOVE D,MODE + CAIE D,TXTM + JRST NOTXTM ;NOT TEXT MODE + FETCH(D,B,PTXT) ;ANY TEXT ON THIS POINT? + JUMPE D,CLOP2 +NOTXTM: +MD,< MOVEI D,1 + LSH D,@MODE + TDNN D,[1EDTTM!1BTXTM] + JRST NOETXM + TDNN D,[1BTXTM] + JRST NADJBT + MOVE TTT,BTBODY ;BODY WE'RE EDITING + PUSH P,F + FETCH(F,TTT,BORI) + PUSHJ P,ORIENT + POP P,F + ADJUST(ADD,T,<1(TTT)>) ;CALC SCREEN POS OF TEXT +NADJBT: FETCH(D,B,TXBIT) + TRNE D,TXBIND + JRST CLOP2 ;DON'T FIND INDIRECT POINTERS + FETCH(D,B,TXVAL) + FETCH(D,D,TSSIZ) ;0 SIZE MEANS INVISIBLE PROPERTY + TLNN M,%IDENT + JUMPE D,CLOP2 +NOETXM: +>;MD + MOVEM T,CLXY ;SAVE X,Y HERE + SUB T,CURSE ;SUBTRACT CURSOR POSITION + MOVMS T ;GET ABS OF DIFFERENCE + CAMLE T,TT ;THIS ONE SMALLER X DISTANCE? + JRST CLOP2 ;YES, THINK ABOUT IT MORE +TRYIT: FETCH(T,B,QXY) + CAMN T,ADDR(A,QXY) + JUMPN A,CKCOIN ;IF ALREADY HAVE CLOSEST AT SAME PLACE, CHECK + TLNE M,DSKACT!MACACT!XWINDOW ;WINDOWING? + JRST WINX ;NO TEST IF NO WINDOW + MOVE T,CLXY ;YES, SEE IF ONSCREEN + PUSHJ P,ONSCR + JRST CLOP2 + ;FALLS THRU +WINX: HLRE T,CLXY ;GET X OF POINT + HLRE D,CURSE ;GET X OF CURSOR + SUB T,D ;GET DIFF. + MOVMS T ;ABS VAL. + HRRE D,CLXY ;GET Y OF POINT + SUB D,CURSE ;SUBTRACT CURSOR (Y IN RIGHT HALF) + HRRES D ;GET Y PART + MOVMS D ;ABS. VAL. + IMUL D,D ;Y^2 + IMUL T,T ;X^2 + ADD T,D ;X^2+Y^2 + CAMLE T,E ;SMALLER OR EQUAL DISTANCE? + JRST CLOP2 ;NO + MOVE A,B ;YES, SHORTEST SO FAR. HOLD POINTER TO IT + HRL A,F ;ALSO LAST POINTER + MOVE E,T ;REPLACE COMPARE WITH NEW ONE + PUSHJ P,SQRT ;GET SQRT OF DISTANCE + ADDI T,20 ;SAFETY FACTOR + MOVS TT,T ;REPLACE THE X-PART COMPARE WITH THE DISTANCE +CLOP2: MOVE F,B ;LAST POINTER + FETCH(B,B,QNXT) ;NO, GO TO NEXT + JUMPN B,CLOP1 ;LOOP IF MORE TO LOOK AT + HRRZM A,CLOSES ;DEPOSIT POINTER TO CLOSEST + HLRZM A,CLAST ;ALSO LAST + POPJ P, + +CKCOIN: MOVEI TTT,1 + LSH TTT,@MODE + TDNN TTT,[1PNTM!1TXTM] + JRST WINX ;ONLY CHECK POINTS + FETCH(TTT,A,PBIT) + TRNE TTT,MPC,ISPIN ;DON'T FIND PIN IF COINCEDENT + JRST WINX ;CONTINUE CHECK + JRST CLOP2 ;LOSE IMMEDIATELY + ;UPCLOS +UPCLOS: TLNE DSPACT ;DISPLAYING AT ALL? + TRNE INMOV!STBOX;DOING ANYTHING OBVIOUSLY WRONG? + POPJ P, ;YES, DON'T INDICATE CLOSEST + SKIPN CLOSUP ;NEED TO UPDATE CLOSES DISPLAY? + POPJ P, ;NO + SETZM CLOSUP + MOVE T,MODE + SKIPE A,CLOSES + JRST @UPTAB(T) +UPNONE: MOVEI T,BIGPG + JRST HYDPOG + +UPTAB: .UPSET ;S + .UPBOD ;B + .UPPNT ;P + .UPLIN ;L + .UPPNT ;T + UPNONE ;A + UPNONE ;MA + UPNONE ;SP +MD,< .UPBTX ;BT + UPNONE ;BTA + .UPED ;E + UPNONE ;EI + .UPED ;ET + .UPEDP ;EP +> +REPEAT NUMODES+, + +SPSETUP: + SKIPA T,[ANGLPG] +.SETUP: MOVEI T,BIGPG + MOVEM T,PGLASS + PUSHJ P,DPYSET + JRST SETBRT + +.UPVCT: MOVE T,1(A) ;X,Y OF THING +.UPT: TDZ T,[1,,1] + PUSHJ P,ONSCR ;ON SCREEN? + POPJ P, + PUSHJ P,VHLINE ;MAKE CROSS HAIRS (MAYBE) + PUSHJ P,BIGAIV ;PUT IN VECTOR TO THERE + JRST CPOPJ1 + +MD,< +.UPEDP: PUSHJ P,.SETUP + MOVE T,1(A) + PUSHJ P,.UPT + JRST UPNONE + MOVEI T,"*"+"*"+1 + PUSHJ P,TXTDPB + JRST BLINKO + +.UPBTX: PUSHJ P,.SETUP + MOVE T,1(A) + PUSH P,F + MOVE TT,BTBODY + FETCH(F,TT,BORI) + PUSHJ P,ORIENT + POP P,F + ADJUST(ADD,T,<1(TT)>) + PUSHJ P,.UPT + JRST UPNONE + FETCH(T,A,TXNAM) + SKIPE T ;SKIP IF NOT PROPERTY + SKIPA T,[ASCID/BTP/] + MOVE T,[ASCID/BT/] + PUSHJ P,TXTDPB + JRST BLINKO +>;MD + +MD,< +.UPED: SKIPA T,[ASCID/*/] +>;MD +.UPBOD: MOVEI T,"B"+"B"+1 + PUSH P,T + PUSHJ P,.SETUP + PUSHJ P,.UPVCT + JRST [ POP P,(P) + JRST UPNONE] + POP P,T + PUSHJ P,TXTDPB + JRST BLINKO ;OUTPUT IT + +SETBRT: +MPC,< TRNE BTHSDS + SKIPA T,BTHBRT ;ALWAYS USE 7 IF BOTH SIDES ARE ON +>;MPC + MOVE T,DEFBRT ;GET CURRENT BRIGHTNESS + ADDI T,1 + JRST DPYBRT + ;.UPPNT +.UPPNT: PUSHJ P,.SETUP + PUSHJ P,.UPVCT + JRST UPNONE + MOVSI T,() + TRNE INLIN ;DRAWING A LINE? + JRST GTPNTC ;YES, JUST STAR + MOVSI T,() + FETCH(TT,A,PTXT) + JUMPE TT,NOTEX ;ANY TEXT? + MOVSI T,() + FETCH(TT,TT,TCSTR) + FETCH(TTT,TT,TSSIZ) + TRNE TTT,400000 + TLO T,() +NOTEX: FETCHL(TT,A,PBIT) + TLNE TT,ISPIN ;IS THIS POINT A PIN + TRO T,"A"+"A" ;YES, TACK ON AN A + TLNE TT,CPIN ;CONNECTOR PIN? + TRO T,"C"+"C" ;TACK ON A "C" +MD,< SKIPN ADDR(A,PND) + SKIPE ADDR(A,PNL) ;ANY LINES ATTACHED HERE? + TRO T,"L"10 +>;MD +MPC,< FETCH(TTT,A,PNEB) + JUMPE TTT,UPPNTA +UPPNTB: SKIPE 1(TTT) + JRST UPPNTC + SKIPN TTT,(TTT) + JRST UPPNTA + TLNN TTT,-1 + JRST UPPNTB +UPPNTC: TRO T,"L"10 +UPPNTA: LDB TTT,[POINT 3,TT,6] + IOR T,(TTT)[ 0 + "G"17 + "1"17 + "2"17 + "3"17 + 0 + 0 + 0 ] +>;MPC +GTPNTC: TRO T,1 ;MAKE IT ASCID + PUSHJ P,TXTDPB + JRST BLINKO ;OUTPUT THE THING + ;.UPSET +.UPSET: PUSHJ P,.SETUP + PUSHJ P,.UPVCT + SKIPA T,[1] ;FLASH THE ONES ON SCREEN ANY WAY + MOVEI T,"S"+"S"+1 ;ASCID S + PUSHJ P,DCLSET + JRST BLINKO ;AND BLINK IT + +DCLSET: PUSHJ P,TXTDPB + HLRZ A,(A) ;POINTER TO THIS SET +STPNTR: HRRZ TT,1(A) ;POINTER TO FIRST POINT IN SET + JUMPE TT,SNOPNT ;NO POINT? + MOVE T,1(TT) + PUSHJ P,ONSCR + JRST SNOPNT +MPC,< FETCHL(T,TT,PBIT) + EQV T,SID ;ON THIS SIDE? + TLNN T,FRONT + TRNE BTHSDS ;OR BOTH SIDES ON? + CAIA + JRST SNOPNT ;NO +>;MPC + FETCH(T,TT,PXY) + PUSHJ P,BIGAIV + MOVEI T,"P"+"P"+1 ;ASCID P + PUSHJ P,TXTDPB +SNOPNT: HLRZ T,1(A) ;POINTER TO FIRST BODY IN SET + JUMPE T,SNOBOD ;NO BODY? + MOVE T,1(T) ;X,Y + PUSHJ P,BIGAIV + MOVEI T,"B"+"B"+1 ;ASCID B + PUSHJ P,TXTDPB +SNOBOD: HRRZ A,(A) ;NEXT WORD OF SET + JUMPN A,STPNTR + POPJ P, + ;.UPLIN +.UPLIN: PUSHJ P,.SETUP + MOVE T,IPOINT + PUSHJ P,ONSCR + JRST [ MOVEI T,BIGPG + JRST HYDPOG] + PUSHJ P,VHLINE ;MAKE CROSS HAIRS (MAYBE) + PUSHJ P,BIGAIV ;PUT IN VECTOR TO THERE + MOVEI T,"L"1+1 ;ASCID L + PUSHJ P,TXTDPB + JRST BLINKO + ;LINES, BOXES, BODY +DOSLPB: MOVE T,MODE + JRST @SLPBTB(T) + +SLPBTB: DRWBOX ;S + NOSLPB ;B + DOANGL ;P + NOSLPB ;L + DOANGL ;T + ARROW ;A + ARROW ;MA + DOSPM ;SP +MD,< + NOSLPB ;BT + ARROW ;BTA + NOSLPB ;E + NOSLPB ;EI + NOSLPB ;ET + NOSLPB ;EP + NOSLPB ;EG + ARROW ;EA +>;MD +REPEAT NUMODES+, + +NOSLPB: MOVEI T,ANGLPG + JRST HYDPOG + +DOSPM: JRST @SPDISP + +UPSTAL: PUSHJ P,SPSETUP + TRNE INLIN + PUSHJ P,DOANGS ;OUTPUT ANGLE HERE + JRST UPSTA1 + +UPSTAR: PUSHJ P,SPSETUP ;SETUP TO ANGLE PG +UPSTA1: MOVE T,STARLOC + PUSHJ P,.UPT ;ONSCREEN? GO THERE + JRST UPNONE + MOVEI T,"*"+"*"+1 + PUSHJ P,TXTDPB + JRST BLINKO + + ;UPREP +UPREP: TRZ MCHG ;NOOP THE MAIN DISPLAY + MOVEI T,CPOPJ + MOVEM T,DSPDSP + PUSHJ P,NOSLPB + MOVEI T,MAINPG + MOVEM T,PGLASS + PUSHJ P,DPYSET + PUSHJ P,SETBRT + SETZ F, + MOVE A,OLDTYP + MOVEI D,0 + UNSCAL(D) + ADD D,YOFF + MOVE T,[(3*%LEFT+%RIGHT)/4] + UNSCAL(T) + ADD T,XOFF + HRL D,T + PUSHJ P,PUTBDL + MOVE T,[(3*%RIGHT+%LEFT)/4] + UNSCAL(T) + ADD T,XOFF + HRL D,T + MOVE A,NEWTYP + PUSHJ P,PUTBDL + JRST MAINOU + ;ANGLE (LINE OR SETBOX) +DOANGL: TRNE INLIN ;ARE WE IN A LINE? + SKIPN LINING ;REALLY???? + JRST NOSLPB ;NO + MOVEI T,ANGLPG + MOVEM T,PGLASS ;YES, USE PIECE OF GLASS 1 + PUSHJ P,DPYSET ;SET UP BUFFER + PUSHJ P,SETBRT + PUSHJ P,DOANGS + JRST BLINKO ;OUTPUT IT + +DOANGS: MOVE A,LINING ;GET POINTER TO CURRENT POINT WE ARE DRAWING FROM + MOVE T,1(A) ;GET X,Y + PUSHJ P,AIVECT ;DRAW INVIS. TO IT +MD,< MOVE T,CURSE ;GET CURSOR POSITION + TRNN ZIGZAG ;OTHER WAY? + MOVE T,1(A) ;YES, GET POINT + HLL T,CURSE ;GET CURSOR X + TRNE ZIGZAG ;OTHER WAY? + HLL T,1(A) ;NO, GET POINT X + PUSHJ P,AVECT ;DRAW LINE TO IT +>;MD + MOVE T,CURSE ;GET CURSOR POSITION + JRST AVECT ;DRAW LINE TO IT + ;SETBOX +DRWBOX: TRNN STBOX + JRST NOSLPB + MOVEI T,ANGLPG + MOVEM T,PGLASS + PUSHJ P,DPYSET + MOVE A,SETBOX + MOVE T,1(A) + PUSHJ P,AIVECT + JRST NXTDRW +NXTDR1: MOVE T,1(A) + PUSHJ P,AVECT +NXTDRW: HRRZ A,(A) + JUMPN A,NXTDR1 + MOVE A,ENDBOX + MOVE T,CURSE ;GET CURSOR POSITION + TRNN ZIGZAG ;OTHER WAY? + MOVE T,1(A) ;YES, GET POINT + HLL T,CURSE ;GET CURSOR X + TRNE ZIGZAG ;OTHER WAY? + HLL T,1(A) ;NO, GET POINT X + PUSHJ P,AVECT ;DRAW LINE TO IT + MOVE T,CURSE ;GET CURSOR POSITION + PUSHJ P,AVECT ;DRAW LINE TO IT + JRST BLINKO + ;ARROW +ARROW: MOVE T,TXTCNT + CAMN T,LPNTR + POPJ P, + MOVEM T,LPNTR + MOVN T,ALTLIN + MOVEM T,LINCNT ;INITIALIZE TO - NUMBER OF LINES WE HAVE MOVED UP + SETZM CHRCNT + MOVE T,TXTPNT + ADD T,[POINT 7,1] + MOVE TTT,TXTCNT + MOVEM TTT,TOTCNT +ARROW1: TLNN T,760000 + JRST [ HRR T,-1(T) + TRNE T,-1 + JRST .+1 + JRST ARROW2] + ILDB TT,T + JUMPE TT,ARROW1 + SOSG TOTCNT + JRST ARROW2 + AOS TTT,CHRCNT + CAIL TTT,MAXLIN ;FORCED CRLF? + JRST ARROW3 ;YES + CAMN TT,EOLCHR ;END OF LINE CHARACTER? + JRST ARROW3 + JRST ARROW1 + +ARROW3: SETZM CHRCNT + AOS LINCNT + JRST ARROW1 + +ARROW2: MOVEI T,ANGLPG + SKIPL TT,LINCNT ;IS TEXT ON SCREEN? + CAILE TT,MAXPAG ;CHECK TOP ALSO + JRST HYDPOG ;NO, HIDE CURSOR + MOVEM T,PGLASS + PUSHJ P,DPYSET + MOVEI TT,106 + TDO TT,BSOR + MOVN T,LINCNT + IMUL T,DPYPTY+ACHRSZ +IFN AYPOS,< ADD T,[AYPOS] > + DPB T,[POINT 11,TT,21] ;Y PART + MOVN T,DPYPTX+ACHRSZ +IFN AXPOS, + DPB T,[POINT 11,TT,10] ;X PART + PUSH P,TT + TRO TT,40 + PUSHJ P,INSOU2 ;DEPOSIT + MOVE TT,CHRCNT + IMUL TT,DPYPTX+ACHRSZ +IFN AXPOS, + SUBI TT,2 ;JUST BEFORE CHAR + DPB TT,[POINT 11,(P),10] + MOVE TT,(P) + PUSHJ P,INSOUT ;STUFF IT + POP P,TT + LDB T,[POINT 11,TT,21] + MOVE TTT,DPYPTY+ACHRSZ + ASH TTT,-2 + ADD T,TTT + DPB T,[POINT 11,TT,21] + PUSHJ P,INSOUT + JRST OUTDPY diff --git a/src/draw/com.505 b/src/draw/com.505 new file mode 100644 index 00000000..2a42de04 --- /dev/null +++ b/src/draw/com.505 @@ -0,0 +1,1561 @@ +;COM.FAI.132, 15-NOV-75 18:03:32, EDIT BY HELLIWELL +VERSION(COM,11) + +GLOBAL DFLT0,DFLTM + +STRT: MOVE P,[IOWD PDLEN,PDL] + RESET +III,< MOVE T,[14,,1] + SETUUO T, ;Request to run on CPU 0 only +>;III +DEC,< PUSHJ P,DECGO +VB10,< SETZ + SETUWP ;SET THE HIGH SEG. WRITABLE + JFCL +>;VB10 +>;DEC + SETZM ZLOWBEGIN + MOVE T,[XWD ZLOWBEGIN,ZLOWBEGIN+1] + BLT T,ZLOWEND ;SEE THE CODE WE SAVE! +DEC,< PUSHJ P,CLTIME > ;INITIALIZE TIME CELLS +LAY,< JSR LINIT ;INIT LAYOUT STUFF> +STRTL: SETZM ZEROBEGIN + MOVE T,[ZEROBEGIN,,ZEROBEGIN+1] + BLT T,ZEROEND + MOVE P,[IOWD PDLEN,PDL] + MOVE T,[XWD -MPDLEN,MACPDL-1] + MOVEM T,MACPNT +MPC,< MOVEI T,FSTBOD + MOVEM T,BODPNT ;INITIALIZE STANDARD DIP DEFS +>;MPC + SETOM DSKEND ;ALWAYS STARTS WITH EOF +LAY,< +MD,< OUTSTR[ASCIZ/LAYOUT, D SIDE! +/] +>;MD +MPC,< OUTSTR[ASCIZ/LAYOUT, PC SIDE! +/] +>;MPC +>;LAY + + + PUSHJ P,BLKINI ;INITIALIZE BLOCK FREE STORAGE + +;*** SET DEFAULTS, SETUP DISPLAY *** + + PUSHJ P,ALLDEF + PUSHJ P,DCLAIM +DEC,< PUSHJ P,LOGINI > + PUSHJ P,NREADY + JRST MAIN + + ;SETUP DEFAULTS +ALLDEF: +ROUTE,< +MPC,< MOVEI T,3 + MOVEM T,RCODE ;INITIALIZE ROUTE CODE +FOR I IN (CNR,FED,BAK,SID) +< MOVEI T,CAT(%,I) + MOVEM T,CAT(.,I) +> +>;MPC +>;ROUTE +DEC,< +MD,< PUSHJ P,SETOUT > + PUSHJ P,SETCLC ;DEFAULT TO CLOCATE & OUTSIDE + PUSHJ P,CLRLC ;AND NO LOWER CASE! + PUSHJ P,CLBOOP ;AND NO BOOPING. +GT,< SETOM OPTFLG > ;SET FOR OPTIMIZED DISPLAY ROUTINES +>;DEC +RSTDEF: PUSHJ P,CLRNOM ;INITIALIZE BOARD TYPE +MD,< PUSHJ P,CLRWW > + MOVEI T,DBLARR + MOVEM T,EOLCHR ;END OF LINE FOR TEXT +WAG,< MOVE T,[STRTWR] ;FIRST WIRE FILENAME -1 + MOVEM T,LASTWR +>;WAG +MD,< DATE T, + HRLZM T,DRWDAT + MSTIME T, + IDIVI T,=1000*=60 ;TO MINUTES + HRRM T,DRWDAT + MOVSI T,EXTFIL + MOVEM T,DRWEXT ;INIT EXTENSION AND CHECKSUM + SETZB T,DRWNAM +NODEC,< DSKPPN T, > +DEC,< GETPPN T, > + MOVEM T,DRWPPN +>;MD + MOVEI T,DFSCL + MOVEM T,NSCALE +MD,< MOVEI T,8*2 ;STUB IS 8 STEPS + MOVEM T,STBSIZ +>;MD +MPC,< MOVSI SID,FRONT ;START ON FRONT SIDE + MOVEI T,=10 ;50 MIL STEPS TO START WITH + MOVEM T,STPSIZ +>;MPC + MOVEI T,BODM + MOVEM T,MODE + PUSHJ P,CLRBRT + MOVE 0,[DFLT0] + MOVE M,[DFLTM] + PUSHJ P,CLCBRT + JRST HOME ;CENTER SCREEN + ;MAIN COMMAND LOOP +MLOP: XCT T ;XCT THE DISPATCH + TRNN INMOV ;ARE WE MOVING SOMETHING? + JRST MAIN0 + PUSHJ P,@MDISP ;YES, MOVE IT + MOVE TT,CLOSES + MOVE T,MODE + CAIE T,PNTM + CAIN T,TXTM + MOVEM TT,MOVED + JRST MAIN + +MAIN0: SKIPE A,MOVED + PUSHJ P,STOPM ;STOP MOVING - CHECK FOR OVERLAPPING POINTS + SETZM MOVED +MAIN: MOVEM 0,SAVER0 ;SAVE REGISTERS IN CASE OF REENTER + MOVEM M,SAVERM +NODEC,< +NOIII,< + SKIPE AUTOSM ;AUTO-SAVING? + SOSE AUTOSN ;YES, TIME TO SAVE? + CAIA + PUSHJ P,ESAVE ;DO ESAVE +>;NOIII +>;NODEC + SKIPE AUTOWM + SOSE AUTOWN + CAIA + PUSHJ P,EWRITE +LAY,< SKIPN C,ODISP ;IS OTHER PROG TRYING TO TELL US SOMETHING?> + PUSHJ P,GETCHM ;GET THE NEXT CHARACTER (IN C) +III,< CAIN C,40 + PUSHJ P,LHYRST +>;III +LAY,< SETZM ODISP ;ONLY ONCE!> + TLNN M,DSKACT!MACACT ;DON'T UPDATE CURSOR? + SKIPN ISDPY + JRST NOCURS + TRNN M,CURSOR ;ARE WE CURSING? + JRST NOCURS + PUSH P,C + PUSHJ P,GETPOS ;UPDATE POSITION FROM DISPLAY PROG + TRNE INMOV ;MAY HAVE TO FIX MOVING + PUSHJ P,@MDISP + POP P,C +NOCURS: LDB A,[POINT 2,C,28] ;GET CONTROL BITS + MOVEI B,1 + LSH B,(A) ;BITS TO TEST FOR CTRL KEYS + ANDI C,177 ;CLEAR EXTRA BITS + SKIPN T,DTAB(C) ;PICK UP TABLE ENTRY. ZERO? + JRST ERRET ;YES, ILLEGAL CHR. + MOVEI D,1 + LSH D,@MODE ;GET A BIT TO TEST FOR LEGAL IN THIS MODE + CAIA + AOBJN T,.+1 + TDNN D,(T) ;DO BITS MATCH? + JRST .-2 + JRA T,MLOP ;YES, MATCH, PICK UP DISPATCH INSTR. + +ERRET: PUSHJ P,PERRET + JRST MAIN + +FUCKUP: + OUTSTR[ASCIZ/Boy, have I screwed up! Get a wizard!! +CALLED FROM /] + PUSH P,T + PUSH P,TT + HRLO TT,-2(P) ;GET PC +FCKLOP: SETZ T, + LSHC T,3 + ADDI T,60 + OUTCHR T + TRNE TT,777777 + JRST FCKLOP + OUTSTR[ASCIZ/ +/] + POP P,TT + POP P,T +NODEC,< POP P,.JBOPC ;POP RETURN INTO .JBOPC + SKIPN .JBDDT + HALT @.JBOPC + PUSH P,.JBDDT + POPJ P, +>;NODEC +DEC,< JRST TODDT > + ;0-9 SPC + -  + +.1DNUM: + ANYALT + -1 + +.2DNUM: PUSHJ P,ALTNUM + JRST ERRET + +SKEY,< +.1D1: 1PNTM!1TXTM + ANYALT + -1 + +.2D1: PUSHJ P,LINUP + PUSHJ P,ALTNUM + JRST ERRET + +.1D2: 1PNTM!1TXTM + ANYALT + -1 + +.2D2: PUSHJ P,LINDWN + PUSHJ P,ALTNUM + JRST ERRET + +.1D3: 1PNTM!1TXTM + ANYALT + -1 + +.2D3: PUSHJ P,LINLFT + PUSHJ P,ALTNUM + JRST ERRET + +.1D4: 1PNTM!1TXTM + ANYALT + -1 + +.2D4: PUSHJ P,LINRT + PUSHJ P,ALTNUM + JRST ERRET + +.1D5: 1BODM + ANYALT + -1 + +.2D5: MODISP C1,ASSET + PUSHJ P,ALTNUM + JRST ERRET + +.2D6: PUSHJ P,ALTNUM + PUSHJ P,MOVLF1 + +.2D7: PUSHJ P,ALTNUM + PUSHJ P,MOVRT1 + +.2D8: PUSHJ P,ALTNUM + PUSHJ P,MOVUP1 + +.2D9: PUSHJ P,ALTNUM + PUSHJ P,MOVDN1 +>;SKEY + +.1DSPC: +MD,< 1EDTIM ; SPACE> +MD,< 1PNTM!1TXTM ;POINT MODE> + 1SETM ;SET MODE +MD,< 1EDTGM ;GETTING BODY MODE> + ANYALT + -1 +.2DSPC: +MD,< PUSHJ P,EDSPC> +MD,< PUSHJ P,PNSPC> + PUSHJ P,SSPACE +MD,< PUSHJ P,GETYES ;PLANT BODY> + PUSHJ P,FORWRD + PUSHJ P,CLRMOV ;STOP MOVING + +SKEY,< +.1DCX: +MD,< 1EDTIM > + ANYALT + -1 + +.2DCX: +MD,< PUSHJ P,EDSPC > + PUSHJ P,FORWRD + JRST ERRET +>;SKEY + +.1DPLS: +MD,< 1EDTIM ;+ (EDIT INSERT MODE)> + 1PNTM!1TXTM ;+ IN POINT MODE + 1SETM ;+ IN SET MODE + ANYALT + -1 +.2DPLS: +MD,< PUSHJ P,EDPLUS> + PUSHJ P,PPLUS + PUSHJ P,SPLUS + PUSHJ P,ALTPLS + JRST ERRET + +.1DMNS: +MD,< 1EDTIM ;-> + 1PNTM!1TXTM ;POINT MODE + 1SETM ;SET MODE + ANYALT + -1 + +.2DMNS: +MD,< PUSHJ P,EDMINS> + PUSHJ P,PNMNS + PUSHJ P,STMNS ;END BOX + PUSHJ P,ALTMNS ;- IN ALTER MODE + JRST ERRET + +MD,< +.1DNOT: 1PNTM!1TXTM + -1 +.2DNOT: PUSHJ P,PNOT + JRST ERRET +>;MD + ;A-D +.1DA: 1PNTM!1TXTM +MD,< 1EDTTM + 1BTXTM +>;MD + -1 +.2DA: XCT (A)[JRST ERRET + PUSHJ P,PATT + PUSHJ P,LATT + PUSHJ P,ALTER] +MD,< MODISP C3,EALTER + MODISP C3,BTALTR +>;MD + JRST ERRET + +.1DB: MD,<1BTXTM!>1SETM!1BODM + 1PNTM!1TXTM + 1LINM + -1 +.2DB: MODISP C3,TOP3B + XCT (A)[JRST ERRET +MD,< PUSHJ P,BREAKH + PUSHJ P,BREAKV +>;MD +MPC,< JRST ERRET + JRST ERRET +>;MPC + PUSHJ P,TOP3B] + XCT (A)[JRST ERRET + MD,< PUSHJ P,BENDL1 + PUSHJ P,BENDL2> + MPC,< PUSHJ P,BENDL + JRST ERRET> + PUSHJ P,TOP3B] + JRST ERRET + +.1DC: ANYALT ;SNARF OFF EDIT ALTER MODE HERE + MD,1SETM!1BODM!1PNTM!1TXTM!1LINM + -1 +.2DC: PUSHJ P,ALTC + XCT(A)[JRST ERRET + PUSHJ P,CCENTR ;CURSOR TO CENTER OF PIC + PUSHJ P,PCENTR ;PIC CENTER TO CURSOR POS. + PUSHJ P,HOME] ;BOTH BACK TO ZERO. + JRST ERRET + +.1DD: +MD,< 1EDTIM ;D IN EDIT INSERT + 1EDTM ;D IN EDIT MODE + 1EDTPM ;CTRL 1 IN EDIT PIN MODE +>;MD + 1BODM ;CTRL 1 OR 2 IN BODY MODE + 1PNTM!1TXTM ;CTRL 1 IN POINT MODE + 1SETM ;CTRL 1 IN SET MODE + 1LINM ;CTRL 1 IN LINE MODE + ANYALT +MD,< 1EDTTM + 1BTXTM +>;MD + -1 +.2DD: +MD,< PUSHJ P,EDDEL ;D IN EDIT INSERT + PUSHJ P,EDDELE ;D IN EDIT MODE + MODISP C1,EDPDEL +>;MD + XCT (A)[JRST ERRET ;D IN BODY MODE + PUSHJ P,BODDEL + PUSHJ P,C2BDEL + JRST ERRET] + XCT (A)[JRST ERRET ;Delete in Point mode + PUSHJ P,PNTDEL + PUSHJ P,PN2DEL + JRST ERRET] + XCT (A)[JRST ERRET ;Set mode + PUSHJ P,SETDEL + PUSHJ P,SETKIL + PUSHJ P,DCOMPL] + XCT (A)[JRST ERRET ;Line mode + PUSHJ P,LINDEL ;DELETE LINE +MPC,< PUSHJ P,LINDL2 ;DELETE WIRE > +MD,< JRST ERRET > + JRST ERRET] + PUSHJ P,DELETE ;ALTER MODE DELETE +MD,< XCT (A)[JRST ERRET + PUSHJ P,EDTDEL + PUSHJ P,EDNPRP + JRST ERRET] + XCT (A)[JRST ERRET + PUSHJ P,BTXDEL + PUSHJ P,BTNPRP + JRST ERRET] +>;MD + JRST ERRET + +MD,< +.1DE: ALLEDM ;E IN EDITOR + 1SETM!1PNTM!1TXTM!1LINM ;CTRL 12 E IN TOP MODES + 1BODM + 1BTXTM + ANYALT + -1 + +.2DE: MODISP C1,EDITE + MODISP C3,ENTEDC + XCT (A)[JRST ERRET + PUSHJ P,ENTEPN + JRST ERRET + PUSHJ P,ENTEDC] + XCT (A)[JRST ERRET + PUSHJ P,ENTBTB + JRST ERRET + PUSHJ P,ENTEDC] + PUSHJ P,ELINE + JRST ERRET +>;MD + ;E-K +MPC,< +.1DE: ANYALT +ROUTE,< 1PNTM!1TXTM> + -1 +.2DE: PUSHJ P,ELINE +ROUTE,< XCT (A)[JRST ERRET + PUSHJ P,RSET1 + PUSHJ P,RSET2 + PUSHJ P,DOROUTE] +>;ROUTE + JRST ERRET +>;MPC +MD,< +.1DF: ANYALT + 1PNTM!1TXTM + 1BODM + 1SETM + 1EDTPM + 1EDTTM + 1BTXTM + -1 + +.2DF: PUSHJ P,ALTFND ;FIND A SUBSTRING + XCT(A)[ JRST ERRET ;points + PUSHJ P,FNEXTP + PUSHJ P,FNPLOC + PUSHJ P,FNPTXT] + XCT(A)[ JRST ERRET ;bodies + PUSHJ P,FNEXTB + PUSHJ P,FNBLOC + PUSHJ P,FNBNAM] + XCT(A)[ JRST ERRET ;sets + PUSHJ P,STBFND ;(Not in yet) + PUSHJ P,STTFND ;(Not in yet) + JRST ERRET] + XCT(A)[ JRST ERRET ;edit pin + PUSHJ P,FIXONE + JRST ERRET + PUSHJ P,PALL] + XCT (A)[JRST ERRET ;edit text + PUSHJ P,FNEXLT + PUSHJ P,FNLPRP + PUSHJ P,FNLTXT] + XCT (A)[JRST ERRET ;edit body text + PUSHJ P,FNEXBT + PUSHJ P,FNBPRP + PUSHJ P,FNBTXT] + JRST ERRET + +.1DG: ALLEDM ;CTRL1 G IN EDIT INSERT AND EDIT MODE + 1PNTM!1TXTM + -1 +.2DG: MODISP C1,BODGET ;GET A BODY IN THE EDITOR. + MODISP C1,BJUMP + JRST ERRET +>;MD +MPC,< +.1DF: 1PNTM!1TXTM + ANYALT + 1BODM + 1SETM + -1 +.2DF: XCT(A)[JRST ERRET + PUSHJ P,FEED + PUSHJ P,PLANE + PUSHJ P,NPFEED] + PUSHJ P,ALTFND + XCT(A)[ JRST ERRET + PUSHJ P,FNEXTB + PUSHJ P,FNBLOC + PUSHJ P,FNBNAM] + MODISP C1,STBFND + JRST ERRET + +.1DG: 1BODM + 1PNTM!1TXTM + -1 + +.2DG: XCT (A)[JRST ERRET + PUSHJ P,REPONE + PUSHJ P,REPSOME + PUSHJ P,REPALL] + MODISP C1,BJUMP + JRST ERRET +>;MPC + +.1DH: -1 ;VARIABLE COMMANDS IN ALL MODES + +.2DH: XCT (A)[JRST ERRET + PUSHJ P,VARNXT + PUSHJ P,VARDEF + PUSHJ P,VARTYP] + +.1DI: +MD,< 1EDTM + ALLEDM ;I IN EDIT MODE AND EDIT TEXT MODE + 1SETM!1PNTM!1TXTM!1BODM!1LINM!1BTXTM +>;MD +MPC,< 1SETM!1PNTM!1TXTM!1BODM!1LINM> + ANYALT + -1 +.2DI: +MD,< XCT(A)[ JRST ERRET + PUSHJ P,EDINS + PUSHJ P,EDINS2 + JRST ERRET] + MODISP C1,EDINS +>;MD + MODISP C2,DREAD + PUSHJ P,INSERT ;*I IN ALTER MODE + JRST ERRET + +.1DJ: 1PNTM!1TXTM +MPC,< 1LINM > + 1SETM + -1 + +.2DJ: PUSHJ P,PJUMP +MPC,< XCT (A)[JRST ERRET + PUSHJ P,LJUMP1 ;JUST THIS SEGMENT + PUSHJ P,LJUMP2 ;WHOLE LINE + JRST ERRET] +>;MPC + MODISP C1,SETJMP + JRST ERRET + +.1DK: 1PNTM!1TXTM ;POINT MODE +MD,< 1BTXTM + 1EDTTM ;ANY CTRL IN EDIT TEXT MODE +>;MD + 1SETM ;2K IN SET MODE + ANYALT + -1 +.2DK: MODISP C1,PTKILL +MD,< XCT (A)[JRST ERRET + PUSHJ P,BTXKIL + PUSHJ P,BTXUKL + JRST ERRET] + XCT (A)[JRST ERRET + PUSHJ P,EDTKIL + PUSHJ P,BTXUKL + JRST ERRET] +>;MD + MODISP C2,STKILT + PUSHJ P,KILL + JRST ERRET + ;L-Q +.1DL: MD,<1BTXTM!>1SETM!1PNTM!1TXTM!1BODM!1LINM + ANYALT + -1 + +.2DL: XCT (A)[JRST ERRET + MD,< PUSHJ P,TTYPE + PUSHJ P,LTYPE> + MPC,< JRST ERRET + JRST ERRET> + PUSHJ P,TOP3L] + PUSHJ P,SLINE + JRST ERRET + + +.1DM: MD,<1EDTM!1EDTTM!1EDTPM!1BTXTM!>1SETM!1BODM!1PNTM!1TXTM + -1 +.2DM: XCT (A)[JRST ERRET + PUSHJ P,PBMOV + PUSHJ P,TXTMOV + PUSHJ P,PGRAB] + JRST ERRET + +.1DN: +MD,< 1EDTPM + 1PNTM!1TXTM> + 1BODM +MD,< 1EDTM > + ANYALT + -1 +.2DN: +MD,< XCT (A)[JRST ERRET + PUSHJ P,PNUMS + PUSHJ P,SETORI + PUSHJ P,XYPOFF] + XCT (A)[JRST ERRET + PUSHJ P,SETCPN + PUSHJ P,PMOVEL ;MOVE LOC + JRST ERRET] +>;MD + XCT (A)[JRST ERRET + PUSHJ P,BNUMS + MD,< PUSHJ P,BMOVEL ;MOVE LOC> + MPC,< JRST ERRET > + MD,< PUSHJ P,SETSEC > + MPC,< JRST ERRET > ] +MD,< MODISP C2,EMOVEL > + PUSHJ P,ALTN + JRST ERRET + +.1DO: 1BODM +MD,< 1PNTM!1TXTM + 1EDTGM +>;MD +MPC,< 1SETM> + -1 +.2DO: XCT (A)[JRST ERRET + PUSHJ P,BROT + MD,< PUSHJ P,STUBB > + MPC,< JRST ERRET > + JRST ERRET] +MD,< XCT (A)[JRST ERRET + PUSHJ P,STUB + PUSHJ P,STUBCC + PUSHJ P,STUBCW] + MODISP C1,GETSPC +>;MD +MPC,< MODISP C1,SROT> + JRST ERRET +.1DP: +MD,< 1EDTPM + ALLEDM ;P IN EDIT MODE +>;MD + MD,<1BTXTM!>1LINM + 1BODM ;P IN BODY MODE + 1PNTM!1TXTM + 1SETM ;CTRL1 P IN SET MODE + -1 +.2DP: +MD,< XCT (A)[JRST ERRET + PUSHJ P,EDITP +DEC,< PUSHJ P,SETPOL > +NODEC,< JRST ERRET > + JFCL ] ;ALREADY IN PIN MODE, NOOP + XCT (A)[JRST ERRET + PUSHJ P,EDITP + JRST ERRET + PUSHJ P,EDPENT] +>;MD + MODISP C3,TOP3P + XCT (A)[JRST ERRET + PUSHJ P,BODPLC +MPC,< JRST ERRET > +MD,< PUSHJ P,BPINS > + PUSHJ P,TOP3P] + XCT (A)[JRST ERRET + PUSHJ P,PNTPLC + JRST ERRET + PUSHJ P,TOP3P] + XCT (A)[JRST ERRET + JRST ERRET + PUSHJ P,SETCOP ;COPY SET THEN MOVE + PUSHJ P,TOP3P] ;GO TO POINT MODE + JRST ERRET + +.1DQ: 1PNTM!1TXTM ;Z IN POINT MODE +MD,< +STANFO,< + 1EDTTM ;CTRL1 Z IN EDIT TEXT MODE + 1BTXTM +>;STANFO + 1BODM + 1EDTM +>;MD + -1 +.2DQ: +NOSTANFO,< +MD,< XCT (A)[JRST ERRET + JRST ERRET + PUSHJ P,UNOFFC + PUSHJ P,CONOFF] +>;MD +MPC,< JRST ERRET > +>;NOSTANFO +STANFO,< + XCT (A)[JRST ERRET + PUSHJ P,PNTQ + MD,< PUSHJ P,UNOFFC + PUSHJ P,CONOFF > + MPC,< JRST ERRET + JRST ERRET >] +MD,< MODISP C1,TPNTQ + MODISP C1,BTPNTQ +>;MD +>;STANFO +MD,< XCT (A)[JRST ERRET + JRST ERRET + PUSHJ P,BLOOFF + PUSHJ P,BLCOFF] + MODISP C2,ELCCLR +>;MD + JRST ERRET + ;R-V +MD,< +.1DR: 1EDTIM ;R IN EDIT INSERT + 1EDTM ; " " MODE + 1BODM + ANYALT + -1 +.2DR: PUSHJ P,EDCHNG + PUSHJ P,EDCHNE + XCT (A)[JRST ERRET + PUSHJ P,REPONE + PUSHJ P,REPSOME + PUSHJ P,REPALL] + PUSHJ P,REPLAC + JRST ERRET +>;MD +MPC,< +.1DR: 1PNTM!1TXTM!1LINM!1SETM!1BODM + ANYALT + -1 +.2DR: XCT (A)[JRST ERRET + PUSHJ P,[TRZ INLIN!INMOV + SWITCH + TRO MCHG!NEEDCL + POPJ P,] + PUSHJ P,[TRZE BTHSDS + TRO MCHG + POPJ P,] + PUSHJ P,[TRON BTHSDS + TRO MCHG + POPJ P,]] + PUSHJ P,REPLAC + JRST ERRET +>;MPC +.1DS: MD,<1BTXTM!>1TXTM!1PNTM!1SETM!1LINM + 1BODM + ANYALT + -1 +.2DS: MODISP C3,TOP3S ;GO TO SET MODE + XCT (A)[JRST ERRET + PUSHJ P,PSWAPA + MD,< PUSHJ P,PSWAPB > + MPC,< JRST ERRET > + PUSHJ P,TOP3S] + PUSHJ P,SEARCH + JRST ERRET +.1DT: +MD,< 1BTXTM + ALLEDM ;CTRL 1 IN EDIT + 1BODM +>;MD + 1LINM!1SETM!1BODM + 1PNTM!1TXTM ; " " IN POINT MODE + -1 +.2DT: +MD,< XCT (A)[JRST ERRET + PUSHJ P,BTXPLC + JRST ERRET + PUSHJ P,TOP3T] + XCT (A)[JRST ERRET + PUSHJ P,EDTXT + PUSHJ P,EDTENT + PUSHJ P,EDTENT] + XCT (A)[JRST ERRET + PUSHJ P,BTXPLB +NIL,< PUSHJ P,TRANSPOSE > ;PACKAGE STUFF SUPERCEDES L/R BITS + JRST ERRET + PUSHJ P,TOP3T] +>;MD + MODISP C3,TOP3T + XCT (A)[JRST ERRET + PUSHJ P,PNTTXT + MPC,< JRST ERRET > + MD,< PUSHJ P,PNTTX2 > + PUSHJ P,TOP3T] + JRST ERRET +.1DU: +MPC,< 1PNTM!1TXTM > + ANYALT + -1 +.2DU: +MPC,< XCT(A)[JRST ERRET + PUSHJ P,UNFEED + PUSHJ P,UNPLAN + JRST ERRET] +>;MPC + PUSHJ P,ALTU + JRST ERRET +.1DV: + -1 +.2DV: +LAY,< +MD,< MODISP C3,GETPC > +MPC,< MODISP C3,GETD > +>;LAY +NOLAY,< JRST ERRET > + ;W-Z +.1DW: MD,<1BTXTM!>1SETM!1BODM!1PNTM!1TXTM!1LINM + -1 +.2DW: XCT(A)[JRST ERRET + PUSHJ P,DWRITE + PUSHJ P,WIRE + PUSHJ P,PLOT] + JRST ERRET +.1DX: -1 +.2DX: PUSHJ P,DOOX + +.1DY: +MD,< ALLEDM + 1BTXTM + 1BODM +>;MD + -1 + +.2DY: +MD,< XCT (A)[JRST ERRET + PUSHJ P,EDTPRP + PUSHJ P,EDCPRP + JRST ERRET] + XCT (A)[JRST ERRET + PUSHJ P,BTXPRP + PUSHJ P,BTCPRP + JFCL] ;STAY IN BTXTM + XCT (A)[JRST ERRET + PUSHJ P,BTXPRB + PUSHJ P,BTCPRB + PUSHJ P,ENTBTM] +>;MD + JRST ERRET + +.1DZ: ANYALT + 1PNTM!1TXTM ;CTRL1 Z IN POINT MODE +MD,< 1EDTTM ;CTRL1 Z IN EDIT TEXT MODE + 1BTXTM +>;MD + -1 +.2DZ: PUSHJ P,ALTZAP ;ZAP STRING +STANFO, + MPC,< JRST ERRET + JRST ERRET >] +>;STANFO +NOSTANFO,< +MPC,< JRST ERRET > +MD,< XCT (A)[JRST ERRET + JRST ERRET + PUSHJ P,UNOFFT + PUSHJ P,PUTOFF ] +>;MD +>;NOSTANFO +MD,< XCT (A)[JRST ERRET + STANFO, + NOSTANFO, + JRST ERRET + PUSHJ P,EDTTZ] + XCT (A)[JRST ERRET + STANFO, + NOSTANFO, + JRST ERRET + PUSHJ P,BTXTZ] +>;MD + JRST ERRET + ;ALT BS . | & #  +.1DALT: +MD,< 1EDTIM!1EDTTM!1EDTPM ;ALTMODE IN EDIT INSERT + 1BTXTM +>;MD + 1SETM + 1PNTM!1TXTM ;POINT MODE +MD,< 1EDTGM ;BODY GETTING MODE> + 1ALTM + 1MALTM +MD,< 1EDTAM + 1BTALTM +>;MD + -1 +.2DALT: +MD,< PUSHJ P,EDALT + PUSHJ P,CLRMOV +>;MD + PUSHJ P,SETALT + PUSHJ P,PNALT +MD,< PUSHJ P,GETALT > + PUSHJ P,ALTALT + PUSHJ P,MALTALT +MD,< PUSHJ P,ELTALT + PUSHJ P,BTXALT +>;MD + JRST ERRET +.1DBS: +MD,< 1EDTIM ;BS> + ANYALT + -1 +.2DBS: +MD,< PUSHJ P,EDBS> + PUSHJ P,BAKWRD + JRST ERRET + +.1DPER: + 1PNTM!1TXTM + -1 + +.2DPER: + XCT(A) [ + LAY,< PUSHJ P,PLAIN. > + NOLAY,< JRST ERRET > + PUSHJ P,CTRL. + PUSHJ P,META. + ROUTE,< + MPC,< PUSHJ P,CTMT. > + MD,< + LAY,< PUSHJ P,CTMT. > + NOLAY,< PRINTX WHAT ARE YOU DOING WITH MD, ROUTE, AND NOLAY?> + >;MD + >;ROUTE + NOROUTE, + ] + JRST ERRET + +.1DVBR: +MPC,< 1PNTM!1TXTM > + -1 + +.2DVBR: +MPC,< PUSHJ P,PLFEED > ;**| IN POINT MODE + JRST ERRET + +.1DAMP: 1PNTM!1TXTM + 1BODM + 1SETM + -1 + +.2DAMP: XCT (A)[JRST ERRET ;& POINT MODE + PUSHJ P,APPPNT + PUSHJ P,ASSETP + PUSHJ P,CLRCUR] + XCT (A)[JRST ERRET ;& BODY MODE + PUSHJ P,APPBOD + PUSHJ P,ASSETB + PUSHJ P,CLRCUR] + XCT (A)[JRST ERRET ;& SET MODE + PUSHJ P,APPSET + PUSHJ P,SETSET + PUSHJ P,CLRCUR] + MODISP C3,CLRCUR ;CLEAR CURRENT SET ONLY () + +.1DSHRP:1PNTM!1TXTM + 1BODM + 1SETM + ANYALT + -1 + +.2DSHRP:XCT (A)[JRST ERRET + PUSHJ P,XPNT + PUSHJ P,XPNTA + JRST ERRET] + XCT (A)[JRST ERRET + PUSHJ P,XBOD + PUSHJ P,XBODA + JRST ERRET] + XCT (A)[JRST ERRET + PUSHJ P,XSET + PUSHJ P,XSETA + JRST ERRET] + PUSHJ P,SPALTN + JRST ERRET + +.1DBAR: ; IS SAME AS  +.1DEQV: 1BODM + -1 + +.2DBAR: +.2DEQV: MODISP C1,ASSET + JRST ERRET + ;" ?     \ = ^Z ^K +.1DDBQ: 1PNTM!1TXTM + 1BODM +MD,< 1EDTM + 1EDTPM + 1EDTTM!1BTXTM +>;MD + -1 + +.2DDBQ: XCT (A)[JRST ERRET ;POINT,TEXT MODES + PUSHJ P,STOTXT + PUSHJ P,STOCLC + JRST ERRET] + XCT (A)[JRST ERRET ;BODY MODE + PUSHJ P,STONAM + PUSHJ P,STOBLC + PUSHJ P,STODIP] +MD,< XCT (A)[JRST ERRET ;BODY EDIT MODE + PUSHJ P,STFLNM + JRST ERRET + PUSHJ P,STFLDP] + MODISP C2,STOBPN ;BODY EDIT PIN MODE + XCT (A)[JRST ERRET ;BODY TEXT MODE + PUSHJ P,STOBTX + PUSHJ P,STOBTP + JRST ERRET] +>;MD + JRST ERRET + +.1DQUES: +MPC,> +UML,< +MD,< -1-ANYALT-ALLEDM > +>;UML + -1 + +.2DQUES: +MPC,> +UML,< +MD,< MODISP C0,SHWERR ;SHOW A SINGLE UNNAMED PIN ERROR> +>;UML + JRST ERRET + +NOSKEY,< +.1DLBC: 1PNTM!1TXTM + -1 + +.2DLBC: PUSHJ P,LINLFT + JRST ERRET + +.1DRBC: 1PNTM!1TXTM + -1 + +.2DRBC: PUSHJ P,LINRT + JRST ERRET + +.1DUBC: 1PNTM!1TXTM + -1 + +.2DUBC: PUSHJ P,LINUP + JRST ERRET + +.1DDBC: 1PNTM!1TXTM + -1 + +.2DDBC: PUSHJ P,LINDWN + JRST ERRET +>;NOSKEY + +.1DBSL: MD,<1EDTAM!1BTALTM!>1ALTM ;BACK SLASH + -1 + +.2DBSL: PUSHJ P,SETSIZ ;SET CHAR SIZE IN ALTER MODE + PUSHJ P,MOVDN1 ;CURSOR MOVE DOWN SMALL + +.1DEQU: +MD,< 1EDTIM > + 1PNTM!1TXTM ;POINT MODE + 1SETM ;SET MODE + -1 + +.2DEQU: +MD,< PUSHJ P,EDMINS> + PUSHJ P,PNMNS + PUSHJ P,STMNS ;END BOX + JRST ERRET + +.1DDCR: ANYALT + -1 + +.2DDCR: PUSHJ P,SLINE + JRST ERRET + +.1DUCR: ANYALT + -1 + +.2DUCR: PUSHJ P,MSLINE + JRST ERRET + SUBTTL Command dispatch table + +DTAB: 0 + XWD [PUSHJ P,MAKDWN],[-1] ; + FOR I_2,7<0 ;,,,,, +> +SKEY,< XWD .2DBS,.1DBS > ;^H BACKSPACE +NOSKEY,< 0 > ;LAMBDA + 0 ;TAB + +NOIII,< XWD [JFCL],[-1] > ;LF IS NOOP +III,< XWD [PUSHJ P,LHYRST],[-1] > ; LF refreshes Leahy's memory + +SKEY,< XWD .2DDCR,.1DDCR > ;^K (CURSOR UP) +NOSKEY,< 0 > ;VERTICAL TAB + + FOR I_14,""-1<0 ;FF AND CR +> + XWD [PUSHJ P,MOVDN2],[-1] ; CURSOR DOWN LARGE + XWD [PUSHJ P,MOVUP2],[-1] ; CURSOR UP LARGE +NOSKEY,< XWD .2DUBC,.1DUBC ; 20 + XWD .2DDBC,.1DDBC ; 21 + XWD .2DLBC,.1DLBC ; 22 + XWD .2DRBC,.1DRBC ; 23 +>;NOSKEY +SKEY,< 0 ;20 + 0 ;21 + 0 ;22 + 0 ;23 +>;SKEY + 0 ; 24 + 0 ; 25 + 0 ; 26 + XWD .2DBAR,.1DBAR ; 27 +NOSKEY,< 0 > ;_ 30 +SKEY,< XWD .2DCX,.1DCX > ;^X + XWD [PUSHJ P,MAKRIT],[-1] ; +SKEY,< XWD .2DUCR,.1DUCR > ;^Z (UP CURSOR) +NOSKEY,< 0 > ; TILDE 32 + 0 ;33  + 0 ; + 0 ; +NOSKEY, ;36  +SKEY,< 0 > + 0 + XWD .2DSPC,.1DSPC ; SPACE + 0 ;EXCLAMATION MARK + XWD .2DDBQ,.1DDBQ ;DOUBLE QUOTE + XWD .2DSHRP,.1DSHRP ;# + 0 ;$ +NOSKEY,< 0 ;% + XWD .2DAMP,.1DAMP ;& + 0 ;' + XWD [PUSHJ P,MOVLF1],[-1] ;CURSOR LEFT SMALL + XWD [PUSHJ P,MOVRT1],[-1] ;CURSOR RIGHT SMALL +>;NOSKEY +SKEY,< XWD .2DAMP,.1DAMP ;% + XWD [PUSHJ P,MOVLF2],[-1] ;& CURSOR LEFT LARGE + XWD [PUSHJ P,MOVRT2],[-1] ;' CURSOR RIGHT LARGE + XWD [PUSHJ P,MOVUP2],[-1] ;( CURSOR UP LARGE + XWD [PUSHJ P,MOVDN2],[-1] ;) CURSOR DOWN LARGE +>;SKEY + XWD [PUSHJ P,MAKSML],[-1] ;* SHRINK PIC + XWD .2DPLS,.1DPLS ;+ (EDIT INSERT MODE) + 0 ;, + XWD .2DMNS,.1DMNS ;- + XWD .2DPER,.1DPER ;period + XWD [PUSHJ P,MOVUP1],[-1] ;slash - CURSOR UP SMALL + +NOIII,< XWD .2DNUM,.1DNUM > ;0 +III,< XWD .2DPLS,.1DPLS > ;make "0" same as "+" + +FOR @$ I E <12345> +< +SKEY,< XWD .2D$I,.1D$I > +NOSKEY,< XWD .2DNUM,.1DNUM > +> + FOR @$ I E <6789> +< +SKEY,< XWD .2D$I,.1DNUM > +NOSKEY,< XWD .2DNUM,.1DNUM > +> + 0 ;::: + XWD [PUSHJ P,ITSEM],[-1] ;;;;;;;; +NOSKEY,< 0 + XWD .2DEQU,.1DEQU ;= + 0 +>;NOSKEY +SKEY,< XWD [PUSHJ P,MAKLFT],[-1] ;WINDOW LEFT + XWD .2DEQU,.1DEQU ;= + XWD [PUSHJ P,MAKRIT],[-1] ;WINDOW RIGHT +>;SKEY + XWD .2DQUES,.1DQUES ;? + XWD [PUSHJ P,DSKIN],[-1] ;@ + FOR @$ I E +< XWD .2D$I,.1D$I +> + XWD [PUSHJ P,MOVLF2],[-1] ;CURSOR LEFT LARGE + XWD .2DBSL,.1DBSL ;CURSOR DOWN SMALL (SET CHAR SIZE IN ALTER MODE) +NOSKEY,< XWD [PUSHJ P,MOVRT2],[-1] >;CURSOR RIGHT LARGE +SKEY,< XWD [PUSHJ P,MAKDWN],[-1] >;WINDOW DOWN + XWD [PUSHJ P,MAKUP],[-1] ;^ + XWD [PUSHJ P,MAKLFT],[-1] ;_ + 0 ;140 ` + FOR @$ I E +< XWD .2D$I,.1D$I +> + FOR I_"Z"+41,173<0 +> + 0 + 0 + 0 + XWD .2DBS,.1DBS ;BS + 0 +MD,< +ORG DTAB+NOT + XWD .2DNOT,.1DNOT ; +> +ORG DTAB+BIGCHR + XWD [PUSHJ P,MAKBIG],[-1] ; +ORG DTAB+VRTBAR + XWD .2DVBR,.1DVBR ;| +ORG DTAB+ALTMOD + XWD .2DALT,.1DALT ;ALTMODE +ORG DTAB+201 + DOOX: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ / +WELL?/] + SETZ G, + MOVEI H,G +GETCM1: PUSHJ P,GETCOM + JUMPE T,GETCM2 + GETFS(TT) + MOVEM T,1(TT) + HRRM TT,(H) + HRLZM 0,(TT) + MOVE H,TT +GETCM2: CAIN C,"," + JRST GETCM1 + CAIE C,12 + JRST ERRX + JUMPE G,CPOPJ +GETCM3: PUSH P,G + MOVE T,1(G) + HLRZ TT,(G) + TRZ TFLG + TRNE TT,TFLG + TRO TFLG + PUSHJ P,SRVCOM + POP P,A + HRRZ G,(A) + FSTRET A + JUMPN G,GETCM3 + POPJ P, + +SRVCOM: JUMPE T,CPOPJ + TLNE M,DSKACT!MACACT + JRST NSRVPN + TRNE TFLG + OUTCHR["-"] + PUSH P,T + MOVE TT,T + PUSHJ P,SIXPNT ;PRINT COMMAND WE ARE SERVICING + POP P,T +NSRVPN: MOVSI TTT,770000 + SETZ TT, ;CLEAR MASK + TDNE T,TTT + TDO TT,TTT + LSH TTT,-6 + JUMPN TTT,.-3 + SETZ A, ;NO PARTIAL MATCH FOUND YET! + MOVSI D,-TABLEN ;MAKE AOBJN POINTER +XLOP: CAMN T,XTAB(D) + JRST EXACT + MOVE TTT,TT + AND TTT,XTAB(D) + CAMN TTT,T + JRST [ JUMPN A,XAMBIG ;TOO MANY MATCHES? + MOVE A,D + JRST .+1] + AOBJN D,XLOP + JUMPE A,PERRET ;ANY MATCH? + MOVE D,A ;YES, CALL IT + TLNE M,DSKACT!MACACT + JRST EXACT + ANDCA TT,XTAB(D) + LSH TT,6 + TLNN TT,770000 + JRST .-2 + PUSHJ P,SIXPNT +EXACT: TRNN TFLG ;IS THIS A NOT + SKIPA A,XDIS(D) ;NO + MOVS A,XDIS(D) ;YES + TRNN A,-1 ;ANY DISPATCH FOR THIS FLAVOR? + JRST PERRET + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +/] + JRST (A) ;YES + +XAMBIG: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ IS AMBIGUOUS! +/] + POPJ P, + +ERRX: SKIPE B,G + PUSHJ P,PUTFS + JRST INNERR + +GETCOM: PUSHJ P,GETLIN + TRO TFLG ;ASSUME NOT + CAIN C,"-" + JRST GETWRD + TRZ TFLG ;NOT NOT + SETZ T, + MOVE A,[POINT 6,T] + JRST ISCHRX + +PNTCOM: MOVSI A,-TABLEN + MOVEI TTT,8 + TVOFF +PNTCM1: MOVE TT,XTAB(A) + PUSHJ P,SIXPNT + HLRZ TT,XDIS(A) + SKIPE TT + OUTCHR["-"] + SOJLE TTT,[OUTSTR[ASCIZ/ +/] + MOVEI TTT,8 + JRST PNTCM2] + OUTCHR[11] +PNTCM2: AOBJN A,PNTCM1 + OUTSTR[ASCIZ/ +/] + TVON + POPJ P, + SUBTTL Extended Commands + +DEFINE XARGS +< + XMAC HELP,PNTCOM + XMAC START,STRT + XMAC EXIT,DOEXIT +MD,< XMAC SOCKET,STSOC,CLRSOC > +MD,< XMAC DIPFIL,SETDIP,CLRDPF > + XMAC BOOP,STBOOP,CLBOOP + XMAC INIT,STINIT,CLINIT + XMAC FDIP,FNBDIP + XMAC EXACT,EXACTS,EXACTC + XMAC LOWER,SETLC,CLRLC + XMAC IMACRO,IMACRO + XMAC WMACRO,WMACRO,WMACRS + XMAC AMACRO,MALTER + XMAC SMACRO,SAVMAC,UNSAVM + XMAC QUIT,MQUIT + XMAC SPACES,SETSPC,CLRSPC + XMAC CENTER,SETCNT,CLRCNT +DEC,< XMAC TIME,STTIME,CLTIME > +NOIII,> + XMAC AUTOWRITE,SETWM,CLRWM +NOIII,> + XMAC EWRITE,EWRITE + XMAC ELIST,EWLIST + XMAC EPLOT,EWPLOT + XMAC ENAME,CENAME,ZENAME +MD,< XMAC MAKEWD,MAKWIR > +MPC,< XMAC MAKWPC,MAKWIR > + XMAC SAVE,SAVEME +LAY,< XMAC RESAVE,RSAVEM > + XMAC SETWRT,SWRITE + XMAC WRTSET,SWRITE + XMAC DPY,SETDPY,CLRDPY +GT,< XMAC OPTIMIZE,SETOPT,CLROPT +DLX,< XMAC DL10,SETDLX,CLRDLX > +>;GT + XMAC MACRO,LMACRO + XMAC RMACRO,RENMAC + XMAC DMACRO,DELMAC,DELMCS + XMAC PMACRO,PMACRO + XMAC CLEAR,XCLEAR + XMAC CURSOR,CURSON,CURSOFF + XMAC DDT,GETDDT + XMAC BRIGHT,ITBRT,CLRBRT + XMAC CURBRT,ITCBRT,CLCBRT + XMAC MOVE,MOVREL + XMAC SCALE,ITSCAL +MD,< XMAC STUB,ITSTUB > + XMAC SIZE,ITSIZE + XMAC XOFF,SETXOF + XMAC YOFF,SETYOF + XMAC TEXT,SETTXT,CLRTXT + XMAC WINDOW,SETWIN,CLRWIN + XMAC LWINDOW,SETLWN,CLRLWN + XMAC DELNUL,DELNUL + XMAC DANGLE,DANGLE +DEC,< +MD,< XMAC CHKPOL,POLCHK + XMAC POLCHK,POLCHK +>;MD +>;DEC + XMAC DELSET,SBLAST + XMAC SETCEN,CENALL + XMAC COUNT,DOCNT + XMAC DSKIN,DSKIN + XMAC DSKINH,DSKINH + XMAC IFLUSH,IFLUSH + XMAC DSKOUT,PUTDSK + XMAC CLOSE,DSKCLR + XMAC NEWID,NEWID + XMAC PINS,SETPNS,CLRPNS + XMAC LOCS,STBLCS,CLBLCS + XMAC CLOCS,STCLCS,CLCLCS + XMAC CPINS,STCLCS,CLCLCS + XMAC LINES,STLINS,CLLINS + XMAC LOCATE,SETLCA,CLRLCA + XMAC CLOCATE,SETCLC,CLRCLC + XMAC SETLOC,SETLOC,SETLZ + XMAC FLASH,LOKSIG,XFLASH +IFN LAYSW!UMLSW, + XMAC IDENTS,SIDENT,CIDENT + XMAC LIBPPN,STLPPN,CLLPPN +MD,< XMAC BOARD,GETBRD,CLRWW > + XMAC NOMENCLATURE,GETNOM,CLRNOM + XMAC AVAILABLE,AVAIL +UML,< XMAC IWIRES,READW,RELWIR + XMAC LSIGNALS,LSTSIG + XMAC NFLASH,LOOKN +>;UML +MD,< XMAC LPROPS,LPROPS + XMAC IDEFS,DREADT + XMAC RDEFS,DREADR + XMAC IERRORS,IERRS,RELWIR + XMAC FIXEM,FIXEM0 + XMAC PTEXT,STPTXT,CLPTXT + XMAC BTEXT,STBTXT,CLBTXT + XMAC TMOVE,LOCTM + XMAC LMOVE,LOCLM + XMAC TERMRULE,STTRUL,CLTRUL + XMAC SETPINS,BPINSA,PINZ + XMAC SLICE,DOSLICE + XMAC TSLICE,TYPSLC,CLTSLC + XMAC DELLIB,DELLIB + XMAC LOCLIB,DELLBS + XMAC GETLIB,DOLIB + XMAC TYPLIB,LIBOUT + XMAC LIBTYP,LIBOUT + XMAC MODLIB,STMLIB,CLMLIB + XMAC MAPLIB,SETMAP,CLRMAP + XMAC LIBMAP,SETMAP,CLRMAP + XMAC GETBOD,RDBODY + XMAC RENAME,BODREN + XMAC TYPDEL,TYPDEL + XMAC DELTYP,TYPDEL + XMAC DIAMONDS,SETDMD,CLRDMD + XMAC PBOX,BOXSIZ + XMAC SHOWBOX,SHWBOX,NSHOBX + XMAC PICCEN,PICCEN + XMAC DEFPINS,SETIDS,CLRIDS + XMAC RPINID,SETRID,CLRRID + XMAC UNHIDE,STUNHI,CLUNHI + XMAC HIDE,CLUNHI,STUNHI + XMAC FIXALL,FIXALL + XMAC OUTSIDE,SETOUT,CLROUT + XMAC TITLE,STITLE,CTITLE + XMAC SITE,SITE,CSITE + XMAC AUTHOR,AUTHOR,CAUTHOR + XMAC REVISION,REVISE,CREVISE + XMAC MODULE,MODULE,CMODULE + XMAC VARIABLE,VARIABLE,CVARIABLE + XMAC PREFIX,PREFIX,CPREFIX + XMAC NUMBER,SETNUM,CLRNUM + XMAC PROJECT,PROJECT,CPROJECT + XMAC PAGE,PAGEOF,CPAGEOF +DEC,< XMAC SHEET,PAGEOF,CPAGEOF > + XMAC DCODE,DCODE,CDCODE +DEC,< XMAC DRAWN,SETDRN,CLRDRN + XMAC ENGINEER,SETENG,CLRENG + XMAC NEXTHI,SETNXT,CLRNXT +>;DEC + XMAC LTITLE,LTITLE +NIL,< XMAC TRANSPOSE,TRANALL > ;PACKAGE STUFF DOES AWAY WITH THIS + XMAC OFFALL,OFFALL + XMAC OFFRIGHT,OFFRHT,NOFRHT + XMAC OFFLOC,OFFLOC + XMAC DISLOC,SETDLC,CLRDLC + XMAC CHANGE,SIGCHG + XMAC ICHANGE,ISIGCH + XMAC ICPINS,ICPNCH + XMAC UNDERLINE,UNDRLN,NUNDRL + XMAC CBOX,SETCBX,CLRCBX + XMAC IPINS,INPINS +DEC,< XMAC IUML,INUML > + XMAC CEXCHANGE,UREST + XMAC MUNG,STRAIGHTEN + XMAC FSIGNAL,FNPSIG + XMAC FLNAME,FNLNAM + XMAC FLDIP,FNLDIP + XMAC FLNEXT,FNEXTL + XMAC FLPIN,FNLPN0 + XMAC FLPNEXT,FNEXBP + XMAC RSPINI,RSPINI + XMAC INDIP,INDIP + XMAC APACK,APACK +>;MD +MPC,< XMAC WSIG,SIGPLT + XMAC IPAD,DREADT + XMAC IROUTE,DREADR + XMAC SETDIP,SETDIP + XMAC COMPONENT,STCOMP + XMAC SOLDER,STSOLD + XMAC CHANGE,CPADS + XMAC FEEDTHROUGH,STFEED,CLFEED + XMAC FINGER,STFING,CLFING + XMAC CDISP,STCARD,CLCARD + XMAC CARD,DOCARD + XMAC FTXT,FNPTXT + XMAC FCPIN,FNPLOC + XMAC FIND,FNEXTP + XMAC INNER,INNER + XMAC PPLOT,PPLOT + XMAC FLIP,STFLIP + XMAC MUNG,MUNG + XMAC UML,DOUML + XMAC DIPS,STDIPS,CLDIPS + XMAC STEP,SETSTP + XMAC VCC,SETPWR + XMAC GND,SETGND + XMAC POSITION,POSIT +SHORT,< XMAC SHORT,DOSHORT,CSHORT + XMAC PADDIAMETER,SETDIA + XMAC WIDTH,SETWID + XMAC SEPARATION,SETSEP + XMAC HOLE,SETHOL + XMAC CONNECTOR,SETCPN +>;SHORT +UML,< +WAG,< + XMAC WROUTE,WROUTE +>;WAG +>;UML +ROUTE,< + XMAC ROUTE,SETRTE + XMAC RDISP,SETRDS,CLRRDS + XMAC RCODE,SETRCD + XMAC CNR,SETCNR + XMAC FED,SETFED + XMAC BAK,SETBAK + XMAC SID,SETSID +>;ROUTE +>;MPC +STAN,< XMAC XTHICK,SETTHK,CLRTHK > +>;XARGS + +DEFINE XMAC(A,B,C) +< +> + +XTAB: XARGS + +DEFINE XMAC(A,B,C) +< C,,B +> + +XDIS: XARGS + +TABLEN__.-XDIS + +PURGE XARGS + ;EXIT ROUTINE +DOEXIT: EXIT 1, + POPJ P, diff --git a/src/draw/d.318 b/src/draw/d.318 new file mode 100644 index 00000000..c64ad8b4 --- /dev/null +++ b/src/draw/d.318 @@ -0,0 +1,65 @@ +COMMENT  +.XCREF A,B,C,D,E,F,G,H,M,P,T,TT,TTT + +.insert SWITCH +.insert FIRST +.insert SECOND +.insert LOWCOR +.insert COM +.insert EDIT +.insert POINT +.insert BODY +.insert BTEXT +.insert SET +.insert ALT +.insert FIND +.insert REP +.insert CLOSE +.insert MOVE +.insert DRAW +;;;.insert GDP2 +.insert DISP +.insert LAY +.insert SHORT +;;;.insert ROUTE +.insert MAC +.insert PLT +.insert SUB +.insert OUT +.insert IN +.insert IOSUB +.insert SIGSUB +;;;.insert DECSUB +IFN ONESW!TWOSW,<.INSERT BOARD0> +.INSERT LAST + +IFN TWOSW!LIBSW,< +.insert FIRST +.insert LOWCOR +.insert COM +.insert EDIT +.insert POINT +.insert BODY +.insert BTEXT +.insert SET +.insert ALT +.insert FIND +.insert REP +.insert CLOSE +.insert MOVE +.insert DRAW +.insert DISP +.insert LAY +.insert SHORT +;;;.insert ROUTE +.insert MAC +.insert PLT +.insert SUB +.insert OUT +.insert IN +.insert IOSUB +.insert SIGSUB +;;;.insert DECSUB +.insert BOARD0 +.INSERT LAST +>;TWOSW!LIBSW diff --git a/src/draw/d.files b/src/draw/d.files new file mode 100644 index 00000000..715dcdb1 Binary files /dev/null and b/src/draw/d.files differ diff --git a/src/draw/d.loader b/src/draw/d.loader new file mode 100644 index 00000000..6b07d420 --- /dev/null +++ b/src/draw/d.loader @@ -0,0 +1,4 @@ +msail;jobdatl +mDRAW;dl +MWL;BOARDSL +jd1?Wtd diff --git a/src/draw/d.login b/src/draw/d.login new file mode 100644 index 00000000..374517ab --- /dev/null +++ b/src/draw/d.login @@ -0,0 +1,10 @@ +:stink d +1L DECSYS;DECBOT BIN +.JBSA/STRT +56/107 +: +********* OK, now do the following ********* + :DELETE DATDRW;D OBIN + :RENAME DATDRW;D BIN, D OBIN + :PDUMP DATDRW;D BIN ; This is the file linked to by SYS1;TS D + \ No newline at end of file diff --git a/src/draw/dd.loader b/src/draw/dd.loader new file mode 100644 index 00000000..76ed500a --- /dev/null +++ b/src/draw/dd.loader @@ -0,0 +1,4 @@ +msail;jobdatl +mDRAW;ddl +MWL;DBOARDSL +jdd1?Wtd diff --git a/src/draw/disp.500 b/src/draw/disp.500 new file mode 100644 index 00000000..1c405a82 --- /dev/null +++ b/src/draw/disp.500 @@ -0,0 +1,2521 @@ +;DISP.FAI.150, 15-NOV-75 19:20:54, EDIT BY HELLIWELL +;BLINKO, DPYSET, OUTDPY, MRKPAG, MAINOU, HYDPOG +VERSION(DISP,13) +NOCMU,< +NODEC,< +NOIII,< +BLINKO: TLNN DSPACT + POPJ P, + PUSH P,T + HRRZ T,BUFPTR + SETZM 1(T) + SUBI T,DPYBUF-3-BLINKL + MOVEM T,BLINK+1 + MOVE T,PGLASS + DPB T,[POINT 4,BLDPY,12] ;SET PG NUM + CAIGE T,20 + XCT BLDPY + PUSHJ P,MRKPAG + POP P,T + POPJ P, +>;NOIII +>;NODEC +>;NOCMU + +DPYSET: MOVEI TT,1 + MOVEM TT,SIZ + MOVE TT,S2H(TT) + DPB TT,[POINT 3,BSOR,27] + MOVE TT,DEFBRT + MOVEM TT,BRT + DPB TT,[POINT 3,BSOR,24] + TLO DSPOFF ;START OFF SCREEN IN CASE HE SCREWS UP! + SETZM XDISP + SETZM YDISP +DPYST1: +NOIII,< MOVE TT,[POINT 36,DPYBUF,35] > +III,< MOVE TT,[POINT 36,DPYBUF] > + MOVEM TT,BUFPTR + SETZM DPYBUF + POPJ P, + +NOCMU,< +IFN DECSW!IIISW,< +BLINKO: +PGP,< SETOM BLNKIT > +>;IFN DECSW!IIISW +OUTDPY: TLNN DSPACT + POPJ P, + PUSH P,T + HRRZ T,BUFPTR + SETZM 1(T) + SUBI T,DPYBUF-1 +NOIII,< MOVEM T,HEAD+1 > +III,< HRLM T,HEAD > + MOVE T,PGLASS + DPB T,[POINT 4,DPYDPY,12] + CAIGE T,20 + XCT DPYDPY +III,< JFCL > + PUSHJ P,MRKPAG + POP P,T + POPJ P, +>;NOCMU +MRKPAG: MOVEI T,1 + LSH T,@PGLASS + IORM T,PAGACT + IORM T,REALACT + POPJ P, + +MAINOU: TLNN DSPACT + POPJ P, + PUSHJ P,OUTDPY + AOS T,PGLASS +MAINO1: CAILE T,17 ;NOW CLEAR ALL OTHER PG'S NOT USED + POPJ P, + PUSHJ P,HYDPOG + AOJA T,MAINO1 + +NOCMU,< +HYDPOG: TLNN DSPACT + POPJ P, + PUSH P,T + MOVEI T,1 + LSH T,@(P) + ANDCAM T,PAGACT + POP P,T ;SOME PEOPLE EXPECT T TO BE SAVED! + POPJ P, + +DOPOGS: TLNN DSPACT + POPJ P, + MOVE T,PAGACT + ANDCM T,REALACT ;THESE ALL SHOULD BE ON + SKIPE T + HALT .+1 + MOVE T,PAGACT ;WHAT WE WANT ACTIVE + ANDCA T,REALACT ;WHAT IS ACTIVE + MOVEI TT,17 +DOPOG1: MOVEI TTT,1 + LSH TTT,(TT) + TDNN T,TTT ;DOES THIS POG NEED CLEARING? + JRST DOPOG2 ;NO + DPB TT,[POINT 4,HYDDPY,12] + XCT HYDDPY +III,< JFCL > +DOPOG2: SOJG TT,DOPOG1 + MOVE T,PAGACT + MOVEM T,REALACT + POPJ P, +>;NOCMU + ;SETDEF, DPYBRT, TXTDPB, INSOUT, DPYBIG +SETDEF: MOVE T,STDBIG + PUSHJ P,DPYBIG + MOVE T,DEFBRT +DPYBRT: CAILE T,7 ;IN CASE HE IS LOSING! + MOVEI T,7 + CAMN T,BRT + POPJ P, ;SEE THE TIME WE SAVE + MOVEM T,BRT + DPB T,[POINT 3,BSOR,24] + POPJ P, ;NO + +TXTDPB: TRO T,1 ;MAKE SURE IS TEXT + TLNN DSPOFF ;ARE WE CURRENTLY OFF SCREEN? + IDPB T,BUFPTR ;NO, DEPOSIT TEXT, OR WHATEVER + POPJ P, + +INSOUT: IDPB TT,BUFPTR + HRRZ TT,BUFPTR + CAIG TT,DPYBUF+DPYLEN ;THIS BUFFER FULL YET? + POPJ P, + PUSHJ P,OUTDPY ;YES, USE ANOTHER + AOS TT,PGLASS + CAIN TT,20 + OUTSTR[ASCIZ/RAN OUT OF PIECES OF GLASS! +/] + JRST DPYST1 + +;SETUP BSOR WITH HARDWARE CHARACTER SIZE +;T = SOFTWARE SIZE + +DPYBIG: CAMN T,SIZ + POPJ P, + MOVEM T,SIZ + CAILE T,CSIZES + MOVEI T,CSIZES + MOVE T,S2H(T) + DPB T,[POINT 3,BSOR,27] + POPJ P, + ;AVECT, AVECTX, AVECTZ, AVECTY +AVECT: MOVE TT,XDISP + MOVEM TT,XGO + MOVE TT,YDISP + MOVEM TT,YGO + TLNE DSPOFF + JRST AVECTW + MOVEI TT,106 + PUSHJ P,VECT + CAIA + JRST INSOUT + TLNN M,LWINDOW ;WINDOWING LINES? + POPJ P, ;NO + PUSHJ P,SEGWN1 ;CALC INTERSECTION POINT + PUSHJ P,FUCKUP + JRST AVECTZ + +AVECTX: PUSHJ P,VECT + JRST AVECTY + PUSHJ P,SEGWN0 + PUSHJ P,FUCKUP ;CAN'T LOSE + MOVE T,XDISP + MOVEM T,XGO + MOVE T,YDISP + MOVEM T,YGO +AVECTZ: TRO TT,146 ;INVIS TO EDGE + TDO TT,BSOR + PUSHJ P,INSOU2 ;THIS WAY + HRLZ TT,XGO + LSH TT,=18-=11 + MOVE T,YGO + DPB T,[POINT 11,TT,21] + TRO TT,106 + TDO TT,BSOR + JRST INSOUT + +AVECTY: PUSHJ P,SEGWN0 + POPJ P, ;DOESN'T INTERSECT SCREEN + TRO TT,146 + TDO TT,BSOR + PUSHJ P,INSOU2 + PUSHJ P,SEGWN1 + PUSHJ P,FUCKUP ;MUST GO OUT IF IT CAME IN! + TRO TT,106 + TDO TT,BSOR + JRST INSOUT + ;VECTORS, CHAR POSITIONING, TFUDGE +PINPOS: MOVEI TT,146 + PUSHJ P,VECT + POPJ P, + PUSHJ P,TFUDGE + JRST INSOU2 + +AVECTW: TLNE M,LWINDOW ;IF NOT WINDOWING LINES, JUST DO AIVECT + JRST AVECTX +AIVECT: MOVEI TT,146 + PUSHJ P,VECT + POPJ P, +INSOU2: LDB T,[POINT 7,@BUFPTR,35] + CAIE T,46 ;CAN REPLACE RELATIVE INVISIBLE + CAIN T,146 ;OR ABSOLUTE INVISIBLE + SOS BUFPTR ;WITH ABSOLUTE INVISIBLE + JRST INSOUT + +MPC,< +ROUTE,< +APOINT: MOVEI TT,126 + PUSHJ P,VECT + POPJ P, + JRST INSOUT +>;ROUTE +>;MPC + +IFN 0,< ;CURRENTLY NOT USED, BUT MAY BE USEFUL LATER +RIVECT: MOVEI TT,46 + PUSHJ P,VECT + POPJ P, + JRST INSOUT +>;IFN 0 + +VECT: HLRE TTT,T + HRRE T,T + SUB TTT,XOFF +MPC,< TRNE M,FLIP ;INVERTING X? + MOVN TTT,TTT ;YES! +>;MPC + SUB T,YOFF + SCALE (TTT) + SCALE (T) +CALVCT: MOVEM T,YDISP + MOVEM TTT,XDISP + CAIGE TTT,%RIGHT + CAMG TTT,[%LEFT] + JRST VECTOF + CAIGE T,%TOP + CAMG T,[%BOTTOM] + JRST VECTOF + TLZ DSPOFF ;ASSUME NOT OFF YET + DPB T,[POINT 11,TT,21] + DPB TTT,[POINT 11,TT,10] + IOR TT,BSOR ;ADD BRIGHTNESS, SIZE + JRST CPOPJ1 + +VECTOF: TLO DSPOFF + POPJ P, + +TITVCT: SKIPE T + PUSHJ P,DPYBRT + SKIPE T,TT + PUSHJ P,DPYBIG + MOVEI TT,146 + DPB TTT,[POINT 11,TT,21] + HLRZ TTT,TTT + DPB TTT,[POINT 11,TT,10] + TDO TT,BSOR + PUSHJ P,TFUDGE ;FUDGE FOR TEXT + TLZ DSPOFF ;FAKE OUT TEXT ROUTINES + JRST INSOU2 + + ;SMLVCT, BIGSET, SM2SET, TFUDGE, ATTFIX + +;POSITION TO X,Y AND SET CHAR SIZE, FUDGE FOR CHAR GEN LOSSAGE +;T = X,,Y +;RETURNS +;TT = VECTOR + +MPC,< +SMLVCT: SKIPA TT,STDBIG ;STD SIZE FOR TEXT +>;MPC +BIGSET: MOVEI TT,3 ;SIZE 3, BIG CHARS +SM2SET: PUSH P,T + MOVE T,TT + PUSHJ P,DPYBIG ;SETUP BSOR WITH HARDWARE CHAR SIZE + POP P,T ;X,,Y + MOVEI TT,146 + PUSHJ P,VECT + POPJ P, + AOS (P) ;SKIP RETURN + +;FUDGE VECTOR IN TT TO COMPENSATE FOR CHARACTER GENERATOR +;FALLS THRU + +TFUDGE: PUSH P,TTT + MOVE TTT,SIZ + MOVE TTT,S2H(TTT) + LDB T,[POINT 11,TT,21] ;GET Y PART + ADD T,YTEXTF-1(TTT) + DPB T,[POINT 11,TT,21] + HRLZ T,XTEXTF-1(TTT) + POP P,TTT + LSH T,=18-=11 + ADD TT,T + POPJ P, + +;OFFSET LAST VECTOR PUT OUT BY X(A) AND Y(TT) +;ATTFIX(A=X, TT=Y) +ATTFIX: LSH A,=36-=11 + ADDM A,@BUFPTR + LDB A,[POINT 11,@BUFPTR,21] + ADD A,TT + DPB A,[POINT 11,@BUFPTR,21] + POPJ P, + + ;BIGAIV, SMLAIV + +BIGAIV: PUSHJ P,BIGSET ;SET X,Y FOR BIG CHAR + POPJ P, +CENCHR: MOVE TTT,SIZ ;MOVE BEAM SO CHAR IS CENTERED AT X,Y + MOVE T,DPYPTX(TTT) +CHRCN2: LSH T,=36-=11-1 + TLZ T,(1B11) + SUB TT,T + LDB T,[POINT 11,TT,21] + MOVE TTT,DPYPTY(TTT) + ASH TTT,-1 + SUB T,TTT + DPB T,[POINT 11,TT,21] + JRST INSOUT + +MPC,< +SMLAIV: PUSHJ P,SMLVCT + POPJ P, + JRST CENCHR + +SMGAIV: PUSHJ P,SMLVCT + POPJ P, + MOVE TTT,SIZ + MOVE T,DPYPTX(TTT) + ASH T,1 + JRST CHRCN2 + +SM1AIV: PUSHJ P,SMLVCT + POPJ P, + JRST CENCHR + +SM2AIV: MOVE TT,STDBIG + AOS TT + PUSHJ P,SM2SET + POPJ P, + JRST CENCHR +>;MPC + ;VHLINE +NOCMU,< +VHLINE: TLNN DSPACT + POPJ P, + PUSH P,T + MOVEI TT,146 + TLNE LOCATE ;LOCATING? + PUSHJ P,VECT +NODEC,< + MOVE TT,[XWD %NLOC,20] ;OFF SCREEN, DON'T DISPLAY + TRZ TT,34000 ;CLEAR BRIGHTNESS FIELD + CAMN TT,LOCAT + JRST VHLIN1 +NOIII,< PGSEL 0 + UPGMVM TT,LOCAT +>;NOIII +>;NODEC + +NOGT,< ;;JB +VB10,< + JRST VHLIN2 + EXCH TT,TTT + PUSHJ P,MAKWRD + EXCH TT,TTT + MOVEM TT,LOCATW + SKIPA TT,[XWD 400000,LOCATS] +VHLIN2: MOVE TT,[XWD 0,%NLOC] +>;VB10 +PGP,< + SETZ TT, ;FLAG FOR VH LINE OFF + TRZ TT,34000 ;CLR BRIGHTNESS BITS + CAMN TT,LOCAT ;ANYTHING NEW? + JRST VHLIN1 ;NO, QUIT + PUSHJ P,PUSHAL ;SAVE ACS + JUMPE TT,VHLIN2 ;TURN OFF? + PUSHJ P,TXYSET ;SET UP XY OF LINES + RTNCAL (INTERA,<[PLIT VHLIN4],[PLIT TSXDAT]>) ;SET UP VH LINES +VHLIN3: PUSHJ P,CHCINT ;MAKE IT HAPPEN + PUSHJ P,POPALL ;RESTORE ACS +>;PGP + MOVEM TT,LOCAT +III,<; DPYOUT 0,FBUF + JFCL +>;III +VHLIN1: POP P,T + POPJ P, +PGP,< +VHLIN2: RTNCAL (INTERA,<[PLIT VHLIN5],[PLIT NULARG]>) ;TURN OFF THE VH LINES + JRST VHLIN3 ;GO MAKE IT HAPPEN + + EVHL4-.-1 +VHLIN4: ASCIZ !BEGIN + ON HCA + Y[9]=$1; + X[10]=$0; + '302'=1; + END, + END! + 2 + EVHL4__. + + EVHL5-.-1 +VHLIN5: ASCIZ !BEGIN + ON HCA + '302'=0; + END, + END! + 0 + EVHL5__. +>;PGP +>;NOGT ;;JB + +GT,< ;;JB HORIZONTAL AND VERTICAL GT40 CODE. + JRST VHLIN2 ;;JB IF NOT ON SCREEN, NO LINES. + PUSHJ P,BRKTT ;;JB BREAK UP THE III INSTRUCTION NOW. + + BMODS 10,1,2 ;;JB SET TO ALTER SUBPICTURE 10. + + HLRZ T,TT ;;JB GET THE XIN T + PUSH P,T ;;JB STICK THE X ON THE LIST. + PUSH P,TT ;;JB AND THE Y NOW. + + BMODF ;;JB SEND OUT AND CLEAN UP STACK. + STAPIC 11 ;;JB START DISPLAYING SUBPICTURE 11. + JRST VHLIN1 ;;JB AND EXIT NOW. + +VHLIN2: STOPIC 11 ;;JB STOP DISPLAYING SUBPICTURE 11. + +VHLIN1: POP P,T ;;JB RESTORE AVED REGISTERS NOW. + POPJ P, ;;JB AND RETURN TO THE CALLER. +>;GT ;;JB END OF THIS CRAP NOW. +>;NOCMU + ;CALCOF, CONBOX +;CALCOF - POSITION FOR CONNECTOR STRING (ADJUST FOR STRING LENGTH LATER) +;E = POINT +CALCOF: FETCH(A,E,PXY) ;MAIN LOCN + FETCH(B,E,PLOC) + MOVE B,1(B) ;CHARACTER OFFSET + MOVE C,STDBIG ;CONNECTOR CHAR SIZE +;CALCOL - CALC CHAR OFFSET +;A = MAIN X,Y +;B = OFFSET X,Y +;C = CHARACTER SIZE +CALCOL: PUSHJ P,CALCF1 ;ADD IN CHARACTER OFFSET + POPJ P, + PUSHJ P,TFUDGE ;FUDGE FOR CHARACTER GENERATOR ERRS + JRST INSOU2 ;INSERT IN BUFFER + +CALCF1: +MD,< HRRE T,B ;OFFSET Y + IMUL T,DPYPTY(C) + IDIV T,VIRPTY(C) + HLRE TT,B ;OFFSET X + IMUL TT,DPYPTX(C) + IDIV TT,VIRPTX(C) + MOVE TTT,TT ;DIV CAN'T BE IN TTT + HLRE TT,A ;MAIN X + SUB TT,XOFF + SCALE(TT) + ADD TTT,TT + HRRE TT,A ;MAIN Y + SUB TT,YOFF + SCALE(TT) + ADD T,TT + MOVEI TT,146 + JRST CALVCT +>;MD +MPC,< MOVE T,B + ADJUST(ADD,T,A) + MOVEI TT,146 + JRST VECT +>;MPC + + ;ABCALC - POSITION BEAM TO A+B +;A = INTERNAL X,Y +;B = CHARACTER OFFSET (IN VIR CHAR PTS) + +MD,< +ABCALC: MOVE C,STDBIG + PUSHJ P,CALCF1 + POPJ P, + PUSHJ P,TFUDGE + JRST INSOU2 ;ADD VECTOR TO LIST + +;DISPLAY CONNECTOR BOX +;E = POINT +CONBOX: FETCH(A,E,PXY) + FETCH(B,E,PLOC) + MOVE B,1(B) + MOVE C,STDBIG + PUSHJ P,CALCF1 ;INITIAL POSITION + POPJ P, ;OFF SCREEN + PUSHJ P,INSOU2 ;START THERE +TITCON: MOVE C,STDBIG + MOVE T,DPYPTY(C) + ASH T,-1 + DPB T,[POINT 7,T,35-7] ;MAKE IT +,+ + MOVEI TT,2 + DPB T,[POINT 14,TT,35-4-2] + TRC T,37600 ;MAKE IT +,- + ADDI T,200 + DPB T,[POINT 14,TT,35-4-2-14-2] + IDPB TT,BUFPTR + MOVE A,E + PUSHJ P,CONCAL ;CALC LENGTH OF CON STRING + IMUL T,DPYPTX(C) + DPB T,[POINT 11,T,10] + HRRI T,6 + IDPB T,BUFPTR ;TOP OF BOX + TDC TT,[BYTE(7)<-1>,-1(2)0(7)<-1>,-1] + ADD TT,[BYTE(7)1,1(2)0(7)1,1] + IDPB TT,BUFPTR ;RIGHT TIT + TLC T,777600 ;BOTTOM OF BOX + ADD T,[BYTE(11)1] + IDPB T,BUFPTR + POPJ P, + + ;DISPIN - DISPLAYS A PIN# AT BPOINT +;E = BPOINT +;A = PIN# + +DISPIN: TLNE DSPOFF + POPJ P, + PUSH P,A + PUSH P,B + PUSH P,C + SETZM CHRCNT + PUSH P,PUTCHR + MOVE TTT,[AOS CHRCNT] + MOVEM TTT,PUTCHR + FETCH(C,E,BBODY) + FETCH(B,C,BSOC) + FETPAK(C,C) + PUSHJ P,PINPLS + POP P,PUTCHR + MOVN A,CHRCNT ;GET -LEN OF PIN # + FETCH(TT,E,BBODY) + FETCH(TTT,TT,BORI) + FETCH(T,E,BPLOC) ;TYPIN BLOCK FROM TYPE DEF + MOVEI C,DPYPTX ;SIGNAL PIN IS GOING TO DISPLAY + PUSHJ P,PINCAL ;CALC X,Y OFFSET FOR PIN # + PUSHJ P,ATTFIX ;OFFSET LAST VECT BY A AND TT + PUSHJ P,NUMSET ;SETUP DPY FOR CHARS + MOVE A,-2(P) ;PIN# + FETCH(C,E,BBODY) + FETCH(B,C,BSOC) + FETPAK(C,C) + PUSHJ P,PINPLS ;PRINT SOCKET PIN LOC + POP P,C ;RESTORE POINT + POP P,B ;RESTORE BODY + POP P,A ;RESTORE THE PIN #,,BITS + JRST FINTXT + + ;PINCAL - COMPUTE III POSITIONING FOR START OF TEXT FOR PIN +;A = -# CHARS IN PIN NAME +;C = CHARACTER SIZE TABLE ... DPY/PLT +;T = TYPIN +;TTT = BORI +;RETURNS +;A = X +;TT = Y + +PINCAL: ADD C,STDBIG ;CHAR SIZE TABLE FOR STD CHAR + FETCH(T,T,TPPOS) ;GET PIN-POS BITS + PUSH P,T + PUSHJ P,PINORI ;ROTATE PIN-POS BY ORIENTATION IN TTT +IFN =35-POSB, ;SHIFT TO RIGHT + ANDI T,(1POSW)-1 + IMUL A,(C) ;PIN TEXT SIZE IN PTS + XCT PNXTAB(T) + XCT PFXTAB(T) ;FUDGE X A LITTLE, BECAUSE CHAR SPACING IS SO TIGHT + MOVN TT,DPYPTX-DPYPTY(C) ;- HEIGHT OF STD CHAR + XCT PNYTAB(T) + PUSH P,F + MOVE F,TTT ;SAVE ORIENTATION FOR CALL ON ORIENT + LDB TTT,[POINT XOFFW,-1(P),XOFFB] ;UNITS ARE 1 CURSOR STEP + TRNE TTT,1(XOFFW-1) + ORCMI TTT,(1XOFFW)-1 + ASH TTT,1 ;MAKE IT DRAWING COORD + SCALE (TTT) + HRLZ T,TTT + LDB TTT,[POINT YOFFW,-1(P),YOFFB] + TRNE TTT,1(YOFFW-1) + ORCMI TTT,(1YOFFW)-1 + ASH TTT,1 ;MAKE IT DRAWING COORD + SCALE (TTT) + HRR T,TTT + PUSHJ P,ORIENT ;ROTATE OFFSET + POP P,F ;RESTORE F + HLRE TTT,T + ADD A,TTT + HRRE TTT,T + ADD TT,TTT + POP P,(P) + POPJ P, + +;HERE IS A FUDGE SO NUMBER ISN'T ON LINE! +PNXLTL__2 ;+-X + +PNXTAB: SETZ A, ;0 + ASH A,-1 ;X/2 + JFCL ;X + JFCL ;X + JFCL ;X + ASH A,-1 ;X/2 + SETZ A, ;0 + SETZ A, ;0 + +PFXTAB: ADDI A,PNXLTL + JFCL + SUBI A,PNXLTL + SUBI A,PNXLTL + SUBI A,PNXLTL + JFCL + ADDI A,PNXLTL + ADDI A,PNXLTL + +PNYTAB: SETZ TT, ;0 + SETZ TT, ;0 + SETZ TT, ;0 + ASH TT,-1 ;-Y/2 + JFCL ;-Y + JFCL ;-Y + JFCL ;-Y + ASH TT,-1 ;-Y/2 +>;MD + ;NUMSET, DISNUM, DISDEF, DISNM1, PIDCAL, CONNUM, BODNUM +;NUMSET - SETUP DPY BUFFER FOR CHARACTER MODE +NUMSET: MOVE TTT,[IDPB TTT,BFPTR2] + EXCH TTT,PUTCHR ;SET UP FOR PUTBYT + MOVEM TTT,DSPPSV +DTXSET: MOVSI TTT,() + HRR TTT,BUFPTR + MOVEM TTT,BFPTR2 +NUMST1: MOVEI TT,1 + MOVEM TT,1(TTT) + HRLZI TT,1(TTT) + HRRI TT,2(TTT) + BLT TT,MAXLIN/5+1(TTT) ;THIS ALLOWS FOR ENOUGH CHARS! + POPJ P, + +DISNUM: TLNE DSPOFF + POPJ P, + PUSHJ P,NUMSET + PUSHJ P,PUTDEC + JRST FINTXT + + ;DISDEF, DISRID + +MD,< +;DISDEF - DISPLAYS DEFAULT PIN NAME FROM TYPE +; (AS A BODY PIN FORMAT, NOT SOCKET PIN FORMAT) +;T -- POINTER TO TYPIN BLOCK +;TTT -- ORIENTATION +DISDEF: TLNE DSPOFF + POPJ P, + PUSH P,A + PUSHJ P,PIDCAL ;CALC PIN ID OFFSET + PUSHJ P,ATTFIX + PUSHJ P,NUMSET + PUSHJ P,OUTPID + JRST FNTXTA + +OUTPID: PUSH P,T + FETCH(A,T,TPNAM) + PUSHJ P,BPINPN + POP P,T + FETCH(T,T,TPBIT) +DEC,< TRNN T,ASSL!ASSH + JRST STOPTR + PUTBYT "-" + TRNE T,ASSH + PUTBYT "H" + TRNE T,ASSL + PUTBYT "L" +STOPTR: +>;DEC + TRNE T,BUSSED + PUTSTR[ASCIZ\/B\] + POPJ P, + +;DISRID - DISPLAY REAL PINID FROM BODY DEF +;T = PINBLOCK(TPIN) FROM TYPE +;TTT=BORI + +DISRID: TLNE DSPOFF + POPJ P, + PUSH P,A + PUSH P,C + PUSH P,T + SETZ A, + FETCH(T,T,TPID) +DSRID1: IDIVI T,=10 + SUBI A,1 + JUMPN T,DSRID1 + MOVE T,(P) + MOVEI C,DPYPTX ;CHARS DESTINED FOR DISPLAY + PUSHJ P,PINCAL ;CALC X,Y FOR START OFF TEXT + PUSHJ P,ATTFIX + PUSHJ P,NUMSET + POP P,T + FETCH(T,T,TPID) + PUSHJ P,DISNUM + POP P,C + POP P,A + JRST FINTXT + +;PIDCAL - CALCULATE X,Y OFFSET FOR PIN NAME +;T = TPIN BLOCK +;TTT = BORI ?? +;RETURNS +;A = X +;TT = Y + +PIDCAL: PUSH P,T + PUSH P,TTT + FETCH(A,T,TPNAM) + SETZM CHRCNT + PUSH P,PUTCHR + MOVE T,[AOS CHRCNT] + MOVEM T,PUTCHR + PUSHJ P,BPINPN ;PRINT AS BODY PIN + POP P,PUTCHR + MOVN A,CHRCNT + POP P,TTT ;ORIENTATION + MOVE TT,(P) + FETCH(TT,TT,TPBIT) + TRNE TT,BUSSED + SUBI A,2 ;2 MORE FOR BUSSED THRU +DEC,< TRNE TT,ASSH!ASSL + SUBI A,2 ;2 MORE FOR H OR L +>;DEC + MOVE T,(P) ;T=TYPIN, A=-CHARCT, TTT=BORI + PUSH P,C + MOVEI C,DPYPTX + PUSHJ P,PINCAL ;CALC X,Y OFFSET FOR PIN # + POP P,C + POP P,T ; RETURNS A,TT + POPJ P, +>;MD + + ;BODNUM - DISPLAY BODY LOC +;E = BODY + +BODNUM: TLNE DSPOFF + POPJ P, + PUSHJ P,NUMSET + PUSH P,A + PUSH P,TT +MD,< FETCH(A,E,BBRS) + PUSHJ P,SLTOUT ;PRINTS BAY-RACK-SLOT + FETCH(A,E,BSOC) +>;MD +MPC,< FETCH(A,E,BLN) > + PUSHJ P,LOCOUT ;PRINTS BODY LOC ON CARD + POP P,TT +FNTXTA: POP P,A +FINTXT: MOVE TTT,DSPPSV + MOVEM TTT,PUTCHR +FINDTX: MOVE TTT,BFPTR2 + HRRM TTT,BUFPTR + POPJ P, + +;E = POINT +CONNUM: TLNE DSPOFF + POPJ P, + PUSHJ P,NUMSET + PUSH P,A + FETCH(A,E,PLOC) + MOVE A,(A) + PUSHJ P,CSLTLP + JRST FNTXTA ;POPS A + ;DTXT +;B = POINTER TO BARE TEXT STRING +DTXT: JUMPE B,CPOPJ ;POINT,BODY TEXT + ADD B,[POINT 7,1] + SETZM ALTTFG + CAIA +ALTTXT: SETOM ALTTFG ;ALTER MODE TEXT DPY + TLNE DSPOFF + POPJ P, + SETZM LINCNT ;COUNT LINES HERE + SETZM CHRCNT + PUSHJ P,DTXSET ;SETUP POINTERS ETC. +DTLOP1: TLNN B,760000 ;BYTE POINTER OUT? + JRST [ HRR B,-1(B) + TRNE B,-1 + JRST .+1 + JRST FINDTX] + ILDB T,B + JUMPE T,DTLOP1 + SKIPN ALTTFG ;ALTER MODE + CAME T,EOLCHR ;NO, END OF LINE CHR? + CAIA + JRST DTLOP4 ;YES, END WITHOUT DPY'ING IT + IDPB T,BFPTR2 + AOS TT,CHRCNT + CAIGE TT,MAXLIN ;FAKE UP CRLF IF LINE TOO LONG + JRST [ CAME T,EOLCHR ;BUT ALWAYS BREAK ON EOL + JRST DTLOP1 + JRST DTLOP4] + MOVE TTT,BFPTR2 + PUSHJ P,NUMST1 ;SETUP SOME MORE BUFFER + SKIPN ALTTFG + JRST DTLOP1 +DTLOP4: PUSHJ P,FINDTX + SKIPN ALTTFG + JRST DTXCLF + AOS TT,LINCNT + CAIL TT,MAXPAG + POPJ P, ;QUIT IF MAX LINES EXCEEDED +DTXCLF: MOVEI TT,46 + MOVE T,SIZ ;CURRENT SIZE + MOVN TTT,DPYPTY(T) + DPB TTT,[POINT 11,TT,21] ;DOWN L.F. + MOVN TTT,DPYPTX(T) + IMUL TTT,CHRCNT + DPB TTT,[POINT 11,TT,10] ;BACK TO LEFT MARGIN + IDPB TT,BUFPTR + SETZM CHRCNT ;NO CHARS IN THIS LINE YET + PUSHJ P,DTXSET + JRST DTLOP1 + + ;STARTP, DSPSET, DSPOUT, UPSET, UPSCAL, UPSIDE +STARTP: TLNN DSPACT + POPJ P, + DPYCLR +NOCMU, +>> +CMU,< PUSH P,T + PUSH P,TT + SETZ T, ;MAKE SURE OUR FOLLOW FLAG IS CORRECT! + TRNE M,CURSOR + TRO T,FOLFLG + MOVEM T,FBFLGS + JSP TT,INATYO ;SET POG 0 PARAMETERS + PG0SET + PASBUF + MOVE TT,[-CMUFBL,,CMUFBF] + MOVE T,(TT) + PUSHJ P,ATYOW + AOBJN TT,.-2 + PUSHJ P,DOATYO +>;CMU +NODEC,< + GLISIZ__2 ;2 LINES PER GLITCH IN SCROLLER + PAPPOS__-400 ;USE BOTTOM QUARTER OF SCREEN +NOCMU,< GLTCHS__4 > +CMU,< GLTCHS__/CHGHT/GLISIZ-1 > ;SQUEEZE AS MANY LINES AS POSSIBLE IN! + DPYPOS PAPPOS +III,< JFCL > + DPYSIZ GLTCHS*1000+GLISIZ +III,< JFCL > +>;NODEC +CMU,< POP P,TT + POP P,T +>;CMU + POPJ P, + +NODEC,< +DCLAIM: +DTRY: SETZM TVISOFF + SETZM ISDPY +CMU,< SKIPLE DONTDPY ;LET HIM PRETEND + JRST FAKDPY +>;CMU + SKIPE DONTDPY + JRST DSPSET +NOIII,< SETO T, + GETLIN T +ITS,< TLNE T,420000 ;EITHER "III" OR "DATA DISK" BITS + SETOM TVDPY ;WE ARE ON TV +>;ITS +NOCMU,< TLNN T,400000 + JRST DSPSET +>;NOCMU +>;NOIII +III,< DPYADD [DPYBUF] ;NOOP WHICH SKIPS ON DISPLAY + JFCL + MOVE T,40 + TRNE T,200 +>;III +CMU,< HRRZI TT,(T) ;GET THE TTY NUMBER + TRO TT,200000 ;MAKE SURE THE BIT IS ON + MOVEI T,3001 + MOVE TTT,[2,,T] +; TRMOP. TTT, + TRMOP TTT, + HALT . + CAMN TTT,[SIXBIT /GRAPHI/] +FAKDPY: +>;CMU + SETOM ISDPY +NOCMU,< JRST DSPOUT >;START THE WORLD +CMU,< SKIPE ISDPY + PUSHJ P,INIGDP +>;CMU +>;NODEC +;NOW SETUP DSPACT +DSPSET: TLZ DSPACT + SKIPN ISDPY ;CAN IT BE ACTIVE AT ALL + POPJ P, + TLNN M,DSKACT!MACACT + TLO DSPACT ;DISPLAY IS STILL ACTIVE + POPJ P, + +ENDDSP: TLNN DSPACT + POPJ P, + PUSHJ P,PUSHIT +; TLNE M,XWINDOW ;ARE WE WINDOWING? +; JRST ENDSP1 + SETZM 1(P) ;USE THIS AS A FLAG + MOVE T,CURSE + CAML T,LEFT + CAMLE T,RIGHT + JRST [ AOS 1(P) + HLREM T,XOFF ;SET X OFFSET + JRST .+1] + HRRE T,T + CAML T,BOTTOM + CAMLE T,TOP + JRST [ AOS 1(P) + MOVEM T,YOFF + JRST .+1] + SKIPE 1(P) ;CHANGE X OR Y (OR BOTH) + PUSHJ P,CHANG1 ;YES, RE-CALC THINGS + JRST ENDSP1 + +DSPOUT: SKIPN ISDPY + POPJ P, + PUSHJ P,PUSHIT + PUSHJ P,DSPSET + PUSHJ P,STARTP + TRO MCHG!NEEDCL ;MAKE SURE IT HAPPENS + SETOM LPNTR ;UPDATE ARROW + SETOM CLOSUP ;UPDATE CLOSES TEXT +ENDSP1: PUSHJ P,FILEUP + PUSHJ P,POPIT + POPJ P, + +ITS,< +.TVOFF: SKIPE ISDPY + SKIPE DONTDPY + POPJ P, + SKIPE TVDPY + SKIPE TVISOFF + POPJ P, + TLNE M,DSKACT!MACACT + POPJ P, + SETOM TVISOFF + DPYCLR + POPJ P, + +TVMORE: SKIPE ISDPY + SKIPE DONTDPY + POPJ P, + SKIPE TVDPY + TLNE M,DSKACT!MACACT + POPJ P, +TVMOR1: OUTSTR [ASCIZ /-MORE-/] + INCHRW 1(P) + OUTSTR [ASCIZ / +/] + SETZM TVISOFF + JRST DSPOUT +>;ITS + +UPSET: SKIPN A,CURSET + POPJ P, + MOVE T,1(A) + PUSHJ P,BIGAIV + MOVEI T,"C"+"C"+1 + JRST DCLSET + +NOCMU,< +UPLVL: TLNN DSPACT + POPJ P, + HRRZ T,MACPNT + SUBI T,MACPDL-1 + IDIVI T,5 +NODEC,< MOVEI TTT,LVLWRD + JRST UPONE +>;NODEC + +VB10,< + PUSHJ P,UPONE + HRRM TT,LVLWRD + POPJ P, +>;VB10 +PGP,< + MOVE TTT,[XWD UPLDAT,LVLWRD] + JRST UPONE + +UPLDAT: =103 + XWD %LEFT+24*CWIDTH*TITBIG,SCRTOP-TITBIG*CHGHT +>;PGP + +GT,< ;;JB + PUSHJ P,UPONE1 ;;JB MAKE LEVEL A GOOD NUMBER. + ANDI TT,77777 ;;JB MAKE IT JUST 15 BITS NOW. + DPB TT,[POINT 7,TT,20] ;;JB CONVERT TO REVERSED 8 BIT FORMAT NOW. + LSH TT,-=7 ;;JB AND MOVE INTO PLACE. + MOVEM TT,GTLWRD ;;JB SAVE IN THE CORRECT SPOT NOW. + JRST SENDHD ;;JB AND SEND OUT THE HEADER NOW. +>;GT ;;JB END OF THIS CODE. + +UPSCAL: TLNN DSPACT + POPJ P, + MOVE T,NSCALE +NODEC,< MOVEI TTT,SCLWRD + JRST UPONE +>;NODEC + +VB10,< + PUSHJ P,UPONE + HRLM TT,SCLWRD + POPJ P, +>;VB10 +PGP,< + MOVE TTT,[XWD SCLDAT,SCLWRD] + JRST UPONE + +SCLDAT: =102 + XWD %LEFT+14*CWIDTH*TITBIG,SCRTOP-TITBIG*CHGHT +>;PGP + +GT,< ;;JB START OF MY SCALING CODE. + PUSHJ P,UPONE1 ;;JB CONVERT SCALE LEVEL TO NUMBER. + ANDI TT,77777 ;;JB CONVERT TO 15 BIT QUANTITY. + DPB TT,[POINT 7,TT,20] ;;JB REVERSE CHARACTERS AND CONVERT TO. + LSH TT,-=7 ;;JB TO 8 BIT FORMAT. + MOVEM TT,GTSWRD ;;JB SAVE IN THE LIST NOW. + JRST SENDHD ;;JB AND SEND OUT THE CHANGE NOW. +>;GT ;;JB + +NOGT,< ;;JB DON'T PUT THIS IN IF THERE'S A GT40. +UPONE: PUSHJ P,UPONE1 +NOVB10,< + LSH TT,1 +PGP,< +UPONE3: TLNN TT,774000 + JRST UPONE2 +>;PGP + TRO TT,1 + JRST PUT +>;NOVB10 +VB10,< ADDI TT,404040 + POPJ P, +>;VB10 +>;NOGT ;;JB . +>;NOCMU + +PGP,< +UPONE2: LSH TT,7 + JRST UPONE3 +>;PGP + +UPONE1: IDIVI T,=10 + HRLM TT,(P) + SKIPE TT,T + PUSHJ P,UPONE1 + HLRZ T,(P) +NOVB10,< + LSH TT,7 + ADDI TT,60(T) +>;NOVB10 + +VB10,< + LSH TT,6 + ADDI TT,20(T) +>;VB10 + POPJ P, + +NOCMU,< +NOGT,< ;;JB NORMAL STUFF. + +READY: PUSH P,T +NODEC,< MOVEI T,"*"+"*"+1 > +VB10,< MOVEI T, > +PGP,< MOVEI T,1 > + JRST SREADY + +NREADY: PUSH P,T +NODEC,< MOVEI T,12 > +VB10,< MOVEI T, > +PGP,< SETZ T, > +SREADY: TLNN DSPACT + JRST XREADY +III,< MOVEM T,REDWRD + DPYOUT 0,FBUF + JFCL +>;III +NODEC,< +NOIII,< + PGSEL 0 + MOVEM T,REDWRD +ITS,< SKIPN TVDPY > + UPGMVM T,REDWRD +>;NOIII +>;NODEC +VB10,< HRRM T,REDWRD > +PGP,< MOVEM T,REDWRD ;SAVE READYNESS STATE BIT + PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT RDYPRG],[PLIT REDWRD]>) ;SEND TO PGP + PUSHJ P,CHCINT ;MAKE IT HAPPEN + PUSHJ P,POPALL ;RESTORE ACS +>;PGP +XREADY: POP P,T + POPJ P, + +PGP,< ERDYP-.-1 +RDYPRG: ASCIZ !BEGIN + ON HCA + '205'=$0; + END, + END! + 1 + ERDYP__. +STORAGE(IMPURE) + 1 +REDWRD: 0 +STORAGE(PURE) +>;PGP +>;NOGT ;;JB END OF THEIR STUFF. + +GT,< ;;NOW DEFHNE MY STUFF. +READY: PUSH P,[RDYCJ] ;;JB PUSH THE "READY" COMMAND CHAR ON THE STACK. +XREADY: EXCH T,0(P) ;;JB PICK UP THE DESIRED CHARACTER. + CAMN T,JBREDY ;;JB ALREADY IN THAT MODE? + JRST JBXRDY ;;JB IN CORRECT MODE. EXIT NOW. + TLNE DSPACT ;;JB DISPLAY ACTIVE? + IONEOU T ;;JB YES. SEND OUT THE CHARACTER NOW. + MOVEM T,JBREDY ;;JB SAVE THE STATE OF THE DISPLAY NOW. +JBXRDY: POP P,T ;;JB RESTORE THE REGISTER NOW. + POPJ P, ;;JB EXIT. + +NREADY: PUSH P,[NRDYCJ] ;;JB GET THE NOT READY COMMAND NOW. + JRST XREADY ;;JB AND LOOP INTO THE MAIN CODE. +>;GT ;;JB END OF THIS CRAP. +>;NOCMU + +MPC,< +UPSIDE: MOVEI T,TITBRT ;BRIGHTNESS + MOVEI TT,TITBIG ;SIZE + MOVE TTT,[%LEFT+400,,SCRTOP-CHGHT*TITBIG*2];X,Y + PUSHJ P,TITVCT + TLNE SID,FRONT ;WHICH SIDE ARE WE ON + SKIPA T,[ASCID/Compo/] + MOVE T,[ASCID/Solde/] + IDPB T,BUFPTR + TLNE SID,FRONT + SKIPA T,[ASCID/nent/] + MOVE T,[ASCID/r/] + TRNE M,FLIP + IORI T,""+"" + IDPB T,BUFPTR + PUSHJ P,UPLOC +CHKVAL: TLO DSPOFF + TRNE M,FLIP + JUMPGE SID,CPOPJ + TRNN M,FLIP + JUMPL SID,CPOPJ + MOVEI T,TITBRT + MOVEI TT,TITBIG + MOVE TTT,[%LEFT+600,,SCRTOP-CHGHT*TITBIG*2] + PUSHJ P,TITVCT + MOVE T,[ASCID/Text /] + IDPB T,BUFPTR + MOVE T,[ASCID/Inval/] + IDPB T,BUFPTR + MOVE T,[ASCID/id/] + IDPB T,BUFPTR + POPJ P, +>;MPC +UPLOC: SKIPN CRDLOC ;ANY CARD LOC? +MPC,< POPJ P, > ;NO, CHECK FOR VALID TEXT +MD,< JRST UPMOD > + MOVEI T,TITBRT + MOVEI TT,TITBIG + MOVE TTT,[%LEFT,,SCRTOP-CHGHT*TITBIG*2] + PUSHJ P,TITVCT + PUSHJ P,NUMSET + PUSH P,A + HLRZ A,CRDLOC + PUSHJ P,SLTOUT + POP P,A + PUSHJ P,FINTXT + TLO DSPOFF +MD,< +UPMOD: SKIPN TVARIABLE + SKIPE TPREFIX + JRST UPMOD1 + SKIPN TMODULE + SKIPE TREV + JRST UPMOD1 +>;MD + POPJ P, + +MD,< +UPMOD1: MOVEI T,TITBRT + MOVEI TT,TITBIG + MOVE TTT,[%RIGHT-TITBIG*CWIDTH*=21,,SCRTOP-TITBIG*CHGHT] + PUSHJ P,TITVCT + SKIPN B,TMODULE + JRST UPVARI + PUSHJ P,DTXT + MOVEI T,"-" + IDPB T,TTT + HRRM TTT,BUFPTR +UPVARI: SKIPN B,TVARIABLE + JRST UPPREF + PUSHJ P,DTXT + MOVEI T,"-" + IDPB T,TTT + HRRM TTT,BUFPTR +UPPREF: SKIPN B,TPREFIX + JRST UPREV + PUSHJ P,DTXT +UPREV: MOVEI T,40*2+1 + IDPB T,BUFPTR + SKIPE B,TREV + PUSHJ P,DTXT + TLO DSPOFF + POPJ P, +>;MD + +IFN UMLSW!LAYSW,< +MPC,< +DUPIN: MOVEI T,TITBRT + MOVEI TT,TITBIG + MOVE TTT,[%LEFT+1100,,SCRTOP-TITBIG*CHGHT*2] + PUSHJ P,TITVCT + MOVE T,UPINS + PUSHJ P,DISNUM + PUTSTR [ASCIZ/ "WILD"/] + TLO DSPOFF + POPJ P, +>;MPC +>;IFN UMLSW!LAYSW + +MD,< +;E = POINT +OFFCLD: MOVEI T,TITBRT + MOVEI TT,TITBIG + MOVE TTT,[%LEFT+600,,SCRTOP-CHGHT*TITBIG*2] + PUSHJ P,TITVCT + PUSHJ P,TITCON + PUSHJ P,CONNUM + TLO DSPOFF ;NOW WE ARE OFF FOR SURE + POPJ P, +>;MD + +IFN UMLSW!LAYSW,< +OFFERD: MOVEI T,TITBRT + MOVEI TT,TITBIG + MOVE TTT,[%LEFT+200,,SCRTOP-CHGHT*TITBIG*2] + PUSHJ P,TITVCT + MOVE T,E ;# OF ERRORS + SETZ TTT, +OFFER1: IDIVI T,=10 + ADDI TT,60 + IOR TTT,TT + ROT TTT,-7 + JUMPN T,OFFER1 + TRO TTT,1 + IDPB TTT,BUFPTR + MOVE TT,[ASCID/ _??/] + IDPB TT,BUFPTR + TLO DSPOFF ;NOW WE ARE OFF FOR SURE + POPJ P, +>;UMLSW!LAYSW + ;GETPOS, SETPOS, UPCURS +;THIS IS ONLY CALLED ONCE FROM COMMAND LOOP FOR BULLSEYE CURSOR MOVING +GETPOS: TLNN DSPACT + JRST [ MOVE T,CURSE + POPJ P,] +NOIII,< +NODEC,< +NOCMU,< + PGSEL 0 + UPGMVE T,SAVWRD + MOVEM T,SAVWRD +>;NOCMU +>;NODEC +DEC,< +VB10,< +NOVIROS, +VIROS,< PUSHJ P,RDLPEN > +>;VB10 +NOVB10, +>;DEC +CMU,< PUSH P,TT + JSP TT,INATYO + GETCUR + GET2REGS + PUSHJ P,DOATYO +GETPS7: PUSHJ P,ATYIB +GETPS8: CAIE TT,22 + JRST GETPS7 + PUSHJ P,ATYIB + CAIE TT,2 + JRST GETPS8 + PUSHJ P,ATYIB + MOVEM TT,CHKSUM + HRLZI T,(TT) + PUSHJ P,ATYIB + ADDM TT,CHKSUM + DPB TT,[POINT 8,T,9] + PUSHJ P,ATYIB + ADDM TT,CHKSUM + DPB TT,[POINT 8,T,35] + PUSHJ P,ATYIB + ADDM TT,CHKSUM + DPB TT,[POINT 8,T,27] + PUSHJ P,ATYIB ;GET THE CHECKSUM + ADD TT,CHKSUM + ADDI TT,22+2 ;ADD THE HEADER IN + TRNE TT,377 ;MAKE SURE WE GOT A 0 CHECKSUM + HALT . + TLNE T,100000 ;SIGN EXTEND THE ANSWERS + TLO T,600000 + TRNE T,100000 + TRO T,600000 + POP P,TT +>;CMU + CAMN T,CURCUR + JRST [ MOVE T,POSS1 + POPJ P,] + MOVEM T,CURCUR + PUSH P,TT + PUSH P,TTT + PUSHJ P,GETSET + JRST ISPOS +>;NOIII + +;SETPOS - MOVE CURSOR TO X,,Y +;T = NEW X,Y +;CHECKS FOR SCREEN EDGE +;CURSOR LOCATIONS +;CURSE - INTERNAL COORDS +;POSS1 - INTERNAL COORDS, CLIPPED TO WINDOW EDGE +;CURCUR - III DISPLAY COORDS + +SETPOS: PUSH P,TT + PUSH P,TTT +MPC,< + MOVEM T,CURSE + HRRE T,CURSE + IDIV T,STPSIZ + ASH T,-1 + IMUL T,STPSIZ + ASH T,1 + HLRE TT,CURSE + ASH TT,-1 + IDIV TT,STPSIZ + ASH TT,1 + IMUL TT,STPSIZ + HRL T,TT +>;MPC +ISPOS: +MD,< TDZ T,[1,,1] > + MOVEM T,CURSE + TLNN DSPACT + JRST [ MOVSI T,400000 + MOVEM T,POSS1 ;INVALIDATE THESE +NOCMU,< SETOM CURCUR > +CMU,< MOVEM T,CURCUR > + JRST ISSET] + SETZM EDGE ;MUST WIN THIS MANY TIMES + MOVEI TTT,1 + HLLZ TT,T + CAMLE TT,RIGHT + MOVE TT,RIGHT + CAMGE TT,LEFT + MOVE TT,LEFT + HLLM TT,POSS1 + HLRE TT,TT + SUB TT,XOFF +MPC,< TRNE M,FLIP + MOVN TT,TT +>;MPC + SCALE (TT) +NOCMU,< DPB TT,[POINT 11,TTT,10] > +CMU,< HRLZ TTT,TT > + HRRE T,T + CAMLE T,TOP + MOVE T,TOP + CAMGE T,BOTTOM + MOVE T,BOTTOM + HRRM T,POSS1 + SUB T,YOFF + SCALE (T) +NOCMU,< DPB T,[POINT 11,TTT,21] > +CMU,< HRR TTT,T > + MOVEM TTT,CURCUR + MOVE T,POSS1 + CAMN T,CURSE ;DID WE HIT EDGE? + JRST ISSET ;NO + SETOM EDGE ;WENT OFF EDGE + TLNN M,DSKACT!MACACT!XWINDOW + MOVEM T,CURSE ;STORE TRUNCATED CURSOR POS IF TTY INPUT AND WINDOW +ISSET: POP P,TTT + POP P,TT + TRNE M,CURSOR + JRST SNDCUR ;IF LIGHT PEN TRACKING, SEND CURSOR POS + POPJ P, + +;PUT CURSOR ONTO GRID, CONVERT TO INTERNAL COORDS +;T = III LOCATION ON SCREEN +;RETURNS +;T = X*2,,Y*2 - INTERNAL COORD FORM + +GETSET: +NOCMU,< MOVE TT,T + ASH TT,=11-=36 +>;NOCMU +CMU,< HLRE TT,T > + UNSCAL (TT) +MPC,< TRNE M,FLIP + MOVN TT,TT + IDIV TT,STPSIZ + ASH TT,-1 + IMUL TT,STPSIZ + ASH TT,1 +>;MPC + ADD TT,XOFF +NOCMU,< LSH T,=11 + ASH T,=11-=36 +>;NOCMU +CMU,< HRRE T,T > + UNSCAL (T) +MPC,< MOVE TTT,TT + IDIV T,STPSIZ + ASH T,-1 + IMUL T,STPSIZ + ASH T,1 +>;MPC + ADD T,YOFF +MPC,< HRL T,TTT > +MD,< HRL T,TT > + + TDZ T,[(1)1] + POPJ P, + +;UPDATE CURSOR ON SCREEN +NOGT,< ;;JB MAJOR ELIMINATION OF CODE. + +UPCURS: TLNN DSPACT + POPJ P, + MOVE T,CURSE + CAME T,POSS1 ;IS CURCUR VALID + PUSHJ P,SETPOS ;NO, MAKE IT VALID +SNDCUR: +STAN,< MOVE TT,CURCUR ;WHERE SHOULD IT BE + MOVEI TTT,SAVWRD + JRST PUT +>;STAN + +ITS,< MOVE TT,CURCUR ;WHERE SHOULD IT BE + MOVEI TTT,SAVWRD + JRST PUT +>;ITS + +III,< MOVE TT,CURCUR + TRZ TT,177 + TRO TT,146 + MOVEM TT,SAVWR1 + MOVEM TT,SAVWR2 + MOVEM TT,SAVWR3 + MOVEM TT,SAVWR4 + MOVEM TT,SAVWR5 + DPYOUT 0,FBUF + JFCL + POPJ P, +>;III + +VB10,< + MOVE TTT,CURCUR ;WHERE SHOULD IT BE + MOVEM TTT,SAVWR2 + PUSHJ P,MAKWRD + CAMN TTT,SAVWRD + POPJ P, + MOVEM TTT,SAVWRD + SKIPE TT,FV1SAV + PUSHJ P,FOLOW4 + SKIPE TT,FV2SAV + PUSHJ P,FOLOW5 + POPJ P, +>;VB10 + +PGP,< MOVE TT,CURCUR ;GET POS OF CURSOR + TLNE DSPACT ;DISPLAYING? + CAMN TT,SAVWRD ;YES, CURSOR MOVED? + POPJ P, ;NO + MOVEM TT,SAVWRD ;YES, SAVE NEW POS + PUSHJ P,TXYSET ;SET UP XY COORDS + PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT CURPRG],[PLIT TSXDAT]>) ;SEND CURSOR XY TO PGP +XRTN: PUSHJ P,CHCINT ;MAKE IT HAPPEN + PUSHJ P,POPALL ;RESTORE ACS + POPJ P, + + ECURPG-.-1 +CURPRG: ASCIZ !BEGIN + ON HCA + TSX=$0; + TSY=$1; + XY[2,6,8]=TSXY; + Y[3]=TSY; + X[4]=TSX; + END, + END! + 2 + ECURPG__. + +TXYSET: LDB TTT,[POINT 11,TT,10] ;GET COORD X + TRNE TTT,2000 ;SIGN EXTEND + ORCMI TTT,1777 + MOVEM TTT,TSXDAT ;SAVE FOR PGP + LDB TTT,[POINT 11,TT,21] ;REPEAT FOR Y + TRNE TTT,2000 + ORCMI TTT,1777 + MOVEM TTT,TSYDAT + POPJ P, +>;PGP + +CMU,< + PUSH P,TT + PUSH P,TTT + JSP TT,INATYO + SETCUR + PASREGS + HLRE T,CURCUR + PUSHJ P,ATYOW + HRRE T,CURCUR + PUSHJ P,ATYOW + PUSHJ P,DOATYO + POP P,TTT + POP P,TT + POPJ P, +>;CMU + +;CURBRT, CLRCLC, SETCLC, CURSOFF, CURSON, FOLOW1, FOLOW2, CLEAR1, CLEAR2 +NOCMU,< +CURBRT: ANDI T,7 +NODEC,< + LSH T,=11 + MOVEI TT,46(T) + MOVEI TTT,FBRT + JRST PUT +>;NODEC +VB10,< + MOVEI TT,160010(T) + MOVEM TT,FBRT + POPJ P, +>;VB10 +PGP,< + CAMN T,FBRT ;ANY CHANGE? + POPJ P, ;NO + MOVEM T,FBRT ;YES, SAVE VALUE + PUSHJ P,MAKBRI ;SCALE BRIGHTNESS TO PGP CAPABILITY + PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT FBRPRG],[PLIT PGPBRI]>) ;SET CURSOR BRIGHTNESS + JRST XRTN ;MAKE IT HAPPEN + + EFBPG-.-1 +FBRPRG: ASCIZ !BEGIN + ON HCA + I[2,3,4,9,10]=$0; + END, + END! + 1 + EFBPG__. + +STORAGE(IMPURE) + 1 +FBRT: 5 + 1 +%CLOC: 1 +STORAGE(PURE) +>;PGP + ;CLOCATE CROSS + +CLRCLC: +NODEC,< SKIPA TT,[XWD ONOFF,20] > +VB10,< SKIPA TT,[XWD ONOFF-1,0] > +PGP,< TDZA TT,TT > +SETCLC: +NODEC,< + MOVEI TT,12 + MOVEI TTT,%CLOC + JRST PUT +>;NODEC +VB10,< + MOVSI TT,%CLOC+1 + HLLM TT,%CLOC + POPJ P, +>;VB10 +PGP,< + MOVEI TT,1 ;UNBLANK CLOCATE + CAMN TT,%CLOC ;ALREADY IN DESIRED STATE? + POPJ P, ;YES + MOVEM TT,%CLOC ;NO, SAVE STATE + PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT CLCPRG],[PLIT %CLOC]>) ;SET STATE OF CLOCATE + JRST XRTN ;MAKE IT HAPPEN + + ECLCPG-.-1 +CLCPRG: ASCIZ !BEGIN + ON HCA + '301'=$0; + END, + END! + 1 + ECLCPG__. +>;PGP + +CURSOFF:TRZN M,CURSOR + POPJ P, +NODEC,< + MOVE TT,[XWD CROSS,20] + MOVEI TTT,ONOFF + JRST PUT +>;NODEC +VB10,< +NOVIROS,< + MOVE TT,[XWD 400000,CROSS] + MOVEM TT,ONOFF +>;NOVIROS + POPJ P, +>;VB10 +PGP,< SETZM ONOFF +CURSO1: PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT COFPRG],[PLIT ONOFF]>) ;TURN ON CROSS + JRST XRTN ;MAKE IT HAPPEN + + ECOFPG-.-1 +COFPRG: ASCIZ !BEGIN + ON HCA + TSA=$0; + '110'=1-$0; + END, + END! + 1 + ECOFPG__. + +STORAGE(IMPURE) + 1 +ONOFF: 0 +STORAGE(PURE) +>;PGP + +CURSON: TROE M,CURSOR + POPJ P, +NODEC,< + MOVEI TT,12 + MOVEI TTT,ONOFF + JRST PUT +>;NODEC +VB10,< +NOVIROS,< + MOVEI TT,ONOFF+1 + MOVEM TT,ONOFF +>;NOVIROS + POPJ P, +>;VB10 +PGP,< AOS ONOFF + JRST CURSO1 +>;PGP + +FOLOW2: MOVEI TT,106 + PUSHJ P,VECT +VB10,< + JRST CLEAR2 + MOVEM TT,FV2SAV +FOLOW5: PUSH P,TT + PUSHJ P,CLEAR2+1 +FOLOW3: POP P,TT + TLNN DSPACT + POPJ P, + SETOM VBSIZE + SETOM VBBRIT + SETZM VBMODE + HRLI TTT,222200 + MOVEM TTT,COMPTR + HRRZM TTT,COMCTR + PUSHJ P,PUSHIT + MOVE A,SAVWRD + TRZ A,776000 + HRRZM A,VBX + HLRZS A + ANDI A,1777 + MOVEM A,VBY + MOVE A,SAVWR2 + TRZ A,37777 + TRO A,140 + PUSHJ P,DISPN2 + MOVE A,TT + PUSHJ P,DISPNT + PUSHJ P,POPIT + POPJ P, + +FV1SAV: 0 +FV2SAV: 0 +>;VB10 +PGP,< + JRST CLEAR2 ;OFF SCREEN, FLUSH + TLNE DSPACT ;DISPLAYING? + CAMN TT,FVECT2 ;YES, ANY CHANGE? + POPJ P, ;NO + MOVEM TT,FVECT2 ;YES, SAVE NEW DATA + PUSHJ P,TXYSET ;EXTRACT XY + PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT FV2PRG],[PLIT TSXDAT]>) ;SET XY + JRST XRTN ;MAKE IT HAPPEN + +CHCINT: RTNCAL (HCINT) ;MAKE IT HAPPEN + POPJ P, + + EFV2PG-.-1 +FV2PRG: ASCIZ !BEGIN + ON HCA + '114'=1; + [7]='114'\1\; + [8]='114'\2\; + X[7]=$0; + Y[7]=$1; + XY[8]=TSXY; + END, + END! + 2 + EFV2PG__. +>;PGP +CLEAR2: +NODEC,< MOVEI TT,12 > ;OFF SCREEN, DO CLEAR +VB10,< SETZM FV2SAV > +NOPGP,< MOVEI TTT,FVECT2 + JRST PUT +>;NOPGP +PGP,< + TLNE DSPACT ;DISPLAYING? + SKIPN FVECT2 ;YES, ANY CHANGE? + POPJ P, ;NO + SETZM FVECT2 ;YES, SAVE STATE + PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT CV2PRG],[PLIT NULARG]>) ;TURN OFF FOLLOW LINE + JRST XRTN ;MAKE IT HAPPEN + + ECV2PG-.-1 +CV2PRG: ASCIZ !BEGIN + ON HCA + '114'=0; + [7]='114'\1\; + [8]='114'\2\; + END, + END! + 0 + ECV2PG__. +>;PGP + +FOLOW1: MOVEI TT,106 + PUSHJ P,VECT +VB10,< + JRST CLEAR1 + MOVEM TT,FV1SAV +FOLOW4: PUSH P,TT + PUSHJ P,CLEAR1+1 + JRST FOLOW3 +>;VB10 +PGP,< + JRST CLEAR1 ;OFF SCREEN, FLUSH + TLNE DSPACT ;DISPLAYING? + CAMN TT,FVECT1 ;YES, ANY CHANGE? + POPJ P, ;NO + MOVEM TT,FVECT1 ;YES, SAVE NEW DATA + PUSHJ P,TXYSET ;EXTRACT XY + PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT FV1PRG],[PLIT TSXDAT]>) ;SET XY + JRST XRTN ;MAKE IT HAPPEN + + EFV1PG-.-1 +FV1PRG: ASCIZ !BEGIN + ON HCA + '113'=1; + [5]='113'\1\; + [6]='113'\2\; + X[5]=$0; + Y[5]=$1; + XY[6]=TSXY; + END, + END! + 2 + EFV1PG__. +>;PGP +CLEAR1: +NODEC,< MOVEI TT,12 > +VB10,< SETZM FV1SAV > +NOPGP,< MOVEI TTT,FVECT1 > +PGP,< + TLNE DSPACT ;DISPLAYING? + SKIPN FVECT1 ;YES, ANY CHANGE? + POPJ P, ;NO + SETZM FVECT1 ;YES, SAVE STATE + PUSHJ P,PUSHAL ;SAVE ACS + RTNCAL (INTERA,<[PLIT CV1PRG],[PLIT NULARG]>) ;TURN OFF FOLLOW LINE + JRST XRTN ;MAKE IT HAPPEN + + ECV1PG-.-1 +CV1PRG: ASCIZ !BEGIN + ON HCA + '113'=0; + [5]='113'\1\; + [6]='113'\2\; + END, + END! + 0 + ECV1PG__. +>;PGP +PUT: +NODEC,< + TLNE DSPACT + CAMN TT,(TTT) + POPJ P, +NOIII,< PGSEL 0 + UPGMVM TT,(TTT) +>;NOIII +>;NODEC +VB10,< + MOVE TT,[XWD 400000,400000] + MOVEM TT,4(TTT) + MOVEM TT,3(TTT) + MOVEM TT,2(TTT) + MOVEM TT,1(TTT) +>;VB10 +PGP,< TLNE DSPACT ;DISPLAYING? + CAMN TT,(TTT) ;YES, ANY CHANGE? + POPJ P, ;NO +>;PGP + MOVEM TT,(TTT) +III,<; DPYOUT 0,FBUF + JFCL +>;III +PGP,< +PUT1: PUSHJ P,PUSHAL ;SAVE ACS + MOVEM TTT,TSXDAT ;SAVE PTR TO DATA + JRA TTT,.+1 + MOVEM TTT,OUTBLK ;SEGMENT TO FLUSH + RTNCAL (INTERA,<[PLIT PUTPRG],[PLIT [PLIT OUTBLK]]>) ;FLUSH THE OLD COPY + PUSHJ P,CHCINT ;DO IT + MOVE TTT,OUTBLK ;CALC SEG NUMBER + ADDI TTT,=100 + MOVEM TTT,TSYDAT + HLRZ TT,TSXDAT + HLRE B,1(TT) ;GET REFPT + HRRE C,1(TT) + RTNCAL (REFPT,) + MOVEI T,TITBRT ;SET PARAMETERS + PUSHJ P,MAKBRI + SETZM PGPBRI+1 + SETZM PGPBRI+2 + RTNCAL (PARAMS,[PLIT PGPBRI]) + RTNCAL (ROSEG,TSYDAT) ;OPEN IT + MOVE A,TSXDAT + HRL A,OUTBLK + PUSHJ P,DRWDEM + RTNCAL (CSEG,TSYDAT) ;CLOSE IT + RTNCAL (ENDPIC) ;FORCE OUTPUT + PUSHJ P,POPALL ;RESTORE ACS +>;PGP + POPJ P, + +PGP,< EPUTPG-.-1 +PUTPRG: ASCIZ !BEGIN + ON HCA + $$0=OUT; + END, + END! + 1 + EPUTPG__. + +STORAGE(IMPURE) + 2 +OUTBLK: 0 + -1 +STORAGE(PURE) +>;PGP +>;NOGT ;;JB END OF THE ELIMINATION. +>;NOCMU + ;;JB ************************************ ALL CODE FROM HERE ON IS JB'ERS. + +GT,< + +UPCURS: TLNN DSPACT ;DISPLAY ACTIVE? + POPJ P, ;NO. LEAVE US. + MOVE T,CURSE ;GET THE CURSOR POSITION OW. + CAME T,POSS1 ;IS CURCUR VALID? + PUSHJ P,SETPOS ;NO. UPDATE CURCUR. +SNDCUR: MOVE TT,CURCUR ;OK. NOW GET THE CURSOR AS AN III INSTRUCTION. + PUSHJ P,BRKTT ;BREAK IT UP INTO XWD X,Y + CAMN TT,JBCUR ;SAME AS BEFORE? + POPJ P, ;YES! EXIT NOW. + MOVEM TT,JBCUR ;NO. SAVE IT AWAY FOR POSTERITY. + + BMODS 1,1,2 ;PREPARE TO MODIFY BLOCK 1 (THE CURSOR). + PUSH P,TT ;SAVE THE X NOW. + PUSH P,TT ;AND THE Y. + HLRZM TT,-1(P) ;WHOOPS. WRONG SIDE NOW. + BMODF ;LIST SET UP. SEND OUT CHANGE NOW. + SKIPE TT,FV1SAV ;HEY. ARE WE FOLLOWING? + PUSHJ P,FOL1A ;YES. FOLLOW 1. + SKIPE TT,FV2SAV ;HEY. ARE WE FOLLOWING TWO? + PUSHJ P,FOL2A ;YES. FOLLOW IT. + POPJ P, ;ELSE RETURN NOW. + + + +; MISCELLANEOUS DATA. + +STORAGE(IMPURE) + +JBCUR: 0 ;CURRENT CURSOR POSITION. +FV1SAV: 0 ;CURRENT FOLLOW POSITION 1 +FV2SAV: 0 ;CURRENT FOLLOW 2 POSITION. +STCHPS: 0 ;STACK UPDATE VALUE. + +STORAGE(PURE) + +CLRCLC: TLNN DSPACT + POPJ P, + STOPIC 5 ;STOP V & H LINE BY NOT DISPLAYING + POPJ P, ;THE APPROPRIATE SUBPICTURE. + +SETCLC: TLNN DSPACT + POPJ P, + STAPIC 5 ;DISPLAY THEM BY DISPLAYING THE SUBPICTURE. + POPJ P, + +CURSOF: TRZN M,CURSOR + POPJ P, + STOPIC(2) + STAPIC(12) + MOVEI 16,NLPXY + JRST STLPXY + +CURSON: TROE M,CURSOR + POPJ P, +CURSN1: STOPIC(12) + STAPIC(2) + MOVEI 16,LPXY ;POINTER TO X,Y POS TABLE FOR CURSOR + JRST STLPXY ;SEND TO GT40 + +CURBRT: TLNN DSPACT + POPJ P, + ANDI T,7 ;SET CURRENT CURSOR BRIGHTNESS. + BMODS 1,0,3 ;MODIFY COMMAND WORD AND X,Y + LSH T,7 ;SHIFT TO CRRECT SPOT NOW. + ADDI T,116000 ;CREATE A GOOD ABSOLUTE LONG POINT INSTRUCTION. + PUSH P,T ;PLACE THE ITEM ON THE STACK NOW. + HLRZ T,JBCUR + PUSH P,T ;PUSH X + PUSH P,JBCUR ;PUSH Y + BMODF ;AND SEND IT OUT. + POPJ P, + + +; THIS ROUTINE CONTROLS THE FOLLOWING OF THE CURSOR (TWO LINES). + +CLEAR1: TLNN DSPACT + POPJ P, + STOPIC 6 ;STOP SHOWING SUBPICTURE 6 NOW. + SETZM FV1SAV ;CLEAR THEFLAG NOW. + POPJ P, ;RETURN TO THE CALLER. + +FOLOW1: TLNN DSPACT + POPJ P, + MOVEI TT,106 ;MAKE IT ABSOLUTE LONG VECTOR. + PUSHJ P,VECT ;CREAT IT NOW. + JRST CLEAR1 ;IF NOT THERE, CLEAR IT OUT. + PUSHJ P,BRKTT ;BREAK UP TT NOW. + MOVEM TT,FV1SAV ;AND SAVE IT AWAY NOW. + +FOL1A: BMODS 6,3,2 ;MODIFY SUBPICTURE 6, FOR TWO WORDS. + HLLO TT,FV1SAV ;PICK UP THE DESIRED LOCATION NOW. + SUB TT,JBCUR ;SUBTRACT OFF OUR CURSOR POSITION. + PUSH P,TT ;PLACE ON THE STACK (NOT REALLY). + TLZ TT,756000 ;CHOP OFF CRAP NOW. + TLO TT,40000 ;MAKE VISIBLE. + TLNN TT,20000 ;NEGATIVE? + JRST .+3 ;NAW. + TLC TT,1777 ;YES. NEGATE IT NOW. + ADDI TT,1 + HLRZM TT,0(P) ;AND PLACE ON THE STACK. + HRRZ TT,FV1SAV ;PICK UP THE Y NOW. + SUB TT,JBCUR ;KNOCK OFF THE CURSOR NOW. + ANDI TT,21777 ;JUST LEAVE SIGN AND MAGNITUDE. + TRNN TT,20000 ;NEGATIVE? + JRST .+3 ;NOPE. + TRC TT,1777 ;YES. NEGATE IT. + ADDI TT,1 ;THIS WAY TO PRESERVE THE BITS. + PUSH P,TT ;SAVE IT ONE THE STACK NOW. + BMODF ;AND SEND OUT THE CHANGE NOW. + STAPIC 6 ;AND DISPLAY IT NOW. + POPJ P, ;AND RETURN TO THE CALLER. + +CLEAR2: TLNN DSPACT + POPJ P, + STOPIC 7 ;STOP SHOWING SUBPICTURE 7 NOW. + SETZM FV2SAV ;CLEAR THE FLAG NOW. + POPJ P, ;RETURN TO THE CALLER. + +FOLOW2: TLNN DSPACT + POPJ P, + MOVEI TT,106 ;MAKE IT ABSOLUTE LONG VECTOR. + PUSHJ P,VECT ;CREAT IT NOW. + JRST CLEAR2 ;IF NOT THERE, CLEAR IT OUT. + PUSHJ P,BRKTT ;BREAK UP TT NOW. + MOVEM TT,FV2SAV ;AND SAVE IT AWAY NOW. + +FOL2A: BMODS 7,3,2 ;MODIFY SUBPICTURE 7, FOR TWO WORDS. + HLLO TT,FV2SAV ;PICK UP THE DESIRED LOCATION NOW. + SUB TT,JBCUR ;SUBTRACT OFF OUR CURSOR POSITION. + PUSH P,TT ;PLACE ON THE STACK (NOT REALLY). + TLZ TT,756000 ;CHOP OFF CRAP NOW. + TLO TT,40000 ;MAKE VISIBLE. + TLNN TT,20000 ;NEGATIVE? + JRST .+3 ;NAW. + TLC TT,1777 ;YES. NEGATE IT NOW. + ADDI TT,1 + HLRZM TT,0(P) ;AND PLACE ON THE STACK. + HRRZ TT,FV2SAV ;PICK UP THE Y NOW. + SUB TT,JBCUR ;KNOCK OFF THE CURSOR NOW. + ANDI TT,21777 ;JUST LEAVE SIGN AND MAGNITUDE. + TRNN TT,20000 ;NEGATIVE? + JRST .+3 ;NOPE. + TRC TT,1777 ;YES. NEGATE IT. + ADDI TT,1 ;THIS WAY TO PRESERVE THE BITS. + PUSH P,TT ;SAVE IT ONE THE STACK NOW. + BMODF ;AND SEND OUT THE CHANGE NOW. + STAPIC 7 ;AND DISPLAY THE SUBPICTURE NOW. + POPJ P, ;AND RETURN TO THE CALLER. + +; THIS ROUTINE WILL BREAK UP THE III LONG VECTOR +; IN "TT" INTO (XWD X,Y). + + +BRKTT: ROT TT,=11 ;GET X INTO LOW ORDER BITS. + DPB TT,[POINT 11,TT,28] ;PLACE THEM INTO 18-28. + ROT TT,=11 ;NOW MOVE INTO 7-17. + AND TT,[1777,,1777] + ADD TT,[GTX,,GTY] + AND TT,[XWD 1777,1777] ;AND CHOP OFF STRAY BITS. + POPJ P, ;AND RETURN TO THE CALLER NOW. + + +; FILE UPDATER. + +NOLAST: TLNN DSPACT + POPJ P, + MOVE T,[POINT 7,NAMBUF] ;PICK UP POINTER TO FILE NAME. + MOVEM T,TMP1 ;SAVE IT AWAY NOW. + + MOVEM TTT,TMP2 ;SAVE TTT FOR A SECOND. + MOVEI TTT,GTFNAM ;PICK UP THE POINTER TO OUR NAME NOW. + MOVEI T,=25 ;25 CHARACTERS LONG. + +NOLAS1: ILDB TT,TMP1 ;GET A CHARACTER. + JUMPGE TTT,NOLAS2 ;PLACE IN RIGHT HALF OF GT40 WORD. + LSH TT,=8 ;PLACE IN LEFT HALF. + IORM TT,0(TTT) ;PLACE COMPLETED WORD IN MEMORY. + AOJA TTT,NOLAS3 ;UPDATE THE POINTER NOW. + +NOLAS2: MOVEM TT,0(TTT) ;PLACE THE 8 BITS IN RIGHT OF MEMORY NOW. +NOLAS3: TLC TTT,400000 ;FLIP THE SIGN BIT NOW. + SOJG T,NOLAS1 ;LOOP BACK AND GET THE NEXT ITEM. + JRST SENDHD ;AND WHEN DONE, SEND OUT CHANGES TO THE HEADING. + + +; SPECIAL DISPLAY SUBPICTURE TABLES. + +; 1=CURSOR +; 2=BULLSEYE CURSOR +; 3=HEADING +; 4=UNUSED +; 5=HORIZONTAL AND VERTICAL LINES THROUGH CURSOR. +; 6=FOLLOW 1 CODE. +; 7=FOLLOW 2 CODE. +; 10=POSITIONING FOR LINES THROUGH LETTERS. +; 11=MAIN ROUTINEFOR LINES WHICH CALLS #10. +; 12=CROSS CURSOR + + +;PLEASE NOTE!!!!!!!!!! CALLS BETWEEN SUB-PICTURES ARE BY SUB-PICTURE # +; THESE ARE CONVERTED TO BLOCK #S BY TRANS8. + +JBTABL: XWD -PIC1Z,PIC1 + XWD -PIC2Z,PIC2 + XWD -PIC3Z,PIC3 + XWD -PIC4Z,PIC4 + XWD -PIC5Z,PIC5 + XWD -PIC6Z,PIC6 + XWD -PIC7Z,PIC7 + XWD -PIC10Z,PIC10 + XWD -PIC11Z,PIC11 + XWD -PIC12Z,PIC12 + 0 ;0= END OF LIST. + +LPXY: 1 ;SUBPICTURE 1 + JBCURX-PIC1 ;OFFSET INTO BLOCK + 1 ;SAME FOR Y + JBCURY-PIC1 + +NLPXY: 0 + 0 + 0 + 0 + +STORAGE(IMPURE) + +PIC1: 117124 ;PICTURE 1=CURSOR POSITIONING. +JBCURX: GTX +JBCURY: GTY ; BOTH THE X ANY ARE CHANGED. + DISTOP + 0 +PIC1Z__.-PIC1 + XWD 1,0 ;DEFINE AS SUBPICUTRE 1, NO SHOW. + + +DEFINE CP(SX,X,SY,Y) +< IFIDN<-><20000+>X*1000+IFIDN<-><100+>Y*4+40000 +> + +DEFINE BULLSEYE +< -40000 ;FOO, LOSING GT40 + CP +,0,-,1 ;START WITH POINT AT CENTER + CP +,0,+,2 + CP +,2,-,2 + CP -,2,-,2 + CP -,2,+,2 + CP -,2,+,0 + CP +,1,+,3 + CP +,3,+,1 + CP +,3,-,1 + CP +,1,-,3 + CP -,1,-,3 + CP -,3,-,1 + CP -,3,+,1 + CP -,3,+,3 + CP +,0,+,3 + CP +,1,+,2 + CP +,2,+,1 + CP +,3,+,0 + CP +,3,+,0 + CP +,2,-,1 + CP +,1,-,2 + CP +,0,-,3 + CP +,0,-,3 + CP -,1,-,2 + CP -,2,-,1 + CP -,3,+,0 + CP -,3,+,0 + CP -,2,+,1 + CP -,1,+,2 +> + +PIC2: DISTOP ;THE X ON THE CURSOR. + 1 ;CALL 1 TO POSITION THE CURSOR. + 130160 ;RELATIVE POINT MODE, ENB LP, NO BLINK + BULLSEYE ;ONCE WITH LP AND NOT BLINK + DISTOP + 1 ;REPOSITION TO CURSOR + 130130 ;NOW BLINK, BUT NO LP + BULLSEYE + 130120 ;LP AND BLINK OFF + DISTOP ;END + 0 +PIC2Z__.-PIC2 + XWD 2,0 + + +PIC4: DISTOP ;PIC4 NO LONGER USED. + 0 +PIC4Z__.-PIC4 + XWD 4,0 ;DO NOT SHOW IT. + + +PIC5: DISTOP ;5 IS THE BIG LINES THROUGH CURSOR. + 1 ;GET THE POSITION NOW. + 110127 ;LONG RELATIVE VECTOR MODE. + 241777 ;TO RIGHT + 0 + 221777 ;BACK LEFT TO CENTER (INV) + 1777 ;BUT UP TO TOP. + 240000 ;NOW DOWN VIS TO CENTER + 21777 + 240000 ;KEEP GOING NOW. + 21777 + 221777 ;NOW TO LEFT X, NO Y. + 1777 + 241777 ;BACK TOCENTER VISIBLE. + 0 + DISTOP ;ENDOF THE PCITURE NOW. + 0 +PIC5Z__.-PIC5 + XWD 5,-1 ;DEFINE AND SHOWIT NOW. + + +PIC6: DISTOP ;CALL SUBPICTURE 1 + 1 ;TO POSITION THE CURSOR NOW! + 110124 ;THE FOLLOW 1 LONG VECTOR COMMANDS. + 0 + 0 + DISTOP + 0 +PIC6Z__.-PIC6 + XWD 6,0 ;DO NOT INITALLY SHOW IT. + + +PIC7: DISTOP ;CALL SUBPICTURE 1 [CURSOR] NOW. + 1 + 110124 ;GET INTO LONG VECTOR MODE. + 0 ;DEL X AND DEL Y GOHERE. + 0 + DISTOP + 0 +PIC7Z__.-PIC7 + XWD 7,0 ;SAME AS FOR 6. + + +PIC10: 117124 ;THIS CENTERS ON THE LETTER IN QUESTION. + 0 ;X AND Y INSERTED + 0 + DISTOP + 0 +PIC10Z__.-PIC10 + XWD 10,0 + + +PIC11: DISTOP ;CROSS HAIRS FOR GOING THROUGH LETTERS. + 10 ;CALL SUBPICTURE 10 + 110126 + 241777 + 0 + 221777 + 1777 + 240000 + 21777 + 240000 + 21777 + 221777 + 1777 + 241777 + 0 + DISTOP + 0 +PIC11Z__.-PIC11 + XWD 11,0 ;DO NOT SHOWIT INITIALLY. + + +PIC12: DISTOP + 1 ;CALL CURSOR X,Y + 104124 ;NOW DRAW CROSS + 42010 + 22110 + 62110 + 00020 + 44120 + DISTOP + 0 +PIC12Z__.-PIC12 + XWD 12,-1 + +STORAGE(PURE) +>;GT END OF THE BIGGY IN "DISP" + +;;JB RESUMING NORMAL COMMENTS FROM THIS POINT ON. + ;SEGWN0, SEGWN1, SEGWIN +;SEGMENT WINDOWING +SEGWN0: PUSH P,G + MOVEI G,0 + JRST SEGWIN + +SEGWN1: PUSH P,G + MOVEI G,1 +SEGWIN: PUSH P,F + MOVE TTT,@XDISP1(G) ;ON SCREEN POINT + MOVE T,@YDISP1(G) + SUB TTT,@XGO1(G) ;- OFF SCREEN POINT + SUB T,@YGO1(G) + MOVEI F,0 ;0 DOWN LEFT + JUMPGE T,.+2 + ADDI F,1 ;+1 UP + JUMPGE TTT,.+2 + ADDI F,2 ;+2 RIGHT + MOVE TT,@YGO1(G) ;OFF Y + XCT TBTAB1(F) ;0,2 BELOW BOTTOM - 1,3 ABOVE TOP + SKIPN T ;CROSSES, IS IT HORZ? + JRST TRYLR ;CAN'T CROSS VERTICALLY + MOVE TT,@YDISP1(G) ;ON Y + XCT TBTAB1(F) ;OTHER SIDE OF SCREEN EDGE? + JRST TRYLR ;NO, MAYBE LEFT AND RIGHT + SUB TT,TBTAB(F) ;DIST TO EDGE + MOVN TT,TT + IMUL TT,TTT ;MULT BY X DIF + IDIV TT,T ;DIV BY Y DIF + ADD TT,@XDISP1(G) + CAIGE TT,%RIGHT ;INTERSECT ON SCREEN? + CAMG TT,[%LEFT] + JRST TRYLR ;NO + LSH TT,=36-=11 ;PUT X IN POSITION + MOVE T,TBTAB(F) + DPB T,[POINT 11,TT,21] + JRST LWIN1 +TRYLR: MOVE TT,@XGO1(G) ;OFF X + XCT LRTAB1(F) ;0,1 OFF LEFT - 2,3 OFF RIGHT + CAMN TT,@XDISP1(G) ;CROSSES, IS IT VERT. + JRST LWLOSE ;LOSE + MOVE TT,@XDISP1(G) ;ON X + XCT LRTAB1(F) ;OTHER SIDE OF SCREEN EDGE? + JRST LWLOSE ;NO COMPLETELY OFF + SUB TT,LRTAB(F) ;DIST TO EDGE + MOVN TT,TT + IMUL TT,T ;MULT BY Y DIF + MOVE TTT,@XDISP1(G) ;ON SCREEN POINT + SUB TTT,@XGO1(G) ;- OFF SCREEN POINT + IDIV TT,TTT ;DIV BY X DIF + ADD TT,@YDISP1(G) + CAIGE TT,%TOP + CAMG TT,[%BOTTOM] ;INTERSECT ON SCREEN? + JRST LWLOSE ;NO + MOVE T,LRTAB(F) + LSH TT,=36-=11-=11 + DPB T,[POINT 11,TT,10] +LWIN1: POP P,F + POP P,G + JRST CPOPJ1 + +LWLOSE: POP P,F + POP P,G + POPJ P, + ;TABLES FOR SEGWIN +XGO1: XGO +XDISP1: XDISP + XGO + +YGO1: YGO +YDISP1: YDISP + YGO + +LRTAB: %LEFT+1 + %LEFT+1 + %RIGHT-1 + %RIGHT-1 + +LRTAB1: CAMG TT,[%LEFT] + CAMG TT,[%LEFT] + CAIL TT,%RIGHT + CAIL TT,%RIGHT + +TBTAB: %BOTTOM+1 + %TOP-1 + %BOTTOM+1 + %TOP-1 + +TBTAB1: CAMG TT,[%BOTTOM] ;DO WE GET THROUGH TOP OR BOTTOM FROM E TO A? + CAIL TT,%TOP + CAMG TT,[%BOTTOM] + CAIL TT,%TOP + ;UPDATE FILENAME FROM NAMBUF +NOCMU,< +NOGT,< ;;JB +NOLAST: +NODEC,< + TLNN DSPACT + POPJ P, +III,< HRRZS (P) > ;USE STACK AS FLAG +NOIII,< PGSEL 0 > + MOVSI T,-NFWRDS +FILUP1: MOVE TT,NAMBUF(T) + CAME TT,FILWRD(T) ;SAVE A SYSTEM CALL! +NOIII,< UPGMVM TT,FILWRD(T) > +III,< HRROS (P) > ;FLAG DIFFERENCE + MOVEM TT,FILWRD(T) + AOBJN T,FILUP1 +III,< SKIPGE (P) + DPYOUT 0,FBUF + JFCL +>;III + POPJ P, +>;NODEC +VB10,< + MOVE T,[POINT 7,NAMBUF] + MOVEM T,TMP1 + MOVE T,[POINT 6,FILWRD] + MOVEM T,TMP2 + MOVEI T,=25 +NOLAS1: ILDB TT,TMP1 + SKIPN TT + MOVEI TT,35 + CAIE TT,"[" + CAIN TT,"]" + JRST [PUSH P,TT + MOVEI TT,36 + IDPB TT,TMP2 + POP P,TT + CAIN TT,"[" + MOVEI TT,53 + CAIN TT,"]" + MOVEI TT,54 + IDPB TT,TMP2 + NOLAS3: MOVEI TT,35 + JRST NOLAS2] +NOLAS2: IDPB TT,TMP2 + SOJG T,NOLAS1 + MOVE TT,TMP2 + CAME TT,[POINT 6,FILWRD+4,29] + JRST NOLAS3 + POPJ P, +>;VB10 +PGP,< TLNN DSPACT ;DISPLAYING? + POPJ P, ;NO + MOVSI T,-NFWRDS ;CHECK FOR CHANGES + MOVE TT,NAMBUF(T) + CAME TT,FILWRD(T) + JRST NOLAS1 ;FOUND A CHANGE + AOBJN T,.-3 + POPJ P, ;NO CHANGES, WIN + +NOLAS1: MOVE T,[XWD NAMBUF,FILWRD] ;REMEMBER DATA + BLT T,FILWRD+NFWRDS-1 + MOVE TTT,[XWD NLSDAT,FILWRD] + JRST PUT1 + +NLSDAT: =104 + XWD %LEFT+31*CWIDTH*TITBIG,SCRTOP-CHGHT*TITBIG +>;PGP + ;UPDATE MODE +PMODE: +NOPGP,< TLNN DSPACT + POPJ P, + MOVE T,MODE + MOVE T,DMODE(T) +NODEC,< + CAMN T,MODWRD + POPJ P, +NOIII,< PGSEL 0 + UPGMVM T,MODWRD +>;NOIII + MOVEM T,MODWRD +III,< DPYOUT 0,FBUF + JFCL +>;III +>;NODEC +VB10,< + LSH T,-=10 + TLZ T,77601 + ADDI T,7200(T) + LSH T,=11 + TLNN T,7700 + TLO T,3500 + HLRM T,MODWRD +>;VB10 + POPJ P, +>;NOPGP +PGP,< MOVE TT,MODE ;GET MODE CHRS + MOVE TT,DMODE(TT) + MOVE TTT,[XWD PMDDAT,MODWRD] + JRST PUT + +PMDDAT: =101 + XWD %LEFT+5*CWIDTH*TITBIG,SCRTOP-CHGHT*TITBIG +>;PGP +>;NOGT ;;JB + +GT,< ;;JB +PMODE: TLNN DSPACT ;;JB DISPLAY ACTIVE? + POPJ P, ;;JB RETURN NOW. + MOVE T,MODE ;;JB PICK UP THE MODE NOW. + MOVE T,DMODE(T) ;;JB PICK UP THE CHARACTERS NOW. + ROT T,7 ;;JB MOVE IN THE FIRST CHARACTER NOW. + DPB T,[POINT 7,T,14] ;;JB STICK IN RIGHT AFTER THE SECOND ONE. + ROT T,=15 ;;JB MOVE IN THE 15 BITS NOW. + ANDI T,77777 ;;JB AND MAKE SURE IT'S JUST FIFTEEN. + MOVEM T,GTMODE ;;JB AND SAVE IN OUR LIST NOW. + JRST SENDHD ;;JB SEND OUT THE HEADING NOW. +>;GT ;;JB +>;NOCMU + +;MUST BE 2 OR LESS CHARS +STORAGE(IMPURE) + +DMODE: ASCID/S/ ;SET MODE + ASCID/B/ ;BODY MODE + ASCID/P/ ;POINT MODE + ASCID/L/ ;LINE MODE + ASCID/T/ ;TEXT MODE + ASCID/PA/ ;ALTER TEXT (POINT SUBMODE) + ASCID/MA/ ;MACRO ALTER MODE +SPMODT: ASCID/SP/ ;SPECIAL POINTER MODE (FIXED UP BY INDIVIDUAL PIECES OF CODE) +MD,< ASCID/BT/ ;BODY TEXT MODE + ASCID/BA/ ;BODY TEXT ALTER MODE + ASCID/E/ ;EDIT MODE + ASCID/EI/ ;EDIT INSERT MODE + ASCID/ET/ ;EDIT TEXT MODE + ASCID/EP/ ;EDIT PIN MODE + ASCID/EG/ ;EDIT GET MODE + ASCID/EA/ ;EDIT ALTER MODE +>;MD +REPEAT NUMODES+, + +STORAGE(PURE) diff --git a/src/draw/dl.loader b/src/draw/dl.loader new file mode 100644 index 00000000..2eccd52f --- /dev/null +++ b/src/draw/dl.loader @@ -0,0 +1,4 @@ +msail;jobdatl +mNEWDRW;DLl +MNEWDRW;PCLL +jDL1?Wtd diff --git a/src/draw/draw.338 b/src/draw/draw.338 new file mode 100644 index 00000000..41093f68 --- /dev/null +++ b/src/draw/draw.338 @@ -0,0 +1,970 @@ +;DRAW.FAI.75, 15-NOV-75 18:03:51, EDIT BY HELLIWELL +VERSION(DRAW,12) +DISP: TLNN DSPACT + POPJ P, + MOVE T,MODE ;GET MODE +MPC,< CAIE T,MALTM + CAIN T,ALTM + JRST TXTDIS ;THIS IS SPECIAL +>;MPC +MD,< + JRST @MTAB(T) ;DISPATCH + +MTAB: DP2 ;S + DP2 ;B + DP2 ;P + DP2 ;L + DP2 ;T + TXTDIS ;A + TXTDIS ;MA + DP2 ;SP + DP2 ;BT + TXTDIS ;BTA + DPED ;E + DPEDI ;EI + DPED ;ET + DPED ;EP + DPEDGT ;EG + TXTDIS ;EA +REPEAT NUMODES+, + ;MAIN DISPLAY, CARD STUFF +DP2: PUSHJ P,CLEAR1 + PUSHJ P,CLEAR2 +>;MD + TRZN MCHG + JRST @DSPDSP + SOFAR + PUSHJ P,BLDISP + SOFAR + MOVEI T,MAINPG + MOVEM T,PGLASS + PUSHJ P,DPYSET + PUSHJ P,UPSET ;UPDATE CURRENT SET! +MD,< PUSHJ P,UPLOC ;UPDATE GLOBAL CARD LOC + SKIPN SWIDTH ;ANY BOX TO SHOW? + JRST NOSBOX ;NO + PUSH P,M + TLO M,LWINDOW ;ALWAYS LWINDOW THIS BOX + MOVE T,SWIDTH + HRR T,SHEIGHT + PUSHJ P,AIVECT + MOVS T,SWIDTH + HRR T,SHEIGHT + PUSHJ P,AVECT + MOVS T,SWIDTH + HLR T,SHEIGHT + PUSHJ P,AVECT + MOVE T,SWIDTH + HLR T,SHEIGHT + PUSHJ P,AVECT + MOVE T,SWIDTH + HRR T,SHEIGHT + PUSHJ P,AVECT + POP P,T + TLNN T,LWINDOW + TLZ M,LWINDOW +NOSBOX: +>;MD +MPC,< +ROUTE,< PUSHJ P,PDISP > + PUSHJ P,UPSIDE ;SOLDER-COMPONENT STUFF + TLNN M,CRDISP + JRST CRDDON + PUSHJ P,SETDEF + MOVEI A,CRDLST + JRST CRDLIP +CRDLOP: MOVE T,1(A) + TRZE T,1 + JRST [ PUSHJ P,AIVECT + JRST CRDLIP] + PUSHJ P,AVECT +CRDLIP: HRRZ A,(A) + JUMPN A,CRDLOP + TRNE M,XFINGER + JRST NOTARG ;SKIP TARGETS IF NO FINGERS + HLRZ A,CRDLST + JUMPE A,NOTARG +DOTARG: MOVE T,1(A) + PUSHJ P,BIGAIV +nodec,< MOVEI T,""+""+1 > +dec,< movei t,""+""+1 > + PUSHJ P,TXTDPB +NTARG: HRRZ A,(A) + JUMPN A,DOTARG +NOTARG: MOVE T,DEFBRT + PUSHJ P,DPYBRT ;BRIGHT IN BOTH SIDES MODE + PUSHJ P,FNGBAR ;DO FINGERS AND BARS + TRNN BTHSDS + JRST CRDDON ;ONLY ONE SIDE + SWITCH + PUSHJ P,FNGBAR + SWITCH +CRDDON: CHECKIN +>;MPC + ;MAIN DISPLAY, BODIES AND POINTS + MOVE T,DEFBRT + PUSHJ P,DPYBRT + SKIPE E,DBODPN + PUSHJ P,BODYS + CHECKIN +MPC,< MOVE T,BTHBRT + TRNE BTHSDS + PUSHJ P,DPYBRT +>;MPC + SKIPE E,PONPNT + PUSHJ P,POINTS +MPC,< TRNN BTHSDS + JRST NOBOTH + CHECKIN + SWITCH + MOVE T,DEFBRT + PUSHJ P,DPYBRT + PUSH P,M + TLZ M,CLOCS + TRO M,NDIPS + SKIPE E,PONPNT + PUSHJ P,POINTS + POP P,M ;RESTORE FLAGS + SWITCH +NOBOTH: +>;MPC + PUSHJ P,MAINOU ;ALL DONE, DISPLAY IT! + SOFAR ;FINISHED, MAKE US A NOOP + POPJ P, + ;BODIES +;MAP DOWN BODY LIST IN E, DISPLAYING BODY OUTLINES, BODY LOC, BODY TEXT +;E = BODY POINTER + +BODYS: FETCH(D,E,BXY) + FETCH(A,E,BTYP) ;BODY DEFINITION + FETCH(F,E,BORI) + TLNN M,BLOCS + JRST DISLC2 +MD,< FETCH(T,E,BBIT) + TLNN M,UNHIDE ;IF UNHIDING, ALWAYS DISPLAY + TRNN T,FIXLOC ;IS BODY LOC OFFSET TRACKING DEFINITION? + JRST DISLC1 ;NO, WILL DISPLAY + FETCH(T,A,TBIT) + TRNE T,XDISLOC ;SUPPRESSING DISPLAY OF LOC? + JRST DISLC2 ;YES +DISLC1: FETCH(B,E,BLOC) + JUMPE B,DISLC2 ;IS THERE ANY? + MOVE T,STDBIG + PUSHJ P,DPYBIG + PUSH P,A + FETCH(A,E,BXY) + ADJUST(ADD,A,) ;LOC + OFFSET + FETCH(B,E,BLO) + PUSHJ P,ABCALC ;ADJUST FOR CHAR GEN OFFSET + POP P,A +>;MD +MPC,< + FETCH(T,E,BLN) + JUMPE T,DISLC2 ;NO NUMBER + MOVE T,STDBIG + PUSHJ P,DPYBIG + FETCH(T,E,BXY) + PUSHJ P,PINPOS +>;MPC + PUSHJ P,BODNUM ;PRINT BODY LOC FROM E +DISLC2: +MPC,< TLNN M,%IDENT + JRST NDIPID + FETCH(B,E,BNAM) + JUMPE B,NDIPID + MOVE T,STDBIG + PUSHJ P,DPYBIG + FETCH(T,E,BXY) + PUSHJ P,AIVECT + MOVEI T,25 ;ASCID/LF/ + PUSHJ P,TXTDPB + PUSHJ P,PLUNK ;AND STRING +NDIPID: +>;MPC +MD,< FETCH(T,E,BTXT) + MOVEM T,BTXLST +>;MD +;SO FAR +;D = X,,Y +;A = TYPE +;F = ORIENTATION +;E = BODY + + PUSHJ P,OUTBOD ;OUTPUT THE BODY LINES AND PROP/TEXT +ARN1: FETCH(E,E,BNXT) + JUMPN E,BODYS ;LOOP IF ANY LEFT + POPJ P, + +PLUNK: MOVE T,1(B) + TRO T,1 + PUSHJ P,TXTDPB + HRRZ B,(B) + JUMPN B,PLUNK + POPJ P, + ;POINTS +POINTS: PUSHJ P,DLOP3 + FETCH(E,E,PNXT) + JUMPN E,POINTS + POPJ P, + +;DLOP3 CALLED FROM LAYOUT STUFF TO BLINK WIRE +;E = POINT +DLOP3: FETCH(T,E,PXY) + PUSHJ P,ONSCR + JRST [ TLNE M,LWINDOW + PUSHJ P,DLOP5 ;OFF SCREEN, DO LINES IF WINDOWING + POPJ P,] ;THEN LEAVE + PUSHJ P,DLOP5 ;DO LINES, THEN GO ON + FETCHL(D,E,PBIT) + +;MORE POINTS, SHOW PAD, DRILL HOLE, PLANE CONNECTIONS (PC) +;E = POINT +;D = FLAGS,, + +MPC,< FETCH(T,E,PIN) ;PAD # + TLNE D,ISPIN ;HANDLE PIN SEPERATELY + JRST [ TRNE M,NDIPS ;SUPPRESSING DIP PINS? + JRST NOPLAN ;YES +; CAIE T,1 ;LET 1 GO BY +; JRST SHWPAD + MOVE T,NSCALE + CAIL T,5 + JRST SHWPAD + JRST NOPLAN] + TRNE M,XFEED ;SUPPRESSING FEED THROUGHS? + JRST NOFEED + TLNN D,FEEDTH + JUMPE T,NOFEED +SHWPAD: FETCH(T,E,PXY) + FETCH(TT,E,PIN) + CAIN TT,2 ;2 (CLEARANCE) SHOULD BE BIGGER + JRST [ PUSHJ P,SM2AIV + JRST .+2] + PUSHJ P,SMLAIV + TLNE D,ISPIN!FEEDTH +NODEC,< SKIPA T,[""+""+1] > +DEC,< SKIPA T,[""+""+1] > + MOVEI T,"O"+"O"+1 + FETCH(TT,E,PIN) + SKIPN TT + MOVEI T,"X"+"X"+1 + CAILE TT,2 + JRST [ CAILE TT,=9 + MOVEI TT,"??"-60 ;FLAG AS ERROR + MOVEI T,60(TT) + LSH T,1 + TRO T,1 + JRST .+1] + PUSHJ P,TXTDPB +NOFEED: TLNN D,PLANES + JRST NOPLAN + FETCH(T,E,PXY) + PUSHJ P,SMGAIV + LDB T,[%%PLANES,,D] + MOVE T,(T)[ 1 + ASCID/\/ + ASCID// + ASCID/=/ + ASCID// + 1 + 1 + 1 ] + PUSHJ P,TXTDPB +NOPLAN: +>;MPC + ;MORE POINTS, PIN NUMBERS, TEXT. +;FALLS THRU FROM DLOP3 +;D = FLAGS,, +;E = POINT + + TLNE M,CLOCS + TLNN D,CPIN ;DOING PINS, IS THIS A CONNECTOR PIN? + JRST NOCONP ;DON'T HAVE TO FOOL AROUND HERE +MD,< + MOVE A,E ;A = POINT + TRNN M,NOCBOX ;SKIPPING CBOX FOR NOW? + PUSHJ P,CONBOX ;PUT BOX FOR CONNECTOR ID (E=POINT) + MOVE T,STDBIG + PUSHJ P,DPYBIG + PUSHJ P,CALCOF ;POSITION BEAM TO X,Y (WITH CHAR OFFSET) +>;MD +MPC,< FETCH(T,E,PXY) + PUSHJ P,SMLAIV ;VECTOR TO THERE +>;MPC + PUSHJ P,CONNUM ;E=POINT +MD,< JRST NONUMP ;CHECK IF MUST FOOL + +NOCONP: TLNN D,ISPIN ;YES, IS THIS A PIN? + JRST NONUMP + TLNN M,RPINID + JRST NORID +;Display "real" PINID from TYPE + MOVE T,STDBIG + PUSHJ P,DPYBIG + FETCH(T,E,BPXY) + PUSHJ P,PINPOS + FETCH(TTT,E,BBODY) ;PTR TO BODY + FETCH(TTT,TTT,BORI) ;GET ORIENTATION FROM BODY + FETCH(T,E,BPLOC) ;PIN BLOCK FROM TYPE + PUSHJ P,DISRID ;DISPLAY REAL PIN ID + JRST NONUMP + +NORID: TLNN M,PLOCS ;DOING PINS? + JRST CKPNID ;NO, CHECK ID'S +;Display assigned PIN locs from BODY + FETCH(TT,E,BPLOC) ;GET PIN OF TYPE + FETCH(T,TT,TPBIT) + TRNE T,BUSSED ;BUSSED THROUGH? + TLNE M,UNHIDE ;YES, ARE WE UNHIDING THEM? + CAIA ;NOT BUSSED OR UNHIDING + JRST NONUMP ;BUSSED AND NOT UNHIDING + FETCH(T,E,BPPN) ;GET PIN NAME + JUMPN T,ISNUMP + TLNN M,PINIDS ;IF NOT ASSIGNED, MAYBE DISPLAY DEFAULT? + JRST NONUMP + FETCH(T,TT,TPNAM) ;DEFAULT PIN NAME FROM TYPE +ISNUMP: PUSH P,T + MOVE T,STDBIG + PUSHJ P,DPYBIG + FETCH(T,E,BPXY) + PUSHJ P,PINPOS ;GO THERE, THIS WILL GET FUDGED PROPERLY + POP P,A ;A=PIN#, E=BPOINT + PUSHJ P,DISPIN ;DISPLAY IT + JRST NONUMP + +CKPNID: TLNN M,PINIDS + JRST NONUMP +;Display default PIN names from TYPE + MOVE T,STDBIG + PUSHJ P,DPYBIG + FETCH(T,E,BPXY) + PUSHJ P,PINPOS + FETCH(TTT,E,BBODY) + FETCH(TTT,TTT,BORI) + FETCH(T,E,BPLOC) + PUSHJ P,DISDEF +>;MD + +MPC, +NONUMP: FETCH(B,E,PTXT) ;GET TEXT POINTER + JUMPE B,DLOP4 ;ANY AT ALL? + TRNE M,NPTEXT + JRST DLOP4 + FETCH(A,B,TCXY) + FETCH(B,B,TCSTR) + FETCH(T,B,TSSIZ) + ANDI T,377777 + MOVE C,T ;SAVE SIZE + PUSHJ P,DPYBIG ;SET SIZE + PUSH P,B + FETCH(B,E,PXY) + EXCH A,B ;A=MAIN, B= CHAR OFFSET + PUSHJ P,CALCOL ;MOVE BEAM TO TEXT (WITH CHAR OFFSET) + POP P,B + PUSHJ P,DTXT ;DISPLAY TEXT +DLOP4: POPJ P, + +;POINT SUBR, DRAW LINES + +LINOUT: FETCH(T,E,PXY) +MPC,< CAMGE T,ADDR(A,PXY) + POPJ P, +>;MPC + PUSHJ P,AIVECT ;DRAW INVIS. TO IT + FETCH(T,A,PXY) + JRST AVECT ;DRAW VIS. TO IT & LEAVE + + +;SUBR TO DRAW LINES +DLOP5: TRNE M,NLINES + POPJ P, ;NOT DOING LINES! +MD,< + DEFINE FOO ' (DIR) +< FETCH(A,E,PN'DIR) + JUMPE A,.+2 + PUSHJ P,LINOUT +> + + FOO(U) + FOO(R) + POPJ P, +>;MD +MPC,< + FETCH(D,E,PNEB) + JUMPE D,CPOPJ +DLOP7: MOVEI B,2 +DLOP8: XCT (B)[ HLRZ A,(D) + HRRZ A,1(D) + HLRZ A,1(D)] + JUMPE A,.+2 + PUSHJ P,LINOUT + SOJGE B,DLOP8 + HRRZ D,(D) + JUMPN D,DLOP7 + POPJ P, +>;MPC + ;EDIT DISPLAY (D) +MD,< +EDDISR: TRZN MCHG + TRNE INMOV + JRST EDDIS1 + POP P,(P) + POPJ P, + +EDDIS1: PUSHJ P,CLEAR1 + PUSHJ P,CLEAR2 + MOVEI T,MAINPG + MOVEM T,PGLASS ;USE PIECE OF (GL)ASS NUMBER 3 (FOR EDITING BODY) + PUSHJ P,DPYSET + SETZ T, + MOVEI TT,TITBIG + MOVE TTT,[%LEFT,,SCRTOP-CHGHT*TITBIG*3] + PUSHJ P,TITVCT + MOVE T,[ASCID/BODYN/] + PUSHJ P,TXTDPB + MOVE T,[ASCID/AME: /] + PUSHJ P,TXTDPB + MOVE B,CURBOD + HRRZ B,(B) + JRST PLUNK + +DPEDGT: MOVE A,GETBOD ;BODY WE ARE GETTING + MOVE D,CURSE ;PUT IT AT CURSOR + MOVE F,GETORT + MOVEI T,ANGLPG ;USE ANGLE PAGE + MOVEM T,PGLASS + PUSHJ P,DPYSET + PUSH P,M + TRZ M,NBTEXT + PUSHJ P,PUTBOD ;DRAW BODY + POP P,M + PUSHJ P,BLINKO +DPED: PUSHJ P,EDDISR +DPEDR: MOVE A,CURBOD ;GET POINTER TO BODY + SETZB D,F ;CLEAR OFFSET AND ORIENTATION + PUSHJ P,PUTBDL ;OUTPUT IT + JRST MAINOU + +DPEDI: PUSHJ P,EDDISR + MOVE A,CLSTPN ;GET PRECEDING ("LAST") POINT + SKIPN B,CRPPNT ;GET CURRENT POINT OF BODY + JRST DPEDQ + HRRZ D,(B) ;REMOVE LINK TO CURRENT POINT + HRRM D,(A) ;... + PUSH P,1(D) ;SAVE NEXT X,Y + PUSH P,D ;SAVE D + JUMPE D,DARN ;NO NEXT POINT? + MOVEI T,1 + ORB T,1(D) ;MAKE INVISIBLE VECTOR AROUND CURRENT POINT + MOVE T,-1(P) ;GET FOLLOW2 POINT + TRNN T,1 ;VISIBLE? + PUSHJ P,FOLOW1 ;YES, FOLLOW IT +DARN: TRNE ATFP ;AT FIRST POINT? + JRST FARN ;YES, DON'T FOLLOW + MOVE T,1(A) ;NO, GET X,Y + TRZ T,1 ;SHUT OFF VIS/INVIS BIT + TRNN TYPNEG ;NEGATIVE VECT FOLLOWING US? + PUSHJ P,FOLOW2 ;NO, FOLLOW IT +FARN: MOVE A,CURBOD ;GET POINTER TO BODY + SETZB D,F ;CLEAR OFFSET AND ORIENTATION + PUSHJ P,PUTBDL ;PUT IT OUT + POP P,D ;RESTORE D + JUMPE D,[POP P,(P) + JRST .+2] + POP P,1(D) ;RESTORE X,Y FOR FOLLOWING POINT + MOVE B,CRPPNT + MOVE A,CLSTPN + HRRM B,(A) ;RESTORE LINKAGE + JRST MAINOU + +DPEDQ: MOVE T,1(A) + TRZ T,1 + TRNN ATFP + PUSHJ P,FOLOW1 + JRST DPEDR +>;MD + ;OUTBOD:(PC) +; CALL WITH +; A=POINTER TO TYPE DEFINITION +; D=X,Y OFFSET +; F=ORIENTATION +MPC,< +PUTBDL: FETCH(B,A,TPIN) + JUMPE B,OUTBD1 +PUTBD1: FETCH(T,B,TPXY) + PUSHJ P,ORIENT + ADJUST(ADD,T,D) + PUSHJ P,SMLAIV +NODEC,< MOVEI T,""+""+1 > +DEC,< MOVEI T,""+""+1 > + PUSHJ P,TXTDPB + FETCH(B,B,TPNX) + JUMPN B,PUTBD1 + JRST OUTBD1 + +OUTBOD: MOVE T,NSCALE + CAIGE T,5 ;OR TOO SMALL TO DO ALL POINTS? + JRST JSTBOX ;YES, SIMULATE WITH BOX +OUTBD1: MOVE T,STDBIG + PUSHJ P,DPYBIG ;EVERYTHING HERE IS SIZE ONE + TLNN M,PLOCS ;SHALL WE DO PINS + JRST NONUMS + MOVEI B,ADDR(A,TPIN,TPNX) ;POINTER TO LIST OF PINS IN TYPE + JRST NXTNUM + +DONUM: FETCH(T,B,TPXY) ;X,Y OF PIN + PUSHJ P,ORIENT + ADJUST(ADD,T,D) ;OFFSET IT + PUSHJ P,AIVECT + FETCH(T,B,TPID) ;PAD NAME + PUSHJ P,DISNUM +NXTNUM: FETCH(B,B,TPNX) ;NEXT PIN IN TYPE + JUMPN B,DONUM +NONUMS: FETCH(B,A,TPIN) + JUMPE B,NONMS1 +FNPIN1: FETCH(T,B,TPID) ;FIND PIN #1 + CAIN T,1 + JRST ISPIN1 + FETCH(B,B,TPNX) + JUMPN B,FNPIN1 + JRST NONMS1 + +ISPIN1: FETCH(T,B,TPXY) ;DISPLAY GREATER THAN ON PIN 1 + PUSHJ P,ORIENT + ADJUST(ADD,T,D) + PUSHJ P,SM1AIV + MOVEI T,76*2+1 ;"GREATER THAN" + PUSHJ P,TXTDPB +NONMS1: TRNN M,NDIPS ;IF NO PINS BEING SHOWN, DRAW BOX + POPJ P, +JSTBOX: FETCH(B,A,TDPY) + SKIPN B + FETCH(B,A,TPIN) + TLO B,-1 +JSTLOP: FETCH(T,B,QXY) + PUSHJ P,ORIENT + ADJUST(ADD,T,D) + TLNE B,-1 ;FIRST TIME? + JRST [ PUSHJ P,AIVECT ;YES + JRST .+2] + PUSHJ P,AVECT + HRRZ B,(B) ;GET NEXT AND INDICATE NOT FIRST TIME + JUMPN B,JSTLOP + POPJ P, +>;MPC + ;OUTBOD:(D) +MD,< +;A = POINTER TO TYPE DEFINITION +;D = X,Y OFFSET +;F = ORIENTATION +PUTBDL: TLNN M,BLOCS ;BODY LOCS ENABLED? + JRST PUTBOD ;NO + MOVE T,STDBIG + PUSHJ P,DPYBIG + FETCH(B,A,TYP3) ;EXPLICIT CHARACTER OFFSET? + JUMPN B,[FETCH(B,A,TOXY) ;YES + JRST NLCFDG] + MOVE B,STDBIG + PUSH P,PUTCHR + MOVE T,[AOS CHRCNT] + MOVEM T,PUTCHR + SETZM CHRCNT + PUTSTR @PROTOB ;MEASURE SIZE OF PROTO LOC + POP P,PUTCHR + MOVN T,CHRCNT + FETCH(TT,A,TBIT) + TRNE TT,XDISLOC + SUBI T,9 ;"(-DISLOC)" + IMUL T,VIRPTX(B) + ASH T,-1 + MOVN B,VIRPTY(B) + ASH B,-1 + HRL B,T +NLCFDG: PUSH P,A + FETCH(A,A,TXY) ;LOC-TEXT OFFSET + ADJUST(ADD,A,D) + PUSHJ P,ABCALC + POP P,A + MOVE T,@PROTOB ;GET PROTOTYPE DIP LOC + PUSHJ P,TXTDPB + FETCH(T,A,TBIT) + TRNN T,XDISLOC ;SUPPRESSING DISPLAY OF LOC FOR BODIES? + JRST PUTBOD + MOVE T,[ASCID/(-DIS/] + PUSHJ P,TXTDPB + MOVE T,[ASCID/LOC)/] + PUSHJ P,TXTDPB +PUTBOD: SETZM BTXLST + TLNN M,RPINID!PINIDS ;DOING PIN ID'S? + JRST OUTBOD ;NO + MOVE T,STDBIG + PUSHJ P,DPYBIG + FETCH(B,A,TPIN) + JUMPE B,NONUM +DONUM: FETCH(T,B,TPXY) ;GET X,Y OF PIN + PUSHJ P,ORIENT ;ORIENT IT + ADJUST (ADD,T,D) ;ADD BODY CENTER + PUSHJ P,PINPOS ;MOVE BEAM FOR START OF CHAR + MOVE T,B ;TPIN BLOCK + MOVE TTT,F ;ORIENTATION + TLNE M,RPINID + PUSHJ P,DISRID ;DISRID(T=TPIN, TTT=BORI) + TLNN M,RPINID + PUSHJ P,DISDEF +NXTNUM: FETCH(B,B,TPNX) + JUMPN B,DONUM +NONUM: + ;OUTBOD - DISPLAY TYPE OUTLINE AND PROPERTY TEXT +;FALLS THRU +; CALL WITH +; A=POINTER TO TYPE DEFINITION +; D=X,Y OFFSET +; F=ORIENTATION +; E=BODY +; BTXLST = TEXT FROM BODY (IF NONE, DISPLAY TYPE'S TEXT) + +OUTBOD: FETCH(B,A,TLIN) + JUMPE B,DBPNT1 ;NO MORE LINES? +DLOP1: MOVE T,1(B) ;GET X,Y + TRZE T,1 ;INVISIBLE? + TLO B,400000 ;FLAG INVISIBLE (WAS CLEARED BY HRRZ) + PUSHJ P,ORIENT + ADJUST(ADD,T,D) ;OFFSET IT + TLNE B,400000 ;INVISIBLE? + JRST [ PUSHJ P,AIVECT ;YES + JRST .+2] + PUSHJ P,AVECT ;NO + HRRZ B,(B) ;GET NEXT LINE + JUMPN B,DLOP1 +DBPNT1: TRNE M,NBTEXT + POPJ P, + SKIPN B,BTXLST ;ANY TEXT ON BODY + JRST DLOPDF ;NO, TRY TEXT ON TYPE DEF +BDLOP1: PUSH P,B + FETCH(TT,B,TXBIT) + TRNE TT,TXBIND ;INDIRECT TO TYPE? + FETCH(B,B,TXIND) + PUSHJ P,BTXDSP + POP P,B + FETCH(B,B,TXNXT) + JUMPN B,BDLOP1 + POPJ P, + + ;PRINT TEXT ON TYPE DEF +DLOPDF: FETCH(B,A,TPROP) + JUMPE B,CPOPJ ;NONE? +DLOP7: PUSHJ P,BTXDSP + FETCH(B,B,TXNXT) + JUMPN B,DLOP7 ;LOOP + POPJ P, + +BTXDSP: PUSH P,B ;TEXT/PROP BLOCK + PUSH P,C + PUSH P,D + PUSH P,E + FETCH(T,B,TXVAL) + FETCH(T,T,TSSIZ) + TLNN M,%IDENT + JUMPE T,BTXDSX ;INVISIBLE + FETCH(T,B,TXXY) + TDZ T,[1,,1] + PUSHJ P,ORIENT + ADD D,T + TLZ D,1 + FETCH(T,B,TXVAL) + FETCH(T,T,TSSIZ) + SKIPN T + MOVE T,STDBIG + ANDI T,377777 + MOVE C,T ;SAVE SIZE + PUSHJ P,DPYBIG ;LET IT GO INTO VECTOR + PUSH P,B + FETCH(B,B,TXOFF) + MOVE A,D + PUSHJ P,CALCOL ;VECTOR TO IT + POP P,B + FETCH(B,B,TXVAL) + PUSHJ P,DTXT ;DISPLAY IT +BTXDSX: POP P,E + POP P,D + POP P,C + POP P,B ;GET B BACK + POPJ P, +>;MD + ;ALTER MODE DISPLAY +TXTDIS: TRZN MCHG + POPJ P, + MOVEI T,BLPG + PUSHJ P,HYDPOG + MOVEI T,MAINPG ;USE MAIN PAGE FOR ALTER STUFF + MOVEM T,PGLASS + PUSHJ P,DPYSET + MOVEI A,1 + LSH A,@MODE + TDNN A,[MD,<1BTALTM!1EDTAM!>1MALTM] + JRST NOANAM + MOVE B,REMMAC +MPC,< HRRZ B,1(B) > ;PC ONLY DOES MALTM +MD,< TDNN A,[1BTALTM!1EDTAM] + JRST [ HRRZ B,1(B) + MOVEI A,[ASCID/MACRO NAME: / + 0 ] + JRST DOANAM] + FETCH(B,B,TXNAM) + JUMPE B,NOANAM + MOVEI A,[ASCID/PROPERTY NAME: / + 0 ] +DOANAM: +>;MD + MOVEI T,0 + MOVEI TT,TITBIG + MOVE TTT,[%LEFT,,SCRTOP-CHGHT*TITBIG*3] + PUSHJ P,TITVCT + HRLI A,() +ANMLOP: ILDB T,A + TRNN T,1 + JRST ANMLP1 + PUSHJ P,TXTDPB + JRST ANMLOP + +ANMLP1: PUSHJ P,PLUNK +NOANAM: MOVEI T,0 + MOVEI TT,ACHRSZ + MOVE TTT,[AXPOS,,AYPOS] + PUSHJ P,TITVCT + MOVE B,TXTPNT + ADD B,[POINT 7,1] + SKIPG TT,ALTLIN ;GET TO CORRECT START LINE + JRST ALTLN1 +ALTLN2: TLNN B,760000 ;BYTE POINTER OUT? + JRST [ HRR B,-1(B) + TRNE B,-1 + JRST .+1 + JRST MAINOU] ;OUTPUT BLANK SCREEN + ILDB T,B + CAME T,EOLCHR + JRST ALTLN2 + SOJG TT,ALTLN2 +ALTLN1: PUSHJ P,ALTTXT ;PUT OUT OUR TEXT + JRST MAINOU + ;ORIENTATION TABLES AND ROUTINES +;ORIENT - ROTATE OFFSET FROM ORIGIN IN T +; F = BORI +; T = X,,Y + +ORIENT: TRNE F,777770 ;REASONABLE INDEX? + PUSHJ P,FUCKUP ;NO! + XCT (F)XTB1 + XCT (F)XTB2 + XCT (F)XTB3 + TDZ T,[1,,1] ;CLEAR OVERFLOW BITS + POPJ P, + +;XCT TABLE FOR 8 STATE ROTATION +;EACH STATE GOES COUNTER CLOCKWISE 90 DEGREES +;UNTIL 4 WHICH IS X,-Y ROTATED + +XTB1: TLZ T,1 ;X,Y + TRC T,-2 ;-Y,X + TDCA T,[-2,,-2] ;-X,-Y + MOVS T,T ;Y,-X +MD,< + TRCA T,-2 ;X,-Y + MOVS T,T ;Y,X + TLCA T,-2 ;-X,Y + MOVS T,T ;-Y,-X +>;MD + +XTB2: CAIA + ADDI T,2 + 0 + TRC T,-2 +MD,< + 0 + CAIA + 0 + TDC T,[-2,,-2] +>;MD + +XTB3: 0 + MOVS T,T + ADD T,[2,,2] + ADDI T,2 +MD,< + ADDI T,2 + 0 + ADD T,[2,,0] + ADD T,[2,,2] +>;MD + +;TABLE TO UNROTATE USING ORIENT AND CURRENT ROTATION +UNROT: 0 + 3 + 2 + 1 +MD,< 4 + 5 + 6 + 7 +>;MD + + ;ROTATE PIN POSITION BY ORIENTATION +;T = PIN POS +;TTT = ORIENTATION + +MD,< +PINORI: PUSH P,T +IFN =35-POSB, + ANDI T,(1POSW)-1 + TRNE TTT,777770 + PUSHJ P,FUCKUP + XCT XPTB1(TTT) + TRZ T,-(1POSW) ;CLEAR ANY OVERFLOW + TRNE TTT,4 ;GREATER THAN OR EQUAL TO 4? + HRR T,XPTB2(T) ;YES, PERFORM MAPPING + DPB T,[POINT POSW,(P),POSB] + POP P,T + POPJ P, + + +XPTB1: JFCL + ADDI T,2 + ADDI T,4 + ADDI T,6 + JFCL + SUBI T,2 + SUBI T,4 + SUBI T,6 + +XPTB2: 6 + 5 + 4 + 3 + 2 + 1 + 0 + 7 +>;MD + ;CARD SUBRS +MPC,< +FNGBAR: SKIPE A,PONPNT + PUSHJ P,CRDFNG + TRNE M,XFINGER + POPJ P, + HRRZ A,BARLST + JUMPE A,CPOPJ +CRDFN2: MOVE B,1(A) + HRRZ A,(A) + JUMPE A,CRDDON + MOVE C,1(A) + PUSHJ P,FAKE ;FAKE BOX FOR FINGER +NFAKE: HRRZ A,(A) + JUMPN A,CRDFN2 + POPJ P, + +CRDFNG: FETCHL(C,A,PBIT) + TLNN C,CPIN ;IS IT A CONNECTOR PIN? + JRST CRDFN1 ;NO, GET NEXT + TRNE M,XFINGER ;SKIPING WHOLE FINGER? + JRST [ TRNE M,XFEED ;THESE ALSO? + JRST CRDFN1 ;YES, DO NOTHING + FETCH(T,A,PXY) + PUSHJ P,SMLAIV + MOVEI T,"O"+"O"+1 + PUSHJ P,TXTDPB + JRST CRDFN1] + FETCH(C,A,PLOC) + MOVE C,1(C) + FETCH(B,A,PXY) + PUSHJ P,FAKE ;FAKE UP THE BOX! +CRDFN1: HRRZ A,(A) + JUMPN A,CRDFNG + POPJ P, + +FAKE: MOVE T,B + ADJUST(SUB,T,C) ;DELTA X,Y + MOVEI E,0 + MOVEI F,2 + TLNE T,400000 + MOVEI E,1 + TRNE T,400000 + MOVEI F,3 + HLRE TT,T + MOVMS TT + HRRES T + MOVMS T + CAML TT,T + MOVE F,E + JRST @(F)[ FRIGHT + FLEFT + FUP + FDOWN] + +DEFINE XY(X,Y) +< RADIX =10 + ADD T,[XWD /5*2,/5*2] + TDZ T,[(1)1] + RADIX =8 +> +FRIGHT: MOVE T,C + XY -FWIDTH,FWIDTH + PUSHJ P,AIVECT + MOVE T,C + XY -FWIDTH,-FWIDTH + PUSHJ P,AVECT + MOVE T,B + XY FWIDTH,-FWIDTH + PUSHJ P,AVECT + MOVE T,B + XY FWIDTH,FWIDTH + PUSHJ P,AVECT + MOVE T,C + XY -FWIDTH,FWIDTH + JRST AVECT +FLEFT: MOVE T,B + XY -FWIDTH,FWIDTH + PUSHJ P,AIVECT + MOVE T,B + XY -FWIDTH,-FWIDTH + PUSHJ P,AVECT + MOVE T,C + XY FWIDTH,-FWIDTH + PUSHJ P,AVECT + MOVE T,C + XY FWIDTH,FWIDTH + PUSHJ P,AVECT + MOVE T,B + XY -FWIDTH,FWIDTH + JRST AVECT +FUP: MOVE T,C + XY -FWIDTH,-FWIDTH + PUSHJ P,AIVECT + MOVE T,C + XY FWIDTH,-FWIDTH + PUSHJ P,AVECT + MOVE T,B + XY FWIDTH,FWIDTH + PUSHJ P,AVECT + MOVE T,B + XY -FWIDTH,FWIDTH + PUSHJ P,AVECT + MOVE T,C + XY -FWIDTH,-FWIDTH + JRST AVECT +FDOWN: MOVE T,B + XY -FWIDTH,-FWIDTH + PUSHJ P,AIVECT + MOVE T,B + XY FWIDTH,-FWIDTH + PUSHJ P,AVECT + MOVE T,C + XY FWIDTH,FWIDTH + PUSHJ P,AVECT + MOVE T,C + XY -FWIDTH,FWIDTH + PUSHJ P,AVECT + MOVE T,B + XY -FWIDTH,-FWIDTH + JRST AVECT +>;MPC diff --git a/src/draw/edit.500 b/src/draw/edit.500 new file mode 100644 index 00000000..3d29ca9d --- /dev/null +++ b/src/draw/edit.500 @@ -0,0 +1,1481 @@ +;EDIT.FAI.62, 15-NOV-75 18:04:18, EDIT BY HELLIWELL +VERSION(EDIT,6) +;ENTER EDIT MODE, SETDIP +MD,< +ENTEPN: PUSHJ P,GETCLS + JRST PERRET + FETCH(A,A,BTYP) + JRST ALREAD ;SKIP "TYPE BODY NAME" + +ENTEDC: MOVEI T,[ASCIZ/TYPE BODY NAME +/] + PUSHJ P,BODYGT ;GET POINTERS TO BODY STUFF + POPJ P, ;IF ALTMODE + POPJ P, ;NULL + CAIA ;NEW NAME + JRST ALREAD ;ALREADY EXISTS + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW BODY. Tell me the package=?/] + MOVEM B,BODNAM +BADPAK: PUSHJ P,TREADU + POPJ P, + JRST NULPAK + MOVE T,B + PUSHJ P,MATPAK + JRST [ PUSHJ P,PUTFS + OUTSTR [ASCIZ /I don't know that package??? +Package=?/] + JRST BADPAK] + PUSHJ P,PUTFS + SKIPA C,A +NULPAK: SETZ C, + PUSHJ P,MAKTYP ;CREATE NEW TYPE BLOCK + MOVE A,TT + STORE(C,A,TPAK) + MOVE B,BODNAM + STORE(B,A,TNAM) + MOVE TT,BODPNT + STORE(TT,A,TNXT) + MOVEM A,BODPNT ;ADD TO DEFINED TYPE LIST +ALREAD: FETCH(T,A,TLIB) + SKIPN MODLIB ;ALLOW MODIFICATION + JUMPN T,NOEDIT ;CAN'T EDIT FROM LIBRARY + MOVEM A,CURBOD ;SAVE POINTER TO CURRENT BODY + MOVE T,XOFF + MOVEM T,EDXOFF + MOVE TT,YOFF + MOVEM TT,EDYOFF + MOVE T,CURSE + MOVEM T,EDCURS + MOVE T,NSCALE + MOVEM T,EDSCAL + PUSHJ P,HOME ;CENTER EVERYTHING + MOVE T,MODE + MOVEM T,EDMODS + MOVEI T,MAINPG-1 ;CLEAR ALL THESE + PUSHJ P,HYDPOG + SOJG T,.-1 + TRO MCHG + MOVEI T,EDTM ;GET NEW MODE (EDIT) + JRST CHNGMD ;CHANGE MODE + +NOEDIT: OUTSTR[ASCIZ/I AM SORRY BUT YOU +CAN'T MODIFY LIBRARY BODIES! +/] + POPJ P, + +;CLEAR MARK BITS IN TYPE DEFINITION +CDFMRK: SKIPN T,BODPNT + POPJ P, +CDFMK1: FETCH(TTT,T,TYP1) ;ALL THE WAY IN? + JUMPE TTT,CDFMK2 + CLRBIT(DTMP1,TT,T,TBIT) +CDFMK2: FETCH(T,T,TNXT) + JUMPN T,CDFMK1 + POPJ P, + +;STUFF EITHER BODY DEF NAME OR DIP TYPE NAME INTO MACRO +STFLNM: MOVE A,CURBOD + JRST STTNAM + +STFLDP: MOVE A,CURBOD + JRST STTDIP + +SETDLC: SKIPA B,[TLZE C,XDISLOC] ;INST TO CLEAR "DON'T DISPLAY" BIT +CLRDLC: MOVE B,[TLON C,XDISLOC] ;INST TO SET " + MOVEI T,1 + LSH T,@MODE + TDNN T,[ALLEDM!1EDTAM] + JRST PERRET + MOVE A,CURBOD + FETCHL(C,A,TBIT) + XCT B ;TURN BIT ON OR OFF AND TEST + TLNN M,BLOCS ;CHANGED, ARE WE DISPLAYING A01 + CAIA ;NO + TRO MCHG ;YES + STOREL(C,A,TBIT) + POPJ P, + ;ENTER INSERT MODE (BOTH WAYS) +EDINS2: PUSHJ P,GETCLS + JRST PERRET + MOVEM A,CLSTPN + SETZM CRPPNT ;MAKE SURE WE DON'T ADD A POINT. + FETCH(A,A,QNXT) + TRZ ATLP!ATFP + MOVEI T,EDTIM + PUSHJ P,CHNGMD + JUMPN A,EDBS + TRO ATLP + JRST EDBS ;BACK UP TO THE RIGHT POINT + +EDINS: MOVEI T,EDTIM ;GET NEW MODE (EDIT INSERT) + PUSHJ P,CHNGMD + MOVE A,CURBOD ;GET CURRENT BODY POINTER + MOVEI B,RADDR(A,TLIN,QNXT) + MOVEM B,CLSTPN ;LAST PTR + FETCH(B,B,QNXT) ;GET POINTER TO FIRST LINE + MOVEM B,CRPPNT + TRO ATFP!TYPNEG!MCHG ;MARK AS AT FIRST POINT, AND MAKE FIRST VECTOR INVIS. + TRZ ATLP ;ASSUME NOT A LAST POINT YET! + JUMPN B,EDPOS ;VIRGIN LINE LIST? + PUSHJ P,EDROT ;YES, MAKE A FIRST POINT + STORE(T,A,QXY) + CLEAR(A,QNXT) + MOVE B,A + HRRM B,@CLSTPN ;LINK IN +EDPOS: SKIPN B,CRPPNT ;GET POINTER TO CURRENT POINT + POPJ P, ;NONE + PUSHJ P,CLEAR1 ;CLEAR THESE UNTIL DISP! + PUSHJ P,CLEAR2 + FETCH(T,B,QXY) + TRZE T,1 + TRO TYPNEG ;INVISIBLE + JRST SETPOS ;CENTER CURSOR THERE + +EDROT: MOVE T,CURSE ;GET CURRENT CURSOR POSITION + TRZE TYPNEG ; - LAST? + TRO T,1 ;YES + GETFS (A) + POPJ P, +EDROT1: TRZE ATFP ;TURN OFF AT-FIRST-POINT. ARE WE? + TRO T,1 ;YES, MAKE INVISIBLE + TRO MCHG + STORE(T,A,QXY) + MOVE B,CLSTPN ;GET POINTER TO CURRENT "LAST" (PRECEDING) POINT + FETCH(T,B,QNXT) ;GET LINK TO NEXT + STORE(T,A,QNXT) + STORE(A,B,QNXT) ;LINK LAST ONE TO THIS ONE + MOVEM A,CLSTPN ;MAKE THIS THE "LAST" ONE + MOVEM T,CRPPNT ;MAKE NEXT ONE CURRENT + FETCH(A,T,QXY) + TRZ A,1 + TRNE TYPNEG ;SHOULD THIS ONE BE NEGATIVE? + TRO A,1 + STORE(A,T,QXY) + POPJ P, + ;INSERT MODE, PLUS, MINUS, SPACE, BS +EDPLUS: PUSHJ P,EDROT + JRST EDROT1 + +EDMINS: PUSHJ P,EDROT + TRO TYPNEG ;MAKE NEXT ONE AN INVISIBLE VECTOR + JRST EDROT1 + +EDSPC: TRNN ATLP ;AT LAST POINT? + SKIPN B,CRPPNT ;GET POINTER TO CURRENT POINT + POPJ P, ;NONE + TRO MCHG + TRZ ATFP!TYPNEG + FETCH(T,B,QXY) + ANDI T,1 ;GET VISIBLE/INVISIBLE BIT + IOR T,CURSE ;PUT IN CURRENT POSITION + STORE(T,B,QXY) + FETCH(D,B,QNXT) ;GET POINTER TO NEXT POINT + HRRZM B,CLSTPN ;MAKE THIS POINT THE "LAST" POINT + MOVEM D,CRPPNT ;MAKE NEXT POINT THE CURRENT POINT + FETCH(D,D,QNXT) + JUMPN D,EDPOS + TRO ATLP ;AT LAST POINT NOW + JRST EDPOS ;POSITION CURSOR + +EDBS: TRNE ATFP ;AT FIRST POINT? + POPJ P, ;YES, DO NOTHING + TRO MCHG + TRZ ATLP!TYPNEG ;NO LONGER AT LAST POINT. + MOVE A,CURBOD ;NO, GET POINTER TO BODY + MOVEI B,RADDR(A,TLIN,QNXT) + MOVE C,B ;SAVE IT + MOVE D,B ;SAVE CURRENT ONE + FETCH(B,B,QNXT) + CAME B,CLSTPN ;ARE WE THERE? + JRST .-3 ;NO, LOOP + CAMN C,D ;NOW AT FIRST? + TRO ATFP!TYPNEG ;YES, SET BIT + EXCH D,CLSTPN ;MAKE NEW ONE "LAST" ONE + EXCH D,CRPPNT ;MAKE "LAST" ONE CURRENT ONE + JUMPE D,EDBSOU ;IF FORMER CURRENT ONE DIDN'T EXIST, LEAVE + FETCH(T,D,QXY) + ANDI T,1 ;GET VISIBLE/INVISIBLE BIT + IOR T,CURSE ;GET CURRENT POSITION + STORE(T,D,QXY) +EDBSOU: HRRZ D,CRPPNT + FETCH(D,D,QNXT) + JUMPN D,EDPOS + TRO ATLP + JRST EDPOS ;POSITION CURSOR + ;D, R+, R- +EDDELE: PUSHJ P,GETCLS + JRST PERRET + MOVE B,CURBOD + MOVEI B,RADDR(B,TLIN,QNXT) + MOVE C,B + FETCH(B,B,QNXT) + CAME B,A + JRST .-3 + FETCH(B,A,QNXT) + STORE(B,C,QNXT) + FSTRET (A) + TRO MCHG!NEEDCL + MOVE B,CURBOD + FETCH(B,B,TLIN) + JUMPE B,CPOPJ ;IF NO POINTS LEFT AT ALL, LEAVE + MOVEI T,1 + IORM T,ADDR(B,QXY) ;MAKE SURE FIRST POINT IS STILL INVIS + POPJ P, + +EDDEL: SKIPN B,CRPPNT ;GET POINTER TO CURRENT POINT + POPJ P, ;NONE + MOVE A,CLSTPN ;GET POINTER TO PRECEDING POINT + FETCH(D,B,QNXT) ;GET POINTER TO NEXT POINT + STORE(D,A,QNXT) ;REMOVE CURRENT POINT FROM CONSIDERATION + MOVEM D,CRPPNT ;.... + FSTRET (B) + TRO MCHG + JUMPE D,EDBS ;IF AT END, BACK UP + MOVEI T,1 + TRNE ATFP ;AT FIRST POINT? + IORM T,ADDR(D,QXY) ;YES, MAKE IT INVIS + JRST EDPOS + +EDCHNE: PUSHJ P,GETCLS + JRST PERRET + MOVE B,A + JRST EDCHN1 + +EDCHNG: HRRZ B,CRPPNT ;GET POINTER TO CURRENT POINT + JUMPE B,PERRET ;NONE? +EDCHN1: PUSHJ P,GETCHR ;GET CHAR + FETCH(D,B,QNXT) ;GET POINTER TO NEXT POINT + JUMPE D,CPOPJ ;NONE? + FETCH(T,D,QXY) + CAIN C,"+" ;WAS + TYPED? + JRST ITPLS ;YES + CAIE C,"-" ;WAS - TYPED? + JRST PERRET ;NO, ERROR +ITMNS: TROA T,1 ;MAKE INVISBLE +ITPLS: TRZ T,1 ;MAKE VISIBLE + STORE(T,D,QXY) + TRO MCHG + POPJ P, + ;P, N, EXIT EDIT MODE +EDPENT: MOVEI T,EDTPM + JRST CHNGMD + +PNUMS: PUSHJ P,GETCLS ;CURRENT PIN + JRST PERRET + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW PIN NAME?/] + FETCH(T,A,TPBIT) + ANDI T,BASSLH ;DEFAULT L/H TO OLD VALUE + PUSHJ P,PSET + JRST INNERR + STORE(T,A,TPNAM) + FETCH(T,A,TPBIT) + TRZ T,BASSLH + TRO T,(TT) + STORE(T,A,TPBIT) + TLNE M,PINIDS + TRO MCHG + POPJ P, + +SETORI: PUSHJ P,GETCLS + JRST PERRET +STORI1: TLNE M,DSKACT!MACACT + JRST STORI2 + OUTSTR[ASCIZ/CURRENT PIN POSITION IS /] + FETCH(T,A,TPPOS) + LDB T,[POINT POSW,T,POSB] + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +NEW PIN POSITION # (0-7)?/] +STORI2: PUSHJ P,READN + CAIE C,12 ;END WITH CR? + JRST [ CAIE C,"?" + JRST INNERR + PUSHJ P,GETLIN + CAIE C,12 + JRST INNERR + TVOFF + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +0 UP AND RIGHT 1 UP +2 UP AND LEFT 3 LEFT +4 DOWN AND LEFT 5 DOWN +6 DOWN AND RIGHT 7 RIGHT +/] + TVON + JRST STORI1] + CAILE T,(1POSW)-1 ;LEGAL? + JRST INNERR + SETZ TT, ;CLEAR X,Y OFFSETS + DPB T,[POINT POSW,TT,POSB] ;STORE HERE + STORE(TT,A,TPPOS) + TRO MCHG + POPJ P, + + ;XYPOFF - SET PIN OFFSET +;UNITS ARE 1 CURSOR STEP + +XYPOFF: PUSHJ P,GETCLS + JRST PERRET + TLNE M,DSKACT!MACACT + JRST XYPOF1 + OUTSTR[ASCIZ/CURRENT X,Y PIN OFFSET IS /] + FETCH(T,A,TPPOS) + LDB T,[POINT XOFFW,T,XOFFB] + TRNE T,1(XOFFW-1) + ORCMI T,(1XOFFW)-1 + PUSHJ P,DECOUT + OUTCHR[","] + FETCH(T,A,TPPOS) + LDB T,[POINT YOFFW,T,YOFFB] + TRNE T,1(YOFFW-1) + ORCMI T,(1YOFFW)-1 + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +NEW X,Y PIN OFFSET?/] +XYPOF1: PUSHJ P,SREADN + CAIGE T,1(XOFFW-1) + CAMGE T,[-<1(XOFFW-1)>] + JRST INNERR + HRLM T,(P) ;SAVE X + SETZ T, + CAIN C,"," + PUSHJ P,SREADN + CAIGE T,1(YOFFW-1) + CAMGE T,[-<1(YOFFW-1)>] + JRST INNERR + CAIE C,12 + JRST INNERR ;LOSE + FETCH(TT,A,TPPOS) + DPB T,[POINT YOFFW,TT,YOFFB] + HLRE T,(P) + DPB T,[POINT XOFFW,TT,XOFFB] + STORE(TT,A,TPPOS) + TLNE M,PINIDS ;IF SHOWING DEFAULT PINS + TRO MCHG ;THEN REDRAW SCREEN + POPJ P, + +STOBPN: PUSHJ P,GETCLS + JRST PERRET + MOVE T,A ;BODY PIN + PUSHJ P,SETTT + PUSH P,A + PUSHJ P,OUTPID + POP P,A + JRST ITSTUF + +EDALT: TRO MCHG + MOVEI T,EDTM + JRST CHNGMD + + ;EDITE - EXIT BODY EDIT MODE +EDITE: MOVE A,CURBOD + FETCH(A,A,TPIN) + JRST EDITE4 + +EDITE5: PUSH P,A + PUSHJ P,PSPRED ;SPREAD PIN NAMES OVER SAME PIN#S + POP P,A + FETCH(A,A,TPNX) +EDITE4: JUMPN A,EDITE5 + MOVE T,EDMODS ;GET OLD MODE BACK + PUSHJ P,CHNGMD ;CHANGE NOW IN CASE IN EDIT INSERT MODE + MOVE T,EDXOFF + MOVEM T,XOFF + MOVE T,EDYOFF + MOVEM T,YOFF + MOVE T,EDSCALE + MOVEM T,NSCALE + TRO MCHG + MOVE T,EDCURS ;BACK TO WHERE EVER + JRST CHANGE + +EDITP: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /PIN NAME?/] + SETZ T, + PUSHJ P,PSET + JRST INNERR + TRO MCHG!NEEDCL + PUSH P,TT + PUSHJ P,PUTPIN ;MAKE PIN EVERYWHERE + POP P,TT + FETCH(T,A,TPBIT) + TRO T,(TT) + STORE(T,A,TPBIT) + MOVE G,A + JRST FIXPUT ;CALC INITIAL PIN OFFSET + + ;PSET - GET PIN NAME AND L/H +;T = DEFAULT L/H BIT, BUSSED +;RETURNS +;T = PIN NAME +;TT = NEW BITS + +PSET: HRLM T,(P) + MOVE T,[PUSHJ P,GETLCH] + MOVEM T,GTCHRX + PUSHJ P,RPNAM ;GET PIN NAME INTO T + POPJ P, + JUMPE T,CPOPJ ;DEFAULT PIN = 0 IS ILLEGAL + HLRZ TT,(P) +DEC,< CAIE C,"-" ;ASSERTION AFTER PIN NAME? + JRST NOASS + TRZ TT,ASSL!ASSH + PUSHJ P,GETLIN + CAIE C,"H"+40 + CAIN C,"H" + JRST [ TRO TT,ASSH + JRST NOASS1] + CAIE C,"L" + CAIN C,"L"+40 + CAIA + JRST NOASS + TRO TT,ASSL +NOASS1: PUSHJ P,GETLIN +NOASS: +>;DEC + CAIE C,"/" + JRST NOBUSS + TRZ TT,BUSSED + PUSHJ P,GETLIN + CAIE C,"B" + CAIN C,"B"+40 + CAIA + JRST NOBUSS + TRO TT,BUSSED + PUSHJ P,GETLIN +NOBUSS: CAIN C,12 + AOS (P) + POPJ P, + ;SPREAD PIN #'S OVER SAME PIN ID'S +;A = PIN +;CURBOD = TYPE + +PSPRED: FETCH(A,A,TPNAM) + SKIPN B,DBODPN + POPJ P, + PUSH P,A ;SAVE PIN NAME +PSPRD1: MOVE A,CURBOD + PUSHJ P,BODFNN + JRST PSPRD2 + POP P,(P) + POPJ P, + +PSPRD2: FETCH(A,B,BLNK) + SETZ F, +PSPRD3: FETCH(T,A,BPLOC) ;PIN IN TYPE FROM BPOINT + FETCH(TT,T,TPNAM) + CAME TT,(P) ;SAME DEFAULT PIN NAME? + JRST PSPRD4 + MOVE F,A ;PIN CORRESPONDING TO DEFAULT NAME + FETCHL(TT,T,TPBIT) + TLNN TT,BUSSED ;IS IT BUSSED? + JRST PSPRD5 +PSPRD4: FETCH(A,A,BPLNK) ;YES, TRY TO FIND UNBUSSED PIN + JUMPN A,PSPRD3 + JUMPE F,PSPRD1 ;NOT ON THIS BODY? +PSPRD5: FETCH(F,F,BPPN) ;PIN# + FETCH(A,B,BLNK) +PSPRD6: FETCH(TTT,A,BPLOC) ;PIN IN DEF + FETCH(T,TTT,TPNAM) ;DEF PIN# + CAMN T,(P) + STORE(F,A,BPPN) + FETCH(A,A,BPLNK) + JUMPN A,PSPRD6 + JRST PSPRD1 + ;PUTPIN - PLACE A PIN +;CURBOD = TYPE TO ADD PIN TO +;CURSE = X,Y LOC FOR PIN +;T = PIN NAME +;RETURNS +;A = PIN + +PUTPIN: MOVE A,CURBOD ;GET POINTER TO CURRENT TYPE + PUSHJ P,MAKTPN ;GET NEW TYPE PINLOC BLOCK + MOVE B,TT + PUSH P,B + FETCH(D,A,TPIN) ;PIN LIST FROM BODY + STORE(D,B,TPNXT) ;LINK OUT FROM NEW PIN + STORE(B,A,TPIN) ;LINK IN NEW ONTO TYPE + STORE(T,B,TPNAM) ;PIN NAME + ;FIND LARGEST PINID IN THIS TYPE, OR ELSE UNUSED PID + MOVEI TT,1 ;START AT 1 + MOVEI C,1 ;FOR LARGEST ALSO +PTPIN1: FETCH(T,B,TPNXT) + JUMPE T,PTPIN3 +PTPIN2: FETCH(TTT,T,TPID) + CAML TTT,C + MOVEI C,1(TTT) ;1 MORE THAN LARGEST PID + CAMN TTT,TT + AOJA TT,PTPIN1 ;USED, LOOK FOR ANOTHER + FETCH(T,T,TPNXT) + JUMPN T,PTPIN2 +PTPIN3: +NIL,< CAIG C,777777 ;IS THERE A PIN# 777777 ? + MOVE TT,C ; NO, PICK PINID BIGGER THAN ALL OTHERS + ;FOR NOW, JUST REUSE PINIDS +>;NIL + STORE(TT,B,TPID) + MOVE T,CURSE ;GET CURRENT POSITION + STORE(T,B,TPXY) ;DEPOSIT AS POSITION OF PIN + + ;NOW ADD PIN TO ALL BODY INSTANCES + + MOVE C,B ;HOLD POINTER TO PIN ENTRY IN TYPE + MOVE B,DBODPN ;GET POINTER TO BODIES +BFRT: PUSHJ P,BODFN ;FIND INSTANCES OF THIS TYPE + JRST BFNDD ;FOUND ONE + POP P,A ;RETURN POINTER TO TYPE PINLOC BLOCK IN A + POPJ P, ;NONE LEFT + +BFNDD: PUSH P,A ;SAVE TYPE + FETCH(F,B,BORI) ;ORIENTATION + FETCH(T,C,TPXY) ;GET PIN X,Y + PUSHJ P,ORIENT ;ROTATE IT + ADJUST(ADD,T,) ;ADD BODY CENTER + PUSH P,T + MOVE A,C ;GET POINTER TO NEW TYPIN ENTRY IN TYPE + HRLI B,ISPIN ;PUT BITS IN WITH BODY POINTER + PUSHJ P,PUTPNT ;CREATE THE POINT + POP P,T + STORE(T,D,BPXY) ;SET X,Y + FETCH(E,B,BLNK) ;GET PIN LINK + STORE(E,D,BPLNK) ;OLD PIN LINK ONTO NEW POINT + STORE(D,B,BLNK) ;NEW PIN + FETCH(B,B,BNXT) + FETCH(TT,A,TPNAM) ;DEFAULT NAME FROM TYPE PIN BLOCK + POP P,A ;TYPE + + ;SCAN OTHER PINS OF BODY, LOOKING FOR ONES WITH SAME DEFAULT PIN NAME?? + +BFNDD1: JUMPE E,BFRT + FETCH(T,E,BPLOC) ;TYPE PINLOC BLOCK + FETCH(T,T,TPNAM) ;DEFAULT NAME + CAMN T,TT ;SAME AS NEW PIN? + JRST BFNND2 + FETCH(E,E,BPLNK) + JRST BFNDD1 + +BFNND2: FETCH(T,E,BPPN) ;ASSIGNED PIN NAME + STORE(T,D,BPPN) ;ASSIGN ON NEW PIN + JRST BFRT + + ;BODFN - FIND BODIES OF A CERTAIN TYPE + +BODFNA: FETCH(T,B,BTYP) ;GET TYPE POINTER + CAMN T,A ;BODY OF THIS TYPE? + POPJ P, ;YES, RETURN IT +BODFNN: FETCH(B,B,BNXT) ;GET NEXT +BODFN: JUMPN B,BODFNA + AOS (P) ;FAIL + POPJ P, + + ;UPDATE LOC OFFSET + +UPLOFF: MOVE A,CURBOD + MOVEI B,DBODPN +UPLOF2: PUSHJ P,BODFNN + JRST UPLOF1 + POPJ P, + +UPLOF1: FETCH(F,B,BORI) + FETCHL(T,B,BBIT) + TLNN T,FIXLOC!FIXBLO ;DOES IT WANT TO BE FIXED? + JRST UPLOF2 + FETCH(TTT,B,BLOC) + JUMPE TTT,UPLOF2 ;ANY LOCATION? + TLNN T,FIXLOC ;FIXING LOC? + JRST UPLOF3 + FETCH(T,A,TXY) ;DEFAULT LOC OFFSET + PUSHJ P,ORIENT + STORE(T,B,BLXY) +UPLOF3: MOVE T,B + PUSH P,A + PUSH P,B + PUSHJ P,OFFBLO ;ADJUST LOC CHAR OFFSET + POP P,B + POP P,A + JRST UPLOF2 + +ELCCLR: TRZ INMOV + MOVE A,CURBOD + FETCH(B,A,TYP3) + JUMPE B,CPOPJ + CLEAR(A,TYP3) + TLNE M,BLOCS + TRO MCHG + POPJ P, + ;DELETE PIN ON THE TYPE DEFINITION +EDPDEL: PUSHJ P,GETCLS ;GET POINTER TO CLOSEST PIN + JRST PERRET + MOVE C,A + MOVE A,CURBOD ;GET POINTER TO CURRENT TYPE + MOVEI D,RADDR(A,TPIN,TPNX) + ;LET THE POINTER LOSE FIRST TIME +EDPDL2: CAMN D,C ;IS THIS THE ONE THAT POINTS TO THE CLOSEST ONE? + JRST EDPDL1 ;YES + MOVE B,D ;NO, TRY ANOTHER + FETCH(D,D,TPNX) + JUMPN D,EDPDL2 + PUSHJ P,FUCKUP +EDPDL1: FETCH(D,C,TPNX) ;LINK OUT CLOSEST POINT + STORE(D,B,TPNX) + MOVEI B,PONPNT ;GET ON-SCREEN POINTER + PUSHJ P,TPINFN ;FIND INSTANCES OF THIS PIN IN THE WORLD AND REMOVE THEM + RETBLK(C,TYPIN) + TRO MCHG!NEEDCL + TRZ INMOV + POPJ P, + +;DELETE ALL POINTS THAT ARE INSTANCES OF PIN IN TYPE +;B = POINT LIST +;C = PIN IN DEF + +TPNFN1: FETCHL(F,B,PBIT) + TLNN F,ISPIN + JRST TPINFN + FETCH(F,B,BPLOC) + CAMN F,C ;SAME AS PIN WE ARE DELETING? + PUSHJ P,DELPIN +TPINFN: MOVE A,B ;SAVE LAST + FETCH(B,B,PNXT) + JUMPN B,TPNFN1 + POPJ P, + +;DELPIN - DELETE A PIN +;B = BPOINT +;A = LAST PTR TO PREVIOUS POINT +;RETURNS LAST PTR IN B + +DELPIN: PUSH P,C ;SAVE OLD PIN BLOCK POINTER + FETCH(C,B,BBODY) + MOVEI C,RADDR(C,BLNK,BPLNK) +GOPN: CAME C,B ;IS THIS THE POINT IN QUESTION + JRST GOPN1 ;NO + FETCH(D,C,BPLNK) + STORE(D,E,BPLNK) + TRO TFLG ;DELETE PINS OK! + PUSH P,A ;LAST POINTER + PUSHJ P,DELPNT + POP P,B ;RESTORE LAST AS CURRENT + JRST NTPNFN + +GOPN1: MOVE E,C + FETCH(C,C,BPLNK) + JUMPN C,GOPN + PUSHJ P,FUCKUP +NTPNFN: POP P,C ;RESTORE OLD PIN TYPE BLOCK POINTER + POPJ P, + ;GET -- G, SPACE +BODGET: MOVEI T,[ASCIZ/TYPE BODY NAME +/] + PUSHJ P,BODYGT ;GET BODY NAME & POINTER + POPJ P, ;ALTMODE + POPJ P, ;NULL NAME + JRST OOPS1 + CAMN A,CURBOD + JRST [ OUTSTR[ASCIZ/SORRY YOU CAN'T "GET" THE CURRENT BODY!!! +/] + POPJ P,] + MOVEM A,GETBOD ;CURRENT BODY WE ARE GETTING + SETZM GETORT ;START WITH STANDARD ORIENTATION + TRO MCHG + MOVEI T,EDTGM ;SET MODE + JRST CHNGMD + +GETSPC: AOS T,GETORT + ANDI T,7 + MOVEM T,GETORT + TRO MCHG + POPJ P, + ;GET -- Y +GETYES: PUSH P,CURSE + TRO MCHG + MOVE G,GETBOD ;NEW BODY + MOVE A,CURBOD ;CHECK FOR EMPTY BODY AND COPY NEW LOC + FETCH(T,A,TLIN) + JUMPN T,GETY1 ;IF LINES, NO COPY + FETCH(T,A,TPROP) + JUMPN T,GETY1 ;IF PROPS, NO COPY + FETCH(T,A,TPIN) + JUMPN T,GETY1 ;IF PINS, NO COPY + FETCH(T,A,TXY) + JUMPE T,GETY1 ;IF LOC OFFSET, NO COPY + FETCH(T,A,TYP3) + JUMPN T,GETY1 ;IF LOC CHAR OFFSET, NO COPY + FETCH(TTT,G,TXY) ;COPY LOC OFFSET + ADJUST(ADD,TTT,<(P)>) ;ADD CURSOR POS + STORE(TTT,A,TXY) + FETCH(TT,G,TYP3) + JUMPE TT,GETY1 ;ANY CHAR OFFSET TO COPY? + FETCH(TT,G,TOXY) + STORE(TT,A,TOXY) +GETY1: FETCH(G,G,TPIN) ;ANY PINS TO COPY ? + JUMPE G,GNOPINS ;NONE +NEWPINS:FETCH(T,G,TPXY) + MOVE F,GETORT + PUSHJ P,ORIENT ;ORIENT IT + ADJUST(ADD,T,<(P)>) ;ADD OFFSET + MOVEM T,CURSE ;PUTPIN WILL LOOK HERE + FETCH(T,G,TPNAM) ;COPY DEFAULT PIN NUMBER + PUSHJ P,PUTPIN ;MAKE A PIN + FETCH(T,G,TPPOS) + MOVE TTT,F + PUSHJ P,PINORI ;ROTATE PIN POS + STORE(T,A,TPPOS) ;COPY PIN POS + FETCH(T,G,TPBIT) + STORE(T,A,TPBIT) ;COPY BITS TOO + FETCH(G,G,TPNX) + JUMPN G,NEWPINS ;ANOTHER? + ;GET - COPY LINES +;FALLS THRU +GNOPINS:MOVE A,CURBOD ;CURRENT BODY + MOVEI A,RADDR(A,TLIN,QNXT) +LOOPLN: FETCH(B,A,QNXT) ;GET END OF LINE LIST + JUMPE B,LOOPL1 + MOVE A,B + JRST LOOPLN ;FOLLOW CHAIN + +LOOPL1: MOVE G,GETBOD ;NEW BODY + FETCH(G,G,TLIN) + JRST NXTLIN ;JUMP INTO LOOP + +GMAKLN: GETFS(TT) ;GET FREE STORAGE BLOCK FOR NEW LINE + STORE(TT,A,QNXT) ;LINK ONTO LIST + MOVE A,TT ;NEW END + FETCH(T,G,QXY) ;NEW LINE END + LDB TT,[POINT 1,T,35] ;SAVE VIS OR INVIS + TRZ T,1 + MOVE F,GETORT + PUSHJ P,ORIENT + ADJUST(ADD,T,<(P)>) ;OFFSET IT + DPB TT,[POINT 1,T,35] ;PUT BACK VIS OR INVIS + STORE(T,A,QXY) + FETCH(G,G,QNXT) +NXTLIN: JUMPN G,GMAKLN + CLEAR(A,QNXT) ;TERMINATE LIST +;GET TEXT + MOVE H,CURBOD ;CURRENT BODY + MOVE G,GETBOD ;NEW BODY + FETCH(G,G,TPROP) ;COPY BODY TEXT ? + JUMPE G,GETDON ; NONE +GBTEXT: FETCH(T,G,TXNAM) + JUMPE T,NPROP2 ;ALWAYS COPY IF JUST TEXT + FETCH(TTT,H,TPROP) + JUMPE TTT,NPROP2 ;COPY IF NO PROPERTIES YET + MOVE A,H + PUSHJ P,FPROPX + JRST NPROP2 ;DOESN'T EXIST, COPY + JRST NPROP1 ;EXISTS, DON'T COPY + +NPROP2: PUSHJ P,MAKTXT + MOVE B,TT ;NEW PROP BLOCK + MOVE A,G ;OLD PROP BLOCK + PUSHJ P,CPYPRP ;CARRY OVER OLD PROP + FETCH(T,G,TXXY) + MOVE F,GETORT + PUSHJ P,ORIENT ;ORIENT IT + ADJUST(ADD,T,<(P)>) ;OFFSET IT + STORE(T,B,TXXY) + MOVE A,H ;TYPE + PUSHJ P,ADDPRT ;ADD PROP, COMPILE, ALSO ADD INDIRECTS TO BODIES +NPROP1: HRRZ G,(G) ;NEXT NEW BTEXT + JUMPN G,GBTEXT +GETDON: POP P,CURSE ;RESTORE CURSOR POS +GETALT: TRO MCHG + MOVEI T,EDTM ;BACK TO EDIT MODE + JRST CHNGMD + ;CALC PIN LOC'S AND THUS OFFSET #'S +;FIX ALL BODIES +FIXALL: SKIPN H,BODPNT + POPJ P, +FIXAL1: FETCH(T,H,TLIB) ;LIBRARY POINTER + SKIPN MODLIB ;ALLOW MODIFICATION? + SKIPN T ;SKIP THESE, CAN'T FIX THEM + PUSHJ P,FIXSOM + FETCH(H,H,TNXT) + JUMPN H,FIXAL1 + POPJ P, + +;FIX ALL PIN #'S OF THIS BODY +PALL: MOVE H,CURBOD +;CALL WITH BODY DEF POINTER IN H +FIXSOM: FETCH(G,H,TYP1) + JUMPE G,CPOPJ ;QUIT IF BODY NOT IN YET!!! + FETCH(G,H,TPIN) + JUMPE G,CPOPJ + PUSHJ P,CALSET +FIXSM1: PUSHJ P,CALFIX + FETCH(G,G,TPNX) + JUMPN G,FIXSM1 + POPJ P, + +;FIX PIN # OFFSET FOR CLOSEST PIN +FIXONE: PUSHJ P,GETCLS + JRST PERRET + MOVE G,A +FIXPUT: MOVE H,CURBOD + PUSHJ P,CALSET ;SET UP PIN CENTERS +;FALL INTO CALFIX + +;H = body def pointer +;G = pin pointer +; and center of mass in DX1, DY1 +CALFIX: PUSHJ P,CALP ;FIND HIS NUMBER + SETZ T, ;CLEAR X,Y OFFSET FIRST + DPB E,[POINT POSW,T,POSB] + STORE(T,G,TPPOS) + TRO MCHG + POPJ P, + + +;CALP - best guess pin offset +;checks if pin is on a line of the definition, then returns L,R,U,D +; based upon pin's position with respect to body center +;H = BODY DEF POINTER +;G = PIN POINTER +;DX1 - AVERAGE OF ALL PIN X'S +;DY1 - " Y'S +;Returns +;F = Stub direction away from pin (only 1,3,5,7) +;E = Direction of pin name from pin + +;F Direction +;- -------------------- +;0 Up Right +;1 Up +;2 Up left +;3 Left +;4 Down left +;5 Down +;6 Down right +;7 Right + +; 2 1 0 +; 3 7 +; 4 5 6 + +CALP: FETCH(A,H,TLIN) ;ANY LINES ? + JUMPE A,CALPQ + PUSHJ P,CHKLIN + JRST CALPQ ;DESPERATION + JRST [ MOVE E,F  TRC E,4  JRST CALPA] ;MIDDLE LINE + PUSH P,F ;SAVE THIS DIR + PUSHJ P,CHKLI0 ;LOOK FOR ANOTHER + JRST [ POP P,F  MOVE E,F  JRST CALPA] + JFCL + POP P,E + JRST CALPA + +CALPQ: MOVEI F,1 ;TRY FOR HORIZONTAL STUB + MOVEI E,5 + +;The general case : have 2 lines from this pin, +; try to put the stub on the convex side, and also +; away from the center of mass + +CALPA: SKIPN HORVER(F) ;F IS HOR/VERT? + JRST [ EXCH E,F + SKIPN HORVER(F) ;NOW IS? + JRST OBLIQUE + JRST .+1] +;Direction F is hor/ver, check cases of other direction + SUB E,F + TRC E,4 ;PATCH + ANDI E,7 ;ANGLE BETWEEN LINES + JRST @(E)[CALHV0 + CALHV1 + CALHV2 + CALHV3 + CALHV4 + CALHV5 + CALHV6 + CALHV7] + +;Lines go in opposite directions, pick stub at right +;angles, away from center of mass +CALHV0: ADDI F,2  ANDI F,7 + MOVE E,F + PUSHJ P,CHKMASS + TRC F,4 ;OOPS, WAS TOWARDS C-MASS +;Pin is other way from stub if INSIDE, otherwise on one side +;or the other + MOVE E,F + TRC E,4 + SKIPN OUTSIDE + POPJ P, +TOSIDE: MOVEI T,1(F) + MOVEI TT,-1(F) + JRST BESTOF ;PICK PRETTIER SIDE + +CALHV1: ADDI F,2  ANDI F,7 + MOVE E,F + PUSHJ P,CHKMASS + TRC F,4 ;OOPS, WAS TOWARDS C-MASS + CAMN E,F ;STUB IS ON CONCAVE SIDE? + JRST TOSIDE ; NO, BEST CHOICE THEN + MOVEI E,1(F) ; YES, ONLY ONE CHOICE + ANDI E,7 + POPJ P, + +;Line meeting at 90 degrees, other 2 quadrants get pinname and stub +CALHV2: MOVEI E,2(F) + ANDI E,7 + MOVEI F,4(F) + ANDI F,7 + PUSHJ P,CHKMASS + EXCH E,F + POPJ P, + +;Very acute angle +CALHV3: TRC F,4 + MOVEI E,-2(F) + ANDI E,7 + POPJ P, + +;Both lines point the same way +; (this is also the case of a pin at the end of a single line) +CALHV4: TRC F,4 + MOVEI T,1(F) + MOVEI TT,-1(F) + JRST BESTOF + +;Very acute +CALHV5: TRC F,4 + MOVEI E,2(F) + ANDI E,7 + POPJ P, + +;Lines meeting at 90 degrees +CALHV6: MOVEI E,4(F) + ANDI E,7 + MOVEI F,6(F) + ANDI F,7 + PUSHJ P,CHKMASS + EXCH E,F + POPJ P, + +;Almost flat angle, try to put stub on convex side +CALHV7: MOVEI F,6(F) + ANDI F,7 + MOVE E,F + PUSHJ P,CHKMASS + TRC F,4 + CAMN E,F + JRST TOSIDE + MOVEI E,-1(F) + ANDI E,7 + POPJ P, + +;OBLIQUE cases, do best you can +OBLIQUE: + CAIN F,2 ;TRY TO GET 2 DIR IN F + JRST OBLIQ1 + EXCH F,E + CAIN F,2 + JRST OBLIQ1 + CAIN E,4 ;BUT IF CAN'T AT LEAST THE 4 + EXCH E,F +OBLIQ1: SUB E,F + TRC E,4 ;PATCH + ANDI E,7 ;ANGLE BETWEEN LINES + JRST @(E)[CALHQ0 + CALHQ1 + CALHQ2 + CALHQ3 + CALHQ4 + CALHQ5 + CALHQ6 + CALHQ7] + +;Lines are opposed to each other, make stub horizontal +CALHQ0: MOVEI F,7 + MOVEI E,3 + PUSHJ P,CHKMASS + EXCH E,F + POPJ P, + +;shouldn't happen +CALHQ1: +CALHQ3: +CALHQ5: +CALHQ7: PUSHJ P,FUCKUP + POPJ P, + +;Lines meeting at a Vee, stub goes away from tip +CALHQ2: MOVEI F,3(F) + ANDI F,7 + JRST TOSIDE + +;Two oblique lines overlapping each other +CALHQ4: MOVE E,F + TRC E,4 + CAIE F,2 + CAIN F,4 + JRST [ MOVEI F,7  POPJ P,] + MOVEI F,3 + POPJ P, + +;Lines meeting at other Vee +CALHQ6: MOVEI F,-3(F) + ANDI F,7 + JRST TOSIDE + +;Try to get pin position in upper right, as much +;as possible + +BESTOF: ANDI T,7 + ANDI TT,7 + MOVE E,T + SKIPLE BESDIR(E) + POPJ P, + MOVE E,TT + SKIPLE BESDIR(E) + POPJ P, + SKIPGE BESDIR(E) + MOVE E,T + POPJ P, + +BESDIR: 1 + 1 + 0 + -1 + -1 + -1 + 0 + 1 + +;CHKMASS - see if direction (F) from pin is away from +; the center of mass + +CHKMASS: + FETCH(T,G,TPX) + FETCH(TT,G,TPY) ;GOING ... + XCT (F)[CAML T,DX1 ; UP, RIGHT + CAML TT,DY1 ; UP + CAMG T,DX1 ; UP, LEFT + CAMG T,DX1 ; LEFT + CAMG T,DX1 ; DOWN, LEFT + CAMG TT,DY1 ; DOWN + CAML T,DX1 ; DOWN, RIGHT + CAML T,DX1] ; RIGHT + AOS (P) + POPJ P, + +; - vertical, + horizontal + +HORVER: 0 + -1 + 0 + 1 + 0 + -1 + 0 + 1 +;CHKLIN - see if pin is on a line of body definition +;A = list of body lines +;G = body pin +;RETURNS +; - fail, not on any line +; - On vert/horz line (not on ends) +; - On end of line +;F = direction of line from pin +;A = start of line +;(B = end of line) + +CHKLI0: FETCH(A,A,QNXT) ;CONTINUE SEARCH + JUMPE A,CPOPJ +CHKLIN: FETCH(B,A,QNXT) + JUMPE B,CPOPJ ;SINGLE POINT, NO LINE + FETCH(T,B,QXY) + TRNE T,1 ;LINE VISIBLE? + JRST CHKLI0 + XOR T,ADDR(A,QXY) + TLNE T,-2 ;IS THIS A VERT LINE? + JRST NVERT + TRNN T,-2 ;BUT NOT 0 LENGTH + JRST CHKLI0 +;Line is vertical, check if pin is on it + FETCH(T,G,TPXY) + XOR T,ADDR(A,QXY) + TLNE T,-2 ;AND POINT IS ON IT? + JRST CHKLI0 + MOVEI F,1 ;SAY "UP" + FETCH(T,A,QY) + FETCH(TT,B,QY) + FETCH(TTT,G,TPY) +;Pin is colinear with line, check direction and where on line +CHKHVR: CAMGE TT,T ;2nd point higher? + TRC F,4 ; NO, SAY "DOWN" + CAMN TTT,T + JRST CPOPJ2 ;AT END OF LINE + CAMN TTT,TT ;OR AT OTHER END + JRST [ TRC F,4  JRST CPOPJ2] + CAML T,TT + EXCH T,TT ;SMALLER COORD IN T + CAML TTT,T ;OFF BOTTOM? + CAMLE TTT,TT ;OR OFF TOP? + JRST CHKLI0 ; TRY ANOTHER + JRST CPOPJ1 ; RETURN "ON THE LINE" + +NVERT: TRNE T,-2 ;HORIZ LINE? + JRST NHORZ +;Line is horizontal, check if pin is on it. + FETCH(T,G,TPXY) + XOR T,ADDR(A,QXY) + TRNE T,-2 ;AND POINT IS ON IT? + JRST CHKLI0 + MOVEI F,7 ;SAY "RIGHT" + FETCH(T,A,QX) + FETCH(TT,B,QX) + FETCH(TTT,G,TPX) + JRST CHKHVR + +NHORZ: FETCH(T,A,QXY) + XOR T,ADDR(G,TPXY) ;PIN ON START OF THIS LINE? + TDNN T,[-2,,-2] + JRST [ PUSHJ P,CHKQUA  JRST CPOPJ2] + FETCH(T,B,QXY) + XOR T,ADDR(G,TPXY) ;PIN ON END? + TDNE T,[-2,,-2] + JRST CHKLI0 + EXCH A,B + PUSHJ P,CHKQUA ;DIRECTION OF LINE FROM POINT + EXCH A,B + JRST CPOPJ2 + +;CHKQUA - compute which direction the line (A) is leaving the point + +CHKQUA: FETCH(T,B,QX) + FETCH(TTT,G,TPX) + SUB T,TTT + FETCH(TT,B,QY) + FETCH(TTT,G,TPY) + SUB TT,TTT + JUMPE T,[ ;DEL-X = 0 + MOVEI F,1 ; UP + SKIPG TT + MOVEI F,5 ;DOWN + POPJ P,] + JUMPG T,[ ;DEL-X = + + MOVEI F,7 + JUMPE TT,CPOPJ + MOVEI F,0 + SKIPG TT + MOVEI F,6 + POPJ P,] + ;DEL-X IS - + MOVEI F,3 + JUMPE TT,CPOPJ + MOVEI F,2 + SKIPG TT + MOVEI F,4 + POPJ P, + + +ifn 0,< +;old calp +;CALP - best guess pin offset +;checks if pin is on a line of the definition, then returns L,R,U,D +; based upon pin's position with respect to body center +;H = BODY DEF POINTER +;G = PIN POINTER +;DX1 - AVERAGE OF ALL PIN X'S +;DY1 - " Y'S +;Returns (skip if pin was on a line) +;E = Stub direction away from pin +;F = Direction of pin name from pin + +;F Direction +;- -------------------- +;0 Up Right +;1 Up +;2 Up left +;3 Left +;4 Down left +;5 Down +;6 Down right +;7 Right + +CALP: FETCH(B,H,TLIN) + JUMPN B,CALP1 + POPJ P, + +CALP2: FETCH(T,B,QXY) + TRNE T,1 ;INVIS? + JRST CALP1 ;YES, TRY ANOTHER + XOR T,ADDR(A,QXY) ;OTHER END OF LINE + TLNE T,-2 ;VERT? + JRST NVERT ;NO + TRNN T,-2 ;ZERO LENGTH SEG? + JRST CALP1 ;YES, IGNORE IT + FETCH(T,G,TPXY) ;LINE IS VERT + XOR T,ADDR(A,QXY) + TLNE T,-2 ;PIN ON SAME LINE? + JRST CALP1 ;NO + FETCH(T,G,TPX) + HRRES T + CAMLE T,DX1 ;COMPARE WITH CENTER OF ALL PINS + SKIPA F,[3] ;RIGHT + MOVEI F,7 ;LEFT + FETCH(T,A,QY) + FETCH(TT,G,TPY) + FETCH(TTT,B,QY) + JRST DELCAL + +NVERT: TRNE T,-2 ;HORZ? + JRST CALP1 ;ZERO LENGTH + FETCH(T,G,TPXY) + XOR T,ADDR(A,QXY) + TRNE T,-2 ;Y'S SAME - PIN ON LINE? + JRST CALP1 ;NO + FETCH(T,G,TPY) + CAMLE T,DY1 + SKIPA F,[5] ;UP + MOVEI F,1 ;DOWN + FETCH(T,A,QX) + FETCH(TT,G,TPX) + FETCH(TTT,B,QX) +DELCAL: SUB T,TTT + SUB TT,TTT + JUMPG TT,NNEG + JUMPGE T,CALP1 ;OFF END? + CAML T,TT + JRST CALP1 + JRST CPOPJ1 + +NNEG: JUMPLE T,CALP1 + CAMLE T,TT + JRST CPOPJ1 +CALP1: MOVE A,B + FETCH(B,B,QNXT) + JUMPN B,CALP2 + POPJ P, ;LOSE RETURN +>;ifn 0, + + +;CALPIN - GET POS OF PIN (G) + +CALPIN: PUSH P,A + PUSH P,B + PUSH P,E + FETCH(H,G,BBODY) + FETCH(H,H,BTYP) + FETCH(G,G,BPLOC) + PUSHJ P,CALP + POP P,E + JRST POPBAJ + + ;CALSET - CALCULATE APPROX CENTER OF SET OF PINS +;H = BODY DEF POINTER +;RETURNS WITH: +;DX1 - (MAX+MIN)/2 OF ALL PIN X'S AND LINE ENDPOINT'S X'S +;DY1 - " Y'S +CALSET: HRLOI T,377777 + MOVEM T,DX3 + MOVEM T,DY3 + MOVSI T,400000 + MOVEM T,DX1 + MOVEM T,DY1 + FETCH(T,H,TPIN) ;FIRST CHECK EXISTING PINS + SKIPE T + PUSHJ P,CALST2 + FETCH(T,H,TLIN) ;NOW CHECK LINES + SKIPE T + PUSHJ P,CALST2 + MOVE T,DX1 + ADD T,DX3 + ASH T,-1 + MOVEM T,DX1 + MOVE T,DY1 + ADD T,DY3 + ASH T,-1 + MOVEM T,DY1 + POPJ P, + +CALST2: FETCH(TT,T,QX) + CAMGE TT,DX3 + MOVEM TT,DX3 + CAMLE TT,DX1 + MOVEM TT,DX1 + FETCH(TT,T,QY) + CAMGE TT,DY3 + MOVEM TT,DY3 + CAMLE TT,DY1 + MOVEM TT,DY1 +CALST1: FETCH(T,T,QNXT) + JUMPN T,CALST2 + POPJ P, + ;DELETE TYPE +TYPDEL: MOVEI T,1 + LSH T,@MODE + TDNE T,[ALLEDM!1EDTAM] ;ANY EDIT MODE? + JRST PERRET ;YES, ILLEGAL + MOVEI T,[ASCIZ/TYPE BODY NAME +/] + PUSHJ P,BODYGT + POPJ P, ;ALTMODE + POPJ P, ;NULL + JRST OOPS1 ;NO SUCH BODY + TLZ WFLAG ;DON'T QUIT IF YOU FIND ONE +TYPFLU: PUSH P,A ;SAVE TYPE POINTER + MOVEI A,DBODPN + JRST TYPDL1 +TYPDL2: FETCH(T,A,BTYP) + CAME T,(P) + JRST TYPDL1 + TLNE WFLAG + JRST [ POP P,A + POPJ P,] ;QUIT IF WFLAG SET (WE WANT IT!) + PUSH P,B + PUSHJ P,BDELETE ;DELETE BODY + POP P,A ;RESTORE LAST AS CURRENT +TYPDL1: MOVE B,A + FETCH(A,A,BNXT) + JUMPN A,TYPDL2 + SKIPE MODLIB + JRST TCLEAR + MOVE T,(P) + FETCH(T,T,TLIB) + JUMPE T,TCLEAR + OUTSTR[ASCIZ/ALL INSTANCES OF THIS BODY HAVE BEEN +DELETED, BUT THE TYPE MUST REMAIN +AS IT IS PART OF A LIBRARY! +/] + POP P,A + POPJ P, + +TCLEAR: MOVEI A,BODPNT-1 + JRST TYPDL6 + +TYPDL4: CAMN A,(P) + JRST TYPDL5 +TYPDL6: MOVE B,A + FETCH(A,A,TNXT) + JUMPN A,TYPDL4 + POP P,A + PUSHJ P,FUCKUP + POPJ P, ;SHOULDN'T HAPPEN. + +TYPDL5: FETCH(C,A,TNXT) + STORE(C,B,TNXT) ;LINK HIM OUT + POP P,A ;GET BACK POINTER + JRST TYPREL ;RELEASE STORAGE + ;DELETE LIBRARY +DELLBS: TLOA WFLAG ;SAVE USED ONES +DELLIB: TLZ WFLAG ;DON'T SAVE THEM + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/LIBRARY /] + MOVSI T,EXTLIB + PUSHJ P,SETNAM + POPJ P, ;IF HE HOLLER, LET HIM GO! + ENTPPN + MOVEI TT,LIBLST + MOVE A,FILNAM + HLLZ B,FILEXT + MOVE C,FILPPN + JRST LIBLP1 +LIBLP2: CAME A,1(TT) + JRST LIBLP1 + HLRZ TTT,(TT) + CAME C,1(TTT) + JRST LIBLP1 + HLLZ TTT,(TTT) + CAMN TTT,B + JRST FNDLIB +LIBLP1: MOVE T,TT + HRRZ TT,(TT) + JUMPN TT,LIBLP2 + OUTSTR[ASCIZ/SORRY, NO SUCH LIBRARY! +/] + POPJ P, + +FNDLIB: HRRZ TTT,(TT) + HRRM TTT,(T) ;LINK THIS LIBRARY OUT + PUSH P,TT ;SAVE POINTER + SKIPN A,BODPNT + JRST FNDLBE +FNDLB1: FETCH(B,A,TNXT) ;GET LINK AHEAD + FETCH(T,A,TLIB) + CAME T,(P) ;THIS ONE + JRST FNDLB2 ;NO + PUSH P,B + CLEAR(A,TLIB) ;CLEAR POINTER SO WE CAN DELETE + PUSHJ P,TYPFLU ;DELETE THIS TYPE + POP P,B +FNDLB2: MOVE A,B ;NEXT + JUMPN A,FNDLB1 +FNDLBE: POP P,A + HLRZ B,(A) + FSTRET(A) + FSTRET(B) + POPJ P, + ;RSPINI RESET PINIDS CANONICALLY FROM DEFAULT PIN NAMES + +RSPINI: MOVE T,MODE + CAIE T,EDTM ;MUST BE IN NORMAL EDIT MODE + JRST ERRET + OUTSTR [ASCIZ / +This little known command can royally screw any file using this body, + do you really wan't to reassign PINID's/] + PUSHJ P,YORN + POPJ P, + POPJ P, + ;CHECK IF TYPE IS IN USE + MOVE A,DBODPN + HRRZ C,CURBOD ;POINTER TO BODY DEFINITION +RSPIN2: FETCH(B,A,BTYP) + CAIN B,(C) + JRST RSPIN1 ;TYPE IS IN USE + FETCH(A,A,BNXT) + JUMPN A,RSPIN2 ;LOOP + FETCH(C,C,TPIN) + MOVE D,C ;SAVE IN D + ;RESET PIN ID'S FROM PIN NAMES + MOVEI B,100. ;GET LARGEST PIN NAME VALUE IN USE IN B +RSPIN3: FETCH(T,C,TPBIT) + TRNE T,BUSSED ;DON'T RESET BUSSED YET + JRST [ CLEAR(C,TPID) ;MARK, AND FIX LATER + JRST RSPIN5] + FETCH(T,C,TPNAM) + CAIGE B,(T) ;SKIP IF LE THAN BIGGEST SO FAR + MOVEI B,(T) ;NEW BIGGEST PIN NAME + STORE(T,C,TPID) ;SO COPY PIN NAME TO PIN ID +RSPIN5: FETCH(C,C,TPNX) + JUMPN C,RSPIN3 ;LOOP IF MORE PINS + ;BUSSED THRU PINS MUST HAVE DIFFERENT PINIDS, BUT PINID mod OLDMAX = PIN-NAME +RSPIN8: FETCH(T,D,TPBIT) + TRNN T,BUSSED ;BUSSED THROUGH PIN ? + JRST RSPIN9 + FETCH(TT,D,TPID) + JUMPN TT,RSPIN9 ;ONE WE'VE FIXED ALREADY + PUSH P,B + PUSH P,D ;SEE IF THERE IS AN IDENTICAL BUSSED BIN LATER + FETCH(T,D,TPNAM) + PUSH P,T +RSPINB: FETCH(TT,D,TPBIT) + FETCH(T,D,TPNAM) + CAMN T,(P) ;SKIP IF NOT SAME PIN NAME + TRNN TT,BUSSED + JRST RSPINC ;NOT BUSSED THROUGH OR NOT SAME PIN NAME + FETCH(T,D,TPNAM) + ADD T,B + STORE(T,D,TPID) + ADD B,-2(P) ;NEXT MULTIPLE OF 100. (OR MAX) +RSPINC: FETCH(D,D,TPNX) + JUMPN D,RSPINB +RSPINA: SUB P,[1,,1] + POP P,D + POP P,B +RSPIN9: HRRZ D,(D) ;NEXT PIN LIST BLOCK + JUMPN D,RSPIN8 ;LOOP IF MORE PINS + TRO MCHG ;ALL DONE + POPJ P, + +RSPIN1: OUTSTR [ASCIZ /CAN'T CHANGE PINIDS - BODY IN USE IN DRAWING +/] + POPJ P, + + +>;MD diff --git a/src/draw/find.501 b/src/draw/find.501 new file mode 100644 index 00000000..7a27f84d --- /dev/null +++ b/src/draw/find.501 @@ -0,0 +1,766 @@ +VERSION(FIND,1) +;TXTLST SETUP, FIND NEXT +;HERE WE DEFINE THE INDICES FOR WHAT TO FIND + +DEFINE %FBLST +< +%FBVAL(BNAM,BODY NAME) ;FIND BODY BY NAME (OR # OF PINS PC) +%FBVAL(BLOC,BODY LOCATION) ;FIND BODY BY LOC +%FBVAL(BDIP,DIP TYPE NAME) ;FIND BODY BY DIP NAME +%FBVAL(PLOC,CONNECTOR OR DIP PIN LOCATION) ;FIND POINT BY LOC (CPIN) +%FBVAL(PTXT,TEXT) ;FIND POINT BY TEXT +MD,< +%FBVAL(PSIG,SIGNAL NAME) ;FIND SIGNAL NAME +%FBVAL(LNAM,LIBRARY BODY NAME) ;FIND LIBRARY BODIES +%FBVAL(LDIP,LIBRARY BODY DIP TYPE NAME) ;FIND LIBRARY BODIES BY DIP TYPE +%FBVAL(LPIN,LIBRARY BODY DEFAULT PIN LOCATION) +%FBVAL(LTXT,LIBRARY BODY TEXT/PROP) +%FBVAL(LPRP,LIBRARY BODY PROPERTY NAME) +%FBVAL(BTXT,BODY TEXT) +%FBVAL(BPRP,BODY PROPERTY NAME) +>;MD +> + +;GENERATE INDICES +DEFINE %FBVAL $ (A,B) +< %F$A__%FBIND + %FBIND__%FBIND+1 +> + +%FBIND__0 +%FBLST + + +DEFINE %FBVAL $ (A,B) + + +FINDTB: + %FBLST + +DEFINE %FBVAL (A,B) +< [ASCIZ\B\] +> + +%PROMPT:%FBLST + +MD,< +FNLPN0: MOVEI T,1 + LSH T,@MODE + TDNN T,[1EDTPM] ;MUST BE IN CORRECT MODE BEFORE DISPATCHING THROUGH NORMAL ENTRY + JRST PERRET + JRST FNLPIN +>;MD + +FNDALL: MOVEI H,-FINDTB-1(H) ;GENERATE INDEX + TLNE M,DSKACT!MACACT + JRST NPRMPT + OUTSTR[ASCIZ/ +/] + OUTSTR @%PROMPT(H) + OUTSTR[ASCIZ/ SEARCH STRING?/] +NPRMPT: PUSHJ P,GETLIN + CAIN C,12 + JRST [ SKIPN @FSTRTB(H) ;HE WANTS OLD, IS THERE ONE? + JRST PERRET + JRST DOFND] + GETFS(B) + MOVE A,B + ADD A,[POINT 7,1] + SETZM (B) + SETZM 1(B) + MOVE D,C ;SAVE OTHER CHAR + MOVEI C,BELCHR ;GET BEGIN LINE CHAR + XCT DLMTAB(H) ;STUFF IN DELIMITER IF NEEDED + MOVE C,D +FNREAD: CAIN C,ALTMOD + JRST PUTFS ;ALTMODE, FLUSH STRING + PUSHJ P,FNPUT + PUSHJ P,GETLIN + CAIE C,12 + JRST FNREAD + MOVEI C,BELCHR + XCT DLMTAB(H) ;CHECK FOR ANOTHER + SETZ C, + PUSHJ P,FNPUT ;PUT ZERO AT END + EXCH B,@FSTRTB(H) ;REPLACE OLD WITH NEW + PUSHJ P,PUTFS ;GIVE BACK OLD STRING +DOFND: SETZM FIND + SKIPE E,@LSTTAB(H) + PUSHJ P,ADDLST +MPC,< SKIPE E,@LSTTB2(H) + PUSHJ P,ADDLST +>;MPC +FNDCNT: MOVE T,FIND + MOVEM T,FNDNUM ;STORE FOR MACRO CALL AT ;R + JUMPE T,PTFNDN + SETOM FIND + TLNE M,DSKACT!MACACT + POPJ P, + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ ITEMS FOUND! +/] + POPJ P, + +PTFNDN: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NO MATCHES FOUND! +/] + POPJ P, + +FNPUT: TLNE A,760000 + JRST FNPUT1 + GETFS(T) + HRRM T,-1(A) + HRR A,T + SETZM (T) + SETZM 1(T) +FNPUT1: IDPB C,A + POPJ P, + ;ADDLST SUBR +ADDLST: PUSH P,E + PUSHJ P,@ADDCLR(H) ;CLEAR BITS FIRST + POP P,E +ADDISP: JRST @ATHING(H) + +MD,< +ADPSIG: MOVE A,FPSSTR + ADD A,[POINT 7,1] + PUSHJ P,SIGMAA ;MAKE COMPARE STRING +ADPSG1: FETCH(A,E,PTXT) + JUMPE A,ADPSG2 + FETCH(A,A,TCSTR) + ADD A,[POINT 7,1] + MOVEI B,SIGTAB + PUSHJ P,SIGMAT + JRST ADPSG2 + JFCL + AOS FIND + SETBIT(FOUNDP,T,E,PBIT) +ADPSG2: FETCH(E,E,PNXT) + JUMPN E,ADPSG1 + POPJ P, +>;MD + +ADPTXT: FETCH(A,E,PTXT) + JUMPE A,ADTXTX + FETCH(A,A,TCSTR) + HRRZS (P) ;CLEAR THING TO RETURN +ADTXTT: MOVE T,@FSTRTB(H) ;SEARCH STRING + PUSHJ P,MATCHS + JRST ADTXTE ;NO MATCH + AOS FIND + SETBIT(FOUNDP,T,E,PBIT) +ADTXTE: HLRZ B,(P) + SKIPE B + PUSHJ P,PUTFS ;GIVE BACK TEMP STRING +ADTXTX: HRRZ E,(E) ;NEXT POINT OR BODY + JUMPN E,ADDISP ;GO BACK TO CORRECT ROUTINE + POPJ P, + +ADPLOC: PUSHJ P,SETTT7 ;SETUP TO MAKE STRING + HRLM A,(P) ;SAVE POINTER TO TEMP STRING + MOVE A,E ;POINT + PUSHJ P,STFPLC ;USE STUFF ROUTINE IN POINT + JRST ADTXTE ;GIVE BACK STRING AND LOOP + HLRZ A,(P) ;GET TEXT STRING + JRST ADTXTT ;DO COMPARE + +MD,< +ADBDIP: +ADBNAM: HRRZS (P) ;NOTHING TO GIVE BACK + CAIN H,%FBDIP + JRST [ HRRZ A,E + PUSHJ P,FNDDIP + JRST ADTXTE + FETCH(A,T,TXVAL) + JRST ADBNM0] + FETCH(A,E,BTYP) + FETCH(A,A,TNAM) +ADBNM0: +>;MD +MPC,< +ADBDIP: HRRZS (P) + FETCH(A,E,BNAM) + JUMPE A,ADTXTE ;IF ANY +>;MPC +ADBNM1: MOVE T,@FSTRTB(H) + PUSHJ P,MATCHS + JRST ADTXTE + SETBIT(FOUNDB,T,E,BBIT) + AOS FIND + JRST ADTXTE + +ADBLOC: PUSHJ P,SETTT7 + HRLM A,(P) +MD,< FETCH(D,E,BLOC) + JUMPE D,ADBNM1 + FETCH(A,E,BRSLOC) +>;MD +MPC,< FETCH(T,E,BLN) + JUMPE T,ADBNM1 + MOVE A,T +>;MPC + PUSHJ P,SLTLPN + HLRZ A,(P) + JRST ADBNM1 + +MPC,< +ADBNAM: FETCH(D,E,TNAM) + PUSHJ P,SETTT7 + HRLM A,(P) + PUSHJ P,STFNAM ;MAKE # OF PINS STRING (ALSO SEPERATION IF 2 PINS) + JRST ADBNM1 +>;MPC + +MD,< +ADLDIP: +ADLNAM: FETCH(T,E,TLIB) + JUMPN T,ADLNME ;SKIP LIBRARY BODIES SINCE THEY MAY NOT BE READ IN + CAIN H,%FLDIP + JRST [ MOVE A,E + MOVEI TT,[ASCIZ/DIPTYPE/] + PUSHJ P,ASCCOP + PUSH P,T + PUSHJ P,FPROP + JRST [ POP P,B + PUSHJ P,PUTFS + JRST ADLNME] + POP P,B + PUSHJ P,PUTFS + FETCH(A,T,TXVAL) + JRST ADLNM1] + FETCH(A,E,TNAM) ;GET BODY NAME +ADLNM1: JUMPE A,ADLNME ;UNLESS NONE + MOVE T,@FSTRTB(H) ;GET SEARCH STRING + PUSHJ P,MATCHS ;COMPARE + JRST ADLNME ;NO MATCH + SETBIT(FOUNDL,T,E,TBIT) + AOS FIND ;AND COUNT IT +ADLNME: FETCH(E,E,TNXT) + JUMPN E,ADLNAM + POPJ P, + +ADLPIN: FETCH(E,E,TPIN) + JUMPE E,CPOPJ +ADLPN2: PUSHJ P,SETTT7 + HRLM A,(P) + MOVE T,E ;TYPIN BLOCK + PUSHJ P,OUTPID + MOVE T,@FSTRTB(H) + HLRZ A,(P) ;CLOBBERED BY OUTPID + PUSHJ P,MATCHS + JRST ADLPN3 + SETBIT(FOUNDD,T,E,TPBIT) + AOS FIND +ADLPN3: HLRZ B,(P) + PUSHJ P,PUTFS +ADLPN1: FETCH(E,E,TPNX) + JUMPN E,ADLPN2 + POPJ P, + +ADBPRP: +ADBTXT: FETCH(E,E,BTXT) + JRST ADBLPT + +ADLPRP: +ADLTXT: FETCH(E,E,TPROP) +ADBLPT: JUMPE E,CPOPJ +ADLTX1: FETCH(A,E,TXBIT) + TRNE A,TXBIND + JRST ADLTX2 ;JUMP IF THIS IS INDIRECT BLOCK + CAIE H,%FBPRP + CAIN H,%FLPRP + JRST [ FETCH(A,E,TXNAM) + JUMPE A,ADLTX2 + JRST ADLTX3] + FETCH(A,E,TXVAL) + FETCH(T,A,TSSIZ) + TLNN M,%IDENT + JUMPE T,ADLTX2 +ADLTX3: MOVE T,@FSTRTB(H) + PUSHJ P,MATCHS + JRST ADLTX2 + MOVSI T,1 + IORM T,ADDR(E,TXXY) ;MARK THIS ONE FOUND + AOS FIND +ADLTX2: FETCH(E,E,TXNXT) + JUMPN E,ADLTX1 + POPJ P, +>;MD + ;HERE WE FIND THE NEXT INSTANCE OF WHATEVER +FNEXTP: +MPC,< MOVEI T,1 + LSH T,@MODE + TDNN T,[1PNTM!1TXTM] + JRST PERRET +>;MPC + SETZB F,FIND ;NOTHING FOUND YET + SKIPE A,PONPNT + PUSHJ P,FNNXTP + SKIPE F + JRST IFNDP +MPC,< SKIPE A,PONPN2 + PUSHJ P,FNNXTP + SKIPE F + JRST IFNDP +>;MPC +NOFNDA: TLNN M,DSKACT!MACACT + JRST PERRET + POPJ P, + +IFNDP: +MPC,< FETCHL(T,F,PBIT) + EQV T,SID + JUMPL T,NOSIDC + SWITCH + TRO MCHG!NEEDCL +NOSIDC: +>;MPC + TRZ INMOV!INLIN + CLRBIT(FOUNDP,T,F,PBIT) +IFNDBA: SETOM FIND + MOVE T,F + JRST SCLOSP ;SET AS CLOSEST, AND MOVE THERE + +FNEXTB: SETZB F,FIND + SKIPN A,DBODPN + JRST NOFNDA +FNNXTB: FETCHL(T,A,BBIT) + TLNN T,FOUNDB + JRST FNXTB2 + MOVE F,A + TLNE M,DSKACT!MACACT + JRST IFNDB ;WIN IMMEDIATELY IF IN DSKIN OR MACRO + FETCH(T,A,BXY) + PUSHJ P,ONSCR + CAIA + JRST IFNDB +FNXTB2: HRRZ A,(A) + JUMPN A,FNNXTB + JUMPE F,NOFNDA +IFNDB: TRZ INMOV!INLIN + CLRBIT(FOUNDB,TT,F,BBIT) + JRST IFNDBA + +FNNXTP: FETCHL(T,A,PBIT) + TLNN T,FOUNDP + JRST FNXTP1 + MOVE F,A + TLNE M,DSKACT!MACACT + JRST CPOPJ1 ;WIN IMMEDIATELY IF IN DSKIN OR MACRO + FETCH(T,A,PXY) + PUSHJ P,ONSCR + CAIA + JRST CPOPJ1 +FNXTP1: HRRZ A,(A) + JUMPN A,FNNXTP + POPJ P, + +MD,< +FNEXTL: MOVEI T,1 + LSH T,@MODE ;GET CURRENT MODE AS BIT + TDNN T,[1BTXTM!1SETM!1PNTM!1TXTM!1LINM!1BODM] + JRST PERRET ;CAN'T GET TO EDIT MODE FROM HERE + SKIPN A,BODPNT + JRST NOFNDA +FNNXTL: FETCH(T,A,TYP1) + JUMPE T,FNXTL2 ;GET NEXT IF NO DEF HERE + FETCH(TT,A,TBIT) + TRZE TT,FOUNDL ;BIT ON? + JRST FNXTL1 ;YES, STORE BACK WITH BIT OFF +FNXTL2: FETCH(A,A,TNXT) + JUMPN A,FNNXTL + JRST NOFNDA + +FNXTL1: STORE(TT,A,TBIT) + SETOM FIND + JRST ALREAD ;EDIT BODY IN A + +FNEXBP: MOVEI T,1 + LSH T,@MODE + TDNN T,[1EDTPM] + JRST PERRET + SETZB F,FIND + MOVE A,CURBOD + FETCH(A,A,TPIN) + JUMPE A,FNXBP4 +FNXBP2: FETCH(T,A,TPBIT) + TRNN T,FOUNDD + JRST FNXBP1 + MOVE F,A + TLNE M,DSKACT!MACACT + JRST FNXBP3 + FETCH(T,A,TPXY) + PUSHJ P,ONSCR + CAIA + JRST FNXBP3 +FNXBP1: FETCH(A,A,TPNX) + JUMPN A,FNXBP2 +FNXBP4: JUMPE F,NOFNDA +FNXBP3: TRZ INMOV + CLRBIT(FOUNDD,TT,F,TPBIT) + JRST IFNDBA + +FNEXBT: MOVE A,BTBODY + MOVEM A,CLXY ;SAVE BODY POINTER HERE + FETCH(A,A,BTXT) + JRST FNEXLB + +FNEXLT: MOVE A,CURBOD + SETZM CLXY + FETCH(A,A,TPROP) +FNEXLB: SETZB F,FIND + JUMPE A,NOFNDA +FNXBT1: FETCH(T,A,TXXY) + TLNN T,1 ;MARKED? + JRST FNXBT2 ;NO + FETCH(TT,A,TXVAL) + FETCH(TT,TT,TSSIZ) + TLNN M,%IDENT + JUMPE TT,FNXBT2 ;ONLY VISIBLE ONES + MOVE F,A + TLNN M,DSKACT!MACACT + JRST FNXBT3 + FETCH(T,A,TXXY) + TDZ T,[1,,1] + SKIPN TT,CLXY + JRST FNXBT4 + PUSH P,F + FETCH(F,TT,BORI) + PUSHJ P,ORIENT + POP P,F + ADJUST(ADD,T,) +FNXBT4: PUSHJ P,ONSCR + CAIA + JRST FNXBT3 +FNXBT2: HRRZ A,(A) + JUMPN A,FNXBT1 + JUMPE F,NOFNDA +FNXBT3: TRZ INMOV + MOVSI TT,1 + ANDCAM TT,ADDR(F,TXXY) ;CLEAR MARK BIT + JRST IFNDBA +>;MD + ;CLEAR BITS +ACLRP: CLRBIT(FOUNDP,TT,E,PBIT) + HRRZ E,(E) + JUMPN E,ACLRP + POPJ P, + +ACLRB: CLRBIT(FOUNDB,TT,E,BBIT) + HRRZ E,(E) + JUMPN E,ACLRB + POPJ P, + +MD,< +ACLRL: FETCH(T,E,TYP1) + JUMPE T,ACLRL1 + CLRBIT(FOUNDL,TT,E,TBIT) +ACLRL1: FETCH(E,E,TNXT) + JUMPN E,ACLRL + POPJ P, + +ACLRLP: FETCH(E,E,TPIN) + JUMPE E,CPOPJ +ACLLP1: CLRBIT(FOUNDD,TT,E,TPBIT) +ACLLP2: FETCH(E,E,TPNX) + JUMPN E,ACLLP1 + POPJ P, + +ACLRBT: FETCH(E,E,BTXT) + JRST ACLRLB + +ACLRLT: FETCH(E,E,TPROP) +ACLRLB: JUMPE E,CPOPJ + MOVSI TT,1 +ACLBT1: ANDCAM TT,ADDR(E,TXXY) + FETCH(E,E,TXNXT) + JUMPN E,ACLBT1 + POPJ P, +>;MD + ;FIND TABLES +DLMTAB: JFCL ;BODY NAME + PUSHJ P,FNPUT ;BODY LOCATION + JFCL ;DIP TYPE NAME + PUSHJ P,FNPUT ;CONNECTOR OR DIP PIN LOCATION + JFCL ;TEXT +MD,< JFCL ;SIGNAL NAME + JFCL ;LIBRARY BODY NAME + JFCL ;LIBRARY BODY DIP TYPE NAME + JFCL ;LIBRARY BODY DEFAULT PIN LOCATION + JFCL ;LIBRARY BODY TEXT + JFCL ;LIBRARY BODY PROPERTY NAME + JFCL ;BODY TEXT + JFCL ;BODY PROPERTY NAME +>;MD + +LSTTAB: DBODPN ;BODY NAME + DBODPN ;BODY LOCATION + DBODPN ;DIP TYPE NAME + PONPNT ;CONNECTOR OR DIP PIN LOCATION + PONPNT ;TEXT +MD,< PONPNT ;SIGNAL NAME + BODPNT ;LIBRARY BODY NAME + BODPNT ;LIBRARY BODY DIP TYPE NAME + CURBOD ;LIBRARY BODY DEFAULT PIN LOCATION + CURBOD ;LIBRARY BODY TEXT + CURBOD ;LIBRARY BODY PROPERTY NAME + BTBODY ;BODY TEXT + BTBODY ;BODY PROPERTY NAME +>;MD +FSTRTB: FBNSTR ;BODY NAME + FBLSTR ;BODY LOCATION + FBDSTR ;DIP TYPE NAME + FPLSTR ;CONNECTOR OR DIP PIN LOCATION + FPTSTR ;TEXT +MD,< FPSSTR ;SIGNAL NAME + FLNSTR ;LIBRARY BODY NAME + FLDSTR ;LIBRARY BODY DIP TYPE NAME + FLPSTR ;LIBRARY BODY DEFAULT PIN LOCATION + FLTSTR ;LIBRARY BODY TEXT + FLRSTR ;LIBRARY BODY PROPERTY NAME + FBTSTR ;BODY TEXT + FBRSTR ;BODY PROPERTY NAME +>;MD +MPC,< +LSTTB2: [0] + [0] + [0] + PONPN2 + PONPN2 +>;MPC + +ADDCLR: ACLRB ;BODY NAME + ACLRB ;BODY LOCATION + ACLRB ;DIP TYPE NAME + ACLRP ;CONNECTOR OR DIP PIN LOCATION + ACLRP ;TEXT +MD,< ACLRP ;SIGNAL NAME + ACLRL ;LIBRARY BODY NAME + ACLRL ;LIBRARY BODY DIP TYPE NAME + ACLRLP ;LIBRARY BODY DEFAULT PIN LOCATION + ACLRLT ;LIBRARY BODY TEXT + ACLRLT ;LIBRARY BODY PROPERTY NAME + ACLRBT ;BODY TEXT + ACLRBT ;BODY PROPERTY NAME +>;MD + +DEFINE %FBVAL $ (A) +< AD$A +> + +ATHING: + %FBLST + ;MATCH +MATCHS: MOVEM T,ALTSTR ;SAVE SEARCH STRING + SETOM BEGLIN + ADD A,[POINT 7,1] ;WILL ILDB TO FIRST CHR + JRST MATCHZ + +MATCH: TLNN A,760000 + JRST [ HRR A,-1(A) + TRNN A,-1 + POPJ P, + JRST .+1] + IBP A ;ADVANCE PAST LAST MATCH +MATCHZ: AOS FSTART + SKIPN BEGLIN ;AT BEGINNING? + JRST MATCH1 ;NO, NO BEGIN LINE CHECK +NODEC,< TRNE M,SEXACT ;EXACT MATCH? + JRST MATCH0 ;YES, NO SPECIAL CHECK + MOVE TTT,A + ILDB T,TTT ;GET FIRST 2 CHARS + ILDB TT,TTT + CAIE T,NOT + JRST [ CAIN T,TILDA + CAIE TT,NOT + JRST MATCH0 + JRST MATCHX] + CAIE TT,TILDA + JRST MATCH0 +MATCHX: MOVE A,TTT ;SKIP THESE CHARS + AOS FSTART + AOS FSTART +>;NODEC +MATCH0: MOVE C,ALTSTR + LDB C,[POINT 7,1(C),6] ;GET FIRST CHAR + CAIN C,BELCHR ;BEGIN LINE CHAR? + JRST MATCHB ;TRY TO MATCH BEGINNING +MATCH1: SETZM FLEN ;NO CHARS MATCHED YET + MOVE B,ALTSTR + ADD B,[POINT 7,1] + TRNE M,SPACES + JRST DOMAT + MOVE T,A +NOMAT: TLNN T,760000 + JRST [ HRR T,-1(T) + TRNN T,-1 + JRST DOMAT ;NO MORE + JRST .+1] + ILDB TT,T + CAIE TT,DBLARR + CAIN TT," " + JRST [ MOVE A,T ;DON'T START ON SPACE + AOS FSTART ;COUNT A CHAR SKIPPED + JRST NOMAT] ;TRY FOR ANOTHER +DOMAT: PUSH P,A ;SAVE FOR BACKUP + PUSHJ P,TRYMAT ;CALL MATCH SUBR + JRST [ POP P,A + JRST CPOPJ1] ;MATCHED + POP P,A + SETZM BEGLIN ;NO LONGER BEGINNING OF STRING + SETZM FLEN ;USE THIS TO COUNT FSTART + PUSHJ P,GETA ;MOVE FORWARD IN STRING + JFCL ;TO GET COUNT + MOVE T,FLEN ;THIS IS HOW MANY REAL CHARS WE MOVED + ADDM T,FSTART ;OVER TO GET TO NEXT LOGICAL ONE + JUMPN C,MATCH1 ;GO ON IF NOT EOL + POPJ P, ;EOL, NO MATCH, FSTART IS COUNT TO END + +MATCHB: MOVE B,ALTSTR + ADD B,[POINT 7,1,6] ;SKIP FIRST CHAR + SETZM FLEN + PUSHJ P,TRYMAT ;TRY TO MATCH REST + AOS (P) ;MATCH + POPJ P, ;NO MATCH + +TRYMAT: PUSHJ P,GETB + POPJ P, + CAIN D,INFCHR ;ANY # OF NEXT CHAR + JRST INFCHK + PUSHJ P,MATCHD + JRST TRYMAT ;MATCH, TRY SOME MORE + JRST CPOPJ1 ;NO MATCH + +MATCHA: PUSHJ P,GETB ;GET A CHAR FROM MATCH STRING + POPJ P, ;END OF MATCH STRING, THIS IS MATCH +MATCHD: CAIN D,BELCHR ;END OF LINE CHAR? + JRST EOLCHK + CAIN D,NFCHR ;NOT CHAR? + JRST NOTCHK + CAIN D,ANYCHR ;ANY CHAR? + JRST ANYCHK + CAIN D,QUOCHR ;QUOTE NEXT CHAR + JRST QUOCHK + CAIN D,LETCHR ;LETTER? + JRST LETCHK + CAIN D,DIGCHR ;DIGIT? + JRST DIGCHK + CAIN D,ALFCHR ;ALPHANUMERIC? + JRST ALFCHK +MATCHC: PUSHJ P,GETA + JRST CPOPJ1 ;EOL, NO MATCH + CAME C,D + AOS (P) ;NO MATCH + POPJ P, + +LETCHK: PUSHJ P,GETA + JRST CPOPJ1 +LETCK1: CAIL C,"A" + CAILE C,"z" + JRST CPOPJ1 + CAIGE C,"a" + CAIG C,"Z" + POPJ P, + JRST CPOPJ1 + +DIGCHK: PUSHJ P,GETA + JRST CPOPJ1 +DIGCK1: CAIL C,"0" + CAILE C,"9" + AOS (P) + POPJ P, + +ALFCHK: PUSHJ P,GETA + JRST CPOPJ1 + PUSHJ P,DIGCK1 ;CHECK FOR DIGIT + POPJ P, ;MATCH + JRST LETCK1 ;NO, TRY LETTER + +EOLCHK: PUSHJ P,GETA + POPJ P, ;EOL, OK + JRST CPOPJ1 ;NO MATCH + +NOTCHK: PUSHJ P,MATCHA ;TRY THE FOLLOWING MATCH + ;NOTE: WE DISALLOW  + AOS (P) ;MATCH, NO MATCH + POPJ P, + +ANYCHK: PUSHJ P,GETA + AOS (P) ;EOL, NO MATCH + POPJ P, + +QUOCHK: PUSHJ P,GETB + POPJ P, ;EOL, MATCH + JRST MATCHC ;SKIP SPECIAL CHECK + +INFCHK: PUSH P,B ;SAVE MATCH STRING POINTER FOR BACKUP +INFCK1: PUSHJ P,MATCHA ;TRY NEXT CHAR + CAIA ;MATCH + JRST [ POP P,(P) ;NO MATCH POSSIBLE + JRST CPOPJ1] + PUSH P,A ;SAVE BOTH STRING POINTER + PUSH P,FLEN ;AND SUBSTR LENGTH + PUSHJ P,TRYMAT ;TRY TO MATCH THE REST + JRST [ POP P,(P) + POP P,(P) + POP P,(P) + POPJ P,] ;PERFECT MATCH + POP P,FLEN + POP P,A ;BACKUP THESE POINTERS + MOVE B,(P) + JRST INFCK1 ;TRY A FURTHER MATCH ON STRING + +GETA: AOS FLEN ;COUNT A CHAR SCARFED + TLNN A,760000 ;STRING OUT? + JRST [ TRNE A,-1 + HRR A,-1(A) + TRNE A,-1 + JRST .+1 + SETZ C, + POPJ P,] + ILDB C,A + JUMPE C,CPOPJ ;NULL IS EOL + TRNE M,SPACES + JRST GETA1 + CAIE C,DBLARR + CAIN C," " + JRST GETA +GETA1: TRNE M,SEXACT + JRST CPOPJ1 + CAIN C,DBLARR + JRST [ MOVEI C," " + JRST CPOPJ1] +NODEC,< CAIN C,TILDA + JRST [ MOVEI C,NOT + JRST CPOPJ1] +>;NODEC + CAIL C,"a" + CAILE C,"z" + JRST CPOPJ1 + SUBI C,40 + JRST CPOPJ1 + +GETB: TLNN B,760000 + HRR B,-1(B) + ILDB D,B + JUMPE D,CPOPJ ;NULL IS EOL + TRNE M,SPACES + JRST GETB1 + CAIE D,DBLARR + CAIN D," " + JRST GETB +GETB1: TRNE M,SEXACT + JRST CPOPJ1 + CAIN D,DBLARR + JRST [ MOVEI D," " + JRST CPOPJ1] +NODEC,< CAIN D,TILDA + JRST [ MOVEI D,NOT + JRST CPOPJ1] +>;NODEC + CAIL D,"a" + CAILE D,"z" + JRST CPOPJ1 + SUBI D,40 + JRST CPOPJ1 diff --git a/src/draw/first.521 b/src/draw/first.521 new file mode 100644 index 00000000..60ec43c7 --- /dev/null +++ b/src/draw/first.521 @@ -0,0 +1,1054 @@ +;Definitions common to D,PC, and WL + +IFN TWOSW!LIBSW,< +PASS1,<PCSW__0> +PASS2,<PCSW__1> +>;IFN TWOSW!LIBSW + +ONE,< +MD, +MPC, +>;ONE + + ;OPDEFS + +ITS,< +OPDEF CALL [ 40B8] +OPDEF INIT [ 41B8] +OPDEF CALLI [ 47B8] +OPDEF OPEN [ 50B8] +OPDEF TTYUUO [ 51B8] +OPDEF RENAME [ 55B8] +OPDEF IN [ 56B8] +OPDEF OUT [ 57B8] +OPDEF SETSTS [ 60B8] +OPDEF STATO [ 61B8] +OPDEF GETSTS [ 62B8] +OPDEF STATZ [ 63B8] +OPDEF INBUF [ 64B8] +OPDEF OUTBUF [ 65B8] +OPDEF INPUT [ 66B8] +OPDEF OUTPUT [ 67B8] +OPDEF CLOSE [ 70B8] +OPDEF RELEASE [ 71B8] +OPDEF MTAPE [ 72B8] +OPDEF UGETF [ 73B8] +OPDEF USETI [ 74B8] +OPDEF USETO [ 75B8] +OPDEF LOOKUP [ 76B8] +OPDEF ENTER [ 77B8] +OPDEF UJEN [100B8] +OPDEF DPYCLR [701B8] +OPDEF PPIOT [702B8] +OPDEF UPGIOT [703B8] +OPDEF UINBF [704B8] +OPDEF UOUTBF [705B8] +OPDEF FBREAD [706B8] +OPDEF FBWRT [707B8] +OPDEF MAIL [710B8] +OPDEF PTYUUO [711B8] +OPDEF POINTS [712B8] +OPDEF UPGMVE [713B8] +OPDEF UPGMVM [714B8] +OPDEF PGIOT [715B8] + +OPDEF TTCALL [TTYUUO] +OPDEF INCHRW [TTYUUO 0,] +OPDEF OUTCHR [TTYUUO 1,] +OPDEF INCHRS [TTYUUO 2,] +OPDEF OUTSTR [TTYUUO 3,] +OPDEF INCHWL [TTYUUO 4,] +OPDEF INCHSL [TTYUUO 5,] +OPDEF GETLIN [TTYUUO 6,] +OPDEF SETLIN [TTYUUO 7,] +OPDEF RESCAN [TTYUUO 10,] +OPDEF CLRBFI [TTYUUO 11,] +OPDEF CLRBFO [TTYUUO 12,] +OPDEF INSKIP [TTYUUO 13,] +OPDEF INWAIT [TTYUUO 14,] + +OPDEF PTWR1S [PTYUUO 7,] +OPDEF PTWRS9 [PTYUUO 12,] + +OPDEF PPSEL [PPIOT 0,] +OPDEF PPACT [PPIOT 1,] +OPDEF DPYPOS [PPIOT 2,] +OPDEF DPYSIZ [PPIOT 3,] +OPDEF PPREL [PPIOT 4,] +OPDEF PGSEL [PGIOT 0,] +OPDEF PGACT [PGIOT 1,] +OPDEF PGCLR [PGIOT 2,] +OPDEF DPYOUT [UPGIOT] + +OPDEF SETDDT [CALLI 2] +OPDEF SWAP [CALLI 400004] +OPDEF CORE2 [CALLI 400015] +OPDEF ATTSEG [CALLI 400016] +OPDEF DETSEG [CALLI 400017] +OPDEF SEGNUM [CALLI 400021] +OPDEF DSKPPN [CALLI 400071] + +>;ITS + +;Local UUO's - must stay in same order, see %UUOCON in [SUB] + +OPDEF PUTBYT[1B8] +OPDEF PUTSTR[2B8] +DBG,< +OPDEF .FETCH[3B8] +OPDEF .FETL[4B8] +OPDEF .STORE[5B8] +OPDEF .STORL[6B8] +OPDEF .CLEAR[7B8] +OPDEF .RETBL[10B8] +>;DBG +III,< +;UUO's for Leahy display - these link to CNVERT +OPDEF DPYADD [11B8] +OPDEF DPYIOT [12B8] + OPDEF DPYCLR [DPYIOT 0,] + OPDEF DPYSIZ [DPYIOT 7,] + OPDEF DPYPOS [DPYIOT 6,] +OPDEF DPYOUT [13B8] +>;III + +;Old UUO's for 1060 type display +;III,< +;OPDEF DPYADD[45B8] +;OPDEF DPYIOT[42B8] +;OPDEF DPYCLR[DPYIOT 0,] +;OPDEF DPYSIZ[DPYIOT 7,] +;OPDEF DPYPOS[DPYIOT 6,] +;OPDEF DPYOUT[44B8] +;>;III + +DEC,< + OPDEF DSKPPN [10B8] + OPDEF TTYUUO [51B8] + OPDEF DPYOUT [3B8] + OPDEF DPYCLR [4B8] +GT,< OPDEF IONEOU [TTYUUO 15,] ;;JB DEFINE THE IMAGE OUT UUO.> +PGP,< OPDEF PLIT [POINT 36,0,35] > +>;DEC + +NOSTANFO,< +OPDEF APRENB [CALLI 16] +OPDEF SETNAM [CALLI 43] +OPDEF UNLOK. [CALLI 120] +OPDEF LOCK [CALLI 60] +OPDEF GETTAB [CALLI 41] +OPDEF DEVNAM [CALLI 64] +OPDEF PATH [CALLI 110] +VIROS,< +OPDEF COMPT. [CALLI 147] +OPDEF ERJMP [JUMP 16,] +OPDEF ERCAL [JUMP 17,] +OPDEF JSYS [104B8] +OPDEF STDIR [JSYS 40] +OPDEF GTSTS [JSYS 24] +OPDEF DVCHR [JSYS 117] +OPDEF STDEV [JSYS 120] +OPDEF GTJFN [JSYS 20] +OPDEF OPENF [JSYS 21] +OPDEF MTOPR [JSYS 77] +OPDEF ERSTR [JSYS 11] +OPDEF CLOSF [JSYS 22] +OPDEF PMAP [JSYS 56] +OPDEF DEVST [JSYS 121] + VBLOCK__30 ;LOCK CODE + VBSTRT__31 ;START CODE + VBSTOP__32 ;STOP CODE + VBSTAT__33 ;STATUS CODE +>;VIROS + +OPDEF EXIT [CALLI 12] +OPDEF RESET [CALLI] +OPDEF SETUWP [CALLI 36] +OPDEF DATE [CALLI 14] +OPDEF TIMER [CALLI 22] +OPDEF MSTIME [CALLI 23] +OPDEF GETPPN [CALLI 24] +OPDEF CORE [CALLI 11] +OPDEF SLEEP [CALLI 31] +OPDEF HIBER [CALLI 72] +OPDEF PJOB [CALLI 30] + +OPDEF INCHRW [TTYUUO 0,] +OPDEF OUTCHR [TTYUUO 1,] +OPDEF INCHRS [TTYUUO 2,] +OPDEF OUTSTR [TTYUUO 3,] +OPDEF INCHWL [TTYUUO 4,] +OPDEF INCHSL [TTYUUO 5,] +OPDEF GETLIN [TTYUUO 6,] +OPDEF SETLIN [TTYUUO 7,] +OPDEF RESCAN [TTYUUO 10,] +OPDEF CLRBFI [TTYUUO 11,] +OPDEF CLRBFO [TTYUUO 12,] +OPDEF INSKIP [TTYUUO 13,] +>;NOSTANFO + +DEFINE ENTPPN<> + +IFN DECSW!CMUSW!IIISW,< +NODEC,< OPDEF DSKPPN [GETPPN] > +DEFINE ENTPPN +< SKIPN T,FILPPN + DSKPPN T, + MOVEM T,FILPPN +> +>;IFN DECSW!CMUSW!IIISW + +EXTERNAL .JBOPC,.JBREN,.JBDDT,.JBFF,.JBSYM,.JBHRL,.JBSA,.JBREL +DEC,< +EXTERNAL .JB41,.JBUUO,.JBTPC,.JBAPR,.JBCNI,.JBINT +GT,< +EXTERN SAVER,RESTRE,GTINIT,TRANS8,CLEARS,GTRESET +EXTERNAL GTCHRW,GTCHRS,GTCHSL,GTCHWL ;;JB +EXTERN SENDHD,STPSHW,SRTSHW,BMODDO,BREADM,STLPXY ;;JB +DLX, +INTERNAL NBYTES,OPTFLG,GTX,GTY +>;GT +PGP,< EXTERN CHRTAB > + +;SPECIAL PUSHDOWN LIST FOR PDL OVFL HANDLER +SPD2SZ__200 +>;DEC +SPPDSZ__10 + + ;MEMORY ORGANIZATION + + +IFN DECSW!TWOSW,< +SET LOWER,. +TWOSEG +RELOC 400000 +SET UPPER,. + +VB10,< +NOVIROS,< +DEFINE STORAGE(A) +< IFIDN + IFIDN + IFIDN + IFIDN +> +>;NOVIROS +VIROS,< +DEFINE STORAGE(A) +< IFIDN + IFIDN + IFIDN + IFIDN +> +>;VIROS +>;VB10 + +NOVB10,< +DEFINE STORAGE(A) +< IFIDN + IFIDN + IFIDN + IFIDN +> +>;NOVB10 +>;IFN DECSW!TWOSW + + +IFE DECSW!TWOSW,< +DEFINE STORAGE(A) +<> +>;IFE DECSW!TWOSW + + +ITS,< +NOLAY,< +SET LOWER,. +TWOSEG +RELOC 400000 +SET UPPER,. + +DEFINE STORAGE(A) +< IFIDN + IFIDN + IFIDN + IFIDN +> +>;NOLAY +LAY,< +DEFINE STORAGE(A) +<> +>;LAY +>;ITS + +;;Allocation in upper segment if Two-Seg-Layout +;; else from lower segment + DEFINE GETREL (A) + +DEC,< + +VB10,< HRRZ A,.JBHRL > +NOVB10,< HRRZ A,.JBREL > +>;DEC +>;NOTWO +TWO,< HRRZ A,.JBHRL > +> + ;AC'S - SPECIAL CHAR DEFS - OTHER DEFS + +;0 ;TEMPORARY FLAGS +M_1 ;SEMI-PERMANENT FLAG REG +A_2 +B_3 +C_4 +D_5 +E_6 +F_7 +G_10 +H_11 +T_14 +TT_T+1 +TTT_TT+1 +P_17 + + SUBTTL AC 0 FLAG BITS + +;RIGHT HALF::: + +ATFP__1 ;EDIT INSERT IS AT THE FIRST POINT +ATLP__2 ; " " " " " LAST POINT +TYPNEG__4 ; - TYPED LAST IN EDIT INSERT +TFLG__10 ;TEMPORARY FLAG +MCHG__20 ;MAIN PICTURE CHANGED -- REDISPLAY IT +INLIN__40 ;POINT MODE IS MAKING LINES +ZIGZAG__100 ;WHICH WAY THE LINES GO FOLLOWING THE CURSOR +INMOV__200 ;WE ARE MOVING SOMETHING (A POINT OR A BODY) +STBOX__400 ;WE ARE DRAWING A SETBOX(NO OTHER SET COMMANDS ARE LEGAL) +MAKSET__1000 ;USED IN DREAD TO MAKE SET OF APPENDED PIC +VIRGIN__2000 ;USED IN DREAD TO INDICATE FIRST PIC +NEEDCL__4000 ;NEED TO FIND CLOSEST AGAIN REGARDLESS OF LSTCUR +TMOVE__10000 ;SPECIAL, MOVING TEXT OFFSET + +MPC,< +BTHSDS__400000 ;DISPLAYING BOTH SIDES OF PC CARD +>;MPC +MD,< +LMOVE__200000 ;SPECIAL, MOVING LOCATION OFFSET +FSTLIB__400000 ;TOP LEVEL LIBRARY, NAME WILL BE PUT ON LIST +>;MD + +;LEFT HALF +ASK__1 ;TEMP FLAG IN VARIOUS ROUTINES +WFLAG__2 ; " +NOINIT__4 ;SUPPRESS CALLING OF INIT MACRO ON READIN +IGNORE__10 ;DOING DEFINITION OR FALSE PART OF ;F +LOCATE__20 ;PUT LOCATOR LINES FROM BIG CHAR +DSPOFF__40 ;DISPLAY PACKAGE IS CURRENTLY OFF SCREEN +DSPACT__100 ;WE ARE CURRENTLY DISPLAYING (COMBINATION OF FLAGS) + SUBTTL AC M FLAG BITS + +;RIGHT HALF + +MD,< +NBTEXT__1 ;NO BODY TEXT PLEASE +NOCBOX__2 ;NO BOX AROUND CONNECTOR PINS, PLEASE +>;MD +MPC,< +NDIPS__1 ;USE BOX, INSTEAD OF PADS +FLIP__2 ;INVERTING X +XFEED__4 ;SUPPRESS DISPLAYING OF FEEDTHROUGHS +XFINGER__10 ;SUPPRESS DISPLAYING OF FINGERS +>;MPC + +SEXACT__10000 ;EXACT MATCH IN SEARCHES +IFN LAYSW!UMLSW,< +ERRORD__20000 ;SUPPRESS DISPLAY OF O_?? +>;LAYSW!UMLSW +SPACES__40000 ;SPACES ARE SIGNIFICANT +NLINES__100000 ;NO LINES +CURSOR__200000 ;USING BULLSEYE CURSOR +NPTEXT__400000 ;NO POINT TEXT PLEASE + + +;LEFT HALF + +PLOCS__1 ;DISPLAY PIN NUMBERS +CLOCS__2 ;DIPLAY CONNECTOR PIN LOCS! +BLOCS__4 ;DISPLAY BODY LOCATIONS! +MD,<UNHIDE__10 > ;MAKE VISIBLE HIDDEN LOCS/PIN #'S, ETC. +XWINDOW__20 ;NOT LIMITED TO SCREEN +MD,<RPINID__40 > ;DISPLAY REAL PINIDS (NUMBERS) +TYPREP__100 +TYPNLY__200 +LWINDOW__400 ;WINDOW LINE SEGMENTS! +DSKFLG__1000 ;USING DISK INPUT +DSKACT__2000 ;DISK INPUT ACTIVE +MACACT__4000 ;MACRO INPUT ACTIVE +%IDENT__10000 ;PLOT BODYNAMES AND DIPNAMES ON BODIES +MD,< +PINIDS__40000 ;DISPLAY DEFAULT PIN NAMES +JUNC3__100000 ;DIAMONDS AT JUNCTION OF 3 LINES +DIAMONDS__200000 ;PLOT DIAMONDS +>;MD +MPC,< +ROUTE,< +%ROUTE__40000 +RDISP__100000 ;DISPLAY BIT ARRAY! +>;ROUTE +CRDISP__200000 ;DISPLAY CARD +>;MPC +LCENTER__400000 ;CENTER ALL THE BLINKING STUFF + + SUBTTL PIN, BODY, LIBRARY, DEF AND NAMED MACRO BITS + + +;POINT TYPE BITS +;PBIT,BPBIT + +MPC, +ISPIN__200000 ;THIS IS A PIN +MD,;MD +MPC,) +>;MPC +CPIN__1000 ;THIS POINT IS ALSO A CONNECTOR PIN +FOUNDP__20 ;BIT FOR FIND +;BITS 14-17 ARE USED AS MARK BITS HERE AND THERE + + +;BODY BITS +;BBIT + +MD,< +;L1416__1 ;LEFT JUSTIFIED 14 PIN DIP IN 16 PIN SOCKET +;R1416__2 ;RIGHT " " " " " " " " +FIXLOC__4 ;ALWAYS SET BODY LOC OFFSET FROM DEFINITION +FIXBLO__10 ;FIX LOC CHAR OFFSET WHEN LOC CHANGES +>;MD +FOUNDB__200000 ;BIT FOR FIND +BTMP1__400000 ;HIGH ORDER BIT IS MARK BIT FOR SET HACKS + + +;BODY DEF PIN BITS +;TPBIT + +MD,< +BUSSED__400000 ;THIS IS A BUSSED THROUGH PIN, DON'T SHOW PIN # +;200000 AVAILABLE +FOUNDD__100000 ;MARK BIT FOR FLPIN COMMAND +DPTMP1__40000 ;TEMP MARK BIT +DPTMP2__20000 ;ANOTHER +DEC,< +ASSL__2 ;ASSERTION LOW +ASSH__1 ;ASSERTION HIGH +>;DEC +DEC,< BASSLH__BUSSED!ASSL!ASSH> +NODEC,< BASSLH__BUSSED> +>;MD + + +;PIN POS FIELD DEFINITIONS +XOFFB__7+=18 ;LOW ORDER BIT OF X OFFSET +XOFFW__8 ;WIDTH OF X FIELD +YOFFB__=14+=18 ;LOW ORDER BIT OF Y OFFSET +YOFFW__7 ;WIDTH OF Y FIELD +POSB__=17+=18 ;LOW ORDER BIT OF POSITION NUMBER +POSW__3 ;WIDTH OF POSITION FIELD + + +;LIBRARY NAME BLOCK BITS (RT HALF OF FIRST WORD OF SECOND BLOCK) +NEEDMR__400000 ;NEED TO READ THIS LIRBARY AGAIN TO GET ALL OF DEFINITIONS +TOPLVL__200000 ;THIS MARKS A LIBRARY BLOCK READ AT TOP LEVEL + + +;TYPE DEFINITION BITS +;TBIT + +DTMP1__400000 ;TEMPORARY MARK BIT +FOUNDL__200000 ;THIS BODY HAS BEEN FOUND BY "FLNAME" OR "FLDIP" +XDISLOC__100000 ;DON'T DISPLAY BODY LOC IF TRACKING DEFINITION + + +;MACRO BITS IN LEFT HALF OF NAMED MACRO HEADER BLOCK FIRST WORD +MSAVE__400000 ;SAVE THIS MACRO IN DRW OR PC FILE +MACTMP__1 ;TEMPORARY MARK BIT + + +;BITS IN RUNBIT WRITTEN INTO 'WD' FILE. +CABBDY__1 ;"CABLE" BODY SEEN ON RUN. (MUST BE SAME AS BIT IN WL) + +;BITS IN TXBIT - TEXT OR PROPERTY +TXBIND__400000 ;THIS IS INDIRECT FROM BODY TO TYPE +TXBDIP__200000 ;THIS PROP IS FROM DIP DEFINITION + + SUBTTL COMMON MACROS +;CONCATINATION + DEFINE CAT $ (A,B) +< A$B +> + +;CHANGE SCREEN FOR TEXT OUTPUT +DEFINE TVOFF + +> + +DEFINE TVON + +> + + SUBTTL STRUCTURE MACROS +;THE FOLLOWING NAMES ARE USED IN STRUCTURE POINTER DEFINITIONS +;F.XXX INSTRUCTION TO FETCH VALUE +;L.XXX INSTRUCTION TO FETCH VALUE INTO LEFT HALF +;S.XXX " STORE " +;T.XXX " " " FROM LEFT HALF +;V.XXX VALUE OF INDEX INTO BLOCK +; OR LENGTH OF A BLOCK +;C.XXX INSTRUCTION TO CLEAR CELL +;N.XXX SIXBIT NAME OF BLOCK +;U.XXX INDEX INTO DBG UUOTABLE FOR THIS STRUCTURE ELEMENT + +DEFINE .ADD(MACRO,STUFF)<.ADD1(MACRO,\MACRO,)> + +DEFINE .ADD1(MACRO,DUMMY,BODY,STUFF) +< DEFINE MACRO +>;MACRO +>;.ADD1 + +DEFINE .DONE(MACRO)<.DONE1(MACRO,\MACRO)> + +DEFINE .DONE1(MACRO,DUMMY,BODY) +< DEFINE MACRO +;MACRO +>;DONE1 + +DEFINE CAT $ (A,B,C,D,E,F) + + ;FETCH, STORE MACROS + + +NODBG,< +DEFINE FETCH $ (AC1,AC2,INDEX) +< F.$INDEX AC1,V.$INDEX(AC2) +> + +;FETCH INTO LEFT HALF (either HLLZ or HRLZ) +DEFINE FETCHL $ (AC1,AC2,INDEX) +< L.$INDEX AC1,V.$INDEX(AC2) +> + +DEFINE STORE $ (AC1,AC2,INDEX) +< S.$INDEX AC1,V.$INDEX(AC2) +> + +;STORE FROM LEFT HALF (HLLM OR HLRM) +DEFINE STOREL $ (AC1,AC2,INDEX) +< T.$INDEX AC1,V.$INDEX(AC2) +> + +DEFINE CLEAR $ (AC1,INDEX) +< C.$INDEX V.$INDEX(AC1) +> + +>;NODBG + +DBG,< + +DEFINE FETCH $ (AC,XR,INDEX) +< .FETCH AC,+U.$INDEX +> + +DEFINE FETCHL $ (AC,XR,INDEX) +< .FETL AC,+U.$INDEX +> + +DEFINE STORE $ (AC,XR,INDEX) +< .STORE AC,+U.$INDEX +> + +DEFINE STOREL $ (AC,XR,INDEX) +< .STORL AC,+U.$INDEX +> + +DEFINE CLEAR $ (XR,INDEX) +< .CLEAR +U.$INDEX +> +>;DBG + +DEFINE SBLOCK $ (NAME) +< INDEX__0 +N.$NAME__ +..BLK__N.$NAME ;BLOCK WE ARE IN +DBG,< .ADDB(NAME,INDEX) > +> + +DEFINE EBLOCK $ (NAME) + +> + +DEFINE ADDR $ (AC1,INDEX) + +DEFINE RADDR $ (AC1,INDEX1,INDEX2) + +DEFINE SETBIT $ (BIT,AC1,AC2,INDEX) +< FETCH(AC1,AC2,INDEX) + TRO AC1,BIT + STORE(AC1,AC2,INDEX) +> + +DEFINE CLRBIT $ (BIT,AC1,AC2,INDEX) +< FETCH(AC1,AC2,INDEX) + TRZ AC1,BIT + STORE(AC1,AC2,INDEX) +> + +DEFINE BCLEAR $ (AC1,AC2,INDEX) +< SETZM (AC2) +IFG ,< + MOVSI AC1,(AC2) + HRRI AC1,1(AC2) + BLT AC1,V.$INDEX-1(AC2) + > +> + +DBG,< +DEFINE .ADDF $ (NAME,WHERE) +< .ADDF1 (\..BLK,NAME,WHERE) +> + +DEFINE .ADDF1 (BLOCK,NAME,WHERE) +< .ADD(STRUCTURES,) +> + +DEFINE STRUCTURES <0,> ;# IS SO THAT \ IN MACRO IS LEGAL (CROCK) + +DEFINE .ADDB (NAME) +< .ADD(BLOCKS,) +> +DEFINE BLOCKS <0,> +>;DBG + +DEFINE CHECK $ (INDEX) +> +IFN TWOSW!LIBSW,>> +> + + ;HWDS, FWD + +DEFINE HWDS $ (LEFT,RIGHT,SLE,SRE) +< +IFDIF<>< +IFDIF + DBG,< .ADDF(LEFT,L) > +> +IFIDN + DBG,< .ADDF(LEFT,LE) > +> +DEFINE L.$LEFT +DEFINE S.$LEFT +DEFINE T.$LEFT +DEFINE C.$LEFT +CHECK(LEFT) +V.$LEFT__INDEX +> +IFDIF<>< +IFDIF + DBG,< .ADDF(RIGHT,R) > +> +IFIDN + DBG,< .ADDF(RIGHT,RE) > + > +DEFINE L.$RIGHT +DEFINE S.$RIGHT +DEFINE T.$RIGHT +DEFINE C.$RIGHT +CHECK(RIGHT) +V.$RIGHT__INDEX +> +INDEX__INDEX+1 +> + +DEFINE FWD $ (WORD) +< +IFDIF<>< +DBG,< .ADDF(WORD,FWD) > +DEFINE F.$WORD +DEFINE S.$WORD +DEFINE C.$WORD +CHECK(WORD) +V.$WORD__INDEX +> +INDEX__INDEX+1 +> + ;GETBLK, RETBLK, + +NODBG,< + DEFINE GETBLK $ (A,BLOCK) +<%%BLK__IFDIF<>2 + SKIPN A,@BLKPNT+%%BLK + JSR NOBLK + EXCH A,BLKPNT+%%BLK +> + + DEFINE RETBLK $ (A,BLOCK) +<%%BLK__IFDIF<>2 + TLZ A,-1 + EXCH A,BLKPNT+%%BLK + HRRZM A,@BLKPNT+%%BLK +> +>;NODBG + +DBG,< + DEFINE GETBLK $ (A,BLOCK) +<%%BLK__V.$BLOCK + SKIPN A,@BLKPNT+%%BLK+1 + JSR NOBLK + EXCH A,BLKPNT+%%BLK+1 + PUSH P,A + MOVE A,[SIXBIT'BLOCK'] + MOVEM A,@(P) + POP P,A + AOS A +> + + DEFINE RETBLK $ (A,BLOCK) +<%%BLK__V.$BLOCK + .RETBL A,U.$BLOCK +> +>;DBG + +;OLD GET FREE STORAGE + + DEFINE GETFS (A) +< GETBLK (A,QOMMON) +> + +;RETURN FREE STORAGE + DEFINE FSTRET (A) +< RETBLK (A,QOMMON) +> + + SUBTTL DATA STRUCTURES + +;********** STRUCTURE DEFINTIONS ********** + +FSTLEN__2 ;THIS WILL ACCUMULATE LONGEST BLOCK + +COMMENT  +Normally, items must have the same format for the first two words: +This is depended on in many routines (like FNDCLS) + +SBLOCK QOMMON +HWDS (QLH,QNXT) ;... NEXT POINTER +HWDS (QX,QY,E,E)  INDEX__INDEX-1 + FWD (QXY)  INDEX__INDEX-1 + HWDS (Q2LH,Q2RH) +EBLOCK QOMMON +NIL, + +;ARGUMENT LIST FOR DIPRED, LIST OF BODIES, AND DIPTYPES TO GET +; FROM DIPS.DIP FILE + +SBLOCK GETDIP +HWDS (GDIP,GNXT) ;PTR TO DIPNAME NEXT +HWDS (GFLAG,GBDY) ;FLAG BODY OR TYPE + INDEX__INDEX-1 + FWD (GFBDY) +EBLOCK GETDIP + + ;FLAG is -1 if diptype came from type + + ;TYPE - BODY DEFINITIONS +MD,< +;***************************** +;*** TYPE DEFINITION BLOCK *** +;***************************** + +SBLOCK TYPE +HWDS (TLIB,TNAM) ;LIBRARY POINTER NAME (LH 1ST WD IS DIP TYPE NAME PTR)?? +HWDS (TYP1,TNXT) ;*+1, OR 0 NEXT TYPE +HWDS (TYP2,TPIN) ;*+2 PINLOC LIST +HWDS (TPROP,TLIN) ;PROPERTY LIST DISPLAY DEFINITION +HWDS (TBIT,TYP3) ;TYPE BITS *+2 (0 IF USING DEFAULT CHAR OFFSET) +HWDS (TX,TY,E,E) ;DEFAULT LOC OFFSET (X,Y) + INDEX__INDEX-1 + FWD (TXY) ; FOR SIMUL ACCESS +HWDS (TPAK,TDEF) ;PACKAGE CODE DIP DEF LIST (0 IF NOT IN) +HWDS (TOX,TOY,E,E) ;DEFAULT CHAR OFFSET (X,Y) + INDEX__INDEX-1 + FWD (TOXY) +EBLOCK TYPE +NIL, ;FOR @CREF LISTING + + ;IF TYP1 IS 0, THEN ONLY FIRST 2 WDS ARE PRESENT, TYPES ARE ABBREVIATED IF + ;PRESENT IN LIBRARY BUT NOT USED IN DRAWING + +SBLOCK STYP +HWDS (SLIB,SNAM) +HWDS (SYP1,SNXT) +EBLOCK STYP + + ;DISPLAY DEFINITION + ; --,, next + ; X,, Y + ; low order bit + ; 0 = invisible + ; 1 = visible + +;***************************** +;*** TPIN BLOCK (D) *** +;***************************** + +SBLOCK TYPIN +HWDS (TP1,TPNX) ;*+2 NEXT +HWDS (TPX,TPY,E,E) ; LOCATION OF PIN ON BODY + INDEX__INDEX-1 + FWD (TPXY) ;FOR FULL REFERENCE +HWDS (TPBIT,TPID) ;PIN BITS PIN ID +HWDS (TPPOS,TPNAM) ;PIN POS PIN NAME +EBLOCK TYPIN +NIL, + ;TPNX MUST BE IN 1ST WORD + + ;PIN POS: + ; BYTE (7)X(7)Y(4) 8 POSITION CODE + ; X,Y ARE 2'S COMPL + + +;******************************************************** +;*** TYPE DIP DEF LIST - DIP DEFINITION FROM DIPS.DIP *** +;******************************************************** +SBLOCK DDEF +HWDS (DDNPN,DDNXT) ;# PINS DEFINED DIPDEF LIST +HWDS (,DDMAX) ; MAX SEC # +EBLOCK DDEF +NIL, + +SBLOCK DIPDEF +HWDS (DPNM,DPNXT) ;PIN NAME NEXT +HWDS (DPSEC,DPPIN) ;SECTION BITS SECTION PIN # +EBLOCK DIPDEF +NIL, +>;MD + + ;TYPE DEFINITIONS (PC) + +MPC,< +;******************************************************** +;*** TYPE DEFINITION (PC) *** +;******************************************************** + +SBLOCK TYPE +HWDS (TNAM,TNXT) ;NAME (=# PINS USUALLY) NEXT POINTER +HWDS (TDPY,TPIN) ;APPROX BOX TPIN LIST +EBLOCK TYPE +NIL, + +;******************************************************** +;*************** TPIN BLOCK (PC) ****************** +;******************************************************** + +SBLOCK TYPIN +HWDS (TPID,TPNX) ;PIN ID NEXT PTR +HWDS (TPX,TPY,E,E) ;PIN OFFSET + INDEX__INDEX-1 + FWD (TPXY) ;FOR FULL REFERENCE +EBLOCK TYPIN +NIL, +>;MPC + + ;POINTS + +;BPBIT and PBIT are assumed to be in LH in many places + +;******************************************************** +;*************** BODY POINT ********************* +;******************************************************** + +SBLOCK BPOINT +HWDS (BP1,BPNXT) ;*+2 NEXT +HWDS (BPX,BPY,E,E) ;POINT LOC X,Y + INDEX__INDEX-1 + FWD (BPXY) +HWDS (BBODY,BPLNK) ;BODY PIN LINK +HWDS (BPNEB,BP3) ;NEIGHBORS *+1 +HWDS (BPTXT,BPLOC) ;POINT TEXT PINLOC BLOCK IN TYPE +HWDS (BPBIT,BPPN) ;BITS PIN# OR PAD# +MD,< ;NEIGHBOR BLOCK ONLY FOR D + ;PC HAS LIST OF POSSIBLY MORE THAN 4 NEIGHBORS +HWDS (BPND,BPNU) ;NEIGHBORS +HWDS (BPNL,BPNR) +>;MD +EBLOCK BPOINT +NIL, + + ;IF PC, PAD# IS 1 OR 3 + ;IF PC, BPNEB IS LIST OF FORM: + ; NEIGHBOR1,, NEXT + ; NEIGHBOR3,, NEIGHBOR2 + +;******************************************************** +;*** POINT OR CPIN *** - MUST BE CONGRUENT WITH BPOINT +;******************************************************** + +SBLOCK POINT +HWDS (P1,PNXT) ;*+2 NEXT +HWDS (PX,PY,E,E) ;POINT LOCN X,Y + INDEX__INDEX-1 + FWD (PXY) +HWDS (PFEED,PID) ;0 OR FEEDTHRU POINT ID +HWDS (PNEB,P3) ;NIGHBORS *+1 +HWDS (PTXT,PLOC) ;TEXT LOCATION +HWDS (PBIT,PIN) ;POINT BITS PIN # OR PAD # +MD,< +HWDS (PND,PNU) ;NEIGHBORS L,R +HWDS (PNL,PNR) ;NEIGHBORS UP,DOWN ? +>;MD +EBLOCK POINT +NIL, + +;PLOC IS 0 UNLESS CPIN ON IN PBIT +;FORMAT OF LOCN BLOCK IN D +; B-R-S,, CPIN-LOC/PIN# (18 PIN FORMAT) +; CONSTANT OFFSET X,Y +;FORMAT OF LOCN BLOCK IN PC +; 0,, SOCKET# ??? +; CONSTANT OFFSET X,Y + + + + ;TEXT STRINGS AND PROPERTY BLOCKS + +;******************************************************** +;*************** TYPE TEXT/PROPERTY BLOCK *************** +;******************************************************** + +SBLOCK TEXT +HWDS (TXBIT,TXNXT) ;BITS NEXT +HWDS (T.X,T.Y,E,E) ;TEXT LOC X TEXT LOC Y + INDEX__INDEX-1 + FWD (TXXY) + INDEX__INDEX-1 + HWDS (,TXIND) ; -- INDIRECT POINTER +HWDS (TXNAM,TXVAL) ;PROPERTY NAME (0 IF NONE) PROPERTY VALUE +HWDS (TXOX,TXOY,E,E) ;CONSTANT OFFSET X,Y + INDEX__INDEX-1 + FWD (TXOFF) +EBLOCK TEXT +NIL, + + ;If TXBIND is on in TXBIT, then is indirect. TXIND points to TEXT block in type. + ;low bit of TXXY is used to mean auto-offset + ;1,, bit of TXXY is sometimes used for flag + + ;"0" size text not displayed unless IDENTS is on. + +COMMENT  +STANDARD TEXT FORMAT: + +------------ ! ----!------ ! CHAR ----!--- NEXT 5 + ! ! ! SIZE ! CHARS + !-------!-------! !-------!-------! + !CONSTANT OFFSET! ! ! + ! X Y ! ! 5 CHARS ! + !-------!-------! !---------------! +OFFSET IS SCALED WITH TEXT SIZE, NOT DRAWING SCALE. + + +SBLOCK TEXCOF +HWDS (,TCSTR) ;... BARE TEXT STRING +HWDS (TCX,TCY,E,E) ;CONSTANT OFF. X Y + INDEX__INDEX-1 + FWD (TCXY) +EBLOCK TEXCOF + +SBLOCK TEXSTR +HWDS (TSSIZ,TSNXT) ;CHAR-SIZE NEXT +FWD (TSASC) ; ASCII CHARS +EBLOCK TEXSTR + + ;BODY INSTANCE + +;************************************************** +;*************** BODY INSTANCE ************ +;************************************************** + +SBLOCK BODY +HWDS (BOD1,BNXT) ;*+2 NEXT +HWDS (BX,BY,E,E) ;BODY LOCN X,Y + INDEX__INDEX-1 +FWD (BXY) ; FOR REFERENCE TOGETHER +HWDS (BORI,BLNK) ;ORIENTATION PIN LINK - THRU ALL PINS ON BODY +HWDS (BOD2,BTYP) ;*+1 TYPE +MPC,< +HWDS (BID,BLN) ;BODY ID BYTE (6)L(12)N +HWDS (BBIT,BNAM) ;BODY BITS DIP TYPE NAME STRING +>;MPC +MD,< +HWDS (BID,BLOC) ;BODY ID *+2 (0 IF NO LOC SET) +HWDS (BBIT,BTXT) ;BODY BITS BODY TEXT/PROPERTY LIST (MUST BE RH) +HWDS (BOD3,) ;*+2 UNUSED +HWDS (BLX,BLY,E,E) ;BODY LOCN CONSTANT OFFSET X,Y + INDEX__INDEX-1 + FWD (BLXY) +HWDS (BBRS,BSOC) ;LOC BAY-RACK-SLOT SOCKET # + INDEX__INDEX-1 + FWD (BRSLOC) ;B-R-S,,BODY-LOC +HWDS (BLOX,BLOY,E,E) ;BODY LOCN CHAR OFFSET X,Y + INDEX__INDEX-1 + FWD (BLO) +HWDS (BPAK,BDEF) ;PACKAGE CODE DIP DEF LIST (IF BODY HAS DIPTYPE) +>;MD +EBLOCK BODY +NIL, + +;If TXBIND is set in TXBIT, then this is indirect pointer to text/prop block +;in type. TXIND is pointer. +;If a BODY has any props at all, then it contains also indirect pointers +;to all props that were in its type. All or none. + +DEFINE FETPAK (A,B) +< FETCH(A,B,BPAK) + JUMPN A,.+3 + FETCH(A,B,BTYP) + FETCH(A,A,TPAK) +> +IFIDN < PUSH P,A + FETCH(A,A,BPAK) + JUMPE A,[POP P,A + FETCH(A,A,BTYP) + FETCH(A,A,TPAK) + JRST .+2] + SUB P,[1,,1] +> +> + +;Define index values of elements for debug + +DBG,< + ..ELEM__0 +DEFINE STRUC1 $ (BLOCK,NAME,WHERE) + + STRUCTURES +MAXELM__..ELEM +>;DBG diff --git a/src/draw/in.501 b/src/draw/in.501 new file mode 100644 index 00000000..a109a27f --- /dev/null +++ b/src/draw/in.501 @@ -0,0 +1,4192 @@ +;IN.FAI.130, 20-NOV-75 14:34:13, EDIT BY HELLIWELL +VERSION(IN,16) + +COMMENT  + +The drawing file has roughly this structure: + -version #, nomenclature, board type + -names of types needed from libraries in this drawing + -names of library files + -definitions of local types + -definitions of macros + -body instances + -points + -sets + -random info + +An outline of reading a .DRW file: + +DREAD: open file, initialize ID's, etc. + call RDFILE + make set ? + call INIT macro + end; + +RDFILE: start as toplevel file (not a library) + call TYPIN + read body's + read points + read sets + read ... + end; + +LIBRED: print "LIBRARY " + open file + add name to list of libraries read in +TYPIN: get version #, nomen, board type + (DOLBTY:) if toplevel, read list of used types + else, skip them (not used from library) + (GETLIB:) read list of libraries used, possibly + mapping the names + (RDTYP:) read local types (maybe do replacement) + if any libraries, + save current file name, aos depth + for each library used, + check if library is already in (rare?) + check if is in, but we need more bodies + call LIBRED + restore file name, sos depth, reread to macro defs + get macros + end; + + + +;INIT DISK, SET FLAGS, CHECK FOR VIRGIN, ETC. +MD,< +DREADR: TLO M,TYPNLY!TYPREP ;TYPES ONLY AND ALWAYS REPLACE (SILENTLY)! + JRST DREAD1 +>;MD +DREADT: TLOA M,TYPNLY ;TYPES ONLY +DREAD: TLZ M,TYPNLY + TLZ M,TYPREP ;DON'T REPLACE AUTOMATICALLY! +DREAD1: MOVEM P,PERRSAV ;FOR ERROR RETURNS + MOVSI T,EXTFIL + PUSHJ P,SETNAM + POPJ P, ;LET HIM OUT THIS WAY + SETZM WIRDAT ;MAKE SURE WE READ FILE +WIRENT: INIT DAT,10 + 'DSK ' + IOHD + JRST [ RELEASE DAT, + OUTSTR [ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + MOVEI T,IOBUF ;USE COMPILED IN BUFFER + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT + MOVE T,FILPPN + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > +NODEC,< MOVEM T,FILPPN > + LDB T,[POINT 11,FILDAT,23] + HRL T,FILDAT + LDB TT,[POINT 3,FILEXT,20] + DPB TT,[POINT 6,T,5] + CAMGE T,WIRDAT + JRST [ OUTSTR[ASCIZ/, OLDER THAN WIRE LIST FILE. +/] + POPJ P,] + OUTSTR[ASCIZ/ +/] +;PATCH TO FIX OLD TEXT OFFSETS WHICH ARE WRONG + SKIPN LSTNAM ;SKIP ALL THIS IF ALREADY HAVE DEFAULT NAME + TLNE M,TYPNLY ;IF TYPES ONLY, DON'T UPDATE NAMES + JRST XNAME + MOVE T,FILNAM + MOVEM T,LSTNAM ;REMEMBER LAST NAME +MD,< MOVEM T,DRWNAM > ;REMEMBER FOR PLOTS ALSO + HLLZ T,FILEXT + MOVEM T,LSTEXT +MD,< MOVEM T,DRWEXT > + MOVE D,FILPPN + MOVEM D,LSTPPN +MD,< MOVEM D,DRWPPN + LDB T,[POINT 11,FILDAT,23] + HRL T,FILDAT + LDB TT,[POINT 3,FILEXT,20] + DPB TT,[POINT 6,T,5] + MOVEM T,DRWDAT ;REMEMBER DATE LAST WRITTEN OF DRW FILE +>;MD + PUSHJ P,FILEUP ;AND UPDATE DISPLAY +XNAME: SETZM NEWBOD ;LIST OF NEW BODY POINTERS. + SETZM HASHP +MPC,< SETZM MXPADN ;CLEAR MAXIMUM PAD # SEEN > + MOVE A,[HASHP,,HASHP+1] ;CLEAR OUT HASH TABLES + BLT A,HASHB+LHASHB + MOVE A,[HASHP(TT)] + MOVEM A,PHASHP +MPC,< MOVE A,[HASHP2(TT)] + MOVEM A,PHASH2 +>;MPC + MOVE T,BID + MOVEM T,OLDBID + MOVEM T,MAXBID + MOVE T,PID + MOVEM T,OLDPID + MOVEM T,MAXPID + TRO VIRGIN ;ASSUME VIRGIN +MPC,< SKIPN PONPN2 >;MPC + SKIPE PONPNT + TRZ VIRGIN ;NOT VIRGIN + SKIPE DBODPN + TRZ VIRGIN + TRO MAKSET +MD,< + TLNN M,TYPNLY ;NOW, IF TYPNLY OR +>;MD + TRNE VIRGIN ;A VIRGIN + JRST [ TRZ MAKSET ;NO SET GETS MADE + JRST NOVSET] + SETZM LSTNAM ;FORGET NAME IF NOT VIRGIN! +MD,< DATE T, ;SET DATE AND TIME TO CURRENT + HRLZM T,DRWDAT + MSTIME T, + IDIVI T,=1000*=60 ;TO MINUTES + HRRM T,DRWDAT + SETZB T,DRWNAM + MOVSI T,EXTFIL + MOVEM T,DRWEXT + SETZ T, +NODEC,< DSKPPN T, > +DEC,< GETPPN T, > + MOVEM T,DRWPPN ;INIT PPN +>;MD +LAY,< SETZM SAVNAM > + PUSHJ P,FILEUP ;AND UPDATE THAT + TRNN MAKSET ;SHALL WE MAKE A SET? + JRST NOVSET ;NO, NO SET + SETZM DX1 + SETZM DY1 + SETZM DX3 + SETZM DY3 +NOVSET: PUSH P,CURSE + PUSH P,MODE +MPC,< + PUSH P,SID + TLNE SID,FRONT ;LET'S START ON FRONT + JRST ISFRNT + FSWITCH +ISFRNT: +>;MPC + PUSHJ P,RDFILE ;READ FILE! + SKIPE B,NEWBOD ;RETURN FREE STORAGE FROM NEWBOD LIST(IF ANY) + PUSHJ P,PUTFS + SETZM NEWBOD +MPC,< + POP P,T + EQV T,SID + JUMPL T,ISRITE ;ARE WE ON RIGHT SIDE? + FSWITCH +ISRITE: +>;MPC + ;READ CARD, FIX SET, FIX ID'S, FINISH UP + TRO MCHG!NEEDCL + TRZ INLIN!INMOV!STBOX ;MAKE SURE THESE ARE OFF + POP P,MODE + POP P,CURSE ;PUT CURSOR BACK WHERE IT WAS + TRNE MAKSET ;DID WE TRY TO MAKE A SET? + SKIPN DY3 ;YES, IS THERE ONE? + JRST NOVST1 + GETFS(T) + HRL TT,DY3 + HRR TT,SETPNT + MOVEM TT,(T) + HRRZM T,SETPNT + MOVE TT,DX1 + IDIV TT,DX3 +MPC,< ASH TT,-1 + IDIV TT,STPSIZ + IMUL TT,STPSIZ + ASH TT,1 +>;MPC +MD,< TRZ TT,1 > + HRLM TT,1(T) + MOVE TT,DY1 + IDIV TT,DX3 +MPC,< ASH TT,-1 + IDIV TT,STPSIZ + IMUL TT,STPSIZ + ASH TT,1 +>;MPC +MD,< TRZ TT,1 > + HRRM TT,1(T) + PUSH P,T + MOVEI T,SETM + PUSHJ P,CHNGMD ;GO TO SET MOVING MODE + POP P,T + PUSHJ P,SCLOSP ;FIND LAST POINTER, SET CLOSES, MOVE TO CENTER + PUSHJ P,DOSMOV + OUTSTR[ASCIZ/YOUR NEW FILE IS NOW A SET +AND YOU ARE MOVING IT! +/] +NOVST1: +MD,< SKIPE B,UTLIST + PUSHJ P,RELUTL ;RELEASE TYPE USE LIST +>;MD + SKIPN RDVER ;**RDVER + JRST ERCHK ;DO END CHECK + MOVSI T,-LHASHP +NOVST3: SKIPN A,HASHP(T) + JRST NOVST2 + HLRZ B,A + HLLI A, + EXCH A,PONPNT + HRRM A,(B) +NOVST2: AOBJN T,NOVST3 +MPC,< MOVSI T,-LHASHP +NOVST5: SKIPN A,HASHP2(T) + JRST NOVST4 + HLRZ B,A + HLLI A, + EXCH A,PONPN2 + HRRM A,(B) +NOVST4: AOBJN T,NOVST5 +>;MPC + TRNN VIRGIN ;IS THIS A VIRGIN + JRST NDOVIR ;NO, FIX NEWEST PIN ID'S + MOVE T,MAXBID ;YES, SET MAX AS LAST ASSIGNED + MOVEM T,BID + MOVE T,MAXPID + MOVEM T,PID + JRST ERCHK + +NDOVIR: MOVE T,OLDBID + MOVEM T,BID + MOVE T,OLDPID + MOVEM T,PID + PUSHJ P,REEID ;REASSIGN ID'S +ERCHK: +MPC,< PUSHJ P,CARDIO ;CHECK AND MAYBE READ CARD + SKIPE CRDNAM ;DID WE GET A CARD? + TLO M,CRDISP ;YES, DISPLAY IT! + PUSHJ P,MXPADP ;PRINT MAX PAD # IF BIG ENOUGH +>;MPC + RELEASE DAT, ;DONE WITH INPUT FILE +DEC,< MOVE T,RDVER ;**RDVER + TLNN M,TYPNLY ;SKIP IF ONLY READ TYPES + CAIL T,14 + JRST OFFOK + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/YOU SHOULD PROBABLY DO AN OFFALL! +/] +OFFOK: +>;DEC + TRNN VIRGIN + POPJ P, + TLNE NOINIT ;SUPPRESS CALL OF INIT MACRO? + JRST ERCHK ;YES + TRO TFLG ;FLAG TO CALL ONLY IF JUST READ IN + PUSHJ P,MACCAL ;NOTE WE ONLY INIT A VIRGIN + ASCIZ/INIT/ ;SETUP INIT MACRO FOR EXECUTION + POPJ P, + +MD,< +RELUTL: HLRZ A,(B) + PUSHJ P,PUTFS + SKIPE B,A + JRST RELUTL + SETZM UTLIST + POPJ P, +>;MD + + ;REEID - RE-ASSIGN ID'S + +REEID: SKIPE A,PONPNT + PUSHJ P,REEPNT +MPC,< SKIPE A,PONPN2 + PUSHJ P,REEPNT +>; + SKIPN A,DBODPN + POPJ P, +REEBOD: FETCH(TT,A,BID) + CAMG TT,OLDBID ;WAS THIS A NEW ONE? + JRST NOREEB + AOS TT,BID ;YES, ASSIGN NEW ID + STORE(TT,A,BID) +NOREEB: FETCH(A,A,BNXT) + JUMPN A,REEBOD + POPJ P, + +REEPNT: FETCH(TT,A,PBIT) ;MIGHT BE BPBIT + TRNE TT,ISPIN ;PINS USE BODY, DON'T DO THEM HERE + JRST NOREEP + FETCH(TT,A,PID) ;GET POINT ID + CAMG TT,OLDPID ;NEW POINT? + JRST NOREEP + AOS TT,PID ;YES, GET NEW ID + STORE(TT,A,PID) +NOREEP: FETCH(A,A,PNXT) + JUMPN A,REEPNT + POPJ P, + +MPC,< +MXPADQ: MOVE T,MXPADN + JRST MXPADR + +MXPADP: MOVE T,MXPADN + CAIG T,STDMAX ;BIGGER THAN STANDARD MAX? + POPJ P, ;NO +MXPADR: OUTSTR[ASCIZ/MAXIMUM PAD TYPE IS /] + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +/] + POPJ P, +>;MPC + ;READ VERSION NUMBER, LIBRARY SUBRS +GETVER: PUSHJ P,REDVER ;READ IO VERSION # + CAIN TTT,IOVER ;SAME AS CURRENT + POPJ P, + OUTSTR[ASCIZ/READING OLD IO VERSION # /] + MOVE T,TTT + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +/] + POPJ P, + +REDVER: PUSHJ P,WORDIN ;GET FIRST WORD OF FILE + TLNN TTT,-1 + JUMPN TTT,[CAIG TTT,IOVER ;DO WE KNOW ABOUT IT? + JRST NEWVER + OUTSTR[ASCIZ/I DON'T KNOW ABOUT THIS IO VERSION #! +/] + CAIL TTT,IOVER+10 ;REASONABLE TO TRY OUR HIGHEST? + JRST .+1 ;NO + MOVEI TTT,IOVER + JRST NEWVER] + AOS IOHD+2 + SOS IOHD+1 ;OLD BACKUP TO THIS WORD + SETZ TTT, ;AND USE IOVER=0 +NEWVER: MOVEM TTT,RDVER +MD,< CAIN TTT,BRDIOV ;**RDVER + POPJ P, +>;MD + PUSHJ P,RDNOM +MD,< PUSHJ P,RDBRD > + MOVE TTT,RDVER + POPJ P, + + SUBTTL READ LOCAL TYPES AND LIBRARY TYPES +;READ USED TYPE LIST, LIBRARY, AND LOCAL TYPES + +TYPIN: PUSHJ P,GETVER +MD,< PUSHJ P,DOLBTY ;READ LIBRARY AND LOCAL TYPES + TRNN FSTLIB ;At top level (reading drawing, not library)? + TDZA C,C ;NO, DON'T TURN ON MACRO BITS +>;MD ;ALWAYS SAVE IN PC + MOVSI C,MSAVE ;YES, PUT SAVE BIT ON SO IT WILL GO BACK OUT + TLO C,MACTMP ;MARK AS JUST READ IN + MOVE T,RDVER ;**RDVER + CAILE T,13 ;THESE DON'T HAVE MACROES IN THEM + JRST MACIN ;GET THEM + POPJ P, + + ; POSSIBLY READ LIST OF USED TYPES + +MD,< +DOLBTY: MOVE T,RDVER ;**RDVER + CAIGE T,3 + JRST RDTYP ;VERSIONS 3 AND HIGHER HAVE LIBRARIES + CAIGE T,13 ;DO WE HAVE LIST OF LIB TYPE USED? + JRST FRCLIB ;NO, FORCE MERGING IF ALREADY USED +;The drawing file has a list of bodies actually needed from libraries. + TRNE FSTLIB ;ARE WE AT TOP LEVEL (I.E. drawing)? + JRST RDLTYP ;YES, READ NAMES OF USED TYPES + PUSHJ P,SKPSTR ;NO, JUST SKIP THEM + JRST GETLIB + JRST .-2 + +;Read list of used types (that will actually appear in drawing) + +RDLTYP: SKIPE B,UTLIST + PUSHJ P,RELUTL + SETOM USEFLG ;FLAG USE LIST ACTIVE +RDLTY1: PUSHJ P,RSTRZ + JRST GETLIB + EXCH T,UTLIST + HRLM T,@UTLIST +;Now check if that type is already in some library we previously read, +; but maybe didn't get in completely + SKIPN C,BODPNT + JRST RDLTY1 +RDLTY2: FETCH(A,C,TNAM) + MOVE B,UTLIST ;NAME WE JUST READ + PUSHJ P,TXTMAT + JRST [ FETCH(C,C,TNXT) + JUMPN C,RDLTY2 + JRST RDLTY1] + FETCH(T,C,TYP1) ;All the way in? + JUMPN T,RDLTY1 ;Yes, don't need to go back to library then. + FETCH(A,C,TLIB) ;A type from a library? + JUMPE A,RDLTY1 ;No, there will be a replacement then. + HLRZ A,(A) ;SECOND WORD OF LIBRARY NAME BLOCK + MOVEI T,NEEDMR + IORM T,(A) ;TURN ON BIT SAYING WE NEED TO READ THIS LIBRARY AGAIN + JRST RDLTY1 + + ;READ LIBRARY(S) + +;We aren't sure which types we'll need, so read all extant libraries in completely. + +FRCLIB: SKIPN C,LIBLST + JRST GETLIB +FRCLB1: HLRZ A,(C) + MOVEI T,NEEDMR + IORM T,(A) ;FORCE MERGING OF ANY LIBRARIES USED IN THIS DWG + HRRZ C,(C) + JUMPN C,FRCLB1 + +;Read names of libraries for this drawing +GETLIB: PUSHJ P,WORDIN ;LIBRARY FILENAME + JUMPE TTT,RDTYP ;No more + GETFS (T) ;LIST OF LIBRARIES + MOVEM TTT,1(T) + MOVE B,TTT + GETFS (TT) + HRLZM TT,(T) + PUSHJ P,WORDIN ;EXT,,BITS + TRZ TTT,NEEDMR!TOPLVL + TRNE FSTLIB ;TOP LEVEL LIBRARY? + TRO TTT,TOPLVL ;YES + MOVEM TTT,(TT) + HLLZ C,TTT + PUSHJ P,WORDIN ;PPN + MOVEM TTT,1(TT) + MOVE D,TTT + EXCH T,LIBTMP ;LINK ON FRONT OF LIST + HRRM T,@LIBTMP + PUSHJ P,MAPLIB ;Map this library? + JRST GETLIB ;No, simple +;Map library, new name is in A + MOVE TT,LIBTMP ;THIS IS THE ENTRY WE JUST MADE + HLRZ A,(A) + HRRZ A,(A) + MOVE TTT,1(A) ;GET NEW NAME + MOVEM TTT,1(TT) + HLRZ TT,(TT) + HLRZ A,(A) + HLLZ TTT,(A) ;EXT + HLLM TTT,(TT) + MOVE TTT,1(A) ;PPN + MOVEM TTT,1(TT) + JRST GETLIB + + ;READ TYPES + +RDTYP: PUSHJ P,RDTYPX + JRST GOTYPS ;END OF TYPES + PUSHJ P,RDTYPY ;JUST READ TYPE, MAYBE NEED TO REPLACE? + JRST RDTYP + +GOTYPS: SKIPN E,LIBTMP + POPJ P, ;NO LIBRARIES TO DO OR WILL BE DONE HIGHER UP + +;Got local types, but also need library's types + + SETZM LIBTMP ;clear library-pending list for guys down under + PUSH P,FILNAM ;Save current file-specs + PUSH P,FILEXT + PUSH P,FILPPN +LIBIT: HRRZ T,(E) + PUSH P,T ;SAVE LINK TO NEXT LIB, IF ANY + MOVE B,1(E) + MOVEM B,FILNAM + HLRZ TT,(E) + HLLZ C,(TT) + MOVEM C,FILEXT + MOVE D,1(TT) + MOVEM D,FILPPN +;Do we already have the library in for some reason (at a higher level?) +LIBIT1: PUSHJ P,LNAMCK ;DO WE ALREADY HAVE THIS LIBRARY? + JRST [ HLRZ TT,(E) + FSTRET(E) + FSTRET(TT) + HRRZ TT,(T) ;GET FLAG BITS FROM FOUND LIBRARY + ; TRZN TT,NEEDMR ;NEED MERGE? + TRZA TT,NEEDMR ;****** TEMPORARY BUG FIX, ALWAYS RE-READ LIBRARY +;Problem probably is that the "needed" test fails if is needed at lower level +; but when the library gets in at the upper level, the usedlist for the lower call is gone +; The ALLFLG shouldn't really mean all. + JRST LIBIT2 ;NO, SKIP IT + HRRM TT,(T) ;MAKE SURE WE ONLY MERGE ONCE + MOVEM A,LIBNAM ;YES, STORE LIBRARY POINTER THAT'S ALREADY IN + PUSH P,ALLFLG ;YES, SAVE ALLFLG + SETOM ALLFLG ;We need more of this library, get all of types + JRST LIBIT3] + MOVEM E,LIBNAM ;POINTER TO LIBRARY DESCRIPTOR + PUSH P,ALLFLG ;SAVE STATE OF FLAG SAYING WE ARE JUST + ; GETTING THE REST OF SOME DEF'S +LIBIT3: PUSH P,0 ;SAVE CURRENT STATE OF FSTLIB + TRZ FSTLIB ;Any other libraries will no longer be first + AOS DEPTH + PUSHJ P,LIBRED ;Read type defs (may also recursively call libraries) + JRST LIBFAI + SOS DEPTH + POP P,T ;GET OLD STATE OF FSTLIB + TRNE T,FSTLIB + TRO FSTLIB ;BACK AT TOP LEVEL OF LIBRARIES + POP P,ALLFLG +LIBIT2: POP P,E + JUMPN E,LIBIT + +;Pop back to previous file, re-read past type definitions, to setup +; for bodies, points, sets. + + TRNE FSTLIB ;BACK AT TOP LEVEL OF LIBRARIES? + SETZM LIBNAM ;YES, BODIES HERE DON'T GET LIBRARY POINTER + POP P,FILPPN + POP P,FILEXT + POP P,FILNAM + PUSH P,FILPPN + LOOKUP DAT,FILNAM + JRST [ OUTSTR[ASCIZ/FILE I WAS READING WENT AWAY! +/] + PUSHJ P,FUCKUP + MOVE P,PERRSAV + POPJ P,] ;LOSE BIG + POP P,FILPPN ;RESTORE, LOOKUP CLOBBERS IT + PUSHJ P,REDVER ;AVOID TYPEOUT + MOVE T,RDVER ;**RDVER + CAIGE T,13 + JRST SKPTY1 + PUSHJ P,SKPSTR ;SKIP LIB TYPE NAMES AT FRONT + JRST SKPTY1 + JRST .-2 + +LIBFAI: SOS DEPTH + POP P,T ;GET OLD STATE OF FSTLIB + TRNE T,FSTLIB + TRO FSTLIB ;BACK AT TOP LEVEL OF LIBRARIES + POP P,ALLFLG + OUTSTR[ASCIZ/LIKE TO TRY ANOTHER LIBRARY /] + MOVSI T,EXTLIB + PUSHJ P,SETNAM + JRST [ MOVE E,LIBNAM ;HE GAVE UP + HLRZ TT,(E) + FSTRET(E) + FSTRET(TT) + JRST LIBIT2] ;SKIP THIS LIBRARY + MOVE E,LIBNAM ;UPDATE SAVED NAME + HLRZ TT,(E) + MOVE B,FILNAM + MOVEM B,1(E) + HLLZ C,FILEXT + HLLM C,(TT) + MOVE D,FILPPN + MOVEM D,1(TT) + JRST LIBIT1 ;TRY LIBRARY AGAIN + + ;SKIP OVER LOCAL TYPES TO MACRO DEFS IN .DRW FILE + +SKPTY1: PUSHJ P,WORDIN ;SKIP LIBRARY FILENAMES + JUMPE TTT,SKPTY2 + PUSHJ P,WORDIN + PUSHJ P,WORDIN + JRST SKPTY1 + +SKPTY2: PUSHJ P,SKPSTR ;SKIP BODY NAME + POPJ P, ;END OF BODY DEFS + MOVE T,RDVER + CAIGE T,10 ;**RDVER + JRST SKPTY3 ;NO DIP TYPE NAMES! + CAIGE T,23 ;NOT HERE FOR .GE.23 + PUSHJ P,SKPSTR ;SKIP DIP TYPE NAME + JFCL + CAIL T,27 ;**RDVER + PUSHJ P,SKPSTR ;SKIP PACKAGE NAME + JFCL + CAIL T,13 ;**RDVER DO WE HAVE BITS,,UNUSED? + PUSHJ P,WORDIN ;YES, SKIP IT + CAIGE T,12 ;**RDVER DO WE HAVE DEF OFFSET + JRST SKPTY3 ;NO + PUSHJ P,WORDIN ;YES, GET IT + CAILE T,23 ;**RDVER + PUSHJ P,WORDIN ;SKIP CHAR OFFSET IF THERE +SKPTY3: PUSHJ P,WORDIN + CAIN TTT,400000 + JRST SKPTY4 + PUSHJ P,WORDIN + CAIL T,17 + PUSHJ P,WORDIN ;SKIP NEW WORD + JRST SKPTY3 + +SKPTY4: PUSHJ P,WORDIN + CAIE TTT,400000 + JRST SKPTY4 + MOVE C,RDVER + CAIL C,23 + JRST SKPTY6 ;**RDVER +SKPTY5: PUSHJ P,WORDIN + CAIN TTT,400000 + JRST SKPTY2 + CAIGE C,2 ;**RDVER + PUSHJ P,WORDIN + PUSHJ P,WORDIN + CAILE C,3 ;**RDVER + PUSHJ P,WORDIN + PUSHJ P,SKPSTR + JFCL + JRST SKPTY5 + +SKPTY6: PUSHJ P,SKPPRP + JRST SKPTY2 + +SKPPRP: PUSHJ P,SKPSTR + POPJ P, + PUSHJ P,SKPSTR + JFCL + PUSHJ P,WORDIN + PUSHJ P,WORDIN + PUSHJ P,WORDIN + JRST SKPPRP + ;LIBRARY SUBRS +SETMAP: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/OLD LIBRARY /] + MOVSI T,EXTLIB + PUSHJ P,SETNAM + POPJ P, + ENTPPN + MOVE B,FILNAM + HLLZ C,FILEXT + MOVE D,FILPPN + PUSHJ P,MAPLIB ;TRY TO FIND IT + CAIA + JRST GOTMAP + GETFS(A) ;LIB MAP LIST ?? + GETFS(T) + HRL T,MAPLST + MOVSM T,(A) + MOVEM A,MAPLST + MOVEM B,1(A) + HLLZM C,(T) + MOVEM D,1(T) +GOTMAP: HRLM A,(P) + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW LIBRARY /] + MOVSI T,EXTLIB + PUSHJ P,SETNAM + JRST MAPKIL + ENTPPN + HLRZ A,(P) + HLRZ T,(A) + HRRZ TT,(T) + JUMPE TT,NOMAPD + HLRZ TTT,(TT) + FSTRET(TTT) + FSTRET(TT) +NOMAPD: GETFS(TT) + HRRM TT,(T) + GETFS(TTT) + HRLZM TTT,(TT) + MOVE T,FILNAM + MOVEM T,1(TT) + HLLZ T,FILEXT + MOVEM T,(TTT) + MOVE T,FILPPN + MOVEM T,1(TTT) + POPJ P, + +MAPKIL: HLRZ A,(P) + MOVEI T,MAPLST + JRST MAPKL1 + +MAPKL2: CAIN T,(A) + JRST MAPKL3 +MAPKL1: MOVE TT,T + HRRZ T,(T) + JUMPN T,MAPKL2 + PUSHJ P,FUCKUP + POPJ P, + +MAPKL3: HRRZ T,(A) + HRRM T,(TT) +MAPKL0: HLRZ T,(A) + HRRZ TT,(T) + FSTRET(T) + FSTRET(A) + JUMPE TT,CPOPJ + HLRZ TTT,(TT) + FSTRET(TT) + FSTRET(TTT) + POPJ P, + +CLRMAP: SKIPN B,MAPLST + POPJ P, +CLRMP1: MOVE A,B + HRRZ B,(B) + PUSHJ P,MAPKL0 + JUMPN B,CLRMP1 + SETZM MAPLST + POPJ P, + +MAPLIB: SKIPN A,MAPLST + POPJ P, +MAPLB1: CAME B,1(A) + JRST MAPLB2 + HLRZ T,(A) + CAME D,1(T) + JRST MAPLB2 + HLLZ TT,(T) + CAMN TT,C + JRST CPOPJ1 +MAPLB2: HRRZ A,(A) + JUMPN A,MAPLB1 + POPJ P, + +;LNAMCK - Check if library (A) is already around (skips if not) + +LNAMCK: SKIPN A,LIBLST + JRST CPOPJ1 +NXTLB1: CAME B,1(A) + JRST NXTLIB + HLRZ T,(A) + HLLZ TT,(T) + CAMN C,TT + CAME D,1(T) + JRST NXTLIB + POPJ P, + +NXTLIB: HRRZ A,(A) + JUMPN A,NXTLB1 + JRST CPOPJ1 + +LIBUSE: OUTSTR[ASCIZ/LIBRARY NAME CONFLICT, CHOOSE ANOTHER! +/] + POPJ P, + + ;HERE IS WHERE WE READ A NEW LIBRARY IN! +DOLIB: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/LIBRARY /] + MOVSI T,EXTLIB + PUSHJ P,SETNAM + POPJ P, ;LET HIM OUT THIS WAY + INIT DAT,10 + 'DSK ' + IOHD + JRST [ OUTSTR [ASCIZ/CAN'T GET DISK! +/] + POPJ P,] +DEC,< + SKIPN D,FILPPN ;0 WILL CONFUSE US + PUSHJ P,[LOOKUP DAT,FILNAM + JRST NOLUCK + MOVE A,[3,,B] + MOVEI B,DAT + PATH A, ;PATH UUO TO GET REAL PPN + NOLUCK: DSKPPN D, ;PATH UUO FAILED, GET OUR PPN + SETZM FILNAM+2 + CLOSE DAT, + MOVEM D,FILPPN + POPJ P,] +>;DEC +NODEC,< MOVE D,FILPPN > + MOVE B,FILNAM + HLLZ C,FILEXT + CAMN B,LSTNAM + CAME C,[EXTFIL,,0] + JRST NAMOK + CAME D,LSTPPN +NAMOK: PUSHJ P,LNAMCK + JRST LIBUSE + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + GETFS(A) + MOVEM A,LIBNAM ;CURRENT LIBRARY NAME + MOVE T,FILNAM + MOVEM T,1(A) + GETFS(T) + HRLZM T,(A) + HLLZ TT,FILEXT + HRRI TT,TOPLVL ;SET AS TOP LEVEL LIBRARY + MOVEM TT,(T) + MOVE TT,FILPPN + MOVEM TT,1(T) + TLO M,TYPREP!TYPNLY ;REPLACE AUTOMATICALLY AND TYPES ONLY + TRZ FSTLIB ;inside library, not drawing + SETOM USEFLG ;ENABLE NON-READIN STUFF + SETZM ALLFLG ;READING LIBRARY AFRESH + SETZM LIBTMP ;CLEAR THIS FOR LIBRARY READING + SKIPE B,UTLIST + PUSHJ P,RELUTL ;RELEASE ALL USE NAMES (WILL BE CAUGHT AT RDTYPY) + PUSHJ P,CLBMRK ;CLEAR NEEDMR IN LIBLST + SETZM DEPTH + AOS DEPTH + PUSHJ P,LIBRED + CAIA + JRST DOLIB1 + MOVE A,LIBNAM + HLRZ T,(A) + FSTRET(A) + FSTRET(T) +DOLIB1: RELEASE DAT, + POPJ P, + + ;LIBRED +;SKIP IF SUCCESSFUL + +LIBRED: MOVE T,DEPTH + OUTSTR[ASCIZ/ /] + SOJG T,.-1 + OUTSTR[ASCIZ/LIBRARY /] + MOVEI A,FILNAM + JSR FPRINT ;PRINT LIBRARY NAME + MOVE T,FILPPN + LOOKUP DAT,FILNAM ;GET LIBRARY FILE + JRST LOOKER +DEC,< JSR DAT,LOOKCK > +NODEC,< MOVEM T,FILPPN > + OUTSTR[ASCIZ/ +/] + AOS (P) ;SUCCESSFUL LOOKUP +;If new library we haven't heard of yet, add to library-in-list + SKIPE ALLFLG + JRST TYPIN ;If just re-reading, already have this on library-in-list + MOVE T,LIBNAM ;New library +DEC,< HLRZ TT,(T) + MOVE TTT,FILPPN + MOVEM TTT,1(TT) ;STORE REAL PPN +>;DEC + EXCH T,LIBLST + HRRM T,@LIBLST + JRST TYPIN + + SUBTTL EXTRACT TYPE FROM FILE + +;GET A TYPE FROM LIBRARY +;A = POINTER TO HEADER BLOCK OF TYPE, PREVIOUS IN LEFT HALF +BDYGET: FETCH(T,A,TLIB) ;LIBRARY BLOCK POINTER + JUMPE T,[OUTSTR[ASCIZ/NON-LIBRARY BODY NOT FULLY READ IN! +/] + JRST FUCKUP] + MOVE TTT,1(T) + MOVEM TTT,FILNAM + HLRZ T,(T) + MOVE TTT,(T) + HLLZM TTT,FILEXT + MOVE TTT,1(T) + MOVEM TTT,FILPPN + FETCH(T,A,TNXT) + HLRZ TT,A + STORE(T,TT,TNXT) ;TEMPORARILY LINK THIS ONE OUT + FETCH(T,A,TNAM) + MOVEM T,LIBTMP ;STORE BODY NAME HERE + PUSHJ P,PUSHIT ;MAKE THE WORLD SAFE FOR HIGHER UPS + PUSHJ P,DORBDY + JRST GTBDYE + PUSHJ P,POPIT + MOVE C,A ;OLD BODY BLOCK + MOVE A,BODPNT ;NEW BODY IS HERE (I HOPE). + FETCH(T,C,TLIB) ;LIBRARY POINTER + STORE(T,A,TLIB) ;STORE INTO BODY JUST READ + MOVE B,C + PUSHJ P,PUTFS ;NOW GIVE BACK HEADER BLOCK, AND NAME + JRST CPOPJ1 ;GIVE SUCCESS RETURN + +GTBDYE: PUSHJ P,POPIT + HLRZ TT,A + STORE(A,TT,TNXT) ;LINK BACK IN + OUTSTR[ASCIZ/SORRY,/] + MOVE T,LIBTMP + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ NO LONGER IN LIBRARY! +/] + POPJ P, + + ;RDBODY - XGETBODY + +RDBODY: MOVEI T,1 + LSH T,@MODE + TDNE T,[ALLEDM!1EDTAM] ;CANNOT BE IN EDIT MODE!!! + JRST PERRET + TRZ INMOV + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TYPE BODY NAME +/] + PUSHJ P,TREADU + POPJ P, ;ALTMODE + POPJ P, ;NULL + MOVEM B,LIBTMP ;SAVE HERE TEMPORARILY + MOVSI T,EXTFIL + PUSHJ P,SETNAM ;READ FROM DRAW FILE + JRST RDLEAV ;LET HIM OUT + PUSHJ P,DORBDY + JRST RDLEV1 + JRST RDLEV2 + +RDLEV1: OUTSTR[ASCIZ/SORRY,/] + MOVE T,LIBTMP + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ NOT FOUND! +/] +RDLEV2: RELEASE DAT, +RDLEAV: MOVE B,LIBTMP + JRST PUTFS + + ;DORBDY - READ BODY FROM FILE + +DORBDY: INIT DAT,10 + 'DSK ' + IOHD + JRST [ OUTSTR [ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + OUTSTR[ASCIZ/SEARCHING FOR /] + MOVE T,LIBTMP + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ IN /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > + OUTSTR[ASCIZ/ +/] + SETZM USEFLG ;MAKE SURE IT IS READ IN + SETZM ALLFLG + SETZM LIBNAM ;CLEAR LIBRARY NAME + TLZ M,TYPREP ;DON'T REPLACE AUTOMATICALLY + TRZ FSTLIB + MOVEM P,PERRSAV ;RETURN UP FROM HERE + PUSHJ P,GETVER + MOVE T,RDVER + CAIGE T,3 ;**RDVER + JRST RDTYPZ ;VERSIONS 3 AND ABOVE HAVE LIBRARIES + CAIGE T,13 ;**RDVER + JRST RDTYPC ;NO LIST OF LIB TYPES TO SKIP + PUSHJ P,SKPSTR + JRST RDTYPC + JRST .-2 + +RDTYPC: PUSHJ P,WORDIN + JUMPE TTT,RDTYPZ ;SKIP OVER LIBRARY NAMES + PUSHJ P,WORDIN + PUSHJ P,WORDIN + JRST RDTYPC + +RDTYPZ: PUSHJ P,RDTYPX + POPJ P, + MOVE A,LIBTMP + MOVE B,STRING + PUSHJ P,TXTMAT ;COMPARE NAME HE TYPED WITH BODY NAME + JRST [ PUSHJ P,RELTYP ;NO, RELEASE TYPE + JRST RDTYPZ] ;TRY ANOTHER + PUSHJ P,RDTYPY ;TRY TO GET TYPE INTO STRUCTURE + TRO MCHG!NEEDCL ;FOUND, COULD BE REPLACING OLD VERSION, SO UPDATE SCREEN + JRST CPOPJ1 + +CLBMRK: SKIPN T,LIBLST + POPJ P, + MOVEI TT,NEEDMR +CLBMR1: HLRZ TTT,(T) + ANDCAM TT,(TTT) + HRRZ T,(T) + JUMPN T,CLBMR1 + POPJ P, + SUBTTL READ TYPES + +RDTYPX: PUSHJ P,RSTRZ ;READ TYPE NAME + POPJ P, ;DONE WITH TYPES! + MOVEM T,STRING ;SAVE NAME HERE + SETZM DEFOFF ;CLEAR DIP TYPE POINTER, DEF OFFSET + SETZM ODIPTYP + SETZM DEFBTS ;AND BITS,,UNUSED + MOVE TT,RDVER ;**RDVER + CAIGE TT,10 ;DOES THIS FILE HAVE DIP TYPE? + JRST NODTYP + CAIL TT,23 + JRST ISTYPN ;**RDVER + PUSHJ P,RSTRZ ;READ DIP TYPE + SETZ T, ;NULL + MOVEM T,ODIPTYP +ISTYPN: SETZ TTT, ;CLEAR DEF OFFSET + SETZM PACK + MOVE TT,RDVER + CAIGE TT,12 ;**RDVER + JRST NODTYP + CAIGE TT,13 ;**RDVER + JRST NODBTS + CAIGE TT,27 ;**RDVER + JRST NOPAK + PUSHJ P,RSTRZ + SETZ T, + MOVEM T,PACK +NOPAK: PUSHJ P,WORDIN ;READ BITS,,UNUSED + TLZ TTT,FOUNDL!DTMP1 ;CLEAR MARK BITS ON INPUT + MOVEM TTT,DEFBTS +NODBTS: PUSHJ P,WORDIN ;READ DEFAULT OFFSET + MOVEM TTT,DEFOFF + MOVEI TTT,400000 + MOVE T,RDVER + CAILE T,23 ;**RDVER + PUSHJ P,WORDIN + MOVEM TTT,DEFOF1 + + SUBTTL READIN PINS +;FALLS THRU + +NODTYP: SETZM PINS ;INITIALIZE PIN LIST. + MOVEI T,PINS ;DUMP IN HERE FIRST +RDPIN2: PUSHJ P,WORDIN ;GET A PIN LOC +RDPINS: CAIN TTT,400000 ;END OF PINS? + JRST RPINDN ;YES + MOVE A,RDVER + CAIG A,10 ;**RDVER + JRST [ ADD TTT,[PXOFF,,PYOFF] + AND TTT,[PXMASK,,PYMASK] + JRST .+1] + PUSHJ P,MAKTPN ;GET BLOCK FOR TYPE PIN IN TT + STORE(TT,T,TPNX) ;LINK AT END OF LIST + MOVE T,TT ;NEW END OF LIST + CAIL A,17 + JRST NWPND1 ;**RDVER THIS IS SIMPLE + PUSH P,TTT ; (OLD VERSION STUFF) + PXY(TTT) + STORE(TTT,T,TPXY) +DEC,< LDB TTT,[POINT 2,(P),5] ;OLD PIN TYPE BITS + CAIN TTT,1 + TLO TTT,ASSH + CAIN TTT,2 + TLO TTT,ASSL + HLRZS TTT + STORE(TTT,T,TPBIT) ;SET H,L BITS FOR DEC +>;DEC + POP P,TTT + NXY(TTT) + LSH TTT,=17 + TRZE TTT,400000 + PUSHJ P,NIPCOP + HLRZS TTT + STORE(TTT,T,TPPOS) ;PIN POSITION + PUSHJ P,WORDIN + STORE(TTT,T,TPID) ;PIN ID + TRZE TTT,700000 + TRZ TTT,77000 ;MAKE (.GE.64) NOT BUSSED THROUGH + PUSH P,TTT + ANDI TTT,777 + STORE(TTT,T,TPNAM) ;PIN NAME + HRRZ TTT,(P) + TRNN TTT,777000 + TDZA TTT,TTT + MOVEI TTT,BUSSED + SETBIT(<(TTT)>,TT,T,TPBIT) + POP P,TTT + MOVE TT,RDVER +DEC,< TLNE TTT,1 ;MARKER BIT ON? + CAIG TT,10 ;**RDVER + CAIA + HLLM TTT,PINS ;FLAG DIP OFFSET IS FIRST PIN +>;DEC + CAILE TT,2 ;**RDVER + JRST RDPIN2 +RDPIN1: PUSHJ P,WORDIN + HLRZ TT,TTT + CAIE TT,400000 + JRST RDPINS + JRST RDPIN1 + + ;OLD FORMAT NIPPLE + +NIPCOP: MOVS TTT,TTT ;GET IN RH FOR INDEX + TRZ TTT,777770 ;AVOID CONFUSING GARBAGE + MOVE A,NXYTAB(TTT) ;GET OFFSET FOR NIPPLE BIT + DPB A,[POINT YOFFW,TTT,YOFFB] + HLRZ A,A + DPB A,[POINT XOFFW,TTT,XOFFB] + MOVS TTT,TTT + POPJ P, + +DEC, +NODEC, + +NXYTAB: 0,,NIPOFF + 0,,NIPOFF + -NIPOFF,,0 + -NIPOFF,,0 + 0,,-NIPOFF + 0,,-NIPOFF + NIPOFF,,0 + NIPOFF,,0 + +NWPND1: STORE(TTT,T,TPXY) + PUSHJ P,WORDIN + STORE(TTT,T,TPID) ;PINID + TLZ TTT,FOUNDD ;CLEAR MARK BIT + HLRZS TTT + STORE(TTT,T,TPBIT) ;BITS + PUSHJ P,WORDIN + CAIGE A,20 ;NEW PIN POS? + TLZN TTT,400000 ;NO, CLEAR NIPPLE BIT + CAIA + PUSHJ P,NIPCOP + STORE(TTT,T,TPNAM) + HLRZS TTT + STORE(TTT,T,TPPOS) + JRST RDPIN2 + + SUBTTL READ DISPLAY LINES FOR TYPE + +RPINDN: SETZM LINES ;INITIALIZE LINES + MOVEI T,LINES ;DUMP HERE FIRST +RDLINS: PUSHJ P,WORDIN ;GET A POINT + CAIN TTT,400000 ;DONE? + JRST RLINDN ;YES + GETFS(TT) ;GET A BLOCK FOR HIM + MOVEM TTT,1(TT) ;STORE LOC + SETZM (TT) ;CLEAR LINK WORD + MOVEM TT,(T) ;LINK ON END OF LIST + MOVE T,TT ;NEW END + JRST RDLINS ;GET SOME MORE + + SUBTTL READ BODY TEXT - OLD IOVER FORMAT + +RLINDN: SETZM BTEXT ;INITIALIZE BODY TEXT LIST + MOVE C,RDVER ;GET IOVERSION # + CAIL C,23 ;**RDVER + JRST RBTXTN + MOVEI T,BTEXT ;DUMP FIRST POINTER HERE +RBTEXT: PUSHJ P,WORDIN ;GET LOC OF TEXT + CAIN TTT,400000 ;DONE? + JRST BTXTDN ;YES + PUSHJ P,MAKTXT ;MAKE TEXT BLOCK + TLZ TTT,1 ;CLEAR MARK BIT + TRO TTT,1 ;SET AUTO OFFSET BIT FOR OLD FORMAT + STORE(TTT,TT,TXXY) ;SAVE LOC + STORE(TT,T,TXNXT) ;LINK ONTO LIST + MOVEM T,LOSEPT ;SAVE OLD END IN CASE THIS STRING LOSES + CAIGE C,2 ;**RDVER + PUSHJ P,WORDIN ;SKIP REL VECT FROM OLD VERSIONS + PUSHJ P,WORDIN ;GET LINES, CHARS, AND SIZE + CAIGE C,4 ;**RDVER + TRZN TTT,10 ;OLD VERSIONS INDICATE VERT HERE + CAIA + TRO TTT,400000 ;MARK VERT FOR OLD VERSIONS + HRRZ A,TTT + HRRZ B,A + ANDI B,377777 + CAILE B,CSIZES ;LEGAL CHAR SIZE? + JRST [ OUTSTR[ASCIZ/ILLEGAL CHARACTER SIZE READ FOR BODY TEXT. +WILL USE STANDARD TEXT SIZE INSTEAD. +/] + TRZ A,377777 + TRO A,@STDBIG + JRST .+1] + CAILE C,3 ;**RDVER + JRST GETCON + LDB B,[POINT 9,TTT,8] ;GET # OF CHARS + LDB D,[POINT 9,TTT,17] ;GET # OF LINES-1 + SUBI D,1 + ANDI TTT,377777 + LSH TTT,2 ;MAKE IT SCREEN OFFSET + IMUL B,TTT + LSH TTT,1 ;TIMES 2 + IMUL TTT,D + MOVNS B + HRL TTT,B + TRNN A,400000 ;WAS IT VERT? + JRST GOTCON + PUSH P,F + EXCH T,TTT + MOVEI F,1 + PUSHJ P,ORIENT + POP P,F + EXCH T,TTT + JRST GOTCON +GETCON: PUSHJ P,WORDIN ;READ CONSTANT OFFSET +GOTCON: STORE(TTT,TT,TXOFF) ;STORE REL VECT + HRLM A,(P) ;TEXT SIZE + PUSHJ P,RSTRZ ;READ TEXT + JRST [ RETBLK(TT,TEXT) + MOVE T,LOSEPT + CLEAR(T,TXNXT) + JRST RBTEXT] + HLRZ A,(P) + HRLM A,(T) ;SAVE SIZE IN FIRST WORD OF STRING + STORE(T,TT,TXVAL) ;SAVE TEXT + MOVE T,TT ;GET END OF LIST INTO T + JRST RBTEXT ;ANOTHER ONE + + SUBTTL READ BODY'S PROPERTIES - NEW IOVER FORMAT + +RBTXTN: PUSHJ P,PROPIN + JRST BTXTDN + +PROPIN: PUSHJ P,RSTRZ ;TEXT VALUE + POPJ P, + PUSHJ P,MAKTXT ;CONS BLOCK + STORE(T,TT,TXVAL) + EXCH TT,BTEXT ;ADD TO HEAD OF LIST + HRRM TT,@BTEXT + PUSHJ P,RSTRZ ;PROPERTY NAME (OR 0) + SETZ T, ; NO ASCIZ, NULL PROPERTY IS JUST TEXT + MOVE TT,BTEXT ;GET TEXT BLOCK + STORE(T,TT,TXNAM) + PUSHJ P,WORDIN ;TEXT SIZE + FETCH(T,TT,TXVAL) + HRLM TTT,(T) + PUSHJ P,WORDIN + TLZ TTT,1 ;CLEAR MARK BIT ON INPUT + STORE(TTT,TT,TXXY) ;X,Y LOCATION + PUSHJ P,WORDIN + STORE(TTT,TT,TXOFF) + JRST PROPIN +SUBTTL + ;PATCHUP OLD RDVER DIPTYPE FORMAT + +BTXTDN: SKIPN T,ODIPTYP ;ANY OLD FORMAT DIPTYPE? + JRST NODPTY ;NO + PUSHJ P,MAKTXT + MOVEI TTT,1 + STORE(TTT,TT,TXXY) ;INITIALIZE TO AUTO OFFSET + STORE(T,TT,TXVAL) + EXCH TT,BTEXT + HRRM TT,@BTEXT + MOVEI TT,[ASCIZ/DIPTYPE/] + PUSHJ P,ASCCOP + MOVE A,BTEXT + STORE(T,A,TXNAM) + PUSHJ P,EDTTZA ;DO TEXT OFFSETTING + + ;BUILD TYPE DEFINITION + +NODPTY: PUSHJ P,MAKTYP ;GET NEW TYPE PTR IN T + MOVE T,TT + MOVEM TT,TYPE + +DEC,< SKIPE TT,PINS + TLNN TT,1 ;DIP OFFSET SEEN? + JRST GOTCO1 ;NO + MOVE TTT,1(TT) ;GET OFFSET + MOVEM TTT,DEFOFF ;AND STO IT HERE + HRRZ TTT,(TT) + MOVEM TTT,PINS + FSTRET(TT) +GOTCO1: +>;DEC + MOVE TTT,DEFOFF ;DEF LOC OFFSET + STORE (TTT,T,TXY) + MOVE TTT,DEFBTS ;BITS,,UNUSED + STORE (TTT,T,TBIT) + MOVE TTT,DEFOF1 + CAIN TTT,400000 + JRST NDLCOF + MOVEI TTT,-1+ADDR(T,TOXY) + STORE (TTT,T,TYP3) ;SETUP DUMMY PTR IF DEFAULT CHAR OFFSET + MOVE TT,DEFOF1 + STORE (TT,T,TOXY) +NDLCOF: MOVE TT,PINS + STORE (TT,T,TPIN) ;LINK IN PINS + MOVE TT,LINES + STORE (TT,T,TLIN) ;LINK IN LINES + MOVE TT,BTEXT + STORE (TT,T,TPROP) ;LINK IN BTEXT + HRRZ TT,STRING ;TYPE NAME + STORE (TT,T,TNAM) + MOVE TT,LIBNAM ;YES, GET POINTER TO NAME BLOCK + STORE (TT,T,TLIB) + MOVE T,PACK + JUMPE T,NPKCOD + PUSHJ P,MATPAK + JRST [ MOVE T,STRING + PUSHJ P,OUTTXT + OUTSTR [ASCIZ / HAS BAD PACKAGE /] + MOVE T,PACK + PUSHJ P,OUTTCR + SETZ A, + JRST .+1] + MOVE T,TYPE + STORE(A,T,TPAK) + MOVE B,PACK + PUSHJ P,PUTFS +NPKCOD: MOVE A,TYPE + PUSHJ P,CMPTYP ;COMPILE ANY SPECIAL PROPS IN TYPE + JRST CPOPJ1 ;SUCCESS RETURN + + SUBTTL CHECK IF TYPE EXISTS, REPLACE MAYBE +RDTYPY: MOVE T,STRING ;ARG IN T + PUSHJ P,TNAME ;DOES NAME ALREADY EXIST? + JRST TYPEXI ;YES + MOVE T,TYPE ;NO, NEW TYPE TO ENTER + MOVE TT,BODPNT + STORE(TT,T,TNXT) ;LINK TYPE LIST TO THIS TYPE + MOVEM T,BODPNT ;MAKE THIS TYPE THE FIRST + +;CHECK IF THIS BODY IS USED, +; IF NOT, RELEASE MOST OF THE STORAGE TO SAVE SPACE +; IF USED TYP1 CONTAINS DUMMY POINTER, AND THIS IS COMPLETE BLOCK +; IF NOT USED, TYP1 IS 0, AND THIS IS GETFS BLOCK, ONLY TNAM,TLIB,TNXT + +CKUBDY: SKIPN USEFLG ;DO WE HAVE THE USE FEATURE + POPJ P, ;NO, KEEP ENTIRE DEFINITION + MOVE T,TYPE + FETCH (TT,T,TLIB) + JUMPE TT,CPOPJ ;IF NOT LIBRARY BODY, KEEP IT ALL IN + MOVE C,STRING + PUSHJ P,USETYP ;WILL WE USE TYPE? + POPJ P, ;YES + MOVE C,TYPE + GETBLK(T,STYP) ;SHORT TYPE ABBREVIATED BLOCK + CLEAR(T,SYP1) ;MARK AS SUCH + FETCH(TT,C,TLIB) ;COPY LIB + STORE(TT,T,SLIB) + FETCH(TT,C,TNAM) ;COPY TYPE NAME + STORE(TT,T,SNAM) + CLEAR(C,TNAM) ;CLEAR OLD PTR, SO WON'T RECLAIM AT TYPREL +;Patch out old type block + MOVEI TT,BODPNT-V.TNXT +CKUBD1: FETCH(TTT,TT,TNXT) ;get previous pointer + CAME TTT,C ;PREV  C ? + JRST [ SKIPE TT,TTT + JRST CKUBD1 + PUSHJ P,FUCKUP + MOVE TT,BODPNT + STORE(TT,T,TNXT) + MOVEM T,BODPNT + MOVEM T,TYPE + POPJ P,] + STORE(T,TT,TNXT) ;PREV  T + FETCH(TTT,C,TNXT) ;T  next + STORE(TTT,T,SNXT) + MOVEM T,TYPE + MOVE A,C + JRST TYPREL ;GIVE BACK OLD TYPE + +USETYP: SKIPN D,UTLIST ;ANY USE LIST? + JRST CPOPJ1 ;NOT USED +USETY1: MOVE A,D + MOVE B,C + PUSHJ P,TXTMAT + CAIA + POPJ P, ;MATCH, WILL BE USED + HLRZ D,(D) + JUMPN D,USETY1 + JRST CPOPJ1 ;NOT USED AT ALL + +;TYPE EXISTS, MAYBE REPLACE WITH DEF JUST READ IN + +TYPEXI: MOVEM C,OLDTYP ;SAVE THIS IN CASE WE WILL REPLACE + MOVE A,TYPE + MOVEM A,NEWTYP + SKIPN ALLFLG ;Re-reading, trying to get all of def? + JRST TYPEXJ ;NO, DO REG. THING + FETCH(T,C,TYP1) ;DATA POINTER FOR TYPE - ALL IN? + JUMPN T,RELTYP ;YES, SKIP IT COMPLETELY + JRST NOREPB ;IF NOT ALL IN, REPLACE WITH FULL DEF + +TYPEXJ: TLNE M,TYPREP + JRST AUTORP + TLNE M,DSKACT!MACACT + JRST NOASKM + OUTSTR[ASCIZ/SHALL I REPLACE /] + MOVE B,OLDTYP + PUSHJ P,OUTIT + OUTSTR[ASCIZ/ WITH /] + MOVE B,NEWTYP + PUSHJ P,OUTIT +NOASKM: PUSHJ P,YORN + JRST RELTYP + JRST RELTYP + JRST GETMOD + +RELTYP: MOVE A,TYPE + JRST TYPREL ;RELEASE FREE STORAGE FOR THIS TYPE + +;GET REPLACEMENT MODE + +GETMOD: MOVE T,OLDTYP + FETCH(T,T,TYP1) + JUMPE T,NOREPB ;DON'T HAVE TO REPLACE IF NOT USED (NOT IN) + PUSHJ P,REPST1 ;SETUP CORRESPONDENCE + JRST RELTYP ;GIVE UP! +DOREP: PUSHJ P,REPLOP + +;DELETE OLD TYPE BLOCK FROM LIST, ADDING NEW + +NOREPB: MOVEI A,BODPNT-V.TNXT + JRST FNDTP1 +FNDTYP: CAMN A,OLDTYP ;HERE'S WHERE OLD ONE IS + JRST FOUND +FNDTP1: MOVE B,A + FETCH(A,A,TNXT) + JUMPN A,FNDTYP + PUSHJ P,FUCKUP + POPJ P, + +FOUND: MOVE C,TYPE + STORE (C,B,TNXT) ;PREV  NEW + FETCH (B,A,TNXT) ;OLD TNXT + STORE (B,C,TNXT) ;  NEW TNXT + FETCH(T,A,TYP1) ;WAS USED? + JUMPN T,TYPREL ;YES, JUST RELEASE STG FROM OLD + PUSHJ P,TYPREL + JRST CKUBDY ;IF WASN'T USED, CHECK IF NEW TYPE IS USED + +AUTORP: MOVE B,OLDTYP + PUSHJ P,OUTIT + OUTSTR[ASCIZ/ BEING REPLACED BY /] + MOVE B,NEWTYP + PUSHJ P,OUTIT + MOVE T,OLDTYP + HLRZ T,1(T) + JUMPE T,[OUTSTR[ASCIZ/ +/] + JRST NOREPB] ;NO REPLACE IF BODY NOT USED(NOT IN) + PUSHJ P,REPCL1 ;TRY DEFAULT AUTO REPLACE MODE + JRST RELTYP ;GIVE UP + OUTSTR[ASCIZ/ +/] + JRST DOREP +>;MD + ;MAKTYP, MAKTPN, - CREATE TYPE BLOCK, CREATE TPIN BLOCK +;RETURNS PTR IN TT + +MAKTYP: PUSH P,A + GETBLK(TT,TYPE) + BCLEAR(A,TT,TYPE) +MD,< + MOVEI A,ADDR(TT,TPIN) ;SETUP DUMMY POINTERS + STORE (A,TT,TYP1) + MOVEI A,ADDR(TT,TBIT) + STORE (A,TT,TYP2) +>;MD + POP P,A + POPJ P, + +;MAKE TYPE PIN - POINTER RETURNED IN TT + +MAKTPN: PUSH P,A + GETBLK(TT,TYPIN) + BCLEAR(A,TT,TYPIN) +MD,< MOVEI A,2(TT) + STORE(A,TT,TP1) ;SETUP OLD STYLE POINTERS +>;MD + JRST POPAJ + SUBTTL MAKPNT, MAKPIN - MAKE POINT BLOCK, BODY PIN + +;MAKE POINT BLOCK, POINTER RETURNED IN TT +MAKPNT: PUSH P,A + GETBLK(TT,POINT) + BCLEAR(A,TT,POINT) + MOVEI A,2(TT) + STORE(A,TT,P1) + MOVEI A,4(TT) + STORE(A,TT,P3) +MD,< MOVEI A,6(TT) + STORE(A,TT,PNEB) ;NEIGHBOR BLOCK +> + JRST POPAJ + +;MAKE BODYPIN BLOCK, POINTER RETURNED IN TT +MAKPIN: PUSH P,A + GETBLK(TT,BPOINT) + BCLEAR(A,TT,BPOINT) + MOVEI A,2(TT) + STORE(A,TT,BP1) +MD,< MOVEI A,6(TT) + STORE(A,TT,BPNEB) ;BUILT IN NEIGHBOR BLOCK +>;MD + MOVEI A,4(TT) + STORE(A,TT,BP3) + JRST POPAJ + + SUBTTL READ .DRW FILE + +;CALL TYPE READING SUBR, READ INSTANCES OF TYPES + +;Procedure for reading .DRaWing files +;1) read list of types used in this drawing +;2) read list of libraries used (into LIBTMP) +;3) read local type definitions +;4) recurse here to read type definitions from libraries (do 2,3,4) +;5) re-open file and skip past type defintions +;6) read body, point, set instances from rest of file + +;LIBLST - list of libraries read into drawing + +RDFILE: MOVEM P,PERRSAV ;RETURN ONE UP FROM HERE ON INPUT ERRORS +MD,< SETZM LIBNAM ;NO LIBRARY NAME YET + SETZM LIBTMP + SETZM DEPTH + SETZM USEFLG ;ASSUME USE LIST NOT ACTIVE + SETZM ALLFLG ;And not trying to force all of library in + TRO FSTLIB ;FIRST LIBRARY LEVEL + PUSHJ P,CLBMRK ;CLEAR LIBRARY NEEDMR BITS +>;MD + PUSHJ P,MACCLR ;CLEAR TMP BIT IN MACROS + PUSHJ P,TYPIN ;GET TYPES IN (MAY RECUR!!!) + MOVEI F,NEWBOD ;PUT FIRST POINTER HERE +MD,< TLNE M,TYPNLY ;ONLY TYPES? + POPJ P, ;GO DIRECTLY TO END DO NOT PASS SETS DO NOT SCREW UP +>;MD + +;All libraries and TYPEs are in, read bodies, points, sets + + MOVEI T,[ASCIZ/BODY/] + MOVEM T,TYPLOC +RDBOD: PUSHJ P,WORDIN ;LOC OF BODY + CAIN TTT,400000 ;DONE? +MD,< JRST RDPNT > +MPC,< JRST DOPNTX ;YES> + PUSHJ P,CHKLOC + MOVEM TTT,CURSE ;SAVE LOC +MPC,< MOVE TTT,RDVER ;**RDVER + CAIGE TTT,10 ;HAVE DIP TYPE? + JRST NODTYP + PUSHJ P,RSTRZ ;DIP TYPE NAME + SETZ T, ;NULL + MOVEM T,STRING +NODTYP: +>;MPC + PUSHJ P,WORDIN ;GET ORIENTATION + MOVE TT,TTT +MPC,< ANDI TTT,3 > +MD,< + MOVE A,RDVER + XCT %IV6(A) ;**RDVER +>;MD + MOVEM TTT,CURORT + SETZM LETTER + SETZM NUMBER ;NONE SO FAR + SETZM NUMBR1 +MD,< TRNN TT,400000 ;ANY LOCATION? + JRST NNFORM ;NO + MOVE A,RDVER + XCT %IV7(A) ;**RDVER + SETZ TTT, ;(NUMBER  L,N) + MOVE A,RDVER + CAILE A,23 ;**RDVER + PUSHJ P,WORDIN + MOVEM TTT,NUMBR1 +>;MD +MPC,< MOVE A,RDVER + XCT %IV8(A) ;**RDVER +>;MPC + MOVE A,RDVER +MD,< CAILE A,14 > ;**RDVER +MPC,< CAILE A,15 > ;**RDVER + JRST NNFORM + HRRZ A,LETTER ;MAKE SWAPPED 6 BIT BYTES + DPB A,[POINT 6,A,23] + LSH A,-6 + DPB A,[POINT 12,LETTER,35];INTO ONE 12 BIT BYTE +NNFORM: PUSHJ P,WORDIN + SKIPN RDVER ;**RDVER + JRST OLDVR1 + TLZ TTT,FOUNDB!BTMP1 + PUSH P,TTT ;SAVE BODY ID AND BITS + JRST OLDVR2 +OLDVR1: GETFS (TT) + MOVEM TT,(F) + MOVE F,TT + SETZM (F) + HRLZM TTT,1(F) ;UNIQUE EXTERNAL NAME FOR BODY INTO NEWBOD LIST + PUSH P,F ;SAVE NEWBOD LIST POINTER +OLDVR2: +MD,< + PUSHJ P,RSTR ;NAME OF TYPE + MOVEM T,STRING ;SAVE FOR GARBAGE COLLECT + PUSHJ P,TNAME ;FIND LOCATION OF THAT TYPE (POINTER TO STRING IN ) + CAIA ;FOUND (POINTER TO TYPE IN C) + JRST [ PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ TYPE NOT FOUND! +BODY WILL BE RELEASED! +/] + MOVE B,STRING + PUSHJ P,PUTFS + POP P,F ;RESTORE NEWBOD LIST POINTER + MOVE T,RDVER + CAIL T,23 ;**RDVER + PUSHJ P,SKPPRP ;SKIP OVER PROPERTIESIF NOT PLACING BODY + JRST RDBOD] ;TRY TO GO ON. + MOVEM C,CURBOD ;SAVE TYPE POINTER + MOVE B,STRING + PUSHJ P,PUTFS + SETZM BTEXT + MOVE TT,RDVER + CAIL TT,23 ;**RDVER + PUSHJ P,PROPIN +>;MD +MPC,< + PUSHJ P,WORDIN ;NUMBER OF PINS + HRRZ A,TTT + CAIG A,2 + JRST [ MOVE T,RDVER + CAIGE T,10 ;**RDVER + JRST [ CAIN A,1 + MOVEI T,=400/5 + CAIN A,2 + MOVEI T,=200/5 + JRST IS2PNO] + HLRZ T,TTT + IS2PNO: PUSHJ P,G2PIN ;FIND OR MAKE THIS 2 PIN DIP! + JRST FNDTYP] +FNDT12: MOVE A,BODPNT +FNDT1: FETCH(B,A,TNAM) ;PC TYPE "NAME" IS NUMBER OF PINS + CAIN B,(TTT) + JRST FNDTYP + FETCH(A,A,TNXT) + JUMPN A,FNDT1 + OUTSTR[ASCIZ/TYPE NOT FOUND! +BODY WILL BE RELEASED! +/] + POP P,F ;RESTORE NEWBOD LIST POINTER + JRST RDBOD ;TRY TO GO ON. + ;PLACE INSTANCES OF TYPES +FNDTYP: MOVEM A,CURBOD ;SAVE TYPE POINTER +>;MPC + PUSHJ P,BPYESF ;PLACE BODY(X,Y IN CURSE;TYPE IN CURBOD;ORIENTATION IN CURORT) + HRRZ T,LSTBOD ;NEWEST BODY + POP P,F + SKIPN RDVER ;**RDVER + HRRM T,1(F) ;STORE INTERNAL POINTER IN NEWBOD LIST + TRNN MAKSET ;MAKING SET? + JRST NOBVIR ;NO + GETFS(TT) ;*SET* BLOCK + HRLZM T,1(TT) + EXCH TT,DY3 + HRRZM TT,@DY3 + HLRE TTT,1(T) + ADDM TTT,DX1 + HRRE TTT,1(T) + ADDM TTT,DY1 + AOS DX3 +NOBVIR: MOVE A,LSTBOD + SKIPN RDVER ;**RDVER + JRST OLDVR0 + ADD F,OLDBID + STORE(F,A,BID) + HLRZ T,F ;BODY BITS + STORE(T,A,BBIT) + HRRZ F,F + CAMLE F,MAXBID + MOVEM F,MAXBID + ANDI F,LHASHB-1 + HRRZ TT,LSTBOD + SKIPE TTT,HASHB(F) ;IS THIS BUCKET EMPTY? + JRST BODLNK + MOVEM TT,HASHB(F) ;YES MAKE THIS ENTRY + MOVEI TTT,DBODPN +BODLNK: HRRZ D,(TTT) ;ADD AFTER FIRST ENTRY IN BUCKET + HRRM D,(TT) + HRRM TT,(TTT) +OLDVR0: +MPC,< + MOVE TT,LETTER + STORE(TT,A,BLN) + MOVE TT,STRING + STORE(TT,A,BNAM) + JRST RDBOD +>;MPC +MD,< SKIPN BTEXT ;ANY BODY TEXT? + JRST NXBTXT + HRRZ A,LSTBOD ;YES, FIRST COPY TYPES PROP + PUSHJ P,COPLTP ;COPY TYPE PROP ONTO INDIRECT LIST + MOVE B,BTEXT + PUSHJ P,MERGEP +NXBTXT: HRRZ A,LSTBOD + PUSHJ P,CMPBDY ;COMPILE ANY PROPS OF BODY + HRRZ A,LSTBOD + SKIPN LETTER ;ANY LOC THERE? + JRST RDBOD ;NO, LOOP NOW + MOVEI T,-1+ADDR(A,BLXY) ;SETUP AS FLAG + STORE(T,A,BLOC) ;DUMMY POINTER MEANS LOC SET +GTLCBK: +DEC,< MOVE T,RDVER ;**RDVER + CAILE T,14 ;OLD LOSING DEC VERSION? + JRST NLCFUD ;NO, NO FUDGE +;THIS LOOKS PRETTY RANDOM.... + SETZM CHRCNT + MOVE A,LETTER + PUSH P,PUTCHR + MOVE T,[AOS CHRCNT] + MOVEM T,PUTCHR + PUSHJ P,SLTLPN + POP P,PUTCHR + MOVE T,CHRCNT + MOVE TT,STDBIG + IMUL T,VIRPTX(TT) + ASH T,-1 + HRLZ T,T + MOVE TT,VIRPTY(TT) + ASH TT,-1 + HRR T,TT + ADJUST(ADD,T,NUMBER) + MOVEM T,NUMBER +NLCFUD: +>;DEC + MOVE A,LSTBOD + MOVE T,NUMBER ;LOC OFFSET + STORE(T,A,BLXY) + HRRZ T,LETTER + MOVE TT,RDVER ;**RDVER + PUSHJ P,LOCFUK ;MIGHT BE WRONG FORMAT BODY LOCN + STORE(T,A,BSOC) + HLRZ T,LETTER + STORE(T,A,BBRS) + MOVE T,NUMBR1 ;CHAR OFFSET + STORE(T,A,BLO) + MOVE T,RDVER + CAIL T,DEC,<24;>27 ;**RDVER + JRST NLCOFF + MOVE A,LSTBOD + SETBIT(FIXBLO,T,A,BBIT) ;MAKE BODY LOCN'S CENTER THEMSELVES + PUSH P,TT + MOVE T,LSTBOD + PUSHJ P,OFFBLO ;ADJUST BODY TEXT OFFSET + POP P,TT +NLCOFF: MOVE T,RDVER ;**RDVER + CAIGE T,12 ;COMING FROM VERSION WITH NO DEF OFFSET? + JRST RDBOD ;YES, SKIP IT + HRRZ A,LSTBOD ;LAST BODY MADE (US) + FETCH(TTT,A,BBIT) + TRNN TTT,FIXLOC ;UPDATE LOC FROM TYPE? + JRST RDBOD ; NO, JUST OFFSET + MOVE B,CURBOD ;TYPE + FETCH(T,B,TXY) ;DEFAULT LOCATION OFFSET FROM TYPE + FETCH(F,A,BORI) ;ORIENTATION + PUSHJ P,ORIENT ;ROTATE IT + STORE(T,A,BLXY) ;SET OFFSET TO DEF FROM TYPE FOR OLD VERSIONS + TRNN TTT,FIXBLO ;ALSO WANT TEXT OFFSETING? + JRST RDBOD + FETCH(T,B,TYP3) ;NON-ZERO IF TYPE HAS DEFAULT CHAR OFFSET + JUMPE T,RDBOD + FETCH(T,B,TOXY) ;DEFAULT CHAR OFFSET FROM TYPE + STORE(T,A,BLO) + JRST RDBOD ;GET ANOTHER ONE +>;MD + ;READ POINT, FIND POINT, D PROG +MD,< +RDPNT: PUSHJ P,WORDIN ;GET LOC OF POINT + CAIN TTT,400000 ;DONE? + JRST RPNTDN ;YES + MOVEI T,[ASCIZ/POINT/] + MOVEM T,TYPLOC + MOVEM TTT,THSLOC + PUSHJ P,CHKLOC + SKIPN RDVER ;**RDVER + JRST OLDVR3 ;FIND POINT BY X,Y + PUSH P,TTT ;SAVE LOCATION + PUSHJ P,WORDIN ;GET PID + TLNN TTT,-1 + JRST PPIDF ;JUST POINT + PUSHJ P,FFNDID + JRST NOBPFN ;BODY PIN NOT FOUND + POP P,(P) + JRST OLDVR4 + +NOBPFN: JUMPE D,[OUTSTR[ASCIZ/BODY NOT FOUND/] + JRST PFLSH] + FETCH(D,D,BTYP) ;TYPE DEFINITION + MOVEM D,OLDTYP + OUTSTR[ASCIZ/PIN NOT FOUND ON /] + MOVE B,OLDTYP + PUSHJ P,OUTIT +PFLSH: OUTSTR[ASCIZ/, PIN WILL BE DELETED! +/] + POP P,(P) ;LOSE POINT LOC + MOVEI T,5 ;SKIP NEIGHBORS AND END WITH BITS + PUSHJ P,WORDIN + SOJG T,.-1 + SKIPN RDVER ;**RDVER ONLY VERY OLD STUFF + TRNN TTT,400000 ;NEW FORMAT? + JRST NPFLSH ;NO + PUSHJ P,WORDIN ;SKIP NUMBER WORD + PUSHJ P,WORDIN ;READ REAL BITS (I HOPE) +NPFLSH: TLZ TTT,FOUNDP + MOVE A,TTT ;SAVE BITS + MOVE T,RDVER ;**RDVER + CAIL T,3 ;THESE HAVE TEXT SIZE IN TTT + PUSHJ P,WORDIN ;THESE HAVE IT IN NEXT WORD + TRNN TTT,-1 + JRST NTFLSH + CAILE T,4 ;**RDVER THESE HAVE NO OFFSET + PUSHJ P,WORDIN ;THESE HAVE + PUSHJ P,SKPSTR ;SKIP TEXT + JFCL +NTFLSH: TLNN A,CPIN ;CONNECTOR PIN? + JRST RDPNT + PUSHJ P,WORDIN + PUSHJ P,WORDIN + JRST RDPNT + +PPIDF: EXCH TTT,(P) + MOVE T,TTT + PUSHJ P,HSHPUT ;ADD POINT TO HASH LIST + POP P,TTT + ADD TTT,OLDPID + STORE(TTT,D,PID) + CAMLE TTT,MAXPID ;LARGEST YET? + MOVEM TTT,MAXPID ;NO, REMEMBER + MOVE TT,TTT + ANDI TT,LHASHP-1 ;FORM HASH CODE FROM LOW BITS OF PIN ID + HRRZ TTT,@PHASHP + HRRM D,@PHASHP + STORE(TTT,D,PNXT) + SKIPN TTT + HRLM D,@PHASHP ;NEW END OF BUCKET + JRST OLDVR4 + ;MORE READ POINT, LINES, D PROG +OLDVR3: PUSHJ P,FIND.P ;FIND THE POINT (OR MAKE ONE) +OLDVR4: MOVE E,D ;CURRENT POINT + MOVE G,RDVER ;FOR INDEXING +;Read DOWN-neighbor + PUSHJ P,WORDIN ;DOWN + FETCH(T,E,PND) + SKIPN T + XCT %IV10(G) ;**RDVER + JRST NNDOWN + CAMN TTT,THSLOC ;XCT USUALLY JUMPS AROUND THIS STUFF + JRST NNDOWN + PUSHJ P,CHKLOC + MOVE T,TTT + PUSHJ P,FIND.P ;FIND HIM(OR MAKE HIM) +OLDVRD: CAMN E,D + JRST NNDOWN ;NOT TO OURSELVES + STORE(D,E,PND) + STORE(E,D,PNU) +;Read UP-neighbor +NNDOWN: PUSHJ P,WORDIN + FETCH(T,E,PNU) + SKIPN T + XCT %IV11(G) ;**RDVER + JRST NNUP + CAMN TTT,THSLOC + JRST NNUP + PUSHJ P,CHKLOC + MOVE T,TTT + PUSHJ P,FIND.P ;FIND UP (OLDVER) +OLDVRU: CAMN E,D ;NOT TO OURSELF?? + JRST NNUP + STORE(D,E,PNU) + STORE(E,D,PND) +;Read LEFT-neighbor +NNUP: PUSHJ P,WORDIN + FETCH(T,E,PNL) + SKIPN T + XCT %IV12(G) ;**RDVER + JRST NNLEFT + CAMN TTT,THSLOC + JRST NNLEFT + PUSHJ P,CHKLOC + MOVE T,TTT + PUSHJ P,FIND.P +OLDVRL: CAMN E,D + JRST NNLEFT + STORE(D,E,PNL) + STORE(E,D,PNR) +;Read RIGHT-neighbor +NNLEFT: PUSHJ P,WORDIN + FETCH(T,E,PNR) + SKIPN T + XCT %IV13(G) ;**RDVER + JRST NNRIGHT + CAMN TTT,THSLOC + JRST NNRIGHT + PUSHJ P,CHKLOC + MOVE T,TTT + PUSHJ P,FIND.P +OLDVRR: CAMN E,D + JRST NNRIGHT + STORE(D,E,PNR) + STORE(E,D,PNL) +NNRIGHT:MOVE D,E ;POINT IN D +>;MD + ;READ POINT, FIND, MAKE LINES, PC PROG +MPC< +DOPNTX: MOVEI T,[ASCIZ/POINT/] + MOVEM T,TYPLOC + PUSHJ P,RDPNT + FSWITCH + PUSHJ P,RDPNT + FSWITCH + JRST RPNTDN + +RDPNT: PUSHJ P,WORDIN ;GET X,Y OF POINT + CAIN TTT,400000 ;DONE? + POPJ P, ;YES + PUSHJ P,CHKLOC ;LEGAL X,Y? + SKIPN RDVER ;**RDVER + JRST OLDVR5 + PUSH P,TTT + PUSHJ P,WORDIN + TLNN TTT,-1 + JRST RDPOK + PUSHJ P,FFNDID ;BODY PIN + JRST RPLOSE + POP P,(P) + JRST OLDVR6 + +RDPOK: EXCH TTT,(P) + MOVE T,TTT + PUSHJ P,HSHPUT + POP P,TTT + ADD TTT,OLDPID + STORE(TTT,D,PID) + CAMLE TTT,MAXPID ;LARGEST YET? + MOVEM TTT,MAXPID ;NO, REMEMBER + MOVE TT,TTT + ANDI TT,LHASHP-1 ;FORM HASH CODE FROM LOW BITS OF PIN ID + HRRZ TTT,@PHASHP + HRRM D,@PHASHP + STORE(TTT,D,PNXT) + SKIPN TTT + HRLM D,@PHASHP ;NEW END OF BUCKET + JRST OLDVR6 +OLDVR5: PUSHJ P,FIND.P ;FIND THE POINT ( D) (OR MAKE ONE) +OLDVR6: MOVE H,D ;P1 + PUSH P,D ;SAVE POINT ON STACK +RDSEG: PUSHJ P,WORDIN ;GET P2 + SKIPE RDVER ;**RDVER + JRST [ JUMPN TTT,OLDVR7 + JRST RDSEGN] + CAIN TTT,400000 + JRST RDSEGN + PUSHJ P,CHKLOC +OLDVR7: SKIPE RDVER ;**RDVER + JRST [ PUSHJ P,FFNDID + JRST RDSEG ;NOT IN YET + JRST .+2] + PUSHJ P,FIND.P + CAMN D,H ;P2 NEQ P1 ? + JRST RDSEG ;NOT TO OURSELVES + FETCH(B,D,PNEB) ;P2'S NEIGHBORS + MOVE A,H + PUSHJ P,FNDLNK ;ALREADY A LINE? + CAIA ;NO, MAKE ONE + JRST RDSEG ;YES, NOT AGAIN + MOVE T,H + PUSHJ P,FRLINK + XCT (T)PUTAB ;P1 to P2 + MOVE T,D + PUSHJ P,FRLINK + MOVE D,H + XCT (T)PUTAB ;P2 to P1 + JRST RDSEG + +RPLOSE: OUTSTR[ASCIZ/PIN OR BODY NOT FOUND! +/] + PUSHJ P,FUCKUP + PUSHJ P,WORDIN ;SKIP NEIGHBORS + JUMPN TTT,.-1 + PUSHJ P,WORDIN + SKIPN RDVER ;**RDVER + TRNN TTT,400000 + JRST NPFLSH + PUSHJ P,WORDIN + PUSHJ P,WORDIN +NPFLSH: MOVE T,RDVER + CAIL T,6 ;**RDVER + PUSHJ P,WORDIN ;TEXT SIZE HERE FOR LATER VERSIONS + TRNN TTT,-1 ;ANY TEXT? + JRST NTFLSH ;NO + CAILE T,4 ;**RDVER ANY OFFSET? + PUSHJ P,WORDIN ;YES, SKIP IT + PUSHJ P,SKPSTR ;SKIP TEXT + JFCL +NTFLSH: PUSHJ P,WORDIN ;SKIP FEEDTHROUGH + JRST RDPNT + +RDSEGN: POP P,D ;POINT + ;FALL INTO CODE ON NEXT PAGE +>;MPC + ;READ REST OF POINT INFO +;D = POINT + PUSHJ P,WORDIN + SKIPN RDVER ;**RDVER ONLY VERY OLD STUFF + TRNN TTT,400000 ;NEW FORMAT? + JRST NPFORM ;NO + PUSHJ P,WORDIN ;SKIP NUMBER WORD + PUSHJ P,WORDIN ;READ REAL BITS (I HOPE) +NPFORM: ;TTT = BITS,,PAD# + HLRZ TT,TTT +MPC,< ANDI TT,PLANES ;JUST THESE > +MD,< ANDI TT,CPIN!CPNBTS!FIXTXT!FIXRHT!FIXCON ;JUST THESE + MOVE T,RDVER + CAIGE T,12 ;**RDVER THESE GUYS HAVE IT + TRZ TT,FIXTXT!FIXRHT!FIXCON ;THESE DON'T +>;MD + FETCH(T,D,PBIT) + IOR TT,T + STORE(TT,D,PBIT) ;OR IN POWER AND GROUND BITS. + TRNE MAKSET ;MAKING SET? + TRNE TT,MPC,ISPIN ;YES, PUT THIS ONE IN IT? + CAIA ;NO + PUSHJ P,VIRSET ;D = POINT + MOVE T,RDVER + XCT %IV14(T) ;**RDVER READ PAD OR PIN #, ETC. + ;MAYBE READ NEXT WORDIN + TRNN TTT,-1 ;SIZE OF TEXT + JRST [ SETZ T, + JRST RNOTXT] + MOVE T,RDVER + CAIGE T,4 ;**RDVER + TRZN TTT,10 + CAIA + TRO TTT,400000 + HRRZ TT,TTT + ANDI TTT,377777 ;MASK JUST SIZE + CAILE TTT,CSIZES ;LEGAL? + JRST [ OUTSTR[ASCIZ/ILLEGAL SIZE IN POINT TEXT. +WILL CHANGE TO STANDARD SIZE. +/] + TRZ TT,377777 + TRO TT,@STDBIG + JRST .+1] + CAIG T,4 ;**RDVER + TDZA TTT,TTT + PUSHJ P,WORDIN + GETBLK(T,TEXCOF) + STORE(TTT,T,TCXY) + PUSH P,T + PUSHJ P,RSTRZ + JRST [ POP P,T ;NO TEXT + RETBLK(T,TEXCOF) + SETZ T, + JRST RNOTXT] + STORE(TT,T,TSSIZ) + HRRZM T,@(P) ;LINK INTO TEXCOF HEADER + POP P,T +RNOTXT: STORE(T,D,PTXT) +MD,< FETCH(TTT,D,PBIT) + TRNN TTT,CPIN ;DO WE HAVE TO READ CONNECTOR PIN LOC? + JRST NRCPIN ;NO + GETFS (T) ;PLOC *BLOCK* + STORE(T,D,PLOC) ;LINK IN NEW BLOCK + PUSHJ P,WORDIN + MOVE A,RDVER + XCT %IV17(A) ;**RDVER + MOVE A,RDVER + CAILE A,24 ;**RDVER + JRST NRCPIN + CLRBIT(CPNBTS,TTT,D,PBIT) ;CLEAR BITS IN OLD VERSIONS + MOVE A,D ;POINT IN A + MOVE T,(T) + PUSHJ P,CPNBCK ;CHECK FOR U PIN + FETCH(T,A,PIN) ;BACKUP PIN (?) + PUSHJ P,CPNBCK ;CHECK THIS ALSO +NRCPIN: +>;MD + ;READ FEEDTHRU (IF ANY) +MPC,< PUSHJ P,WORDIN + CAIN TTT,400000 + JRST RDPNT + SKIPE RDVER ;**RDVER + JRST OLDVR8 + PUSHJ P,CHKLOC ;REASONABLE X,Y ? + MOVE G,D + PUSHJ P,RDFEED ;CREATE FEEDTHRU ON OTHER SIDE + JFCL ;LOSERS LOSE + JRST RDPNT + +OLDVR8: MOVE H,D ;H = FIRST POINT + FSWITCH ;GOT ID OF OTHER POINT + PUSHJ P,FFNDID + JRST NOOLDV + FETCH(TT,D,PBIT) + TRNE TT,ISPIN!FEEDTH!CPIN + JRST NOOLDV ;OOPS, ALREADY FEEDTHRU? + TRO TT,FEEDTH + STORE(TT,D,PBIT) + FETCH(TTT,D,PIN) + TLNE M,TYPNLY + SKIPE TTT + CAIA + MOVEI TTT,1 + STORE(TTT,D,PIN) ;DEFAULT FEEDTHRU PAD IS 1 + STORE(H,D,PFEED) + STORE(D,H,PFEED) + SETBIT(FEEDTH,TTT,H,PBIT) + FETCH(TTT,H,PIN) ;PAD# + TLNE M,TYPNLY + TRNE TTT,-1 + CAIA + HRRI TTT,1 + STORE(TTT,H,PIN) +NOOLDV: FSWITCH +>;MPC + JRST RDPNT + +;VIRSET - ENTER ITEM ONTO VIRTUAL SET +;D = ITEM + +VIRSET: SKIPN T,DY3 + JRST VIRST1 ;FIRST POINT IN SET + HRRZ TT,1(T) + JUMPE TT,VIRST2 ;SEARCH FOR EMPTY ENTRY(?) + HRRZ T,(T) + JUMPN T,.-3 +VIRST1: GETFS(T) ;*SET* BLOCK + SETZM 1(T) + MOVE TT,DY3 + HRRZM TT,(T) + HRRZM T,DY3 +VIRST2: HRRM D,1(T) + HLRE T,ADDR(D,QX) + ADDM T,DX1 + HRRE T,ADDR(D,QY) + ADDM T,DY1 + AOS DX3 + POPJ P, + ;READ SETS +RPNTDN: PUSHJ P,WORDIN + CAIE TTT,400000 + CAIN TTT,400001 + JRST SETDON + MOVEI G,NEWSET + SETZM NEWSET + PUSH P,TTT +RDSBOD: PUSHJ P,WORDIN + JUMPE TTT,SBODN ;END OF BODIES IN THIS SET + SKIPE RDVER ;**RDVER + JRST [ PUSHJ P,FNDBID + JRST RDSBOD + JRST OLDV10] + MOVE T,TTT + PUSHJ P,FIND.B + JRST RDSBOD ;COULDN'T FIND, GO TO NEXT +OLDV10: GETFS(A) ;GET BLOCK FOR IT + HRLZM B,1(A) ;SAVE POINTER + SETZM (A) ;CLEAR LINK + MOVEM A,(G) ;LINK ON END OF SET + MOVE G,A ;NEW END + JRST RDSBOD ;NEXT +SBODN: MOVEI G,NEWSET + MOVE H,RDVER +RDSPNT: PUSHJ P,WORDIN ;READ POINT LOC + XCT %IV18(H) ;**RDVER + JRST SPNTDN ;YES +MD,< PUSHJ P,FIND.P ;FIND POINT> +MPC,< + SKIPE D,PONPNT + PUSHJ P,FP1 + CAIA + JRST [ CHKOTH: SKIPN A,NEWSET + JRST THISOK + CHKLOP: HRRZ T,1(A) + CAIN T,(D) + JRST .+1 + HRRZ A,(A) + JUMPN A,CHKLOP + JRST THISOK] + SKIPE D,PONPN2 + PUSHJ P,FP1 + CAIA + JRST THISOK + MOVE T,TTT + PUSHJ P,PNTPUT +THISOK: >;MPC + +;SET IN, PUT IN STRUCTURE, OR FLUSH -- READ SPECIAL STRINGS -- CARD SUBR +OLDV11: + HRRZ A,(G) + JUMPN A,GOTIT ;WE HAVE A NEXT BLOCK + GETFS(A) + SETZM (A) ;CLEAR LINK + SETZM 1(A) ;CLEAR DATA + MOVEM A,(G) +GOTIT: MOVE G,A + HRRM D,1(G) ;SAVE POINT POINTER IN SET + JRST RDSPNT +SPNTDN: SKIPN NEWSET + JRST [ OUTSTR[ASCIZ/FLUSHING NULL SET! +/] + POP P,(P) ;POP OFF SET CENTER + JRST RPNTDN] + GETFS(A) + POP P,1(A) ;SAVE CENTER OF SET + HRLZ B,NEWSET + HRR B,SETPNT + MOVEM B,(A) ;LINK IN SET + MOVEM A,SETPNT + JRST RPNTDN ;READ ANOTHER +SETDON: + +;READ AUTHOR, TITLE, ETC. STRINGS + +MD,< MOVE T,RDVER ;**RDVER + CAIGE T,4 + JRST NOTIT +FOR I IN(TAUTHOR,TIT1,TIT2) +< MOVEI TT,I + PUSHJ P,GSTR +> + MOVE T,RDVER ;**RDVER + CAIGE T,10 + JRST NOTIT + PUSHJ P,WORDIN + CAMN TTT,CRDLOC + JRST REVMOD + JUMPE TTT,REVMOD + EXCH TTT,CRDLOC ;CARD LOC FOR WHOLE CARD! + JUMPE TTT,REVMOD + OUTSTR[ASCIZ/NEW CRDLOC DIFFERENT FROM OLD ONE, WILL USE NEW ONE! +/] +REVMOD: MOVE T,RDVER ;**RDVER + CAIGE T,15 + JRST NOTIT + MOVEI TT,TREV + PUSHJ P,GSTR + MOVE T,RDVER + CAIL T,MODIOV ;**RDVER + JRST HASMVP ;HAS MODULE, VARIABLE, PREFIX + PUSHJ P,RSTRZ ;READ OLD MODULE STRING + JRST NOTMVP ;NONE IS EASY + PUSH P,T ;SAVE POINTER FOR RETURN + ADD T,[POINT 7,1] + PUSHJ P,SETTT7 + MOVEM A,TMODULE +TMODLP: PUSHJ P,GETTT + JRST MODEOF + CAIN C,"-" + JRST TMODDN + PUTBYT (C) + JRST TMODLP + +TMODDN: PUSHJ P,SETTT7 + MOVEM A,TVARIABLE +TVARLP: PUSHJ P,GETTT + JRST MODEOF + CAIN C,"-" + JRST TVARDN + PUTBYT (C) + JRST TVARLP + +TVARDN: PUSHJ P,SETTT7 + MOVEM A,TPREFIX +TPRFLP: PUSHJ P,GETTT + JRST MODEOF + PUTBYT (C) + JRST TPRFLP + +MODEOF: POP P,B + PUSHJ P,PUTFS + JRST NOTMVP + +HASMVP: FOR I IN(TMODULE,TVARIABLE,TPREFIX) +< MOVEI TT,I + PUSHJ P,GSTR +> +NOTMVP: MOVE T,RDVER ;**RDVER + CAIGE T,16 ;NEWEST STRINGS? + JRST NOTIT ;NO +FOR I IN(TPROJ,TPAGE,TOF,TDCODE,SITE1,SITE2) +< MOVEI TT,I + PUSHJ P,GSTR +> +DEC,< MOVE T,RDVER + CAIGE T,20 + JRST NOTIT + MOVEI TT,TNXTHI + PUSHJ P,GSTR +FOR @$I IN(DRN,CHK,ENG) +< PUSHJ P,WORDIN + MOVEM TTT,I$NAM + JUMPE TTT,NOR$I + PUSHJ P,WORDIN + MOVEM TTT,I$NAM+1 + PUSHJ P,WORDIN + MOVEM TTT,I$NAM+3 +NOR$I: +> +;BEGIN BUG FIX *********** + SETZM CHKNAM ;FLUSH CHECKED SIGNATURE +;END BUG FIX ************** +>;DEC +NODEC,< MOVE T,RDVER + CAIGE T,26 + JRST NOTIT + PUSHJ P,RSTRZ + JRST NNXTHI + MOVE B,T + PUSHJ P,PUTFS +NNXTHI: +FOR @$I IN(DRN,CHK,ENG) +< PUSHJ P,WORDIN + JUMPE TTT,NOR$I + PUSHJ P,WORDIN + PUSHJ P,WORDIN +NOR$I: + > +>;NODEC +NOTIT: MOVE T,RDVER + CAIN T,BRDIOV ;**RDVER + PUSHJ P,RDNOM + POPJ P, +>;MD +MPC,< CAIE TTT,400001 + POPJ P, + PUSHJ P,WORDIN + MOVE T,RDVER + XCT %IV20(T) ;**RDVER + POPJ P, + + ;CARDIO +;SEPERATE CALL ON THIS GUY TO AVOID ASSIGNING OLD POINT ID'S AND SCREWING SETS + +CARDIO: MOVE TTT,RDVER ;**RDVER + CAIGE TTT,17 + JRST OLDCRD + TRNN VIRGIN + SKIPN CRDNAM + CAIA + JRST NOTNEW ;SKIP CARD IF ALREADY ONE AND NOT VIRGIN + PUSHJ P,CRDREL + PUSHJ P,WORDIN + MOVEM TTT,CRDNAM + PUSHJ P,WORDIN + MOVEM TTT,CRDEXT + PUSHJ P,WORDIN + MOVEM TTT,CRDPPN + SKIPN CRDNAM + POPJ P, + PUSHJ P,GETCRD + JRST [ OUTSTR[ASCIZ/ERROR WHILE READING CARD! +/] + JRST CRDREL] + POPJ P, + +NOTNEW: PUSHJ P,WORDIN ;SKIP CARD NAME IF WE AREN'T GOING TO USE IT + PUSHJ P,WORDIN + JRST WORDIN + +OLDCRD: PUSHJ P,WORDIN + JUMPE TTT,CPOPJ ;RETURN IF NO OLD CARD # + OUTSTR[ASCIZ/OLD VERION USED CARD # /] + MOVE T,TTT + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +BUT NOW I NEED A FILENAME. +/] + JRST DOCARD +>;MPC + + +;HERE TO READ AND DECODE BOARD TYPE + +MD,< +RDBRD: MOVE T,RDVER + CAIGE T,NOMVER ;**RDVER + POPJ P, ;NOTHING HERE YET + PUSHJ P,RSTRZ ;READ BOARD TYPE, ASCIZ STRING + POPJ P, ;NO BOARD SPECIFIED + MOVE B,T ;THE NAME WE JUST READ +RDBRD0: +MD,< TRNN FSTLIB ;ONLY CHECK BOARD TYPE FOR TOP LEVEL LIBRARY + POPJ P, +>;MD + PUSHJ P,FNDWW + JRST [ MOVE T,RDVER + CAIGE T,NOMVER ;ARE WE DEFAULTING? + JRST PUTFS ;YES, IGNORE FAILURE + OUTSTR [ASCIZ /UNKNOWN BOARD TYPE: /] + MOVE T,B + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ +/] + JRST PUTFS] + MOVEI C,-WNAMES(C) + PUSHJ P,PUTFS ;PUT THE NAME BACK IN FREE STORAGE +RDBRD1: +MD,< TRNN FSTLIB ;ONLY FOR TOP LEVEL LIBRARY + POPJ P, +>;MD + SKIPGE WWTYP ;IF NO BOARD TYPE YET, + JRST RDBRD2 + CAMN C,WWTYP ;DO BOARD TYPES AGREE? + POPJ P, ;YES, ALL IS WELL + OUTSTR [ASCIZ /BOARD TYPES OF FILE AND PROGRAM DISAGREE, +BOARD TYPE OF PROGRAM = /] + MOVE T,WWTYP + OUTSTR @WNAMES(T) + OUTSTR [ASCIZ / +BOARD TYPE FROM FILE = /] + OUTSTR @WNAMES(C) + OUTSTR [ASCIZ / +/] + TRNE VIRGIN + JRST RDBRD3 + OUTSTR [ASCIZ /DRAWING ALREADY EXISTS, WILL RETAIN PROGRAM BOARD TYPE. +/] + POPJ P, + +RDBRD3: OUTSTR [ASCIZ /NO DRAWING YET, WILL USE BOARD TYPE FROM FILE. +/] +RDBRD2: MOVEM C,WWTYP + JRST SETWW +>;MD + + +;READ NOMENCLATURE + +RDNOM: MOVE T,RDVER + CAIGE T,BRDIOV ;**RDVER + JRST [ +MD,< MOVEI C,DEFWW + PUSHJ P,RDBRD1 ;SET BOARD TYPE +>;MD + MOVEI C,DEFNOM + JRST RDNOM1] ;NOW NOMENCLATURE + PUSHJ P,RSTRZ ;READ NOMENCLATURE TYPE, ASCIZ STRING + POPJ P, ;NO NOMENCLATURE SPECIFIED + MOVE B,T ;THE NAME WE JUST READ + PUSHJ P,FNDNOM + JRST [ OUTSTR [ASCIZ /UNKNOWN NOMENCLATURE TYPE: /] + MOVE T,B + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ +/] + JRST PUTFS] + MOVEI C,-LNAMES(C) +MD,< MOVE T,RDVER + CAIGE T,NOMVER ;**RDVER DO WE HAVE BOARD TYPE SEPERATELY? + JRST RDNOM0 ;NO, SPECIAL HANDLING +>;MD + PUSHJ P,PUTFS ;PUT THE NAME BACK IN FREE STORAGE +RDNOM1: SKIPGE NOMTYP ;IF NO BOARD TYPE YET, + JRST RDNOM4 ;THEN SET THIS + CAMN C,NOMTYP ;DO BOARD TYPES AGREE? + POPJ P, ;YES, ALL IS WELL + MOVE T,NOMTYP + MOVE T,LOCTVV(T) ;GET NOMENCLATURE TABLE POINTER + CAMN T,LOCTVV(C) ;SAME NOMENCLATURE? + POPJ P, ;YES + OUTSTR [ASCIZ /NOMENCLATURE TYPES OF FILE AND PROGRAM DISAGREE, +NOMENCLATURE TYPE OF PROGRAM = /] + MOVE T,NOMTYP + OUTSTR @LNAMES(T) + OUTSTR [ASCIZ / +NOMENCLATURE TYPE FROM FILE = /] + OUTSTR @LNAMES(C) + OUTSTR [ASCIZ / +/] +MD,< TRNN FSTLIB ;IF TOP LEVEL, ONE MESSAGE + JRST RDNOM2 ;ELSE ANOTHER +>;MD + TRNN VIRGIN + JRST RDNOM3 + OUTSTR [ASCIZ /NO DRAWING YET, WILL USE NOMENCLATURE TYPE FROM FILE. +/] +RDNOM4: MOVEM C,NOMTYP + JRST SETNOM + +RDNOM3: OUTSTR [ASCIZ /DRAWING ALREADY EXISTS, WILL RETAIN PROGRAM NOMENCLATURE TYPE. +/] + POPJ P, + +MD,< +RDNOM0: PUSH P,B + PUSHJ P,RDNOM1 ;SET NOMENCLATURE + POP P,B + JRST RDBRD0 ;NOW TRY FOR BOARD TYPE + +RDNOM2: +NOITS,< OUTSTR[ASCIZ/FILE IS ONLY LIBRARY, WILL RETAIN PROGRAM NOMENCLATURE TYPE. +/] +>;NOITS + POPJ P, +>;MD + SUBTTL 'DAT' READ WAGNER'S ROUTER FILES +MPC,< +DREADR: +NOWAG,< JRST PERRET > +WAG,< + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ROUTER INPUT (DAT) /] + MOVEI H,' ! ' + ADD H,LASTWR ;LAST WIRE FILE READ! + EXCH H,LSTNAM ;TEMPORARILY MAKE THIS  + MOVSI T,EXTROU + PUSHJ P,SETNAM + JRST [ MOVEM H,LSTNAM + POPJ P,] + MOVEM H,LSTNAM + INIT DAT,0 + 'DSK ' + IOHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > + OUTSTR[ASCIZ/ +/] + MOVEM P,PERRSAV + MOVE T,FILNAM + MOVEM T,LASTWR ;SAVE LAST NAME READ SUCCESSFULLY + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + MOVEI T,ROUXMM*ROUSCL + MOVEM T,MINX + MOVEI T,ROUYMM*ROUSCL + MOVEM T,MINY + MOVEM SID,SIDSAV ;REMEMBER WHICH SIDE WE STARTED ON +ROULP1: PUSHJ P,GETXY + JRST ROUDN ;END ON 0,0 + EQV B,SID + JUMPL B,ROULP3 + SWITCH ;START ON PROPER SIDE +ROULP3: PUSHJ P,FIND.P ;FIND OR MAKE THIS POINT + HRL D,TTT + MOVEM D,MAXY +ROULP2: PUSHJ P,ATWIRE ;TRY TO ATTACH POINT IN MAXY TO ANY LINE + PUSHJ P,GETXY + JRST ROULP1 ;END OF THIS WIRE, LOOP + MOVE D,MAXY + MOVEM D,MAXX ;BACKUP POINTS + EQV B,SID ;RIGHT SIDE? + JUMPGE B,ROUFED ;FEED THROUGH MAYBE? + CAMN TTT,1(D) ;NULL SEGMENT? + JRST ROULP2 ;YES, LOOP BACK FOR ANOTHER (WAGNER IS A CROCK!!) + PUSHJ P,FIND.P ;FIND NEXT POINT + MOVEM D,MAXY + HRRZ T,MAXX + PUSHJ P,FRLINK + XCT PUTAB(T) + HRRZ T,MAXY + PUSHJ P,FRLINK + HRRZ D,MAXX + XCT PUTAB(T) + JRST ROULP2 + +ROUFED: PUSH P,TTT +; PUSHJ P,ATWIRE ;TRY TO ATTACH THIS SIDE + POP P,TTT + HRRZ G,MAXX + CAMN TTT,ADDR(G,PXY) ;SHOULD BE AT THE SAME PLACE! + PUSHJ P,RDFEED ;TRY TO FEED THROUGH + JRST [ OUTSTR[ASCIZ/COULDN'T FEED THROUGH AT /] + FETCH(TTT,G,PXY) + PUSHJ P,CNTFED + SWITCH + PUSHJ P,FIND.P + HRL D,TTT + MOVEM D,MAXY + JRST ROULP2] ;TRY TO GO ON + HRL D,TTT + MOVEM D,MAXY + SWITCH +; PUSHJ P,ATWIRE ;NOW THIS SIDE + JRST ROULP2 + + ;ATTACH TO WIRE + +ATWIRE: PUSH P,CURSE + HRRZ D,MAXY + FETCH(T,D,PXY) + MOVEM T,CURSE + PUSHJ P,CLSLIN ;SEE IF THERE IS A CLOSEST LINE + POP P,CURSE + JUMPE A,CPOPJ ;NO + MOVE T,DIFSOF + CAIL T,=10*=10*4/=25 ;LESS TEN MILS? + POPJ P, ;NO + HRRZ T,A + HLRZ TT,A + HRRZ D,MAXY ;THIS WAS CLOBBERED BY CLSLIN + CAIE T,(D) ;MAKE SURE WE AREN'T EITHER ENDPOINT + CAIN TT,(D) + POPJ P, + PUSH P,A ;SAVE CLOSESTS + FETCH(B,A,PNEB) + HLRZ A,(P) + PUSHJ P,FNDLNK ;FIND THE POINTER + JRST ROFERR + HRRZ D,MAXY + XCT PUTAB(T) ;STORE POINTER TO D INSTEAD + HRRZ T,MAXY ;DATA BLOCK POINTER + PUSHJ P,FRLINK + HRRZ D,(P) + XCT PUTAB(T) + HLRZ B,(P) + FETCH(B,B,PNEB) + HRRZ A,(P) + PUSHJ P,FNDLNK + JRST ROFERR + HRRZ D,MAXY + XCT PUTAB(T) + HRRZ T,MAXY + PUSHJ P,FRLINK + HLRZ D,(P) + XCT PUTAB(T) +NOCLN1: POP P,(P) + POPJ P, + +ROFERR: OUTSTR[ASCIZ/MISSING LINE POINTER AT ATWIRE! +/] + PUSHJ P,FUCKUP + JRST NOCLN1 + +ROUDN: RELEASE DAT, + TRO MCHG!NEEDCL + MOVE T,SIDSAV ;GET SIDE WE STARTED ON + EQV T,SID + JUMPL T,CPOPJ ;ALREADY ON RIGHT SIDE? + SWITCH ;NO, CHANGE + POPJ P, + + ;GETXY + +GETXY: PUSHJ P,GETN + JUMPE T,GETZ ;SHOULD BE END + CAIL T,SIDDIF*ROUSCL + TLZA B,FRONT ;ON BACK + TLOA B,FRONT ;ON FRONT + SUBI T,SIDDIF*ROUSCL ;SUBTRACT SIDE DIF + CAIL T,SIDDIF*ROUSCL + PUSHJ P,EVALUE ;TOO LARGE + CAIN T,ROUXMB*ROUSCL + MOVEI T,LCEDGE*ROUSCL ;LEFT CONNECTOR EDGE + CAIN T,ROUXMT*ROUSCL + MOVEI T,RCEDGE*ROUSCL ;RIGHT " + SUB T,MINX + HRLM T,(P) + PUSHJ P,GETN + SKIPE T + CAIL T,ROUYMT*ROUSCL + PUSHJ P,EVALUE + SUB T,MINY + HLL T,(P) + MOVE TTT,T + JRST CPOPJ1 + +EVALUE: OUTSTR[ASCIZ/ILLEGAL VALUE AT GETXY. +WILL SUBSTITUTE 1. +/] + MOVEI T,1 + POPJ P, + +GETZ: PUSHJ P,GETN + JUMPE T,CPOPJ + PUSHJ P,FUCKUP + SETZ T, + POPJ P, + +GETN: SETZ T, + MOVEI TT,4 +GETN1: SOSG IOHD+2 + IN DAT, + CAIA + JRST [ OUTSTR[ASCIZ/UNEXPECTED EOF! +/] + MOVEI TTT,"0" + JRST .+2] + ILDB TTT,IOHD+1 + JUMPE TTT,GETN1 + CAIE TTT,15 + CAIN TTT,12 + JRST GETN1 + ANDI TTT,17 ;MAKE A NUMBER OUT OF IT + IMULI T,=10 + ADD T,TTT + SOJG TT,GETN1 + IMULI T,ROUSCL ;MAKE INTO INTERNAL FORMAT + POPJ P, +>;WAG +>;MPC + SUBTTL 'WDR' 'LES' READ LOGIC WIRE LIST AND MAKE INTERNAL POINTERS +UML,< +MD,< +IERRS: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/LOGIC ERROR SUMMARY (LES) /] + MOVSI T,EXTLES + PUSHJ P,SETNAM + POPJ P, + TLO WFLAG + JRST READWA +>;MD + +READW: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/LOGIC WIRE LIST (FROM WL PROG) (WDR) /] + MOVSI T,EXTWDR + PUSHJ P,SETNAM + POPJ P, ;LET HIM OUT + TLZ WFLAG +READWA: INIT DAT,10 + 'DSK ' + IOHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + PUSHJ P,WORDIN +MD,< TLNN WFLAG + SKIPA TT,[WDRVER] + MOVEI TT,LESVER + CAME TTT,TT ;RIGHT VERSION? +>;MD +MPC,< CAIE TTT,WDRVER > + JRST [ OUTSTR[ASCIZ/, VERSION # MISMATCH! +/] + RELEASE DAT, + POPJ P,] + OUTSTR[ASCIZ/ +/] +MD,< TLNN WFLAG + JRST GWVER + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/FILENAME OTHER THAN CURRENT DEFAULT?/] + PUSHJ P,GETWRD + CAIE C,12 + JRST INNERR ;LOSE + JUMPN T,.+3 + SKIPN T,LSTNAM ;PICKUP DEFAULT + JRST [ OUTSTR[ASCIZ/NO DEFAULT NAME! +/] + RELEASE DAT, + POPJ P,] + MOVEM T,PARNAM +GWVER: +>;MD + PUSHJ P,RELWIR + SETZM COUNT ;CLEAR UNASSIGNED BODY LOC COUNTER +MPC,< JRST RWWIR > +MD,< SETZM %LAST ;INIT SIGNAL COUNTER + TLNN WFLAG ;LES FILE? + JRST RWWIR +TRYCAT: PUSHJ P,WORDIN + JUMPE TTT,RWDONE ;THAT'S ALL IF ZERO ERROR CODE + MOVEM TTT,ERCODE + PUSHJ P,RSTR + MOVE B,T + TLNN M,DSKACT!MACACT + PUSHJ P,OUTTXT + PUSHJ P,PUTFS + PUSHJ P,YORN + JRST RWDONE ;ALTMODE + CAIA ;NO, SKIP THIS CATEGORY + JRST RWWIR ;YES, READ THIS CATEGORY +SKPCAT: PUSHJ P,SKPSTR + JRST TRYCAT +SKPCT1: PUSHJ P,SKPSTR + JRST SKPCT2 + JRST SKPCT1 + +SKPCT2: PUSHJ P,WORDIN + JUMPE TTT,SKPCAT + PUSHJ P,WORDIN + JRST SKPCT2 +>;MD + +RWWIRX: JUMPE H,RWWIR +MD,< TLNE WFLAG ;IERRORS + SKIPE DX1 ;AND NO PINS READ? + JRST IERSOM ;NOT IERRORS, OR FOUND SOME + MOVE A,H ;FLUSH WIRES WITH NO PINS +NILERR: HLRZ B,1(A) + SKIPE B + PUSHJ P,PUTFS + HRRZ A,(A) + JUMPN A,NILERR + MOVE B,H + PUSHJ P,PUTFS + JRST RWWIR + +IERSOM: +>;MD + GETFS(T) + HLL H,(P) ;GET ACCUMULATED TYPE BITS + MOVEM H,1(T) + EXCH T,WIRLST + HRRZM T,@WIRLST +RWWIR: SETZ H, + HRRZS (P) ;CLEAR ACCUMULATED BITS +RWWIRS: PUSHJ P,RSTRZ + JRST [ MOVE G,H + JUMPN H,RWWIRG + JRST RWDONE] + GETFS(TT) + HRLZM T,1(TT) + HRRZM H,(TT) + MOVE H,TT +MD,< SETZM DX1 ;NO PINS FOUND YET> + JRST RWWIRS + +MD,< +RWWIRG: AOSA %LAST ;INC COUNT OF SIGNALS +>;MD +RWWIR0: AOS COUNT +MPC, +RWWIR1: PUSHJ P,WORDIN + JUMPE TTT,RWWIRX +MD,< TLNN WFLAG + JRST RWWIRZ + MOVE T,TTT + PUSHJ P,WORDIN + CAME TTT,PARNAM + JRST RWWIR1 ;NOT THIS FILE, SKIP IT + MOVE TTT,T + PUSHJ P,FNDID ;FIND BY PID + JRST RWWIR0 ;LOSE + AOS DX1 ;COUNT A PIN READ + MOVE T,D + JRST GWPNT + +RWWIRZ: +>;MD + TLNE TTT,-1 + JRST [ MOVSM TTT,LETTER +MPC,< HLRZ A,TTT ;ONLY TREAT AZ1,EZ1 SPECIAL IN PC + PUSHJ P,QUPIN + CAIA ;NOT WILD + JRST SAVRND ;SAVE RANDOM CON SPEC +>;MPC + SETZM NUMBER + JRST LOKCON] + PUSHJ P,WORDIN + HRRZM TTT,NUMBER + HRRI TTT, + IORM TTT,(P) ;STO BITS ON STACK + PUSHJ P,WORDIN + MOVEM TTT,LETTER +LOKCON: SKIPN LETTER + JRST RWWIR0 + PUSHJ P,LOOK ;LOOK FOR IT + JRST RWNFND +GWPNT: JUMPN G,RWGFST + GETFS (G) + SETZM (G) + SETZM 1(G) + MOVE H,G +RWGFST: HLRZ TT,(G) + JUMPE TT,RWGFS1 + HRRZ TT,(G) + JUMPE TT,RWGFS2 + MOVE G,TT + JRST RWGFST + +RWGFS2: GETFS (TT) + HRRM TT,(G) + MOVE G,TT + SETZM (G) + SETZM 1(G) +RWGFS1: HRLM T,(G) + JRST RWWIR1 + +MPC,< +SAVRND: JUMPN G,RWGFXT + GETFS (G) + SETZM (G) + SETZM 1(G) + MOVE H,G +RWGFXT: AOS 1(G) + JRST RWWIR1 +>;MPC + +RWNFND: PUSH P,PUTCHR + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + MOVE A,LETTER + SKIPN NUMBER ;CON PIN? + JRST RWNFNC ;YES + PUSHJ P,SLTLPN + MOVE A,NUMBER + OUTCHR ["("] + PUSHJ P,BPINPN + OUTCHR [")"] +RWNFN1: POP P,PUTCHR + OUTSTR[ASCIZ/ NOT FOUND. +/] + JRST RWWIR1 + +RWNFNC: PUSHJ P,CSLTLP + JRST RWNFN1 + +RWDONE: RELEASE DAT, ;RELEASE INPUT FILE + SKIPN T,COUNT + POPJ P, + PUSHJ P,DECOUT +MD,< TLNE WFLAG + OUTSTR[ASCIZ/ PINS OR CPINS NOT FOUND BY FNDID! +/] + TLNN WFLAG +>;MD + OUTSTR[ASCIZ/ PINS ON BODIES WITH NO ASSIGNED LOCATIONS! +/] + POPJ P, + +RELWIR: SKIPN A,WIRLST + POPJ P, +RELWR1: HRRZ C,1(A) +RELWR2: HLRZ B,1(C) + PUSHJ P,PUTFS + HRRZ C,(C) + JUMPN C,RELWR2 + HRRZ B,1(A) + PUSHJ P,PUTFS + HRRZ A,(A) + JUMPN A,RELWR1 + MOVE B,WIRLST + SETZM WIRLST + JRST PUTFS +>;UML + SUBTTL 'DAT' PARTITION FILE +PART,< +INPINS: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PARTITION INPUT (DAT) /] + MOVE H,[IPNNAM] + EXCH H,LSTNAM + MOVSI T,EXTPAR + PUSHJ P,SETNAM + JRST [ MOVEM H,LSTNAM + POPJ P,] + MOVEM H,LSTNAM + INIT DAT,0 + 'DSK ' + IOHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > + OUTSTR[ASCIZ/ +/] + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/FILENAME OTHER THAN CURRENT DEFAULT?/] + PUSHJ P,GETWRD + CAIE C,12 + JRST INNERR ;LOSE + JUMPN T,.+3 + SKIPN T,LSTNAM ;PICKUP DEFAULT + JRST [ OUTSTR[ASCIZ/NO DEFAULT NAME! +/] + RELEASE DAT, + POPJ P,] + MOVEM T,PARNAM ;SAVE HERE FOR TESTS LATER + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/SKIP CONNECTOR PINS/] + PUSHJ P,YORN + JRST [ RELEASE DAT, + POPJ P,] + TLZA WFLAG + TLO WFLAG + TRO MCHG +DPART1: PUSHJ P,I5IN + JRST PARLOS + JUMPE T,[PUSHJ P,SKPLIN + JRST PARLOS + TLNE WFLAG ;SKIPPING CONNECTORS? + JRST PARDON ;YES + JRST CPART] + MOVEM T,DX1 ;X POS + PUSHJ P,I5IN + JRST PARLOS + MOVEM T,DY1 ;Y POS + PUSHJ P,SKPLIN ;SKIP TO EOL + JRST PARLOS +DPART2: PUSHJ P,O6IN ;READ SLICE # + JRST PARLOS + MOVE B,T ;DO NOTHING WITH IT FOR NOW + PUSHJ P,O6IN ;READ BODY ID + JRST PARLOS + JUMPE T,[JUMPN B,.+1 + PUSHJ P,SKPLIN + JRST PARLOS + JRST DPART1] ;END OF THIS DIP + MOVE B,T ;SAVE BID + PUSHJ P,FILCHK ;CHECK IF THIS FILE? + JRST PARLOS + JRST BSKIP ;NO, SKIP THIS BODY + MOVE TTT,B + PUSHJ P,FNDBID + JRST BSKIPE +;********* OLD STUFF, FIX SOME DAY IF USE PART ********* + PUSHJ P,FUCKUP + + HLRZ T,(B) + HLRZ T,1(T) + HRRZ TT,(T) + JUMPN TT,DPARTL + GETFS(TT) + GETFS(F) + HRLZM F,(TT) + SETZM 1(F) + HRRM TT,(T) + MOVSI F,FIXLOC!FIXBLO + IORM F,1(T) ;CONTINUE FIXING LOC + HLRZ T,(B) + HLRZ F,(T) ;SAVE ORIENTATION + HRRZ T,1(T) ;TYPE POINTER + HLRZ T,1(T) + HLRZ T,(T) + MOVE T,1(T) ;INITIAL LOC OFFSET FROM TYPE + PUSHJ P,ORIENT ;ORIENT IT + MOVEM T,1(TT) ;INTIALIZE OFFSET +DPARTL: HLRZ TT,(TT) + SETZM (TT) ;CLEAR OUT ANY OLD CRUFT THERE + MOVE T,DX1 + DPB T,[POINT 12,(TT),35] ;THIS IS NUMBER PART + MOVE T,DY1 + DPB T,[POINT 6,(TT),23] ;THIS IS LETTER PART + PUSH P,B + MOVE T,B + PUSHJ P,OFFBLO + POP P,B + PUSHJ P,SKPLIN + JRST PARLOS + SETZ G, + MOVEI F,G +DPARTN: PUSHJ P,I5INC + JRST DPARTI + JRST [ + GIVLOS: MOVE B,G + PUSHJ P,PUTFS + JRST PARLOS] + GETFS(TT) + HRRM TT,(F) + MOVE F,TT + HRLZM T,(F) + SETZM 1(F) + JRST DPARTN + + + +DPARTI: JUMPE G,DPART2 ;NO PINS? GET ANOTHER BODY + MOVE F,G +DPARTJ: PUSHJ P,O6INC + JRST [ OUTSTR[ASCIZ/TOO LITTLE DATA ON PIN ID LINE! +/] + JRST DPART6] + JRST GIVLOS + MOVEM T,1(F) + HRRZ F,(F) + JUMPN F,DPARTJ + PUSHJ P,F4CIN + JRST GIVLOS + CAIN TTT,12 + JRST DPART6 + OUTSTR[ASCIZ/EXTRA DATA ON PIN ID LINE! +/] + PUSHJ P,SKPLIN + JRST GIVLOS + +DPART6: SKIPN T,1(G) + JRST DPART7 + MOVEM T,DX3 + HLRZ A,(G) + HLRZ T,(B) + TRZ TFLG ;FLAG NONE FOUND YET + JRST DPART4 ;NOW FIND PIN ID + +DPART5: HLRZ T,(T) + HRRZ TT,1(T) + HRRZ TTT,(TT) + HLRZ TTT,(TTT) + HRRZ TTT,1(TTT) ;PIN NAME FOR THIS + CAME TTT,DX3 ;SAME PIN? + JRST DPART4 + HRRM A,1(TT) ;STO PIN # + TRO TFLG ;FLAG THAT WE FOUND ONE +DPART4: HRRZ T,(T) + JUMPN T,DPART5 + TRNN TFLG + OUTSTR[ASCIZ/PIN ID NOT FOUND AT DPART5! +/] +DPART7: MOVE T,G + HRRZ G,(G) + FSTRET(T) + JUMPN G,DPART6 + JRST DPART2 + +BSKIPE: OUTSTR[ASCIZ/BODY NOT FOUND AT DPART2! +/] +BSKIP: PUSHJ P,SKPLIN ;SKIP REST OF BODY LINE + JRST PARLOS + PUSHJ P,SKPLIN ;SKIP PIN # LINE + JRST PARLOS + PUSHJ P,SKPLIN ;SKIP PIN ID LINE + JRST PARLOS + JRST DPART2 ;TRY ANOTHER + + + +CPART0: PUSHJ P,SKPLIN ;SKIP TO NEXT LINE + JRST PARLOS +CPART: PUSHJ P,O6IN + JRST PARDON ;DO THIS FOR NOW, WAGNER DOESN'T END WITH A 0 + JUMPE T,PARDON ;DONE ON 0 + MOVE B,T ;SAVE POINT ID + PUSHJ P,FILCHK + JRST PARLOS + JRST CPART0 + SKIPN T,PONPNT + JRST CPARTL + MOVSI A,ISPIN ;FOR TEST +CPART1: HLRZ TT,(T) + HRRZ TTT,1(TT) + TDNE A,1(TTT) + JRST CPART2 + HRRZ TT,(TT) + CAMN TT,B + JRST CPART3 ;SAME ID, THIS IS IT +CPART2: HRRZ T,(T) + JUMPN T,CPART1 +CPARTL: OUTSTR[ASCIZ/CONNECTOR PIN NOT FOUND AT CPART1! +/] + JRST CPART0 + +CPART3: HRLM T,(P) ;SAVE POINT POINTER HERE + MOVE T,1(TTT) + TLNN T,CPIN + JRST [ OUTSTR[ASCIZ/FOUND POINT AT CPART1, BUT IT ISN'T A CONNECTOR PIN ANY MORE! +/] + JRST CPART0] + MOVE A,TTT + SETZM LETTER + PUSHJ P,F4CIN ;GET PADDLE DIGIT + JRST PARLOS + ANDI TTT,17 + DPB TTT,[POINT 6,LETTER,23] + PUSHJ P,F4CIN + JRST PARLOS + MOVE B,TTT + ANDI B,17 + PUSHJ P,F4CIN + JRST PARLOS + ANDI TTT,17 + IMULI B,=10 + ADD B,TTT + AOS LETTER ;AT LEAST 1 + TRNN B,1 + AOS LETTER ;ANOTHER ONE + ADDI B,1 + LSH B,-1 + DPB B,[POINT 6,LETTER,29] + PUSH P,C + PUSH P,D + MOVE D,A + MOVE C,A + HRRZ A,(A) + MOVE B,A +NIL,< POINT IN A??> + PUSHJ P,UBACK ;CHECK FOR UPIN BACKUP + POP P,D + MOVE B,LETTER + MOVEM B,(A) + MOVE T,B +NIL,< POINT IN A??> + PUSHJ P,CPNBCK + POP P,C + JRST CPART0 + +PARLOS: OUTSTR[ASCIZ/UNEXPECTED END OF FILE, I QUIT! +/] +PARDON: RELEASE DAT, + POPJ P, + + + +FILCHK: PUSHJ P,O12IN + POPJ P, + AOS (P) + CAMN T,PARNAM + AOS (P) ;RIGHT FILENAME, SKIP + POPJ P, + +SKPLIN: PUSHJ P,F4CIN + POPJ P, + CAIE TTT,12 + JRST SKPLIN + JRST CPOPJ1 + +O12IN: PUSHJ P,O6IN + POPJ P, + HRLM T,(P) + PUSHJ P,O6IN + POPJ P, + HLL T,(P) + JRST CPOPJ1 + +I5INC: PUSHJ P,F4CIN + JRST CPOPJ1 + CAIN TTT,12 + POPJ P, + MOVEI TT,5 + PUSH P,[=10] + SETZ T, + AOS -1(P) + JRST GETN2 + +I5IN: MOVEI TT,5 + PUSH P,[=10] + JRST DIN + +O6INC: PUSHJ P,F4CIN + JRST CPOPJ1 + CAIN TTT,12 + POPJ P, + MOVEI TT,6 + PUSH P,[10] + SETZ T, + AOS -1(P) + JRST GETN2 + +O6IN: MOVEI TT,6 +OIN: PUSH P,[10] +DIN: SETZ T, +GETN1: PUSHJ P,F4CIN ;READ A CHARACTER + JRST [ POP P,(P) + POPJ P,] +GETN2: CAIN TTT,40 + TDZA TTT,TTT ;SPACES ARE ZEROES + SUBI TTT,60 + JUMPL TTT,F4LOSE + CAML TTT,(P) ;LESS THAN RADIX? + JRST F4LOSE + IMUL T,(P) + ADD T,TTT + SOJG TT,GETN1 + POP P,(P) + JRST CPOPJ1 + +F4LOSE: OUTSTR[ASCIZ/INPUT LOSSAGE AT GETN2, NON-DIGIT SEEN! +/] + MOVSI TTT,70000 ;BACK UP SO WILL GET IT AGAIN + ADDM TTT,IOHD+1 + AOS IOHD+2 + POP P,(P) + SETZ T, + JRST CPOPJ1 ;TRY TO HOBBLE ON! + +F4CIN: SOSG IOHD+2 + IN DAT, + CAIA + POPJ P, + ILDB TTT,IOHD+1 + JUMPE TTT,F4CIN + CAIE TTT,14 + CAIN TTT,15 + JRST F4CIN + JRST CPOPJ1 +>;PART + ;WORDIN, CHKLOC +WORDIN: SOSG IOHD+2 + IN DAT, + CAIA + JRST INERR + ILDB TTT,IOHD+1 + POPJ P, + +INERR: OUTSTR [ASCIZ/INPUT ERROR. +SHALL I CLOSE THE FILE AND RETURN(Y OR NO)?/] + INCHRW TTT + CAIE TTT,"Y" + CAIN TTT,"y" + CAIA +NODEC,< HALT .+1 > +DEC,< PUSHJ P,TODDT > + RELEASE DAT, + MOVE P,PERRSAV + POPJ P, + + +CHKLOC: HLRE T,TTT + MOVMS T +MPC,< CAILE T,20000 > ;+ OR - 50 INCHES? +MD,< CAILE T,20000 > ;+ OR - ??? + JRST WAYOFF + HRRE T,TTT + MOVMS T +MPC,< CAIG T,20000 > ;+ OR - 50 INCHES? +MD,< CAIG T,20000 > ;+ OR - ??? + POPJ P, ;OK +WAYOFF: OUTSTR @TYPLOC ;WHAT IS IT + OUTSTR[ASCIZ/, WAY OFF SCREEN AT /] +CNTFED: HLRE T,TTT + JUMPGE T,.+2 + OUTCHR["-"] + MOVMS T +MPC,< IMULI T,5 > + ASH T,-1 + PUSHJ P,DECOUT + OUTCHR[","] + HRRE T,TTT + JUMPGE T,.+2 + OUTCHR["-"] + MOVMS T +MPC,< IMULI T,5 > + ASH T,-1 + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +/] + POPJ P, + ;GSTR, RSTR, FIND.P +MD,< +GSTR: PUSHJ P,RSTRZ + POPJ P, + EXCH T,(TT) + JUMPE T,CPOPJ + MOVE B,T + JRST PUTFS +>;MD + +RSTRZ: PUSHJ P,WORDIN + JUMPE TTT,CPOPJ + AOSA (P) ;SKIP WORDIN AND SKIP RETURN +RSTR: PUSHJ P,WORDIN ;GET SOME OF THE STRING + GETBLK(B,TEXSTR) ;NO, NEED ANOTHER BLOCK + MOVE T,B + JRST RS2 + +RS1: GETBLK(B,TEXSTR) ;NO, NEED ANOTHER BLOCK + STORE(B,A,TSNXT) ;LINK IN +RS2: MOVE A,B ;POINT TO IT + STORE(TTT,A,TSASC) + CLEAR(A,TSNXT) + TRNN TTT,377 ;DONE? + POPJ P, ;YES + PUSHJ P,WORDIN ;ANOTHER PIECE + JUMPN TTT,RS1 ;DONE? + POPJ P, + +SKPSTR: PUSHJ P,WORDIN + JUMPN TTT,SKPST1 + POPJ P, + +SKPST2: PUSHJ P,WORDIN +SKPST1: TRNE TTT,376 + JRST SKPST2 + JRST CPOPJ1 + +;FIND.P - FIND A POINT (IF NONE FOUND MAKE ONE) +;CALL WITH: +; TTT X,Y OF DESIRED POINT +;RETURNS WITH: +; D POINTER TO POINT + +FIND.P: SKIPE D,PONPNT + PUSHJ P,FP1 ;SEARCH ON SCREEN POINTS + JRST [ MOVE T,TTT + JRST PNTPUT] ;MAKE A POINT + POPJ P, + +FP1: CAMN TTT,ADDR(D,PXY) ;IS THIS THE ONE? + JRST CPOPJ1 ;YES + FETCH(D,D,PNXT) + JUMPN D,FP1 + POPJ P, + + +NIL,< +;THIS SHOULDN'T BE NECESSARY ANY MORE?? +FP2: FETCH(TTT,D,BP1) + FETCH(T,D,BP3) ;POINTER TO DATA BLOCK + FETCH(E,D,BPNEB) ;POINTER TO ^_ + POPJ P, +>;NIL + SUBTTL 'UML' READ REDAC PIN ASSIGMENTS +MD,< +INUML: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/UML INPUT /] + MOVSI T,EXTUML + PUSHJ P,SETNAM + POPJ P, + INIT DAT,0 + 'DSK ' + IOHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > + OUTSTR[ASCIZ/ +/] + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF +ASKCRD: SETZM PARNAM ;IF GLOBAL CARD LOC, ZERO FOR MATCH + SKIPE T,CRDLOC + JRST ASKCR1 + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/CARD LOCATION ( IF ONLY ONE IN DRAWING). +^/] + MOVE T,[PUSHJ P,GETLCH] + MOVEM T,GTCHRX + PUSHJ P,GETSLT + CAIA + CAIE C,12 + JRST [ PUSHJ P,INNERR + JRST ASKCRD] + MOVE T,LETTER + HLLZM T,PARNAM ;USE THIS CELL +ASKCR1: MOVEM P,ERRP + MOVE D,[ANDCAM C,1(T)] ;CLEAR BITS + PUSHJ P,STBITA ;IN BODIES AND POINTS + SETZ D, ;D=0:NOTHING YES, D=1 PINS, D=2 BODIES +INUML1: PUSHJ P,UMLIN + MOVE T,1(B) + CAMN T,[ASCIZ/END/] + JRST INUML2 + CAMN T,[ASCII/BODIE/] + JRST INUML3 + CAMN T,[ASCIZ/PINS/] + JRST INUML4 +INUML6: HRRZ A,B + ADD A,[POINT 7,1] + MOVE T,[PUSHJ P,UREAD] + MOVEM T,GTCHRX + XCT URDTAB(D) + JRST INUML5 ;ERROR + JRST INUML5 ;CRLF ONLY (BLANK) +MD,< CAIA ;LOC OK + JRST INUML5 ;BRS SEEN, LOSE +>;MD + CAIE C,11 + JRST INUML5 + MOVE T,LETTER + MOVEM T,NUMBER + XCT URDTAB(D) + JRST INUML5 + JRST INUML5 +MD,< CAIA + JRST INUML5 +>;MD + JUMPN C,INUML5 + PUSH P,B + XCT URDFND(D) + POP P,B + PUSHJ P,PUTFS + JRST INUML1 + +INUML3: HRRZ T,(B) + JUMPE T,INUML6 + MOVE T,1(T) + CAME T,[ASCIZ/S/] + JRST INUML6 + PUSHJ P,PUTFS + MOVEI D,2 + JRST INUML1 + +INUML4: PUSHJ P,PUTFS + MOVEI D,1 + JRST INUML1 + +;FIND PIN OR BODY AND SET NEW LOC +URDFND: JFCL ;OH WELL, JUST IN CASE + PUSHJ P,UFNPIN + PUSHJ P,UFNBOD + +UFNPIN: SKIPN A,PONPNT + POPJ P, +UFNPN1: FETCH(T,A,PBIT) + TRNE T,CPIN + TRNE T,1 ;NOT SEEN YET + JRST UFNPN2 + FETCH(B,A,PLOC) + MOVE TT,(B) + XOR TT,PARNAM + CAME TT,NUMBER + JRST UFNPN2 + PUSH P,B + PUSHJ P,UBACK ;CHECK FOR WILD PIN BACKUP + POP P,B + MOVE TT,LETTER + HRRM TT,(B) + SETBIT(1,T,A,PBIT) + PUSHJ P,FIXEM ;FIX OFFSET IF NEEDED +UFNPN2: FETCH(A,A,PNXT) + JUMPN A,UFNPN1 + POPJ P, + +UFNBOD: SKIPN A,DBODPN + POPJ P, +UFNBD1: HLRZ C,(A) + HLRZ C,1(C) + MOVE T,1(C) + TLNE T,BTMP1 + JRST UFNBD2 + HRRZ B,(C) + JUMPE B,UFNBD2 + HLRZ B,(B) + MOVE TT,(B) + XOR TT,PARNAM + CAME TT,NUMBER + JRST UFNBD2 + MOVE TT,LETTER + HRRM TT,(B) + TLO T,BTMP1 + MOVEM T,1(C) +UFNBD2: HRRZ A,(A) + JUMPN A,UFNBD1 + POPJ P, + ; SUBRS FOR READING UML FILE +INUML5: OUTSTR[ASCIZ/FORMAT ERROR, /] + OUTSTR @(D)[[ASCIZ/PINS OR BODIES NOT SELECTED /] + [ASCIZ/PIN LOC /] + [ASCIZ/BODY LOC /]] + OUTSTR[ASCIZ/IN LINE: +/] + SETZ TT, + SKIPN TTT,B + JRST INUMLY +INUMLZ: MOVE T,1(TTT) + OUTSTR T + HRRZ TTT,(TTT) + JUMPN TTT,INUMLZ +INUMLY: OUTSTR[ASCIZ/ +/] + PUSHJ P,PUTFS + JRST INUML1 + +UMLIN: GETFS (B) + SETZM (B) + SETZM 1(B) + MOVE T,B + ADD T,[POINT 7,1] +UMLIN1: PUSHJ P,UWDIN + CAIE C,15 + CAIN C,14 + JRST UMLIN1 + CAIN C,12 + JRST UMLIN4 + CAIL C,"a" + CAILE C,"z" + SKIPA + SUBI C,40 + CAIE C,11 ;MAKE ANY CONTIGUOUS BLANK CHARS, + CAIN C,40 ;LOOK LIKE A SINGLE TAB + JRST [ MOVEI C,11 + LDB TT,T + CAIE TT,11 + JUMPN TT,.+1 + JRST UMLIN1] + TLNN T,760000 + JRST UMLIN2 +UMLIN3: IDPB C,T + JRST UMLIN1 + +UMLIN2: GETFS (TT) + SETZM (TT) + SETZM 1(TT) + HRRM TT,-1(T) + HRR T,TT + JRST UMLIN3 + +UMLIN4: SKIPN 1(B) + JRST UMLIN1 + SETZ C, + LDB TT,T + CAIN TT,11 ;IF END OF LINE IS BLANK CHAR, + DPB C,T ;THEN MAKE IT NULL + POPJ P, + +UWDIN: SOSG IOHD+2 + IN DAT, + JRST UWDIN1 + GETSTS DAT,C + TLNE C,740000 + OUTSTR[ASCIZ/DISK ERROR +/] + TLNE C,20000 + OUTSTR[ASCIZ/PREMATURE END OF FILE +/] + MOVE P,ERRP +INUML2: RELEASE DAT, + TRO MCHG + JRST PUTFS + +UWDIN1: ILDB C,IOHD+1 + JUMPE C,UWDIN + POPJ P, + ; READ LOCATION FROM STRING +URDTAB: JFCL + PUSHJ P,GTCONP + PUSHJ P,GTSLTL + +UREAD: TLNN A,760000 + JRST [ TRNE A,-1 + HRR A,-1(A) + TRNE A,-1 + JRST .+1 + SETZ C, + POPJ P,] + ILDB C,A + POPJ P, + SUBTTL INPUT SIGNAL NAME CHANGE FILE +ISIGCH: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/SIGNAL NAME CHANGE (CHG) INPUT /] + MOVSI T,EXTCHG + PUSHJ P,SETNAM + POPJ P, + INIT DAT,0 + 'DSK ' + IOHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > + OUTSTR[ASCIZ/ +/] + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + SKIPE E,PONPNT + PUSHJ P,ACLRP + SETZM FIND + MOVSI C,17 + SKIPE A,PONPNT + PUSHJ P,CLRBTS +ISIGC1: PUSHJ P,RSTRC + JRST ISIGCF ;OK EOF, DONE + JRST ISIGCE ;NOT OK EOF + JRST ISIGLE ;NULL, SKIP LINE + CAIE TTT,11 + JRST ISIGLF + PUSH P,B + MOVE A,B + ADD A,[POINT 7,1] + PUSHJ P,SIGMAA ;MAKE COMPARE STRING + POP P,B + PUSHJ P,PUTFS + PUSHJ P,RSTRC + JRST ISIGCE ;NOT OK EOF + JRST ISIGCE ;NOT OK EOF + JRST ISIGLE ;NULL SIGNAL, LINE ERROR + CAIE TTT,12 + JRST ISIGLF ;NOT EOL, LINE ERROR + MOVEM B,DX1 + SKIPE H,PONPNT + PUSHJ P,SIGCDO + MOVE B,DX1 + PUSHJ P,PUTFS + JRST ISIGC1 + +ISIGLF: PUSHJ P,PUTFS +ISIGLE: PUSHJ P,CHGSKP + JRST ISIGCE + OUTSTR[ASCIZ/ERROR IN INPUT LINE, SKIPPING LINE. +/] + JRST ISIGC1 + +ISIGCE: OUTSTR[ASCIZ/EOF WHERE NOT EXPECTED. +/] +ISIGCF: RELEASE DAT, + MOVE T,FIND + MOVEM T,FNDNUM ;STORE FOR MACRO CALL AT ;R + JUMPE T,.+2 + SETOM FIND + SKIPN T,FNDNUM + JRST [ OUTSTR[ASCIZ/NO/] + JRST ISIGC2] + PUSHJ P,DECOUT +ISIGC2: OUTSTR[ASCIZ/ SIGNAL NAME/] + MOVE T,FNDNUM + CAIE T,1 + OUTCHR["S"] + OUTSTR[ASCIZ/ CHANGED. +/] + POPJ P, + ;CHANGE FILE INPUT SUBRS +CHGSKP: CAIN TTT,12 + JRST CPOPJ1 + PUSHJ P,ICHG + POPJ P, + JRST CHGSKP + +ICHG: SOSG IOHD+2 + IN DAT, + JRST ICHG1 + GETSTS DAT,TTT + TRNE TTT,740000 + OUTSTR[ASCIZ/INPUT IO ERROR. +/] + POPJ P, ;ALWAYS GIVE EOF RETURN + +ICHG1: ILDB TTT,IOHD+1 + CAIN TTT,15 + JRST ICHG + JUMPN TTT,CPOPJ1 + JRST ICHG + +RSTRC: PUSHJ P,ICHG + POPJ P, + CAIN TTT,11 + JRST RSTRC ;SKIP OVER TABS + AOS (P) ;DIRECT RETURN IS FOR IMMEDIATE EOF + CAIN TTT,12 + JRST CPOPJ1 ;INDICATE NULL STRING + GETFS(B) + PUSH P,B + ADD B,[POINT 7,0,34] +RSTRC1: SETZM (B) + SETZM 1(B) +RSTRC2: IDPB TTT,B + PUSHJ P,ICHG + JRST RSTRCE + CAIE TTT,11 + CAIN TTT,12 + JRST RSTRCF + TLNE B,760000 + JRST RSTRC2 + PUSH P,TTT + GETFS(TTT) + HRRM TTT,-1(B) + HRR B,TTT + POP P,TTT + JRST RSTRC1 + +RSTRCF: POP P,B + JRST CPOPJ2 + +RSTRCE: POP P,B + JRST PUTFS ;RETURN STRING AND INDICATE EOF + ;INPUT SIGNAL NAME CHANGE FILE +ICPNCH: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/CONNECTOR PIN (CPN) INPUT /] + MOVSI T,EXTCPN + PUSHJ P,SETNAM + POPJ P, + INIT DAT,0 + 'DSK ' + IOHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > + OUTSTR[ASCIZ/ +/] + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + SKIPE E,PONPNT + PUSHJ P,ACLRP + SETZM FIND + MOVSI C,1 ;MARK BIT + SKIPE A,PONPNT + PUSHJ P,CLRBTS ;CLEAR IT +ICPNC1: PUSHJ P,RSTRC + JRST ICPNCF ;OK EOF, DONE + JRST ICPNCE ;NOT OK EOF + JRST ICPNLE ;NULL, SKIP LINE + CAIE TTT,11 + JRST ICPNLF + PUSH P,B + MOVE A,B + ADD A,[POINT 7,1] + MOVE T,[PUSHJ P,UREAD] + MOVEM T,GTCHRX + PUSHJ P,GTCONP + JRST ICPNLF + JRST ICPNLF + CAIA ;LOC OK + JRST INUML5 ;BRS SEEN, LOSE + JUMPN C,ICPNLF ;ERROR IF NOT EOS + POP P,B + PUSHJ P,PUTFS ;RETURN STRING + PUSHJ P,RSTRC ;NOW GET SIGNAL NAME + JRST ICPNCE ;NOT OK EOF + JRST ICPNCE ;NOT OK EOF + JRST ICPNLE ;NULL SIGNAL, LINE ERROR + CAIE TTT,12 + JRST ICPNLF ;NOT EOL, LINE ERROR + PUSH P,B + MOVE A,B + ADD A,[POINT 7,1] + PUSHJ P,SIGMAA ;MAKE COMPARE STRING + POP P,B + PUSHJ P,PUTFS + SKIPE H,PONPNT + PUSHJ P,CPNDO ;DO THIS LINE + JRST ICPNC1 + +ICPNLF: PUSHJ P,PUTFS +ICPNLE: PUSHJ P,CHGSKP + JRST ICPNCE + OUTSTR[ASCIZ/ERROR IN INPUT LINE, SKIPPING LINE. +/] + JRST ICPNC1 + +ICPNCE: OUTSTR[ASCIZ/EOF WHERE NOT EXPECTED. +/] +ICPNCF: RELEASE DAT, + MOVE T,FIND + MOVEM T,FNDNUM ;STORE FOR MACRO CALL AT ;R + JUMPE T,.+2 + SETOM FIND + SKIPN T,FNDNUM + JRST [ OUTSTR[ASCIZ/NO/] + JRST ICPNC2] + PUSHJ P,DECOUT +ICPNC2: OUTSTR[ASCIZ/ CONNECTOR PIN/] + MOVE T,FNDNUM + CAIE T,1 + OUTCHR["S"] + OUTSTR[ASCIZ/ SET. +/] + POPJ P, + ;IMPLEMENT ONE CHANGE LINE +CPNDO: FETCHL(T,H,PBIT) + TLNE T,CPIN!1 ;DON'T DO IF ALREADY CONNECTOR PIN, OR PEVIOUSLY LOOKED AT + JRST CPNDO1 + FETCH(A,H,PTXT) + JUMPE A,CPNDO1 ;ALSO IF NO TEXT + FETCH(A,A,TCSTR) + ADD A,[POINT 7,1] + MOVEI B,SIGTAB + PUSHJ P,SIGMAT ;COMPARE TO PREVIOUSLY READ STRING + JRST CPNDO1 ;NO MATCH + JFCL ;EQUIVALENT IS CLOSE ENOUGH + MOVE T,H ;GET PIN + PUSH P,H + MOVE H,[1,,CPNCHK] ;NOW SEE IF CPIN ALREADY EXISTS ON WIRE + PUSHJ P,RECUR1 ;SETUP WDOLST + SKIPN WDOLST ;ANYTHING IN LIST + JRST CPNDO2 + TLZ WFLAG + PUSHJ P,RECCHK + TLNE WFLAG + JRST CPNDO2 ;CPIN ALREADY ON WIRE (CPNCHK RETURN) + MOVE A,(P) + PUSHJ P,SETLET ;PUT CONNECTOR PIN HERE + MOVE H,(P) + SETBIT(FOUNDP,TT,H,PBIT) + AOS FIND +CPNDO2: POP P,H +CPNDO1: HRRZ H,(H) + JUMPN H,CPNDO + POPJ P, + +CPNCHK: JFCL + FETCHL(T,A,PBIT) + TLNN T,CPIN + JRST WRECUR + TLO WFLAG + SKIPE B,WDOLST + PUSHJ P,PUTFS + SETZM WDOLST + POPJ P, +>;MD + SUBTTL RDVER TABLES! +MD,< +%IV6: ANDI TTT,3 + ANDI TTT,3 + ANDI TTT,3 +REPEAT IOVER-2, +;**RDVER + +%IV7: PUSHJ P,LNOLD + PUSHJ P,LNOLD + PUSHJ P,LNOLD + PUSHJ P,LNOLD + PUSHJ P,LNOLD + PUSHJ P,LNNEW0 + PUSHJ P,LNNEW +REPEAT IOVER-6, +;**RDVER + +LNOLD: LDB A,[POINT 6,TT,8] + LSH A,3 + SKIPE A + TRO A,3 + DPB A,[POINT 12,LETTER,11] + HLRZ A,TT + DPB A,[POINT 6,LETTER,23] + PUSHJ P,WORDIN + DPB TTT,[POINT 6,LETTER,29] + HLRZ TTT,TTT + DPB TTT,[POINT 6,LETTER,17] + JRST LNNEWB + +LNNEW0: PUSHJ P,WORDIN + LDB TT,[POINT 6,TTT,5] + DPB TT,[POINT 4,TTT,3] + LDB TT,[POINT 6,TTT,11] + LSH TT,3 + SKIPE TT + TRO TT,3 + DPB TT,[POINT 8,TTT,11] + PUSHJ P,LNNEWT + JRST LNNEWB + +LNNEW: PUSHJ P,LNNEWS + JRST LNNEWB + +LNNEWS: PUSHJ P,WORDIN +LNNEWT: MOVEM TTT,LETTER + PUSHJ P,WORDIN + MOVEM TTT,NUMBER + POPJ P, +>;MD + +LNNEWB: +MD,< LDB TT,[POINT 5,LETTER,8] + MOVE TT,L2N+100(TT) + DPB TT,[POINT 5,LETTER,8] +>;MD + LDB TT,[POINT 6,LETTER,23] + MOVE TT,L2N+100(TT) + DPB TT,[POINT 6,LETTER,23] + POPJ P, + + ;%IV8,%IV10,%IV11,%IV12,%IV13 +MPC,< +%IV8: PUSHJ P,LNOLD0 + PUSHJ P,LNOLD + PUSHJ P,LNOLD + PUSHJ P,LNOLD + PUSHJ P,LNOLD + PUSHJ P,LNNEW + PUSHJ P,LNNEW + PUSHJ P,LNNEWS +REPEAT IOVER-7, +;**RDVER + +LNOLD0: TRNN TT,400000 ;VERY OLD VERSION? + JRST LNOLD ;NO, GO TO LNOLD + HLRZ TT,TT + DPB TT,[POINT 6,LETTER,23] + PUSHJ P,WORDIN + DPB TT,[POINT 6,LETTER,29] + JRST LNNEWB + +LNOLD: LSH TT,-9 + DPB TT,[POINT 6,LETTER,23] + LSH TT,-9 + DPB TT,[POINT 6,LETTER,29] + JRST LNNEWB + +LNNEW: PUSHJ P,LNNEWS + JRST LNNEWB + +LNNEWS: HLRZM TT,LETTER + PUSHJ P,WORDIN ;GET X,Y OFFSET + MOVEM TTT,NUMBER + POPJ P, +>;MPC + +MD,< +%IV10: CAIN TTT,400000 +REPEAT IOVER, +;**RDVER + +RDV3D: PUSHJ P,FFNDID + JRST NNDOWN + JRST OLDVRD + +%IV11: CAIN TTT,400000 +REPEAT IOVER, +;**RDVER + +RDV3U: PUSHJ P,FFNDID + JRST NNUP + JRST OLDVRU + +%IV12: CAIN TTT,400000 +REPEAT IOVER, +;**RDVER + +RDV3L: PUSHJ P,FFNDID + JRST NNLEFT + JRST OLDVRL + +%IV13: CAIN TTT,400000 +REPEAT IOVER, +;**RDVER + +RDV3R: PUSHJ P,FFNDID + JRST NNRIGHT + JRST OLDVRR +>;MD + + ;%IV14 +%IV14: JFCL ;DON'T CHANGE OLD PIN #'S + JFCL + JFCL +MPC,< PUSHJ P,PADPIN + PUSHJ P,PADPIN + PUSHJ P,PADPIN +>;MPC +REPEAT IOVER-2,< PUSHJ P,GPADPN > +;**RDVER + +MPC,< +PADPIN: FETCH(TT,D,PBIT) + TRNE TT,FEEDTH ;PINS WERE DEFAULTED BY BPYES + AOS ADDR(D,PIN) ;TYPE 1 PAD FOR FEEDTHROUGHS + TRNE TT,2000 ;OLD UNPADDED FEEDTHROUGH BIT! + CLEAR(D,PIN) ;IN WHICH CASE 0 + POPJ P, +>;MPC + +GPADPN: +MPC,< FETCH(TT,D,PBIT) + TLNE TT,ISPIN ;IS IT A HOLE? + TLNN M,TYPNLY ;AND SPECIAL INPUT MODE + JRST NPDCNG ;NO + TRNN TTT,-1 ;PAD TYPE ALREADY? + MOVEI TTT,1 ;NO PAD IT +NPDCNG: HRRZS TTT + CAMLE TTT,MXPADN + MOVEM TTT,MXPADN +>;MPC + STORE(TTT,D,PIN) ;STO PIN OR PAD NUMBER + JRST WORDIN + + ;%IV17 +MD,< +%IV17: PUSHJ P,LNOLD1 + PUSHJ P,LNOLD1 + PUSHJ P,LNOLD1 + PUSHJ P,LNOLD1 + PUSHJ P,LNOLD1 + PUSHJ P,LNOLD0 + PUSHJ P,LNNEW1 +REPEAT IOVER-6, +;**RDVER + +LNOLD1: DPB TTT,[POINT 6,(T),23] + LDB A,[POINT 6,TTT,26] + LSH A,3 + SKIPE A + TRO A,3 + DPB A,[POINT 12,(T),11] + HLRZ TTT,TTT + ROT TTT,-1 + ADDI TTT,1 + DPB TTT,[POINT 6,(T),35] ;USE THIS AS NUM + ROT TTT,1 + ANDI TTT,1 + ADDI TTT,1 + DPB TTT,[POINT 6,(T),29] ;AND THIS AS LET + PUSHJ P,WORDIN + HLRZ TTT,TTT + DPB TTT,[POINT 6,(T),17] + SETZM 1(T) + JRST LNNEWC + +LNOLD0: LDB A,[POINT 6,TTT,5] + DPB A,[POINT 4,TTT,3] + LDB A,[POINT 6,TTT,11] + LDB TT,[POINT 6,TTT,23] ;THIS IS TO CATCH POOR LOSERS + JUMPE TT,[DPB A,[POINT 24,TTT,23] + JRST LNNEW1] + LSH A,3 + SKIPE A + TRO A,3 + DPB A,[POINT 8,TTT,11] +LNNEW1: PUSHJ P,LNNWS1 + JRST LNNEWC + +LNNWS1: MOVEM TTT,(T) + PUSHJ P,WORDIN + MOVEM TTT,1(T) + POPJ P, +>;MD +LNNEWC: LDB TT,[POINT 6,(T),29] + MOVE TT,L2N+100(TT) + DPB TT,[POINT 6,(T),29] +MD,< LDB TT,[POINT 5,(T),8] + MOVE TT,L2N+100(TT) + DPB TT,[POINT 5,(T),8] +>;MD + LDB TT,[POINT 6,(T),23] + MOVE TT,L2N+100(TT) + DPB TT,[POINT 6,(T),23] + POPJ P, + + ;%IV18 +%IV18: CAIN TTT,400000 ;DONE? +REPEAT IOVER, +;**RDVER + +RDV3S: +MPC,< PUSHJ P,FFNDID + CAIA + JRST OLDV11 ;FOUND IT + FSWITCH +>;MPC + PUSHJ P,FFNDID ;TRY THIS SIDE! + JRST RDSPNT ;LOSE + JRST OLDV11 + +MPC,< +%IV20: PUSHJ P,CLOCO + PUSHJ P,CLOCO + PUSHJ P,CLOCO + PUSHJ P,CLOCO + PUSHJ P,CLOCO + PUSHJ P,CLOCO0 + PUSHJ P,CLOCOS +REPEAT IOVER-6, +;**RDVER + +CLOCO: DPB TTT,[POINT 6,CRDLOC,17] ;NUMBER + HLRZ TTT,TTT + ANDI TTT,77 + LSH TTT,3 + SKIPE TTT + TRO TTT,3 + DPB TTT,[POINT 12,CRDLOC,11] + JRST CLOCOT + +CLOCO0: MOVEM TTT,CRDLOC + LDB TTT,[POINT 6,CRDLOC,5] + DPB TTT,[POINT 4,CRDLOC,3] + LDB TTT,[POINT 6,CRDLOC,11] + LSH TTT,3 + SKIPE TTT + TRO TTT,3 + DPB TTT,[POINT 8,CRDLOC,11] + JRST CLOCOT + +CLOCOS: MOVEM TTT,CRDLOC +CLOCOT: LDB TTT,[POINT 5,CRDLOC,8] + MOVE TTT,L2N+100(TTT) + DPB TTT,[POINT 5,CRDLOC,8] + POPJ P, +>;MPC diff --git a/src/draw/iosub.328 b/src/draw/iosub.328 new file mode 100644 index 00000000..3c28b497 --- /dev/null +++ b/src/draw/iosub.328 @@ -0,0 +1,1236 @@ +;IOSUB.FAI.50, 15-NOV-75 19:10:22, EDIT BY HELLIWELL +VERSION(IOSUB,5) +;FILENAME SCANNER, ENTER WITH DEFAULT EXTENSION IN T + +;CHANGE REMEMBERED NAME +CENAME: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW REMEMBERED /] + SETZ T, + PUSHJ P,SETNAM + SETZM FILNAM ;CLEAR IF CR ALONE + ENTPPN ;GET SOME PPN + MOVE T,FILNAM + MOVEM T,LSTNAM + HLLZ T,FILEXT + MOVEM T,LSTEXT + MOVE T,FILPPN + MOVEM T,LSTPPN + JRST FILEUP + +ZENAME: MOVEI B,LSTNAM + JRST CLRSIG + +SETLST: +NODEC,< SETZ TT, + DSKPPN TT, + MOVEM TT,FILPPN +>;NODEC +DEC,< SETZM FILPPN > ;WRITE ON CURRENT AREA + MOVEM T,FILEXT + SKIPN T,LSTNAM + POPJ P, + MOVEM T,FILNAM + MOVSI T,() + MOVEM T,FILDAT + SETOM THEREXISTS + JRST CPOPJ1 + +SETNAM: MOVEM T,DEFEXT +NAMCON: MOVE T,DEFEXT + MOVEM T,FILEXT + SETZM THEREXISTS + MOVSI T,() + MOVEM T,FILDAT + SETZ T, ;CLEAR THIS WORD +NODEC,< DSKPPN T, ;HIS OWN PPN + MOVEM T,FILPPN +>;NODEC +DEC,< SETZM FILPPN > + SETOM NOPPNF ;ASSUME NO PPN WILL BE TYPED + TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ/FILENAME?/] + PUSHJ P,GETNAM ;SCAN FILENAME + CAIN C,12 + JUMPE T,CPOPJ ;LET HIM OUT IF HE TYPES NOTHING +VIROS,< + SETZM VSTBUF + CAIE C,74 + JRST NOVDIR + JUMPN T,NOVDIR + PUSHJ P,VSTPPN ;CONVERT STRING TO PPN + JRST ILLNAM + SETZM NOPPNF ;FLAG PPN TYPED + MOVEM T,FILPPN + PUSHJ P,GETNAM ;NOW GET FILENAME +NOVDIR: +>;VIROS + JUMPN T,NOLSTG + CAIE C,TEXIST ;DOES HE WANT SAME AS INPUT? + JRST NOLSTG + PUSHJ P,GETNAM + JUMPN T,ILLNAM + MOVE T,LSTPPN + MOVEM T,FILPPN + SKIPN T,LSTNAM ;YES, GET IT(WILL LOSE IF 0) + JRST [ PUSHJ P,SCARF + OUTSTR[ASCIZ/NO REMEBERED NAME! +/] + JRST NAMCON] + SETOM THEREXISTS +NOLSTG: +NOITS,< + MOVEM T,FILNAM ;SAVE FILENAME + CAIN C,"[" ;ANY EXTENSION? + JRST NOEXT ;NO + CAIN C,12 + JRST NOEXT ;NO + CAIE C,"." + JRST [ ILLNAM: PUSHJ P,INNERR + JRST NAMCON] + PUSHJ P,GETWRD ;SCAN EXTENSION + HLLZM T,FILEXT ;SAVE IT. + SETZM THEREXISTS ;RE-ENABLE EXIST CHECK +NOEXT: CAIN C,12 ;HERE TO SCAN PPN + JRST CPOPJ1 ;LEAVE NOW + SETZM THEREXISTS ;RE-ENABLE EXIST CHECK +VIROS,< SKIPN VSTBUF > ;DID WE USE FORMAT? + CAIE C,"[" + JRST ILLNAM ;MUST BE [ +NOCMU,< + PUSHJ P,GETPPN + JRST ILLNAM + HRLM T,FILPPN ;AND SAVE + CAIE C,"," ;BETTER BE COMMA + JRST NOPRG + PUSHJ P,GETPPN + JRST ILLNAM + HRRM T,FILPPN ;AND SAVE +>;NOCMU +CMU,< SETZM PPNBUF ;CLEAR OUT A BUFFER FOR THE PPN + SETZM PPNBUF+1 + SETZM PPNBUF+2 + MOVE A,[POINT 7,PPNBUF] + MOVEI TTT,=13 ;13 CHARACTERS AT MOST! +CMUPP1: PUSHJ P,GETLIN ;GET A CHAR + CAIL C,"0" ;0-9 ARE LEGAL IN PPN'S + CAILE C,"9" + CAIN C,"," ;SO IS COMMA + JRST CMUPP2 ;SO GO STORE IT + CAIL C,"a" ;CONVERT LOWER CASE TO UPPER CASE + CAILE C,"z" + JRST .+2 + SUBI C,40 ;CONVERT IT + CAIL C,"A" ;IS IT A LETTER + CAILE C,"Z" + JRST CMUPP3 ;NO, MUST BE THE END +CMUPP2: IDPB C,A + SOJG TTT,CMUPP1 ;AND GO GET ANOTHER CHAR UNLES WE HAVE 13 + PUSHJ P,GETLIN ;IN WHICH CASE WE GET THE "]" (WE HOPE!) +CMUPP3: MOVE A,[XWD FILPPN,PPNBUF] + CMUDEC A, ;CONVERT THE PPN TO DEC FORMAT + JRST ILLNAM ;WHOOPS, BAD PPN +>;CMU +NOPRG: SETZ T, + CAIN C,"]" ;BETTER END WITH THIS + PUSHJ P,GETNAM ;MAKE SURE HE DIDN'T TYPE TO MUCH + JUMPN T,ILLNAM ;LOSE IF HE DID + CAIE C,12 + JRST ILLNAM ;DIDN'T END WITH LF + SETZM NOPPNF ;HE TYPED A PPN! + JRST CPOPJ1 +>;NOITS +ITS,< + CAIE C,";" + JRST NOLST1 + SETZM NOPPNF + MOVEM T,FILPPN + PUSHJ P,GETNAM + JUMPE T,CPOPJ ;STILL NOT REASONABLE +NOLST1: CAIE C,40 + CAIN C,12 + SKIPA + JRST [ ILLNAM: PUSHJ P,INNERR + JRST NAMCON] + SETZM THEREXISTS ;RENABLE OVERWRITE CHECK + MOVEM T,FILNAM + CAIN C,12 + JRST CPOPJ1 ;DONE + PUSHJ P,GETNAM ;GET SECOND FILE NAME + CAIE C,12 + JRST ILLNAM ;EXTRA GARBAGE AT END + JUMPE T,ILLNAM + MOVEM T,FILEXT + JRST CPOPJ1 +>;ITS + +IFN DECSW!IIISW,< +GETPPN: PUSHJ P,GETOCT + JUMPE T,CPOPJ + CAIG T,777777 + AOS (P) + POPJ P, + +GETOCT: SETZ T, +GETNU1: PUSHJ P,GETLIN + CAIE C,15 + CAIN C,40 + JRST GETNU1 + CAIL C,"0" + CAILE C,"7" + POPJ P, + LSH T,3 + ADDI T,-"0"(C) + JRST GETNU1 +>;IFN DECSW!IIISW + +STANFO,< +GETPPN: PUSHJ P,GETWRD + JUMPE T,CPOPJ + TRNE T,-1 + POPJ P, + HLRZ T,T ;ONLY 3 LETTERS + TRNN T,7777 + LSH T,-14 + TRNN T,77 + LSH T,-6 + JRST CPOPJ1 +>;STANFO + +NOITS, +GETWRD: SETZ T, ;WORD WILL ACCUMULATE HERE + MOVE A,[POINT 6,T] ;BYTE POINTER TO DEPOSIT CHARACTERS +CHRGET: PUSHJ P,GETLIN ;READ A CHAR +ISCHRX: CAIE C,15 ;IGNORE LF'S + CAIN C,40 ;AND SPACES + JRST CHRGET + CAIL C,"0" ;NUMBERS ARE LEGAL + CAILE C,"9" + CAIA + JRST CHROK + CAILE C,"z" + POPJ P, ;BREAK CHAR. + CAIL C,"a" + SUBI C,40 ;CHANGE LOWER CASE TO UPPER + CAIL C,"A" ;NOW ONLY UPPER CASE LETTERS ARE LEGAL + CAILE C,"Z" + POPJ P, ;BREAK +CHROK: SUBI C,40 ;NO, MAKE IT SIXBIT + TLNE A,770000 ;END OF WORD? + IDPB C,A ;STORE + JRST CHRGET + +;ITS NAME SCANNER +ITS,< +GETNAM: SETZ T, ;WORD WILL ACCUMULATE HERE + MOVE A,[POINT 6,T] ;BYTE POINTER TO DEPOSIT CHARACTERS +GETNM1: PUSHJ P,GETLIN ;READ A CHAR + CAIE C,15 ;IGNORE LF'S + CAIN C,40 ;AND SPACES + JRST GETNM1 + SKIPA +GETNM2: PUSHJ P,GETLIN + CAIN C,15 + JRST GETNM2 + CAIL C,"a" + CAILE C,"z" + CAIA + SUBI C,40 ;LOWERCASE + CAILE C,40 ;BREAK ON SPACE + CAILE C,"_" + POPJ P, ;NOT SIXBIT CHARACTER + CAIE C,";" + CAIN C,":" + POPJ P, + SUBI C,40 ;NO, MAKE IT SIXBIT + TLNE A,770000 ;END OF WORD? + IDPB C,A ;STORE + JRST GETNM2 +>;ITS + ;VIROR DIRECTORY STRING TO PPN CONVERTER + +VIROS,< +VSTPPN: MOVE T,[POINT 7,VSTBUF] +VSTPP1: PUSHJ P,GETLIN + CAIL C,"A"+40 + CAILE C,"Z"+40 + CAIA + SUBI C,40 + CAIN C,240 + JRST RECOGN + CAIN C,76 + JRST EXACTM + CAIE C,ALTMOD + CAIN C,12 + POPJ P, + CAMN T,[VSTEND] + POPJ P, + IDPB C,T + JRST VSTPP1 + +EXACTM: SETZ TT, + IDPB TT,T + PUSH P,1 + PUSH P,2 + SETZ 1, + HRROI 2,VSTBUF + STDIR + JRST VSTPPX + JRST VSTPPX + POP P,2 + POP P,1 + JRST VSTWIN + +RECOGN: MOVEI C,ALTMOD ;IF ERROR, WE PRINT, NOT INNERR + SETZ TT, + MOVE TTT,T + IDPB TT,TTT + SETOM TYPFLG + TLNE M,DSKACT!MACACT + SETZM TYPFLG + PUSH P,1 + PUSH P,2 + PUSH P,T + MOVNI 1,1 + HRROI 2,VSTBUF + STDIR + JRST VSTPPY + JRST VSTPPW + POP P,1 + SKIPN TYPFLG + JRST VSTPPB + PUSH P,3 +VSTPPZ: CAMN 1,2 ;DONE YET? + JRST VSTPPA + ILDB 3,1 + OUTCHR 3 + JRST VSTPPZ + +VSTPPA: POP P,3 + OUTCHR[76] +VSTPPB: POP P,2 + POP P,1 + JRST VSTWIN + +VSTPPW: POP P,(P) + POP P,2 + POP P,1 + SKIPE TYPFLG + OUTCHR[7] + JRST VSTPP1 + +VSTPPY: POP P,(P) + SKIPE TYPFLG + OUTSTR[ASCIZ/? /] +VSTPPX: POP P,2 + POP P,1 + POPJ P, + +VSTWIN: MOVE T,[POINT 7,VSTBUF] + MOVEM T,STPTR + MOVE T,[3,,STPPN] + SETZM USRPPN + COMPT. T, + JRST [ OUTSTR[ASCIZ/COMPT. UUO FAILED ON PREVIOUSLY RECOGNIZED DIRECTORY NAME. +/] + POPJ P,] + MOVE T,USRPPN + JRST CPOPJ1 +>;VIROS + ;DSKIN +DSKIN: PUSHJ P,GETDSK + POPJ P, + POPJ P, + +DSKINH: PUSHJ P,GETDSK + POPJ P, + JRST IBREAK ;NOW TURN IT OFF + +GETDSK: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/DISK INPUT /] + MOVSI T,EXTDSK + PUSHJ P,SETNAM + POPJ P, + INIT IDSK,0 + 'DSK ' + DSKHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK!!! +/] + CDSK: + NOLAY, + LAY,;LAY + SETOM DSKEND + JRST DSPSET] + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP IDSK,FILNAM + JRST [ PUSHJ P,LOOKER + RELEASE IDSK, + JRST CDSK] +DEC,< JSR IDSK,LOOKCK > + OUTSTR[ASCIZ/ +/] + MOVEI T,DSKBUF + EXCH T,.JBFF + INBUF IDSK,1 + MOVEM T,.JBFF +NOLAY, +LAY,;LAY + SETZM DSKEND + SETZM BRKCHR + AOS (P) + JRST DSPSET + + + + + +DSKCHR: SOSG DSKHD+2 + IN IDSK, + CAIA + JRST DSKREL + IBP DSKHD+1 + MOVE C,@DSKHD+1 + TRNE C,1 + JRST [ MOVNI C,5 + ADDM C,DSKHD+2 + AOS DSKHD+1 + JRST DSKCHR] + LDB C,DSKHD+1 + JUMPE C,DSKCHR + CAIE C,15 + CAIN C,14 + JRST DSKCHR + CAME C,BRKCHR + JRST CPOPJ1 +MAKBRK: +NOLAY, ;BREAK INPUT +LAY,;LAY + MOVEI C,200+":" ;GENERATE END OF ;T + JRST CPOPJ1 + +IBREAK: ;ENTER HERE TO GENERATE INPUT BREAK FOR ERROR +NOLAY, +LAY,;LAY + TLNE M,MACACT ;STILL IN MACRO? + POPJ P, ;YES, SKIP PRINTOUT + OUTSTR[ASCIZ/DISK INPUT BREAK! +/] + JRST PLEVEL + +DSKREL: STATO IDSK,1B22 + JRST EFLUSH + PUSHJ P,IFLUSH ;FLUSH INPUT FILE IN NORMAL MANNER + JRST MAKBRK ;MAKE A : + +EFLUSH: OUTSTR[ASCIZ/DISK INPUT FILE ERROR FINISH!! +/] +IFLUSH: ;ENTER HERE JUST TO FLUSH DSKINPUT +NOLAY, +LAY,;LAY + SETOM DSKEND + OUTSTR[ASCIZ/END OF DISK INPUT FILE!! +/] + RELEASE IDSK, +PLEVEL: PUSHJ P,DSPSET + PUSH P,T + HRRZ T,MACPNT + SUBI T,MACPDL-1 + JUMPE T,NOLEVL + IDIVI T,5 + OUTSTR[ASCIZ/YOUR ARE NOW AT MACRO LEVEL /] + PUSHJ P,DECOUT + OUTSTR[ASCIZ/. +/] +NOLEVL: POP P,T + JRST ENDDSP + ;DKSOUT +PUTDSK: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/DISK OUTPUT /] + MOVSI T,EXTDSK + PUSHJ P,SETNAM + POPJ P, + ENTPPN +DEC,< RELEASE ODSK, > + INIT ODSK,0 + 'DSK ' + DSKOHD,,0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + DSKCLR: SETZM DSKOPN + RELEASE ODSK, +NODEC,< POPJ P, > +DEC,< JRST LOGINI> + ] + OUTSTR[ASCIZ/WRITING /] + MOVEI A,FILNAM + JSR FPRINT + ENTER ODSK,FILNAM + JRST [ OUTSTR[ASCIZ/, ENTER FAILED! +/] + JRST DSKCLR] + OUTSTR[ASCIZ/ +/] + MOVEI T,DSKOBF + EXCH T,.JBFF + OUTBUF ODSK,1 + MOVEM T,.JBFF + SETOM DSKOPN + POPJ P, + +DSKOCHR: + PUSH P,C ;SAVE CHAR. +SKEY,< CAIN C,ALTMOD + TRO C,600 ;MAKE SURE WE GET 4 ALTMODES +>;SKEY + LSH C,-7 + ANDI C,3 + JUMPE C,NOCM +NOSKEY,< MOVE C,BITTAB-1(C) + PUSHJ P,DCHR1 +>;NOSKEY +SKEY,< MOVN C,C + JRST .+1+3(C) + PUSHJ P,PUTALT + PUSHJ P,PUTALT + PUSHJ P,PUTALT +>;SKEY +NOCM: MOVE C,(P) + PUSHJ P,DCHR1 + POP P,C + POPJ P, + +NOSKEY,< +BITTAB: CTRL + META + CTLMTA +>;NOSKEY + +SKEY,< +PUTALT: MOVEI C,ALTMOD +>;SKEY +DCHR1: ANDI C,177 ;ONLY THIS +SKEY,< CAIN C,10 + MOVEI C,177 +>;SKEY + CAIE C,12 + JRST DCHR2 + MOVEI C,15 + PUSHJ P,DCHR2 + MOVEI C,12 +DCHR2: SKIPN DSKOPN ;INSIDE ERROR MAYBE? + POPJ P, ;YES + SOSG DSKOHD+2 + OUT ODSK, + JRST DCHR4 ;ALL OK, DEPOSIT CHAR + OUTSTR[ASCIZ/DISK OUTPUT ERROR! +/] + JRST DSKCLR +DCHR4: IDPB C,DSKOHD+1 + POPJ P, + ;PC CARD +MPC,< +DOCARD: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PC CARD (CRD) /] + MOVSI T,EXTCRD + PUSHJ P,SETNAM + POPJ P, + PUSHJ P,CRDREL + MOVE T,FILNAM + MOVEM T,CRDNAM + MOVE T,FILEXT + MOVEM T,CRDEXT + SKIPE NOPPNF ;SKIP IF PPN TYPED + SKIPE THEREXISTS ;NO PPN TYPED--FALL THRU IF THEREXISTS WAS TYPED + SKIPA T,FILPPN ;PPN OR THEREXISTS TYPED-USE PPN FROM SETNAM + MOVE T,LIBPPN ;NO " - USE LIBRARY + MOVEM T,CRDPPN + PUSHJ P,GETCRD + JRST [ PUSHJ P,ZCARD + JRST PERRET] + TRO MCHG + TLO M,CRDISP + POPJ P, + +ZCARD: PUSHJ P,CRDREL + TLZ M,CRDISP + TRO MCHG + POPJ P, + +GETCRD: MOVEM P,PERRSAV + INIT ICARD,10 + 'DSK ' + CARDHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK!! +/] + POPJ P,] +CRDRD: OUTSTR[ASCIZ/READING CARD FROM /] + MOVEI A,CRDNAM + JSR FPRINT + MOVE T,CRDPPN + LOOKUP ICARD,CRDNAM + JRST [ PUSHJ P,LOOKER + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TRY ANOTHER CRD /] + PUSHJ P,GCRDNM ;GET FILE NAME + JRST [ RELEASE ICARD, + POPJ P,] + SETZM CRDDAT + JRST CRDRD] +DEC,< JSR ICARD,LOOKCK > +NODEC,< MOVEM T,CRDPPN > + OUTSTR[ASCIZ/ +/] + MOVEI TT,CRDBUF + EXCH TT,.JBFF + INBUF ICARD,2 + MOVEM TT,.JBFF + PUSHJ P,CARDIN + CAIE TTT,CRDVER ;CORRECT VERSION OF FILE? + JRST [ OUTSTR[ASCIZ/IMPROPER VERSION NUMBER FOR PC CARD DEFINITION FILE. +/] + POPJ P,] + PUSHJ P,CRDLP2 ;READ CARD OUTLINE INTO CRDLST + PUSH P,SID + JUMPL SID,CRDLP5 + SWITCH +CRDLP5: PUSHJ P,CRDLPP +CRDLP6: SWITCH ;GET TO BACK SIDE + PUSHJ P,CRDLPP + SWITCH ;BACK TO FRONT SIDE + PUSHJ P,RSHORT ;READ SHORTING BARS + SWITCH ;AND BACK SIDE + PUSHJ P,RSHORT + POP P,T + EQV T,SID + JUMPL T,CRDLP7 + SWITCH +CRDLP7: MOVSS CRDLST + PUSHJ P,CRDLP2 ;PUT TARGET LOCS IN LEFT HALF OF CRDLST + MOVSS CRDLST + RELEASE ICARD, + JRST CPOPJ1 + +GCRDNM: MOVSI T,EXTCRD + PUSHJ P,SETNAM + POPJ P, + MOVE T,FILNAM + MOVEM T,CRDNAM + MOVE T,FILEXT + MOVEM T,CRDEXT + MOVE T,FILPPN + MOVEM T,CRDPPN + JRST CPOPJ1 + ;MORE PC CARD +RSHORT: SKIPA G,[BARLST] +CRDLP2: MOVEI G,CRDLST +CRDLP3: PUSHJ P,CARDIN + CAIE TTT,400000 + CAMN TTT,[(400000)] ;END OF BOARDER? + POPJ P, ;YES + GETFS(B) + HRRM B,(G) + MOVE G,B + MOVEM TTT,1(B) + SETZM (B) ;CLEAR LINK + JRST CRDLP3 + +CRDLPP: PUSHJ P,CARDIN + CAMN TTT,[(400000)] + POPJ P, + TDZ TTT,[(1)1] + PUSHJ P,FIND.P ;ATTEMPT TO ATTACH TO EXISTING POINT IF ANY + FETCHL(TT,D,PBIT) + TLNE TT,ISPIN!FEEDTH!CPIN + PUSHJ P,[FETCH(T,D,PXY) + JRST PNTPUT] + PUSHJ P,CARDIN + TDZ TTT,[(1)1] + GETFS (TT) ;PLOC BLOCK + MOVEM TTT,1(TT) + STORE(TT,D,PLOC) + SETBIT(CPIN,T,D,PBIT) + PUSHJ P,CARDIN + MOVEM TTT,(TT) + MOVE B,D + PUSHJ P,REMPNT ;CPIN'S CAN'T BE IN ANY SETS! + JRST CRDLPP + +CRDREL:SETZM CRDNAM ;CLEAR CARD NAME + HRRZ B,CRDLST + PUSHJ P,PUTFS + HLRZ B,CRDLST + PUSHJ P,PUTFS + SETZM CRDLST + HRRZ B,BARLST + PUSHJ P,PUTFS + HLRZ B,BARLST + PUSHJ P,PUTFS + SETZM BARLST + MOVEI B,PONPNT + PUSHJ P,FNGDEL + MOVEI B,PONPN2 + JRST FNGDEL + +FNGDL3: PUSH P,A ;SAVE LAST POINTER + FETCHL(A,B,PBIT) + TLNN A,CPIN ;CONNECTOR PIN? + JRST NOCDL1 ;NO, SKIP + FETCH(A,B,PIN) + JUMPN A,NOCDEL + FETCH(T,B,PNEB) + JUMPE T,FNGDL2 ;OK IF NO NEIGHBORS +FNGDL1: SKIPE 1(T) ;ANY? + JRST NOCDEL ;YES, LEAVE HIM + SKIPN T,(T) ;NEIGHBOR OR NEXT POINTER + JRST FNGDL2 ;NO, PROCEDE + TLNN T,-1 ;NEIGHBOR? + JRST FNGDL1 ;NO, JUST POINTER + JRST NOCDEL + +FNGDL2: FETCH(T,B,PTXT) + JUMPN T,NOCDEL ;YES, NO DELETY + TRO TFLG ;DELETE PINS OK! + MOVE A,(P) ;SETUP LAST POINTER + PUSHJ P,DELPNT + POP P,B + JRST FNGDEL + +NOCDL1: POP P,B + HRRZ B,(B) +FNGDEL: MOVE A,B + HRRZ B,(B) + JUMPN B,FNGDL3 + TRZ TFLG ;NO DELETY PINS NO MORE + POPJ P, + +NOCDEL: CLRBIT(CPIN,T,B,PBIT) + FETCH(A,B,PLOC) + CLEAR(B,PLOC) + FSTRET (A) ;AND GIVE BACK BLOCK + JRST NOCDL1 + +CARDIN: SOSG CARDHD+2 + IN ICARD, + CAIA + JRST [ OUTSTR[ASCIZ/INPUT ERROR ON CARD! +/] + MOVE P,PERRSAV + JRST ZCARD] + ILDB TTT,CARDHD+1 + POPJ P, +>;MPC + ;THERE EXISTS CHECK +EXIST: PUSH P,FILEXT + PUSH P,FILPPN + LOOKUP DAT,FILNAM + SKIPA T,FILEXT + SETO T, + CLOSE DAT, ;GODDAMN BAG-BITING MOTHER-FUCKING CRETINOUS SYSTEM + POP P,FILPPN + POP P,FILEXT + MOVSI TT,777000 ;MASK OUT ALL BUT PROTECTION + ANDM TT,FILDAT + HRRES T + JUMPE T,CPOPJ1 ;DOESN'T EXIST + JUMPL T,ITDOES + HRRM T,FILEXT ;PUT HERE FOR PRINT + OUTSTR[ASCIZ/SAFETY LOOKUP OF /] + MOVEI A,FILNAM + JSR FPRINT + PUSHJ P,LOOKER + OUTSTR[ASCIZ/WRITE ANYWAY?/] + INCHRW C + CAIN C,15 + INCHRW C + JRST ITDONT + +ITDOES: SKIPE THEREXISTS + JRST CPOPJ1 +DEC,< PUSHJ P,CHKPPN ;REALLY SAME PPN? + JRST CPOPJ1 ;NO, TAKE NOT FOUND RETURN +>;DEC + TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ/FILE ALREADY EXISTS; REPLACE IT?/] + PUSHJ P,GETCHR +ITDONT: OUTSTR [ASCIZ/ +/] + CAIE C,"Y" + CAIN C,"y" + AOSA (P) + RELEASE DAT, + POPJ P, + ;FIND THIS, THAT, AND THE OTHER THING +;TTT = (TPID,,BID) or (,,PID) +;RETURNS D  ITEM + +;FAST FIND, USE HASH TABLE +FFNDID: TLNE TTT,-1 ;PIN? + JRST FFNDPID ;YES + ADD TTT,OLDPID ;ADD OFFSET + MOVE TT,TTT + ANDI TT,LHASHP-1 + HRRZ D,@PHASHP ;LOOK IN HASH BUCKET + JUMPN D,FNDID1 + POPJ P, + +FNDID: TLNE TTT,-1 ;PIN? + JRST FNDPID ;YES + ADD TTT,OLDPID ;ADD OFFSET + SKIPN D,PONPNT + POPJ P, +FNDID1: FETCH(T,D,PID) ;SEE IF POINT ID SAME (MIGHT BE PIN THOUGH) + CAIE T,(TTT) + JRST FNDID2 + FETCH(TT,D,PBIT) ;OR BPBIT + TRNN TT,ISPIN ;IF IS PIN, NO MATCH + JRST CPOPJ1 +FNDID2: FETCH(D,D,PNXT) + JUMPN D,FNDID1 + POPJ P, + +;FIND BODY PIN +;TTT = (TPID,,BID) +; PUSHJ P,FNDPID +; (FAILS, PIN NOT FOUND) D = BODY +; D = PIN + +FFNDPID: + ADD TTT,OLDBID + HLRZ TT,TTT ;SAVE TPID + PUSH P,B + PUSHJ P,FFNDBID ;FIND BODY + JRST FBLOS + JRST FNDBI2 + +FNDPID: ADD TTT,OLDBID + HLRZ TT,TTT + PUSH P,B + PUSHJ P,FNDBID + JRST FBLOS +FNDBI2: FETCH(D,B,BLNK) ;PIN LIST ON BODY + JUMPE D,FBLOS +FNDB1: +MPC,< FETCHL(TTT,D,BPBIT) + EQV TTT,SID + JUMPGE TTT,NOTPID ;SKIP IF WRONG SIDE +>;MPC + FETCH(T,D,BPLOC) ;TPIN BLOCK IN TYPE + FETCH(T,T,TPID) ;PIN ID + CAIN T,(TT) + JRST GOTPID +NOTPID: FETCH(D,D,BPLNK) + JUMPN D,FNDB1 + SKIPA D,B +FBLOS: SETZ D, +FBLOS1: POP P,B + POPJ P, + +GOTPID: AOS -1(P) + JRST FBLOS1 + + ;FNDBID - FIND BODY FROM BID +;TTT = BID +;SKIPS IF SUCCESSFUL +;B = BODY + +FFNDBI: MOVE B,TTT + ANDI B,LHASHB-1 + SKIPN B,HASHB(B) + POPJ P, + JRST FNDBD1 + +FNDBID: SKIPN B,DBODPN ;SLOW VERS + POPJ P, +FNDBD1: FETCH(T,B,BID) + CAIN T,(TTT) + JRST CPOPJ1 + FETCH(B,B,BNXT) + JUMPN B,FNDBD1 + POPJ P, +MD,< +TNAME: PUSH P,T ;SAVE STRING POINTER ON STACK + MOVEI D,BODPNT-V.TNXT ;SIMULATE NORMAL LINK + HRRZ C,BODPNT ;TYPE POINTER + JUMPE C,RET21 ;NONE YET? +TN1: HRRZ A,(P) ;POINTER TO NAME (ARG) + FETCH(B,C,TNAM) + PUSHJ P,TXTMAT ;COMPARE + CAIA ;NOT THE SAME + JRST RET2 ;FOUND IT (POINTER TO TYPE IN C) + MOVE D,C ;LAGS ONE BEHIND C + FETCH(C,C,TNXT) + JUMPN C,TN1 +RET21: AOS -1(P) +RET2: POP P,T + POPJ P, +>;MD + +FIND.B: ;FIND POINTER CROSS-REFERENCE + HRRZ C,NEWBOD ;POINTER TO NEW BODY CROSS-REFERENCE LIST + JUMPE C,CPOPJ ;NOT FOUND +FB1: HLRZ A,1(C) ;EXTERNAL REPRESENTATION + CAIN A,(T) ;IS THIS THE ONE + JRST [ HRRZ B,1(C) ;INTERNAL REPRESENTATION + JRST CPOPJ1] ;SKIP RETURN + HRRZ C,(C) ;NEXT + JUMPN C,FB1 + POPJ P, ;NOT FOUND + ;SOME OUTPUT PRINTERS +OUTTX1: MOVE TT,1(T) + MOVEM TT,TTBUF + OUTSTR TTBUF + HRRZ T,(T) +OUTTXT: JUMPN T,OUTTX1 + POPJ P, + +OUTTCR: PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ +/] + POPJ P, + +MD,< +TTYPE: TVOFF + OUTSTR[ASCIZ/ +/] + PUSHJ P,TYSORT ;SORT LIST OF DEFINED TYPES + SETZM NNAMES + SETZ C, ;BLANK ONES FIRST + PUSHJ P,TTYPEW + SKIPN C,LIBLST + JRST TTYPE1 +TTYPEY: MOVE B,C + OUTSTR[ASCIZ/ +/] + PUSHJ P,LIBTYP + OUTSTR NAMBUF + SETZM NNAMES + PUSHJ P,TTYPEW + HRRZ C,(C) + JUMPN C,TTYPEY + OUTSTR[ASCIZ/ +/] +TTYPE1: TVON + POPJ P, + +TTYPEW: SKIPN A,BODPNT + POPJ P, + MOVE A,SORLST +TTYPEX: FETCH(B,A,Q2RH) + FETCH(T,B,TLIB) + CAME T,C ;SAME LIBRARY + JRST TTYPEZ + SOSGE NNAMES + JRST [ MOVEI T,8 + MOVEM T,NNAMES + OUTSTR[ASCIZ/ +/] + JRST .+2] + OUTCHR[11] + FETCH(T,B,TNAM) + PUSHJ P,OUTTXT +TTYPEZ: FETCH(A,A,QNXT) + JUMPN A,TTYPEX + POPJ P, + +;TYSORT - BUILD SORTED LIST OF TYPES +;RETURNS LIST IN SORLST, A + +TYSORT: SKIPE B,SORLST ;RECLAIM OLD SORTED LIST + PUSHJ P,PUTFS + SETZB A,SORLST + SKIPN E,BODPNT + POPJ P, +TYSOR4: MOVEI C,SORLST +TYSOR1: MOVE D,C ;SAVE BACK POINTER + FETCH(C,C,QNXT) + JUMPE C,TYSOR2 ;PUT AT END + FETCH(B,C,Q2RH) + FETCH(B,B,TNAM) + FETCH(A,E,TNAM) ;SORT NEXT TYPE INTO LIST + PUSHJ P,TXTCMP ;A .GE. B? + CAIA ;INSERT HERE + JRST TYSOR1 +TYSOR2: GETFS(T) + STORE(E,T,Q2RH) + STORE(C,T,QNXT) + STORE(T,D,QNXT) +TYSOR3: FETCH(E,E,TNXT) + JUMPN E,TYSOR4 + MOVE A,SORLST + POPJ P, + +LIBOUT: SKIPN LIBPPN + JRST LBNOPP + MOVE TTT,[POINT 7,NAMBUF] +ITS,< MOVE TT,LIBPPN + PUSHJ P,SIXOUT +>;ITS +NOITS,< HLLZ TT,LIBPPN + PUSHJ P,LSIXOUT + MOVEI TT,"," + IDPB TT,TTT + HRLZ TT,LIBPPN + PUSHJ P,LSIXOUT +>;NOITS + SETZ TT, + IDPB TT,TTT + OUTSTR[ASCIZ/LIBRARY AREA: /] + OUTSTR NAMBUF + OUTSTR[ASCIZ/ +/] +LBNOPP: SKIPN A,LIBLST + JRST MAPP0 +LIBOU1: MOVE B,A + PUSHJ P,LIBTYP + OUTSTR NAMBUF + OUTSTR[ASCIZ/ +/] + HRRZ A,(A) + JUMPN A,LIBOU1 +MAPP0: SKIPN A,MAPLST + POPJ P, + OUTSTR[ASCIZ/LIBRARY MAPPINGS: +/] +MAPP1: MOVE B,A + PUSHJ P,LIBTYP + OUTSTR NAMBUF + HLRZ B,(A) + HRRZ B,(B) + PUSHJ P,LIBTAB + OUTSTR NAMBUF + OUTSTR[ASCIZ/ +/] + HRRZ A,(A) + JUMPN A,MAPP1 + POPJ P, + +;CALL WITH B POINTING TO BODY DEF +OUTIT: FETCH(T,B,TNAM) + OUTCHR[42] + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/" /] + FETCH(B,B,TLIB) + JUMPE B,CPOPJ + PUSHJ P,LIBTYP + OUTSTR NAMBUF + POPJ P, + +LIBTYP: MOVE TTT,[POINT 7,NAMBUF] + JRST LIBTY1 +LIBTAB: MOVE TTT,[POINT 7,NAMBUF] + MOVEI T,11 + IDPB T,TTT +LIBTY1: +ITS,< HLRZ TT,(B) + MOVE TT,1(TT) + PUSHJ P,SIXOUT + MOVEI T,";" + IDPB T,TTT +>;ITS + MOVE TT,1(B) + PUSHJ P,SIXOUT + HLRZ B,(B) + HLLZ TT,(B) + JUMPE TT,NOLEXT +NOITS,< MOVEI T,"."> +ITS,< MOVEI T," "> + IDPB T,TTT + PUSHJ P,SIXOUT +NOLEXT: +NOITS,< MOVEI T,"[" + IDPB T,TTT +NOCMU,< + HLLZ TT,1(B) + PUSHJ P,LSIXOUT + MOVEI T,"," + IDPB T,TTT + HRLZ TT,1(B) + PUSHJ P,LSIXOUT +>;NOCMU +CMU,< + SKIPN TT,1(B) + DSKPPN TT, + MOVE T,[TT,,PPNBUF] + DECCMU T, + JRST [ PUSHJ P,LSIXOUT + JRST PPNDN3 ] + SKIPA TT,[POINT 7,PPNBUF] + IDPB T,TTT + ILDB T,TT + JUMPN T,.-2 +PPNDN3: +>;CMU + MOVEI T,"]" + IDPB T,TTT +>;NOITS + HRRZ T,(B) + MOVEI TT,"^" + TRNN T,TOPLVL + IDPB TT,TTT + SETZ T, + IDPB T,TTT + POPJ P, + + ;RELEASE TYPE BLOCK +;A = TYPE BLOCK + +TYPREL: FETCH(B,A,TNAM) + JUMPE B,TYPR1 ;PERHAPS ALREADY PARTIALLY RELEASED + PUSHJ P,PUTFS ;PUT BACK TYPE NAME +TYPR1: FETCH (B,A,TYP1) ;ABBREVIATED? + JUMPE B,[RETBLK(A,STYP) + POPJ P,] + FETCH(B,A,TLIN) ;POINTER TO LINES + PUSHJ P,PUTFS ;PUT THEM BACK + FETCH(B,A,TPIN) + PUSHJ P,PINREL ;GIVE UP PINS + FETCH(C,A,TPROP) ;PROPERTIES + PUSHJ P,TXTREL ;GIVE UP PROPS + FETCH(C,A,TDEF) ;GIVE UP DIP DEF LIST + PUSHJ P,DDFREL + RETBLK(A,TYPE) + POPJ P, + +;PINREL - RELEASE PIN LIST IN TYPE DEFINITION +; B = PIN LIST + +PINREL: JUMPE B,CPOPJ ;SKIP IF NO PINS + PUSH P,A + PUSH P,B + PUSH P,C +GIVPIN: HRRZ C,(B) + HLRZ A,(B) + CAIN A,2(B) + JRST [ RETBLK(B,TYPIN) + JRST GIVPN1] + FSTRET(A) + FSTRET(B) +GIVPN1: MOVE B,C + JUMPN B,GIVPIN + POP P,C + JRST POPBAJ + + ;MORE OUTPUT ROUTINES +LOUTX: ADD T,[POINT 7,1] +LOUTY: TLNE T,760000 + JRST LOUTZ + HRR T,-1(T) + TRNN T,-1 + POPJ P, +LOUTZ: ILDB TTT,T + JUMPE TTT,LOUTY + PUSHJ P,WORDOUT + JRST LOUTY + +LOUT: PUSHJ P,LOUTX +LCRLF: MOVEI TTT,15 + PUSHJ P,WORDOUT + MOVEI TTT,12 + JRST WORDOUT + +LTYPE: MOVEM P,PERRSAV + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/BODY DEF LISTING /] + MOVSI T,EXTBDL + PUSHJ P,SETNAM + POPJ P, + ENTPPN + INIT DAT,0 + 'DSK ' + XWD IOHD,0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DSK!! +/] + POPJ P,] + MOVEI T,IOBUF + EXCH T,.JBFF + OUTBUF DAT,2 + MOVEM T,.JBFF + PUSHJ P,EXIST + POPJ P, + MOVEI A,FILNAM + JSR FPRINT + ENTER DAT,FILNAM + JRST [ RELEASE DAT, + OUTSTR[ASCIZ/, ENTER FAILED. +/] + POPJ P,] + OUTSTR[ASCIZ/ +/] +FOR I IN(SITE1,SITE2,TAUTHOR,TIT1,TIT2,TMODULE,TVARIABLE,TPREFIX,TREV,TPROJ,TPAGE,TOF,TDCODE) +< SKIPE T,I + PUSHJ P,LOUT +> + MOVE B,[D,,B] ;POINT HIM AT HIMSELF AND D + SKIPN C,LSTNAM + JRST LTYPEN + HLLZ D,LSTEXT + MOVE E,LSTPPN + PUSHJ P,LTYPEF + PUSHJ P,LCRLF +LTYPEN: MOVEI A,BODPNT-V.TNXT + JRST LTYPE1 +LTYPE2: FETCH(T,A,TNAM) + PUSHJ P,LOUTX + FETCH(B,A,TLIB) + JUMPE B,LTYPE4 + PUSHJ P,LTYPET +LTYPE4: PUSHJ P,LCRLF +LTYPE1: FETCH(A,A,TNXT) + JUMPN A,LTYPE2 + RELEASE DAT, + POPJ P, + +LTYPET: PUSHJ P,LIBTAB + CAIA +LTYPEF: PUSHJ P,LIBTYP + MOVE T,[POINT 7,NAMBUF] + ILDB TTT,T + JUMPE TTT,CPOPJ + PUSHJ P,WORDOUT + JRST .-3 +>;MD + DECOUT: SKIPL T + JRST DECOU1 + MOVM T,T + OUTCHR ["-"] +DECOU1: IDIVI T,=10 + HRLM TT,(P) + JUMPE T,.+2 + PUSHJ P,DECOU1 + HLRZ T,(P) + ADDI T,60 + OUTCHR T + POPJ P, + +OCTOUT: IDIVI T,10 + HRLM TT,(P) + JUMPE T,.+2 + PUSHJ P,OCTOUT + HLRZ T,(P) + ADDI T,60 + OUTCHR T + POPJ P, + +SIXPNT: JUMPE TT,CPOPJ + SETZ T, + LSHC T,6 + ADDI T,40 + OUTCHR T + JRST SIXPNT diff --git a/src/draw/last.309 b/src/draw/last.309 new file mode 100644 index 00000000..494ed088 --- /dev/null +++ b/src/draw/last.309 @@ -0,0 +1,51 @@ +;LAST.FAI.3, 15-NOV-75 18:06:02, EDIT BY HELLIWELL +VERSION(LAST,3) + + +XLIST +.litbeg: +LIT +.litend: +STORAGE(IMPURE) +.varbeg: +VAR +ORG .+20 ;Overlap with boards file???? +-1 +.varend: +STORAGE(PURE) +LIST + +IFN LIBSW!TWOSW,< + +MD, +MPC, + +PASS1,< +DEPHASE +^LAY1E: +>;PASS1 + +PASS2,< +DEPHASE +^LAY2E: +TOTSUM__VERSUM ;PASS TOTAL BACK FOR FIXUP + +TWO,< +STORAGE(LOW) +^LOWEND: +>;TWO +END SAVE +>;PASS2 +^^PASSNM__PASSNM+1 +>;IFN LIBSW!TWOSW + +ONE,< +TOTSUM__VERSUM ;PASS TOTAL BACK FOR FIXUP +MD, +MPC, +>;ONE + +NOLAY,< +TOTSUM__VERSUM ;PASS TOTAL BACK FOR FIXUP +END STRT +>;NOLAY diff --git a/src/draw/lay.315 b/src/draw/lay.315 new file mode 100644 index 00000000..054b9ec9 --- /dev/null +++ b/src/draw/lay.315 @@ -0,0 +1,981 @@ +;LAY.FAI.21, 15-NOV-75 18:06:11, EDIT BY HELLIWELL +VERSION(LAY,3) +;CHECK FOR PASSED WIRE +LAY,< +BLCHK: SKIPN DPCPNT + JRST CKLTNM + HLRZ A,DPCPNT + HRRZ C,DPCPNT + CAMG A,C ;ANYTHING IN LIST? + JRST [ SKIPE B,BLPNTR ;MAKE SURE FLASHING STOPS WHEN + PUSHJ P,PUTFS ;HE EXPLICITLY PASSES NOTHING + SETZM BLPNTR + MPC,< SETZM UPINS > + JRST CKLTNM] + PUSHJ P,LINKST + HRRZ TT,DPCPNT +PASLOP: MOVE T,(TT) + MOVEM T,LETTER + MOVE T,1(TT) + MOVEM T,NUMBER + PUSHJ P,LOOK ;FIND IT + JRST PASLP1 + MOVE A,T + PUSHJ P,LINKIT +PASLP1: HRRZ TT,DPCPNT + ADDI TT,2 + HRRM TT,DPCPNT + HLRZ T,DPCPNT + CAMG TT,T + JRST PASLOP + PUSHJ P,LINKMK +NILWIR: SETZM DPCPNT ;DON'T TRACE AGAIN! + TLNE M,LCENTER + PUSHJ P,LCENMAK +CKLTNM: SKIPN LAYLET + POPJ P, + MOVE T,LAYLET + MOVEM T,LETTER + SETZM LAYLET + MOVE T,LAYNUM + MOVEM T,NUMBER + PUSHJ P,LOOK + JRST [ OUTSTR[ASCIZ/SORRY, COULDN'T FIND THE POINT THE OTHER PROG PASSED ME! +/] + POPJ P,] +ISLTNM: MOVE A,T +MPC,< FETCHL(T,A,PBIT) + TLNN T,CPIN ;IF CONNECTOR PIN, + JRST ISLTPN + EQV T,SID + JUMPL T,ISLTPN ;AND NOT ON THAT SIDE + SWITCH ;CHANGE SIDES + TRO MCHG +>;MPC +ISLTPN: FETCH(T,A,PXY) + JRST CHKON +>;LAY + +;ALLOCL - ASSIGN NUMBERS TO POINTS ON BLINK LIST +ALLOCL: SKIPN T,BLPNTR + POPJ P, + SETZM BLINKN +ALLOC1: HRRZ TT,1(T) + FETCHL(TT,TT,PBIT) +MPC,< TLNN TT,CPIN + TLNE TT,FRONT +>;MPC + TLNN TT,CPIN!ISPIN + JRST ALLOC2 + AOS TT,BLINKN + DPB TT,[POINT 17,(T),17] +ALLOC2: HRRZ T,(T) + JUMPN T,ALLOC1 +ALLOC3: EXCH T,BLINKN + CAILE T,"Z"-100 + SETOM BLINKN + POPJ P, + +IFN LAYSW!UMLSW,< +LINKMK: SKIPN T,BLPNTR + JRST ALLOCL +PASST2: SKIPGE (T) ;MARKED ALREADY? + JRST PASST4 ;YES + HRRZ TT,1(T) + FETCHL(TTT,TT,PBIT) +MD,< TLNN TTT,CPIN ;IF IT'S AN UNMARKED CPIN, MAYBE IT'S THE SAME AS A MARKED + JRST PASST6 ;CPIN SOMEWHERE ELSE IN THE LIST + FETCH(TT,TT,PLOC) + MOVE TT,(TT) ;LOC OF CPIN WE ARE LOOKING FOR + SKIPE CRDLOC + HLL TT,CRDLOC + MOVEM TT,LETTER + MOVE TT,BLPNTR +PASST8: SKIPL (TT) ;SKIP IF THIS ONE IS MARKED + JRST PASST7 + HRRZ TTT,1(TT) ;POINTER TO POINT + FETCHL(TTT,TT,PBIT) + TLNN TTT,CPIN + JRST PASST7 + HRRZ TTT,1(TT) + FETCH(TTT,TTT,PLOC) + MOVE TTT,(TTT) + SKIPE CRDLOC + HLL TTT,CRDLOC + CAMN TTT,LETTER ;IF THIS ONE MATCHES, THEN THE ORIGINAL CPIN IS OK + JRST PASST4 ;MAKE BELIEVE ITS BIT WAS SET +PASST7: HRRZ TT,(TT) + JUMPN TT,PASST8 + HRRZ TT,1(T) ;IT'S REALLY A LOSER + FETCHL(TT,TT,PBIT) +PASST6: +>;MD +MPC,< TLNN TT,CPIN + TLNE TT,FRONT +>;MPC + TLNN TT,CPIN!ISPIN + JRST PASST3 + AOS TTT,BLINKN ;ASSIGN ERRORS A LETTER TOO + TRO TTT,400000 ;MARK AS ERROR + HRLM TTT,(T) + CAIA +PASST3: HRRZS (T) +PASST5: HRRZ T,(T) + JUMPN T,PASST2 + JRST ALLOC3 + +PASST4: AOS TTT,BLINKN + HRLM TTT,(T) ;STORE # AND CLEAR FLAG + JRST PASST5 + +LINKST: SKIPE B,BLPNTR ;RETURN LIST + PUSHJ P,PUTFS + SETZM BLPNTR +MPC,< SETZM UPINS > + SETZM BLINKN +LAY,< SETZM DOPASS ;DON'T PASS PINS BACK> + MOVSI C,1 +MPC,< SKIPE A,PONPN2 + PUSHJ P,CLRBTS +>;MPC + SKIPE A,PONPNT + JRST CLRBTS + POPJ P, + +LINKIT: PUSH P,A ;WILL NEED THIS IN A MINUTE + PUSHJ P,WIRLNK ;TRACE PIN AND FRIENDS! + POP P,A + SKIPN T,BLPNTR ;NOW MARK PIN IN LIST + POPJ P, +PASST1: CAMN A,1(T) + JRST PASCK1 + HRRZ T,(T) + JUMPN T,PASST1 + POPJ P, + +PASCK1: MOVSI TT,400000 + IORM TT,(T) +MPC,< POPJ P, > +MD,< FETCHL(T,A,PBIT) + TLNN T,ISPIN ;PIN? + POPJ P, ;NO, DONE + FETCH(T,A,PLOC) + FETCH(T,T,TPNAM) + FETCH(TT,A,BBODY) + MOVE A,BLPNTR +PASCK2: SKIPGE (A) + JRST PASCK3 + HRRZ TTT,1(A) + FETCH(TTT,TTT,BBODY) + CAME TTT,TT ;SAME? + JRST PASCK3 ;NO + HRRZ TTT,1(A) + FETCHL(TTT,TTT,BPBIT) + TLNN TTT,ISPIN + JRST PASCK3 + HRRZ TTT,1(A) + FETCH(TTT,TTT,BPLOC) + FETCH(TTT,TTT,TPNAM) + CAME TTT,T ;SAME LOW ID? + JRST PASCK3 + MOVSI TTT,400000 + IORM TTT,(A) +PASCK3: HRRZ A,(A) + JUMPN A,PASCK2 + POPJ P, +>;MD +>;LAYSW!UMLSW + ;DISPLAY BLINKING STUFF +IFN LAYSW!UMLSW,< +CLRERR: TRON M,ERRORD + TRO MCHG + POPJ P, + +SETERR: TRZE M,ERRORD + TRO MCHG + POPJ P, +>;UMLSW!LAYSW + +BLDISP: + MOVEI T,BLPG +SHORT,< SKIPN SERR1 ;ANY SHORT ERRORS TO SHOW? + SKIPE SERR2 + JRST ISSHRT +>;SHORT + SKIPN E,BLPNTR + JRST HYDPOG ;NOTHING ANYWAY +SHORT, + MOVEM T,PGLASS + PUSHJ P,DPYSET +SHORT,< SKIPN E,BLPNTR ;ANY REGULAR BLINKING STUFF? + JRST NDOBL +>;SHORT +MD,< MOVE T,DEFBRT + ADD T,BLBRT + PUSHJ P,DPYBRT + SETZM OFFCLC ;NO CON OFF SCREEN YET +>;MD +IFN UMLSW!LAYSW,< + SETZM OFFERR +MPC,< SKIPE UPINS + PUSHJ P,DUPIN +>;MPC +>;IFN UMLSW!LAYSW + PUSH P,M + TRZ M,MD,NPTEXT!NLINES ;DON'T SUPPRESS THESE + TLO M,CLOCS!PLOCS ;SHOW PINS +GOTBL1: PUSH P,E + HRRZ E,1(E) + JUMPE E,NOBLXX +MPC,< FETCHL(T,E,PBIT) + EQV T,SID + JUMPL T,THSSID + TRNN BTHSDS + JRST [ TLNE T,ISPIN ;DIP PIN? (EQV COMPLEMENTED IT) + JRST NOBLXX ;NO, SKIP THE REST + LDB T,[POINT 17,@(P),17] + SKIPE T ;CHECK FOR LETTER + PUSHJ P,BLNKLL +IFE LAYSW!UMLSW, ;THAT'S ALL IF NO ERRORS +IFN LAYSW!UMLSW,;LAYSW!UMLSW + ] ;YES, CHECK FOR _?? + SKIPA T,DEFBRT +THSSID: MOVE T,BTHBRT + ADD T,BLBRT + PUSHJ P,DPYBRT +>;MPC +MD,< FETCH(T,E,PXY) + PUSHJ P,ONSCR + PUSHJ P,OFFCCK ;CHECK FOR CON HERE +>;MD + PUSHJ P,DLOP3 + LDB T,[POINT 17,@(P),17] + SKIPE T + PUSHJ P,BLNKLL +IFN LAYSW!UMLSW,< + SKIPL @(P) ;ILL PIN MARK HERE? + JRST NOBLXX ;NO +LQQ: TRNE M,ERRORD + JRST NOBLXX + FETCH(T,E,PXY) + PUSHJ P,ONSCR + AOS OFFERR + PUSHJ P,BIGAIV + MOVE T,[ASCID/O_??/] + PUSHJ P,TXTDPB +>;LAYSW!UMLSW +NOBLXX: POP P,E + HRRZ E,(E) + JUMPN E,GOTBL1 + POP P,T + AND T,[CLOCS!PLOCS,,MD,NPTEXT!NLINES] + ANDCM M,[CLOCS!PLOCS,,MD,NPTEXT!NLINES] + IOR M,T +MD,< SKIPE E,OFFCLC + PUSHJ P,OFFCLD +>;MD +IFN UMLSW!LAYSW,< + SKIPE E,OFFERR + PUSHJ P,OFFERD +>;UMLSW!LAYSW +SHORT,< +NDOBL: SKIPN SERR1 + SKIPE SERR2 + PUSHJ P,SHRTDP ;DISPLAY SHORTS ALSO +>;SHORT + JRST BLINKO + +MD,< +OFFCCK: FETCHL(T,E,PBIT) + TLNE T,CPIN + MOVEM E,OFFCLC ;SAVE AS LAST CON SEEN OFF SCREEN + POPJ P, +>;MD +BLNKLL: PUSH P,T + MOVE T,STDBIG ;SMALL CHARS + PUSHJ P,DPYBIG + FETCH(T,E,PXY) + PUSHJ P,AIVECT + POP P,T + SKIPE BLINKN + JRST BLNKL1 +BLNKL2: LSH T,1 + ADDI T,201 ;ASCID LETTER + JRST TXTDPB + +BLNKL1: SUBI T,1 + IDIVI T,=26 + LSH T,1 + ADDI T,203 + PUSHJ P,TXTDPB + MOVE T,TT + LSH T,1 + ADDI T,203 + JRST TXTDPB + ;LCENTER +LCENMAK:SKIPN A,BLPNTR + POPJ P, + PUSHJ P,MMSET +LCEN1: HRRZ T,1(A) + FETCH(T,T,PXY) + PUSHJ P,MINMAX + HRRZ A,(A) + JUMPN A,LCEN1 + PUSHJ P,DOCENT ;DO THE CENTER THING + MOVE T,MODE + CAIE T,PNTM ;CAN WE MAKE A POINT CLOSEST? + POPJ P, ;NO + SETZ T, + PUSHJ P,LCENJC ;TRY TO FIND A CONNECTOR PIN + CAIA + JRST PJMPLC ;JUMP THE GUN (I MEAN POINT) + MOVEI T,1 ;OH WELL TRY TO A PIN + PUSHJ P,RTFND2 + POPJ P, ;CAN'T WIN THEM ALL + JRST PJMPLC ;GO GET'EM SCOUT + +DOCENT: TRZ TFLG ;INDICATE NO CHANGE YET! + MOVE T,MAXX + ADD T,MINX + ASH T,-=19 ;PUT IN RIGHT HALF AND DIVIDE BY 2 + CAME T,XOFF ;CHANGING? + TRO TFLG + MOVEM T,XOFF + MOVE T,MAXY + ADD T,MINY + ASH T,-1 + CAME T,YOFF + TRO TFLG + MOVEM T,YOFF + MOVE T,MAXX + SUB T,MINX + HLRES T + MOVE TT,MAXY + SUB TT,MINY + CAMG T,TT + MOVE T,TT +MPC,< MOVEI TT,30000 > +MD,< MOVEI TT,6000 > + IDIV TT,T + JUMPN TT,.+2 + MOVEI TT,1 +NODEC,< CAILE TT,=16 ;DON'T LET IT BE TOO BIG! + MOVEI TT,=16 +>;NODEC +DEC,< +MD,< CAILE TT,8 + MOVEI TT,8 +>;MD +MPC,< CAILE TT,=16 + MOVEI TT,=16 +>;MPC +>;DEC + CAME TT,NSCALE + TRO TFLG + MOVEM TT,NSCALE + TRZN TFLG + POPJ P, + MOVE T,YOFF + HRL T,XOFF + JRST CHANGE ;ALWAYS CENTER CURSOR SO WE CAN FIND IT + +MINMAX: CAML T,MAXX + MOVEM T,MAXX + CAMG T,MINX + MOVEM T,MINX + HRRES T + CAML T,MAXY + MOVEM T,MAXY + CAMG T,MINY + MOVEM T,MINY + POPJ P, + +MMSET: MOVSI T,400000 + MOVEM T,MAXX + MOVEM T,MAXY + HRLOI T,377777 + MOVEM T,MINX + MOVEM T,MINY + POPJ P, + ;BLINE + +LAY,< +ROUTE,< +MD,< +CTMT.: PUSHJ P,DODOT + JRST PERRET + MOVEI T,600+"." ;DO DOUBLE BUCKY . IN PC PROG + MOVEM T,ODISP ;SET CHARACTER DISPATCH + JRST GETPC +>;MD +>;ROUTE +>;LAY + +META.: +LAY,< + PUSHJ P,DODOT + JRST PERRET +MD,< JRST GETPC > +MPC,< JRST GETD > +>;LAY ;IF NOT LAYOUT VERSION, META. FALLS INTO CTRL. + +CTRL.: PUSHJ P,DODOT + JRST PERRET + POPJ P, + +DODOT: +LAY,< SETOM DOPASS > + PUSHJ P,GETCLS + POPJ P, + PUSH P,A + SKIPE B,BLPNTR + PUSHJ P,PUTFS + SETZM BLPNTR ;OUR LIST +IFN UMLSW!LAYSW,< +MPC,< SETZM UPINS > +>;IFN UMLSW!LAYSW + MOVSI C,1 ;CLEAR THIS BIT + SKIPE A,PONPNT + PUSHJ P,CLRBTS +MPC,< SKIPE A,PONPN2 + PUSHJ P,CLRBTS +>;MPC +LAY,< +;INITIALIZE PASSING LIST +MPC,< SETZM LAYLOC > +TWO,< MOVE T,.JBFF > ;GOOD PLACE TO START LIST +ONE,< MOVEI T,BLDATA > +LIB,< MOVEI T,BLDATA > + HRLI T,-1(T) + MOVEM T,DPCPNT ;LEFT HALF 0 MEANS NO POINTS YET! +>;LAY + POP P,A + PUSHJ P,WIRLNK ;TRACE OUT WIRE + PUSHJ P,ALLOCL ;ALLOC LETTERS + TLNE M,LCENTER ;CENTERING? + PUSHJ P,LCENMAK ;YES! + TRO MCHG ;UPDATE THIS DRAWING! + JRST CPOPJ1 + +LAY,< +PLAIN.: PUSHJ P,GETCLS + JRST PERRET + FETCHL(T,A,PBIT) + TLNE T,ISPIN + JRST PISPIN + TLNN T,CPIN + JRST [ OUTSTR[ASCIZ/SORRY, MUST BE PIN! +/] + POPJ P,] + SETZM LAYNUM + FETCH(T,A,PLOC) + MOVE T,(T) +MPC,< HLL T,CRDLOC > + MOVEM T,LAYLET +MD,< JRST GETPC > +MPC,< JRST GETD > + +PISPIN: FETCH(B,A,BBODY) +MD,< FETCH(TT,B,BLOC) > +MPC,< FETCH(TT,B,BLN) > + JUMPE TT,[OUTSTR[ASCIZ/SORRY, MUST HAVE LOCATION! +/] + POPJ P,] +MD,< FETCH(TT,B,BRSLOC) + MOVEM TT,LAYLET + FETCH(T,A,BPPN) + JUMPN A,GOTLPN + FETCH(T,A,BPLOC) + FETCH(T,T,TPNAM) +GOTLPN: +>;MD +MPC,< HLL TT,CRDLOC + MOVEM TT,LAYLET + FETCH(T,A,BPLOC) + FETCH(T,T,TPID) +>;MPC + HRRZM T,LAYNUM +MD,< JRST GETPC > +MPC,< JRST GETD > +>;LAY + ;TRACE A WIRE +;A = POINT + +WIRLNK: FETCH(D,A,PBIT) + TROE D,1 + POPJ P, + STORE(D,A,PBIT) +LAY,< SKIPE DOPASS ;PASSING? + PUSHJ P,PASS ;CALL ROUTINE TO PASS (MAYBE) AND PUT IN DISPLAY LIST +>;LAY +BUSLNK: GETFS(C) ;ENTER HERE FOR BUSSED THROUGH PINS (DON'T PASS) + HRRZM A,1(C) + EXCH C,BLPNTR + HRRZM C,@BLPNTR + MOVE C,BLPNTR + PUSH P,A +MD,< +;Also link all 4 neighbors + FOR @' I IN (D,U,L,R) +< HRRZ A,(P) + FETCH(A,A,PN'I) + SKIPE A + PUSHJ P,WIRLNK +> +;Also link any signals with same name + HRRZ A,(P) + FETCH(B,A,PTXT) + JUMPE B,WTLOP6 ;NO TEXT, THIS IS EASY + FETCH(B,B,TCSTR) + SKIPN C,PONPNT ;NOW ON SCREEN POINTS! + JRST WTLOP6 ;THAT'S ALL + MOVE A,B + ADD A,[POINT 7,1] + PUSHJ P,SIGMAA ;PREPARE COMPARE STRING +WTLOP4: FETCH(A,C,PTXT) + JUMPE A,WTLOP5 ;NO TEXT, SKIP CHECK + FETCH(A,A,TCSTR) + ADD A,[POINT 7,1] + MOVEI B,SIGTAB + PUSHJ P,SIGMAT ;SAME SIGNAL? + JRST WTLOP5 ;NO MATCH + JFCL ;EQUIVALENT IS CLOSE ENOUGH + PUSH P,C + MOVE A,C ;PUT INTO A + PUSHJ P,WIRLNK ;AND LINK INTO THIS LINE + POP P,C +WTLOP5: HRRZ C,(C) + JUMPN C,WTLOP4 +;Also link any bussed thru pins that are versions of this pin +WTLOP6: HRRZ B,(P) + FETCHL(TT,B,PBIT) + TLNN TT,ISPIN ;PIN? + JRST POPAJ + FETCH(T,B,BPLOC) + FETCH(T,T,TPNAM) + PUSH P,T ;SAVE ID ON STACK + FETCH(A,B,BBODY) + FETCH(A,A,BLNK) + JUMPE A,WTLOPX +WTLOP9: FETCH(B,A,BPLOC) + FETCH(T,B,TPNAM) + CAME T,(P) ;SAME DEFAULT NAME? + JRST WTLOP8 ;NO + FETCH(D,A,BPBIT) + TROE D,1 ;DONE IT YET? + JRST WTLOP8 + STORE(D,A,BPBIT) + PUSH P,A + PUSHJ P,BUSLNK ;FOLLOW IT + POP P,A +WTLOP8: FETCH(A,A,BPLNK) + JUMPN A,WTLOP9 +WTLOPX: SUB P,[1,,1] ;FLUSH ID + POP P,A + POPJ P, ;THAT'S ALL +>;MD + +MPC,< +;Link the neighboring points + FETCH(B,A,PNEB) + JUMPE B,WTLOPN + PUSH P,B +WTLOP0: MOVEI C,2 +WTLOP1: XCT(C)[ HLRZ A,(B) + HLRZ A,1(B) + HRRZ A,1(B)] + JUMPE A,WTLOP2 + PUSH P,C + PUSHJ P,WIRLNK + POP P,C + MOVE B,(P) +WTLOP2: SOJGE C,WTLOP1 + HRRZ B,(B) + HRRM B,(P) + JUMPN B,WTLOP0 + SUB P,[1,,1] +WTLOPN: POP P,B + FETCHL(T,B,PBIT) + TLNN T,ISPIN + JRST [ TLNN T,FEEDTH + POPJ P, + FETCH(A,B,PFEED) + JRST WTLOP5] +;Also link pin on other side of board + PUSHJ P,FNDOSP ;Find twin on other side of board + POPJ P, +WTLOP5: FETCH(D,A,PBIT) + TROE D,1 + POPJ P, + STORE(D,A,PBIT) + JRST BUSLNK + +;;Find pin on other side that is twin of this one +;B = pin +;returns skips +;A = other pin + +FNDOSP: FETCHL(TT,B,PBIT) + TLNN TT,ISPIN + PUSHJ P,FUCKUP ;Only sensible for body pins + FETCH(TT,B,BPLOC) + FETCH(TT,TT,TPID) + FETCH(A,B,BBODY) + FETCH(A,A,BLNK) ;Body has pins on both sides + JUMPE A,WTLOPE +WTLOP4: CAMN A,B ;SKIP THE SAME POINT + JRST WTLOP3 + FETCH(TTT,A,BPLOC) + FETCH(TTT,TTT,TPID) + CAMN TTT,TT + JRST CPOPJ1 +WTLOP3: FETCH(A,A,BPLNK) + JUMPN A,WTLOP4 +WTLOPE: OUTSTR[ASCIZ/Can't find pin on other side, OOPS! +/] + POPJ P, + +>;MPC + ;PASS INFO TO OTHER PROG +LAY,< +PASS: FETCHL(TT,A,PBIT) + TLNN TT,ISPIN ;DOES IT HAVE A LOCATION? + JRST CHKCPN ;NOT REG. PIN + FETCH(TT,A,BBODY) +MD,< FETCH(D,TT,BLOC) + JUMPE D,CPOPJ ;ANY LOC? + FETCH(D,TT,BRSLOC) + SKIPE CRDLOC ;GLOBAL LOC? + HLL D,CRDLOC ;YES, USE IT + MOVEM D,LETTER + FETCH(D,A,BPPN) + JUMPN D,ISPNUM ;ANY PIN #? + FETCH(D,A,BPLOC) + FETCH(D,D,TPNAM) +ISPNUM: +STONUM: MOVEM D,NUMBER ;YES, STO IT +>;MD +MPC,< FETCH(D,TT,BLN) + HLL D,CRDLOC ;USE CRDLOC ALSO + MOVEM D,LETTER + FETCH(T,A,BPLOC) + FETCH(T,T,TPID) + MOVEM T,NUMBER ;PASS PIN# HERE +>;MPC + JRST PASSM1 ;AND PASS IT + +CHKCPN: TLNN TT,CPIN ;CONNECTOR PIN? + POPJ P, ;NO, NO PASS + FETCH(TT,A,PLOC) + MOVE T,(TT) + MOVEM T,LETTER +MPC,< EXCH T,LAYLOC + SKIPE T + HRROS LAYLOC ;FLAG TOO MANY FOUND +>;MPC + SETZM NUMBER +PASSM1: HLRZ T,DPCPNT + ADDI T,2 +TWO,< + CAMG T,.JBREL + JRST COREOK + MOVE TT,T + CORE TT, + JRST [ OUTSTR[ASCIZ/CAN'T GET LOWER CORE TO PASS LOCATION! +CONTINUE TO INGNORE THIS POINT! +/] + HALT CPOPJ] +>;TWO +IFN LIBSW!ONESW,< + CAIGE T,BLDATA+BLLEN + JRST COREOK + OUTSTR[ASCIZ/TOO MANY LOCATIONS, WILL IGNORE SOME! +/] + POPJ P, +>;IFN LIBSW!ONESW +COREOK: HRLM T,DPCPNT + MOVE TT,LETTER + MOVEM TT,-1(T) + MOVE TT,NUMBER + MOVEM TT,(T) + POPJ P, +>;LAY + ;LOOK +IFN LAYSW!UMLSW,< +;CALL WITH LETTER & NUMBER SET TO LOC TO FIND +;RETURNS POINT IN T + +LOOK: SKIPN NUMBER ;PIN OR CPIN? + JRST LOOKC0 + SKIPN T,DBODPN + POPJ P, ;NONE AT ALL!!! + HRRZS (P) ;CLEAR SAVED BODY POINTER +LOOKB1: +MPC,< FETCH(TTT,T,BLN) > +MD,< FETCH(TTT,T,BLOC) + JUMPE TTT,NOTB1 ;NO BLOCK, NO MATCH + FETCH(TTT,T,BRSLOC) + SKIPE CRDLOC +>;MD + HLL TTT,CRDLOC + XOR TTT,LETTER ;MATCH IF EITHER HIGH PART 0 + TRNE TTT,-1 ;LOW PART MATCH? + JRST NOTB1 ;NO + JUMPE TTT,ISB ;ALL MATCH? + XOR TTT,LETTER ;CONVERT BACK + TLNE TTT,-1 ;ARE WE 0 CARD + MOVE TTT,LETTER ;NO CHECK HIM + TLNN TTT,-1 ;HIM OR ME 0? + JRST ISB ;YES, GO GET'M +NOTB1: HRRZ T,(T) + JUMPN T,LOOKB1 + POPJ P, ;NONE FOUND + +ISB: +MPC,< HLRZ TTT,(P) + SKIPE TTT + OUTSTR[ASCIZ/MORE THAN ONE DIP FOUND AT ISB! +/] +>;MPC + HRLM T,(P) +MD,< MOVE TTT,NUMBER + MOVEM TTT,DX1 +>;MD + FETCH(T,T,BLNK) + JUMPE T,NOTP3 +LOOKP1: +MPC,< FETCHL(TTT,T,BPBIT) + TLNN TTT,FRONT ;FIND ON FRONT + JRST NOTP1 + FETCH(TT,T,BPLOC) + FETCH(TTT,TT,TPID) +>;MPC +MD,< FETCH(TTT,T,BPPN) + JUMPE TTT,NOTP1 ;ANY PIN #? + FETCH(TT,T,BPLOC) + FETCH(TT,TT,TPBIT) + TRNE TT,BUSSED ;DON'T FIND THE BUSSED THROUGH ONES + JRST NOTP1 +>;MD + CAMN TTT,NUMBER + JRST CPOPJ1 +NOTP1: HLRZ TT,(T) +NOTP2: HRRZ T,(TT) + JUMPN T,LOOKP1 +NOTP3: HLRZ T,(P) ;GET SAVED BODY POINTER + JRST NOTB1 + +;LOOKUP CONNECTOR PIN +LOOKC0: +MPC,< PUSH P,A + MOVE A,LETTER + PUSHJ P,QUPIN + CAIA + JRST [ POP P,A + AOS UPINS + POPJ P,] + POP P,A + MOVE T,SID + HRR T,LETTER + TRNN T,1 + TLC T,FRONT + TLNN T,FRONT + SKIPA T,PONPN2 +>;MPC + MOVE T,PONPNT + JUMPE T,CPOPJ +LOOKC1: FETCHL(TTT,T,PBIT) + TLNN TTT,CPIN + JRST NOTC1 + FETCH(TTT,T,PLOC) + MOVE TTT,(TTT) +MD,< SKIPE CRDLOC > + HLL TTT,CRDLOC + XOR TTT,LETTER + JUMPE TTT,CPOPJ1 + TRNE TTT,-1 + JRST NOTC1 + XOR TTT,LETTER + TLNE TTT,-1 + MOVE TTT,LETTER + TLNN TTT,-1 + JRST CPOPJ1 +NOTC1: HRRZ T,(T) + JUMPN T,LOOKC1 + POPJ P, + ;CALL ROUTING SUBRS FOR BLINKING PINS! +MPC,< +ROUTE,< +CTMT.: +RTBL: SKIPN A,BLPNTR ;CAN WE DO ANYTHING? + JRST PERRET ;NO, LOSE + SETZM RCL1 + SETZM RCL2 ;FLAG AS EMPTY FOR NOW +RCL12: HRRZ T,1(A) ;GET PC POINT + JUMPE T,RCL121 + HLRZ TT,(A) ;CHECK LETTER + TRNN TT,377777 ;ANY LETTER ASSIGNED? + JRST RCL121 ;NO, DON'T COUNT THIS ONE + SKIPN RCL1 + JRST [ MOVEM T,RCL1 + JRST RCL121] + SKIPE RCL2 + JRST RTLOP + MOVEM T,RCL2 +RCL121: HRRZ A,(A) + JUMPN A,RCL12 + SKIPE RCL2 ;DID WE GET EXACTLY 2? + JRST GOTLET ;YES + OUTSTR[ASCIZ/NOT ENOUGH PINS BLINKING!!! +/] + POPJ P, + +RTLOP: OUTSTR[ASCIZ/TYPE ROUTING PAIR +/] + PUSHJ P,RTFND + JRST RTLOS1 + MOVEM T,RCL1 + PUSHJ P,RTFND + JRST RTLOS2 + MOVEM T,RCL2 +GOTLET: PUSHJ P,DOROUTE ;NOW DO ROUTING + SETZM RCL1 + SETZM RCL2 ;KEEP ARROWS AWAY + SKIPN A,BLPNTR ;LEAVE NOW IF 2 OR LESS + POPJ P, + MOVEI T,2 ;IF THIS GOES NEG, MUST ASK AGAIN +RCLQ1: HRRZ TT,1(A) + JUMPE TT,RCLQ2 + HLRZ TT,(A) + TRNE TT,377777 + SOJL T,RTLOP ;COUNT DOWN AND BLAST OFF +RCLQ2: HRRZ A,(A) + JUMPN A,RCLQ1 + POPJ P, ;NOT ENOUGH MORE, LEAVE + +RTLOS1: CAIN C,ALTMOD + POPJ P, ;LET HIM OUT + OUTSTR[ASCIZ/CAN'T FIND FIRST POINT! +/] + JRST RTLOP + +RTLOS2: CAIE C,ALTMOD + OUTSTR[ASCIZ/CAN'T FIND SECOND POINT! +/] + JRST RTLOP +>;ROUTE +>;MPC +>;LAYSW!UMLSW + ;PJUMP +PJUMP: +SHORT,< SKIPN SERR1 + SKIPE SERR2 + JRST PJUMP0 +>;SHORT + SKIPN BLPNTR + JRST PERRET +PJUMP0: PUSHJ P,RTFND ;FIND IT + JRST PJUMPN ;NOT FOUND +PJMPLC: MOVE A,T +MPC,< FETCHL(TT,A,PBIT) + EQV TT,SID + JUMPL TT,PJUMP1 ;ON RIGHT SIDE? + FETCHL(TT,A,PBIT) + TLNE TT,ISPIN + JRST [ MOVE B,A + PUSHJ P,FNDOSP ;Try to find twin pin on this side + JRST .+1 ;lose + JRST PJUMP1] + TRNE INLIN ;Drawing lines? + JRST PERRET ;yes, can't switch sides without feedthru + SWITCH + TRO MCHG ;MUST NOW UPDATE DISPLAY +PJUMP1: +>;MPC + TRZ INMOV + MOVE T,A + JRST SCLOSP + +PJUMPX: +SHORT,< CAIL C,"1" + CAILE C,"4" + JRST PJUMPS + XCT (C)0-"1"+[ + HRRZ T,SERR1 + HRRZ T,SERR2 + HLRZ T,SERR2 + HLRZ T,SERR1] + JUMPN T,CPOPJ1 + POPJ P, +PJUMPS: +>;SHORT + JRST INNERR + +PJUMPN: OUTSTR[ASCIZ/POINT NOT FOUND!! +/] + POPJ P, + +RTFND: TLNE M,DSKACT!MACACT + JRST RTFND1 +SHORT,< SKIPN BLPNTR + JRST [ OUTSTR[ASCIZ/TYPE NUMBER (1-4)/] + JRST RTFND1] +>;SHORT + SKIPN BLINKN + JRST [ OUTSTR[ASCIZ/TYPE LETTER/] + JRST RTFND0] + OUTSTR[ASCIZ/LARGE LIST, TYPE 2 LETTERS/] +RTFND0: +SHORT,< SKIPN SERR1 + SKIPE SERR2 + OUTSTR[ASCIZ/ OR NUMBER (1-4)/] +>;SHORT +RTFND1: PUSHJ P,GETCHR ;GET LETTER OF POINT HE WANTS! + CAIN C,"_" + JRST RTFNDC ;FIND CONNECTOR + CAIL C,"A" + CAILE C,"Z" + JRST PJUMPX + MOVEI T,-100(C) + SKIPN BLINKN + JRST RTFND2 + PUSHJ P,GETCHR + CAIL C,"A" + CAILE C,"Z" + JRST PJUMPX + SUBI T,1 + IMULI T,=26 + ADDI T,-100(C) +;ENTER HERE WITH 1 IN T TO FIND FIRST BLINKING POINT +;IF YOU COULDN'T FIND A CONNECTOR PIN TO JUMP TO +RTFND2: SKIPN TTT,BLPNTR ;GET POINTER + POPJ P, ;NONE +RTFND3: HLRZ TT,(TTT) ;GET PC POINT FROM THIS BLOCK + ANDI TT,377777 + CAMN TT,T + JRST [ HRRZ T,1(TTT) + JRST CPOPJ1] + HRRZ TTT,(TTT) ;NO, TRY NEXT BLOCK + JUMPN TTT,RTFND3 + POPJ P, ;NOT FOUND + +;TRY TO FIND nTH CONNECTOR PIN ON RUN +RTFNDC: PUSHJ P,READNC ;READ NUMBER (WILL POP POPJ ON ERROR) +;ENTER HERE WITH 0 IN T TO ATTEMPT TO JUMP TO CONNECTOR PIN +;WHEN CENTERING +LCENJC: SKIPN TTT,BLPNTR + POPJ P, ;LOSE +RTFNDD: HRRZ TT,1(TTT) ;GET POINTER + FETCHL(TT,TT,PBIT) + TLNE TT,CPIN ;CONNECTOR PIN? + SOJLE T,[HRRZ T,1(TTT) ;THIS IS IT + JRST CPOPJ1] + HRRZ TTT,(TTT) ;KEEP GOING DOWN LIST + JUMPN TTT,RTFNDD + POPJ P, ;NOT FOUND diff --git a/src/draw/lay.loader b/src/draw/lay.loader new file mode 100644 index 00000000..048cc1b6 --- /dev/null +++ b/src/draw/lay.loader @@ -0,0 +1,4 @@ +msail;jobdatl +mDRAW;layDl +MDRAW;LAYPCL +jlay1?Wtd diff --git a/src/draw/lay.login b/src/draw/lay.login new file mode 100644 index 00000000..82021b72 --- /dev/null +++ b/src/draw/lay.login @@ -0,0 +1,10 @@ +:stink lay +1L DECSYS;DECBOT BIN +.JBSA/STRT +56/107 +: +********* OK, now do the following ********* + :DELETE DATDRW;Lay OBIN + :RENAME DATDRW;Lay BIN, Lay OBIN + :PDUMP DATDRW;Lay BIN ; This is the file linked to by SYS1;TS LAY + \ No newline at end of file diff --git a/src/draw/lebel.200 b/src/draw/lebel.200 new file mode 100644 index 00000000..a83e83c9 --- /dev/null +++ b/src/draw/lebel.200 @@ -0,0 +1,638 @@ +SUBTTL LEBEL-INTEL I/O CARD +BEGIN LEBEL + +;THE TRANSFER VECTOR + +^LEBLTV: + JRST LCINIT ;INITIALIZE LETTER/NUMBER CONVERSION TABLES + JRST LOCOUT +MDPC,< + JRST CSLTLP + JRST SLTLN ;USE THE CANONICAL ONE +MD,< + JRST GTCONP + JRST CSLTLD +>;MD +>;MDPC +MWL,< + JRST WLOCOUT + JRST LOCPNC + JRST LOCPNW + JRST PRCNPN + JRST GETLOC + JRST PADPRT + JRST RAYDIP + JRST RAYCON +>;MWL + [ASCIZ/#LL#/] +MDPC,< [ASCIZ/P#-#/] + [ASCIZ/L#/] +>;MDPC +MWL,< [ASCIZ/L#/] + [ASCIZ/L/] +>;MWL +CHECK LEBLTV,LTVLEN + +L2NSUB: BLOCK L2NLEN +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +NNN__1 +FOR I IN(A,B,C,D,E,F,H,J,K,L,M,N,P,R,S,T,U,V,W,X,Y,Z) +< L2N2L I,0 +> +FOR I IN (G,I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + POPJ P, + +LOCOUT: LDB TTT,[POINT 6,A,23] + JUMPE TTT,CPOPJ ;NOTHING HERE, MEANS NOTHING AT ALL + MOVEI T,2 + MOVEM T,NDIG + TRNN A,7777 ;CON? + JRST [ PUTBYT "P" ;YES + MOVEI T,(TTT) + JRST NPUTDEC ] + PUTBYT @N2L(TTT) + LDB T,[POINT 12,A,35] ;NO, PRINT NUMBER + JRST NPUTDEC + +MDPC,< +;CALL IS LIKE GTSLTL EXCEPT: +;LAY,< CPOPJ1 RETURN MAY BE TAKEN ON TEXIST CHAR ALSO > + +MD,< +GTCONP: + SETZM DESTIN + PUSHJ P,GETLOC + POPJ P, + JRST CPOPJ1 + CAIE CHRREG,"-" + POPJ P, + HRRZM TT,DESTIN + GETNUM + JUMPE NUMREG,CPOPJ + CAILE NUMREG,7777 + POPJ P, + IORM NUMREG,DESTIN + JRST CPOPJ2 +>;MD + +CSLTLP: +MD,< + PUSHJ P,CSLTOUT +CSLTLD: HLRZ A,A + PUSH P,A + TRZ A,7777 + PUSHJ P,LOCOUT + POP P,A + PUTBYT "-" +>;MD + LDB T,[POINT 12,A,35] + MOVEI TTT,3 + MOVEM TTT,NDIG + JRST NPUTDEC +>;MDPC + +GETLOC: GETCH +MDPC,< + CAIN CHRREG,12 + JRST CPOPJ1 +>;MDPC + PUSHJ P,CHKLET + POPJ P, + HRLM CHRREG,(P) + GETNUM + JUMPE NUMREG,CPOPJ + CAILE NUMREG,7777 + POPJ P, + HLRZ TT,(P) + CAIN TT,"P" + JRST [ LSH NUMREG,14 + MOVEI TT,(NUMREG) +MDPC,< AOS (P) > + JRST CPOPJ1 ] + SKIPN TT,L2N-"A"(TT) ;CONVERT LETTER TO NUMBER + POPJ P, + LSH TT,14 + TRO TT,(NUMREG) +MDPC,< AOS (P) > + JRST CPOPJ2 + MWL,< +WLOCOUT:JRST LOCOUT + +LOCPNC: +LOCPNW: PUSHJ P,LOCOUT + HLRZ A,A + PUTBYT "-" +PRCNPN: LDB T,[POINT 12,A,35] +RAYDP1: MOVEI TTT,3 + MOVEM TTT,NDIG + JRST NPUTDEC + +RAYCON: PUSHJ P,LOCOUT ;PRINTS CONNECTOR SPEC FOR RAYTHEON WIRE WRAP + PUTSTR [ASCIZ / /] ;TWO SPACES + HLRZ A,A + JRST PRCNPN + +PADPRT: PUTSTR [ASCIZ / P/] ;MUST BE 3 CHARACTERS + MOVEI T,1(G) + JRST PUTDEC + +RAYDIP: PUSH P,T ;PRINT DIP PIN SPEC FOR RAYTHEON WIRE WRAP + PUSHJ P,LOCOUT + PUTSTR [ASCIZ / /] + POP P,T + TRZE T,L1416 + ADD A,[1,,0] ;14 PIN DIP IN 16 PIN SLOT + HLRZ T,A + JRST RAYDP1 +>;MWL +BEND LEBEL + +MWL,< +SUBTTL WIRE WRAP ROUTINES -- LEBEL/INTEL I/O BOARD +BEGIN WLEBEL + +comment  + +The two formats for the Lebel board are + +dip pin spec: A#-# +The A must literally be there. The first # is the slot # and the second # is +the dip pin #. + + +______|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| +| 11 17 23 35 +| 12 | 6 | 6 | 12 | +|_______________________|___________|___________|_______________________| + | | | | +< | | | |----------->loc # + | | | +< | | |------------------------------>loc letter + | | +< | |------------------------------------------>dip pin # + | +< |----------------------------------------------------------->flags + +connector pin spec: P#-# +The P must literally be there. The first # specfies the connector. (Connectors 1-8 +are the scotch-flex connectors. Connector 9 is the edge connector.) The second +# is the pin #. + +______|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| +| 11 17 23 35 +| 12 | 6 | 6 | 12 | +|_______________________|___________|___________|_______________________| + | | | | +< | | | |----------->pin # + | | | +< | | |------------------------------>connector # + | | +< | |------------------------------------------>not used + | +< |----------------------------------------------------------->flags + + + +^^WEBLTV__. ;TRANSFER VECTOR FOR DOUBLE HEIGHT DEC BOARDS + + -1 ;ISWW + JRST CPOPJ ;WWINIT + JRST MAPRC + JRST MAPPAD + JRST PINMAP + JRST PINBIT + JRST VGCON + JRST DISTPP ;POINT TO POINT WIRING + JRST FPWR + JRST FGND + JRST PGPRTM + JRST PGPRNT + JRST GNDCLR + JRST WAGGND + JRST GNDOUT + JRST VCCOUT + JRST RAYGEN + =10 ;NROWS (USED FOR UML ONLY) + =8 ;NCOLS (USED FOR UML ONLY) + 0 ;NCLPRG (USED FOR UML ONLY) + =80 ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(=9) ;NPADS (USED FOR UML ONLY) + XWD -=50,0 ;PADLET (USED FOR UML ONLY) + XWD -2,1 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST +CHECK WEBLTV,WTVLEN + +COMMENT  + +ALL CALCULATIONS DONE FROM PIN SIDE + +(0,0) AT LOWER LEFT HAND CORNER SLOTS NUMBERED FROM 1-80 +DIP SOCKETS ARE ARRANGED IN A 8X10 MATRIX (8 ROWS OF 10 DIPS) +HORIZONTAL SPACING: .500" VERTICAL SPACING: 1.000" +EACH DIP SOCKET IS 18 PINS (16 PINS FOR DIP 2 PINS FOR POWER AND GROUND) +DIP PINS 8 AND 9 ARE FACING THE BACKPLANE CONNECTOR FINGERS +GROUND AND POWER PINS ARE IN LINE AND OPPOSITE PINS 1 AND 16 RESPECTIVELY + +THERE ARE 100 BACKPLANE CONNECTOR PINS AS WELL AS CONNECTOR PINS TO RECEIVE +8 SCOTCH-FLEX (R) CABLES AT THE OPPOSITE END OF THE BOARD. THE SCOTCH-FLEX +CONNECTORS ARE LABEL P1-P8 WHILE THE BACKPLANE CONNECTOR IS LABELED P9. + + + +;DIP SOCKET GEOMETRY + +XOFSET__=1000 ;(XOFSET,YOFSET) IS LOCATION OF A71(9) +YOFSET__=1000 +XDIPSP__=500 ; .500" HORIZONTAL SPACING +YDIPSP__=1000 ;1.000" VERTICAL SPACING +XPINSP__=300 ; .300" HORIZONTAL SPACING BETWEEN PINS +YPINSP__=100 ; .100" VERTICAL SPACING BETWEEN PINS + +;SCOTCH FLEX CONNECTOR GEOMETRY + +PXOFST__=100 ;(PXOFST,PYOFST) IS LOCATION OF P5-14 +PYOFST__=9200 +PXSPAC__=1800 ;1.800" HORIZONTAL SPACING +PYSPAC__=300 ; .300" VERTICAL SPACING +PXPNSP__=100 ; .100" VERTICAL SPACING BETWEEN PINS +PYPNSP__=100 ; .100" HORIZONTAL SPACING BETWEEN PINS + +;BACKPLANE CONNECTOR GEOMETRY + +BXOFST__=0 ;(BXOFST,BYOFST) IS LOCATION OF P9-99 +BYOFST__=300 +BXPNSP__=125 ; .125" HORIZONTAL SPACING BETWEEN PINS +BYPNSP__=200 ; .200" VERTICAL SPACING BETWEEN PINS + ;PIN LOCATION TABLES (INDEX BY PIN #) + +;********************************************* DIP PINS + +DEFINE XY(X,Y) +< X*XPINSP,,Y*YPINSP +> + +PINTAB: XY(1,7) ;PIN 1 + XY(1,6) + XY(1,5) + XY(1,4) + XY(1,3) + XY(1,2) + XY(1,1) + XY(1,0) ;PIN 8 + XY(0,0) ;PIN 9 + XY(0,1) + XY(0,2) + XY(0,3) + XY(0,4) + XY(0,5) + XY(0,6) + XY(0,7) ;PIN 16 + +;********************************************* DIP LOCATIONS + +DEFINE XY(X,Y) +< ,, +> + +DIPLOC: + FOR Y_ 7, 0, -1 +> + +;********************************************* SCOTCH-FLEX PINS + +DEFINE XY(X,Y) +< PXPNSP*X,,PYPNSP*Y +> + +FLXPIN: + FOR Y_ 1, 0, -1 +> + +;********************************************* SCOTCH-FLEX CONNECTORS + +DEFINE XY(X,Y) +< ,, +> + +FLXLOC: + FOR Y_ 1, 0, -1 +> + +;********************************************* BACK PLANE CONNECTOR PINS + +DEFINE XY(X,Y) +< ,, +> + +BAKPIN: + FOR X_ =49, 0, -1 +> + +;TAKES A LOCATION IN A +; B # PINS ON DIP +;RETURN T X,,Y OF PIN +; TT PWR AND GND FLAGS +; TTT DETAB FOR DIP PIN, 0 FOR CONNECTOR PIN ( WE ALWAYS RETURN 0 BECAUSE +; WE ALWAYS DO POINT TO POINT WIRING) +;NON-SKIP DIP PIN ERROR +;SKIP CONNECTOR PIN ERROR +;DOUBLE SKIP SUCCESS + +MAPIT: JUMPL A,CONMAP ;IS IT A CONNECTOR PIN? + LDB TT,LOW12 ;GET LOC NUMBER + JUMPE TT,CPOPJ ;0 IS A NO,NO + CAMLE TT,DIPSLT ;THATS TOO BIG + POPJ P, + MOVE T,DIPLOC-1(TT) ;PUT XY IN T + LDB TT,[POINT 6,A,17] ;GET THE PIN # + TLNE A,MAPPWR!MAPGND ;POWER OR GROUND PIN? + JRST PINPGP + CAIE B,=14 ;I KNOW WHICH WAY 14 PIN DIPS GO IN TOO! + JRST MAPIT0 ;SIXTEEN DIP + ADDI TT,1 ;YES, FUDGE PIN # BY 1 +;I THINK I STILL NEED THIS! + ADD A,[1,,0] ;ALSO RETURN CORRECTED PIN # FOR DSTCLC + TLO A,PLUS1 ;AND INDICATE IT IS A PLUS 1 VERSION +MAPIT0: ADD T,PINTAB-1(TT) ;ADD EXTRA XY FOR PIN + SETZB TT,TTT ;NO AUTOMATIC GND/PWR, AND NO DETAB WITH POINT TO POINT + JRST CPOPJ2 + +;FIND CARD POWER OR GROUND FOR DIP + +PINPGP: JUMPN TT,CPOPJ ;PIN FIELD BETTER HAD BE CLEAR + ADDI T,=8*YPINSP ;BOTH GET THIS + TLNN A,MAPPWR ;POWER? + JRST [ ADD T,[XPINSP,,0] ;YES, IT IS OVER THIS MUCH + MOVSI TT,GND ;NO, RETURN GND BIT + SETZ TTT, ;AT END + JRST CPOPJ2] + MOVSI TT,PWR + SETZ TTT, + JRST CPOPJ2 + +;HERE TO RETURN LOCATION OF CONNECTOR PIN + +CONMAP: AOS (P) ;TAKE CONNECTOR PIN RETURN + LDB T,B6AT23 ;GET PIN GROUP + JUMPE T,CPOPJ ;CHECK LEGAL GROUP + CAILE T,=9 ;LEGAL? + POPJ P, + LDB TT,LOW12 ;GET PIN # + JUMPLE TT,CPOPJ + CAIN T,=9 ;SCOTCH-FLEX CONNECTOR? + JRST CONBAC ;NO, BACK PLANE CONNECTOR + MOVE T,FLXLOC-1(T) ;GET LOCATION OF CONNECTOR + CAILE TT,=26 ;ONLY 26 PINS PER CONNECTOR + POPJ P, + ADD T,FLXPIN-1(TT) ;LOC OF THIS PIN + SETZB TTT,TT + JRST CPOPJ1 ;CONNECTOR PIN RETURN + +CONBAC: CAILE TT,=100 ;HERE FOR BACK PLANE CONNECTOR + POPJ P, ;ILLEGAL + MOVE T,BAKPIN-1(TT) ;LOCATION OF BACK PLANE CONNECTOR + SETZB TTT,TT + JRST CPOPJ1 + +VGCON: POPJ P, ;NO CONNECTOR GROUND PINS + +;TAKES UML ROW,,COLUMN IN T AND RETURNS DIP LOCATION IN T +; NON-SKIP RETURN ERROR +; SKIP RETURN FOR HAPPINESS + +MAPRC: TDNE T,[777700,,770000] + POPJ P, + HLRZ TT,T + CAMLE TT,NROWS + POPJ P, + HRRZ T,T + CAMLE T,NCOLS + POPJ P, + SUBI T,1 ;WE GOT ROW IN TT, COL IN T + IMUL T,NROWS + SUB TT,NROWS ;RESULT SHOULD BE NEGATIVE + SUB T,TT + ADDI T,1+<1=12> ;ADD ONE AND TURN ON THAT EXTRA BIT + JRST CPOPJ1 + +MAPPAD: LSH T,13 + IORI T,(TT) + LSH T,1 + ADDI T,(TTT) + POPJ P, + +PINBIT: PUSHJ P,MAPIT + JFCL + SETZ TT, + POPJ P, + +PINMAP: PUSHJ P,MAPIT + JRST PINERR + JRST CONERR + JRST CPOPJ1 + +CONERR: PUTBYT "P" ;PRINT FORM P#-# + LDB T,B6AT23 + PUSHJ P,NUMPNT ;CONNECTOR # + OUTCHR ["-"] + LDB T,LOW12 + PUSHJ P,NUMPNT ;PIN # +CONER1: OUTSTR [ASCIZ / MAPPING ERROR +/] + POPJ P, + +PINERR: LDB T,B6AT23 ;FORM A#(#) + OUTCHR N2L(T) + LDB T,LOW12 ;SLOT # + PUSHJ P,NUMPNT + OUTCHR["("] + LDB T,[POINT 6,A,17] ;PIN # +LSTNUM: PUSHJ P,NUMPNT + OUTCHR [")"] + JRST CONER1 + +FPWR: JUMPL A,FPWRC + TLZ A,77!PLUS1!PLUS2 ;CLEAR PIN FIELD + TLO A,MAPPWR + POPJ P, + +FPWRC: LDB T,B6AT23 ;GET CONNECTOR + CAIGE T,=9 ;SCOTCH FLEX? + JRST [ MOVE A,FLXCRD(T) + TLO A,MAPPWR + POPJ P,] + PUSH P,B + PUSH P,C + PUSH P,G ;SAVE ALL THOSE AC'S + PUSH P,W + PUSH P,[MAPPWR,,0] +FGPCON: MOVE W,GPCAND ;GET THE GROUND PIN CANDIDATES + PUSH P,A ;SAVE THIS PIN + PUSH P,[300000,,0] ;A VERY LARGE # (BEST DISTANCE SO FAR) + PUSH P,[0] ;BEST PIN SO FAR +FGPCLP: MOVE A,-2(P) ;THE CONNECTOR PIN + MOVE C,(W) ;THE CARD PIN TO TRY + IOR C,-3(P) ;WILL BE MAPPWR OR MAPGND + PUSHJ P,DISTPP ;CALCULATE THE DISTANCE + JUMPE G,[JRST 4,.] ;ZERO DISTANCE IS AN ERROR + CAML G,-1(P) ;IS THIS ONE BETTER? + JRST FGPCL1 ;NO, TRY NEXT + MOVEM G,-1(P) ;BEST SO FAR + MOVE C,(W) + MOVEM C,(P) ;PIN +FGPCL1: AOBJN W,FGPCLP ;TRY NEXT CANDIDATE + MOVE A,(P) ;THE CLOSEST CARD PIN + IOR A,-3(P) ;SET MAPPWR OR MAPGND + SUB P,[4,,4] + POP P,W + POP P,G + POP P,C + POP P,B + POPJ P, + +FGND: JUMPL A,FCGND ;FOR GROUND FOR CONNECTOR PIN + TLZ A,77!PLUS1!PLUS2 + TLO A,MAPGND + POPJ P, + +FCGND: LDB T,B6AT23 ;GET CONNECTOR # + CAIGE T,=9 ;IS IT AN EDGE CONNECTOR + JRST [ MOVE A,FLXCRD(T) + TLO A,MAPGND + POPJ P,] + PUSH P,B + PUSH P,C + PUSH P,G + PUSH P,W + PUSH P,[MAPGND,,0] + JRST FGPCON + + RADIX =10 +GPCANP: FOR A  (1,2,3,4,5,6,7,8,9,10) +< <112>!A +> + + RADIX 8 +GPCAND: GPCANP-.,,GPCANP ;AOBJN POINTER TO GPCANP + +;TABLE INDEXED BY SCOTCH FLEX CONNECTOR, GIVES NEAREST CARD POWER AND GROUND + +FLXCRD: 0 ;0 + 10001 ;1 + 10003 ;2 + 10008 ;3 + 10011 ;4 + 10002 ;5 + 10004 ;6 + 10007 ;7 + 10012 ;8 + + ;PGPRTM AND PGPRNT PRINT OUT PIN SPECIFICATION FOR WIRE LIST + +PGPRTM: SETOM PMINUS# + CAIA +PGPRNT: SETZM PMINUS + JUMPL A,PGCPNT ;JUMP FOR CONNECTOR + LDB T,B6AT23 ;LETTER PART OF SLOT LOCATION + PUTBYT @N2L(T) + LDB T,[POINT 12,A,35] + PUSHJ P,DECOUT ;SLOT # + PUTBYT "(" + TLNN A,MAPPWR!MAPGND + JRST NPGPNT + TLNN A,MAPPWR + SKIPA T,["G"] + MOVEI T,"V" + PUTBYT @T +PGPN1: PUTBYT ")" + POPJ P, + +NPGPNT: LDB T,B6AT17 ;PIN # + SKIPN PMINUS + JRST NPGPN1 + TLNE A,PLUS1 + JRST [ PUSHJ P,DECOUT + PUTBYT "-" + JRST PGPN1] +NPGPN1: TLNE A,PLUS1 + SUBI T,1 ;SUBTRACT 1 FOR 14 PIN DIP # + PUSHJ P,DECOUT + TLNE A,PLUS1 + PUTBYT "+" + TLNE A,PLUS2 + PUTSTR [ASCIZ /+2??????????/] + JRST PGPN1 + +;PRINTS CONNECTOR PIN + +PGCPNT: PUTBYT "P" + LDB T,B6AT23 ;CONNECTOR # + PUSHJ P,DECOUT + PUTBYT "-" + LDB T,LOW12 ;SLOT + JRST DECOUT + +RAYGEN: JUMPL A,RAYRP1 + TLNN A,MAPPWR!MAPGND ;ONLY GROUND AND POWER CAN BE GENERATED + JRST RAYRP0 + PUTBYT "A" + MOVEI T,2 + MOVEM T,NDIG + LDB T,LOW12 ;SLOT # + PUSHJ P,NDECOUT + PUTSTR [ASCIZ / /] + PUTSTR [ASCIZ /00/] + MOVEI T,"V" + TLNN A,MAPPWR + MOVEI T,"G" + PUTBYT (T) + POPJ P, + +RAYRP0: LDB T,B6AT23 ;LETTER PART OF SLOT + PUTBYT @N2L(T) + MOVEI T,2 + MOVEM T,NDIG + LDB T,LOW12 ;SLOT # + PUSHJ P,NDECOUT + PUTSTR [ASCIZ / /] + MOVEI T,3 + MOVEM T,NDIG + LDB T,B6AT17 + JRST NDECOUT + +RAYRP1: OUTSTR [ASCIZ /CONNECTOR BECAME GENERATED PIN +/] + JRST ERRET + +FOR NAME (GNDCLR,WAGGND,GNDOUT,VCCOUT) + +BEND WLEBEL +>;MWL + \ No newline at end of file diff --git a/src/draw/lg411.209 b/src/draw/lg411.209 new file mode 100644 index 00000000..a98c4f96 --- /dev/null +++ b/src/draw/lg411.209 @@ -0,0 +1,1216 @@ +SUBTTL LG411 & LG434 -- PLUGS INTO DEC STYLE BACKPLANE +BEGIN LG411 + +;TRANSFER VECTOR + +^LG411V: JRST LCI411 ;FOR LG411 + JRST LOCOUT +MDPC,< + JRST CSLTLP + JRST GTSLTL +MD,< + JRST GTCONP + JRST CSLTLD +>;MD +>;MDPC +MWL,< + JRST WLOCOUT + JRST LOCPNC + JRST LOCPNW + JRST PRCNPN + JRST GETLOC + JRST PADPRT + JRST RAYDIP + JRST RAYCON +>;MWL + [ASCIZ/#LL#/] +MDPC,< [ASCIZ/CONNECTOR PIN ((#LL#)LL# OR (#LL#)"J"#-#)?/] + [ASCIZ/DIP LOCATION ((#LL#)"Z"#?/] +>;MDPC +MWL,< [ASCIZ/DIP LOCATION "Z"#?/] + [ASCIZ/CONNECTOR LOC (L OR "J"#)?/] +>;MWL + +CHECK LG411V,LTVLEN + +^LG434V: JRST LCI434 ;FOR LG434 + JRST LOCOUT +MDPC,< + JRST CSLTLP + JRST GTSLTL +MD,< + JRST GTCONP + JRST CSLTLD +>;MD +>;MDPC +MWL,< + JRST WLOCOUT + JRST LOCPNC + JRST LOCPNW + JRST PRCNPN + JRST GETLOC + JRST PADPRT + JRST RAYDIP + JRST RAYCON +>;MWL + [ASCIZ/#LL#/] +MDPC,< [ASCIZ/CONNECTOR PIN ((#LL#)LL# OR (#LL#)"J"#-#)?/] + [ASCIZ/DIP LOCATION ((#LL#)"Z"#?/] +>;MDPC +MWL,< [ASCIZ/DIP LOCATION "Z"#?/] + [ASCIZ/CONNECTOR LOC (L OR "J"#)?/] +>;MWL + +CHECK LG434V,LTVLEN + + +L2NSUB: BLOCK L2NLEN +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L_. +NNN_1 +FOR I IN(A,B,C,D,E,F,H,J,K,L,M,N,P,R,S,T,U,V,W,X,Y,Z) +< L2N2L I,0 +> +FOR I IN(G,I,O,Q) +< L2N2L I,1B0 +> +N2LMAX_NNN-1 + +ORG EN2L + +STORAGE(IMPURE) + +^PARAMS__. +^LGPADS: 0 ;NUMBER OF FAT FINGER PADS (MODULE HEIGHT) +^LGPADL: "A" ;BIGGEST LETTER +^LGSCOT: 0 ;NUMBER OF "SCOTCHFLEX" CONNECTORS +MWL,< +^LGDIPL: @. ;POINTER TO DIPLOC TABLE +^LGFLXT: @. ;POINTER TO FLXTYP TABLE +^LGFLXL: @. ;POINTER TO FLXLOC TABLE +^LGFLXC: @. ;POINTER TO FLXCRD TABLE +^LGEDGC: @. ;POINTER TO EDGCRD TABLE +>;MWL +^PARAMX__.-PARAMS + +STORAGE(PURE) + +^PAR411: 4 ;NPADS + "D" ;BIGGEST PAD LETTER + 7 ;# SCOTCH CONNS +MWL,< + 0,,DIPLOC-1(TT) ;ACCESS LOCATION FOR DIPSOCKET + 0,,@FLXTYP-1(TT) ;ACCESS PIN OFFSET FOR RIGHT SCOTCH CONN + 0,,FLXLOC-1(TT) ;ACCESS LOCATION FOR SCOTCH CONN + 0,,FLXCRD-1(T) ;ACCESS DIP FOR NEAREST GND/PWR FOR SCOTCH CONN + 0,,EDGCRD-1(T) ;ACCESS " " " " EDGE CONN +>;MWL + +CHECK PAR411,PARAMX + +^PAR434: 2 ;LGPADS + "B" ;LGPADLETTER + 6 ;LGSCOTCH +MWL,< + 0,,DIPLOD-1(TT) ;LGDIPL + 0,,@FLXTYQ-1(TT) ;LGFLXT + 0,,FLXLOD-1(TT) ;LGFLXL + 0,,FLXCRE-1(T) ;LGFLXC + 0,,EDGCRE-1(T) ;LGEDGC +>;MWL + +CHECK PAR434,PARAMX + +LCI411: SKIPA T,[PAR411,,PARAMS] +LCI434: MOVE T,[PAR434,,PARAMS] + BLT T,PARAMS+PARAMX-1 ;BLT IN THE LOCAL VARS FOR LG411/LG434 + +LCINIT: MOVE T,[L2NSUB,,L2N] ;BLT PNTR + BLT T,L2N+L2NLEN+N2LLEN-1 ;BLT IN THOSE LETTER-NUMBER CONVERSION TABLES + MOVEI T,N2LMAX + MOVEM T,MAXN2L ;BIGGEST # WE CAN CHANGE TO A LETTER + POPJ P, + + + +;ARGUEMENT IN A, BASHES T +;FORMAT OF ARG: +;BITS +; 18 23 24 29 30 35 +; /-----------------------\ IF N IS NON-ZERO THIS IS A DIP SLOT, K IS AN ARBITRARY LETTER, +; | | | AND N IS THE 3 DIGIT SLOT #. OTHERWISE THIS IS A CONNECTOR +; | K | N | LOC FORM: IF K IS GREATER THAN OR EQUAL TO 10 AND NOT THE CODE +; | | | FOR U, THEN THIS REPRESENTS A SCOTCH-FLEX BODY, AND IS PRINTED +; \-----------------------/ AS "J" FOLLOWED BY THE NUMBER K-10. IF IT IS THE CODE FOR U, +;THEN IT IS THE WILD CONNECTOR BODY AND IS PRINTED AS "U". OTHERWISE, IT IS THE EDGE FINGER +;PADDLE LETTER AND IS PRINTED AS THE LETTER IT CONVERTS TO. + +MWL,< +WLOCOUT: +DEC,< TRNE T,BWILD ;IF IT'S WILD + PUTBYT WLDCHR >;DEC ;SAY IT'S WILD +>;MWL +LOCOUT: LDB T,[POINT 6,A,23] ;HIGH SIXBIT BYTE IN THE LOW HALF + JUMPE T,CPOPJ ;IF NOTHING THERE, NOTHING + TRNN A,7777 ;CHECK FOR CONNECTOR LOC TYPE + JRST [DEC,< CAME T,L2N+"U"-"A"> ;CONN LOC, IS IT "U"? + CAIGE T,10 ; OR A LLN TYPE? + JRST [ PUTBYT @N2L(T) ;YES, CONVERT TO ASCII AND PRINT + POPJ P,] + PUTBYT "J" ;NO, ITS A JN-N TYPE, PRINT A J + PUTBYT "0"-10(T) ;AND THE EXCESS OVER 10 AS THE FIRST N, PRINT IT + POPJ P,] + PUTBYT @N2L(T) ;DIP LOC, PRINT THE LETTER HE USED JUST FOR LAUGHS + MOVEI T,3 ;110 DIP SLOTS MAKES FOR 3 DIGIT SLOT NUMBERS + MOVEM T,NDIG ;TELL THE DECIMAL PRINT ROUTINE ABOUT IT + LDB T,[POINT 12,A,35] ;GET THE SLOT # + JRST NPUTDEC ;GO PRINT IT + + +MDPC,< +GTSLTL: PUSHJ P,SLTLN + POPJ P, + JRST CPOPJ1 + MOVE NUMREG,"Z"-"A"+L2N + DPB NUMREG,[POINT 6,DESTIN,23] + JRST CPOPJ2 +>;MDPC + ;CSLTLP, CSLTLD +;TAKES ARG IN A, BASHES A AND T +;ARG FORMAT +;BITS +; 0 5 6 11 12 17 18 21 22 26 27 29 30 35 +; /-------------------------------------------------\ +; | | F | D | | | | | +; | C |---------------| B | R | H | S | +; | | N | | | | | +; \-------------------------------------------------/ +; +;LOCPNC, LOCPNW +;ARGS IN A AND T, BASHES BOTH +;ARG IN A FORMAT +;BITS +; 0 5 6 11 12 17 18 23 24 35 +; /-----------------------------------------------\ +; | | F | D | | | +; | C |---------------| C | 0 | +; | | N | | | +; \-----------------------------------------------/ +;ARG IN T NOT USED IN LOCPNC, AHS BWILD BIT IN RIGHT HALF +; +;PPCNPN +;ARG IN A, BASHES A AND T +;ARG FORMAT +;BITS +; 0 17 18 23 24 35 +; /-----------------------------------------------\ +; | | | F | D | +; | X | C |---------------| +; | | | N | +; \-----------------------------------------------/ +; +;X IS A "DON'T CARE" FIELD +;B IS BAY NUMBER +;R IS RACK LETTER, ENCODED +;H IS BOARD HIGTH MINUS ONE +;S IS SLOT NUMBER +;IF THE ABOVE ARE NOT PROVIDED, IT IS AS A GROUP. H IS ALWAYS 3 FOR AN LG411 OTHERWISE +;C IS THE CONNECTOR BODY SPECIFIER, AND DETERMINES HOW THE REMAINING BITS ARE INTERPERTED +;IF C IS THE CODE FOR U, THE FORM IS "U" FOLLOWED BY THE VALUE OF N AS A NUMBER, WITH THE +; 4000 BIT FORCED TO ZERO (THIS BIT SHOULD ALWAYS BE SET IN THIS FORM. (U#) +;IF C IS THE CODE FOR A, B, C OR D, THAT LETTER IS PRINTED FOLLOWED BY THE LETTER FOR WHICH +; F IS THE CODE, FOLLOWED BY THE VALUE OF D (D SHOULD ALWAYS BE 1 OR 2 IN THIS FORM +; (LL#) +;IF C IS GREATER THAN OR EQUAL TO 10 (OCTAL) AND IS NOT THE CODE FOR U, THIS IS A J#-# FORM +;WHERE THE J AND THE - ARE LITERALS. THE FIRST # IS THE EXCESS OF 10 WHICH C IS AND THE +;SECOND # IS N +; +;CSLTLP TRIES TO PRINT BAY, RACK, SLOT IF IN D, CSLTLD NEVER DOES + +MWL,< +LOCPNW: +DEC,< TRNE T,BWILD ;IF IT'S WILD + PUTBYT WLDCHR >;DEC SAY IT'S WILD +LOCPNC: PUSHJ P,LOCOUT ;PRINT THE CONNECTOR BODY LOCATION + MOVS A,A ;PREPARE TO FALL THROUGH TO PRCNPN +>;MWL +MDPC,< +CSLTLP: +MD,< CAML A,[050000,,0] ;IS IT A EDGECONNECTOR PIN? + JRST [ TRNE A,-1 ;NO, DOES BRS EXIST? + PUSHJ P,SLTOUT ;YES, PRINT IT LIKE FOR A DIP + JRST CSLTLD] ;GO PRINT JACK, PIN + PUSHJ P,CSLTOUT ;YES, PRINT BAY RACK SLOT FOR EDGE FINGER +CSLTLD: +>;MD + HLRZ A,A ;FLUSH BRS + PUSH P,A ;SAVE A CLEAN COPY + ANDI A,770000 ;MAKE WILD PIN FORMAT + PUSHJ P,LOCOUT ;SO THAT LOCOUT WILL PRINT IT LIKE A CONN LOC + POP P,A >;MDPC ;GET "ALL" THE BITS BACK +MWL,< + HRRZS T,A ;COPY INTO T, CLEAR SOME CRUD + CAIGE T,10000 + JRST [ TRNN T,7700 + JRST CSLSFX + JRST CSLLDP] >;MWL + CAIGE T,100000 ;J OR U FORM + JRST CSLLDP ;NO DO LLN (LIKE PADDLES, MAN) +CSLSFX: +DEC,< LSH A,-=12 + CAME A,L2N+"U"-"A">;DEC U FORM + PUTBYT "-" +CSSFX1: ANDI T,7777 ;MASK TO THE LAST NUMBER PART + CAIG T,=26 + JRST PUTDEC ;GO PRINT IT + POPJ P, + +PRCNPN: HRRZS T,A + CAIGE T,10000 + TRNE T,7700 + CAIL T,100000 + JRST CSSFX1 +CSLLDP: LDB T,[POINT 6,A,29] ;GET SECOND LETTER + PUTBYT @N2L(T) ;CONVERT TO ASCII AND PRINT + MOVE T,A ;COPY TO T FOR PUTDEC + ANDI T,77 ;MASK TO TRAILING # + JRST PUTDEC ;GO PRINT IT + MDPC,< +MD,< +;READS CONNECTOR PIN SPEC IN THE FORM THAT CSLTLP PRINTS IT IN EXCEPT WITH HALVS SWOPPED, +;AS SHOWN BELOW. BASHES NUMREG AND CHRREG. RETURNS ANSWER IN DESTIN. +;0 SKIP ERROR, 1 SKIP ONLY CR OR STARTS WITH "THERE EXISTS" +;2 SKIPS WIN BUT NO BRS, 3 SKIPS WIN AND BRS. +;MUST EXIT WITH A 12 IN CHRREG TO REALLY WIN. +;BITS +; 0 3 4 8 9 11 12 17 18 23 24 29 30 35 +; /-------------------------------------------------\ +; | | | | | | F | D | +; | B | R | H | S | C |---------------| +; | | | | | | N | +; \-------------------------------------------------/ +; +GTCONP: SETZM DESTIN ;CLEAR ALL FIELDS + GETNUM ;GET FIRST STUFF +LAY,< CAIE CHRREG,TEXIST> ;IF TERMINATOR WAS THERE EXISTS OR + CAIN CHRREG,12 ;IF TERMINATOR WAS LINEFEED + JUMPE NUMREG,CPOPJ1 ;AND NO NUMBER, TAKE 1 SKIP EXIT + JUMPE NUMREG,NOBRS ;BRS STARTS WITH A # + CAIG NUMREG,17 ;IF NUMBER TOO BIG FOR FIELD + PUSHJ P,CHKLET ; OR TERM ISN'T A LETTER + POPJ P, ;LOSE + SKIPGE CHRREG,L2N-"A"(CHRREG) ;YES, CONVERT AND IS IT A GOOD LETTER + POPJ P, ;NO, LOSE + DPB NUMREG,[POINT 4,DESTIN,3] ;BAY + DPB CHRREG,[POINT 5,DESTIN,8] ;RACK + GETNUM ;NEXT STUFF + JUMPN NUMREG,GOTSLT ;IF #, IS SLOT # + PUSHJ P,CHKLET ;TERMINATOR A LETTER? + POPJ P, ;LOSE + SKIPGE CHRREG,L2N-"A"(CHRREG) ;CONVERT AND TEST SECOND L + POPJ P, ;BAD SECOND L + LDB NUMREG,[POINT 5,DESTIN,8] ;GET BACK FIRST L + SUBI CHRREG,-1(NUMREG) ;FIGURE BOARD HIGTH - 1 +1 + CAME CHRREG,LGPADS ;WHICH MUST BE 2 (LG434) OR 4 (LG411) + POPJ P, ;WRONG HIGTH, LOSE + GETNUM ;GET NEXT STUFF + JUMPE NUMREG,CPOPJ ;NLL REQUIRES FOLLOWING N +GOTSLT: CAILE NUMREG,77 ;SLOT # SHOULD FIT THE FIELD + POPJ P, ;DOSEN'T, LOSE + DPB NUMREG,[POINT 6,DESTIN,17] ;SLOT + MOVE NUMREG,LGPADS ;THIS BOARD IS (1 OR 3) +1 HIGH + SOS NUMREG + DPB NUMREG,[POINT 3,DESTIN,11] ;HIGTH +NOBRS: PUSHJ P,CHKLET ;LETTER? + POPJ P, ;LOSE, ALL CPIN SPECS BEGIN WITH A LETTER + CAIN CHRREG,"J" ;IS IT A J? + JRST SCOTCH ;YES, GO DO SCOTCH FLEX TYPE INPUT +DEC,< CAIN CHRREG,"U" ;IS IT A U? + JRST UCONN >;DEC ;YES, DO SPECIAL INPUT FORMAT + CAMLE CHRREG,LGPADL ;ELSE IT MUST BE A OR B (OR C OR D FOR LG411) + POPJ P, ;IT'S NOT, LOSE + SUBI CHRREG,"A"-1 ;CONVERT IT + DPB CHRREG,[POINT 6,DESTIN,23] ;PUT IT TO BED + GETNUM ;NEXT + JUMPN NUMREG,CPOPJ ;N IS NOT THE SECOND OF LLN + PUSHJ P,CHKLET ;A LETTER? + POPJ P, ;NO, LOSE + SKIPGE CHRREG,L2N-"A"(CHRREG) ;CONVERT, CHECK GIOQ + POPJ P, ;LOSE + DPB CHRREG,[POINT 6,DESTIN,29] ;PUT AWAY + GETNUM + JUMPE NUMREG,CPOPJ ;THERE MUST BE A # + CAIG NUMREG,2 ;NUMBER MUST BE 1 OR 2 + CAIE CHRREG,12 ;TERMINATOR MUST BE + POPJ P, ;LOSE + DPB NUMREG,[POINT 6,DESTIN,35] ;PUT AWAY +GTCNPE: HRROI NUMREG,0 ;-1,,0 + TDNE NUMREG,DESTIN ;DID WE GET BRS? + AOS (P) ;YES, EXTRA SKIP + JRST CPOPJ2 ;A WINNER! + +SCOTCH: GETNUM ;NEXT STUFF + JUMPE NUMREG,CPOPJ ;NUMBER MUST BE THERE + CAMG NUMREG,LGSCOT ;NUMBER MUST BE 1 THRU 6 OR 7 + CAIE CHRREG,"-" ;TERMINATOR MUST BE - + POPJ P, ;LOSE + ADDI NUMREG,10 ;CONVERT TO SPECIAL CODE + DPB NUMREG,[POINT 6,DESTIN,23] ;PUT AWAY + GETNUM + JUMPE NUMREG,CPOPJ ;NUMBER MUST BE THERE + CAIG NUMREG,=26 ;MUST BE 1 THRU 26. + CAIE CHRREG,12 ;TERMINATOR MUST BE END OF LINE + POPJ P, ;LOSE +DEC,< +DEPL12:>;DEC + DPB NUMREG,[POINT 12,DESTIN,35] ;PUT AWAY + JRST GTCNPE ;WINNER, BUT GO SEE HOW BIG OF A ONE + +DEC,< +UCONN: MOVE CHRREG,L2N+"U"-"A" ;GET U CODE + DPB CHRREG,[POINT 6,DESTIN,23] ;PUT AWAY + GETNUM + JUMPE NUMREG,CPOPJ ;# MUST BE THERE + CAIG NUMREG,3777 ; MUST BE 1 THRU 3777 + CAIE CHRREG,12 ;TERM MUST BE + POPJ P, ;LOSE + IORI NUMREG,4000 ;SET MAGIC BIT + JRST DEPL12 >;DEC ;PUT AWAY AND WIN +>;MD +>;MDPC + MWL,< +;ARG IN G IS 0 THROUGH # OF PADDLES + # OF JACKS - 1, AND +;IS AN INDEX INTO THEM IN SOME RANDOM ORDER TO GET THEM PRINTED. BASHES NOTHING. +PADPRT: TRNN G,777774 ;EDGE FINGER? + JRST [ PUTBYT 40 ;YES + PUTBYT "A"(G) ;PRINT PADDLE + PUTBYT 40 ;MUST BE THREE CHARACTERS, OR AT LEAST USED TO + POPJ P,] ;DONE + PUTBYT "J" ;NO, SCORCH-FLACKS, J# FORM, PRINT THE J + PUTBYT "0"-3(G) ;PRINT THE # AFTER ADJUSTING FOR THE OFFSET OF 3 + PUTBYT 40 ;MUST BE THREE CHARACTERS, OR AT LEAST USED TO MUST BE + POPJ P, ;DONE + +;READS DIP LOC OR CONNECTOR BODY LOC INTO TT IN FORM THAT LOCOUT PRINTS. +;ALSO BASHES NUMREG AND CHRREG +GETLOC: SETZ TT, ;SO ALL THE FEILDS ARE CLEAN + GETCH + PUSHJ P,CHKLET ;A LETTER + POPJ P, ;SORRY, HAS TO BE A LETTER + CAIN CHRREG,"J" ;A J FORM? + JRST SCARCH ;YEP, GO TO IT +DEC,< CAIN CHRREG,"U" ;A WILD ONE? + JRST [ MOVE TT,L2N+"U"-"A" ;YEP, GET A CODED U + LSH TT,=12 ;PUT IT IN POSITION + GETCH ;JUST TO CHECK TERMINATOR + JRST SCARC1] >;DEC GO ACTUALLY CHECK IT + SKIPGE TT,L2N-"A"(CHRREG) ;CONVERT AND CHECK GIOQ + POPJ P, ;I'M SORRY, YOU DIDN'T BEAT THE REAPER + GETNUM + CAIE CHRREG,12 ;RIGHT TERMINATOR? + POPJ P, ;NO, LOSE + LSH TT,=12 ;PUT LETTER CODE IN ITS PLACE + JUMPE NUMREG,CPOPJ1 ;NO NUMBER IS CONNECTOR LOC + DPB NUMREG,[POINT 12,TT,35] ;PUT NUMBER AWAY + JRST CPOPJ2 ;NUMBER MEANS DIP SLOT + +SCARCH: GETNUM + JUMPE NUMREG,CPOPJ ;HAVE TO HAVE A NUMBER + ADDI NUMREG,10 ;ENCODE THE # + DPB NUMREG,[POINT 6,TT,23] ;PUT IT IN ITS PLACE +DEC,< +SCARC1: >;DEC + CAIN CHRREG,12 ;IS THE TERMINATOR ? + AOS (P) ;YES, TURN THE FOLLOWING POPJ INTO A POPJ1 + POPJ P, ;DONE + +;RAYDIP +;ARGS IN A AND T, BASHES BOTH. +;PRINTS DIP SLOT # AS 3 DIGITS, THEN 2 SPACES, THEN PIN # AS 2 DIGITS. +;TOTAL OF 7 COLUMNS. +;ARG IN A FORMAT +;BITS +; 0 17 18 23 24 35 +; /-----------------------------------------------\ +; ! PIN # ! X ! SLOT # ! +; \-----------------------------------------------/ +;T HAS L1416 BIT IN THE RIGHT HALF. +; +RAYDIP: PUSH P,T ;SAVE FOR LATER + PUSHJ P,RAYLOC ;TRANSFORM FOR MANY PINNED DIPS + MOVEI T,3 ;RAY FORMAT FOR DIP LOC IS JUST 3 DIGIT # + MOVEM T,NDIG ;ARRANGE TO PRINT IT THAT WAY + LDB T,[POINT 12,A,35] ;GET THE DIP LOC # + PUSHJ P,NPUTDEC ;AND PRINT IT + PUTSTR [ASCIZ / /] ;GET TO THE PIN# COLUMN + MOVEI T,2 ;PIN #S ARE 2 DIGITS + MOVEM T,NDIG ;ARRANGE TO PRINT THEM SO + LDB T,[POINT 6,A,17] ;GET THE PIN # + POP P,A ;GET THAT FLAG WORD BACK + TRNE A,L1416 ;IS IT A 14 PIN DIP IN A 16 PIN SLOT + AOJA T,NPUTDEC ;YES, REAL PIN # IS LOGICAL PIN # + 1, AND PRINT IT + JRST NPUTDEC ;NO, JUST GO PRINT THE PIN # + + +RAYLOC: CAIN B,=14 ;14 PIN DIP? + JRST RAY14 ;YUP + TRNE T,L1416 ;NOBODY ELSE SHOULD HAVE THIS BIT ON! + JSP TTT,RAYERR ;UGH + CAIN B,=16 ;16 PIN DIP? + JRST RAY16 ;YES +ITS,< + CAIN B,=24 ;24 PIN DIP? + JRST RAY24 ;YES + CAIN B,=28 + JRST RAY28 + CAIN B,=40 + JRST RAY40 +>;ITS + JSP TTT,RAYERR ;NO, ERROR!! + +RAY14: TRNN T,L1416 ;BETTER HAVE THE ADD 1 TO PIN BIT ON! + JSP TTT,RAYERR + +RAY16: POPJ P, + +ITS,< +RAY24: LDB T,[POINT 6,A,17] ;PIN NUMBER OF CHIP + CAIG T,=24 + JUMPN T,RAY24A + JSP TTT,RAYERR + +RAY24A: HLRE T,MAP24-1(T) ;SLOT OFFSET FOR THIS PIN + LDB TT,[POINT 12,A,35] + ADD TT,T + DPB TT,[POINT 12,A,35] + HLRZ T,A ;PIN NUMBER + MOVE T,MAP24-1(T) ;MAP THE PIN NUMBER TO NEW VALUE + DPB T,[POINT 6,A,17] + POPJ P, + +RAY28: LDB T,[POINT 6,A,17] ;PIN NUMBER OF CHIP + CAIG T,=28 + JUMPN T,RAY28A + JSP TTT,RAYERR + +RAY28A: HLRE T,MAP28-1(T) ;SLOT OFFSET FOR THIS PIN + LDB TT,[POINT 12,A,35] + ADD TT,T + DPB TT,[POINT 12,A,35] + HLRZ T,A ;PIN NUMBER + MOVE T,MAP28-1(T) ;MAP THE PIN NUMBER TO NEW VALUE + DPB T,[POINT 6,A,17] + POPJ P, + +RAY40: LDB T,[POINT 6,A,17] ;PIN NUMBER OF CHIP + CAIG T,=40 + JUMPN T,RAY40A + JSP TTT,RAYERR + +RAY40A: HLRE T,MAP40-1(T) ;SLOT OFFSET FOR THIS PIN + LDB TT,[POINT 12,A,35] + ADD TT,T + DPB TT,[POINT 12,A,35] + HLRZ T,A ;PIN NUMBER + MOVE T,MAP40-1(T) ;MAP THE PIN NUMBER TO NEW VALUE + DPB T,[POINT 6,A,17] + POPJ P, + +RAYERR: OUTSTR [ASCIZ /RAYTHEON DECK CONVERSION ERROR! +/] + JRST ERRET + +RADIX =10 +DEFINE MAP(SLOT,PIN) +< -,,PIN +> + +MAP24: MAP(1,15) ;1 + MAP(1,14) ;2 + MAP(1,13) ;3 + MAP(1,2) ;4 + MAP(1,3) ;5 + MAP(2,15) ;6 + MAP(2,14) ;7 + MAP(2,3) ;8 + MAP(2,2) ;9 + MAP(2,4) ;10 + MAP(3,15) ;11 + MAP(3,14) ;12 + MAP(3,4) ;13 + MAP(3,11) ;14 + MAP(3,12) ;15 + MAP(2,6) ;16 + MAP(2,5) ;17 + MAP(2,12) ;18 + MAP(2,11) ;19 + MAP(2,13) ;20 + MAP(1,6) ;21 + MAP(1,5) ;22 + MAP(1,12) ;23 + MAP(1,11) ;24 +CHECK MAP24,=24 + +MAP28: MAP(1,15) ;1 + MAP(1,14) ;2 + MAP(1,13) ;3 + MAP(1,2) ;4 + MAP(1,3) ;5 + MAP(2,15) ;6 + MAP(2,14) ;7 + MAP(2,3) ;8 + MAP(2,2) ;9 + MAP(2,4) ;10 + MAP(3,15) ;11 + MAP(3,14) ;12 + MAP(3,3) ;13 + MAP(3,2) ;14 + + MAP(3,6) ;15 + MAP(3,5) ;16 + MAP(3,4) ;17 + MAP(3,11) ;18 + MAP(3,12) ;19 + MAP(2,6) ;20 + MAP(2,5) ;21 + MAP(2,12) ;22 + MAP(2,11) ;23 + MAP(2,13) ;24 + MAP(1,6) ;25 + MAP(1,5) ;26 + MAP(1,12) ;27 + MAP(1,11) ;28 +CHECK MAP28,=28 + +MAP40: MAP(1,15) ;1 + MAP(1,14) ;2 + MAP(1,4) ;3 + MAP(1,2) ;4 + MAP(1,3) ;5 + MAP(2,15) ;6 + MAP(2,14) ;7 + MAP(2,4) ;8 + MAP(2,2) ;9 + MAP(2,3) ;10 + MAP(3,15) ;11 + MAP(3,14) ;12 + MAP(3,4) ;13 + MAP(3,2) ;14 + MAP(3,3) ;15 + MAP(4,15) ;16 + MAP(4,14) ;17 + MAP(4,4) ;18 + MAP(4,2) ;19 + MAP(4,3) ;20 + + MAP(4,5) ;21 + MAP(4,6) ;22 + MAP(4,13) ;23 + MAP(4,12) ;24 + MAP(4,11) ;25 + MAP(3,5) ;26 + MAP(3,6) ;27 + MAP(3,13) ;28 + MAP(3,12) ;29 + MAP(3,11) ;30 + MAP(2,5) ;31 + MAP(2,6) ;32 + MAP(2,13) ;33 + MAP(2,12) ;34 + MAP(2,11) ;35 + MAP(1,5) ;36 + MAP(1,6) ;37 + MAP(1,13) ;38 + MAP(1,12) ;39 + MAP(1,11) ;40 +CHECK MAP40,=40 + +RADIX 8 +>;ITS + +;RAYCON +;ARG IN A, BASHES A AND T +;PRINTS "JN MM" WHERE N IS JACK # (ONE DIGIT) AND MM IS 2 DIGIT PIN # +;OR PRINTS "KI L" WHERE K IS PADDLE LETTER, L IS FINGER LETTER, AND I IS THE 1 DIGITSIDE OF CARD #. +;I8 COLUMNS EITHER WAY. +;ARG FORMAT IS THE SAME AS FOR PPCNPN, BUT FUNNINESS ABOUT WHICH HALF. +; +RAYCON: LDB T,[POINT 6,A,23] ;GET THE BODY LOC PART + CAIG T,4 ;EDGE FINGER TYPE? + JRST [ PUTBYT "A"-1(T) ;YES, PRINT PADDLE LETTER + LDB T,[POINT 6,A,17] + PUSHJ P,PUTDEC + PUTSTR [ASCIZ / /] + LDB T,[POINT 6,A,11] + PUTBYT @N2L(T) + POPJ P,] ; AND DONE + PUTSTR [ASCIZ /J/] ;MUST BE SCOTCH-FLEX JACK, PRINT INVARIANT PART + PUTBYT "0"-10(T) ;PRINT JACK #. (ENCODING IS BY ADDING 10 TO THE VALUE OF THE DIGIT + PUTSTR [ASCIZ / /] ;GET TO THE PIN NUMBER FIELD + MOVEI T,2 ;PIN #S ARE 2 DIGITS + MOVEM T,NDIG ;ARRANGE TO PRINT THEM SO + HLRZ T,A ;PUT PIN # IN THE RIGHT AC + ANDI T,7777 ;MASK OFF EXTRAENOUS CRUD + JRST NPUTDEC ;AND PRINT IT +>;MWL +BEND LG411 + +MWL,< +SUBTTL WIRE WRAP ROUTINES -- LG411 & LG434 +BEGIN WLG411 + + +^^WLG411_. + + -1 ;ISWW + JRST WIN411 ;WWINIT + JRST MAPRC + JRST MAPPAD + JRST PINMAP + JRST PINBIT + JRST CPOPJ ;VGCON NOT WRITTEN YET + JRST DISTPP ;POINT TO POINT DISTANCE + JRST FPWR + JRST FGND + JRST PGPRTM + JRST PGPRNT + JRST GNDCLR + JRST WAGGND + JRST GNDOUT + JRST VCCOUT + JRST RAYGEN + =6 ;NROWS + =19 ;NCOLS + =0 ;NCLPRG + =110 ;DIPSLT, NOT = NROWS*NCOLS BECAUSE FIRST ROW NOT FULL + SETPAD(=11) ;NPADS + -=18,,1 ;PADLET + -=2,,1 ;PADPIN + =10 ;FRACTN + =200*2 ;0.2" INSULATION AROUND EACH POST + =750*2 ;0.75" BARE WIRE AROUND EACH POST + +CHECK WLG411,WTVLEN + +^^WLG434_. + + -1 ;ISWW + JRST WIN434 ;WWINIT + JRST MAPRC + JRST MAPPAD + JRST PINMAP + JRST PINBIT + JRST CPOPJ ;VGCON NOT WRITTEN YET + JRST DISTPP ;POINT TO POINT DISTANCE + JRST FPWR + JRST FGND + JRST PGPRTM + JRST PGPRNT + JRST GNDCLR + JRST WAGGND + JRST GNDOUT + JRST VCCOUT + JRST RAYGEN + =6 ;NROWS + =9 ;NCOLS + =0 ;NCLPRG + =50 ;DIPSLT, NOT = NROWS*NCOLS BECAUSE FIRST ROW NOT FULL + SETPAD(=5) ;NPADS + -=18,,1 ;PADLET + -=2,,1 ;PADPIN + =10 ;FRACTN + =200*2 ;0.2" INSULATION AROUND EACH POST + =750*2 ;0.75" BARE WIRE AROUND EACH POST + +CHECK WLG434,WTVLEN + +WIN411: SKIPA T,[PAR411,,PARAMS] +WIN434: MOVE T,[PAR434,,PARAMS] + BLT T,PARAMS+PARAMX-1 ;BLT IN PARAM SET FOR LG411 OR LG434 + POPJ P, + + PINTAB: FOR Y_=700,0,-=100 +< =300,,Y +> + FOR Y_0,=700,=100 +< 0,,Y +> + +XPINSP__ =300 ; .300" DIP PIN HORIZONTAL SPACING +YPINSP__ =100 ; .100" DIP PIN VERTICAL SPACING +XDIPSP_=500 +YDIPSP_=1000 +XDIPOR_=400 +YDIPOR_=700 + +^DIPLOC: FOR X_=14,0,-1 +< X*XDIPSP+XDIPOR,,5*YDIPSP+YDIPOR +> + FOR Y_4,0,-1 +< FOR X_=18,0,-1 +< X*XDIPSP+XDIPOR,,Y*YDIPSP+YDIPOR +> +> + +; DIP LOCS FOR LG434 + +^DIPLOD: FOR X_4,=8,1 +< X*XDIPSP+XDIPOR,,5*YDIPSP+YDIPOR +> + FOR Y_4,0,-1 +< FOR X_0,=8,1 +< X*XDIPSP+XDIPOR,,Y*YDIPSP+YDIPOR +> +> + +; VERT FLX CONN FOR LG434 (REVERSED FROM LG411) + +VFLXPP: FOR X_0,100,100 +< FOR Y_0,1200,100 +< X,,Y +> +> + +; VERT FLX CONN FOR LG411 + +VFLXPN: FOR X_=100,0,-=100 +< FOR Y_=1200,0,-=100 +< X,,Y +> +> + +HFLXPN: FOR Y_=100,0,-=100 +< FOR X_0,=1200,=100 +< X,,Y +> +> + +; SCOTCHFLEX LOCATIONS, LG411 + +^FLXLOC:=9600,,=5900 + =9200,,=5900 + =8800,,=5900 + =8400,,=5900 + =8000,,=5900 + =5900,,=7000 + =3000,,=7000 + +; SCOTCHFLEX CONNECTOR LOCATIONS FOR LG434 + +^FLXLOD: 0,,=5900 + =400,,=5900 + =800,,=5900 + =1200,,=5900 + =1600,,=5900 + =3100,,=7000 + +; POINTERS TO SCOTCHFLEX COORDS FOR LG411 + +^FLXTYP:FOR X_1,5,1 +< VFLXPN-1(T) +> + FOR X_6,7,1 +< HFLXPN-1(T) +> + +; POINTERS TO FLXPRINT PIN COORDS FOR LG434 + +^FLXTYQ:FOR X_0,4 +< VFLXPP(T) +> + HFLXPN+5(T) ;J6 + +PADLOC: =100,,=200 + =2800,,=200 + =5400,,=200 + =8100,,=200 + +PADPIN: FOR X1_0,=1400,=700 +< FOR X_0,=500,=100 +< X1+X,,0 +> +> + MAPIT: JUMPL A,CONMAP + LDB TT,LOW12 + JUMPE TT,CPOPJ + CAMLE TT,DIPSLT + POPJ P, + MOVE T,@LGDIPL ;DIPLOC\DIPLOD-1(TT) + LDB TT,B6AT17 + TLNE A,MAPPWR!MAPGND ;WANT POWER OR GROUND? + JRST PINPGP ;YES, RETURN FIX IT UP + CAIN B,=16 ;16 PIN DIP? + JRST MAPIT0 ;NO, DON'T NEED TO FUTZ AROUND +ITS,< + CAIN B,=24 ;24 PIN CHIP? + JRST MAP24P + CAIN B,=28 + JRST MAP28P + CAIN B,=40 + JRST MAP40P +>;ITS + CAIE B,=14 ;14 PIN CHIP? + POPJ P, ;??? I GIVE UP + ADDI TT,1 + ADD A,[1,,0] + TLO A,PLUS1 +MAPIT0: ADD T,PINTAB-1(TT) ;ADD EXTRA XY FOR PIN + SETZB TT,TTT ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ2 + +ITS,< +;I WOULDN'T WISH THIS ON . . . + +MAP24P: ADD T,M24PIN-1(TT) ;ADD X,Y OFFSET FOR 24 PIN CHIPS (GIVES SOCKET PIN #) + SETZB TT,TTT + JRST CPOPJ2 + +MAP28P: ADD T,M28PIN-1(TT) ;ADD X,Y OFFSET FOR 28 PIN CHIPS (GIVES SOCKET PIN #) + SETZB TT,TTT + JRST CPOPJ2 + +MAP40P: ADD T,M40PIN-1(TT) ;ADD X,Y OFFSET FOR 40 PIN CHIPS (GIVES SOCKET PIN #) + SETZB TT,TTT + JRST CPOPJ2 + +RADIX =10 + +DEFINE LP(SLOT,PIN) +< *XDIPSP,,<8-PIN>*YPINSP +> + +DEFINE RP(SLOT,PIN) +< XPINSP+*XDIPSP,,*YPINSP +> + +M24PIN: RP(1,15) ;1 + RP(1,14) ;2 + RP(1,13) ;3 + LP(1,2) ;4 + LP(1,3) ;5 + RP(2,15) ;6 + RP(2,14) ;7 + LP(2,3) ;8 + LP(2,2) ;9 + LP(2,4) ;10 + RP(3,15) ;11 + RP(3,14) ;12 + LP(3,4) ;13 + RP(3,11) ;14 + RP(3,12) ;15 + LP(2,6) ;16 + LP(2,5) ;17 + RP(2,12) ;18 + RP(2,11) ;19 + RP(2,13) ;20 + LP(1,6) ;21 + LP(1,5) ;22 + RP(1,12) ;23 + RP(1,11) ;24 +CHECK M24PIN,=24 + +M28PIN: RP(1,15) ;1 + RP(1,14) ;2 + RP(1,13) ;3 + LP(1,2) ;4 + LP(1,3) ;5 + RP(2,15) ;6 + RP(2,14) ;7 + LP(2,3) ;8 + LP(2,2) ;9 + LP(2,4) ;10 + RP(3,15) ;11 + RP(3,14) ;12 + LP(3,3) ;13 + LP(3,2) ;14 + + LP(3,6) ;15 + LP(3,5) ;16 + LP(3,4) ;17 + RP(3,11) ;18 + RP(3,12) ;19 + LP(2,6) ;20 + LP(2,5) ;21 + RP(2,12) ;22 + RP(2,11) ;23 + RP(2,13) ;24 + LP(1,6) ;25 + LP(1,5) ;26 + RP(1,12) ;27 + RP(1,11) ;28 +CHECK M28PIN,=28 + +M40PIN: RP(1,15) ;1 + RP(1,14) ;2 + LP(1,4) ;3 + LP(1,2) ;4 + LP(1,3) ;5 + RP(2,15) ;6 + RP(2,14) ;7 + LP(2,4) ;8 + LP(2,2) ;9 + LP(2,3) ;10 + RP(3,15) ;11 + RP(3,14) ;12 + LP(3,4) ;13 + LP(3,2) ;14 + LP(3,3) ;15 + RP(4,15) ;16 + RP(4,14) ;17 + LP(4,4) ;18 + LP(4,2) ;19 + LP(4,3) ;20 + + LP(4,5) ;21 + LP(4,6) ;22 + RP(4,13) ;23 + RP(4,12) ;24 + RP(4,11) ;25 + LP(3,5) ;26 + LP(3,6) ;27 + RP(3,13) ;28 + RP(3,12) ;29 + RP(3,11) ;30 + LP(2,5) ;31 + LP(2,6) ;32 + RP(2,13) ;33 + RP(2,12) ;34 + RP(2,11) ;35 + LP(1,5) ;36 + LP(1,6) ;37 + RP(1,13) ;38 + RP(1,12) ;39 + RP(1,11) ;40 +CHECK M40PIN,=40 + +RADIX 8 +>;ITS +PINPGP: JUMPN TT,CPOPJ + SETZ TTT, + TLNN A,MAPPWR + JRST [ ADD T,[=300,,=800] + MOVSI TT,GND + JRST CPOPJ2] + ADDI T,=800 + MOVSI TT,PWR + JRST CPOPJ2 + +CONMAP: AOS (P) + LDB TT,B6AT23 + JUMPE TT,CPOPJ + CAMG TT,LGPADS ;4 OR 2 FOR LG411 \ LG434 + JRST [ LDB T,[POINT 6,A,29] + JUMPE T,CPOPJ + CAILE T,=18 + POPJ P, + MOVE T,PADPIN-1(T) + ADD T,PADLOC-1(TT) + LDB TT,[POINT 6,A,35] + CAIN TT,1 + JRST CNMPWN + CAIE TT,2 + POPJ P, + ADDI T,=200 + JRST CNMPWN] + SUBI TT,10 ;OFFSET FOR SKOTCH CONNECTORS + SKIPL TT + CAMLE TT,LGSCOT ;LG411=7, LG434=6 + POPJ P, + LDB T,LOW12 + JUMPE T,CPOPJ + CAILE T,=26 ;PINS ON SKOTCH CONNECTOR + POPJ P, + MOVE T,@LGFLXT ;@FLXTYP\FLXTYQ-1(TT) + ADD T,@LGFLXL ;FLXLOC\FLXLOD-1(TT) +CNMPWN: SETZB TT,TTT + JRST CPOPJ1 + PINBIT: PUSHJ P,MAPIT + TDZA TT,TT + SETZ TT, + POPJ P, + +PINMAP: PUSHJ P,MAPIT + JRST PINERR + JRST CONERR + JRST CPOPJ1 + +PINERR: PUSH P,A + TLZ A,777700 + PUSHJ P,LOCPIN + JRST CPNER1 + +CONERR: PUSH P,A + HRL A,A + TRZ A,7777 + PUSHJ P,LOCPNC +CPNER1: OUTSTR [ASCIZ/ MAPING ERROR. +/] + POP P,A + POPJ P, + MAPRC: HLRZ TT,T + CAMG TT,NROWS + SKIPG TT + POPJ P, + HRRE T,T + CAMG T,NCOLS + SOSGE T + POPJ P, + IMUL TT,NCOLS + SUB TT,T + SUBI TT,4 + CAMG TT,DIPSLT + SKIPG T,TT + POPJ P, + MOVE TT,"Z"-"A"+L2N + DPB TT,[POINT 6,T,23] + JRST CPOPJ1 + FPWR: JUMPL A,FPWRC + TLZ A,77!PLUS1!PLUS2 + TLO A,MAPPWR + POPJ P, + +FPWRC: LDB T,B6AT23 + CAMG T,LGPADS ;LG411=4, LG434=2 + JRST [ JUMPE T,[ OUTSTR [ASCIZ/PAHRGH!! +/] + JRST ERRET] + MOVE A,@LGEDGC ;EDGCRD\EDGCRE-1(T) + TLO A,MAPPWR + POPJ P,] + SUBI T,10 + SKIPL T + CAMLE T,LGSCOT ;7\6 + JRST [OUTSTR [ASCIZ/PARGLE!! +/] + JRST ERRET] + MOVE A,@LGFLXC ;FLXCRD\FLXCRE-1(T) + TLO A,MAPPWR + ADDI T,10 ;IN CASE SOME ONE EXPECTS IT + POPJ P, + +FGND: JUMPL A,FGNDC + TLZ A,77!PLUS1!PLUS2 + TLO A,MAPGND + POPJ P, + +FGNDC: LDB T,B6AT23 + CAMG T,LGPADS + JRST [ JUMPE T,[ OUTSTR [ASCIZ/GAHRGH!! +/] + JRST ERRET] + MOVE A,@LGEDGC ;EDGCRD\EDGCRE-1(T) + TLO A,MAPGND + POPJ P,] + SUBI T,10 + CAMLE T,LGSCOT + JRST [ OUTSTR [ASCIZ/GARGLE!! +/] + JRST ERRET] + MOVE A,@LGFLXC ;FLXCRD\FLXCRE-1(T) + TLO A,MAPGND + ADDI T,10 + POPJ P, + +;NEAREST SOCKET FOR GND/PWR LG411 + +^FLXCRD:FOR N IN(=16,=17,=17,=18,=19,=3,=9) +< <<"Z"-"A"+1-4>=12>!N +> + +^EDGCRD:FOR N IN(=109,=104,=98,=93) +< <<"Z"-"A"+1-4>=12>!N +> + +;NEAREST SOCKET FOR GND/PWR LG434 + +^FLXCRE:FOR N IN(=6,=7,=7,=8,=9,=3) +< <<"Z"-"A"+1-4>=12>!N +> + +^EDGCRE:FOR N IN(=43,=49) +< <<"Z"-"A"+1-4>=12>!N +> + PGPRNT: TDZA TT,TT +PGPRTM: MOVNI TT,1 + JUMPL A,PGCPNT + PUSH P,TT ;NOTE - TT CLOBBERED IN DECOUT + PUTBYT "Z" + LDB T,LOW12 + PUSHJ P,DECOUT + PUTBYT "(" + TLNN A,MAPPWR!MAPGND + JRST NPGPNT + POP P,TT ;UN DO STAK + MOVEI T,"G" + TLNN A,MAPGND + MOVEI T,"V" + PUTBYT (T) +PGPN1: PUTBYT ")" + POPJ P, + +PGCPNT: PUSH P,A + HRL A,A + TRZ A,7777 + PUSHJ P,LOCPNC + POP P,A + POPJ P, + +NPGPNT: LDB T,B6AT17 + SKIPE (P) ;WHERE TT GOT STORED + JRST NPGPN1 + TLNE A,PLUS1 + SUBI T,1 +NPGPN1: TLNE A,PLUS2 + PUTSTR [ASCIZ/BURP!!/] + PUSHJ P,DECOUT + POP P,TT ;NOW REALLY NEED IT + TLNE A,PLUS1 + PUTBYT @1+[ "-" + "+"](TT) + JRST PGPN1 + RAYGEN: JUMPL A,RAYRP1 + TLNN A,MAPPWR!MAPGND + JRST RAYDIP + MOVEI T,3 + MOVEM T,NDIG + LDB T,LOW12 + PUSHJ P,NDECOUT + PUTSTR [ASCIZ/ 0/] + MOVEI T,"V" + TLNN A,MAPPWR + MOVEI T,"G" + PUTBYT (T) + POPJ P, + +RAYRP1: OUTSTR [ASCIZ/CONNECTOR BECAME GENERATED PIN. +/] + JRST ERRET + MAPPAD: JUMPE T,[ HRREI T,1(F) + PUSHJ P,MAPPA1 + ANDCMI T,770000 + POPJ P,] +MAPPA1: CAMG T,LGPADS ;4\2 + JRST [ LSH T,6 + IORI T,(TT) + LSH T,6 + IORI T,(TTT) + POPJ P,] + ADDI T,10 + SUB T,LGPADS + LSH T,=11 + CAILE TT,0 + IORI T,-1(TT) + LSH T,1 + ADDI T,(TTT) + POPJ P, + + FOR NAME IN(GNDCLR,WAGGND,GNDOUT,VCCOUT) + + +BEND WLG411 +>;MWL + \ No newline at end of file diff --git a/src/draw/lowcor.520 b/src/draw/lowcor.520 new file mode 100644 index 00000000..56100d7e --- /dev/null +++ b/src/draw/lowcor.520 @@ -0,0 +1,1143 @@ +SUBTTL ASSEMBLY SWITCHES +;LOWCOR.FAI.134, 20-NOV-75 14:48:48, EDIT BY HELLIWELL +VERSION(LOWCOR,7) +;ASSEMBLY SWITCHES + +IFN LIBSW!TWOSW,< +MD, +MPC, +>;IFN LIBSW!TWOSW + +;Initialization values for FLAGS,SCALE +DFLT0__<0,,MCHG!NEEDCL> +DFLTM__DEC,CMUF,LWINDOW,,DEC,0> +MPC,< DFSCL__=2 > +MD,< DFSCL__=16 + DEC,< DFSCL__=8 > +>;MD + +MPC,<SID_13> + +;TURN SOME THINGS OFF IN CURRENT BLOCK +MPC,< +DEFINE PART +DEFINE NOPART +>;MPC +MD,< +DEFINE SHORT +DEFINE NOSHORT +DEFINE WAG +DEFINE NOWAG +>;MD + ;VECTOR +STORAGE(PURE) + +;;Setup start of assemblies in Layout mode +;;In TwoSegment mode, D and PC assembled to run at 400000 +;;In LIBmode, reset PC to run in same place as D +;; (maybe reset location to page boundary?) +LAY,< +PASS1,<^^LAYBEG:> +PASS1,<^^LAY1S:> ;D start address +PASS2,<^^LAY2S:> ;PC start address + +TWO, + +LIB,< +PASS2,< +GLOBAL LAYBEG +PHASE LAYBEG +>;PASS2 +>;LIB + +;;Define dispatch vector for layout version +DEFINE VECVAL(ADDR,VALUE) +< +PASS1,<^ADDR>JRST VALUE +> +;;Dispatch vectors for code that runs in either half +LAYVC0: VECVAL LAYSYM:,0 ;SYMBOL TABLE POINTER IN THIS HALF + VECVAL .STRT:,STRT ;NORMAL START + VECVAL .STRTL:,STRTL ;START ONE SIDE + VECVAL SCRSET:,DSPOUT ;DISPLAY UPDATE + VECVAL .CONT:,CNTSAV ;CONTINUE LOC + VECVAL .BLCHK:,BLCHK ;BLINK CHECK + VECVAL .NOFST:,NOFSTA ;GETFS + VECVAL .NOBLK:,NOBLKA ;GET BLOCK + VECVAL REENTER:,%R ;REE + VECVAL .LERRET:,LERRET ;LOOKUP ERROR RETURN + VECVAL .UUOCON:,%UUOCON ;UUO'S + +^LLAYVEC__.-LAYVC0 +ONE, > ;Saved D side xfer vector +>;LAY + +NOLAY,< +.NOFST: JRST NOFSTA +.NOBLK: JRST NOBLKA +REENTER:JRST %R +.UUOCON:JRST %UUOCON +>;NOLAY + SUBTTL DEFINITIONS OF RANDOM PARAMETERS + +MD,< +;NULL DIP NAME (BODY FOR VISUAL EFFECT ONLY!) +NULNAM__ +CABNAM__ ;ALSO FORCES SIGNAL NAME "\C\" ON WIRE + + +;DRAWING SIZES *********** +;A 8.5 X 11 +AH__=8500 +AW__=11000 +LABH__=1000 ;HEIGHT OF REGULAR LABEL BOX + +;X 8.5 X 11 WITH SMALLER LABEL BOX +XH__=8500 +XW__=11000 +LABX__=300 ;HEIGHT OF XGP LABEL BOX + +;B 11 X 17 +BH__=11000 +BW__=17000 + +;C 17 X 22 +CH__=17000 +CW__=22000 + +;D 22 X 34 +DH__=22000 +DW__=34000 +;E 34 X 44 +EH__=34000 +EW__=44000 +>;MD + +;MAX STRING LENGTH IN WORDS FOR PERMUT +MXSTLN__=500/5 + +;BITS RETURNED BY PERMUT IN SAVBIT +GLB1__1 ;1 UP ARROW +GLB2__2 ;2 UP ARROWS +SGND__4 ;GND +SPWR__10 ;VCC +SHI__20 ;+3 +SNC__40 ;NC +SCANON__100 ;+5.0V AS OPPOSED TO VCC, THE "CANONICAL" FORM +MPC,< +;MAX PAD TYPE NUMBER THAT DOESN'T PRINT ON INPUT OR OUTPUT +STDMAX__3 ;TYPE 3 FOR NOW + +;1/2 THE WIDTH OF A CONNECTOR FINGER IN MILS +FWIDTH__=40 + +WAG,< +;ROUTER SPECIFICATIONS +ROUSCL__=20 ;ROUTER HAS 50 MIL RESOLUTION +SIDDIF__=256 ;THIS NUMBER IS THE DIFFERENCE BETWEEN SIDES +ROUXMT__=255 ;MAXIMUM X VALUE (PER SIDE) +ROUXMM__=128 ;OFFSET IN X (BECAUSE CENTER OF BOARD IS 0,0) +ROUXMB__2 ;MINIMUM X VALUE +NODEC,< +ROUYMT__=199 ;MAX Y VALUE +ROUYMM__=100 ;OFFSET IN Y +>;NODEC +DEC,< +ROUYMT__=319 +ROUYMM__=160 +>;DEC +ROUYMB__2 ;MINIMUM Y VALUE +ROUANY__ROUYMT+2 ;SPECIFIES "ANY" PIN ON THIS EDGE +NEVERC__=1023 ;SIGNAL # SPECIFIES NEVER CONNECT HERE +LCEDGE__=6 ;FUDGE FOR LEFT CONNECTOR EDGE +NODEC, ;FUDGE FOR RIGHT CONNECTOR EDGE +DEC, +>;WAG +>;MPC + +ROUTE,< +BYTSIZ__2 ;USE 2 BIT BYTES FOR NOW! +%GRAIN__=50/5*2 +%SEPAR__=50/5*2 ;50 MILS MINIMUM BETWEEN WIRES! + +%STEP__%SEPAR/%GRAIN + +%XSIZ__=11000/5*2 ;10 INCHES BY +%YSIZ__=16000/5*2 ;16 INCHES + +%ROW__%XSIZ/(%GRAIN*(=36/BYTSIZ))+1 ;# OF WORDS PER ROW + +%XCEN__%XSIZ/2 +%YCEN__%YSIZ/2 ;CENTER OF ARRAY +;HERE WE SET THE WEIGHTING FACTORS FOR DIFFERENT ROUTINGS! + +%CNR__3 ;CORNER COST +%FED__3 ;FEED THROUGH COST +%BAK__2 ;GOING AWAY FROM POINT COST +%SID__2 ;ONE STEP ON WRONG SIDE COST +>;ROUTE + + +UML,< +;TYPE BITS FOUND IN LEFT HALF OF SECOND WORD +;OF WIRE HEADER IN WIRLST +INLD__400000 ;INPUT LOAD +OUTLD__200000 ;OUTPUT LOAD +NULLD__100000 ;NO LOADING AT PRESENT +GND__40000 ;GROUND CONNECTION +PWR__20000 ;POWER CONNECTION +TRI__10000 ;TRI-STATE OUTPUT +SHARE__4000 ;SHARE INPUT LOAD BIT +OPENC__2000 ;OPEN COLLECTOR OUTPUT +PULL__1000 ;THIS OUTPUT IS A PULLUP + +CBACK__2 ;INTERNAL HEADER BIT FOR BACK STRAP CONNECTOR +CFRONT__1 ;INTERNAL HEADER BIT FOR BACK PANEL CONNECTOR +>;UML + SUBTTL FILE EXTENSIONS +;DEFAULT DISK FILE EXTENSIONS & IO VERSION NUMBERS FOR MAINTAINING CONSISTENCY + +COMMENT  +IOVER Feature +------ -------------------- +2 Flush rel vect to body text +3 Libraries +4 Vert text marked by 10 as opposed to 400000 + Flush format for #chars,#lines +10 Dip types + +12 Body loc offset +13 List of types actually used from library + Body bits + +14 Macros +17 Pin pos,,pin name +20 New pin pos format +21 Great version # screwup +22 " " +23 Body loc char offset + Dip type names as properties + +26 ?? +27 Default package code remembered for types + MPG21's loc format changed + + +MD, ;should be 27 +MPC, + +;IOVBRD AND MODIOV ARE DEFINED HERE BECAUSE JARVIS FUCKED UP AND USED IOVER 21 +;TO INTRODUCE THE BOARD TYPE WHILE HELLIWELL WAS USING THE SAME IOVER FOR THE +;NEW MODULE AND REVISION STUFF. SINCE NO DRW FILES EXIST AT ITS WITH IOVER 22 +;THE FOLLOWING KLUDGE WORKS. + +ITS,< BRDIOV__21 MODIOV__23 > +NOITS,< BRDIOV__22 MODIOV__21 > +STANFO,<BRDIOV__21 > ;GRUMBLE, GRUMBLE +MPC,<BRDIOV__21> +MD,< NOMVER__26 > ;NOMENCLATURE SEPERATE FROM BOARD TYPE + +MD,< +EXTFIL__<'DRW'> ;DRAWING FILES +EXTEWR__EXTFIL ;EXTENSION FOR EWRITE COMMAND +CMU,< EXTEWR__<'DRX'> > ;DON'T CLOBBER ORIGINAL IN AUTO EWRITE! +EXTLIB__EXTFIL ;LIBRARY SAME AS DRAWING +EXTBDL__<'LST'> ;BODY DEF LISTING +EXTDIP__<'DIP'> ;DIP DEF FILE + DIPVER__5 ;DIP FILE VERSION NUMBER +EXTWIR__<'WD '> ;WIRE LIST FILES + WDVER__15 ;WD +NODEC,< +EXTPLT__<'PLT'> ;PLOT FILES +>;NODEC +DEC,< +EXTPLT__<'DPL'> ;DEC ALREADY USES PLT +>;DEC + PLTVER__15 ;PLT +EXTPAR__<'DAT'> ;PARTITION OUTPUT FILE +EXTUML__<'UML'> ;UML INPUT FILE +EXTCHG__<'CHG'> ;CHG INPUT FILE +EXTCPN__<'CPN'> ;CPN INPUT FILE +>;MD +MPC,< +EXTFIL__<'PC '> ;DRAWING FILES +EXTEWR__EXTFIL ;EXTENSION FOR EWRITE COMMAND +CMU,< EXTEWR__<'PD '> > ;DON'T CLOBBER ORIGINAL IN AUTO EWRITE +EXTWIR__<'WPC'> ;WIRE LIST FILES + WPCVER__400002 ;WPC +EXTPLT__<'PCP'> ;PLOT FILES + PCPVER__5 ;PCP +EXTROU__<'DAT'> ;ROUTER DATA FILES +EXTCRD__<'CRD'> ;EXTENSION FOR PC CARD DEFS + CRDVER__1 ;CRD FILE VERSION NUMBER +>;MPC +UML,< +EXTWDR__<'WDR'> ;DRW WIRE LIST FOR ROUTER GENERATION + WDRVER__1 ;WDR +MD,< +EXTLES__<'LES'> ;LOGIC ERROR SUMMARY FROM WL + LESVER__1 ;LES + LESWIR__1 ;CODE FOR WIRES IN LOGIC ERROR SUMMARY +>;MD +>;UML +EXTSIG__<'SIG'> ;SIGNATURE FILE EXTENTSION +EXTSAV__<'DMP'> ;SAVE FILES +EXTDSK__<'TXT'> ;DISK INPUT/OUTPUT +EXTMCR__<'MCR'> ;MACRO FILE EXTENSION + +IFN !PARTSW,< +DATNAM__<'FOR20 '> ;FORTRAN FILENAME (FOR OUTPT) +IPNNAM__<'FOR23 '> ;IPINS FILENAME DEFAULT +>;.... +WAG,< +STRTWR__<'WIRE@ '> ;FIRST WIRE FILE -1 +>;WAG + ;MORE DEFS + +;PIECE OF GLASS ASSIGNMENTS +ANGLPG__1 ;FOR DRAWING RIGHT ANGLES +BIGPG__2 ;FOR PUTTING OUT BIG B OR P OR S OR L +BLPG__3 ;BLINKER PAGE! +MAINPG__4 ;MAIN DISPLAY PAGE + + +;SOME RANDOM TABLE LENGTHS +MPDLEN__100 +LHASHP__400 ;POINT HASH TABLE (POWER OF TWO) +LHASHB__100 ;BODY HASH TABLE (ALSO POWER OF TWO) + SUBTTL MACROS -- SCALE,SCALET,UNSCALE,ADJUST,SWITCH +MD, +MPC, +;CHECK FOR INPUT DURING DISPLAYING +DEFINE CHECKIN +< XCT CINST + CAIA + JRST CHARIN +> + +;UPDATE PROGRESS THROUGH DISPLAY ROUTINES +DEFINE SOFAR +< JSR DSPDSP + CHECKIN +> + +CMU,< +DEFINE XSOFAR + ;CMU MAGIC +< MOVEM C,CHKSVC + XCT CINST + CAIA + PUSHJ P,XCHRIN +> +>;CMU + +;CHANGE SCREEN FOR TEXT OUTPUT +;DEFINE TVOFF +; +;> +; +;DEFINE TVON +; +;> + +COMMENT  +There are several systems of coordinates used: INTERNAL, III, PLOT +Internal coords (drawing coords) are usually represented as X*2,,Y*2. +Internal coords are multiplied by the current drawing scale to give display +or plot coords. +The main drawing scale (NSCALE) applies to all coords except character offsets(?) + INTERNAL PTS*NSCALE= PLOT points (shifted 1) + INTERNAL PTS*NSCALE/4= D-III points + INTERNAL PTS*NSCALE/16= PC-III points + +Note that there is a factor of 4 difference between MD-III dpy points +and plot points. When finally output, plot points are further shifted by +1 so that the low bits of each half can be used as markers. When +relating character sizes to plot coords, this total factor of 8 is +accomodated by CSCALE, which is 8 for standard plot outputs. (CSCALE +may be adjusted by PBOX, if it picks a different scale and wants to +scale the overall character sizes) + + +Conversions are: + UNSCAL: III points  INTERNAL points + SCALE: INTERNAL points  III points + SCALET: INTERNAL points  PLOT points + + +;CONVERT FROM INTERNAL X,Y TO III X,Y + DEFINE SCALE (AC) +< IMUL AC,NSCALE +MPC,< ASH AC,-4 > +MD,< ASH AC,-2 > +> + +;CONVERT FROM INTERNAL X,Y TO P (OR PCP) X,Y + DEFINE SCALET (AC) +< IMUL AC,NSCALE + ASH AC,1 +> + +;CONVERT FROM III X,Y TO INTERNAL X,Y + DEFINE UNSCAL (AC) +< +IFDIF +< PUSH P,T + MOVE T,AC +> + PUSHJ P,%UNSCAL +IFDIF +< MOVE AC,T + POP P,T +> +> + +;ADD 2 HALFWORD X,Y'S (LOW ORDER BIT OFF) + DEFINE ADJUST(OP,AC,M) +< IFIDN + OP AC,M + TLZ AC,1 +> + +;SWITCH SIDES OF PC CARD + DEFINE SWITCH +< PUSHJ P,%SWITCH +> +MPC,< + DEFINE FSWITCH +< + MOVE T,PHASHP + EXCH T,PHASH2 + MOVEM T,PHASHP + SWITCH +> +>;MPC +MD,> + +MD,< +;HERE IS HOW WE HIDE THE PIN NUMBER OFFSET STUFF IN THE X,Y WORD + +PXOFF__4000 ;JUST GOBBLE 6 BITS FOR NOW +PYOFF__4000 +PXMASK__PXOFF*2-1 +PYMASK__PYOFF*2-1 + +DEFINE PXY(AC) +< AND AC,[PXMASK,,PYMASK] + TLO AC,1 + SUB AC,[PXOFF,,PYOFF] + TLZ AC,1 +> + +DEFINE NXY(AC) +< ROT AC,4 + ANDI AC,17 +> + +>;MD + +DEFINE CRLF +< PUTSTR [ASCIZ / +/] +> + SUBTTL MODES + +DEFINE SM(A) +< A__%MODE +%MODE__%MODE+1 +> +%MODE__0 + +;OUTER (DRAW) LEVEL AND SET MODE +SM SETM +;OUTER (DRAW) LEVEL AND BODY MODE +SM BODM +;OUTER (DRAW) LEVEL AND POINT MODE +SM PNTM +;OUTER (DRAW) LEVEL AND LINE MODE +SM LINM +;OUTER (DRAW) LEVEL AND POINT TEXT MODE! +SM TXTM +;ALTER TEXT MODE +SM ALTM +;ALTER MACRO MODE +SM MALTM +;SPECIAL POINTER MODE (TEMPRORARY) +SM SPM +MD,< +;BODY TEXT MODE +SM BTXTM +;BODY TEXT ALTER MODE +SM BTALTM +;EDIT LEVEL +SM EDTM +;EDIT LEVEL AND INSERT MODE +SM EDTIM +;EDIT LEVEL AND TEXT MODE +SM EDTTM +;EDIT LEVEL AND PIN MODE +SM EDTPM +;EDIT LEVEL AND GETTING A BODY +SM EDTGM +;ALL EDIT MODES (EXCEPT EDTAM) +ALLEDM__1EDTM!1EDTIM!1EDTTM!1EDTPM!1EDTGM +;EDIT MODE ALTER TEXT +SM EDTAM +>;MD + +NUMODES__%MODE + +;ALL ALTER MODES +ANYALT__MD,<1EDTAM!1BTALTM!>1MALTM!1ALTM + +DEFINE MODISP(BITS,ADDR) + +C0__1 +C1__2 +C2__4 +C3__10 + + ;DEFINE DEBUGGING STUFF FOR STRUCTURES + +DBG,< + +.DONE(STRUCTURES) +.DONE(BLOCKS) + +%%L__0 ;CODES FOR WHERE ELEMENT IS STORED +%%LE__1 +%%R__2 +%%RE__3 +%%FWD__4 + +..ELEM__0 +DEFINE STRUC1 $ (BLOCK,NAME,WHERE) +< %%$WHERE,,V.$NAME +..ELEM__..ELEM+1 +> +ELEMTB: STRUCTURES ;WHERE TO FETCH,,INDEX INTO STRUCTURE +MAXELM__..ELEM + +DEFINE STRUC1 $ (BLOCK,NAME,WHERE) +< [ASCIZ/NAME/] +> +ELEMNM: STRUCTURES + +DEFINE STRUC1 $ (BLKNAM,NAME,WHERE) +< BLKNAM +> +ELEMBL: STRUCTURES + + + +..BLK__0 +DEFINE BLOCK1 $ (NAME) +< V.$NAME +U.$NAME__..BLK +..BLK__..BLK+1 +> +SURLEN: BLOCKS +MAXSUR__..BLK + +DEFINE BLOCK1 (NAME) +< +> +SURNAM: BLOCKS + +FSTLEN__FSTLEN+1 ;MAKE ROOM FOR EXTRA WORD OF ID + +>;DBG + SUBTTL LOWCOR DATA AREA +;Data in both D and PC +;Begin two prog data areas +;NOTE: Labels in SDATA have explicit ":" so that MIT's @ listing prgm will see those symbols + +DEFINE NAMES< + +DEC,< +NOPGP,< +SDATA TMP1:,BOTH +SDATA TMP2:,BOTH +>;NOPGP +>;DEC +SDATA EXPER2:,BOTH +SDATA SIGCHR:,BOTH +SDATA TPTRP:,BOTH +SDATA TTPTRP:,BOTH +SDATA RUNBIT:,BOTH +SDATA LOW2UP:,BOTH +SDATA SAVER0:,BOTH +SDATA SAVERM:,BOTH +SDATA VARLST:,BOTH +SDATA WDOLST:,BOTH +SDATA FNDNUM:,BOTH +SDATA MOVED:,BOTH +SDATA HASHP:,BOTH,LHASHP +SDATA HASHP2:,PC,LHASHP +SDATA HASHB:,BOTH,LHASHB ;MUST FOLLOW HASHP +SDATA PHASH2:,PC +SDATA PHASHP:,BOTH +SDATA CLAST:,BOTH +SDATA CLOSES:,BOTH +SDATA CLOSUP:,BOTH +SDATA MDISP:,BOTH +SDATA FBNSTR:,BOTH +SDATA FBLSTR:,BOTH +SDATA FBDSTR:,BOTH +SDATA FPLSTR:,BOTH +SDATA FPTSTR:,BOTH +SDATA LSTBOD:,BOTH +SDATA LSTPNT:,BOTH +SDATA TPOINT:,BOTH +SDATA IPOINT:,BOTH +SDATA LPNTR:,BOTH +SDATA BLINKN:,BOTH +SDATA ERRP:,BOTH +SDATA SAVP:,BOTH +SDATA FBDLST:,BOTH +SDATA CORLST:,BOTH +SDATA OLDTYPE:,BOTH +SDATA NEWTYPE:,BOTH +SDATA CURPIN:,BOTH +SDATA CURDIS:,BOTH +SDATA CURREP:,BOTH +SDATA SAVEG:,BOTH +SDATA STARLOC:,BOTH +SDATA SPDISP:,BOTH +SDATA STRING:,BOTH +SDATA CRDLOC:,BOTH +SDATA BLBRT:,BOTH +SDATA REMMAC:,BOTH +SDATA PINLEV:,BOTH +SDATA BLPNTR:,BOTH +SDATA AUTOWM:,BOTH +SDATA AUTOWN:,BOTH + +SDATA XGO:,BOTH +SDATA YGO:,BOTH +SDATA XDISP:,BOTH +SDATA YDISP:,BOTH +SDATA COUNT2:,BOTH +SDATA MACPNT:,BOTH +SDATA MDPNT:,BOTH +SDATA VARPNT:,BOTH +SDATA NDIG:,BOTH +SDATA SETSTR:,BOTH +SDATA PUTCHR:,BOTH +SDATA DSPPSV:,BOTH +SDATA PLTPSV:,BOTH +SDATA GTCHRX:,BOTH +SDATA CDEPPN:,BOTH +SDATA INPNT:,BOTH +SDATA FSTPNT:,BOTH +SDATA MACPDL:,BOTH,MPDLEN +SDATA PDL:,BOTH,PDLEN +SDATA NSCALE:,BOTH +SDATA MODE:,BOTH +SDATA OMODE:,BOTH +SDATA DEFBRT:,BOTH +SDATA L1:,BOTH +SDATA N1:,BOTH +SDATA N2:,BOTH +SDATA L2:,BOTH +SDATA MAXX:,BOTH +SDATA MAXY:,BOTH +SDATA MINX:,BOTH +SDATA MINY:,BOTH +SDATA CURBOD:,BOTH +SDATA CURORT:,BOTH +SDATA LINING:,BOTH +SDATA LETTER:,BOTH +SDATA NUMBER:,BOTH +SDATA NUMBR1:,BOTH +SDATA SAVEA:,BOTH +SDATA SAVEB:,BOTH +SDATA PGLASS:,BOTH +SDATA COUNT:,BOTH +SDATA BITS:,BOTH +SDATA DIFSOF:,BOTH +SDATA DY1:,BOTH +SDATA DY2:,BOTH +SDATA DY3:,BOTH +SDATA DX1:,BOTH +SDATA DX2:,BOTH +SDATA DX3:,BOTH +SDATA SETPNT:,BOTH +SDATA SETFLG:,BOTH +SDATA ENDBOX:,BOTH +SDATA TRCBDY:,BOTH +SDATA TRCTST:,BOTH +SDATA BUFPTR:,BOTH +SDATA BFPTR2:,BOTH +SDATA ALTTFG:,BOTH +SDATA TTPTR:,BOTH +SDATA PCHBUF:,BOTH +SDATA SETBOX:,BOTH +SDATA NEWSET:,BOTH +SDATA NEWPNT:,BOTH +SDATA CRUDLR:,BOTH +SDATA SIZ:,BOTH +SDATA BRT:,BOTH +SDATA CHRCNT:,BOTH +SDATA LSTNAM:,BOTH +;LSTNAM IS FOLLOWED BY LSTEXT FOR CLRSIG +SDATA LSTEXT:,BOTH,2 +;LSTEXT IS 2 IN LENGTH AND IS FOLLOWED BY LSTPPN, SO CLRSIG CAN +;BE USED TO GET NAME INTO MACRO +SDATA LSTPPN:,BOTH + +SDATA NEWBOD:,BOTH +SDATA TYPLOC:,BOTH +SDATA THSLOC:,BOTH +SDATA BID:,BOTH +SDATA PID:,BOTH +SDATA OLDBID:,BOTH +SDATA OLDPID:,BOTH +SDATA MAXBID:,BOTH +SDATA MAXPID:,BOTH +SDATA RDVER:,BOTH +SDATA NNAMES:,BOTH +SDATA DEFEXT:,BOTH +SDATA WIRDAT:,BOTH +SDATA THEREXISTS:,BOTH +SDATA PERRSAV:,BOTH +SDATA CURSE:,BOTH +SDATA LSTCUR:,BOTH +SDATA CLXY:,BOTH +SDATA XOFF:,BOTH +SDATA YOFF:,BOTH +SDATA TOP:,BOTH +SDATA BOTTOM:,BOTH +SDATA LEFT:,BOTH +SDATA RIGHT:,BOTH +SDATA DBODPN:,BOTH +SDATA PONPNT:,BOTH +SDATA CURSET:,BOTH +SDATA TOTCNT:,BOTH +SDATA LINCNT:,BOTH +SDATA EOLCHR:,BOTH +SDATA TXTPNT:,BOTH +SDATA ALTLIN:,BOTH +SDATA MODALT:,BOTH +SDATA ALTPNT:,BOTH +SDATA TXTBYT:,BOTH +SDATA TXTCNT:,BOTH +SDATA COMREP:,BOTH +SDATA NOARG:,BOTH +SDATA ALTSTR:,BOTH +SDATA CHRALT:,BOTH +SDATA FSTART:,BOTH +SDATA FLEN:,BOTH +SDATA BEGLIN:,BOTH +SDATA NOFFST:,BOTH +SDATA NOPPNF:,BOTH +SDATA BLKPNT:,BOTH,FSTLEN+1 +SDATA BLKTOP:,BOTH +SDATA BLKFRE:,BOTH +SDATA TEXSIZ:,BOTH +SDATA TEXLIN:,BOTH + +ITS,< +SDATA TVDPY:,BOTH +>;ITS +IFN UMLSW!LAYSW,< +SDATA OFFERR:,BOTH +SDATA UPINS:,BOTH +>;IFN UMLSW!LAYSW +UML,< +SDATA WIRLST:,BOTH +>;UML +>;NAMES + SUBTTL DATA IN ONE OR OTHER +DEFINES NAMES1< + +DEFINE FLAGS +< + FLGMAC FALSE,BOTH, + FLGMAC TRUE,BOTH, + FLGMAC CLOSES,BOTH, + FLGMAC RITEON,BOTH, + FLGMAC EDGE,BOTH + FLGMAC AEOL,BOTH + FLGMAC ABOL,BOTH + FLGMAC FIND,BOTH + FLGMAC AFIND,BOTH + FLGMAC DSKEND,BOTH + FLGMAC ENDMUL,BOTH + FLGMAC LSTEXP,BOTH + FLGMAC EXPR,BOTH, +> +DEFINE FLGMAC(A,B,C) +<> +> +;GENERATE ANY DATA STATEMENTS FOR SIMPLE FLAGS + FLAGS + +PART,< +SDATA PARNAM:,D +>;PART +UML,< +SDATA %LAST:,D +SDATA ERCODE:,D +>;UML +SDATA FPSSTR:,D +SDATA FLNSTR:,D +SDATA FLDSTR:,D +SDATA FLPSTR:,D +SDATA FLTSTR:,D +SDATA FLRSTR:,D +SDATA FBTSTR:,D +SDATA FBRSTR:,D +SDATA TYPNAM:,D +SDATA GETLST:,D +SDATA PKGTEM:,D +SDATA DEFLST:,D +SDATA PKGCOD:,D +SDATA PACK:,D +SDATA ORIGPN:,D +SDATA OFFCLC:,D +SDATA ERRVAR:,D +SDATA ISVERT:,D +SDATA MODLIB:,D +SDATA PONPN2:,PC +SDATA OUTSIDE:,D +SDATA SITE1:,D +SDATA SITE2:,D +SDATA TIT1:,D +SDATA TIT2:,D +SDATA TAUTHOR:,D +SDATA TREV:,D +SDATA TMODULE:,D +SDATA TVARIABLE:,D +SDATA TPREFIX:,D +SDATA TPROJ:,D +SDATA TPAGE:,D +SDATA TOF:,D +SDATA TDCODE:,D + +DEC,< +SDATA DRNNAM:,D,4 +SDATA CHKNAM:,D,4 +SDATA ENGNAM:,D,4 +SDATA TNXTHI:,D +>;DEC +SDATA DRWDAT:,D +SDATA DRWNAM:,D +SDATA DRWEXT:,D +SDATA DRWPPN:,D + +SDATA LIBLST:,D +SDATA MAPLST:,D +SDATA LIBTMP:,D +SDATA DEPTH:,D +SDATA LIBNAM:,D +SHORT,< +SDATA SRTLST:,PC +SDATA SHRTER:,PC +SDATA SERR1:,PC +SDATA SERR2:,PC +SDATA CPLAN1:,PC +SDATA CPLAN2:,PC +SDATA PCOP:,PC +SDATA PTOP:,PC +SDATA PTOL:,PC +SDATA LTOL:,PC +>;SHORT +WAG,< +SDATA LASTWR:,PC +>;WAG +SDATA CRDNAM:,PC,1,LOW +SDATA CRDEXT:,PC,1,LOW +SDATA CRDDAT:,PC,1,LOW +SDATA CRDPPN:,PC,1,LOW +SDATA CARDHD:,PC,3,LOW +SDATA CRDBUF:,PC,406,LOW +SDATA STPSIZ:,PC +SDATA CPLANE:,PC +SDATA XUMLPN:,PC +SDATA YUMLPN:,PC +SDATA KEEPIN:,D +SDATA LOWER:,D +SDATA UPPER:,D +SDATA WIDTH:,D +SDATA EDMODS:,D +SDATA EDCURS:,D +SDATA EDSCAL:,D +SDATA EDXOFF:,D +SDATA EDYOFF:,D +SDATA CCW:,D +SDATA STBPNT:,D +SDATA STBBDY:,D +SDATA STBLAS:,D +SDATA STBSIZ:,D +SDATA STUBX:,D +SDATA STUBY:,D +SDATA CLSTPN:,D +SDATA CRPPNT:,D +SDATA BTBODY:,D +SDATA GETBOD:,D +SDATA GETORT:,D +SDATA BODNAM:,D +SDATA UDLR:,D +SDATA SAVLOC:,D +SDATA PINNAM:,D +SDATA PINS:,D +SDATA LINES:,D +SDATA BTEXT:,D +SDATA TYPE:,D +SDATA COPPRP:,D +SDATA BTXLST:,D +SDATA LOSEPT:,D +SDATA ODIPTYP:,D +SDATA DEFOFF:,D +SDATA DEFOF1:,D +SDATA DEFBTS:,D +SDATA UTLIST:,D +SDATA USEFLG:,D +SDATA ALLFLG:,D +SDATA BODPNT:,D +SDATA SORLST:,D +SDATA CRDLST:,PC +SDATA BARLST:,PC + +SDATA CIRC:,D +SDATA ITSSCL:,D +SDATA CSCALE:,D +SDATA LSCALX:,D +SDATA LSCALY:,D + +SDATA CBOX:,D +SDATA SSCALE:,D +SDATA SHEIGHT:,D +SDATA SWIDTH:,D +SDATA MOVFLG:,D +SDATA ULNFLG:,D +SDATA MXPADN:,PC +SDATA SIDSAV:,PC +SDATA BTHBRT:,PC +ROUTE,< +SDATA ROUIDX:,PC +SDATA ARRAYA:,PC,%ROW*(%YSIZ/%GRAIN) +SDATA ARRAYB:,PC,%ROW*(%YSIZ/%GRAIN) +SDATA RCL1:,PC +SDATA RCL2:,PC +SDATA RTCNT:,PC +SDATA RCODE:,PC +SDATA ENDBYT:,PC +SDATA ENDBY2:,PC +SDATA DX:,PC +SDATA DY:,PC +SDATA XCNT:,PC +SDATA YCNT:,PC +SDATA RLIST:,PC +SDATA X1:,PC +SDATA Y1:,PC +SDATA X2:,PC +SDATA Y2:,PC +SDATA PSAV:,PC +SDATA .CNR:,PC +SDATA .FED:,PC +SDATA .BAK:,PC +SDATA .SID:,PC +>;ROUTE +>;NAMES1 + + +DEFINE SDATA(LABEL,D.PC,SIZE,SEG) +< +IFIDNSTORAGE(IMPURE) +IFIDN<><0> + IFDIF<> +>> +IFIDN<><0> + IFDIF<> +>> +IFIDN< +LABEL ;LABEL HAS : WITH IT +IFIDN<><0> +IFDIF<> +>> + + +SDATA PATCH:,BOTH,=200 ;PATCH SPACE +SDATA DSPDSP:,BOTH + JRST @DSPDSP + +ZEROBEGIN: + +NAMES +NAMES1 + +ZEROEND__.-1 + SUBTTL WIRED-IN DISPLAY DEFINITIONS +;DIP BODY DEFS (PC), BOX TABLES (D) +IFN PCSW!LAYSW,< + +NODBG,< DEFINE DBGPTR(EXP) > +DBG,< DEFINE DBGPTR(EXP) > + +DEFINE %BODY (TAG,NAME,NEXTBOD) + +TAG: =NAME,,NEXTBOD + DBGPTR(.+1) +> +DEFINE %PIN (PINID,X,Y,ENDIFZERO) +< RADIX =10 +DBG,< SIXBIT/TYPIN/ > + PINID,,IFIDN <> + X/5*2,,Y/5*2 + RADIX 8 +> +DEFINE %DIP $ (TAG,Y,DECPINS,LINK) + +TAG: NUMPINS__=DECPINS + XWD NUMPINS,LINK + XWD DBGPTR(L$TAG),DBGPTR(.+1) +NUMPN2__NUMPINS/2 +X_(=100*2)/5 ;100 MILS IN DISPLAY COORDS (5 MIL STEPS, SHIFTED 1) +XC_-(NUMPN2-1)*X/2 ;DISPLACE TO LONGITUDINAL CENTER OF %DIP +YC_=Y/5 ; " " LATERAL " + +;PINS + FOR I_NUMPN2,(NUMPN2)*2-1 + + XWD I+1,DBGPTR(.+2) + XWD X*(I-NUMPN2)+XC,-YC +> + FOR I_0,NUMPN2-2 + + XWD -I+NUMPN2,DBGPTR(.+2) + XWD X*I+XC,YC +> +DBG,< SIXBIT/TYPIN/ > + XWD 1,0 + XWD X*(NUMPN2-1)+XC,YC +;APPROX BOX +L$TAG: DBG,< SIXBIT/QXY/ > + DBGPTR(.+2) + XWD X*(NUMPN2-1)+XC,YC +DBG,< SIXBIT/QXY/ > + DBGPTR(.+2) + XWD X*(NUMPN2-1)+XC,-YC +DBG,< SIXBIT/QXY/ > + DBGPTR(.+2) + XWD XC,-YC +DBG,< SIXBIT/QXY/ > + DBGPTR(.+2) + XWD XC,YC +DBG,< SIXBIT/QXY/ > + 0 + XWD X*(NUMPN2-1)+XC,YC +>;%DIP +STORAGE(IMPURE) +MPC, + +STORAGE(PURE) + ;Type definitions (PC) + + %DIP(PIN6,300,6,PIN8) +FSTBOD__PIN6 + %DIP(PIN8,300,8,PIN14) + %DIP(PIN14,300,14,PIN16) + %DIP(PIN16,300,16,PIN18) + %DIP(PIN18,300,18,PIN20) + %DIP(PIN20,300,20,PIN22) + %DIP(PIN22,300,22,PIN24) + %DIP(PIN24,600,24,PIN28) + %DIP(PIN28,600,28,PIN40) + %DIP(PIN40,600,40,PIN48) + %DIP(PIN48,600,48,PIN64) + %DIP(PIN64,600,64,T018.3) + + %BODY (T018.3,183,T018.4) + %PIN (1,50,0) + %PIN (2,0,50) + %PIN (3,-50,0,0) + + %BODY (T018.4,184,T05.3) + %PIN (1,50,0) + %PIN (2,0,50) + %PIN (3,-50,0) + %PIN (4,0,-50,0) + + %BODY (T05.3,53,T05.4) + %PIN (1,100,0) + %PIN (2,0,100) + %PIN (3,-100,0,0) + + %BODY (T05.4,54,T066.3) + %PIN (1,100,0) + %PIN (2,0,100) + %PIN (3,-100,0) + %PIN (4,0,-100,0) + + %BODY (T066.3,663,.3009P) + %PIN (1,-100,0) + %PIN (2,100,0) + %PIN (3,0,580) + %PIN (4,0,-380,0) + + %BODY (.3009P,30091,PIN3T) + %PIN (1,-300,0) + %PIN (2,0,-100) + %PIN (3,200,0,0) + + %BODY (PIN3T,3,PIN4T) + %PIN (1,100,0) + %PIN (2,0,100) + %PIN (3,-100,0,0) + + %BODY (PIN4T,4,0) + %PIN (1,50,0) + %PIN (2,0,50) + %PIN (3,-50,0) + %PIN (4,0,-50,0) + +>;PCSW!LAYSW + +STORAGE(PURE) +MD,< +WTAB: (AW-=500)/5 ;A + (XW-=500)/5 ;X + (BW-=1000)/5 ;B + (CW-=1000)/5 ;C + (DW-=1000)/5 ;D + (EW-=1000)/5 ;E + (BH-=1000)/5 ;VB + (CH-=1000)/5 ;VC + (DH-=1000)/5 ;VD + (EH-=1000)/5 ;VE + +HTAB: (AH-=500-LABH)/5 ;A + (XH-=500-LABX)/5 ;X + (BH-=1000-LABH)/5 ;B + (CH-=1000-LABH)/5 ;C + (DH-=1000-LABH)/5 ;D + (EH-=1000-LABH)/5 ;E + (BW-=1000-LABH)/5 ;VB + (CW-=1000-LABH)/5 ;VC + (DW-=1000-LABH)/5 ;VD + (EW-=1000-LABH)/5 ;VE + +BTAB: "A" + "X" + "B" + "C" +DINDEX__.-BTAB + "D" + "E" +HBXLEN__.-BTAB + SETZ "B" + SETZ "C" + SETZ "D" + SETZ "E" +VBXLEN__.-BTAB-HBXLEN +BOXLEN__.-BTAB +>;MD +STORAGE(PURE) +SUBTTL diff --git a/src/draw/mac.502 b/src/draw/mac.502 new file mode 100644 index 00000000..4e130410 --- /dev/null +++ b/src/draw/mac.502 @@ -0,0 +1,2129 @@ +;MAC.FAI.65, 15-NOV-75 18:06:33, EDIT BY HELLIWELL +VERSION(MAC,5) +CHARIN: MOVE P,CHARP + MOVEM C,CHARP + TIMER C, + MOVEM C,BOOPLR + PUSHJ P,POPIT + MOVE C,CHARP ;RETURN CHAR IN C + POPJ P, + +GREADY: PUSHJ P,READY + MOVEM 0,SAVER0 + MOVEM M,SAVERM + SKIPN BOOPCN + POPJ P, + PUSH P,T + TIMER T, + SUB T,BOOPLR + ADDM T,BOOPLR + IDIVI T,=60 + CAMGE T,BOOPCN + JRST GRDY1 + PUSH P,[3] + SKIPA T,[1] +GRDY2: SLEEP T, + OUTCHR[7] + SOSL (P) + JRST GRDY2 + POP P,(P) +GRDY1: POP P,T + POPJ P, + +CMU,< +XCHRIN: EXCH C,CHKSVC ;SAVE CHAR AND GET BACK C + PUSHJ P,PUSHIT ;SAVE THE REGISTERS + SUBM P,P-17(P) ;MAKE THE SAVED P RELATIVE +CMU,< JSP TT,INATYO ;SAVE THE CURRENT POG INFO IN THE GDP2 + SAVPOG + PASREGS + PUSHJ P,DOATYO + PUSH P,IIIX ;SAVE THE PDP-10 INFO TOO! + PUSH P,IIIY + PUSH P,IIIBRT + PUSH P,CHRSCL + PUSH P,PGLASS +>;CMU + MOVE T,P + MOVE P,CHARP ;POP THE STACK + SUB T,P ;FIGURE OUT HOW MUCH WE POPPED + CAMLE T,[PSVLEN,,PSVLEN] ;SEE IF IT'S TOO MUCH + JRST [ OUTSTR [ASCIZ/INTERNAL ERROR: PSVLEN IS TOO SMALL FOR SAVING THE PDL IN ROUTINE XCHRIN +/] + HALT . ] + MOVEM T,PSVCNT + HRLZI TT,1(P) + HRRI TT,PDLSAV + BLT TT,PDLSAV-1(T) ;SAVE THE STUFF ON THE STACK + PUSHJ P,POPIT + JSP C,[ EXCH C,DSPDSP + MOVEM C,C + MOVE C,CHKSVC + POPJ P, ] ;AND RETURN TO THE CALLER OF THE DISPLAY ROUTINES. +;WE GET HERE (@DSPDSP) WHEN WE DECIDE TO CONTINUE BECAUSE MCHG=0. + MOVE P,CHARP ;RESTORE THE PDL + HRLZI TT,PDLSAV + HRRI TT,1(P) + ADD P,PSVCNT ;BUMP THE PDL POINTER + BLT TT,(P) ;RESTORE THE CONTENTS +CMU,< JSP TT,INATYO ;RESTORE THE CURRENT POG INFO IN THE GDP2 + RSTPOG + PASREGS + PUSHJ P,DOATYO + POP P,PGLASS ;RESTORE THE PDP-10 INFO ABOUT THE POG. + POP P,CHRSCL + POP P,IIIBRT + POP P,IIIY + POP P,IIIX +>;CMU + SUBM P,P-17(P) ;RE ABSOLUTIZE THE SAVED P + PUSHJ P,POPIT + POPJ P, +>;CMU + +MACDSP: TLNN DSPACT ;DISPLAYING? + JRST CPOPJ1 ;NO, SAY WE'RE DONE + MOVEM C,CINST ;STORE INSTRUCTION TO GET CHAR + PUSHJ P,PUSHIT + MOVEM P,CHARP + CHECKIN + PUSHJ P,GETCLS ;UPDATE IT BEFORE DISPLAYING IT + JFCL + PUSHJ P,UPCLOS + PUSHJ P,PMODE + PUSHJ P,UPSCAL + PUSHJ P,UPLVL + PUSHJ P,UPCURS + PUSHJ P,DOSLPB + CHECKIN + PUSHJ P,DISP +NOCMU,< PUSHJ P,DOPOGS > ;HIDE ANY REQUESTED POGS + PUSHJ P,POPIT + JRST CPOPJ1 + +GETLET: PUSHJ P,GETLIN + CAIL C,"a" + CAILE C,"z" + CAIA + SUBI C,40 + CAIL C,"A" + CAILE C,"Z" + POPJ P, + JRST CPOPJ1 + +GETLCH: PUSHJ P,GETLIN + CAIL C,"A"+40 + CAILE C,"Z"+40 + POPJ P, + SUBI C,40 + POPJ P, + +YORN: TLNN M,DSKACT!MACACT + OUTCHR["?"] + PUSHJ P,GETCH + JRST YORN + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +/] + CAIN C,ALTMOD + POPJ P, + AOS (P) + CAIE C,"Y" + CAIN C,"y" + AOS (P) + POPJ P, + +YORNTT: OUTCHR["?"] + INCHRW C + OUTSTR[ASCIZ/ +/] + CAIN C,ALTMOD + POPJ P, + AOS (P) + CAIE C,"Y" + CAIN C,"y" + AOS (P) + POPJ P, + +GETLI1: TLNN M,DSKACT!MACACT +NOSKEY,< OUTSTR[ASCIZ/ +/] +>;NOSKEY +SKEY,< OUTSTR[ASCIZ/ +^/] +>;SKEY +GETLIN:PUSHJ P,GETLN + JRST GETLI1 + POPJ P, + +GETCHM: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +*/] + PUSHJ P,GETCH + JRST GETCHM + POPJ P, + +GETCHR: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ / +_/] + PUSHJ P,GETCH + JRST GETCHR + POPJ P, + +GETLN: SETZM BITS + SKIPE C,INPNT + JRST GETMAC ;GETTING INPUT INTERNALLY + TLNE M,DSKACT + JRST [ PUSHJ P,DSKCHR + POPJ P, + JRST GETCAN] +GETLP2: MOVE C,[INCHSL C] + PUSHJ P,MACDSP + JRST GOTCL + PUSHJ P,GREADY + INCHWL C +III,< CAIN C,33 + MOVEI C,11 +>;III + PUSH P,T + TIMER T, + MOVEM T,BOOPLR + POP P,T + PUSHJ P,NREADY +GOTCL: +CMU,< ;I'M NOT SURE EVERYONE WANTS THIS, THOUGH THEY PROBABLY DO + CAIN C,177 ;IGNORE SPURIOUS RUBOUTS IN LINE MODE! + JRST GETLP2 +>;CMU + JRST GETCAN + + +GETCH: SKIPE C,INPNT ;GETTING INPUT INTERNALLY? + JRST GETMAC ;YES +ZERBTS: SETZM BITS +GETLP1: TLNE M,DSKACT + JRST [ PUSHJ P,DSKCHR + POPJ P, + JRST GETCAN] +III,< MOVE C,[INSKIP] + PUSHJ P,MACDSP + CAIA + PUSHJ P,GREADY + PUSHJ P,UPLHY ;UPDATE DISPLAY + TTCALL 17,C ;READ CHAR WITH BITS +>;III +NOIII,< MOVE C,[INCHRS C] + PUSHJ P,MACDSP + JRST GETCAN + PUSHJ P,GREADY + INCHRW C +>;NOIII + PUSH P,T + TIMER T, + MOVEM T,BOOPLR + POP P,T + PUSHJ P,NREADY + GETCAN: SKIPE LCFLAG ;CONVERT LC TO UC? + JRST NOLCCN ;NO + CAIL C,"a" + CAILE C,"z" + CAIA + SUBI C,40 +NOLCCN: +SKEY,< +III,< CAIE C,11 > ;MAKE TAB BE THE C-M-BIT KEY +NOIII,< CAIE C,33 > + CAIN C,175 + JRST ALTXFN + CAIN A,176 + JRST [ + ALTXFN: MOVEI C,200 ;PUT IN CONTROL-META BITS + ADDB C,BITS + TRNN C,1000 ;OVERFLOW? + JRST GETLP1 ;NO + MOVEI C,ALTMOD + SETZM BITS + JRST .+1] + CAIN C,177 ;BS? + JRST [ SKIPN BITS ;ONLY IF BITS TYPED, SO LOSER CAN TYPE BS + JRST .+1 + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/XXX /] + JRST ZERBTS] +>;SKEY +NOSKEY,< + CAIN C,CTRL + JRST [ MOVEI C,200 + MOVEM C,BITS + JRST GETLP1] + CAIN C,META + JRST [ MOVEI C,400 + MOVEM C,BITS + JRST GETLP1] + CAIN C,CTLMTA + JRST [ MOVEI C,600 + MOVEM C,BITS + JRST GETLP1] + CAIN C,TTYCM + JRST [ +NOCMU,< SKIPE ISDPY + JRST DODEPA +>;NOCMU + MOVE C,BITS + TRCE C,200 + TRC C,400 + MOVEM C,BITS + JRST GETLP1] +>;NOSKEY + CAIN C,15 + JRST GETLP1 + IOR C,BITS +DODEPA: +ITS,< CAIE C,14 > ;FF refreshes display also + CAIN C,600+"!" ;IS THIS THE MAGIC CHAR.? + JRST [ PUSHJ P,DSPOUT ;yes, refresh display + POPJ P,] + CAIN C,600+LAMBDA ;DISK CONTINUE CHAR? + JRST DSKCON ;YES, CONTINUE IT + TLNE M,DSKACT ;DOING DISK INPUT? + JRST DODEPB ;YES, NO OUTPUT CHECK! + SKIPE DSKOPN ;DISK OUTPUT? + PUSHJ P,DSKOCHR ;YES +DODEPB: CAIE C,12 ;DEC ONLY USES LF + JRST DODEP + PUSH P,T + MOVE T,MACPNT + SKIPL -4(T) ;I ACTIVE? + JRST TREST ;NO, RESTORE T AND GO ON + MOVEI C,200+":" ;IT IS, CHANGE TO END OF ;I +TREST: POP P,T +DODEP: SKIPN CDEPPN ;ARE WE DEPOSITING A DEFINITION? + JRST DODEP1 + PUSH P,T ;YES, SAVE T + MOVE T,CDEPPN ;GET DEPOSIT LIST POINTER + PUSH P,TT ;SAVE TT + PUSH P,TTT ;SAVE TTT +DODLOP: MOVE TT,1(T) ;GET BYTE POINTER + TLNE TT,770000 ;END OF WORD? + JRST DOTP4 ;NO + GETFS (TTT) + SETZM (TTT) ;CLEAR POINTER TO NEXT + SETZM 1(TTT) ;AND DATA + HRRM TTT,-1(TT) ;DEPOSIT POINTER HERE + HRR TT,TTT +DOTP4: IDPB C,TT ;DEPOSIT CHR. + MOVEM TT,1(T) ;DEPOSIT NEW POINTER + HRRZ T,(T) ;GET NEXT THING IN DEPOSIT LIST + JUMPN T,DODLOP ;LOOP IF MORE DEPOSITING TO DO + POP P,TTT + POP P,TT + POP P,T +DODEP1: TLNN IGNORE ;DOING DEFINITION OR FALSE PART OF ;F? + TRNN C,600 ;NO, BITS? + JRST CPOPJ1 + CAIN C,":"+200 ;IS THIS ;R0? + JRST ITRETX ;YES + MOVEM C,1(P) + ANDI C,177 + CAIN C,";" ;OR SEMI COLON + JRST DOSEMI ;WILL POPJ + CAIE C,12 ;DON'T PUT BITS BACK ON LF! + MOVE C,1(P) + JRST CPOPJ1 ;IT'S A CHARACTER + +ITRETX: PUSHJ P,PUSHIT + PUSHJ P,ITRETZ + PUSHJ P,POPIT + POPJ P, ;TELL HIM TO ASK AGAIN + +DOSEMI: PUSHJ P,PUSHIT + PUSHJ P,ITSEM ;DO THE SEMICOLON THING + PUSHJ P,POPIT + POPJ P, + +GETMAC: TLNN C,770000 ;END OF WORD? + JRST GETBYT +GOTBYT: ILDB C,INPNT ;GET CHR. + JUMPN C,DODEP +ENDMAC: MOVEI C,":"+200 ;GET A ;R0 AT END + JRST DODEP + +GETBYT: HRR C,-1(C) + TRNN C,-1 ;END OF LIST? + JRST ENDMAC ;YES, GENERATE : + MOVEM C,INPNT ;DEPOSIT INCREMENTED POINTER + JRST GOTBYT + ;"D" +ITDEF: PUSHJ P,ITMAC ;STARTS JUST LIKE NAMED MACRO + HRRZ T,MACPNT +ITSKPF: TLOE IGNORE ;START IGNORING + POPJ P, ;ALREADY IGNORING, LEAVE + PUSH P,T + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/IGNORING! +/] +ITLOP1: SETZ B, ;KEEP LEVEL HERE +ITLOOP: PUSHJ P,GETLN + JRST ITLOOP ;GET AGAIN + CAIN C,":"+200 ;ITZERO? + JRST ITPOP ;UP A LEVEL + TRZN C,600 ;ANY BITS? + JRST ITLOOP + CAIE C,";" ;YES, IS IT SEMI COLON? + JRST ITLOOP ;NO + PUSHJ P,MREADN ;GET ARG AND COMMAND + TRZ C,600 ;CLEAR BITS + CAIN C,"R" + JRST ITPOPA + CAIN C,"S" ;THIS ENDS IT ALL + JRST ITPOP + CAIE C,"M" ;THESE 3 HAVE MATCHING ;R'S OR $:'S + CAIN C,"P" + AOJA B,ITLOOP + CAIN C,"D" + AOJA B,ITLOOP + JRST ITLOOP + +ITPOPA: PUSHJ P,READN ;EAT ARG TO ;R +ITPOP: SOJGE B,ITLOOP + PUSHJ P,ITRETZ ;THIS WILL POP UP A LEVEL + HRRZ TT,MACPNT + CAML TT,(P) ;HAVE WE PASSED WHERE WE WANTED TO STOP? + JRST ITLOP1 ;NO + POP P,(P) ;POP OFF LEVEL + TLZ IGNORE ;YES, STOP IGNORING + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/END IGNORING! +/] + POPJ P, + ;"F" +ITFLAG: PUSHJ P,READN ;GET LEVEL TO RETURN UP TO + MOVE TT,T + IMULI TT,5 ;MULT LEVEL BY 5 + MOVE T,MACPNT ;GET MACRO PDL POINTER + SUB T,TT ;BACK UP CORRECT NUMBER OF LEVELS + ANDI T,-1 + CAIG T,MACPDL ;TOO FAR? + JRST [ADDI T,5 ;YES + JRST .-1] + PUSH P,T ;SAVE POINTER TO MACPDL + MOVE TT,C + CAIN TT,"-" + JRST [ PUSHJ P,GETWRD + JRST WASNOT] + MOVE A,[POINT 6,T] + SETZ T, + PUSHJ P,ISCHRX +WASNOT: EXCH TT,C + CAIE TT,12 + JRST ERRXT + MOVSI TT,-FLGLEN ;TABLE LENGTH + CAME T,FLGNAM(TT) + AOBJN TT,.-1 + POP P,T + JUMPGE TT,PERRET ;ERROR RETURN IF FLAG NOT FOUND + HRRZ TT,TT ;CLEAR COUNT IN LEFT HALF + XCT FLGTAB(TT) + TDZA TT,TT ;FALSE + SETO TT, ;TRUE + CAIN C,"-" ;DID HE TYPE  ? + SETCA TT, ;FLAG YES + JUMPE TT,CPOPJ ;NOOP IF NOT TRUE + JRST ITSKPF ;AND START IGNORING + +ERRXT: POP P,(P) + JRST ERRX + +DEFINE FLGMAC(A,B,C) +< +IFIDN< > +IFIDN> > +IFIDN> > +> +FLGNAM: FLAGS ;MACRO FROM DATA FILE +FLGLEN__.-FLGNAM +;HERE ARE SOME FLAG TESTING ROUTINES +DEFINE FLGMAC(A,B,C) +< +IFIDN< IFIDN<>C > +IFIDN<>C> > +IFIDN<>C> > +> +FLGTAB: FLAGS ;COMMAND TO EXECUTE FOR FLAG TEST + +;ROUTINE FOR CLOSES FLAG +CLTEST: PUSH P,A + PUSHJ P,GETCLS + CAIA + AOS -1(P) ;THERE IS A CLOSEST, SKIP + POP P,A + POPJ P, + +;ROUTINE FOR RITEON FLAG +ROTEST: PUSH P,T + PUSH P,A + MOVEI T,1 + LSH T,@MODE + TDNN T,[MD,<1BTXTM!1EDTM!1EDTTM!1EDTPM!>1SETM!1BODM!1PNTM!1TXTM] + JRST ROTST1 + PUSHJ P,GETCLS + JRST ROTST1 + MOVE T,1(A) + TDZ T,[1,,1] + CAMN T,CURSE + AOS -2(P) +ROTST1: POP P,A + POP P,T + POPJ P, + +;ROUTINE FOR EXPR FLAG +FEXPR: PUSHJ P,PUSHIT + PUSHJ P,EXPSET ;READ AND TEST EXPRESSION + JFCL ;GIVE FALSE RETURN ON ERROR + JRST [ PUSHJ P,POPIT ;FALSE + POPJ P,] + PUSHJ P,POPIT ;TRUE + JRST CPOPJ1 + ;SEMI COLON DISPATCH RENMAC DELMAC PMACRO +ITSEM: SKIPN T,CDEPPN ;ARE WE DEPOSITING A DEFINITON? + JRST NOMFIX ;NO, NOTHING TO DO +DOFIX: LDB C,1(T) ;GET SEMI-COLON + TRO C,600 ;MAKE SURE IT ALWAYS LOOKS LIKE A MACRO COMMAND + DPB C,1(T) ;AND PUT IT BACK + HRRZ T,(T) + JUMPN T,DOFIX ;DO SOME MORE? +NOMFIX: PUSHJ P,MREADN ;GET # AND CHAR WHICH FOLLOWS +SEMCAL: TRZ C,600 ;IGNORE CONTROL BITS + CAIL C,"A"+40 + SUBI C,40 ;CONVERT LC TO UC +;HERE ARE THE COMMANDS WHICH DON'T PUSH THE MACRO PDL. + CAIN C,"R" + JRST ITRET + CAIN C,"O" + JRST ITOUT + CAIN C,"F" + JRST ITFLAG + CAIN C,"S" + JRST ITSTOP +;HERE ARE THE COMMANDS WHICH DO PUSH THE MACRO PDL. + HLRE T,MACPNT + CAML T,[-5] ;ENOUGH ROOM FOR ANOTHER MACRO LEVEL? + JRST [ OUTSTR[ASCIZ/ + +****** MACRO PDL OVERFLOW ****** + +/] + JRST ITSTOP] + CAIN C,"M" ;IS IT M? + JRST ITMAC ;YES + CAIN C,"P" + JRST ITPNT + CAIN C,"D" + JRST ITDEF + CAIN C,"T" + JRST ITTYP + CAIN C,"U" + JRST ITOOPS + CAIN C,"C" + JRST ITCAL + CAIN C,"A" + JRST ITARG + CAIN C,"N" + JRST ITSARG + CAIN C,"L" + JRST ITLET + CAIN C,"V" + JRST ITVAR + CAIN C,"E" + JRST ITEVAL + CAIN C,"X" + JRST ITEXPR + CAIN C,"#" + JRST ITDEQU + CAIN C,"=" + JRST ITEQU + CAIN C,"H" + JRST ITVAR0 + CAIN C,"I" + JRST ITIN + CAIN C,"Y" + JRST ITYANK + CAIN C,"G" + JRST ITLOWG + CAIN C,"^" + JRST ITCTRL + JRST PERRET + +RENMAC: PUSHJ P,ITGET + JRST NXMAC + HRLM E,(P) + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TYPE NEW MACRO NAME./] + PUSHJ P,ITGETA + JRST ITMOK + TLNE M,DSKACT!MACACT + JRST PERRET + OUTSTR[ASCIZ/SORRY, ALREADY IN USE! +/] + POPJ P, + +UNSAVM: SKIPA F,[ANDCAM T,(E)] +SAVMAC: MOVE F,[IORM T,(E)] + PUSHJ P,ITGET + JRST NXMAC + MOVSI T,MSAVE + XCT F ;SET OR CLEAR BIT + POPJ P, + +ITMOK: HLRZ E,(P) + HRRZ B,1(E) ;GET OLD NAME + HRRM D,1(E) ;STORE NEW ONE + JRST PUTFS + +DELMAC: HRRZ T,MACPNT + CAIL T,MACPDL + JRST NINMAC + PUSHJ P,ITGET ;GET MACRO + JRST NXMAC + HRRZ T,MACPNT + CAIL T,MACPDL + JRST NINMAC +;ENTER HERE WITH E:MACRO TO DELETE, C:PREVIOUS MACRO +DELMC1: HRRZ T,(E) + HRRM T,(C) ;LINK HIM OUT + HRRZ B,1(E) + PUSHJ P,PUTFS ;GIVE BACK NAME + HLRZ B,1(E) + PUSHJ P,PUTFS ;GIVE BACK BODY + MOVE TT,E ;SAVE COPY OF MACRO HEADER + FSTRET(E) ;GIVE BACK HEADER + MOVE T,MODE + CAIN T,MALTM + CAME TT,REMMAC ;DID WE JUST DELETE MACRO WE WERE EDITING? + POPJ P, + TRO MCHG + MOVE T,MODALT + JRST CHNGMD ;LEAVE MACRO ALTER MODE + +DELMCS: HRRZ T,MACPNT + CAIL T,MACPDL + JRST NINMAC + MOVEI E,MDPNT +DLMCS1: MOVE C,E ;SAVE PREVIOUS +DLMCS2: HRRZ E,(C) ;GET NEXT + JUMPE E,CPOPJ ;DONE IF NO MORE + HRRZ T,1(E) ;GET MACRO NAME + PUSHJ P,OUTTXT ;TYPE IT + HRL E,C + PUSHJ P,YORN + POPJ P, ;QUIT ON ALT + JRST DLMCS1 ;GET NEXT IF NO + HLRZ C,E + HRRZ T,MACPNT + CAIL T,MACPDL + JRST NINMAC ;IF HE STARTED A MACRO, BLOW HIM OUT OF THE WATER + PUSHJ P,DELMC1 ;DELETE IF YES + JRST DLMCS2 ;GET NEXT FROM C THIS TIME + +NINMAC: TLNE M,DSKACT!MACACT + JRST PERRET + OUTSTR[ASCIZ/NOT INSIDE MACRO!! +/] + POPJ P, + +MREADN: PUSHJ P,GETCHR + SETZ A, + CAIE C,"-" + JRST MREADP + PUSHJ P,MREADM + MOVN A,A + POPJ P, + +MREADM: SETZ A, +MREADO: PUSHJ P,GETCH + JRST MREADO +MREADP: CAIL C,"0" + CAILE C,"9" + POPJ P, + IMULI A,=10 + ADDI A,-"0"(C) + JRST MREADO + +PMACRO: PUSHJ P,ITGET ;WHICH MACRO + JRST NXMAC + TVOFF + HLRZ E,1(E) ;GET POINTER TO BODY + ADD E,[POINT 9,1] +PMAC1: TLNE E,770000 ;END OF WORD? + JRST PMAC2 + HRR E,-1(E) + TRNE E,-1 ;END OF MACRO? + JRST PMAC2 ;NO + OUTSTR[ASCIZ/ +/] + TVON + POPJ P, + +PMAC2: ILDB C,E ;GET CHAR + JUMPE C,PMAC1 +NOSKEY,< TRC C,600 + TRCN C,600 ;CTRL META? + JRST [ ANDI C,177 ;YES + OUTCHR[CTLMTA] + JRST PMAC3] + TRZE C,200 ;CTRL? + OUTCHR[CTRL] + TRZE C,400 ;META? + OUTCHR[META] +PMAC3: +>;NOSKEY +SKEY,< MOVE T,C + LSH T,-7 + CAIA + OUTCHR["$"] + SOJGE T,.-1 +>;SKEY + CAIN C,12 + JRST [ OUTSTR[ASCIZ/ +/] + JRST PMAC1] +SKEY,< CAIGE C,40 + JRST [ CAIE C,11 + CAIN C,ALTMOD + JRST .+1 + ADDI C,100 + OUTCHR["^"] + JRST .+1] +>;SKEY + OUTCHR C + JRST PMAC1 + ;"P" "V" +ITPNT: HRRZ T,MACPNT + CAIGE T,MACPDL ;IS THIS TOP LEVEL? + JRST ITLAST ;YES DO ";MLAST" + MOVE T,MACPNT ;GET MACRO PDL POINTER + TLNE M,MACACT + JRST GOTINP ;YES + SKIPE B,CDEPPN ;ARE WE ALREADY DEPOSITING? + JRST GOTDEP ;YES + GETFS (B) ;NO + SETZM (B) ;CLEAR "TO NEXT" POINTER + HRRZM B,CDEPPN ;DEPOSIT DEPOSIT LIST POINTR + GETFS (C) + HRLM C,(B) ;DEPOSIT POINTER TO START OF CHAIN + SETZM (C) +IMCON1: SETZM 1(C) + HRLI C,441100 ;MAKE A BYTE POINTER + ADDI C,1 + MOVEM C,1(B) ;DEPOSIT POINTER + PUSH T,B ;PUSH POINTER TO THING TO REMOVE + SKIPA +GOTDEP: PUSH T,[0] ;DON'T REMOVE ANYTHING + SETZM BRKCHR + PUSH T,[0] ;MAKE PLACE TO SAVE CDEPPN LATER ON + PUSH T,1(B) ;PUSH POINTER TO START OF LOOP +GOTRET: PUSH T,[0] ;MAKE PLACE TO SAVE COUNT + PUSH T,[-1] ;MAKE PLACE TO SAVE POINTER TO END OF LOOP +GOTRTV: MOVEM T,MACPNT ;SAVE PDL POINTER + TLNE M,DSKACT!MACACT + POPJ P, + HRRZS T + SUBI T,MACPDL-1 + IDIVI T,5 + OUTSTR[ASCIZ/ +ENTERING MACRO LEVEL /] + PUSHJ P,DECOUT + OUTSTR[ASCIZ/. +/] + POPJ P, + +GOTINP: PUSH T,[0] ;DON'T REMOVE ANYTHING + SETZM BRKCHR + PUSH T,[0] ;MAKE PLACE TO SAVE CDEPPN LATER + PUSH T,INPNT ;SAVE CURRENT INPUT POINTER AS LOOP START POINT + JRST GOTRET + +;VARIABLE INPUT, TTY INPUT FIRST TIME THROUGH LOOP +ITVAR: PUSHJ P,READN ;READ LEVEL NUMBER + MOVE TT,T + IMULI TT,5 ;MULT LEVEL BY 5 + MOVE T,MACPNT ;GET MACRO PDL POINTER + SUB T,TT ;BACK UP CORRECT NUMBER OF LEVELS + ANDI T,-1 + CAIG T,MACPDL ;TOO FAR? + JRST [ ADDI T,5 ;YES + TLNN M,MACACT!DSKACT + OUTSTR[ASCIZ/TRUNCATING MACRO LEVEL! +/] + JRST .-1] + HRRZ TT,MACPNT ;CHECK IF ALL INTERVENING MACROES ARE IN FIRST TIME +VARCHK: SKIPE -1(T) ;FIRST TIME AT THIS LEVEL? + JRST ITCAL ;NO, DO ";C" + ADDI T,5 + CAIG T,(TT) ;CHECK ALL INTERVENING MACROES YET? + JRST VARCHK ;NO + PUSHJ P,ITMACS + MOVE T,MACPNT ;GET MACRO PDL POINTER + GETFS (B) + HRRZ B,B + PUSH T,B ;THING TO RETURN LATER + SETZM BRKCHR + PUSH T,CDEPPN ;WE DON'T NEED TO DEPOSIT NEW DEFINITION (WILL ALWAYS BE TYPED) + HRRZM B,CDEPPN ;..... + GETFS (C) + HRLM C,1(E) ;PUT IN LINK TO TEXT + HRLZM C,(B) ;... + SETZM (C) + HRROS (C) ;MARK AS MACRO (SO IT WON'T GET DELETED) + SETZM 1(C) + HRLI C,441100 ;MAKE A BYTE POINTER + ADDI C,1 + MOVEM C,1(B) ;DEPOSIT POINTER + PUSH T,1(B) ;LOOP START LOC + PUSH T,[0] ;MAKE PLACE FOR COUNT + PUSH T,INPNT ;SAVE CURRENT INPUT POINTER + SETZM INPNT ;TAKE INPUT FROM TTY + PUSHJ P,RSTMAC + PUSHJ P,GOTRTV + TLNE M,DSKACT ;DISK INPUT ACTIVE? + POPJ P, ;YES + OUTSTR[ASCIZ/TYPE VALUE OF /] + HRRZ T,1(E) + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ +/] + POPJ P, + ;":" "R" "S" +ITRETZ: +; TLNN M,MACACT!DSKACT ;DISK OR MACRO ACTIVE? +; OUTSTR[ASCIZ/ +;/] ;NO, ECHO CRLF + MOVE A,MACPNT + HRRZ B,A + CAIG B,MACPDL + POPJ P, + SETOM -1(A) ;MAKE COUNT BE OUT NOW + JRST ITSTP2 + +ITRET: PUSHJ P,READN ;READ NUMBER OF TIMES TO ITERATE + CAIE C,"#" ;THIS SPECIAL CHAR? + JRST ITRTLF ;NO, LOSE + JUMPN T,INNERR ;ERROR IF NUMBER PRECEEDING + MOVE T,FNDNUM ;USE COUNT OF THINGS FOUND + PUSHJ P,GETLIN ;GET LF +ITRTLF: CAIE C,12 ;MUST BE LF + JRST INNERR ;LOSE + MOVE A,MACPNT ;GET PDL POINTER + HRRZ B,A ;GET ADDRESS PART + CAIG B,MACPDL ;BACK AT START? + POPJ P, ;YES, LEAVE + SKIPGE B,-1(A) ;GET COUNT. ANY COUNT YET? + JRST DONBEF ;YES, THIS IS NOT THE FIRST TIME THROUGH THIS LOOP + MOVN B,T ;NEGATE COUNT + HRLZ B,B ;DEPOSIT COUNT IN LT HF, # OF TIMES THROUGH LOOP IN RT HF + MOVEM B,-1(A) ;DEPOSIT +ITSTP2: MOVE C,INPNT ;GET CURRENT INPUT POINTER + MOVSI D,1 + TDNE D,(A) ;ALREADY SAVED? + MOVEM C,(A) ;NO, SAVE + MOVE T,CDEPPN ;GET DEPOSIT LIST POINTER + SKIPN -3(A) + MOVEM T,-3(A) ;SAVE IT + SETZM CDEPPN ;DON'T DEPOSIT WHILE LOOPING +DONBEF: TLNE IGNORE ;ARE WE TRYING TO IGNORE? + JRST DONDON ;YES, MAKE BELIEVE COUNT IS OUT + MOVE B,-1(A) ;GET COUNT + AOBJP B,DONDON ;INC COUNTS, DONE? + MOVEM B,-1(A) ;NO, STO IT + MOVE C,-2(A) ;GET POINTER TO START OF LOOP + MOVEM C,INPNT ;TAKE INPUT FROM THERE +RSTMAC: SKIPE INPNT + TLOA M,MACACT + TLZN M,MACACT ;TURN OFF, AND IF WAS ALREADY OFF + JRST DSPSET ;JUST CALC STATE OF DSPACT + PUSHJ P,DSPSET ;ELSE CALC DSPACT + JRST ENDDSP ;AND CHECK DISPLAY + +DONDON: POP A,INPNT ;RESTORE INPUT POINTER + PUSHJ P,RSTMAC ;FIX BIT + POP A,TT ;THROW AWAY COUNT + POP A,TT ;SAVE LOOP-START POINTER FOR CHECK LATER + POP A,CDEPPN ;RESTORE DEPOSIT LIST POINTER + HRRZS CDEPPN + POP A,B ;GET THING-TO-THROW-AWAY POINTER + HRRZ B,B ;CLEAR FLAGS AND BRKCHR + MOVEM A,MACPNT ;STORE MACRO PDL POINTER + HRRZ T,A + CAIGE T,MACPDL + TDZA T,T + HLRZ T,-4(T) + ANDI T,177 + MOVEM T,BRKCHR ;RESTORE BRKCHR FROM MACRO NOW IN FORCE (IF ANY) + JUMPE TT,NOLEVP ;IF NOT LOOP START POINTER, DON'T PRINT LEVEL + TLNE M,DSKACT!MACACT + JRST NOLEVP + HRRZ T,A + SUBI T,MACPDL-1 + IDIVI T,=5 + ADDI T,1 + OUTSTR[ASCIZ/LEAVING MACRO LEVEL /] + PUSHJ P,DECOUT + OUTSTR[ASCIZ/. +/] +NOLEVP: JUMPE B,CPOPJ ;NOTHING TO THROW AWAY + MOVEI A,CDEPPN ;GET DEPOSIT LIST POINTER +DONDN1: HRRZ D,(A) ;GET POINTER + JUMPE D,DARN2 + CAMN B,D ;SAME? + JRST DONDN2 ;YES + MOVE A,D ;NO, TRY NEXT + JRST DONDN1 +DONDN2: HRRZ C,(B) ;GET POINTER TO NEXT + HRRM C,(A) ;DEPOSIT POINTER AROUND +DARN2: MOVSS (B) + HRRZ C,(B) ;GET FLAG + HLRZ C,(C) + JUMPE C,PUTFS ;IF NOT A MACRO, RETURN WHOLE THING TO FS + FSTRET (B) ;OTHERWISE RETURN ONLY FIRST THING + POPJ P, + +ABMAC: MOVE T,MACPNT + CAMG T,[-MPDLEN,,MACPDL] + POPJ P, + GETFS(B) + SETZM (B) + MOVE T,[BYTE(9)";"+600,"S"] + MOVEM T,1(B) + TLZ IGNORE + JRST ITLET2 + +ITSTOP: MOVE A,MACPNT + HRRZ B,A + TLZ IGNORE + CAIG B,MACPDL + POPJ P, ;NOT DOING ANY MACRO HACKING NOW + SETOM -1(A) ;TO COUNT OUT THIS TIME + PUSHJ P,ITSTP2 ;FAKE A ;R + JRST ITSTOP ;& TRY AGAIN AT NEXT LEVEL + ;"M" "C" , STUFF SUBRS + +;COME HERE TO GENERATE STOP ON ERROR DURING MACRO +ITERR: OUTSTR[ASCIZ/DOING ;T +/] + MOVEI B,0 + JRST MACRT1 + +ITMACS: PUSHJ P,TREADV ;GET MACRO NAME + MOVE D,B ;HOLD POINTER TO IT +;ENTER HERE WITH MACRO NAME IN D +ITMACI: SKIPE 1(D) + JRST ITMLP0 + MOVE E,[ASCIZ/NIL/] + MOVEM E,1(D) + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NAMING MACRO AS NIL +/] +ITMLP0: MOVEI E,MDPNT ;GET POINTER TO MACROS +ITMLP1: HRRZ E,(E) ;GET POINTER TO MACRO + JUMPE E,NOMOTM ;NONE? ( OR NO MORE?) + HRRZ A,1(E) ;GET NAME POINTER + MOVE B,D ;GET OTHER NAME POINTER + PUSHJ P,TXTMAT ;SEE IF THE SAME + JRST ITMLP1 ;NO, TRY NEXT + HLRZ B,1(E) ;SAME, GET POINTER TO BODY + PUSHJ P,PUTFS ;RETURN TO FREE STORAGE + HRRZ B,1(E) ;GIVE BACK OLD NAME + HRRM D,1(E) ;NOT NEW (HIGHER UPS LOOK AT IT) + JRST PUTFS ;RETURN TO FREE STORAGE + +NOMOTM: GETFS (E) ;GET FREE STORAGE + MOVE B,MDPNT ;GET MACRO POINTER + MOVEM B,(E) ;LINK NEW ONE IN + HRRM D,1(E) ;PUT IN NAME + HRRZM E,MDPNT ;(LINK IN) + POPJ P, + +ITLAST: PUSH P,A ;SAVE ARG + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/;MLAST/] + GETFS(D) + SETZM (D) + MOVE T,[ASCIZ/LAST/] + MOVEM T,1(D) + PUSHJ P,ITMACI + JRST ITMAC0 + +ITMAC: PUSH P,A ;SAVE ; ARG + PUSHJ P,ITMACS + MOVE B,1(D) ;GET FIRST WORD OF NAME + CAME B,[ASCIZ/INIT/] ;THIS MACRO GETS AUTOMATIC SMACRO + JRST ITMAC0 + MOVSI B,MSAVE + IORM B,(E) ;MARK IT SAVED +ITMAC0: MOVE T,MACPNT ;GET MACRO PDL POINTER + POP P,A + CAIE A,1 ;1 WILL SET MSAVE + TDZA A,A + MOVSI A,MSAVE + IORM A,(E) + GETFS (B) + MOVE F,CDEPPN ;GET DEPOSIT LIST POINTER + MOVEM F,(B) ;LINK NEW ONE IN + HRRZM B,CDEPPN ;..... + GETFS (C) + HRLM C,1(E) ;PUT IN LINK TO TEXT + HRLM C,(B) ;... + SETZM (C) + HRROS (C) ;MARK AS MACRO (SO IT WON'T GET DELETED) + JRST IMCON1 + +ITGET: TLNN M,DSKACT!MACACT ;INSIDE A MACRO? + OUTSTR [ASCIZ /TYPE MACRO NAME./] +ITGETA: PUSHJ P,TREADV ;GET MACRO NAME + MOVE D,B ;HOLD POINTER + MOVEI E,MDPNT ;GET POINTER TO LIST OF MACROS +ITCLP1: MOVE C,E ;SAVE PREVIOUS HERE + HRRZ E,(E) ;GET POINTER TO MACRO + JUMPE E,CPOPJ + HRRZ A,1(E) ;GET MACRO NAME + MOVE B,D ;GET TYPED NAME + PUSHJ P,TXTMAT ;SAME? + JRST ITCLP1 ;NO, LOOP + MOVE B,D ;YES + PUSHJ P,PUTFS ;RETURN TYPED NAME TO FS + HLRZ B,1(E) ;GET BODY POINTER + ADD B,[XWD 441100,1];MAKE BYTE POINTER + JRST CPOPJ1 + +NXMAC: MOVE B,D + PUSHJ P,PUTFS + TLNE M,DSKACT!MACACT + JRST PERRET + OUTSTR [ASCIZ /NO SUCH MACRO +/] + POPJ P, + +MACCAL: SKIPN E,MDPNT + JRST CPOPJ1 ;LOSE +MACCL1: HRRZ A,1(E) + MOVE D,1(A) + CAMN D,@(P) ;SAME AS ARG? + JRST MACCL2 ;YES + HRRZ E,(E) + JUMPN E,MACCL1 + JRST CPOPJ1 + +MACCL2: AOS (P) ;SKIP ARG + TRNN TFLG ;CHECK READIN BIT? + JRST MACCL3 + HLRZ B,(E) ;GET BITS + TRNN B,MACTMP ;JUST READ IN? + POPJ P, ;NO, SKIP IT +MACCL3: HLRZ B,1(E) + ADD B,[POINT 9,1] + JRST MACRT1 ;CALL IT + +ITCAL: PUSHJ P,ITGET + JRST NXMAC +MACRT1: MOVE T,MACPNT ;GET MACRO PDL POINTER + PUSH T,[0] ;DON'T RETURN ANYTHING TO FREE STORAGE AT END + SETZM BRKCHR +MACRT2: PUSH T,CDEPPN ;SAVE CDEPPN + HRROS (T) + SETZM CDEPPN + PUSH T,B ;SAVE START POINTER + PUSH T,[0] ;MAKE PLACE FOR COUNT + PUSH T,INPNT ;SAVE CURRENT INPUT POINTER + MOVEM B,INPNT ;TAKE INPUT FROM MACRO BODY + MOVEM T,MACPNT ;STORE MACRO PDL POINTER + JRST RSTMAC + +;CALL WITH POINTER TO 9 BIT TEXT IN A +;BYTE POINTER TO END OF 9 BIT TEXT IN TT +ITSTUF: PUTBYT 200+":" ;ADD AT END + TLNN M,MACACT!DSKACT + OUTSTR[ASCIZ/TYPE TEXT MACRO NAME./] + PUSHJ P,ITMACS + MOVE A,SETSTR + HRROS (A) ;MARK AS PERMANENT + HRLM A,1(E) ;STUFF AWAY TEXT POINTER + POPJ P, + +;ENTER HERE WITH 7 BIT MACRO NAME IN D +;AND 9 BIT MACRO IN A +ITMAKE: PUSH P,A + PUSHJ P,ITMACI ;FIND OLD AND DELETE, OR JUST MAKE NEW BLOCK + POP P,A + HRROS (A) + HRLM A,1(E) ;PUT IN MACRO BODY + TLNE M,DSKACT!MACACT + POPJ P, + MOVE T,D + PUSHJ P,OUTTXT ;PRINT MACRO NAME + OUTSTR[ASCIZ/ +/] + POPJ P, + +;CALL WITH BYTE POINTER IN T, RETURNS CHAR IN C +GETTT: TLNE T,760000 + JRST GETTT1 + HRR T,-1(T) + TRNN T,-1 + POPJ P, +GETTT1: ILDB C,T + JUMPN C,CPOPJ1 + JRST GETTT + +;SETUP OUTPUT STREAM TO STRING +;RETURNS +;A = STRING HEAD +;TT = POINTER (TTPTR) + +SETTT7: PUSHJ P,SETTT0 + TLO TT,() + MOVEM TT,TTPTR + MOVE A,SETSTR + POPJ P, + +SETTT0: MOVEM A,SETSTR + GETFS(A) + SETZM (A) + SETZM 1(A) + MOVE TT,[PUSHJ P,PUTTTC] + MOVEM TT,PUTCHR + MOVEI TT,1(A) + EXCH A,SETSTR + POPJ P, + +SETTT: PUSHJ P,SETTT0 + TLO TT,() + MOVEM TT,TTPTR + POPJ P, + +;CALL WITH NUM IN B , AFTER SETTING UP WITH SETTT +PUTTTN: IDIVI B,=10 + HRLM C,(P) + JUMPE B,.+2 + PUSHJ P,PUTTTN + HLRZ C,(P) + MOVEI TTT,60(C) +;CALL WITH CHAR IN TTT, POINTER SET UP BY SETTT +PUTTTC: EXCH TT,TTPTR + TLNE TT,760000 + JRST PUTTT1 + PUSH P,TTT + GETFS(TTT) + HRRM TTT,-1(TT) + SETZM 1(TTT) + SETZM (TTT) + HRR TT,TTT + POP P,TTT +PUTTT1: IDPB TTT,TT + EXCH TT,TTPTR + POPJ P, + ;"U" "T" "L" "^" "A" "N" "#" "=" +ITOOPS: SKIPE INPNT ;IF INPUTTING FROM MACRO, + POPJ P, ;THIS IS A NOOP + ;ELSE IT IS A ;T +ITTYP: TLNN M,DSKACT + OUTSTR [ASCIZ /TYPE ARGUMENT./] + MOVEI B, ;TAKE INPUT FROM TYPING + JRST MACRT1 + +ITDEQU: PUSHJ P,GETCHR + SKIPN T,L2N(C) ;ANY LOCATION CONVERSION FOR LETTER? + HRREI T,-100(C) ;IF NOT LETTER, DO ITEQU + MOVEI C,"#" + JRST ITLET0 + +ITEQU: PUSHJ P,GETCHR + HRREI T,-100(C) ;GET CODE FOR LETTER AS NUMBER IN STANDARD FORMAT + MOVEI C,"=" + JRST ITLET0 + +ITLET: PUSHJ P,SREADN ;READ # ARG + CAIN C,12 + JRST ITLETA + CAIE C,"D" + JRST INNERR + JUMPN T,INNERR + PUSHJ P,SREADN + CAIE C,12 + JRST INNERR + JUMPLE T,ITLETA + CAMG T,MAXN2L ;IN LETTER RANGE? + SKIPA TT,N2L(T) ;USE THIS +ITLETA: MOVEI TT,100(T) ;CONVERT TO CHARACTER + PUSHJ P,MACLET ;MAKE LETTER MACRO + MOVEI C,"L" + JRST ITLET1 ;AND MERGE WITH IT ARG + +ITCTRL: PUSHJ P,GETCHR ;GET CHARACTER + CAIL C,"A"+40 + CAILE C,"Z"+40 + CAIA + SUBI C,40 ;CONVERT LC TO UC + CAIL C,100 ;IF NOT ALREADY BELOW 100 + SUBI C,100 ;MAKE IT A CONTROL CHARACTER + ANDI C,177 ;NO CONTROL BITS PLEASE + MOVE TT,C + PUSHJ P,MACLET ;MAKE THE MACRO + MOVEI C,"^" + JRST ITLET1 + +ITSARG: PUSHJ P,ARGSET ;READ ARGS + POPJ P, ;ERROR + PUSHJ P,SMACNM ;SIGNED NUMBER + MOVEI C,"N" + JRST ITLET1 + +ITARG: PUSHJ P,ARGSET ;READ ARGS + POPJ P, ;ERROR + MOVEI C,"A" +ITLET0: PUSHJ P,MACNUM ;CREATE TEXT NUMBER FROM IT +ITLET1: TLNE M,DSKACT!MACACT + JRST ITLET2 + OUTSTR[ASCIZ/END ;/] + OUTCHR C + OUTSTR[ASCIZ/ +/] +ITLET2: HRRZ T,(B) ;GET POINTER TO TEXT + HRLM T,(B) ;DUPLICATE IN LEFT HALF SO THAT LIST REMOVER AT + ;END OF ITRET WILL RETURN IT TO FREE STORAGE PROPERLY + MOVE T,MACPNT ;GET MACRO PDL POINTER + HRRZ B,B + PUSH T,B ;RETURN TO FREE STORAGE AT END + SETZM BRKCHR + PUSH T,CDEPPN ;SAVE DEPOSIT LIST + HRROS (T) ;MARK AS SAVED + PUSH T,[0] ;PUSH ZERO AS START BYTE POINTER + PUSH T,[-1,,0] ;1 AS COUNT (DO ONCE) LOOP COUNT OF 0 + PUSH T,INPNT ;SAVE INPUT POINTER + SETZM CDEPPN ;DON'T DEPOSIT + ADD B,[XWD 441100,1] ;MAKE BYTE POINTER + MOVEM B,INPNT ;TAKE INPUT FROM THERE + PUSHJ P,RSTMAC + MOVEM T,MACPNT + POPJ P, + +ITVAR0: TLNN M,DSKACT!MACACT +SKEY,< OUTSTR [ASCIZ/VARIABLE NAME. +^/]> +NOSKEY,< OUTSTR[ASCIZ/VARIABLE NAME. +/]> + PUSHJ P,VARNM ;GET VARIABLE NAME + CAIE C,12 ;MUST END WITH + JRST INNERR + PUSHJ P,VARFND ;LOOKUP NAME + JRST VARN99 ;NOT FOUND, ERROR + HLRZ T,(E) ;GET PTR TO EXPANSION + PUSHJ P,SETTT ;COPY INTO A 9-BIT STRING + MOVE A,SETSTR + JUMPE T,ITVAR1 + ADD T,[XWD 440700,1];MAKE A BYTE PTR TO TEXT + PUSHJ P,GETTT + JRST ITVAR1 + PUTBYT (C) + JRST .-3 +ITVAR1: MOVE B,A + PUTBYT 200+":" + MOVEI C,"H" + JRST ITLET1 + +ARGSET: HRRZ G,MACPNT ;SETUP INTIAL MACPDL POINTER + PUSHJ P,SREADN ;GET LEVEL # (OR INITIAL VALUE) + MOVE TT,T + CAIN C,12 ;NEW FORMAT? + JRST [ MOVEI T,1 ;ASSUME INC OF 1 + JRST GOTANM] + CAIE C,"," + JRST INNERR + PUSHJ P,SREADN + CAIN C,12 + JRST GOTANM + MOVE TTT,T + PUSHJ P,READN + CAIE C,12 ;NOW IT MUST BE LF + JRST INNERR ;LOSE BIG + PUSHJ P,PDLCAL + MOVE T,TTT +GOTANM: HRRZ TTT,-1(G) ;GET LOOP COUNT + IMUL TTT,T ;MULT BY INC + ADD TT,TTT ;ADD TO INITIAL VALUE + MOVE T,TT ;PUT RESULT IN T + JRST CPOPJ1 ;SUCCESSFUL SCAN + +PDLCAL: IMULI T,5 ;MULT LEVEL BY 5 + SUB G,T ;BACK UP CORRECT NUMBER OF LEVELS +TRNLVL: CAILE G,MACPDL ;TOO FAR? + POPJ P, + ADDI G,5 ;YES + TLNN M,MACACT!DSKACT + OUTSTR[ASCIZ/TRUNCATING MACRO LEVEL! +/] + JRST TRNLVL + ;"E" "X" "O" "I" +;"X" +ITEXPR: PUSHJ P,EXPSET + POPJ P, ;LOSE + TDZA T,T ;FALSE RETURN + SETO T, ;TRUE RETURN + MOVEM T,LSTEXP ;STORE HERE + GETFS (B) + HRRZ D,B ;HOLD POINTER + SETZM (D) ;CLEAR POINTER TO NEXT + SETZM 1(D) ;CLEAR DATA + ADD D,[XWD 441100,1] ;MAKE BYTE POINTER + MOVE T,[POINT 7,SIGBUF] + JRST ITEXP1 + +ITEXP2: PUSHJ P,PUTINL +ITEXP1: ILDB TT,T + JUMPN TT,ITEXP2 + PUSHJ P,PUTRET + MOVEI C,"X" + JRST ITLET1 + +EXPSET: TLNN M,DSKACT!MACACT +SKEY,< OUTSTR[ASCIZ/TYPE EXPRESSION. +^/]> +NOSKEY,< OUTSTR[ASCIZ/TYPE EXPRESSION. +/]> + PUSHJ P,TREADX ;READ STRING + POPJ P, ;NULL OR ALTMODE + MOVE A,B + ADD A,[POINT 7,1] +MD,< SETZM DOVARS > + PUSHJ P,SIGSUB + JRST [ +MD,< SETOM DOVARS > + OUTSTR [ASCIZ /ERROR IN EXPRESION(S): +/] + MOVE T,B + PUSHJ P,OUTTXT + OUTSTR [ASCIZ / +/] + JRST PUTFS] ;NOW GIVE BACK STRING + PUSHJ P,PUTFS ;GIVE BACK STRING +MD,< SETOM DOVARS > + MOVS T,SIGBUF + CAIE T,() ;DID EXPRESSION EVALUATE TO 0? + AOS (P) + JRST CPOPJ1 + +TREADX: PUSHJ P,GETLIN ;GET FIRST CHAR + CAIN C,12 + POPJ P, ;IGNORE BLANK LINES + GETFS(B) + SETZM (B) + MOVSI T,() + MOVEM T,1(B) + MOVE T,B + ADD T,[POINT 7,1,6] +TREADY: PUSHJ P,TREADZ + PUSHJ P,GETLIN + CAIN C,ALTMOD + JRST PUTFS ;RETURN STRING IF ALTMODE + CAIE C,12 + JRST TREADY + MOVEI C,"]" + AOS (P) +TREADZ: TLNE T,760000 + JRST TREADW + GETFS(TT) + HRRM TT,-1(T) + HRR T,TT + SETZM (T) + SETZM 1(T) +TREADW: IDPB C,T + POPJ P, + +;"E" +ITEVAL: PUSHJ P,TREADU ;READ MACRO NAME + POPJ P, ;ALTMODE + JFCL ;NULL, LET IT THROUGH + MOVE D,B ;SAVE POINTER TO NAME + PUSHJ P,SETTT + MOVE A,SETSTR +ITEVA1: PUSHJ P,GETLIN + CAIN C,600+":" ;CTRL META COLON? + JRST ITEVA2 + PUTBYT (C) + JRST ITEVA1 + +ITEVA2: PUTBYT 200+":" + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +END ;E /] + JRST ITMAKE + +ITOUT: PUSHJ P,TREAD + MOVE T,B + TLNN M,DSKACT!MACACT ;PRINT IF NOT TAKING INPUT FROM TTY + OUTSTR[ASCIZ/END ;O +/] + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ +/] + JRST PUTFS + +ITIN: TLNN M,DSKACT + OUTSTR[ASCIZ/TYPE ARGUMENT (END WITH CRLF). +/] + MOVE T,MACPNT + PUSH T,[400000,,0] + MOVEI B, + SETZM BRKCHR + JRST MACRT2 + +ITYANK: TLNN M,DSKFLG ;ANY I FILE? + JRST [ TLNN DSKACT!MACACT + OUTSTR[ASCIZ/SORRY, NO DSKIN FILE OPEN. +/] + POPJ P,] + PUSHJ P,GETCHR ;GET CHARACTER TO USE AS BREAK CHAR + ANDI C,177 ;NO CTRL OR META PLEASE + MOVEM C,BRKCHR + PUSHJ P,DSKCON ;CONTINUE DSK INPUT + HRLZ TT,C + MOVE T,MACPNT + PUSH T,TT ;SAVE BRKCHR ON STACK + MOVEI B, + JRST MACRT2 ;AND DO ;T + +DSKCON: TLNN M,DSKFLG ;DOING DISK INPUT AT ALL? + POPJ P, ;NO +NOLAY, +LAY,;LAY + POPJ P, + +ITLOWG: TLNN M,DSKACT!MACACT +SKEY,< OUTSTR[ASCIZ/TYPE STRING TO CONVERT. +^/]> +NOSKEY,< OUTSTR[ASCIZ/TYPE STRING TO CONVERT. +/]> + PUSHJ P,SETTT +ITLOW1: PUSHJ P,GETLIN + CAIN C,12 ;EOL? + JRST ITLOW2 + CAIL C,100 ;CONVERT RANGE 100-137 TO 140-177 + TRO C,40 + PUTBYT (C) + JRST ITLOW1 + +ITLOW2: PUTBYT 200+":" + MOVEI C,"G" ;FOR END ; MUMBLE + MOVE B,SETSTR + JRST ITLET1 + ;MACRO MAKERS +MACLET: GETFS(B) + HRRZ D,B + SETZM (D) + ADD D,[XWD 441100,1] + PUSHJ P,PUTINL + JRST PUTRET + +SMACNM: GETFS (B) + HRRZ D,B ;HOLD POINTER + SETZM (D) ;CLEAR POINTER TO NEXT + ADD D,[XWD 441100,1];MAKE BYTE POINTER + JUMPE T,PUTRET ;NULL TEXT IF ZERO + MOVEI TT,"+" + SKIPG T + MOVEI TT,"-" + PUSHJ P,DODIV2 + JRST PUTRET + +MACNUM: GETFS (B) + HRRZ D,B ;HOLD POINTER + SETZM (D) ;CLEAR POINTER TO NEXT + SETZM 1(D) ;CLEAR DATA + ADD D,[XWD 441100,1];MAKE BYTE POINTE + PUSHJ P,DODIV ;PUT IN THE TEXT +PUTRET: MOVEI TT,":"+200;PUT IN THE END +PUTINL: TLNE D,770000 ;END OF WORD? + JRST DODV1 ;NO + GETFS (E) ;YES, GET MORE FREE STORAGE + SETZM (E) ;CLEAR POINTER TO NEXT + SETZM 1(E) ;CLEAR DATA + HRRM E,-1(D) ;POINT TO THIS ONE + HRR D,E +DODV1: IDPB TT,D ;DEPOSIT CHR + POPJ P, + +DODIV: SKIPL T + JRST DODIV1 + MOVEI TT,"-" +DODIV2: PUSHJ P,PUTINL + MOVM T,T +DODIV1: IDIVI T,=10 + SOJG A,DODIV3 ;GO AT LEAST UNTIL WIDTH COUNT RUNS OUT + JUMPE T,DODIV4 +DODIV3: HRLM TT,(P) + PUSHJ P,DODIV1 + HLRZ TT,(P) +DODIV4: ADDI TT,60 + JRST PUTINL + +MACCLR: SKIPN T,MDPNT + POPJ P, + MOVSI TT,MACTMP +MCCRL1: ANDCAM TT,(T) ;CLEAR TMP BIT + HRRZ T,(T) + JUMPN T,MCCRL1 ;LOOP THRU ALL + POPJ P, + ;READ/WRITE MACRO FILES +WMACRS: SETOM DX1 + CAIA +WMACRO: SETZM DX1 ;FLAG NO SELECT + SKIPE VARPNT + JRST WMAC2 + SKIPN MDPNT + JRST [ OUTSTR[ASCIZ/NO MACROES. +/] + POPJ P,] +WMAC2: MOVEM P,PERRSAV + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/MACRO /] + MOVSI T,EXTMCR + PUSHJ P,SETNAM ;SET WIRE LIST FILENAME + POPJ P, ;LET HIM OUT + ENTPPN + INIT DAT,10 + 'DSK ' + XWD IOHD,0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + MOVEI T,IOBUF + EXCH T,.JBFF + OUTBUF DAT,2 + MOVEM T,.JBFF + PUSHJ P,EXIST ;DOES IT EXIST? + POPJ P, ;DOESN'T WANT TO OVERWRITE IT + OUTSTR[ASCIZ/WRITING /] + MOVEI A,FILNAM + JSR FPRINT + ENTER DAT,FILNAM + JRST [ RELEASE DAT, + OUTSTR[ASCIZ/, ENTER FAILED. +/] + POPJ P,] + OUTSTR[ASCIZ/ +/] + SKIPN A,VARPNT + JRST WMAC14 + TLNN M,DSKACT!MACACT + SKIPN DX1 + CAIA + OUTSTR[ASCIZ/VARIABLES: +/] + PUSHJ P,WRTZERO +WMAC4: SKIPN DX1 + JRST WMAC4A + TLNE M,DSKACT!MACACT + JRST WMAC4B + HRRZ T,1(A) + PUSHJ P,OUTTXT +WMAC4B: PUSHJ P,YORN + JRST WMAC3 ;SKIP THE REST OF THE VARIABLES ON ALT + JRST WMAC6 ;SKIP THIS ONE ON NO +WMAC4A: HRRZ TT,1(A) + PUSHJ P,WSTR ;WRITE VARIABLES + HLRZ TT,1(A) + JUMPE TT,WMAC5 + HLRZ B,(TT) + HRLZ TTT,(TT) + HLR TTT,(B) + TLO TTT,400000 + PUSHJ P,WORDOUT + MOVE TT,B + PUSHJ P,WSTR +WMAC13: HLRZ TT,(A) + PUSHJ P,WSTR +WMAC6: HRRZ A,(A) + JUMPN A,WMAC4 +WMAC3: PUSHJ P,WRTZERO +WMAC14: SKIPN A,MDPNT + JRST WMAC8 + TLNN M,DSKACT!MACACT + SKIPN DX1 + CAIA + OUTSTR[ASCIZ/MACROES: +/] +WMAC1: SKIPN DX1 + JRST WMAC1A + TLNE M,DSKACT!MACACT + JRST WMAC1B + HRRZ T,1(A) + PUSHJ P,OUTTXT +WMAC1B: PUSHJ P,YORN + JRST WMAC8 ;END ON ALT + JRST WMAC1C ;SKIP ON NO +WMAC1A: HRRZ TT,1(A) + PUSHJ P,WSTR + HLRZ TT,1(A) + PUSHJ P,WSTR ;WORKS FOR 9 BIT TEXT IF NO 'S +WMAC1C: HRRZ A,(A) + JUMPN A,WMAC1 +WMAC8: PUSHJ P,WRTZERO + RELEASE DAT, + POPJ P, + +WMAC5: HLRZ B,(A) + HLLZ TTT,(B) + SKIPE TTT + MOVEI TTT,1 ;MULTI-STRING VARIABLE + PUSHJ P,WORDOUT + JUMPE TTT,WMAC13 +WMAC7: MOVE TT,B + PUSHJ P,WSTR + HLRZ B,(B) + JUMPN B,WMAC7 + JRST WMAC6 ;NOTE: NULL STRING WRITTEN AS LAST OF MULTI-STRING VAR + +MACOUT: SKIPN A,MDPNT + JRST WRTZERO ;NONE, MARK END +MACOU1: HLRZ TT,(A) + TRNN TT,MSAVE ;SHALL WE SAVE IT? + JRST MACOU3 + HRRZ TT,1(A) + PUSHJ P,WSTR ;WRITE MACRO NAME + HLRZ TT,1(A) + PUSHJ P,WSTR ;NOW BODY +MACOU3: HRRZ A,(A) + JUMPN A,MACOU1 + PUSHJ P,WRTZERO ;FINISH OFF + POPJ P, + +IMACRO: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/MACRO /] + MOVSI T,EXTMCR + PUSHJ P,SETNAM + POPJ P, ;LET HIM OUT + INIT DAT,10 + 'DSK ' + IOHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + OUTSTR[ASCIZ/READING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP DAT,FILNAM + JRST LOOKRR +DEC,< JSR DAT,LOOKCK > + OUTSTR[ASCIZ/ +/] + MOVEI T,IOBUF + EXCH T,.JBFF + INBUF DAT,2 + MOVEM T,.JBFF + PUSHJ P,RSTRZ + CAIA + JRST IMAC2 ;NO VARIABLES +IMAC8: PUSHJ P,RSTRZ ;READ VARIABLE NAME + JRST IMAC1 + MOVE D,T + PUSHJ P,OUTTXT ;PRINT ALL VARIABLES + OUTSTR[ASCIZ/ +/] + PUSHJ P,VARFND + JRST IMAC6 ;DOESN'T EXIST YET + HLRZ C,1(E) + JUMPE C,IMAC4 + HLRZ B,(C) + PUSHJ P,PUTFS + FSTRET (C) + HRRZS 1(E) +IMAC4: HLRZ B,(E) +IMAC5: HLRZ D,(B) + PUSHJ P,PUTFS + SKIPE B,D + JRST IMAC5 +IMAC3: PUSHJ P,WORDIN + TLZE TTT,400000 + JRST IMAC9 + SKIPA C,TTT +IMAC7: MOVE E,T + PUSHJ P,RSTRZ + JRST [ GETFS(T) ;MARK END OF MULTI STRING VAR + SETZM (T) ;WITH NULL STRING + SETZM 1(T) + HRLM T,(E) + JRST IMAC8] + HRLM T,(E) + JUMPN C,IMAC7 ;MULTI-STRING? + JRST IMAC8 ;NO + +IMAC6: GETFS (E) ;MAKE NEW VARIABLE + MOVE B,VARPNT + HRRZM B,(E) + HRRZM D,1(E) + MOVEM E,VARPNT + JRST IMAC3 + +IMAC9: MOVE C,TTT + PUSHJ P,RSTR + GETFS (D) + HRLM D,1(E) + HRLZM T,(D) + HRLM C,(T) + HLRM C,(D) + PUSHJ P,RSTR + HRLM T,(E) + TRNN C,400000 + JRST IMAC12 + MOVE T,1(T) ;ALPHABETIC VARIABLE + ROT T,7 + MOVEM T,1(D) + JRST IMAC8 + +IMAC12: ADD T,[POINT 7,1] + SETZB A,B +IMAC10: PUSHJ P,GETTT ;CONVERT VALUE TO BINARY + JRST IMAC11 + CAIN C,"-" + SOJA A,IMAC10 + IMULI B,=10 + ADDI B,-"0"(C) + JRST IMAC10 + +IMAC11: SKIPE A + MOVN B,B + MOVEM B,1(D) + JRST IMAC8 + +IMAC1: PUSHJ P,RSTRZ + JRST IMAC0 +IMAC2: SETZ C, ;CLEAR FLAGS WORD + PUSHJ P,MACINX +IMAC0: RELEASE DAT, + POPJ P, + +MACIN: PUSHJ P,RSTRZ + POPJ P, +MACINX: MOVE D,T + PUSHJ P,RSTR ;WORKS FOR 9 BIT IF NO 'S IN MACRO + MOVE A,T + PUSHJ P,ITMAKE ;MAKE THIS ONE + IORM C,(E) ;OR IN BITS + JRST MACIN + ;HERE TO DEFINE A NEW (OR REDEFINE AN OLD) VARIABLE + +VARDEF: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /VARIABLE DEFINITION?/] + PUSHJ P,VARNM ;BUILD LIST STRUCTURE FOR NAME + CAIN C,":" ;NAME ENDED WITH ":"? + JRST VARDE4 ;YES + CAIE C,"=" ;NAME ENDED WITH "="? + CAIN C,"_" ;NAME ENDED WITH "_"? + JRST VARDE4 ;YES + JRST INNERR + +VARDE4: PUSH P,C ;SAVE NAME TERMINATING CHR + PUSHJ P,VARFND ;OLD VARIABLE? + JRST VARDE1 ;NO, MAKE A NEW ONE + JRST VARDE2 + +VARDE1: GETFS (E) ;BUILD VARIABLE LIST STRUCTURE + MOVE B,VARPNT + HRRZM B,(E) ;HOOK INTO LIST OF VAR NAMES + HRRZM D,1(E) + HRRZM E,VARPNT +VARDE2: PUSHJ P,TREAD ;READ DEFINITION + MOVE D,B ;SAVE POINTER TO DEFINITION + HLRZ C,1(E) ;RETURN OLD DEFINITION TO FREE STG + JUMPE C,VARDE5 ;MORE STRUCTURE EXISTS? + HLRZ B,(C) + PUSHJ P,PUTFS +VARDE5: MOVE B,(P) ;GET NAME TERMINATING CHR + CAIE B,"=" ;NUMERIC VARIABLE? + JRST VARDE6 ;NO, GO DEFINE STRING VARIABLE + JUMPN C,VARDE8 ;NEED TO BUILD MORE STRUCTURE? + GETFS (C) ;YES + HRLM C,1(E) + SETZM 1(C) +VARDE8: HRLZM D,(C) ;PLUG IN PTR TO NEW DEFINITION + JRST VARDE7 + +VARDE6: JUMPE C,VARDE7 ;STRUCTURE TO FLUSH? + SETZM (C) + MOVE B,C + PUSHJ P,PUTFS ;YES, FLUSH IT +VARDE7: HLRZ B,(E) ;RETURN OLD VALUE + JUMPE B,VARD10 +VARDE9: HLRZ C,(B) + PUSHJ P,PUTFS + SKIPE B,C ;MULTI-STRING VARIABLE VALUE? + JRST VARDE9 ;YES, MORE TO RETURN +VARD10: HRRZS (E) ;CLEAR PTR TO OLD STRUCTURE + POP P,B ;GET NAME TERMINATING CHR + CAIN B,"=" ;NUMERIC VARIABLE? + JRST VARNX0 ;SET UP INITIAL VALUE + HRLM D,(E) ;PLUG IN NEW VALUE + HRRZS 1(E) ;CLEAR PTR TO OLD STRUCTURE + CAIE B,":" ;MULTI-STRING DEFINITION? + POPJ P, +VARDE0: TLNN M,DSKACT!MACACT + OUTCHR [":"] ;PROMPT FOR NEXT LINE + PUSHJ P,TREAD ;GET NEXT STRING + HRLM B,(D) ;SAVE PTR TO STRING + MOVE D,B ;DO NEXT STRING + SKIPE 1(B) + JRST VARDE0 + POPJ P, + VARFND: MOVEI E,VARPNT ;SEARCH VARIABLE LIST FOR A NAME +VARFN1: HRRZ E,(E) ;GET PTR TO NEXT VARIABLE + JUMPE E,CPOPJ ;AT END OF LIST? + HRRZ A,1(E) ;NO, COMPARE NAMES + MOVE B,D + PUSHJ P,TXTMAT + JRST VARFN1 ;NOT FOUND, DO NEXT VARIABLE + MOVE B,D ;BINGO! + AOS (P) ;SKIP RETURN + JRST PUTFS ;RETURN NAME TO FREE STG + +VARNUM: SETZB TTT,G ;READ ONE NUMBER FROM VARIABLE DEF +VARNU4: PUSHJ P,VARCHR ;GET NEXT CHR + JRST VARNU3 ;AT END + CAIL T,"0" ;NUMERIC? + CAILE T,"9" + JRST VARNU2 ;NO + IMULI TTT,=10 ;COMPILE VALUE + ADDI TTT,-"0"(T) + AOS G ;COUNT CHARACTERS + AOJA D,VARNU4 ;STEP TO NEXT INPUT CHR + +VARNU2: CAIN T,"-" ;MINUS? + TROE G,200000 ;YES, 2 MINUSES? + JRST VARNU3 ;NOT MINUS OR 2 MINUSES, QUIT + AOJA D,VARNU4 + +VARNU3: TRNE G,200000 ;MINUS TYPED? + MOVNS TTT ;YES, SO NEGATE VALUE + POPJ P, + +VARCHR: PUSHJ P,VARBYT ;GET PTR TO CHR + POPJ P, ;OFF THE END + LDB T,TT ;GET CHR + JUMPE T,CPOPJ ;AT END + CAIL T,"a" ;LOWER CASE? + CAILE T,"z" + JRST CPOPJ1 ;NO, DONE + SUBI T,40 ;CONVERT TO UPPER CASE + JRST CPOPJ1 + +VARBYT: MOVE T,C ;GET TEXT PTR + MOVE TT,D ;GET CHR COUNT +VARBY1: CAILE TT,4 ;CHR IN THE CURRENT WORD? + JRST [SUBI TT,5 ;NO, REDUCE COUNT + HRRZ T,(T) ;GET NEXT PTR + JUMPN T,VARBY1 ;AT END? + POPJ P,] ;YES, RETURN + MOVE TT,VARBY2(TT) ;GET BYTE PTR + JRST CPOPJ1 +VARBY2: POINT 7,1(T),6 ;TABLE OF BYTE PTRS FOR GETTING CHR + POINT 7,1(T),13 + POINT 7,1(T),20 + POINT 7,1(T),27 + POINT 7,1(T),34 + VARNM: GETFS (B) ;READ ONE VARIABLE NAME + PUSH P,B ;SAVE PTR TO START OF STRUCTURE + SETZM (B) + SETZM 1(B) + HRLI B,020700 ;MAKE A BYTE PTR +VARNM2: PUSHJ P,GETLIN ;GET ONE CHR + CAIL C,"a" ;LOWER CASE? + CAILE C,"z" + JRST VARNM1 ;NO + SUBI C,40 ;CONVERT TO UPPER CASE +VARNM3: TLNE B,760000 ;PUT CHR INTO NAME. AT END OF WORD? + JRST VARNM4 ;NO + GETFS (D) ;GET NEW WORD + SETZM (D) + SETZM 1(D) + HRRZM D,-1(B) ;ADD TO END OF STRUCTURE + HRR B,D ;MAKE NEW BYTE PTR +VARNM4: IDPB C,B + JRST VARNM2 + +VARNM1: CAIL C,"A" ;ALPHABETIC? + CAILE C,"Z" + CAIN C,"." ;PERIOD? + JRST VARNM3 ;YES, VALID SYMBOL CONSTITUENT + CAIL C,"0" ;NUMERIC? + CAILE C,"9" + CAIN C,"%" ;PERCENT? + JRST VARNM3 ;YES, VALID + CAIN C,"$" ;DOLLAR SIGN? + JRST VARNM3 ;YES, VALID + POP P,D ;NO, END OF SYMBOL. GET PTR TO BEGINING + POPJ P, + ;HERE TO TYPE THE VALUES OF ALL VARIABLES + +VARTYP: TVOFF + MOVEI A,VARPNT ;POINT TO VARIABLE NAME LIST +VARTY1: OUTSTR [ASCIZ / +/] + HRRZ A,(A) ;GET NEXT VARIABLE + JUMPE A,[ TVON ;DONE? + POPJ P,] + HRRZ T,1(A) ;PTR TO NAME + PUSHJ P,OUTTXT + HLRZ T,(A) ;MULTI-STRING VARIABLE? + HLLZ T,(T) + HRRI T,":" + TLZE T,-1 + JRST VARTY2 ;YES, FLAG WITH ":" + HLRZ T,1(A) ;STRING VARIABLE? + SKIPN T + TROA T,"_" ;YES, FLAG WITH "_" + MOVEI T,"=" +VARTY2: OUTCHR T + HLRZ T,(A) ;PTR TO EXPANSION + PUSHJ P,OUTTXT + JRST VARTY1 ;DO NEXT ONE + +;HERE TO INCREMENT A VARIABLE + +VARNXT: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /VARIABLE NAME?/] + PUSHJ P,VARNM ;GET VARIABLE NAME + CAIE C,12 ;ENDED WITH LINE FEED? + JRST INNERR ;NO, ERROR + PUSHJ P,VARFND ;LOOKUP VARIABLE NAME + JRST [VARN99: + TLNN M,MACACT ;NOT FOUND + OUTSTR [ASCIZ /NO SUCH NAME!/] + MOVE B,D ;RETURN NAME TO FREE STG + JRST PUTFS] + +VARNX0: HLRZ B,1(E) ;GET PTRS TO VARIOUS PIECES OF STRUCTURE + JUMPE B,VARN40 ;INCREMENTING A STRING VARIABLE? + HLRZ C,(B) ;PTR TO TEXT + HRRZ D,(B) ;CHR NUMBER + PUSHJ P,VARNUM ;NO, GET A NUMBER + TRNN G,177777 ;ANY DIGITS SEEN? + JRST VARNX3 ;NO + PUSHJ P,VARN31 ;CHECK FORMAT + JRST VARILL ;NO, FORMAT ERROR +VARNX5: MOVEM TTT,1(B) ;SAVE VALUE +VARNX7: HRRM D,(B) ;SAVE CHR COUNT + HRLM G,(C) ;SAVE DIGIT COUNT + VARNX8: SKIPL (C) ;ALPHABETIC VARIABLE? + JRST VARN16 ;NO, PUT OUT A NUMBER + HRRZ D,1(B) + HLRZ B,(E) ;GET PTR TO OLD VALUE EXPANSION + PUSHJ P,PUTFS ;RETURN TO FREE STG + GETFS (T) ;MAKE NEW EXPANSION + SETZM (T) + HRLM T,(E) + ROT D,-7 + HLLZM D,1(T) + POPJ P, + +VARN16: MOVE T,1(B) ;GET THE NUMBER + HLRZ G,(C) ;GET DIGIT COUNT + TRZ G,600000 ;CLR FLAG BITS + GETFS (TTT) ;BUILD NEW EXPANSION + PUSH P,TTT ;SAVE PTR TO BEGINNING + SETZM (TTT) + SETZM 1(TTT) + HRLI TTT,020700 ;MAKE BYTE PTR + PUSHJ P,VARN17 ;DO THE DECIMAL PRINT + HLRZ B,(E) ;RETURN OLD EXPANSION TO FREE STG + PUSHJ P,PUTFS + POP P,T ;PLUG IN NEW EXPANSION + HRLM T,(E) + POPJ P, + +VARNX1: JUMPE D,VARILL ;EMPTY DEFINITION? + MOVEI G,1 ;NO USE DEFAULT INCREMENT OF 1 + +VARNX9: MOVE T,1(B) ;GET VALUE + SKIPGE (C) ;ALPHABETIC? + JUMPN G,VARN15 ;YES, NON-ZERO INCREMENT? + ADD T,G ;NO, ADD INCREMENT TO VALUE + JRST VARN12 + +VARN15: HRLOI TTT,377777 ;MAKE SUPER-BIG UPPER LIMIT + JUMPG G,VARN14 ;INCREMENT POS? + MOVNS TTT ;NO, MAKE UPPER LIMIT NEGATIVE + JRST VARN14 ;GO TO GIOQ SKIPPER + VARN17: JUMPGE T,VARN19 ;NEGATIVE? + MOVNS T ;YES, SO MAKE POSITIVE + SETZM G ;NO FIXED NUMBER OF DIGITS + MOVEI TT,"-" ;OUTPUT A MINUS SIGN + IDPB TT,TTT +VARN19: IDIVI T,=10 ;RECURSIVE DECIMAL PRINT + HRLM TT,(P) + SOSG G ;DONT ZERO SUPPRESS UNTIL COUNT RUNS OUT + SKIPE T ;ALL DIGITS DONE? + PUSHJ P,VARN19 ;NO + HLRZ TT,(P) + ADDI TT,"0" ;CONVERT DIGIT TO ASCII +VARN20: TLNE TTT,760000 ;WORD FULL? + JRST VARN18 ;NO + GETFS (D) ;YES, GET ANOTHER WORD + HRRZM D,-1(TTT) + SETZM 1(D) + SETZM (D) + HRR TTT,D ;MAKE NEW BYTE PTR +VARN18: IDPB TT,TTT ;SAVE DIGIT + POPJ P, + +VARNX3: TRNE G,200000 ;MINUS TYPED? + JRST VARILL ;YES, ERROR BECAUSE NO DIGITS TYPED + JUMPE T,VARNX1 ;AT END OF DEFINITION? + CAIN T,"(" ;INCREMENT COMING? + AOJA D,VARNX2 ;YES, GO GET IT + CAIL T,"A" ;ALPHABETIC VARIABLE? + CAILE T,"Z" + JRST [VARILL:OUTSTR [ASCIZ /ILLEGAL VARIABLE DEFINITION!/] + POPJ P,] + MOVEM T,1(B) ;SAVE VALUE + PUSHJ P,VARN30 ;GET NEXT CHR AND CHECK FORMAT + JRST VARILL ;NO, FORMAT ERROR! +VARNX6: MOVEI G,400000 ;FLAG ALPHABETIC VARIABLE + JRST VARNX7 + VARNX2: PUSHJ P,VARNUM ;GET INCREMENT + CAIE T,")" ;MUST END WITH ")" + JRST VARILL + PUSH P,TTT ;SAVE VALUE + AOS D ;STEP TO NEXT CHR + PUSHJ P,VARNUM ;GET UPPER LIMIT + POP P,TT ;GET INCREMENT + TRNN G,177777 ;ANY DIGITS TYPED? + JRST VARN10 ;NO + PUSHJ P,VARN31 ;CHECK FORMAT + JRST VARILL ;NO, FORMAT ERROR + +VARN11: JUMPE TT,VARILL ;0 INCREMENT WONT GO ANYWHERE + SKIPGE (C) ;ALPHABETIC? + JRST VARILL ;YES, SO NUMERIC UPPER LIMIT ILLEGAL + MOVE T,1(B) ;GET VALUE + JUMPL TT,[CAMG T,TTT ;ARGS IN RIGHT ORDER FOR NEG INCREMENT? + JRST VARILL ;NO + ADD T,TT ;ADD INCREMENT TO VALUE + CAMG T,TTT ;GONE PAST UPPER LIMIT? + MOVE T,TTT ;YES, USE UPPER LIMIT ITSELF + JRST VARN12];NO + CAML T,TTT ;ARGS IN RIGHT ORDER FOR POS INCREMENT? + JRST VARILL ;NO + ADD T,TT ;ADD INCREMENT TO VALUE + CAML T,TTT ;GONE PAST UPPER LIMIT? + MOVE T,TTT ;YES, USE UPPER LIMIT AS VALUE +VARN12: MOVEM T,1(B) ;SAVE INCREMENTED VALUE + CAMN T,TTT ;AT UPPER LIMIT? + HRRM D,(B) ;YES, UPDATE CHR COUNT + JRST VARNX8 ;EXPAND THE RESULT + +VARN10: TRNE G,200000 ;MINUS TYPED? + JRST VARILL ;YES, ILLEGAL ALPHABETIC! + MOVE G,TT ;SAVE INCREMENT + JUMPE T,VARNX9 ;AT END OF DEFINITION? + CAIL T,"A" ;ALPHABETIC UPPER LIMIT? + CAILE T,"Z" + JRST VARILL ;NO + MOVE TTT,T ;SAVE UPPER LIMIT + JUMPE G,VARILL ;INCREMENT 0? + PUSHJ P,VARN30 ;GET NEXT CHR AND CHECK FORMAT + JRST VARILL ;NO, FORMAT ERROR +VARN13: SKIPL (C) ;ALPHABETIC VALUE? + JRST VARILL ;NO, ALPHABETIC UPPER LIMIT ILLEGAL + MOVE T,1(B) ;GET VALUE + VARN14: JUMPL G,[CAMG T,TTT ;ARGS IN RIGHT ORDER FOR NEG INCREMENT? + JRST VARILL ;NO + ADD G,T ;ADD INCREMENT TO VALUE + CAILE T,"Q" ;WENT PAST Q? + CAILE G,"Q" + CAIA ;NO + SOS G ;YES, IT SHOULD BE SKIPPED + CAILE T,"O" ;WENT PAST O? + CAILE G,"O" + CAIA ;NO + SOS G ;YES, IT SHOULD BE SKIPPED + CAILE T,"I" ;WENT PAST I? + CAILE G,"I" + CAIA ;NO + SOS G ;YES, IT SHOULD BE SKIPPED + CAILE T,"G" ;WENT PAST G? + CAILE G,"G" + SKIPA T,G ;NO + SOS T,G ;YES, IT SHOULD BE SKIPPED + CAMG G,TTT ;WENT PAST UPPER LIMIT? + MOVE T,TTT ;YES, USE UPPER LIMIT AS VALUE + JRST VARN12];NO + CAML T,TTT ;ARGS IN RIGHT ORDER FOR POS INCREMENT? + JRST VARILL ;NO + ADD G,T ;ADD VALUE TO INCREMENT + CAIGE T,"G" ;WENT PAST G? + CAIGE G,"G" + CAIA ;NO + AOS G ;YES, IT SHOULD BE SKIPPED + CAIGE T,"I" ;WENT PAST I? + CAIGE G,"I" + CAIA ;NO + AOS G ;YES, IT SHOULD BE SKIPPED + CAIGE T,"O" ;WENT PAST O? + CAIGE G,"O" + CAIA ;NO + AOS G ;YES, IT SHOULD BE SKIPPED + CAIGE T,"Q" ;WENT PAST Q? + CAIGE G,"Q" + SKIPA T,G ;NO + AOS T,G ;YES, IT SHOULD BE SKIPPED + CAML G,TTT ;WENT PAST UPPER LIMIT? + MOVE T,TTT ;YES, USE UPPER LIMIT AS VALUE + JRST VARN12 ;NO + VARN30: AOS D ;STEP TO NEXT CHR + PUSHJ P,VARCHR ;GET IT +VARN31: JUMPE T,CPOPJ1 ;END OF DEFINITION IS LEGAL + CAIN T,"," ;COMMA IS VALID + AOJA D,CPOPJ1 ;MOVE PAST COMMA + CAIE T,"(" ;NEW INCREMENT ALSO LEGAL + POPJ P, ;OTHERS ARE ILLEGAL + JRST CPOPJ1 + +VARN40: HLRZ C,(E) ;PTR TO STRING + HLRZ D,(C) ;MULTI-STRING VARIABLE + JUMPN D,VARN44 ;NON 0 = MULTISTRING, 0=START AT 1ST CHR +VARN41: PUSHJ P,VARCHR ;SEARCH FOR FIRST NUMBER + JRST [TLNN M,MACACT + OUTSTR [ASCIZ /NO NUMBER TO INCREMENT!/] + POPJ P,] + CAIL T,"0" + CAILE T,"9" + AOJA D,VARN41 + MOVE G,D ;SAVE POSITION OF 1ST DIGIT +VARN42: PUSHJ P,VARCHR ;SEARCH FOR END OF NUMBER + JRST .+3 ;END OF DEFINITION + CAIL T,"0" + CAILE T,"9" + SOSA D ;STEP BACK TO LAST DIGIT + AOJA D,VARN42 +VARN43: PUSHJ P,VARBYT ;GET BYTE PTR TO CHR +NODEC,< HALT .+1 > ;CANT HAPPEN +DEC,< PUSHJ P,TODDT > + LDB TTT,TT ;GET DIGIT + AOS TTT + CAIN TTT,"9"+1 ;DIGIT OVERFLOW? + MOVEI TTT,"0" ;YES + DPB TTT,TT ;SAVE INCREMENTED DIGIT + CAIE TTT,"0" ;NEED TO PROPAGATE A CARRY? + POPJ P, ;NO + CAMLE D,G ;YES, OVERFLOWING FIELD? + SOJA D,VARN43 ;NO, INCREMENT NEXT DIGIT + OUTSTR [ASCIZ /NUMERIC FIELD OVERFLOW!/] + POPJ P, + +VARN44: HRLM D,(E) ;NEXT STRING BECOMES CURRENT VALUE + SKIPN 1(D) ;IS THIS END OF MULTI STRING VAR? + SETOM ENDMUL ;YES, FLAG IT + MOVE B,C ;RETURN OLD STRING + JRST PUTFS diff --git a/src/draw/move.310 b/src/draw/move.310 new file mode 100644 index 00000000..b49345a9 --- /dev/null +++ b/src/draw/move.310 @@ -0,0 +1,822 @@ +;MOVE.FAI.43, 18-NOV-75 11:42:05, EDIT BY HELLIWELL +VERSION(MOVE,2) +;START MOVING +PBMOV: TRZA TFLG +PGRAB: TRO TFLG + TRNE INMOV + JRST PERRET + TRZ MD,TMOVE + MOVE T,MODE + HRRZ T,STRTMV(T) + JRST (T) + +TXTMOV: TRNE INMOV + JRST PERRET +MD,< TRZ LMOVE > + TRO TMOVE + MOVE T,MODE + HLRZ T,STRTMV(T) + JRST (T) + +STRTMV: PERRET,,SMOVE ;SET MODE +MD,< BMOVET,,BMOVE ;BODY MODE > +MPC,< PERRET,,BMOVE ;BODY MODE > + PMOVET,,PMOVE ;POINT MODE + PERRET,,PERRET ;LINE MODE + PMOVET,,PMOVE ;TEXT MODE + PERRET,,PERRET ;ALTER MODE + PERRET,,PERRET ;MACRO ALTER MODE + PERRET,,PERRET ;SPECIAL POINTER MODE +MD,< ETMOVT,,ETMOVE ;BODY TEXT MODE + PERRET,,PERRET ;BODY TEXT ALTER MODE + EMOVET,,EDINS2 ;EDIT MODE (MAKE IT SAME AS I) + PERRET,,PERRET ;EDIT INSERT MODE + ETMOVT,,ETMOVE ;EDIT TEXT MODE + PERRET,,EPMOVE ;EDIT PIN MODE + PERRET,,PERRET ;EDIT GET MODE + PERRET,,PERRET ;EDIT ALTER MODE +>;MD +REPEAT NUMODES-(STRTMV-.), + +DOMOVE: TRZ TFLG +DOMOVG: MOVEM TT,MDISP + TRO INMOV + TRNN TFLG ;DON'T MOVE CURSOR IN GRAB MODE + PUSHJ P,SETPOS + MOVEI T,BIGPG + JRST HYDPOG + ;MOVE POINT +MPC,< +DOPMOV: MOVE A,CLOSES ;CALLED FROM $B TO MOVE MIDPOINT + TRZ MD,TMOVE!TFLG!INMOV + JRST PMOVE1 +>;MPC + +PMOVE: PUSHJ P,GETCLS + JRST PERRET +PMOVE1: FETCH(T,A,PXY) + FETCHL(TT,A,PBIT) + TLNE TT,MPC,ISPIN + JRST [ TRNN TFLG ;IF NOT GRAB MODE, + JRST SETPOS ;JUST MOVE CURSOR + POPJ P,] ;ELSE DO NOTHING + JSP TT,DOMOVG +;MOVE SUBR + MOVE A,CLOSES ;GET POINT POINTER + MOVE T,CURSE ;GET CURSOR POSITION + CAMN T,ADDR(A,PXY) + POPJ P, +ROUTE,>;MAKE HIM ROUTE AGAIN +MPC,< STORE(T,A,PXY) + FETCH(B,A,PFEED) ;GET FEED THROUGH POINTER(IF ANY) + FETCHL(TT,A,PBIT) + TLNE TT,FEEDTH + STORE(T,B,PXY) ;STORE ALSO IN FEEDTHROUGH + TRO MCHG + POPJ P, +>;MPC +MD,< TRO MCHG +;MOVE POINT AND FRIENDS +;A = POINT +;T = X,Y + +PMOVIT: FETCHL(TT,A,PBIT) + TLNE TT,ISPIN ;BODY PIN? + POPJ P, ;YES, DOESN'T MOVE +PMOVRL: MOVE TT,T ;HOLD X,Y + XOR T,1(A) ;COMPARE WITH OLD X,Y + JUMPE T,CPOPJ ;LEAVE IF NO CHANGE AT ALL + MOVEM TT,1(A) ;STORE NEW X,Y + TRNE T,-1 ;DID Y CHANGE? + PUSHJ P,PMOVY ;YES + TLNE T,-1 ;DID X CHANGE? + PUSHJ P,PMOVX ;YES +;Here we check to see if a segment leaving this point needs +; to change sense (HORZ to VERT or VERT to HORZ). + MOVEI F,3 ;4 CASES (F IS TABLE INDEX) + PUSH P,A ;SAVE OUR POINT +HVFLP1: XCT SEGTAB(F) ;GET THE POINTER FOR SEGMENT WE WANT TO CHECK + JUMPE T,HVFLP2 ;SKIP IT IF NONE + FETCHL(TT,T,PBIT) + TLNN TT,ISPIN ;PINS ONLY + JRST HVFLP2 + FETCH(TT,T,PXY) + MOVE TTT,(P) + FETCH(TTT,TTT,PXY) ;GET ORIGINAL POINT'S X,Y + ADJUST(SUB,TT,TTT) ;GET DELTAS + PUSH P,TT ;SAVE THEM + HLRE TTT,TT ;SEPERATE X AND Y + HRRE TT,TT + MOVM TTT,TTT ;GET MAGNITUDES ONLY + MOVM TT,TT + XCT HVMAG(F) ;SEE IF PAST DIAGONAL + JRST HVFLP3 ;NO + POP P,TT ;GET BACK SIGNED DELTAS + TRNE F,1 ;DO WE WANT X OR Y DELTA + MOVS TT,TT ;WE WANT Y DELTA + SETCM TTT,F ;COMPLEMENT LOW ORDER BIT (CHANGE HORZ TO VERT) + ANDI TTT,1 ;ASSUME POSITIVE + JUMPGE TT,.+2 + TRO TTT,2 ;WELL IT WAS NEGATIVE + PUSH P,T ;SAVE THIS POINT ALSO + XCT HVNEWT(TTT) ;GET POINTER WE WANT TO USE + JUMPN TT,HVFLP3 ;SKIP IF ALREADY IN USE + XCT HVNEWA(TTT) ;CHECK BOTH ENDS + JUMPN TT,HVFLP3 ;MUST BOTH BE FREE + MOVE TT,-1(P) ;GET ORIGINAL POINT + XCT HVSTOT(TTT) ;STORE IT IN NEW POSITION + MOVE TT,(P) ;GET OTHER POINT + XCT HVSTOA(TTT) ;STORE IT ALSO + XCT HVCLRA(F) ;CLEAR OLD POINTER + XCT HVCLRT(F) ;AT BOTH ENDS +HVFLP3: POP P,(P) ;FIX STACK +HVFLP2: SOJGE F,HVFLP1 + POP P,A ;FIX STACK + POPJ P, + + +SEGTAB: FETCH(T,A,PNU) + FETCH(T,A,PNR) + FETCH(T,A,PND) + FETCH(T,A,PNL) + +HVMAG: CAMG TTT,TT + CAMG TT,TTT + CAMG TTT,TT + CAMG TT,TTT + +HVNEWT: FETCH(TT,T,PND) + FETCH(TT,T,PNL) + FETCH(TT,T,PNU) + FETCH(TT,T,PNR) + +HVNEWA: FETCH(TT,A,PNU) + FETCH(TT,A,PNR) + FETCH(TT,A,PND) + FETCH(TT,A,PNL) + +HVSTOT: STORE(TT,T,PND) + STORE(TT,T,PNL) + STORE(TT,T,PNU) + STORE(TT,T,PNR) + +HVSTOA: STORE(TT,A,PNU) + STORE(TT,A,PNR) + STORE(TT,A,PND) + STORE(TT,A,PNL) + +HVCLRT: CLEAR(T,PND) + CLEAR(T,PNL) + CLEAR(T,PNU) + CLEAR(T,PNR) + +HVCLRA: CLEAR(A,PNU) + CLEAR(A,PNR) + CLEAR(A,PND) + CLEAR(A,PNL) + ;PMOVX, PMOVY +;MOVE POINT, AND CHECK FOR LINE FLIPPING OVER +;Written from viewpoint of moving in Y +;A = POINT MOVED +;TT = NEW X,Y + DEFINE FOO $ (HINST,LOCHW,PND,PNU,PNL,PNR) +< TRO NEEDCL ;MOVING, MAY NEED NEW CLOSEST + PUSH P,A + PUSH P,T + PUSH P,TT + FETCH(A,A,PNR) ;MOVE RIGHT POINT UP/DOWN + MOVE T,TT ;GET NEW Y + HINST T,1(A) ;OLD X,,NEW Y + JUMPE A,.+2 + PUSHJ P,PMOVIT ;MOVE THE POINT & FRIENDS + MOVE A,-2(P) + FETCH(A,A,PNL) ;MOVE LEFT POINT UP/DOWN + MOVE T,(P) ;GET NEW Y + HINST T,1(A) ;OLD X,,NEW Y + JUMPE A,.+2 + PUSHJ P,PMOVIT ;MOVE THE POINT & FRIENDS +;Now check for line flipping over +MOV$LOCHW$0: + MOVE A,-2(P) + H$LOCHW$RE T,1(A) ;MY Y + FETCH(F,A,PNU) ;THE POINT ABOVE + JUMPE F,MOV$LOCHW$1 + H$LOCHW$RE TT,1(F) ;HIS Y + CAMG T,TT ;ARE WE NOW ABOVE HIM? + JRST MOV$LOCHW$1 + FETCH(TT,A,PND) ;TT = THE POINT BELOW US + FETCH(TTT,F,PNU) ;TTT = THE POINT ABOVE US + STORE(A,F,PNU) ;WE ARE ABOVE HIM + STORE(F,A,PND) + STORE(TT,F,PND) ;HE GETS THE BELOW POINT + SKIPE TT + STORE(F,TT,PNU) ;FIXUP REVERSE POINTER + STORE(TTT,A,PNU) ;WE GET ABOVE POINT + SKIPE TTT + STORE(A,TTT,PND) + JRST MOV$LOCHW$0 ;SEE IF WE'RE ABOVE THE UPPERMOST POINT TOO + +;Did we move below the point below us +MOV$LOCHW$1: + FETCH(F,A,PND) + JUMPE F,MOV$LOCHW$2 + H$LOCHW$RE TT,1(F) ;HIS Y + CAML T,TT ;ARE WE BELOW HIM? + JRST MOV$LOCHW$2 + FETCH(TT,A,PNU) ;TT = THE POINT ABOVE US + FETCH(TTT,F,PND) ;TTT = THE POINT BELOW US + STORE(A,F,PND) ;WE ARE BELOW HIM + STORE(F,A,PNU) + STORE(TT,F,PNU) ;HE GETS THE ABOVE POINT + SKIPE TT + STORE(F,TT,PND) ;FIXUP REVERSE POINTER + STORE(TTT,A,PND) ;WE GET BELOW POINT + SKIPE TTT + STORE(A,TTT,PNU) + JRST MOV$LOCHW$0 ;SEE IF WE'RE BELOW THE LOWERMOST POINT TOO + +MOV$LOCHW$2: + POP P,TT + POP P,T + POP P,A + POPJ P, +> + +PMOVY: FOO (HLL,R,PND,PNU,PNL,PNR) +PMOVX: FOO (HRR,L,PNL,PNR,PND,PNU) +>;MD + ;MOVE TEXT OFFSET, CPIN OFFSET +MD,< +PMOVEL: TRNE INMOV + JRST PERRET + TRO LMOVE ;MOVE CPIN OFFSET + TRZ TMOVE +>;MD +PMOVET: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,PXY) +MD,< TRNN LMOVE + JRST PMOVT1 + FETCHL(TT,A,PBIT) + TLNN TT,CPIN + JRST PERRET + TLZ TT,FIXCON ;TURN OFF FIXCON WHEN HE MOVES IT + STOREL(TT,A,PBIT) + FETCH(A,A,PLOC) + JRST PMOVL1 + +PMOVT1: CLRBIT(FIXTXT!FIXRHT,TT,A,PBIT) ;TURN THESE OFF WHEN HE MOVES TEXT OFFSET + FETCH(A,A,PTXT) + JUMPE A,PERRET +PMOVL1: PUSHJ P,TOFSET +>;MD +MPC,< FETCH(A,A,PTXT) + JUMPE A,PERRET + ADJUST(ADD,T,<1(A)>) +>;MPC + JSP TT,DOMOVE + MOVE A,CLOSES + FETCH(TT,A,PXY) +MD,< TRNE LMOVE + JRST [ FETCH(A,A,PLOC) ;USE CPIN POINTER IF LMOVE + JRST TOFMOV] + FETCH(A,A,PTXT) + PUSHJ P,TOFMOV + CAMN T,1(A) + POPJ P, + MOVE A,CLOSES + JRST OFFCON ;FIX CON (NOT IF NO MOVE) +>;MD +MPC,< FETCH(A,A,PTXT) > +TOFMOV: MOVE T,CURSE + TLO T,1 + SUB T,TT + TLZ T,1 +MD,< HLRE TT,T + HRRE T,T + SCALE T + SCALE TT + HRL T,TT +>;MD + CAMN T,1(A) + POPJ P, + EXCH T,1(A) + TRO MCHG + POPJ P, + +MD,< +TOFSET: HLRE TT,1(A) ;CONSTANT OFFSET + UNSCAL TT + MOVE TTT,TT + HRRE TT,1(A) + UNSCAL TT + HRL TT,TTT ;UNSCALED OFFSET + TLZ TT,1 + ADD T,TT ;CURSOR POS + TDZ T,[1,,1] + POPJ P, +>;MD + ;MOVE BODY AND BODY LOC +BMOVE: PUSHJ P,GETCLS + JRST PERRET +BMOVEP: FETCH(T,A,BXY) + JSP TT,DOMOVG +;MOVE SUBR + MOVE A,CLOSES ;GET POINTER TO CLOSEST BODY + MOVE T,CURSE ;GET CURRENT CURSOR POSITION + CAMN T,1(A) + POPJ P, +ROUTE,>;MAKE HIM ROUTE AGAIN + MOVEM T,1(A) ;SET BODY POS + TRO MCHG + JRST BODFIX ;AND FIX PINS + +MD,< +BMOVEL: TRNN INMOV + PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,BXY) + CLRBIT(FIXLOC,TTT,A,BBIT) ;TURN OFF AUTO POSITION BIT + FETCH(TT,A,BLOC) + JUMPE TT,PERRET + ADJUST(ADD,T,) + PUSH P,T + MOVE T,A + PUSHJ P,OFFBLO ;IN CASE CHANGED FIXLOC + POP P,T + TLNE M,BLOCS + TRO MCHG ;REDISPLAY IN CASE WE TURNED THIS LOC ON + TRO LMOVE + TRZ TMOVE + JSP TT,DOMOVE +;MOVE SUBR + MOVE A,CLOSES + MOVE T,CURSE + ADJUST(SUB,T,) ;CALC OFFSET FROM BODY + CAMN T,ADDR(A,BLXY) + POPJ P, + STORE(T,A,BLXY) + TRO MCHG + POPJ P, + +BMOVET: TRNN INMOV + PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,BXY) + CLRBIT(FIXBLO,TT,A,BBIT) + FETCH(TT,A,BLOC) + JUMPE TT,PERRET + ADJUST(ADD,T,) + TLNE M,BLOCS + TRO MCHG + TRZ LMOVE + TRO TMOVE + MOVEI A,-1+ADDR(A,BLO) + PUSHJ P,TOFSET + JSP TT,DOMOVE +;MOVE SUBR + MOVE A,CLOSES + FETCH(TT,A,BXY) + ADJUST(ADD,TT,) + MOVEI A,-1+ADDR(A,BLO) + JRST TOFMOV +>;MD + ;EDIT MOVES +MD,< +EPMOVE: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,TPXY) + JSP TT,DOMOVG +;MOVE SUBR + MOVE A,CLOSES ;GET POINTER TO CLOSEST PIN + MOVE T,CURSE ;GET CURRENT CURSOR POSITION + CAMN T,ADDR(A,TPXY) + POPJ P, + STORE(T,A,TPXY) + TRO MCHG + SKIPN A,PONPNT + POPJ P, +EDPFIX: FETCHL (T,A,PBIT) + TLNN T,ISPIN + JRST NOFIX + FETCH(B,A,BPLOC) + CAME B,CLOSES ;IS THIS ONE OF OUR PINS + JRST NOFIX ;NO + FETCH(E,A,BBODY) + FETCH(F,E,BORI) + FETCH(T,B,TPXY) + PUSHJ P,ORIENT ;ORIENT IT + ADJUST(ADD,T,) + PUSHJ P,PMOVRL ;AND MOVE IT +NOFIX: FETCH(A,A,PNXT) + JUMPN A,EDPFIX ;NEXT + POPJ P, + +ETMOVE: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,TXXY) + MOVE TT,MODE + CAIE TT,BTXTM + JRST NBTXT0 + MOVE TT,BTBODY + PUSH P,F + FETCH(F,TT,BORI) + PUSHJ P,ORIENT + POP P,F + ADJUST(ADD,T,) +NBTXT0: JSP TT,DOMOVG +;MOVE SUBR + MOVE A,CLOSES ;GET POINTER TO CLOSEST TEXT + MOVE T,CURSE ;GET CURSOR POSITION + MOVE TT,MODE + CAIE TT,BTXTM ;BODY TEXT MODE? + JRST NBTXT1 + MOVE TT,BTBODY + ADJUST(SUB,T,) + PUSH P,F + FETCH(F,TT,BORI) + MOVE F,UNROT(F) + PUSHJ P,ORIENT + POP P,F +NBTXT1: FETCH(TT,A,TXXY) + TDZ TT,[1,,1] + TDZ T,[1,,1] + CAMN T,TT + POPJ P, + XOR TT,ADDR(A,TXXY) ;GET STATE OF AUTO OFFSET BIT AND MARK BIT + IOR T,TT ;AND MOVE TO NEW X,Y + STORE(T,A,TXXY) + TRO MCHG + POPJ P, + +ETMOVT: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,TXXY) + TRZ T,1 + STORE(T,A,TXXY) ;CLEAR AUTO OFFSET BIT + TLZ T,1 ;AND MARK BIT + MOVE TT,MODE + CAIE TT,BTXTM + JRST NBTXT2 + MOVE TT,BTBODY + PUSH P,F + FETCH(F,TT,BORI) + PUSHJ P,ORIENT + POP P,F + ADJUST(ADD,T,) +NBTXT2: MOVEI A,-1+ADDR(A,TXOFF) + PUSHJ P,TOFSET + JSP TT,DOMOVE +;MOVE SUBR + MOVE A,CLOSES + FETCH(TT,A,TXXY) + TDZ TT,[1,,1] + MOVEI A,-1+ADDR(A,TXOFF) + MOVE T,MODE + CAIE T,BTXTM + JRST TOFMOV + MOVE TTT,BTBODY + MOVE T,TT + PUSH P,F + FETCH(F,TTT,BORI) + PUSHJ P,ORIENT + POP P,F + ADJUST(ADD,T,) + MOVE TT,T + JRST TOFMOV + +EMOVEL: TRNE INMOV + JRST PERRET + MOVE A,CURBOD + FETCH(T,A,TXY) ;DEFAULT OFFSET + TRO LMOVE + TRZ TMOVE +;MOVE SUBR + JSP TT,DOMOVE + MOVE A,CURBOD + MOVE T,CURSE + CAMN T,ADDR(A,TXY) + POPJ P, + STORE(T,A,TXY) ;NEW DEF OFFSET + TRO MCHG + JRST UPLOFF ;UPDATE OFFSET FOR ALL INSTANCES WITH FIXLOC ON + +EMOVET: TRNE INMOV + JRST PERRET + MOVE A,CURBOD + FETCH(TT,A,TYP3) ;ANY CHAR OFFSET? + JUMPN A,EMOVT1 + MOVEI TT,-1+ADDR(A,TOXY) + STORE(TT,A,TYP3) ;SETUP DUMMY POINTER (USED AS FLAG) +EMOVT1: FETCH(T,A,TXY) + MOVEI A,-1+ADDR(A,TOXY) + PUSHJ P,TOFSET + JSP TT,DOMOVE +;MOVE SUBR + MOVE A,CURBOD + FETCH(TT,A,TXY) + MOVEI A,-1+ADDR(A,TOXY) + PUSHJ P,TOFMOV + CAMN T,1(A) + POPJ P, + JRST UPLOFF +>;MD + ;MOVE SET +DOSMOV: MOVE A,CLOSES + TRZ MD,TMOVE!TFLG!INMOV + JRST SMOVE1 + +SMOVE: TRNN STBOX ;ARE WE MOVING ALREADY OR DRAWING A BOX + PUSHJ P,GETCLS ;CURRENT SET + JRST PERRET ;NONE +SMOVE1: MOVE T,1(A) ;LOC OF CENTER + JSP TT,DOMOVG +;MOVE SUBR + MOVE A,CLOSES ;CURRENT SET +ROUTE,> ;MAKE HIM ROUTE AGAIN + MOVE T,CURSE ;CURRENT CURSOR POSITION + ADJUST(SUB,T,<1(A)>) ;GET DIFFERENCE + JUMPE T,CPOPJ ;RETURN IF HE DIDN'T MOVE + MOVE TT,CURSE + MOVEM TT,1(A) ;NEW SET LOC. + HLRZ A,(A) ;POINT TO FIRSTSET MEMBERS + JUMPE A,CPOPJ + TRO MCHG ;PIC WILL CHANGE +MMSET1: HRRZ B,1(A) ;POINT + JUMPE B,NOPNTM ;NO POINT HERE + MOVE TT,T + ADJUST(ADD,TT,<1(B)>) ;NEW LOC + MOVEM TT,1(B) ;SAVE +NOPNTM: HLRZ B,1(A) ;BODY + JUMPE B,NOBODM ;NO BODY HERE + MOVE TT,T + ADJUST(ADD,TT,<1(B)>) ;NEW LOC + MOVEM TT,1(B) ;SAVE + PUSH P,A + MOVE A,B + PUSH P,T + PUSHJ P,BODFIX + POP P,T + POP P,A +NOBODM: HRRZ A,(A) ;NEXT MEMBERS + JUMPN A,MMSET1 +MPC,< MOVE A,CLOSES ;FIX FEED THROUGHS + JRST FEDFIX +>;MPC +MD,< MOVE G,CLOSES + HLRZ G,(G) +FIXPNT: HRRZ A,1(G) ;GET A POINT POINTER + JUMPE A,FXNOPT ;NO POINT HERE + MOVE TT,1(A) ;X,Y + PUSHJ P,PMOVY ;MOVE VERTICAL ONES + PUSHJ P,PMOVX ;MOVE HORIZONTAL ONES +FXNOPT: HLRZ A,1(G) ;BODY IN SET + JUMPE A,FXNPNS ;NO BODY + JRST FIXPN1 + +FIXPIN: PUSH P,A + MOVE TT,1(A) + PUSHJ P,PMOVX + PUSHJ P,PMOVY + POP P,A +FIXPN1: FETCH(A,A,BPLNK) + JUMPN A,FIXPIN +FXNPNS: HRRZ G,(G) ;NEXT SET MEMBERS + JUMPN G,FIXPNT ;AND LOOP + POPJ P, +>;MD + ;MICRO MOVEMENT COMMANDS +MD,< +LOCTM: MOVEI T,1 + LSH T,@MODE + TDNN T,[1TXTM!1PNTM!1EDTTM!1BTXTM] + JRST PERRET + TDNN T,[1EDTTM!1BTXTM] + JRST LOCTM1 + PUSHJ P,GETCLS + JRST PERRET + MOVEI T,1 + ANDCAM T,ADDR(A,TXXY) + MOVEI B,-1+ADDR(A,TXOFF) + TRO TMOVE ;MOVE T OFFSET + JRST LOCMTY + +LOCTM1: PUSHJ P,GETCLS + JRST PERRET + CLRBIT(FIXTXT!FIXRHT,TTT,A,PBIT) + FETCH(B,A,PLOC) + JUMPE B,PERRET + TRO TMOVE + JRST LOCMTY + +BLCLM: PUSHJ P,GETCLS + JRST PERRET + FETCH(B,A,BLOC) + JUMPE B,PERRET + CLRBIT(FIXBLO,T,A,BBIT) + MOVEI B,-1+ADDR(A,BLO) + JRST LOCMTY + +ELCLM: MOVE A,CURBOD + FETCH(B,A,TYP3) + TRZ TMOVE + JUMPN B,LOCMTY + MOVEI B,-1+ADDR(A,TOXY) + STORE(B,A,TYP3) + JRST LOCMTY + +LOCLM: MOVEI T,1 ;MICRO-MOVE TEXT + LSH T,@MODE + TDNE T,[1EDTM] + JRST ELCLM + TDNE T,[1BODM] + JRST BLCLM + TDNN T,[1TXTM!1PNTM] + JRST PERRET + PUSHJ P,GETCLS + JRST PERRET + FETCHL(TTT,A,PBIT) + TLNN TTT,CPIN + JRST PERRET + TLZ TTT,FIXCON + STOREL(TTT,A,PBIT) + FETCH(B,A,PLOC) + TRZ TMOVE + ;MICRO MOVE TEXT OFFSET +;B = POINTER TO OFFSET BLOCK (LIKE TEXCOF) +LOCMTY: TRZ INLIN + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/USE CURSOR MOVE COMMANDS TO MOVE OFFSET. +/] + TRO INMOV ;TURN ON MOVING SO BIG LETTERS GO AWAY +LOCM: PUSHJ P,GETCHR + LDB D,[POINT 2,C,28] + ANDI C,177 + MOVSI TTT,-MICLEN +LOCM1: CAME C,MICCHR(TTT) + AOBJN TTT,.-1 + SETZB T,TT + XCT MICTAB(TTT) + ASH T,(D) ;SHIFT BY BITS BEING HELD DOWN + ASH TT,(D) + HRRE TTT,1(B) + ADD TT,TTT + HLRE TTT,1(B) + ADD T,TTT + HRL TT,T + CAMN TT,1(B) + JRST LOCM + MOVEM TT,1(B) ;STO Y + TRO MCHG ;CHANGES PIC + JRST LOCM + +LOCMDN: TRZ INMOV ;DONE, TURN OFF MOVING + POPJ P, ;AND LEAVE + +NOSKEY,< +MICCHR: ")" ;RIGHT SMALL + "(" ;LEFT SMALL + "/" ;UP SMALL + "\" ;DOWN SMALL + "]" ;RIGHT BIG + "[" ;LEFT BIG + "" ;UP BIG + "" ;DOWN BIG + 12 ;NOOP + ALTMOD ;LEAVE + 40 ;LEAVE +MICLEN__.-MICCHR +>;NOSKEY +SKEY,< +MICCHR: "9" ;RS + "8" ;LS + "6" ;US + "7" ;DS + ")" ;RB + "(" ;LB + "&" ;UB + "'" ;DB + 12 ;NOOP + ALTMOD ;LEAVE + 40 ;LEAVE +MICLEN__.-MICCHR +>;SKEY +MICTAB: MOVEI T,1 ;RS + MOVNI T,1 ;LS + MOVEI TT,1 ;US + MOVNI TT,1 ;DS + MOVEI T,20 ;RB + MOVNI T,20 ;LB + MOVEI TT,20 ;UB + MOVNI TT,20 ;DB + JRST LOCM ;NOOP + JRST LOCMDN ;LEAVE + JRST LOCMDN ;LEAVE + JRST MICERR ;UNKNOWN COMMAND + +MICERR: PUSHJ P,PERRET + JRST LOCM +>;MD + ;MOVE ALONG LINES +LINUP: MOVEI TTT,2 + JRST DOMLIN + +LINDWN: MOVEI TTT,3 + JRST DOMLIN + +LINRT: TDZA TTT,TTT +LINLFT: MOVEI TTT,1 +DOMLIN: TRNE INMOV + JRST [ SKIPN A,CLOSES + JRST PERRET + JRST LINMOV] + PUSHJ P,GETCLS + JRST PERRET +LINMOV: +MD,< XCT PERTAB(TTT) + JUMPN H,LINMV4 ;PERFECT MATCH? + XCT LASTAB(TTT) + JUMPE H,PERRET ;ANY SECONDARY CHOICE? + TLNN H,-1 + JRST LINMV4 + MOVS H,H + TLNE H,-1 + JRST PERRET +>;MD +MPC,< + SETZB H,G ;NO CHOICE YET, MAX SLOPE =0 SO FAR + SETZ F, ;ALSO LAST DITCH CHOICE + FETCH(B,A,PNEB) + JUMPE B,PERRET ;LOSE IF NO NEIGHBORS +LINMV1: MOVEI C,2 +LINMV2: XCT (C)[HLRZ D,(B) + HRRZ D,1(B) + HLRZ D,1(B)] + JUMPE D,LINMV3 + MOVE T,1(D) + ADJUST(SUB,T,<1(A)>) + HRRE TT,T ;Y TO TT + HLRE T,T ;X TO T + XCT LASTAB(TTT) ;IS IT A SECONDARY CHOICE?? + XCT SIDTAB(TTT) ;IS IT EVEN A CHOICE? + XCT PERTAB(TTT) ;IS IT A PERFECT LINE? + TRNE TTT,2 ;IF VERT + EXCH T,TT ;INTERCHANGE X AND Y + IDIV T,TT ;X/Y (OR Y/X FOR VERT) + MOVM T,T + CAMG T,G ;BIGGER? + JRST LINMV3 ;NO + MOVE H,D + MOVE G,T +LINMV3: SOJGE C,LINMV2 + HRRZ B,(B) + JUMPN B,LINMV1 + JUMPN H,LINMV4 ;ERROR IF NO GOOD ONE FOUND + JUMPLE F,PERRET ;IF NONE, OR TOO MANY, LOSE + MOVE H,F + JRST LINMV4 + +LINMV6: JUMPE F,.+2 + HRRO D,D ;FLAG TOO MANY + MOVE F,D + JRST LINMV3 + +LINMV5: MOVE H,D +>;MPC +LINMV4: FETCHL(T,H,PBIT) + TRNN MD,TMOVE ;IF WERE MOVING OFFSETS + TLNE T,MPC,ISPIN ;OR THIS PIN + TRZN INMOV ;STOP MOVING + CAIA + TRO NEEDCL + MOVE T,H + JRST SCLOSP + +MD,< +PERTAB: FETCH(H,A,PNR) + FETCH(H,A,PNL) + FETCH(H,A,PNU) + FETCH(H,A,PND) + +LASTAB: MOVE H,ADDR(A,PND) ;UD + MOVE H,ADDR(A,PND) ;UD + MOVE H,ADDR(A,PNL) ;LR + MOVE H,ADDR(A,PNL) ;LR +>;MD + +MPC,< +LASTAB: JUMPE T,LINMV6 ;R + JUMPE T,LINMV6 ;L + JUMPE TT,LINMV6 ;U + JUMPE TT,LINMV6 ;D + +SIDTAB: JUMPLE T,LINMV3 ;R NEG X IS WRONG + JUMPGE T,LINMV3 ;L POS X IS WRONG + JUMPLE TT,LINMV3 ;U NEG Y IS WRONG + JUMPGE TT,LINMV3 ;D POS Y IS WRONG + +PERTAB: JUMPE TT,LINMV5 ;R + JUMPE TT,LINMV5 ;L + JUMPE T,LINMV5 ;U + JUMPE T,LINMV5 ;D +>;MPC diff --git a/src/draw/out.318 b/src/draw/out.318 new file mode 100644 index 00000000..b9729d3d --- /dev/null +++ b/src/draw/out.318 @@ -0,0 +1,1612 @@ +;OUT.FAI.70, 15-NOV-75 18:07:14, EDIT BY HELLIWELL +VERSION(OUT,8) +SUBTTL 'DRW' 'PC' + +EWRITE: MOVE T,AUTOWM + MOVEM T,AUTOWN ;RESET COUNT SO WE GET HERE AGAIN AFTER ERROR + MOVEI T,1 + LSH T,@MODE + TDNE T,[MD,ANYALT] + JRST [ TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ/EWRITE WHILE IN WRONG MODE. +/] + SKIPE AUTOWM + OUTSTR [ASCIZ/AUTO EWRITE COUNTER RESET. +/] + POPJ P,] + HLLZ TT,LSTEXT + CAMN TT,[EXTFIL,,] + JRST DOEWRT + TLNE M,DSKACT!MACACT + JRST DOEWR1 + OUTCHR ["'"] + MOVE TTT,[POINT 7,NAMBUF] + PUSHJ P,SIXOUT + SETZ T, + IDPB T,TTT + OUTSTR NAMBUF + OUTSTR [ASCIZ /' WAS THE OLD EXTENSION OF THIS DRAWING FILE. +IT IS NOT THE STANDARD EXTENSION FOR A DRAWING FILE. +TYPE "Y" TO PROCEED USING THE ABOVE EXTENSION. +TYPE TO ABORT OUTPUT. +TYPE ANYTHING ELSE TO USE STANDARD EXTENSION. +/] +DOEWR1: PUSHJ P,YORN + POPJ P, + JRST DOEWRT + SKIPA T,LSTEXT +DOEWRT: MOVSI T,EXTFIL + PUSHJ P,SETLST ;ANY REMEMBERED NAME? + JRST DWRITE + MOVE T,LSTPPN ;EWRITE GOES BACK TO ORIGINAL PPN + MOVEM T,FILPPN + SETZM SETFLG + JRST WRITEE ;WILL CHECK FOR EXT DIFF, AND DO OVERWRITE CHECK + +DWRITE: SETZM SETFLG +DWRITS: MOVEI T,1 + LSH T,@MODE + TDNE T,[MD,ANYALT] + JRST PERRET +WRTAGN: MOVSI T,EXTFIL + PUSHJ P,SETNAM ;READ FILENAME AND STORE IN FILNAM + POPJ P, ;NONE, LET HIM OUT. + HLLZ T,FILEXT + XOR T,LSTEXT + SKIPE LSTNAM + TLNN T,-1 + JRST WRITEE + OUTSTR [ASCIZ /WRITING DRAWING FILE WITH EXTENSION '/] + MOVE TTT,[POINT 7,NAMBUF] + HLLZ TT,FILEXT + PUSHJ P,SIXOUT + SETZ T, + IDPB T,TTT + OUTSTR NAMBUF + OUTSTR [ASCIZ /'. +ORIGINAL EXTENSION OF THIS DRAWING FILE WAS '/] + MOVE TTT,[POINT 7,NAMBUF] + HLLZ TT,LSTEXT + PUSHJ P,SIXOUT + SETZ T, + IDPB T,TTT + OUTSTR NAMBUF + OUTSTR [ASCIZ /'. +TYPE "Y" TO PROCEED. +TYPE TO ABORT THIS OUTPUT. +TYPE ANYTHING ELSE TO GET FILENAME PROMPT AGAIN. +/] + PUSHJ P,YORN + POPJ P, + JRST WRTAGN +WRITEE: MOVE T,FILEXT + XOR T,LSTEXT + TLNE T,-1 + SETZM THEREXISTS ;DO ALREADY EXISTS CHECK IF CHANGING EXT + ENTPPN + MOVEM P,PERRSAV ;USE THIS TO GET OUT FROM LOWER LEVELS. + INIT DAT,10 + 'DSK ' + XWD IOHD,0 + JRST [ OUTSTR [ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + MOVEI T,IOBUF ;USE THIS BUFFER SO WE DON'T WASTE SPACE + EXCH T,.JBFF + OUTBUF DAT,2 + MOVEM T,.JBFF ;PUT .JBFF BACK +MD,< MOVE B,FILNAM + HLLZ C,FILEXT + SKIPN D,FILPPN + DSKPPN D, + PUSHJ P,LNAMCK ;CHECK NAME + JRST LIBUSE +>;MD + PUSHJ P,EXIST ;DOES IT EXIST? + POPJ P, ;HE DOESN'T WANT TO OVERWRITE + OUTSTR[ASCIZ/WRITING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< + SKIPN THEREXISTS + JRST NOBAK + PJOB T, ;GET JOB # + IDIVI T,=100 ;MAKE TMP FILE NAME + IDIVI TT,=10 + LSH T,6 + ADD T,TT + LSH T,6 + ADD T,TTT + ADD T,['DRW000'] + MOVSM T,TMPNAM + MOVSI T,'TMP' + MOVEM T,TMPEXT + MOVSI T,100000 ;MIN PROT. + MOVEM T,TMPEXT+1 + MOVE T,FILPPN + MOVEM T,TMPPPN + ENTER DAT,TMPNAM + SKIPA + JRST WRITEG ;ALL SET + CLOSE DAT, ;ENTER FAILED, TRY WITHOUT BAK + OUTSTR [ASCIZ /, /] + MOVEI A,TMPNAM + JSR FPRINT + OUTSTR [ASCIZ / ENTER FAILED. +GO ON WITHOUT BACKUP FILE?/] + SETZM THEREXISTS + CLRBFI + INCHRW C + CAIN C,15 + INCHRW C + OUTSTR [ASCIZ / +/] + CAIE C,"Y" + CAIN C,"y" + JRST NOBAK + RELEASE DAT, + POPJ P, +NOBAK: +>;DEC + MOVE T,FILPPN + ENTER DAT,FILNAM ;MAKE A FILE + JRST [ RELEASE DAT, + OUTSTR [ASCIZ/, ENTER FAILED. +/] + POPJ P,] +WRITEG: OUTSTR[ASCIZ/ +/] + MOVEM T,FILPPN + SKIPE SETFLG ;IF WRITING SET ONLY, + JRST NLSTUP ;DON'T UPDATE LAST NAME + MOVEM T,LSTPPN + HLLZ T,FILEXT + MOVEM T,LSTEXT + MOVE T,FILNAM + MOVEM T,LSTNAM + PUSHJ P,FILEUP ;UPDATE DISPLAY +MD,< DATE T, + HRLZM T,DRWDAT + MSTIME T, + IDIVI T,=1000*=60 ;TO MINUTES + HRRM T,DRWDAT + MOVE T,FILNAM + MOVEM T,DRWNAM + MOVE T,FILEXT + HLLZM T,DRWEXT + MOVE T,FILPPN + MOVEM T,DRWPPN +>;MD +NLSTUP: +MPC,< SETZM MXPADN ;CLEAR MAX PAD # SEEN + TLNE SID,FRONT ;ALREADY ON FRONT SIDE? + JRST DOWRT ;YES, GO ON + SWITCH ;GET THERE + PUSHJ P,DOWRT ;WRITE FILE + SWITCH ;BACK WHERE WE WERE + POPJ P, + +DOWRT: +>;MPC + MOVEI TTT,IOVER ;IOVERSION # + PUSHJ P,WORDOUT + PUSHJ P,WRTNOM +MD,< PUSHJ P,WRTBRD + SKIPN LIBLST ;EASY IF NO LIBRARIES + JRST PUTLB0 +;Mark and output all types actually used in drawing + PUSHJ P,CDFMRK ;CLEAR DEFINITION MARK BITS + SKIPN A,DBODPN ;NOW LOOK AT BODIES + JRST PUTLB0 + MOVSI TT,DTMP1 ;THIS IS TEMP MARK BIT +UTYP1: SKIPN SETFLG ;WRITING SET ONLY? + JRST UTYP4 ;NO + FETCHL(TTT,A,BBIT) + TLNN TTT,BTMP1 ;IS IT IN THE SET? + JRST UTYP5 ;NO +UTYP4: FETCH(T,A,BTYP) + IORM TT,ADDR(T,TBIT) ;TURN ON MARK BIT +UTYP5: HRRZ A,(A) + JUMPN A,UTYP1 + MOVE A,BODPNT +UTYP2: FETCH(T,A,TLIB) + JUMPE T,UTYP3 ;ONLY LIBRARY BODIES + FETCH(T,A,TYP1) + JUMPE T,UTYP3 ;ONLY ONES ALREADY IN + FETCH(T,A,TBIT) + TRNN T,DTMP1 ;BODY USED? + JRST UTYP3 ;NO + FETCH(TT,A,TNAM) + PUSHJ P,WSTR +UTYP3: FETCH(A,A,TNXT) + JUMPN A,UTYP2 +PUTLB0: PUSHJ P,WRTZERO ;END OF USED TYPE NAMES + ;Output all libraries + SKIPN A,LIBLST ;ANY LIBRARIES? + JRST ENDLIB +PUTLIB: HLRZ T,(A) + HRRZ TT,(T) + TRNN TT,TOPLVL ;ONLY WRITE OUT TOP LEVEL POINTERS + JRST PUTLB1 + MOVE TTT,1(A) + PUSHJ P,WORDOUT + MOVE TTT,(T) + PUSHJ P,WORDOUT + MOVE TTT,1(T) + PUSHJ P,WORDOUT +PUTLB1: HRRZ A,(A) + JUMPN A,PUTLIB +ENDLIB: PUSHJ P,WRTZERO ;MARK END OF LIBRARIES + ;TYPES + HRRZ T,BODPNT ;POINTER TO TYPES + JUMPE T,TYPDON +WRTTYP: FETCH(TT,T,TLIB) + JUMPN TT,SKPTYP ;SKIP THIS TYPE IF FROM LIBRARY + FETCH(TT,T,TNAM) + PUSHJ P,WSTR + FETCH(TT,T,TPAK) + JUMPE TT,[PUSHJ P,WRTZERO + JRST WRTTY1] + HRRZ TT,PACKNM(TT) + PUSHJ P,WASCIZ +WRTTY1: FETCHL(TTT,T,TBIT) + TDZ TTT,[DTMP1!FOUNDL,,-1] ;DON'T WRITE TEMP BITS INTO FILE + PUSHJ P,WORDOUT ;RIGHT HALF IS UNUSED AS YET + FETCH(TTT,T,TXY) ;DEF LOC OFFSET + PUSHJ P,WORDOUT + FETCH(TTT,T,TYP3) ;ANY CHAR OFFSET? + SKIPN TTT + SKIPA TTT,[400000] ;NO + FETCH(TTT,T,TOXY) + PUSHJ P,WORDOUT + FETCH(TT,T,TPIN) ;PINS? + JUMPE TT,PNDON ;NONE MAYBE. +TYPPIN: FETCH(TTT,TT,TPXY) + PUSHJ P,WORDOUT + MOVE TTT,ADDR(TT,TPID) ;GET BITS,,PIN ID + PUSHJ P,WORDOUT + MOVE TTT,ADDR(TT,TPNAM) ;NOW PIN POS,,PIN NAME + PUSHJ P,WORDOUT + FETCH(TT,TT,TPNX) + JUMPN TT,TYPPIN +PNDON: PUSHJ P,WRTMARK ;MARK END OF PINS + FETCH(TT,T,TLIN) + JUMPE TT,LINDON ;NO LINES MAYBE +TYPLIN: FETCH(TTT,TT,QXY) + PUSHJ P,WORDOUT ;WRITE IT + FETCH(TT,TT,QNXT) + JUMPN TT,TYPLIN ;ENDS WITH 0 +LINDON: PUSHJ P,WRTMARK ;MARK END OF LINES + FETCH(A,T,TPROP) + PUSHJ P,WRTPRP +SKPTYP: FETCH(T,T,TNXT) + JUMPN T,WRTTYP +TYPDON: PUSHJ P,WRTZERO ;MARK END OF TYPES +>;MD + PUSHJ P,MACOUT ;OUTPUT SPECIAL MACROES TO FILE + ; BODIES, CALL POINT SUBR (D,PC) + SKIPN T,DBODPN ;POINTER TO BODIES IN DRAWING? + JRST BODDON ;NONE +WRTBOD: SKIPN SETFLG ;WRITING SET ONLY? + JRST WRTBD1 ;NO + FETCHL(TTT,T,BBIT) + TLNN TTT,BTMP1 ;IN OUR SET? + JRST WRTBD2 +WRTBD1: FETCH(TTT,T,BXY) ;LOC OF BODY + PUSHJ P,WORDOUT +MPC,< FETCH(TT,T,BNAM) + PUSHJ P,TWSTR +>;MPC + FETCH(TTT,T,BORI) + ANDI TTT,7 +MD,< + FETCH(TT,T,BLOC) + JUMPE TT,NLCYET + TRO TTT,400000 ;MARK AS HAVING DIP NUMBER + PUSHJ P,WORDOUT + FETCH(TTT,T,BRSLOC) + PUSHJ P,WORDOUT + FETCH(TTT,T,BLXY) + PUSHJ P,WORDOUT + FETCH(TTT,T,BLO) +NLCYET: PUSHJ P,WORDOUT + FETCHL(TTT,T,BBIT) + FETCH(TT,T,BID) + HRR TTT,TT + TLZ TTT,FOUNDB!BTMP1 + PUSHJ P,WORDOUT ;WRITE BITS AND BID + FETCH(TT,T,BTYP) + FETCH(TT,TT,TNAM) + PUSHJ P,WSTR ;WRITE IT (PHEW!) + FETCH(A,T,BTXT) + PUSHJ P,WRTPRP +>;MD +MPC,< FETCH(TT,T,BLN) + HRL TTT,TT ;NUMBER LETTER + PUSHJ P,WORDOUT + FETCHL(TTT,T,BBIT) + FETCH(TT,T,BID) + HRR TTT,TT ;BITS,,ID + PUSHJ P,WORDOUT ;OUTPUT BODY ID + FETCH(A,T,BTYP) + FETCH(TTT,A,TNAM) + CAIE TTT,2 ;2 PIN DIP? + JRST ISN2PN + FETCH(TT,A,TPIN) + FETCH(TT,TT,TPY) ;GET PIN SEPERATION (/2) + HRL TTT,TT ;DIP-SPACING,,DIP# PINS +ISN2PN: PUSHJ P,WORDOUT ;WRITE IT +>;MPC +WRTBD2: HRRZ T,(T) ;NEXT BODY + JUMPN T,WRTBOD ;ENDS WITH 0 +BODDON: PUSHJ P,WRPNTS +MPC,< + SWITCH + PUSHJ P,WRPNTS + SWITCH +>;MPC + JRST PNTDON + ; POINT SUBR (D,PC) +WRPNTS: PUSHJ P,WRTMARK ;MARK END OF BODIES + SKIPN T,PONPNT + POPJ P, +WRTPNT: MOVEI TTT,(T) ;POINTER TO POINT IN TTT + PUSHJ P,SCHKID ;CHECK IF POINT SHOULD GO OUT + JRST WRTPN1 ;NOT IN OUR SET + FETCH(TTT,T,PXY) ;LOC OF POINT + PUSHJ P,WORDOUT + MOVEI TTT,(T) + PUSHJ P,PUTID ;PUT OUT POINT ID +MD,< + FETCH(TTT,T,PND) + PUSHJ P,SPUTID + FETCH(TTT,T,PNU) + PUSHJ P,SPUTID + FETCH(TTT,T,PNL) + PUSHJ P,SPUTID + FETCH(TTT,T,PNR) + PUSHJ P,SPUTID +>;MD +MPC,< FETCH(A,T,PNEB) ;POINTER TO NEIGHBOR BLOCK + JUMPE A,WRTNE4 ;NO NEIGHBORS +WRTNE1: MOVEI B,2 +WRTNE2: XCT (B)[HLRZ TTT,(A) + HRRZ TTT,1(A) + HLRZ TTT,1(A)] + JUMPE TTT,WRTNE3 + PUSHJ P,SPUTID +WRTNE3: SOJGE B,WRTNE2 + HRRZ A,(A) + JUMPN A,WRTNE1 +WRTNE4: PUSHJ P,WRTZERO +>;MPC + MOVE TTT,ADDR(T,PBIT) ;BITS,,PAD/PIN # +MPC,< AND TTT,[XWD FRONT!FEEDTH!PLANES!ISPIN!CPIN,-1] > +MD,< AND TTT,[XWD FIXTXT!FIXCON!FIXRHT!ISPIN!CPIN!CPNBTS,-1] > + PUSHJ P,WORDOUT ;WRITE THEM +MPC,< HRRZ TTT,TTT + CAMLE TTT,MXPADN + MOVEM TTT,MXPADN +>;MPC + FETCH(TT,T,PTXT) + JUMPE TT,[PUSHJ P,WRTZERO + JRST NOTEXT] + FETCH(TTT,TT,TCSTR) + FETCH(TTT,TTT,TSSIZ) ;SIZE OF TEXT + PUSHJ P,WORDOUT + FETCH(TTT,TT,TCXY) + PUSHJ P,WORDOUT ;CONSTANT OFFSET + FETCH(TT,TT,TCSTR) ;TEXT STRING + PUSHJ P,WSTR +NOTEXT: +MD,< FETCH(TT,T,PBIT) + TRNN TT,CPIN ;CONNECTOR PIN? + JRST NOCPIN + FETCH(TT,T,PLOC) ;CPIN BLOCK POINTER + MOVE TTT,(TT) ;NLNLLN + PUSHJ P,WORDOUT + MOVE TTT,1(TT) ;X,Y CONSTANT OFFSET + PUSHJ P,WORDOUT +NOCPIN: +>;MD +MPC,< FETCH(TTT,T,PFEED) + FETCH(B,T,PBIT) + TRNN B,FEEDTH + MOVEI TTT,0 + PUSHJ P,SPUTID > +WRTPN1: FETCH(T,T,PNXT) ;NEXT POINT + JUMPN T,WRTPNT ;ENDS WITH 0 + POPJ P, + +SPUTID: PUSHJ P,SCHKID ;CHECK IF IN OUR SET (OR WRITING WHOLE DRAWING) + JRST WRTZERO +PUTID: JUMPE TTT,WORDOUT + PUSHJ P,GETID + JRST WORDOUT + +;GETID +;CALL WITH: +; TTT POINTER TO POINT +;RETURNS WITH +; TTT POINT ID +GETID: PUSH P,TT + FETCH(TT,TTT,PBIT) + TRNE TT,ISPIN + JRST PINID ;PINS ARE HARDER + POP P,TT + FETCH(TTT,TTT,PID) + POPJ P, + +PINID: FETCH(TT,TTT,BBODY) ;BODY OF PIN + FETCH(TT,TT,BID) + FETCH(TTT,TTT,BPLOC) + FETCH(TTT,TTT,TPID) ;PIN ID FROM TYPE + HRL TTT,TT ;BID,,TPID + MOVSS TTT ;TPID,,BID + POP P,TT + POPJ P, + +;SCHKID - CHECK ID +;TTT = POINT +;SKIPS +;RETURNS TTT = FLAGS,,POINT + +SCHKID: JUMPE TTT,CPOPJ1 + SKIPN SETFLG + JRST CPOPJ1 ;WRITING WHOLE DRAWING + PUSH P,T ;GET A REGISTER + FETCH(T,TTT,PBIT) + HRL TTT,T ;PUT FLAGS IN LH + TLNE TTT,ISPIN ;PIN OR POINT + JRST SCHKI1 + POP P,T + TLNE TTT,1 + AOS (P) ;IN OUR SET, SKIP + POPJ P, + +SCHKI1: FETCH(T,TTT,BBODY) + FETCH(T,T,BBIT) + HRL TTT,T + POP P,T + TLNE TTT,BTMP1 ;IS IT IN OUR SET? + AOS (P) ;YES, SKIP + POPJ P, + ; SETS, END STUFF (D,PC) +PNTDON: PUSHJ P,WRTMARK ;MARK END OF POINTS + SKIPN A,SETPNT ;POINTER TO SETS + JRST NOSETS ;NONE +WRTSET: SKIPE SETFLG ;WRITING ALL SETS, OR + CAMN A,SETFLG ;OR IS THIS THE SET WE WANT? + CAIA ;YES + JRST WASNUL + HLRZ B,(A) ;POINTER TO SET +NULCHK: SKIPE 1(B) ;ANYTHING HERE? + JRST ISNNUL + HRRZ B,(B) + JUMPN B,NULCHK + JRST WASNUL + +ISNNUL: MOVE TTT,1(A) ;CENTER OF SET + PUSHJ P,WORDOUT +SETBOD: HLRZ TTT,1(B) ;POINTER TO BODY + JUMPE TTT,.+2 + PUSHJ P,BODID ;WRITE BODY ID + HRRZ B,(B) ;NEXT + JUMPN B,SETBOD + PUSHJ P,WRTZERO ;MARK END OF BODIES + HLRZ B,(A) ;POINTER TO SET +STPNT: HRRZ TTT,1(B) ;POINTER TO POINT + JUMPE TTT,NOSPNT ;NONE? + PUSHJ P,PUTID +NOSPNT: HRRZ B,(B) ;NEXT + JUMPN B,STPNT + PUSHJ P,WRTZERO ;MARK END OF POINTS +WASNUL: HRRZ A,(A) ;NEXT SET + JUMPN A,WRTSET ;LOOP + +NOSETS: +MD,< + PUSHJ P,WRTMARK ;END OF SETS +FOR I IN(TAUTHOR,TIT1,TIT2) +< MOVE TT,I + PUSHJ P,TWSTR +> + MOVE TTT,CRDLOC + PUSHJ P,WORDOUT ;WRITE PERM CARD LOC! +FOR I IN(TREV,TMODULE,TVARIABLE,TPREFIX,TPROJ,TPAGE,TOF,TDCODE,SITE1,SITE2) +< MOVE TT,I + PUSHJ P,TWSTR +> +DEC,< + MOVE TT,TNXTHI + PUSHJ P,TWSTR +FOR @$ I IN(DRN,CHK,ENG) +< SKIPN TTT,I$NAM + JRST NOW$I + PUSHJ P,WORDOUT + MOVE TTT,I$NAM+1 + PUSHJ P,WORDOUT + MOVE TTT,I$NAM+3 +NOW$I: PUSHJ P,WORDOUT +> +>;DEC + +NODEC,< MOVEI TT,4 + PUSHJ P,WRTZERO ;0 NEXTHI, AND 3 SIGS + SOJG TT,.-1 +>;NODEC +>;MD +MPC,< MOVEI TTT,400001 ;END OF SETS (NEW TYPE OF END MARKER) + PUSHJ P,WORDOUT + MOVE TTT,CRDLOC ;LOCATION OF CARD + PUSHJ P,WORDOUT + MOVE TTT,CRDNAM + PUSHJ P,WORDOUT + HLLZ TTT,CRDEXT + PUSHJ P,WORDOUT + MOVE TTT,CRDPPN + PUSHJ P,WORDOUT + PUSHJ P,MXPADP ;PRINT MAX PAD TYPE +>;MPC + MOVEI T,20 + PUSHJ P,WRTZERO + SOJG T,.-1 +DEC,< SKIPN THEREXISTS ;WRITING TMP FILE? + JRST BAKXIT + CLOSE DAT, ;YES, DO SOME RENAMING + MOVE A,FILNAM + MOVSI B,'BAK' + SETZ C, + MOVE D,FILPPN + LOOKUP DAT,A + JRST BAKDON ;NO BAK FILE TO DELETE + PUSHJ P,CHKPPN + JRST BAKDON + SETZ A, + RENAME DAT,A ;DELETE OLD BAK FILE + OUTSTR [ASCIZ /CAN'T DELETE BAK FILE! +/] +BAKDON: CLOSE DAT, + MOVE A,FILNAM + HLLZ B,FILEXT + SETZ C, + MOVE D,FILPPN + LOOKUP DAT,A + JRST BAKOK ;NO DRW FILE TO RENAME TO BAK + PUSHJ P,CHKPPN + JRST BAKOK + AND C,[77000,,0] ;UNPROTECT THE BAK FILE + MOVSI B,'BAK' + MOVE D,FILPPN + RENAME DAT,A +MD,< OUTSTR [ASCIZ /CAN'T RENAME DRW TO BAK! +/] +>;MD +MPC,< OUTSTR [ASCIZ /CAN'T RENAME PC TO BAK! +/] +>;MPC +BAKOK: CLOSE DAT, + MOVE A,TMPNAM + HLLZ B,TMPEXT + SETZ C, + MOVE D,FILPPN + LOOKUP DAT,A + JRST [OUTSTR [ASCIZ /CAN'T FIND THE TMP FILE! +/] + JRST .+1] + RENAME DAT,FILNAM + OUTSTR [ASCIZ /CAN'T RENAME TMP TO DRW! +/] +BAKXIT: +>;DEC + RELEASE DAT, + POPJ P, + +DEC,< +CHKPPN: MOVE TTT,[3,,T] + MOVEI T,DAT + PATH TTT, + JRST CPOPJ1 ;IF NO PATHS, MUST HAVE RIGHT FILE + CAMN TTT,FILPPN + AOS (P) + POPJ P, +>;DEC + +MD,< +WRTBRD: SKIPGE TT,WWTYP ;HERE TO WRITE OUT BOARD TYPE + JRST WRTZERO ;NO BOARD SPECIFIED, WRITE A ZERO + HRRZ TT,WNAMES(TT) + JRST WASCIZ +>;MD + +WRTNOM: SKIPGE TT,NOMTYP + JRST WRTZERO + HRRZ TT,LNAMES(TT) +WASCIZ: MOVE TTT,(TT) ;HERE WRITE OUT ASCIZ STRING + PUSHJ P,WORDOUT + TRNN TTT,376 + POPJ P, + AOJA TT,WASCIZ + +WSTR1: TRNN TTT,377 + JRST FUCKUP ;CALL FUCKUP, AND DON'T RETURN HERE! +WSTR: MOVE TTT,1(TT) + PUSHJ P,WORDOUT + HRRZ TT,(TT) + JUMPN TT,WSTR1 + TRNE TTT,377 + PUSHJ P,WRTZERO + POPJ P, + +TWSTR: JUMPN TT,WSTR ;WRITE STRING +WRTZERO:TDZA TTT,TTT +WRTMARK:MOVEI TTT,400000 +WORDOUT:SOSG IOHD+2 + OUT DAT, + CAIA + JRST OUTERR + IDPB TTT,IOHD+1 + POPJ P, + +BODID: FETCH(TTT,TTT,BID) + JRST WORDOUT + +OUTERR: OUTSTR [ASCIZ/OUTPUT ERROR. +SHALL I CLOSE THE FILE (Y OR N)?/] + INCHRW T + CAIE T,"Y" + CAIN T,"y" + RELEASE DAT, + RELEASE DAT,3 + MOVE P,PERRSAV ;GET BACK GOOD POINTER +NODEC,< HALT CPOPJ > +DEC,< JRST TODDT > + + +;WRTPRP - WRITE BODY OR BODY DEF PROPERTIES/TEXT +;CALL WITH BODY OR BODY DEF PROPERTY/TEXT LIST IN A + +WPROP1: FETCH(B,A,TXBIT) + TRNE B,TXBIND + JRST WPROP2 + FETCH(TT,A,TXVAL) + SKIPN 1(TT) ;BUG TRAP, DON'T WRITE NULL STRINGS + JRST WPROP2 + PUSHJ P,WSTR + FETCH(TT,A,TXNAM) + PUSHJ P,TWSTR + FETCH(TTT,A,TXVAL) + HLRZ TTT,(TTT) + PUSHJ P,WORDOUT + FETCH(TTT,A,TXXY) + PUSHJ P,WORDOUT + FETCH(TTT,A,TXOFF) + PUSHJ P,WORDOUT +WPROP2: HRRZ A,(A) +WRTPRP: JUMPN A,WPROP1 + JRST WRTZERO + SUBTTL 'WD' 'WPC' +XLBITS__3 ;3 BITS OF SIGNIFICANCE IN X +YLBITS__2 ;2 IN Y + ;TO WIRE LISTER TO LOCATE BODY + +EWLIST: MOVSI T,EXTWIR + PUSHJ P,SETLST ;WILL SKIP IF REMEMBERED NAME +WIRE: SETZM FILNAM + MOVEM P,PERRSAV + SKIPE FILNAM + JRST GOTWNM + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/WIRE LIST /] + MOVSI T,EXTWIR + PUSHJ P,SETNAM ;SET WIRE LIST FILENAME + POPJ P, ;LET HIM OUT +GOTWNM: ENTPPN + INIT DAT,10 + 'DSK ' + XWD IOHD,0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + MOVEI T,IOBUF + EXCH T,.JBFF + OUTBUF DAT,2 + MOVEM T,.JBFF + PUSHJ P,EXIST ;DOES IT EXIST? + POPJ P, ;DOESN'T WANT TO OVERWRITE IT + OUTSTR[ASCIZ/WRITING /] + MOVEI A,FILNAM + JSR FPRINT + ENTER DAT,FILNAM + JRST [ RELEASE DAT, + OUTSTR[ASCIZ/, ENTER FAILED. +/] + POPJ P,] + OUTSTR[ASCIZ/ +/] +MD,< MOVEI TTT,WDVER > +MPC,< MOVEI TTT,WPCVER> + PUSHJ P,WORDOUT ;WRITE WIRE LIST FILE VERSION # + HLLZ TTT,CRDLOC + PUSHJ P,WORDOUT +MD,< +DEC,< PUSHJ P,POLCHK ;CALCULATE AND PRINT POLARITY ERRORS + HRRZ TTT,FNDNUM ;NUMBER OF ERRORS STORED HERE + PUSHJ P,WORDOUT ;PUT INTO FILE (LH 0) +>;DEC +NODEC,< PUSHJ P,WRTZERO > ;MAKE FILE FORMATS THE SAME + MOVE TTT,DRWDAT + PUSHJ P,WORDOUT + SKIPN TTT,DRWNAM + MOVE TTT,FILNAM + PUSHJ P,WORDOUT + MOVE TTT,DRWEXT + PUSHJ P,WORDOUT + MOVE TTT,DRWPPN + PUSHJ P,WORDOUT +FOR I IN(TREV,TMODULE,TVARIABLE,TPREFIX,TAUTHOR,TIT1,TIT2,TPROJ,TPAGE,TOF) +< MOVE TT,I + PUSHJ P,TWSTR +> +DEC,< MOVE TT,TNXTHI + PUSHJ P,TWSTR +>;DEC +NODEC,< PUSHJ P,WRTZERO > + PUSHJ P,WRTNOM + PUSHJ P,WRTBRD ;WRITE THE BOARD TYPE + PUSHJ P,ITSET ;CALC SIZE OF DRAWING +NODEC,< MOVE T,MAXX + SUB T,MINX + LSH T,-XLBITS ;MAKE 8 SECTIONS EACH WAY + ADDI T,1 + MOVEM T,MAXX + MOVE T,MINY + SUB T,MAXY + ASH T,-YLBITS + SUBI T,1 + MOVEM T,MINY +>;NODEC +DEC,< + MOVN T,WTAB+DINDEX ;WIDTH OF D-SIZE DWG + ASH T,-XLBITS-2 ;DIVIDE BY 4, MAKE XLBITS ^^2 SECTIONS + SUBI T,1 + EXCH T,MAXX + ADD T,MINX + MOVE TT,WTAB+DINDEX + ASH TT,-2 + ADD T,TT + ASH T,-1 + ADDI T,1 + MOVEM T,MINX ;DEC COORD 0,0 IN LOWER RT + MOVE T,HTAB+DINDEX + ASH T,-YLBITS-2 + ADDI T,1 + EXCH T,MINY + ADD T,MAXY + MOVE TT,HTAB+DINDEX + ASH TT,-2 + SUB T,TT + ASH T,-1 + ADDI T,1 + MOVEM T,MAXY +>;DEC +>;MD +MPC,< PUSHJ P,WRTNOM > + ;WRITE BODIES + SKIPN A,DBODPN + JRST NOBODS +WBODLP: +MPC,< + FETCH(TTT,A,BTYP) + FETCHL(TTT,TTT,TNAM) + FETCH(TT,A,BID) + HRR TTT,TT + PUSHJ P,WORDOUT ;# OF PINS,,BID + FETCHL(TTT,A,BBIT) + FETCH(TT,A,BLN) + HRR TTT,TT + PUSHJ P,WORDOUT ;BODY BITS,,LOC + FETCH(TT,A,BNAM) + PUSHJ P,TWSTR +>;MPC +MD,< + FETCH(T,A,BTYP) + FETCH(T,T,TNAM) + FETCH(TT,T,TSASC) + CAMN TT,[ASCIZ/GND/] ;GROUND BODIES ARE IGNORED + JRST FLUBDY + HRRZS A ;THIS IS FIND ON BODY + PUSHJ P,FNDDIP ;FIND DIP TYPE + JRST NOFLUB ;NONE + FETCH(T,T,TXVAL) + FETCH(T,T,TSASC) ;FIRST WORD OF DIP NAME + CAME T,[NULNAM] ;EITHER KIND OF IGNORED BODY? + CAMN T,[CABNAM] ;THIS TOO + JRST FLUBDY +NOFLUB: PUSHJ P,APPXY ;CALC APPROX X AND Y + FETCH(TT,A,BID) + HRR TTT,TT + PUSHJ P,WORDOUT ;APPROX LOC AND BID + FETCH(TTT,A,BLOC) + JUMPE TTT,WDNBLC ;ANY LOCN SET? + FETCH(TTT,A,BRSLOC) +WDNBLC: PUSHJ P,WORDOUT + FETCHL(TTT,A,BBIT) + TRZ TTT,-1 + PUSHJ P,WORDOUT + FETCH(TT,A,BTYP) + FETCH(TT,TT,TNAM) + PUSHJ P,WSTR ;NAME OF TYPE + FETPAK(TT,A) + JUMPE TT,[PUSHJ P,WRTZERO + JRST WLNLPK] + HRRZ TT,PACKNM(TT) + PUSHJ P,WASCIZ ;OUR IDEA OF PACKAGE NAME USED +WLNLPK: FETCH(B,A,BTXT) ;ANY LOCAL PROPERTIES? + JUMPN B,WLPRP1 + FETCH(B,A,BTYP) ;MAYBE ON TYPE THEN + FETCH(B,B,TPROP) + JUMPE B,NWLPRP +WLPRP1: FETCH(C,B,TXBIT) ;WRITE ALL PROPS + TRNN C,TXBIND ;INDIRECT TO TYPE? + SKIPA C,B + FETCH(C,B,TXIND) + FETCH(TT,C,TXNAM) + JUMPE TT,WLPRP2 ;NO PROP NAME, JUST TEXT + PUSHJ P,WSTR + FETCH(TT,C,TXVAL) + PUSHJ P,WSTR +WLPRP2: FETCH(B,B,TXNXT) + JUMPN B,WLPRP1 +NWLPRP: PUSHJ P,WRTZERO +FLUBDY: +>;MD + FETCH(A,A,BNXT) + JUMPN A,WBODLP +NOBODS: PUSHJ P,WRTZERO + SETZM WDOLST ;CLEAR DO LIST + MOVSI C,3 ;DONE BITS + SKIPE A,PONPNT + PUSHJ P,CLRBTS ;CLEAR THE DONE BIT +MPC,< + SKIPE A,PONPN2 + PUSHJ P,CLRBTS + SKIPE A,PONPN2 + PUSHJ P,DOWIRE +>;MPC + SKIPE A,PONPNT + PUSHJ P,DOWIRE + PUSHJ P,WRTZERO ;FLAG END WITH NULL WIRE + PUSHJ P,WRTZERO ;AND NO PINS + RELEASE DAT, + POPJ P, + +CLRBTS: ANDCAM C,ADDR(A,PBIT) ;TURN OFF BIT + FETCH(A,A,PNXT) + JUMPN A,CLRBTS + POPJ P, + +APPXY: HLRE T,1(A) ;X PART + SUB T,MINX + IDIV T,MAXX + SKIPN MAXX + MOVEI T,1(XLBITS-1)-1 + SKIPGE T + SETZ T, + CAIL T,1XLBITS + MOVEI T,1XLBITS-1 + HRRE TT,1(A) ;Y PART + SUB TT,MAXY + IDIV TT,MINY + SKIPN MINY + MOVEI TT,1(YLBITS-1)-1 + SKIPGE TT + SETZ TT, + CAIL TT,1YLBITS + MOVEI TT,1YLBITS-1 + ADDI TT,1 + DPB TT,[POINT 9,TTT,8] ;Y PART IS LETTER(ROW) + ADDI T,1 + DPB T,[POINT 9,TTT,17] ;X PART IS NUMBER(COLUMN) + POPJ P, + +; WIRES, WRITE SIGNAL NAME AND PIN INFO +DOWIRE: HRLM A,(P) + SETZM RUNBIT ;CLEAR RUN BITS + TLZ WFLAG + MOVE H,[1,,WDOSTR] ;OUTPUT ALL SIGNAL NAMES ON THIS WIRE + MOVE T,A + PUSHJ P,RECUR1 ;TEST AND PUT IN LIST + PUSHJ P,RECCHK ;CHECK FOR RECUR + TLNE WFLAG ;WRITE 0 IF ANY SIGNALS OUT NOW + PUSHJ P,WRTZERO + MOVE H,[2,,WDOPNT] ;OUTPUT ALL PINS ON WIRE + HLRZ T,(P) + PUSHJ P,RECUR1 ;TEST AND PUT IN LIST + PUSHJ P,RECCHK ;CHECK FOR RECUR + TLNN WFLAG ;IF NOTHING PUT OUT + JRST NOWRUN ;THEN NO BITS OR END MARK + PUSHJ P,WRTZERO ;MARK END OF WIRE + MOVE TTT,RUNBIT ;GET RUN BITS + PUSHJ P,WORDOUT ;WRITE THEM +NOWRUN: HLRZ A,(P) + FETCH(A,A,PNXT) + JUMPN A,DOWIRE + POPJ P, + +;Check points for signal name +WDOSTR: JFCL ;ALWAYS DO THIS PART + FETCHL(D,A,PBIT) +MPC,< LDB TT,[%%PLANES,,D] + JUMPE TT,WRECUR ;IF NO PLANE CONNEX, JUST RECUR + MOVE TTT,(TT)[ 0 + ASCIZ/GND/ + ASCIZ/VCC/ + ASCIZ/VCC2/ + ASCIZ/VCC3/ + ASCIZ/PLN4/ + ASCIZ/PLN5/ + ASCIZ/PLN6/] + PUSHJ P,WORDOUT + TLO WFLAG ;NOTE SOMETHING PUT OUT + JRST WRECUR +>;MPC +MD,< TLNN D,ISPIN ;IS THIS ON A BODY? + JRST NGBODY + FETCH(TT,A,BBODY) ;CHECK FOR GND BODY + FETCH(TTT,TT,BTYP) + FETCH(TTT,TTT,TNAM) + FETCH(TTT,TTT,TSASC) + CAMN TTT,[ASCIZ/GND/] ;BODIES NAMED GND GENERATE SIGNAL NAME GND + JRST [ TLO WFLAG + PUSHJ P,WORDOUT + JRST NGBODY] + PUSH P,A + HRRZ A,TT + PUSHJ P,FNDDIP + JRST [ POP P,A + JRST NGBODY] + POP P,A + FETCH(TTT,T,TXVAL) ;DIPTYPE "CABLE" CAUSES RUNS \C\ + FETCH(TTT,TTT,TSASC) + CAME TTT,[CABNAM] + JRST NGBODY + MOVEI TTT,CABBDY + IORM TTT,RUNBIT ;TURN ON CABBDY IN RUNBITS +NGBODY: FETCH(TT,A,PTXT) + JUMPE TT,WRECUR ;ANY TEXT? + FETCH(TT,TT,TCSTR) ;SKIP OVER OFFSET + SKIPN TTT,ADDR(TT,TSASC) ;REALLY SOMETHING THERE? *** BUG TRAP + JRST WRECUR ;NO + AND TTT,[774000,,0] + CAMN TTT,[ASCIZ/;/] + JRST WRECUR ;FLUSH SIGNALS THAT ARE JUST COMMENTS + PUSHJ P,WSTR ;WRITE SIGNAL NAME + TLO WFLAG + JRST WRECUR +>;MD + +;Now output all pins on wire, ignoring duplicate, bussed thru pins +WDOPNT: JRST WRECUR ;THIS IS AN "OTHER" PIN, JUST RECUR ON IT + FETCHL(D,A,PBIT) + TLNN D,ISPIN + JRST WCPIN +MD,< FETCH(TT,A,BBODY) ;IS PIN ON "GND" BODY + FETCH(TTT,TT,BTYP) + FETCH(TTT,TTT,TNAM) + FETCH(TTT,TTT,TSASC) + CAMN TTT,[ASCIZ/GND/] + JRST WRECUR ;YES, IGNORE + PUSH P,A + HRRZ A,TT + PUSHJ P,FNDDIP + JRST [ POP P,A + JRST NCNBDY] + POP P,A + FETCH(T,T,TXVAL) + FETCH(TT,T,TSASC) + CAME TT,[CABNAM] ;BODIES NAMED CABLE DO THIS + CAMN TT,[NULNAM] ;IGNORE APPEARANCE BODIES + JRST WRECUR ;WAS A PIN, BUT WE ARE IGNORING IT +NCNBDY: +>;MD + TLON WFLAG + PUSHJ P,WRTZERO ;FINISH SIGNAL NAMES + FETCH(TTT,A,BBODY) + FETCH(TTT,TTT,BID) + PUSHJ P,WORDOUT ;WRITE BODY ID + FETCH(TT,A,BPLOC) +MD,< FETCH(TTT,A,BPPN) + SKIPN TTT ;DO WE HAVE PIN NAME EXPLICITLY? + FETCH(TTT,TT,TPNAM) ;NO, USE DEFAULT + FETCH(TT,TT,TPID) + HRL TTT,TT + PUSHJ P,WORDOUT ;WRITE PIN ID,,PIN NAME + FETCHL(TTT,A,BPBIT) + FETCH(TT,A,BPPN) + SKIPE TT ;ANY EXPLICIT PIN? + TLZA TTT,DEFPIN ;YES, MAKE SURE DEFPIN OFF + TLO TTT,DEFPIN ;NO, SET DEFAULTED BIT + PUSHJ P,WORDOUT ;BITS,,0 +>;MD +MPC,< FETCH(TTT,TT,TPID) + HRL TTT,TTT + PUSHJ P,WORDOUT ;PIN ID,,PIN NAME +>;MPC + JRST WRECUR + +WCPIN: TLNN D,CPIN + JRST WRECUR ;NOTHING TO PUT OUT, JUST RECUR + TLON WFLAG + PUSHJ P,WRTZERO + FETCH(C,A,PLOC) +MD,< MOVS TTT,(C) > ;CPIN-LOC,,B-R-S +MPC,< HRLZ TTT,(C) > ;CPIN-LOC,, + PUSHJ P,WORDOUT +MD,< PUSHJ P,APPXY ;CALC APPROX X AND Y FOR CONNECTOR PIN + FETCH(TT,A,PID) + HRR TTT,TT ;PID +>;MD +MPC,< FETCH(TTT,A,PID) > + PUSHJ P,WORDOUT +MD,< FETCHL(TTT,A,PBIT) + PUSHJ P,WORDOUT ;WRITE BITS,,0 +>;MD + JRST WRECUR + + ; WIRES, RECUR +;TRACE ALL OF A WIRE +WRECUR: +MD,< FETCH(T,A,PND) + JUMPE T,.+2 + PUSHJ P,RECUR1 + FETCH(T,A,PNU) + JUMPE T,.+2 + PUSHJ P,RECUR1 + FETCH(T,A,PNL) + JUMPE T,.+2 + PUSHJ P,RECUR1 + FETCH(T,A,PNR) + JUMPE T,.+2 + PUSHJ P,RECUR1 + FETCHL(D,A,PBIT) + TLNN D,ISPIN ;PIN? + JRST RECCHK ;NO, DONE +;Look for bussed thru versions of this pin + FETCH(C,A,BPLOC) + FETCH(T,C,TPID) + FETCH(TT,C,TPNAM) + HRL T,TT ;TPNAM,,TPID + FETCH(A,A,BBODY) + FETCH(A,A,BLNK) + JUMPE A,RECCHK +WIRPIN: FETCH(B,A,BPLOC) + FETCH(TT,B,TPID) + FETCH(C,B,TPNAM) + HRL TT,C ;TPNAM,,TPID + XOR TT,T + JUMPE TT,WIRPN1 ;DON'T DO US + TLNN TT,-1 ;SAME PIN NAME? + JRST WPINFN ;YES +WIRPN1: FETCH(A,A,BPLNK) + JUMPN A,WIRPIN + JRST RECCHK + +WPINFN: MOVE T,A + PUSHJ P,RECUR0 +>;MD +MPC,< FETCHL(D,A,PBIT) + TLNN D,ISPIN + JRST TSTFED + FETCH(TTT,A,BPLOC) + FETCH(T,A,BBODY) + FETCH(T,T,BLNK) + JUMPE T,WIRPN2 +WIRPIN: CAMN T,A + JRST WIRPN1 + FETCH(TT,T,BPLOC) + CAMN TT,TTT + JRST WPINFN +WIRPN1: FETCH(T,T,BPLNK) + JUMPN T,WIRPIN +WIRPN2: OUTSTR[ASCIZ/CAN'T FIND PIN ON OTHER SIDE. +/] + PUSHJ P,FUCKUP + JRST NOFED + +WPINFN: PUSHJ P,RECUR0 + JRST NOFED + +TSTFED: FETCH(T,A,PFEED) + TLNE D,FEEDTH + PUSHJ P,RECUR1 +NOFED: FETCH(B,A,PNEB) + JUMPE B,RECCHK ;ANY NEIGHBORS? +WIRNE1: MOVEI C,2 +WIRNE2: XCT(C)[HLRZ T,(B) + HLRZ T,1(B) + HRRZ T,1(B)] + JUMPE T,.+2 + PUSHJ P,RECUR1 + SOJGE C,WIRNE2 + HRRZ B,(B) + JUMPN B,WIRNE1 +>;MPC +RECCHK: SKIPN T,WDOLST ;ANYTHING LEFT TO DO? + POPJ P, ;NO + SKIPN A,1(T) ;IS IT A 1 OR 0 ? + JRST DORCR0 ;0 + HRRZ TT,(T) + MOVEM TT,WDOLST + FSTRET(T) + JRST 1(H) + +DORCR0: HLRZ A,(T) + HRRZ TT,(T) + MOVEM TT,WDOLST + FSTRET(T) + JRST (H) + +RECUR0: PUSHJ P,RECURB + HRLM T,(TT) + POPJ P, + +;RECURSE DOWN WIRE (T) - USE WDOLST FOR STACK +RECUR1: PUSHJ P,RECURB + MOVEM T,1(TT) + POPJ P, + +RECURB: FETCHL(TTT,T,PBIT) + TDOE TTT,H ;TEST AND SET BIT FROM LH OF H + JRST CPOPJ1 + STOREL(TTT,T,PBIT) + GETFS(TT) ;SAVE CONTINUATION POINT + SETZM 1(TT) + EXCH TT,WDOLST + HRRZM TT,@WDOLST + MOVE TT,WDOLST + POPJ P, + ;'DAT' WRITE FILE FOR INPUT TO WAGNER'S ROUTER SYSTEM +;X VALUE GREATER THAN 256 INDICATES SOLDER SIDE INSTEAD OF COMPONENT SIDE +MPC,< +WAG,< +UML,< +WRTRTE: RELEASE DAT, +WROUTE: SKIPN WIRLST + JRST [ OUTSTR[ASCIZ/NO WIRES FOUND! +/] + POPJ P,] +WRTRT1: OUTSTR [ASCIZ /This code is broken, I didn't think anyone used it anymore.. +/] + PUSHJ P,FUCKUP + POPJ P, + +NIL,< TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ROUTER OUTPUT (DAT) /] + MOVE H,[DATNAM] + EXCH H,LSTNAM ;TEMPORARILY MAKE THIS  AND SAVE OLD + MOVSI T,EXTROU + PUSHJ P,SETNAM + JRST [ MOVEM H,LSTNAM + POPJ P,] + ENTPPN + MOVEM H,LSTNAM ;RESTORE REAL LSTNAM + INIT DAT,0 + 'DSK ' + XWD IOHD,0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + JRST WRTRT1] + PUSHJ P,EXIST ;CHECK IT + JRST WRTRTE + OUTSTR[ASCIZ/WRITING /] + MOVEI A,FILNAM + JSR FPRINT + ENTER DAT,FILNAM + JRST [ OUTSTR[ASCIZ/, ENTER FAILED! +/] + JRST WRTRTE] + OUTSTR[ASCIZ/ +/] + MOVEI T,IOBUF + EXCH T,.JBFF + OUTBUF DAT,2 + MOVEM T,.JBFF + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PASS EXISITING WIRES/] + PUSHJ P,YORN + JFCL + TLZA WFLAG + TLO WFLAG + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PASS CONNECTOR PINS/] + PUSHJ P,YORN + JFCL + TLZA ASK + TLO ASK + MOVEI T,ROUYMM*ROUSCL + MOVEM T,MINY + MOVEI T,ROUXMM*ROUSCL + MOVEM T,MINX + MOVSI C,1 ;BIT TO CLEAR + SKIPE A,PONPNT + PUSHJ P,CLRBTS ;CLEAR ON ONE SIDE + SKIPE A,PONPN2 + PUSHJ P,CLRBTS ;AND OTHER + MOVE C,WIRLST + MOVEI G,1 ;START WITH SIGNAL NUMBER OF 1 +WRTRT2: HRRZ D,1(C) +WRTTX1: MOVEI E,NPASLN ;NUMBER OF ENTRIES IN TABLE +WRTTX4: HLRZ A,1(D) + JUMPE A,WRTTX3 + ADD A,[POINT 7,1] + MOVE B,NOPASS(E) + PUSHJ P,SIGMAT ;IS ONE OF THEM? + JRST WRTTX5 + JFCL ;EQUIVALENT IS CLOSE ENOUGH + OUTSTR @NOPASS(E) + OUTSTR[ASCIZ/ RUN NOT PASSED! +/] + JRST WRTTX2 + +WRTTX5: SOJGE E,WRTTX4 +WRTTX3: HRRZ D,(D) + JUMPN D,WRTTX1 + HRRZ B,1(C) +WRTRT3: HRRZ A,1(B) ;GET CON HACK STUFF + JUMPE A,WRTNOC ;IS THERE ONE? + LDB T,[POINT 6,A,23] + CAILE T,4 ;FOONLY BOARDS HAVE 4 PADDLES! + SKIPA T,[ROUXMB] + MOVEI T,ROUXMT + TRNE A,76 + ADDI T,SIDDIF + PUSHJ P,WRTDEC ;WRITE WHICH EDGE NUMBER! + MOVEI T,ROUANY ;CODE FOR "ANY" CONNECTOR PIN + PUSHJ P,WRTDEC + MOVE T,G ;SIGNAL NUMBER + PUSHJ P,WRTDEC + PUSHJ P,WCRLF +WRTNOC: HLRZ A,(B) + JUMPE A,.+2 ;IS THERE ONE? + PUSHJ P,WRTXY ;POOT IT OUT + HRRZ B,(B) + JUMPN B,WRTRT3 + ADDI G,1 ;ANOTHER SIGNAL +WRTTX2: HRRZ C,(C) + JUMPN C,WRTRT2 + TLNN ASK + JRST PREPS3 ;IF NO CONNEX, NOTHING TO DO HERE + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PASS PREDETERMINED POWER AND GROUND CONNECTOR PINS/] + PUSHJ P,YORN + JRST PREPS2 + JRST PREPS2 ;NO + MOVSI C,-PRECLN + SETZM NUMBER + MOVEI G,NEVERC ;SIGNAL # FOR NEVER CONNECT HERE +PREPAS: MOVE T,PRECON(C) + MOVEM T,LETTER + PUSHJ P,LOOK ;FIND CONNECTOR PIN + JRST PREPS1 + MOVE A,T + PUSHJ P,WRTXY +PREPS1: AOBJN C,PREPAS +PREPS2: TLNN WFLAG ;PASSING EXISTING WIRES? + JRST PREPS3 ;NO + SKIPE A,PONPNT + PUSHJ P,WRTUCN + SKIPE A,PONPN2 + PUSHJ P,WRTUCN +PREPS3: SETZ G, ;NO SIGNALS ON THESE + JUMPGE SID,UNUSE1 ;OTHER SIDE? + SKIPE A,PONPNT ;NO, THIS IS THE SIDE THE SIGNALS POINT TO + PUSHJ P,WRTRT4 + SKIPE A,PONPN2 + PUSHJ P,WRTBCN ;WRITE UNUSED BACK SIDE CONNECTORS + JRST UNUSE2 + +UNUSE1: SKIPE A,PONPN2 + PUSHJ P,WRTRT4 + SKIPE A,PONPNT + PUSHJ P,WRTBCN +UNUSE2: SETZ T, + PUSHJ P,WRTDEC + PUSHJ P,WRTDEC + PUSHJ P,WRTDEC ;3 0'S TO END PINS + PUSHJ P,WCRLF + TLNN WFLAG ;ARE WE PASSING EXISTING WIRES? + JRST NOWIRF + OUTSTR[ASCIZ/PASSING EXISTING WIRES! +/] + SKIPE A,PONPNT + PUSHJ P,WRTWRF + SKIPE A,PONPN2 + PUSHJ P,WRTWIR +NOWIRF: SETZ T, + PUSHJ P,WRTDEC ;END WITH 4 ZEROES + PUSHJ P,WRTDEC + PUSHJ P,WRTDEC + PUSHJ P,WRTDEC + PUSHJ P,WCRLF ;END ALL WIRES + RELEASE DAT, ;CLOSE OUTPUT + POPJ P, + ; ROUTER OUTPUT SUBRS +WRTUCN: HLRZ TT,(A) + HRRZ T,1(TT) + MOVE T,1(T) + TLNN T,CPIN ;CONNECTOR PIN? + JRST WRTUCM + HLRZ TT,1(TT) ;SEE IF ANY CONNECTIONS + JUMPE TT,WRTUCM +WRTUCO: SKIPE 1(TT) + JRST WRTUCP + SKIPN TT,(TT) + JRST WRTUCM + TLNN TT,-1 + JRST WRTUCO +WRTUCP: PUSHJ P,WRTXY ;WRITE IT +WRTUCM: HRRZ A,(A) + JUMPN A,WRTUCN + POPJ P, + +WRTRT4: PUSHJ P,WRTXY + HRRZ A,(A) + JUMPN A,WRTRT4 + POPJ P, + +WRTDEC: MOVEI TTT,4 +WRTDC1: IDIVI T,=10 + HRLM TT,(P) + SOJLE TTT,.+2 + PUSHJ P,WRTDC1 + HLRZ TTT,(P) + ADDI TTT,60 + JRST WORDOUT + +WRTBCN: HLRZ T,(A) + HRRZ T,1(T) + MOVE TT,1(T) + TLON TT,1 + TLNN TT,CPIN ;CONNECTOR PINS ONLY ON THIS SIDE + JRST WRBCNN + MOVEM TT,1(T) + PUSHJ P,GOCON +WRBCNN: HRRZ A,(A) + JUMPN A,WRTBCN + POPJ P, + +WRTXY: HLRZ T,(A) + HRRZ T,1(T) + MOVE TT,1(T) + TLOE TT,1 + POPJ P, ;ALREADY DONE! + MOVEM TT,1(T) + TLNN TT,ISPIN ;ONLY PINS FOR NOW + JRST GOCON + HLRE T,1(A) + ADD T,MINX ;ADD OFFSET + CAIG T,ROUXMB*ROUSCL ;DON'T PASS AS CONNECTOR + PUSHJ P,UNDERX + CAIL T,ROUXMT*ROUSCL + PUSHJ P,OVERX + IDIVI T,ROUSCL ;SCALE IT! + TRZN T,1 ;MAKE IT ON EVEN LOC + SKIPE TT + OUTSTR[ASCIZ/PIN ON ODD X LOC, I MOVED IT LEFT! +/] + PUSHJ P,WRTDEC + HRRE T,1(A) + ADD T,MINY + IDIVI T,ROUSCL + TRZN T,1 + SKIPE TT + OUTSTR[ASCIZ/PIN ON ODD Y LOC, I MOVED IT DOWN! +/] +WCONP: CAIGE T,ROUYMB + PUSHJ P,UNDERY + CAILE T,ROUYMT + PUSHJ P,OVERY + PUSHJ P,WRTDEC + MOVE T,G ;GET WIRE NUMBER + PUSHJ P,WRTDEC +WCRLF: MOVE TTT,IOHD+2 + CAIG TTT,2 ;TWO OR MORE? + SETZM IOHD+2 ;NO, FORCE OUTPUT + MOVEI TTT,15 ;STUFF A CRLF ON THE END + PUSHJ P,WORDOUT + MOVEI TTT,12 + JRST WORDOUT + +GOCON: TLNE ASK + TLNN TT,CPIN + POPJ P, ;RANDOM POINT OR NOT DOING CPINS + HLRE T,1(A) + SKIPL T ;JUST WANT TO KNOW WHICH END + SKIPA T,[ROUXMT*ROUSCL] + MOVEI T,ROUXMB*ROUSCL + EQV TT,SID + JUMPL TT,.+2 + ADDI T,SIDDIF*ROUSCL ;OTHER SIDE + IDIVI T,ROUSCL +; SKIPE TT +; OUTSTR[ASCIZ/CONNECTOR PIN ON ODD X LOC, I MOVED IT LEFT. +;/] + PUSHJ P,WRTDEC + HRRE T,1(A) + ADD T,MINY + IDIVI T,ROUSCL +; SKIPE TT +; OUTSTR[ASCIZ/CONNECTOR PIN ON ODD Y LOC, I MOVED IT DOWN! +;/] + JRST WCONP + +OVERX: MOVEI T,(ROUXMT-1)*ROUSCL + OUTSTR[ASCIZ/X VALUE OVERFLOW! +/] + POPJ P, + +UNDERX: MOVEI T,(ROUXMB+1)*ROUSCL + OUTSTR[ASCIZ/X VALUE UNDERFLOW! +/] + POPJ P, + +OVERY: MOVEI T,ROUYMT + OUTSTR[ASCIZ/Y VALUE OVERFLOW! +/] + POPJ P, + +UNDERY: MOVEI T,ROUYMB + OUTSTR[ASCIZ/Y VALUE UNDERFLOW! +/] + POPJ P, + +WRTXYC: HLRE T,1(A) + ADD T,MINX ;ADD OFFSET + CAIG T,ROUXMB*ROUSCL + PUSHJ P,UNDERX + CAIL T,ROUXMT*ROUSCL ;TOO BIG? + PUSHJ P,OVERX + HLRZ TT,(A) + HRRZ TT,1(TT) + MOVE TT,1(TT) + EQV TT,SID + JUMPL TT,WRTXYZ + ADDI T,ROUSCL*SIDDIF +WRTXYZ: IDIVI T,ROUSCL ;SCALE IT! + SKIPE TT + OUTSTR[ASCIZ/SEGMENT ON ODD X LOC, I MOVED IT LEFT! +/] + PUSHJ P,WRTDEC + HRRE T,1(A) + ADD T,MINY + IDIVI T,ROUSCL + SKIPE TT + OUTSTR[ASCIZ/SEGMENT ON ODD Y LOC, I MOVED IT DOWN! +/] + CAIGE T,ROUYMB + PUSHJ P,UNDERY + CAILE T,ROUYMT + PUSHJ P,OVERY + JRST WRTDEC + +WRTWRF: HLRZ B,(A) + HRRZ T,1(B) + MOVE T,1(T) + TLNN T,FEEDTH ;PASS FEED THROUGH? + JRST WRTWIF + PUSHJ P,WRTXYC ;X,Y ON COMPONENT SIDE + PUSH P,A + HLRZ A,(A) + HLRZ A,(A) + PUSHJ P,WRTXYC ;X,Y ON SOLDER SIDE + POP P,A + PUSHJ P,WCRLF +WRTWIF: PUSHJ P,WRTWI0 + HRRZ A,(A) + JUMPN A,WRTWRF + POPJ P, + +WRTWIR: HLRZ B,(A) + PUSHJ P,WRTWI0 + HRRZ A,(A) + JUMPN A,WRTWIR + POPJ P, + +WRTWI0: HLRZ B,1(B) + JUMPE B,CPOPJ +WRTWI3: MOVEI C,2 +WRTWI1: XCT (C)[HLRZ D,(B) + HLRZ D,1(B) + HRRZ D,1(B)] + JUMPE D,WRTWI2 + MOVE T,1(A) + CAML T,1(D) ;ONLY DO EACH SEGMENT ONCE + JRST WRTWI2 ;WRONG WAY + MOVE TT,T ;GET COPY OF X,Y + ADJUST(SUB,TT,<1(D)>) ;GET DELTAS + TLNE TT,-1 ;EITHER DELTA 0? + TRNN TT,-1 + JRST NDELTA ;YES, THAT'S OK + HRRE TTT,TT + HLRE TT,TT + CAMN TT,TTT ;SAME? + JRST NDELTA + MOVN TT,TT + CAMN TT,TTT ;HOW ABOUT NOW? + JRST NDELTA + OUTSTR[ASCIZ/SORRY, LOSING WAGNER GETS ILL MEM REF'S +IF YOU PASS HIM AN EXISTING DIAGONAL ROUTE THAT +IS NOT A 45 DEGREE ANGLE! +/] + JRST WRTWI2 + +NDELTA: PUSHJ P,WRTXYC ;WRITE X,Y OF A + PUSH P,A + MOVE A,D + PUSHJ P,WRTXYC ;NOW OTHER END + POP P,A + PUSHJ P,WCRLF +WRTWI2: SOJGE C,WRTWI1 + HRRZ B,(B) + JUMPN B,WRTWI3 + POPJ P, + ; TABLES FOR ROUTER OUTPUT +;TABLE OF PRESET POWER AND GROUND CONNECTOR PINS +DEFINE PCON(A,B,C) +< +XX1__IFL "A"-"G"<"A";>IFL "A"-"I"<"A"-1;>IFL "A"-"O"<"A"-2;>IFL "A"-"Q"<"A"-3;>"A"-4 +XX1__XX1-100 +XX2__IFL "B"-"G"<"B";>IFL "B"-"I"<"B"-1;>IFL "B"-"O"<"B"-2;>IFL "B"-"Q"<"B"-3;>"B"-4 +XX2__XX2-100 + + BYTE(6)0,0,0,XX1-100,XX2-100,C +> + +PRECON: PCON A,B,1 + PCON A,F,1 + PCON A,L,1 + PCON A,R,1 + PCON A,U,1 + PCON A,U,2 + PCON A,V,1 + PCON A,V,2 + PCON B,A,1 + PCON B,A,2 + PCON B,B,1 + PCON B,B,2 + PCON B,F,1 + PCON B,L,1 + PCON B,R,1 + PCON B,U,1 + PCON C,B,1 + PCON C,F,1 + PCON C,L,1 + PCON C,R,1 + PCON C,U,1 + PCON C,U,2 + PCON C,V,1 + PCON C,V,2 + PCON D,A,1 + PCON D,A,2 + PCON D,B,1 + PCON D,B,2 + PCON D,F,1 + PCON D,L,1 + PCON D,R,1 + PCON D,U,1 +PRECLN__.-PRECON + +;TABLE OF SIGNALS NOT TO PASS TO THE ROUTER +NOPASS: [ + ASCIZ/VCC/] + [ + ASCIZ/GND/] + [ + ASCIZ/HI/] +NPASLN__.-NOPASS-1 + +>;NIL +>;UML +>;WAG +>;MPC diff --git a/src/draw/pc.loader b/src/draw/pc.loader new file mode 100644 index 00000000..73c2d368 --- /dev/null +++ b/src/draw/pc.loader @@ -0,0 +1,4 @@ +msail;jobdatl +mDRAW;PCl +MWL;PCBOARDL +jpc1?Wtd diff --git a/src/draw/plt.329 b/src/draw/plt.329 new file mode 100644 index 00000000..b185eb99 --- /dev/null +++ b/src/draw/plt.329 @@ -0,0 +1,983 @@ +;PLT.FAI.47, 15-NOV-75 18:07:25, EDIT BY HELLIWELL +VERSION(PLT,6) + +COMMENT  +PLTVER 15 ;HAS CHARACTER SIZE AS *8 + ; (USED TO BE 1,2,...) + +;SETUP + +MPC,< +SIGPLT: SETZM FILNAM + TLO WFLAG + JRST SIGPL1 +>;MPC + +EWPLOT: MOVSI T,EXTPLT + PUSHJ P,SETLST ;WILL SKIP IF THERE IS SAVED NAME + JRST PLOT +NOSTAN,< +MPC,< MOVE T,[POINT 6,FILNAM] +EWPLT1: ILDB TT,T + JUMPE TT,EWPLT2 + TLNE T,770000 + JRST EWPLT1 +EWPLT2: TLNN SID,FRONT + SKIPA TT,['S'] ;BACK IS SOLDER + MOVEI TT,'C' ;FRONT IS COMPONENT + DPB TT,T +>;MPC +>;NOSTAN + CAIA +PLOT: SETZM FILNAM +MPC,< TLZ WFLAG ;CLEAR FLAG FOR SIG FILES +SIGPL1: SETZM CPLANE + TRNN M,FLIP ;DO WE WARN HIM? + JUMPL SID,PLPLT1 + TRNE M,FLIP + JUMPGE SID,PLPLT1 + OUTSTR[ASCIZ/TEXT IS INVALID UNLESS YOU PLOT THIS FLIPPED! +/] + CAIA +PLPLOT: SETZM FILNAM ;FLAG NEED TO ASK FILENAME +PLPLT1: >;MPC +MD,< MOVEI T,13 ;1.0 (binary point 3) + MOVEM T,CSCALE ;CSCALE/8 IS ADJUSTMENT FOR CHARACTER SIZE + ; (USED BY PBOX) + SETOM CBOX ;NO DEFAULT BOX SIZE + CAIA +DPLOT: SETZM FILNAM + MOVE C,STDBIG + MOVE T,PLTPTX(C) + IMUL T,CSCALE + MOVEM T,LSCALX ;X,Y UNITS FOR DRAWING CONN BOX + MOVE T,PLTPTY(C) + IMUL T,CSCALE + ASH T,-1 + MOVEM T,LSCALY +>;MD + SKIPE FILNAM ;ALREADY GOT NAME? + JRST GOTPNM + TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /PLOT /] + MOVSI T,EXTPLT +MPC,< TLNE WFLAG + MOVSI T,EXTSIG +>;MPC + PUSHJ P,SETNAM + POPJ P, +GOTPNM: ENTPPN + INIT DAT,10 + SIXBIT /DSK/ + XWD IOHD,0 + JRST [ OUTSTR[ASCIZ/WHERE'S THE DISK! +/] + POPJ P,] + PUSHJ P,EXIST ;SEE IF IT ALREADY EXISTS + POPJ P, ;DON'T OVERWRITE + OUTSTR[ASCIZ/WRITING /] + MOVEI A,FILNAM + JSR FPRINT + ENTER DAT,FILNAM + JRST [ OUTSTR [ASCIZ/, ENTER FAILED. +/] + POPJ P,] + OUTSTR[ASCIZ/ +/] + MOVEI A,IOBUF + EXCH A,.JBFF + OUTBUF DAT,2 + MOVEM A,.JBFF +MPC,< SETZM MXPADN > +MD,< MOVEI TTT,PLTVER ;PUT OUT PLOT VERSION # > +MPC,< MOVEI TTT,PCPVER ;PUT OUT PLOT VERSION # > + PUSHJ P,PUTWRD + ;PUT OUT BODYS +MD,< MOVE B,DBODPN + JUMPE B,NOBOSS +PBLP: TLNN M,BLOCS ;SHALL WE DO DIP NUMBER? + JRST NOLOC + FETCH(T,B,BBIT) + TRNN T,FIXLOC ;IS IT TRACKING DEF? + JRST DISLC3 ;NO, NO CHECK + FETCH(T,B,BTYP) + FETCH(T,T,TBIT) + TRNE T,XDISLOC ;SHOULD WE DISPLAY LOC? + JRST NOLOC ;NO +DISLC3: FETCH(D,B,BLOC) + JUMPE D,NOLOC ;SKIP IF NO LOC BLOCK + FETCH(T,B,BXY) + ADJUST(ADD,T,) ;OFFSET FOR NLNLN + MOVEI TTT,-1+ADDR(B,BLO) + MOVE C,STDBIG + PUSHJ P,TXTCAL + PUSHJ P,PUTWRD + PUSHJ P,STDSIZ ;SMALLEST SIZE + PUSHJ P,PLTBNM ;PLOT DIP NUMBER +NOLOC: FETCH(D,B,BTYP) + FETCH(F,B,BORI) + FETCH(A,D,TLIN) + JUMPE A,NOLINS ;ANY LINES IN DEF? +PLOPP1: FETCH(T,A,QXY) ;GET X,Y OF LINE + TRZE T,1 ;VIS OR INVIS? + JRST [PUSHJ P,PINVS ;INVISIBLE + JRST .+2] + PUSHJ P,PVIS ;VISIBLE + HRRZ A,(A) ;GO TO NEXT LINE + JUMPN A,PLOPP1 +NOLINS: TRNE M,NBTEXT + JRST NOTINS + FETCH(A,B,BTXT) + JUMPE A,PBTLP0 +PBTLP1: FETCH(T,A,TXBIT) + TRNN T,TXBIND + JRST PBTLP2 + PUSH P,A + FETCH(A,A,TXIND) + PUSHJ P,PBTLPX + POP P,A + JRST PBTLP3 + +PBTLP2: PUSHJ P,PBTLPX +PBTLP3: HRRZ A,(A) + JUMPN A,PBTLP1 + JRST NOTINS + +PBTLP0: FETCH(A,B,BTYP) + FETCH(A,A,TPROP) + JUMPE A,NOTINS ;NONE? +PBTLP: PUSHJ P,PBTLPX + HRRZ A,(A) ;GET NEXT TEXT + JUMPN A,PBTLP +NOTINS: HRRZ B,(B) ;GET NEXT BODY + JUMPN B,PBLP ;LOOP + JRST NOBOSS + +PBTLPX: FETCH(T,A,TXVAL) + FETCH(T,T,TSSIZ) ;SIZE (0 = INVIS) + TLNN M,%IDENT + JUMPE T,CPOPJ + FETCH(T,A,TXXY) + TDZ T,[1,,1] + PUSHJ P,ORIENT ;ORIENT IT + ADJUST(ADD,T,<1(B)>) ;ADD BODY CENTER + MOVEI TTT,-1+ADDR(A,TXOFF) ;PTR TO OFFSET BLOCK, DATA + JRST PTXTS ;PLOT TEXT (GENERAL FORMAT) + ;CALL POINT SUBRS, DO END STUFF +NOBOSS: MOVE B,PONPNT ;GET ON-SCREEN POINTER + PUSHJ P,SETBTS ;SET THE BITS UP + TLNN M,DIAMONDS ;SHALL WE DO THE DIAMONDS? + JRST NODIAMONDS + MOVE B,PONPNT + PUSHJ P,DODIAMONDS +NODIAMONDS: + SETZM CIRC ;DON'T DO CLOSED LOOPS YET! +>;MD + SKIPE B,PONPNT ;GET ON-SCREEN POINTER + PUSHJ P,DOPNTS ;DO THE POINTS +MD,< SETOM CIRC ;NOW GET THE CLOSED LOOPS + SKIPE B,PONPNT + PUSHJ P,DOPNTA + AOSG TTT,CBOX ;GET BOX ID + JRST NOTBOX ;NONE + MOVE TTT,BTAB-1(TTT) ;GET LETTER FOR THIS BOX + SUBI TTT,"A"-1 ;AND NORMALIZE IT SO A=1 + TLZE TTT,400000 ;VERT? + TRO TTT,200000 ;YES + LSH TTT,1 ;MAKE SURE LOW ORDER BIT ISN'T ON! +NOTBOX: HRLI TTT,400001 + PUSHJ P,PUTWRD +FOR I IN(TAUTHOR,TIT1,TIT2) +< MOVE T,I + PUSHJ P,PSTR +> + MOVE TTT,DRWDAT + PUSHJ P,WORDOUT ;STUFF DATE INTO FILE AFTER AUTHOR TITLE STUFF + SKIPN TTT,DRWNAM + MOVE TTT,FILNAM + PUSHJ P,WORDOUT + MOVE TTT,DRWEXT + PUSHJ P,WORDOUT + MOVE TTT,DRWPPN + PUSHJ P,WORDOUT + PUSHJ P,INIPCH + HLRZ A,CRDLOC + PUSHJ P,SLTOUT ;MAKE STRING OF SLOT LOCATION + PUSHJ P,FINPCZ + MOVE T,TREV + PUSHJ P,PSTR + PUSHJ P,INIPCH + SKIPE T,TMODULE + PUSHJ P,PCHRS + SKIPN T,TVARIABLE + JRST NOPVAR + PUTBYT "-" + PUSHJ P,PCHRS +NOPVAR: SKIPN T,TPREFIX + JRST NOPFIX + PUTBYT "-" + PUSHJ P,PCHRS +NOPFIX: PUSHJ P,FINPCZ +FOR I IN(TPROJ,TPAGE,TOF,TDCODE,SITE1,SITE2) +< MOVE T,I + PUSHJ P,PSTR +> +DEC,< MOVE T,TNXTHI + PUSHJ P,PSTR +FOR @$I IN(DRN,CHK,ENG) +< SKIPN TTT,I$NAM + JRST NOP$I + PUSHJ P,WORDOUT + MOVE TTT,I$NAM+1 + PUSHJ P,WORDOUT + MOVE TTT,I$NAM+3 +NOP$I: PUSHJ P,WORDOUT +> +>;DEC +>;MD +MPC,< HLRZ TTT,SID + SKIPE CPLANE ;INNER PLANE? + TRO TTT,200000 ;YES + HRLI TTT,400001 + PUSHJ P,PUTWRD + TLNE WFLAG + JRST SIGPL2 + TRNN M,FLIP ;FLIPPED? + TDZA TTT,TTT + MOVEI TTT,1 ;FLIPPED BIT TO PLOT PROG + PUSHJ P,PUTWRD + MOVE TTT,CRDNAM + PUSHJ P,WORDOUT + HLLZ TTT,CRDEXT + PUSHJ P,WORDOUT + MOVE TTT,CRDPPN + PUSHJ P,WORDOUT + PUSHJ P,MXPADQ ;PRINT MAX PAD # SEEN +SIGPL2: +>;MPC + RELEASE DAT, + POPJ P, + ;POINTS (D) +;B = POINT LIST + +MD,< +DOPNTS: FETCH(D,B,PBIT) + TLNE M,CLOCS ;DOING LOCATIONS? + TRNN D,CPIN ;AND CONNECTOR PIN!? + JRST CNOPIN ;NO + FETCH(T,B,PXY) ;CPIN X,Y + FETCH(E,B,PLOC) ;B-R-S,DIP-LOC OF CPIN + FETCH(F,B,PTXT) + JUMPE F,NTXCPN ;NO TEXT + FETCH(F,F,TCSTR) + FETCH(F,F,TSSIZ) ;GET TEXT SIZE FOR REFERENCE +NTXCPN: MOVE TTT,E ;PLOC: B-R-S,,DIPLOC + MOVE C,F + ANDI C,377777 + PUSHJ P,TXTCAL ;SUM TEXCOF (T,TTT) + PUSHJ P,PUTWRD ;WRITE IT + TLZ TTT,1 + PUSH P,TTT + PUSHJ P,VSIZES ;CHECKS FOR VERT BIT IN F + PUSHJ P,PLTCNM ;PLOT CONN NUMBER + TRNE M,NOCBOX ;DOING BOX? + JRST NPTCBX + MOVE TTT,(P) + PUSHJ P,PUTWRD ;START BOX + MOVE A,B + PUSHJ P,CONCAL ;CALC LENGTH OF CPIN (=T) + ;FALLS THRU +;PLOT CONNECTOR BOX + IMUL T,LSCALX ;SCALE IT + TRNE F,400000 ;VERT? + JRST VCONBX + MOVSS TTT,T ;MAKE IT X PART + ADD TTT,(P) ;GO RIGHT + PUSHJ P,PUTLIN ;+X,0 + HRLZ TT,LSCALX + ADD TTT,LSCALY + ADD TTT,TT + PUSHJ P,PUTLIN ;+X,+Y + SUB TTT,TT + ADD TTT,LSCALY + PUSHJ P,PUTLIN ;-X,+Y + SUB TTT,T + PUSHJ P,PUTLIN ;-X,0 + SUB TTT,TT + SUB TTT,LSCALY + PUSHJ P,PUTLIN ;-X,-Y + ADD TTT,TT + SUB TTT,LSCALY + PUSHJ P,PUTLIN ;+X,-Y + JRST NPTCBX + +VCONBX: MOVE TTT,T ;GET IT HERE + ADD TTT,(P) ;GO UP + TLZ TTT,1 + PUSHJ P,PUTLIN ;0,+Y + HRLZ TT,LSCALY + SUB TTT,TT + ADD TTT,LSCALX + TLZ TTT,1 + PUSHJ P,PUTLIN ;-X,+Y + SUB TTT,TT + TLO TTT,1 + SUB TTT,LSCALX + TLZ TTT,1 + PUSHJ P,PUTLIN ;-X,-Y + TLO TTT,1 + SUB TTT,T + TLZ TTT,1 + PUSHJ P,PUTLIN ;0,-Y + ADD TTT,TT + TLO TTT,1 + SUB TTT,LSCALX + TLZ TTT,1 + PUSHJ P,PUTLIN ;+X,-Y + ADD TTT,TT + ADD TTT,LSCALX + TLZ TTT,1 + PUSHJ P,PUTLIN ;+X,+Y +NPTCBX: POP P,(P) + JRST TSTXT + + ;CNOPIN +;B = POINT LIST +;D = FLAGS + +CNOPIN: TRNN D,ISPIN ;BODY PIN? + JRST TSTXT ;NO, CHECK FOR TEXT + TLNN M,PLOCS ;DOING PINS? + JRST PCKPND ;NO, CHECK ID'S + FETCH(TT,B,BPLOC) ;PINLOC BLOCK IN TYPE + FETCH(T,TT,TPBIT) + TRNE T,BUSSED + JRST TSTXT ;SKIP BUSS THRU PINS + FETCH(A,B,BPPN) ;PIN NAME + JUMPN A,PLTPNN + TLNN M,PINIDS ;PRINT DEFAULT PIN NAMES? + JRST TSTXT + FETCH(A,TT,TPNAM) ;DEFAULT PIN NAME FROM TYPE +PLTPNN: MOVEM B,CURPIN ;SAVE POINT + MOVEM A,PINNAM + FETCH(C,B,BBODY) ;BODY OF POINT + PUSH P,C ;BODY + SETZM CHRCNT + PUSH P,PUTCHR + MOVE TTT,[AOS CHRCNT] + MOVEM TTT,PUTCHR + FETCH(B,C,BSOC) + FETPAK(C,C) + PUSHJ P,PINPLS ;PRINT AS SOCKET PIN (C=BPOINT) + POP P,PUTCHR + MOVN A,CHRCNT ;GET LENGTH OF PIN NAME + MOVE TT,(P) ;BODY + FETCH(TTT,TT,BORI) ;GET ORIENTATION + MOVE T,CURPIN + FETCH(T,T,BPLOC) ;GET PIN TYPE BLOCK POINTER + MOVEI C,PLTPTX ;CHARS DESTINED FOR PLT + PUSHJ P,PINCAL ;PINCAL(T=TYPIN, A=-, TTT=BORI) + MOVE B,CURPIN + PUSHJ P,PNSPOT ;CALC PIN LOC, OUTPUT IT, SWITCH TO SIZE 1 ( OR 2) + PUSHJ P,INIPCH + POP P,C + FETCH(B,C,BSOC) + FETPAK(C,C) + MOVE A,PINNAM + PUSHJ P,PINPLS ;PRINT SOCKET PIN (C=BPOINT) + PUSHJ P,FINPCH + MOVE B,CURPIN + JRST TSTXT + +PCKPND: TLNN M,PINIDS + JRST TSTXT + FETCH(T,B,BPLOC) + FETCH(TTT,B,BBODY) + FETCH(TTT,TTT,BORI) ;GET ORIENTATION + PUSHJ P,PIDCAL + PUSHJ P,PNSPOT + PUSHJ P,PLTPND +TSTXT: TRNE M,NPTEXT + JRST NOPTXT + FETCH(TTT,B,PTXT) ;GET TEXT + JUMPE TTT,NOPTXT ;NONE? + FETCH(T,B,PXY) + PUSHJ P,PTXTS ;DO IT +NOPTXT: FETCH(E,B,PBIT) ;GET BITS + ANDI E,17 ;CLEAR OTHERS + PUSH P,B + XCT PPTB1(E) ;CALL THE ROUTINE OR NOT + POP P,B + HRRZ B,(B) ;GET NEXT ONE + JUMPN B,DOPNTS + POPJ P, + + ;PNSPOT +;CALC PIN LOC, OUTPUT IT, SWITCH TO SIZE 1 ( OR 2) +;A = X +;TT = Y (III FORMAT) +;B = POINT + +PNSPOT: IMUL A,CSCALE ;DO CHAR SCALE THING + IMUL TT,CSCALE + FETCH(TTT,B,PY) + SUB TTT,YOFF + SCALET (TTT) + ADD TTT,TT ;Y PART + TRZE TTT,1 + ADDI TTT,2 + FETCH(TT,B,PX) + SUB TT,XOFF + SCALET (TT) + ADD TT,A + HRL TTT,TT + TLO TTT,1 + PUSHJ P,PUTWRD ;THIS WILL PUT THE PIN # IN THE RIGHT PLACE (I HOPE!) + JRST STDSIZ + + ;LINE SUBR (D) + +DOPNTA: FETCH(E,B,PBIT) + ANDI E,17 ;JUST GOOD BITS + PUSH P,B ;SAVE THIS GUY + CAIE E,17 ;ALL DONE? + PUSHJ P,DOPPIT ;NO, FINISH THE BUM + POP P,B + HRRZ B,(B) + JUMPN B,DOPNTA + POPJ P, + +DOPPIT: XCT PPTB2(E) ;GET POINTER TO NEXT (LINE) POINT IN F + HRLZ C,PPTB3(E) ;TURN ON BIT FOR LINE WE ARE DOING + IORM C,ADDR(B,PBIT) ;...... + FETCH(T,B,PXY) + MOVEI TTT,0 + PUSHJ P,PUTXY ;DO THE LINE (BEGINING POINT) +PLPLOP: HLRZ A,PPTB3(E) ;GET MAGIC BITS + MOVE B,F ;GET POINTER TO NEXT POINT IN LINE + FETCH(D,B,PBIT) + IOR A,D ;TURN ON BIT FOR LINE WE ARE DOING + STORE(A,B,PBIT) + ANDI A,17 ;GET BITS + FETCH(T,B,PXY) + MOVEI TTT,1 + PUSHJ P,PUTXY ;DRAW THE LINE + HRLZ E,PPTB3(A) ;GET MAGIC BITS + XCT PPTB5(A) ;TO SKIP OR NOT TO SKIP! + POPJ P, ;QUIT IF NO SKIP! + IORM E,ADDR(B,PBIT) ;TURN ON BIT FOR NEXT SEGMENT + MOVE E,A + XCT PPTB2(E) ;GET POINTER TO NEXT POINT IN LINE + JRST PLPLOP + +SETBTA: PUSHJ P,SETBTO + HRRZ B,(B) +SETBTS: JUMPN B,SETBTA + POPJ P, + +;SETBTO - SET MARK BITS FOR NEIGHBORS "DONE", I.E. NON-EX +;B = POINT +;RETURNS +;F = FLAG FWD +; 10=LEFT, 4=RIGHT, 2=DOWN, 1=UP +SETBTO: PUSH P,A + FETCHL(F,B,PBIT) + TLZ F,17 ;TURN OFF THE "SEGMENT DONE" BITS + +DEFINE FOO (LINK,BIT) +< FETCH(A,B,LINK) + SKIPN A + TLO F,BIT +> + FOO(PNU,1) + FOO(PND,2) + FOO(PNR,4) + FOO(PNL,10) + STOREL(F,B,PBIT) + POP P,A + POPJ P, + ;DIAMONDS, RANDOM NUMBERS (D) +DODIAMONDS: + JUMPE B,CPOPJ + FETCH(A,B,PBIT) + ANDI A,17 ;THESE ARE THE BITS + XCT PPTB4(A) ;DISPATCH + HRRZ B,(B) + JRST DODIAMONDS + +PUTTI3: TLNN M,JUNC3 ;DOING JUNCTIONS OF 3? + POPJ P, ;NO +PUTTIT: FETCH(T,B,PXY) + MOVSI TTT,1 + PUSHJ P,PUTXY + MOVE TTT,[2,,1] ;CODE FOR DIAMOND + JRST PUTWRD + +PLTPND: PUSHJ P,INIPCH + PUSHJ P,OUTPID + JRST FINPCH + +PLTBNM: PUSHJ P,INIPCH + PUSH P,A ;I DONT THINK THIS IS NEEDED + FETCH(A,B,BRSLOC) + PUSHJ P,SLTLPN +FNPCHA: POP P,A + JRST FINPCH + +PLTCNM: PUSHJ P,INIPCH + PUSH P,A ;IS THIS NEEDED? + MOVE A,(E) + PUSHJ P,CSLTLP + JRST FNPCHA + ;LINE TABLES (D) +PPTB1: JFCL + PUSHJ P,DOPPIT + PUSHJ P,DOPPIT + JFCL + PUSHJ P,DOPPIT + JFCL + JFCL + PUSHJ P,DOPPIT + PUSHJ P,DOPPIT + JFCL + JFCL + PUSHJ P,DOPPIT + JFCL + PUSHJ P,DOPPIT + PUSHJ P,DOPPIT + JFCL + +PPTB2: FETCH(F,B,PNL) ;  + FETCH(F,B,PND) ;  + FETCH(F,B,PNU) ; + FETCH(F,B,PNL) ;  + FETCH(F,B,PNL) ;  + FETCH(F,B,PNL) ;  + FETCH(F,B,PNL) ;  + FETCH(F,B,PNL) ;  + FETCH(F,B,PNR) ;  + FETCH(F,B,PNR) ;  + FETCH(F,B,PNR) ;  + FETCH(F,B,PNR) ;  + FETCH(F,B,PNU) ; + FETCH(F,B,PND) ;  + FETCH(F,B,PNU) ; + JRST 4,. ;0 0 + +PPTB3: 4,,10 + 1,,2 + 2,,1 + 4,,10 + 4,,10 + 4,,10 + 4,,10 + 4,,10 + 10,,4 + 10,,4 + 10,,4 + 10,,4 + 2,,1 + 1,,2 + 2,,1 + 0 + +PPTB4: PUSHJ P,PUTTIT ;0 + PUSHJ P,PUTTI3 ;1 + PUSHJ P,PUTTI3 ;2 + JFCL ;3 + PUSHJ P,PUTTI3 ;4 + JFCL ;5 + JFCL ;6 + JFCL ;7 + PUSHJ P,PUTTI3 ;10 + JFCL ;11 + JFCL ;12 + JFCL ;13 + JFCL ;14 + JFCL ;15 + JFCL ;16 + JFCL ;17 + +PPTB5: SKIPN CIRC + CAIA + CAIA + SKIPN CIRC + CAIA + SKIPN CIRC + SKIPN CIRC + CAIA + CAIA + SKIPN CIRC + SKIPN CIRC + CAIA + SKIPN CIRC + CAIA + CAIA + JFCL ;ALWAYS QUIT ON THIS ONE!!! +>;MD + ;POINTS (PC) +;B = POINT LIST + +MPC,< +DOPNTS: FETCH(G,B,PXY) ;X,Y OF POINT + TLNE WFLAG ;IF SIG FILE + JRST PNOPIN ;SKIP ALL PADS ETC. + TRNE M,NPTEXT + JRST NOPTXT + FETCH(TTT,B,PTXT) + JUMPE TTT,NOPTXT ;NONE? + FETCH(T,B,PXY) + PUSHJ P,PTXTS +NOPTXT: FETCHL(E,B,PBIT) + TLNN E,ISPIN!FEEDTH + JRST DOPADA + MOVE T,G + MOVSI TTT,1 + PUSHJ P,PUTXY + MOVE TTT,[2,,1] ;DRILL HOLE! + PUSHJ P,PUTWRD +DOPADA: FETCH(D,B,PIN) ;ANY PAD TYPE? + JUMPE D,PNOPIN + SKIPN CPLANE + JRST DOPAD + LDB T,[%%PLANES,,E] ;PLANE NUMBER + CAMN T,CPLANE + JRST PNOPIN +DOPAD: MOVE T,G + MOVSI TTT,1 + PUSHJ P,PUTXY + HRRZ TTT,D ;PAD TYPE + CAMLE TTT,MXPADN + MOVEM TTT,MXPADN + LSH TTT,1 + TDO TTT,[4,,1] ;MARK AS PAD! + PUSHJ P,PUTWRD +PNOPIN: PUSH P,B + MOVE C,B + FETCH(B,B,PNEB) + JUMPE B,PPTB4 +PPTB1: MOVEI H,2 +PPTB2: XCT (H)[HLRZ A,(B) + HRRZ A,1(B) + HLRZ A,1(B)] + JUMPE A,PPTB3 + CAML G,1(A) + JRST PPTB3 + MOVE TTT,1(A) + PUSH P,G + PUSH P,C + PUSHJ P,PADFIX ;PERHAPS DIDDLE LINE IF GOING TO PAD? + MOVE T,G + MOVEI TTT,0 + PUSHJ P,PUTXY + MOVE C,A + MOVE TTT,-1(P) + MOVE G,1(A) + PUSHJ P,PADFIX + MOVE T,G + MOVEI TTT,1 + PUSHJ P,PUTXY + POP P,C + POP P,G +PPTB3: SOJGE H,PPTB2 + HRRZ B,(B) + JUMPN B,PPTB1 +PPTB4: POP P,B + HRRZ B,(B) ;GET NEXT ONE + JUMPN B,DOPNTS + POPJ P, + +PADFIX: TLNE WFLAG ;NO FIX FOR SIG FILES + POPJ P, + POPJ P, +NIL,< +;!!! THIS CODE NEVER COULD'VE BEEN EXECUTED ANYWAY !!! + MOVE T,ADDR(C,BPPN) ;PBIT,,PAD + CAIE T,1 + CAIN T,3 + TLNN T,ISPIN + POPJ P, ;ONLY FIX DIP PINS + HRRZS T + CAIE T,1 ;AND ONLY THE ONES WE KNOW ABOUT + CAIN T,2 + CAIA + POPJ P, + ADJUST(SUB,TTT,G) + FETCH(T,C,BBODY) + FETCH(T,T,BORI) + JRST @(T)[VFIX + HFIX + VFIX + HFIX] + +VFIX: TRNN TTT,-1 + JRST VFIX1 +HFIX1: TRNE TTT,400000 + SKIPA T,[XWD 0,-=8] + MOVEI T,=8 +VHFIX: ADJUST(ADD,G,T) + POPJ P, + +HFIX: TLNN TTT,-1 + JRST HFIX1 +VFIX1: SKIPGE TTT + SKIPA T,[XWD -=8,0] + MOVSI T,=8 + JRST VHFIX +>;NIL +>;MPC + ;OFFSET TEXT ROUTINE +;T = MAIN X,Y +;TTT = POINTER TO CONSTANT OFFSET BLOCK +;C = CHARACTER SIZE +;WRITES X,Y AND RETURNS IT IN TTT + +TXTCAL: +MD,< PUSHJ P,PSETXY + HRL T,TT ;X,,Y + TDZ T,[1,,1] + PUSH P,TTT + HRRE TT,1(TTT) ;Y + IMUL TT,CSCALE + IMUL TT,PLTPTY(C) + IDIV TT,VIRPTY(C) + EXCH TT,(P) ;GET BACK BLOCK PTR + HLRE TT,1(TT) ;X + IMUL TT,CSCALE ;CHARACTERS TO PLOT POINTS + IMUL TT,PLTPTX(C) ;ADJUST FOR LIE WE GAVE FOR CHAR WIDTH + IDIV TT,VIRPTX(C) + POP P,TTT + HRL TTT,TT + TDZ TTT,[1,,1] + EXCH TTT,T ;LEAVE OFFSET VALUES IN T + ADD TTT,T + TLO TTT,1 + POPJ P, +>;MD +MPC,< ADJUST(ADD,T,<1(TTT)>) + MOVSI TTT,1 + JRST PUTXY +>;MPC + +;TTT = TEXT STR, WITH OFFSET BLOCK +;T = X,Y + +PTXTS: PUSH P,TTT +MD,< FETCH(C,TTT,TCSTR) + FETCH(C,C,TSSIZ) + ANDI C,377777 +>;MD + PUSHJ P,TXTCAL ;CALC LOC+OFFSET AND WRITE IT OUT +MPC,< POP P,T + FETCH(T,T,TCSTR) + FETCH(TTT,T,TSSIZ) + LSH TTT,4 ;SCALE APPROP FOR PLT PROGRAM + TLZE TTT,10 ;TEST VERT BIT + TRO TTT,400000 ;AND COPY TO HERE + TRO TTT,1 ;MARK AS PART OF THIS COMMAND + PUSHJ P,PUTWRD ;WRITE SIZE + JRST PSTR ;AND NOW TEXT +>;MPC +;For D, break multi-line text into separate lines, +; each with its own X,Y positioning. +MD,< PUSHJ P,PUTWRD ;WRITE X,Y WORD + EXCH TTT,(P) ;SAVE X,Y JUST PUT OUT AND GET TEXT POINTER + MOVEI TT,1(TTT) + HRLI TT,() + FETCH(TTT,TTT,TCSTR) + FETCH(TTT,TTT,TSSIZ) + SKIPN TTT + MOVE TTT,STDBIG ;CHANGE 0 TO STANDARD + MOVE T,TTT + ANDI TTT,377777 + PUSH P,TTT ;SAVE THIS HERE + MOVE TTT,PLTPTX(TTT) + IMUL TTT,CSCALE ;SCALE IT CSCALE/8 + LSH TTT,1 + TRO TTT,1 + TRNE T,400000 ;WAS IT VERTICAL? + TRO TTT,400000 ;YES, FLAG AS SUCH + PUSHJ P,PUTWRD ;PUT OUT SIZE + EXCH TTT,(P) ;SAVE SIZE TO WRITE OUT + MOVE TTT,PLTPTY(TTT) + IMUL TTT,CSCALE +; ASH TTT,2 ;SCALE III PTS INTO PLOT PTS +; ASH TTT,-3 ;REMOVE CSCALE BINARY POINT +; ASH TTT,1 ;FOR I/O FORMAT + TRZ TTT,1 ;LOW ORDER BIT MUST BE OFF + ;4 plot points are worth 1 dpy point + ;the factor of 8 implied in CSCALE + ;causes this delta-Y to be plot points + ; shifted by 1 for I/O format. God damn + TRNN T,400000 + MOVN TTT,TTT + HRRZS TTT + TRNE T,400000 + MOVSS TTT + PUSH P,TTT ;SAVE LF INCREMENT +PTXTS1: SETZ TTT, ;GATHER TEXT HERE +PTXTS2: TLNN TT,760000 ;END OF WORD? + JRST [ HRR TT,-1(TT) ;FOLLOW LINK + TRNE TT,-1 ;WAS THERE ONE THERE? + JRST .+1 ;YES + POP P,(P) + POP P,(P) ;FIX UP STACK + POP P,(P) + JRST PTXTFN] ;NO + ILDB T,TT + JUMPE T,PTXTS2 ;SKIP NULLS + CAIN T,DBLARR ;THIS IS REALLY CRLF + JRST PTXTS3 + TLNE TTT,776000 ;TTT FULL? + PUSHJ P,PTXTFN ;FLUSH IT OUT + LSH TTT,7 + IOR TTT,T ;OR IN NEW CHAR + JRST PTXTS2 ;LOOP FOR ANOTHER CHAR + +PTXTFN: JUMPE TTT,CPOPJ ;IGNORE NULL WORDS + JRST PTXTF2 +PTXTF1: LSH TTT,7 +PTXTF2: TLNN TTT,776000 + JRST PTXTF1 + LSH TTT,1 + TRO TTT,1 + PUSHJ P,PUTWRD + SETZ TTT, ;CLEAR OUT TTT FOR ANOTHER WORD + POPJ P, + +PTXTS3: PUSHJ P,PTXTFN ;FLUSH OUT CURRENT WORD + MOVE TTT,-2(P) ;GET LAST X,Y + TLZ TTT,1 + ADD TTT,(P) ;MOVE ONE LINE + MOVEM TTT,-2(P) ;SAVE THIS AS LAST + TLO TTT,1 ;MAKE SURE THIS IS ON + PUSHJ P,PUTWRD + MOVE TTT,-1(P) ;SIZE WORD + PUSHJ P,PUTWRD + JRST PTXTS1 +>;MD + ;OUTPUT ROUTINES + +;PSETXY - CONVERT TO PLOT COORDS +;T = INTERNAL X,Y +;RETURNS +;T = Y (PLOT COORDS) +;TT = X (PLOT COORDS) + +MD,< +PSETXY: HLRE TT,T ;GET X + HRRES T ;GET Y + SUB TT,XOFF ;OFFSET + SUB T,YOFF ;OFFSET + SCALET (T) ;SCALE TO PLOTTER, AND SHIFT ONE FOR I/O + SCALET (TT) + POPJ P, +>;MD +PUTXY: +MD,< PUSHJ P,PSETXY + TRZ T,1 + TRZ TT,1 + TLO TTT,(TT) + TRO TTT,(T) +>;MD +MPC,< TRNN M,FLIP + JRST PUTXYF + TLC T,-1 ;INVERT X + ADD T,[2,,0] +PUTXYF: TDZ T,[1,,1] + TDO TTT,T +>;MPC +PUTWRD: SOSG IOHD+2 + OUT DAT, + CAIA + OUTSTR[ASCIZ/PLOT FILE OUTPUT ERROR! +/] + IDPB TTT,IOHD+1 + POPJ P, + +PONE: MOVEI TTT,1 + JRST PUTWRD + +PSTR: JUMPE T,PONE + FETCH(TTT,T,TSASC) + TRO TTT,1 + PUSHJ P,PUTWRD + FETCH(T,T,TSNXT) + TRNE TTT,376 + JRST PSTR + POPJ P, + +PCHRS: ADD T,[POINT 7,1] +PCHRS1: PUSHJ P,GETTT + POPJ P, + PUTBYT (C) + JRST PCHRS1 + +MD,< +PUTLIN: TLZ TTT,1 + TRO TTT,1 + JRST PUTWRD + +PINVS: PUSHJ P,ORIENT + ADD T,1(B) ;GET X,Y + TDZ T,[(1)1] + MOVEM T,SAVLOC ;SAVE IT + POPJ P, + +PVIS: PUSHJ P,ORIENT ;ORIENT IT + ADD T,1(B) ;ADD IN BODY CENTER + TDZ T,[(1)1] + EXCH T,SAVLOC + MOVEI TTT, + PUSHJ P,PUTXY + MOVE T,SAVLOC + MOVEI TTT,1 + JRST PUTXY + +VSIZES: TRNN F,400000 + JRST STDSIZ + MOVE TTT,STDBIG + MOVE TTT,PLTPTX(TTT) + IMUL TTT,CSCALE + LSH TTT,1 + TRO TTT,400001 + JRST PUTWRD + +STDSIZ: MOVE TTT,STDBIG + MOVE TTT,PLTPTX(TTT) + IMUL TTT,CSCALE + LSH TTT,1 + TRO TTT,1 + JRST PUTWRD +>;MD + +INIPCH: SETZM PCHBUF + MOVE TTT,[PUSHJ P,PLTCH] + EXCH TTT,PUTCHR + MOVEM TTT,PLTPSV + POPJ P, + +PLTCH: IOR TTT,PCHBUF + TLNN TTT,376000 + JRST [ LSH TTT,7 + MOVEM TTT,PCHBUF + POPJ P,] + SETZM PCHBUF +PLTCH2: LSH TTT,1 + TRO TTT,1 + JRST PUTWRD + +FINPCZ: MOVE TTT,PLTPSV + MOVEM TTT,PUTCHR + SKIPN TTT,PCHBUF + JRST PLTCH2 + JRST FNPCH2 + +FINPCH: MOVE TTT,PLTPSV + MOVEM TTT,PUTCHR + SKIPN TTT,PCHBUF + POPJ P, +FNPCH2: TLNE TTT,376000 + JRST PLTCH2 + LSH TTT,7 + JRST FNPCH2 diff --git a/src/draw/point.502 b/src/draw/point.502 new file mode 100644 index 00000000..a9bf843d --- /dev/null +++ b/src/draw/point.502 @@ -0,0 +1,3093 @@ +;POINT.FAI.93, 15-NOV-75 18:07:33, EDIT BY HELLIWELL +VERSION(POINT,8) +;STRAIGHTEN LINES (D) CHECK FOR COINCIDENT POINTS +MD,< +STRAIGHTEN: + TRO MCHG!NEEDCL + SKIPN A,PONPNT + POPJ P, +STRTN1: FETCH(TT,A,PXY) ;X,Y + PUSHJ P,PMOVX ;STRAIGHTEN X + PUSHJ P,PMOVY ;STRAIGHTEN Y + FETCH(A,A,PNXT) + JUMPN A,STRTN1 + POPJ P, +>;MD + +;STOP MOVING POINT - CHECK FOR TWO COINCIDENT POINTS +STOPM: +MPC,< FETCHL(TT,A,PBIT) + EQV TT,SID + JUMPL TT,SAMSTP + SKIPE B,PONPN2 + JRST STOPM0 + POPJ P, + +SAMSTP: +>;MPC + SKIPN B,PONPNT + POPJ P, +STOPM0: FETCH(T,A,PXY) +MD,< HRLM B,(P) + PUSHJ P,STOPM4 ;CHECK THIS POINT + POPJ P, ;FOUND LOSER + MOVE C,A ; BECAUSE STRAIGHTEN MIGHT HAVE MOVED THEM +DEFINE STPMAC ' (DIR) +< FETCH(A,C,PN'DIR) + JUMPE A,STPM'DIR + FETCH(T,A,PXY) + HLRZ B,(P) + PUSHJ P,STOPM4 + POPJ P, ;A LOSER! +STPM'DIR: +> + STPMAC(U) + STPMAC(D) + STPMAC(L) + STPMAC(R) + POPJ P, + +>;MD +STOPM4: CAMN T,ADDR(B,PXY) + JRST STOPM3 ;SAME X,Y +STOPM1: FETCH(B,B,PNXT) + JUMPN B,STOPM4 +MD,< JRST CPOPJ1 > +MPC,< POPJ P, > + +STOPM3: CAMN A,B ;SAME POINT THOUGH? + JRST STOPM1 + OUTSTR[ASCIZ/ +YOU JUST PUT ONE POINT ON TOP OF ANOTHER, +YOU'D BETTER FIX IT! +/] + POPJ P, ;ONLY SAY IT ONCE + ;PNTPUT +;CALL WITH +;T = X,Y FOR NEW POINT +;RETURNS WITH +;D = POINTER TO POINT + +HSHPUT: AOSA HSHFLG# ;MAKE FAST HASH ENTRY FOR NOW +PNTPUT: SETZM HSHFLG + PUSH P,A + PUSH P,B ;SAVE B + SETZB A,B + PUSH P,T ;SAVE X,Y + PUSHJ P,PUTPN0 ;CREATE ENTRY + POP P,T + STORE(T,D,PXY) ;DEPOSIT X,Y + JRST POPBAJ + +;PUTPNT: CREATES A POINT ENTRY ... +;CALL WITH: +; A = (TEXT?),,BPLOC +; B = BITS,,BODY POINTER +;RETURNS +; D = POINT CREATED + +PUTPNT: SETZM HSHFLG# +PUTPN0: PUSH P,T + PUSH P,TT + PUSH P,E + TRO NEEDCL ;MAY NEED ANOTHER CLOSES +MPC,< + TLZ B,FRONT ;CLEAR THIS BIT + IOR B,SID ;PUT IT ON CURRENT SIDE +ROUTE,< TLZ M,%ROUTE ;MAKE HIM ROUTE AGAIN> +>;MPC + TLNE B,ISPIN ;BODY POINT? + JRST [ PUSHJ P,MAKPIN ;MAKE BODY PIN + MOVE D,TT + STORE(B,D,BBODY) + STORE(A,D,BPLOC) ;PTR TO TYPE PINLOC BLOCK + HLRZ TT,A ;MAYBE TEXT PTR + STORE(TT,D,BPTXT) + HLRZ TT,B ;BITS + STORE(TT,D,BPBIT) + JRST PUTPN1] + PUSHJ P,MAKPNT ;MAKE NORMAL POINT + MOVE D,TT + AOS E,PID ;NEW POINT ID + STORE(E,D,PID) ;SAVE PID + STORE(A,D,PLOC) ;MAYBE CPIN + HLRZ TT,B ;BITS + STORE(TT,D,PBIT) + HLRZ TT,A ;MAYBE TEXT PTR + STORE(A,D,PTXT) +PUTPN1: SKIPE HSHFLG ;FAST ENTRY? + JRST PUTPN4 + MOVE T,D + HRLI T,PONPNT + MOVEM T,LSTPNT ;LAST POINT STORED AND ITS LAST + MOVE T,PONPNT + HRRZM D,PONPNT + HRRM T,(D) +PUTPN4: POP P,E + POP P,TT + POP P,T + POPJ P, + + ;ONSCR - CHECK T FOR ONSCREEN POINT + +ONSCR: CAML T,LEFT + CAMLE T,RIGHT + POPJ P, + HRRE TTT,T ;GET Y + CAML TTT,BOTTOM + CAMLE TTT,TOP + POPJ P, + AOS (P) ;DO THIS FOR SPEED + POPJ P, + +;ALTMODE, SPACE + +PNALT: TRZE INLIN + TRO NEEDCL +CLRMOV: TRZE INMOV ;TURN OFF MOVING + TRO NEEDCL + POPJ P, + +MD,< +PNSPC: TRNN INLIN + JRST CLRMOV + TRC ZIGZAG ;COMPLIMENT THE WAY THE ZIG ZAGS + POPJ P, +>;MD + ;NOT (D) +MD,< +PNOT: TRNE INLIN ;CHECK DRAWING LINE + PUSHJ P,GETCLS + JRST PERRET ;NO + PUSHJ P,PNOT1 + JRST PERRET + POPJ P, + +;A = POINT +PNOT1: MOVE B,LINING + FETCH(T,A,PXY) ;X,Y OF START POINT + ADJUST(SUB,T,) ;- X,Y OF DESTINATION + HRRE TT,T + HLRES T + MOVEI E,0 + MOVEI F,2 + SKIPGE T + MOVEI E,1 + SKIPGE TT + MOVEI F,3 + MOVMS T + MOVMS TT + CAMN T,TT ;45 DEGREES? + TRNN ZIGZAG ;YES, TAKE HINT FROM ZIGZAG + CAMLE T,TT ;HORZ OR VERT? + MOVE F,E ;HORZ, USE HORZ DISP. + JRST @(F)[ NRIGHT + NLEFT + NUP + NDOWN] +NRIGHT: FETCH(T,B,PNR) + JUMPN T,CPOPJ ;ONE THERE ALREADY, LOSE + FETCH(T,A,PNL) + JUMPN T,CPOPJ ;ONE LEFT OF DEST., LOSE + STORE(A,B,PNR) + STORE(B,A,PNL) + JRST NOUT + +NLEFT: FETCH(T,B,PNL) + JUMPN T,CPOPJ + FETCH(T,A,PNR) + JUMPN T,CPOPJ + STORE(A,B,PNL) + STORE(B,A,PNR) + JRST NOUT + +NUP: FETCH(T,B,PNU) + JUMPN T,CPOPJ + FETCH(T,A,PND) + JUMPN T,CPOPJ + STORE(A,B,PNU) + STORE(B,A,PND) + JRST NOUT + +NDOWN: FETCH(T,B,PND) + JUMPN T,CPOPJ + FETCH(T,A,PNU) + JUMPN T,CPOPJ + STORE(A,B,PND) + STORE(B,A,PNU) +NOUT: TRZ INLIN + TRO MCHG!NEEDCL + JRST CPOPJ1 + ;MINUS, PLUS (D) +PNMNS: TRNE INLIN ;CHECK DRAWING LINE + PUSHJ P,GETCLS + JRST PERRET + PUSHJ P,PNMNS1 ;TRY THE WAY WE ARE NOW + TRCA ZIGZAG ;CAN'T GO THIS WAY + POPJ P, + PUSHJ P,PNMNS1 ;TRY THE OTHER WAY TOO + TRCA ZIGZAG ;PUT IT BACK THE WAY WE FOUND IT + POPJ P, + JRST PERRET + +PNMNS1: MOVE B,LINING ;POINT COMING FROM + FETCH(TT,B,PXY) + FETCH(T,A,PXY) + XOR TT,T + TLNE TT,-1 + TRNN TT,-1 + JRST PNOT1 ;ONLY DIFFERENT IN ONE DIMENSION, GO DO PNOT + FETCH(TT,B,PXY) + SUB TT,T ;COMPUTE DIF BETWEEN POINTS, PLUS MEANS D OR L + SETZ C, + TRNE ZIGZAG ;WHICH WAY ARE WE GOING? + TROA C,1 ;VERT/THEN/HORIZ + MOVSS TT ;HORIZ/THEN/VERT + TLNN TT,400000 + XCT (C)[FETCH(TTT,A,PNU) ;ENDING DOWN + FETCH(TTT,A,PNR)] ;ENDING LEFT + TLNE TT,400000 + XCT (C)[FETCH(TTT,A,PND) ;ENDING UP + FETCH(TTT,A,PNL)] ;ENDING RIGHT + JUMPN TTT,CPOPJ ;LINE ENDS THERE ALREADY? + TRNN TT,400000 ;NOW CHECK POINT WE ARE COMING FROM + XCT(C)[ FETCH(TTT,B,PNL) ;STARTING LEFT + FETCH(TTT,B,PND)] ;STARTING DOWN + TRNE TT,400000 + XCT(C)[ FETCH(TTT,B,PNR) ;STARTING RIGHT + FETCH(TTT,B,PNU)] ;STARTING UP + JUMPN TTT,CPOPJ ;LINE STARTS THERE ALREADY? + PUSH P,CURSE + MOVEM T,CURSE + PUSH P,A + PUSHJ P,PLPNT ;MAKE A CORNER POINT + MOVE B,LINING ;GET POINTER TO NEW OLD POINT + POP P,D + PUSHJ P,PLENT ;ENTER THE LAST LINE + POP P,CURSE + TRZ INLIN + TRO NEEDCL!MCHG + JRST CPOPJ1 + +PPLUS: PUSHJ P,CLRMOV + TRNE INLIN ;ARE WE ALREADY DRAWING A LINE? + JRST PLPNT ;YES + PUSHJ P,GETCLS ;NO, DRAW IT TO CLOSEST POINT? + JRST PERRET +DOPLUS: MOVEM A,LINING ;... + TRZ ZIGZAG!INMOV ;START OUT HORIZ/THEN/VERT + TRO NEEDCL!INLIN + POPJ P, + ;MINUS, PLUS SUBRS (D) +;PLPNT - PLANT A CORNER POINT +;LINING = POINT COMING FROM + +PLPNTF: TRC ZIGZAG ;TRY THE OTHER WAY +PLPNT: MOVE B,LINING ;GET POINT WE ARE COMING FROM + MOVE T,CURSE ;GET CURSOR POSITION + CAMN T,ADDR(B,PXY) ;SHOULD BE DIFFERENT + POPJ P, + TRNN ZIGZAG ;WHICH WAY ARE WE GOING? + MOVE T,1(B) ;HORIZ, MAKE END-Y = START-Y + HLL T,CURSE ;GET CURSOR X + TRNE ZIGZAG ;WHICH WAY ARE WE GOING? + HLL T,1(B) ;VERT, MAKE END-X = START-X + CAMN T,1(B) ;STILL SHOULD BE DIFFERENT + JRST PLPNTF ;TRY THE OTHER WAY + PUSHJ P,PNTPUT ;CREATE THE POINT +;D = NEW POINT +;B = OLD POINT +PLENT: FETCH(T,D,PXY) + MOVEI A, + FETCH(TT,B,PXY) ;GET X,Y FOR OLD POINT + TRNE ZIGZAG ;WHICH WAY? + JRST PLENT1 ;VERT + MOVEI A,1 ;_ INSTEAD OF ^ + MOVSS T ;X,Y OF END-POINT + MOVSS TT ;LOOK AT X INSTEAD OF Y +PLENT1: SUB T,TT ;GET DIRECTION OF DIFFERENCE + MOVE TT,A + TRNN T,400000 ;WAS SIGN NEGATIVE? + ADDI A,2 ;NO, SWITCH WHICH IS LEFT & WHICH IS RIGHT + XCT (A)[FETCH(F,B,PND) ;GET OLD POINTER FROM OLD + FETCH(F,B,PNL) ;SEE ROT0 FOR COMMENTS:::: + FETCH(F,B,PNU) + FETCH(F,B,PNR)] + JUMPN F,PERRET ;LOSE IF LINE THERE ALREADY + XCT (A)[STORE(B,D,PNU) ;NEW TO OLD + STORE(B,D,PNR) + STORE(B,D,PND) + STORE(B,D,PNL)] + XCT (A)[STORE(D,B,PND) ;OLD TO NEW + STORE(D,B,PNL) + STORE(D,B,PNU) + STORE(D,B,PNR)] + TRC ZIGZAG ;CHANGE THE WAY WE GO + MOVEM D,LINING ;GO FROM NEW POINT + MOVEM D,MOVED ;BETTER CHECK IF ON TOP OF ANOTHER POINT + TRO MCHG + POPJ P, +>;MD + ;MAKE FEEDTHROUGH(|), PLUS (PC) +MPC,< +;SIMULATE +$1F1R+ +PLFEED: PUSHJ P,CLRMOV ;CAN'T BE MOVING + TRNE INLIN ;IF NOT DRAWING LINE + JRST PLFEDL + PUSHJ P,GETCLS ;FIND CLOSEST + JRST PERRET ;NONE + FETCH(T,A,PBIT) + TRNE T,ISPIN!CPIN!FEEDTH + JRST PERRET + MOVEM A,LINING ;THE REST IS THE SAME + TRO INLIN ;NOW IN LINE DRAWING MODE + JRST PLFDL0 + +PLFEDL: PUSHJ P,PPLUS0 ;SIMULATE PLUS + JRST PERRET ;CAN'T + +PLFDL0: MOVE G,LINING + PUSHJ P,RDFEED ;SIMULATE 1F + PUSHJ P,FUCKUP ;JUST MADE POINT, CAN'T LOSE + MOVE G,LINING + FETCH(B,G,PFEED) ;POINTER TO OTHER SIDE + FETCH(T,G,PBIT) + TRNN T,FEEDTH ;DID IT REALLY FEED THROUGH? + JRST PERRET + HRRZM B,LINING ;GO FROM OTHER SIDE NOW + SWITCH ;NOW WE'RE ON THE OTHER SIDE + POPJ P, + +PPLUS: PUSHJ P,PPLUS0 + JRST PERRET + POPJ P, + +PPLUS0: TRNE INLIN + JRST PLPNT + PUSHJ P,GETCLS + POPJ P, + MOVEM A,LINING + TRZ INMOV + TRO NEEDCL!INLIN + JRST CPOPJ1 + +;PLANT A POINT +PLPNT: MOVE T,CURSE + MOVE B,LINING + CAMN T,ADDR(B,PXY) ;WILL THIS MAKE COINCIDENT POINTS? + POPJ P, + PUSHJ P,PNTPUT + GETFS(E) + STORE(E,D,PNEB) ;WILL NEED NEIGHBOR BLOCK + SETZM 1(E) + HRLZM B,(E) ;LINK NEW TO OLD + MOVE T,B + PUSHJ P,FRLINK ;FIND LINK FOR OLD TO NEW + XCT (T)[PUTAB: HRLM D,(B) + HRRM D,1(B) + HRLM D,1(B)] + MOVEM D,LINING + MOVEM D,MOVED ;BETTER CHECK IF ON TOP OF ANOTHER POINT + TRO MCHG + JRST CPOPJ1 ;WIN RETURN + ;MINUS, FNDLNK (PC) +PNMNS: TRNE INLIN + PUSHJ P,GETCLS + JRST PERRET +PNMNS1: MOVE B,LINING ;ENTER HERE FROM LATTL + FETCH(B,B,PNEB) + PUSHJ P,FNDLNK ;ALREADY GOT A POINTER TO IT? + TRZA INLIN ;NO, MAKE IT! + JRST PERRET ;YES, SCREW HIM! + PUSH P,A + MOVE T,A + PUSHJ P,FRLINK + MOVE D,LINING + XCT (T)PUTAB + MOVE T,D + PUSHJ P,FRLINK + POP P,D + XCT (T)PUTAB + TRO MCHG!NEEDCL + MOVEI T,ANGLPG + JRST HYDPOG + +;FNDLNK - FIND MATCHING LINK +;B = PNEB LIST +;A = ITEM TO FIND +;SKIPS IF FOUND +;RETURNS B(PTR) T(SLOT#) (Suitable for PUTAB, GETAB) + +FNDL2: MOVEI T,2 +FNDL1: XCT (T)[GETAB: HLRZ TT,(B) + HRRZ TT,1(B) + HLRZ TT,1(B)] + CAIN TT,(A) + JRST CPOPJ1 + SOJGE T,FNDL1 + MOVE TT,B + HRRZ B,(B) +FNDLNK: JUMPN B,FNDL2 + POPJ P, + +;FIND FREE LINK (PC) +;T = POINT +FRLINK: FETCH(B,T,PNEB) + JUMPN B,FRLNK1 + GETFS(B) + SETZM 1(B) + SETZM (B) + STORE(B,T,PNEB) +FRLNK1: SETZ A, + PUSHJ P,FNDLNK + CAIA + POPJ P, + GETFS(B) + HRRM B,(TT) + SETZM (B) + SETZM 1(B) + MOVEI T,2 ;USE LAST FIRST + POPJ P, + +;OLD ROUTINE, USE FRLINK INSTEAD +NIL,< +FRELNK: HLRZ B,1(T) + JUMPN B,FRLNK1 + GETFS(B) + SETZM 1(B) + SETZM (B) + HRLM B,1(T) + JRST FRLNK1 +>;NIL +>;MPC + +;PLANT STUB (D) +MD,< + +STUBCC: TLOA T,400000 ;CCW AROUND BODY +STUBCW: MOVEI T,1 ;CW AROUND BODY + CAIA +STUB: SETZ T, + MOVEM T,CCW ;0 NO MOTION, - CCW, + CW + PUSHJ P,STBPIN ;FIND BODY PIN WE'RE AT NOW + JRST PERRET + PUSHJ P,STBSTP ;GET NEXT +STUBB1: PUSHJ P,DOPLUS ;START STUB FROM THERE + FETCH(T,A,BPX) + FETCH(TT,A,BPY) + ANDI E,3 + XCT MOVSTB(E) ;MOVE STUB OFF A LITTLE + HRLS T + HRR T,TT + JRST CHKON + +;STBPIN - FIND THE PIN WE ARE NEAR +;SKIPS IF FOUND +;A = PIN + +STBPIN: HRRZ A,LINING + TRNE INLIN ;DOING ANGLE? + JRST STBPI1 + PUSHJ P,GETCLS + POPJ P, +STBPI1: FETCH(T,A,PBIT) + TRNE T,ISPIN + JRST CPOPJ1 + PUSHJ P,FNDPIN ;FIND PIN FROM POINT + POPJ P, + JRST CPOPJ1 + +;FNDPIN - FIND PIN FROM POINT +;A = POINT +;SKIPS IF FOUND +;A = PIN + +FNDPIN: MOVEI D,20 ;CROCK, ELIMINATE INFINITE RECURSION +PINPN0: FETCH(T,A,PBIT) + TRNE T,ISPIN + JRST CPOPJ1 + SOJL D,PINPN1 + HRLM A,(P) +FOR I IN (PNR,PND,PNU,PNL) +< HLRZ A,(P) + FETCH(A,A,I) + SKIPE A + PUSHJ P,PINPN0 + CAIA + JRST CPOPJ1 +> +PINPN1: AOS D + POPJ P, + + +;STEP STUB CW/CCW +;A = CURRENT PIN +;CCW = MOTION, 0:THIS PIN, -:CCW, +:CW +;RETURNS +;A = NEW PIN +;E = SIDE OF BODY PIN ON + +STBSTP: MOVEM A,STBPNT + MOVE G,A + FETCH(H,G,BBODY) + MOVEM H,STBBDY + FETCH(H,H,BTYP) + PUSHJ P,CALSET ;CALC BODY'S X,Y CENTER + PUSHJ P,CALPIN ;WHICH SIDE OF BODY? + trc f,4 ;because of old convention + MOVE E,F + LSH E,-1 ;1,3,5,7  D,R,U,L + SKIPGE CCW + TRO E,4 + SKIPN CCW ;NEED TO STEP? + POPJ P, + MOVE G,STBPNT + FETCH(G,G,BPLOC) + FETCH(T,G,TPX) + MOVEM T,STUBX + FETCH(T,G,TPY) + MOVEM T,STUBY + JRST STBST0 + +STUBB: PUSHJ P,GETCLS ;START STUB ON BODY + JRST PERRET + MOVEM A,STBBDY + MOVEI T,PNTM + PUSHJ P,CHNGMD + MOVEI E,3+4 ;START ON LEFT SIDE, GO CCW + PUSHJ P,STBST1 + JRST STUBB1 + +;FIND NEXT PIN ALONG AROUND BODY +;E = SIDE OF BODY, DIRECTION OF TRAVEL (CW/CCW) +;STBBDY = BODY +;STBPNT = LAST POINT (IF ANY) +;(C,D = X,Y OF LAST POINT) +;RETURNS +;A = PIN + +STBST1: SETOM STBPNT ;ALLOW FIND OF ORIGINAL POINT +STBST0: MOVE A,STBBDY + FETCH(A,A,BLNK) + SETZM STBLAS + XCT STBMAX(E) ;INIT BEST SO FAR TO WORST +STBST2: CAMN A,STBPNT ;FIND NEXT PIN FOR STUB + JRST STBST9 + FETCH(B,A,BPLOC) + FETCH(T,B,TPX) + FETCH(TT,B,TPY) + XCT STBTST(E) ;FIND MIN POINT IN DIRECTION OF TRAVEL + JRST STBST9 + SKIPGE STBPNT ;STEPPING FROM A POINT? + JRST STBST3 + XCT STBLIM(E) ;FIND POINT BELOW OLD POINT + JRST STBST9 +STBST3: MOVE G,A ;YES, ALSO STILL ON SAME SIDE? + PUSHJ P,CALPIN + trc f,4 ;because of old convention + LSH F,-1 + XOR F,E + TRNE F,3 ;SAME SIDE? + JRST STBST9 + FETCH(C,B,TPX) + FETCH(D,B,TPY) + MOVEM A,STBLAS +STBST9: FETCH(A,A,BPLNK) + JUMPN A,STBST2 + SKIPE A,STBLAS ;FOUND ONE MORE ON THAT SIDE? + POPJ P, ;YES + HRRZ E,STBNXT(E) ;LOOK ON THE NEXT SIDE + JRST STBST1 + + ;TABLES FOR STUB STEPPER +;E = STUB SIDE, AND STEP DIRECTION +; 0 BOTTOM +; 1 RIGHT SIDE +; 2 TOP +; 3 LEFT SIDE +;+4 MEANS STEP IN CCW + +;SETUP FOR WORST, WE'RE LOOKING FOR MINIMUM IN DIRECTION OF TRAVEL +STBMAX: MOVSI C,400000 + MOVSI D,400000 + HRLOI C,377777 + HRLOI D,377777 + + HRLOI C,377777 + HRLOI D,377777 + MOVSI C,400000 + MOVSI D,400000 + +;TEST FOR BETTER MIN IN DIRECTION OF TRAVEL +STBTST: CAMGE T,C ;CW-BOTTOM, MIN IS BIGGEST X + CAMGE TT,D + CAMLE T,C + CAMLE TT,D + + CAMLE T,C + CAMLE TT,D + CAMGE T,C + CAMGE TT,D + +;BUT MINIMUM JUST BEFORE PREVIOUS POINT +STBLIM: CAMLE T,STUBX + CAMLE TT,STUBY + CAMGE T,STUBX + CAMGE TT,STUBY + + CAMGE T,STUBX + CAMGE TT,STUBY + CAMLE T,STUBX + CAMLE TT,STUBY + +STBNXT: 3 ;NEXT DIR, CW + 0 + 1 + 2 + + 4+1 ;NEXT DIR, CCW + 4+2 + 4+3 + 4+0 + +MOVSTB: SUB TT,STBSIZ ;DOWN + ADD T,STBSIZ ;RIGHT + ADD TT,STBSIZ ;UP + SUB T,STBSIZ ;LEFT + +>;MD + ;PNTPLC, PN2DEL +PNTPLC: TRNE INMOV!INLIN + JRST PERRET + MOVE T,CURSE ;GET CURSOR POSITION + PUSHJ P,PNTPUT ;MAKE A POINT + MOVE T,LSTPNT ;GET NEW POINT AND PREVIOUS POINTER + JRST SCLOSE + +;DELETE POINT, MERGE LINE IF POSSIBLE + +PN2DEL: PUSHJ P,GETCLS + POPJ P, + MOVE B,CLAST + EXCH B,A ;ThePoint in B, back-pointer in A +MD,< + MOVE T,ADDR(B,PND) + MOVE TT,ADDR(B,PNL) + JUMPE T,[JUMPE TT,DELPNT ;NO NEIGHBORS + TLNE TT,-1 ;NO VERT LINE THRU POINT + TRNN TT,-1 ;HORIZ LINE GOES THRU? + JRST PERRET + PUSHJ P,LMER1 ;YES MERGE + SETOM CLOSUP + JRST DELPNT] + TLNE T,-1 + TRNN T,-1 + JRST PERRET ;NO VERT LINE THRU POINT + JUMPE TT,[PUSHJ P,LMER0 ;ONLY VERT LINE + SETOM CLOSUP + JRST DELPNT] + TLNE TT,-1 + TRNN TT,-1 + JRST PERRET + SETOM CLOSUP ;BOTH HORIZ AND VERT + PUSHJ P,LMER0 + PUSHJ P,LMER1 + JRST DELPNT + +;MERGE TWO VERT LINES +;B = POINT +LMER0: FETCH(D,B,PNU) ;D = POINT TO TOP + FETCH(T,B,PND) ;T = POINT TO BOTTOM + STORE(D,T,PNU) + STORE(T,D,PND) + POPJ P, + +;MERGE TWO HORIZ LINES +;B = POINT +LMER1: FETCH(D,B,PNL) ;D = POINT TO LEFT + FETCH(T,B,PNR) ;T = POINT TO RIGHT + STORE(D,T,PNL) + STORE(T,D,PNR) + POPJ P, + +>;MD + ;DELETE POINT, MERGE LINES (PC) +;FALLS THRU + +MPC,< FETCH(C,B,PNEB) + JUMPE C,PERRET +;Look for two lines leaving from this point, error if not exactly 2 + SETZM 1(P) + SETZM 2(P) +D2LIN: MOVEI E,2 +D2LIN1: XCT (E)DELTAB ;Fetch(D,C,PNx) + JUMPE D,D2LIN2 + EXCH D,1(P) ;ADVANCE THE WORLD + EXCH D,2(P) + JUMPN D,PERRET ;NON-ZERO IF TOO MANY +D2LIN2: SOJGE E,D2LIN1 + HRRZ C,(C) + JUMPN C,D2LIN + SKIPN 2(P) ;FIND 2? + JRST PERRET ;NO +;Link left and right neighbors, omiting current point + AOBJN P,.+1 ;Save first neigbor + MOVE D,1(P) ;The second " + PUSH P,A ;(Save back-pointer of point for DELPNT) + MOVE A,B ;Current point + MOVE B,-1(P) ;Link first neighbor (B) to second (D) + PUSHJ P,D2LIN4 + MOVE B,D + MOVE D,-1(P) ;Now the other way + PUSHJ P,D2LIN4 +;Then delete the point + POP P,B ;Restore back-pointer + POP P,(P) + EXCH A,B ;Get a and b in right places + SETOM CLOSUP + JRST DELPNT ;AND DELETE + +;Link point (B) to (D), using slot that contained D +D2LIN4: FETCH(B,B,PNEB) + PUSHJ P,FNDLNK + PUSHJ P,FUCKUP + XCT (T)PUTAB + POPJ P, +>;MPC + ;DELPNT + +;PNTDEL - DELETE CLOSEST POINT +PNTDEL: PUSHJ P,GETCLS ;GET POINTER TO CLOSEST POINT + JRST PERRET + MOVE B,CLAST ;ALSO LAST POINTER + EXCH B,A ;INTO CORRECT AC'S + TRZ TFLG ;DON'T DELETE PINS + TRZE INMOV + TRO NEEDCL + JRST DELPNT ;THEN LEAP IN + +;DELPNL - DELETE POINT +;B = POINT +;DELPNT - DELETE POINT +;B = POINT +;A = PREVIOUS + +DELPNL: PUSHJ P,LNKSET ;SETUP A WITH LAST POINTER +DELPNT: TRO MCHG + TRZ INMOV + PUSH P,A ;SAVE LAST + FETCH(T,A,PNXT) + CAME T,B ;LAST SHOULD POINT TO THIS + PUSHJ P,FUCKUP + PUSHJ P,REMPNT ;REMOVE POINT FROM ANY SETS + PUSHJ P,KILPNT ;KILL LINES, TEXT + POP P,A ;RESTORE LAST + FETCHL(F,B,PBIT) + TRNE TFLG ;DELETE PINS? + JRST DELPOK ;YES + TLNE F,MPC,ISPIN ;IS IT A PIN? + POPJ P, ;YES, DON'T DELETE +DELPOK: TRO NEEDCL + FETCH(T,B,PNXT) + STORE(T,A,PNXT) +MPC,< FETCH(T,B,PFEED) + HRR F,T ;SAVE FEED THRU +>;MPC + TLNN F,CPIN + JRST NTCPIN + FETCH(T,B,PLOC) ;RETURN CPIN LOC BLOCK + FSTRET(T) +NTCPIN: PUSH P,B + FETCH(B,B,PTXT) + PUSHJ P,PUTFS ;RETURN TEXT + POP P,B + RETBLK(B,POINT) ;RETURN POINT +MPC,< TLNN F,FEEDTH ;IS IT A FEED THROUGH? + POPJ P, ;NO + CLRBIT(FEEDTH,TT,F,PBIT) ;MAKE SURE HE DOESN'T TRY TO GET BACK + HRRZ B,F + SWITCH + PUSHJ P,DELPNL ;DELETE POINT ON OTHER SIDE + SWITCH +>;MPC + POPJ P, + ;DELPNT SUBRS + +KILPNT: PUSHJ P,KILTXT ;FLUSH TEXT +ROUTE,> ;MAKE HIM ROUTE AGAIN + +MD,< +FOR LINK IN (PND,PNU,PNL,PNR) +< FETCH(D,B,LINK) + JUMPE D,.+3 + PUSHJ P,REMLIN + CLEAR(B,LINK) +> +>;MD + +;FOR PC, THERE MAY BE MORE THAN 4 NEIGHBORS +MPC,< + MOVE A,B + FETCH(C,B,PNEB) + JUMPE C,DELMER + PUSH P,C +DELIN: MOVEI E,2 +DELIN1: XCT (E)[DELTAB: HLRZ D,(C) + HRRZ D,1(C) + HLRZ D,1(C)] + JUMPE D,.+2 + PUSHJ P,REMLIN + SOJGE E,DELIN1 + HRRZ C,(C) + JUMPN C,DELIN + POP P,C +DELMER: PUSH P,B + CLEAR(B,PNEB) + MOVE B,C + JUMPE B,.+2 + PUSHJ P,PUTFS ;RETURN MULTIPLE NEIGHBOR LIST + POP P,B +>;MPC + FETCH(E,B,PNXT) + POPJ P, + +;PINPNT - CHANGE PIN TO POINT +;B = PIN + +PINPNT: FETCH(T,B,BPBIT) + TRNN T,ISPIN + PUSHJ P,FUCKUP +DBG,< MOVE T,[SIXBIT /POINT/] ;CHANGE STORAGE BLOCK TYPE + MOVEM T,-1(B) +>;DBG + AOS T,PID + STORE(T,B,PID) +MPC,< CLEAR(B,PFEED) > + CLEAR(B,PIN) + CLEAR(B,PLOC) + CLRBIT(ISPIN>,TT,B,PBIT) + POPJ P, + + ;REMOVE LINE + +MPC,< +;A = POINT BEING FLUSHED +;D = POINT TO UNLINK +REMLIN: PUSH P,B + FETCH(B,D,PNEB) + PUSHJ P,FNDLNK + CAIA + XCT (T)[ HRRZS(B) + HLLZS 1(B) + HRRZS 1(B)] + POP P,B + SETOM CLOSUP + POPJ P, + +>;MPC + +;REMOVE LINE +;B = POINT BEING FLUSHED +;D = POINT TO UNLINK +MD,< +REMLIN: + DEFINE FOO (LINK) +< FETCH(TT,D,LINK) + CAMN TT,B + CLEAR(D,LINK) +> + FOO (PND) + FOO (PNU) + FOO (PNL) + FOO (PNR) + SETOM CLOSUP + POPJ P, +>;MD + + ;LNKSET - SETUP A TO POINT TO PREVIOUS LINK +;B = POINT + +LNKSET: +MPC,< FETCHL(T,B,PBIT) + EQV T,SID + JUMPL T,LNKSTF ;WHICH SIDE IS IT ON?? + MOVEI A,PONPN2 ;OTHER SIDE + JRST LNKST1 + +LNKSTF: +>;MPC + MOVEI A,PONPNT ;CURRENT SIDE +LNKST1: FETCH(T,A,PNXT) + CAIN T,(B) ;DOES THIS GUY POINT TO US? + POPJ P, ;YES, RETURN + MOVE A,T + JUMPN A,LNKST1 + PUSHJ P,FUCKUP + MOVE A,B ;LINK BACK TO SELF + POPJ P, + ;DELNUL +DELNUL: TRZE INLIN!INMOV + TRO NEEDCL + TRZ TFLG ;DON'T DELETE PINS!!!!! + SETZM COUNT ;ZERO COUNT + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TYPE Y TO MARK NULL POINTS FOR FIND, +(ELSE ALL NULL POINTS WILL BE DELETED)/] + PUSHJ P,YORN + POPJ P, ;ALTMODE + JRST DELALL ;DELETE ALL + TLO ASK + SETZM FIND ;NONE FOUND YET + SKIPE E,PONPNT + PUSHJ P,ACLRP ;CLEAR FIND MARK BITS + MOVEI B,PONPNT + PUSHJ P,DNULL ;NOW MARK NULL POINTS +MPC,< SKIPE E,PONPN2 + PUSHJ P,ACLRP + MOVEI B,PONPN2 + PUSHJ P,DNULL +>;MPC + JRST FNDCNT + +DNULLA: PUSH P,A ;SAVE LAST POINTER +MD,< SKIPN ADDR(B,PND) + SKIPE ADDR(B,PNL) + JRST NODEL +>;MD +MPC,< + FETCH(TT,B,PNEB) + JUMPE TT,DLNCK1 +DLINCK: HLRZ TTT,(TT) + JUMPN TTT,NODEL + SKIPE 1(TT) + JRST NODEL + HRRZ TT,(TT) + JUMPN TT,DLINCK +DLNCK1: +>;MPC + FETCHL(TT,B,PBIT) + TDNE TT,[MPC,ISPIN,,MPC,<-1>] + JRST NODEL + FETCH(TT,B,PTXT) + JUMPN TT,NODEL + TLNN ASK + JRST NOASK + MOVSI TT,FOUNDP ;MARK POINT + IORM TT,ADDR(B,PBIT) + AOS FIND ;COUNT ANOTHER FOUND + JRST NODEL + +NOASK: MOVE A,(P) ;SETUP LAST POINTER + PUSHJ P,DELPNT + AOS COUNT + POP P,B + JRST DNULL + +NODEL: POP P,B ;PREVIOUS POINT + FETCH(B,B,PNXT) ;BACK TO THIS POINT +DNULL: MOVE A,B ;NOW ADVANCE + FETCH(B,B,PNXT) + JUMPN B,DNULLA + POPJ P, + + ;DELETE ALL + +DELALL: MOVEI T,1 + LSH T,@MODE + TDNE T,[1ALTM] + JRST PERRET + TLZ ASK + MOVEI B,PONPNT + PUSHJ P,DNULL +MPC,< MOVEI B,PONPN2 + PUSHJ P,DNULL +>;MPC +CNTOUT: TRO NEEDCL + TLNE M,DSKACT!MACACT + POPJ P, + OUTSTR[ASCIZ/ +/] + MOVE T,COUNT + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ NULL POINTS DELETED!/] + POPJ P, + + ;FIND DANGLING POINTS + +DANGLE: TRZE INLIN!INMOV + TRO NEEDCL + SETZM COUNT + SETZM FIND + SKIPE E,PONPNT + PUSHJ P,DODANG +MPC,< SKIPE E,PONPN2 + PUSHJ P,DODANG +>;MPC + TLNN M,DSKACT!MACACT + SKIPN T,COUNT + JRST FNDCNT + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ COINCIDENT POINTS OUT OF /] + JRST FNDCNT + +DODANG: PUSH P,E + PUSHJ P,ACLRP ;CLEAR MARK BITS + POP P,E +DANGA: SETO TTT, ;PREPARE COUNT + FETCHL(T,E,PBIT) + TDNE T,[MPC,ISPIN,,MPC,<-1>] + JRST COINA + TLNE T,MPC,CPIN + AOJG TTT,COINA +MD,< SKIPE ADDR(E,PND) ;ONLY COUNT EACH DIMENSION AS ONE + AOJG TTT,COINA + SKIPE ADDR(E,PNL) + AOJG TTT,COINA + FETCH(T,E,PTXT) + JUMPE T,DANGST ;NO CORNER, AND NO TEXT + AOJLE TTT,DANGST ;NO LINES AT ALL +>;MD +MPC,< FETCH(T,E,PTXT) + JUMPN T,COINA + FETCH(T,E,PNEB) + JUMPE T,DANGST +DANG0: MOVE TT,1(T) + TLNE TT,-1 + AOJG TTT,COINA + TRNE TT,-1 + AOJG TTT,COINA + MOVE T,(T) + TLNE T,-1 + AOJG TTT,COINA + TRNE T,-1 + JRST DANG0 + JRST DANGST +>;MPC + +;APPEARS OK, SEE IF IT IS COINCIDENT WITH ANY OTHER POINT +COINA: FETCH(T,E,PXY) + MOVE TT,E + JRST COINB + +COINC: CAMN T,ADDR(TT,PXY) + JRST DANGSC +COINB: FETCH(TT,TT,PNXT) + JUMPN TT,COINC +DANGB: FETCH(E,E,PNXT) + JUMPN E,DANGA + POPJ P, + +DANGSC: AOS COUNT ;COINCIDENT POINT +DANGST: AOS FIND ;DANGLING POINT + MOVSI T,FOUNDP + IORM T,ADDR(E,PBIT) + JRST DANGB + ;CHANGE PAD TYPES +MPC,< +CPADS: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TYPE PAD NUMBER TO CHANGE. +/] + PUSHJ P,READNC + MOVEM T,COUNT + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TYPE NEW PAD NUMBER. +/] + PUSHJ P,READNC + MOVEM T,COUNT2 + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TYPE Y TO BE ASKED ABOUT EACH ONE/] + PUSHJ P,YORN + POPJ P, + TLZA ASK + TLO ASK + MOVEI A,PONPNT + PUSHJ P,CPADSD + POPJ P, + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/DO OTHER SIDE/] + PUSHJ P,YORN + POPJ P, + POPJ P, + SWITCH + MOVEI A,PONPNT + PUSHJ P,CPADSD + JFCL + SWITCH + POPJ P, + +;COUNT = OLD PAD +;COUNT2 = NEW PAD +CPADS1: FETCH(T,A,PIN) + CAME T,COUNT ;IS THIS ONE TO CHANGE? + JRST CPADSD ;NO + FETCHL(T,A,PBIT) + TLNN T,FEEDTH ;IF DRILL HOLE + SKIPN COUNT ;OR FINDING OTHER THAN TYPE 0 + CAIA ;GO AHEAD + JRST CPADSD + TLNN ASK + JRST CPADS2 ;DON'T ASK + FETCH(T,A,PXY) + PUSHJ P,ONSCR ;ON SCREEN + PUSHJ P,PICSET ;NO, GET IT ON + FETCH(T,A,PXY) + MOVEM T,STARLOC ;LOC TO DISPLAY + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/THIS ONE/] + MOVEI T,UPSTAR + MOVEM T,SPDISP + MOVE T,[ASCID/CP/] + MOVEM T,SPMODT + MOVEI T,SPM ;SPECIAL POINTER MODE + PUSHJ P,TCHNGM ;TEMPORARY CHANGE + PUSHJ P,YORN + JFCL + JFCL ;IGNORE RETURN, WILL CHECK C AGAIN + PUSHJ P,RCHNGM ;RESTORE MODE + CAIE C,"Y" + CAIN C,"y" + JRST CPADS2 + CAIE C,ALTMOD + JRST CPADSD ;JUST SKIP THIS ONE + POPJ P, ;GIVE QUIT RETURN + +CPADS2: MOVE T,COUNT2 + STORE(T,A,PIN) ;STORE NEW PAD TYPE + TRO MCHG +CPADSD: FETCH(A,A,PNXT) + JUMPN A,CPADS1 + JRST CPOPJ1 +>;MPC + ;MAKE AND BREAK INNER PLANE CONNEX (PC) +MPC,< +PLANE: PUSHJ P,GETCLS + JRST PERRET + FETCHL(B,A,PBIT) + TLNN B,FEEDTH!ISPIN + JRST PERRET + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ PLANE NUMBER?/] + PUSHJ P,READNC + ADDI T,1 + CAILE T,7 + JRST PERRET ;LOSE +UNPLN1: TRO MCHG!NEEDCL + DPB T,[%%PLANES,,ADDR(A,PBIT)] + TLNN B,ISPIN + JRST CHKFED + ;ASSIGN ALL BODY PINS WITH SAME PIN # + FETCH(TTT,A,BPLOC) + FETCH(TTT,TTT,TPID) ;SAME PIN #? + FETCH(B,A,BBODY) + FETCH(B,B,BLNK) + JUMPE B,CPOPJ +PLOOP2: FETCH(C,B,BPLOC) + FETCH(C,C,TPID) + CAMN C,TTT ;SAME PIN NUMBER? + DPB T,[%%PLANES,,ADDR(B,PBIT)] ;YES, SET PLANE NUMBER +PLOOP1: FETCH(B,B,BPLNK) + JUMPN B,PLOOP2 + POPJ P, + +CHKFED: TLNN B,FEEDTH + POPJ P, + FETCH(TT,A,PFEED) + DPB T,[%%PLANES,,ADDR(TT,PBIT)] + POPJ P, + +UNPLAN: PUSHJ P,GETCLS + JRST PERRET + FETCHL(B,A,PBIT) + TLNN B,ISPIN!FEEDTH + JRST PERRET + MOVEI T,0 ;NO PLANE + JRST UNPLN1 + ;SET PAD TYPE, MAKE AND BREAK FEEDTHROUGHS (PC) +NPFEED: PUSHJ P,GETCLS + JRST PERRET + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PAD TYPE NUMBER?/] + PUSHJ P,READNC + STORE(T,A,PIN) ;SET NEW PAD TYPE + TRO MCHG + POPJ P, + +FEED: PUSHJ P,GETCLS + JRST PERRET + MOVE G,A + PUSHJ P,RDFEED + JRST PERRET + POPJ P, + +;RDFEED - CREATE FEEDTHROUGH TO OTHER SIDE +;G = POINT + +RDFEED: FETCH(A,G,PBIT) + TRNE A,FEEDTH!ISPIN!CPIN + POPJ P, + SWITCH ;MAKE POINT ON OTHER SIDE + FETCH(T,G,PXY) + PUSHJ P,PNTPUT + MOVE A,D + SWITCH + MOVSI T,FEEDTH + IORM T,ADDR(A,PBIT) + IORM T,ADDR(G,PBIT) + FETCH(T,A,PIN) + JUMPN T,.+3 + MOVEI T,1 ;DEFAULT PAD TYPE 1 + STORE(T,A,PIN) + FETCH(T,G,PIN) + JUMPN T,.+3 + MOVEI T,1 + STORE(T,G,PIN) + STORE(D,G,PFEED) + STORE(G,D,PFEED) + TRO MCHG + JRST CPOPJ1 + +UNFEED: PUSHJ P,GETCLS ;UNLINK FEEDTHRU + JRST PERRET + FETCH(B,A,PBIT) + TRNN B,FEEDTH + JRST PERRET + TRZ B,FEEDTH!PLANES + STORE(B,A,PBIT) + CLEAR(A,PIN) ;ZERO PAD# + FETCH(B,A,PFEED) + CLEAR(A,PFEED) + + CLEAR(B,PFEED) ;UNLINK OTHER SIDE OF FEEDTHRU + FETCH(A,B,PBIT) + TRZ A,FEEDTH!PLANES + STORE(A,B,PBIT) + CLEAR(B,PIN) ;ZERO PAD# + TRO MCHG!NEEDCL + POPJ P, +>;MPC + ;PIN #'S, CONNECTOR AND BODY (D) +MD,< +SETCPN: PUSHJ P,GETCLS + JRST PERRET + FETCH(B,A,PBIT) + TRNE B,ISPIN + JRST STPINN ;BODY PIN + MOVE T,[PUSHJ P,GETLCH] + MOVEM T,GTCHRX +CAGAIN: TLNN M,DSKACT!MACACT + OUTSTR @CPCUE + PUSHJ P,GTCONP + JRST INNERR + JRST [ +LAY,< CAIN C,TEXIST + JRST [ PUSHJ P,GETLIN ;SNARF LF + CAIE C,12 + JRST INNERR + SKIPG T,LAYLOC ;PICK UP CLOC PASSED FROM PC PROG + JRST [ SKIPN T + OUTSTR[ASCIZ/NO CONNECTOR LOC PASSED FROM PC PROG! +/] + SKIPE T + OUTSTR[ASCIZ/TOO MANY CONNECTOR LOC'S FOUND IN PC PROG! +/] + JRST CAGAIN] + HRRZM T,LETTER + JRST LNNLY] +>;LAY + CAIE C,12 + JRST INNERR + FETCH(B,A,PLOC) ;GET CPIN POINTER + JUMPE B,CPOPJ + CLEAR(A,PLOC) + FSTRET (B) + CLRBIT(CPIN!FIXCON!CPNBTS,T,A,PBIT) + CLEAR(A,PIN) ;CLEAR BITS AND BACKUP PIN NAME + SETOM CLOSUP + TRO MCHG + TRNE LMOVE + TRZN INMOV + POPJ P, + TRO NEEDCL + POPJ P,] +MD,< JFCL > ;DON'T CARE ABOUT BRS + CAIE C,12 + JRST INNERR + ;SETLET - SET LOCATION ONTO POINT +;LETTER = B-R-S,,PIN-LOC +;A = POINT + +;FALLS THRU +SETLET: +LNNLY: MOVE TT,LETTER + TLNE TT,-1 + SKIPN T,CRDLOC + JRST NOGLBC + XOR T,TT + TLNE T,-1 ;SAME CARD LOC OR NO GLOBAL? + JRST [ OUTSTR[ASCIZ/SORRY, CANNOT CHANGE CARD LOCATION WHILE GLOBAL CARD LOC IS IN FORCE! +/] + POPJ P,] + HRRZS LETTER +NOGLBC: FETCH(B,A,PLOC) ;GET OLD CPIN POINTER + JUMPN B,GOTFST + FETCH(B,A,PBIT) + TRZ B,CPNBTS + TRO B,FIXCON!CPIN ;MAKE IT GET FIXED INTIALLY + STORE(B,A,PBIT) + CLEAR(A,PIN) ;CLEAR BACKUP PIN NAME + GETFS(B) + STORE(B,A,PLOC) ;ADD LOCATION BLOCK + SETZM 1(B) ;CLEAR OFFSET + SETOM CLOSUP +GOTFST: PUSHJ P,UBACK + MOVE T,LETTER + MOVEM T,(B) + PUSHJ P,CPNBCK ;CHECK AND SET BITS + TRO MCHG!NEEDCL + FETCH(T,A,PBIT) + TRNN T,FIXCON ;CON NEED FIXING? + POPJ P, + JRST OFFCON + +;UBACK - SAVE BACKUP PIN IF SETTING WILD +;A = POINT +;LETTER = PIN LOCATION +UBACK: PUSH P,A + MOVE A,LETTER + PUSHJ P,QUPIN ;IS NEW PIN NAME WILD? + JRST UBACK0 + MOVE A,(P) + FETCH(B,A,PLOC) ;CPIN LOCATION BLOCK + MOVE A,(B) + PUSHJ P,QUPIN + JRST UBACK2 + JRST UBACK1 + +UBACK0: MOVE A,(B) + PUSHJ P,QUPIN + JRST UBACK1 ;OLD ONE NOT WILD, NO BACKUP +UBACK2: MOVE B,(B) + MOVE A,(P) + STORE(B,A,PIN) +UBACK1: POP P,A + POPJ P, + +;CPNBCK - CHECK FOR RULE ON WILD PIN +;A = CPIN +;T = PIN LOCATION +CPNBCK: PUSH P,A + MOVE A,T + PUSHJ P,QUPIN + JRST NUPIN + MOVE T,(P) ;THE CPIN + FETCH(T,T,PBIT) + DPB A,[POINT CPNBSZ,T,CPNBPS] ;ALWAYS SET RULE FROM LAST U PIN TYPED + MOVE A,(P) + STORE(T,A,PBIT) +NUPIN: POP P,A + POPJ P, + +;SET TERMINATION RULE + +STTRUL: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,PBIT) + TRNN T,CPIN + JRST PERRET + TLNE M,DSKACT!MACACT + JRST STTRL0 + OUTSTR[ASCIZ/CURRENT RULE NUMBER = /] + LDB T,[POINT CPNBSZ,T,CPNBPS] + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +/] +STTRL0: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/TYPE RULE NUMBER (0-3)?/] + PUSHJ P,READN + CAIN C,12 + JRST STTRL1 + CAIE C,"?" + JRST INNERR + PUSHJ P,GETCHR + CAIE C,12 + JRST INNERR + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/0 NO RULE +1 NO TERMINATION (U001-U199) +2 ?? (U200-U399) +3 TERMINATED (U400-U599) +/] + JRST STTRUL + +STTRL1: CAILE T,3 + JRST INNERR + PUSH P,A + FETCH(A,A,PBIT) + DPB T,[POINT CPNBSZ,A,CPNBPS] + MOVE T,(P) + STORE(A,T,PBIT) + POP P,A + POPJ P, + +;COPY TERMINATION RULE INTO MACRO + +CLTRUL: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,PBIT) + TRNN T,CPIN + JRST PERRET + MOVE B,A + PUSHJ P,SETTT + FETCH(B,B,PBIT) + LDB B,[POINT CPNBSZ,B,CPNBPS] + PUSHJ P,PUTTTN + JRST ITSTUF + ;SET BODY PIN # +;A = BPOINT +STPINN: TLNE M,DSKACT!MACACT + JRST STPIN0 + OUTSTR[ASCIZ/PIN NAME(/] + OUTSTR @PINCUE + OUTSTR[ASCIZ/)?/] +STPIN0: MOVE T,[PUSHJ P,GETLCH] + MOVEM T,GTCHRX + PUSHJ P,RPNAM + JRST INNERR + CAIE C,12 + JRST INNERR +;CALLED BY SWPPIN, SET PIN NAME +;A = PIN +;T = NEW PIN NAME +STPNN1: TLNE M,PLOCS + TRO MCHG +;Now set all BODY PINs that have same default PIN NAME + FETCH(B,A,BBODY) + MOVEI B,RADDR(B,BLNK,BPLNK) + FETCH(TT,A,BPLOC) + FETCH(TT,TT,TPNAM) + JRST STPIN1 + +STPIN2: FETCH(D,B,BPLOC) + FETCH(D,D,TPNAM) + CAMN D,TT ;SAME DEFAULT PIN NAME? + STORE(T,B,BPPN) +STPIN1: FETCH(B,B,BPLNK) + JUMPN B,STPIN2 + POPJ P, +>;MD + +STOCLC: PUSHJ P,GETCLS + JRST PERRET + PUSHJ P,SETTT ;SETUP MACRO TEXT POINTER + PUSHJ P,STFPLC ;STUFF IN CON OR PIN SPEC + JFCL + JRST ITSTUF ;IF NOT CPIN, STUFF A NULL MACRO + +;A = POINT + +STFPLC: MOVE E,A + FETCHL(B,A,PBIT) + TLNE B,CPIN + JRST STFCLC + TLNN B,ISPIN + POPJ P, + FETCH(D,A,BBODY) ;GET PIN'S BODY + AOS (P) + PUSH P,A +MD,< FETCH(T,D,BLOC) ;ANY LOCN SET? + JUMPE T,NSTFBL + MOVE A,ADDR(D,BSOC) +>;MD +MPC,< FETCH(T,D,BLN) ;LN SET? + JUMPE T,NSTFBL + MOVE A,ADDR(D,BLN) +>;MPC + PUSHJ P,SLTLPN ;STUFF BODY LOCATION +NSTFBL: +MD,< FETCH(A,E,BPPN) ;ANY PIN SET? + JUMPN A,STFPL1 +>;MD + FETCH(A,E,BPLOC) ;DEFAULT NAME FROM TYPE +MD,< FETCH(A,A,TPNAM) > +MPC< FETCH(A,A,TNAM) > +STFPL1: PUTBYT "(" + PUSHJ P,BPINPN + PUTBYT ")" + POP P,A + POPJ P, + +STFCLC: AOS (P) + PUSH P,A + FETCH(A,A,PLOC) + MOVE A,(A) + PUSHJ P,CSLTLP ;PRINT THE BAY/RACK/SLOT/LOC/PIN + POP P,A + POPJ P, + +BJUMP: PUSHJ P,GETCLS + JRST PERRET + FETCHL(C,A,PBIT) + TLNN C,ISPIN + JRST PERRET + FETCH(A,A,BBODY) + MOVEI T,BODM + PUSHJ P,CHNGMD ;CHANGE TO BODY MODE + FETCH(T,A,BXY) ;GET LOC OF BODY + JRST CHKON + ;MUNGING SUBROUTINES (PC) +MPC,< +MUSH: SKIPE A,DBODPN ;BODY POINTER + PUSHJ P,MUSHB + SKIPE A,PONPNT + PUSHJ P,MUSHP + TRO MCHG!NEEDCL + TRNE BTHSDS ;IF ON BOTH SIDES, MUNG BOTH SIDES + SKIPN A,PONPN2 + POPJ P, + +; MUSH POINTS + +MUSHP1: FETCHL(T,A,PBIT) + TLNE T,ISPIN!CPIN + POPJ P, + FETCH(TTT,A,PXY) + PUSHJ P,MUSHIT + STORE(T,A,PXY) + POPJ P, + +MUSHP: PUSHJ P,MUSHP1 + FETCH(A,A,PNXT) + JUMPN A,MUSHP + POPJ P, + +;MUSH BODIES +MUSHB1: FETCH(F,A,BORI) + FETCH(B,A,BLNK) + JUMPE B,CPOPJ ;NO PINS, NO MUSH + FETCH(TTT,B,BPXY) + PUSHJ P,MUSHIT ;MUSH THE PIN + MOVE TTT,T ;SAVE NEW X,Y OF PIN + FETCH(B,B,BPLOC) + FETCH(T,B,TPXY) ;X,Y FROM PIN TYPE BLOCK + ADDI F,2 ;ROTATE BACK TO BODY CENTER + ANDI F,3 ;MAKE SURE WE DON'T OVERFLOW + PUSHJ P,ORIENT + ADJUST(ADD,T,TTT) + STORE(T,A,BXY) ;STORE AS NEW BODY X,Y + PUSH P,A + PUSHJ P,BODFIX + POP P,A + POPJ P, + +MUSHB: PUSHJ P,MUSHB1 + FETCH(A,A,BNXT) + JUMPN A,MUSHB + POPJ P, + +MUSHIT: HRRE T,TTT + ASH T,-1 + IDIV T,STPSIZ + IMUL T,STPSIZ + ASH T,1 + HLRE TT,TTT + ASH TT,-1 + IDIV TT,STPSIZ + IMUL TT,STPSIZ + ASH TT,1 + HRL T,TT + POPJ P, + + ;SET MUSH + +STMUSH: PUSHJ P,GETCLS + JRST PERRET + TRO MCHG!NEEDCL + MOVE G,A + HLRZ G,(G) +STMSH1: HRRZ A,1(G) + JUMPE A,.+2 + PUSHJ P,MUSHP1 + HLRZ A,1(G) + JUMPE A,.+2 + PUSHJ P,MUSHB1 + HRRZ G,(G) + JUMPN G,STMSH1 + POPJ P, +>;MPC + ;LINE EDIT TEXT +STANFO,< +LODED: JUMPE T,CPOPJ ;DONE WHEN WE GET A ZERO + SETZ B, + HLRZ C,(T) ;SIZE + JUMPE C,LODED2 + CAIN C,1 ;SIZE 1? + JRST LODED2 ;YES, NO SPECIAL EFFECT + PTWR1S [ 0 + "\"] + JFCL + TRZE C,400000 + PTWR1S [ 0 + "V"] + JFCL + ADDI C,60 ;MAKE IT ASCIZ + PTWR1S B + JFCL +LODED2: ADD T,[POINT 7,1] +LODED1: ILDB C,T + PTWR1S B + JFCL ;IGNORE IF NOT SENT + TLNE T,760000 + JRST LODED1 + HRR T,-1(T) + TRNE T,-1 + JRST LODED1 + POPJ P, + +LODPNT: HLRZ T,(A) ;TO DATA BLOCK + HRRZ T,1(T) ;TO TEXT BLOCK + HLRZ T,(T) ;TO TEXT + JUMPE T,CPOPJ ;DON'T LOAD NO TEXT! + HRRZ T,(T) + JRST LODED ;LOAD IT + +PNTQ: PUSHJ P,GETCLS ;CURRENT POINT + JRST PERRET ;NONE + PUSHJ P,LODPNT ;LOAD IT UP +ZORQ: PUSHJ P,TXREAD ;READ IT BACK + CAIN C,ALTMOD ;END WITH ALTMOD? + JRST PUTFS ;JUST PUT BACK THIS STRING, NO CHANGE + SKIPG T + MOVE T,STDBIG + HRLM T,(B) + SKIPN 1(B) + JRST [ PUSHJ P,PUTFS ;NULL STRING, GIVE IT BACK + JRST PTKIL1] ;AND KILL ANY EXISTING TEXT + PUSH P,B ;SAVE STRING POINTER + HLRZ C,(A) + HRRZ C,1(C) + HLRZ D,(C) +NIL,< FETCH(D,A,PTXT) > + JUMPN D,[HRRZ B,(D) + PUSHJ P,PUTFS + JRST GTTBLK] + GETFS(D) + SETZM 1(D) ;0 INITIAL OFFSET + HRLM D,(C) ;LINK IT IN +NIL,< STORE(D,A,PTXT) > +GTTBLK: POP P,(D) ;STORE NEW STRING POINTER + TRO MCHG!NEEDCL +MD,< JRST FIXEM > ;FIX OFFSETS IF BITS ON +MPC,< POPJ P, > + +PNTZ: PUSHJ P,GETCLS ;CURRENT POINT + JRST PERRET ;NONO + PUSHJ P,LODPNT ;LOAD IT UP + PTWRS9 [ 0 + [BYTE(9)271,271,271,377,0]] ;CTRL1 999 BACKSPACE + JRST ZORQ ;AND READ IT BACK +>;STANFO + SUBTTL POINT TEXT +; PUT TEXT ON POINT + +PNTTXT: PUSHJ P,GETCLS ;GET POINTER TO CLOSEST POINT + JRST PERRET ;NONE +PNTTX3: TRNE INLIN ;DRAWING LINE? + PUSHJ P,[PUSHJ P,PLPNT ;MAKE CORNER + MOVE T,LINING + PUSHJ P,PNALT ;STOP LINE + PUSHJ P,SCLOSP ;AND SET CLOSEST POINT TO LINING + MOVE A,CLOSES + POPJ P,] + TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /TEXT? +/] + PUSHJ P,TXREAD ;READ IN THE TEXT + CAIN C,ALTMOD + JRST PUTFS ;JUST GIVE BACK FREE STORAGE AND LEAVE + FETCH(D,A,PTXT) ;GET OLD TEXT POINTER + SKIPN 1(B) ;NULL TEXT? + JRST [ PUSHJ P,PUTFS ;GIVE BACK NULL STRING + JRST PTKIL1] ;JUST KILL ORIGINAL TEXT(IF ANY) + TRO MCHG!NEEDCL ;THIS CHANGES SCREEN + JUMPE D,PNTTX1 ;CAN'T COPY IF NO OLD + JUMPGE T,PNTTX1 ;DON'T COPY IF EXPLICIT SIZE TYPED + FETCH(T,D,TCSTR) + FETCH(T,T,TSSIZ) ;GET OLD SIZE +PNTTX1: SKIPG T ;MAKE SURE WE HAVE POSITIVE SIZE + MOVE T,STDBIG + STORE(T,B,TSSIZ) ;STORE SIZE + GETBLK(T,TEXCOF) + STORE(B,T,TCSTR) + CLEAR(T,TCXY) ;0 INITIAL OFFSET + STORE(T,A,PTXT) ;DEPOSIT TEXT POINTER + ;DEC, MAYBE DEFAULT THE POLARITY LETTERS +MD,< +DEC,< PUSH P,D ;FIND DEFAULT POLARITY IF NEEDED + PUSH P,A + MOVE A,B + ADD A,[POINT 7,1] + PUSHJ P,PERMUT ;PERMUT SIGNAL TO GET H OR L OR ! + SKIPGE POLAR ;GOT H OR L? + JRST PNTTX4 ;YES, DONE + SKIPG POLAR ;IS IT ! + JRST NOEXCL ;NO +;Got "!", don't try to default H,L +;Delete the "!" off of the string, though. + MOVE A,(P) ;A = POINT + FETCH(A,A,PTXT) + FETCH(A,A,TCSTR) ;ACTUAL STRING + ADD A,[POINT 7,1] +PNTEX1: MOVE B,A ;REMEMBER 1 BEFORE START OF WHAT WE WANT + PUSHJ P,GETITZ + JRST PNTTX4 ;OH WELL, I THOUGHT IT WAS THERE + CAIE T," " ;FIND FIRST SPACE + JRST PNTEX1 +PNTEX3: PUSHJ P,GETITZ + JRST PNTTX4 + CAIN T," " ;SKIP OVER SPACES + JRST PNTEX3 + CAIE T,"!" ;! + JRST PNTEX1 ;GO BACK AND TRY AGAIN + PUSHJ P,GETITZ + SETZ T, + JUMPN T,PNTEX1 ;SHOULD BE AT END NOW + CAIA +PNTEX4: IDPB T,B + TLNE B,760000 + JRST PNTEX4 + HRRZ TTT,-1(B) + HLLZS -1(B) + SKIPE B,TTT + PUSHJ P,PUTFS ;RETURN REST OF STRING + JRST PNTTX4 + +GETITZ: TLNN A,760000 + JRST [ HRR A,-1(A) + TRNN A,-1 + POPJ P, + JRST .+1] + ILDB T,A + JUMPE T,GETITZ + CAIE T,";" ;THIS IS THE COMMENT CHAR + AOS (P) + POPJ P, + +;Default the H,L polarity +NOEXCL: MOVSI C,1 ;CLEAR MARKING BITS FOR DEFPOL + SKIPE A,PONPNT + PUSHJ P,CLRBTS + SETZM WDOLST ;CLEAR DO LIST + MOVE T,(P) + MOVE H,[1,,DEFPOL] + PUSHJ P,RECUR0 ;INSERT THIS PIN IN LIST + PUSHJ P,RECCHK ;NOW CHECK IT AND ITS CONNECTIONS FOR DEFAULT POLARITY + JRST PNTTX4 ;NONE FOUND + MOVE B,(P) ;PTR TO POINT + FETCH(B,B,PTXT) +PNTTX5: HRRZ B,(B) ;TEXT PTR + JUMPE B,PNTTX6 ;FOUND LAST BLOCK? + MOVE C,B + JRST PNTTX5 + +PNTTX7: TLNE C,760000 ;AT END OF WORD? + JRST PNTTX8 ;NO + GETFS(D) ;YES, TACK ON A NEW BLOCK + SETZM (D) + SETZM 1(D) + HRRM D,-1(C) ;LINK + HRR C,D +PNTTX8: ILDB D,C ;FIND FIRST NULL + JUMPN D,PNTTX7 + POPJ P, + +PNTTX6: ADD C,[POINT 7,1] + PUSHJ P,PNTTX7 ;FIND WHERE TO PUT IN POLARITY + MOVEI D," " + DPB D,C ;PUT IN SEPERATOR + PUSHJ P,PNTTX7 + MOVEI D,"H" ;ASSUME H + TRNN A,ASSH ;H OR L? + MOVEI D,"L" ;L + DPB D,C +PNTTX4: POP P,A + POP P,D +>;DEC +>;MD + +;MAYBE CHECK FOR NULL TEXT AND TEXT WITH TABS HERE + JUMPE D,CPOPJ + MOVE B,D ;PUT THE OLD TEXT BACK... + JRST PUTFS ;... ON FREE STORAGE + + ;STORE TEXT IN MACRO + +STOTXT: PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,PTXT) + SKIPE T + FETCH(T,T,TCSTR) +STOTXB: PUSHJ P,SETTT + JUMPE T,ITSTUF + FETCH(B,T,TSSIZ) + CAMN B,STDBIG ;OR STANDARD + JRST STOTX0 ;WE DON'T NEED ANYTHING IN FRONT + PUTBYT "\" + TRZE B,400000 ;IS IT VERTICAL + PUTBYT "V" + PUSHJ P,PUTTTN ;AND THE SIZE +STOTX0: ADD T,[POINT 7,1] +STOTX1: PUSHJ P,GETTT + JRST ITSTUF + PUTBYT (C) + JRST STOTX1 + +MD,< +;T +PNTTX2: PUSHJ P,GETCLS + JRST PERRET + PUSHJ P,PNTTX3 + JRST PTTOFF ;NOW GO FIX IT + +;Z +PUTOFF: PUSHJ P,GETCLS + JRST PERRET +PTTOFF: PUSHJ P,SETFXT + JRST FIXEM + +;Q +CONOFF: PUSHJ P,GETCLS + JRST PERRET +CNCOFF: PUSHJ P,SETFXC + JRST OFFCON ;THIS CAN'T AFFECT TEXT + +SETFXT: FETCH(TT,A,PTXT) + JUMPE TT,CPOPJ ;CAN'T SET IF NO TEXT + FETCH(TT,A,PBIT) + TRO TT,FIXTXT + SKIPE MOVFLG + TROA TT,FIXRHT + TRZ TT,FIXRHT + STORE(TT,A,PBIT) + POPJ P, + +SETFXC: FETCH(TT,A,PBIT) + TRNN TT,CPIN + POPJ P, + TRO TT,FIXCON + STORE(TT,A,PBIT) + POPJ P, + +;Z +UNOFFT: PUSHJ P,GETCLS + JRST PERRET +CLRFXT: CLRBIT(FIXTXT!FIXRHT,TT,A,PBIT) + POPJ P, + +;Q +UNOFFC: PUSHJ P,GETCLS + JRST PERRET +CLRFXC: CLRBIT(FIXCON,TT,A,PBIT) + POPJ P, + + ;OFFALL, OFFTXT, OFFCON (D) +OFFRHT: SETOM MOVFLG + POPJ P, + +NOFRHT: SETZM MOVFLG + POPJ P, + +OFFALL: SKIPN A,PONPNT + POPJ P, +OFFAL1: PUSHJ P,SETFXT + PUSHJ P,SETFXC + PUSHJ P,FIXEM + HRRZ A,(A) + JUMPN A,OFFAL1 + POPJ P, + +;ROUTINE TO RE-FIX ALL Z POINTS +FIXEM0: SKIPN A,PONPNT + POPJ P, +FIXEM1: PUSHJ P,FIXEM + HRRZ A,(A) + JUMPN A,FIXEM1 + POPJ P, + + ;OFFSET TEXT +;A = POINT + +OFFTXT: FETCH(B,A,PTXT) + JUMPE B,CPOPJ ;NO TEXT + FETCHL(D,A,PBIT) ;GET BITS FOR LATER + TLNE D,FIXTXT ;FIXING TEXT AT ALL? + PUSHJ P,LINSET ;DIRECTION TO HANG TEXT OFF END OF LINE + POPJ P, ;TOO COMPLEX, DON'T CHANGE IT + PUSHJ P,OFFCAL ;COUNT CHARS, GET MAX WIDTH, # LINES, CHAR SCALE FACTOR + SKIPE ULNFLG ;POSITION SO IT GETS UNDERLINED? + TLNE D,ISPIN ;NOT PINS WE DON'T + JRST NOULN + ADDI C,HMOVU-HMOVE +NOULN: TLNE D,ISPIN ;IS THIS A PIN? + ADDI C,HMOVP-HMOVE + CAIG C,1 ;L OR R? (AND NOT PIN OR UNDERLINE) + MOVE TT,TTT ; MAKE HEIGHT LOOK LIKE ONE LINE + XCT HMOVE(C) ;OFFSET X,Y + XCT MOVEV(C) ;OFFSET X (1 LINE, 1/2 LINE, ...) + SUB TT,TTT ;NORMALIZE VERTICAL DOWN 1 LINE + FETCH(TTT,B,TCSTR) + FETCH(TTT,TTT,TSSIZ) ;TEXT SIZE + MOVE TTT,VIRPTX(TTT) ;PT WIDTH OF ONE CHAR + ASH TTT,-1 ;NOW 1/2 + XCT HFUDGE(C) ;POSSIBLY FUDGE X PART + HRL TT,T + SKIPN ISVERT ;VERTICAL TEXT? + JRST NOFVRT + MOVS TT,TT ;YES, MAP TO -Y,X + TLC TT,-1 + ADD TT,[1,,0] +NOFVRT: CAMN TT,ADDR(B,TCXY) + POPJ P, + EXCH TT,ADDR(B,TCXY) + TRO MCHG + SKIPE ISVERT + POPJ P, ;QUIT NOW IF VERT + TLNE D,FIXRHT ;DOES HE WANT FIX RIGHT? + CAIE C,1 ;go LEFT? ( WON'T BE 1 IF WAS PIN!!) + POPJ P, ;ALL DONE +;Move point so that left edge of text stays in place + SUB TT,ADDR(B,TCXY) ;TEXT TO LEFT, BUT MOVE POINT, NOT LEFT EDGE OF TEXT + HLRE T,TT ;HOW MUCH MOVED IN X + FETCH(TTT,B,TCSTR) + FETCH(TTT,TTT,TSSIZ) ;SIZE OF TEXT + IMUL T,PLTPTX(TTT) + IDIV T,VIRPTX(TTT) ;ADJUST FOR DEVIATION OF PLOT CHARACTER SIZE + UNSCAL T ;CONVERT TO INTERNAL COORDS +COMMENT  + The character offset (TCXY) is in III display coords (!) that is so +that it doesn't get scaled with the drawing. We have to convert it to +internal drawing coords somehow to adjust the point position. This +conversion is a function of the current drawing scale. + When this is done at the scale where text looks "right", this will +adjust the point so that the left edge of the text stays fixed. + + HRLZ T,T + ADD T,ADDR(A,PXY) ;ADJUST X OF POINT + FETCH(TT,A,PNR) ;NOW LOOK AT OTHER END OF WIRE + FETCH(TT,TT,PXY) ;X,Y OF OTHER END! + SUB TT,[4,,0] + CAML T,TT + MOVE T,TT ;TO FAR, LIMIT TO JUST TO LEFT OF RIGHT END + STORE(T,A,PXY) + TRO NEEDCL ;MAYBE CHANGED CLOSEST + POPJ P, + ;OFFSET CONNECTOR BOX + +;OFFCON - OFFSET CONNECTOR BOX +;A = CONNECTOR PIN + +FIXEM: PUSHJ P,OFFTXT +OFFCON: FETCH(D,A,PBIT) + TRNE D,FIXCON ;FIXING CON? + TRNN D,CPIN ;CON? + POPJ P, ;NO, QUIT NOW + FETCH(B,A,PTXT) + PUSHJ P,LINSET ;SEE WHICH WAY LINE GOES + POPJ P, ;TOO COMPLEX, LEAVE IT ALONE + MOVE D,STDBIG + XCT CONTAB(C) ;T gets deltaX,,deltaY + JUMPE B,GOTCOF ;ANY TEXT? + PUSH P,T ;SAVE CON BOX OFFSET + PUSHJ P,OFFCAL ;CALC TEXT LENGTH, HEIGHT + XCT CTOTAB(C) + ADD TTT,(P) + HLRE TT,(P) + ADD T,TT + HRLZS T + HRR T,TTT + POP P,(P) + SKIPN ISVERT ;VETICAL TEXT? + JRST GOTCOF ;NO + MOVS T,T ;YES, MAP TO -Y,X + TLC T,-1 + ADD T,[1,,0] +GOTCOF: FETCH(B,A,PLOC) + CAMN T,1(B) + POPJ P, + MOVEM T,1(B) ;SET OFFSET + TRO MCHG + POPJ P, + ; + +;THESE 3 TABLES MUST MATCH THE ONES FOR PINS +HMOVE: SETZ T, ;go RIGHT no offset X + JFCL ;go LEFT full offset X + ASH T,-1 ;go UP center X + ASH T,-1 ;go DOWN center X + ASH T,-1 ;center center X + +MOVEV: ASH TT,-1 ;go RIGHT center Y + ASH TT,-1 ;go LEFT center Y + JFCL ;go UP full offset Y + SETZ TT, ;go down no offset + ASH TT,-1 ;center center Y + +HFUDGE: ADD T,TTT ;go RIGHT 1/2 char right fudge + SUB T,TTT ;go LEFT 1/2 char left fudge + JFCL + JFCL + JFCL + +;OFFSET TEXT, SO THAT IT IS UNDERLINED +;THESE 3 TABLES MUST MATCH THE ONES FOR POINTS +HMOVU: JFCL ;go RIGHT full offset left + SETZ T, ;go LEFT no offset + ASH T,-1 ;go UP center X + ASH T,-1 ;go DOWN center X + ASH T,-1 ;center center X + +VMOVU: JFCL ;go RIGHT full offset up + JFCL ;go LEFT " + JFCL ;go UP " + SETZ TT, ;go DOWN no offset + ASH TT,-1 ;center center Y + +HFUDGU: JFCL ;no fudges for underline mode + JFCL + JFCL + JFCL + JFCL + +;OFFSET TEXT ON PINS - put on top of line coming in +;THESE 3 TABLE MUST MATCH THE ONE FOR POINTS +HMOVP: JFCL ;go RIGHT left/up, over line coming in + SETZ T, ;go LEFT right/up, over " + SETZ T, ;go UP right, from line coming in + SETZ T, ;go DOWN up/right, next to line coming in + ASH T,-1 ;center + +VMOVP: JFCL ;UP 1 + JFCL ;UP 1 + SETZ TT, + JFCL ;UP 1 + ASH TT,-1 + +HFUDGP: SUB T,TTT ;LEFT ANOTHER HALF CHAR + ADD T,TTT ;RIGHT ANOTHER HALF CHAR + JFCL + JFCL + JFCL + + ;CONNECTOR OFFSET TABLES FOR NO TEXT +;A = POINT +;D = STDBIG CHAR SIZE +;RETURNS T= deltaX,,deltaY to position connector box +; (positions the first char of the connector string, +; connector boxes are drawn relative to that) + +CONTAB: PUSHJ P,CONR ;go RIGHT + PUSHJ P,CONL ;go LEFT + PUSHJ P,CONU ;go UP + PUSHJ P,COND ;go DOWN + PUSHJ P,CONU ;center + +;CONNECTOR BOXES ARE DRAWN WITH VECTORS PTY,,PTY SIZE. + +;go RIGHT - offset X=CH-Height/2, Y=-CH-Height/2 +CONR: MOVE T,VIRPTY(D) ;HEIGHT OF STD CHAR + ASH T,-1 + MOVN TTT,T + HRLZ T,T + HRR T,TTT + POPJ P, + +;go LEFT - offset X= -Text-Width - CH-Height/2, Y= -CH-Height/2 +CONL: PUSHJ P,CONCAL + IMUL T,VIRPTX(D) ;WIDTH OF CONNECTOR NAME IN PTS + MOVNS T + MOVN TT,VIRPTY(D) + ASH TT,-1 + ADD T,TT + HRLZ T,T + HRR T,TT + POPJ P, + +;go UP - offset X= -Text-Width/2, Y= 0 +CONU: PUSHJ P,CONCAL + IMUL T,VIRPTX(D) ;TIMES STD CHAR WIDTH + ASH T,-1 + MOVN T,T + HRLZ T,T + POPJ P, + +;go DOWN - offset X= -Text-Width/2, Y= -CH-Height +COND: PUSHJ P,CONCAL + IMUL T,VIRPTX(D) + ASH T,-1 + MOVN T,T + HRLZ T,T + MOVN TT,VIRPTY(D) + HRR T,TT + POPJ P, + + ;CONNECTOR BOX OFFSET TABLES, WITH TEXT ON POINT +;T = - WIDTH OF TEXT (IN PTS) +;TT = HEIGHT OF TEXT (IN PTS) +;TTT = HEIGHT OF 1 LINE OF TEXT +;RETURNS +;T = X DELTA +;TTT = Y DELTA + +CTOTAB: PUSHJ P,CTOR ;go RIGHT + PUSHJ P,CTOL ;go LEFT + PUSHJ P,CTOU ;go UP + PUSHJ P,CTOD ;go DOWN + PUSHJ P,CTOU ;center + +;TEXT-WIDTH+1/2,,0 +CTOR: MOVE TT,VIRPTX(D) ;WIDTH OF STANDARD CHAR + ASH TT,-1 + MOVNS T + ADD T,TT + SETZ TTT, + POPJ P, + +;-TEXT.WIDTH-1/2,,0 +CTOL: MOVN TT,VIRPTY(D) ;BOX STICKS OUT PT-Y + ASH TT,-1 + ADD T,TT + SETZ TTT, + POPJ P, + +;0,,-TEXT.HEIGHT-1/2 +CTOD: SETZ T, + MOVNS TTT + ASH TTT,-1 + SUB TTT,TT + POPJ P, + +;0,,TEXT.HEIGHT+1/2 +CTOU: SETZ T, + ASH TTT,-1 + ADD TTT,TT + POPJ P, + SUBTTL CALC HEIGHT AND LENGTH OF TEXT IN VIRTUAL CHAR POINTS (D) +;OFFCAL +;B = TEXT STRING WITH OFFSET BLOCK +;COUNT # OF LINES OF TEXT, LENGTH OF LONGEST LINE +;T = - WIDTH OF LONGEST LINE * CHAR SIZE FACTOR +;TT = # OF LINES HIGH * CHAR SIZE FACTOR +;TTT = CHARACTER SIZE FACTOR + +OFFCAL: FETCH(TT,B,TCSTR) + ADD TT,[POINT 7,1] + PUSH P,[0] + PUSH P,[1] ;AT LEAST ONE LINE + SETZ T, ;count # lines, max wid line +OFFCL1: TLNN TT,760000 + JRST [ HRR TT,-1(TT) + TRNN TT,-1 + JRST OFFCL2 + JRST .+1] + ILDB TTT,TT + JUMPE TTT,OFFCL1 + CAIN TTT,DBLARR ;LINE BREAK? + JRST [ CAMGE T,-1(P) + MOVEM T,-1(P) + SETZ T, + AOS (P) + JRST OFFCL1] + SOJA T,OFFCL1 ;COUNT CHARS IN CURRENT LINE + +OFFCL2: CAMGE T,-1(P) + MOVEM T,-1(P) + FETCH(TTT,B,TCSTR) + FETCH(TTT,TTT,TSSIZ) ;CHAR SIZE + TRZ TTT,400000 ;CLEAR VERT BIT + POP P,TT ;# LINES + POP P,T ;WIDTH OF BIGGEST LINE + IMUL TT,VIRPTY(TTT) ;HEIGHT OF TEXT IN PTS + IMUL T,VIRPTX(TTT) ;WIDTH OF TEXT IN PTS + MOVE TTT,VIRPTY(TTT) ;HEIGHT OF ONE LINE + POPJ P, + +;CONCAL - CALCULATE CONNECTOR PRINT SIZE +;A = POINT +;RETURNS T = CHARACTER COUNT + +CONCAL: SETZM CHRCNT + PUSH P,A + PUSH P,TT + PUSH P,B + PUSH P,PUTCHR + MOVE B,[AOS CHRCNT] + MOVEM B,PUTCHR + FETCH(A,A,PLOC) + MOVE A,(A) ;B-R-S,,PIN-LOC + PUSHJ P,CSLTLP ;PRINT CONN PIN NAME + POP P,PUTCHR + POP P,B + POP P,TT + POP P,A + MOVE T,CHRCNT + POPJ P, + + ;LINSET - COMPUTE DIRECTION OFF END OF LINE (IF ANY) +;A = POINT +;SKIPS +;RETURNS C = DIRECTION TO PUT CONNECTOR +; 0 - go RIGHT +; 1 - go LEFT +; 2 - go UP +; 3 - go DOWN +; 4 - no lines, center +;ISVERT = FLAG FOR VERT TEXT + +LINSET: SETZ C, + MOVEI T,ADDR(A,PNU) ;POINTER TO NEIGHBOR BLOCK + SKIPN TT,1(T) ;L OR R ? + JRST NOLROF + TLNE TT,-1 + TRO C,1 ;L + TRNE TT,-1 + TRO C,2 ;R +NOLROF: SKIPN TT,(T) ;UP OR DWN ? + JRST NOUDOF + TLNE TT,-1 + TRO C,4 ;DWN + TRNE TT,-1 + TRO C,10 ;UP +NOUDOF: XCT SETCTB(C) + SETZM ISVERT ;ASSUME NO VERT TEXT + FETCH(B,A,PTXT) + JUMPE B,CPOPJ1 ;LEAVE NOW IF NO TEXT + FETCH(TT,B,TCSTR) ;STRING + SKIPL (TT) ;VERT TEXT? + JRST CPOPJ1 ;NO + SETOM ISVERT ;IT IS VERTICAL + CAIN C,4 ;NO CHANGE IF NO LINES + JRST CPOPJ1 + TRCN C,2 ;MAP 90 DEGREES CW + TRC C,1 + JRST CPOPJ1 + +SETCTB: MOVEI C,4 + MOVEI C,0 ;LINE TO LEFT, GO RIGHT + MOVEI C,1 ;LINE TO RIGHT, GO LEFT + POPJ P, + MOVEI C,2 ;LINE DOWN, GO UP + POPJ P, + POPJ P, + POPJ P, + MOVEI C,3 ;LINE UP, GO DOWN + POPJ P, + POPJ P, + POPJ P, + POPJ P, + POPJ P, + POPJ P, + POPJ P, +>;MD + ;KILL TEXT (D,PC) +PTKILL: PUSHJ P,GETCLS ;GET POINTER TO CLOSEST POINT + JRST PERRET ;NONE +PTKIL1: TRNE TMOVE ;MOVING TEXT OFFSET? + PUSHJ P,CLRMOV ;YES, CLEAR MOVING + MOVE B,A +KILTXT: PUSH P,B + MOVE T,B + FETCH(B,B,PTXT) + JUMPE B,NKLTXT ;LEAVE IF NONE + CLEAR(T,PTXT) + CLRBIT(FOUNDP>,TT,T,PBIT) + TRO MCHG!NEEDCL ;CHANGES SCREEN AND BLINKING LETTER + PUSHJ P,PUTFS +MD,< PUSH P,A + PUSH P,C + PUSH P,D + MOVE A,-3(P) + PUSHJ P,OFFCON ;MAYBE FIX CON + POP P,D + POP P,C + POP P,A +>;MD +NKLTXT: POP P,B + POPJ P, + ;DELETE LINE (D) +;A = FIRST POINT,,OTHER POINT +MD,< +LINDEL: PUSHJ P,GETCLS ;CLOSEST LINE? + JRST PERRET + TRO MCHG!NEEDCL + HLRZ B,A + +DEFINE FOO (PND,PNU) +< FETCH(C,B,PND) + CAIN C,(A) + JRST [ CLEAR(B,PND) + CLEAR(A,PNU) + POPJ P,] +> + FOO(PND,PNU) + FOO(PNU,PND) + FOO(PNL,PNR) + FOO(PNR,PNL) + POPJ P, + ;LINES, SET MIDPOINT, MAKE JOG, ATTACH POINT (D) +NIL,< +BENDL1: +BENDL2: +LATTP1: +LATTP2: +>;NIL + +DEFINE BENDIT # (CBIT) +< +BENDL#CBIT: + PUSHJ P,GETCLS + JRST PERRET ;NO CLOSEST LINE. + MOVE T,CURSE ;USE CURSOR POS FOR MIDPOINT CALC + +LATTP#CBIT: ;ENTRY POINT FOR A IN LINE MODE + MOVEM T,DX3 ;SAVE POS TO BREAK LINE AT + TRO MCHG + HLRZ C,A + FETCH(E,A,PNU) + CAIN E,(C) + JRST BENDY#CBIT ;VERT LINE, C ABOVE A + FETCH(E,A,PNR) + CAIN E,(C) + JRST BENDX#CBIT ;HORZ LINE, C RIGHT OF A + EXCH A,C + FETCH(E,A,PNU) + CAIN E,(C) + JRST BENDY#CBIT + FETCH(E,A,PNR) + CAIN E,(C) + JRST BENDX#CBIT + POPJ P, + +; BENDX BENDY +; +; P1 ==== C C +; | | +; | | +; A ==== P2 P2 ==== P1 +; | +; | +; A +; +;IN THE CASE OF ONLY ONE MIDPOINT, P2 IS OMITTED + +DEFINE GARPLY $ (H1,PND,PNU,PNL,PNR) +< PUSH P,A ;POINT BELOW, OR TO LEFT + PUSH P,C ;POINT ABOVE, OR TO RIGHT + FETCH(T,C,PXY) + H$H1$H1 T,DX3 ;SET Y:(P1 IS DIRECTLY ABOVE C) + PUSHJ P,PNTPUT +IFE CBIT-2, ;REMEMBER POINT FOR HIGHER UPS! + PUSH P,D ;P1 +IFE CBIT-1,< + FETCH(T,A,PXY) + H$H1$H1 T,DX3 ;SET Y:(P1 IS DIRECTLY BELOW A) + PUSHJ P,PNTPUT + MOVE T,D ;T=P2 +> + POP P,E ;E=P1 +IFN CBIT-1,< + MOVE T,E ;ONLY MAKING ONE POINT +> + POP P,C + POP P,A + STORE(T,A,PNU) ;LINK A - P2 + STORE(A,T,PND) +IFE CBIT-1,< + STORE(E,T,PNR) ;LINK P2 - P1 + STORE(T,E,PNL) +> + STORE(E,C,PND) ;LINK P1 - C + STORE(C,E,PNU) + POPJ P, +> + +BENDX#CBIT: + GARPLY(L,PNL,PNR,PND,PNU) +BENDY#CBIT: + GARPLY(R,PND,PNU,PNL,PNR) +> + +BENDIT(1) ;MAKE DOUBLE MIDPOINT +BENDIT(2) ;MAKE SINGLE MIDPOINT + ;ATTACH POINT TO LINE (D) +LATT: MOVE A,CLOSES ;IF MOVING + TRZE INMOV ;STOP MOVING + JRST INATT ;BUT USE THE ONE WE WERE MOVING + SETZ A, ;FOR INLIN + TRNE INLIN + JRST INATT + PUSHJ P,GETCLS + JRST PERRET +INATT: MOVEM A,SAVP + MOVEI T,LINM + PUSHJ P,TCHNGM + PUSHJ P,GETCLS ;FIND CLOSEST LINE + JRST [ PUSHJ P,RCHNGM + SKIPN SAVP + TRO INLIN!NEEDCL + JRST PERRET] + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/THIS ONE/] + MOVEI T,UPSTAL + MOVEM T,SPDISP + MOVE T,[ASCID/AL/] + MOVEM T,SPMODT + MOVEI T,SPM ;SPECIAL POINTER MODE + PUSHJ P,TCHNGM + MOVE T,IPOINT ;GET INTERSECTION POINT + MOVEM T,STARLOC ;THIS IS LOC OF STAR + PUSHJ P,YORN + JFCL + JFCL + PUSHJ P,RCHNGM ;GET BACK OLD MODE + CAIE C,"Y" + CAIN C,"y" + CAIA + JRST [ SKIPN SAVP ;WERE WE INLIN? + TRO INLIN!NEEDCL;YES, STAY THERE + POPJ P,] + SKIPE T,SAVP ;IS THIS THE INLIN GUY + JRST GOTINT ;ALREADY GOT INTERSECTION POINT + MOVE T,IPOINT ;PUT POINT AT PERPENDICULAR INTERSECTION POINT + PUSHJ P,LATTP2 ;MAKE MIDPOINT + TRO INLIN ;TELL HIM ITS OK + MOVE A,SAVP ;SETUP A FOR LINE CALLS + PUSHJ P,PNMNS1 ;TRY - + CAIA ;LOSE + JRST ATTDON ;THEN IT WORKED + TRC ZIGZAG ;ELSE TRY THE OTHER WAY + MOVE A,SAVP + PUSHJ P,PNMNS1 + CAIA ;LOSE + JRST ATTDON ;YES + MOVE A,SAVP + PUSHJ P,PNOT1 ;TRY A STRAIGHT (SLANTED) LINE! + CAIA + JRST ATTDON + OUTSTR[ASCIZ/SORRY, YOU'LL HAVE TO HAVE ANOTHER +TICKET TO MAKE THIS CONNECTION. +/] + TRO INLIN!NEEDCL + POPJ P, + +ATTDON: TRO NEEDCL!MCHG + TRZ INMOV!INLIN + POPJ P, + +GOTINT: MOVEM T,LINING ;SAVE ORIGINAL POINT HERE + FETCH(T,T,PXY) ;USE THIS AS PLACE TO MAKE NEW POINT + PUSHJ P,LATTP2 ;MAKE A MIDPOINT + MOVE A,SAVP + MOVE T,LINING + FETCHL(T,T,PBIT) + TLNN T,ISPIN ;CAN'T REVERSE IF LINING IS ALREADY PIN + EXCH A,LINING ;MOVE TO LINE! + JRST LATTP ;ATTACH TO POINT WILL DO THE REST + ;ATTACH POINT TO POINT (D) +PATT: TRZE INMOV + JRST [ MOVE A,CLOSES ;USE THE ONE WE WERE MOVING + JRST PATT1] + TRNN INLIN + PUSHJ P,GETCLS + JRST PERRET +PATT1: MOVEM A,LINING + TRO INLIN!NEEDCL + PUSHJ P,GETCLS ;FIND CLOSEST(NOT INCLUDING CURRENT CLOSEST) + JRST [ TRZ INLIN + TRO NEEDCL + JRST PERRET] ;NO, JUST ONE POINT ON SCREEN + FETCH(T,A,PXY) + FETCHL(TT,A,PBIT) + TLNE TT,ISPIN + JRST [ EXCH A,LINING ;TRY IT THE OTHER WAY + FETCHL(TT,A,PBIT) + TLNN TT,ISPIN + JRST .+1 + OUTSTR[ASCIZ/SORRY, BOTH ARE PINS! +/] + TRZ INLIN + TRO NEEDCL + JRST PERRET] + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/THIS ONE/] + TRZ INLIN + MOVEM T,STARLOC + MOVEI T,UPSTAR + MOVEM T,SPDISP + MOVE T,[ASCID/AP/] + MOVEM T,SPMODT + MOVEI T,SPM + PUSHJ P,TCHNGM + PUSHJ P,YORN + JFCL + JFCL + TRO NEEDCL + PUSHJ P,RCHNGM + CAIE C,"Y" + CAIN C,"y" + CAIA + POPJ P, + TRO MCHG + ;FALLS THRU +; +LATTP: MOVEM A,DX1 + MOVE B,LINING + +DEFINE FOO (LINK,OTHER) +< FETCH(C,B,LINK) ;SIFT OUT THE INCESTUOUS LINKS + CAIN C,(A) + SETZ C, ;B pointed to A, flush + JUMPE C,[FETCH(C,A,LINK) ;B's link no good, use A's link + CLEAR(B,LINK) + CAIN C,(B) + SETZ C, ;A pointed to B, flush + JRST .+1] + STORE(C,B,LINK) + SKIPE C + STORE(B,C,OTHER) +> + FOO(PND,PNU) ;DOWN + FOO(PNU,PND) ;UP + FOO(PNL,PNR) ;LEFT + FOO(PNR,PNL) ;RIGHT +;TEXT + MOVE B,DX1 ;OLD + MOVE A,LINING ;NEW + FETCH(T,A,PTXT) ;ANY TEXT ON NEW? + JUMPN T,LGTXT1 ;YES, KEEP IT + FETCH(T,B,PTXT) + CLEAR(B,PTXT) + STORE(T,A,PTXT) ;COPY TEXT TO NEW + MOVSI TTT,FIXTXT!FIXRHT ;COPY BITS ALSO + ANDCAM TTT,ADDR(A,PBIT) + AND TTT,ADDR(B,PBIT) + IORM TTT,ADDR(A,PBIT) +LGTXT1: FETCH(T,A,PLOC) ;ANY CON OR PIN ON NEW? + JUMPN T,LGTXT2 ;YES + MOVSI TTT,CPIN + TDNN TTT,ADDR(B,PBIT) ;CPIN ON OLD? + JRST LGTXT2 ;NO + ANDCAM TTT,ADDR(B,PBIT) ;YES, TURN OFF + IORM TTT,ADDR(A,PBIT) ;AND TURN ON IN NEW + FETCH(T,B,PLOC) + STORE(T,A,PLOC) + CLEAR(B,PLOC) + MOVSI TTT,FIXCON!CPNBTS + ANDCAM TTT,ADDR(A,PBIT) + AND TTT,ADDR(B,PBIT) + IORM TTT,ADDR(A,PBIT) +LGTXT2: PUSHJ P,DELPNL ;DELETE B=OLD POINT + MOVE A,LINING + SETZM LINING + TRO NEEDCL!MCHG + TRZ INLIN!INMOV + FETCH(TT,A,PXY) + PUSHJ P,PMOVX + JRST PMOVY + ;BREAK JUNCTION OF 3 OR 4 LINES (D) +BREAKH: TRZA TFLG ;ZERO INDEX FOR HORZ +BREAKV: TRO TFLG ;20 INDEX FOR VERT + TRNN INLIN ;CAN'T BE INLIN + PUSHJ P,GETCLS + JRST PERRET + MOVE B,A + PUSHJ P,SETBTO ;SET MARK BITS FOR NON-EX NEIGHBORS + HLRZ F,F ;GET BITS + ANDI F,17 ;JUST LINE BITS + FETCH(T,B,PXY) ;SETUP FOR LIKELY CALL ON PNTPUT + XCT PERMIT(F) ;CHECK OK AND WHERE TO GO + TRZE INMOV ;SIMPLE CASES + TRO NEEDCL + TRO MCHG + PUSHJ P,PNTPUT ;D=NEW POINT + JRST (F)@[BRKNUP ;NO UP POINT + BRKNDN ;NO DOWN + BRKNRT ;NO RIGHT + BRKNLF] ;NO LEFT + +DEFINE FOO(PNU,PND,PNR,PNL) +< FETCH(T,B,PNR) ;PICKUP LINK TO FOLLOW NEW POINT + CLEAR(B,PNR) + STORE(T,D,PNR) ;MAKE IT "RIGHT" OF NEW POINT + STORE(D,T,PNL) ;MAKE NEW "LEFT" OF IT + STORE(D,B,PNU) ;MAKE NEW "UP" OF OLD + STORE(B,D,PND) ;MAKE OLD "DOWN" OF NEW + POPJ P, +> +BRKNUP: FOO(PNU,PND,PNR,PNL) ;PLACE NEW UP OF OLD +BRKNDN: FOO(PND,PNU,PNR,PNL) ;PLACE " DOWN " +BRKNRT: FOO(PNR,PNL,PNU,PND) ;PLACE " RIGHT " +BRKNLF: FOO(PNL,PNR,PNU,PND) ;PLACE " LEFT " + +WAY4: TRZE INMOV ;FLAGS + TRO NEEDCL + TRO MCHG + PUSHJ P,PNTPUT ;MAKE ANOTHER POINT THERE + FETCH(T,B,PNR) ;COPY OUR OLD RIGHT + STORE(T,D,PNR) ; MAKE THAT NEW POINT'S RIGHT + STORE(D,T,PNL) + CLEAR(B,PNR) + FETCH(T,B,PNU) + STORE(T,D,PNU) ;MAKE NEW POINT'S UP OUR OLD UP + STORE(D,T,PND) + CLEAR(B,PNU) + TRNN TFLG ;HOW TO CONNECT US? + JRST [ STORE(D,B,PNR) ;PUT NEW TO RIGHT + STORE(B,D,PNL) + POPJ P,] + STORE(D,B,PNU) ;PUT NEW POINT UP + STORE(B,D,PND) + POPJ P, + ;CASES FOR BREAKING JUNCTION +PERMIT: JRST WAY4 ;_   ^ CAN'T CALL IT 4WAY + MOVEI F,0 ;_   NO UP + MOVEI F,1 ;_  ^ NO DOWN + MOVEI F,0 ;_  DO LIKE NO UP + MOVEI F,2 ;_  ^ NO RIGHT + JRST PERRET ;_  + JRST PERRET ;_ ^ + JRST PERRET ;_ + MOVEI F,3 ;   ^ NO LEFT + JRST PERRET ;   + JRST PERRET ;  ^ + JRST PERRET ;  + MOVEI F,2 ;  ^ DO LIKE NO RIGHT + JRST PERRET ;  + JRST PERRET ; ^ + JRST PERRET + +>;MD + ;JUMP LINE TO OTHER SIDE OF CARD (PC) +MPC,< +LJUMP1: TLZA WFLAG ;USE WIRE LIST FLAG HERE +LJUMP2: TLO WFLAG ;AND HERE (WHOLE LINE) + TRZE INLIN!INMOV + TRO NEEDCL + PUSHJ P,GETCLS + JRST PERRET + PUSH P,A + HLRZ B,A + HRRZS A + TRZ TYPNEG + PUSHJ P,LSWITCH ;SWITCH THIS LINE AND IN ONE DIRECTION + POP P,A + TRZ TFLG + TRNE TYPNEG + TRO TFLG ;USE FEED THROUGH IF THERE + PUSHJ P,LSWA + TRO MCHG!NEEDCL + POPJ P, + +LSWA: TLNN WFLAG ;ARE WE DOING WHOLE LINE + POPJ P, + FETCHL(T,A,PBIT) + TLNE T,ISPIN!CPIN + POPJ P, ;IMPOSSIBLE + TRNN TFLG + TLNN T,FEEDTH + CAIA + POPJ P, + FETCH(C,A,PNEB) ;CHECK FOR ONLY ONE SEGMENT LEAVING + SETZ B, ;NOW COUNT SEGMENTS FROM THIS POINT +LSWA1: MOVEI T,2 +LSWA2: XCT (T)[HLRZ TT,(C) + HLRZ TT,1(C) + HRRZ TT,1(C)] + JUMPE TT,LSWA3 + JUMPN B,CPOPJ ;MORE THAN ONE + MOVE B,TT +LSWA3: SOJGE T,LSWA2 + HRRZ C,(C) + JUMPN C,LSWA1 + JUMPE B,CPOPJ ;NO MORE SEGMENTS? +LSWITCH:PUSH P,A + PUSH P,B + PUSHJ P,KILSEG ;KILL SEGMENT ON THIS SIDE + MOVE A,(P) + MOVE B,-1(P) + PUSHJ P,KILSEG ;BOTH DIRECTIONS + MOVE A,-1(P) + TRZ TFLG + PUSHJ P,OPNT ;MAKE SURE OF POINT ON OTHER SIDE + SETZM -1(P) ;THIS POINT WAS DELETED + PUSH P,B ;SAVE ITS POINTER + MOVE A,-1(P) ;AND OTHER END + TRZE TFLG + TRO TYPNEG + PUSHJ P,OPNT + SETZM -1(P) ;THIS POINT WAS DELETED + PUSH P,B + MOVE D,-1(P) + PUSHJ P,MAKSEG ;NOW MAKE SEGMENT ON NEW SIDE + POP P,D + POP P,B + PUSHJ P,MAKSEG ;BOTH DIRECTIONS + POP P,A + POP P,(P) + JUMPN A,LSWA ;LOOP TO NEXT SEGMENT + POPJ P, ;POINT WAS FEED THROUGH, AND WAS DELETED + ;LJUMP SUBRS (PC) +;CLEAR POINTER TO A FROM B +KILSEG: FETCH(B,B,PNEB) + PUSHJ P,FNDLNK + JRST KILLOS + XCT (T)[HRRZS (B) + HLLZS 1(B) + HRRZS 1(B)] + POPJ P, + +KILLOS: PUSHJ P,FUCKUP + POPJ P, + +;ADD POINTER TO D TO B +MAKSEG: MOVE T,B + PUSHJ P,FRLINK + XCT (T)PUTAB + POPJ P, + + ;OPNT +;FIND POINT ON OTHER SIDE, OR MAKE ONE, AND POSSIBLY DELETE ONE ONE THIS SIDE +;A = POINT +;RETURNS - SKIPS UNLESS POINT WAS DELETED +;B = POINT ON OTHER SIDE +;TFLG = WE MADE A FEEDTHRU + +OPNT: FETCHL(B,A,PBIT) + TLNN B,FEEDTH ;FEEDTHRU TO OTHER SIDE? + JRST OPNT1 + FETCH(TT,A,PFEED) + PUSH P,TT ;GET POINT ON OTHER SIDE + FETCH(TT,A,PNEB) + TLNN B,PLANES ;DON'T DELETE IF CONNECTED TO INNER PLANES +OPNTB: SKIPE 1(TT) ;DON'T DELETE IF STILL HAS LINES ON IT + JRST OPNTA + SKIPN TT,(TT) + JRST OPNTC ;ALL NULL SEGMENTS, OK TO DELETE + TLNE TT,-1 + JRST OPNTA + JRST OPNTB + +OPNTC: TLZ B,FEEDTH + STOREL(B,A,PBIT) + CLEAR(A,PFEED) + CLEAR(A,PIN) ;CLEAR PAD TYPE + HRRZ T,(P) ;POINT ON OTHER SIDE + CLEAR(T,PFEED) ;CLEAR POINTER BACK + CLRBIT(FEEDTH,TT,T,PBIT) + CLEAR(T,PIN) ;CLEAR PAD TYPE + HRRZ B,A + PUSHJ P,DELPNL ;DELETE ONE ON THIS SIDE +OPNTA: POP P,B ;AND RETURN POINTER TO ONE ON OTHER SIDE + POPJ P, + +OPNT1: TLNN B,ISPIN + JRST OPNT2 ;GUESS WE HAVE TO MAKE ONE + FETCH(T,A,BPLOC) ;TRY TO FIND COPY OF PIN ON OTHER SIDE + FETCH(B,A,BBODY) + FETCH(B,B,BLNK) ;PIN LIST FROM BODY +OPNT3: CAIN B,(A) ;SKIP THE SAME PIN + JRST OPNT4 + FETCH(TTT,B,BPLOC) + CAMN TTT,T + JRST CPOPJ1 ;SAME PIN IN DEF, IT MUST BE THE ONE +OPNT4: FETCH(B,B,BPLNK) + JUMPN B,OPNT3 + PUSHJ P,FUCKUP ;NOT THERE?!! + POPJ P, + +OPNT2: TLNN B,CPIN + JRST OPNT5 + SWITCH + FETCH(TTT,A,PXY) + PUSHJ P,FIND.P ;TRY TO FIND CONNECTOR PIN ON OTHER SIDE + SWITCH + HRRZ B,D + JRST CPOPJ1 + +OPNT5: MOVE G,A + PUSHJ P,RDFEED ;MAKE FEED THROUGH + PUSHJ P,FUCKUP ;CAN'T BE IMPOSSIBLE + HRRZ B,D + TRO TFLG ;TELL THEM WE MADE THIS FEED THROUGH + JRST CPOPJ1 + ;DELETE LINE, DELETE WIRE +LINDEL: PUSHJ P,GETCLS ;CLOSEST LINE? + JRST PERRET + TRO MCHG!NEEDCL +FLSHLN: HLRZ B,A + FETCH(B,B,PNEB) + PUSHJ P,FNDLNK + POPJ P, + XCT (T)[CLRTAB:HRRZS (B) + HLLZS 1(B) + HRRZS 1(B)] + MOVS A,A + HLRZ B,A + FETCH(B,B,PNEB) + PUSHJ P,FNDLNK + POPJ P, + XCT (T)CLRTAB + POPJ P, + +;DELETE WHOLE WIRE +LINDL2: PUSHJ P,GETCLS + JRST PERRET + TRO MCHG!NEEDCL + PUSHJ P,FLSHLN ;FLUSH LINE + HLRZM A,LINING ;SAVE ONE END HERE + HLLI A, ;CLEAR LEFT HALF + PUSHJ P,DELWIR ;DELETE THE WIRE + SKIPN A,LINING ;NOW THIS ONE + POPJ P, +DELWIR: FETCH(C,A,PNEB) + JUMPE C,DELWR1 + SETZ TTT, +DELWRA: MOVEI T,2 +DELWRB: XCT (T)[HLRZ TT,(C) + HRRZ TT,1(C) + HLRZ TT,1(C)] + JUMPE TT,DELWRC + JUMPN TTT,CPOPJ ;LEAVE IF SECOND + MOVE TTT,TT +DELWRC: SOJGE T,DELWRB + HRRZ C,(C) + JUMPN C,DELWRA + ;DELETE WIRE BETWEEN A,C + MOVE C,TTT +DELWR1: FETCHL(TT,A,PBIT) + TLNN TT,FEEDTH ;FEED THROUGH? + JRST DELWR2 + JUMPN C,CPOPJ ;2 THINGS, QUIT HERE + FETCH(C,A,PFEED) ;UNFEEDTHRU THE TWO POINTS + CLEAR(A,PFEED) + CLRBIT(FEEDTH,TTT,A,PBIT) + CLEAR(C,PFEED) + CLRBIT(FEEDTH,TTT,C,PBIT) +DELWR2: CAMN A,LINING + SETZM LINING ;NOTE WE DELETED THIS ONE + PUSH P,C + TRZ TFLG + MOVE B,A + PUSHJ P,DELPNL + POP P,A + JUMPN A,DELWIR + POPJ P, + ;PUT MIDPOINT IN LINE (PC) +BENDL: PUSHJ P,GETCLS + JRST PERRET + MOVE T,CURSE ;WHERE TO PUT MIDPOINT + PUSHJ P,BENDLP + JFCL + POPJ P, + +;ENTER HERE WITH LOCATION YOU WISH MIDPOINT TO BE PLACED IN T +;A = POINT1,,POINT2 +;T = WHERE TO PUT MIDPOINT + +BENDLP: PUSH P,A + PUSHJ P,PNTPUT + GETFS(E) + SETZM (E) + SETZM 1(E) + STORE(E,D,PNEB) + PUSH P,D + HLRZ A,-1(P) + HRRZ B,-1(P) + FETCH(B,B,PNEB) + PUSHJ P,FNDLNK ;FIND LINK FROM POINT2 TO POINT1 + JRST [ OUTSTR[ASCIZ/MOBY LOSSAGE AT BENDL! +/] + SUB P,[2,,2] + POPJ P,] + TRO MCHG + MOVE D,(P) + XCT (T)PUTAB ;LINK POINT2 TO NEW-POINT + FETCH(B,A,PNEB) + HRRZ A,-1(P) ;FIND LINK FROM POINT1 TO POINT2 + PUSHJ P,FNDLNK + PUSHJ P,FUCKUP ;LOSE BIG IF NOT FOUND + POP P,D + XCT (T)PUTAB ;LINK POINT1 TO NEW-POINT + FETCH(T,D,PNEB) + MOVE A,(P) + MOVEM A,1(T) ;LINK NEW-POINT TO BOTH + MOVE T,LSTPNT + PUSHJ P,SCLOSE ;SET CLOSES + POP P,(P) ;LOSE OLD CLOSEST + MOVEI T,PNTM ;MUST BE IN POINT MODE FOR THIS + PUSHJ P,CHNGMD + PUSHJ P,DOPMOV ;START MOVING MID-POINT + MOVEI T,BIGPG + AOS (P) ;INDICATE SUCCESS + JRST HYDPOG + ;ATTACH POINT TO POINT (PC) +PATT: TRZE INMOV + JRST [ MOVE A,CLOSES ;USE THE ONE WE WERE MOVING + JRST PATT1] + TRNN INLIN + PUSHJ P,GETCLS + JRST PERRET +PATT1: MOVEM A,LINING + TRO INLIN!NEEDCL + PUSHJ P,GETCLS + JRST [ TRZ INLIN + TRO NEEDCL + JRST PERRET] + FETCH(T,A,PXY) + FETCHL(TT,A,PBIT) + TLNE TT,ISPIN!CPIN!FEEDTH + JRST [ EXCH A,LINING ;TRY IT THE OTHER WAY + FETCHL(TT,A,PBIT) + TLNN TT,ISPIN!CPIN!FEEDTH + JRST .+1 + OUTSTR[ASCIZ/SORRY, BOTH ARE PINS OR FEEDTHROUGHS! +/] + TRZ INLIN + TRO NEEDCL + POPJ P,] + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +THIS ONE?/] + TRZ INLIN + MOVEM T,STARLOC + MOVEI T,UPSTAR + MOVEM T,SPDISP + MOVE T,[ASCID/AP/] + MOVEM T,SPMODT + MOVEI T,SPM + PUSHJ P,TCHNGM + PUSHJ P,YORN + JFCL + JFCL + TRO NEEDCL + PUSHJ P,RCHNGM + CAIE C,"Y" + CAIN C,"y" + CAIA + POPJ P, +PATTL: HRLM A,LINING ;POINT-TO-MOVE,,POSSIBLE PIN + HRRZ A,LINING + HLRZ C,LINING + FETCH(D,C,PNEB) + JUMPE D,NOMOVL + MOVE T,D +TLOOPS: SKIPE 1(T) ;CHECK FOR ANY NEIGHBORS TO COPY + JRST TLOOP0 + SKIPN T,(T) + JRST NOMOVL + TLNN T,-1 + JRST TLOOPS +TLOOP0: CLEAR(C,PNEB) ;MOVE NEIGHBORS ONTO IMMOVABLE POINT + FETCH(T,A,PNEB) + JUMPE T,[STORE(D,A,PNEB) ;WERE NONE, JUST STORE IN + JRST TLOOP9] + MOVE TT,T + HRRZ T,(T) ;NCONC TO OLD NEIGHBOR LIST + JUMPN T,.-2 + HRRM D,(TT) +;NOW FIND ANY SEGMENTS BETWEEN THE TWO ATTACHING POINTS +TLOOP9: MOVE C,D ;OLD NEIGHBOR BLOCK + HRRZ D,LINING ;KEPT POINT + HLRZ A,LINING ;POINT GOING AWAY +TLOOP: MOVEI TTT,2 +TLOOP1: XCT (TTT)[HLRZ B,(C) + HRRZ B,1(C) + HLRZ B,1(C)] + JUMPE B,TLOOPE + CAMN B,D ;DID THESE 2 POINT TO EACH OTHER? + JRST [ XCT (TTT)[HRRZS (C) ;YES, FLUSH THAT SEGMENT + HLLZS 1(C) + HRRZS 1(C)] + FETCH(B,B,PNEB) ;FIND BACK LINK + PUSHJ P,FNDLNK + JRST TLOOPE + XCT (T)[HRRZS (B) + HLLZS 1(B) + HRRZS 1(B)] + JRST TLOOPE] + FETCH(B,B,PNEB) ;CLOBBER BACK LINK THAT WAS TO OLD POINT + PUSHJ P,FNDLNK + CAIA + XCT (T)PUTAB ;MAKE IT POINT TO KEPT POINT +TLOOPE: SOJGE TTT,TLOOP1 + HRRZ C,(C) + JUMPN C,TLOOP +NOMOVL: HRRZ A,LINING ;KEPT POINT + HLRZ B,LINING ;GOING AWAY POINT + FETCH(T,A,PTXT) ;ANY TEXT ALREADY ON KEPT POINT + JUMPN T,LOSTXT ;YES + FETCH(T,B,PTXT) + STORE(T,A,PTXT) + CLEAR(B,PTXT) +LOSTXT: HLRZ B,LINING + PUSHJ P,DELPNL + SETZM LINING + TRO MCHG!NEEDCL + TRZ INLIN!INMOV + POPJ P, + ;ATTACH POINT TO LINE (PC) +LATT: MOVE A,CLOSES + TRZE INMOV ;STOP MOVING + JRST INATT + SETZM SAVP + TRNE INLIN + JRST INATT0 + PUSHJ P,GETCLS + JRST PERRET +INATT: MOVEM A,SAVP ;THIS IS POINT WE WILL ATTACH TO + JUMPE A,INATT0 + FETCHL(T,A,PBIT) + TLNE T,ISPIN!CPIN ;NOT THESE PLEASE! + JRST PERRET +INATT0: MOVEI T,LINM + PUSHJ P,TCHNGM + TRO NEEDCL + PUSHJ P,GETCLS + JRST [ PUSHJ P,RCHNGM + JRST ATTERR] + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/THIS ONE/] + MOVEI T,UPSTAL + MOVEM T,SPDISP + MOVE T,[ASCID/AL/] + MOVEM T,SPMODT + MOVEI T,SPM ;SPECIAL POINTER MODE + PUSHJ P,TCHNGM + MOVE T,IPOINT + MOVEM T,STARLOC ;THIS IS LOC OF STAR + PUSHJ P,YORN + JFCL + JFCL + PUSHJ P,RCHNGM ;GET BACK OLD MODE + SKIPN T,SAVP + SKIPA T,IPOINT + MOVE T,1(T) + CAIE C,"y" + CAIN C,"Y" + PUSHJ P,BENDLP + JRST ATTERR + TRZ INMOV + SKIPN A,SAVP + JRST LATTL + MOVEM A,LINING + MOVE A,CLOSES + EXCH A,LINING ;MOVE POINT TO LINE! + JRST PATTL ;PATT DOES THE REST + +LATTL: MOVE A,CLOSES + TRZ INLIN + TRO NEEDCL + JRST PNMNS1 ;MINUS TO MIDPOINT + +ATTERR: SKIPN SAVP + TRO INLIN!NEEDCL + TRZ INMOV + JRST PERRET +>;MPC diff --git a/src/draw/rep.337 b/src/draw/rep.337 new file mode 100644 index 00000000..b3165a07 --- /dev/null +++ b/src/draw/rep.337 @@ -0,0 +1,701 @@ +;REP.FAI.42, 15-NOV-75 18:07:41, EDIT BY HELLIWELL +VERSION(REP,2) +;REPLACEMENT FOR BODIES +; USES A CORRESPONDENCE LIST +; TPIN IN OLD TYPE ,, link +; PIN-ID ,, TPIN IN NEW TYPE + +;INITIALIZE CORLST FOR ALL PINS ON OLDTYP +REPLST: SKIPE B,CORLST + PUSHJ P,PUTFS ;RECLAIM OLD LIST, IF ANY + SETZM CORLST + MOVEI G,CORLST ;POINT TO IT + MOVE A,OLDTYP ;OLD BODY + FETCH(A,A,TPIN) + JUMPE A,CPOPJ +CORNXT: GETFS(T) + SETZM 1(T) + HRRM T,(G) ;LINK NEW BLOCK + MOVE G,T + HRLZM A,(G) ;SAVE TYPE PIN POINTER +CORPIN: FETCH(A,A,TPNX) + JUMPN A,CORNXT + POPJ P, + + ;REPSET - SET CORRESPONDENCES FOR REPLACEMENT +;A = TYPE TO REPLACE + +REPSET: MOVEM A,OLDTYP +MD,< MOVEI T,[ASCIZ/TYPE NEW BODY NAME +/] +>;MD + PUSHJ P,BODYGT + POPJ P, ;ALTMODE + POPJ P, ;NULL + JRST OOPS1 ;NX + MOVEM A,NEWTYP +REPST1: PUSHJ P,REPLST ;INTIALIZE CORLST +MD,< MOVE T,[ASCID/BR/] + MOVEM T,SPMODT + MOVEI T,SPM + PUSHJ P,TCHNGM + MOVEI T,UPREP + MOVEM T,SPDISP + PUSHJ P,PUSHM ;SET PIN IDS ON + PUSH P,H + PUSHJ P,REPAGN + CAIA + AOS -1(P) + POP P,H + PUSHJ P,POPM ;RESTORE STATE OF PIN IDS + JRST RCHNGM ;RESTORE OLD MODE +>;MD + ;REPAGN - ASK FOR REPLACEMENT MODE +REPAGN: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/REPLACEMENT MODE (H FOR HELP)?/] +MD,< SETZM KEEPIN ;CLEAR KEEP PINS FLAG + SETZM COPPRP ; " COPY PROPERTIES FLAG +>;MD +MAINTP: PUSHJ P,GETCHR + CAIL C,"A"+40 + CAILE C,"Z"+40 + CAIA + SUBI C,40 + CAIE C,12 + TLNE M,DSKACT!MACACT + CAIA + OUTSTR[ASCIZ/ +/] + CAIE C,"H" + CAIN C,"?" + JRST [ TVOFF + TLNN M,DSKACT!MACACT +MD,< OUTSTR[ASCIZ/CHAR MODE +E EXACT MATCH BY DEFAULT PIN NAME +N CLOSEST MATCH BY DEFAULT PIN NAME +L EXACT GEOMETRIC OVERLAY +C CLOSEST GEOMETRIC OVERLAY + ASK ABOUT EACH PIN + ABORT +M MAINTAIN PIN NAMES (PRECEEDS OTHER COMMANDS) +P COPY BODY TEXT AND PROPERTIES +/] +>;MD +MPC,< OUTSTR[ASCIZ/CHAR MODE +N MATCH BY PIN # +L EXACT GEOMETRIC OVERLAY +C CLOSEST GEOMETRIC OVERLAY + ASK ABOUT EACH PIN + ABORT +/] +>;MPC + TVON + JRST MAINTP] +MD,< CAIN C,"M" + JRST [ SETOM KEEPIN + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/MAINTAINING PIN NAMES./] + JRST MAINTP] + CAIN C,"P" + JRST [ SETOM COPPRP + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/COPYING PROPERTIES AND TEXT./] + JRST MAINTP] +>;MD + CAIN C,ALTMOD + POPJ P, +MPC,< CAIN C,"N" + JRST SAME +>;MPC +MD,< CAIN C,"N" + JRST CNMAT + CAIN C,"E" + JRST ENMAT +>;MD + CAIN C,"L" + JRST REPLOC + CAIN C,"C" + JRST REPCLS ;MORE FORGIVING THAN L + CAIE C,12 + JRST [ PUSHJ P,PERRET + JRST REPAGN] +;Set correspondences manually + MOVEI G,CORLST + TLNN M,DSKACT!MACACT +MD,< OUTSTR[ASCIZ/TYPE CORRESPONDENCE FOR PIN ID'S. +/] +>;MD +MPC,< OUTSTR[ASCIZ/TYPE CORRESPONDENCE FOR PIN NAMES. +/] +>;MPC + JRST GETIN + + ;GETPIN - ASK FOR CORRESPONDENCES +GETPIN: TLNE M,DSKACT!MACACT + JRST NOTALK +MD,< OUTSTR[ASCIZ/OLD PIN ID /] > +MPC,< OUTSTR[ASCIZ/OLD PIN NAME /] > + HLRZ T,(G) ;PIN IN DEF + FETCH(T,T,TPID) +MD,< PUSHJ P,DECOUT ;PRINT PIN ID +>;MD +MPC,< HRRZ A,T + PUSH P,PUTCHR + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUSHJ P,BPINPN ;PRINT AS BODY PIN# + POP P,PUTCHR +>;MPC + OUTSTR[ASCIZ/=/] +NOTALK: +MPC,< MOVE C,[PUSHJ P,GETLCH] + MOVEM C,GTCHRX + PUSHJ P,RPNAM + CAIA +>;MPC +MD,< PUSHJ P,READN > + CAIE C,12 + JRST [ PUSHJ P,SCARF + JRST REPST1 + JRST GETPIN] + SETZ A, + JUMPE T,NEWOK + MOVEI A,CORLST + JRST CHKNUM +;Check if the new PIN# already asked for +CHKNXT: HLRZ TT,1(A) ;NEW PIN NUMBERS ASKED FOR ALREADY + CAMN TT,T + JRST [ TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ALREADY USED! +/] + JRST GETPIN] +CHKNUM: HRRZ A,(A) + JUMPN A,CHKNXT + MOVE A,NEWTYP + FETCH(A,A,TPIN) + JRST NEWCH1 +;Check if the PIN# asked for is in new TYPE +NEWNXT: FETCH(TT,A,TPID) + CAMN TT,T + JRST NEWOK +NEWCHK: FETCH(A,A,TPNX) +NEWCH1: JUMPN A,NEWNXT + TLNN DSKACT!MACACT + OUTSTR[ASCIZ/NO SUCH PIN IN NEW TYPE! +/] + JRST GETPIN + +NEWOK: HRLM T,1(G) ;PIN# ASKED FOR + HRRM A,1(G) ;THAT PIN IN NEW TYPE +GETIN: MOVE H,G + HRRZ G,(G) + JUMPN G,GETPIN + ;SAMEDN - FINISH UP CORLST WITH ALL OTHER PINS ON NEWTYP +;FALLS THRU +SAMEDN: MOVE G,NEWTYP + FETCH(G,G,TPIN) + JRST REPNW9 + +REPNEW: GETFS(T) + HRRZM G,1(T) + EXCH T,CORLST + HRRZM T,@CORLST +REPNW1: FETCH(G,G,TPNX) +REPNW9: JUMPE G,CPOPJ1 + FETCH(T,G,TPID) ;A PIN ON NEW TYPE + SKIPN A,CORLST ;CHECK IF ALREADY ON CORLST + JRST REPNEW +REPNW3: HLRZ TT,1(A) + CAMN TT,T + JRST REPNW1 ;OK, IT'S THERE +REPNW2: HRRZ A,(A) + JUMPN A,REPNW3 + JRST REPNEW ;NOT THERE, CONS NEW ENTRY ONTO CORLST + ;SAME - CORRESPOND TO SAME PIN# IN NEWTYP +MPC,< +;SETUP CORRESPENDENCES - SAME PIN# IN NEWTYP +SAME: SKIPN G,CORLST ;RUN DOWN CORLST + JRST SAMEDN +SAME4: HLRZ T,(G) ;OLD PIN (IN TYPE) + FETCH(T,T,TPID) ;ITS PIN # + MOVE A,NEWTYP + FETCH(A,A,TPIN) + JUMPE A,SAME3 +SAME2: FETCH(TT,A,TPID) + CAME T,TT ;SAME PIN IN NEW TYPE? + JRST SAME1 + HRRZM A,1(G) ;REMEMBER NEW PIN (IN TYPE) + HRLM T,1(G) ; " PIN # +SAME3: HRRZ G,(G) + JUMPE G,SAMEDN + JRST SAME4 + +SAME1: HRRZ A,(A) + JUMPN A,SAME2 + JRST SAME3 +>;MPC + +;AUTO REPLACE +MPC,< +REPCL1: PUSHJ P,REPLST ;INITIALIZE CORLST +>;MPC +REPLOC: ;OFFSET CRAP GOES HERE + PUSHJ P,REPCL4 + JRST RPLERR + JRST SAMEDN + +RPLERR: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +SORRY, NO EXACT MATCH BY GEOMETRIC OVERLAY POSSIBLE. +/] + JRST REPST1 + +;FIND CLOSEST PIN YET UNREPLACED +;A = PIN IN NEW TYPE +;RETURNS +;CURPIN = PIN FOUND CLOSEST +;CURDIS = DISTANCE " +FCLONE: SETZM CURPIN ;NO CLOSEST YET! + HRLOI T,77777 ;LARGE NUMBER + MOVEM T,CURDIS ;CURRENT CLOSEST DISTANCE +REPL3: SKIPE 1(G) ;HAVE WE FOUND THIS ONE YET? + JRST REPL2 ;YES, SKIP IT + HLRZ T,(G) ;POINTER TO OLD PIN TYPE BLOCK + FETCH(T,T,TPXY) ;OLD PIN LOCATION + ADJUST(SUB,T,) + HLRE TT,T + HRRES T + IMUL T,T + IMUL TT,TT + ADD T,TT ;SQUARE OF DISTANCE + CAML T,CURDIS ;SMALLER? + JRST REPL2 ;NO + MOVEM T,CURDIS ;UPDATE + MOVEM G,CURPIN +REPL2: HRRZ G,(G) ;ANOTHER MEMBER OF CORLST + JUMPN G,REPL3 + POPJ P, + ;GEOMETIC OVERLAY FOR DIFF NUMBER OF PINS +%MAX__20 ;MAX SEPARATION BETWEEN PINS IN ORDER TO MATCH! + +REPCLS: ;OFFSET STUFF GOES HERE ??? + PUSHJ P,REPCL4 + JFCL ;THIS VERSION DOESN'T CARE + JRST SAMEDN + +REPCL4: SKIPN CORLST + POPJ P, + MOVE A,NEWTYP + FETCH(A,A,TPIN) + JUMPE A,CPOPJ + HRLOI B,77777 + SETZ H, ;NONE FOUND YET +REPCL2: FETCH(T,A,TPID) + HRL A,T ;PIN#,,PIN + TRZ TFLG + MOVE G,CORLST +REPCL5: CAMN A,1(G) ;IS IT MAPPED YET? + JRST REPCL3 ;YES, TRY ANOTHER + HRRZ G,(G) + JUMPN G,REPCL5 + TRO TFLG ;FLAG UN-MAPPED NEW PIN SEEN + MOVE G,CORLST ;NOT USED YET, CHECK DISTANCE + PUSHJ P,FCLONE ;FIND ONE + SKIPN CURPIN ;DID WE FIND ONE + POPJ P, ;NO, RAN OUT OF CORLST I GUESS + CAMG B,CURDIS ;IS IT CLOSEST YET? + JRST REPCL3 ;NO + MOVE B,CURDIS + MOVE H,CURPIN ;SAVE CLOSEST YET + HRL H,A ;SAVE BOTH POINTERS +REPCL3: HRRZ A,(A) + JUMPN A,REPCL2 ;LOOP THROUGH ALL + JUMPE H,REPCL6 + CAILE B,%MAX*%MAX ;TO FAR APART? + POPJ P, + HLRZ A,H ;GET POINTER TO NEW PIN + FETCH(T,A,TPID) + HRL A,T ;AND PIN ID + MOVEM A,1(H) ;AND SAVE HERE + JRST REPCL4 ;LOOP UNTIL ALL ASSIGNED + +REPCL6: TRNE TFLG ;ALL NEW PINS MAPPED? + POPJ P, ;NO, LOSE RETURN + MOVE H,CORLST +REPCL7: SKIPN 1(H) ;THIS OLD PIN MAPPED? + POPJ P, ;NO, LOSE + HRRZ H,(H) + JUMPN H,REPCL7 + JRST CPOPJ1 ;ALL OLD PINS MAPPED, WIN + ;MAP BY DEFAULT PIN NAMES +MD,< +CNMAT: PUSHJ P,DONMAT ;BEST MATCH BY DEFAULT PIN NAMES + JFCL + JRST SAMEDN + +;AUTO REPLACE + +REPCL1: PUSHJ P,REPLST ;INITIALIZE CORLST + SETOM KEEPIN ;MAKE SURE WE KEEP PINS + SETOM COPPRP ;AND PROPERTIES + +ENMAT: PUSHJ P,DONMAT ;EXACT MATCH ONLY, BY DEFAULT PIN NAMES + JRST ENERR + JRST SAMEDN + +ENERR: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +SORRY, NO EXACT MATCH BY DEFAULT PIN NAME POSSIBLE. +/] + JRST REPST1 + + ;DONMAT - MATCH PINS BY DEFAULT PIN NAMES, TRIES ITS DAMNDEST +DONMAT: SKIPN CORLST + POPJ P, + TRZ TFLG!ATLP ;TFLG MEANS MATCH WASN'T EXACT +;Clear mark bits on all PINs of new TYPE + MOVE A,NEWTYP + FETCH(A,A,TPIN) + JUMPE A,CPOPJ +DONMT0: CLRBIT(DPTMP1!DPTMP2,TT,A,TPBIT) + FETCH(A,A,TPNX) + JUMPN A,DONMT0 + MOVE A,NEWTYP + FETCH(A,A,TPIN) +DONMT1: FETCH(T,A,TPBIT) ;FIND A PIN NOT ASSIGNED YET + TRNE T,DPTMP1 + JRST DONMT6 + ANDI T,BASSLH + FETCH(TT,A,TPNAM) ;DEFAULT NAME + HRL T,TT ;T = DEF NAME,,BASSLH + FETCH(B,A,TPNX) + JUMPE B,DONMT3 +;Check for any other PINS with same default on the new type +DONMT2: FETCH(TTT,B,TPBIT) + ANDI TTT,BASSLH + FETCH(TT,B,TPNAM) + HRL TTT,TT + CAMN TTT,T ;SAME DEFAULT, BUSSED, L/H ? + JRST [ TRO TFLG ;YES, MATCH ISN'T EXACT + JRST DONMT3] + FETCH(B,B,TPNX) + JUMPN B,DONMT2 +;Check for only one pin on old type with matching default +DONMT3: MOVE G,CORLST + SETZM CURPIN +DONMT4: SKIPE 1(G) ;NOT MATCHED YET? + JRST DONMT5 + HLRZ TT,(G) + FETCH(TTT,TT,TPNAM) + PUSH P,TTT + FETCH(TTT,TT,TPBIT) + ANDI TTT,BASSLH + HRL TTT,(P) + SUB P,[1,,1] + CAME TTT,T + JRST DONMT5 + SKIPE CURPIN + JRST [ TRO TFLG ;MORE THAN ONE POSSIBLE MATCH ON OLD BODY + JRST DONMTB] + MOVEM G,CURPIN +DONMT5: HRRZ G,(G) + JUMPN G,DONMT4 +DONMTB: SKIPN G,CURPIN + JRST [ TRO ATLP ;NEW PIN NOT MATCHED ON OLD BODY + JRST DONMT6] + FETCH(T,A,TPID) + HRL A,T + MOVEM A,1(G) ;UNIQUE MATCH, SET CORRESPONDENCE + SETBIT(DPTMP1,TT,A,TPBIT) +DONMT6: FETCH(A,A,TPNX) + JUMPN A,DONMT1 + ;FALLS THRU +;TRY LOOSER MATCH + TRNN ATLP ;ANY NOMATCH ON A NEW PIN ? + JRST REPCL6 ; NO, CHECK IF ANY ERRORS IN MATCHING +;PASS2 - Try looser match, for those pins that weren't found above + MOVE A,NEWTYP + FETCH(A,A,TPIN) +DONMA1: FETCH(T,A,TPBIT) + TRNE T,DPTMP2!DPTMP1 ;UNMATCHED? + JRST DONMA6 +NODEC,< FETCH(T,A,TPNAM) > ;LOOK FOR ANY PIN WITH SAME DEFAULT PIN NAME +DEC,< ANDI T,BUSSED ;DEC, A LITTLE STRICTER, SINCE WE DID L/H LAST TIME + FETCH(TT,A,TPNAM) + HRL T,TT +>;DEC + FETCH(B,A,TPNX) + JUMPE B,DONMA3 +DONMA2: +NODEC,< FETCH(TTT,B,TPNAM) > ;,,TPNAM +DEC,< ANDI TTT,BUSSED + FETCH(TT,B,TPNAM) + HRL TTT,TT ;TPNAM,,BUSSED +>;DEC + CAMN TTT,T + JRST [ FETCH(TTT,B,TPBIT) ;SAME DEFAULT + TRNE TTT,DPTMP1 ; APPEARS UNMATCHED TWICE ON NEW TYPE? + JRST .+1 + TRO TFLG ;LOOSER MATCH IS AMBIGUOUS + JRST DONMA3] + FETCH(B,B,TPNX) + JUMPN B,DONMA2 +;Now see if there is a single pin in old TYPE that matches this looser eqv +DONMA3: MOVE G,CORLST + SETZM CURPIN +DONMA4: SKIPE 1(G) ;NOT MATCHED YET? + JRST DONMA5 + HLRZ TT,(G) +NODEC,< FETCH(TTT,TT,TPNAM) > ;,,TPNAM +DEC,< FETCH(TTT,TT,TPBIT) + ANDI TTT,BUSSED + PUSH P,TTT + FETCH(TTT,TT,TPNAM) + HRLM TTT,(P) + POP P,TTT ;TPNAM,,BUSSED +>;DEC + CAME TTT,T + JRST DONMA5 + SKIPE CURPIN ;MATCHES TOO MANY IN OLD TYPE? + JRST [ TRO TFLG ;MATCH NOT EXACT, BUT DO OUR BEST + JRST DONMA7] + MOVEM G,CURPIN +DONMA5: HRRZ G,(G) + JUMPN G,DONMA4 +DONMA7: SKIPN G,CURPIN + JRST [ TRO TFLG ;NO MATCH FOR THIS PIN, ERROR + JRST DONMA6] + FETCH(T,A,TPID) + HRL A,T + MOVEM A,1(G) + SETBIT(DPTMP2,TT,A,TPBIT) ;NOT NEEDED? +DONMA6: FETCH(A,A,TPNX) + JUMPN A,DONMA1 + JRST REPCL6 + +;THERE SHOULD PROBABLY BE N PASSES, IN ORDER OF INCREASING LOOSENESS +>;MD + +REPONE: PUSHJ P,GETCLS + POPJ P, + PUSH P,A + FETCH(A,A,BTYP) + PUSHJ P,REPSET ;SET UP CORRESPONDENCE + JRST [ POP P,(P) + JRST CLRREP] + POP P,G + PUSHJ P,REPIT + TRO MCHG + JRST CLRREP +IFN 0,< PUSHJ P,CLRREP ;STRAIGHTEN AUTOMATICALLY? +MD,< JRST STRAIGHTEN > +MPC,< POPJ P, > +>;IFN 0 + +REPALL: +MD,< MOVEI T,[ASCIZ/TYPE OLD BODY NAME +/] +>;MD + PUSHJ P,BODYGT + POPJ P, ;ALTMODE + POPJ P, ;NULL + JRST OOPS1 ;NX + PUSHJ P,REPSET + JRST CLRREP +REPLOP: + TRO MCHG + SKIPN G,DBODPN + JRST CLRREP +REPLP2: FETCH(B,G,BTYP) + CAMN B,OLDTYP ;DOES THIS BODY HAVE THE RIGHT TYPE? + PUSHJ P,REPIT +REPLP1: FETCH(G,G,BNXT) + JUMPN G,REPLP2 + JRST CLRREP +IFN 0,< PUSHJ P,CLRREP +MD,< JRST STRAIGHTEN > +MPC,< POPJ P, > +>;IFN 0 + + ;REPSOME - SELECTIVE REPLACE BODY +REPSOME: +MD,< MOVEI T,[ASCIZ/TYPE OLD BODY NAME +/] +>;MD + PUSHJ P,BODYGT + POPJ P, ;ALTMODE + POPJ P, ;NULL + JRST OOPS1 ;NX + PUSHJ P,REPSET + JRST CLRREP ;LET HIM OUT + MOVEI T,UPSTAR ;WHERE TO GO IN UPCLOS + MOVEM T,SPDISP + MOVE T,[ASCID/BR/] + MOVEM T,SPMODT + MOVEI T,SPM + PUSHJ P,TCHNGM ;GET INTO SPECIAL POINTER MODE + SKIPN G,DBODPN + JRST REPALT + JRST REPSP1 +REPSPC: MOVE G,CURREP + HRRZ G,(G) + JUMPE G,REPALT +REPSP1: MOVEM G,CURREP + FETCH(A,G,BTYP) + CAME A,OLDTYP + JRST REPSPC ;KEEP LOOKING + MOVEI T,BIGPG + MOVEM T,PGLASS + PUSHJ P,DPYSET + PUSHJ P,SETBRT + FETCH(T,G,BXY) + TLNE M,DSKACT!MACACT + JRST ISON ;NO, ALL BODIES ARE ON + PUSHJ P,ONSCR ;IS IT ON SCREEN? + PUSHJ P,PICSET ;NO, GET IT ON +ISON: MOVEM T,STARLOC + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +THIS ONE/] + PUSHJ P,YORN + JRST REPALT + JRST REPSPC + MOVE G,CURREP + PUSHJ P,REPIT + TRO MCHG +IFN 0,> + JRST REPSPC + +REPALT: PUSHJ P,RCHNGM ;RESTORE OLD MODE +CLRREP: SKIPE B,CORLST + PUSHJ P,PUTFS + SETZM CORLST + POPJ P, + + ;REPLACE BODY +; G = OLD BODY +; NEWTYP = NEW TYPE +; OLDTYP = TYPE OF OLD BODY + +REPIT: PUSH P,G + MOVE T,NEWTYP + STORE(T,G,BTYP) +MD,< CAMN T,OLDTYP ;DON'T COPY PROPERTIES IF SAME BODY + JRST REPITP + HRRZ T,(P) + PUSHJ P,OFFBLO ;FIX CHAR OFFSET IF BIT ON + FETCH(T,G,BBIT) + TRNN T,FIXLOC ;LOCN FOLLOWING DEFAULT? + JRST NFXBLC + FETCH(B,G,BLOC) ;YES, AND THERE IS LOCN? + JUMPE B,NFXBLC ;JUST IN CASE + MOVE A,G + PUSHJ P,STLCOF ;SET LOCN OFFSET FROM NEW TYPE +NFXBLC: FETCH(C,G,BTXT) ;BODY PROP LIST + CLEAR(G,BTXT) ;ZERO POINTER TO IT + SKIPN COPPRP ;COPY PROPERTIES? + JRST [ PUSHJ P,TXTREL ;NO, RELEASE PROP LIST STG IN C + JRST REPITP] + JUMPE C,REPITP ;NOTHING TO DO IF NO LOCAL PROPS +;Now merge local PROP/TEXT with those from TYPE def + MOVE A,G ;GET BODY POINTER + PUSHJ P,COPLTP ;COPY TYPE'S TEXT/PROPERTIES INTO BODY'S INDIRECT LIST + MOVE B,C ;OLD PROP LIST IN B + PUSHJ P,MERGEP ;MERGE OLD PROPS ONTO NEW + PUSHJ P,TXTREL ;RECLAIM OLD PROP LIST (C) +REPITP: +>;MD +MPC,< SWITCH + MOVEI G,RADDR(G,BLNK,BPLNK) ;MAKE FIRST PTR LOOK LIKE REST OF LIST + HRRZ F,(P) ;BODY + PUSHJ P,REPIT1 ;DO BACK SIDE FIRST + HRRZ G,(P) + SWITCH +>;MPC + MOVEI G,RADDR(G,BLNK,BPLNK) ;MAKE FIRST PTR LOOK LIKE REST OF LIST + HRRZ F,(P) ;BODY + PUSHJ P,REPIT1 ;DO IT + HRRZ A,(P) ;BODY POINTER + PUSHJ P,BODFIX ;FIX ALL THE PINS ON IT! + POP P,G ;RESTORE BODY POINTER + POPJ P, + + ;REPIT1 - REPLACE PINS ON BODY BEING REPLACED +;G = RADDR(,BLNK,BPLNK) +;F = BODY POINTER + +;REPIT2 +;G = BPOINT +;H = PREVIOUS +;A = CORRESPONDENCE BLOCK +REPIT2: HRRZ T,1(A) + JUMPN T,REPDL5 ;REPLACE? + MOVE B,G + FETCH(G,G,BPLNK) ;NO, TURN INTO POINT + STORE(G,H,BPLNK) ;LINK THIS PIN OUT + PUSHJ P,PINPNT ;CHANGE PIN TO PLAIN POINT + JRST REPDL4 + +REPDL5: STORE(T,G,BPLOC) ;NEW TYPE PIN POINTER +MD,< SKIPN KEEPIN ;KEEPING PIN #'S? + CLEAR(G,BPPN) ;NO, FLUSH THEM +>;MD + PUSH P,F + FETCH(B,G,BBODY) ;BODY POINTER + FETCH(F,B,BORI) ;GET ORIENTATION FROM OLD BODY + FETCH(T,T,TPXY) ;X,Y FROM PIN TYPE BLOCK + PUSHJ P,ORIENT ;ORIENT IT + ADJUST(ADD,T,) ;ADJUST TO BODY LOCATION + MOVE A,SAVEG +MD,< PUSH P,G + PUSHJ P,PMOVRL ;MOVE TO NEW POS! + POP P,G +>;MD + POP P,F +REPIT1: MOVE H,G ;SAVE POINTER TO PREVIOUS FOR LINK OUT + FETCH(G,G,BPLNK) +REPDL4: JUMPE G,REPMAK ;DONE WITH OLD PINS, NOW MAKE EXTRA PINS + MOVEM G,SAVEG +MPC,< FETCHL(TT,G,BPBIT) + EQV TT,SID + JUMPGE TT,REPIT1 ;SAME SIDE? +>;MPC + FETCH(T,G,BPLOC) + MOVEI A,CORLST ;CORRESPONDENCE LIST + JRST REPIT3 + +REPIT4: HLRZ TT,(A) + CAMN TT,T ;SAME PIN IN TYPE? + JRST REPIT2 +REPIT3: HRRZ A,(A) + JUMPN A,REPIT4 + OUTSTR[ASCIZ/POINT NOT FOUND AT REPIT4!! +/] + PUSHJ P,FUCKUP + JRST REPIT1 ;THIS SHOULDN'T HAVE HAPPENED + ;REPMAK - MAKE EXTRA PINS IN NEW BODY + +;H = END OF BPOINT LIST +;F = BODY +REPMAK: MOVEI G,CORLST ;MAKE EXTRA PINS REQUIRED BY REPLACEMENT + PUSH P,F ;BODY + JRST REPMK1 + +REPMK2: HLRZ A,(G) ;TPIN OF OLD PIN + JUMPN A,REPMK1 ;NOT A NEW PIN? + HRRZ A,1(G) ;POINTER TO NEW TPIN BLOCK + MOVE B,(P) ;BODY POINTER + HRLI B,ISPIN ;PIN + PUSHJ P,PUTPNT ;MAKE IT (D RETURNED = POINT CREATED) +MPC,< FETCH(TT,A,TPID) ;PIN # FROM DEF + MOVEI T,1 ;INITIALLY USE NORMAL PAD FOR PIN + CAIN TT,1 ;PIN 1? + MOVEI T,3 ;MAKE IT END UP PAD TYPE 3 (SQUARE) + STORE(T,D,BPPN) +>;MPC + STORE(D,H,BPLNK) ;LINK ONTO END OF OLD PIN LIST + MOVE H,D ;MAKE THIS NEW ONE END OF LIST +REPMK1: HRRZ G,(G) + JUMPN G,REPMK2 + POP P,F + POPJ P, diff --git a/src/draw/route.303 b/src/draw/route.303 new file mode 100644 index 00000000..b6e24457 --- /dev/null +++ b/src/draw/route.303 @@ -0,0 +1,1115 @@ +;ROUTE.FAI.8, 15-NOV-75 18:08:32, EDIT BY HELLIWELL +;bit array initializer - - clobbers T, TT, TTT, A, B, C, D, E, F, G. +ROUTE,< +PRINTX !!! ROUTE STUFF HASN'T BEEN CONVERTED !!!! +;FRELNK CHANGED TO FRLINK +;FIND.P AND FP1 DON'T RETURN EXTRA GOODIES ANY MORE +VERSION(ROUTE,2) +MPC,< +BITINI: MOVE T,[ARRAYA,,ARRAYA+1] + SETZM ARRAYA + BLT T,ARRAYB+ARRAYB-ARRAYA-1 ;CLEAR ARRAYS + TLO M,%ROUTE + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ROUTING TABLES INITIALIZED! +/] + PUSHJ P,BITIN1 +BITIN1: SKIPE B,PONPNT + PUSHJ P,MARK + HRRZ B,CRDLST + JUMPE B,BITIN2 + HRRZ B,(B) + MOVEI G,3 ;MARK IT SOLIDLY + JUMPN B,BITIN3 + JRST BITIN2 +BITIN4: MOVE E,1(B) + TRNE E,1 + JRST BITIN3 + MOVE F,1(A) + PUSHJ P,MRKLIN + OUTSTR[ASCIZ/CARD EDGE EXCEEDS ARRAY BOUNDS! +/] +BITIN3: MOVE A,B + HRRZ B,(B) + JUMPN B,BITIN4 +BITIN2: SWITCH + POPJ P, + +;bit array display routine - - clobbers T, TT, TTT, A, B, C, D, E, F, G. +PDISP: MOVEI T,2 + PUSHJ P,DPYBIG + SKIPN A,RCL1 + JRST NRCL1 + MOVE T,1(A) + PUSHJ P,AIVECT + MOVE T,[ASCID/_/] + PUSHJ P,TXTDPB +NRCL1: SKIPN A,RCL2 + JRST NRCL2 + MOVE T,1(A) + PUSHJ P,AIVECT + MOVE T,[ASCID//] + PUSHJ P,TXTDPB +NRCL2: TLNN M,RDISP + POPJ P, + MOVEI T,0 ;FIND PIC COORDINATE OF LOWER LEFT + ADJUST(SUB,T,<[%XCEN,,%YCEN]>) ;CORNER OF POINT ARRAY. + MOVE TT,[%XSIZ,,%YSIZ] + ADJUST(SUB,TT,<[%XCEN,,%YCEN]>) ;AND UPPER RIGHT + MOVNI A,20000 ;NOW CORNERS OF SCREEN + IDIV A,NSCALE + IDIVI A,%GRAIN + IMULI A,%GRAIN + HRL A,A + MOVSI B,1 + SUB B,A + HRL C,XOFF + HRR C,YOFF + ADJUST(ADD,A,C) ;LOWER LEFT IN A + ADJUST(ADD,B,C) ;UPPER RIGHT IN B + MOVE TTT,A + ADJUST(SUB,TTT,T) ;FIND GREATER OF LOWER LEFT CORNER OF + TLNN TTT,400000 ;POINT ARRAY AND SCREEN + HLL T,A + TRNN TTT,400000 + HRR T,A + MOVE TTT,B + ADJUST(SUB,TTT,TT) ;FIND LESSER OF UPPER RIGHT CORNER OF + TLNE TTT,400000 ;POINT ARRAY AND SCREEN + HLL TT,B + TRNE TTT,400000 + HRR TT,B + ADJUST(SUB,TT,T) ;FIND DELTA X AND Y FOR PORTION OF + TDNE TT,[400000,,400000];SCREEN WE WILL DISPLAY + POPJ P, ;ONE OR BOTH WERE NEGATIVE(NOTHING TO DISPLAY) + MOVE A,T + HLRZ T,TT ;NOW GET DELTA X AND Y IN ARRAY STEPS + HRRZ TT,TT + IDIVI TT,%GRAIN + MOVE B,TT ;Y STEPS IN B + IDIVI T,%GRAIN + EXCH T,A ;X STEPS IN A AND X,Y COORD'S IN T. + MOVE F,T ;SAVE COPY OF X,Y FOR APOINT. + PUSHJ P,BITBYT ;MAKE BYTE POINTER + JRST OUTDPY ;WHAT A SCREW-UP + MOVE C,TTT ;TTT GETS CLOBBERED BY APOINT, USE C. +PDISP1: MOVE G,F ;RESET X,Y (BEGIN NEXT ROW) + MOVE E,A ;RESET X COUNT + MOVE D,C ;RESET BYTE POINTER +PDISP2: LDB T,D ;PICK UP A BYTE + JUMPE T,PDISP3 ;PUT A POINT HERE? + MOVE T,G + PUSHJ P,APOINT +PDISP3: HRLZI T,%GRAIN + ADD G,T ;INC X,Y BY ONE GRAIN. + IBP D + SOJG E,PDISP2 ;LOOP ON ROW + ADDI C,%ROW ;INC SAVED BYTE POINTER BY ONE ROW + ADDI F,%GRAIN ;INC SAVED X,Y BY ONE ROW + SOJG B,PDISP1 ;AND LOOP ON ROW + POPJ P, + ;initialization routine - - mark all lines to this point +;and the point if a pin or feed through +;clobbers T, TT, TTT, A, B, C, D, E, F, G. +;G=1 to set bits | G=0 to clear bits. +MARK: HLRZ A,(B) + HLRZ C,1(A) + JUMPE C,MARK31 +MARK1: MOVEI D,2 +MARK2: XCT (D)[ HLRZ E,(C) + HLRZ E,1(C) + HRRZ E,1(C)] + JUMPE E,MARK3 + MOVE E,1(E) + MOVE F,1(B) + MOVEI G,1 ;1 FOR LINES + PUSHJ P,MRKLIN + OUTSTR[ASCIZ/ +POINT EXCEEDS ARRAY BOUNDS!/] +MARK3: SOJGE D,MARK2 + HRRZ C,(C) + JUMPN C,MARK1 +MARK31: HRRZ C,1(A) + HLL C,1(C) + TDNN C,[ISPIN!FEEDTH!CPIN,,-1] ;DRILL HOLE OR SOME PAD! + JRST MARK4 + MOVEI G,3 ;3 FOR PADS! + TRNN C,-1 ;UNPADDED? + MOVEI G,2 ;IN WHICH CASE WE USE 2 + MOVE E,1(B) + MOVE F,E ;MARK LINE FROM POINT TO ITSELF + TLNN C,CPIN ;CPIN MUST BE DONE SPECIAL + JRST MRKPNT + ADDI F,%SEPAR ;MARK ABOVE + ADDI E,-%SEPAR ;AND BELOW + TLZ F,1 + TLZ E,1 + PUSHJ P,MRKLIN + OUTSTR[ASCIZ/CONNECTOR NOT IN ARRAY! +/] + MOVE E,1(B) + HRRZ F,(C) ;CPIN OTHER END POINTER + MOVE F,1(F) + PUSHJ P,MRKLIN ;MAKE A LINE TO FLUSH CROSSING OF CPIN + OUTSTR[ASCIZ/CONNECTOR STICKS OUT OF ARRAY! +/] +MRKPNT: PUSHJ P,MRKLIN + OUTSTR[ASCIZ/ +POINT EXCEEDS ARRAY BOUNDS!/] +MARK4: HRRZ B,(B) + JUMPN B,MARK + POPJ P, + ;MARK A LINE IN THE BIT ARRAY (UGH,BLETCH)! +;one endpoint in E the other in F. +;clobbers T, TT, TTT, E, F, G. +;G0 check for clear path(skip if clear) +;G=0 clear bits +;G=1 sets line bits +;G=2 sets unpadded feed through bits +;G=3 sets pad bits +MRKLIN: TDZ F,[1,,1] + TDZ E,[1,,1] + CAMG F,E + EXCH F,E + MOVE T,F + PUSHJ P,BITBYT + POPJ P, + MOVE T,E + PUSHJ P,BITBYT + POPJ P, + MOVE T,F + ADJUST(SUB,T,E) + HRLM T,(P) ;SAVE HERE TEMPORARILY + HLRE T,T + IDIVI T,%GRAIN + JUMPE TT,.+2 + ADDI T,1 + MOVEM T,DX + HLRE T,(P) + IDIVI T,%GRAIN + JUMPE TT,.+4 + JUMPG TT,.+2 + SUBI T,2 + ADDI T,1 + MOVEI E,%ROW + JUMPGE T,.+2 + MOVNI E,%ROW + MOVMM T,DY + MOVM T,T + SETZM XCNT + SETZM YCNT + SETZ TT, + CAMGE T,DX + JRST CASE2C + MOVNI T,%STEP/2 + MOVEM T,YCNT + IMUL T,E + ADD TTT,T + MOVNI T,%STEP/2 + IMUL T,DX + IDIV T,DY + MOVEM T,XCNT + SUBI T,%STEP/2 + CAIA + PUSHJ P,DBP + AOJLE T,.-1 + MOVE T,YCNT + JRST CASE1 + +CASE2C: MOVNI T,%STEP/2 + MOVEM T,XCNT + CAIA + PUSHJ P,DBP + AOJLE T,.-1 + MOVNI T,%STEP/2 + IMUL T,DY + IDIV T,DX + MOVEM T,YCNT + SUBI T,%STEP/2 + IMUL T,E + ADD TTT,T + MOVE T,XCNT + JRST CASE2 + CASE1: IMUL T,DX + IDIV T,DY +IFG %STEP-1,< + JUMPGE TT,.+2 + SUBI T,1 + CAMGE T,XCNT + JRST CASE1A + CAMG T,XCNT + JUMPE TT,CASE1A +> +IFLE %STEP-1,< + CAMG T,XCNT + JRST CASE1A +> + IBP TTT + AOS XCNT +CASE1A: JUMPE G,CASE1J + LDB F,TTT + JUMPG G,CASE1I + JUMPN F,CPOPJ + JRST CASE1K +CASE1I: CAMGE F,G +CASE1J: DPB G,TTT +CASE1K: MOVE T,TTT +IFG %STEP-2,< +REPEAT %STEP-2,< + ILDB F,T + JUMPGE G,.+3 + JUMPN F,CPOPJ + JRST .+4 + JUMPE G,.+2 + CAMGE F,G + DPB G,T +> +> +IFLE %STEP-1,< + JUMPE TT,CASE1B +> +IFG %STEP-1,< + JUMPN TT,CASE1B +> + ILDB F,T + JUMPGE G,.+3 + JUMPN G,CPOPJ + JRST CASE1B + JUMPE G,.+2 + CAMGE F,G + DPB G,T +CASE1B: AOS T,YCNT + SUBI T,%STEP/2 + CAMLE T,DY + JRST CPOPJ1 + ADDI T,%STEP/2 + ADD TTT,E + JRST CASE1 + CASE2: IMUL T,DY + IDIV T,DX +IFG %STEP-1,< + JUMPGE TT,.+2 + SUBI T,1 + CAMGE T,YCNT + JRST CASE2A + CAMG T,YCNT + JUMPE TT,CASE2A +> +IFLE %STEP-1,< + CAMG T,YCNT + JRST CASE2A +> + AOS YCNT + ADD TTT,E +CASE2A: JUMPE G,CASE2J + LDB F,TTT + JUMPG G,CASE2I + JUMPN F,CPOPJ + JRST CASE2K +CASE2I: CAMGE F,G +CASE2J: DPB G,TTT +CASE2K: MOVE T,TTT +IFG %STEP-2,< +REPEAT %STEP-2,< + ADD T,E + LDB F,T + JUMPGE G,.+3 + JUMPN F,CPOPJ + JRST .+4 + JUMPE G,.+2 + CAMGE F,G + DPB G,T +> +> +IFLE %STEP-1,< + JUMPE TT,CASE2B +> +IFG %STEP-1,< + JUMPN TT,CASE2B +> + ADD T,E + JUMPE G,CASE2L + LDB F,T + JUMPG G,.+3 + JUMPN F,CPOPJ + JRST CASE2B + CAMGE F,G +CASE2L: DPB G,T +CASE2B: AOS T,XCNT + SUBI T,%STEP/2 + CAMLE T,DX + JRST CPOPJ1 + ADDI T,%STEP/2 + IBP TTT + JRST CASE2 + +RSET1: PUSHJ P,GETCLS + JRST PERRET + CAMN A,RCL2 + JRST PERRET + MOVEM A,RCL1 + TRO MCHG + POPJ P, + +RSET2: PUSHJ P,GETCLS + JRST PERRET + CAMN A,RCL1 + JRST PERRET + MOVEM A,RCL2 + TRO MCHG + POPJ P, + ;HERE WE TRY TO ACTUALLY ROUTE A WIRE +DOROUTE: + TLNN M,%ROUTE + PUSHJ P,BITINI ;INTIALIZE FOR HIM! + SKIPE B,RLIST + PUSHJ P,PUTFS + SETZM RLIST + SKIPE D,RCL1 + SKIPN E,RCL2 + JRST PERRET + MOVE T,1(D) + CAMLE T,1(E) + EXCH E,D + MOVE F,RCODE ;SET UP ROUTING CODE + HLRZ A,(E) + HRRZ A,1(A) + MOVE A,1(A) + TLNE A,FEEDTH!ISPIN ;IS THIS POINT ONLY ON ONE SIDE? + JRST REACHB ;NO. + XCT STAB1(F) ;YES, ARE WE ROUTING ON THAT SIDE? + JRST NTROUTE ;NO, LOSE +REACHB: MOVE T,1(E) ;X2,Y2 + HRREM T,Y2 + HLREM T,X2 + PUSHJ P,BITBYA + JRST NTROUTE + MOVEM TTT,ENDBYT + TLNE A,FEEDTH!ISPIN ;CAN WE END ON EITHER SIDE? + XCT STAB2(F) ;YES, COMPUTE OTHER SIDE POINTER + MOVEM TTT,ENDBY2 ;THIS IS ANOTHER WINNING BYTE POINTER + MOVE TTT,ENDBYT ;GET RIGHT ONE BACK + HLRZ A,(D) + HRRZ A,1(A) + MOVE A,1(A) + TLNE A,FEEDTH!ISPIN + JRST REACHC + XCT STAB1(F) + JRST NTROUTE +REACHC: MOVE T,1(D) + HRREM T,Y1 + HLREM T,X1 + MOVE B,T + PUSHJ P,BITBYA + JRST NTROUTE + MOVE T,Y1 + SUB T,Y2 + MOVEI TT,0 + JUMPL T,.+2 + MOVEI TT,1 + MOVEM TT,ROUIDX ;SAVE AS ROUTING INDEX + TRZ TFLG ;MAGIC FLAG FOR SKIP RETURN + SETZB G,RTCNT ;CLEAR COUNTS +NXTG1: OUTSTR[ASCIZ/TRYING /] + MOVE T,G + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +/] + PUSHJ P,RBEGIN + JRST RWIN ;WIN BIG + TRZE TFLG ;ADVANCING ONE OR LEAVING? + CAIA + JRST NOROU1 ;LEAVING + AOS G,RTCNT + JRST NXTG1 + +NTROUTE:OUTSTR[ASCIZ/NO ROUTING POSSIBLE! +/] +NOROU1: TRO NEEDCL ;GET IT ON (BIGPG) + POPJ P, + RWIN: MOVEM SID,SIDSAV ;GET REAL SID FROM STORAGE + XCT (F)[TLNE SID,FRONT + TLNN SID,FRONT + JFCL + JFCL] + JRST MAKRT + SWITCH +MAKRT: MOVE A,RLIST + JRST MAKRT1 +MAKRT2: MOVE T,1(A) + TLNE SID,FRONT + TRC T,1 + TRNN T,1 + JRST RTSID + SWITCH +RTSID: MOVE T,1(A) + XOR T,1(B) + CAIN T,1 + JRST MAKFED + PUSH P,B + PUSH P,A + MOVE E,1(A) + MOVE F,1(B) + MOVEI G,1 + PUSHJ P,MRKLIN + OUTSTR[ASCIZ/LINE EXCEEDS ARRAY BOUNDS! +/] + POP P,A + MOVE TTT,1(A) + TDZ TTT,[1,,1] + PUSHJ P,FIND.P + PUSH P,D + PUSH P,TTT + MOVE TTT,1(B) + TDZ TTT,[1,,1] + PUSHJ P,FIND.P + POP P,T + PUSHJ P,FRELNK + XCT (T)PUTAB + MOVE T,TTT + POP P,D + PUSHJ P,FRELNK + XCT (T)PUTAB + POP P,A +MAKRT1: HRRZ B,(A) + JUMPN B,MAKRT2 + TRO MCHG + TLO M,%ROUTE ;PUTPNT CLEARED THIS! +NOTYET: SKIPE B,RLIST ;FOR NOW JUST GIVE BACK THE ROUTE + PUSHJ P,PUTFS + SETZM RLIST + MOVE T,SIDSAV + EQV T,SID + JUMPL T,CPOPJ ;ON RIGHT SIDE ALREADY? + SWITCH ;NO, GET THERE + POPJ P, + MAKFED: PUSH P,B + PUSH P,E + MOVE TTT,1(A) + TDZ TTT,[1,,1] + PUSHJ P,FIND.P + MOVE G,D + PUSHJ P,RDFEED + JRST CANTFD + PUSH P,SID + MOVE G,D + TLZ SID,FRONT + MOVE T,1(G) + PUSHJ P,BITBYT + JRST NOTINA + MOVEI T,2 + DPB T,TTT + ADDI TTT,ARRAYB-ARRAYA + DPB T,TTT +NOTINA: POP P,SID +CANTFD: POP P,E + POP P,A + JRST MAKRT1 + STKN__6 ;NUMBER OF THINGS PUSHED ON STACK IN RECURSIVE ROUTINES + +%LIMIT__%SEPAR*4 ;LIMIT SIZE OF SEARCH BOX! + + +RBEGIN: HRRZM P,PSAV + PUSH P,G + PUSH P,TTT + PUSH P,B + PUSH P,A + SETZM DX ;USE THIS AS COUNTER FOR WHEN TO TRY INCHRS + ADD G,.CNR ;COMPENSATE FOR ROUTINES THINKING THIS IS A CORNER + MOVEI H,XPNF ;ASSUME THIS + XCT (F)[JRST XRLOC + JRST XRLOC + TLNN A,FEEDTH!ISPIN + TLNN A,FEEDTH!ISPIN] + JRST XRLOC + MOVEI H,XR0 + JRST XRLOC + +PVB: XCT VTAB(F) +PVB1: MOVE C,.CNR + MOVEI H,XPV + JRST PVAB + +PVA: XCT VTAB(F) +PVA1: MOVE C,.CNR + MOVEI H,XPVA +PVAB: ADD C,.BAK + JRST PVI + +PV: XCT VTAB(F) +PV1: MOVE C,.CNR + MOVEI H,XPV +PVI: PUSH P,G + SUB G,C ;DO WEIGHTING + JUMPL G,GPOPJ2 + PUSH P,TTT + PUSH P,B + PUSH P,A + HRRE T,B + MOVE TT,ROUIDX + SUB T,(TT)[%LIMIT + -%LIMIT] + XCT (TT)[CAMLE T,Y2 + CAMGE T,Y2] + JRST SKIP2A + ADD TTT,(TT)[%ROW + -%ROW] + ADD B,(TT)[%SEPAR + 0,,-%SEPAR] + TLZ B,1 + JRST XLOCA ;ENTER MAIN LOOP + NVB: XCT VTAB(F) +NVB1: MOVE C,.CNR + MOVEI H,XNV + JRST NVAB + +NVA: XCT VTAB(F) +NVA1: MOVE C,.CNR + MOVEI H,XNVA +NVAB: ADD C,.BAK + JRST NVI + +NV: XCT VTAB(F) +NV1: MOVE C,.CNR + MOVEI H,XNV +NVI: PUSH P,G + SUB G,C + JUMPL G,GPOPJ2 + PUSH P,TTT + PUSH P,B + PUSH P,A + HRRE T,B + MOVE TT,ROUIDX + ADD T,(TT)[%LIMIT + -%LIMIT] + XCT (TT)[CAMGE T,Y1 + CAMLE T,Y1] + JRST SKIP2A + ADD TTT,(TT)[-%ROW + %ROW] + ADD B,(TT)[0,,-%SEPAR + %SEPAR ] + TLZ B,1 + JRST XLOCA + PHB: XCT HTAB(F) +PHB1: MOVE C,.CNR + MOVEI H,XPH + JRST PHAB + +PHA: XCT HTAB(F) +PHA1: MOVE C,.CNR + MOVEI H,XPHA +PHAB: ADD C,.BAK + JRST PHI + +PH: XCT HTAB(F) +PH1: MOVE C,.CNR + MOVEI H,XPH +PHI: PUSH P,G + SUB G,C + JUMPL G,GPOPJ2 + PUSH P,TTT + PUSH P,B + PUSH P,A + HLRE T,B + SUBI T,%LIMIT + CAMLE T,X2 + JRST SKIP2A + IBP TTT + ADD B,[%SEPAR,,0] + JRST XLOCA + NHB: XCT HTAB(F) +NHB1: MOVE C,.CNR + MOVEI H,XNH + JRST NHAB + +NHA: XCT HTAB(F) +NHA1: MOVE C,.CNR + MOVEI H,XNHA +NHAB: ADD C,.BAK + JRST NHI + +NH: XCT HTAB(F) +NH1: MOVE C,.CNR + MOVEI H,XNH +NHI: PUSH P,G + SUB G,C + JUMPL G,GPOPJ2 + PUSH P,TTT + PUSH P,B + PUSH P,A + HLRE T,B + ADDI T,%LIMIT + CAMGE T,X1 + JRST SKIP2A + PUSHJ P,DBP + ADD B,[-%SEPAR,,0] + JRST XLOCA + PNF: XCT FTAB(F) + MOVEI H,XPNF + PUSH P,G + SUB G,.FED + JUMPL G,GPOPJ2 + ADD G,.CNR ;ACCOUNT FOR IMPLIED CORNER COMING UP + PUSH P,TTT + PUSH P,B + PUSH P,A + PUSHJ P,DBP + LDB T,TTT + CAIL T,3 + JRST SKIP2A + IBP TTT + ILDB T,TTT + CAIL T,3 + JRST SKIP2A + MOVE TTT,-2(P) + ADDI TTT,%ROW + LDB T,TTT + CAIL T,3 + JRST SKIP2A + SUBI TTT,%ROW*2 + LDB T,TTT + CAIL T,3 + JRST SKIP2A + PUSHJ P,OBYT ;GET TO OTHER SIDE + LDB T,TTT + CAIL T,3 + JRST SKIP2A + ADDI TTT,%ROW*2 + LDB T,TTT + CAIL T,3 + JRST SKIP2A + SUBI TTT,%ROW + PUSHJ P,DBP + LDB T,TTT + CAIL T,3 + JRST SKIP2A + IBP TTT + ILDB T,TTT + CAIL T,3 + JRST SKIP2A + PUSHJ P,DBP ;GET REAL BYTE POINTER + TLC A,FRONT +XLOCA: CAME TTT,ENDBYT ;AT ENDPOINT? + CAMN TTT,ENDBY2 ;EITHER OF THEM? + JRST PWIN ;YES + LDB T,TTT + JUMPN T,SKIP2A + MOVEI T,1 + DPB T,TTT +RDEBUG: JRST ENDBUG + MOVEI T,-2(P) + MOVEM T,STARLOC + MOVEI T,UPROUTE + MOVEM T,SPDISP + MOVE T,[ASCIZ/RD/] + MOVEM T,SPMODT + MOVEI T,SPM + PUSHJ P,TCHNGM + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/_____ +/] + PUSHJ P,GETCHR + PUSHJ P,RCHNGM +ENDBUG: +XRLOC: PUSHJ P,HJUST + HRLI H,() ;MAKE IT INTO A BYTE POINTER + PUSH P,H ;SAVE BYTE POINTER +XLOC: ILDB H,(P) ;GET INDEX + XCT XCTAB(H) ;AND CALL ROUTINE + JRST WIN + JRST SKIP1 + JRST XLOC + LOSE: MOVEI T,0 + CAME TTT,-3(P) ;CROCKISH WAY TO TELL IF THIS IS THE GUY + ;WE SHOULDN'T CLOBBER!!!!!! ARRG**** + DPB T,TTT + POP P,(P) +SKIP2A: POP P,A + POP P,B + POP P,TTT +GPOPJ2: POP P,G + SOSL DX ;TIME TO CHECK YET? + JRST CPOPJ2 ;NO + MOVEI T,20 ;WAIT A WHILE + MOVEM T,DX + INCHRS T ;LET HIM OUT HERE IF NECESSARY!!! + JRST CPOPJ2 + OUTSTR[ASCIZ/_____ +/] + CAIN T,ALTMOD ;ONLY ALTMODE WILL WORK! + JRST CPOPJ1 ;YES, SINGLE SKIP RETURN + TRZE T,600 ;MUST HAVE CTRL BITS! + CAIE T," " ;**SPACE WILL GO TO NEW COUNT + CAIA + TROA TFLG + AOS (P) + JRST CPOPJ1 + +SKIP1: MOVEI T,0 + DPB T,TTT + POP P,(P) +SKIP1A: POP P,A + POP P,B + POP P,TTT + POP P,G + JRST CPOPJ1 + +WIN: TRZ B,1 + TLNE A,FRONT + TRO B,1 + SKIPN T,RLIST + JRST NOLIST + HRRZ H,(T) + JUMPE H,NOLIST + MOVE TT,B + XOR TT,1(T) + CAIN TT,1 + JRST NOLIST + MOVE TT,1(H) + XOR TT,B + TRNN TT,1 + TLNE TT,-1 + TRNN TT,-1 + JRST [ MOVEM B,1(T) + JRST ISLIST] +NOLIST: GETFS(TT) + HRRZM T,(TT) + HRRZM TT,RLIST + MOVEM B,1(TT) +ISLIST: MOVEI T,0 + DPB T,TTT + POP P,(P) + POP P,A + POP P,B + POP P,TTT + POP P,G + POPJ P, + SDIF__ARRAYB-ARRAYA + +HJUST: HLRE T,B + CAML T,X2 + ADDI H,2 + CAMLE T,X2 + ADDI H,2 + HRRE T,B + MOVE TT,ROUIDX + XCT (TT)[CAML T,Y2 + CAMG T,Y2] + ADDI H,6 + XCT (TT)[CAMLE T,Y2 + CAMGE T,Y2] + ADDI H,6 + POPJ P, + +OBYTA: PUSHJ P,OBYT + TLC A,FRONT + JRST CPOPJ2 + +OBYT: TLNN A,FRONT + ADDI TTT,SDIF*2 + SUBI TTT,SDIF + POPJ P, + +STAB1: TLNN A,FRONT + TLNE A,FRONT + CAIA + CAIA + +STAB2: JFCL + JFCL + PUSHJ P,OBYT + PUSHJ P,OBYT + +VTAB: SKIPA C,[0] + SKIPA C,[0] + PUSHJ P,BACKTB + PUSHJ P,FRNTTB + +HTAB: SKIPA C,[0] + SKIPA C,[0] + PUSHJ P,FRNTTB + PUSHJ P,BACKTB + +BACKTB: TLNN A,FRONT + TDZA C,C + MOVEI C,%SID + JRST CPOPJ1 + +FRNTTB: TLNE A,FRONT + TDZA C,C + MOVEI C,%SID + JRST CPOPJ1 + +FTAB: JRST CPOPJ2 + JRST CPOPJ2 + JFCL + JFCL + +XCTAB: JRST LOSE + PUSHJ P,PV + PUSHJ P,NV + PUSHJ P,PH + PUSHJ P,NH + PUSHJ P,PV1 + PUSHJ P,NV1 + PUSHJ P,PH1 + PUSHJ P,NH1 + PUSHJ P,PVA + PUSHJ P,NVA + PUSHJ P,PHA + PUSHJ P,NHA + PUSHJ P,PVA1 + PUSHJ P,NVA1 + PUSHJ P,PHA1 + PUSHJ P,NHA1 + PUSHJ P,PVB + PUSHJ P,NVB + PUSHJ P,PHB + PUSHJ P,NHB + PUSHJ P,PVB1 + PUSHJ P,NVB1 + PUSHJ P,PHB1 + PUSHJ P,NHB1 + PUSHJ P,PNF + PUSHJ P,OBYTA + %__0 ;SO BLANK CONCATINATED WITH % IS 0. +%PV__1 +%NV__2 +%PH__3 +%NH__4 +%PV1__5 +%NV1__6 +%PH1__7 +%NH1__10 +%PVA__11 +%NVA__12 +%PHA__13 +%NHA__14 +%PVA1__15 +%NVA1__16 +%PHA1__17 +%NHA1__20 +%PVB__21 +%NVB__22 +%PHB__23 +%NHB__24 +%PVB1__25 +%NVB1__26 +%PHB1__27 +%NHB1__30 +%PNF__31 +%OBYTA__32 + +DEFINE XD $ (A,B,C,D,E,F,G,H,I,J,K,L,M) +< BYTE (5)%$A,%$B,%$C,%$D,%$E,%$F,%$G,%$H,%$I,%$J,%$K,%$L,%$M,0 +> + +XR0: XD PV1,PH1,NVA1,NHA1,OBYTA,PV1,PH1,NVB1,NHB1,OBYTA,NVB1,NHB1 + XD PV1,NHA1,PHA1,NVA1,OBYTA,PV1,NHB1,PHB1,NVB1,OBYTA,NHB1,PHB1,NVB1 + XD PV1,NH1,PHA1,NVA1,OBYTA,PV1,NH1,PHB1,NVB1,OBYTA,PHB1,NVB1 + XD PH1,NVA1,PVA1,NHA1,OBYTA,PH1,NVB1,PVB1,NHB1,OBYTA,NVB1,PVB1,NHB1 + 0 + XD NH1,PVA1,NVA1,PHA1,OBYTA,NH1,PVB1,NVB1,PHB1,OBYTA,PVB1,NVB1,PHB1 + XD NV1,PH1,NHA1,PVA1,OBYTA,NV1,PH1,NHB1,PVB1,OBYTA,NHB1,PVB1 + XD NV1,PHA1,NHA1,PVA1,OBYTA,NV1,PHB1,NHB1,PVB1,OBYTA,PHB1,NHB1,PVB1 + XD NV1,NH1,PVA1,PHA1,OBYTA,NV1,NH1,PVB1,PHB1,OBYTA,PVB1,PHB1 + +XPNF: XD PV1,PH1,PNF,NVB1,NHB1 + XD PV1,PNF,NHB1,PHB1,NVB1 + XD PV1,NH1,PNF,PHB1,NVB1 + XD PH1,PNF,NVB1,PVB1,NHB1 + XD PNF + XD NH1,PNF,PVB1,NVB1,PHB1 + XD NV1,PH1,PNF,NHB1,PVB1 + XD NV1,PNF,PHB1,NHB1,PVB1 + XD NV1,NH1,PNF,PVB1,PHB1 + +XPV: XD PV,PH1,NHA1,PNF,NHB1 + XD PV,PHA1,NHA1,PNF,PHB1,NHB1 + XD NH1,PV,PHA1,PNF,PHB1 + XD PH1,PVA,NHA1,PNF,PVB,NHB1 + XD PNF + XD NH1,PVA,PHA1,PNF,PVB,PHB1 + XD PH1,PVA,NHA1,PNF,PVB,NHB1 + XD PHA1,NHA1,PVA,PNF,PHB1,NHB1,PVB + XD NH1,PVA,PHA1,PNF,PVB,PHB1 + +XPVA: XD PVA,PHA1,NHA1 + XD PVA,PHA1,NHA1 + XD NHA1,PVA,PHA1 + XD PHA1,PVA,NHA1 + XD PNF + XD NHA1,PVA,PHA1 + XD PHA1,PVA,NHA1 + XD PHA1,PVA,NHA1 + XD NHA1,PVA,PHA1 + XNV: XD PH1,NVA,NHA1,PNF,NVB,NHB1 + XD PHA1,NHA1,NVA,PNF,PHB1,NHB1,NVB + XD NH1,NVA,PHA1,PNF,NVB,PHB1 + XD PH1,NVA,NHA1,PNF,NVB,NHB1 + XD PNF + XD NH1,NVA,PHA1,PNF,NVB,PHB1 + XD NV,PH1,NHA1,PNF,NHB1 + XD NV,PHA1,NHA1,PNF,PHB1,NHB1 + XD NV,NH1,PHA1,PNF,PHB1 + +XNVA: XD PHA1,NVA,NHA1 + XD PHA1,NVA,NHA1 + XD NHA1,PHA1,NVA + XD PHA1,NVA,PHA1 + XD PNF + XD NHA1,NVA,PHA1 + XD NVA,PHA1,NHA1 + XD NVA,NHA1,PHA1 + XD NVA,NHA1,PHA1 + +XPH: XD PH,PV1,NVA1,PNF,NVB1 + XD PV1,PHA,NVA1,PNF,PHB,NVB1 + XD PV1,PHA,NVA1,PNF,PHB,NVB1 + XD PH,PVA1,NVA1,PNF,PVB1,NVB1 + XD PNF + XD PVA1,NVA1,PHA,PNF,PVB1,NVB1,PHB + XD PH,NV1,PVA1,PNF,PVB1 + XD NV1,PHA,PVA1,PNF,PHB,PVB1 + XD NV1,PHA,PVA1,PNF,PHB,PVB1 + +XPHA: XD PHA,PVA1,NVA1 + XD PVA1,PHA,NVA1 + XD PVA1,PHA,NVA1 + XD PHA,NVA1,PVA1 + XD PNF + XD PVA1,PHA,NVA1 + XD PHA,NVA1,PVA1 + XD NVA1,PHA,PVA1 + XD NVA1,PHA,PVA1 + +XNH: XD PV1,NHA,NVA1,PNF,NHB,NVB1 + XD PV1,NVA1,NHA,PNF,NVB1,NHB + XD NH,PV1,NVA1,PNF,NVB1 + XD PVA1,NVA1,NHA,PNF,PVB1,NVB1,NHB + XD PNF + XD NH,NVA1,PVA1,PNF,NVB1,PVB1 + XD NV1,PVA1,NHA,PNF,PVB1,NHB + XD NV1,PVA1,NHA,PNF,PVB1,NHB + XD NH,NV1,PVA1,PNF,PVB1 + +XNHA: XD PVA1,NHA,NVA1 + XD PVA1,NHA,NVA1 + XD PVA1,NHA,NVA1 + XD PVA1,NHA,NVA1 + XD PNF + XD NHA,PVA1,NVA1 + XD NVA1,PVA1,NHA + XD NVA1,NHA,PVA1 + XD NHA,NVA1,PVA1 + PWIN: JUMPG G,SKIP2A ;COUNT MUST BE EXACT! + MOVEI T,-1(P) ;GET POINTER TO OUR STACK + MOVEM T,STARLOC ;PASS AS DATUM + MOVEI T,UPROUTE + MOVEM T,SPDISP + MOVE T,[ASCIZ/R/] + MOVEM T,SPMODT + MOVEI T,SPM + PUSHJ P,TCHNGM + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/HOW ABOUT THIS ONE?/] + PUSHJ P,GETCHR + PUSHJ P,RCHNGM ;RETURN TO OLD MODE + CAIN C,ALTMOD ;ALTMODE? + JRST SKIP1A ;YES, GET OUT OF HERE + CAIE C,"Y" + CAIN C,"y" + JRST [ PUSH P,(P) ;HE EXPECTS SOMETHING ON THE STACK + JRST WIN] + TRZE C,600 + CAIE C,40 ;CTRL SPACE? + JRST SKIP2A ;TRY ANOTHER ROUTE + TRO TFLG ;FLAG TO SKIP TO NEXT # OF CORNERS + JRST SKIP1A + ;ROUTER DISPLAY +UPROUTER: + PUSHJ P,SPSETUP + MOVE D,STARLOC ;GET POINTER TO NEXT X,Y BACK UP STACK + MOVE T,B + PUSHJ P,AIVECT ;START HERE + MOVE T,B + MOVE E,A ;SIDE OF LAST POINT PLOTTED + JRST PLOP1 ;ENTER LOOP + +PLOP: MOVE TT,T ;LAST POINT WE DREW + XOR TT,(D) + TDZ TT,[1,,1] + TLNE TT,-1 ;SAME X + TRNN TT,-1 ;OR Y + CAIA ;WELL, SAME POS. + JRST PLOTIT + MOVE TT,E + XOR TT,1(D) ;STILL ON SAME SIDE? + JUMPGE TT,PLOP1 ;YES, SKIP IT +PLOTIT: MOVEI T,7 ;ASSUME ON CURRENT SIDE + MOVE TT,STKN+1(D) ;GET WHAT SIDE HE'S ON + EQV TT,SID ;IS HE ON BRIGHT SIDE? + JUMPL TT,.+2 ;YES + MOVE T,DEFBRT ;NO + PUSHJ P,DPYBRT + MOVE T,B ;GET LAST POINT STILL IN LINE + PUSHJ P,AVECT ;PLOT IT + MOVE T,B + MOVE E,STKN+1(D) +PLOP1: MOVE B,(D) ;GET NEXT X,Y FROM STACK + SUBI D,STKN ;BACK UP STACK + CAMLE D,PSAV ;OFF TOP? + JRST PLOP ;NO, CONTINUE CHECK + MOVE T,BTHBRT ;ASSUME ON CURRENT SIDE + MOVE TT,STKN+1(D) ;GET WHAT SIDE HE'S ON + EQV TT,SID ;IS HE ON BRIGHT SIDE? + JUMPL TT,.+2 ;YES + MOVE T,DEFBRT ;NO + PUSHJ P,DPYBRT + MOVE T,B + PUSHJ P,AVECT ;PLOT LAST POINT + JRST BLINKO ;DISPLAY IT + ;BITBYA, BITBYT +BITBYA: PUSH P,SID + MOVE SID,A + PUSHJ P,BITBYT + CAIA + AOS -1(P) + POP P,SID + POPJ P, + +BITBYT: ADJUST(ADD,T,<[%XCEN,,%YCEN]>) ;MAKE IT ALL POS. + TDNE T,[400000,,400000] + POPJ P, + HRRZ TT,T + HLRZ T,T + CAIG T,%XSIZ + CAILE TT,%YSIZ + POPJ P, + IDIVI TT,%GRAIN + MOVE TTT,TT + IMULI TTT,%ROW ;GET INDEX TO BEGGINING OF ROW + IDIVI T,%GRAIN + IDIVI T,=36/BYTSIZ + ADD TTT,T + IMULI TT,BYTSIZ ;LOW ORDER BIT OF BYTE + 1 - BYTSIZ + SUBI TT,=36-BYTSIZ + MOVN TT,TT + LSH TT,=12 + TRO TT,BYTSIZ6 + HRL TTT,TT + ADDI TTT,ARRAYA + JUMPGE SID,CPOPJ1 + ADDI TTT,ARRAYB-ARRAYA + JRST CPOPJ1 + +;DECREMENT BYTE POINTER IN TTT. +DBP: ADD TTT,[BYTE (6)BYTSIZ] + JUMPGE TTT,CPOPJ + TLNE TTT,40000 + SUB TTT,[440000,,1] + POPJ P, +>;ROUTE +>;MPC diff --git a/src/draw/second.521 b/src/draw/second.521 new file mode 100644 index 00000000..0672340c --- /dev/null +++ b/src/draw/second.521 @@ -0,0 +1,2075 @@ +;; SECOND.FAI + +;Definitions and variables for Drawing prgm + +;Linkage for board files +NOLAY,< ;Suppressed because two versions of BOARDS need to exist +EXTERNAL MAPCON,MAPGND,MAPPWR,CRDPIN,MAPSOC,%%PINN,$$PINN +EXTERNAL LCINIT,GETSLT,SLTOUT,GTSLTL,GTCONP,LOCFUK,PRNLOC,PRNPIN +EXTERNAL MAPOST,CPNMER,CPNSEP,CPNMAP,QUPIN,PINCUE,SLTCUE,BODCUE,CPCUE,PROTOB +EXTERNAL BPINPN,PINPLS,RPNAM,CSLTLP,SLTLPN,LOCOUT +EXTERNAL MATPAK,CMPPAK, CLRPAK, APACK +EXTERNAL FNDWW,FNDNOM,GETBRD,GETNOM,CLRNOM,SETNOM,AVAIL +EXTERNAL WWTYP,DEFNOM,SETWW,PACKNM,LOCTVV,NOMTYP +EXTERNAL N2L,L2N,WNAMES,DEFWW,CLRWW,LNAMES,PUTDEC,MAXN2L + +INTERNAL CPOPJ,CPOPJ1,CPOPJ2,CPOPJ3,POPAJ +INTERNAL TREADU,PUTFS,GTCHRX,LETTER, FORSOC, FUCKUP,NDIG +ITS,< INTERNAL .TVOFF,TVMORE > +>;NOLAY + +;Linkage for ONE segment layout version +ONE,< +PASS1,;PASS1 +PASS2,;PASS2 +>;ONE + +;Linkage for Leahy display - in CNVERT +III,< +EXTERNAL LHYRST,LHYADD,LHYIOT,LHYOUT,UPLHY +INTERNAL LHYWRD +> + +;IO CHANNEL NUMBERS +DAT__0 ;DATA IN AND OUT +IDSK__1 ;DISK INPUT +ODSK__2 ;DISK OUTPUT +IOLAY__3 ;LAYOUT I/O +ICARD__4 ;CARD DEF INPUT CHANNEL +DEC,< DISCHN__5 ;VB10C CHANNEL + PGPCHN__10 ;PGP I/O CHANNEL +>;DEC +CMU,< ATYO__5 ;GDP2 OUTPUT CHANNEL + ATYI__6 ;GDP2 INPUT CHANNEL +>;CMU + +;DEFAULT PROTECTION FOR OUTPUT FILES +DEFPRO__000 +III,<DEFPRO__155> +DEC,<DEFPRO__005> ;NOT HERE!!!!!!! +CMU,<DEFPRO__155> + + +;NUMBER OF CHARS NECESSARY TO PRINT FILENAME INFO +NOSTAN,> ;FFFFFF.EEE[PPPPPP,NNNNNN] +STANFO, ;FFFFFF.EEE[PPP,NNN] +ITS, ;UUUUUU;FFFFFF EEE + +;NUMBER OF WORDS NECESSARY TO SHOW DEFAULT FILENAME +NOLAY,;FFFFFF[PPP,NNN] +LAY,;FFFFFF[PPP,NNN]&FFFFFF[PPP,NNN] + +;NUMBER OF WORDS NECESSARY FOR NAMBUF PRINTOUT BUFFER +NNWRDS__(NNCHRS+4)/5 ;FFFFFF.EEE[PPP,NNN] + +;SPECIAL CHARACTERS, DEFINE AS YOU WISH +NOSKEY,< +CTRL__"" ;CHARACTER INTERPRETED AS CONTROL BIT +META__3 ; " META BIT +CTLMTA__"" ; " CTRL META BITS +TTYCM__"'" ;HACK FOR TTY'S AT STANFORD, INC'S CTRL BITS +>;NOSKEY +LAMBDA__"" ;FOR DISK IO START, STOP +CRCHR__24 ;CR FOR DISKIN AND MACRO ALTER MODE +AMCTL__13 ;ALTER MODE CHAR (1 ALT) +AMMTA__14 ;ALTER MODE CHAR (2 ALT) +NOSKEY,<TEXIST__""> ;THERE EXISTS, FOR FILENAME +SKEY,<TEXIST__""> +BIGCHR__"" ;GET BIGGER +DBLARR__"" ;CRLF IN TEXT +NOSKEY,<ALTCHR__""> ;ALTMODE FOR MACRO ALTER MODE +SKEY,< ALTCHR__7> ;BELL FOR DEC +NOCMU, ;CLOSING CHARACTER IN ";A" +CMU, +VRTBAR__"|" ;VERTICAL BAR +STANFO,<ALTMOD__175> ;ALTMODE CHAR +NOSTANFO,<ALTMOD__33> +NOT__"" ;CHAR LIKE "-", BUT DIF. +NOTCHR__"-" ;FOR PERMUT AND ALPHA +TILDA__32 ;LOW TRUE FOR SIGNAL NAME +GENCHR__"%" ;GENERATED SIGNAL NAME CHAR. +RHG, + +;SPECIAL CHARS FOR SEARCH STUFF IN ALTER MODE AND F +QUOCHR__"" ;QUOTE CHAR IN SEARCH STRINGS +BELCHR__"|" ;BEGINNING OR END OF LINE +NOSKEY, ;ANY CHAR IN SEARCH STRING +SKEY, ; " +NFCHR__"" ;NOT NEXT THING +DEC,< NFCHR__"" > +III,< NFCHR__"" > +INFCHR__"" ;ANY # OF FOLLOWING +LETCHR__"$" ;MATCH ANY LETTER +DIGCHR__"%" ;MATCH ANY DIGIT +ALFCHR__"" ;MATCH ANY ALPHANUMERIC + +;SCREEN DEMENSIONS - - LEAVE TOP 3 LINES +NODEC,< +%TOP__700 +NOIII,< +%BOTTOM__-1000 +%LEFT__-1000 +%RIGHT__1000 +>;NOIII +III,< +%BOTTOM__-776 +%LEFT__-776 +%RIGHT__776 +>;III +NOSTAN,<SCRTOP__1000> +STAN,<SCRTOP__1000-2*CHGHT> +TITBRT__2 +TITBIG__2 +>;NODEC +DEC,< +VB10,< +%TOP__700 +%BOTTOM__-770 +%LEFT__-770 +%RIGHT__766 +SCRTOP__1000-10 +>;VB10 +GT,< +;HALF PHYSICAL HEIGHT AND WIDTH OF GT40 SCREEN +GTX__1000 +IFN GTSMAL, +IFE GTSMAL, +%TOP__GTY-10 +%BOTTOM__-GTY+1 +%LEFT__-GTX+1 +%RIGHT__GTX-1 +SCRTOP__GTY +>;GT +PGP,< +%TOP__700 +%BOTTOM__-1000 +%LEFT__-1000 +%RIGHT__1000 +SCRTOP__1000 +>;PGP +TITBRT__5 +TITBIG__2 +>;DEC + +;ALTER TEXT MODE DISPLAY PARAMETERS +AXPOS__%LEFT+200 +AYPOS__%TOP-200 +ACHRSZ__2 ;CHAR SIZE +ITS,<ACHRSZ__3 > ;CHAR SIZE + ;MUST BE CHARACTER SIZE THAT CORRESPONDS + ;EXACTLY TO LEGAL HARDWARE SIZE +NODEC,< MAXLIN__=30 ;MAX CHARS PER LINE + MAXPAG__=20 +>;NODEC +DEC,< MAXLIN__=60 +NOGT,< MAXPAG__=40 > +GT,< MAXPAG__=32 > +>;DEC + +GT,< DPYLEN__1400 > +NOGT,< DPYLEN__6000 > + + +ORG 137 + +ORG + +;CTRL C INTERCEPT BLOCK +DEC,< +STORAGE(LOW) +INTBLK: XWD 4,CTRLCI + 2 ;CTRL C INTERCEPT + 0 + 0 +>;DEC + ;SOME MACROES FOR THE GT-40 VERSION +IFN GT40SW,< ;;JB DEFINE MACROS NOW. + +DEFINE STOPIC(PICNUM) ;;JB DEFINE STOP PICUTRE MACRO. +< PUSH P,16 ;;JB SAVE DATA REGISTER. + MOVEI 16,PICNUM ;;JB GET THE PICTURE NUMBERNOW. + PUSHJ P,STPSHW ;;JB STOP SHOWING THE PICUTRE NOW. + POP P,16 ;;JB RESTORE DAMAGED REGISTER NOW. +> + +DEFINE STAPIC(PICNUM) ;;JB OPPOSITE OF THE ABOVE. +< PUSH P,16 ;;JB SAVE REGISTER NOW. + MOVEI 16,PICNUM ;;JB GET THE PICUTRE NUMBER NOW. + PUSHJ P,SRTSHW ;;JB START SHOWING IT NOW. + POP P,16 ;;JB RESTORE REGISTER NOW. +> + +DEFINE BMODS(PIC,OFF,NUM) ;;JB DEFINE PICTURE MODIFICATION MACRO. +< PUSH P,13 ;;JB SAVE A BUNCH OF REGISTERS NOW. + PUSH P,14 + PUSH P,15 + PUSH P,16 + MOVEM P,STCHPS ;;JB SAVE THE STACK NOW. + PUSH P,[PIC] ;;JB PLACE PIC NUMON STACK. + MOVE 16,P ;;JB MOVE OVER POINTER TO START OF MODIFIFIER. + PUSH P,[OFF] ;;JB PUSH THE OFFSET NOW. + PUSH P,[NUM] ;;JB AND FINALLY PUSHTHE NUMBER. +> + +DEFINE BMODF ;;JB DEFINE CALLING AND POPPING MACRO. +< PUSHJ P,BMODDO ;;JB SEND IT OUT NOW. + MOVE P,STCHPS ;;JB RESET STACK TO A GOOD ONE. + POP P,16 ;;JB RESTORE REGISTERS NOW. + POP P,15 ;;JB + POP P,14 ;;JB + POP P,13 ;;JB +> + +DEFINE INCHRW(ARG) ;;JB DEFINE WAIT FOR CHAR AS MACRO +< ;;JB WHICH IS REALLY A PUSHJ TO + PUSHJ P,[ + DLX,< SKIPN DLXFLG > + SKIPN ISDPY + JRST [ TTYUUO 0,ARG + POPJ P,] + PUSHJ P,GTCHRW ;;JB A PUSHJ WITH THE ARGUMENT AFTER + POP P,ARG] ;;JB THE SECOND PUSHJ. +> + +DEFINE INCHRS(ARG) ;;JB LIKEWISE DO THE SAME FOR THE FOLLOWING. +< PUSHJ P,[ + DLX,< SKIPN DLXFLG > + SKIPN ISDPY + JRST [ TTYUUO 2,ARG + POPJ P, + JRST CPOPJ1] + PUSHJ P,GTCHRS ;;JB + POP P,ARG] ;;JB +> + +DEFINE INCHWL(ARG) ;;JB DEFINE THE GET A CHAR (LINE MODE) [WAIT]. +< PUSHJ P,[ + DLX,< SKIPN DLXFLG > + SKIPN ISDPY + JRST [ TTYUUO 4,ARG + POPJ P,] + PUSHJ P,GTCHWL ;;JB CAL THE CORRECT ROUTINE NOW. + POP P,ARG] ;;JB GIVE HIM BACK THE ANSWER NOW. +> + +DEFINE INCHSL(ARG) ;;JB AND THE GET CHAR(LINE MODE). +< PUSHJ P,[ + DLX,< SKIPN DLXFLG > + SKIPN ISDPY + JRST [ TTYUUO 5,ARG + POPJ P, + JRST CPOPJ1] + PUSHJ P,GTCHSL ;;JB + POP P,ARG] ;;JB +> + +DEFINE GTMIX(C1,C2) ;;JB DEFINE A MACRO TO PUT THE CHARACTERS IN OK. +< BYTE (4) 0 (8) 0,0,C2,C1 ;;JB +> + +RDYCJ__25 ;;JB DEFINE THE "READY" CONTROL CHARACTER + ;;JB AS BEING A ^U, WHICH IS NOT NORMALLY SENT. +NRDYCJ__17 ;;JB LIKEWISE DEFINE THE NOT READY CHARACTER AS ^O. + +>;GT ;;JB END THE CONDITIONAL ASSEMBLY. + + ;SOME DEFINITIONS FOR THE PGP VERSION +PGP,< +$S__0 ;BLISS STACK PTR +$V__3 ;BLISS VALUE RETURN REG + +DEFINE RTNCAL (NAME,A) < +EXTERN NAME + MOVE $S,P +CNT$__0 +IFIDN <>< FLG$__0 ;> FLG$__1 +IFN FLG$,< + FOR I IN (A) < + PUSH $S,I +CNT$__CNT$+1 +>;FOR +>;IFN FLG$ + PUSHJ $S,NAME +IFN CNT$,< + SUB $S,[XWD CNT$,CNT$] +> + SKIPLE $V + MOVEM $V,$VAL + MOVE P,$S +>;RTNCAL +>;PGP + + ;PG0 -- INFO LINE, CURSOR + +NOCMU,< + +STORAGE(DPY) ;KEEP ALL DISPLAY STUFF IN LOWER SEG + +DEFINE RPNT(X,Y),< + BYTE(11),(3)0,0(2)0,1(4)6 +REPEAT 0,< BYTE(11)0,0(3)0,0(2)0,1(4)6> + BYTE(8)0,0,200(12)32 + BYTE(8)100,0,100(12)12 + XWD .+3,20 + XWD SAVWRD,64 + BYTE(8)200,0,0(12)12 +> + +DEFINE LIVW(X,Y,S) +< BYTE (11),(3)3,S(2)1,2(4)6 > + +DEFINE RDV(X,Y) +< BYTE (7),(2)0(7),(2)2(4)2 > + +DEC,< +VB10,< ;;JB ASSEMBLE IN THIS. +FBUF: 0 ;BUFFER HEADER + 0 + XWD 030130+TITBRT,221000+SCRTOP-TITBIG*CHGHT-20 ;LITE PEN OFF, SCALE-2 BRITE-7, Y +REDWRD: BYTE (18) 061000+%RIGHT-30 (6) 35,"*",37 ;RIGHT 1/2 VARIES + BYTE (18) 020000,221000+SCRTOP-TITBIG*CHGHT + BYTE(18) 061000+%LEFT (6) 35,"M","O" ;X,"MO" +MODWRD: BYTE(6) "D","E","=",35,35,35 ;"DE=" RIGHT 1/2 VARIES + BYTE (6) 35," ","S","C","L","=" ;"SCL=" +SCLWRD: BYTE (6) 35,35,35,35," ","L" ;LEFT 1/2 VARIES +LVLWRD: BYTE (6) "V","L","=",35,35,35 ;"LVL=" RIGHT 1/2 VARIES + BYTE (6) 35," ",37 (18) 100000 ;ENTER VECTOR MODE + XWD 200005,203000 ;EXISTS IN VECTORS + XWD 200204,101404 + XWD 200203,501405 + BYTE (18) 060000 (6) "=",35,35 ;"=" +FILWRD: + REPEAT NFWRDS-1,< + BYTE (6) 35,35,35,35,35,35 +> + BYTE (6) 35,35,35,35,35,37 + XWD 160000,400000 ;JSR SAVWR1 + XWD SAVWR1,0 +FVECT1: 0 + 0 + 0 + 0 + 0 + XWD 160000,400000 + XWD SAVWR1,0 ;JSR SAVWR1 +FVECT2: 0 + 0 + 0 + 0 + 0 +FBRT: XWD 0,160015 ;0;BRITE 5 +LOCAT: XWD 0,%NLOC ;JMP %NLOC (OR JSR LOCATS) + XWD 600100,160000 ;RIGHT + XWD 400000,LOCATS + XWD 600300,160000 ;LEFT + XWD 400000,LOCATS + XWD 640000,160000 ;UP + XWD 400000,LOCATS + XWD 740000,0 ;DOWN,0 +%NLOC: XWD 160000,400000 ;JSR SAVWR1 + XWD SAVWR1,0 + XWD 160000,0 ;JMP ONOFF-1(OR JMP .+1) +%CLOC: XWD ONOFF-1,0 + XWD 120160,600100 ;SCALE-8,RIGHT + XWD 160000,400000 ;JSR SAVWR1 + XWD SAVWR1,0 + XWD 120000,600300 ;LEFT + XWD 160000,400000 ;JSR SAVWR1 + XWD SAVWR1,0 + XWD 120000,640000 ;UP + XWD 160000,400000 ;JSR SAVWR1 + XWD SAVWR1,0 + XWD 120000,740000 ;DOWN + XWD 160120,400000 ;SCALE-1,JSR SAVWR1 + XWD SAVWR1,0 + XWD 0,160000 ;JSR CROSS(OR JUMP .+1) +ONOFF: XWD 400000,CROSS + XWD 160000,0 ;JMP VBBUF +ENDPG1: XWD FBUF,0 + +CROSS: 0 + XWD 100137,002004 ;INVIS NE + XWD 304210,004000 ;VISIB SW,INVIS N + XWD 704010,160000 ;VISIB SE, JMP @CROSS + XWD 200000,CROSS +LOCATS: 0 + XWD 0,20000 +LOCATW: XWD 220000,160000 + XWD 320000,LOCATS ;JMP @LOCATS (INTO VEC CONT MODE) + +SAVWR1: 0 + XWD 0,20000 +SAVWRD: XWD 221000,161000 + XWD 200000,SAVWR1 +NULLO: 0 ;NULL SUBROUTINE + XWD 160000,200000 + XWD NULLO,0 + +>;VB10 ;;JB + +GT,< ;;JB MY CRAP.... + +JBREDY: 0 ;;JB REMEMBERS READY-NOT READY STATE. + + + + DISTOP__173400 ;;JB DEFINE THE DISTOP INSTRUCTION. + + +PIC3: 117124 ;;POSITION TO TOP LEFT OF SCREEN. + 0 + GTY+SCRTOP-CHGHT*2 + 100000 ;;GET INTO CHARACTER MODE. + GTMIX "M","O" ;;JB STICK IN THE CORRECT HEADING + GTMIX "D","E" ;;JB USING 8 BIT GT40 CHARACTERS. + GTMIX "=",0 ;;JB +GTMODE: GTMIX "J","B" ;;JB CHANGABLE MODE LETERS HERE. + GTMIX " ","S" ;;JB + GTMIX "C","L" ;;JB + GTMIX "=",0 ;;JB +GTSWRD: GTMIX "0",0 ;;JB CURRENT SCALING LEVEL. + GTMIX " ","L" ;;JB THE LEVEL NOW. + GTMIX "V","L" ;;JB + GTMIX "=",0 ;;JB +GTLWRD: GTMIX "0",0 ;;JB CURRENT LEVEL VALUE. + GTMIX " ",135 ;;JB THE 'THERE EXISTS' SIGN. + GTMIX 10,"-" ;;JB DONE BY SUPERIMPOSING. + GTMIX "=",0 ;;JB +GTFNAM: 0 ;;JB LEAVE ROOM FOR 25 CHARACTERS FOR + 0 ;;JB THE FILE NAME (13 WORDS). + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + 0 ;;JB ALL THE WAY DOWN. + DISTOP ;;JB END OF THE LIST NOW. + 0 + +PIC3Z__.-PIC3 ;;JB SIZE OF THE LIST. + XWD 3,1 ;;JB DEFINE AS SUBPICTURE 3, REMEMBER CHANGES. + +>;GT ;;JB END OF MYCRAP. + +PGP,< +TSXDAT: 0 +TSYDAT: 0 +FILWRD: BLOCK NFWRDS + 0 +MODWRD: 0 +SCLWRD: 0 +LOCAT: 0 +LVLWRD: 0 + 1 +NULARG: 0 +NILEV: 0 +SEGN: 0 +PSEGN: 0 +$VAL: 0 +FVECT1: 0 +FVECT2: 0 +BLNKIT: 0 +PGBITS: 0 +FBUF: 0 ;DUMMY +SAVWRD: 0 +>;PGP + +>;DEC + ;CURSOR AND STATUS DISPLAY LISTS +;CHARACTER SIZES +;These are only used for assembled in III words, the size mentioned +;should correspond to the DPYPTX entry for STDBIG. +;There may be some discrepancies that haven't been caught yet. + +NODEC,< +NOIII,< +CWIDTH__10 +CHGHT__20 +>;NOIII +III,< +CWIDTH__4 +CHGHT__10 +>;III +>;NODEC +DEC,< +CWIDTH__6 +CHGHT__12 +>;DEC + + +NODEC,< +NOIII,< +FBUF: .+2 + FEND-.-1 + 0 +>;NOIII +III,< +FBUF: FEND-FBUF1,,FBUF1 +FBUF1: +>;III + LIVW(%RIGHT-CWIDTH*4,SCRTOP-CHGHT*4,6) +REDWRD: ASCID/*/ + LIVW(%LEFT,SCRTOP-CHGHT*2,4) +NOIII,< ASCID/MODE=/ > +III,< LHYWRD: ASCID/0000 / > ;# wds of buffer used +MODWRD: 1 + ASCID/ SCL=/ +SCLWRD: 1 + ASCID/ LVL=/ +LVLWRD: 1 +NOIII,< ASCID/ =/ > +III,< ASCID/ FILE=/ > +FILWRD:REPEAT NFWRDS,<1> +III, +NOIII,< XWD SAVWRD,54 > +FVECT1: 12 +III, +NOIII,< XWD SAVWRD,54 > +FVECT2: 12 +III, +NOIII,< XWD SAVWRD,54 > +FBRT: BYTE(11)0,0(3)2,0(2)0,2(4)6 ;USE CURBRT ON THE REST OF THIS +LOCAT: +NOIII,< XWD %NLOC,20 ;NORMALLY JUMP TO %NLOC + +12 ;CLEAR EDGE FLAG + RDV(20,0) ;GO RIGHT + +12 ;EDGE YET? + XWD .-2,20 ;LOOP BACK + XWD LOCAT,54 + +12 ;CLEAR EDGE FLAG + RDV(-20,0) ;GO LEFT + +12 ;EDGE YET? + XWD .-2,20 ;LOOP BACK + XWD LOCAT,54 + +12 ;CLEAR EDGE FLAG + RDV(0,20) ;GO UP + +12 ;EDGE YET? + XWD .-2,20 ;LOOP BACK + XWD LOCAT,54 + +12 ;CLEAR EDGE FLAG + RDV(0,-20) ;GO DOWN + +12 ;EDGE YET? + XWD .-2,20 ;LOOP BACK +>;NOIII +%NLOC: +III, +NOIII,< XWD SAVWRD,54 > +%CLOC: +NOIII,< XWD ONOFF,20 ;NORMALLY JUMP TO ONOFF + +12 ;CLEAR EDGE FLAG + RDV(10,0) ;GO RIGHT + +12 ;EDGE YET? + XWD .-2,20 ;LOOP BACK + XWD SAVWRD,54 + +12 ;CLEAR EDGE FLAG + RDV(-10,0) ;GO LEFT + +12 ;EDGE YET? + XWD .-2,20 ;LOOP BACK + XWD SAVWRD,54 + +12 ;CLEAR EDGE FLAG + RDV(0,10) ;GO UP + +12 ;EDGE YET? + XWD .-2,20 ;LOOP BACK + XWD SAVWRD,54 + +12 ;CLEAR EDGE FLAG + RDV(0,-10) ;GO DOWN + +12 ;EDGE YET? + XWD .-2,20 ;LOOP BACK + XWD SAVWRD,54 +>;NOIII +ONOFF: +III, +NOIII,< XWD CROSS,20 ;INITIALLY USE CROSS + BYTE(8)167,200,0(12)12 + RPNT 0,0 + RPNT 0,0 +;INNER RING + RPNT -4,0 + RPNT 4,-4 + RPNT 4,4 + RPNT -4,4 +;START FIRST RING + RPNT -10,-4 + RPNT 10,-10 + RPNT 10,10 + RPNT -10,10 +;START SECOND RING + RPNT -14,0 + RPNT 0,-20 + RPNT 14,-10 + RPNT 14,10 + RPNT 0,20 + RPNT -14,10 +;START THIRD RING + BYTE(8)0,0,200(12)12 ;DON'T DRAW IF WE SAW LIGHT PEN. + 0 + RPNT -14,4 + RPNT -10,-10 + RPNT -4,-14 + RPNT 4,-14 + RPNT 10,-10 + RPNT 14,-4 + RPNT 14,4 + RPNT 10,10 + RPNT 4,14 + RPNT -4,14 + RPNT -10,10 + RPNT -14,4 +;START FOURTH RING + RPNT -16,6 + RPNT -12,-6 + RPNT -6,-12 + RPNT -2,-16 + RPNT 2,-16 + RPNT 6,-12 + RPNT 12,-6 + RPNT 16,-2 + RPNT 16,2 + RPNT 12,6 + RPNT 6,12 + RPNT 2,16 + RPNT -2,16 + RPNT -6,12 + RPNT -12,6 + RPNT -16,2 + 0 + 0 + 0 +>;NOIII +CROSS: BYTE(11)10,10(3)0,0(2)0,2(4)6 + BYTE(11)<-20>,<-20>(3)0,0(2)0,0(4)6 + BYTE(11)0,<20>(3)0,0(2)0,2(4)6 + BYTE(11)<20>,<-20>(3)0,0(2)0,0(4)6 +NOIII,< 0 + 0 +SAVWRD: 1 + 0 + 0 + 0 +>;NOIII +FEND__. +>;NODEC + +NODEC,< +NOIII,< +BLDPY: DPYOUT BLINK ;PG # WILL BE FIXED UP +>;NOIII +>;NODEC + +STORAGE(IMPURE) ;IMPURE, BUT CAN GO IN UPPER +DPYDPY: DPYOUT HEAD ; " +HYDDPY: DPYOUT [DPYBUF + NOIII,< 0> ] ; " + +HEAD: DPYBUF +NOIII,< 0 > + +NODEC,< +NOIII,< +BLINK: +NOITS,< BLINKB > +ITS,< SETZ BLINKB > ;SIGN BIT ON SAYS BLINK THIS PG + 0 ;WORD COUNT + +BLINKB: 1 ;NO-OP IN CASE IT GETS EXECUTED(WHICH I DON'T THINK IT DOES!) +ITS,< XWD DPYBUF+1,20 > ;SKIP OVER THIS BLINKING STUFF + XWD BPOS,74 ;WHERE WE WERE LAST TIME! + +12 + BYTE(11)400,0(3)0,0(2)0,2(4)6 ;20 TO RIGHT OF THERE + BYTE(11)40,0(3)0,0(2)0,2(4)6 ;20 TO RIGHT OF THERE + +12 ;EDGE OVERFLOW? + XWD BLEAV,20 ;NO + BYTE(11)0,0(3)0,0(2)1,2(4)6 ;RESET TO CENTER + +12 ;CLEAR EO AND SET CONTROL BIT! +BLEAV: XWD BPOS,64 ;SAVE WHERE WE ARE NOW + +12 ;CONTROL BIT ON? + 0 ;NO, STOP HERE + XWD DPYBUF+1,20 ;TRANSFER TO DPYBUF! +BPOS: 201 ;THE 200 WONT HURT US, BUT ITS LIKES IT +BLINKL__.-BLINK +>;NOIII +>;NODEC +>;NOCMU + +DPYBUF: BLOCK DPYLEN+200 + + DATPPN_'DATDRW' +CMU,< DATPPN_<10053,,473002>> ;E130RG02 +DEC,< +NOVIROS, ;> DATPPN__0 > +VIROS,< DATPPN_<4,,253> > +>;DEC +III,< DATPPN__<10,,76>> + +LIBPPN: DATPPN + +NOCORE: 0 + OUTSTR[ASCIZ/YOU ARE SUFFERING FROM THE UNFORTUNATE FACT THAT +YOUR OVERBLOATED PROGRAM WILL NO LONGER FIT IN OUR +PUNY CORE!!!!!!! +/] +NODEC,< HALT @NOCORE > +DEC,< PUSHJ P,TODDT ;GO TRY DDT + JRST @NOCORE +>;DEC + +;CHARACTER SCALE STUFF +;MAX LEGAL SOFTWARE CHARACTER SIZE +CSIZES__7 + +;The available character scales are defined to be: +;User code Ratio to min size +;0 1 ;SAME AS STDBIG +;1 1 +;2 1.5 +;3 2 +;4 3 +;5 4 +;6 6 +;7 8 + +;Some sites have drawing that used more kludegy size specs... + +DEC,< + DEFINE MAPSIZ(A) +< HRRZ A,(A)[11357777] +> +>;DEC + +STAN,< + DEFINE MAPSIZ(A) +< HRRZ A,(A)[11345555] +> +>;STAN + +CMU,< + DEFINE MAPSIZ(A) +< HRRZ A,(A)[11345555] +> +>;CMU + +IFNDEF MAPSIZ,> + +DEFINE FOO(A,B,C,D,E,F,G,H) +< =A  =B  =C  =D  =E  =F  =G  =H +> + +STORAGE(IMPURE) +STDBIG: DEC,<2;>1 ;MAIN TEXT CHARACTER SIZE (MAPPED) + +;INTERNAL CHARACTER OFFSETS ARE IN TERMS OF A VIRTUAL CHARACTER SET, +; WHICH IS FIXED FROM SITE TO SITE. IT GIVES CHARACTER OFFSETS +;IN TERMS OF FRACTIONAL CHARACTER UNITS. + +;These are the spacings for the virtual character set - don't change!! + +VIRPTX: FOO(8,8,12,16,24,32,48,64) ;Width in Points PER CHAR +VIRPTY: FOO(16,16,24,32,48,64,96,128) ;Height in points + +;DISPLAYS POSSIBLY HAVE DIFFERENT RASTER SPACING THAN VIRTUAL +; AND ALSO DIFF AT SITES +;This compensates for the different display hardware +;Adjust these params to make character spacing right on screen + + +ITS,< +DPYPTX: FOO(12,12,12,16,24,32,48,64) +DPYPTY: FOO(16,16,24,32,48,64,96,128) +>;ITS + +III,< ;III has only char sizes 1,1,3,5,7,7,7,7 +DPYPTX: FOO(8,8,16,24,32,48,64,128) +DPYPTY: FOO(16,16,24,30,42,42,42,42) +>;III + +IFNDEF DPYPTX,< +DPYPTX: FOO(8,8,12,16,24,32,48,64) +DPYPTY: FOO(16,16,24,30,42,64,96,128) +>;IFNDEF + +;PLOTTING MAY BE DIFFERENT + +ITS,< +PLTPTX: FOO(9,9,12,16,23,32,48,64) +PLTPTY: FOO(16,16,24,30,42,64,96,128) +>;ITS + +III,< +PLTPTX: FOO(8,8,12,16,24,32,48,64) +PLTPTY: FOO(12,12,20,30,42,64,96,128) +>;III + +IFNDEF PLTPTX,< +PLTPTX: FOO(8,8,12,16,24,32,48,64) +PLTPTY: FOO(16,16,24,32,48,64,96,128) +>;IFNDEF + +;CONVERT SOFTWARE CHARACTER SIZE TO HARDWARE CHARACTER SIZE +;Note: software size 0 must be same as size 1 + +S2H: +III,< FOO(1,1,3,5,7,7,7,7) > +DEC,< FOO(1,1,2,2,3,3,4,4) > +STAN,< FOO(1,1,3,4,5,6,7,7) > +CMU,< FOO(1,1,4,4,5,6,6,6) > +ITS,< FOO(1,1,3,4,5,6,7,7) > + +;XTEXTF AND YTEXTF TABLES ARE USED TO OFFSET THE CURSOR FOR TEXT SUCH THAT +;A BOX CHGHT BY CWIDTH (IN WHICH THE CHARACTER IS ASSUMED TO BE CENTERED) +;HAS ITS LOWER LEFT CORNER AT THE CURRENT POSITION. +;THIS COMPENSATES FOR OFFSET IN THE HARDWARE DISPLAY BETWEEN CHARACTER AND +;POINTS. IT IS IN III DISPLAY UNITS. +;TABLES ARE INDEXED BY "HARDWARE" CHARACTER SIZE + +DEFINE FOO(A,B,C,D,E,F,G,H) +< A  B  C  D  E  F  G  H +> + +DEC,< + GT,< +XTEXTF: FOO(-4,-10,-12,-22) +YTEXTF: FOO(-1,-4,-4,-10) + >;GT + NOGT,< +XTEXTF: FOO(-4,-6,-12,-22) +YTEXTF: FOO(-1,-2,-4,-10) + >;NOGT +>;DEC + +STAN,< +XTEXTF: FOO(-2,0,0,1,4,10,0) +YTEXTF: FOO(1,0,0,6,14,20,0) +>;STAN + +CMU,< +XTEXTF: FOR I IN (10,14,16,20,30,40,60) + +YTEXTF: FOR I IN(10,14,16,20,30,40,60) + +>;CMU + +ITS,< +XTEXTF: FOO(0,0,0,0,0,0,0,0) ;TV'S ARE PERFECT! +YTEXTF: FOO(0,0,0,0,0,0,0,0) +>;ITS + +III,< +XTEXTF: FOO(0,0,0,0,0,0,0,0) ;LEAHY'S NOT SO PERFECT +YTEXTF: FOO(4,0,6,0,2,0,4,0) +>;ITS + +STORAGE(PURE) + ;; Constant data locs for layout + +NOONE,< +DEFINE CDATA(LABEL,SIZE,SEG) +< +IFIDNSTORAGE(IMPURE) +LABEL: +IFIDN<><0> +IFDIF<> +> +>;NOONE + +;In ONE segment layout, the common variables live in the D side. +ONE,< +DEFINE CDATA(LABEL,SIZE,SEG) +< +MD,STORAGE(IMPURE) +LABEL: +INTERNAL LABEL +IFIDN<><0> +IFDIF<> +>;MD +MPC, +> +>;ONE +STORAGE(LOW) + +LAY,< +RDOFF: 'GODMOD' + 20 +OFFSET: 0 +REALLN: 0 + +WRTOFF: 'GODMOD' + 21 +NEWOFF: 0 +>;LAY + + +CDATA PATCH0,40,LOW +NODEC,< +NOIII,< +CDATA SSSNAM +CDATA SSSEXT +CDATA SSSDAT +CDATA SSSPPN +>;NOIII +>;NODEC + + ;ZERO AREA FOR LAYOUT "CONSTANTS" +ZLOWBEGIN: +LAY,< +TPDLLN__40 ;TEMP PDL LENGTH + +CDATA TPDL,TPDLLN ;TEMP PDL FOR SAVE/GET ROUTINES + +CDATA IWD +CDATA LAYPDL +CDATA LAYBIT +CDATA LAYM +CDATA ODISP +TWO,< +CDATA DNUM +CDATA PCNUM +>;TWO +CDATA DPCPNT ;POINT PASS LIST POINTER +CDATA DOPASS +CDATA LAYLET +CDATA LAYNUM +CDATA SWHICH ;0 D currently in, -1 PC currently in +CDATA SWHCHA +CDATA SWHCHS ;temp +LAY,< +BLLEN__=400 ;ENOUGH FOR 200 LOCATIONS TO BE PASSED +CDATA BLDATA,BLLEN ;POINT PASS LIST SPACE (LIB) +>;LAY +LIB,< +;THE FOLLOWING MUST BE IN ORDER +CDATA DBAND,4 +CDATA D2BAND,4 +CDATA PCBAND,4 +CDATA PC2BAND,4 +;INDICIES INTO BAND STUFF +BAND__0 +DLOC__1 +LENGTH__2 +SEC__3 +BAND2__4 + +>;LIB +CDATA SAVNAM +CDATA SAVEXT +CDATA SAVPPN +CDATA LAYLOC +>;LAY +DEC,< +CDATA RTIME +CDATA QTIME +CDATA DTIME +GT,< +CDATA NBYTES +>;GT +VIROS,< +CDATA TYPFLG +CDATA VSTBUF,10 +VSTEND__ +DLX,< +CDATA DLDVDS +CDATA DLXBUF,8 +>;DLX +>;VIROS +GT,< +CDATA OPTFLG +DLX,< +CDATA DLXFLG +>;DLX +>;GT +>;DEC +nodec,< +NOIII,< +CDATA DPCNAM +CDATA DPCEXT +CDATA DPCDAT +CDATA DPCPPN +CDATA STRTLC +CDATA AUTOSM +CDATA AUTOSN +>;NOIII +CDATA SSSP +>;NODEC +CDATA TJOBDA,200 ;TEMP JOB DATA AREA +CDATA RSAVET,,LOW +NODEC,< +CDATA NAMBUF,NNWRDS +>;NODEC +DEC,< +CDATA SPPDL2,SPD2SZ,LOW +CDATA GOING +VB10,< +CDATA PGTBL,4 +>;VB10 +CDATA NAMBUF,6 +>;DEC +CDATA SPPDL,SPPDSZ,LOW +CMU,< CDATA PPNBUF,3 > +CDATA IOHD,3,LOW +CDATA IOBUF,406,LOW +CDATA TTBUF,2,LOW +CDATA CINST +CDATA CHARP +CMU,< CDATA CHKSVC + CDATA PSVCNT +PSVLEN__100 + CDATA PDLSAV,PSVLEN +>;CMU +CDATA BSOR +CDATA ISDPY +CDATA DONTDPY +CDATA TVISOFF +CDATA POSS1 +CDATA CURCUR +CDATA PAGACT +CDATA REALACT +CDATA SQRFLG +CDATA FORSOC +CDATA FILNAM,,LOW +CDATA FILEXT,,LOW +CDATA FILDAT,,LOW +CDATA FILPPN,,LOW +DEC,< +CDATA TMPNAM,,LOW +CDATA TMPEXT,2,LOW +CDATA TMPPPN,,LOW +>;DEC +CDATA DSKOPN +CDATA DSKOHD,3,LOW +CDATA DSKOBF,210,LOW +CDATA BRKCHR +CDATA DSKHD,3,LOW +CDATA DSKBUF,210,LOW +ZLOWEND__.-1 + +;For the @ Listing program +;PATCH0#,SSSNAM#,SSSEXT#,SSSDAT#,SSSPPN#,TPDL#,IWD#,LAYPDL#,LAYBIT# +;LAYM#,ODISP#,DNUM#,PCNUM#,DPCPNT#,DOPASS#,LAYLET#,LAYNUM#,SWHICH# +;SWHCHA#,SWHCHS#,BLDATA#,DBAND#,D2BAND#,PCBAND#,PC2BAND#,SAVNAM#,SAVEXT# +;SAVPPN#,LAYLOC#,RTIME#,QTIME#,DTIME#,NBYTES#,TYPFLG#,VSTBUF#,DLDVDS#,DLXBUF# +;OPTFLG#,DLXFLG#,DPCNAM#,DPCEXT#,DPCDAT#,DPCPPN#,STRTLC#,AUTOSM#,AUTOSN#,SSSP# +;TJOBDA#,RSAVET#,NAMBUF#,SPPDL2#,GOING#,PGTBL#,NAMBUF#,SPPDL#,PPNBUF#,IOHD# +;IOBUF#,TTBUF#,CINST#,CHARP#,CHKSVC#,PSVCNT#,PDLSAV#,BSOR#,ISDPY#,DONTDPY# +;TVISOFF#,POSS1#,CURCUR#,PAGACT#,REALACT#,SQRFLG#,FORSOC#,FILNAM#,FILEXT#,FILDAT# +;FILPPN#,TMPNAM#,TMPEXT#,TMPPPN#,DSKOPN#,DSKOHD#,DSKOBF#,BRKCHR#,DSKHD#,DSKBUF# + ;LOW CORE LOCNS +ORG 40 +UUO: 0 +IFN 0,< JSR UUOCON> + PUSHJ P,.UUOCON +ORG + +NODEC,< +STORAGE(IMPURE) +UUOSAV: 0 +>;NODEC + +ORG 124 +REENTER +ORG + +NOFST: 0 + JRST .NOFST +NOBLK: 0 + JRST .NOBLK + +LCFLAG: -1 ;ALWAYS START WITH LOWER CASE ENABLED +BOOPCN: 0 ;START WITH NO BOOPING +BOOPLR: 0 + +VIROS,< +NOGT,< +VBCJFN: -1 +>;NOGT +DLX,< +DLXJFN: -1 +>;DLX + +STPPN: 3 ;FUNCTION CODE FOR PPN TO/FROM DIRECTORY STRING +USRPPN: 0 ;PPN RETURNED HERE +STPTR: 0 ;POINT TO DIRECTORY STRING +>;VIROS + +STORAGE(LOW) ;MAKE AVAILABLE TO TWO SEGMENT PROGRAMS +POPBAJ: POP P,B +POPAJ: POP P,A + POPJ P, +POPBJ: POP P,B + POPJ P, +CPOPJ3: AOS (P) +CPOPJ2: AOS (P) +CPOPJ1: AOS (P) +CPOPJ: POPJ P, + ;LAYOUT INITIALIZATION CODE +NODEC,< +NOIII,< +CMU,< .JBSAV_73  .JBS41_122 > +NOCMU,< EXTERNAL .JBSAV,.JBS41 > +EXTERNAL .JB41,.JBCOR +LAY,< +STORAGE(LOW) +SAVE: +ONE,< JRST ERRET> +NOONE,< + SETZB 0,M + JSR LINIT + MOVE P,[IOWD TPDLLN,TPDL] ;TEMP STACK SETUP + OUTSTR[ASCIZ/BE CAREFUL, WILL NOT CHECK IF ALREADY EXISTS! +/] + PUSHJ P,DMPNAM + JRST [ MOVE T,[%PNAME] + MOVEM T,FILNAM + MOVE T,[' 1 3'] + MOVEM T,FILPPN + JRST .+1] + ENTPPN + MOVE T,[FILNAM,,DPCNAM] + BLT T,DPCPPN + MOVEI T,.STRTN + MOVEM T,STRTLC +LIB,< SKIPE T,.JBSYM + SUBI T,LAY2S-LAY1S+LAYBEG-LAY1S + MOVEM T,LAYSYM-LAYBEG+LAY2S +>;LIB + JSR ISAVE ;save 2nd half + JRST [ OUTSTR[ASCIZ/SAVE OF FIRST PART FAILED! +/] + EXIT] +LIB,< SKIPN T,.JBSYM + JRST [ MOVEI T,LAY1E-1 + SETZ TT, + JRST CORDWN] + HLRE TT,T + MOVN TT,TT + HRLZ T,T + HRRI T,LAY1E + BLT T,LAY1E-1(TT) ;MOVE SYMBOLS DOWN + MOVEI T,LAY1E-1(TT) ;THIS IS TOP+1 + MOVE TT,.JBSYM + HRRI TT,LAYBEG+LAY1E-LAY1S + MOVEM TT,.JBSYM +CORDWN: MOVEM TT,LAYSYM-LAYBEG+LAY1S + CORE T, + JFCL + MOVEI T,-1 + HRLM T,.JBSA ;.JBFF IS ALWAYS WRONG, MAKE IT VERY WRONG +>;LIB +TWO,< MOVE T,[LAY1S,,400000] + BLT T,400000+LAY1E-LAY1S-1 + MOVEI T,LAY1E-1 + CORE2 T, + JRST [ OUTSTR[ASCIZ/CORE2 FAILED FOR SECOND PART! +/] + EXIT] + SETZM .JBSYM + MOVEI T,0 + SETDDT T, + MOVEI T,LOWEND + HRRZM T,.JBFF + HRLM T,.JBSA +IFN 0,<;REMOVED BY JBR + MOVE T,[LAY1S,,LAYBEG] + BLT T,LAYBEG+LAY1E-LAY1S-1 + SKIPN T,.JBSYM + JRST [ MOVEI T,LAY1S + MOVEM T,.JBFF + HRLM T,.JBSA + SOJA T,CORDWN] + HLRE TT,T + MOVN TT,TT + HRLZ T,T + HRRI T,LAY1S + BLT T,LAY1S-1(TT) + MOVEI T,LAY1S(TT) + MOVEM T,.JBFF + HRLM T,.JBSA + MOVEI TT,LAY1S + HRRM TT,.JBSYM +>;IFN 0 + SUBI T,1 +CORDWN: CORE T, + JFCL +>;TWO + SETZM SWHCHS ;D IS AT END + JSR SVREST + OUTSTR[ASCIZ/SAVE OF SECOND PART FAILED!/] + MOVE T,[DPCNAM,,SSSNAM] + BLT T,SSSPPN + OUTSTR[ASCIZ/ +/] + HLLZS .JBSA ;DISABLE RESTART!!!!!! + EXIT + +DOSAVD: 0 + JSR SAVSPC + JRST @DOSAVD + JSR SVFRST + JRST [ JSR SAVSD + JRST @DOSAVD + JRST @DOSAVD] + JSR SAVSD + JRST @DOSAVD + SETZM SWHCHS ;PC IS AT END + JSR SVREST + JRST @DOSAVD + MOVE T,[DPCNAM,,SSSNAM] + BLT T,SSSPPN + AOS DOSAVD + JRST @DOSAVD + +DOSAVP: 0 + JSR SAVSD + JRST @DOSAVP + JSR SVFRST + JRST [ JSR SAVSPC + JRST @DOSAVP + JRST @DOSAVP] + JSR SAVSPC + JRST @DOSAVP + SETOM SWHCHS ;D IS AT END + JSR SVREST + JRST @DOSAVP + MOVE T,[DPCNAM,,SSSNAM] + BLT T,SSSPPN + AOS DOSAVP + JRST @DOSAVP +>;NOONE + +.STRTN: JSR UPNAME + JRST .STRT + +CONTLC: JSR UPNAME + JSR LINIT + JRST .CONT ;OTHER HALF WILL COME IN WHEN NEEDED + +UPNAME: 0 + MOVEM 0,SSSNAM ;FILENAME HERE FROM RUN COMMAND + HLLZM 1,SSSEXT + MOVEM 4,SSSPPN + MOVEI T,.STRT + HRRM T,.JBSA ;NOW START HERE + JRST @UPNAME + + ;LAYOUT INITIALIZATION CODE +LINIT: 0 +LIB,< MOVEI T,LAYBEG + MOVEM T,DBAND+DLOC + MOVEM T,PCBAND+DLOC + ADDI T,=76*2000 + MOVEM T,D2BAND+DLOC + MOVEM T,PC2BAND+DLOC + MOVEI T,4 + MOVEI TT,PC2BAND +LIBLOP: MOVNM T,BAND(TT) + SUBI TT,BAND2 + SOJG T,LIBLOP + UFBCLR ;RELEASE ALL BANDS +>;LIB +TWO,< SETZM DNUM + SETZM PCNUM + SETZ T, + SETUWP T, ;MAKE SURE CURRENT ONE ISN'T WRITE PROTECTED + JFCL +>;TWO +ONE,< +MD,< + MOVE A,[LAY1S,,LAYVEC] ;Save dispatch for D side + BLT A,LAYVEC+LLAYVEC-1 + SETZM SWHICH +>;MD +>;ONE + JRST @LINIT + ;GETD, GETPC +ONE,< +GETD: SKIPN SWHICH + POPJ P, ;ALREADY IN D + MOVE A,[LAYVEC,,LAYBEG] ;No, restore its xfer vector + BLT A,LAYBEG+LLAYVEC-1 + SETZM SWHICH +DPCRET: EXCH P,LAYPDL + EXCH 0,LAYBIT + EXCH M,LAYM + JUMPE P,.STRTL + PUSHJ P,SCRSET ;display update + JRST .BLCHK + +GETPC: SKIPE SWHICH + POPJ P, + MOVE A,[LAY2S,,LAYBEG] + BLT A,LAYBEG+LLAYVEC-1 + SETOM SWHICH + JRST DPCRET + +DOSAVD: +DOSAVP: 0 + JRST ERRET + +>;ONE + +NOONE,< +GETD: JSR SAVSD + POPJ P, ;Already in D + JRST DPCRET + +GETPC: JSR SAVSPC + POPJ P, +DPCRET: EXCH P,LAYPDL + EXCH 0,LAYBIT + EXCH M,LAYM + JUMPE P,.STRTL + PUSHJ P,SCRSET ;display update + JRST .BLCHK + +SAVSD: 0 + JSR RELPC + JSR %GETD + CAIA + JRST [ AOS SAVSD + JRST @SAVSD] + OUTSTR[ASCIZ/CAN'T GET D PART, WILL TRY PC PART! +/] + JSR %GETPC + CAIA + JRST @SAVSD + OUTSTR[ASCIZ/CAN'T GET EITHER, I DIE NOW +/] + HALT SAVSD+1 + +SAVSPC: 0 + JSR RELD ;Release D half + JSR %GETPC ;Get PC half + CAIA + JRST [ AOS SAVSPC + JRST @SAVSPC] + OUTSTR[ASCIZ/CAN'T GET PC PART, WILL TRY D PART! +/] + JSR %GETD + CAIA + JRST @SAVSPC + OUTSTR[ASCIZ/CAN'T GET EITHER, I DIE NOW +/] + HALT SAVSPC+1 + + +;;Release D half +RELD: 0 +LIB,< MOVEI TT,DBAND ;START HERE + JSR %PUTLIB +>;LIB +TWO,< SETZ T, + SEGNUM T, + MOVEM T,DNUM + DETSEG +>;TWO + JRST @RELD + +;;Release PC half +RELPC: 0 +LIB,< MOVEI TT,PCBAND + JSR %PUTLIB +>;LIB +TWO,< SETZ T, + SEGNUM T, + MOVEM T,PCNUM + DETSEG +>;TWO + JRST @RELPC + +;;Get D half +%GETD: 0 +LIB,< MOVEI TT,DBAND + JSR %GETLIB + JRST GETD1 ;NOT IN YET + JRST GETDX ;WAS IN, BUT LOST +>;LIB +TWO,< SKIPN T,DNUM + JRST GETD1 + ATTSEG T, + JRST GETDX +>;TWO +LIB,< MOVE T,LAYSYM + MOVEM T,.JBSYM +>;LIB + AOS %GETD + JRST @%GETD + +GETDX: OUTSTR[ASCIZ/REINITIALIZING "D" PART FROM DMP FILE! +/] +LIB,< MOVM T,DBAND + MOVNM T,DBAND + MOVM T,D2BAND + MOVNM T,D2BAND +>;LIB +TWO,< SETZM DNUM +>;TWO + SETZM LAYPDL +GETD1: SETZ T, ;TELL HIM WE WANT D PART + JSR GETDPC + CAIA + AOS %GETD + JRST @%GETD + +%GETPC: 0 +LIB,< MOVEI TT,PCBAND + JSR %GETLIB + JRST GETPC1 + JRST GETPCX +>;LIB +TWO,< SKIPN T,PCNUM + JRST GETPC1 + ATTSEG T, + JRST GETPCX +>;TWO +LIB,< MOVE T,LAYSYM + MOVEM T,.JBSYM +>;LIB + AOS %GETPC + JRST @%GETPC + +GETPCX: OUTSTR[ASCIZ/REINITIALIZING "PC" PART FROM DMP FILE! +/] +LIB,< MOVM T,PCBAND + MOVNM T,PCBAND + MOVM T,PC2BAND + MOVNM T,PC2BAND +>;LIB +TWO,< SETZM PCNUM +>;TWO + SETZM LAYPDL +GETPC1: SETO T, ;TELL HIM WE WANT PC PART + JSR GETDPC + CAIA + AOS %GETPC + JRST @%GETPC +>;NOONE + ;SUBRS FOR LIBRASCOPE GETD, GETPC +LIB,< +%PUTLIB:0 + MOVE T,.JBREL + SUBI T,LAYBEG-1 + CAILE T,=76*2000 + MOVEI T,=76*2000 + JSR ONEBND + MOVE T,.JBREL + SUBI T,LAYBEG-1+=76*2000 + JUMPLE T,@%PUTLIB + ADDI TT,BAND2 + JSR ONEBND + JRST @%PUTLIB + +ONEBND: 0 + MOVEM T,LENGTH(TT) + SKIPL T,BAND(TT) + JRST GOTDBN +NODBN: MOVM T,BAND(TT) + UFBGIV T, + MOVM T,BAND(TT) + UFBGET T, + JSR NOBAND + MOVMS T,BAND(TT) +GOTDBN: FBWRT T,DLOC(TT) + JRST NODBN + FBWAIT + UFBERR + JRST NODBN + JRST @ONEBND ;DONE! + +NOBAND: 0 + OUTSTR[ASCIZ/NO FAST BANDS, CONTINUE TO TRY AGAIN +/] + SOS NOBAND + SOS NOBAND + HALT @NOBAND + +%GETLIB:0 + SKIPGE T,BAND(TT) + JRST @%GETLIB + AOS %GETLIB + JSR GETBND + JRST @%GETLIB + SKIPG LENGTH+BAND2(TT) + JRST GETLDN + ADDI TT,BAND2 + MOVE T,BAND(TT) + JSR GETBND + JRST @%GETLIB +GETLDN: AOS %GETLIB + JRST @%GETLIB + +GETBND: 0 +%GETL1: MOVE TTT,LENGTH(TT) + ADD TTT,DLOC(TT) + SUBI TTT,1 + CORE TTT, + JRST [ JSR NOCORE + JRST %GETL1] + FBREAD T,DLOC(TT) + JRST [ OUTSTR[ASCIZ/FAST-BAND READ ERROR! +/] + JRST @GETBND] + FBWAIT + UFBERR + JRST @GETBND + AOS GETBND + JRST @GETBND +>;LIB + ;GET OTHER PART FROM FILE +NOONE,< +GETDPC: 0 + CAME T,SWHICH ;DO WE WANT THE ONE AT THE END? + TDZA T,T ;NO, GET FRONT ONE + SETO T, ;YES, GET END ONE + MOVEM T,SWHCHA + MOVE T,[SSSNAM,,FILNAM] + BLT T,FILPPN + INIT IOLAY,17 + 'DSK ' + 0 + JRST NOFIL +PGFIL: OUTSTR[ASCIZ/GETTING /] + MOVEI A,FILNAM + JSR FPRINT +DEC,< MOVE T,FILPPN > + LOOKUP IOLAY,FILNAM + JRST [ OUTSTR[ASCIZ/, LOOKUP FAILED, ANOTHER /] + MOVEM P,TPDL + MOVE P,[IOWD TPDLLN,TPDL] + PUSH P,(P) + PUSHJ P,PUSHIT ;SAVE EVERYONE + PUSHJ P,DMPNAM + SETZM FILNAM + PUSHJ P,POPIT + POP P,P + SKIPN FILNAM + JRST NOFIL + JRST PGFIL] +DEC,< JSR IOLAY,LOOKCK >;DETERMINE REAL PPN + SKIPE SWHCHA ;WHICH PART DO WE WANT + JRST ENDP + MTAPE IOLAY,RDOFF ;GET OFFSET + MOVN T,OFFSET ;BACKWARD USET + USETI IOLAY,1(T) + MOVE T,OFFSET + LSH T,7 +LIB,< MOVEI TT,LAY1S + ANDI TT,177 +>;LIB +TWO,< SETZ TT, > + JRST FRONTP + +ENDP: +TWO,< MOVE T,[-200,,TJOBDA-1] + MOVEI TT,0 + INPUT IOLAY,T + MOVE T,TJOBDA-.JBSAV-1+HILOC ;GET STARTING FILE ADDRESS OF UPPER + MOVE TT,T + LSH T,-7 + USETI IOLAY,1(T) +>;TWO +LIB,< MOVEI T,LAY1S-.JBSAV-1+200 + LSH T,-7 ;MAKE RECORD NUMBER + USETI IOLAY,(T) +>;LIB + HLRO T,FILPPN + MOVN T,T ;POS LENGTH OF FILE +LIB,< MOVEI T,LAY1S-.JBSAV-1+200 > + ANDCMI TT,177 ;GET FIRST WORD WE WILL READ +FRONTP: SUBB T,TT ;NUMBER OF WORDS TO READ! +LIB,< ADDI TT,LAYBEG-1 ;THIS IS HOW MUCH ROOM WE NEED + CORE TT, +>;LIB +TWO,< ADDI TT,400000-1 + CORE2 TT, +>;TWO + JRST NOFIL + MOVN T,T + MOVS T,T +LIB,< HRRI T,LAYBEG-1 > +TWO,< HRRI T,400000-1 > + SETZ TT, + IN IOLAY,T + CAIA + JRST NOFIL +LIB,< SKIPN SWHCHA + JRST GOTDPC + MOVEI T,LAYBEG-74 + ANDI T,177 ;HOW MUCH TO BLT DOWN + JUMPE T,GOTDPC + MOVE TT,.JBREL + SUB TT,T + MOVS T,T + ADD T,[LAYBEG,,LAYBEG] + BLT T,(TT) +>;LIB +GOTDPC: AOS GETDPC + OUTSTR[ASCIZ/ +/] +LIB,< MOVE T,LAYSYM + MOVEM T,.JBSYM +>;LIB + RELEASE IOLAY, + JRST @GETDPC + +NOFIL: OUTSTR[ASCIZ/COULDN'T GET DISK FILE! +/] + RELEASE IOLAY, + JRST @GETDPC +>;NOONE + ;SUBRS TO SAVE LAYOUT VERSIONS! + +NOONE,< +;;Save 2nd half of layout program in file leader +ISAVE: 0 + MOVE T,ISAVE + MOVEM T,SVFRST +LIB,< MOVEI T,LAY2S-1 ;save second half + MOVEM T,IWD + SKIPN T,.JBSYM + JRST [ MOVNI TT,LAY2E + JRST NOSYMS] + HLRE TT,T + SUBI TT,(T) +NOSYMS: TRZ TT,177 ;ROUND UP TO MULTIPLE OF 200 WORDS SO GET WON'T LOSE + ADDI TT,LAY2S + HRLM TT,IWD +>;LIB +TWO,< MOVE TT,[LAY2S-LAY2E,,LAY2S-1] + MOVEM TT,IWD +>;TWO + JRST ISAVE1 + +;;Save 1st half of layout prgm in file leader +SVFRST: 0 + MOVEI T,LAYBEG-1 + MOVEM T,IWD +LIB,< MOVN T,.JBREL > +TWO,< HRRZ T,.JBHRL + MOVN T,T +>;TWO + ADDI T,LAYBEG-1 + HRLM T,IWD +ISAVE1: OUTSTR[ASCIZ/SAVING /] + MOVEI A,DPCNAM + JSR FPRINT + INIT DAT,17 + 'DSK ' + 0 + JRST [ OUTSTR[ASCIZ/, CAN'T GET DISK! +/] + HALT SVFRST+1] + MOVE T,[DPCNAM,,FILNAM] + BLT T,FILPPN + ENTER DAT,FILNAM + JRST [ OUTSTR[ASCIZ/, ENTER FAILED, YOU LOSE! +/] + JRST SVQTF] + MOVE T,IWD + SETZ TT, + OUT DAT,T ;POOT OUT FIRST PART + JRST OUTOK + OUTSTR[ASCIZ/, OUTPUT ERROR! +/] +SVQTF: RELEASE DAT,3 + JRST @SVFRST + +OUTOK: UGETF DAT,NEWOFF ;GET EOF+1 + MTAPE DAT,WRTOFF ;SET IT IN FILE + JRST [ OUTSTR[ASCIZ/, MTAPE TO SET RECORD OFFSET FAILED! +/] + JRST SVQTF] + USETO DAT,1 ;GET TO NEW END(BEGINNING) + AOS SVFRST + JRST @SVFRST ;SO FAR SO GOOD +>;LAY +>;NOONE +HINAME__134 ;UPPER SEGMENT NAME +HILOC__135 ;LOC OF UPPER SEGMENT AFTER INPUT FROM DMP FILE + +;;Create TOPS-10 format SAVE file of core image (other half +;; may be in leader part of file) + +SVREST: 0 +NOLAY,< + OUTSTR[ASCIZ/SAVING /] + MOVEI A,DPCNAM + JSR FPRINT + INIT DAT,17 + 'DSK ' + 0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + HALT SVREST+1] + MOVE T,[DPCNAM,,FILNAM] + BLT T,FILPPN + ENTER DAT,FILNAM + JRST [ OUTSTR[ASCIZ/, ENTER FAILED, YOU LOSE! +/] + JRST SVQUIT] +>;NOLAY +LAY,< MOVE T,SWHCHS + EXCH T,SWHICH + MOVEM T,SWHCHS +>;LAY + MOVE T,[.JBSAV+1,,TJOBDA] + BLT T,TJOBDA+177 ;SETUP A PSUEDO JOB DATA AREA + MOVE T,STRTLC + HRRM T,TJOBDA-.JBSAV-1+.JBSA ;STORE PLACE FOR IT TO START + MOVE T,.JB41 + MOVEM T,TJOBDA-.JBSAV-1+.JBS41 + SETZM TJOBDA-.JBSAV-1+.JBCOR ;ALWAYS USE SIZE OF FILE + SETZM TJOBDA-.JBSAV-1+HINAME ;ALWAYS 0 HINAME (EVEN FOR SEGMENTS) +NOTWO,< SETZM TJOBDA-.JBSAV-1+HILOC +>;NOTWO +TWO,< MOVE T,.JBREL + SUBI T,.JBSAV+1 + IORI T,177 + ADDI T,.JBSAV+2 ;THIS IS WHAT GET WANTS TO SEE + MOVEM T,TJOBDA-.JBSAV-1+HILOC ;NO PROT OF ANY KIND +>;TWO + MOVE T,[IOWD 200,TJOBDA] + SETZ TT, + OUT DAT,T + CAIA + JRST [ OUTSTR[ASCIZ/OUTPUT ERROR FOR JOB DATA AREA! +/] + JRST SVQUIT] + MOVEI T,.JBSAV+1+200-1 ;START OUTPUT HERE + MOVN TT,.JBREL + ADD TT,T + HRL T,TT + SETZ TT, + OUT DAT,T + CAIA + JRST [ OUTSTR[ASCIZ/OUTPUT ERROR ON LOW CORE WRITE! +/] + JRST SVQUIT] +TWO,< HRRZ TT,.JBHRL + MOVN TT,TT + MOVEI T,400000-1 + ADD TT,T + HRL T,TT + SETZ TT, + OUT DAT,T + CAIA + JRST [ OUTSTR[ASCIZ/OUTPUT ERROR ON HIGH CORE WRITE! +/] + JRST SVQUIT] +>;TWO + RELEASE DAT, + AOS SVREST + JRST @SVREST + +SVQUIT: RELEASE DAT,3 ;FLUSH FILE +LAY,< MOVE T,SWHCHS + MOVEM T,SWHICH +>;LAY + JRST @SVREST + ;DMP FILENAME SCANNER +LAY,< +DMPNAM: MOVSI T,'DMP' + MOVEM T,FILEXT + SETZB T,FILEXT+1 ;CLEAR THIS WORD + DSKPPN T, ;HIS OWN PPN + MOVEM T,FILPPN + OUTSTR [ASCIZ/DMP FILENAME?/] +NOITS,< PUSHJ P,GETWRD > ;SCAN FILENAME +ITS,< PUSHJ P,QETNAM > ;SCAN FILENAME + CAIN C,12 + JUMPE T,CPOPJ ;LET HIM OUT IF HE TYPES NOTHING +NOITS,< + MOVEM T,FILNAM ;SAVE FILENAME + CAIN C,"[" ;ANY EXTENSION? + JRST NOEXT ;NO + CAIN C,12 + JRST NOEXT ;NO + CAIE C,"." + JRST [ ILGLNM: OUTSTR[ASCIZ/INPUT ERROR! +/] + CLRBFI + JRST DMPNAM] + PUSHJ P,GETWRD ;SCAN EXTENSION + HLLZM T,FILEXT ;SAVE IT. +NOEXT: CAIN C,12 ;HERE TO SCAN PPN + JRST CPOPJ1 ;LEAVE NOW + CAIE C,"[" + JRST ILGLNM ;MUST BE [ + PUSHJ P,GETWRD ;SCAN P. + JUMPE T,ILGLNM + PUSHJ P,RJUST + HRLZM T,FILPPN ;AND SAVE + CAIE C,"," ;BETTER BE COMMA + JRST NOPRG + PUSHJ P,GETWRD ;SCAN PN. + JUMPE T,ILGLNM + PUSHJ P,RJUST + HRRM T,FILPPN ;AND SAVE +NOPRG: SETZ T, + CAIN C,"]" ;BETTER END WITH THIS + PUSHJ P,GETWRD ;MAKE SURE HE DIDN'T TYPE TO MUCH + JUMPN T,ILGLNM ;LOSE IF HE DID + CAIE C,12 + JRST ILGLNM ;DIDN'T END WITH LF + JRST CPOPJ1 +>;NOITS +ITS,< + CAIE C,";" + JRST QOLST1 + MOVEM T,FILPPN + PUSHJ P,QETNAM + JUMPE T,CPOPJ ;STILL NOT REASONABLE +QOLST1: CAIE C,40 + CAIN C,12 + SKIPA + JRST [ ILGLNM: OUTSTR[ASCIZ/INPUT ERROR! +/] + CLRBFI + JRST DMPNAM] + MOVEM T,FILNAM + CAIN C,12 + JRST CPOPJ1 ;DONE + PUSHJ P,QETNAM ;GET SECOND FILE NAME + CAIE C,12 + JRST ILGLNM ;EXTRA GARBAGE AT END + JUMPE T,ILGLNM + MOVEM T,FILEXT + JRST CPOPJ1 +>;ITS + +RJUST: TRZ T,-1 ;THREE LETTERS ONLY + CAIA + LSH T,-6 + TRNN T,77 ;RIGHT JUSTIFIED YET? + JRST .-2 ;NO + POPJ P, + +NOITS,< +GETWRD: SETZ T, ;WORD WILL ACCUMULATE HERE + MOVE A,[POINT 6,T] ;BYTE POINTER TO DEPOSIT CHARACTERS +CHRGET: PUSHJ P,TTYIN ;READ A CHAR +ISCHRX: CAIE C,15 ;IGNORE LF'S + CAIN C,40 ;AND SPACES + JRST CHRGET + CAIL C,"0" ;NUMBERS ARE LEGAL + CAILE C,"9" + CAIA + JRST CHROK + CAILE C,"z" + POPJ P, ;BREAK CHAR. + CAIL C,"a" + SUBI C,40 ;CHANGE LOWER CASE TO UPPER + CAIL C,"A" ;NOW ONLY UPPER CASE LETTERS ARE LEGAL + CAILE C,"Z" + POPJ P, ;BREAK +CHROK: SUBI C,40 ;NO, MAKE IT SIXBIT + TLNE A,770000 ;END OF WORD? + IDPB C,A ;STORE + JRST CHRGET +>;NOITS + +;ITS NAME SCANNER +ITS,< +QETNAM: SETZ T, ;WORD WILL ACCUMULATE HERE + MOVE A,[POINT 6,T] ;BYTE POINTER TO DEPOSIT CHARACTERS +QETNM1: PUSHJ P,TTYIN ;READ A CHAR + CAIE C,15 ;IGNORE LF'S + CAIN C,40 ;AND SPACES + JRST QETNM1 + SKIPA +QETNM2: PUSHJ P,TTYIN + CAIN C,15 + JRST QETNM2 + CAIL C,"a" + CAILE C,"z" + CAIA + SUBI C,40 ;LOWERCASE + CAILE C,40 ;BREAK ON SPACE + CAILE C,"_" + POPJ P, ;NOT SIXBIT CHARACTER + CAIE C,";" + CAIN C,":" + POPJ P, + SUBI C,40 ;NO, MAKE IT SIXBIT + TLNE A,770000 ;END OF WORD? + IDPB C,A ;STORE + JRST QETNM2 +>;ITS + +TTYIN: INCHWL C + ANDI C,177 + CAIN C,15 + JRST TTYIN + POPJ P, +>;LAY +>;NOIII +>;NODEC + ;PUSHIT, POPIT +STORAGE(IMPURE) +FPRINT: 0 +ITS,< MOVE TTT,3(A) + JSP T,.SIXP + OUTCHR[";"] +>;ITS + MOVE TTT,(A) + JSP T,.SIXP +NOITS,< OUTCHR["."] > +ITS,< OUTCHR[" "] > + HLLZ TTT,1(A) + JSP T,.SIXP +NOITS,< +DEC,< SKIPN 3(A) + JRST @FPRINT +FPPPN: +>;DEC + OUTCHR["["] +NOCMU,< + HLLZ TTT,3(A) + JSP T,.SIXPL + OUTCHR[","] + HRLZ TTT,3(A) + JSP T,.SIXPL +>;NOCMU +CMU,< + SKIPN TTT,3(A) + DSKPPN TTT, + MOVE T,[TTT,,PPNBUF] + DECCMU T, + JRST [ JSP T,.SIXPL ;IF DECCMU BLETCHES, SIXPRINT IT + JRST PPNDON ] + OUTSTR PPNBUF +PPNDON: +>;CMU + OUTCHR ["]"] +>;NOITS + JRST @FPRINT + +LOOKRR: RELEASE DAT, +LOOKER: HRRZ T,1(A) + OUTSTR[ASCIZ/, /] + CAIL T,LOKLEN + MOVEI T,ULSERR + OUTSTR @LOKETB(T) + OUTSTR[ASCIZ/. +/] +NOLAY,< JRST LERRET > +LAY,< JRST .LERRET > + +LOKETB: [ASCIZ/FILE NOT FOUND/] + [ASCIZ/ILLEGAL PPN/] + [ASCIZ/PROTECTION FAILURE/] + [ASCIZ/FILE IN USE/] +ULSERR__.-LOKETB + [ASCIZ/UNKNOWN LOOKUP STATUS/] + [ASCIZ/DATA TRANSMISSION ERROR/] +LOKLEN__.-LOKETB + +DEC,< +LOOKCK: 0 + JUMPE T,ANYPPN + MOVEM T,3(A) ;SAVE AWAY HERE FOR NOW + MOVE TTT,[3,,T] + MOVE T,LOOKCK + LDB T,[POINT 4,-1(T),12] ;GET CHANNEL # + PATH TTT, + DSKPPN TTT, ;PATH LOSES, GET USER PPN + CAMN TTT,3(A) ;IS THIS FILE'S ORIGIN DIFFERENT THAN REQUESTED? + JRST @LOOKCK ;NO, WIN + SOS LOOKCK + SOS LOOKCK + HLLZS 1(A) ;MAKE IT FILE NOT FOUND + JRST @LOOKCK ;THIS HAD BETTER RETURN TO LOOKUP ERROR FOR LOOKUP UUO + +ANYPPN: MOVE TTT,[3,,T] + MOVE T,LOOKCK + LDB T,[POINT 4,-1(T),12] ;GET CHANNEL # + PATH TTT, + DSKPPN TTT, ;PATH LOSES, GET USER PPN + MOVEM TTT,3(A) ;AND STORE + MOVE T,LOOKCK + MOVEM T,FPRINT ;TELL HIM WHERE TO GO + JRST FPPPN ;NOW PRINT PPN AND RETURN +>;DEC + +.SIXPL: +NODEC,< +NOIII,< + TLNN TTT,777700 + LSH TTT,14 + TLNN TTT,770000 + LSH TTT,6 +>;NOIII +>;NODEC +IFN DECSW!IIISW,< + MOVE TT,TTT + JUMPE TT,(T) + TRO TT,400000 + ROT TT,3 + TRNN TT,7 + JRST .-2 +.SIXP2: TRZ TT,777770 + ADDI TT,"0" + OUTCHR TT + ROT TT,3 + TLNE TT,-1 + JRST .SIXP2 + JRST (T) +>;IFN DECSW!IIISW + +.SIXP: JUMPE TTT,(T) + SETZ TT, + LSHC TT,6 + ADDI TT,40 + OUTCHR TT + JRST .SIXP + +PGP,< +POPALL: SKIPE $VAL ;ANY ERROR OCCURED? + PUSHJ P,PGPERR;YES, PRINT MESSAGE + POP P,0 ;GET RETURN ADR + EXCH 0,-17(P);RESTORE 0, SAVE RETURN ADR + PUSHJ P,POPIT ;RESTORE ACS 2-17 + MOVEI 1,INTBLK;ENABLE CTRL C INTERCEPT + MOVEM 1,.JBINT + POP P,1 ;RESTORE 1 + POPJ P, + +PUSHAL: SETZM .JBINT ;DISABLE CTRL C INTERCEPT DURING PGP CODE + SETZM $VAL ;CLEAR ERROR ACCUMULATION + EXCH 0,(P) ;SAVE 0 AND GET RETURN + PUSH P,1 ;SAVE 1 + PUSH P,0 ;SAVE RETURN ADR + MOVE 0,-2(P) ;RESTORE 0 +>;PGP +;ONLY SAVE AC'S 2-17 +PUSHIT:EXCH 2,(P) ;SAVE 2 AND GET RETURN. + MOVEM 2,16(P) ;GEE, THIS WAY WE RETURN WITH A POPJ + MOVEI 2,1(P) + HRLI 2,3 + BLT 2,15(P) + MOVE 2,(P) ;RESTORE 2 + ADD P,[XWD 16,16] + POPJ P, ;RETURN TO SENDER + +;ONLY RESTORES AC'S 2-17 +POPIT: MOVSI 17,-15(P) + HRRI 17,3 + BLT 17,17 ;FIXES P + MOVE 2,16(P) + EXCH 2,(P) + POPJ P, + STORAGE(IMPURE) +XLIST +VAR +TWO, +NOTWO, +LIT +LIST diff --git a/src/draw/set.316 b/src/draw/set.316 new file mode 100644 index 00000000..f9c445e2 --- /dev/null +++ b/src/draw/set.316 @@ -0,0 +1,1364 @@ +;SET.FAI.14, 12-NOV-75 20:47:12, EDIT BY HELLIWELL +VERSION(SET,2) +COMMENT  + Set + ___________________________ + | | | + | | | next SET +  --------------------------- +  | | +  | X,Y OF SET CENTER | +  --------------------------- +  +  Member element +  ___________________________ +  | | | +  | | | NEXT MEMBER + --------------------------- + | | | + | BODY? | POINT? | + --------------------------- + + +STRTBX: GETFS(B) ;GET FIRST BLOCK FOR BOX + EXCH B,SETBOX ;POINT TO IT + JUMPE B,.+2 + PUSHJ P,PUTFS ;GIVE BACK OLD LIST + MOVE T,CURSE ;GET CURSOR POSITION + MOVE A,SETBOX + MOVEM T,1(A) ;SAVE HERE + SETZM (A) ;CLEAR LINK + MOVEM A,ENDBOX ;POINTER TO END OF BOX + TRO STBOX ;NOW WE ARE DRAWING A BOX + TRZ ZIGZAG ;ZIG THIS WAY FIRST + MOVEI T,BIGPG ;FLUSH BIG PHRAMUSES + JRST HYDPOG + +SETALT: TRZE INMOV ;TURN OFF MOVING + TRO NEEDCL + TRZN STBOX ;ARE WE DOING A BOX? + POPJ P, ;NO + SKIPE B,SETBOX + PUSHJ P,PUTFS + SETZM SETBOX + TRO NEEDCL + MOVEI T,ANGLPG + JRST HYDPOG + +SPLUS: TRZE INMOV + TRO NEEDCL + TRNN STBOX ;ARE WE DRAWING A SET BOX + JRST STRTBX ;NO + MOVE T,CURSE +FINBOX: MOVE A,ENDBOX + CAMN T,1(A) ;ON TOP OF THE PREVIOS CORNER> + POPJ P, ;YES, IGNORE EXTRA "+" + TRNE ZIGZAG ;UP THEN OVER? + HLL T,1(A) ;USE X OF END POINT + TRCN ZIGZAG ;OVER THEN UP? + HRR T,1(A) ;USE Y OF END POINT + GETFS(B) ;GET A BLOCK FOR END + MOVEM T,1(B) + SETZM (B) + MOVEM B,(A) + MOVEM B,ENDBOX + POPJ P, + +SSPACE: TRNE STBOX ;DRAWING A BOX? + TRC ZIGZAG ;YES, COMPLIMENT SENSE OF ZIG + TRZE INMOV ;MOVING? + TRO NEEDCL ;YES, FIND CLOSEST AGAIN + POPJ P, ;NO, JUST RETURN + ;SROT, STTFND, STBFND +MPC,< +SROT: PUSHJ P,GETCLS + JRST PERRET + TRO MCHG + PUSH P,A + PUSH P,1(A) ;CENTER OF SET + HLRZ A,(A) ;POINTER TO SET LIST +SROT1: HRRZ B,1(A) ;GET A POINT + JUMPE B,NOROTP ;NONE + FETCH(T,B,PXY) + ADJUST(SUB,T,<(P)>) ;OFFSET FROM CENTER OF SET + XCT XTB1+1 ;ROTATE T, 90o CCW + XCT XTB2+1 + XCT XTB3+1 + TLZ T,1 + ADJUST(ADD,T,<(P)>) ;PUT BACK OFFSET + STORE(T,B,PXY) +NOROTP: HLRZ B,1(A) ;BODY + JUMPE B,NOROTB ;NONE + FETCH(T,B,BXY) + ADJUST(SUB,T,<(P)>) + XCT XTB1+1 + XCT XTB2+1 + XCT XTB3+1 + TLZ T,1 + ADJUST(ADD,T,<(P)>) + STORE(T,B,PXY) + FETCH(T,B,BORI) + ADDI T,1 ;90 DEGREES LEFT + ANDI T,3 ;ONLY 4 STATES + STORE(T,B,BORI) + PUSH P,A + HLRZ A,1(A) ;GET POINTER TO BODY AGAIN + PUSHJ P,BODFIX ;FIX POINTS + POP P,A +NOROTB: HRRZ A,(A) + JUMPN A,SROT1 + POP P,(P) ;DON'T NEED TO REMEMBER WHERE SET IS ANY MORE + POP P,A +; JRST FEDFIX ;FIX FEED THROUGH'S + +FEDFIX: HLRZ A,(A) +FEDFX1: HRRZ B,1(A) ;POINT? + JUMPE B,FEDFX2 + FETCHL(TT,B,PBIT) + TLNN TT,FEEDTH ;FEED THROUGH? + JRST FEDFX2 ;NO + FETCH(T,B,PFEED) + FETCH(TT,B,PXY) + STORE(TT,T,PXY) +FEDFX2: HRRZ A,(A) + JUMPN A,FEDFX1 + POPJ P, +>;MPC + +STBFND: +STTFND: OUTSTR[ASCIZ/NOT YET BOSS! +/] + POPJ P, + STMNS: TRZN STBOX ;DRAWING A BOX? + POPJ P, + MOVE T,SETBOX + MOVE T,1(T) ;X,Y OF START OF BOX + PUSHJ P,FINBOX ;FINISH BOX AT END + MOVE T,SETBOX + MOVE T,1(T) + PUSHJ P,FINBOX ;IT TAKES TWO + MOVEI A,CLOSES ;START SET HERE + SETZB H,CLOSES ;COLLECT SET IN CLOSES, X IN H + SETZB F,E ;COLLECT Y IN F + SKIPE B,PONPNT ;ON SCREEN POINTS + PUSHJ P,CHKPNT +MPC,< + TRNN BTHSDS + JRST ONESID ;ONE SIDED SET + SKIPE B,PONPN2 + PUSHJ P,CHKPNT +ONESID: +>;MPC + JRST ENDPNT + +CHKPNT: FETCHL(T,B,PBIT) + TLNE T,MPC,ISPIN + JRST NOTINP ;IT'S A PIN IT GOES WITH THE BODY + FETCH(T,B,PXY) + PUSHJ P,INBOX ;IS IT IN SET + JRST NOTINP ;NO + GETFS(T) ;GET A BLOCK FOR POINT + HRRZM B,1(T) ;PUT POINT IN SET + SETZM (T) ;CLEAR LINK + HRRZM T,(A) ;LINK ONTO END OF SET + MOVE A,T ;NEW END + FETCH(T,B,PY) + ADD F,T + FETCH(T,B,PX) + ADD H,T + ADDI E,1 +NOTINP: HRRZ B,(B) ;NEXT POINT + JUMPN B,CHKPNT ;CHECK IT + POPJ P, + ;END NEW SET +ENDPNT: MOVEI A,CLOSES ;BACK TO THE BEGINNING + MOVEI B,DBODPN ;NOW CHECK BODIES + JRST NOTINB +CHKBOD: FETCH(T,B,BXY) + PUSHJ P,INBOX ;IN BOX? + JRST NOTINB ;NO + HRRZ T,(A) ;NEED ANOTHER BLOCK? + JUMPN T,NONEED ;NO + GETFS(T) + SETZM (T) + SETZM 1(T) + HRRZM T,(A) ;LINK ON END +NONEED: HRRZ A,T ;NEW END + HRLM B,1(A) ;PUT BODY IN SET + FETCH(T,B,BY) + ADD F,T + FETCH(T,B,BX) + ADD H,T + ADDI E,1 +NOTINB: HRRZ B,(B) + JUMPN B,CHKBOD + SKIPE B,SETBOX + PUSHJ P,PUTFS ;DON'T NEED BOX ANY MORE + SETZM SETBOX + MOVEI T,ANGLPG + PUSHJ P,HYDPOG ;OR DRAWING OF IT + SKIPN A,CLOSES ;DID WE MAKE A SET? + POPJ P, ;NO + GETFS(B) + HRLZM A,(B) ;GIVE NEW SET A LIST POINTER AND X,Y + MOVE A,SETPNT + MOVEM B,SETPNT + HRRM A,(B) ;LINK IN NEW SET + MOVE T,F + IDIV T,E ;AVERAGE OF Y VALUES +MD,< TRZ T,1 ;CLEAR LOW ORDER BIT + HRRM T,1(B) + MOVE T,H + IDIV T,E ;AVERAGE OF X VALUES + TRZ T,1 ;CLEAR LOW ORDER BIT +>;MD +MPC,< + ASH T,-1 + IDIV T,STPSIZ + IMUL T,STPSIZ + ASH T,1 + HRRM T,1(B) + MOVE T,H + IDIV T,E ;AVERAGE OF X VALUES + ASH T,-1 + IDIV T,STPSIZ + IMUL T,STPSIZ + ASH T,1 +>;MPC + HRLM T,1(B) + MOVE T,B + JRST SCLOSP ;SET AS CLOSEST AND MOVE THERE + ;KILL ALL SETS -- CALLED FROM CLEAR +SBLAST: TRZ STBOX!INMOV + TRO NEEDCL +SBLST1: MOVEI B,SETPNT + SKIPN A,SETPNT + POPJ P, ;ALL GONE, DONE + PUSHJ P,SCLEAR + JRST SBLST1 + +;KILL ALL TEXT IN CLOSEST SET +STKILT: TRNN STBOX + PUSHJ P,GETCLS + JRST PERRET + HLRZ A,(A) +STKIL1: HLRZ D,1(A) ;BODY + JUMPE D,STKIL4 + FETCH(D,D,BLNK) + JUMPE D,STKIL4 +STKIL3: FETCH(B,D,BPTXT) + JUMPE B,STKIL2 + CLEAR(D,BPTXT) + TRO MCHG + PUSHJ P,PUTFS +STKIL2: FETCH(D,D,BPLNK) + JUMPN D,STKIL3 +STKIL4: HRRZ C,1(A) ;POINT? + JUMPE C,NSTPNT + FETCH(B,C,PTXT) + JUMPE B,NSTPNT + CLEAR(C,PTXT) + TRO MCHG + PUSHJ P,PUTFS +NSTPNT: HRRZ A,(A) + JUMPN A,STKIL1 + POPJ P, + +;FLUSH THIS SET (LEAVE CONTENTS ALONE) +SETDEL: TRNN STBOX ;DRAWING A BOX OR MOVEING + PUSHJ P,GETCLS + JRST PERRET + TRZ INMOV + TRO NEEDCL + MOVE B,CLAST +SCLEAR: HRRZ T,(A) + HRRM T,(B) ;LINK SET OUT + HLRZS (A) ;LINK UP SET FOR DELETION + MOVE B,A + PUSHJ P,PUTFS ;GIVE BACK SET + CAME A,CURSET + POPJ P, + SETZM CURSET + TRO MCHG + POPJ P, + ;DELETE CONTENTS OF CLOSEST SET +SETKIL: TRNN STBOX ;MOVING OR DRAWING BOX? + PUSHJ P,GETCLS + JRST PERRET ;YES + TRZ INMOV + TRO MCHG!NEEDCL + PUSH P,CLAST + PUSH P,A ;SAVE SET POINTER FOR DELETION + MOVSI D,() + PUSHJ P,STBITA + MOVSI D,() + MOVE A,(P) + PUSHJ P,STBITB + POP P,A ;THIS SET + POP P,B ;AND LAST + PUSHJ P,SCLEAR ;NOW FLUSH SET + JRST DOSDEL ;NOW DELETE ALL MARKED POINTS AND BODIES + +;DELETE COMPLIMENT OF SET +DCOMPL: TRNN STBOX + PUSHJ P,GETCLS + JRST PERRET + MOVE B,CLAST + HRRZ C,(A) + HRRM C,(B) + PUSH P,A + MOVSI D,() + PUSHJ P,STBITA ;MARK ALL POINTS AND BODIES + MOVE A,(P) + MOVSI D,() + PUSHJ P,STBITB ;NOW UNMARK OUR SET + PUSHJ P,SBLST1 ;FLUSH ALL OTHER SETS + PUSHJ P,DOSDEL + SETZM LSTNAM ;DISABLE TEXISTS +LAY,< SETZM SAVNAM > + PUSHJ P,FILEUP ;UPDATE ON SCREEN + TRO MCHG + POP P,SETPNT ;THIS IS NOW ONLY SET + HLLZS @SETPNT ;CLEAR ITS NEXT POINTE + POPJ P, + +DOSDEL: MOVEI B,PONPNT + PUSHJ P,PNTSET +MPC,< MOVEI B,PONPN2 + PUSHJ P,PNTSET +>;MPC + MOVEI A,DBODPN + JRST BODSET + +BODST1: FETCHL(T,A,BBIT) + TLNN T,BTMP1 ;NEED TO BE DELETED? + JRST BODSET + PUSH P,B ;SAVE POINTER TO LAST + PUSHJ P,BDELETE ;YES + POP P,A +BODSET: MOVE B,A + HRRZ A,(A) + JUMPN A,BODST1 + POPJ P, + +PNTST1: FETCHL(T,B,PBIT) + TLNN T,MPC,ISPIN ;THESE GO WITH BODY + TLNN T,1 + JRST PNTSET ;TRY NEXT + PUSH P,A ;SAVE LAST + PUSHJ P,DELPNT + POP P,B ;BACK UP TO LAST SO FORWARD GET NEW POINT +PNTSET: MOVE A,B + HRRZ B,(B) + JUMPN B,PNTST1 + POPJ P, + +;MARK ALL POINTS+BODIES +;D = SET/CLR INSTRUCTION +STBITA: MOVSI C,1 + MOVE T,[IORM C,ADDR(A,PBIT)] + DPB T,[3300,,D] + SKIPE A,PONPNT + PUSHJ P,PNTBST +MPC,< SKIPE A,PONPN2 + PUSHJ P,PNTBST +>;MPC + MOVE T,[IORM C,ADDR(A,BBIT)] + DPB T,[3300,,D] + SKIPN A,DBODPN + POPJ P, + MOVSI C,BTMP1 +BODBST: XCT D + HRRZ A,(A) + JUMPN A,BODBST + POPJ P, + +PNTBST: XCT D + HRRZ A,(A) + JUMPN A,PNTBST + POPJ P, + +;MARK ALL BODIES/POINTS IN SET +;D = ANDCAM/IORM INSTRUCTION +STBITB: MOVSI C,1 + MOVE T,[IORM C,ADDR(T,PBIT)] + DPB T,[3300,,D] + PUSH P,A + HLRZ A,(A) +SETBT1: HRRZ T,1(A) + JUMPE T,SETBT2 + XCT D +SETBT2: HRRZ A,(A) + JUMPN A,SETBT1 + POP P,A + MOVSI C,BTMP1 + MOVE T,[IORM C,ADDR(T,BBIT)] + DPB T,[3300,,D] + HLRZ A,(A) +SETBT3: HLRZ T,1(A) + JUMPE T,SETBT4 + XCT D +SETBT4: HRRZ A,(A) + JUMPN A,SETBT3 + POPJ P, + ;APPEND STUFF TO "CURRENT" SET + +;APPEND BODY TO CURRENT SET +APPBOD: PUSHJ P,GETCLS + JRST PERRET + MOVE B,A + SETZ E, + PUSHJ P,APPPB +RECNTC: SKIPA A,CURSET +RECNTR: CAMN A,CURSET + TRO MCHG ;MUST UPDATE CURSET + HRLM A,(P) + TRO NEEDCL ;MAY CHANGE CLOSEST + SETZ TT, + SETZB B,C + HLRZ A,(A) +RCNTR1: HRRZ D,1(A) + PUSHJ P,ADCNTR + HLRZ D,1(A) + PUSHJ P,ADCNTR + HRRZ A,(A) + JUMPN A,RCNTR1 + JUMPE TT,CPOPJ + HLRZ A,(P) + IDIV C,TT +MD,< TRZ C,1 ;CLEAR LOW ORDER BIT + HRRM C,1(A) + IDIV B,TT + TRZ B,1 +>;MD +MPC,< + ASH C,-1 + IDIV C,STPSIZ + IMUL C,STPSIZ + ASH C,1 + HRRM C,1(A) + IDIV B,TT + ASH B,-1 + IDIV B,STPSIZ + IMUL B,STPSIZ + ASH B,1 +>;MPC + HRLM B,1(A) + POPJ P, + +ADCNTR: JUMPE D,CPOPJ + FETCH(T,D,QY) + ADD C,T + FETCH(T,D,QX) + ADD B,T + AOJA TT,CPOPJ + +CENALL: SKIPN A,SETPNT + POPJ P, +CENAL1: HRLM A,(P) + PUSHJ P,RECNTR + HLRZ A,(P) + HRRZ A,(A) + JUMPN A,CENAL1 + POPJ P, + +;APPEND POINT TO CURRENT SET +APPPNT: PUSHJ P,GETCLS + JRST PERRET + MOVE B,A + FETCHL(T,B,PBIT) + TLNE T,MPC,ISPIN + JRST PERRET + MOVEI E,1 + PUSHJ P,APPPB + JRST RECNTC + +;E= 0 APPEND BODY, =1 APPEND POINT +;B = THING TO ADD +APPPB: SKIPN A,CURSET ;AND A CURRENT SET? + JRST [ GETFS (A) + GETFS (T) + HRLM T,(A) + SETZM 1(A) + SETZM (T) + SETZM 1(T) + EXCH A,SETPNT + HRRM A,@SETPNT + MOVE A,SETPNT + MOVEM A,CURSET + JRST .+1] + HLRZ A,(A) + SETZ C, ;THIS WILL POINT TO A PLACE TO PUT HIM +APPPN1: XCT (E)[HLRZ T,1(A) + HRRZ T,1(A)] + CAMN T,B ;ALREADY IN SET? + POPJ P, ;YES, NOOP + SKIPN T + MOVE C,A + MOVE D,A + HRRZ A,(A) + JUMPN A,APPPN1 + JUMPN C,APPPN2 + GETFS(C) + HRRM C,(D) + SETZM (C) + SETZM 1(C) +APPPN2: XCT (E)[HRLM B,1(C) + HRRM B,1(C)] + POPJ P, + +;MAKE CLOSEST SET THE CURRENT SET +SETSET: PUSHJ P,GETCLS + JRST PERRET + TRO MCHG + MOVEM A,CURSET + POPJ P, + +;APPEND CLOSEST SET TO CURRENT SET +APPSET: SKIPN CURSET ;AND CURRENT ONE? + JRST SETSET ;NO, DO & + PUSHJ P,GETCLS ;CLOSEST SET? + JRST PERRET + CAMN A,CURSET ;APPENDING TO HIMSELF? + POPJ P, ;YES, NOOP + MOVEI E,1 ;START WITH POINTS +APPST1: MOVE F,A + HLRZ F,(F) +APPST2: XCT (E)[HLRZ B,1(F) + HRRZ B,1(F)] + JUMPE B,APPSKP + PUSH P,A + PUSHJ P,APPPB + POP P,A +APPSKP: HRRZ F,(F) + JUMPN F,APPST2 + SOJGE E,APPST1 ;LOOP FOR BODIES + JRST RECNTC ;NOW RE-CENTER SET + ;REMOVE POINT FROM CURRENT SET +XPNT: SKIPE B,CURSET + PUSHJ P,GETCLS + JRST PERRET + EXCH A,B + MOVEI E,1 + PUSHJ P,XPNBD + JRST RECNTC + +;REMOVE BODY FROM CURRENT SET +XBOD: SKIPE B,CURSET + PUSHJ P,GETCLS + JRST PERRET + EXCH A,B + SETZ E, + PUSHJ P,XPNBD + JRST RECNTC + +XPNBD: HLRZ A,(A) +XPNBD1: XCT (E)[HLRZ T,1(A) + HRRZ T,1(A)] + CAMN T,B + XCT (E)[HRRZS 1(A) + HLLZS 1(A)] + HRRZ A,(A) + JUMPN A,XPNBD1 + POPJ P, + +;REMOVE MEMBERS OF CLOSEST SET FROM CURRENT SET +XSET: TRNN STBOX + SKIPN C,CURSET + JRST PERRET + MOVEI E,1 + PUSHJ P,GETCLS + JRST PERRET + CAMN C,CLOSES + JRST PERRET + TRZ INMOV + EXCH C,A +XSET2: PUSH P,C + HLRZ C,(C) +XSET1: XCT (E)[HLRZ B,1(C) + HRRZ B,1(C)] + JUMPE B,.+3 + MOVE A,CURSET + PUSHJ P,XPNBD + HRRZ C,(C) + JUMPN C,XSET1 + POP P,C + SOJGE E,XSET2 + JRST RECNTC + +;CLEAR CURRENT SET +CLRCUR: SETZM CURSET + TRO MCHG ;MUST CHANGE WHOLE THING + POPJ P, + +;REMOVE POINT FROM ALL SETS +XPNTA: PUSHJ P,GETCLS + JRST PERRET + MOVE B,A + PUSHJ P,REMPNT + JRST ALCNTR + +;REMOVE BODY FROM ALL SETS +XBODA: PUSHJ P,GETCLS + JRST PERRET + PUSHJ P,REMBOD + JRST ALCNTR + +;REMOVE MEMBERS OF THIS SET FROM ALL SETS +;AND DELETE SET +XSETA: TRNN STBOX + PUSHJ P,GETCLS + JRST PERRET + TRZ INMOV + TRO NEEDCL + PUSH P,CLAST + PUSH P,A + HLRZ A,(A) +XSETA1: PUSH P,A + HLRZ A,1(A) + JUMPE A,.+2 + PUSHJ P,REMBOD + MOVE A,(P) + HRRZ B,1(A) + JUMPE B,.+2 + PUSHJ P,REMPNT + POP P,A + HRRZ A,(A) + JUMPN A,XSETA1 + POP P,A + POP P,B + PUSHJ P,SCLEAR +ALCNTR: SKIPN E,SETPNT + POPJ P, +ALCNT1: MOVE A,E + PUSHJ P,RECNTR + HRRZ E,(E) + JUMPN E,ALCNT1 + POPJ P, + +SETJMP: SKIPN T,CURSET + JRST PERRET + TRZ STBOX!INMOV + JRST SCLOSP + ;WRITE CLOSEST SET INTO FILE +SWRITE: MOVE T,MODE + TRNN STBOX ;NOT DRAWING BOX, AND + CAIE T,SETM ;SET MODE ONLY + JRST PERRET + PUSHJ P,GETCLS + JRST PERRET + PUSH P,A ;SAVE SET POINTER + MOVSI D,() + PUSHJ P,STBITA ;CLEAR ALL BITS + MOVE A,(P) ;GET SET POINTER + MOVSI D,() + PUSHJ P,STBITB ;NOW MARK THIS SET + POP P,SETFLG ;SETUP FLAG TO THIS SET + JRST DWRITS ;AND WRITE FILE + ;ASSOCIATIVE SET +ASSETP: PUSHJ P,GETCLS + JRST PERRET + TRZ INMOV!INLIN + PUSHJ P,ASSCLR + PUSHJ P,ASSPTP +ASSFIN: MOVEI T,SETM + PUSHJ P,CHNGMD ;GO INTO SET MODE + MOVE A,SETPNT + PUSHJ P,RECNTR ;CALC CENTER + MOVE A,SETPNT + MOVE T,1(A) ;LOC OF CENTER + JRST CHKON + +;ASSOCIATE POINT +ASSPTP: FETCHL(D,A,PBIT) + TLOE D,1 + POPJ P, + STOREL(D,A,PBIT) + PUSH P,A + TLNN D,MPC,ISPIN ;THESE DON'T GO INTO SET + PUSHJ P,ASPUTP +MPC,< TRNE BTHSDS ;ONLY IN BOTH SIDES MODE + TLNN D,FEEDTH + JRST NOFOLF + FETCH(A,A,PFEED) ;FOLLOW FEEDTHROUGH + PUSHJ P,ASSPTP + JRST NOBODF + +NOFOLF: +>;MPC + TLNN D,ISPIN + JRST NOBODF + FETCH(A,A,BBODY) + PUSHJ P,ASSPTB +NOBODF: +MD,< MOVE B,(P) + FETCH(A,B,PND) + SKIPE A + PUSHJ P,ASSPTP + MOVE B,(P) + FETCH(A,B,PNU) + SKIPE A + PUSHJ P,ASSPTP + MOVE B,(P) + FETCH(A,B,PNL) + SKIPE A + PUSHJ P,ASSPTP + POP P,A + FETCH(A,A,PNR) + JUMPN A,ASSPTP + POPJ P, +>;MD +MPC,< POP P,A ;PICKUP DATA BLOCK POINTER AGAIN + FETCH(B,A,PNEB) + JUMPE B,CPOPJ +ASSL1: MOVEI C,2 +ASSL2: XCT (C)[HLRZ A,(B) + HRRZ A,1(B) + HLRZ A,1(B)] + JUMPE A,ASSL3 + HRLM C,B + PUSH P,B + PUSHJ P,ASSPTP + POP P,B + HLRZ C,B +ASSL3: SOJGE C,ASSL2 + HRRZ B,(B) + JUMPN B,ASSL1 + POPJ P, +>;MPC + +ASSETB: PUSHJ P,GETCLS + JRST PERRET + TRZ INMOV + PUSHJ P,ASSCLR + PUSHJ P,ASSPTB + JRST ASSFIN + +ASSPTB: FETCHL(T,A,BBIT) + TLOE T,BTMP1 ;DONE ALREADY? + POPJ P, + STOREL(T,A,BBIT) + PUSHJ P,ASPUTB ;PUT BODY + FETCH(A,A,BLNK) ;NOW ALL ITS PINS + JUMPE A,CPOPJ +ASSBP2: +MPC,< TRNE BTHSDS ;DOING BOTH SIDES? + JRST ASSBTH ;YES + FETCHL(T,A,BPBIT) + EQV T,SID + JUMPGE T,ASSBP1 ;JUMP IF ON OTHER SIDE +ASSBTH: +>;MPC + PUSH P,A + PUSHJ P,ASSPTP + POP P,A +ASSBP1: FETCH(A,A,BPLNK) + JUMPN A,ASSBP2 + POPJ P, + +ASPUTP: MOVE T,H +ASPTP1: HRRZ TT,1(T) ;FIND MEMBER BLOCK WITH EMPTY POINT SLOT + JUMPE TT,ASPTP2 + MOVE TT,T + HRRZ T,(T) + JUMPN T,ASPTP1 + GETFS(T) ;NONE, ADD EXTRA + HRRM T,(TT) + SETZM (T) + SETZM 1(T) +ASPTP2: HRRM A,1(T) + POPJ P, + +ASPUTB: MOVE T,H +ASPTB1: HLRZ TT,1(T) ;FIND EMPTY SLOT FOR BODY + JUMPE TT,ASPTB2 + MOVE TT,T + HRRZ T,(T) + JUMPN T,ASPTB1 + GETFS(T) + HRRM T,(TT) + SETZM (T) + SETZM 1(T) +ASPTB2: HRLM A,1(T) + POPJ P, + +ASSCLR: PUSH P,A + MOVSI D,() + PUSHJ P,STBITA + POP P,A + GETFS(T) + SETZM 1(T) + EXCH T,SETPNT + GETFS(H) + HRL T,H + MOVEM T,@SETPNT + SETZM (H) + SETZM 1(H) + POPJ P, + ;REMPNT, REMBOD, INBOX +;REMPNT - REMOVE POINT FROM ALL SETS, LISTS, ETC. +;B = POINT +REMPNT: CAMN B,MOVED ;DON'T CHECK LATER IF GOING AWAY + SETZM MOVED +UML,< MOVEI D,WIRLST + JRST ISWL + +ISWL1: HRRZ C,1(D) +ISWL3: HLRZ T,(C) + CAMN T,B + HRRZS (C) + HRRZ C,(C) + JUMPN C,ISWL3 +ISWL: HRRZ D,(D) + JUMPN D,ISWL1 +>;UML + MOVEI D,BLPNTR + JRST ISBL + +ISBL1: HRRZ T,1(D) + CAME T,B + JRST ISBL + HRRZ T,(D) + HRRM T,(C) + FSTRET(D) + MOVE D,C +ISBL: MOVE C,D + HRRZ D,(D) + JUMPN D,ISBL1 +MPC,< +ROUTE,< CAMN B,RCL1 + SETZM RCL1 + CAMN B,RCL2 + SETZM RCL2 +>;ROUTE +>;MPC +SHORT,< MOVEI D,SHRTER + JRST SHRTR1 + +SHRTR2: HLRZ A,(D) + HRRZ T,1(D) + CAMN T,B + JRST SHRTR3 + HLRZ T,1(D) + CAMN T,B + JRST SHRTR3 + HRRZ T,1(A) + CAMN T,B + JRST SHRTR3 + HLRZ T,1(A) + CAME T,B + JRST SHRTR1 +SHRTR3: FSTRET(A) + HRRZ T,(D) + HRRM T,(C) + FSTRET(D) + MOVE D,C +SHRTR1: MOVE C,D + HRRZ D,(D) + JUMPN D,SHRTR2 + HLRZ T,SERR1 + HRRZ D,SERR1 + CAME T,B + CAMN D,B + JRST SHRTR4 + HLRZ T,SERR2 + HRRZ D,SERR2 + CAME T,B + CAMN D,B + JRST SHRTR4 + JRST SHRTR5 + +SHRTR4: SETZM SERR1 + SETZM SERR2 +SHRTR5: +>;SHORT + SKIPN C,SETPNT + POPJ P, +REMP1: HLRZ D,(C) ;GO DOWN SET +REMP2: HRRZ E,1(D) ;A POINT + CAMN E,B ;IS THIS IT? + HLLZS 1(D) ;YES, CLEAR POINTER + HRRZ D,(D) ;NEXT MEMBERS + JUMPN D,REMP2 + HRRZ C,(C) ;NEXT SET + JUMPN C,REMP1 + POPJ P, + +REMBOD: SKIPN C,SETPNT + POPJ P, +REMB1: HLRZ B,(C) ;GO DOWN SET...... +REMB2: HLRZ D,1(B) ;A BODY + CAMN D,A ;IS THIS IT + HRRZS 1(B) ;CLEAR POINTER + HRRZ B,(B) + JUMPN B,REMB2 + HRRZ C,(C) + JUMPN C,REMB1 + POPJ P, + +INBOX: MOVE C,SETBOX + SETZ G, +INBOX1: HRRZ TT,(C) + JUMPE TT,INDONE ;FINI + HLLZ TT,1(TT) ;X,Y OF NEXT POINT + HLLZ TTT,1(C) ;X,Y OF THIS POINT + HLLZ D,T ;GET X PART OF T + CAMN TT,TTT ;SAME X VALUES FOR LINE? + JRST CKVERT ;YES, SPECIAL CHECK + CAMG TT,TTT ;WHICH IS GREATER? + EXCH TT,TTT ;REVERSE + CAML D,TTT ;NOT IN RANGE? + CAML D,TT ; " + JRST VERT ;DOESN'T MAKE IT + HRRE TT,1(C) ;Y ONLY + HRRE D,T ;Y OF POINT IN QUESTION + CAMN TT,D ;IF ON LINE, IMMEDIATE WIN! + JRST CPOPJ1 + CAML TT,D ;CHECK IF Y VALUE OF LINE IS GREATER THAN THAT OF POINT + ADDI G,1 ;ANOTHER CROSSING + JRST VERT + +VERT: HRRZ C,(C) + JRST INBOX1 + +CKVERT: CAME D,TT ;POINT ALSO ON VERTICAL LINE? + JRST VERT ;NO, SKIP IT + HRRZ TT,(C) + HRRE TTT,1(TT) ;GET Y VALUES + HRRE TT,1(C) ; " + HRRE D,T ;Y PART OF T + CAMG TT,TTT ;WHICH IS GREATER? + EXCH TT,TTT ;REVERSE + CAMG D,TT + CAMGE D,TTT + JRST VERT ;NOT ON LINE, IGNORE + JRST CPOPJ1 ;IMMEDIATE WIN IF ON VERT LINE + +INDONE: TRNE G,1 ;ODD NUMBER OF CROSSINGS? + AOS(P) ;YES, SKIP RETURN, IT WAS IN THE BOX + POPJ P, + MD,< +SETCOP: TRNN STBOX ;ARE WE MOVING OR DRAWING A BOX? + PUSHJ P,GETCLS ;CURRENT SET + JRST PERRET ;NOT NOW BROTHER + TRZ INMOV + MOVE G,A + MOVEI T,BIGPG + PUSHJ P,HYDPOG + PUSH P,CURSET + MOVEM A,CURSET + PUSH P,CURSE + MOVE T,CURSE + ADJUST(SUB,T,<1(G)>) ;GET OFFSET TO NEW SET + MOVEM T,NOFFST ;REMEMBER IT + MOVE T,PID + MOVEM T,OLDPID + MOVE T,BID + MOVEM T,OLDBID + HLRZ G,(G) ;START OF OLD SET + SETZM NEWSET ;COLLECT NEW SET HERE + MOVEI H,NEWSET ;POINTER TO END OF NEW SET +BODNEW: GETFS(T) ;NEW BLOCK FOR NEW SET + SETZM (T) + SETZM 1(T) ;CLEAR IT + HRRM T,(H) ;LINK IT IN + MOVE H,T ;POINT TO IT + HLRZ B,1(G) ;BODY OF THIS BLOCK + JUMPE B,NNWBOD ;NONE HERE +;Create copy of BODY + FETCH(C,B,BXY) + ADJUST(ADD,C,NOFFST) ;ADD OFFSET + MOVEM C,CURSE ;WHERE TO PUT NEW BODY + FETCH(C,B,BTYP) + MOVEM C,CURBOD ;SAVE HERE FOR BPYES + PUSH P,B + FETCH(C,B,BORI) + MOVEM C,CURORT ;SAVE HERE FOR BPYES + PUSHJ P,BPYES ;PLANT THE BODY + MOVE T,DBODPN ;NEWEST BODY + HRLM T,1(H) ;TO NEW SET + POP P,A + FETCH(C,A,BID) ;OLD BID + ADD C,OLDBID ;NEW BODY ID + STORE(C,T,BID) + MOVE B,[FIXLOC!FIXBLO,,0] + AND B,ADDR(A,BBIT) ;GET THESE OLD BITS + IORM B,ADDR(T,BBIT) ;COPY TO NEW + FETCH(B,A,BLOC) + JUMPE B,NCPLOC ;SKIP IF NONE + MOVEI B,-1+ADDR(T,BLXY) + STORE(B,T,BLOC) + FOR I IN (BLXY,BRSLOX,BLO,BPAK,BDEF) +< FETCH(B,A,I) + STORE(B,T,I) +> +NCPLOC: FETCH(B,A,BTXT) ;OLD BODY TEXT/PROPERTY LIST + JUMPE B,NNWBOD + MOVE A,T ;MERGE ONTO A'S BTXT LIST (NULL) + PUSHJ P,MERGEP +NNWBOD: HRRZ B,1(G) ;POINT FIELD + JUMPE B,NNWPNT ;NONE +;Now create copies of all points + FETCH(TTT,B,PID) + PUSH P,TTT + FETCH(T,B,PXY) + ADJUST(ADD,T,NOFFST) ;OFFSET + PUSHJ P,PNTPUT ;MAKE A POINT(ALWAYS) + HRRM D,1(H) ;PUT IN NEW SET + POP P,TTT + ADD TTT,OLDPID ;NEW POINT ID + STORE(TTT,D,PID) +NNWPNT: HRRZ G,(G) ;NEXT SET BLOCK + JUMPN G,BODNEW ;LOOP + ;NOW COPY STUFF ONTO NEW POINTS AND PINS + MOVE G,CURSET + HLRZ G,(G) ;POINTER TO SET + MOVE H,NEWSET ;AND NEW ONE +BODPNS: HLRZ A,1(G) ;OLD BODY + JUMPE A,NTPINS +;******************** PINS *********************** + FETCH(A,A,BLNK) ;ANY PINS ON OLD BODY? + JUMPE A,NTPINS +NXTPIN: FETCH(B,A,BPLOC) + HLRZ C,1(H) ;NEW BODY + FETCH(C,C,BLNK) +PINNUM: JUMPE C,PINDON + MOVEM C,NEWPNT + FETCH(E,C,BPLOC) + CAME E,B ;IS THIS THE ONE + JRST [ FETCH(C,C,BPLNK) + JRST PINNUM] +THSPIN: PUSHJ P,PCOPY ;COPY TEXT AND TEXT BITS +NNWTXT: FETCH(T,A,BPPN) ;COPY PIN # + STORE(T,C,BPPN) + PUSHJ P,SEGCOP ;MAKE SEGMENTS (USE POINTER IN NEWPNT) +PINDON: FETCH(A,A,BPLNK) + JUMPN A,NXTPIN ;NEXT PIN OF THIS BODY +;********************* POINT ******************** +NTPINS: HRRZ A,1(G) ;OLD POINT + JUMPE A,NNOPNT ;NO POINT HERE + HRRZ C,1(H) ;NEW POINT + MOVEM C,NEWPNT + FETCHL(TT,C,PBIT) + TLNN TT,CPIN ;CONNECTOR PIN HERE? + JRST NOCCPN ;NO + FETCH(TT,A,PLOC) + GETFS (TTT) ;GETBLK(,LOCO) or CPYLOC + MOVE B,(TT) + MOVEM B,(TTT) + MOVE B,1(TT) + MOVEM B,1(TTT) + STORE(TTT,C,PLOC) + MOVSI TTT,CPIN!FIXCON + AND TTT,ADDR(A,PBIT) ;PICKUP FIXCON BIT AS WELL AS CPIN + IORM TTT,ADDR(C,PBIT) ;AND MARK IT +NOCCPN: PUSHJ P,PCOPY ;COPY TEXT AND TEXT BITS +NNOTXT: PUSHJ P,SEGCOP ;MAKE SEGMENTS +NNOPNT: HRRZ H,(H) + HRRZ G,(G) ;NEXT OF NEW AND OLD + JUMPN G,BODPNS ;NEXT BLOCK +;END FINISH UP + GETFS(A) ;NEW BLOCK + MOVE B,SETPNT ;LINK HIM IN + HRL B,NEWSET ;POINT TO SET + MOVEM B,(A) ;TO NEW BLOCK + MOVEM A,SETPNT ;DONE + MOVE T,A + HRLI T,SETPNT + PUSHJ P,SCLOSE + POP P,CURSE ;RESTORE CURSOR POSITION + POP P,CURSET + MOVE T,CURSE + MOVEM T,1(A) ;PUT SET AT CURSOR + MOVEI T,SETM + PUSHJ P,CHNGMD + PUSHJ P,DOSMOV + TRO MCHG ;START MOVING AND MARK AS CHANGED + MOVE T,OLDBID + MOVEM T,BID + MOVE T,OLDPID + MOVEM T,PID + JRST REEID ;SPREAD NEW ID'S OVER RANGE OLDBID- + +;SEGCOP - COPY LINKS TOPOLOGY FROM OLD POINT +;A = SOURCE POINT +;C = DEST POINT + +DEFINE FOO $ (PND,PNU) +< FETCH(T,C,PND) ;ALREADY LINK THERE? + JUMPN T,LOS$PND + FETCH(T,A,PND) ;OLD POINT HAVE LINK HERE? + JUMPE T,LOS$PND ; NO, DO NOTHING + MOVE TTT,T + PUSHJ P,GETID ;GET ID OF POINT IN OLD TOPO + PUSHJ P,FNDID ;AND FIND CORRESPONDING POINT IN NEW + JRST LOS$PND + FETCH(T,D,PNU) ;HIS BACK LINK ALREADY USED?? + JUMPN T,LOS$PND + STORE(D,C,PND) ;US TO HIM + STORE(C,D,PNU) ;HIM BACK TO US +LOS$PND: +> + +SEGCOP: FOO(PND,PNU) ;COPY ALL FOUR POSSIBLE SEGMENTS + FOO(PNU,PND) + FOO(PNL,PNR) + FOO(PNR,PNL) + POPJ P, + +>;MD + MPC,< +SETCOP: TRNN STBOX ;ARE WE MOVING OR DRAWING A BOX? + PUSHJ P,GETCLS ;CURRENT + JRST PERRET ;NOT NOW BROTHER + TRO MCHG + TRZ INMOV + MOVEI T,BIGPG + PUSHJ P,HYDPOG + PUSH P,CURSET + MOVEM A,CURSET + PUSH P,SID ;SAVE WHICH SIDE WE ARE ON + PUSH P,CURSE ;SAVE CURSOR POSITION + MOVE T,PID + MOVEM T,OLDPID + MOVE T,BID + MOVEM T,OLDBID + MOVE T,CURSE + ADJUST(SUB,T,<1(A)>) + MOVEM T,NOFFST ;OFFSET FOR NEW SET + SETZM NEWSET ;COLLECT NEW SET HERE + MOVEI G,NEWSET + HLRZ A,(A) +BODNEW: PUSH P,A + GETFS (B) + HRRM B,(G) + SETZM (B) + SETZM 1(B) + HRRZ G,B + HLRZ B,1(A) ;POINTER TO BODY FIELD OF THIS SET + JUMPE B,NNWBOD ;NONE +;Copy a BODY + MOVE C,1(B) ;LOC + ADJUST(ADD,C,NOFFST) ;ADD OFFSET + MOVEM C,CURSE ;SAVE HERE + FETCH(TTT,B,BID) + PUSH P,TTT + FETCH(C,B,BTYP) ;TYPE + MOVEM C,CURBOD + FETCH(C,B,BORI) ;ORIENTATION + MOVEM C,CURORT + PUSHJ P,BPYES ;Make body, and its pins + MOVE C,DBODPN ;THIS POINTS TO NEW BODY + HRLM C,1(G) ;PUT IN NEW SET + POP P,TTT ;OLD BODY ID + ADD TTT,OLDBID ;NEW BODY ID + STORE(TTT,C,BID) +NNWBOD: MOVE A,(P) ;SET POINTER + HRRZ B,1(A) ;POINT FROM OLD SET + JUMPE B,NNWPNT ;MAYBE NONE +;Copy a POINT + FETCH(TTT,B,PID) + PUSH P,TTT ;SAVE POINT ID + FETCHL(T,B,PBIT) + EQV T,SID + JUMPL T,PNTNEW ;RIGHT SIDE? + SWITCH ;NO +PNTNEW: FETCH(T,B,PXY) + ADJUST(ADD,T,NOFFST) ;NEW POS + PUSHJ P,PNTPUT ;MAKE THE NEW POINT + HRRM D,1(G) ;STORE NEW POINT IN NEW SET + POP P,TTT + ADD TTT,OLDPID ;NEW POINT ID + STORE(TTT,D,PID) +NNWPNT: POP P,A + HRRZ A,(A) + JUMPN A,BODNEW + +;Now copy pin's topologies + MOVE H,NEWSET ;NEW SET IN H + MOVE G,CURSET + HLRZ G,(G) ;OLD IN G +SEGCP1: HLRZ A,1(G) ;BODY + JUMPE A,SEGCP2 ;ANY? + FETCH(A,A,BLNK) ;any pins? + JUMPE A,SEGCP2 +SEGCP4: HLRZ C,1(H) ;Corresponding body in new set + FETCH(C,C,BLNK) + JUMPE C,SEGCP3 +SEGCP6: FETCHL(TT,A,BPBIT) + FETCHL(TTT,C,BPBIT) + EQV TTT,TT + JUMPGE TTT,SEGCP5 ;SAME SIDE? + FETCH(T,A,BPLOC) + FETCH(TT,C,BPLOC) + CAIE TT,(T) ;SAME PIN # + JRST SEGCP5 ;NO + PUSHJ P,COPPNT ;COPY POINT STUFF + JRST SEGCP3 + +SEGCP5: FETCH(C,C,BPLNK) + JUMPN C,SEGCP6 +SEGCP3: FETCH(A,A,BPLNK) + JUMPN A,SEGCP4 +;Copy point's topology +SEGCP2: HRRZ A,1(G) ;POINT FROM OLD SET + JUMPE A,SEGCP7 ;NO POINT + HRRZ C,1(H) ;AND FROM NEW ONE + PUSHJ P,COPPNT ;DO POINT STUFF +SEGCP7: HRRZ H,(H) + HRRZ G,(G) + JUMPN G,SEGCP1 +;Copied everything, finish defining new set. +COPSDN: GETFS(A) ;POINTER BLOCK FOR SET + MOVE B,SETPNT ;LINK HIM IN + HRL B,NEWSET ;POINT TO SET + MOVEM B,(A) ;TO NEW BLOCK + MOVEM A,SETPNT ;DONE + MOVE T,A + HRLI T,SETPNT + PUSHJ P,SCLOSE + POP P,CURSE ;RESTORE CURSOR POSITION + MOVE T,CURSE + MOVEM T,1(A) ;NEW SET CENTER + MOVEI T,SETM + PUSHJ P,CHNGMD ;BACK TO SET MODE + PUSHJ P,DOSMOV + TRO MCHG ;AND NOW MOVE IT(THIS CHANGES PIC). + MOVE T,OLDPID + MOVEM T,PID + MOVE T,OLDBID + MOVEM T,BID + PUSHJ P,REEID ;SPREAD NEW ID'S OVER RANGE OLDBID- + POP P,T + POP P,CURSET + EQV T,SID + JUMPL T,CPOPJ + SWITCH + POPJ P, + + ;COPPNT - COPY POINTS TEXT,LINK ONTO NEW VERSION +;A = SOURCE POINT +;C = DEST POINT + +COPPNT: MOVEM C,NEWPNT ;STORE NEW POINT POINTER HERE + MOVE TTT,[PLANES,,-1] ;COPY PLANES AND PAD TYPE! + ANDCAM TTT,ADDR(C,PBIT) ;CLEAR IN NEW POINT + AND TTT,ADDR(A,PBIT) ;GET FROM OLD + IORB TTT,ADDR(C,PBIT) ;SET IN NEW (AND GET FRONT BIT) + EQV TTT,SID + JUMPL TTT,COPSID ;RIGHT SIDE? + SWITCH ;NO, CHANGE +COPSID: FETCH(T,A,PTXT) + JUMPE T,NNOTXT + PUSHJ P,STRCOP + STORE(B,C,PTXT) +NNOTXT: FETCH(F,A,PNEB) + PUSH P,H ;SAVE H + JUMPE F,NOSEGS ;NONE AT ALL? + PUSH P,A +SEGCOP: MOVEI H,2 +NNTXT1: XCT (H)[HLRZ T,(F) + HRRZ T,1(F) + HLRZ T,1(F)] + JUMPE T,NOSEG + MOVEI TTT,(T) + PUSHJ P,GETID ;GETID OF EXEMPLAR + PUSHJ P,FNDID ;FIND ITS DOPPELGANGER + JRST NOSEG + FETCH(B,D,PNEB) + MOVE A,NEWPNT + PUSHJ P,FNDLNK ;ALREADY THERE? + CAIA ;NO, LETS MAKE ONE + JRST NOSEG ;YES, DON'T MAKE 2 LINES + MOVE T,C ;NEW P1 + PUSHJ P,FRLINK + XCT (T)PUTAB ;NEW P1 to P2 + MOVE T,D + PUSHJ P,FRLINK ;NEW P2 to P1 + MOVE D,NEWPNT + XCT (T)PUTAB +NOSEG: SOJGE H,NNTXT1 + HRRZ F,(F) + JUMPN F,SEGCOP + POP P,A ;GET BACK SOURCE POINT +;Also copy point on other side! +NOSEGS: FETCHL(T,A,PBIT) + TLNN T,FEEDTH ;FEED THROUGH HERE? + JRST NNPFED ;NO + SWITCH ;GET TO OTHER SIDE + FETCH(TTT,A,PFEED) + PUSHJ P,GETID ;ID OF OTHER POINT + PUSHJ P,FNDID ;FIND NEW POINT + JRST NOFEDY ;NOT YET, CLEAR PLANE BITS, NO ONE ON OTHER SIDE + FETCHL(TT,D,PBIT) + TLNE TT,FEEDTH!CPIN!ISPIN ;IS IT FED THROUGH? + JRST NOFEDX ;YES, DONE ALREADY + HRRZ T,NEWPNT + STORE(T,D,PFEED) ;POINT BACK TO US + TLO TT,FEEDTH + STOREL(TT,D,PBIT) + STORE(D,T,PFEED) + SETBIT(FEEDTH,TT,T,PBIT) +NOFEDX: SWITCH +NNPFED: POP P,H + POPJ P, + +NOFEDY: SWITCH + MOVE T,NEWPNT + CLRBIT(PLANES,TT,T,PBIT) + POP P,H + POPJ P, +>;MPC + ;STRCOP - COPY STRING WITH OFFSET BLOCK +;T = STRING +;RETURNS +;B = STRING + +STRCOP: SETZ B, + JUMPE T,CPOPJ + GETBLK(B,TEXCOF) ;RETURN POINTER IN B + FETCH(TT,T,TCXY) ;COPY OFFSET + STORE(TT,B,TCXY) + FETCH(T,T,TCSTR) + GETBLK(TTT,TEXSTR) + STORE(TTT,B,TCSTR) ;GET FIRST BLOCK FOR TEXT +LSTCP1: FETCH(TT,T,TSSIZ) + STORE(TT,TTT,TSSIZ) ;COPY SIZE + FETCH(TT,T,TSASC) + STORE(TT,TTT,TSASC) ;COPY FIRST 5 CHARS +LPTXTC: FETCH(T,T,TSNXT) + JUMPE T,[ CLEAR(TTT,TSNXT) ;TERMINATE LIST + POPJ P,] + GETBLK(TT,TEXSTR) + STORE(TT,TTT,TSNXT) + MOVE TTT,TT + FETCH(TT,T,TSASC) + STORE(TT,TTT,TSASC) + JRST LPTXTC ;LOOP + +;LSTCOP - COPY BARE TEXT STRING +;T = STRING +;RETURNS +;B = NEW STRING + +LSTCOP: SETZ B, + JUMPE T,CPOPJ + GETBLK(B,TEXSTR) + MOVE TTT,B + JRST LSTCP1 + +MD,< +;PCOPY - COPY TEXT FROM ONE POINT TO ANOTHER +;A = SOURCE POINT +;C = DESTINATION POINT + +PCOPY: FETCH(TT,A,PTXT) + JUMPE TT,CPOPJ ;DON'T BOTHER IF NO TEXT + MOVSI TTT,FIXTXT!FIXRHT + AND TTT,ADDR(A,PBIT) ;GET BITS FROM OLD + IORM TTT,ADDR(C,PBIT) ;STORE IN NEW + FETCH(T,A,PTXT) + PUSHJ P,STRCOP + STORE(B,C,PTXT) + POPJ P, +>;MD diff --git a/src/draw/short.fai b/src/draw/short.fai new file mode 100644 index 00000000..f7e5ec74 Binary files /dev/null and b/src/draw/short.fai differ diff --git a/src/draw/sigsub.502 b/src/draw/sigsub.502 new file mode 100644 index 00000000..00fae338 --- /dev/null +++ b/src/draw/sigsub.502 @@ -0,0 +1,1597 @@ +;SIGSUB.FAI.116, 6-NOV-75 19:24:28, EDIT BY HELLIWELL +SUBTTL SIGNAL NAME PROCESSOR +MDPC, +BEGIN SIGSUB + +MD,> +MPC,> +MWL,> + +MDPC,< +OPDEF PUTSTR[OUTSTR] +OPDEF PUTSIG[OUTSTR] +OPDEF PUTBYT[OUTCHR] +>;MDPC + +;ITS and III want's to do polarity stuff also +DEFINE POL +DEFINE NOPOL + +COMMENT  CALLING SEQUENCE + +PUSHJ P,SIGSUB + + + +CLOBBERS T, TT, TTT + + +EXTERNAL SUBRS + +PUSHJ P,SIGGET + + +PUSHJ P,GETVAR + + + +EXTERNAL VARIABLES +UPPER UPPER BOUND ON RESULTANT EXPRESSIONS (INCLUSIVE) +LOWER LOWER BOUND ON RESULTANT EXPRESSIONS (INCLUSIVE) +MXSTLN MAX STRING LENGTH (FOR SIGBUF) + + + ;DATA AREA + +MDPC, + +TNDIG: 0 +SELCHR: 0 +ERRORP: 0 +^SIGEND: 0 +^SIGBUF: BLOCK MXSTLN +MDWL,< +^^DOVARS: -1 ;expand vars in expressions +>;MDWL + +MDPC, + ;TOP LEVEL CONTROL OF EXPRESSION EVALUATION +; byte pointer to string in A +; returns string in SIGBUF, SIGEND points to last word +; may expand variables if DOVARS set +; skips if no error in signal + +^SIGSUB: +MDWL,< SETZM EXPER2 > ;NO VARIABLE ERRORS YET + SETZM SELCHR ;NOT IN SELECT TO START WITH + MOVE T,[POINT 7,SIGBUF] + MOVEM P,ERRORP ;FOR ERROR RETURN + PUSHJ P,SIGS ;START AS NORMAL SIGNAL + AOS (P) +SIGE1: SETZ TTT, + IDPB TTT,T ;DON'T CALL SPUTIT, + TLNE T,760000 ;WE ARE ONLY FILLING OUT WORD + JRST .-2 ;FILL OUT LAST WORD + HRRZM T,SIGEND ;STORE END FOR LOSER + POPJ P, + +SIGE: MOVE P,ERRORP + JRST SIGE1 + +SIG0: PUSHJ P,SPUTIT +SIGS: +SIG1: PUSHJ P,SIGONE ;GET A CHAR + POPJ P, ;FINI +SIG2: CAMN TTT,SELCHR ;END OF SELECTOR? + JRST SIGSEL ;YES + CAIN TTT,";" ;IF COMMENT + JRST SIGC ;JUST COPY REST + CAIN TTT,"]" ;END OF BRACKET GROUP? + JRST SIGECK ;YES, EITHER END OF "," GROUP OR ERROR + CAIE TTT,"[" + JRST SIG0 + PUSHJ P,BRACKET ;BRACKET SCANNER + JRST SIG1 + +SIGC: PUSHJ P,SPUTIT + PUSHJ P,SIGONE + POPJ P, + JRST SIGC + +;SKIP TO ] (END OF SELECTOR EXPRESSION) +SIGSEL: SETZ TT, +SIGSL1: PUSHJ P,SIGONE + JRST SIGE + CAIN TTT,"[" + AOJA TT,SIGSL1 + CAIN TTT,"]" + SOJL TT,CPOPJ + JRST SIGSL1 + +SIGECK: EXCH TTT,SELCHR ;SAVE US AND GET SELCHR + CAIE TTT,"," ;ARE WE IN "," GROUP? + JRST SIGE ;NO, ERROR + EXCH TTT,SELCHR ;YES, RESTORE CHARS + POPJ P, ;AND RETURN TO BRACKET ROUTINE + + ;BRACKET AND CONDITIONAL INTERPRETER +comment  +Format of Bracketed expression: +[...] expression with value +[...{}...] select expression if value is non-zero +[,case1,case2,...,casen] case expression + +;BRACKET - Parse expression constructs + +BRACKET:SETZM NDIG ;NO WIDTH FROM VARS YET + PUSHJ P,EXPR + CAIE TTT,"]" ;IS IT NORMAL EXPRESSION? + JRST SELCHK ;NO, CHECK FOR SELECTOR +MDWL,< SKIPN DOVARS + JRST SIGN0 + CAMG TT,UPPER + JRST SIGN1 + SUB TT,UPPER + SUBI TT,1 + IDIV TT,WIDTH + MOVE TT,TTT + ADD TT,LOWER + JRST SIGN0 + +SIGN1: CAML TT,LOWER + JRST SIGN0 + SUB TT,LOWER + ADDI TT,1 + IDIV TT,WIDTH + MOVE TT,TTT + ADD TT,UPPER +SIGN0: +>;MDWL + MOVEI TTT,"-" + SKIPGE TT + PUSHJ P,SPUTIT + MOVM TT,TT + PUSHJ P,PUTNUM + POPJ P, ;ALL DONE + +PUTNUM: MOVE TTT,NDIG + MOVEM TTT,TNDIG ;THIS IS HOW MANY DIGITS TO PRINT, MIN. +PUTNM1: IDIVI TT,=10 + HRLM TTT,(P) + SOSG TNDIG ;ENOUGH DIGITS YET? + JUMPE TT,.+2 + PUSHJ P,PUTNM1 + HLRZ TTT,(P) + ADDI TTT,60 +SPUTIT: CAMN T,[POINT 7,SIGBUF+MXSTLN-1,27] + JRST [ PUTSTR[ASCIZ/EXPRESSION BUFFER OVERFLOW - SIGNAL IS: +/] + SETZ TTT, + IDPB TTT,T + TLZ T,7700 ;STOP DEPOSITING BYTES AND SUPPRESS ERROR + PUTSTR SIGBUF + JRST SIGE] + IDPB TTT,T + POPJ P, + +;SELECTOR CHECK +SELCHK: CAIE TTT,173 ;STANDARD CASE (=0)? + JRST COMCHK ;CHECK FOR "," CONSTRUCT + JUMPE TT,SELNOK ;NOT THIS ONE IF NOT TRUE (0) + PUSH P,SELCHR ;SAVE OLD SELECT END + MOVEI TTT,176 ;THIS IS NEW ONE +SELDO: MOVEM TTT,SELCHR + PUSHJ P,SIGS + POP P,SELCHR ;RESTORE OLD SELCHR + CAIE TTT,"]" + JRST SIGE + POPJ P, + +SELNOK: SETZ TT, +SELNK1: PUSHJ P,SIGONE + JRST SIGE + CAIN TTT,173 + AOJA TT,SELNK1 + CAIN TTT,176 + SOJL TT,BRACKET ;BACK TO BRACKET ROUTINE IF AT RIGHT LEVEL + JRST SELNK1 + +COMCHK: CAIE TTT,"," ;CASE EXPR? + JRST SIGE ;NO, LOSE + JUMPLE TT,SIGSEL ;- IS AUTO NOTHING + PUSH P,[0] ;MAKE A MATCHING [] COUNT + JRST COMCK2 ;SEEN ONE "," + +COMCK1: PUSHJ P,SIGONE + JRST SIGE + CAIN TTT,"[" + AOS (P) + CAIN TTT,"]" + SOS (P) + SKIPGE (P) ;END OF SELECTOR GROUP? + JRST [ POP P,(P) ;YES + POPJ P,] + SKIPG (P) ;ARE WE AT RIGHT LEVEL TO CHECK ","? + CAIE TTT,"," ;YES + JRST COMCK1 ;NO COMMA, OR NO CHECK +COMCK2: SOJG TT,COMCK1 ;THERE YET? + POP P,(P) ;LOSE COUNT + PUSH P,SELCHR ;YES, SAVE OLD SELCHR + MOVEI TTT,"," ;THIS IS NEW ONE + JRST SELDO ;REST IS SAME AS OTHER GUY + ;EXPRESSION SUBRS - SCAN WITHIN "[...]" IN SIGNAL + +;CURRENT PRECEDENCE ORDER FOR EXPRESSIONS (HIGHEST TO LOWEST BINDING POWER) +comment  +Format of bracket expression + +() arithmetic grouping +[] imbedded brackets construct + +Unary operators + Boolean not +- arithmetic negation ++ ignored +" value of ascii A-Z + variable name (only WL) ;only if DOVARS set + + +Binary operators +& logical AND +! logical OR +/ divide +* multiply +' mod (A'B= A mod B) ++ add +- sub += boolean equal + boolean not eq +< boolean valued less +> boolean valued greater + less equal + geater equal + and + or +;comment + + + +;EXPR - scan arithmetic/logical expression +;return value in TT, termination char in TTT +EXPR: +LANDOR: PUSHJ P,BOOL +LNDOR1: CAIN TTT,"" + JRST EXPLAND + CAIN TTT,13 ;sail  char + JRST EXPLOR + POPJ P, + +EXPLAND:PUSH P,TT + PUSHJ P,BOOL + SKIPE TT + SETO TT, + ANDM TT,(P) + POP P,TT + JUMPE TT,LNDOR1 + SETO TT, + JRST LNDOR1 + +EXPLOR: PUSH P,TT + PUSHJ P,BOOL + IORM TT,(P) + POP P,TT + JUMPE TT,LNDOR1 + SETO TT, + JRST LNDOR1 + +BOOL: PUSHJ P,ADDSUB +BOOL1: CAIN TTT,"=" + JRST BOOLE + CAIN TTT,"" + JRST BOOLN + CAIN TTT,74 + JRST BOOLL + CAIN TTT,76 + JRST BOOLG + CAIN TTT,"" + JRST BOOLLE + CAIN TTT,"" + JRST BOOLGE + POPJ P, + +FOR @$ I IN(E,N,L,G,LE,GE) + + +ADDSUB: PUSHJ P,DIVMUL ;FIRST OPERAND (WILL RETURN IF NOT */&!) +ADSUB1: CAIN TTT,"+" + JRST EXPADD + CAIN TTT,"-" + JRST EXPSUB + POPJ P, ;NOT + OR - OR HIGHER OP, RETURN UP LEVEL + +EXPADD: PUSH P,TT ;SAVE SUM + PUSHJ P,DIVMUL ;CHECK FOR HIGHER PRECEDENCE OP + ADD TT,(P) + POP P,(P) + JRST ADSUB1 + +EXPSUB: PUSH P,TT + PUSHJ P,DIVMUL + EXCH TT,(P) + SUB TT,(P) + POP P,(P) + JRST ADSUB1 + +DIVMUL: PUSHJ P,ANDOR ;WILL RETURN WHEN NO &! SEEN +DVML1: CAIN TTT,"/" + JRST EXPDIV + CAIN TTT,"*" + JRST EXPMUL + CAIN TTT,"'" + JRST EXPMOD + POPJ P, ;NOT / OR * OR ' RETURN UPLEVEL + +EXPDIV: PUSH P,TT + PUSHJ P,ANDOR + JUMPE TT,SIGE ;DIVIDE CHECK + EXCH TT,(P) + IDIVM TT,(P) + POP P,TT + JRST DVML1 + +EXPMUL: PUSH P,TT + PUSHJ P,ANDOR + IMULM TT,(P) + POP P,TT + JRST DVML1 + +EXPMOD: PUSH P,TT ;SAVE EXP1 + PUSHJ P,ANDOR + EXCH TTT,(P) ;GET EXP1 -> TTT + EXCH TT,TTT + IDIV TT,TTT ;EXP1 mod EXP2 + MOVE TT,TTT + POP P,TTT + JRST DVML1 + +ANDOR: PUSHJ P,PRIMRY +ANDOR1: CAIN TTT,"&" + JRST EXPAND + CAIN TTT,"!" + JRST EXPOR + POPJ P, + +EXPAND: PUSH P,TT + PUSHJ P,PRIMRY + ANDM TT,(P) + POP P,TT + JRST ANDOR1 + +EXPOR: PUSH P,TT + PUSHJ P,PRIMRY + IORM TT,(P) + POP P,TT + JRST ANDOR1 + +PRIMRY: PUSHJ P,SIGONE + JRST SIGE ;LEAVE ON EOF + CAIE TTT," " + CAIN TTT,"" + JRST PRIMRY ;IGNORE THESE + CAIE TTT,"(" + JRST NOPARN + PUSHJ P,EXPR + CAIN TTT,")" + PUSHJ P,SIGONE + JRST SIGE + POPJ P, + +NOPARN: CAIE TTT,"[" ;START OF ANOTHER BRACKETS CONSTRUCT? + JRST NOBRAK ;NO + PUSH P,T ;SAVE CURRENT DEPOSIT POINTER + PUSHJ P,BRACKET + SETZ TTT, + PUSHJ P,SPUTIT + MOVE T,(P) ;GET TO FRONT OF IT + ILDB TTT,T + JUMPE TTT,SIGE +BRKEXP: CAIL TTT,"0" + CAILE TTT,"9" + JRST SIGE + IMULI TT,=10 + ADDI TT,-60(TTT) + ILDB TTT,T + JUMPN TTT,BRKEXP + POP P,T ;NOW BACK TO ORIGNINAL DEPOSIT POINTER + PUSHJ P,SIGONE ;GOBBLE CHAR AFTER [] + JRST SIGE + POPJ P, + +NOBRAK: CAIE TTT,"" + JRST NONOT + PUSHJ P,EXPR ;THIS GIVES  LOWEST PRECEDENCE + SKIPE TT ;DO LOGICAL INVERSION + TDZA TT,TT + SETO TT, + POPJ P, + +NONOT: CAIE TTT,"-" + JRST NMINUS + PUSHJ P,PRIMRY + MOVN TT,TT + POPJ P, + +NMINUS: CAIN TTT,"+" + JRST PRIMRY + CAIE TTT,'"'+40 + JRST NQUOTE + PUSHJ P,SIGONE + JRST SIGE + CAIL TTT,"A"+40 + CAILE TTT,"Z"+40 + CAIA + JRST ISQUOT + CAIL TTT,"A" + CAILE TTT,"Z" + JRST SIGE +ISQUOT: MOVE TT,TTT + PUSHJ P,SIGONE + JRST SIGE + POPJ P, + +NQUOTE: +MDWL,< CAIL TTT,"A" + CAILE TTT,"Z" + CAIA + JRST GVAR ;LOOKUP VARIABLE +>;MDWL + SETZ TT, + CAIL TTT,"0" + CAILE TTT,"9" + JRST SIGE ;DOESN'T EVEN START WITH A DIGIT +PRIM1: IMULI TT,=10 + ADDI TT,-60(TTT) + PUSHJ P,SIGONE + JRST SIGE + CAIL TTT,"0" + CAILE TTT,"9" + POPJ P, + JRST PRIM1 + +MDWL,< +GVAR: SKIPE DOVARS + PUSHJ P,GETVAR + JRST SIGE ;UNKNOWN VARIABLE + PUSHJ P,SIGONE + JRST SIGE + POPJ P, +>;MDWL + SUBTTL PERMUT STORAGE + +COMMENT  +CALLING SEQUENCE + + + PUSHJ P,PERMUT + + +CLOBBERS T, TT, TTT, A, B, C, D + +;GLOBAL AND ONLY GLOBAL CHARACTER +^GLBCHR__"^" + +;FLAG REGISTER, USE H FROM BOTH D AND WL +SFLAG_H + +;CONTROL FLAGS FOR PERMUT (RH OF SFLAG) +MDPC,< +EXTRA1__1 ;EXTRACT CONSTANT LEADER +EXTRA2__2 ;EXTRACT CONSTANT TRAILER +EXTRAS__4 ;EXTRACT NON-CONSTANT SIGNAL NAME +SAW01__10 ;SAW A (0) OR (1) CONSTRUCT +LEADN__20 ;LEADING NOT SEEN +>;MDPC + +NOCAN__40000 ;SPWR ISN'T CANONICAL +BSSEEN__100000 ;SEEN DIFFERENCES IN BS CONSTRUCT +TBSGTR__200000 ;BS IN T IS GREATER +PRMTMP__400000 ;TEMP FLAG + +;FLAGS USED BY PERMUT (LH OF SFLAG) +GLB1SN__1 +GLB2SN__2 +EXPERR__4 +WHERR__10 +NFLAG1__100000 +NFLAG2__200000 +POL, + +;EXTERNAL SYMBOLS NEEDED +;ALL THESE ARE RIGHT HALF BITS STORED IN SAVBIT + ;GLB1 COPIED FROM GLB1SN + ;GLB2 COPIED FROM GLB2SN + ;SGND SPECIAL SIGNAL BIT + ;SPWR " + ;SHI " + ;SNC " + ;SCANON IF SPWR, THIS IS THE CANONICAL FORM (+5.00V) +;SIGGET ROUTINE TO GET CHAR INTO TTT +;MXSTLN MAX STRING LENGTH (FOR PERMTB) +;EXPER2 ZEROED BY PERMUT AND SIGSUB, +; SHOULD BE SET TO 0,,-1 FOR VAR NOT FOUND + +;MAX EXTRACTED SIGNAL LENGTH +ESGTLN__MXSTLN ;SAME AS MAX SIGNAL NAME FOR NOW + +MDPC, +^SAVBIT: 0 +^WQNWRD: 0 +WQNTMP: 0 +WQNTM1: 0 +^VOLTAGE: 0 ;voltage if signal looks like +5.0V + +^CMPWRD: 0 +^PERMTB: BLOCK MXSTLN ;EXPANDED SIGNAL +MDPC,< +^SIGTAB: 0 +^SIGSTR: BLOCK MXSTLN +ESGPTR: 0 +ESGSAV: 0 +^ESGTAB: BLOCK ESGTLN ;EXTRACTED SIGNAL +>;MDPC +GETSIG: HALT ;GET A CHARACTER +SIGPTR: 0 ;SAVED POINTER TO BEGINNING OF STRING +FLGSAV: 0 ;SAVE SFLAG HERE +MDPC,< +^POLAR: 0 ;POLARITY INDICATOR +^OPOLAR: 0 ;OLD POLAR FOR PERMES +>;MDPC +IFN PERMTB-CMPWRD-1, +MDPC, + SUBTTL PERMUT +;SIGMAA - Setup SIGTAB with canonicalized version of signal name in +; preparation for calling SIGMAT +MDPC,< +^SIGMAA:SETZM VARLST ;NO VARS HERE + PUSH P,C + PUSH P,D + PUSHJ P,PERMUT + MOVE T,[CMPWRD,,SIGTAB] + BLT T,SIGSTR+MXSTLN-1 + POP P,D + POP P,C + POPJ P, + +^PERME1:MOVEM SFLAG,FLGSAV ;EXTRACT CONSTANT LEADER + MOVEI SFLAG,EXTRA1 + JRST PERMEA + +^PERME2:MOVEM SFLAG,FLGSAV ;EXTRACT CONSTANT TRAILER + MOVEI SFLAG,EXTRA2 + JRST PERMEA + +^PERMES:MOVEM SFLAG,FLGSAV ;EXTRACT NON-CONSTANT PART OF SIGNAL NAME + MOVEI SFLAG,EXTRAS +PERMEA: MOVE T,[POINT 7,ESGTAB] + MOVEM T,ESGPTR + SETZM VARLST + JRST PERMT1 +>;MDPC + +;SOME HANDY MACROS FOR EXTRACTING + +DEFINE EPUT1< +MDPC,;MDPC +> + +DEFINE EPUT2< +MDPC,;MDPC +> + +DEFINE EPUTS< +MDPC,;MDPC +> + ;PERMUT - SCAN SIGNAL AND CANONICALIZE, EXTRACT +; A is byte pointer to string +; Expands string into SIGBUF (interpretting bracketed expressions) +; Copies string into PERMTB possibly modified to eliminate extra nots, etc. +; Extracts leading or trailing constant part into ESGTAB +; Checks for BS construct, \letter#number\, accumulates in WQNWRD +; Checks for trailing assertion/polarity indicators. (0,1) H,L,! +; Generates CMPWRD from PERMTB, possibly flushing leading "-" +; Checks signal for special cases (GND,VCC,+5.0V, etc.) and sets flags, VOLTAGE +; Returns flags in T, SAVBIT - (SGND, SPWR, SHI, SNC, ) + +comment  +Some parts of string are extracted, and remember depending on EXTRA1, EXTRA2 +String is parsed to consist of: + leading spaces ;class 1 + ^,^^ global signal flag ;class 1 + more spaces ;class 1 + -,~,-~,~-, (and spaces) ;class 1 or 2 + text ;class 1 or 2 and main string + \...\ BS construct ;class 2 + trailing spaces ;flushed +POL,< + (0,1) ;class 2 + H,L,! trailing polarity signals +>;POL + ; comment ;class 2 and main string + +note: BS construct - qualifier letters and wire rule numbers + are returned in WQNWRD = ,, BBBBNN + Rule #'s seem to be BBBBNN where NN is rule number of which + there must be only one on a run. BBBB are "bits" which are + IORed for all rule specs on run. ?? + + +^PERMUT: + MOVEM SFLAG,FLGSAV + SETZ SFLAG, ;CLEAR ALL FLAGS +PERMT1: MOVEM A,SIGPTR ;SAVE POINTER TO FRONT OF STRING + SETZM EXPER2 + SETZM VOLTAGE +MDPC,< SETZM WQNWRD ;CLEAR HERE FOR DWG PROG +POL,< SETZM POLAR > +>;MDPC +MWL,< TRNE ISBACK ;CAUSE FIRST ^ TO TURN ON GLB2 + TLO SFLAG,GLB1SN +>;MWL + SKIPN VARLST ;ANY VARS? + JRST PERM0 ;NO, SKIP THIS + ; If there are variables, and the signal evaluates without error, + ; replace the orginal string with the variable expansion. + SETO TTT, ;FLAG NO EOS YET + PUSHJ P,SIGSUB ;MUNG STRING + TLO SFLAG,EXPERR ;ERROR, COPY ORIGINAL + SKIPN EXPER2 ;VARIABLE ERROR? + TLNE SFLAG,EXPERR ;IF ANY ERROR, DON'T USE RESULT + JRST PERM0 ;YES, COPY ORIGINAL STRING + MOVE A,[POINT 7,SIGBUF] + MOVE T,[PUSHJ P,[ILDB TTT,A + JUMPN TTT,CPOPJ1 + POPJ P,]] + JRST PERM0A + + ; Now extract assorted special fields in signal name +PERM0: MOVE A,SIGPTR ; Maybe error in variable expansion, + MOVE T,[PUSHJ P,SIGONE] ; use original string +PERM0A: MOVEM T,GETSIG + MOVE B,[POINT 7,PERMTB] + JRST PERMS0 + +;Extract leading spaces, "global" signal,... +PERMSP: EPUT1 ;EXTRACT LEADER? +PERMS0: XCT GETSIG + JRST LEAVED + CAIN TTT," " + JRST PERMSP + CAIE TTT,GLBCHR ;GLOBAL CHAR? + JRST NOGLOB + TLOE SFLAG,GLB1SN ;TURN ON AND CHECK GLB1SN + TLOA SFLAG,GLB2SN ;WE GET BOTH + JRST PERMSP ;TRY FOR ANOTHER +GGLOB2: EPUT1 + XCT GETSIG + JRST LEAVED + CAIN TTT," " + JRST GGLOB2 +;Now try to straighten out -,, and ~ +NOGLOB: +NOIII,< +NOITS,< +NODEC,< +;Foonly style, can have tilde or not + CAIE TTT,NOTCHR + JRST PERMNT +PRMSP1: EPUTS + XCT GETSIG + JRST [ MOVEI TTT,NOTCHR ;Signal is just "-" + PUSHJ P,PUTIT + JRST LEAVED] + CAIN TTT," " + JRST PRMSP1 + CAIE TTT,NOTCHR ;CATCH CASE OF DOUBLE NOT + CAIN TTT,32 + JRST PERM2 ;TILDA AND NOT, FLUSH + JRST PRMNT1 + +PERMNT: CAIE TTT,32 + JRST PERM1 ;STARTUP HERE +PRMSP2: EPUTS + XCT GETSIG + JRST [ MOVEI TTT,32 + PUSHJ P,PUTIT + JRST LEAVED] + CAIN TTT," " + JRST PRMSP2 + CAIN TTT,NOTCHR + JRST PERM2 +PRMNT1: MOVE T,TTT ;Found single Tilde or Not + MOVEI TTT,NOTCHR + PUSHJ P,PUTIT + MOVE TTT,T + JRST PERM1 +>;NODEC +>;NOITS +>;NOIII + +;DEC, III and ITS, only look for not-character (-) +IFN DECSW!ITSSW!IIISW,< + CAIE TTT,NOTCHR ;REMEMBER IF WE SAW A - + JRST PERM1 + EPUTS +MDPC,< TRO SFLAG,LEADN > ;SAW LEADING NOT + XCT GETSIG ;GET NEXT CHAR ALSO + JRST [ MOVEI TTT,NOTCHR + PUSHJ P,PUTIT + JRST LEAVED] + CAIN TTT,NOTCHR ;DOUBLE - ? + JRST PERM2 ;YES, THEY CANCEL + TLO SFLAG,NFLAG1 ;NO, REMEBER INITIAL ONE + MOVE T,TTT + MOVEI TTT,NOTCHR + PUSHJ P,PUTIT + MOVE TTT,T + JRST PERM1 +>;DECSW!ITSSW!IIISW + ;Parsed over leading spaces, inversion chars, global chars +; Now read main part of signal name +PERM2: EPUTS + XCT GETSIG + JRST BACKSP +PERM1: ;PARSED OVER LEADING -,SPACES ETC. +MWL,< TRNE ISBACK > ;DON'T EXTRACT QN IN WL UNLESS BP + CAIE TTT,"\" ;QN ESCAPE? + JRST NOQN + PUSHJ P,GETQN ;YES + JRST BACKSP +NOQN: CAIN TTT,";" ;; IS SPECIAL + JRST BACKSP + PUSHJ P,PUTIT + JRST PERM2 + +;Done with signal, backspace over any trailing spaces, polarity or 0,1 assertions +BACKSP: MOVE C,B + LDB D,C ;GET LAST CHAR STORED +BACKS1: MOVE B,C ;SKIP SPACES SO FAR + CAIE D," " ;BACK UP OVER SPACES + JRST STRTHL + PUSHJ P,GETREV + JRST NBACK + JRST BACKS1 + + ; Look for H,L or assertion (0,1) at end of signal name +STRTHL: +POL,< MOVEI T," " ;THIS IS DEFAULT ASSERTION + TLZ SFLAG,NFLAG2 + MOVE C,B ;GET COPY OF DEPOSIT POINTER + LDB D,C ;GET LAST CHAR DEPOSITED + CAIN D,"L" + TLOA SFLAG,NFLAG2!POLFLG + CAIN D,"H" + JRST DOHL + PUSHJ P,CHK01 ;(0 or 1)? + JRST NOHL + JRST END01A + +;Saw trailing H or L, check for or 0,1 +DOHL: PUSHJ P,GETREV + JRST NBACK + CAIE D," " + JRST DOHL1 ;maybe "... 0H"? +DOHL0: PUSHJ P,GETREV + JRST NBACK + CAIN D," " + JRST DOHL0 ;skip spaces + MOVE B,C + PUSHJ P,CHK01 ;maybe "...(0) H"? + JRST ENDHL ; No, just "... H" +END01A: MOVE B,C ;DELETE THE 01 HL STUFF TEMPORARILY +MDPC,< TRO SFLAG,SAW01 > + TLNN SFLAG,NFLAG2!NFLAG1 ;Both NOTCHR and Polarity off? + JRST ENDHL ;YES, NO CHANGE + TLC SFLAG,NFLAG2!NFLAG1 + TLCN SFLAG,NFLAG2!NFLAG1 ;OR BOTH ON? + JRST ENDHL ;YES, STILL NO CHANGE + TLC SFLAG,NFLAG2 ;INVERT SENSE OF - + TRC T,1 ;AND 0 OR 1 +ENDHL: TLNN SFLAG,NFLAG2 ;ARE WE CHANGING SENSE OF MINUS? + JRST ENDHLA ;NO, GO ON +;Standardizing to polarity "H" causes the NOTCHR at head of signal to change + SETZ TTT, ;TERMINATE STRING SO WE CAN SHIFT IT + PUSHJ P,PUTIT + MOVE B,[POINT 7,PERMTB] + TLCN SFLAG,NFLAG1 ;YES, INVERT SENSE OF MINUS + ;AND SEE IF WE MUST INSERT OR REMOVE IT + JRST [ MOVEI TT,NOTCHR ;MUST INSERT ONE + MOVE C,[POINT 7,PERMTB] ;GET STRING FROM HERE + JRST ENDHLB] + MOVE C,[POINT 7,PERMTB,6] ;MUST REMOVE -, START HERE + ILDB TT,C ;START WITH THIS CHAR + JUMPE TT,ENDHLA ;UNLIKELY, BUT CAN HAPPEN +ENDHLB: ILDB TTT,C ;MAKE SURE WE STAY AHEAD OF IT + EXCH TT,TTT + PUSHJ P,PUTIT + JUMPN TT,ENDHLB +ENDHLA: MOVEI TTT,11 ;If there is H,L , put tab in front + PUSHJ P,PUTIT + MOVE TTT,T ;" ", "0", OR "1" + PUSHJ P,PUTIT + MOVEI TTT,"H" + PUSHJ P,PUTIT +MDPC,< MOVEI TTT,"H" + TLNE SFLAG,POLFLG + MOVEI TTT,"L" + HRROM TTT,POLAR +>;MDPC + JRST NBACK + + ;Have seen trailing H,L, check for assertion 0,1 +DOHL1: CAIE D,"0" ;H OR L PRECEEDED BY 0? + CAIN D,"1" ;OR 1? + JRST [ MOVE TTT,D ;REMEMBER 0 OR 1 + PUSHJ P,CHK01S ;ANY SPACE IN FRONT OF 01? + JRST NBACK ;NO SPACE(S) + MOVE T,TTT ;Remember assertion was 0 or 1 + JRST END01A] ;OK + PUSHJ P,CHK01 ;NO, CHECK () VERSION + JRST NBACK + JRST END01A + + ;Check for (0,1) at end of name +;Skips if succesful +;returns: +;T = "0" or "1" +CHK01: CAIE D,")" + POPJ P, + PUSHJ P,GETREV + POPJ P, + MOVE TTT,D ;ASSERTION 0,1? + TRZ D,1 + CAIE D,"0" + POPJ P, + PUSHJ P,GETREV ;YES + POPJ P, + CAIE D,"(" + POPJ P, + PUSHJ P,CHK01S ;EAT ANY EXTRA SPACES + JFCL + MOVE T,TTT ;REMEMBER ASSERTION AS 0,1 + JRST CPOPJ1 + +;CHK01S - TEST FOR ANY LEADING SPACES (SKIPS IF THERE ARE ANY) +CHK01S: PUSHJ P,GETREV + POPJ P, + CAIE D," " + POPJ P, ;NO SPACE +CHK012: PUSHJ P,GETREV + JRST CPOPJ1 + CAIN D," " + JRST CHK012 + JRST CPOPJ1 + +MDPC,< +GETRVS: CAME C,[POINT 7,ESGTAB] + CAMN C,[POINT 7,ESGTAB,6] ;CAN WE BACKUP? + POPJ P, ;NO + ADD C,[70000,,0] + JUMPGE C,.+2 + SUB C,[430000,,1] + LDB D,C + JRST CPOPJ1 +>;MDPC + +;No H,L at end, maybe " !" which means don't insist on H,L on signal (DEC) +NOHL: +MDPC,< +DEC,< CAIN D,"!" + PUSHJ P,GETREV + JRST NBACK + CAIN D," " + AOS POLAR ;INDICATE " !" AT END OF STR +>;DEC +>;MDPC +>;POL + ;Finish up - Copy last part of signal name (comment, etc.) +NBACK: MOVE TTT,SIGCHR ;GET LAST CHAR + JUMPE TTT,LEAVED ;END IF EOL +STOCOM: PUSHJ P,PUTIT + EPUT2 + XCT GETSIG + JRST LEAVED + JRST STOCOM + + +GETREV: CAMN C,[POINT 7,PERMTB,6] ;CAN WE BACKUP? + POPJ P, ;NO + ADD C,[70000,,0] + JUMPGE C,.+2 + SUB C,[430000,,1] + LDB D,C + JRST CPOPJ1 + +;Finish up with nulls, and generate CMPWRD +LEAVED: SETZ TTT, ;YES, FINISH OUT WORD +PERM8: IDPB TTT,B ;CAN'T OVERFLOW TABLE + TLNE B,760000 + JRST PERM8 +MDPC,< TRNN SFLAG,EXTRA1!EXTRA2!EXTRAS + JRST PERMEC + MOVE B,ESGPTR +PERMEB: IDPB TTT,B + TLNE B,760000 + JRST PERMEB + MOVEM B,ESGPTR +POL,< JRST PERMDC > +PERMEC: +>;MDPC +;Generate CMPWRD from signal, used for hash matching + SETZM CMPWRD + MOVE A,[POINT 7,CMPWRD] + MOVE B,[POINT 7,PERMTB] + TLZ SFLAG,NFLAG1 + PUSHJ P,ENDGET + JRST CKERR + CAIN T,NOTCHR + TLOA SFLAG,NFLAG1 + JRST PRM10A +PERM10: PUSHJ P,ENDGET + JRST CKERR ;EOL OR ";" +PRM10A: IDPB T,A + TLNE A,760000 ;ENOUGH FOR CMPWRD? + JRST PERM10 +CKERR: TLNN SFLAG,WHERR ;WAS THERE AN ERROR? + JRST CKERR0 + PUTSTR[ASCIZ/CAUSED BY SIGNAL - /] + PUTSIG PERMTB + PUTSTR[ASCIZ/ +/] +CKERR0: TLNN SFLAG,EXPERR ;WAS THERE AN ERROR? + JRST CKSIG + PUTSTR[ASCIZ/ERROR IN EXPRESSION(S) - /] + PUTSIG PERMTB + PUTSTR[ASCIZ/ +/] + JRST CKSIG + ;Screw around with negation, assertion and polarity to +;make it agree with old signal name that is being replaced +MDPC,< +POL,< +PERMDC: TRNN SFLAG,EXTRAS + JRST PERMEC + SKIPGE TTT,POLAR + CAMN TTT,OPOLAR + JRST PERMEC ;NEW HAS NO POLARITY OR IS SAME AS OLD + SKIPL OPOLAR ;DID OLD HAVE POLARITY? + JRST PERMEC ;NO + MOVE C,ESGPTR ;GET EXTRACT POINTER +PERMED: PUSHJ P,GETRVS + JRST PERMEC + CAIE D,"L" + CAIN D,"H" + CAIA + JRST PERMED + CAIE D,"L" + SKIPA D,["L"] + MOVEI D,"H" + DPB D,C ;CHANGE SENSE OF POLARITY + TRNE SFLAG,LEADN ;LEADING NOT? + JRST PERMEE ;YES, DELETE IT + TRNN SFLAG,SAW01 ;DID WE PASS OVER A 0 OR 1? + JRST PERMEF ;NO, INSERT NOT +PERMEG: PUSHJ P,GETRVS + JRST [ PUTSTR[ASCIZ/ERROR IN PERMES, 0 OR 1 NOT FOUND IN SIGNAL: +/] + PUTSTR ESGTAB + PUTSTR[ASCIZ/ +/] + JRST PERMEF] + CAIE D,"0" + CAIN D,"1" + TRCA D,1 ;FOUND 0 OR 1, COMPLEMENT AND SKIP + JRST PERMEG + DPB D,C ;STORE BACK + JRST PERMEC + +;Delete NOTCHR at start of signal +PERMEE: MOVE A,[POINT 7,ESGTAB] +PERMEH: ILDB TTT,A + CAIE TTT,NOTCHR + JUMPN TTT,PERMEH + JUMPE TTT,[PUTSTR[ASCIZ/ERROR IN PERMES, "-" NOT FOUND IN SIGNAL: +/] + PUTSTR ESGTAB + PUTSTR[ASCIZ/ +/] + JRST PERMEC] + MOVE B,A + ILDB TTT,A + DPB TTT,B +PERMEI: ILDB TTT,A + IDPB TTT,B + JUMPN TTT,PERMEI + JRST PERMEC + +;Insert NOTCHR at beginning of ESGTAB table +PERMEF: MOVE A,[POINT 7,ESGTAB] + MOVE B,A + MOVEI TTT,NOTCHR +PERMEJ: ILDB TT,A + IDPB TTT,B + SKIPE TTT,TT + JRST PERMEJ +PERMEK: IDPB TTT,B + TLNE B,760000 + JRST PERMEK +>;POL +>;MDPC + ;CKSIG - CHECK SIGNAL IN PERMTB FOR SPECIAL CASES +; returns flags in T,SAVBIT +; checks for signals of the form +5.0V, returns VOLTAGE and SPWR bit +; checks for known signals like HI, NC, VCC, GND, +3, HIGH, etc. + +CKSIG: MOVE B,[POINT 7,PERMTB] ;PREPARE TO SCAN SIGNAL + PUSHJ P,ENDGET ;SIGNAL NAME TERMINATED? + JRST NCKPWR ;YES, SEE IF IT LOOKS LIKE SPECIAL SIGNAL NAME + +;Check for signal of the form +5V, +5.0V, etc. + TRZ SFLAG,NOCAN ;ASSUME IT IS FULL, CANONICAL + CAIN T,"-" + JRST [ TRO SFLAG,PRMTMP + JRST CKPWR1] + CAIE T,"+" + JRST NCKPWR + TRZ SFLAG,PRMTMP +CKPWR1: SETZ A, ;CLEAR NUMBER ACCUMULATOR +CKPWR2: PUSHJ P,ENDGET + JRST NCKPWR + CAIL T,"0" + CAILE T,"9" + JRST CKPWR3 + IMULI A,=10 ;ACCUMULATE LEADING DIGITS "+5???" + ADDI A,-"0"(T) + JRST CKPWR2 + +CKPWR3: IMULI A,=100 ;WILL ADD UP TO 2 MORE DIGITS + CAIE T,"." ;"+5.???" + JRST CKPWR5 + PUSHJ P,ENDGET + JRST NCKPWR + CAIL T,"0" + CAILE T,"9" + JRST CKPWR5 ;FIRST MUST BE DIGIT + SUBI T,"0" ;"+5.0???" + IMULI T,=10 + ADDI A,(T) + PUSHJ P,ENDGET + JRST NCKPWR + CAIL T,"0" + CAILE T,"9" + JRST CKPWR4 ;"+5.00???" + ADDI A,-"0"(T) + PUSHJ P,ENDGET + JRST NCKPWR + CAIA +CKPWR5: TRO SFLAG,NOCAN +CKPWR4: CAIE T,"V" ;"+5.00V?" + JRST NCKPWR + TRNE SFLAG,PRMTMP + MOVN A,A + PUSHJ P,CKSIGE + JRST NCKPWR + MOVEM A,VOLTAGE ;RETURN MARKED AS PWR SIGNAL + MOVEI T,SPWR + TRNN SFLAG,NOCAN + TRO T,SCANON ;IS CANONICAL FORM + JRST CKSIG5 + + ;CHECK FOR SPECIAL SIGNALS - GND, VCC, ETC. +NCKPWR: MOVSI C,-SPLEN +CKSIG1: MOVE A,SPTAB(C) + HRLI A,() + MOVE B,[POINT 7,PERMTB] +CKSIG2: ILDB TT,A + JUMPE TT,CKSIG3 + PUSHJ P,ENDGET + JRST CKSIG4 + CAMN TT,T + JRST CKSIG2 +CKSIG4: AOBJN C,CKSIG1 + SETZ T, +CKSIG5: TLNE SFLAG,GLB1SN + TRO T,GLB1 + TLNE SFLAG,GLB2SN + TRO T,GLB2 + MOVEM T,SAVBIT ;RETURN BITS HERE + MOVE SFLAG,FLGSAV + POPJ P, + +CKSIG3: PUSHJ P,CKSIGE + JRST CKSIG4 + HLRZ T,SPTAB(C) ;GET FLAGS TO MARK AS SPWR,SNC,SHI,SGND,.. + MOVEI TT,=500 ;+5.00V + TRNE T,SPWR ;Signal VCC + MOVEM TT,VOLTAGE + JRST CKSIG5 + +CKSIGE: PUSHJ P,ENDGET + JRST CPOPJ1 + CAIN T,40 + AOS (P) + POPJ P, + + ;ENDGET - check termination of string in B +; skips over spaces (if not significant) and BS constructs +; skips if ended with other than space,tab,";", or end of string +; returns terminating char in T +ENDGET: ILDB T,B +PERM13: JUMPE T,CPOPJ ;END OF STRING + CAIE T,"\" ;MAY BE BS CONSTRUCT - "\#\" + JRST PERM12 + PUSH P,TT ;DON'T CLOBBER TT + MOVEI TTT,B ;GET POINTER TO BYTE POINTER + PUSHJ P,SKIPBS ;SKIP BS STUFF + SKIPA T,TT ;NO SKIP IF NOTHING THERE + JRST [ MOVE T,TT ;CHAR AFTER TERMINATING "\" + POP P,TT + JRST PERM13] ;WAS BS, LOOP BACK FOR CHECK + POP P,TT +PERM12: CAIE T," " + JRST PERM11 +MWL,< TRNN PETIT > +MDPC,< TRNN M,SPACES > + JRST ENDGET +PERM11: CAIN T,11 + POPJ P, + CAIE T,";" + AOS (P) + POPJ P, + ;HANDLE QUALIFIER LETTERS AND WIRE RULE NUMBERS +GETQN: +MDPC,< MOVE C,ESGPTR + MOVEM C,ESGSAV + EPUT2 +>;MDPC + SETZM WQNTMP ;CLEAR TMP CELLS + MOVE C,A ;SAVE CURRENT GET POINTER IN CASE OF ERROR + XCT GETSIG + JRST QNERR + EPUT2 + CAIN TTT,"#" + JRST DON + SKIPN TTT,QL2N(TTT) ;GET CODE FOR LETTER + JRST QNERR ;NO CODE + HRLM TTT,WQNTMP ;STORE CHARACTER CODE + XCT GETSIG + JRST QNERR + EPUT2 + CAIE TTT,"#" + JRST DONE +DON: SETZ T, +DON1: XCT GETSIG + JRST QNERR + EPUT2 + CAIL TTT,"0" + CAILE TTT,"9" + JRST DOQ + IMULI T,=10 + ADDI T,-60(TTT) + CAILE T,777777 ;FIT IN HALFWORD? + JRST QNERR + JRST DON1 + +DOQ: HRRM T,WQNTMP +DONE: CAIE TTT,"\" + JRST QNERR + HRRZ T,WQNTMP + HRRZ TT,WQNWRD + PUSHJ P,WHCHRN + TLO SFLAG,WHERR + HRRM T,WQNWRD + HLRZ T,WQNWRD + HLRZ TT,WQNTMP + PUSHJ P,WHCHQ + TLO SFLAG,WHERR ;GET SIGNAL PRINTED + HRLM T,WQNWRD + JRST SIGONE + +QNERR: MOVE A,C +MDPC,< MOVE C,ESGSAV + MOVEM C,ESGPTR +>;MDPC + PUSH P,TTT + MOVEI TTT,"\" + EPUTS + PUSHJ P,PUTIT + POP P,TTT + JRST CPOPJ1 + + ;WHCHQ - CHECK QUALIFIER LETTERS IN T,TT +;SKIPS IF OK, T = NEW (TT) UNLESS NULL +^WHCHQ: JUMPE TT,CPOPJ1 + EXCH T,TT + JUMPE TT,CPOPJ1 + CAMN T,TT + JRST CPOPJ1 + HRL T,TTT + PUSH P,T + PUTSTR[ASCIZ/MULTIPLE QUALIFIER LETTERS "/] + PUTBYT @QN2L(T) + PUTSTR[ASCIZ/" AND "/] + PUTBYT @QN2L(TT) + PUTSTR[ASCIZ/" +/] + POP P,T + HLRZ TTT,T + POPJ P, + +;WHCHRN - CHECKS RULE NUMBERS IN T,TT FOR COMPATIBILITY +;RETURNS (SKIP IF OK) T = COMBINED RULES +;Rule #'s seem to be BBBBNN where NN is rule number of which +; there must be only one on a run. BBBB are "bits" which are +; IORed for all rule specs on run. ?? + +^WHCHRN:JUMPE TT,CPOPJ1 + EXCH T,TT + JUMPE TT,CPOPJ1 + CAMN T,TT + JRST CPOPJ1 + PUSH P,TTT + IDIVI TT,=100 ;SEPERATE NUMBER PART FROM BIT PART + MOVEM TT,1(P) ;SAVE BIT PART + IDIVI T,=100 ;SEPERATE OTHER ONE + IOR T,1(P) ;OR BITWISE STUFF TOGETHER + IMULI T,=100 ;PREPARE TO ADD NUMBER PART BACK + JUMPE TTT,WHRNOK ;IF EITHER NUMBER PART 0, THEN OK + EXCH TT,TTT + JUMPE TTT,WHRNOK + CAMN TT,TTT ;NUMBER PARTS THE SAME? + JRST WHRNOK ;YES, THEN ON ERROR MESS + CAMG TT,TTT ;USE LARGER OF NUMBER PARTS + EXCH TT,TTT + ADD T,TT + HRL T,(P) ;SAVE OLD TTT IN T + MOVEM T,(P) ;THEN BOTH ON STACK + PUTSTR[ASCIZ/MULTIPLE WIRE RULE NUMBERS /] + PUSH P,TT + MOVE T,TTT + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ AND /] + POP P,T + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ +/] + POP P,T + HLRZ TTT,T + POPJ P, + +WHRNOK: ADD T,TT + POP P,TTT + JRST CPOPJ1 + + ;LETTER/CODE CONVERION TABLES FOR QUALIFIER LETTERS +;WHEN THESE TABLES ARE CHANGED, BACVER MUST BE INCREMENTED. +;ALSO IF MORE THAN 37 (OCTAL) CHARS ARE IMPLEMENTED, QBITS MUST BE INCREASED +^QL2N: +FOR I_0,"+"-1 +< 0 +> + "Z"-"A"+1+1 ;USE CODE AFTER Z FOR + +FOR I_"+"+1,"A"-1 +< 0 +> +FOR I_"A","Z" +< I-"A"+1 +> +FOR I_"Z"+1,"A"+40-1 +< 0 +> +FOR I_"A"+40,"Z"+40 +< I-40-"A"+1 +> +FOR I_"Z"+40+1,177 +< 0 +> +IFN .-QL2N-200, + +^QN2L: "?" +FOR I_"A","Z" +< I +> + "+" +REPEAT 40+QN2L-.,< "?" > +MWL,< +IFN QBITS-37, +>;MWL + ;SIGONE, PUTIT, EPUTIT, AND SPTAB +SIGONE: PUSHJ P,SIGGET + MOVEM TTT,SIGCHR + JUMPE TTT,CPOPJ + CAIE TTT,11 + CAIN TTT,"" + MOVEI TTT,40 + JRST CPOPJ1 + +PUTIT: CAMN B,[POINT 7,PERMTB+MXSTLN-1,27] + JRST [ PUTSTR[ASCIZ/EXPANDED STRING TOO LONG, TRUNCATED TO: +/] + HRLZ TTT,TTT + IDPB TTT,B + TLZ B,7700 + HLRZ TTT,TTT + PUTSTR PERMTB + PUTSTR[ASCIZ/ +/] + POPJ P,] + CAIL TTT,"a" + CAILE TTT,"z" + CAIA + SUBI TTT,40 ;CONVERT LOWER CASE TO UPPER CASE + IDPB TTT,B + POPJ P, + +MDPC,< +EPUTIT: EXCH TTT,ESGPTR + CAMN TTT,[POINT 7,ESGTAB+ESGTLN-1,34] + JRST [ EXCH TTT,ESGPTR + PUTSTR[ASCIZ/EXTRACTED STRING TOO LONG, TRUNCATED TO: +/] + HRLZ TTT,TTT + IDPB TTT,ESGPTR + HLRZ TTT,TTT + EXCH TTT,ESGPTR + TLZ TTT,7700 + EXCH TTT,ESGPTR + PUTSTR ESGTAB + PUTSTR[ASCIZ/ +/] + POPJ P,] + EXCH TTT,ESGPTR + IDPB TTT,ESGPTR + POPJ P, +>;MDPC + +SPTAB: SGND!SCANON,,[ASCIZ/GND/] + SNC,,[ASCIZ/NC/] +DEC,< SHI,,[ASCIZ/+3/] > +NODEC,< + SPWR,,[ASCIZ/VCC/] + SHI,,[ASCIZ/HI/] + SHI,,[ASCIZ/HIGH/] +>;NODEC +SPLEN__.-SPTAB + SUBTTL ALPHA +;COMPARE ASCIZ SIGNAL NAMES T,TT +;RETURNS: +; T .LT. TT +; T .GT. TT +; Equivalent, but T .LT. TT +; Equivalent, but T .GT. TT +; Exactly equal + +; Skips over leading NOTCHR, flags as NFLAG1 (T), NFLAG2 (TT) + +^ALPHA: MOVEM SFLAG,FLGSAV + SETZ SFLAG, ;INITIALIZE FLAGS + MOVE TTT,(T) ;COMPARE WORD + CAME TTT,(TT) ;EQUAL? + JRST [ LSH TTT,-1 ;NO, THIS IS EASY + MOVE TT,(TT) + LSH TT,-1 + CAML TTT,TT + JRST FLAGJ1 ;UNEQUAL TT LESS THAN T + JRST FLAGJ] ;UNEQUAL T LESS THAN TT + ADD T,[POINT 7,1,6] + ADD TT,[POINT 7,1,6] + MOVEM T,TPTRP + MOVEM TT,TTPTRP + LDB T,TPTRP + LDB TT,TTPTRP + TLO SFLAG,NFLAG1!NFLAG2 ;ASSUME BOTH NOT'S + CAIE T,NOTCHR + TLZA SFLAG,NFLAG1 + ILDB T,TPTRP + CAIE TT,NOTCHR + TLZA SFLAG,NFLAG2 + ILDB TT,TTPTRP + JRST BEGCOM ;GO CHECK FOR SPACES FIRST + +ALPHA2: CAIN T,";" ;CONVERT THESE + SETZ T, ;TO END OF STRING SO WE WILL GET TO OTHER LOOP + CAIN TT,";" + SETZ TT, + CAME T,TT + JRST ALPHAN + JUMPE T,CHKEND + ILDB TT,TTPTRP + ILDB T,TPTRP +BEGCOM: CAIN T," " ;STRIP LEADING SPACES FROM T, IF NOT SIGNIFICANT +MWL,< TRNE PETIT > +MDPC,< TRNE M,SPACES > + JRST SKIPM1 + ILDB T,TPTRP + JRST BEGCOM + +SKIPM1: CAIN TT," " ;STRIP LEADING SPACES FROM TT, IF NOT SIGNIFICANT +MWL,< TRNE PETIT > +MDPC,< TRNE M,SPACES > + JRST SKIPM2 ;GO LOOK FOR BS + ILDB TT,TTPTRP + JRST SKIPM1 + + ;CHECK FOR BS \...\ +SKIPM2: EXCH T,TT + MOVEI TTT,TPTRP + CAIN TT,"\" + PUSHJ P,SKIPBS ;LOOK FOR BS \...\ IN T + JRST SKIPM4 + JRST SKIPM3 + +SKIPM4: EXCH T,TT + MOVEI TTT,TTPTRP + CAIN TT,"\" + PUSHJ P,SKIPBS + JRST ALPHS1 ;CHECK FOR 0,1 H,L + TRO SFLAG,BSSEEN ;FLAG BS ERR DIFF, SEEN ON TT, NOT T + JRST BEGCOM ;(IF FIRST TIME, TBSGTR WILL BE OFF) + +; First string had BS \...\ construct +SKIPM3: MOVE TTT,WQNTMP ;SAVE THIS + MOVEM TTT,WQNTM1 + EXCH T,TT + MOVEI TTT,TTPTRP + CAIN TT,"\" + PUSHJ P,SKIPBS + JRST [ TRNE SFLAG,BSSEEN ;SEEN BS DIF ALREADY? + JRST BEGCOM + JRST SKIPM5] ;NO, NO BS SET TBSGTR + MOVE TTT,WQNTMP ;GET TT BS + TRNN SFLAG,BSSEEN ;SEEN BS DIF ALREADY? + CAMN TTT,WQNTM1 ;NO, DIFFERENT? + JRST BEGCOM ;NO, GO CHECK SPACES AGAIN + CAMG TTT,WQNTM1 ;COMPARE TO T BS +SKIPM5: TRO SFLAG,TBSGTR ;T BS .GT. TT BS + TRO SFLAG,BSSEEN ;FLAG DIFFERENCE SEEN + JRST BEGCOM ;GO CHECK SPACES AGAIN + + ;Check for (0,1) or H,L equivalences. + +ALPHS1: +NOPOL,< JRST ALPHA2 > +POL,< MOVEI TTT,TPTRP + CAIN T,11 + PUSHJ P,ALPHL ;Assertion, polarity? + CAIA + TLC SFLAG,NFLAG1 ;Yes, and changes signal + EXCH T,TT + MOVEI TTT,TTPTRP + CAIN T,11 + PUSHJ P,ALPHL + CAIA + TLC SFLAG,NFLAG2 + EXCH T,TT + JRST ALPHA2 + +;Check for 0,1 H,L - SKIP IF PRESENT AND CHANGES POLARITY +ALPHL: TLZ SFLAG,POLFLG + HRLM T,(P) ;SAVE ORIG CHAR (TAB ALWAYS?) + PUSH P,(TTT) ;SAVE ORIGINAL POINTER + PUSHJ P,ALPHSP ;GET NON-SPACE + CAIN T,"0" + TLOA SFLAG,POLFLG + CAIN T,"1" + PUSHJ P,ALPHSP + CAIN T,"L" + TLCA SFLAG,POLFLG + CAIN T,"H" + JRST [ SUB P,[1,,1] + TLNE SFLAG,POLFLG ;INVERTS SENSE? + AOS (P) ; YES + JRST ALPHSP] + POP P,(TTT) ;NOT REALLY H,L ETC., RESTORE POINTER + HLRZ T,(P) ;RESTORE CHAR + POPJ P, + +ALPHSP: LDB T,(TTT) + JUMPE T,CPOPJ + ILDB T,(TTT) + CAIN T,40 + JRST ALPHSP + POPJ P, +>;POL + ;END OF STRINGS, CHECK +CHKEND: TLNN SFLAG,NFLAG1 + JRST CHKEN1 + TLNN SFLAG,NFLAG2 + JRST FLAGJ1 ;TT LESS THAN T + JRST CHKEN2 + +CHKEN1: TLNE SFLAG,NFLAG2 + JRST FLAGJ ;T LESS THAN TT +CHKEN2: MOVEI T,2 ;AT LEAST EQUIVALENT + ADDM T,(P) + TRNE SFLAG,BSSEEN ;DIFFERNCE IN BS? + JRST [ TRNE SFLAG,TBSGTR ;T BS GREATER THAN TT BS? + JRST FLAGJ1 ;YES, SKIP + JRST FLAGJ] ;NO, NO SKIP + LDB T,TPTRP + LDB TT,TTPTRP ;GET REAL CHARS BACK +SEMCHK: CAME T,TT + JRST ALPHAN + JUMPE T,FLAGJ2 ;EXACTLY EQUAL + ILDB T,TPTRP + CAIN T," " + JRST .-2 ;ALWAYS IGNORE SPACES IN COMMENTS + ILDB TT,TTPTRP + CAIN TT," " + JRST .-2 + JRST SEMCHK + +FLAGJ2: AOSA (P) +ALPHAN: CAML T,TT +FLAGJ1: AOS (P) +FLAGJ: MOVE SFLAG,FLGSAV + POPJ P, + + ;SKIPBS - SKIP BS CONSTRUCT +; TTT points to byte pointer within string after "\" +; looks for "\X\" single letter +; "\#123\" number +; "\X#123\" letter, number +; returns in WQNTMP letter-code,,number +; skips if found legal construct +; if fails, resets byte pointer + +SKIPBS: SETZM WQNTMP + PUSH P,(TTT) ;SAVE BYTE POINTER + ILDB TT,(TTT) + CAIN TT,"#" ;NUMBER ONLY? + JRST SKPBS3 + SKIPN TT,QL2N(TT) ;LEGAL LETTER? + JRST SKPBSE ;NO + HRLM TT,WQNTMP ;STORE HERE FOR COMPARE + ILDB TT,(TTT) ;YES, NEXT CHAR + CAIE TT,"#" ;NOW NUMBER? + JRST SKPBS4 +SKPBS3: PUSH P,T + SETZ T, +SKPBS6: ILDB TT,(TTT) + CAIL TT,"0" + CAILE TT,"9" + JRST SKPBS5 + IMULI T,=10 + ADDI T,-"0"(TT) + CAIG T,777777 + JRST SKPBS6 + POP P,T +SKPBSE: POP P,(TTT) + LDB TT,(TTT) + POPJ P, + +SKPBS5: HRRM T,WQNTMP + POP P,T ;LEGAL NUMBER +SKPBS4: CAIE TT,"\" ;END WITH \ ? + JRST SKPBSE ;NO + ILDB TT,(TTT) ;GET FOLLOWING CHAR + POP P,(P) ;LOSE SAVED POINTER + JRST CPOPJ1 ;NON-SKIP RETURN TO INDICATE BS CONSTRUCT + +BEND SIGSUB diff --git a/src/draw/sub.501 b/src/draw/sub.501 new file mode 100644 index 00000000..530d29db --- /dev/null +++ b/src/draw/sub.501 @@ -0,0 +1,4126 @@ +;SUB.FAI.205, 26-NOV-75 17:02:15, EDIT BY HELLIWELL +VERSION(SUB,18) +;HERE WE SAVE DUMP FILES OF ALL SORTS +LAY,< +RSAVEM: TROA TFLG +>;LAY +SAVEME: +LAY,< TRZ TFLG > +IFN DECSW!IIISW,< + TLNE M,DSKFLG + JRST [ OUTSTR[ASCIZ/SORRY, DSKIN ACTIVE! +/] + POPJ P,] +>;IFN DECSW!IIISW +NODEC,< +NOIII,< + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/DISK SAVE /] +LAY,< MOVE H,SAVNAM + EXCH H,LSTNAM ;USE THIS AS LSTNAM FOR NOW + MOVE G,SAVPPN + EXCH G,LSTPPN + MOVE F,SAVEXT + EXCH F,LSTEXT +>;LAY + MOVSI T,EXTSAV + PUSHJ P,SETNAM +NOLAY,< POPJ P, > +LAY,< JRST [ MOVEM H,LSTNAM ;CHANGED HIS MIND, RESTORE LSTNAM + MOVEM G,LSTPPN + MOVEM F,LSTEXT + POPJ P,] + MOVEM H,LSTNAM + MOVEM G,LSTPPN + MOVEM F,LSTEXT +>;LAY + ENTPPN +ESAVEM: + MOVE T,[FILNAM,,DPCNAM] + BLT T,DPCPPN + INIT DAT,17 + 'DSK ' + 0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK FOR EXISTS CHECK! +/] + POPJ P,] + PUSHJ P,EXIST + POPJ P, ;LET HIM OUT + RELEASE DAT, + PUSH P,0 + PUSH P,M + PUSHJ P,PUSHIT + MOVEM P,SSSP +LAY,< TRNE TFLG + SKIPA T,[.STRTN] ;START FROM TOP ON RESAVE +>;LAY + MOVEI T,CONTLC + MOVEM T,STRTLC +NOLAY,< JSR SVREST > +LAY,< +MD,< JSR DOSAVD > +MPC,< JSR DOSAVP > +>;LAY + CAIA ;LOSE, CRLF ALREADY OUT + OUTSTR[ASCIZ/ +/] ;WIN, NEED CRLF +>;NOIII +>;NODEC +III,< PUSH P,0 + PUSH P,M + PUSHJ P,PUSHIT + MOVEM P,SSSP +>;III +IFN DECSW!IIISW,< + MOVEI T,CONTLC + HRRM T,.JBSA + OUTSTR[ASCIZ/SAVE CORE IMAGE WITH "SAVE" COMMAND, +THEN TYPE "START" OR "RUN". +/] +DEC,< PUSHJ P,CTRLCS > ;SIMULATE CONTROL-C +III,< EXIT 1, > +>;INF DECSW!IIISW +NODEC,< + MOVE P,SSSP + PUSHJ P,POPIT + POP P,M + POP P,0 +>;NODEC + JRST SAVCON + +NOLAY, +CNTSAV: +DEC,< JSP T,CTRLCX > ;CALL CONTROL-C EXIT ROUTINE +LAY,< +MD,< OUTSTR[ASCIZ/LAYOUT, D SIDE! +/] +>;MD +MPC,< OUTSTR[ASCIZ/LAYOUT, PC SIDE! +/] +>;MPC +>;LAY +NODEC,< + MOVE P,SSSP + PUSHJ P,POPIT + POP P,M + POP P,0 + PUSHJ P,DCLAIM ;RECLAIM DISPLAY FOR EVERYONE ELSE (DEC DONE IN CTRLC CODE) +>;NODEC +DEC,< PUSHJ P,CLTIME > ;RE INIT TIME CELLS +SAVCON: +NODEC,< +NOIII,< MOVE T,DPCNAM +NOLAY,< MOVEM T,LSTNAM ;UPDATE  > +LAY,< MOVEM T,SAVNAM > + MOVE T,DPCPPN +NOLAY,< MOVEM T,LSTPPN > +LAY,< MOVEM T,SAVPPN > + MOVE T,DPCEXT +NOLAY,< MOVEM T,LSTEXT > +LAY,< MOVEM T,SAVEXT > + JRST FILEUP +>;NOIII +>;NODEC +IFN DECSW!IIISW,< + MOVEI T,STRT + HRRM T,.JBSA + POPJ P, +>;IFN DECSW!IIISW + ;ESAVE, EWRITE, SETSM, SETWM, MAKEWD +NODEC,< +NOIII,< +ESAVE: MOVE T,AUTOSM + MOVEM T,AUTOSN ;UPDATE AUTO-SAVE COUNTER +LAY,< SKIPN T,SAVNAM > +NOLAY,< SKIPN T,LSTNAM > + JRST [ OUTSTR[ASCIZ/NO REMEMBERED NAME AT ESAVE! +/] + POPJ P,] + MOVEM T,FILNAM + SETOM THEREXISTS + MOVSI T,EXTSAV + MOVEM T,FILEXT + SETZB T,FILDAT +LAY,< MOVE T,SAVPPN > +NOLAY,< MOVE T,LSTPPN > + MOVEM T,FILPPN + JRST ESAVEM + +SETSM: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NUMBER OF COMMANDS BETWEEN ESAVES?/] + PUSHJ P,READNC + MOVEM T,AUTOSM + MOVEM T,AUTOSN + POPJ P, + +CLRSM: SETZM AUTOSM + POPJ P, +>;NOIII +>;NODEC + +SETWM: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NUMBER OF COMMANDS BETWEEN EWRITES?/] + PUSHJ P,READNC + MOVEM T,AUTOWM + MOVEM T,AUTOWN + POPJ P, + +CLRWM: SETZM AUTOWM + POPJ P, + +MAKWIR: MOVEI T,BODM + PUSHJ P,CHNGMD + PUSHJ P,XCLEAR + OUTSTR[ASCIZ/BODY MODE, CLEAR. +/] + MOVEM P,PERRSAV + MOVSI T,EXTFIL + PUSHJ P,SETNAM + POPJ P, + INIT DAT,17 + 'DSK ' + 0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POPJ P,] + MOVSI G,EXTWIR + EXCH G,FILEXT + SETZ H, + DSKPPN H, ;WILL WRITE 'WD' FILE ON CURRENT AREA + EXCH H,FILPPN + OUTSTR[ASCIZ/READING DATE FROM /] + MOVEI A,FILNAM + JSR FPRINT + MOVE T,FILPPN + LOOKUP DAT,FILNAM + JRST [ HRRZ TT,FILEXT + JUMPN TT,LOOKRR + SETZM FILDAT + JRST MAKWR1] +DEC,< JSR DAT,LOOKCK > +NODEC,< MOVEM T,FILPPN > +MAKWR1: OUTSTR[ASCIZ/ +/] + MOVE T,FILDAT + LDB TT,[POINT 3,FILEXT,20] + DPB TT,[POINT 6,T,23] + HRLZM T,WIRDAT + LDB T,[POINT 11,FILDAT,23] + HRRM T,WIRDAT + MOVEM G,FILEXT + MOVEM H,FILPPN + RELEASE DAT, + TLZ M,TYPREP!TYPNLY + PUSHJ P,WIRENT + SKIPN LSTNAM + POPJ P, ;LOST, OR WD FILE NOT NEEDED + JRST EWLIST + ;REENTER CODE +%R: MOVEM T,RSAVET ;SAVE T HERE FOR NOW! +DEC,< +NOGT,< + MOVEI T,0 + SETUWP T, ;UNWRITEPROTECT THE HIGH SEGMENT + JFCL +>;NOGT +>;DEC + MOVE T,P ;SAVE STACK HERE A SEC + MOVE P,[IOWD SPPDSZ,SPPDL] ;NOW GET A GOOD ONE (IN CASE OF PDLOV) + PUSH P,T ;NOW SAVE STACK ON STACK + OUTSTR [ASCIZ / +IF YOU TYPE "N", THE PROGRAM WILL BE CONTINUED WHERE IT LEFT OFF. +YOU WILL BE GIVEN A CHANCE TO STOP MACROS CURRENTLY BEING EXECUTED. +IF YOU TYPE "Y", THE PROGRAM WILL BE STARTED IN THE COMMAND LOOP, AND +ALL MACROS CURRENTLY BEING EXECUTED WILL BE STOPPED. +NOTE: TYPING "Y" HAS A FINITE PROBABILITY OF MUNGING THE DATA STRUCTURE. +TYPE "Y" OR "N"? /] + PUSHJ P,TTYORN + CAIA + JRST REINIT + POP P,P ;NOT RESTARTING, ASSUME STACK GOOD + MOVE T,RSAVET + PUSHJ P,PUSHIT + OUTSTR[ASCIZ/FLUSH MACROS IN PROGRESS? /] + PUSHJ P,TTYORN + CAIA + PUSHJ P,ABMAC +NODEC,< PUSHJ P,DCLAIM > ;RE-SETUP DISPLAY STUFF + PUSHJ P,POPIT +R: JRST @.JBOPC + +TTYORN: TTYUUO 4,T + PUSH P,T +TTYRN1: TTYUUO 4,T + CAIE T,12 ;GOBBLE TO END OF LINE + JRST TTYRN1 + POP P,T + CAIE T,"Y"+40 + CAIN T,"Y" + AOS (P) + POPJ P, + +MPC,< +GOTPNT: FETCHL(SID,T,PBIT) + TLZ SID,777777-FRONT + POPJ P, + +>;MPC + +REINIT: MOVE P,[IOWD PDLEN,PDL] ;REQUESTING PSEUDO START + MOVE 0,SAVER0 + TRO MCHG!NEEDCL + MOVE M,SAVERM + SETZM DSKOPN + RELEASE ODSK, ;GIVE LOG FILE A CHANCE TO BE RESTARTED + PUSHJ P,ABMAC ;FLUSH MACROES +DEC,< PUSHJ P,DECGO > + PUSHJ P,DCLAIM +DEC,< PUSHJ P,LOGINI > + PUSHJ P,RCHNGM ;RESTORE OMODE +MPC,< SETZ SID, + SKIPE T,PONPNT + PUSHJ P,GOTPNT + TLC SID,FRONT + SKIPE T,PONPN2 + PUSHJ P,GOTPNT + TLC SID,FRONT +>;MPC + JRST MAIN + SUBTTL FREE STORAGE ROUTINES + +;An appeal for more core.... + +DEFINE DOCORE(AC,FAIL) +< +III,< PUSH P,AC + MOVEI AC,1 + UNLOK. AC, + JFCL + POP P,AC +>;III +NOTWO,< CORE AC, > +TWO,< CORE2 AC, > + JRST [ JSR NOCORE + JRST FAIL] +III,< MOVEI AC,1 + LOCK AC, + JFCL +>;III +>;docore + +;Get core for old style free storage - 2 wd blocks + +NOFSTA: MOVEM A,SAVEA + MOVEM B,SAVEB +NOFST3: GETREL A + ADDI A,1 + MOVEM A,FSTPNT + ADDI A,1777 +VB10,< MOVSI A,(A)> + DOCORE(A,NOFST3) ;get a coreblock +;build free list to end of new block + MOVE A,FSTPNT + GETREL B +NOFST1: ADDI A,2 + CAIG A,(B) + JRST [ HRRZM A,-2(A) + JRST NOFST1] + HRLI A,[0] + HLRZM A,-2(A) ;LINK END OF LIST TO 0 + SOS NOFST + SOS NOFST + MOVE B,SAVEB + MOVE A,SAVEA + JRST @NOFST + +;NOBLK - GET FREE STORAGE BLOCK +; SKIPN AC,@BLKPNT+SIZE +; JSR NOBLK +; EXCH AC,BLKPNT+SIZE + +COMMENT  + BLOCK STORAGE IS ALLOCATED SEQUENTIALLY OUT OF A 1K FREE AREA + _________________ + ! ! + ! used ! +BLKTOP -------------> ! ------------- ! ---- + ! ! + ! FREE ! BLKFRE WORDS + ! ! + ! ! + ! !  + ----------------- ---- + + A NEW 1K IS ADDED IF THE BLOCK SIZE WON'T FIT, BUT IT IS + TACKED ON THE END OF THE OLD 1K IF THE OLD 1K WAS AT THE TOP + OF FREE CORE. + + +NOBLKA: MOVEM A,SAVEA + MOVEM B,SAVEB +NOBLK2: HRRZ B,@NOBLK ;GET PTR INTO BLK TABLE + HRRZ A,BLKFRE ;# FREE WORDS LEFT IN THIS GULP + CAIL A,-BLKPNT(B) ;BIG ENOUGH FOR BLOCK? + JRST NOBOK ;YES +NOBLK1: GETREL A ;HIGH PTR + MOVE B,A + XOR B,BLKTOP ;CURRENTLY ALLOCATING RIGHT AT TOP? + TRNE B,-2000 + SETZM BLKFRE ;NO, START NEW GULP + ADDI A,1 + MOVE B,A ;SAVE LOCN OF NEW 1K + DOCORE(A,NOBLK1) ;Get a coreblock from system + SKIPN BLKFRE ;ADDING ON TO OLD BLK? + MOVEM B,BLKTOP ;NO, START FROM BEGINNING OF NEW 1K THEN + MOVEI A,2000 ;WE GOT 2000 NEW WORDS + ADDM A,BLKFRE + JRST NOBLK2 ;TRY AGAIN + +NOBOK: MOVE A,BLKTOP ;PTR TO ADDED BLOCK + EXCH A,(B) ;PUT IT ON FREE LIST(SIZE) + HRRZM A,@(B) ;PUT BACK [0] AT END + MOVEI A,-BLKPNT(B) ;LENGTH OF BLOCK + ADDM A,BLKTOP ;CONSUME STORAGE + MOVNS A + ADDM A,BLKFRE + MOVE B,SAVEB + MOVE A,SAVEA + SOS NOBLK + SOS NOBLK + JRST @NOBLK + +BLKINI: MOVEI T,[0] ;INITIALIZE FREE LISTS TO NULL + MOVEM T,BLKPNT + MOVE T,[BLKPNT,,BLKPNT+1] + BLT T,BLKPNT+FSTLEN + SETZM BLKFRE ;NO FREE SPACE FOR BLOCKS + SETOM BLKTOP ;NOT CURRENTLY ALLOCATING IN ANY BLOCK + POPJ P, + + ;SWITCH, UNSCAL +MPC,< +%SWITCH:MOVE T,PONPNT + EXCH T,PONPN2 + MOVEM T,PONPNT + TLC SID,400000 + MOVSS BARLST + POPJ P, +>;MPC + +;convert from III points to internal points +;(internal coords are shifted 1 - the low bit is 0) +%UNSCAL: + PUSH P,TT + PUSH P,TTT +MPC,< ASH T,4 > ;Nscale 8 is 1:1 +MD,< ASH T,2 > ;Nscale 2 is 1:1 + IDIV T,NSCALE + LSH TT,1 + MOVM TTT,TT + HLLE TT,TT ;IF NEG, -1 + TRO TT,1 ;+1 OR -1 + CAML TTT,NSCALE ;GREATER OR EQUAL TO HALF NSCALE? + ADD T,TT ;YES, FUDGE BY ONE IN PROPER DIRECTION + TRZ T,1 + POP P,TTT + POP P,TT + POPJ P, + +PERRET: + TLNN M,MACACT + OUTSTR[ASCIZ/??? +/] +LERRET: PUSHJ P,COMCLR ;IN CASE IN ALTER MODE + TLNE M,MACACT + POPJ P, ;MACRO USERS TAKE THEIR CHANCES + TLC M,DSKACT!DSKFLG + TLCE M,DSKACT!DSKFLG ;BOTH DISK INPUT AND ACTIVE? + POPJ P, ;NO + OUTSTR[ASCIZ/DUE TO ERROR, /] + JRST IBREAK + NODEC,< + +%UUOCON:MOVEM T,UUOSAV +DBG,< MOVEM G,UUOG > + LDB T,[POINT 9,UUO,8] + CAIL T,UUO2-UUO1 + MOVEI T,0 + MOVE T,(T)[ + UUO1: BADUUO + PTBYT + PTSTR +DBG,< AFETCH + AFETL + ASTORE + ASTORL + ACLEAR + ARETBL +>;DBG +NODBG,< BADUUO  BADUUO  BADUUO  BADUUO  BADUUO + BADUUO +>;NODBG +III,< LHYADD ;Leahy display - append + LHYIOT ; 0=clr, 7=chrsize pp, 6=ypos + LHYOUT ;output display list +>;III + UUO2: ] + EXCH T,UUOSAV + JRST @UUOSAV + +BADUUO: OUTSTR [ASCIZ/ILLEGAL UUO PERFORMED!! /] + HALT CPOPJ + +>;NODEC + +PTBYT: PUSH P,TTT + HRRZ TTT,UUO + XCT PUTCHR + POP P,TTT + POPJ P, + +PTSTR: PUSH P,TTT + PUSH P,T + HRRZ T,UUO + TLOA T,() +PTSTRL: XCT PUTCHR + ILDB TTT,T + JUMPN TTT,PTSTRL + POP P,T + POP P,TTT + POPJ P, + ;DEBUGING CHECKERS + +COMMENT  +FETCH, STORES, CLEARS, are turned into UUOs for +debug mode. + .FETCH AC,<"index AC">+ + + The element index points into ELEMxx tables to + define the displacment within the structure and + the fetch code. + + The fetch code specifies where element is in word, + and whether sign extension is desired. + + + +DBG,< +STORAGE(IMPURE) +UUOG: 0 +UUOTEM: 0 +UUOHLT: 0 +SUUO: 0 +STORAGE(PURE) + +AFETCH: MOVEI G,[HLRZ HLRE HRRZ HRRE MOVE] + JRST UUOCOM + +AFETL: MOVEI G,[HLLZ HLLE HRLZ HRLE 0] + JRST UUOCOM + +ASTORE: HRROI G,[HRLM HRLM HRRM HRRM MOVEM] + JRST UUOCOM + +ASTORL: HRROI G,[HLLM HLLM HLRM HLRM 0] + JRST UUOCOM + +ACLEAR: HRROI G,[HRRZS HRRZS HLLZS HLLZS SETZM] +UUOCOM: PUSHJ P,PUSHIT ;SAVE ALL THE AC'S + MOVEM A,UUOTEM + MOVE A,UUO + MOVEM A,SUUO + LDB A,[140600,,A] ;"SOURCE" AC FIELD + DPB A,[220400,,UUO] ; TO INDEX + EXCH A,UUOTEM + EXCH G,UUOG + HRRZ F,@UUOTEM ;F = STRUCTURE BLOCK + EXCH G,UUOG ;G = INST TYPE + LDB H,[1400,,UUO] ;THE ELEMENT INDEX + CAIL H,MAXELM + PUSHJ P,FUCKUP + HLRZ A,ELEMTB(H) ;WHERE + ADD G,A + LDB A,[331100,,(G)] ;THE OPCODE + DPB A,[331100,,UUO] + HRRZ A,ELEMTB(H) + HRRM A,UUO + HRRZ G,.JBREL ;LEGAL POINTER INTO LOW CORE? + SKIPLE F + CAMGE F,G + JRST UUAOK + HRRZ G,.JBHRL ;MAYBE POINTER IN HIGH SEG? + CAILE F,400000 ; (CAN'T BE 1ST WORD OF HI SEG EITHER) + CAML F,G + JRST [ TLO F,400000 ;FLAG THAT IT WAS ILLEGAL POINTER + JRST TROUB2] +UUAOK: MOVE A,-1(F) ;THE TYPE OF STRUC WE'RE ADDRESSING + CAME A,ELEMBL(H) ;RIGHT FOR THIS ELEM? + JRST TROUBL +UUOOK: PUSHJ P,POPIT + MOVE G,UUOG + XCT UUO + POPJ P, + +TROUBL: PUSHJ P,TRBPNT ;POINT <=> BPOINT INTERCHANGABLE + CAIA + JRST UUOOK +TROUB1: MOVE A,ELEMBL(H) ;Q'S CAN BE USED TO REFERENCE ALMOST ANYTHING + CAMN A,['QOMMON'] + JRST UUOOK +;Some fetches may be offset by RADDR(...), so check to +;see if the thing pointed to might be the right type (or null) + MOVSI T,-MAXRDR +TROUB4: CAME H,RADDRT(T) ;IS THIS AN ELEM WHICH COULD BE FUNNY? + AOBJN T,.-1 + JUMPGE T,TROUB2 + MOVE TT,F + ADD TT,RADRV2(T) ;OFFSET INTO OTHER STRUC + HRRZ TTT,RADRNM(T) + CAIL TTT,MAXELM + JRST [ CAME TT,TTT ;EXACTLY THAT POINTER? + JRST TROUB5 + JRST UUOOK] + MOVE TTT,ELEMBL(TTT) ;THE OTHER STRUC'S NAME + CAMN TTT,-1(TT) + JRST UUOOK +TROUB5: AOBJN T,TROUB4 +TROUB2: OUTSTR [ASCIZ / +Illegal /] + LDB A,[331100,,SUUO] + OUTSTR @FETNAM-<<.FETCH>-=27>(A) + OUTCHR ["("] + OUTSTR @ELEMNM(H) + OUTSTR [ASCIZ /) of a /] + SKIPG F ;LEGAL POINTER ADDRESS? + JRST [ OUTSTR [ASCIZ /?/] + JRST TROUB3] + MOVE TTT,-1(F) + JSP T,.SIXP +TROUB3: OUTSTR [ASCIZ /...Continue(Y,N,alt)/] + PUSHJ P,YORNTT + JRST ERRET + AOSA UUOHLT + SETZM UUOHLT + PUSHJ P,POPIT + MOVE G,UUOG + SKIPE UUOHLT + HALT .+1 + XCT UUO + POPJ P, + +TRBPNT: CAME A,['BPOINT'] ;WE CAN REFER TO BPOINTS AS POINTS + POPJ P, + MOVE A,ELEMBL(H) + CAMN A,['POINT '] + AOS (P) + POPJ P, + +FETNAM: FOR I IN (.FETCH,.FETL,.STORE,.STORL,.CLEAR) +< [ASCIZ /I/] +> + +DEFINE FOOS +< FOO(PNXT,PONPNT) + FOO(BPNXT,PONPNT) + FOO(TNXT,BODPNT) + FOO(BNXT,DBODPN) + FOO(TPNX,,TPIN) + FOO(BPLNK,,BLNK) + FOO(BPBIT,,PBIT) ;CAN REFER TO PBIT'S AS BPBITs + FOO(TCSTR,,TXVAL) ;2ND HALF OF PROP/TEXT BLOCKS CAN LOOK LIKE OFFSET + FOO(TCXY,,TXOFF) + FOO(TCX,,TXOX) + FOO(TCY,,TXOY) +MPC,< FOO(PNXT,PONPN2) + FOO(BPNXT,PONPN2) +> +MD,< FOO(GNXT,GETLST) + FOO(QNXT,,TLIN) + FOO(TPNX,PINS) + FOO(DPNXT,,DDNXT) + FOO(TXNXT,,BTXT) + FOO(TXNXT,BTEXT) + FOO(TLIB,,SLIB) ;SHORT FORM OF TYPE + FOO(TNAM,,SNAM) + FOO(TYP1,,SYP1) + FOO(TNXT,,SNXT) +>;MD +REPEAT 10,<-1 ;ROOM FOR SOME PATCHES +> +> + +DEFINE FOO $ (ELEM,POINTER,ELEM2) +< U.$ELEM +> +RADDRT: FOOS +MAXRDR__.-RADDRT + +DEFINE FOO $ (ELEM,POINTER,ELEM2) +< V.$ELEM-IFDIF<>0 +> +RADRV2: FOOS + +DEFINE FOO $ (ELEM,POINTER,ELEM2) +< IFDIF <>U.$ELEM2 +> +RADRNM: FOOS + +ARETBL: PUSHJ P,PUSHIT + MOVEM A,UUOTEM + LDB A,[270400,,UUO] + EXCH A,UUOTEM + HRRZ F,@UUOTEM ;POINTER TO BLOCK + HRRZ H,UUO ;BLOCK TYPE# + GETREL G + SKIPLE F + CAML F,G + JRST ARETB1 + MOVE A,-1(F) + CAMN A,SURNAM(H) ;RETURNING WHAT WE CLAIM? + JRST ARETOK + MOVSI T,-MAXSUR ;NO, BUT MAYBE SAME LENGTH BLK + CAME A,SURNAM(T) ; (THIS COVERS VARIOUS CASES THAT WEREN'T FIXED) + AOBJN T,.-1 + JUMPGE T,ARETB1 + HRRZ A,SURLEN(T) + CAMN A,SURLEN(H) + JRST ARETOK +ARETB1: OUTSTR [ASCIZ / +Illegal return of /] + SKIPLE + CAML F,G + SKIPA TTT,['?'] + MOVE TTT,-1(F) + JSP T,.SIXP + OUTSTR [ASCIZ / as /] + MOVE TTT,SURNAM(H) + JSP T,.SIXP + OUTSTR [ASCIZ /...Continue(Y,N,alt)/] + PUSHJ P,YORNTT + JRST ERRET + HALT .+1 +ARETOK: HRRZ A,SURLEN(H) + MOVEI F,-1(F) + EXCH F,BLKPNT+1(A) ;1 WD EXTRA FOR SUR'S NAME + HRRZM F,@BLKPNT+1(A) + PUSHJ P,POPIT + POPJ P, +>;DBG + ;TXTMAT, SIGMAT, SIGMAA +;TXTMAT - MATCH TEXT STRINGS (TEXSTR) A,B +TXTMAT: MOVE T,1(B) ;GET NEXT WORD OF TEXT + CAME T,1(A) ;COMPARE IT WITH OTHER STRING + POPJ P, ;DIFFERENT, NO MATCH + HRRZ A,(A) ;GO TO NEXT WORD + HRRZ B,(B) ;... + JUMPE A,[JUMPN B,CPOPJ ;IF A ENDS AND B DOESN'T, NO MATCH + AOS(P) ;IF BOTH END, MATCH + POPJ P,] + JUMPN B,TXTMAT ;IF NEITHER ENDS, LOOP + POPJ P, ;IF B ENDS AND A DOESN'T, NO MATCH + +;TXTCMP - ALPHA COMPARE FOR GREATER,LESS +;A,B - STRINGS IN TEXSTR FORMAT +;SKIPS A .GE. B + +TXTCMP: LDB T,[POINT 35,1(A),34] ;FLUSH LOW BIT, AND NO SIGN BIT FOR COMPARE + LDB TT,[POINT 35,1(B),34] + CAMGE T,TT ;A .GE. B? + POPJ P, ;NO + CAME T,TT + JRST CPOPJ1 ;A .GT. B + HRRZ A,(A) ;GO TO NEXT WORD + HRRZ B,(B) ;... + JUMPE A,[JUMPN B,CPOPJ ;IF A ENDS AND B DOESN'T, A IS .LT. + JRST CPOPJ1] ;IF BOTH END, A .EQ. B + JUMPN B,TXTCMP ;IF NEITHER ENDS, LOOP + JRST CPOPJ1 ;B ENDS AND A DOESN'T, A .GT. B + +IFN 0,< +NODEC,< +SIGMAT: ADD A,[POINT 7,1] + ADD B,[POINT 7,1] + LDB T,[POINT 14,(A),13] + CAIE T,"" + CAIN T,"" + SUB A,[160000,,0] + LDB T,[POINT 14,(B),13] + CAIE T,"" + CAIN T,"" + SUB B,[160000,,0] + PUSHJ P,GETITA + JRST CKENDB + CAIN T,"" + MOVEI T,"" + MOVE TT,T + PUSHJ P,GETITB + POPJ P, + CAIN T,"" + MOVEI T,"" + JRST SIGMA2 + +SIGMA1: PUSHJ P,GETITA + JRST [CKENDB:PUSHJ P,GETITB + AOS (P) ;ENDS ALSO, MATCH + POPJ P,] + MOVE TT,T + PUSHJ P,GETITB + POPJ P, ;A DIDN'T END, NO MATCH +SIGMA2: CAME T,TT + POPJ P, + JRST SIGMA1 +>;NODEC + +GETITA: TLNN A,760000 + JRST [ HRR A,-1(A) + TRNN A,-1 + POPJ P, + JRST .+1] + ILDB T,A + JUMPE T,GETITA +NODEC,< TRNE M,SPACES ;ARE SPACES SIGNIFICANT? + JRST SIGCHR ;YES + CAIE T,DBLARR + CAIN T," " + JRST GETITA + JRST SIGCHR + +GETITB: TLNN B,760000 + JRST [ HRR B,-1(B) + TRNN B,-1 + POPJ P, + JRST .+1] + ILDB T,B + JUMPE T,GETITB + TRNE M,SPACES + JRST SIGCHR + CAIE T," " + CAIN T,DBLARR + JRST GETITB +SIGCHR: +>;NODEC +DEC,< CAIN T,11 ;FLUSH TABS + JRST GETITA +>;DEC + CAIL T,"a" ;CONVERT LOWER CASE TO UPPER CASE + CAILE T,"z" + CAIA + SUBI T,40 + CAIE T,";" ;THIS IS THE COMMENT CHAR + AOS (P) + POPJ P, +>;IFN 0 +;COMPARE SIGNAMES FOR EQV +;A = BYTE POINTER TO FIRST WORD OF STRING (TEXSTR TYPE) +;B = POINTER TO ASCIZ +SIGMAT: SETZM VARLST ;NO VARS + PUSH P,D + PUSH P,C + PUSH P,B + PUSHJ P,PERMUT + POP P,TT + POP P,C + POP P,D + MOVEI T,CMPWRD + PUSHJ P,ALPHA + POPJ P, + POPJ P, + JRST CPOPJ1 + JRST CPOPJ1 + JRST CPOPJ2 + ;CHANGE ONE SIGNAL NAME TO ANOTHER PERVASIVELY +MD,< +SIGCHG: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/OLD SIGNAL NAME? +/] + PUSHJ P,TREADC + POPJ P, ;ALTMODE + POPJ P, ;NULL + PUSH P,B + MOVE A,B + ADD A,[POINT 7,1] + PUSHJ P,SIGMAA ;PERPARE OLD NAME FOR SEARCHING + POP P,B + PUSHJ P,PUTFS + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW SIGNAL NAME? +/] + PUSHJ P,TREADC + POPJ P, + POPJ P, + MOVEM B,DX1 + SKIPE E,PONPNT + PUSHJ P,ACLRP ;CLEAR ALL THE "FOUNDP" BITS + SETZM FIND + MOVSI C,17 + SKIPE A,PONPNT + PUSHJ P,CLRBTS ;CLEAR MARK BITS + SKIPE H,PONPNT + PUSHJ P,SIGCDO + MOVE T,FIND + MOVEM T,FNDNUM ;STORE FOR MACRO CALL AT ;R + JUMPE T,.+2 + SETOM FIND + SKIPN T,FNDNUM + JRST [ OUTSTR[ASCIZ/NO/] + JRST SIGCHF] + PUSHJ P,DECOUT +SIGCHF: OUTSTR[ASCIZ/ SIGNAL NAME/] + MOVE T,FNDNUM + CAIE T,1 + OUTCHR["S"] + OUTSTR[ASCIZ/ CHANGED. +/] + MOVE B,DX1 + JRST PUTFS + +;SIGCDO: CALLING SEQUENCE +; +; ADD A,[POINT 7,1] +; PUSHJ P,SIGMAA +; +; SKIPE H,PONPNT +; PUSHJ P,SIGCDO +; +; +SIGCDO: FETCHL(T,H,PBIT) + TLNE T,1 + JRST SIGCH2 ;ALREADY DONE + FETCH(G,H,PTXT) + JUMPE G,SIGCH2 + FETCH(A,G,TCSTR) + ADD A,[POINT 7,1] + MOVEI B,SIGTAB + PUSHJ P,SIGMAT + JRST SIGCH2 ;NO MATCH + JFCL ;EQUIVALENT IS OK + AOS FIND + SETBIT(FOUNDP!1,T,H,PBIT) + FETCH(A,G,TCSTR) + ADD A,[POINT 7,1] + PUSHJ P,PERME1 ;EXTRACT LEADING STUFF + MOVE T,POLAR ;GET OLD POLARITY + MOVEM T,OPOLAR ;AND SAVE HERE FOR PERMES + PUSH P,PUTCHR + PUSHJ P,SETTT7 + PUSH P,A + PUSHJ P,SIGCHX ;Copy leading stuff into new string + MOVE A,DX1 + ADD A,[POINT 7,1] + PUSHJ P,PERMES ;EXTRACT NEW SIGNAL NAME (POSSIBLY CHANGING POLARITY) + PUSHJ P,SIGCHX + FETCH(A,G,TCSTR) + ADD A,[POINT 7,1] + PUSHJ P,PERME2 ;NOW GET TRAILER + PUSHJ P,SIGCHX + FETCH(B,G,TCSTR) + FETCH(TT,B,TSSIZ) + PUSHJ P,PUTFS + POP P,A + STORE(TT,A,TSSIZ) + STORE(A,G,TCSTR) + POP P,PUTCHR + TRO MCHG + SKIPE ADDR(A,TSASC) + JRST SIGCH6 + MOVE A,H + PUSHJ P,PTKIL1 ;FLUSH NULL TEXT + JRST SIGCH2 + +SIGCH6: MOVE A,H + PUSHJ P,FIXEM +SIGCH2: HRRZ H,(H) + JUMPN H,SIGCDO + POPJ P, + +SIGCHX: SKIPA A,[POINT 7,ESGTAB] +SIGCHY: PUTBYT (C) + ILDB C,A + JUMPN C,SIGCHY + POPJ P, +>;MD + ;PUTFS +PUTFS: JUMPE B,CPOPJ + PUSH P,T +PUTFS1: HRRZ T,(B) ;GET LINK TO NEXT + FSTRET (B) + JUMPE T,POPTJ + HRRZ B,(T) + FSTRET (T) + JUMPN B,PUTFS1 ;IF NON-ZERO LINK, LOOP +POPTJ: POP P,T + POPJ P, + + ;READ NUMBER INTO T + +SREADN: MOVEI T,0 + PUSHJ P,GETLIN + CAIE C,"-" + JRST RNLOP1 + PUSHJ P,READN + MOVN T,T ;GIVE HIM NEGATIVE + POPJ P, + +;TO BE CALLED TO SCAN A SINGLE NUMBER WHICH SHOULD +;END WITH LF, CALL ONLY AT TOP LEVEL (WILL POP POPJ ON ERROR) +READNC: PUSHJ P,READN + CAIN C,12 + POPJ P, + POP P,(P) ;LOSE THE RETURN + JRST INNERR ;AND JUMP TO INPUT ERROR ROUTINE + +CREADN: SETZ T, + JRST RNLOP1 + +READN: MOVEI T, +RNLOP: PUSHJ P,GETLIN ;GET A CHR. +RNLOP1: PUSH P,[=10] + CAIE C,"'" + JRST RNLOP3 + MOVEI C,10 + MOVEM C,(P) +RNLOP2: PUSHJ P,GETLIN +RNLOP3: CAIL C,"0" ;IS IT A DIGIT? + CAILE C,"9" ;??? + JRST [ POP P,(P);NO + POPJ P,] + IMUL T,(P) ;YES, MULT BY PROPER AMOUNT + ADDI T,-60(C) ;ADD IN NEW THING + AOS NDIG ;COUNT A DIGIT + JRST RNLOP2 + + ;READ TEXT STRING, LOOK FOR SIZE SPEC +;RETURNS +;B = TEXT STRING +;T,TEXSIZ = TEXT SIZE (-1 IF NONE) +;TT,TEXLIN = #LINES,,MAX LINE LENGTH + +TXREAD: GETBLK(B,TEXSTR) + PUSH P,B ;SAVE POINTER TO BEGINNING OF STRING + CLEAR(B,TSASC) ;CLEAR BYTE WORD + ADD B,[POINT 7,1] + SETZB TT,TTT ;ZERO COUNTERS + MOVNI T,1 ;FLAG NO SIZE TYPED YET + PUSHJ P,GETLIN ;GET FIRST CHR. + ANDI C,177 + CAIE C,"\" ;\? + JRST BLOPP ;NO + PUSHJ P,READSZ ;GET SIZE STUFF INTO T + CAIA + JRST BLOP + MOVNI T,1 ;ERROR, FLAG AS IF NONE TYPED + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ILLEGAL TEXT SIZE, WILL MAKE BELIEVE NONE WAS TYPED. +/] +BLOP: PUSHJ P,GETLIN ;GET NEXT CHR OF NAME + ANDI C,177 +BLOPP: CAIE C,ALTMOD ;QUIT ON ALTMODE ALSO + CAIN C,12 ;DONE (LINE FEED) + JRST BDON + CAIE C,DBLARR ;END OF LINE? + AOJA TTT,BLOPCR ;NO, COUNT CHAR + ADD TT,[1,,0] ;COUNT ANOTHER LINE + CAILE TTT,(TT) ;THIS LINE LONGEST SO FAR? + HRR TT,TTT ;YES + SETZ TTT, ;RESET LINE LENGTH COUNT +BLOPCR: TLNE B,760000 ;END OF WORD? + JRST BPNT1 + GETBLK(D,TEXSTR) + CLEAR(D,TSASC) + HRRZM D,-1(B) + HRR B,D +BPNT1: IDPB C,B + JRST BLOP + +BDON: CAILE TTT,(TT) ;LAST LINE LONGEST? + HRR TT,TTT ;YES + MOVEM T,TEXSIZ + MOVEM TT,TEXLIN + SETZM -1(B) ;CLEAR LAST POINTER + POP P,B ;GET POINTER TO FRONT OF STRING + POPJ P, + + ;READSZ - GET INITIAL SIZE SPEC ON TEXT INPUT + +READSZ: PUSHJ P,GETLIN ;YES, GET SIZE + ANDI C,177 + SETZ T, ;ASSUME HORIZONTAL + CAIE C,"V" ;IS HE ASKING FOR VERTICAL? + JRST NOVERT ;NO + PUSHJ P,GETLIN + ANDI C,177 + MOVEI T,400000 ;MARK AS VERTICAL +NOVERT: SUBI C,60 ;NORMALIZE NUMBER + JUMPL C,CPOPJ ;TOO SMALL? + IOR T,C ;MAKE SIZE + CAIG C,CSIZES ;OR TOO BIG? + AOS (P) + POPJ P, ;ERROR RETURN + + ;READ TEXT +;B = POINTER TO TEXT + +;TREADU,TREADC +;RETURN +; 1 $ TYPED +; 2 NULL INPUT +; 3 OK + +;TREADU,TREADV CONVERT TO UPPER CASE + +TREADU: PUSHJ P,TREADV + CAIA +TREADC: PUSHJ P,TREAD + CAIN C,ALTMOD ;END WITH ALTMODE? + JRST PUTFS ;YES, GIVE BACK STRING AND DIRECT RETURN + AOS (P) ;AT LEAST ONE SKIP + SKIPE 1(B) ;NULL? + AOSA (P) ;NO, ANOTHER SKIP + JRST PUTFS ;YES, GIVE IT BACK + POPJ P, + +TREADV: SETOM LOW2UP + CAIA +TREAD: SETZM LOW2UP + GETBLK(B,TEXSTR) + CLEAR(B,TSASC) + PUSH P,B + ADD B,[POINT 7,1] +TREADA: PUSHJ P,GETLIN + CAIE C,ALTMOD + CAIN C,12 + JRST TREDON + TLNE B,760000 + JRST TREADG + GETBLK(T,TEXSTR) + CLEAR(T,TSASC) + HRRZM T,-1(B) + HRR B,T +TREADG: SKIPN LOW2UP + JRST TREADL + CAIL C,"A"+40 + CAILE C,"Z"+40 + CAIA + SUBI C,40 +TREADL: IDPB C,B + JRST TREADA + +TREDON: SETZM -1(B) ;CLEAR LAST POINTER + POP P,B ;GET POINTER TO FRONT OF STRING + POPJ P, + +SCARF: CAIN C,12 + AOSA (P) + CAIN C,ALTMOD + POPJ P, + PUSHJ P,GETLIN + JRST SCARF + +INNERR: PUSHJ P,SCARF + JRST LERRET + OUTSTR[ASCIZ/INPUT ERROR! +/] + JRST LERRET + ;LOOKUP A SIGNAL IN WIRLST, AND FLASH IT! +XFLASH: SKIPN B,BLPNTR + POPJ P, + PUSHJ P,PUTFS + SETZM BLPNTR +IFN UMLSW!LAYSW,< +MPC,< SETZM UPINS > +>;IFN UMLSW!LAYSW + TRO MCHG + POPJ P, + +NOUML,< +LOKSIG: JRST PERRET +>;NOUML + +UML,< +LOOKN: SKIPN A,WIRLST + JRST NOWIRL + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/WIRE NUMBER FROM WFAIL.DAT FILE?/] + PUSHJ P,READNC + MOVE C,A + SETZM DX1 +LOOKN0: AOS DX1 + SOJLE T,LOOKN1 + HRRZ C,(C) + JUMPN C,LOOKN0 + OUTSTR[ASCIZ/NO SUCH WIRE! +/] + POPJ P, + +LOKSIG: SKIPN WIRLST + JRST [NOWIRL: OUTSTR[ASCIZ/NO WIRES IN WIRLST! +/] + POPJ P,] + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/SIGNAL NAME TO LOOKUP?/] + PUSHJ P,TREADC + POPJ P, ;ALTMODE + POPJ P, ;NULL + PUSH P,B ;SAVE POINTER TO ORIG STRING + MOVE A,B + ADD A,[POINT 7,1] + PUSHJ P,SIGMAA ;MAKE COMPARE STRING + POP P,B + PUSHJ P,PUTFS ;GIVE BACK TYPED IN VERSION + PUSHJ P,LOOKIT ;LOOK IT UP + JRST LOKSGN ;NONE +LOOKN1: HRRZ B,1(C) ;GET WIRE POINTER + PUSHJ P,LSTSGO ;PRINT ALL THE NAMES + PUSH P,C + PUSHJ P,LINKST + POP P,C + HRRZ C,1(C) ;POINTER TO LIST OF PINS, ETC +POKSG1: +MPC,< HRRZ A,1(C) ;WILD CON STUFF IS HERE + ADDM A,UPINS +>;MPC + HLRZ A,(C) ;PIN POINTER + JUMPE A,POKSG2 + PUSH P,C + PUSHJ P,LINKIT + POP P,C +POKSG2: HRRZ C,(C) + JUMPN C,POKSG1 + PUSHJ P,LINKMK ;NOW MARK BAD GUYS + TRO MCHG ;GET IT ON + TLNN M,LCENTER + POPJ P, + JRST LCENMAK ;CENTER IT! + +LOOKIT: MOVE C,WIRLST ;LOOK DOWN THE LIST + SETZM DX1 +LOKSG3: HRRZ D,1(C) + AOS DX1 +LOKSG1: HLRZ A,1(D) + JUMPE A,LOKSG2 + ADD A,[POINT 7,1] + MOVEI B,SIGTAB + PUSHJ P,SIGMAT + JRST LOKSG2 ;NO MATCH + JFCL ;EQUIVALENT IS CLOSE ENOUGH + AOS (P) + POPJ P, + +LOKSG2: HRRZ D,(D) + JUMPN D,LOKSG1 + HRRZ C,(C) + JUMPN C,LOKSG3 + POPJ P, + +LOKSGN: OUTSTR[ASCIZ/NOT FOUND! +/] + POPJ P, + +LSTSIG: SKIPN A,WIRLST + JRST NOWIRL + SETZM DX1 +LSTSG1: HRRZ B,1(A) + AOS DX1 + PUSHJ P,LSTSGO + HRRZ A,(A) + JUMPN A,LSTSG1 + POPJ P, + +;CALL (LSTSGO) WITH SINGLE WIRE POINTER IN B, AND DX1 = SIGNAL # + +LSTSGO: MOVE T,DX1 + PUSHJ P,DECOUT +LSTSG6: HLRZ T,1(B) + JUMPE T,LSTSG3 + OUTCHR[11] + PUSHJ P,OUTTXT +LSTSG3: HRRZ B,(B) + JUMPN B,LSTSG6 +MPC,< HRRZ T,1(A) + HRRZ T,1(T) + JUMPE T,LSTSG4 + OUTCHR[11] + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ "WILD"/] +LSTSG4: +>;MPC + OUTSTR[ASCIZ/ +/] + POPJ P, + +MD,< +SHWERR: SOSL TT,%LAST ;COUNT DOWN AND PICKUP LAST GEN NAME + SKIPN C,WIRLST ;ANY WIRES? + JRST PERRET ;NO MORE + SOJL TT,LOOKN1 + HRRZ C,(C) + JUMPN C,.-2 + JRST SHWERR +>;MD +>;UML + ;CURSOR MOVING + DEFINE MOV $ (SHFT,MOVT,ADDT) +< MOVSI TT,1 + LSH TT,SHFT(A) +MPC,< IMUL TT,STPSIZ> + MOV$MOVT T,CURSE + ADDT T,TT + MOV$MOVT$M T,T + JRST SETPOS +> + +MOVUP1: MOV (1,S,ADD) +MOVDN1: MOV (1,S,SUB) +MOVUP2: MOV (5,S,ADD) +MOVDN2: MOV (5,S,SUB) + +MOVLF1: +MPC,< TRNE M,FLIP + JRST MOVRT3 +>;MPC +MOVLF3: MOV (1,E,SUB) +MOVRT1: +MPC,< TRNE M,FLIP + JRST MOVLF3 +>;MPC +MOVRT3: MOV (1,E,ADD) + +MOVLF2: +MPC,< TRNE M,FLIP + JRST MOVRT4 +>;MPC +MOVLF4: MOV (5,E,SUB) + +MOVRT2: +MPC,< TRNE M,FLIP + JRST MOVLF4 +>;MPC +MOVRT4: MOV (5,E,ADD) + ;SET AND CLEAR FLAGS +STBOOP: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NUMBER OF SECONDS BEFORE BOOP?/] + PUSHJ P,READN + CAIE C,12 + JRST INNERR + MOVEM T,BOOPCN + TIMER T, + MOVEM T,BOOPLR + POPJ P, + +CLBOOP: SETZM BOOPCN + POPJ P, + +MD,< +;SOCKET - FORCE PIN'S ON DRAWINGS TO BE ACTUAL SOCKET PINS, NOT BODY + +STSOC: SETOM FORSOC + tro mchg + POPJ P, + +CLRSOC: SETZM FORSOC + tro mchg + POPJ P, +>;MD + +DEC,< +STTIME: +GT,< MOVE T,NBYTES + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ BYTES TRANSMITTED TO GT40 (/] + SKIPN OPTFLG + OUTSTR[ASCIZ/NON-/] + OUTSTR[ASCIZ/OPTIMIZED) +/] +>;GT + MOVE A,RTIME ;SAVE LAST RUNTIME + MOVE B,QTIME ;AND LAST RUN QUEUE TIME + MOVE C,DTIME ;AND LAST REAL TIME + PUSHJ P,CLTIME ;UPDATE CELLS + OUTSTR[ASCIZ/RTIME = /] + SUB A,RTIME + MOVN T,A + PUSHJ P,SECPNT ;PRINT SECONDS WITH 3 DECIMAL POINTS + OUTSTR[ASCIZ/, QTIME = /] + SUB B,QTIME + CAMLE B,A + MOVE B,A ;MAKE SURE QTIME.GE.RTIME (NEG) + MOVN T,B + PUSHJ P,SECPNT + OUTSTR[ASCIZ/, /] + IMULI A,=100 + IDIV A,B + MOVE T,A ;THIS IS PERCENTAGE SERVICE + PUSHJ P,DECOUT + OUTSTR[ASCIZ/% +REALTIME = /] + SUB C,DTIME + MUL C,[-=24*=60*=60*=60] ;MAKE IT POSITIVE AND TICS + LSHC C,=18 + MOVE T,C + PUSHJ P,SECPNT + OUTSTR[ASCIZ/ +/] + POPJ P, + +CLTIME: MOVE T,[-1,,4] + GETTAB T, ;GET RUNTIME + SETZ T, + MOVEM T,RTIME + MOVE T,[-1,,53] ;GET RUN QUEUE TIME + GETTAB T, + SETZ T, + MOVEM T,QTIME + MOVE T,[53,,11] + GETTAB T, ;GET UNIVERSAL DAY TIME + SETZ T, + MOVEM T,DTIME +GT,< SETZM NBYTES > + POPJ P, + +SECPNT: IDIVI T,=60 + HRLM TT,(P) + PUSHJ P,DECOUT + OUTCHR["."] + HLRZ T,(P) + IMULI T,=10 + IDIVI T,=6 ;MAKE IT HUNDREDTHS + CAIGE T,=10 + OUTCHR["0"] + JRST DECOUT +>;DEC + +STINIT: TLZ NOINIT + POPJ P, + +CLINIT: TLO NOINIT + POPJ P, + +EXACTS: TROA M,SEXACT +EXACTC: TRZ M,SEXACT + POPJ P, + +SETLC: SETOM LCFLAG + POPJ P, + +CLRLC: SETZM LCFLAG + POPJ P, + +SIDENT: TLON M,%IDENT + TRO MCHG!NEEDCL + POPJ P, + +CIDENT: TLZE M,%IDENT + TRO MCHG!NEEDCL + POPJ P, + +STLPPN: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/LIBRARY PPN?/] +NOCMU,< +NOITS,< PUSHJ P,GETPPN + JRST INNERR + CAIN C,12 + JRST [ HRRZM T,LIBPPN + SETZ T, + DSKPPN T, + HLLM T,LIBPPN + POPJ P,] + CAIE C,"," + JRST INNERR + MOVE B,T + PUSHJ P,GETPPN + JRST INNERR + CAIE C,12 + JRST INNERR + HRLZM B,LIBPPN + HRRM T,LIBPPN +>;NOITS +>;NOCMU +ITS,< PUSHJ P,GETNAM + JUMPE T,INNERR + CAIE C,12 + JRST INNERR + MOVEM T,LIBPPN +>;ITS +CMU,< SETZM PPNBUF ;CLEAR OUT A BUFFER FOR THE PPN + SETZM PPNBUF+1 + SETZM PPNBUF+2 + MOVE B,[POINT 7,PPNBUF] + MOVEI T,=13 ;13 CHARACTERS AT MOST! +CMUPP7: PUSHJ P,GETLIN ;GET A CHAR + JRST CMUPP9 + CAIE C,15 ;IGNORE CR + CAIN C,40 ;AND SPACE + JRST CMUPP7 + CAIN C,12 ;LF + JRST CMUPP9 ;YES, THAT'S ALL FOLKS. + CAIE C,"[" ;IGNORE [ + CAIN C,"]" ;AND ] + JRST CMUPP7 + CAIL C,"a" ;CONVERT LOWER CASE TO UPPER CASE + CAILE C,"z" + JRST .+2 + SUBI C,40 ;CONVERT IT +CMUPP8: IDPB C,B + SOJGE T,CMUPP7 ;AND GO GET ANOTHER CHAR UNLES WE HAVE 13+1 + JRST INNERR ;FUNNY, WE DIDN'T GET THERE IN 13 CHARACTERS! +CMUPP9: MOVE T,[XWD B,PPNBUF] + CMUDEC T, ;CONVERT THE PPN TO DEC FORMAT + JRST INNERR ;WHOOPS, BAD PPN + MOVEM A,LIBPPN +>;CMU + POPJ P, + +CLLPPN: + MOVE T,[DATPPN] + MOVEM T,LIBPPN + POPJ P, + +SETSPC: TRO M,SPACES + POPJ P, + +CLRSPC: TRZ M,SPACES + POPJ P, + +SETCNT: TLO M,LCENTER + JRST LCENMAK + +CLRCNT: TLZ M,LCENTER + POPJ P, + +SETLCA: TLON LOCATE + TRO NEEDCL + POPJ P, + +CLRLCA: TLZE LOCATE + TRO NEEDCL + POPJ P, + +NEWID: SETZM BID + SETOM OLDBID + SETZM PID + SETOM OLDPID + JRST REEID ;RE-ASSIGN ID FROM START! + +LMACRO: SKIPN A,MDPNT ;GET DEFINED MACRO LIST POINTER + POPJ P, + TVOFF + OUTSTR[ASCIZ/ +/] +LMAC1: HRRZ T,1(A) + PUSHJ P,OUTTXT + HLRZ T,(A) + TRNE T,MSAVE ;BEING SAVED? + OUTSTR[ASCIZ/ */];YES + OUTSTR[ASCIZ/ +/] + HRRZ A,(A) + JUMPN A,LMAC1 + TVON + POPJ P, + +GETDDT: SKIPN T,.JBDDT + JRST [ OUTSTR[ASCIZ/NO DDT..... +/] + POPJ P,] + MOVE TT,[10000,,CPOPJ] + MOVEM TT,.JBOPC + JRST (T) + +STBLCS: TLON M,BLOCS + TRO MCHG + POPJ P, + +CLBLCS: TLZE M,BLOCS + TRO MCHG + POPJ P, + +STCLCS: TLON M,CLOCS + TRO MCHG + POPJ P, + +CLCLCS: TLZE M,CLOCS + TRO MCHG + POPJ P, + +SETPNS: TLON M,PLOCS + TRO MCHG + POPJ P, + +CLRPNS: TLZE M,PLOCS + TRO MCHG + POPJ P, + +STLINS: TRZE M,NLINES + TRO MCHG + POPJ P, + +CLLINS: TRON M,NLINES + TRO MCHG + POPJ P, +MPC,< +STDIPS: TRZE M,NDIPS + TRO MCHG + POPJ P, + +CLDIPS: TRON M,NDIPS + TRO MCHG + POPJ P, + +STFLIP: TRC M,FLIP ;INVERT X + TRO MCHG + MOVE T,CURSE + JRST SETPOS ;GET CURSOR TO RIGHT PLACE! + +STCOMP: TLNE SID,FRONT + POPJ P, +SWSID: TRZ INLIN!INMOV + SWITCH + TRO MCHG!NEEDCL + POPJ P, + +STSOLD: TLNN SID,FRONT + POPJ P, + JRST SWSID + +STFEED: TRZE M,XFEED + TRO MCHG + POPJ P, + +CLFEED: TRON M,XFEED + TRO MCHG + POPJ P, + +STFING: TRZE M,XFINGER + TRO MCHG + POPJ P, + +CLFING: TRON M,XFINGER + TRO MCHG + POPJ P, +>;MPC +MD,< +SETOUT: SETOM OUTSIDE + POPJ P, + +CLROUT: SETZM OUTSIDE + POPJ P, + +SETCBX: TRZN M,NOCBOX + POPJ P, + TLNE M,CLOCS + TRO MCHG + POPJ P, + +CLRCBX: TROE M,NOCBOX + POPJ P, + TLNE M,CLOCS + TRO MCHG + POPJ P, + +SETIDS: TLON M,PINIDS + TRO MCHG + POPJ P, + +CLRIDS: TLZE M,PINIDS + TRO MCHG + POPJ P, + +SETRID: TLON M,RPINID + TRO MCHG + POPJ P, + +CLRRID: TLZE M,RPINID + TRO MCHG + POPJ P, + +STUNHI: TLON M,UNHIDE + TRO MCHG + POPJ P, + +CLUNHI: TLZE M,UNHIDE + TRO MCHG + POPJ P, + +STPTXT: TRZE M,NPTEXT + TRO MCHG + POPJ P, + +CLPTXT: TRON M,NPTEXT + TRO MCHG + POPJ P, + +STBTXT: TRZE M,NBTEXT + TRO MCHG + POPJ P, + +CLBTXT: TRON M,NBTEXT + TRO MCHG + POPJ P, + +STMLIB: SETOM MODLIB + POPJ P, + +CLMLIB: SETZM MODLIB + POPJ P, + +UREST: SKIPN A,PONPNT + POPJ P, +UREST1: MOVE T,ADDR(A,PBIT) + TLNE T,CPIN + TRNN T,-1 ;ANY BACKUP PIN NAME? + JRST UREST2 + FETCH(C,A,PLOC) + MOVE TT,(C) + HRRM T,(C) ;BACKUP PIN NAME  PIN LOC + STORE(TT,A,PIN) ;EXCHANGE PIN NAMES + TRO MCHG + PUSHJ P,OFFCON ;FIX CON OFFSET +UREST2: HRRZ A,(A) + JUMPN A,UREST1 + POPJ P, +>;MD + +SETTXT: TRZE M,MD,NPTEXT + TRO MCHG + TLON M,CLOCS + TRO MCHG + POPJ P, + +CLRTXT: TRO M,MD,NPTEXT + TLZ M,CLOCS + TRO MCHG + POPJ P, + +SETWIN: TLZN M,XWINDOW + POPJ P, + JRST DOWIN + +CLRWIN: TLOE M,XWINDOW + POPJ P, +DOWIN: MOVE T,CURSE + JRST SETPOS + +SETLWN: TLON M,LWINDOW + TRO MCHG + POPJ P, + +CLRLWN: TLZE M,LWINDOW + TRO MCHG + POPJ P, + +SETDPY: +NOCMU,< SKIPE ISDPY > +CMU,< SKIPLE DONTDPY > + POPJ P, + SETZM DONTDPY +DLX,< SETOM DLXFLG > ;IF USER DOESN'T SPECIFY, TRY DL10 + JRST DTRY + +CLRDPY: +NOCMU,< SKIPE DONTDPY > +CMU,< SKIPGE DONTDPY > + POPJ P, + SETOM DONTDPY + SKIPE ISDPY + PUSHJ P,DPYREL + JRST DSPSET + +NODEC,< +DPYREL: DPYCLR +CMU,< RELEASE ATYO, > + SETZM ISDPY + POPJ P, +>;NODEC + +GT,< +SETOPT: SKIPE OPTFLG + SKIPN ISDPY + CAIA + POPJ P, +DLX,< SKIPN ISDPY ;IF NOT CURRENTLY DISPLAY, + SETOM DLXFLG ;THEN TRY DL10 FIRST +>;DLX + PUSHJ P,CLRDPY ;LET GO OF DISPLAY + SETZM DONTDPY + SETOM OPTFLG ;THEN TELL IT TO OPTIMIZE + JRST DTRY + +CLROPT: SKIPN OPTFLG + SKIPN ISDPY + CAIA + POPJ P, +DLX,< SKIPN ISDPY ;IF NOT CURRENTLY DISPLAY, + SETOM DLXFLG ;THEN TRY DL10 FIRST +>;DLX + PUSHJ P,CLRDPY + SETZM DONTDPY + SETZM OPTFLG + JRST DTRY ;TRY DISPLAY IN CURRENT MODE + +DLX,< +SETDLX: SKIPE DLXFLG + SKIPN ISDPY + CAIA + POPJ P, + PUSHJ P,CLRDPY + SETZM DONTDPY + SETOM DLXFLG + JRST DTRY + +CLRDLX: SKIPN DLXFLG + SKIPN ISDPY + CAIA + POPJ P, + PUSHJ P,CLRDPY + SETZM DONTDPY + SETZM DLXFLG + JRST DTRY +>;DLX +>;GT + ;TITLES, MUNGER, INNER, DIAMONDS +;ROUTINE TO PUT FILENAME INTO MACRO +CLRSIG: PUSHJ P,SETTT + SKIPN TT,(B) + JRST ITSTUF + PUSHJ P,STFSIX + PUTBYT "." + HLLZ TT,1(B) + PUSHJ P,STFSIX + PUTBYT "[" + HLLZ TT,3(B) + PUSHJ P,STFPPN + PUTBYT "," + HRLZ TT,3(B) + PUSHJ P,STFPPN + PUTBYT "]" + JRST ITSTUF + +STFPPN: +IFN IIISW!DECSW,< HLRZ T,TT +STFPP1: IDIVI T,10 + HRLM TT,(P) + JUMPE T,.+2 + PUSHJ P,STFPP1 + HLRZ T,(P) + PUTBYT 60(T) + POPJ P, +>;IFN IIISW!DECSW +STFSIX: JUMPE TT,CPOPJ + SETZ T, + LSHC T,6 + PUTBYT 40(T) + JRST STFSIX + +MD,< +CTITLE: MOVE B,TIT1 + PUSHJ P,STUFT1 + PUTBYT 12 + MOVE B,TIT2 + PUSHJ P,STUFT2 + JRST ITSTUF + +STITLE: TLNE M,DSKACT!MACACT + JRST STITL1 + SKIPE T,TIT1 + PUSHJ P,OUTTCR + SKIPE T,TIT2 + PUSHJ P,OUTTCR + OUTSTR[ASCIZ/NEW TITLE LINE 1?/] +STITL1: PUSHJ P,TREADC + POPJ P, ;ALTMODE + SETZ B, ;NULL + SKIPE T,B + MOVS T,1(B) + CAIE T,() ;DON'T CHANGE IF HE TYPE THERE EXISTS + EXCH B,TIT1 + JUMPE B,.+2 + PUSHJ P,PUTFS + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW TITLE LINE 2?/] + PUSHJ P,TREADC + JRST TITCHK ;ALTMODE + SETZ B, ;NULL + SKIPE T,B + MOVS T,1(B) + CAIE T,() + EXCH B,TIT2 + JUMPE B,.+2 + PUSHJ P,PUTFS +TITCHK: +NOITS,< MOVEI T,=31 > ;MAX LENGTH FOR BOTH STRINGS +ITS,< MOVEI T,=50 > ;APPROX 50 CHARS TOTAL ON XGP + MOVE B,TIT1 + PUSHJ P,LENCHK + MOVE B,TIT2 ;REDUCED COUNT STILL IN T + PUSHJ P,LENCHK + POPJ P, + +CSITE: MOVE B,SITE1 + PUSHJ P,STUFT1 + PUTBYT 12 + MOVE B,SITE2 + PUSHJ P,STUFT2 + JRST ITSTUF + +SITE: TLNE M,DSKACT!MACACT + JRST SITE0 + SKIPE T,SITE1 + PUSHJ P,OUTTCR + SKIPE T,SITE2 + PUSHJ P,OUTTCR + OUTSTR[ASCIZ/NEW SITE LINE 1?/] +SITE0: PUSHJ P,TREADC + POPJ P, ;ALTMODE + SETZ B, ;NULL + SKIPE T,B + MOVS T,1(B) + CAIE T,() ;DON'T CHANGE IF HE TYPE THERE EXISTS + EXCH B,SITE1 + JUMPE B,.+2 + PUSHJ P,PUTFS + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NEW SITE LINE 2?/] + PUSHJ P,TREADC + POPJ P, ;ALTMODE + SETZ B, ;NULL + SKIPE T,B + MOVS T,1(B) + CAIE T,() + EXCH B,SITE2 + JUMPN B,PUTFS + POPJ P, + +DEFINE TITLIN $ (LABEL,CLABEL,TPTR,PROMPT,MAXLEN,CHANGE) +< +CLABEL: MOVE B,TPTR + JRST STUFT0 + +LABEL: TLNE M,DSKACT!MACACT + JRST .$LABEL + SKIPE T,TPTR + PUSHJ P,OUTTCR + OUTSTR[ASCIZ/NEW PROMPT?/] +.$LABEL: + PUSHJ P,TREADC + POPJ P, ;ALTMODE + SETZ B, ;NULL +IFDIF<>< + MOVEI T,MAXLEN + PUSHJ P,LENCHK ;CHECK LENGTH AND PRINT WARNING MESSAGE +> + SKIPE T,B + MOVS T,1(B) + CAIE T,() ;THIS SHOULD ALWAYS WORK + EXCH B,TPTR +IFIDN + JUMPN B,PUTFS + POPJ P, +> + +LENCHK: JUMPE B,CPOPJ + PUSH P,T + MOVE T,B + ADD T,[POINT 7,1] +LENCK1: TLNE T,760000 + JRST LENCK2 + HRR T,-1(T) + TRNN T,-1 + JRST LENCK3 ;END BEFORE COUNT OUT +LENCK2: ILDB TT,T + JUMPE TT,LENCK1 + SOS (P) ;COUNT DOWN BY ONE + JRST LENCK1 ;LOOP IF NOT COUNTED OUT + +LENCK3: SKIPL (P) ;OVERFLOWED? + JRST LENCK4 + OUTSTR[ASCIZ/STRING /] + MOVN T,(P) + PUSHJ P,DECOUT + OUTSTR[ASCIZ/. CHARS TOO LONG, WILL STORE STRING ANYWAY. +/] +LENCK4: POP P,T ;RETURN REDUCED COUNT + POPJ P, + +TITLIN(AUTHOR,CAUTHOR,TAUTHOR,AUTHOR) + +TITLIN(REVISE,CREVISE,TREV,REVISION,4,C) + +TITLIN(MODULE,CMODULE,TMODULE,MODULE NAME,5,C) + +TITLIN(VARIABLE,CVARIABLE,TVARIABLE,VARIABLE,2,C) + +TITLIN(PREFIX,CPREFIX,TPREFIX,DRAWING PREFIX,4,C) + +CLRNUM: MOVE B,TMODULE + PUSHJ P,STUFT1 + PUTBYT 12 + PUSHJ P,STUFT2 + PUTBYT 12 + PUSHJ P,STUFT2 + JRST ITSTUF + +SETNUM: PUSHJ P,MODULE + PUSHJ P,VARIABLE + JRST PREFIX + +TITLIN(PROJECT,CPROJECT,TPROJ,PROJECT NAME,10) + +CPAGEOF: + MOVE B,TPAGE + PUSHJ P,STUFT1 + PUTBYT 12 + MOVE B,TOF + PUSHJ P,STUFT2 + JRST ITSTUF + +PAGEOF: TLNE M,DSKACT!MACACT + JRST PAGOF0 + SKIPE T,TPAGE + PUSHJ P,OUTTCR + SKIPE T,TOF + PUSHJ P,OUTTCR + OUTSTR[ASCIZ/SHEET?/] +PAGOF0: PUSHJ P,TREADC + POPJ P, ;ALTMODE + SETZ B, ;NULL + SKIPE T,B + MOVS T,1(B) + CAIE T,() ;DON'T CHANGE IF HE TYPE THERE EXISTS + EXCH B,TPAGE + JUMPE B,.+2 + PUSHJ P,PUTFS + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/OF?/] + PUSHJ P,TREADC + POPJ P, ;ALTMODE + SETZ B, ;NULL + SKIPE T,B + MOVS T,1(B) + CAIE T,() + EXCH B,TOF + JUMPN B,PUTFS + POPJ P, + +TITLIN(DCODE,CDCODE,TDCODE,DRAWING CODE,2) + +DEC,< +TITLIN(SETNXT,CLRNXT,TNXTHI,NEXT HIGHER ASSEMBLY NUMBER,=20) + +CLRDRN: MOVEI B,DRNNAM + JRST CLRSIG + +CLRENG: MOVEI B,ENGNAM + JRST CLRSIG + +SETDRN: MOVEI A,DRNNAM + MOVEI T,[ASCIZ/DRN./] + JRST SETSIG + +SETENG: MOVEI A,ENGNAM + MOVEI T,[ASCIZ/ENG./] +SETSIG: TLNE M,DSKACT!MACACT + JRST SETSG1 + PUSH P,T + SKIPE (A) + JSR FPRINT + OUTSTR[ASCIZ/ +NEW /] + POP P,T + OUTSTR(T) + OUTSTR[ASCIZ/ SIGNATURE /] +SETSG1: PUSH P,A + MOVSI T,EXTSIG + PUSHJ P,SETNAM + JRST [ POP P,A + SETZM (A) + POPJ P,] + INIT DAT,17 + 'DSK ' + 0 + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + POP P,A + POPJ P,] + MOVEI A,FILNAM + TLNE M,DSKACT!MACACT + JRST SETSG2 + OUTSTR[ASCIZ/CHECKING EXISTENCE OF /] + JSR FPRINT +SETSG2: SKIPN T,FILPPN + MOVE T,LIBPPN + MOVEM T,FILPPN + LOOKUP DAT,FILNAM + JRST [ POP P,A + JRST LOOKRR] +DEC,< JSR DAT,LOOKCK > +NODEC,< MOVEM T,FILPPN > + OUTSTR[ASCIZ/ +/] + RELEASE DAT, + POP P,A + MOVE T,FILNAM + MOVEM T,(A) + MOVE T,FILEXT + HLLZM T,1(A) + MOVE T,FILPPN + MOVEM T,3(A) + DATE T, ;USE CURRENT DATE + HRRM T,1(A) + POPJ P, +>;DEC + +STUFT0: PUSHJ P,STUFT1 + JRST ITSTUF + +STUFT1: PUSHJ P,SETTT +STUFT2: JUMPE B,CPOPJ + MOVEI T,1(B) + HRLI T,() +STUFT3: PUSHJ P,GETTT + POPJ P, + PUTBYT (C) + JRST STUFT3 + +LTITLE: TVOFF + SKIPE T,SITE1 + PUSHJ P,[OUTSTR[ASCIZ/ +SITE LINE 1 /] + JRST OUTTXT] + SKIPE T,SITE2 + PUSHJ P,[OUTSTR[ASCIZ/ +SITE LINE 2 /] + JRST OUTTXT] + SKIPE T,TAUTHOR + PUSHJ P,[OUTSTR[ASCIZ/ +AUTHOR /] + JRST OUTTXT] + SKIPE T,TIT1 + PUSHJ P,[OUTSTR[ASCIZ/ +TITLE LINE 1 /] + JRST OUTTXT] + SKIPE T,TIT2 + PUSHJ P,[OUTSTR[ASCIZ/ +TITLE LINE 2 /] + JRST OUTTXT] + SKIPN TVARIABLE + SKIPE TPREFIX + JRST DODNUM + SKIPN TMODULE + JRST NODNUM +DODNUM: OUTSTR[ASCIZ/ +DRAWING NUMBER: /] + SKIPE T,TMODULE + PUSHJ P,OUTTXT + SKIPE T,TVARIABLE + PUSHJ P,[OUTCHR["-"] + JRST OUTTXT] + SKIPE T,TPREFIX + PUSHJ P,[OUTCHR["-"] + JRST OUTTXT] +NODNUM: SKIPE T,TREV + PUSHJ P,[OUTSTR[ASCIZ/ +REVISION /] + JRST OUTTXT] + SKIPE T,TPROJ + PUSHJ P,[OUTSTR[ASCIZ/ +PROJECT /] + JRST OUTTXT] + SKIPE T,TDCODE + PUSHJ P,[OUTSTR[ASCIZ/ + +DRAWING CODE = /] + JRST OUTTXT] + SKIPN T,TPAGE + SKIPE TOF + CAIA + JRST NODCOD + OUTSTR[ASCIZ/ +SHEET /] + JUMPE T,.+2 + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ OF /] + SKIPE T,TOF + PUSHJ P,OUTTXT +NODCOD: +DEC,< +FOR @$I IN(DRN,ENG) +< SKIPN I$NAM + JRST NLT$I + OUTSTR[ASCIZ/ +I: /] + MOVEI A,I$NAM + JSR FPRINT +NLT$I: +> + SKIPE T,TNXTHI + PUSHJ P,[OUTSTR[ASCIZ/ + +NEXT HIGHER ASSEMBLY NUMBER = /] + JRST OUTTXT] +>;DEC + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + SKIPE CRDLOC + PUSHJ P,[OUTSTR [ASCIZ / +CARD LOCATION: /] + HLRZ A,CRDLOC + JRST SLTOUT] + OUTSTR [ASCIZ / +NOMENCLATURE: /] + MOVE T,NOMTYP + OUTSTR @LNAMES(T) + SKIPL T,WWTYP + JRST [ OUTSTR [ASCIZ / +BOARD TYPE: /] + OUTSTR @WNAMES(T) + JRST .+1] + OUTSTR[ASCIZ/ +/] + TVON + POPJ P, + ;MORE SET AND CLEAR STUFF +UNDRLN: SETOM ULNFLG + POPJ P, + +NUNDRL: SETZM ULNFLG + POPJ P, + +SETDMD: TLO M,DIAMONDS + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/DIAMONDS AT JUNCTIONS OF 3 LINES/] + PUSHJ P,YORN + JFCL + TLZA M,JUNC3 + TLO M,JUNC3 ;YES. + POPJ P, + +CLRDMD: TLZ M,DIAMONDS!JUNC3 + POPJ P, +>;MD + +STANFO,< +SETTHK: MOVE A,STDBIG + MOVEI B,CWIDTH+1 + MOVEM B,PLTPTX(A) + POPJ P, + +CLRTHK: MOVE A,STDBIG + MOVEI B,CWIDTH + MOVEM B,PLTPTX(A) + POPJ P, +>;STANFO + +MPC,< +STCARD: TLON M,CRDISP + TRO MCHG + POPJ P, + +CLCARD: TLZE M,CRDISP + TRO MCHG + POPJ P, + +;HERE WE DELETE LINES, TEXT, AND POINTS WITHOUT DRILL HOLES +;ALSO SET PAD TYPES TO 2 (CLEARANCE) +INNER: TRZ INLIN!INMOV + TRO NEEDCL + MOVEI B,PONPNT + PUSHJ P,PNTKIL + MOVEI B,PONPN2 + PUSHJ P,PNTKIL + OUTSTR[ASCIZ/WELL, NOW YOU'VE REALLY DONE IT OLLY! +THIS USED TO BE A NICE PC CARD! +/] + SETZM LSTNAM ;DISABLE  +LAY,< SETZM SAVNAM > + TRO MCHG + JRST FILEUP ;UPDATE ON SCREEN + +PNTKL1: FETCHL(TT,B,PBIT) + TLNE TT,CPIN + JRST STCLR1 ;CONNECTORS ARE SPCIAL + TLNE TT,ISPIN!FEEDTH + JRST STCLR + TRZ TFLG + PUSH P,A ;SAVE LAST + PUSHJ P,DELPNT ;DELETE POINT + POP P,B ;RESTORE LAST AS THIS + JRST PNTKIL + +STCLR: MOVEI TT,2 ;SET CLEARANCE PAD + STORE(TT,B,PIN) +STCLR1: PUSHJ P,KILPNT ;FLUSH LINES AND TEXT +PNTKIL: MOVE A,B + FETCH(B,B,PNXT) + JUMPN B,PNTKL1 + POPJ P, + +PPLOT: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/PLANE NUMBER?/] + PUSHJ P,READNC + ADDI T,1 + MOVEM T,CPLANE + JRST PLPLOT + +MUNG: MOVE T,MODE + CAIE T,SETM ;SET MODE IS SPECIAL + JRST MUSH + JRST STMUSH ;MUSH SET ONLY + +SETPWR: MOVEI D,1 ;DIVIDE BY 1 TO GET PWR PIN + MOVEI F,2 ;AND DEPOSIT A 2 (POWER PLANE) + OUTSTR[ASCIZ/CONNECT HIGHEST NUMBERED PIN OF DIP TO POWER/] + PUSHJ P,YORN + JFCL + CAIA + PUSHJ P,PWRGND +NOUML,< POPJ P,> +UML,< MOVEI E,[ + ASCIZ/VCC/] +PGSIGS: OUTSTR[ASCIZ/CONNECT /] + OUTSTR 1(E) + OUTSTR[ASCIZ/ RUN TO INNER PLANE/] + PUSHJ P,YORN + POPJ P, + POPJ P, + SKIPN G,WIRLST + JRST NOPGSG +PGSIG1: HRRZ C,1(G) +PGSIG2: HLRZ A,1(C) + JUMPE A,PGSIG3 + ADD A,[POINT 7,1] + MOVE B,E + PUSHJ P,SIGMAT + JRST PGSIG3 + JRST ISPORG ;EQUIVALENT IS CLOSE ENOUGH + JRST ISPORG + +PGSIG3: HRRZ C,(C) + JUMPN C,PGSIG2 + HRRZ G,(G) + JUMPN G,PGSIG1 +NOPGSG: OUTSTR[ASCIZ/NO /] + OUTSTR 1(E) + OUTSTR[ASCIZ/ RUN! +/] + POPJ P, + +ISPORG: HRRZ G,1(G) +ISPOR1: HLRZ E,(G) + JUMPE E,ISNPG + HLRZ A,(E) + FETCHL(B,A,PBIT) + TLNN B,ISPIN ;PINS ONLY! + JRST ISNPG + MOVE T,F + PUSHJ P,UNPLN1 ;SET PLANE # ON PIN +ISNPG: HRRZ G,(G) + JUMPN G,ISPOR1 + POPJ P, +>;UML + +SETGND: MOVEI D,2 ;DIVIDE BY 2 + MOVEI F,1 ;AND SET TO 1 (GROUND PLANE) + OUTSTR[ASCIZ/CONNECT HALF HIGHEST NUMBERED PIN OF DIP TO GROUND/] + PUSHJ P,YORN + JFCL + CAIA + PUSHJ P,PWRGND +NOUML,< POPJ P,> +UML,< MOVEI E,[ + ASCIZ/GND/] + JRST PGSIGS +>;UML + +PWRGND: MOVE T,F + SKIPE E,PONPNT + PUSHJ P,PGSET + SKIPE E,PONPN2 + PUSHJ P,PGSET + TRO MCHG + POPJ P, + +PGSET: FETCHL(B,E,PBIT) + TLNN B,ISPIN + JRST NPGPIN + FETCH(B,E,BBODY) + FETCH(B,B,BTYP) + FETCH(B,B,TNAM) ;# PINS THIS TYPE + CAIG B,3 ;IS IT BIGGER THAN TRANSISTOR? + JRST NPGPIN + IDIV B,D + FETCH(C,E,BPLOC) + FETCH(C,C,TPID) + CAMN C,B + PUSHJ P,UNPLN1 ;SET PLANE FROM T +NPGPIN: FETCH(E,E,PNXT) + JUMPN E,PGSET + POPJ P, + ;ROUTING PARAMETERS +ROUTE,< +SETRTE: PUSHJ P,BITINI + TLNE M,RDISP + TRO MCHG + POPJ P, + +SETRDS: TLNN M,%ROUTE + PUSHJ P,BITINI ;FORCE INTIALIZATION + TLOE M,RDISP + POPJ P, + TRO MCHG + POPJ P, + +CLRRDS: TLZE M,RDISP + TRO MCHG + POPJ P, + +SETRCD: OUTSTR[ASCIZ/ROUTE CODE = /] + PUSHJ P,READNC + CAILE T,3 + JRST PERRET + MOVEM T,RCODE + POPJ P, + +SETCNR: MOVEI A,.CNR + JRST SETRT + +SETFED: MOVEI A,.FED + JRST SETRT + +SETBAK: MOVEI A,.BAK + JRST SETRT + +SETSID: MOVEI A,.SID +SETRT: OUTSTR[ASCIZ/OLD VALUE = /] + MOVE T,(A) + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +NEW VALUE = /] + PUSHJ P,SREADN + CAIE C,12 ;ENDING OK? + JRST INNERR ;NO, GET OUT + MOVEM T,(A) ;STORE NEW VALUE + POPJ P, +>;ROUTE +>;MPC + ;SET CARD LOC(D,PC) +SETLOC: TLNE M,DSKACT!MACACT + JRST SETLC1 + OUTSTR[ASCIZ/SET CARD LOCATION. +/] + OUTSTR @SLTCUE + OUTCHR["?"] +SETLC1: MOVE T,[PUSHJ P,GETLCH] + MOVEM T,GTCHRX + PUSHJ P,GETSLT + JRST INNERR + CAIE C,12 + JRST INNERR + SKIPN C,LETTER + JRST [ +MD,< SKIPN CRDLOC ;CRDLOC SET FOR WHOLE CARD? + JRST CLRLCB ;NO, SET INDIVIDUALLY +>;MD + SETZM CRDLOC + TRO MCHG + POPJ P,] +MPC,< HLLZ C,LETTER + MOVEM C,CRDLOC + TRO MCHG + POPJ P, +>;MPC +MD,< OUTSTR[ASCIZ/SHALL I SET THIS AS PERMANENT CARD LOC FOR WHOLE DWG, +OR JUST SPREAD THIS THROUGH BODIES AND CPINS (Y FOR PERM)/] + PUSHJ P,YORN + JFCL + CAIA + JRST [ MOVE T,LETTER + MOVEM T,CRDLOC + SETZM LETTER ;NOW CLEAR CRDLOC'S IN INDIVIDUAL CPINS AND BODIES + JRST CLRLCB] + SETZM CRDLOC ;CLEAR GLOBAL CRDLOC +CLRLCB: MOVEI A,DBODPN + TRO MCHG + JRST SETLCB + +STLCB1: FETCH(T,A,BLOC) + JUMPE T,SETLCB ;ANY BODY LOC SET? + HLRZ TT,LETTER + STORE(TT,A,BBRS) + MOVE T,A + PUSH P,A + PUSHJ P,OFFBLO + POP P,A +SETLCB: FETCH(A,A,BNXT) + JUMPN A,STLCB1 + MOVEI A,PONPNT + JRST SETLCC + +STLCC1: FETCHL(TT,A,PBIT) + TLNN TT,CPIN + JRST SETLCC + FETCH(T,A,PLOC) + HLLZ TT,LETTER + HLLM TT,(T) +SETLCC: HRRZ A,(A) + JUMPN A,STLCC1 + TRO MCHG!NEEDCL + POPJ P, +>;MD + +SETLZ: SKIPN A,DBODPN + POPJ P, + TRO MCHG +SETLZ1: +MD,< CLEAR(A,BLOC) > +MPC,< CLEAR(A,BLN) > + FETCH(A,A,BNXT) + JUMPN A,SETLZ1 + POPJ P, + ;UML STUFF +MPC,< +%LIM__=300/5*2 + +UMLREL: SKIPE B,XUMLPN + PUSHJ P,PUTFS + SETZM XUMLPN + SKIPE B,YUMLPN + PUSHJ P,PUTFS + SETZM YUMLPN + POPJ P, + +DOUML: SKIPN DBODPN ;ANYTHING TO DO IT TO? + JRST PERRET + PUSHJ P,UMLREL + OUTSTR[ASCIZ/?/] + PUSHJ P,GETLET + JRST INNERR + SKIPG C,L2N-"A"(C) ;GET ITS NUMBER + JRST INNERR + MOVEM C,L1 + PUSHJ P,READNC + JUMPE T,INNERR + MOVEM T,N1 + MOVE A,DBODPN +DOUML1: FETCHL(T,A,BX) + MOVEI B,XUMLPN + PUSHJ P,DOUMLA + FETCHL(T,A,BY) + MOVEI B,YUMLPN + PUSHJ P,DOUMLA + FETCH(A,A,BNXT) + JUMPN A,DOUML1 + MOVE A,DBODPN ;TAKE IT FROM THE TOP! +DOUML2: FETCHL(T,A,BX) + MOVEI B,XUMLPN + PUSHJ P,DOUMLB + ADD C,N1 + FETCH(D,A,BLN) + DPB C,[POINT 6,D,29] ;STORE NUMBER + CAILE C,77 + OUTSTR[ASCIZ/NUMBER OVERFLOW! +/] + FETCHL(T,A,BY) + MOVEI B,YUMLPN + PUSHJ P,DOUMLB + ADD C,L1 + DPB C,[POINT 6,D,23] ;AND LETTER + STORE(D,A,BLN) + ANDI C,77 ;MAKE SURE WE DON'T GO OFF END OF TABLE + MOVE C,N2L(C) + CAIN C,"?" ;ERROR? + OUTSTR[ASCIZ/LETTER OVERFLOW! +/] + FETCH(A,A,BNXT) + JUMPN A,DOUML2 + PUSHJ P,UMLREL + ;MORE UML +;HERE WE CHECK FOR DUPLICATION OF LOCATION, AND TRY TO FLUSH IT + + MOVE A,DBODPN +DOUML4: MOVE B,A + FETCH(B,A,BLN) + LDB C,[POINT 6,B,29] ;NUMBER + LDB B,[POINT 6,B,23] ;LETTER + MOVE D,A + CAIL B,77 + CAIE C,"Z"-100 + JRST DOUML6 + JRST DOUML7 ;LOSE BIG, CAN'T MOVE THIS + +DOUML5: FETCH(E,D,BLN) + LDB T,[POINT 6,E,23] ;LETTER + LDB TT,[POINT 6,E,29] ;NUMBER + CAMN B,T ;SAME LETTER? + CAME C,TT ;AND NUMBER? + JRST DOUML6 ;NO + FETCH(T,A,BXY) + TLO T,1 + SUB T,ADDR(D,BXY) ;THIS IS DELTA X,Y + HLRE TT,T + MOVM TT,TT + HRRE TTT,T + MOVM TTT,TTT + MOVEI F,0 + MOVEI G,2 + TLNE T,400000 + MOVEI F,1 ;-DELTA X + TRNE T,400000 + MOVEI G,3 ;-DELTA Y + CAMG TTT,TT + CAIGE B,"Z"-100 ;IF LETTER IS MAX, FORCE CHANGE OF NUMBER + CAIA + EXCH G,F ;(DELTA XDELTA Y) + XCT PNTAB(G) + FETCH(T,D,BLN) + LDB B,LNTAB(G) + ADDI B,1 ;INC LETTER OR NUMBER + DPB B,LNTAB(G) ;PUT IT BACK + STORE(T,D,BLN) + MOVE C,B + MOVE E,DBODPN ;PUSH EVERYONE UP FROM HERE +DOUML7: FETCH(T,A,BLN) + LDB B,LNTAB(G) + CAML B,C ;IS GREATER OF EQUAL TO ONE WE JUST CHANGED + CAIN D,(E) ;AND NOT THE ONE WE JUST CHANGED? + CAIA ;SKIP IT + ADDI B,1 ;INCREASE IT + DPB B,LNTAB(G) ;STORE IT BACK + STORE(T,E,BLN) + FETCH(E,E,BNXT) + JUMPN E,DOUML7 ;LOOP THROUGH ALL OF THEM + JRST DOUML4 ;THEN START OVER (SEE US BE SLOW) +DOUML6: FETCH(D,D,BNXT) + JUMPN D,DOUML5 ;CONTINUE DOWN FROM CURRENT BODY +DOUML8: FETCH(A,A,BNXT) + JUMPN A,DOUML4 ;GET ANOTHER CURRENT BODY + TRO MCHG + POPJ P, ;YOU MEAN WE'RE DONE? + +PNTAB: JFCL + MOVE D,A ;AD INCREASE IT + JFCL + MOVE D,A ;AD INCREASE IT + +LNTAB: POINT 6,T,29 ;NUMBER + POINT 6,T,29 ;NUMBER + POINT 6,T,23 ;LETTER + POINT 6,T,23 ;LETTER + ;STILL MORE UML +DUMLA1: MOVE TT,T + SUB TT,(B) + MOVE TTT,1(B) + SUB TTT,T + JUMPG TT,ABOVEA + JUMPG TTT,BELOWA + POPJ P, ;AND RETURN +ABOVEA: HLLZ TTT,(B) + SUB TTT,1(B) + ADD TTT,TT + CAMLE TTT,[%LIM,,0] + JRST DUMLA2 + HLLM T,(B) ;STORE NEW TOP + POPJ P, ;AND RETURN +BELOWA: HLLZ TT,(B) + SUB TT,1(B) + ADD TTT,TT + CAMLE TTT,[%LIM,,0] + JRST DOUMLA + HLLM T,1(B) + POPJ P, +DOUMLA: MOVE E,B + HRRZ B,(B) + JUMPN B,DUMLA1 +DUMLA2: GETFS(TT) + HRRM B,(TT) + HRRM TT,(E) + HLLM T,(TT) + HLLZM T,1(TT) + POPJ P, + +DUMLB1: CAML T,1(B) ;IS THIS THE ONE? + POPJ P, ;YES + AOSA C +DOUMLB: SETZ C, +DUMLB2: HRRZ B,(B) + JUMPN B,DUMLB1 + PUSHJ P,FUCKUP + POPJ P, +>;MPC + ;COUNT THINGS +DOCNT: +MD,< SETZM COUNT + SETZM COUNT2 +>;MD +MPC,< SETZM L1 +>;MPC + SKIPE A,PONPNT + PUSHJ P,DOCNT1 +MPC,< SETZM COUNT + SETZM COUNT2 + SKIPE A,PONPN2 + PUSHJ P,DOCNT1 +>;MPC +MD,< MOVE T,COUNT + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ POINTS! +/] + MOVE T,COUNT2 + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ CONNECTOR PINS! +/] +>;MD +MPC,< MOVE T,COUNT + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ DIP PADS. +/] + MOVE T,COUNT2 + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ FEEDTHROUGHS. +/] + MOVE T,L1 + PUSHJ P,MILOUT + OUTSTR[ASCIZ/ INCHES OF ETCH. +/] +>;MPC + SKIPE DBODPN + SKIPN A,BODPNT + POPJ P, +BDCNT: MOVE B,DBODPN + SETZ C, +BDCNT1: FETCH(T,B,BTYP) + CAMN T,A + ADDI C,1 + FETCH(B,B,BNXT) + JUMPN B,BDCNT1 + JUMPE C,BDNONE + OUTSTR[ASCIZ/ +/] +MD,< + FETCH(T,A,TNAM) + PUSHJ P,OUTTXT + OUTSTR[ASCIZ/ /] +>;MD + MOVE T,C + PUSHJ P,DECOUT +MD,< FETCH(B,A,TLIB) + JUMPE B,BDNONE + PUSHJ P,LIBTAB + OUTSTR NAMBUF +>;MD +MPC,< OUTSTR[ASCIZ/ /] + FETCH(T,A,TNAM) + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ PIN DIPS/] + FETCH(T,A,TNAM) + CAIE T,2 ;2 PIN DIPS ARE SPECIAL + JRST BDNONE + FETCH(T,A,TPIN) + FETCH(T,T,TPXY) ;1/2 Y VALUE * 2 + IMULI T,5 ;CONVERT TO MILS + OUTSTR[ASCIZ/ SEPERATED BY /] + PUSH P,T + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ MILS/] + POP P,T + CAIN T,=400 + OUTSTR[ASCIZ/ (RESISTORS)/] + CAIN T,=300 + OUTSTR[ASCIZ/ (CAPACITORS)/] +>;MPC +BDNONE: FETCH(A,A,TNXT) + JUMPN A,BDCNT + OUTSTR[ASCIZ/ +/] + POPJ P, + +DOCNT1: FETCHL(C,A,PBIT) +MD,< AOS COUNT ;COUNT A POINT + TLNE C,CPIN ;THESE ARE CONNECTOR PINS + AOS COUNT2 +>;MD +MPC,< TLNE C,ISPIN + AOS COUNT + TLNE C,FEEDTH + AOS COUNT2 + FETCH(C,A,PXY) ;GET X,Y FOR COMPARISON + FETCH(B,A,PNEB) + JUMPE B,DOCNT2 ;SKIP IF NONE +DOCNT3: MOVEI D,2 +DOCNT4: XCT (D)[HLRZ E,(B) + HLRZ E,1(B) + HRRZ E,1(B)] + JUMPE E,DOCNT5 + CAML C,ADDR(E,PXY) ;ONLY DO IN ONE DIRECTION + JRST DOCNT5 + HLRE T,C + FETCH(TT,E,PX) + SUB T,TT + IMUL T,T + HRRE TT,C + FETCH(TTT,E,PY) + SUB TT,TTT + IMUL TT,TT + ADD T,TT + PUSHJ P,SQRT + ADDM T,L1 +DOCNT5: SOJGE D,DOCNT4 + HRRZ B,(B) + JUMPN B,DOCNT3 +DOCNT2: +>;MPC + FETCH(A,A,PNXT) + JUMPN A,DOCNT1 + POPJ P, + ;BRIGHTNESS, SCALE +ITBRT: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/NORMAL BRIGHTNESS?/] + MOVEI A,DEFBRT + PUSHJ P,ITBRTS + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ADDITIONAL BLINKING BRIGHTNESS?/] + MOVEI A,BLBRT + PUSHJ P,ITBRTS +MPC,< TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/BOTH SIDES BRIGHTNESS?/] + MOVEI A,BTHBRT + PUSHJ P,ITBRTS +>;MPC + POPJ P, + +ITBRTS: PUSHJ P,GETCHR + CAIN C,12 + POPJ P, + CAIN C,ALTMOD + JRST ITBRTT ;NO CHANGE + CAIL C,"0" + CAILE C,"7" ;LEGAL BRIGHTNESS? + JRST [ PUSHJ P,PERRET ;NO + OUTSTR[ASCIZ/BRIGHTNESS?/] + JRST ITBRTS] + MOVEI T,-60(C) + CAME T,(A) + TRO MCHG ;GET IT DONE! + MOVEM T,(A) ;SET NEW DEFAULT BRIGHTNESS +ITBRTT: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +/] + POPJ P, + +CLRBRT: +NOITS,> +ITS,< MOVEI T,4 > +DEC,< MOVEI T,5 > + CAME T,DEFBRT + TRO MCHG + MOVEM T,DEFBRT ;DEFAULT BRIGHTNESS IS 1 +STANFO,< MOVEI T,3 > +NOSTANFO,< MOVEI T,7 > + CAME T,BLBRT + TRO MCHG + MOVEM T,BLBRT +MPC,< +STANFO,< MOVEI T,5 > +NOSTANFO,< MOVEI T,7 > + CAME T,BTHBRT + TRO MCHG + MOVEM T,BTHBRT +>;MPC + POPJ P, + +ITCBRT: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/CURSOR BRIGHTNESS?/] + PUSHJ P,GETCHR + CAIL C,"0" + CAILE C,"7" + JRST PERRET + MOVEI T,-60(C) + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ +/] + JRST CURBRT + +CLCBRT: +STANFO,< MOVEI T,3 > +ITS,< MOVEI T,7 > +DEC,< MOVEI T,5 > +III,< MOVEI T,5 > + JRST CURBRT ;START CURSOR AT BRIGHTNESS 3 + +ITSCAL: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /SCALE?/] + PUSHJ P,READNC + JUMPE T,CPOPJ + CAMN T,NSCALE + POPJ P, + MOVEM T,NSCALE + JRST CHANG1 + +MD,< +ITSTUB: TLNN M,DSKACT!MACACT + OUTSTR [ASCIZ /STUB SIZE?/] + PUSHJ P,READNC + JUMPE T,CPOPJ + LSH T,1 + MOVEM T,STBSIZ + POPJ P, +>;MD + ;SIZE STUFF - ITSET, PICCEN +MD,< +PICCEN: PUSHJ P,ITSET + MOVN T,MAXX + SUB T,MINX + ASH T,-1 + MOVS T,T + MOVN TT,MAXY + SUB TT,MINY + ASH TT,-1 + HRR T,TT + TDZ T,[1,,1] + JUMPE T,CPOPJ + SKIPE A,PONPNT + PUSHJ P,PICCN1 + SKIPE A,DBODPN + PUSHJ P,PICCN1 + SKIPE A,SETPNT + PUSHJ P,PICCN1 + TRO MCHG!NEEDCL + JRST HOME ;NOW CENTER PHYSICAL SCREEN + +PICCN1: FETCH(TT,A,QXY) + ADJUST(ADD,TT,T) + STORE(TT,A,QXY) + HRRZ A,(A) + JUMPN A,PICCN1 + POPJ P, +>;MD + +ITSET: MOVSI T,400000 + MOVEM T,MAXX + MOVEM T,MAXY + SETCAM T,MINX + SETCAM T,MINY +MD,< MOVEI T,10 ;DISTXT EXPECTS THIS + MOVEM T,CSCALE + SKIPE A,DBODPN + PUSHJ P,CHKBDS +>;MD + SKIPE A,PONPNT + PUSHJ P,CHKDIS +MPC,< SKIPE A,PONPN2 + PUSHJ P,CHKDIS +>;MPC + HLRES MINX + HLRES MAXX + POPJ P, + + ;CHECK DISPLAY LIMIT, INCLUDING TEXT AND CONNECTOR BOXES +;A = POINT + +CHKDIS: FETCH(T,A,PXY) + PUSHJ P,MAXMIN + TRNE M,NPTEXT ;DOING POINT TEXT? + JRST CHKDS1 + FETCH(D,A,PTXT) ;TEXT POINTER + JUMPE D,CHKDS1 ;MAYBE NONE + FETCH(T,A,PXY) ;X,Y AGAIN + PUSHJ P,DISTXT ;CALC MAX AND MIN +CHKDS1: +MD,< FETCH(B,A,PBIT) + TRNE B,CPIN ;CONNECTOR PIN HERE? + TLNN M,CLOCS ;YES, DOING THEM? + JRST CHKDS2 ;NO + FETCH(T,A,PXY) + FETCH(B,A,PLOC) + MOVE C,STDBIG + HLRE TT,1(B) + IMUL TT,PLTPTX(C) + IDIV TT,VIRPTX(C) + UNSCAL TT + HRLZ TT,TT + ADD T,TT + HRRE TT,1(B) + IMUL TT,PLTPTY(C) + IDIV TT,VIRPTY(C) + UNSCAL TT + HRRZ TT,TT + ADD T,TT + TLZ T,1 + PUSH P,T + TRNE M,NOCBOX + JRST CHKDS3 + MOVE TT,PLTPTY(C) + ASH TT,-1 + HRLZ TT,TT + SUB T,TT +CHKDS3: PUSHJ P,MAXMIN ;LOWER LEFT EXTREMES + PUSHJ P,CONCAL ;CALC LENGTH OF CONNECTOR SPEC (A) + IMUL T,PLTPTX(C) + HRLZ T,T + POP P,TT + ADD T,TT + MOVE TT,PLTPTY(C) + ADD T,TT + TLZ T,1 + TRNE M,NOCBOX + JRST CHKDS4 + ASH TT,-1 + HRLZ TT,TT + ADD T,TT +CHKDS4: PUSHJ P,MAXMIN ;UPPER RIGHT EXTREMES +CHKDS2: +>;MD + FETCH(A,A,PNXT) + JUMPN A,CHKDIS + POPJ P, + +MAXMIN: CAMLE T,MAXX + MOVEM T,MAXX + CAMGE T,MINX + MOVEM T,MINX + HRRES T + CAMLE T,MAXY + MOVEM T,MAXY + CAMGE T,MINY + MOVEM T,MINY + POPJ P, + + ;DISTXT - CALC MAX,MIN OF TEXT +;D = TEXCOF BLOCK (OR 2ND PART OF TEXT/PROP BLOCK) +;T = X,Y + +DISTXT: HRRZ C,(D) ;ACTUAL TEXT + FETCH(C,C,TSSIZ) + SKIPN C + MOVE C,STDBIG + TRZE C,400000 + TLO C,400000 + HLRE TT,1(D) ;CHARACTER X,Y OFFSET (IN III POINTS?) + IMUL TT,PLTPTX(C) + IDIV TT,VIRPTX(C) ;COMPENSATE FOR CHAR SIZE DEVIATIONS + UNSCAL TT ;INTERNAL COORDS + HRLZ TT,TT + ADD T,TT ;OFFSET MAIN X,Y BY CHAR OFFSET + HRRE TT,1(D) + IMUL TT,PLTPTY(C) + IDIV TT,VIRPTY(C) + UNSCAL TT + HRRZ TT,TT + ADD T,TT + TLZ T,1 + MOVE TT,PLTPTX(C) ;CHARACTER WIDTH (AS PLOTTED) +MPC,< LSH TT,1 > + PUSH P,TT + MOVE TT,PLTPTY(C) ;CHARACTER HEIGHT (AS PLOTTED) +MPC,< LSH TT,1 > + PUSH P,TT +MD,< UNSCAL TT > + TLNE C,400000 ;COMPUTE Y OF TOP OF TEXT + MOVNS TT + HRRZS TT + TLNE C,400000 + MOVSS TT + PUSH P,T ;SAVE ORIG X,Y + ADJUST(ADD,T,TT) ;UPPER LEFT CORNER OF TEXT + PUSHJ P,MAXMIN ;CHECK IT +;Now find # lines, max line width of text + SETZB T,TT + ADD D,[POINT 7,1,35] ;MAKE A BYTE POINTER +DSTXT1: TLNN D,760000 ;BYTE POINTER OUT? + JRST DSTXT2 +DSTXT3: ILDB TTT,D ;GET A CHAR + JUMPE TTT,DSTXT1 + CAIE TTT,DBLARR ;CRLF? + AOJA T,DSTXT1 ;NO + CAILE T,(TT) ;BIGGER THAN LARGEST? + HRR TT,T ;YES + SETZ T, ;NO CHARS ON NEXT LINE YET! + ADD TT,[1,,0] ;COUNT ANOTHER LINE + JRST DSTXT1 + +DSTXT2: HRR D,-1(D) ;FOLLOW LINK + TRNE D,-1 ;WAS THERE ONE? + JRST DSTXT3 + CAILE T,(TT) + HRR TT,T ;#LINES,,MAX LENGTH + HLRZ T,TT + HRRZS TT + IMUL T,-1(P) ;#LINES*CHAR HEIGHT + IMUL TT,-2(P) ;MAX WIDTH * CHAR WIDTH +MD,< + UNSCAL T + UNSCAL TT +>;MD + TLNN C,400000 + MOVNS T ;HORIZ: -Y, VERT: +X + HRL T,TT + TLNE C,400000 + MOVSS T + ADJUST(ADD,T,<(P)>) + PUSHJ P,MAXMIN ;CHECK LOWER RIGHT CORNER OF TEXT + SUB P,[3,,3] + POPJ P, + +MD,< +CHKBDS: FETCH(F,A,BORI) + FETCH(T,A,BTXT) + MOVEM T,BTXLST + FETCH(B,A,BTYP) + FETCH(C,B,TLIN) + JUMPE C,NCHKLN ;ANY? +CHKLN: FETCH(T,C,QXY) + PUSHJ P,ORIENT + ADJUST(ADD,T,) + PUSHJ P,MAXMIN + FETCH(C,C,QNXT) + JUMPN C,CHKLN +NCHKLN: TRNE M,NBTEXT + JRST NCHKT + SKIPN BTXLST + JRST CHKT0 + MOVE B,BTXLST +CHKT1: FETCH(T,B,TXBIT) + TRNN T,TXBIND + JRST CHKT2 + PUSH P,B + FETCH(B,B,TXIND) + PUSHJ P,DSBTXT + POP P,B + JRST CHKT3 + +CHKT2: PUSHJ P,DSBTXT +CHKT3: FETCH(B,B,TXNXT) + JUMPN B,CHKT1 + JRST NCHKT + +CHKT0: FETCH(B,B,TPROP) ;ALSO DISPLAY TEXT FROM DEF + JUMPE B,NCHKT +CHKT: PUSHJ P,DSBTXT + HRRZ B,(B) + JUMPN B,CHKT +NCHKT: HRRZ A,(A) + JUMPN A,CHKBDS + POPJ P, + +DSBTXT: FETCH(T,B,TXVAL) + FETCH(T,T,TSSIZ) + TLNN M,%IDENT + JUMPE T,CPOPJ + FETCH(T,B,TXXY) + TDZ T,[1,,1] + PUSHJ P,ORIENT + ADJUST(ADD,T,) + MOVEI D,-1+ADDR(B,TXOFF) + JRST DISTXT +>;MD + ;MORE SIZE STUFF +ITSIZE: PUSHJ P,ITSET +MD,< + OUTSTR[ASCIZ/WHAT SCALE WILL YOU USE IN THE PLOT PROG?/] + PUSHJ P,READNC + JUMPE T,CPOPJ + MOVEM T,ITSSCL +>;MD + MOVE T,MAXX + SUB T,MINX + OUTSTR[ASCIZ/WIDTH OF PIC IS /] + PUSHJ P,DOSIZE + MOVE T,MAXY + SUB T,MINY + OUTSTR[ASCIZ/HEIGHT OF PIC IS /] +MD,< + PUSHJ P,DOSIZE + MOVE T,MAXX + SUB T,MINX + SCALET(T) +NODEC,< IMUL T,ITSSCL ;SCALE IT + ASH T,-3 +>;NODEC +DEC,< ASH T,-2 > ;DEC SCALE LOOKS LIKE 2 + MOVE TT,MAXY + SUB TT,MINY + SCALET(TT) +NODEC,< IMUL TT,ITSSCL ;SCALE IT + ASH TT,-3 +>;NODEC +DEC,< ASH TT,-2 > + TRZ TFLG + MOVSI TTT,-HBXLEN + PUSHJ P,BOXCHK + MOVE TTT,[-VBXLEN,,HBXLEN] + PUSHJ P,BOXCHK + TRNN TFLG + OUTSTR[ASCIZ/NO BOX IS BIG ENOUGH. +/] + POPJ P, + +BOXCHK: CAMG T,WTAB(TTT) + CAML TT,HTAB(TTT) + AOBJN TTT,BOXCHK + JUMPGE TTT,CPOPJ + TRO TFLG + OUTSTR[ASCIZ/SIZE /] + SKIPGE BTAB(TTT) + OUTCHR["V"] + OUTCHR BTAB(TTT) + OUTSTR[ASCIZ/ IS BIG ENOUGH! +/] + POPJ P, +>;MD + +DOSIZE: JUMPGE T,.+2 + SETZ T, +MD,< SCALET(T) + IMUL T,ITSSCL ;SCALE IT! + ASH T,-3 +>;MD +MPC,< ASH T,-1 > + IDIVI T,=200 + PUSH P,TT ;SAVE REMAINDER + PUSHJ P,DECOUT ;PRINT INCHES + OUTCHR["."] + POP P,T + IMULI T,5 + CAIGE T,=100 + OUTCHR["0"] + CAIGE T,=10 + OUTCHR["0"] + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ INCHES. +/] + POPJ P, + ;SHOWBOX +MD,< +STANFO,< +C16: MOVEI D,"C" ;BOX SIZE C + MOVEI T,=16 + MOVEM T,SSCALE ;SCALE 16 + JRST C16.1 +>;STANFO + +SHWBOX: TLNN M,DSKACT!MACACT +NODEC,< OUTSTR[ASCIZ\/?\]> +DEC,< OUTSTR[ASCIZ\?\]> + PUSHJ P,GETLET + JRST [ CAIE C,12 + JRST INNERR + CLRSHW: SKIPN SWIDTH + POPJ P, + SETZM SWIDTH + TRO MCHG + POPJ P,] + CAIE C,"V" ;ASKING FOR VERTICAL? + JRST NXVERT + PUSHJ P,GETLET + JRST INNERR + TLO C,400000 ;MARK AS VERTICAL +NXVERT: MOVE D,C ;SAVE CHAR + PUSHJ P,READN + SKIPN T + MOVE T,NSCALE + MOVEM T,SSCALE +NODEC,< SETZ T, + CAIN C,"/" + PUSHJ P,READN +>;NODEC + CAIE C,12 + JRST INNERR +NODEC,< SKIPN T> +C16.1: MOVEI T,2 + MOVSI TTT,-BOXLEN + CAME D,BTAB(TTT) ;THIS LETTER? + AOBJN TTT,.-1 ;NO + JUMPGE TTT,INNERR ;LOSE, NOT IN TABLE + HRRZ D,TTT ;SAVE INDEX + PUSH P,NSCALE + MOVE TT,SSCALE + MOVEM TT,NSCALE + IMULM T,SSCALE + LSH T,3 + MOVEM T,CSCALE + PUSH P,D + PUSHJ P,ITSET + POP P,D + POP P,NSCALE ;RESTORE TRUE SCALE + MOVE T,MAXX + ADD T,MINX + ASH T,-1 + MOVE TT,MAXY + ADD TT,MINY + ASH TT,-1 + MOVE A,WTAB(D) + IDIV A,SSCALE + ASH A,1 + MOVN B,A + ADD A,T + ADD B,T + HRLM A,SWIDTH + HRRM B,SWIDTH + MOVE A,HTAB(D) + IDIV A,SSCALE + ASH A,1 + MOVN B,A + ADD A,TT + ADD B,TT + HRLM A,SHEIGHT + HRRM B,SHEIGHT + TRO MCHG + POPJ P, + +NSHOBX: SETZM SHEIGHT + SETZM SWIDTH + TRO MCHG + POPJ P, + ;PBOX +BOXSIZ: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/WHAT BOX SIZE?/] + PUSHJ P,GETLET + JRST INNERR + CAIE C,"V" + JRST NXVRT1 + PUSHJ P,GETLET + JRST INNERR + TLO C,400000 +NXVRT1: MOVE D,C + PUSHJ P,GETLIN + CAIE C,12 + JRST INNERR + MOVSI TTT,-BOXLEN + CAME D,BTAB(TTT) + AOBJN TTT,.-1 + JUMPGE TTT,PERRET + HRRZM TTT,CBOX + PUSHJ P,ITSET ;FIND MAX X,Y'S + MOVE C,CBOX ;THIS WAS CLOBBERED + MOVE T,MAXX + SUB T,MINX + MOVE TT,MAXY + SUB TT,MINY + ASH T,-2 + ASH TT,-2 + MOVE A,WTAB(C) + IDIV A,T + MOVE B,HTAB(C) + IDIV B,TT + CAML A,B + MOVE A,B +DEC,< ASH A,1 > + PUSH P,NSCALE + JUMPN A,.+2 + MOVEI A,1 + MOVEM A,NSCALE + LSH A,3 ;FUDGE TEXT SCALE BY 10 + IDIV A,(P) + JUMPN A,.+2 + MOVEI A,4 + CAILE A,30 ;IF SIZE 3 OR LARGER WILL SHRINK PIC + JRST [ MOVE A,(P) + IMULI A,3 + MOVEM A,NSCALE + MOVEI A,30 + JRST .+1] + MOVEM A,CSCALE + OUTSTR[ASCIZ/ SCALING TEXT BY /] + MOVE T,CSCALE + ASH T,-4 + PUSHJ P,OCTOUT + OUTCHR [" "] + MOVE T,CSCALE + ASH T,-1 + ANDI T,7 + ADDI T,60 + OUTCHR T + OUTSTR[ASCIZ %/8 +%] + MOVE T,CSCALE + CAIGE T,10 + OUTSTR[ASCIZ/SOME OF THIS TEXT WILL BE AWFULLY SMALL! +/] + PUSHJ P,DPLOT + POP P,NSCALE + POPJ P, + ;SLICE +DOSLICE:PUSHJ P,SLCSET + POPJ P, + SETZM FIND + SKIPE E,PONPNT + PUSHJ P,ACLRP + SKIPN C,PONPNT + JRST SLEAVE +SLOP: PUSHJ P,SLOPDO + JRST SLOPX + JRST SLOPY + TRO MCHG ;WILL CHANGE PIC + MOVE T,[POINT 7,SIGBUF] + JRST SLOPZ1 + +SLOPZ2: TLNE A,760000 + JRST SLOPZ3 + HRRZ TTT,-1(A) + JUMPN TTT,SLOPZ4 + GETBLK(TTT,TEXSTR) + CLEAR(TTT,TSNXT) + CLEAR(TTT,TSASC) +SLOPZ4: HRR A,TTT +SLOPZ3: IDPB TT,A +SLOPZ1: ILDB TT,T + JUMPN TT,SLOPZ2 + CAIA + IDPB TT,A + TLNE A,760000 + JRST .-2 + SOS A + FETCH(B,A,TSNXT) + CLEAR(A,TSNXT) + PUSHJ P,PUTFS + HRLM C,(P) + MOVE A,C + PUSHJ P,FIXEM ;FIX OFFSETS IF BITS ON + HLRZ C,(P) +SLOPX: FETCH(C,C,PNXT) + JUMPN C,SLOP + MOVE T,FIND + MOVEM T,FNDNUM ;STORE FOR MACRO CALL AT ;R + JUMPE T,SLEAVE + SETOM FIND + TLNE M,DSKACT!MACACT + JRST SLEAVE + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ EXPRESSION ERRORS FOUND AND MARKED FOR $F. +/] +SLEAVE: PUSHJ P,SLCRET + POPJ P, + +SLOPY: SETBIT(FOUNDP,T,C,PBIT) + AOS FIND + JRST SLOPX + +CLTSLC: TLOA WFLAG ;STORE IN MACRO SLICED FORM OF TEXT +TYPSLC: TLZ WFLAG ;TYPE THE SLICED FORM OF CLOSEST TEXT + MOVEI T,1 + LSH T,@MODE + TDNN T,[1PNTM!1TXTM] + JRST PERRET + PUSHJ P,GETCLS + JRST PERRET + FETCH(T,A,PTXT) + JUMPE T,PERRET + PUSHJ P,SLCSET + POPJ P, + MOVE C,CLOSES + PUSHJ P,SLOPDO + JRST SLEAVE + JRST EXPERR + PUSHJ P,SLCRET + TLNE WFLAG + JRST TYPSL1 + OUTSTR SIGBUF ;PRINT CONVERTED SIGNAL NAME + POPJ P, + +EXPERR: OUTSTR [ASCIZ /ERROR IN EXPRESSION(S): +/] + MOVE T,CLOSES + FETCH(T,T,PTXT) + PUSHJ P,OUTTXT + OUTSTR [ASCIZ / +/] + JRST SLEAVE + +TYPSL1: PUSHJ P,SETTT + MOVE T,[POINT 7,SIGBUF] +TYPSL2: ILDB C,T + JUMPE C,ITSTUF + PUTBYT (C) + JRST TYPSL2 + ;MORE SLICE STUFF - EXPRESSION SUBRS +SLCSET: SETOM DOVARS + SETZM ERRVAR + MOVNI T,400000 + MOVEM T,LOWER + MOVEI T,377777 + MOVEM T,UPPER + MOVEM T,WIDTH + TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/LOWER BOUND?/] + PUSHJ P,SREADN + CAIE C,74 ;LEFT BROKET + JRST NOLOWR + MOVEM T,LOWER + PUSHJ P,SREADN +NOLOWR: CAIN C,12 + JUMPE T,NOUPPR + CAIE C,76 + JRST [ + SLERR: PUSHJ P,SCARF + POPJ P, + OUTSTR[ASCIZ/BOUNDS ERROR! +/] + JRST DOSLICE] + MOVEM T,UPPER + SUB T,LOWER + ADDI T,1 + MOVEM T,WIDTH + PUSHJ P,GETLIN +NOUPPR: CAIE C,12 + JRST SLERR +VARSET: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/SET VARIABLES, LN?/] +VARCON: PUSHJ P,GETLET + JRST [ CAIN C,12 ;NO VARIABLES? + JRST CPOPJ1 ;YES + VARERR: PUSHJ P,SCARF + JRST SLCRET + OUTSTR[ASCIZ/VARIABLE INPUT ERROR! +/] + JRST VARSET] + MOVE A,C + SETZM NDIG + PUSHJ P,SREADN + CAIE C,12 + CAIN C,"," + CAIA + JRST VARERR + GETFS(TT) + HRL A,NDIG ;SAVE WIDTH WITH VAR + MOVEM A,1(TT) + HRLM T,(TT) + EXCH TT,VARLST + HRRM TT,@VARLST + CAIE C,12 + JRST VARCON + JRST CPOPJ1 + +SLOPDO: FETCH(A,C,PTXT) + JUMPE A,CPOPJ + AOS (P) ;SKIP TO INDICATE ATTEMPT + FETCH(A,A,TCSTR) + ADD A,[POINT 7,1] + PUSH P,A + PUSHJ P,SIGSUB + JRST [ POP P,(P) + POPJ P,] ;LET HIGHER UPS HANDLE ERROR + POP P,A + SKIPN EXPER2 ;NO SKIP IF ERROR + AOS (P) + POPJ P, + +SLCRET: SKIPE B,VARLST + PUSHJ P,PUTFS + SETZM VARLST + POPJ P, + +GETVAR:SKIPN TT,VARLST + JRST GETVR2 ;IGNORE THIS EXPR IF VAR NOT SET +GETVR1: HLL TTT,1(TT) ;MAKE SURE WIDTH MATCHES + CAMN TTT,1(TT) ;IS THIS THE VARIABLE? + JRST ISVAR ;YES + HRRZ TT,(TT) + JUMPN TT,GETVR1 + TLZ TTT,-1 +GETVR2: SETOM EXPER2 ;FLAG ERROR + MOVEI TT,1 + LSH TT,-"A"(TTT) + TDNE TT,ERRVAR ;HAVE WE COMPLAINED ABOUT THIS ONE YET? + JRST GETVR3 + IORM TT,ERRVAR + OUTSTR[ASCIZ/NO VALUE FOR VARIABLE "/] + OUTCHR TTT + OUTSTR[ASCIZ/". +/] + POPJ P, + +GETVR3: SETZ TT, + JRST CPOPJ1 ;AND RETURN 0 + +ISVAR: HLRZ TTT,TTT + CAMLE TTT,NDIG + MOVEM TTT,NDIG + HRRZ TTT,1(TT) ;GET CHAR BACK + HLRE TT,(TT) + JRST CPOPJ1 +>;MD + +SIGGET:TLNN A,760000 + JRST [ TRNN A,-1 ;ALREADY AT END? + JRST ISENDG + HRR A,-1(A) + TRNE A,-1 + JRST .+1 + ISENDG: SETZ TTT, + POPJ P,] + ILDB TTT,A + JUMPN TTT,CPOPJ + JRST SIGGET ;GET ANOTHER IF NULL + ;XCLEAR +XCLEAR: MOVEI T,1 + LSH T,@MODE + TDNE T,[MD,ANYALT] + JRST PERRET + PUSH P,0 ;SAVE FLAGS FOR MERGING + PUSH P,M + PUSHJ P,RSTDEF ;DEFAULTS FOR RESTART + POP P,T + AND T,[XWD DSKFLG!DSKACT!MACACT,0] + IOR M,T + POP P,T + AND T,[XWD DSPACT,0] + IOR 0,T +NODEC,< +NOIII,< SETZM AUTOSM ;RESET AUTO WRITE AND SAVE COUNTERS + SETZM AUTOSN +>;NOIII +>;NODEC +MD,< +FOR I IN(SITE1,SITE2,TAUTHOR,TIT1,TIT2,TREV,TMODULE,TVARIABLE,TPREFIX,TPROJ,TPAGE,TOF,TDCODE) +< SKIPE B,I + PUSHJ P,PUTFS + SETZM I +> +DEC,< SKIPE B,TNXTHI + PUSHJ P,PUTFS + SETZM TNXTHI + SETZM DRNNAM + SETZM CHKNAM + SETZM ENGNAM +>;DEC + SETZM SWIDTH ;CLEAR SHOWBOX + PUSHJ P,CLRWW +>;MD + PUSHJ P,CLRNOM + SETZM CRDLOC ;CLEAR CARD LOCATION IN BOTH + SKIPN A,MDPNT + JRST NCMSAV + MOVSI B,MSAVE +CMSAVE: ANDCAM B,(A) ;TURN OFF SMACRO BITS ON CLEAR + HRRZ A,(A) + JUMPN A,CMSAVE +NCMSAV: SKIPE B,BLPNTR + PUSHJ P,PUTFS + SETZM BLPNTR + SETZM MOVED +MPC,< +IFN UMLSW!LAYSW,< + SETZM UPINS +>;IFN UMLSW!LAYSW +ROUTE,< SETZM RCL1 + SETZM RCL2 +>;ROUTE +SHORT,< SKIPE A,SHRTER + PUSHJ P,GIVERR + SETZM SHRTER + SETZM SERR1 + SETZM SERR2 +>;SHORT +>;MPC +UML,< PUSHJ P,RELWIR > ;RELEASE WIRE LIST + SKIPE B,FBDLST + PUSHJ P,PUTFS + SETZM FBDLST +LAY,< SETZM LAYLOC + SETZM SAVNAM +>;LAY + SETZM LSTNAM + PUSHJ P,FILEUP + SETZM BID + SETZM PID + SKIPE SETPNT + PUSHJ P,SBLAST + SKIPE A,DBODPN + PUSHJ P,BFLUSH + SETZM DBODPN + SKIPE A,PONPNT + PUSHJ P,PFLUSH + SETZM PONPNT +MPC,< SKIPE A,PONPN2 + PUSHJ P,PFLUSH + SETZM PONPN2 + PUSHJ P,CRDREL ;FLUSH PC CARD +>;MPC +MD,< SKIPE A,BODPNT + PUSHJ P,DFLUSH + SETZM BODPNT + SKIPN A,LIBLST + POPJ P, +LCLEAR: HRRZ B,(A) + HLRZ C,(A) + FSTRET(A) + FSTRET(C) + MOVE A,B + JUMPN A,LCLEAR + SETZM LIBLST +>;MD + POPJ P, + +PFLUSH: FETCH(B,A,PLOC) + FETCHL(T,A,PBIT) + TLNN T,CPIN + JRST PFLSH1 + FSTRET(B) +PFLSH1: FETCH(B,A,PTXT) + PUSHJ P,PUTFS + MOVE C,A + FETCH(A,A,PNXT) + RETBLK(C,POINT) + JUMPN A,PFLUSH + POPJ P, + +;BFLUSH - RELEASE BODY LIST IN A + +BFLUSH: MOVE B,A + FETCH(A,A,BNXT) +MD,< PUSH P,A + FETCH(C,B,BTXT) + PUSHJ P,TXTREL + POP P,A +>;MD + RETBLK(B,BODY) + JUMPN A,BFLUSH + POPJ P, + +MD,< +DFLUSH: FETCH(B,A,TNXT) + PUSH P,B + PUSHJ P,TYPREL + POP P,A + JUMPN A,DFLUSH + POPJ P, +>;MD + ;**C, OFFSET, MOVE, POSIT +CCENTR: HRL T,XOFF + HRR T,YOFF + JRST SETPOS ;PUT CURSOR THERE + +PCENTR: MOVE T,CURSE +PICSET: HLREM T,XOFF + HRREM T,YOFF + JRST CHANGE + +HOME: SETZM XOFF + SETZM YOFF + MOVEI T,0 + JRST CHANGE + +SETXOF: PUSHJ P,SETOFF + JRST PERRET + MOVEM T,XOFF + JRST CHANG1 + +SETYOF: PUSHJ P,SETOFF + JRST PERRET + MOVEM T,YOFF + JRST CHANG1 + +SETOFF: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ABSOLUTE OFFSET?/] + PUSHJ P,SREADN + CAIE C,12 + POPJ P, ;LOSE +MD,< ASH T,1 + CAIL T,377777 + POPJ P, ;OOPS! + JRST CPOPJ1 > +MPC,< ASH T,1 + IDIVI T,5 + JUMPN TT,ILLSTP + IDIV T,STPSIZ + JUMPN TT,ILLSTP + IMUL T,STPSIZ + CAIL T,377777 + POPJ P, + JRST CPOPJ1 > + +MPC< +STPERR: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/ILLEGAL STEP SIZE! +/] +SETSTP: TLNN M,DSKACT!MACACT + OUTSTR[ASCIZ/MINIMUM STEP IN MILS(DIVISIBLE BY 5 MILS)?/] + PUSHJ P,READNC + JUMPE T,INNERR + IDIVI T,5 + JUMPN TT,STPERR + JUMPE T,STPERR + MOVEM T,STPSIZ + JRST CHANG1 +>;MPC + + +MOVREL: TLNN M,DSKACT!MACACT +MD,< OUTSTR[ASCIZ/RELATIVE X,Y?/] > +MPC,< OUTSTR[ASCIZ/RELATIVE X,Y(IN MILS)?/] > + PUSHJ P,SREADN + CAIN C,ALTMOD + POPJ P, + PUSH P,T + CAIN C,12 + TDZA T,T ;JUST X + PUSHJ P,SREADN + CAIN C,ALTMOD + JRST [ POP P,(P) + POPJ P,] + ASH T,1 +MPC,< + IDIVI T,5 + JUMPN TT,[ POP P,(P) + JRST ILLSTP] +>;MPC + POP P,TT + ASH TT,1 +MPC,< + TRNE M,FLIP + MOVN TT,TT + IDIVI TT,5 + JUMPN TTT,ILLSTP + IDIV TT,STPSIZ + JUMPN TTT,ILLSTP + IMUL TT,STPSIZ + MOVE TTT,TT + IDIV T,STPSIZ + JUMPN TT,ILLSTP + IMUL T,STPSIZ + MOVE TT,TTT +>;MPC + HRL T,TT + ADJUST(ADD,T,CURSE) + JRST SETPOS + +MPC,< +ILLSTP: OUTSTR[ASCIZ/NOT INTEGRAL # OF STEPS!!!! +/] + POPJ P, + +POSIT: TLNE M,DSKACT!MACACT + POPJ P, + OUTSTR[ASCIZ/CURSOR /] + MOVE T,CURSE + PUSHJ P,PNTXY + OUTSTR[ASCIZ/ +/] + MOVEI T,1 + LSH T,@MODE + TDNN T,[1PNTM!1TXTM] + POPJ P, + PUSHJ P,GETCLS + POPJ P, + FETCH(T,A,PXY) + CAMN T,CURSE + POPJ P, + OUTSTR[ASCIZ/POINT /] + PUSHJ P,PNTXY + OUTSTR[ASCIZ/ +/] + POPJ P, + +PNTXY: HRLM T,(P) + HLRE T,T + PUSHJ P,MILOUT + OUTCHR[11] + HLRE T,(P) +MILOUT: SKIPGE T + OUTCHR["-"] + MOVM T,T + IDIVI T,=1000*2/5 + PUSH P,TT + PUSHJ P,DECOUT + POP P,T + OUTCHR["."] + IMULI T,5 + ASH T,-1 + CAIGE T,=100 + OUTCHR["0"] + CAIGE T,=10 + OUTCHR["0"] + JRST DECOUT +>;MPC + +;CHECK IF LOC IN T IS ON SCREEN, IF NOT GET IT ON. +;REGARDLESS, MOVE CURSOR THERE +CHKON: TLNE M,DSKACT!MACACT + JRST SETPOS + PUSHJ P,ONSCR + JRST PICSET + JRST SETPOS + +;BIG, SMALL, SHIFT SCREEN +MAKBIG: MOVEI T,1 + LSH T,@MODE + TDNE T,[ANYALT] + JRST PERRET + MOVE T,NSCALE ;GET CURRENT SCALE + XCT (A)[CAIA ;INCREMENT SIZE BY ONE + LSH T,-2 ;MULT BY 1,25 + LSH T,-1 ;MULT BY 1,5 + JFCL] ;MULT BY 2 + JUMPN T,.+2 + MOVEI T,1 + ADDM T,NSCALE +CHANG1: MOVE T,CURSE +CHANGE: PUSH P,T + PUSH P,TT + TRO MCHG ;WE ARE CHANGING IT + TLNN M,XWINDOW ;IF WINDOWING, CLOSEST MAY CHANGE + TRO NEEDCL + SETOM CLOSUP ;BIG LETTER WILL MOVE IN ANY CASE +MPC,< MOVE T,[%RIGHT4] > +MD,< MOVE T,[%RIGHT2] > + PUSHJ P,TRUNCP + ADD T,XOFF + HRLZM T,RIGHT +MPC,< MOVE T,[%TOP4] > +MD,< MOVE T,[%TOP2] > + PUSHJ P,TRUNCP + ADD T,YOFF + MOVEM T,TOP +MPC,< MOVE T,[%LEFT4] > +MD,< MOVE T,[%LEFT2] > + PUSHJ P,TRUNCN + ADD T,XOFF + HRLZM T,LEFT +MPC,< MOVE T,[%BOTTOM4] > +MD,< MOVE T,[%BOTTOM2] > + PUSHJ P,TRUNCN + ADD T,YOFF + MOVEM T,BOTTOM + POP P,TT + POP P,T + JRST SETPOS + +TRUNCP: PUSHJ P,TRUNCD + SKIPGE TT + SUBI T,2 + POPJ P, + +TRUNCN: PUSHJ P,TRUNCD + SKIPLE TT + ADDI T,2 + POPJ P, + +TRUNCD: MOVE TT,NSCALE +MPC,< IMUL TT,STPSIZ > + ASH TT,1 + IDIV T,TT +MPC,< IMUL T,STPSIZ > + ASH T,1 + POPJ P, + +MAKSML: MOVEI T,1 + LSH T,@MODE + TDNE T,[ANYALT] + JRST PERRET + MOVE T,NSCALE ;GET CURRENT SCALE + LSH T,2 + XCT (A)[SOS T,NSCALE ;DECREMENT BY 1 + IDIVI T,5 ;MULT BY 4/5 + IDIVI T,6 ;MULT BY 2/3 + ASH T,-3] ;MULT BY 1/2 + SKIPN T ;0? + MOVEI T,1 ;YES, MAKE 1 + MOVEM T,NSCALE + JRST CHANG1 + +MAKRIT: PUSHJ P,GETMAK + JRST PERRET +MPC,< TRNE M,FLIP + MOVN T,T +>;MPC + EXCH T,XOFF + SUBM T,XOFF + JRST CHANG1 + +MAKLFT: PUSHJ P,GETMAK + JRST PERRET +MPC,< TRNE M,FLIP + MOVN T,T +>;MPC + ADDM T,XOFF + JRST CHANG1 + +MAKDWN: PUSHJ P,GETMAK + JRST ALTDWN + ADDM T,YOFF + JRST CHANG1 + +MAKUP: PUSHJ P,GETMAK + JRST ALTUP + EXCH T,YOFF + SUBM T,YOFF + JRST CHANG1 + +GETMAK: MOVEI T,1 + LSH T,@MODE + TDNE T,[ANYALT] + JRST ALTMAK +MD,< MOVEI T,1 > +MPC,< MOVEI T,2 > + ASH T,11(A) + IDIV T,NSCALE + SKIPN T + MOVEI T,1 ;NEVER MOVE NONE +MPC,< ADD T,STPSIZ ;ROUND UP + SUBI T,1 + IDIV T,STPSIZ + IMUL T,STPSIZ + ASH T,1 +>;MPC + JRST CPOPJ1 + +ALTMAK: MOVEI T,1 + LSH T,(A) + POPJ P, + +ALTDWN: MOVN T,T ;DECREASE START LINE, (MOVE TEXT DOWN) +ALTUP: ADDM T,ALTLIN + SKIPGE ALTLIN + SETZM ALTLIN ;AVOID UNDERFLOW + SETOM LPNTR + TRO MCHG + POPJ P, + ;MODE SWITCHING + DEFINE MODC(A) +< MOVEI T,A + JRST CHNGMD> + +TOP3P: MODC(PNTM) +TOP3B: MODC(BODM) +TOP3L: MODC(LINM) +TOP3S: MODC(SETM) +TOP3T: MODC(TXTM) + +CMODE: CLRSET ;S + CLRPNT ;B + CLRPNT ;P + CPOPJ ;L + CLRPNT ;T + CPOPJ ;A + CPOPJ ;MA + CPOPJ ;SP +MD,< CLRPNT ;BT + CPOPJ ;BTA + CLRPNT ;E + CLREDI ;EI + CLRPNT ;ET + CLRPNT ;EP + CLRGET ;EG + CPOPJ ;EA +>;MD +REPEAT NUMODES+, + +;RESTORE MODE AFTER TCHNGM +RCHNGM: MOVE T,OMODE ;RESET TO OLD MODE +;PERMANENT MODE CHANGE +CHNGMD: MOVEM T,OMODE +;TEMPORARY MODE CHANGE, LEAVE OMODE A LAST CHNGMD +TCHNGM: CAMN T,MODE ;ARE WE REALLY CHANGING? + POPJ P, + TRO NEEDCL ;MUST CALL FNDCLS + EXCH T,MODE ;NEW MODE + JRST @CMODE(T) + +CLRSET: TRZE STBOX ;WERE WE DRAWING A BOX? + SKIPN B,SETBOX + JRST CLRPNT ;NO + PUSHJ P,PUTFS + MOVEI T,ANGLPG + PUSHJ P,HYDPOG + SETZM SETBOX + JRST CLRPNT + +MD,< +CLRGET: MOVEI T,ANGLPG + JRST HYDPOG + +CLREDI: SKIPN A,CRPPNT + JRST CLRPNT + MOVEI T,1 + AND T,1(A) + IOR T,CURSE + MOVEM T,1(A) +>;MD +CLRPNT: TRZ INLIN!INMOV + POPJ P, + ;SIXBIT, FILEUP +LSIXOUT: +IFN DECSW!IIISW,< HLRZ T,TT +LSIXOD: IDIVI T,10 + HRLM TT,(P) + JUMPE T,.+2 + PUSHJ P,LSIXOD + HLRZ T,(P) + ADDI T,60 + IDPB T,TTT + POPJ P, +>;IFN DECSW!IIISW +NODEC,< +NOIII,< + TLNN TT,777700 + LSH TT,14 + TLNN TT,770000 + LSH TT,6 +>;NOIII +>;NODEC +SIXOUT: JUMPE TT,CPOPJ + SETZ T, + LSHC T,6 + ADDI T,40 + IDPB T,TTT + JRST SIXOUT + +FILEUP: SKIPN ISDPY + POPJ P, + MOVEI T,1 + MOVEM T,NAMBUF + MOVE T,[NAMBUF,,NAMBUF+1] + BLT T,NAMBUF+NFWRDS-1 + SKIPN TT,LSTNAM +LAY,< SKIPE SAVNAM + CAIA +>;LAY + JRST NOLAST + MOVE TTT,[POINT 7,NAMBUF] +LAY,< JUMPE TT,NOFLST > + PUSHJ P,SIXOUT + MOVEI T,"." + IDPB T,TTT + HLLZ TT,LSTEXT + PUSHJ P,SIXOUT + MOVE TT,LSTPPN + PUSHJ P,UPPPN +LAY,< +NOFLST: SKIPN TT,SAVNAM + JRST NOLAST + MOVEI T,"&" + IDPB T,TTT + PUSHJ P,SIXOUT + MOVEI T,"." + IDPB T,TTT + HLLZ TT,LSTEXT + PUSHJ P,SIXOUT + MOVE TT,SAVPPN + PUSHJ P,UPPPN +>;LAY + JRST NOLAST + +UPPPN: MOVEI T,"[" + IDPB T,TTT +NOCMU,< + HRLM TT,(P) + HRRI TT,0 + PUSHJ P,LSIXOUT + MOVEI T,"," + IDPB T,TTT + HLLZ TT,(P) + PUSHJ P,LSIXOUT +>;NOCMU +CMU,< + MOVE T,[TT,,PPNBUF] + DECCMU T, + JRST [ PUSHJ P,LSIXOUT + JRST PPNDN2 ] + SKIPA TT,[POINT 7,PPNBUF] + IDPB T,TTT + ILDB T,TT + JUMPN T,.-2 +PPNDN2: +>;CMU + MOVEI T,"]" + IDPB T,TTT + POPJ P, diff --git a/src/draw/switch.6 b/src/draw/switch.6 new file mode 100644 index 00000000..03ef2340 --- /dev/null +++ b/src/draw/switch.6 @@ -0,0 +1,257 @@ +;;[FIRST] - assemble with D and BOARDS + +;DEFINE ALL CONDITIONAL ASSEMBLY - SET TITLE + +XALL  NOLIT + +DEFINE MWL, ;WE AREN'T THE WIRELISTER +DEFINE MDPC, ;WE ARE THE DRAWING PROG +DEFINE NIL, ;VESTIGIAL OR INCIPIENT CODE THAT NEEDS EDITING + +DEFINE SETSW $ (NAME,DEFVAL) +< IFNDEF NAME$SW, <> <0;> DEFVAL +> + NAME$SW__NAME$SW +> + +DEFINE ONOFSW $ (NAME,DEFVAL) +< SETSW(NAME,DEFVAL) + IFN NAME$SW,<NAME$SW__-1> ;MAKE IT NICE FOR  AND  +> +DEFINE DEFSW $ (NAME) +< DEFINE NAME, + DEFINE NO$NAME, +> +DEFINE MAKESW(NAME,VAL) +< ONOFSW(NAME,VAL) + DEFSW(NAME) +> + +MAKESW(STAN) +MAKESW(DEC) +MAKESW(CMU) +MAKESW(ITS) +MAKESW(III) +MAKESW(DBG) + +DEFINE STANFO, ;LONG FORM FOR HYSTERICAL RAISINS + +DEFINE CHECK $ (SITE,VAR) > +IFE STANSW!DECSW!CMUSW!ITSSW!IIISW,< +;IF NO SITE SET MANUALLY ABOVE, WE MUST DECIDE FOR OURSELVES WHERE WE ARE +CHECK(ITS,.IOT) CHECK(CMU,CMUDEC) CHECK(STAN,SPWBUT) DECSW__-1 +> + +;CONDITIONAL FOR STANDARD OR SPECIAL KEYBOARD +;STANDARD (SKEYSW=-1) IS REGULAR ASCII KEYBOARD WITH NO EXTRA BUTTONS +MAKESW(SKEY,IIISW!DECSW) + +DEFINE MOR (A) + +> +IFN TMPSW> + + + ;;Make selections from TTY + +DEFINE PC +DEFINE GT +PRINTS /GT40 SELECTED + TYPE TO GET + GTBIG LARGE SCREEN GT40 (SQUARE) +/> +DEFINE NOVIROS +DEFINE ROUTE +DEFINE NODLX +DEFINE PGP +DEFINE LIB +DEFINE TWO +DEFINE ONE +DEFINE DEBUG +NOIII,< ;III sets switches with CCL files +PRINTS / TYPE TO GET + PC PC PROGRAM + ROUTE RPH ROUTER + DEBUG DEBUGGING FEATURES (such as they are) +/ +DEC,< PRINTS / GT GT40 VERSION + NOVIROS NOT VIROS + NODLX NON-DL10 VERSION + PGP PGP VERSION +/> +STANFO,< PRINTS / LIB LIBRASCOPE LAYOUT VERSION + TWO TWO SEGMENT LAYOUT VERSION +/> +ITS,< PRINTS / ONE One segment layout version (also select D or PC) + END WITH ;^C +/>;ITS + +NOITS,< PRINTS / END WITH ;^Z +/>;NOITS + +.INSERT TTY: +>;NOIII + +DBG,;DBG + +DEFINE VERSION ' (PROG,VN) + +VERSUM__0 +VMAJOR__11 ;MAJOR VERSION # +VMINOR__0 ;MINOR VERSION LETTER +VGROUP__1 ;MODIFYING GROUP + +VERSION(FIRST,12) + ;;Define various Layout versions + +MAKESW(TWO) +MAKESW(ONE) +MAKESW(LIB) +MAKESW(LAY,LIBSW!TWOSW!ONESW) + +ONE, +TWO, +LIB, + +LAY,< +PASSNM__-1 ;INITIALIZE TO PASS1 +DEFINE PASS1 +DEFINE PASS2 +>;LAY + +comment  +;;Where to find stuff re. Layout version + +[SWITCH] + Select assembly mode + Define mode macros + TWO: Define PASS1, PASS2 +[FIRST] + TWO: Set D or PC from pass switch + TWO: Setup core allocation to high seg + Setup location counters for PURE, IMPURE +[SECOND] + Variables shared between D, PC + Swapped dispatch vector + Low core code + SAVE code +[LOWCOR] + Setup block structure for D, PC + Setup location counter + Dispatch vector into D or PC + Vars swapped with D or PC (see NAMES) +[COM] + Call layout initialization + Communication between sides + c-m-V + x-. +[SUB] + DOCORE - core allocation + + + +ONOFSW(PC,0) +DEFINE MD, +DEFINE MPC, + +MAKESW(BACK) ;BACKPANEL VERSION + +MAKESW(GT40) +DEFINE GT +DEFINE NOGT + +MAKESW(PGP) + +MAKESW(VB10,&<PGPSW>>) + +DEC,< +ENTRY TODDT +IFNDEF GTSMAL, ;FOR SMALL SCREEN GT40 +GTSMAL__GTSMAL + +MAKESW(VIROS,-1) ;ASSUME VIROS FOR NOW (WILL ALWAYS BE INSIDE DEC) + +MAKESW(DLX,GT40SW) ;ASSUME DL10 FOR NOW IF GT40 + +>;DEC + +MAKESW(VIROS) ;0 IF NOT DEFINED +MAKESW(DLX) ;0 IF NOT DEFINED + +MAKESW(WAG,-1) ;WAGNERS PC ROUTER STUFF + +MAKESW(UML,-1) ;ENABLE USE OF WDR FILES FOR FLASHING, ETC. + +MAKESW(PART,-1) ;WAGNER PARTITIONER + +MAKESW(SHORT,-1) ;FIND SHORTS + +MAKESW(ROUTE) ;RPH ROUTING STUFF + +SETSW(WW) ;ENABLES WIRE WRAP BOARD KNOWLEDGE +DEFSW(WW) ;CURRENT LEGAL VALUES ARE: + +MAKESW(RHG,0) ;SPECIAL HACKS FOR RHG (RICHARD H. GUMPERTZ AT CMU) + +MAKESW(CMUF,CMUSW!RHGSW) ;CMU FORMAT -- INDEPENDENT OF WHERE THE PROGRAM IS RUN + ;I.E. JUST THE STUFF CMU LIKES, NOT THAT IT NEEDS. + + ;TITLES + +IFNDEF BOARDS,< ;NO TITLE IF ASSEMBLING WITH BOARDS +IFN TWOSW!LIBSW,< + ROUTE,< + LIB,> + TWO,<TITLE TR + DEFINE %PNAME<SIXBIT/TR/>> + >;ROUTE + NOROUTE,< + LIB,<TITLE L + DEFINE %PNAME<SIXBIT/L/>> + TWO,<TITLE T + DEFINE %PNAME<SIXBIT/T/>> + >;NOROUTE +>;IFN TWOSW!LIBSW +IFE TWOSW!LIBSW,< + MD,< + NODEC,<TITLE D> + DEC,<VB10,<TITLE D VB10 VERSION> + GT,<TITLE D GT40 VERSION> + PGP,<TITLE D PGP VERSION> + >;DEC + DEFINE %PNAME<SIXBIT/D/> + >;MD + MPC,< + ROUTE,<TITLE RPC + DEFINE %PNAME<SIXBIT/RPC/>> + NOROUTE,<TITLE PC + DEFINE %PNAME<SIXBIT/PC/>> + >;MPC +>;IFE TWOSW!LIBSW +>;IFNDEF BOARDS diff --git a/src/wl/board0.9 b/src/wl/board0.9 new file mode 100644 index 00000000..d57048cc --- /dev/null +++ b/src/wl/board0.9 @@ -0,0 +1,21 @@ +;;The set of boards currently defined + +;;NOTE: The .insert's can't specify directory, because losing +;; FAIL doesn't reset the directory name when popping back +;; to the previous level of .INSERT. Therefore all files +;; have to on the same directory, perhaps as links. + +.insert BOARD1 + +.INSERT NCP13 +.insert UG61C +.insert DECLOC +.insert LG627 +.insert MPG21 +.insert MPG216 +.insert LG684 +;.insert LG411 +;.insert W940 + +.insert BOARD2 + diff --git a/src/wl/board1.555 b/src/wl/board1.555 new file mode 100644 index 00000000..b461362d --- /dev/null +++ b/src/wl/board1.555 @@ -0,0 +1,3181 @@ +;<WIRELIST>BOARD1.FAI.28, 20-NOV-75 11:26:44, EDIT BY HELLIWELL -*-Midas-*- + +MD,<DEFINE MDWL <IFE 0>> +MPC,<DEFINE MDWL <IFN 0>> +MWL,<DEFINE MDWL <IFE 0>> + +MWL,<DEFINE STORAGE(A)<>> + +MDPC,< VERSION(LOCS,4) > + +MDPC,< +NOLAY,< +INTERNAL MAPCON,MAPSOC,%%PINN,$$PINN +INTERNAL LCINIT,GETSLT,SLTOUT,GTSLTL,PRNLOC,PRNPIN +INTERNAL CPNMER,CPNSEP,CPNMAP,QUPIN,PINCUE,SLTCUE,BODCUE,CPCUE,PROTOB +INTERNAL BPINPN,PINPLS,RPNAM,CSLTLP,SLTLPN,LOCOUT +INTERNAL GETNOM,CLRNOM,SETNOM,FNDNOM,AVAIL +INTERNAL DEFNOM,LOCTVV,NOMTYP +INTERNAL N2L,L2N,LNAMES,PUTDEC,MAXN2L + +MD,< +INTERNAL DEFWW,CLRWW,FNDWW,SETWW,WWTYP,WNAMES +INTERNAL GETBRD,MAPOST,GTCONP,LOCFUK +INTERNAL APACK,PACKNM,CLRPAK,CMPPAK,MATPAK +>;MD +EXTERNAL CPOPJ,CPOPJ1,CPOPJ2,CPOPJ3,POPAJ +EXTERNAL TREADU,PUTFS,GTCHRX, LETTER, FORSOC, FUCKUP,NDIG +ITS,< EXTERNAL .TVOFF,TVMORE > +>;NOLAY +>;MDPC +MWL,< +INTERNAL MAPOST,MAPCON,MAPSOC,%%PINN,$$PINN +INTERNAL LCINIT,GETSLT,SLTOUT,PRNLOC,PRNPIN +INTERNAL CPNMER,CPNSEP,CPNMAP,QUPIN +INTERNAL PINCUE,SLTCUE +INTERNAL BPINPN,RPNAM,LOCOUT +INTERNAL GETNOM,CLRNOM,SETNOM,FNDNOM,AVAIL +INTERNAL DEFNOM,LOCTVV,NOMTYP +INTERNAL N2L,L2N,LNAMES,PUTDEC,MAXN2L + +INTERNAL GETLOC,RAYDIP,AUGDIP,CPARTP,SEQLOC,CONGIN,GTSLTT +INTERNAL WBDCUE,CBCUE +INTERNAL DEFWW,CLRWW,FNDWW,SETWW,WWTYP,WNAMES +INTERNAL GETBRD,MAPOST +INTERNAL APACK,PACKNM,MATPAK +INTERNAL PINMAP,PINBIT,BPNPIN,PRBCN,PRCNPN,LOCPNW +INTERNAL LOCPNC,PADPRT,WLOCOUT,LOCPNM,LOCPNP + +INTERNAL NROWS,NCOLS,NCLPRG,NRWPRP,DIPSLT,NPADS,PADLET +INTERNAL PADPIN,FRACTN,WRAPMG,POSTMG,NEXTR +INTERNAL MAPRC,WAGGND,ISWW,FGND,FPWR,RPNAMA +INTERNAL WWINIT,MAPPAD,DSTCLC,MAPIT,PAKSIZ,GNDCLR +INTERNAL GNDOUT,VCCOUT + +INTERNAL NPACK,PACKPN,PAKSIZ,MAKCPN,WIRGND,LNGRID +INTERNAL LOCPIN,DECOUT,NDECOU,TRPNAM + +EXTERNAL CPOPJ,CPOPJ1,CPOPJ2,CPOPJ3,POPAJ +EXTERNAL SLICEL,DECIN,TDECIN,TCOUNT,TFILL,TTFILL +EXTERNAL TREADU,PUTFS,GETCHR, FUCKUP,NDIG + +>;MWL + + +;GENERAL USE MACROS AND DEFINITIONS + +DEFINE CHECK(TAG,LENGTH)< +IFN .-TAG-LENGTH,<PRINTS /TAG LOSES +/> +>;CHECK + +DEFINE NOTYET(NAME) +<NAME OUTSTR [ASCIZ /NAME NOT IMPLEMENTED FOR THIS BOARD TYPE!! +/] + POPJ P, +> + +;CONCATINATION + DEFINE CAT $ (A,B) +< A$B +> + +;HERE WE DEFINE MACROS SO EACH BOARD AND NOMENCLATURE FILE DEFINES ITSELF + +DEFINE ALLWW +<0,<>> + +DEFINE ALLLOCS +<0,<>> + +DEFINE .ADD(MACRO,NAME,TABLE)<.ADD1(MACRO,\MACRO,NAME,TABLE)> +;NOTE!! THIS MACRO CAN'T BE IMBEDDED INSIDE BLOCK STRUCTURE, +; BECAUSE IT DOES REDEFINES + +DEFINE .ADD1(MACRO,DUMMY,BODY,NAME,TABLE) +< DEFINE MACRO +<DUMMY,<BODY + BRDNAM(NAME,TABLE)>>;MACRO +>;ADD1 + +DEFINE .DONE(MACRO)<.DONE1(MACRO,\MACRO)> + +DEFINE .DONE1(MACRO,DUMMY,BODY) +< DEFINE MACRO +<BODY +>;MACRO +>;DONE1 + SUBTTL OVERVIEW +COMMENT  + +THIS SOURCE FILE CONTAINS ALL ROUTINES WITH KNOWLEDGE OF +THE EXTERNAL (PRINTED) REPRESENTATION OF LOCATIONS. + +THE FOLLOWING ARE THE ONLY CONSTRAINTS ON PICKING LOCATION FORMATS + +1) A BOARD LOCATION (BAY/RACK/SLOT # FOR DEC PDP-10 LIKE STUFF) + IS 18 BITS (LH), NON-ZERO + +2) A DIP LOCATION IS 18 BITS (RH) + It used be that at least the low order 12 bits had to be + non-zero (THE WIRE LISTER USES A DIP LOCATION WITH THESE 12 + BITS ZERO AS A CONNECTOR BODY. THIS HACK ASSOCIATES + CONNECTOR PINS ON THE SAME PADDLE OR JACK) + Now the MAPCON bit in the LH is used to signify a connector pin + +3) A DIP PIN # IS 9 BITS, NON-ZERO. ($$PINN) + +4) A CONNECTOR PIN IS ACTUALLY REPRESENTED TWO WAYS: + 1) As a combined 18 bit quantity, representing + both the jack location and the pin within the + jack. + 2) In a 36 bit form similar to body pins, the connector + pin# in the LH. MAKCPN can be used to combine + the conn-jack-locn with the conn-pin# into + the 18 bit form + This is the standard form for most of the board specific + interfaces. + UMKCPN converts from 18 bit merged form to MAPCON+PINN#,,CPIN-LOC + Note: UMKCPN and MAKCPN call board routines CPNSEP, CPNMER. + Note: The RH of either the 36 or 18 bit format contains the LOC + information in the same form. I.E. CPNSEP of either RH + should yield the same LOC, but not necessarily the same + PIN# (probably 0). +MWL,< +**** PIN-SPEC format **** + A DIP pin is usually represented by a pair of words: +A: BITS+PIN#,,DIP-LOCATION +B: (PACKAGE CODE IF DIP PIN) + + where DIP-location format is determined by routines in nomenclature type + (E.G. MPG21 format is BYTE(3)<panel>(3)<group>(12)<slot> ) + +********************************** +>;MWL + +;BITS IN LH FOR PIN-SPEC +MAPCON__400000 ;THIS IS A CON (MUST BE SIGN BIT) +MAPGND__200000 ;THIS IS NOW A "G" PIN (for board routines) +MAPPWR__100000 ;THIS IS NOW A "V" PIN (for board routines) +CRDPIN__MAPGND!MAPPWR ;THIS IS A SPECIAL PIN ON THE CARD (for board routines) +MAPSOC__40000 ;THIS IS NOW A POST-LOC, HAS BEEN MAPPED ONTO BOARD +;777 ;PIN # FOR BODIES IN LEFT HALF +%%PINN__221100 +$$PINN__777 + +;KLUDGE!! - The format for V or G pins (on some boards) +; is pin# 0, with MAPPWR or MAPGND set. This is ignored +; outside the board routines themselves. + + SUBTTL ROUTINES WHICH ARE A FUNCTION OF THE BOARD TYPE +COMMENT  + +LCINIT BOARD INITIALIZATION +WWINIT WW INITIALIZE, IF NECESSARY + +GETSLT READS CARD SPEC (BAY/RACK/SLOT) +GTSLTT WL LIKE GETSLT, WITH CHARACTER ALREADY IN CHRREG +SLTOUT PRINTS CARD SPEC (BAY/RACK/SLOT) + +GTSLTL DPC READS B-R-S (IF SPECIFIED) AND DIP LOC SPEC (INTO DESTIN) +GETLOC WL READS DIP OR CONNECTOR JACK LOC +GTCONP D READS CARD SPEC (IF SPECIFIED) AND CONNECTOR PIN +LOCFUK D PATCHES UP OLD FORMAT NOMENCLATURE + +RAYDIP WL PRINTS DIP LOC FOR RAYTHEON OUTPUT (FORTRAN STYLE I8) +PRNLOC PRINTS SOCKET OR DIP LOC +PRNPIN PRINTS PIN# +MAPOST DWL CONVERTS FROM DIP-PIN-LOC INTO SOCKET PIN LOC (INCLUDING ADAPTOR MAPPING) +MAPIT WL CONVERTS POST INTO X,Y,BITS +PAKSIZ WL GIVES DIMENSIONS OF PHYSICAL DIP ON THE BOARD, FOR ERROR CHECKING +FPWR WW FIND PWR PIN +FGND WW FIND GND PIN + +CPNMER MERGE CONNECTOR PIN BODY LOC, WITH PIN # +CPNSEP SEPARATE CONNECTOR PIN BODY LOC, FROM PIN # +CPNMAP MAPS CPIN AND CARD-LOC INTO BACKPANEL PIN + +QUPIN CHECKS FOR WILD CONNECTOR BODIES +CONGIN WL GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS +SEQLOC WL CHECKS FOR SEQUENTIAL LOCATIONS +MAPRC WW MAP ROW,COLUMN INTO GENERATED BLOC +MAPPAD WW MAP NUMBERS IN T, TT, AND TTT INTO EDGE PIN NAME + +CPARTP WL PRINTS EDGE PIN TO PARTITION FILE AS NUMBER + +DSTCLC WW DISTANCE (CITY BLOCK, ...) + +GNDCLR WW ;THESE ARE RANDOM +WAGGND WW WAGNER GROUND PIN +GNDOUT WW PRINT GROUND PINS +VCCOUT WW PRINT POWER PINS + +PINCUE BODY PIN CUE +SLTCUE BODY SLOT CUE + +BODCUE DPC BODY LOC CUE +CPCUE DPC CONNECTOR PIN CUE +PROTOB DPC PROTOTYPE BODY CUE + +CBCUE WL WIRELISTER CONNECTOR BODY CUE +WBDCUE WL WIRELISTER BODY LOC CUE + +;ROUTINES NOW IN BOARD1 +BPINPN PRINTS BODY PIN # +PINPLS DPC PRINTS DIP PIN # (MAPPED BY PACKAGE NUMBER INTO SOCKET PIN) +RPNAM READS DEFAULT PIN NAME +CSLTLP DPC PRINTS CARD SPEC (IF SPECIFIED) AND CONNECTOR PIN +SLTLPN DPC PRINTS CARD SPEC FOLLOWED BY BODY LOC +LOCOUT PRINTS DIP LOC ON CARD, CHECKS FOR CONN BODIES + +BPNPIN WL PRINTS CONNECTOR PIN NAME AS SEEN FROM BACKPANEL +RPNAMA WL READS PIN ID, IF NUMBER FOLLOWS IMMEDIATELY +TRPNAM WL READS DEFAULT PIN ID, FLUSHING LEADING SPACES +WLOCOUT WL PRINTS WILD/FRONT/BACK CONNECTOR (IF SPECIFIED) AND DIP LOC +PINMAP WW MAP PIN-SPEC(A,B) INTO T=X,,Y + POSSIBLY RETURNS NEW PIN-TYPE-BITS IN TT + ALSO MAY RETURN DISTANCE TO END OF DIP IN TTT FOR + FORCED U FUDGING +PINBIT WW + + SUBTTL BOARD SPECIFIC TRANSFER VECTOR +;THIS IS THE TRANSFER VECTOR WHICH IS SETUP BY THE BOARD TYPE SETTING COMAND +;THERE IS A SIMILAR OBJECT IN WWC + +STORAGE(IMPURE) + +LOCSTV__. + +LCINIT: JRST NNOMEN +QUPIN: JRST NNOMEN +SLTOUT: JRST NNOMEN +GETSLT: JRST NNOMEN +PRNLOC: JRST NNOMEN +PRNPIN: JRST NNOMEN +CPNSEP: JRST NNOMEN +CPNMER: JRST NNOMEN +CPNMAP: JRST NNOMEN +MDWL,< +MAPOST: JRST CPOPJ1 ;CONVERT FROM DIP-LOC/PIN TO POST +>;MDWL +MDPC,< +GTSLTL: JRST NNOMEN +MD,< +GTCONP: JRST NNOMEN +LOCFUK: JRST NNOMEN +>;MD +>;MDPC + +MWL,< +GETLOC: JRST NNOMEN +RAYDIP: JRST NNOMEN +CPARTP: JRST NNOMEN +SEQLOC: JRST NNOMEN +CONGIN: JRST NNOMEN +GTSLTT: JRST NNOMEN +AUGDIP: JRST NNOMEN +>;MWL +LTVLNJ__.-LOCSTV ;LENGTH OF PART WITH JRST'S +SLTCUE: [0] ; CUE FOR BOARD SLOT +PINCUE: [0] ; CUE FOR BOARD PIN +MDPC,< +CPCUE: [0] ;CUE FOR CONNECTOR PIN +BODCUE: [0] ;CUE FOR BODY LOC +PROTOB: [ASCID /LOC/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< +WBDCUE: [0] +CBCUE: [0] +>;MWL + +LTVLEN__.-LOCSTV +LTVLEN__LTVLEN + +NOMTYP: ININOM ;INDEX INTO NOMENCLATURE TABLES +MDWL,< +WWTYP: INIWW ;INDEX INTO BOARD TABLES +>;MDWL + +FNDTMP: 0 ;FLAG USED IN BOARD NAME SEARCH +SMALL: 0 ;SMALLEST DISTANCE BETWEEN WW PINS + +STORAGE(PURE) + +NNOMEN: OUTSTR [ASCIZ /SORRY - NO NOMENCLATURE TYPE +/] + POPJ P, + +;TRANSFER VECTOR FOR UNSPECIFIED BOARD + +LNOBRD: REPEAT LTVLNJ +< JRST NNOMEN +> + REPEAT LTVLEN-LTVLNJ +< [0] +> +IFN 0,< ;THIS LOSES??? +MDPC,< ORG LNOBRD+PROTOB-LOCSTV + [ASCID /LOC/] +>;MDPC +>;IFN 0 + ORG LNOBRD+LTVLEN + + + + +SUBTTL L2N,N2L -- LETTER/NUMBER CONVERSION TABLES + +STORAGE(IMPURE) + +L2NLEN__200 ;LETTER/NUMBER CONVERSION TABLE LENGTHS +N2LLEN__200 + +;These tables are initialized from the board type. They +; specify which letters are legal, and what the code stored in +; the packed location word is for the letter. +; Note: This is typically used for both the slot and connector nomenclatures. + +L2N: BLOCK L2NLEN ;LEAVE CONTIGUOUS AND IN THIS ORDER +N2L: BLOCK N2LLEN +MAXN2L: 0 + +DEFINE L2N2L (I,J) < + ORG L2NSUB+"I" + MDPC,<J+>NNN +IFGE "I"-"A",< +IFLE "I"-"Z",< +;IF LETTER, SET LOWER CASE THE SAME + ORG L2NSUB+"I"+40 + MDPC,<J+>NNN +>> + ORG N2LSUB+NNN + "I" +NNN__NNN+1 +> +STORAGE(PURE) + SUBTTL PACKAGE ROUTINES + +MDWL,< +;Add strange package types at end, DIPMODE defaults the package type to +; the first package found with the right number of pins +;Board routines must also be updated to make package legal in PAKSIZ. +;NOTE!! - When adding new packages, probably you have to change LGLPAK tables +;in board types. + +;Fields are: +; # Pins in dip/sip +; Package I/O name +; K. name, if not just K.#pins +; table pointer,,routine to map pin into post + + +DEFINE PACKAGES +< PACK1(0,Null) + PACK1(2,2 Pin) + PACK1(4,4 Pin) + PACK1(6,6 Pin) + PACK1(8,8 Pin) + PACK1(10,10 Pin) + PACK1(12,12 Pin) + PACK1(14,14 Pin) + PACK1(16,16 Pin) + PACK1(18,18 Pin) + PACK1(20,20 Pin) + PACK1(22,22 Pin) + PACK1(24,24 Pin,,BDIP) ;.600 spacing + PACK1(28,28 Pin,,BDIP) + PACK1(36,36 Pin,,BDIP) + PACK1(40,40 Pin,,BDIP) + PACK1(48,48 Pin,,BDIP) + PACK1(64,64 Pin,,BDIP) + PACK1(8,<8 Pin SIP>,8SIP,SIP) + PACK1(10,<10 Pin SIP>,10SIP,SIP) + PACK1(22,<22 Pin 622-HG16 Augat adaptor>,622AUG,cpopj) + ;Adaptor for universal boards, which we don't have + PACK1(24,<24 Pin 624-HG16 Augat adaptor, pin 1 upper-right>,624AUG,<M.624A,,ADAPT>) + PACK1(24,<24 Pin 624-HG16 pin 1 lower-left>,624XUG,<M.624X,,ADAPT>) + PACK1(40,<40 Pin 640-HG16 Augat adaptor, pin 1 upper-left>,640AUG,<M.640A,,ADAPT>) +III,< PACK1(20,<S.GRAY 20 pin to .2" adaptor>,SGR1,cpopj) + PACK1(24,<S.GRAY 24 pin MUPAC adaptor>,SGR2,<M.SGR2,,ADAPT>) +; PACK1(24,<24 Pin in 2 vertical sockets>,24iii,<m.24iii,,adapt>) +>;III +;MIT uses home brew adaptors that are different from Augats +ITS,< PACK1(24,<24 Pin, MIT Adaptor>,24MIT,<MAP24,,ADAPT>) + PACK1(28,<28 Pin, MIT Adaptor>,28MIT,<MAP28,,ADAPT>) + PACK1(40,<40 Pin, MIT Adaptor>,40MIT,<MAP40,,ADAPT>) + PACK1(40,<New 40 Pin, MIT Adaptor>,40NIT,<MAN40,,ADAPT>) + PACK1(48,<48 Pin, MIT Adaptor>,48MIT,<MAP48,,ADAPT>) + PACK1(40,<PTTLDL, Vertical Pair Dips, .2" gap>,PTTLDL,<MAP2H,,ADAPT>) + PACK1(64,<64 Pin, 3x3 Adaptor>,64MIT,<MAP64,,ADAPT>) +>;ITS +> + +;Some additional information on adaptor packages.. +;1) minX,minY,maxX,maxY +; NOTE: Package dimensions are relative to where pin 1 of DIP is mapped to. +; as viewed from the DIP side, +Y is UP, +X is right +; The outline dimensions are the upper-left, lower right corners of the outline +;2) Equivalent # pins of dip adaptor (i.e. what size dip sockets it's made of) +;3) Horizontal size of dip adaptor (how many more slots it needs) +;4) Verical size of dip adaptor " + +DEFINE ADDSOME (LABEL) +< +;;14 pin DIP is slightly longer than rule?? +ORG LABEL+K.14  ADDIT(<-=40,=70,=340,-=670>) +;;Weird .400 spacing DIP +ORG LABEL+K.22  ADDIT(<-=40,=40,=440,-=1040>) + +ORG LABEL+K.622aug  ADDIT(<-=40,=40,=340,-=1140>,16) +ORG LABEL+K.624aug  ADDIT(<-=1340,=180,=180,-=580>,14,3,1) +ORG LABEL+K.624xug  ADDIT(<-=40,=680,=1380,-=180>,14,3,1) +ORG LABEL+K.640aug  ADDIT(<-=340,=340,=540,-=1740>,16,2,2) + +III,< +ORG LABEL+K.SGR1  ADDIT(<-=100,=40,=300,-=1140>,16) +ORG LABEL+K.SGR2  ADDIT(<-=340,=340,=440,-=940>,16) +;ORG LABEL+K.24III  ADDIT(<-=240,=340,=440,-=1440>,16,1,2) + +>;III + +ITS,< + ;PIN1 IS MAPPED TO 1ST SOCKET, PIN15 of 16 +ORG LABEL+K.24MIT  ADDIT(<-=1340,=100,=40,-=800>,16,2) +ORG LABEL+K.28MIT  ADDIT(<-=1340,=100,=40,-=800>,16,2) +ORG LABEL+K.40MIT  ADDIT(<-=1340,=100,=40,-=800>,16,3) +ORG LABEL+K.40NIT  ADDIT(<-=1340,=100,=40,-=800>,16,3) +ORG LABEL+K.48MIT  ADDIT(<-=1340,=100,=40,-=800>,16,4) + ;DIP POSITION IS GIVEN BY PIN 1 OF TOP SOCKET + ;PTTLDL'S FIRST PIN IS PIN4, TOP SOCKET +ORG LABEL+K.PTTLDL  ADDIT(<-=40,-=300,=340,-=1840>,20,0,1) + ;DIP'S FIRST PIN IS PIN1, 1ST SOCKET +ORG LABEL+K.64MIT  ADDIT(<-=140,=340,=1440,-=3340>,20,2,2) +>;ITS + +ORG LABEL+NPACK +> + + ;********* Package names ********* + +PACKNM: + +INDEX__0 + DEFINE PACK1 $ (PINS,NAME,SNAME) +< [ASCIZ \NAME\] + IFIDN <SNAME><><K.$PINS__INDEX;> K.$SNAME__INDEX + INDEX__INDEX+1 +> + + PACKAGES ;RECOGNITION NAME +NPACK__INDEX + + +;********* Package # of pins ********* + +PACKPN: + + DEFINE PACK1(PINS) +< =PINS +> + + PACKAGES ;# PINS IN PACKAGE +CHECK PACKPN,NPACK + + +;******** Package DIP to Socket mapper ********* +MAPDSP: + +DEFINE PACK1(PINS,NAME,SNAME,MAPPER) +<IFDIF <MAPPER><>< MAPPER;>DIP +> + PACKAGES +CHECK MAPDSP,NPACK + +;********* Package outline dimensions ********* +;From pin 1 of DIP/SIP, viewed from DIP side of board. +;Assume most DIP's will butt together without extra .1" gap +;This isn't true of 14 pin DIP's - they overhang about 70 mils, +; and it isn't true of some old 16 pin's. + +SIZES: + +DEFINE PACK1(PINS,NAME,SNAME,MAPPER) +<..TEM__. + IFIDN <MAPPER><><FOO(-=40,=40,=340,-<<=PINS/2-1>*=100+=40>)> + IFIDN <MAPPER><DIP><FOO(-=40,=40,=340,-<<=PINS/2-1>*=100+=40>)> + IFIDN <MAPPER><BDIP><FOO(-=40,=40,=640,-<<=PINS/2-1>*=100+=40>)> + IFIDN <MAPPER><SIP><FOO(-=40,=40,=40,-<<=PINS-1>*=100+=40>)> + IFE ..TEM-.,<0 +> +> + +DEFINE FOO(X1,Y1,X2,Y2) +< [X1,,Y1  X2,,Y2] +> + +DEFINE ADDIT (SIZE) +<IFDIF <SIZE><>< FOO(SIZE) > +> + + PACKAGES + ADDSOME(SIZES) +CHECK SIZES,NPACK + +;********* Package equivalent #PINS DIP size ********* + +ADAPSZ: + +DEFINE ADDIT(SIZE,EQV) +<IFDIF <EQV><>< =EQV/2> +> + + BLOCK NPACK + ADDSOME(ADAPSZ) +CHECK ADAPSZ,NPACK + +;********* Package horizontal DIP size ********* + +;The horizontal adder to get the far socket used +; (0 if single socket, + is right from DIP side) + +PAKWID: + +DEFINE ADDIT(SIZE,EQV,WIDTH) +<IFDIF <WIDTH><>< =WIDTH> +> + BLOCK NPACK + ADDSOME(PAKWID) +CHECK PAKWID,NPACK + +;********* Package vertical DIP size ********* + +; (0 if single socket, + is up from DIP side) + +PAKHGT: + +DEFINE ADDIT(SIZE,EQV,WIDTH,HEIGHT) +<IFDIF<HEIGHT><>< =HEIGHT> +> + BLOCK NPACK + ADDSOME(PAKHGT) +CHECK PAKHGT,NPACK + +;********* Package leg separation (assuming DIP) ********* + +DIPLEG: FOR I_1,NPACK + <=300 > + +DEFINE FOO(PAK,SPACING) +<ORG DIPLEG+PAK  =SPACING +> + + FOR I IN (K.22) + <FOO(I,400)> + + FOR I IN (K.24,K.28,K.36,K.40,K.48,K.64) + <FOO(I,600)> + +ORG DIPLEG+NPACK + + ;MATPAK - MATCH PACKAGE NAMES +;T = STRING +;RETURNS +;A = PACKAGE CODE (SKIPS) + +MATPAK: PUSH P,T + PUSH P,TT + MOVSI A,-NPACK +MATPA1: HRRZ TT,PACKNM(A) + MOVE T,-1(P) + PUSHJ P,MATONE + JRST [AOBJN A,MATPA1 ;NO MATCH + SETZ A, + JRST MATPOK] + JFCL ;NEAR MATCH + AOS -2(P) +MATPOK: HRRZS A + POP P,TT + POP P,T + POPJ P, + +;MATONE - MATCH STRINGS, IGNORING SPACES, PUNCTUATION +;T = STRING +;TT = ASCIZ +;RETURNS +; NO MATCH +; SUBSTRING MATCH +; EXACT MATCH + +MATONE: HRLI TT,440700 + HRLI T,440700 + AOS T + PUSH P,A + PUSH P,B +MATON1: PUSHJ P,SLRPT + MOVE B,A + PUSHJ P,SLRPTT + JUMPE B,[SKIPN A + AOS -2(P) ;EXACT MATCH + AOS -2(P) ;CLOSE MATCH + JRST MATOX] + CAMN A,B + JUMPN A,MATON1 +MATOX: POP P,B + POP P,A + POPJ P, + +SLRPT: TLNE T,760000 + JRST SLRPT1 + SETZ A, + HRR T,-1(T) + TRNN T,-1 + POPJ P, +SLRPT1: ILDB A,T +SLRPN: JUMPE A,CPOPJ + CAIL A,"a" + CAILE A,"z" + CAIA + SUBI A,"a"-"A" + CAIG A,40 + SOS (P) ;TRY AGAIN + CAIN A,"," + SOS (P) + POPJ P, + +SLRPTT: ILDB A,TT + JRST SLRPN + + + + +;CMPPAK, CLRPAK, APACK +;A = BODY (0 LH), TYPE (-1 LH) +;B = PROP BLOCK +;C = VALUE OF "PACKAGE" + +MD,< +CMPPAK: PUSH P,A + PUSH P,T + MOVE T,C + PUSHJ P,MATPAK + JRST CMPPA1 + AOS -2(P) + MOVE T,-1(P) + SKIPL T + STORE(A,T,BPAK) + SKIPGE T + STORE(A,T,TPAK) +CMPPA1: POP P,T + POP P,A + POPJ P, + +CLRPAK: SKIPL A + CLEAR(A,BPAK) + SKIPGE A + CLEAR(A,TPAK) + POPJ P, +>;MD + +APACK: MOVSI A,-NPACK +MDPC,< TVOFF > +APACKL: OUTSTR @PACKNM(A) + OUTSTR [ASCIZ / +/] + AOBJN A,APACKL +MDPC,< TVON > + POPJ P, +>;MDWL + + SUBTTL PROGRAM DEPENDENT IO CONTROL + +MWL,< + CHRREG__TTT + NUMREG__A + DEFINE DESTIN<SLICEL> + DEFINE GETCH < XCT GETCHR + JFCL +> + DEFINE GETNUM < PUSHJ P,DECIN + JFCL +> ;READ NUMBER INTO A, TTT RETURNS LAST CHAR + DEFINE TGETNUM < PUSHJ P,TDECIN + JFCL +> ;READ NUMBER, FIRST CHAR ALREADY IN TTT +>;MWL + +MDPC,< CHRREG__C + NUMREG__T + DEFINE DESTIN<LETTER> + +DEFINE GETCH < XCT GTCHRX +> + +DEFINE GETNUM < PUSHJ P,GETDEC +> + +DEFINE TGETNUM < PUSHJ P,TGETDC +> + +TGETDC: SETZ NUMREG, + JRST GTDEC2 + +GETDEC: SETZ NUMREG, +GTDEC1: GETCH +GTDEC2: CAIL CHRREG,"0" + CAILE CHRREG,"9" + POPJ P, + IMULI NUMREG,=10 + ADDI NUMREG,-"0"(CHRREG) + JRST GTDEC1 +>;MDPC + SUBTTL ROUTINES KNOWN TO THE OUTSIDE WORLD + +COMMENT  + +FNDWW FIND BOARD TYPE FOR WIRELISTER +FNDNOM FIND NOMENCLATURE TYPE +GETBRD SET BOARD TYPE FROM TTY +GETNOM SET NOMENCLATURE FROM TTY +CLRNOM CLEAR NOMEN +SETNOM SETUP TRANSFER VECTORS AND CONVERSION TABLES +AVAIL LIST AVAILABLE NOMENCLATURES + + +; ROUTINES TO SET UP THE BOARD TYPE + +;TAKES POINTER TO STRING IN FREE STORAGE IN B +;XWD -LENGTH,NAME TABLE IN C + +MDWL,< +FNDWW: SKIPA C,[XWD -NWW,WNAMES] +>;MDWL +FNDNOM: MOVE C,[XWD -NLOCS,LNAMES] + PUSH P,B + SETOM FNDTMP ;CLEAR PARTIAL MATCH STORAGE + JUMPGE C,FNDBR8 ;IN CASE OF EMPTY TABLE +FNDBR1: MOVE T,(C) ;GET BYTE POINTER + MOVE B,(P) ;AND POINTER TO STRING + ADD B,[POINT 7,1] +FNDBR2: ILDB TT,T ;NEXT CHAR OF BOARD NAME + TLNE B,760000 ;END OF WORD? + JRST FNDBR3 ;NO + HRR B,-1(B) + TRNN B,-1 + JRST FNDBR4 ;END OF SOURCE STRING +FNDBR3: ILDB TTT,B ;NEXT CHAR OF SOURCE STRING + JUMPE TTT,FNDBR4 ;END OF SOURCE STRING? + CAMN TTT,TT ;STILL MATCH? + JRST FNDBR2 ;YES, CONTINUE +FNDBR5: AOBJN C,FNDBR1 ;NO, TRY NEXT BOARD +FNDBR8: HRRE C,FNDTMP + SKIPL C +FNDBR7: AOS -1(P) +FNDBR6: POP P,B + POPJ P, + +FNDBR4: JUMPE TT,[HRRZ C,C + JRST FNDBR7] ;EXACT MATCH + SKIPL FNDTMP ;PREVIOUS PARTIAL MATCH? + JRST [ SETOM FNDTMP + HRRZS FNDTMP ;FLAG MULTIPLE PARTIAL MATCHES + JRST FNDBR5] ;TRY FOR EXACT MATCH + HRRZM C,FNDTMP + JRST FNDBR5 + + ;GETS BOARD NAME FROM TTY, LOOKS IT UP, AND SETS IT UP + +MDWL,< +GETBRD: +MDPC,< TLNN M,DSKACT!MACACT > + OUTSTR [ASCIZ /BOARD TYPE?/] + PUSHJ P,TREADU ;DOES CASE CONVERSION + POPJ P, ;ALTMODE +MDPC,< JRST [ MOVE B,WWTYP ;NULL + OUTSTR @WNAMES(B) + POPJ P,] +>;MDPC +MWL,< POPJ P, > + PUSHJ P,FNDWW ;FIND THAT BOARD TYPE + JRST [ PUSHJ P,PUTFS + OUTSTR [ASCIZ /BOARD NOT FOUND +/] + POPJ P,] + PUSHJ P,PUTFS + MOVEI C,-WNAMES(C) + HRRZM C,WWTYP +MDPC,< TLNN M,DSKACT!MACACT > + OUTSTR @WNAMES(C) ;TYPE THE BOARD NAME FOR THE PEOPLE + OUTSTR[ASCIZ/ +/] + PUSHJ P,SETWW ;INITIALIZE W/W STUFF +;Now try to default the Nomenclature from the board type + MOVSI B,-NLOCS +GETBR1: HRRZ C,WWTYP + HRRZ C,WNAMES(C) ;PTR TO BOARD NAME + HRRZ D,LNAMES(B) ;THIS NOMEN THE SAME? +GETBR2: MOVE T,(C) + MOVE TT,(D) + CAME T,TT + JRST [ AOBJN B,GETBR1 + POPJ P,] + TRNE T,376 ;END OF ASCII? + AOJA C,[AOJA D,GETBR2] + HRRZM B,NOMTYP + JRST SETNOM + +>;MDWL + +GETNOM: +MDPC,< TLNN M,DSKACT!MACACT > + OUTSTR [ASCIZ /NOMENCLATURE TYPE?/] + PUSHJ P,TREADU ;DOES CASE CONVERSION + POPJ P, ;ALTMODE +MDPC,< JRST [ MOVE B,NOMTYP ;NULL + OUTSTR @LNAMES(B) + POPJ P,] +>;MDPC +MWL,< POPJ P, > + PUSHJ P,FNDNOM ;FIND THAT BOARD TYPE + JRST [ PUSHJ P,PUTFS + OUTSTR [ASCIZ /NOMENCLATURE NOT FOUND +/] + POPJ P,] + PUSHJ P,PUTFS + MOVEI C,-LNAMES(C) + HRRZM C,NOMTYP +MDPC,< TLNN M,DSKACT!MACACT > + OUTSTR @LNAMES(C) ;TYPE THE BOARD NAME FOR THE PEOPLE +MWL,< OUTSTR[ASCIZ/ +/] +>;MWL + JRST SETNOM + + + + + + +;GIVEN THE BOARD TYPE IN NOMTYP, SETS UP TRANSFER VECTORS AND CONVERSION TABLES + +CLRNOM: MOVE B,[ININOM] + MOVEM B,NOMTYP +SETNOM: MOVE B,NOMTYP + HRL C,LOCTVV(B) ;SET UP LOCS TRANSFER VECTOR + HRRI C,LOCSTV + BLT C,LOCSTV+LTVLEN-1 + SKIPL NOMTYP ;NO SPECIFIC BOARD? + PUSHJ P,LCINIT ;SET UP LETTER/NUMBER CONVERSION TABLES + POPJ P, + +MDWL,< +CLRWW: MOVE B,[INIWW] + MOVEM B,WWTYP +SETWW: +MWL,< MOVE B,WWTYP + HRL C,WWCTVV(B) ;SET UP WWC TRANSFER VECTOR + HRRI C,WWCTV + BLT C,WWCTV+WTVLEN-1 + SKIPN ISWW ;ONLY WIRE WRAP BOARDS HAVE WWINIT + POPJ P, + MOVEI T,=1000 + IDIV T,FRACTN ;CALCULATE SMALLEST POSSIBLE DISTANCE BETWEEN WW PINS + MOVEM T,SMALL + PUSHJ P,WWINIT ;WIRE WRAP INITIALIZATION +>;MWL + POPJ P, +>;MDWL + +AVAIL: MOVSI A,-NLOCS +MDPC,< TVOFF > + OUTSTR [ASCIZ /NOMENCLATURE TYPES: +/] +AVAIL1: OUTSTR @LNAMES(A) + OUTSTR [ASCIZ / +/] + AOBJN A,AVAIL1 +MDWL,< MOVSI A,-NWW + JUMPGE A,CPOPJ ;DONE IF NO BOARDS + OUTSTR [ASCIZ / + +BOARD TYPES: +/] +AVAIL2: OUTSTR @WNAMES(A) + OUTSTR [ASCIZ / +/] + AOBJN A,AVAIL2 +>;MDWL +MDPC,< TVON > + POPJ P, + + + + +SUBTTL PUTDEC,NPUTDEC -- DECIMAL OUTPUT ROUTINES + +MWL,<DECOUT:> +PUTDEC: SETZM NDIG +MWL,<NDECOUT:> +NPUTDEC:SKIPGE T + PUTBYT "-" + MOVM T,T +PUTDC1: IDIVI T,=10 + HRLM TT,(P) + SOSG NDIG + JUMPE T,.+2 + PUSHJ P,PUTDC1 + HLRZ TT,(P) + PUTBYT "0"(TT) + POPJ P, + + + SUBTTL WIRE WRAP BOARD ROUTINES + +MWL,< + +DEFINE SETPAD(NPADS) +< IFL MAXPAD-<NPADS>,<PRINTS /MAXPAD NOT LARGE ENOUGH. +/> + NPADS +> + +DEFINE CHECK(TAG,LENGTH)< +IFN .-TAG-LENGTH,<PRINTS /TAG LOSES +/> +>;CHECK + +WIRGND: -1 ;DEFAULT WIRE GROUNDS FOR DEC BOARDS +LNGRID: 0 ;-1 ENABLES LETTER NUMBER GRID + +WWCTV: + +ISWW: 0 ;FLAGS IF WIRE WRAP OR PC BOARD +WWINIT: JRST NBOARD ;THE WIRE WRAP TRANSFER VECTOR +MAPRC: JRST NBOARD ;MAP ROW/COLS INTO GENERATED LOCS +MAPPAD: JRST NBOARD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS +DSTCLC: JRST NBOARD ;DISTANCE CALC ROUTINE +FPWR: JRST NBOARD ;FIND A POST WITH POWER +FGND: JRST NBOARD ;FIND A POST WITH GND +MAPIT: JRST NBOARD ;CONVERT POST INTO X,Y,BITS +PAKSIZ: JRST NBOARD ;FIND DIMENSION OF DIP OUTLINE +GNDCLR: JRST NBOARD ;? +WAGGND: JRST NBOARD ;? +GNDOUT: JRST NBOARD ;? +VCCOUT: JRST NBOARD ;? + NWBLEN__.-WWINIT +NROWS: 0 ;# OF ROWS FOR UML +NCOLS: 0 ;NO OF COLS " +NCLPRG: 0 ;NO COLS PER GROUP ", # UMLCOLS TO PRINT AT ONCE +NRWPRP: 0 ;NO ROWS PER PAGE (0 IS DEFAULT MAX) +DIPSLT: 0 ;TOTAL # OF DIPS TO PRINT UML +NPADS: 0 ;NO OF PADDLES (UML) +PADLET: 0 ;NO OF LETTERS PER PADDLE (UML) +PADPIN: 0 ;NO OF PINS PER LETTER (UML) +FRACTN: 0 ;WIRE LENGTH FRACTION +WRAPMG: 0 ;ADDITIONAL WIRE LENGTH FOR INSULATION AROUND POST +POSTMG: 0 ;ADDITIONAL WIRE LENGTH FOR BARE WIRE AROUND POST +NEXTR: 0 ;CLEARANCE BETWEEN PINS IN ADJACENT SOCKET ROWS + NW0LEN__.-WWINIT-NWBLEN +WTVLEN__.-WWCTV +WTVLEN__WTVLEN + +WNOBRD: 0 + REPEAT NWBLEN +< JRST NBOARD +> + REPEAT NW0LEN +< 0 +> + CHECK(WNOBRD,WTVLEN) + +NBOARD: OUTSTR [ASCIZ /SORRY - NO BOARD TYPE +/] + POPJ P, + + + + +SUBTTL SOME HANDY BYTE POINTERS, SQRT, NUMPNT + +DEFINE LOW12<[POINT 12,A,35]> ;LOW ORDER 12 BITS OF A +DEFINE B6AT23<[POINT 6,A,23]> +DEFINE B6AT17<[POINT 6,A,17]> +DEFINE B6AT29<[POINT 6,A,29]> + +SQRT: JFFO T,.+2 ;GET LOC OF FIRST BIT + POPJ P, + MOVNI TTT,(TT) + ADDI TTT,=35 + ASH TTT,-1 + MOVEI TT,1 + ASH TT,(TTT) + MOVEI TTT,=3 ;3 ITERATIONS FOR NOW +SQRTLP: MOVE TTTT,TT + IDIVM T,TTTT + ADD TT,TTTT + ASH TT,-1 + SOJG TTT,SQRTLP + MOVE T,TT + POPJ P, + +NUMPNT: IDIVI T,=10 + ADDI TT,60 + JUMPE T,.+3 + ADDI T,60 + OUTCHR T + OUTCHR TT + POPJ P, + SUBTTL DISTANCE CALCULATOR FOR ROUTER STUFF +;CALLS WITH ONE PIN IN A OTHER IN C RETURNS DISTANCE IN G + +;CITY BLOCK DISTANCE FOR W940 STUFF + +DISTCB:PUSHJ P,PINMAP ;MAP ONE OF THEM + JRST DSTERR + HRLM A,(P) + MOVE A,C ;MOVE IN OTHER POINT + MOVE C,T ;SAVE X,Y + MOVE D,TTT ;AND DIST + PUSHJ P,PINMAP + JRST DSTERR + CAMLE TTT,D + SKIPA G,D + MOVE G,TTT + ASH G,1 ;DOUBLE IT (MUST GO TO END AND BACK!) + HLRE TT,T + HLRE TTT,C + SUB TT,TTT + MOVM TT,TT + HRRE T,T + HRRE C,C + SUB T,C + MOVM T,T ;THIS IS Y PART + JUMPE G,DSTCLX + CAMG T,NEXTR ;OR IF PINS ARE ALONG A ROW BORDER + JRST DSTCLX ;THEN END-AROUND FUDGE ISN'T NEEDED +;This is completely random, only works for DEC NOMEN. + SKIPE LNGRID ;WE HAVE TO DO EAF DIFFERENTLY IF LNGRID IS TRUE + JRST [ LDB C,[POINT 6,(P),5] ;GET ONE COLUMN LETTER + LDB D,[POINT 6,A,23] ;GET OTHER COLUMN LETTER + CAMN C,D ;SAME COLUMN? + ADD T,G ;YES, FUDGE + JRST DSTCLX] + LDB C,[POINT 12,(P),17] + LDB D,[POINT 12,A,35] + SUB C,D + IDIV C,NCOLS + JUMPN D,DSTCLX ;IF REMAINDER, THEN DIF COLUMNS, AND NO FUDGE + ADD T,G ;SAME COLUMN, BUT NOT CLOSE ENOUGH, FUDGE AROUND END OF DIP +DSTCLX: ADD T,TT ;ADD IN X PART + CAIN T,0 ;0 LENGTH RUN? + JRST DSTERR ;THEN DON'T ADD MARGINS + CAILE T,=8000 ;LONGER THAN 8 INCHES? + ADDI T,=250 ;YES, ADD 1/4 INCH + CAME T,SMALL ;DON'T ADD WRAPMG IF PINS ARE ADJACENT + ADD T,WRAPMG ;INSULATED WIRE TO WRAP AROUND POST + ADD T,POSTMG ;BARE WIRE TO WRAP AROUND POST + IDIV T,SMALL ;MODULO SMALLEST POSSIBLE SPACING +ITS,< ASH TT,1 + CAML TT,SMALL +>;ITS +NOITS,< SKIPE TT > + ADDI T,1 ;YES, ADD 1 + MOVE G,T + POPJ P, + +DSTERR: SETZ G, + POPJ P, + +;CALCULATE POINT TO POINT DISTANCE + +DISTPP: + PUSHJ P,PINMAP ;MAP ONE OF THEM + JRST DSTERR + MOVE A,C ;GET OTHER POINT + MOVE C,T ;SAVE X,Y + PUSHJ P,PINMAP + JRST DSTERR + HLRE TT,T + HLRE TTT,C + SUB TT,TTT ;GET VERTICAL DISTANCE + IMUL TT,TT ;SQUARE IT + HRRE T,T + HRRE C,C + SUB T,C ;HORIZONTAL DISTANCE + IMUL T,T ;SQUARE IT + ADD T,TT + JUMPE T,DSTIS0 ;DON'T WASTE TIME ON 0 LENGH RUNS + PUSHJ P,SQRT ;SQUARE ROOT = HYPOTENEUSE (?SP?) + CAILE T,=8000 ;LONGER THAN 8 INCHES? + ADDI T,=250 ;YES, ADD 1/4 INCH +NOSTAN,<CAME T,SMALL + ADD T,WRAPMG ;ADD SOME TO GO AROUND THE PINS + ADD T,POSTMG ;ADD 1.5" FOR WRAPPING AROUND POSTS +>;NOSTAN +STANFO,< ;QUANTIZE FOR PRECUT WIRES + CAMN T,SMALL ;ADJACENT PINS? + JRST [ ADD T,POSTMG ;YES, ADD BARD WRAP ONLY + JRST DSTIS1 ] + ADD T,POSTMG + ADD T,WRAPMG + MOVEI TTT,=500 ;SET TTT TO INCREMENT FOR WIRRES FROM 3 TO 8 INCHES + CAILE T,=8000 ;OVER 8" ? + MOVEI TTT,=1000 ;YES, SET TTT TO INCREMENT FOR WIRES OVER 8 INCHES + IDIV T,TTT + SKIPE TT + ADDI T,1 + IMUL T,TTT ;ROUND UP TO APPROPRIATE INCREMENT +DSTIS1: +>;STANFO + IDIV T,SMALL ;MODULO SMALLEST POSSIBLE DISTANCE BETWEEN PINS + SKIPE TT ;REMAINDER? + ADDI T,1 ;YES, ROUND UP +DSTIS0: MOVE G,T + POPJ P, + SUBTTL SPECIAL DEC ROUTINES FOR WIRELISTER + +DEFINE CHKBRD +< SKIPGE NOMTYP + JRST NBOARD +> + +DEC,< +;PRINTS LOCATION AND PIN # FOR TAPR-8 OUTPUT +;NUMBER OF PIN ON DIP IN T +;BODY BITS IN TT +;LOCATION (DIP,,PIN) IN A +TP8LOC: CHKBRD + TRNE TT,CBODY ;CONNECTOR? + JRST TP8CON ;YES + LDB TT,[POINT 6,A,5] + MOVE TT,N2L(TT) ;GET LOC LETTER IN CASE NON-STANDARD + CAIN T,=14 + MOVEI TT,"E" ;STANDARD FOR 14 PIN + CAIN T,=16 + MOVEI TT,"F" ;16 PIN + CAIN T,=24 + MOVEI TT,"G" ;24 PIN + PUTBYT (TT) + LDB T,[POINT 12,A,17] + CAILE T,=99 + JRST TP8ERR + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + HRRZ T,A + CAILE T,=99 + JRST TP8ERR + MOVEI TT,2 + MOVEM TT,NDIG + JRST NPUTDEC + +TP8CON: LDB T,[POINT 6,A,5] + PUTBYT @N2L(T) + LDB T,[POINT 6,A,29] + PUTBYT @N2L(T) + MOVEI T,2 + MOVEM T,NDIG + LDB T,[POINT 6,A,35] + JRST NPUTDEC + +TP8ERR: OUTSTR[ASCIZ\ILLEGAL DIP AND/OR PIN # +\] + POPJ P, + +;PRINT PIN NUMBER FOR CS FILE +NETPIN: MOVE T,A + JRST DECOUT + +;PRINT BP PIN FOR CS +PRCSBP: LDB T,[POINT 5,A,26] + LDB TT,[POINT 6,A,5] + ADDI T,-1(TT) + PUTBYT @N2L(T) + LDB T,[POINT 6,A,35] + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NDECOUT + PUTBYT 40 + LDB T,[POINT 6,A,17] + SUBI T,1 + IMULI T,=18 + LDB TT,[POINT 6,A,11] + ADD T,TT + MOVEI TT,2 + MOVEM TT,NDIG + JRST NDECOUT + +;PRINT PIN NUMBER FOR REDAC +RDCBPN: CHKBRD + HLRZ T,A + JRST DECOUT + +;PRINT PIN(A-V) AS NUMBER FOR REDAC +RDCCPN: CHKBRD + LDB T,[POINT 6,A,11] + HLRZ TT,B + CAILE TT,3 + SETZ TT, + ADD T,(TT)[ 0 ;CASE 0 (??) + 0 ;CASE 1 (1-18) + =18 ;CASE 2 (19-36) + 2*=18] ;CASE 3 (37-54) + JRST DECOUT + +;PRINT PADDLE ("U") AND NUMBER FOR WILD PIN +RDCUCN: CHKBRD + LDB T,[POINT 5,A,23] + PUTBYT @N2L(T) + LDB T,[POINT 11,A,17] + JRST DECOUT + +;PRINT CONNECTOR PADDLE AND SIDE +RDCCPD: CHKBRD + LDB T,[POINT 5,A,23] + PUTBYT @N2L(T) + LDB T,[POINT 6,A,17] + JRST DECOUT + +;PRINT NUMBER FOR CONNECTOR IN A FOR SR FILE +SRCPNM: CHKBRD + LDB T,[POINT 6,A,23] + SUBI T,1 + TLNN A,4000 ;WILD PIN? + CAILE T,5 ;OR ILLEGAL PADDLE? + JRST SRCPER + LDB TT,[POINT 6,A,17] + CAIL TT,1 + CAILE TT,2 + JRST SRCPER + SUBI TT,1 + LDB TTT,[POINT 5,A,11] + SUBI TTT,1 + TRNE TT,1 ;SIDE 2? + TRO TTT,40 ;YES, LOOK THERE + SKIPGE SRPTAB(TTT) + JRST SRCPER + IMULI T,=33 + ADD T,SRPTAB(TTT) + JRST PUTDEC + +SRPTAB: +FOR I_4,=18 +< I ;A1-S1 +> + -1 ;T1 +FOR I_=19,=20 +< I ;U1-V1 +> +REPEAT 40-<.-SRPTAB>,<-1> + -1 ;A2 + =21 ;B2 + -1 ;C2 +FOR I_=22,=36 ;D2-V2 +< I +> +REPEAT 100-<.-SRPTAB>,<-1> + +SRCPER: PUTSTR[ASCIZ/***/] + POPJ P, + + ;GENERATE U PINS +;CALL WITH C(A) POINTER TO LAST PIN GENERATED +UGIN: CHKBRD + TRNE A,OUTLD + JRST [ MOVEI A,UGINP2 + JRST UGIN1] + TRNE A,TERM + JRST [ MOVEI A,UGINP3 + JRST UGIN1] + MOVEI A,UGINP1 +UGIN1: SKIPGE (A) + POPJ P, ;RAN OUT + PUSH P,T + HLRZ T,(A) + ADDI T,1 + CAMLE T,1(A) ;OVERFLOW? + JRST UGINER + HRLM T,(A) + POP P,T + MOVE A,(A) + JRST CPOPJ1 + +UGINER: POP P,T + SETOM (A) + OUTSTR[ASCIZ/RAN OUT OF GENERATED "U" PINS IN THE RANGE /] + OUTSTR 2(A) + OUTSTR[ASCIZ/. +NO MORE PINS WILL BE GENERATED IN THIS RANGE. +/] + POPJ P, + +UGINSET:CHKBRD + HRRZ T,L2N+"U" + LSH T,14 + HRLI T,4000+0 + MOVEM T,UGINP1 + HRLI T,4000+=199 + MOVEM T,UGINP2 + HRLI T,4000+=399 + MOVEM T,UGINP3 + POPJ P, + +UGINP1: 0 + 4000+=199 + ASCIZ/U100-U199/ + +UGINP2: 0 + 4000+=399 + ASCIZ/U200-U399/ + +UGINP3: 0 + 4000+=599 + ASCIZ/U400-U599/ +>;DEC +>;MWL + SUBTTL UTILITY SUBRS + +;CHKLET - ALPHA-LETTER-P +;CHECK TO MAKE SURE CHRREG IS A LETTER (CONVERTS LOWER CASE) + +CHKLET:CAIL CHRREG,"a" ;CHECK FOR LOWER CASE + CAILE CHRREG,"z" + CAIA ;NOT LOWER CASE + SUBI CHRREG,<"a"-"A"> ;CONVERT TO UPPER CASE + CAIL CHRREG,"A" + CAILE CHRREG,"Z" + POPJ P, + JRST CPOPJ1 ;ITS LEGAL + +TWOLET:ROT CHRREG,-7*2 ;MAKE IT ASCII + MOVSI NUMREG,-TWOLEN +TWOLT1: CAME CHRREG,TWOTAB(NUMREG) + AOBJN NUMREG,TWOLT1 + JUMPGE NUMREG,CPOPJ + MOVEI NUMREG,40(NUMREG) + JRST CPOPJ1 + +TWOTAB: ASCII/BT/ + ASCII/CB/ + ASCII/CR/ + ASCII/DL/ + ASCII/FC/ + ASCII/TP/ +REPEAT 40-<.-TWOTAB>,<ASCII/??/> +TWOLEN__.-TWOTAB + +;UMKCPN - CONVERT FROM 18 BIT FORM CPIN-LOC TO STANDARD PIN SPEC +;A = ,,CPIN-LOC(18 BIT FORM) +;RETURNS +;A = MAPCON+PINN,,CPIN-LOC + +UMKCPN: MOVE T,A + PUSHJ P,CPNSEP + MOVE A,T + HRL A,TT + TLO A,MAPCON + POPJ P, + +;MAKCPN - Convert from 36 bit CPIN#,,LOC into 18 bit MAPCON,,CPIN-LOC +;A = PIN#,,LOC +;RETURNS +;A = MAPCON,,CPIN-LOC +MAKCPN: HLRZ TT,A + HRRZ T,A + PUSHJ P,CPNMER + MOVE A,T + HRLI A,MAPCON + POPJ P, + +;LNPARSE - KLUDGEY LETTER-NUMBER READER FOR SLOT INPUT +;A = SYNTAX LIST (ASCIZ STRINGS) +;REREAD = FLAG AND CHR ALREADY READ +;SKIPS IF SOME MATCH FOUND +; - FAILS +; - NULL INPUT OR (TEXISTS CHAR IF LAY) +; - OK +;A = # OF ASCIZ THAT MATCHED (0 first, 1 etc.) +;ARGLST = SERIES OF NUMBER VALUES, OR CONVERTED LETTERS +;ARGS RETURNED IN ARG1,ARG2,ARG3,... +;MEANING OF CHARACTERS IN ASCIZ: +; # - Number matches here (ARG) +; L - Some legal letter ok here (L2N  ARG) +; <chr> This character exactly (Returned as ARG!) +; . - Return this as success, even if input string isn't ended. +;In the case of multiple matches, the first ASCIZ in the list that +; matches will take precedence. + +LNPARS:SETZM REREAD +LNPART:PUSH P,B + SETZ B, + SETZ TT, +LNPAR1: SKIPN T,(A) ;SETUP BYTE POINTERS TO SYNS + JRST [ HLLZS A + MOVNS A + HLLZM A,LNARP + JRST LNPARL] + CAIL TT,NSYNS + JRST LNPARZ + HRLI T,440700 + MOVEM T,LNPTR(TT) + AOS TT + AOBJP A,LNPAR1 + +; Main loop, first check to see if any string immediately succeeds +LNPARL: CAIL B,NARGS + JRST LNPARZ + HLLZ A,LNARP +LNPRL2: ILDB T,LNPTR(A) + CAIN T,"." + JRST LNPARX + AOBJN A,LNPRL2 +; Now check numbers + SKIPE CHRREG,REREAD + JRST [ TGETNUM + JRST LNPRL1] + GETNUM +LNPRL1: JUMPE NUMREG,LNPAR2 + MOVEM NUMREG,ARGLST(B) + AOS B + HLLZ A,LNARP ;(A MIGHT BE NUMREG) +LNPAR3: LDB T,LNPTR(A) + CAIE T,"#" + SETZM LNPTR(A) + AOBJN A,LNPAR3 + CAIL B,NARGS + JRST LNPARZ + HLLZ A,LNARP +LNPRL3: ILDB T,LNPTR(A) + CAIN T,"." + JRST LNPARX + AOBJN A,LNPRL3 +; Check SYN for the letter +LNPAR2: HLLZ A,LNARP + PUSHJ P,CHKLET ;A LEGAL LETTER? + JRST LNPAR4 + SKIPG T,L2N(CHRREG) + JRST LNPAR4 + MOVEM T,ARGLST(B) +LNPAR5: LDB TT,LNPTR(A) ;ANYBODY LOOKING FOR THIS LETTER, OR ANY LETTER? + CAIN TT,"L" + JRST LNPAR6 + MOVE TT,L2N(TT) + CAME TT,T + SETZM LNPTR(A) +LNPAR6: AOBJN A,LNPAR5 + AOJA B,LNPARL + +LNPAR4: CAIL CHRREG,40 + JRST LNPAR7 +LNPAR8: LDB T,LNPTR(A) ;INPUT TERMINATED, SEE IF ANY SYN MADE IT + SKIPE LNPTR(A) + SKIPE T ;THIS GUY MADE IT + AOBJN A,LNPAR8 + JUMPL A,LNPARX + SKIPE B ;NO. OF ARGS READ = 0? + JRST LNPARZ + CAIA ;NULL INPUT +LNPARX: AOS -1(P) + AOS -1(P) +LNPARZ: POP P,B + HRRZS A + POPJ P, + +LNPAR7: CAIL CHRREG,"a" + CAILE CHRREG,"z" + CAIA + SUBI CHRREG,40 + LDB T,LNPTR(A) ;SOME RANDOM CHARACTER, ALLOW ONLY EXACT MATCH + CAIN T,"l" ;LOWER CASE L + MOVEI T,"L" ;KLUDGE + CAME T,CHRREG + SETZM LNPTR(A) + AOBJN A,LNPAR7 + AOJA B,LNPARL + +STORAGE(IMPURE) +NARGS__=20 ;MAX # OF FIELDS PARSED +NSYNS__=20 ;MAX # OF SYNTAX STRINGS +LNARP: 0 ;-# OF SYNS,, +ARGLST: +FOR @' I_1,NARGS+1 +<ARG'I: 0 +> +LNPTR: BLOCK NSYNS ;BYTE POINTERS TO SYN STRINGS +REREAD: 0 ;NON-ZERO, READ THIS CHAR AGAIN +STORAGE(PURE) + + +MDWL,< +;MAPPER - Logic for converting pins to posts within DIP socket +;A = PIN# +;B = PACKAGE CODE +;C = DIP SOCKET SIZE (H) (# of pins in socket) +;D = VERTICAL OFFSET WITHIN SOCKET (0 = DEFAULT, ELSE IS WHERE PIN 1 GOES) +;SKIPS IF LEGAL MAPPING +;A = NEW PIN# +;B = FLAGS,, +;C = HORIZONTAL SOCKET OFFSET (+ is right on DIP side) +;D = VERTICAL SOCKET OFFSET (+ is down viewed fom DIP side) +;The adaptor mapping assumes that the location is the upper-left +;of an array of "dips" that pins get mapped into + +;BITS RETURNED BY MAPPER +%MPLOC__400000 ;Location was changed during conversion to post +%MPPIN__200000 ;pin number was changed " " +%MPFOR__100000 ;Force full printout if pin number changed + ; prevent some pins from printing in spchtb format +%MPUNI__40000 ;Mapped to universal board pin, doesn't need pin # + ; just print the "location" which specifies pin +%MPROT__20000 ;Kludge! DIP is rotated in socket, pin 1 is in + ;lower left corner now. + +MAPPER: + HRRZ T,PACKPN(B) ;NUMBER OF PINS ON PACKAGE + CAMLE A,T ;PIN# TOO BIG? + POPJ P, + LSH C,-1 + MOVEM C,SOCSZ2 ;Socket, # pins on one side (H) + HRRZ TT,MAPDSP(B) ;SPECIAL CHECK FOR SIP'S + PUSH P,TT ;SAVE DISPATCH FOR LATER + CAIE TT,SIP + LSH T,-1 ;DIP, # PINS ON SIDE (h) + MOVEM T,ICSIZ2 + MOVE TT,SOCSZ2 + SUB TT,T ;H-h, THE DISPARITY BETWEEN DIP AND SOCKET + SOS D ;SOCKET OFFSET, 0 IS DEFAULT + MOVEM D,SOCKOF + MOVEM B,ADAPPK + SKIPGE D + MOVE D,TT ;PUT DIP AT BOTTOM OF SOCKET + HLRZ TTT,MAPDSP(B) ;MIGHT BE TABLE FOR ADAPTOR CODE + SETZ B, ;INITIALIZE MAPPER FLAGS TO 0 + POPJ P, ;DISPATCH + +;D = Vertical pin Offset within socket +;C = H ;SOCKET, # pins in a single column. (for SIPs) +;T = h ;IC, # pins along one column. +;TT = H-h ;vertical disparity between IC and socket + +BDIP: ;SIZES defaults to .600 spacing for BDIP +DIP: JUMPL TT,CPOPJ ;DIP IS BIGGER THAN SOCKET,LOSE + CAILE D,-1(C) ;As a hack, "offsets" into 2nd column + ; put dip in socket rotated 180 + JRST DIPDWN + CAMLE D,TT ;VERTICAL OFFSET TOO BIG? + POPJ P, ; YES, OFF END OF SOCKET + CAMLE A,T ;PIN IS IN FIRST ROW OF DIP? + JRST DIP2 + JUMPE D,DIP1A ;NO OFFSET, IT FITS EXACTLY + ADD A,D +DIP3A: TLO B,%MPPIN +DIP1A: SETZB C,D ;WILL FIT, NO SLOT OFFSET NEEDED + JRST CPOPJ1 + +DIP2: ADD TT,TT ;2*(H-h) + SUB TT,D ;We move pin up 2* diff in rows, less offset + JUMPE TT,DIP1A ;NO CHANGE + TLO B,%MPPIN + ADD A,TT + JRST DIP1A + +;Offset is onto 2nd socket column, rotate dip and the offset is still +; where pin 1 goes. +DIPDWN: ADDI T,1(D) ;Offset + h, where the highest pin will go. + LSH C,1 ;2*H, the max pin on socket + CAMLE T,C ;Off top of socket? + POPJ P, + TLO B,%MPROT ;Tell the geometry stuff DIP is rotated 180 + CAMLE A,ICSIZ2 ;Pin is in 1st column of DIP? + JRST [ LSH TT,1 ;2*(H-h) + ADD A,TT + SUB A,SOCKOF + JRST DIP3A] + ADD A,D + JRST DIP3A + + + + + + +; Now offsets for SIP packages +; If offset is within left row of socket, SIP pin#s go opposite socket pin#s +SIP: CAMLE D,SOCSZ2 ;OFFSET SAYS IN FIRST ROW? + JRST SIP2 ;NO, SWOP SIP OVER ON OTHER ROW + CAMLE D,TT ;OFFSET OFF BOTTOM? + POPJ P, + TLO B,%MPPIN + ADD A,D +SIP1A: SETZB C,D ;RETURN NO SLOT OFFSET + JRST CPOPJ1 + +SIP2: AOS D ;ORIG OFFSET IS TOP PIN# + ADD T,SOCSZ2 ;H+h + ASH C,1 ;2H BIGGEST PIN # IN SOCKET + CAMLE D,C ;CAN'T GO HIGHER THAN THAT + POPJ P, + CAMGE D,T + POPJ P, ;AND CAN'T GO LOWER THAN THIS + SUBI D,-1(A) + MOVE A,D + TLO B,%MPPIN!%MPFOR ;PIN #'S ARE REVERSED, DON'T TRY + TYPE PRINT + JRST SIP1A + + ;Mapping routines for universal boards. +;A = PIN# +;B = PACKAGE CODE +;C = COLUMN (Note! Column #'s increase to right from DIP side.) +;D = "Row", DIP's pin 1 within column (increasing #s as first row of DIP pins) +;SKIPS IF LEGAL MAPPING +;B = FLAGS,, +;C = NEW COLUMN # +;D = NEW ROW # +;Check for legal packages, then make new location, +; with pin# equal to 0, the post location is entirely +; specified by DIP column and row. +;Caller must check for legal col and row numbers. + +;Note! This assumes the spacing of columns is .300" + +;*** should eventually check for adaptors (for instance the .400-.300 adaptor) *** + +MAPUNI: + HRRZ T,MAPDSP(B) ;WHAT TYPE OF PACKAGE? + CAIN T,SIP + JRST MAP1ST ;LIKE 1ST ROW OF DIP + CAIE T,DIP ;IS DIP? + POPJ P, ; NO, ILLEGAL THEN +;Is a DIP, check for legal columns depending on DIP leg spacing, +; then map column if pin is in 2nd row of DIP pins + HRRZ TT,PACKPN(B) + ASH TT,-1 ;# PINS ON ONE SIDE OF DIP + HRRZ T,DIPLEG(B) ;HOW FAR APART DIP legs? + CAIN T,=600 + JRST [ CAMG A,TT ;FIRST ROW OF PINS? + JRST MAP1ST + AOJA C,MAP2ND] ;EXTRA COLUMN OVER + CAIE T,=300 ; .3" SPACING? + POPJ P, ;NO, LOSE +;Standard .3" DIP + CAMG A,TT ;WHICH ROW OF DIP PINS? + JRST MAP1ST ; FIRST +MAP2ND: SUB A,PACKPN(B) + SUB D,A ; ROW-PIN#+#PINS is displacement + AOS C ;IN NEXT COLUMN OVER. + CAIA +MAP1ST: ADDI D,-1(A) ;OFFSET ROW BY PIN# + SETZ A, ;NULL PIN #, ALL IS IN LOC + MOVSI B,%MPLOC!%MPUNI ;UNIVERSAL LOC INCLUDES PIN# + JRST CPOPJ1 + + ;Kludgey routines for adaptors that span more than 1 socket +;C = Board socket size (16,20,...) +;ADAPPK = index into package descriptor tables +;SOCKOF = offset of pin 1 within socket (1A31@2 notation) +;TTT = Pin mapping table for this adaptor type +; sets up call to DIP +;D = Pin Offset within socket +;;C = H ;SOCKET ROW HEIGHT +;T = h ;DIP ROW HEIGHT +;TT = H-h ;BOARD SOCKET ROW HEIGHT + +%pkhor==331100 ;Table has horz, vertical socket offset (signed) +%pkver==221100 +$pkhor==33 +$pkver==22 +$$pkhv==11 ;size of field + +ADAPT: MOVE T,ADAPPK ;ORIGINAL PACKAGE INDEX + HRRZ T,ADAPSZ(T) ;DIP ADAPTORS IS A SET OF DIPS, GET h + MOVE TT,C + SUB TT,T ;H-h + ADDI A,-1(TTT) ;TABLE ENTRY FOR PIN + PUSH P,(A) ;save dip socket offset info + HRRZ A,(A) ;NEW PIN #, WITHIN GHOST DIPS + SKIPGE D,SOCKOF + MOVE D,TT ;DEFAULT VERTICAL OFFSET + PUSHJ P,DIP ;NOW GO DO OFFSET STUFF + CAIA ; failed to map?? + AOS -1(P) ;A has new pin # +;Extract horiz, vertical socket offsets + LDB C,[%PKHOR,,(P)] ;HORIZ SOCKET OFFSET + SKIPE C + TLO B,%MPLOC ;LOCATION CHANGED + TRNE C,1<$$PKHV-1> ;NEGATIVE? + ORCMI C,1$$PKHV-1 + LDB D,[%PKVER,,(P)] ;HORIZ SOCKET OFFSET + SKIPE D + TLO B,%MPLOC ;LOCATION CHANGED + TRNE D,1<$$PKHV-1> ;NEGATIVE? + ORCMI D,1$$PKHV-1 + TLO B,%MPPIN+%MPFOR ;SIGNAL MAPPED PIN #, DON'T TRY +,: HACK + SUB P,[1,,1] + POPJ P, + +STORAGE(IMPURE) +SOCKOF: 0 ;VERTICAL OFFSET WITHIN SOCKET +ICSIZ2: 0 ;# pins along one side of DIP +SOCSZ2: 0 ;Socket, # pins on one side (H) +ADAPPK: 0 ;PACKAGE CODE FOR THIS ADAPTOR +LLCOOR: 0 ;-1 IF LOWER LEFT IS 0, ELSE UPPER LEFT IS 0 +PAKROT: 0 ;-1, Package was rotated 180 +STORAGE(PURE) + + +;PAKDIM - COMPUTE X,Y OF PACKAGE OUTLINE +;A = MBIT+PIN#,,LOC +;B = PACKAGE CODE +;SKIPS IF LOCATION IS LEGAL FOR THIS PACKAGE TYPE +;T = Xmin,,Ymin +;TT = Xmax,,Ymax + +MWL,< +;PAKDIM ASSUMES 0,0 IS IN LOWER-LEFT VIEWED FROM DIP SIDE +PAKDUL: SETZM LLCOOR ;0,0 IS UPPER LEFT (DIP SIDE) + CAIA ;Used by some old board routines +PAKDIM: SETOM LLCOOR ;0,0 IS LOWER LEFT (DIP SIDE) + PUSH P,A + PUSH P,B ;PACKAGE CODE +;Find X,Y of pin 1 + MOVEI T,1 + DPB T,[%%PINN,,A] + PUSHJ P,MAPOST ;CONVERT TO POST + JRST PAKDMX + SETZM PAKROT + TLNE B,%MPROT + SETOM PAKROT + PUSHJ P,MAPIT ;GET X,Y + JRST PAKDMX ;LOSE BIG + MOVE TT,T ;GET X,Y IN BOTH + HRRZ B,(P) ;PACKAGE CODE + HRRZ B,SIZES(B) ;Package dimensions [minX,,minY  maxX,,maxY] + HLLZ TTT,(B) + SKIPE PAKROT + MOVNS TTT + ADD T,TTT + HRRZ TTT,(B) ;Y (+ IS UP) + SKIPE PAKROT + MOVNS TTT + SKIPN LLCOOR ;0 IN UPPER LEFT? + MOVNS TTT ;YES, REVERSE PACKAGE Y + ADD TTT,T + HRR T,TTT + HLLZ TTT,1(B) ;X OF PACKAGE + SKIPE PAKROT + MOVNS TTT + ADD TT,TTT + HRRZ TTT,1(B) + SKIPE PAKROT + MOVNS TTT + SKIPN LLCOOR + MOVNS TTT + ADD TTT,TT + HRR TT,TTT + AOS -2(P) +PAKDMX: POP P,B + POP P,A + POPJ P, + +SUBTTL FINDCLOSEST SCANNER - CLOSES IN A SET OF PINS +;SEARCH FOR CLOSEST BOARD PIN TO WIRE TO +;A = PIN +;Call sequence: +; PUSHJ P,FINDLOSEST +; exit with new pin in A +; co-routine to generate candidates +; .... +; JRST CPOPJ1 ;return with possibility in A +; POPJ P, ;no more possibilities + + +FINDCLOSEST: + PUSHJ P,MAPIT ;GET X,Y OF FIRST PIN + SETZ T, ;??? + PUSH P,[0] ;-4(P) TEMP + HLRE TT,T ;X + HRRES T + PUSH P,TT ;-3(P) X + PUSH P,T ;-2(P) Y + PUSH P,[0] ;-1(P) BEST SO FAR + PUSH P,[377777,,-1] ;0(P) DISTANCE BEST SO FAR + AOS -5(P) ;POINT TO COROUTINE +FINDCA: PUSHJ P,@-5(P) ;GET A CANDIDATE + JRST FINDCE ;LAST + MOVEM A,-4(P) ;SAVE CANDIDATE + PUSHJ P,MAPIT + SETZ T, + HLRE TT,T + SUB TT,-3(P) + IMUL TT,TT + HRRES T + SUB T,-2(P) + IMUL T,T + ADD T,TT + CAML T,0(P) ;BETTER THAN PREVIOUS? + JRST FINDCA + MOVEM T,0(P) + MOVE A,-4(P) + MOVEM A,-1(P) + JRST FINDCA + +FINDCE: SOS -5(P) + MOVE A,-1(P) + SUB P,[5,,5] + POPJ P, + +>;MWL + SUBTTL ADAPTOR MAPPING TABLES + +;MAPPING TABLES FOR DIP ADAPTORS +RADIX =10 +DEFINE MAP(HSLOT,PIN) +< <HSLOT-1>$PKHOR+PIN +> +DEFINE MAP2(HSLOT,VSLOT,PIN) +< <HSLOT-1>$PKHOR+<VSLOT-1>$PKVER+PIN +> +;Each table is a function that transforms a DIP pin # into +; a pin on a board socket, plus a signed Horz,Vert socket offset +;The socket offset is from the adaptor location, assumed to +;be the upper-left of an array of pseudo dips, where +horiz offset +;is to the right, + vertical offset is down +;All directions are from the DIP side of the board. + + + +;624 augat 24 pin adaptor, fits in 3 sockets horizontally +; NOTE: this map is for pin 1 in upper right (DIP side) +; (assumes the adaptor consists of 3 14 pin "DIPs") + +M.624AUG: + MAP(3,13) ;Pin 1 + MAP(3,12) ;Pin 2 + MAP(3,2) ;Pin 3 + MAP(3,3) ;Pin 4 + MAP(2,13) ;Pin 5 + MAP(2,12) ;Pin 6 + MAP(2,3) ;Pin 7 + MAP(2,2) ;Pin 8 + MAP(1,12) ;Pin 9 + MAP(1,13) ;Pin 10 + MAP(1,3) ;Pin 11 + MAP(1,2) ;Pin 12 + MAP(1,6) ;Pin 13 + MAP(1,5) ;Pin 14 + MAP(1,9) ;Pin 15 + MAP(1,10) ;Pin 16 + MAP(2,6) ;Pin 17 + MAP(2,5) ;Pin 18 + MAP(2,10) ;Pin 19 + MAP(2,9) ;Pin 20 + MAP(3,5) ;Pin 21 + MAP(3,6) ;Pin 22 + MAP(3,10) ;Pin 23 + MAP(3,9) ;Pin 24 +CHECK(M.624AUG,=24) + +;624 augat 24 pin adaptor, lower left, fits in 3 sockets horizontally +; NOTE: this map is for pin 1 in lower left (DIP side) +; (assumes the adaptor consists of 3 14 pin "DIPs") + +M.624XUG: + MAP(1,6) ;Pin 13 + MAP(1,5) ;Pin 14 + MAP(1,9) ;Pin 15 + MAP(1,10) ;Pin 16 + MAP(2,6) ;Pin 17 + MAP(2,5) ;Pin 18 + MAP(2,10) ;Pin 19 + MAP(2,9) ;Pin 20 + MAP(3,5) ;Pin 21 + MAP(3,6) ;Pin 22 + MAP(3,10) ;Pin 23 + MAP(3,9) ;Pin 24 + MAP(3,13) ;Pin 1 + MAP(3,12) ;Pin 2 + MAP(3,2) ;Pin 3 + MAP(3,3) ;Pin 4 + MAP(2,13) ;Pin 5 + MAP(2,12) ;Pin 6 + MAP(2,3) ;Pin 7 + MAP(2,2) ;Pin 8 + MAP(1,12) ;Pin 9 + MAP(1,13) ;Pin 10 + MAP(1,3) ;Pin 11 + MAP(1,2) ;Pin 12 +CHECK(M.624XUG,=24) + +;Map for Augat 40 pin adaptor - 640-HG16 +; Pin1 is in upper left (from DIP side) +; The adaptor looks like a 2x2 array of 14 pin DIPs, +; .2" apart horizontally, and .3" between pin 8/pin 1 + +;The slots are numbered: (as seen from DIP side) +; +; (pin 1) +; 1,1 2,1 +; 1,2 2,2 + + +M.640AUG: + MAP2(1,1,14) ;Pin 1 + MAP2(1,1,13) ;Pin 2 + MAP2(1,1,2) ;Pin 3 + MAP2(1,1,3) ;Pin 4 + MAP2(1,1,4) ;Pin 5 + MAP2(1,1,5) ;Pin 6 + MAP2(1,1,6) ;Pin 7 + MAP2(1,1,7) ;Pin 8 + MAP2(1,1,10) ;Pin 9 + MAP2(1,1,9) ;Pin 10 + MAP2(1,2,16) ;Pin 11 + MAP2(1,2,1) ;Pin 12 + MAP2(1,2,2) ;Pin 13 + MAP2(1,2,3) ;Pin 14 + MAP2(1,2,4) ;Pin 15 + MAP2(1,2,5) ;Pin 16 + MAP2(1,2,14) ;Pin 17 + MAP2(1,2,13) ;Pin 18 + MAP2(1,2,12) ;Pin 19 + MAP2(1,2,11) ;Pin 20 + MAP2(2,2,5) ;Pin 21 + MAP2(2,2,4) ;Pin 22 + MAP2(2,2,3) ;Pin 23 + MAP2(2,2,11) ;Pin 24 + MAP2(2,2,12) ;Pin 25 + MAP2(2,2,13) ;Pin 26 + MAP2(2,2,14) ;Pin 27 + MAP2(2,2,15) ;Pin 28 + MAP2(2,2,16) ;Pin 29 + MAP2(2,2,1) ;Pin 30 + MAP2(2,1,7) ;Pin 31 + MAP2(2,1,9) ;Pin 32 + MAP2(2,1,10) ;Pin 33 + MAP2(2,1,11) ;Pin 34 + MAP2(2,1,12) ;Pin 35 + MAP2(2,1,13) ;Pin 36 + MAP2(2,1,14) ;Pin 37 + MAP2(2,1,4) ;Pin 38 + MAP2(2,1,3) ;Pin 39 + MAP2(2,1,2) ;Pin 40 +CHECK M.640AUG,=40 + + + + + + ;Adaptors special for III + +;the S.Gray memorial 24 pin dip adaptor +;Adapts 24 pin dip into 2 16 pin sockets .1" horiz apart. +;Hangs down below dip sockets. +;also plugs into V,G pins on board, and pin 24,12 of dip +;are therefore wired to pwr/gnd + +M.SGR2: + MAP(1,15) + MAP(1,1) + MAP(1,2) + MAP(1,3) + MAP(1,4) + MAP(1,5) + MAP(1,6) + MAP(1,7) + MAP(1,11) + MAP(1,10) + MAP(1,9) + MAP(2,0) ;G PIN + MAP(2,7) + MAP(2,6) + MAP(2,5) + MAP(2,9) + MAP(2,10) + MAP(2,11) + MAP(2,12) + MAP(2,13) + MAP(2,14) + MAP(2,15) + MAP(2,16) + MAP(2,17) ;V PIN +CHECK M.SGR2,=24 + + + ;More adaptor mapping +ITS,< + +;e.g. - Pin 1 maps to 3rd socket, pin 15 (of 16) as viewed from DIP side. + +;MIT 24 Pin dip adaptor +MAP24: MAP(3,15) ;1 + MAP(3,14) ;2 + MAP(3,13) ;3 + MAP(3,2) ;4 + MAP(3,3) ;5 + MAP(2,15) ;6 + MAP(2,14) ;7 + MAP(2,3) ;8 + MAP(2,2) ;9 + MAP(2,4) ;10 + MAP(1,15) ;11 + MAP(1,14) ;12 + MAP(1,4) ;13 + MAP(1,11) ;14 + MAP(1,12) ;15 + MAP(2,6) ;16 + MAP(2,5) ;17 + MAP(2,12) ;18 + MAP(2,11) ;19 + MAP(2,13) ;20 + MAP(3,6) ;21 + MAP(3,5) ;22 + MAP(3,12) ;23 + MAP(3,11) ;24 +CHECK MAP24,=24 + +;MIT 28 Pin DIP adaptor +MAP28: MAP(3,15) ;1 + MAP(3,14) ;2 + MAP(3,13) ;3 + MAP(3,2) ;4 + MAP(3,3) ;5 + MAP(2,15) ;6 + MAP(2,14) ;7 + MAP(2,3) ;8 + MAP(2,2) ;9 + MAP(2,4) ;10 + MAP(1,15) ;11 + MAP(1,14) ;12 + MAP(1,3) ;13 + MAP(1,2) ;14 + + MAP(1,6) ;15 + MAP(1,5) ;16 + MAP(1,4) ;17 + MAP(1,11) ;18 + MAP(1,12) ;19 + MAP(2,6) ;20 + MAP(2,5) ;21 + MAP(2,12) ;22 + MAP(2,11) ;23 + MAP(2,13) ;24 + MAP(3,6) ;25 + MAP(3,5) ;26 + MAP(3,12) ;27 + MAP(3,11) ;28 +CHECK MAP28,=28 + +;MIT 40 Pin DIP adaptor - old style +MAP40: MAP(4,15) ;1 + MAP(4,14) ;2 + MAP(4,4) ;3 + MAP(4,2) ;4 + MAP(4,3) ;5 + MAP(3,15) ;6 + MAP(3,14) ;7 + MAP(3,4) ;8 + MAP(3,2) ;9 + MAP(3,3) ;10 + MAP(2,15) ;11 + MAP(2,14) ;12 + MAP(2,4) ;13 + MAP(2,2) ;14 + MAP(2,3) ;15 + MAP(1,15) ;16 + MAP(1,14) ;17 + MAP(1,4) ;18 + MAP(1,2) ;19 + MAP(1,3) ;20 + + MAP(1,5) ;21 + MAP(1,6) ;22 + MAP(1,13) ;23 + MAP(1,12) ;24 + MAP(1,11) ;25 + MAP(2,5) ;26 + MAP(2,6) ;27 + MAP(2,13) ;28 + MAP(2,12) ;29 + MAP(2,11) ;30 + MAP(3,5) ;31 + MAP(3,6) ;32 + MAP(3,13) ;33 + MAP(3,12) ;34 + MAP(3,11) ;35 + MAP(4,5) ;36 + MAP(4,6) ;37 + MAP(4,13) ;38 + MAP(4,12) ;39 + MAP(4,11) ;40 +CHECK MAP40,=40 + +MAN40: MAP(4,14) ;1 + MAP(4,15) ;2 + MAP(4,13) ;3 + MAP(4,3) ;4 + MAP(4,2) ;5 + MAP(3,14) ;6 + MAP(3,15) ;7 + MAP(3,13) ;8 + MAP(3,3) ;9 + MAP(3,2) ;10 + MAP(2,14) ;11 + MAP(2,15) ;12 + MAP(2,13) ;13 + MAP(2,3) ;14 + MAP(2,2) ;15 + MAP(1,14) ;16 + MAP(1,15) ;17 + MAP(1,13) ;18 + MAP(1,3) ;19 + MAP(1,2) ;20 + + MAP(1,5) ;21 + MAP(1,6) ;22 + MAP(1,4) ;23 + MAP(1,12) ;24 + MAP(1,11) ;25 + MAP(2,5) ;26 + MAP(2,6) ;27 + MAP(2,4) ;28 + MAP(2,12) ;29 + MAP(2,11) ;30 + MAP(3,5) ;31 + MAP(3,6) ;32 + MAP(3,4) ;33 + MAP(3,12) ;34 + MAP(3,11) ;35 + MAP(4,5) ;36 + MAP(4,6) ;37 + MAP(4,4) ;38 + MAP(4,12) ;39 + MAP(4,11) ;40 +CHECK MAN40,=40 + +;MIT 48 Pin DIP adaptor +MAP48: + MAP(5,15) ;1 + MAP(5,14) ;2 + MAP(5,3) ;3 + MAP(5,2) ;4 + MAP(5,4) ;5 + MAP(4,15) ;6 + MAP(4,14) ;7 + MAP(4,13) ;8 + MAP(4,2) ;9 + MAP(4,3) ;10 + MAP(3,15) ;11 + MAP(3,14) ;12 + MAP(3,3) ;13 + MAP(3,2) ;14 + MAP(3,4) ;15 + MAP(2,15) ;16 + MAP(2,14) ;17 + MAP(2,3) ;18 + MAP(2,2) ;19 + MAP(1,14) ;20 + MAP(1,15) ;21 + MAP(1,4) ;22 + MAP(1,3) ;23 + MAP(1,2) ;24 + MAP(1,6) ;25 + MAP(1,5) ;26 + MAP(1,12) ;27 + MAP(1,11) ;28 + MAP(1,13) ;29 + MAP(2,6) ;30 + MAP(2,5) ;31 + MAP(2,4) ;32 + MAP(2,11) ;33 + MAP(2,12) ;34 + MAP(3,6) ;35 + MAP(3,5) ;36 + MAP(3,12) ;37 + MAP(3,11) ;38 + MAP(3,13) ;39 + MAP(4,6) ;40 + MAP(4,5) ;41 + MAP(4,12) ;42 + MAP(4,11) ;43 + MAP(5,5) ;44 + MAP(5,6) ;45 + MAP(5,13) ;46 + MAP(5,12) ;47 + MAP(5,11) ;48 +CHECK MAP48,=48 + +;MAP2 <horiz-offset, vertical-offset, new-pin-#> +MAP2H: MAP2(1,1,1) ;DIP OCCUPIES 2 VERT SLOTS + MAP2(1,1,2) + MAP2(1,1,3) + MAP2(1,1,4) + MAP2(1,1,5) + MAP2(1,1,6) + MAP2(1,1,7) + MAP2(1,1,8) + MAP2(1,1,9) + MAP2(1,1,10) + + MAP2(1,2,1) + MAP2(1,2,2) + MAP2(1,2,3) + MAP2(1,2,4) + MAP2(1,2,5) + MAP2(1,2,6) + MAP2(1,2,7) + MAP2(1,2,8) + MAP2(1,2,9) + MAP2(1,2,10) + + MAP2(1,2,11) + MAP2(1,2,12) + MAP2(1,2,13) + MAP2(1,2,14) + MAP2(1,2,15) + MAP2(1,2,16) + MAP2(1,2,17) + MAP2(1,2,18) + MAP2(1,2,19) + MAP2(1,2,20) + + MAP2(1,1,11) + MAP2(1,1,12) + MAP2(1,1,13) + MAP2(1,1,14) + MAP2(1,1,15) + MAP2(1,1,16) + MAP2(1,1,17) + MAP2(1,1,18) + MAP2(1,1,19) + MAP2(1,1,20) +CHECK MAP2H,=40 + +;64 Pin adaptor that uses 3x3 group of sockets on LG684 board. +;(Made for TRW multiplier chip) +MAP64: MAP2(1,3,1) ;1 + MAP2(1,3,19) ;2 + MAP2(1,3,18) ;3 + MAP2(1,3,17) ;4 + MAP2(1,3,16) ;5 + MAP2(1,3,15) ;6 + MAP2(1,3,14) ;7 + MAP2(1,3,13) ;8 + MAP2(1,3,12) ;9 + MAP2(1,3,11) ;10 + MAP2(1,3,9) ;11 + + MAP2(1,2,1) ;12 + MAP2(1,2,19) ;13 + MAP2(1,2,18) ;14 + MAP2(1,2,17) ;15 + MAP2(1,2,16) ;16 + MAP2(1,2,15) ;17 + MAP2(1,2,14) ;18 + MAP2(1,2,13) ;19 + MAP2(1,2,12) ;20 + MAP2(1,2,11) ;21 + MAP2(1,2,9) ;22 + + MAP2(1,1,1) ;23 + MAP2(1,1,19) ;24 + MAP2(1,1,18) ;25 + MAP2(1,1,17) ;26 + MAP2(1,1,16) ;27 + MAP2(1,1,15) ;28 + MAP2(1,1,14) ;29 + MAP2(1,1,13) ;30 + MAP2(1,1,12) ;31 + MAP2(1,1,11) ;32 + + MAP2(3,1,11) + MAP2(3,1,9) + MAP2(3,1,8) + MAP2(3,1,7) + MAP2(3,1,6) + MAP2(3,1,5) + MAP2(3,1,4) + MAP2(3,1,3) + MAP2(3,1,2) + MAP2(3,1,1) + + MAP2(3,2,11) + MAP2(3,2,12) + MAP2(3,2,9) + MAP2(3,2,8) + MAP2(3,2,7) + MAP2(3,2,6) + MAP2(3,2,5) + MAP2(3,2,4) + MAP2(3,2,3) + MAP2(3,2,2) + MAP2(3,2,1) + + MAP2(3,3,11) + MAP2(3,3,12) + MAP2(3,3,9) + MAP2(3,3,8) + MAP2(3,3,7) + MAP2(3,3,6) + MAP2(3,3,5) + MAP2(3,3,4) + MAP2(3,3,3) + MAP2(3,3,2) + MAP2(3,3,1) +CHECK MAP64,=64 +>;ITS + +RADIX 8 +>;MDWL + SUBTTL INTERFACE TO BOARD SPECIFIC ROUTINES + +;THESE USED TO BE IN BOARD FILES, BUT WERE MOVED +;IT IS POSSIBLE THAT SOME FUTURE BOARD TYPE MAY WANT +;TO MOVE THESE BACK, BUT IT WOULD BE NICER TO JUST +;ADD FEATURES TO THE EXISTING INTERFACE + + +;RPNAM - READS PIN # INTO A +;RPNAMA - CHECKS IF NUMBER FOLLOWS +;TRPNAM - CHAR ALREADY IN CHRREG + +MWL,< +;READ DEC #, FIRST CHAR ALREADY IN TTT +TRPNAM: TGETNUM + JRST CPOPJ1 + +;READ NUMBER, 0 IF NUMBER DOESN'T START RIGHT AWAY +RPNAMA: GETCH + CAIL CHRREG,"0" + CAILE CHRREG,"9" + TDZA A,A + PUSHJ P,TRPNAM + JFCL + JRST CPOPJ1 +>;MWL + +RPNAM: GETNUM + JRST CPOPJ1 + + + +;BPINPN - PRINT SIMPLE PIN# +; (For now is just #, but might want to allow letters later???) +;A = PIN# +BPINPN: PUSH P,A + PUSH P,T +; HRLZS A +; PUSHJ P,PRNPIN + HRRZ T,A + PUSHJ P,PUTDEC + POP P,T + JRST POPAJ + +MWL,< +;PINMAP (WL) - GET X,Y OF PIN, AND FLAG BITS TO IDENTIFY PWR/GND PINS +;A = MBIT!MAPSOC+PIN#,,LOC +;RETURNS +;T =X,Y +;TT = BITS +PINMAP: PUSH P,A + PUSHJ P,MAPIT ;GET X,Y, AND BITS + SOS -1(P) ;DON' SKIP +POPAJ1: POP P,A + JRST CPOPJ1 + +;PINBIT (WL) - GET X,Y,BITS BUT IGNORE ERROR +;A = MBIT!MAPSOC+PIN#,,LOC +PINBIT: PUSHJ P,MAPIT + SETZ TT, ;SOME ERROR, DON'T RETURN ANY BITS + POPJ P, +>;MWL + +IFN 0,< +;CSLTLT (D) - PRINT CONNECTOR PIN NAME, (POSSIBLY WITH B-R-S) +;A = B-R-S,,CPIN-LOC ;CONVERT FROM MOVS +CSLTLT: PUSH P,A + HLRZS A + PUSHJ P,SLTOUT + SKIPE TT ;SEPARATOR CHAR SUGGESTED? + PUTBYT (TT) + HRRZ A,(P) + PUSHJ P,UMKCPN ;CONVERT FROM 18 BIT FORM + PUSHJ P,LOCPIN + JRST POPAJ +>;IFN 0 + +;CSLTLP (DPC) - PRINT CONNECTOR PIN, AS BACKPANEL PIN +;A = B-R-S,,CPIN-LOC ;CONVERT FROM MOVS +MDPC,< +CSLTLP: MOVEI T,0 +>;MDPC + ;FALL THRU +;BPNPIN (WL) - PRINT AS BACKPANEL PIN +;A = B-R-S,,CPIN-LOC +;T = SLOT OFFSET +MWL,< +BPNPIN: +>;MWL + PUSH P,A + PUSH P,B + TLNE A,-1 ;ANY B-R-S + PUSHJ P,CPNMAP ;YES, TRY TO MAP TO BACKPANEL PIN + TDZA B,B + TLO B,400000 + PUSH P,A + HLRZS A + PUSHJ P,SLTOUT + SKIPE TT + PUTBYT (TT) + POP P,A + PUSHJ P,UMKCPN + SKIPL B + JRST [ PUSHJ P,PRNLOC ;B-R-S WAS CONVERTED, DON'T NEED CPIN-LOC + SKIPE TT + PUTBYT (TT) + JRST .+1] + PUSHJ P,PRNPIN + POP P,B + POP P,A + POPJ P, + +MWL,< +;PRBCN (WL) - PRINT CONNECTOR PIN WITH BOARD LOC +;A = ,,CPIN-LOC +PRBCN: PUSH P,A + PUSHJ P,UMKCPN + PUSHJ P,LOCPIN + JRST POPAJ + +;PRCNPN (WL) - PRINT PIN PART OF CPIN +;A = ,,CONN-LOC# +;T = PINN# +PRCNPN: PUSH P,A + HRLI A,MAPCON(T) + PUSHJ P,PRNPIN + JRST POPAJ + +;LOCPNW (WL) - PRINT CONNECTOR WITH WILD CHAR +;A = CPIN#,,CPIN-LOC +;T = BODY BITS +LOCPNW: +DEC,< TRNE T,BWILD + PUTBYT WLDCHR +>;DEC + ;FALLS THRU +;LOCPNC (WL) - PRINT CONNECTOR +;A = CPIN#,,CPIN-LOC +LOCPNC: TLO A,MAPCON + JRST LOCPIN + +;PADPRT (WL) - PRINT PADDLE (OR JACK) LOCN +;A = ,,CPIN +PADPRT: PUTBYT "-" + HRLI A,MAPCON + PUSHJ P,PRNLOC + PUTBYT "-" + POPJ P, +>;MWL + +MWL,< +;WLOCOUT (WL) - TEST BODY FLAGS FOR WILD CONNECTOR +;A = ,,CPIN-LOC +;T = BODY BITS +WLOCOUT: +DEC,< TRNE T,BWILD + PUTBYT WLDCHR +>;DEC + TRNE T,CBODY + HRLI A,MAPCON + JRST PRNLOC +>;MWL + +;LOCOUT - PRINT BODY LOCS +;A = ...,,LOC +LOCOUT: HRRZS A + JRST PRNLOC + +MDPC,< +;SLTLPN (DPC) - PRINT BODY LOCN (POSSIBLY WITH B-R-S) + ;CONVERT CALLS FROM MOVS +;A = B-R-S,,BODY-LOC +SLTLPN: PUSH P,A + PUSH P,T + PUSH P,TT + HLRZS A + PUSHJ P,SLTOUT + SKIPE TT + PUTBYT (TT) + HRRZ A,-2(P) + PUSHJ P,PRNLOC + POP P,TT + POP P,T + JRST POPAJ +>;MDPC + + +MDPC,< + +;PINPLS (DPC) - PRINT "pin#" with perhaps additional pin loc info if mapped +;A = PIN# +;B = ,,BODY-LOC +;C = PACKAGE TYPE +MPC,< +PINPLS: JRST BPINPN +>;MPC + +MD,< +MXSPCH__8 ;ROOM FOR SOME TRIAL PATCHES +DEFINE FOO(DELTA,CHAR) +<ORG SPCHTB+DELTA  "CHAR" +IFG <DELTA-MXSPCH>,<MXSPCH__DELTA> +> +SPCHTB: FOO(1,+) + FOO(2,:) +ITS,< FOO(3,) > +NOITS,< FOO(3,#) > +ORG SPCHTB+MXSPCH + +PINPLS: SKIPE FORSOC ;FORCE THE SOCKET PIN #? + SKIPN B ;AND HAS A SOCKET? + JRST PINPL9 ;NO, DO STANDARD + HRLZS A ;PIN# IN LH + HRR A,B ;PIN#,,LOC + MOVE B,C + PUSHJ P,MAPOST ;CONVERT TO SOCKET POST ON BOARD + JRST [ PUTSTR [ASCIZ /?/] ;ILLEGAL SOCKET + POPJ P,] + TLNE B,%MPLOC!%MPUNI ;POST IS WAY IN ANOTHER SOCKET! + JRST LOCPIN ;PRINT "<new loc>" + JRST PRNPIN + +PINPL9: PUSHJ P,BPINPN ;Print bare pin number "#" + JUMPE B,CPOPJ ;NO LOC NOW, JUST BODY PIN# + HRRZM A,ORIGPN# + HRLZS A ;PIN# IN LH + HRR A,B ;PIN#,,LOC + MOVE B,C + PUSHJ P,MAPOST ;CONVERT TO SOCKET POST ON BOARD + JRST [ PUTSTR [ASCIZ /(??)/] + POPJ P,] + ;;Pin got mapped to completely new socket, print in fulll + TLNE B,%MPLOC!%MPUNI ;POST IS WAY IN ANOTHER SOCKET! + JRST [ PUTBYT "(" ;PRINT "#(<new loc>)" + PUSHJ P,LOCPIN + PUTBYT ")" + POPJ P,] + TLNN B,%MPPIN ;POST IS SOME OTHER PIN IN SAME SOCKET + POPJ P, + ;;Pin got mapped to some other pin in same socket, print as "(#)" or "+" + TLNE B,%MPFOR ;FORCE FULL PIN PRINTOUT? + JRST PINPL2 ; (if some pins are full, all are) + LDB T,[%%PINN,,A] ;THE MAPPED PIN # + SUB T,ORIGPN ;HOW MUCH DID IT CHANGE BY? + SKIPLE T + CAIL T,MXSPCH + JRST PINPL2 + SKIPE T,SPCHTB(T) ;SPECIAL CHAR FLAG? + JRST [ PUTBYT (T)  POPJ P,] +PINPL2: PUTBYT "(" ; PRINT "#(#)" + PUSHJ P,PRNPIN + PUTBYT ")" + POPJ P, +>;MD +>;MDPC + +MWL,< +;LOCPNM (WL) - PRINTS "post-name(pin-name)" - USED FOR WLZ +;LOCPNP (WL) - PRINTS "pin-name(post-name)" - USED FOR WLR +;A = MBITS+PIN#,,LOC +;B = PACKAGE CODE +LOCPNM: AOSA POSPIN# +LOCPNP: SETZM POSPIN +LOCPNX: PUSH P,A + PUSHJ P,MAPOST + JRST [ POP P,A ;Mapping error + PUSHJ P,LOCPIN ;PRINT "<pin-loc>(?)" + PUTSTR [ASCIZ\(?)\] + POPJ P,] + SKIPN POSPIN + EXCH A,(P) ;PRINT <pin-loc> first + PUSHJ P,LOCPIN + POP P,A + TLNE B,%MPLOC!%MPUNI + JRST [ PUTBYT "(" + PUSHJ P,LOCPIN + PUTBYT ")" + POPJ P,] + TLNN B,%MPPIN + POPJ P, + PUTBYT "(" + PUSHJ P,PRNPIN + PUTBYT ")" + POPJ P, +>;MWL + +;LOCPIN - PRINT BODY LOC, THEN DIP PIN# +;A = MBIT+PIN#,,LOC + +LOCPIN: PUSHJ P,PRNLOC + LDB T,[%%PINN,,A] ;No pin specified?? + JUMPE T,CPOPJ + SKIPE TT ;Separator needed? + PUTBYT (TT) + JRST PRNPIN + +IFN 0,< +;CSLTOUT - PRINTS CONNECTOR SLOT (AS PADDLE SLOT) +;A = B-R-S,,CPIN-LOC ;FIX +CSLTOUT: + MOVEI T,0 + PUSHJ P,CPNMAP ;CONVERT TO POST ON BACKPANEL + JFCL + JRST SLTOUT +>;IFN 0 + + +SUBTTL DESCRIPTION OF BOARD SPECIFIC ROUTINES + +COMMENT  + _________ + | BOARD | + --------- + + LOCPNP LOCPNM RAYDIP +DISPLAY WLZ WLR RAY +1(3) 1A29-3(1+) 1A29-1(3) 1A29(3) +1+ 1A29-2(1+) 1A29-1(2) 1A29(2) +1(1A30-7) 1A30-7(1A29-1) 1A29-1(1A30-7) 1A30(7) +1(4) 1A29-4(1) 1A29@3-1(1A29-4) 1A29(4) + + +;GETSLT - READ B-R-S SPEC +;(SKIPS IF OK) +;DESTIN = B-R-S (NUMREG = 0 MEANS CRLF ONLY) + +;GTSLTT (WL) - (FIRST CHAR ALREADY IN CHRREG) + + +;SLTOUT - PRINT B-R-S +;A = ,,B-R-S (With extent) +; (Check for 0) +; (Allows null Bay, Extent) +; (Returns separator char in TT, if not null) + +;GTSLTL (DPC) - Read a BODY locn +;RETURNS: +; - FAIL +; - CRLF ONLY +; - OK +;MD,< - B-R-S, TOO > +; (Note: Legal to have string following location - might be section) + +;GTCONP (D) - READ AN 18 BIT CONNECTOR LOC (Possibly with B-R-S) +; (Hair for U-pins) +;DESTIN = (B-R-S),,CPIN-LOC + +;GETLOC (WL) - READS EITHER BODY LOC, OR CONNECTOR LOC, YOUR GUESS +;SKIPS IF LEGAL +;TT = LOC (If connector, set MAPCON and only loc, not pin part) +; (TTT = LAST CHAR) + +;LOCFUK (D) - CORRECTS OLD VERSION NOMEN ON BODY SLOTS +;T = ,,SLOT +;TT = RDVER +;RETURNS CORRECT SLOT SPEC IN T + + + + + _________ + | BOARD | + --------- + +;PRNLOC - PRINTS SOCKET OR DIP LOC (POST IF UNIVERSAL BOARD) +;A = MBIT+... ,, LOC +;(CHECKS MAPCON) +;RETURNS: TT = SUGGESTED SEPARATOR CHAR BETWEEN LOC,PIN (0 IF NONE) + +;PRNPIN - PRINTS PIN# +;A = MBIT+PIN#,,LOC +; (CHECKS MAPCON,MAPPWR,MAPGND) - WILD CPINS? + +;RAYDIP (WL) - FORTRAN FORMAT PRINT +;A = MBIT+PIN#,,LOC + check for MAPCON + PRINTS IN RAYTHEON FORMAT (I8) + +;MAPIT (WL) - CONVERT POST INTO X,Y AND BITS +;NOTE!! X,Y are viewed from DIP side, usually with X+ = right, Y+ = up +;A = MBIT+PIN#,,LOC +;SKIPS IF LEGAL POST +;T = X,,Y +;TT = PWR!GND,,VOLTAGE (If dedicated pin on board) +;TTT = (DISTANCE TO END OF ROW - FOR FUDGING CITY-BLOCK STUFF) + +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +; A = MBIT+PIN#,,LOC +; B = PACKAGE +;Skips if can map, with MAPSOC set. +; A = New MBIT+PIN#,,LOC +; B = FLAGS,, +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPUNI +; %MPROT etc. +;(Note: Pin 0 has a special hack just removes the within-socket offset, if any.) + +;FGND (WL) - FIND GROUND PIN +;A = MBIT+PIN#,,LOC ;A Socket pin (MAPSOC) +;RETURNS A=0 IF FAILS +;A = New MBIT+PIN#,,LOC + +;FPWR (WL) - FIND POWER PIN +;A = MBIT+PIN#,,LOC ;A Socket pin (MAPSOC) +;B = VOLTAGE (10 mV UNITS) +;RETURNS A=0 IF FAILS +;A = New MBIT+PIN#,,LOC + +;PAKSIZ (WL) - GET DIMENSIONS OF PACKAGE ON BOARD +;A = MBIT+PIN#,,LOC +;B = PACKAGE CODE +;SKIPS IF LOCATION IS LEGAL FOR THIS PACKAGE TYPE +;T = Xmin,,Ymin +;TT = Xmax,,Ymax + + + + + _________ + | BOARD | + --------- + +;CPNMER - MERGE CONNECTOR LOC, PIN# INTO 18 BITS +;T = CPIN JACK LOC +;TT = CPIN PIN# +;RETURNS: T = MAPCON,,CPIN-LOC +; (INITIALIZE TO FIRST IF T=0, CARRIES IF CPIN# TOO BIG) + +;CPNSEP - SEPARATE OUT LOC,PIN# +;T = ,,CPIN-LOC ;MAY BE 0 ? +;RETURNS: +;T = CPIN JACK LOC ;Such that T = CPNSEP(T) = CPNSEP(CPNSEP(T)) = ... +;TT = CPIN PIN# + +;CPNMAP - MAPS CARD, CPIN-LOC TO BACKPANEL PIN +;A = B-R-S,,CPIN-LOC +;T = SLOT OFFSET +;SKIPS IF SUCCESSFUL (FAILS IF B-R-S IS NULL) +;A = B-R'-S',,CPIN-LOC +; (CHECKS IF CPIN PADDLE WITHIN EXTENT) +; (ADDS SLOT OFFSET, CHECK IF WITHIN CARD CAGE) + + + _________ + | BOARD | + --------- + +;SEQLOC (WL) - TEST IF BODY LOCS ARE "SEQUENTIAL" +; (USED BY 'STF' FOR PRODUCING FIRST-LAST SLOT RANGES) +;T = FIRST SLOT +;TT = SECOND SLOT +;SKIPS IF SEQUENTIAL + +;QUPIN (DPCWL) - TEST IF LOC IS WILD LOC +;A = ,,CPIN-LOC +;SKIPS IF WILD +;A = RULE # (1,2,3 100'S DIGIT OF PIN #) + +;CONGIN (WL) - GENERATE NEXT CPIN +; (USED BY 'SMP' ROUTINES - DEC) +;A = B-R-S,,CPIN-LOC +;SKIPS IF OK + CPNSEP + AOS TT + CPNMER + CPNMAP + FAILS: DON'T SKIP, PAST VALID PADDLE + OK: SKIP, LEGAL CPIN THIS B-R-S + +;MAPRC (WL) - MAP SEQUENTIAL INDEX INTO DIP LOC +;Given the UML X,,Y index, produce the DIP location +; that appears in that UML box. +; NOTE!! The "row" and "col" are those on the UML page, +; they AREN'T rows and cols on the board. Beware! + +;T = ROW,,COL +;SKIPS IF OK +;T = ,,BODY-LOC + USES: NROWS + NCOLS + NCLPRG + DIPSLT + +;MAPPAD (WL) - MAP INDICES INTO CPIN +;T = PADDLE (OR JACK) +;TT = PADDLE LETTER (OR PIN IN JACK) +;TTT = PIN SIDE (For DEC AA1,AA2 pins) +;Returns +;T = MAPCON+PINN#,,CPIN-LOC +;(T = 0 IF ILLEGAL OR NON-EX) + +;GNDCLR (WL) - Random, not used. +;GNDOUT (WL) - Random, not used. +;VCCOUT (WL) - Random, not used. +;WAGGND (WL) - Random +;CPARTP (WL) - Random + + + +SUBTTL DEFAULT ROUTINES FOR BOARD TYPES TO USE +BEGIN DEFAULT +comment  + +This block hides some routines that are shared among many board types. +Each label is prefixed with "$" and is made available in the outer block. + + +MWL,< +;SEPARATE CONNECTOR PIN BODY LOC (PADDLE) FROM PIN # (PIN, SIDE) +; For the purpose of grouping connector pins into bodies. +^$CPNSEP: + MOVE TT,T ;FOR DEC NOMEN + ANDI T,770000 + ANDI TT,7777 + POPJ P, + +;MERGE CONNECTOR PIN BODY LOC WITH PIN # +^$CPNMER: + DPB TT,[POINT 12,T,35] + POPJ P, + +>;MWL + +;QUPIN DETECT IF THIS PIN NAME IS "WILD" - ON THE "U" PADDLE +;CALL WITH PIN NAME IN RH(A) - BYTE(6)conn-body-locn(12)conn-pin-# +;RETURN "RULE" IN A (1,2,3) +^$QUPIN: + PUSH P,A + LSH A,-14 + ANDI A,77 + MOVE A,N2L(A) + CAIE A,"U" + JRST [ POP P,A + POPJ P,] + POP P,A + ANDI A,3777 + PUSH P,B + IDIVI A,=200 + POP P,B + CAILE A,2 + TDZA A,A + ADDI A,1 + JRST CPOPJ1 + SUBTTL SEQLOC,CONGIN,.. +MWL,< + +;CALL WITH LESSER OF TWO LOCS IN T +;GREATER IN TT +^$SEQLOC: + XOR T,TT + TRNE T,770000 ;LETTERS SHOULD BE THE SAME + POPJ P, ;ELSE NOT IN SEQUENCE + XOR T,TT + SUB TT,T + CAIN TT,1 + AOS (P) + POPJ P, + +^$CONGIN: + PUSH P,A + HRRZ A,A + JUMPE A,CONG1 + TRNN A,2 + JRST [ TRC A,3 + JRST CONG3] + LSH A,-6 + ANDI A,77 + ADDI A,1 + CAIG A,=18 + JRST [ LSH A,6 + TRO A,1 + DPB A,[POINT 12,(P),35] + POP P,A + JRST CPOPJ1] + LDB A,[POINT 6,(P),23] + ADDI A,1 + PUSH P,T + LDB T,[POINT 3,-1(P),11] ;GET EXTENT + CAIG A,1(T) ;DOES THIS PADDLE EXIST? + JRST [ POP P,T + JRST CONG2] + POP P,T + POP P,A + POPJ P, + +;VARIOUS FLAVORS OF RETURN FOR CONGIN + +CONG1: HRRZ A,L2N+"A" +CONG2: LSH A,6 + IOR A,L2N+"A" + HRRZ A,A ;CLEAR ANY LH GARBAGE + LSH A,6 + TRO A,1 +CONG3: HRRM A,(P) + POP P,A + JRST CPOPJ1 +>;MWL + SUBTTL SLTOUT -- PRINTS DIP BAY/RACK/SLOT # + +COMMENT  + +|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| +| 18 21 26 29 35 +| 18 | 4 | 5 | 3 | 6 | +|___________________________________|_______|_________|_____|___________| + | | | | | +< | | | | |------># SLOT + | | | | +< | | | |--------------->L +RACK + | | | +< | | |----------------------->L RACK + | | +< | |--------------------------------># BAY + | +< |------------------------------------------------------>NOT USED + +;SLTOUT - PRINT B-R-S +;A = 0,,B-R-S + +^$SLTOUT: + LDB T,[POINT 4,A,21] + JUMPE T,.+2 + PUSHJ P,PUTDEC + LDB TT,[POINT 5,A,26] +MDPC,< JUMPE TT,CPOPJ > + PUTBYT @N2L(TT) + LDB TTT,[POINT 3,A,29] + JUMPE TTT,SLTOU1 + ADD TT,TTT + PUTBYT @N2L(TT) +SLTOU1: MOVEI T,2 + MOVEM T,NDIG + LDB T,[POINT 6,A,35] + PUSHJ P,NPUTDEC + SETZ TT, ;NO SEP CHAR SUGGESTED + POPJ P, + + SUBTTL SLTLN - DIP LOC READER +MDPC,< +;THE CANONICAL DIP LOC READER WHERE DIP LOC IS OF FORM L# +;SLTLN -- READS A BAY/RACK/SLOT/DIPLOC OR JUST A DIPLOC +;CALL IS: +; PUSHJ P,SLTLN +; JRST ERROR +; JRST CRLF.ONLY +;MD,< JFCL > ;LOC ONLY +; (BRS,,LOC IN DESTIN) + +^$SLTLN: +SLTLN: SETZM DESTIN +MPC,< GETCH > +MD,< GETNUM + CAIL NUMREG,20 + POPJ P, + DPB NUMREG,[POINT 4,DESTIN,3] +>;MD + CAIN CHRREG,12 + JUMPE NUMREG,CPOPJ1 + PUSHJ P,CHKLET + POPJ P, +MD,< PUSH P,D + SKIPN D,L2N(CHRREG) + JRST POPDJ + DPB D,[POINT 5,DESTIN,8] + GETNUM + PUSHJ P,CHKLET + JRST SLTLN1 + JUMPL D,SLTLN3 ;GIOQ ILLEGAL FOR BRS + POP P,D + JUMPN NUMREG,SLTLN2 + LDB NUMREG,[POINT 5,DESTIN,8] + SKIPN CHRREG,L2N(CHRREG) + POPJ P, + JUMPL CHRREG,[SUB CHRREG,NUMREG + JRST SLTLN4] + SUB CHRREG,NUMREG + JUMPLE CHRREG,SLTLN4 + CAILE CHRREG,7 + JRST SLTLN4 + DPB CHRREG,[POINT 3,DESTIN,11] + GETNUM + JUMPE NUMREG,CPOPJ + PUSHJ P,CHKLET + JRST SLTLN8 +SLTLN2: CAILE NUMREG,77 + POPJ P, + DPB NUMREG,[POINT 6,DESTIN,17] +>;MD + SKIPN CHRREG,L2N(CHRREG) + POPJ P, + DPB CHRREG,[POINT 6,DESTIN,23] + GETNUM + JUMPE NUMREG,SLTLN5 +SLTLN7: CAILE NUMREG,7777 + POPJ P, + DPB NUMREG,[POINT 12,DESTIN,35] +MD,< HLRZ NUMREG,DESTIN + JUMPN NUMREG,CPOPJ3 ;THIS RETURN IF BRS TYPED +>;MD + JRST CPOPJ2 ;THIS RETURN IF PC OR NO BRS + +SLTLN5: LDB NUMREG,[POINT 6,DESTIN,23] + MOVE NUMREG,N2L(NUMREG) + LSH NUMREG,7 + IOR CHRREG,NUMREG + PUSHJ P,TWOLET + POPJ P, + DPB NUMREG,[POINT 6,DESTIN,23] + GETNUM + JUMPN NUMREG,SLTLN7 + POPJ P, + +MD,< +SLTLN1: POP P,D + JUMPE NUMREG,CPOPJ + CAILE NUMREG,7777 + POPJ P, + DPB NUMREG,[POINT 12,DESTIN,35] + LDB NUMREG,[POINT 9,DESTIN,8] + CAIL NUMREG,40 + POPJ P, + DPB NUMREG,[POINT 24,DESTIN,23] + JRST CPOPJ2 + +SLTLN3: MOVE D,N2L(D) ;GET LETTER BACK + LSH D,7 + IOR CHRREG,D ;PUT 2 LETTERS IN CHRREG + POP P,D ;RESTORE D + PUSHJ P,SLTLN6 + POPJ P, + JRST SLTLN9 + +SLTLN4: PUSHJ P,SLTLN0 + POPJ P, +SLTLN9: GETNUM + JUMPN NUMREG,SLTLN7 + POPJ P, + +SLTLN8: PUSH P,NUMREG + PUSH P,CHRREG + LDB NUMREG,[POINT 5,DESTIN,8] + LDB CHRREG,[POINT 3,DESTIN,11] + PUSHJ P,SLTLN0 + JRST [ POP P,CHRREG + POP P,NUMREG + POPJ P,] + POP P,CHRREG + POP P,NUMREG + JRST SLTLN7 + +SLTLN0: ADD CHRREG,NUMREG ;GET NUMBER BACK + MOVE NUMREG,N2L(NUMREG) ;GET FIRST LETTER BACK + MOVE CHRREG,N2L(CHRREG) ;GET SECOND LETTER BACK + LSH NUMREG,7 + IOR CHRREG,NUMREG +SLTLN6: LDB NUMREG,[POINT 4,DESTIN,3] + JUMPN NUMREG,CPOPJ + PUSHJ P,TWOLET + POPJ P, + DPB NUMREG,[POINT 24,DESTIN,23] + JRST CPOPJ1 + +POPDJ: POP P,D + POPJ P, +>;MD +>;MDPC + + + + +SUBTTL GETSLT -- READS A BAY/RACK/SLOT # + +;CALL IS: +; PUSHJ P,GETSLT +; JRST ERROR +; JUMPE TT,CRLF.ONLY ;THIS IS OPTIONAL, OBVIOUSLY +; MOVEM TT,BRS + +MWL,< +^$GTSLTT: + SETZM DESTIN + TGETNUM + JRST GTSLT1 +>;MWL + +^$GETSLT: + SETZM DESTIN + GETNUM +GTSLT1: DPB NUMREG,[POINT 4,DESTIN,3] + PUSHJ P,CHKLET + JRST [ JUMPE NUMREG,CPOPJ1 + POPJ P,] + SKIPG CHRREG,L2N(CHRREG) + POPJ P, + DPB CHRREG,[POINT 5,DESTIN,8] + GETNUM + JUMPN NUMREG,GTSLT2 + PUSHJ P,CHKLET + POPJ P, + SKIPG CHRREG,L2N(CHRREG) + POPJ P, + LDB NUMREG,[POINT 5,DESTIN,8] + SUB CHRREG,NUMREG + JUMPL CHRREG,CPOPJ + CAILE CHRREG,7 + POPJ P, + DPB CHRREG,[POINT 3,DESTIN,11] + GETNUM +GTSLT2: DPB NUMREG,[POINT 6,DESTIN,17] + JRST CPOPJ1 + SUBTTL RDLLN - READ LETTER,LETTER, NUMBER + +MD,< +;RDLLN - LOOK FOR "LL#" OR "U#" +;RETURN LL# BYTE(6)L,L,# +; U# BYTE(6)U(12)4000+# +; PUSHJ P,RDLLN +; ERROR RETURN +; SUCCESS RETURN + +^$RDLLN: +RDLLN: PUSHJ P,CHKLET + POPJ P, + SKIPG CHRREG,L2N(CHRREG) + POPJ P, + DPB CHRREG,[POINT 12,DESTIN,29] + GETNUM + JUMPN NUMREG,CKCR + PUSHJ P,CHKLET + POPJ P, + LDB TT,[POINT 6,DESTIN,29] + DPB TT,[POINT 6,DESTIN,23] + SKIPG CHRREG,L2N(CHRREG) + POPJ P, + DPB CHRREG,[POINT 6,DESTIN,29] + GETNUM + JUMPE NUMREG,CPOPJ +CKCR: LDB TT,[POINT 12,DESTIN,29] + XOR TT,L2N+"U" + TRNN TT,-1 ;SAME LETTER? + JRST [ CAILE NUMREG,3777 ;YES, LEGAL NUMBER? + POPJ P, ;NO + HRRZ TT,L2N+"U" + DPB TT,[POINT 6,DESTIN,23] + TRO NUMREG,4000 + DPB NUMREG,[POINT 12,DESTIN,35] + JRST CPOPJ1] + CAILE NUMREG,77 + POPJ P, + DPB NUMREG,[POINT 6,DESTIN,35] + JRST CPOPJ1 +>;MD +BEND DEFAULT diff --git a/src/wl/board2.503 b/src/wl/board2.503 new file mode 100644 index 00000000..3ef63632 --- /dev/null +++ b/src/wl/board2.503 @@ -0,0 +1,86 @@ +;<WIRELIST>BOARD2.FAI.10, 20-NOV-75 13:56:46, EDIT BY HELLIWELL +SUBTTL NOMENCLATURES + +.DONE(ALLLOCS) +MDWL,< +.DONE(ALLWW) +>;MDWL + +DEFINE MAKDEF(BOARD,INDEX) +<DEFINE BRDNAM(NAME,LOCS) +<IFIDN<BOARD><NAME><INDEX__...TMP> +...TMP__...TMP+1 +> +...TMP__0 +ALLLOCS +IFNDEF INDEX,<INDEX__-2 ;SO WON'T MATCH ANYWHERE + PRINTS /BOARD NOT FOUND AS NOMEN TYPE - MAKDEF +/ +> +> + +MD,< MAKDEF(MPG21,MPGNOM) + MAKDEF(PG21,PGNOM) +> +MDPC,< MAKDEF(DEC,DEFNOM) > + +NODEC,< ININOM__-1 > +III,< MAKDEF(DEC,ININOM) > +DEC,< MAKDEF(DEC,ININOM) > + + +DEFINE BRDNAM (NAME,LOCS) +< POINT 7,[ASCIZ \NAME\] +> + + POINT 7,[ASCIZ \NOMENCLATURE NOT SPECIFIED\] +LNAMES: ALLLOCS +NLOCS__.-LNAMES + +DEFINE BRDNAM (NAME,LOCS) +< LOCS +> + + LNOBRD ;BOARD TYPE -1 IS "BOARD UNSPECIFIED" +LOCTVV: ALLLOCS +CHECK LOCTVV,NLOCS + SUBTTL WIREWRAP BOARDS + +MDWL,< +DEFINE MAKDEF(BOARD,INDEX) +< +DEFINE BRDNAM(NAME,LOCS) +<IFIDN<BOARD><NAME><INDEX__...TMP> +...TMP__...TMP+1 +> +...TMP__0 +ALLWW +> + +INIWW__-1 ;BOARD TYPE SELECTED AT STARTUP +DEFWW__-1 +DEFNOM__-1 +NODEC,<NOIII,<MAKDEF(W940,DEFWW)>> + + +DEFINE BRDNAM (NAME,WWC) +< POINT 7,[ASCIZ \NAME\] +> + + POINT 7,[ASCIZ \BOARD NOT SPECIFIED\] +WNAMES: ALLWW +NWW__.-WNAMES + + +MWL,< +DEFINE BRDNAM (NAME,WWC) +< WWC +> + + WNOBRD ;BOARD TYPE -1 AGAIN +WWCTVV: ALLWW +CHECK WWCTVV,NWW + +>;MWL +>;MDWL + diff --git a/src/wl/boards.11 b/src/wl/boards.11 new file mode 100644 index 00000000..87042d28 --- /dev/null +++ b/src/wl/boards.11 @@ -0,0 +1,20 @@ +title boards +;;For producing separate REL boards file for D or PC +COMMENT  +.XCREF A,B,C,D,E,F,G,H,M,P,T,TT,TTT + +boards__-1 ;tell FIRST that we're assembling for BOARDS + +.insert SWITCH +.insert FIRST +.insert BOARD0 + +XLIST +LIT +STORAGE(IMPURE) +VAR +LIST + +END + + diff --git a/src/wl/decloc.501 b/src/wl/decloc.501 new file mode 100644 index 00000000..dae2aad1 --- /dev/null +++ b/src/wl/decloc.501 @@ -0,0 +1,604 @@ +.ADD(ALLLOCS,DEC,DECTV) +MDWL,< +.ADD(ALLWW,DEC,DECWTV) +>;MDWL +;Note! These .ADD's must be outside of block structure + +BEGIN DEC + +%DIPL__<POINT 6,,23>-=18 ;DIP GROUP (The letter) +%DIPS__<POINT 6,,29>-=18 ;DIP SLOT (The number) +;%DIPOF__<POINT 6,,35>-=18 ;DIP OFFSET + +%CONL__<POINT 6,,23>-=18 ;PADDLE LETTER +%CONN__<POINT 6,,29>-=18 ;CONNECTOR NUMBER (LETTER OR JACK #) +%CONP__<POINT 6,,35>-=18 ;CONNECTOR PIN # + +MXDPIN__=18 +MXDCON: 6 + + + +MWL,< +comment  + +All calculations are done from the DIP side. + +(0,0) at LOWER left hand corner in left handed coordinate system. +X+ to right, Y+ is up +0,0 corresponds to FV1 of DEC connectors. + + + + +XDIPSP__ =500 ; .500" DIP HORIZONTAL SPACING +YDIPSP__=1100 ;1.100" DIP VERTICAL SPACING + +;assume any old spacing + +xgrpof__=600 +YGRPOF__=600 ;VERTICAL DISTANCE FROM ORIGIN TO DIP PIN10 OF F1 + +XPINSP__ =300 ; .300" DIP PIN HORIZONTAL SPACING +YPINSP__ =100 ; .100" DIP PIN VERTICAL SPACING +XGNDOFF__-=100 ;OFFSET FROM DIP SLOT ORIGIN (ON EXTRA GROUND ROW) TO FIRST DIP + ;PIN ROW + +;CONNECTORS, DEC +DECCNY__=0 ;0.0" UP TO BOTTOM ROW OF DEC CONNECTORS +DCPINO__=200 ;.2" UP FROM BOTTOM TO SECOND ROW +DECX1__=2700 ;2.7" LEFT FOR LARGE CONNECTOR SPACES +DECX2__=2600 ;2.6" LEFT FOR SMALL CONNECTOR SPACES +GAP1T2__DECX2-=1900 ; THE SMALLER GAP BETWEEN DEC PADDLES +DCPINS__=1900 ;1.9" RIGHT FOR PIN A1 RELATIVE TO START OF CONNECTOR +DCPNSP__=100 ;.1" BETWEEN PINS HORIZONTALLY +DCGRSP__=200 ;.2" BETWEEN GROUPS OF PINS + +>;MWL + +;THE TRANSFER VECTOR FOR THE AUGUAT dec + +^dectv: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST CPOPJ ;LOCFUK +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG + JRST AUGDIP +>;MWL + [ASCIZ/L#/] ; CUE FOR BOARD SLOT + [ASCIZ /#/] ; CUE FOR BOARD PIN +MDPC,< [ASCIZ/LL# /] ;CUE FOR CONNECTOR PIN + [ASCIZ/L# /] ;CUE FOR BODY LOC + [ASCID /A01/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/L#/] ;WIRELISTER BODY CUE + [ASCIZ/L/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK dectv,LTVLEN + +L2NSUB: BLOCK L2NLEN ;******* +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +NNN__1 +FOR I IN(A,B,C,D,E,F,H,J,K,L,M,N,P,R,S,T,U,V) +< L2N2L I,0 +> +FOR I IN (G,I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + POPJ P, + + +MWL,< + +DEC684__4 + +;**************************************** DEC CONNECTOR PINS + +DCLOC: ;LOCATION OF DEC STYLE CONNECTORS + +X__DECX1*<DEC684/2>+DECX2*<DEC684/2-1> ;THE X OF V1 ON THE RIGHTMOST PADDLE! + ;INITIALLY FAR TO THE RIGHT, CONNECTORS LETTERED IN REVERSE +REPEAT DEC684/2, +< X,,DECCNY +X__X-DECX1 + X,,DECCNY +X__X-DECX2 +> +>;MWL + + + +PRNLOC: SETZ TT, + JUMPE A,CPOPJ + JUMPL A,CNLOC + LDB T,[%DIPL,,A] ;GROUP LETTER + JUMPE T,CPOPJ ;GROUP NULL? + PUTBYT @N2L(T) ;CONVERT TO LETTER AND PRINT + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + LDB T,[%DIPS,,A] ;SLOT NUMBER WITHIN GROUP + PUSHJ P,NPUTDEC ;PRINT IT OUT +; MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT +; MOVEM T,NDIG +; LDB T,[%DIPOF,,A] ;ANY SLOT OFFSET? +; JUMPE T,PRNLC1 +; PUTBYT "@" +;MWL,< PUSHJ P,NPUTDEC > +;MDPC,< PUSHJ P,PUTDEC > +PRNLC1: MOVEI TT,"-" + POPJ P, + +CNLOC: + +CNDEC: LDB T,[%CONL,,A] ;CONNECTOR ROW NUMBER + PUTBYT @N2L(T) + SETZ TT, ;DEC DOESN'T WANT SEP BETWEEN A,A1 + POPJ P, + +PRNPIN: LDB T,[%%PINN,,A] + JUMPL A,PRNPNC +MWL,< + MOVEI TT,2 + MOVEM TT,NDIG + JRST NPUTDEC +>;MWL +MDPC,< JRST PUTDEC + JRST PUTDEC > + +PRNPNC: + ASH T,-1 + PUTBYT @N2L(T) ;PRINT DEC CONNECTOR LETTER + LDB T,[%%PINN,,A] + ANDI T,1 + ADDI T,1 + JRST PUTDEC + + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +;A = MBIT+PIN#,,LOC +;B = PACKAGE +;Skips if can map, with MAPSOC set. +; Possibly MAPPWR or MAPGND if V or G posts on board +;A = New MBIT+PIN#,,LOC +;B = FLAGS,,PIN CHANGE +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPPL1 ;PIN NUMBER CHANGED BY 1 (KLUDGE) + +MDWL,< +MAPOST: TLNN A,CRDPIN ;SHOULDN'T BE ON + TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A + SETZ D, +; LDB D,[%DIPOF,,A] ;OFFSET FIELD WITHIN SOCKET + LDB A,[%%PINN,,A] + JUMPE A,MAPOS1 + MOVEI C,=16 ;BOARD HAS 20 PIN SOCKETS + PUSHJ P,MAPPER + JRST MAPOSX + LDB T,[%DIPS,,(P)] ;NOW OFFSET SLOT + ADD T,C + DPB T,[%DIPS,,(P)] + LDB T,[%DIPL,,(P)] ;FIRST ROW IS A (=1) + ADD T,D ;DOES OFFSET OVERFLOW NO. OF ROWS? + DPB T,[%DIPL,,(P)] +MAPOS1: SETZ T, +; DPB T,[%DIPOF,,(P)] ;WITHIN SOCKET OFFSET GOES AWAY + DPB A,[%%PINN,,(P)] + AOS -3(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, +>;MDWL + +GTSLTL: PUSH P,A + MOVEI A,[[ASCIZ /L#./] + 0] + PUSHJ P,LNPARS + JRST GTSL0 + JRST GTSL1 + SETZ TT, + PUSHJ P,GATLOC + JRST GTSL0 +IFN 0,< CAIE CHRREG,"@" + JRST GTSL2 + PUSH P,TT + GETNUM + POP P,TT + JUMPE NUMREG,GTSL0 + DPB NUMREG,[%DIPOF,,TT] +>;IFN 0 +GTSL2: MOVEM TT,DESTIN + AOS -1(P) +GTSL1: AOS -1(P) +GTSL0: POP P,A + POPJ P, + +GATLOC: MOVE A,ARG1 + DPB A,[%DIPL,,TT] + MOVE A,ARG2 + DPB A,[%DIPS,,TT] + JRST CPOPJ1 + +MD,< +;THIS SHOULD PROBABLY TRY FOR B-R-S ALSO, BUT...? +GTCONP: PUSH P,A + MOVEI A,[[ASCIZ /LL#/] + 0] + PUSHJ P,LNPARSE + JRST GTCON0 + JRST GTCON1 ;NULL INPUT + PUSHJ P,GATCON ;GET JACK OR PADDLE PART OF LOC + JRST GTCON0 + SKIPE A,ARG2 ;READ AND CONVERT DEC CONNECTOR PIN NUMBER + CAILE A,MXDPIN/2 + JRST GTCON0 ;LETTER TOO BIG + SOSL A,ARG3 + CAILE A,1 + JRST GTCON0 + MOVE A,ARG2 + ASH A,1 + IOR A,ARG3 +GTCON3: DPB A,[%CONP,,TT] + HRRZM TT,DESTIN + AOS -1(P) +GTCON1: AOS -1(P) +GTCON0: POP P,A + POPJ P, + +>;MD + +GATCON: SETZ TT, +GTCN1: SKIPE A,ARG1 + CAMLE A,MXDCON ;MAX NUMBER OF DEC CONNECTORS + POPJ P, + DPB A,[%CONL,,TT] +GTCN2: TLO TT,MAPCON + JRST CPOPJ1 + + +MWL,< + +GETLOC: MOVEI A,[[ASCIZ /L#/] ;0 - Board socket + [ASCIZ /L/] ;1 - Dec connector + 0] + PUSHJ P,LNPARSE + POPJ P, + POPJ P, + SKIPE A + JRST GATCON + SETZ TT, + JRST GATLOC + +;Print location for fixed format card image +;8 cols wide, with "group" left justified, "pin number" right justified +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + PUSHJ P,PRNLOC ;A01 or J01 or C + LDB T,[%%PINN,,A] ;DIP PIN NUMBER + JUMPL A,RAYCON + PUTSTR [ASCIZ / /] ;3 SPACES + MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC ;"A01" + 3 spaces + ## = 8 + +RAYCON: PUTSTR [ASCIZ / /] ;3 spaces + PUTSTR [ASCIZ / /] ;"C" + 5 spaces + LDB T,[%%PINN,,A] + TRNN T,1 + PUTBYT "1" + TRNE T,1 + PUTBYT "2" + ASH T,-1 + PUTBYT @N2L(T) + POPJ P, ;"C" + 5 spaces + #L = 8 + + +FOR NAME IN (AUGDIP:,CPARTP:,CONGIN:,SEQLOC:) +<NOTYET(NAME) +> +>;MWL + +CPNSEP: LDB TT,[%CONP,,T] + LDB TTT,[%CONN,,T] + LSH TTT,1 + ADD TT,TTT + MOVEI TTT,0 + DPB TTT,[%CONP,,T] + DPB TTT,[%CONN,,T] + POPJ P, + +CPNMER: PUSH P,A + SKIPN T + SKIPE TT + JRST CPNMR1 + MOVEI TT,1 ;T,TT=0 MEANS INITIALIZE TO FIRST + DPB TT,[%CONL,,T] +CPNMR1: CAIG TT,=36 + JRST CNPMR1 + MOVEI TT,1 + LDB TTT,[%CONL,,T] + AOS TTT + DPB TTT,[%CONL,,T] +CNPMR1: SOS TT + IDIVI TT,2 + AOS TT + DPB TT,[%CONN,,T] + AOS TTT + DPB TTT,[%CONP,,T] + POP P,A + POPJ P, + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD +NOTYET(CPNMAP:) + +MDWL,< +MWL,< +SUBTTL WIRE WRAP ROUTINES -- HEX DEC 20 PIN BOARDS + +^^DECWTV__. ;TRANSFER VECTOR FOR QUAD HEIGHT 20 PIN DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + =30 ;NROWS (USED FOR UML ONLY) + =12 ;NCOLS (USED FOR UML ONLY) + 6 ;NCLPRG (USED FOR UML ONLY) + 6 ;NRWPRP (USED FOR UML ONLY) + =180 ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(=12) ;NPADS (USED FOR UML ONLY) + XWD -=18,1 ;PADLET (USED FOR UML ONLY) + XWD -2,1 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK DECWTV,WTVLEN + +;TABLES FOR MAPIT + +;**************************************** DIP PINS + +DEFINE XY(X,Y) +< X*XPINSP,,Y*YPINSP +> + +;Pin position offset from socket origin (pin 10, lower left). DIP side! +PINTAB: +FOR Y_9, 0, -1 +< XY(0,Y) +> +FOR Y_0, 9, 1 +< XY(1,Y) +> + +;**************************************** DEC CONNECTOR PINS +;PIN POSITIONS WITHIN ONE PADDLE + +X__DCPINS ;INITIAL X STARTING LOCATION +DCPINL: + +REPEAT 3, +< + REPEAT 6, + < X,,0 + X,,DCPINO + X__X-DCPNSP + > +X__X-DCGRSP+DCPNSP ;ALREADY SUB'ED AN EXTRA DCPNSP AT END OF RPT +> + +DCPWRG: 0 ;A1 + PWR,,500 + 0 ;B1 + 0 + 0 ;C1 + GND,,0 +DCGNDT__.-DCPWRG+1 + 0 ;D1 + 0 + 0 ;E1 + 0 + 0 ;F1 + 0 + 0 ;H1 + 0 + 0 ;J1 + 0 + 0 ;K1 + 0 + 0 ;L1 + 0 + 0 ;M1 + 0 + 0 ;N1 + 0 + 0 ;P1 + 0 + 0 ;R1 + 0 + 0 ;S1 + 0 + GND,,0 ;T1 +DCGNDB__.-DCPWRG+1 + 0 + 0 ;U1 + 0 + 0 ;V1 + 0 + + MAPIT: JUMPL A,CONMAP ;MAP CONNECTOR LOCATION + PUSHJ P,MAPLOC ;MAP DIP LOCN + POPJ P, ;BAD LOCN + LDB TTT,[%%PINN,,A] ;PIN # +MAPIT0: ADD T,PINTAB-1(TTT) ;ADD EXTRA XY FOR PIN + SETZ TT, + SETZ TTT, ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + + +;Convert PIN-SPEC in A into DIP X,Y locn (T) +;Y + UP +;X + RIGHT (FROM DIP SIDE) +MAPLOC: LDB TT,[%DIPL,,A] ;GROUP LETTER + JUMPE TT,CPOPJ + LDB T,[%DIPS,,A] ;DIP # +;Slot 1 is X=0 + SOS T + IMULI T,XDIPSP ;SLOT NUMBER IS OFFSET HORIZONTALLY + HRLZ T,T +;Row F is Y=0 + IMULI TT,YDIPSP ;CALCULATE Y OFFSET + HRR T,TT + ADD T,[XGRPOF,,YGRPOF] ;ADD IN OFFSET FOR ENTIRE DIP ARRAY + JRST CPOPJ1 + +;HERE FOR CONNECTOR PINS + +CONMAP: + +CONDEC: LDB TT,[%CONN,,A] + JUMPE TT,CPOPJ + CAMLE TT,MXDCON + POPJ P, + MOVE T,DCLOC-1(TT) ;PADDLE X,Y + LDB TT,[%%PINN,,A] + CAIL TT,2 ;2+0 IS A+1 PIN + CAILE TT,MXDPIN+2-1 + POPJ P, + ADD T,DCPINL-2(TT) + MOVE TT,DCPWRG-2(TT) + SETZ TTT, + JRST CPOPJ1 + +PAKSIZ: SKIPE ILLPAK(B) + POPJ P, + JRST PAKDIM + +;Define illegal package types in this board +; -1 if illegal +ILLPAK: BLOCK NPACK + FOR @' I IN (22,24,36,40,48,64) + <ORG ILLPAK+K.'I  -1 + > + ORG ILLPAK+NPACK + +MAPRC: HLRZ TT,T ;(1,1) IS DIP IN UPPER LEFT HAND CORNER + HRRZS T ;ROW IN TT, COL IN T + PUSH P,[0] + DPB TT,[%DIPS,,(P)] + DPB T,[%DIPL,,(P)] + POP P,T + JRST CPOPJ1 + +MAPPAD: SOS TT + ASH TT,1 ;TT,TTT HAVE COMPLEX PIN# + ADDI TT,(TTT) + AOS TT ;DEC PADDLES ARE PINLETTER*2+SIDE + CAILE TT,MXDPIN+2-1 ;EXISTS? + JRST MAPPDL ;NO, ERROR +MAPPD2: MOVSI TTT,MAPCON(TT) ;PIN# IN LH + DPB T,[%CONN,,TTT] + HLRZS T + SKIPA T,TTT +MAPPDL: SETZ T, ;LOSE RETURN + POPJ P, + +FPWR: SETZ A, + POPJ P, +IFN 0,< + CAIE B,=500 ;+5.00V?? + JRST [ SETZ A, + POPJ P,] + MOVE T,A ;SAVE IF CONN PIN + MOVEI B,BRDPWR + DPB B,[%%PINN,,A] + TLO A,MAPSOC + JUMPL A,FPWRC + POPJ P, +>;IFN 0 + +FGND: SETZ A, + POPJ P, +IFN 0,< + MOVE T,A + MOVEI B,BRDGND + DPB B,[%%PINN,,A] + TLO A,MAPSOC + JUMPL A,FGNDC + POPJ P, + +FGNDC: LDB TT,[%CONT,,A] + JUMPE TT,FGNDDC + LDB TT,[%CONN,,A] ;USE ROW OF GNDS ON OTHER HALF OF CONN + LDB T,[%%PINN,,T] ;ORIGINAL PIN# + HRRZ TT,JACKSZ(TT) + ASH TT,-1 + CAMG T,TT + ADD T,TT +FGNDC1: DPB T,[%%PINN,,A] + TLO A,MAPSOC + POPJ P, + +>;IFN 0 + +FOR NAME (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +>;MDWL +BEND DEC diff --git a/src/wl/foonly.500 b/src/wl/foonly.500 new file mode 100644 index 00000000..387b0e1d --- /dev/null +++ b/src/wl/foonly.500 @@ -0,0 +1,587 @@ +.ADD(ALLLOCS,FOONLY,FOOTV) +MDWL,< +.ADD(ALLWW,FOONLY,FOOWTV) +>;MDWL +;Note! These .ADD's must be outside of block structure + +BEGIN FOONLY + +COMMENT  + +Foonly nomenclature old version (pre DRWVER=27) + +DIPS BYTE(6) letter-code (12) number +CONNS BYTE(3) letter (3) [0,11,12,13,21,22,23,0] (12) number + +New version, (changed by LOCFUK routine) + +DIPS BYTE(3) letter (3) group (3) row (3) col (6) offset +CONNS BYTE(3) letter (3) [0,11,12,13,21,22,23,0] (12) number + +The Foonly board is a 1320 DIP panel. +There are 8 major rows of dips, labeled A-F, vertically +Each row consists of 6 groups of 30 dips (except group 6 + is only 15 DIPs) arranged horizontally within row. + + A6 A5 A4 A3 A2 A1 conns + B6 B5 B4 B3 B2 B1 conns + C6 C5 C4 C3 C2 C1 conns + D6 D5 D4 D3 D2 D1 conns + + E6 E5 E4 E3 E2 E1 conns + F6 F5 F4 F3 F2 F1 conns + H6 H5 H4 H3 H2 H1 conns + J6 J5 J4 J3 J2 J1 conns + +The group is a 5 row by 6 columns, DIP 11 in upper right + + 16 15 14 13 12 11 + 26 21 + 36 31 + 46 41 + 56 55 54 53 52 51 + +All directions are viewed from the DIP side + + +%DIPL__<POINT 3,,20>-=18 ;DIP LETTER (A,B,C,D,E,F,H,J) +%DIPG__<POINT 3,,23>-=18 ;DIP GROUP (1-6) +%DIPR__<POINT 3,,26>-=18 ;DIP ROW (1-5) +%DIPC__<POINT 3,,29>-=18 ;DIP COL +%DIPOF__<POINT 6,,35>-=18 ;DIP OFFSET + +%CONL__<POINT 3,,20>-=18 ;CONNECTOR LETTER +%CONN__<POINT 3,,23>-=18 ;CONNECTOR NUMBER (11,12,13,21,22,23) +%CONP__<POINT 9,,35>-=18 ;CONNECTOR PIN # + +BRDGND__=1 ; PIN 1 IS DEDICATED GROUND +BRDPWR__=8 ; PIN 16 IS DEDICATED POWER + +CONTAB: 0 + =11 + =12 + =13 + =21 + =22 + =23 + 0 + + +MWL,< +comment  + +All calculations are done from the DIP side. + +(0,0) at LOWER left hand corner in left handed coordinate system. +X+ to right, Y+ is up +0,0 corresponds to FV1 of DEC connectors. + + + +XPINSP__ =300 +YPINSP__=100 + +>;MWL + +;THE TRANSFER VECTOR FOR THE AUGUAT FOONLY + +^FOOTV: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST locfuk ;LOCFUK +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG +>;MWL + [ASCIZ/L#/] ; CUE FOR BOARD SLOT + [ASCIZ /#/] ; CUE FOR BOARD PIN +MDPC,< [ASCIZ/LJ#-#/] ;CUE FOR CONNECTOR PIN + [ASCIZ/L# /] ;CUE FOR BODY LOC + [ASCID /A111/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/L#/] ;WIRELISTER BODY CUE + [ASCIZ/LJ#/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK footv,LTVLEN + +L2NSUB: BLOCK L2NLEN ;******* +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +NNN__1 +FOR I IN(A,B,C,D,E,F,H,J,K,L,M,N,P,R,S,T,U,V) +< L2N2L I,0 +> +FOR I IN (G,I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + POPJ P, + + +;Locfuk - convert from old blody location nomenclature. + +MD,< +;T = LOCATION FOR BODY +;(TT= RDVER .LT. 27) + +LOCFUK: CAIL TT,27 ;OLD VERSIONS HAVE DIFFERENT + POPJ P, + LDB TT,[POINT 6,T,23] + DPB TT,[%DIPL,,T] + MOVE TT,T + ANDI TT,7777 ;GET NUMBER, FORM OF "A156" + IDIVI TT,=10 ;STRIP OFF COL + PUSH P,TTT + IDIVI TT,=10 + TRZ T,7777 + DPB TT,[%DIPG,,T] + DPB TTT,[%DIPR,,T] + POP P,TT + DPB TT,[%DIPC,,T] + POPJ P, +>;MD + +PRNLOC: SETZ TT, + JUMPE A,CPOPJ + JUMPL A,CNLOC + LDB T,[%DIPL,,A] ;GROUP LETTER + PUTBYT @N2L+1(T) ;CONVERT TO LETTER AND PRINT + LDB T,[%DIPG,,A] + PUTBYT "0"(T) + LDB T,[%DIPR,,A] + PUTBYT "0"(T) + LDB T,[%DIPC,,A] + PUTBYT "0"(T) + LDB T,[%DIPOF,,A] + JUMPE T,PRNLC1 + PUTBYT "@" + PUSHJ P,PUTDEC +PRNLC1: MOVEI TT,"-" + POPJ P, + +CNLOC: LDB T,[%CONL,,A] + PUTBYT @N2L+1(T) + PUTBYT "J" + LDB T,[%CONN,,A] + MOVE T,CONTAB(T) + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + MOVEI TT,"-" + POPJ P, + +PRNPIN: LDB T,[%%PINN,,A] +MWL,< + MOVEI TT,2 + MOVEM TT,NDIG + JRST NPUTDEC +>;MWL +MDPC,< JRST PUTDEC > + + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +;A = MBIT+PIN#,,LOC +;B = PACKAGE +;Skips if can map, with MAPSOC set. +; Possibly MAPPWR or MAPGND if V or G posts on board +;A = New MBIT+PIN#,,LOC +;B = FLAGS,,PIN CHANGE +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPPL1 ;PIN NUMBER CHANGED BY 1 (KLUDGE) + +MDWL,< +MAPOST: TLNN A,CRDPIN ;SHOULDN'T BE ON + TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A + LDB D,[%DIPOF,,A] ;OFFSET FIELD WITHIN SOCKET + LDB A,[%%PINN,,A] + JUMPE A,MAPOS1 + MOVEI C,=16 ;BOARD HAS 16 PIN SOCKETS + PUSHJ P,MAPPER + JRST MAPOSX + LDB T,[%DIPC,,(P)] ;NOW OFFSET COLUMN + SUB T,C + JUMPLE T,MAPOSX ;OVERFLOWS GROUP + DPB T,[%DIPC,,(P)] + LDB T,[%DIPR,,(P)] ;FIRST ROW IS 1 + ADD T,D ;DOES OFFSET OVERFLOW NO. OF ROWS? + CAILE T,=6 + JRST MAPOSX + DPB T,[%DIPR,,(P)] +MAPOS1: SETZ T, + DPB T,[%DIPOF,,(P)] ;WITHIN SOCKET OFFSET GOES AWAY + DPB A,[%%PINN,,(P)] + AOS -3(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, +>;MDWL + +GTSLTL: PUSH P,A + MOVEI A,[[ASCIZ /L#./] + 0] + PUSHJ P,LNPARS + JRST GTSL0 + JRST GTSL1 + SETZ T, + PUSHJ P,GATLOC + JRST GTSL0 + CAIE CHRREG,"@" + JRST GTSL2 + PUSH P,T + GETNUM + MOVE TT,NUMREG + POP P,T + JUMPE TT,GTSL0 + DPB TT,[%DIPOF,,T] +GTSL2: MOVEM T,DESTIN + AOS -1(P) +GTSL1: AOS -1(P) +GTSL0: POP P,A + POPJ P, + +GATLOC: MOVE TT,ARG1 + SOS TT + DPB TT,[%DIPL,,T] + MOVE TT,ARG2 + IDIVI TT,=10 + PUSH P,TTT + IDIVI TT,=10 + DPB TT,[%DIPG,,T] + DPB TTT,[%DIPR,,T] + POP P,TT + DPB TT,[%DIPC,,T] + JRST CPOPJ1 + +MD,< +;THIS SHOULD PROBABLY TRY FOR B-R-S ALSO, BUT...? +GTCONP: PUSH P,A + MOVEI A,[[ASCIZ /LJ#-#/] + 0] + PUSHJ P,LNPARSE + JRST GTCON0 + JRST GTCON1 ;NULL INPUT + PUSHJ P,GATCON ;GET JACK OR PADDLE PART OF LOC + JRST GTCON0 + MOVE A,ARG5 +GTCON3: DPB A,[%CONP,,TT] + HRRZM TT,DESTIN + AOS -1(P) +GTCON1: AOS -1(P) +GTCON0: POP P,A + POPJ P, +>;MD + +GATCON: SETZ TT, + SOS A,ARG1 + DPB A,[%CONL,,TT] ;THE LETTER + MOVSI TTT,-8 + MOVE T,ARG3 ;THE 11,12,13,... + CAME T,CONTAB(TTT) + AOBJN TTT,.-1 + JUMPGE TTT,CPOPJ + DPB TTT,[%CONN,,TT] + TLO TT,MAPCON + JRST CPOPJ1 + +MWL,< + +GETLOC: MOVEI A,[[ASCIZ /LJ#/] ;0 - Scotchflex connector + [ASCIZ /L#/] ;1 - Board socket + [ASCIZ /L#@#/] ;2 - Board socket with offset + 0] + PUSHJ P,LNPARSE + POPJ P, + POPJ P, + SKIPN A ;STRING 0,3 ARE CONNECTOR FORMATS + JRST GATCON + SETZ TT, + MOVE T,ARG4 + CAIN A,2 ;THE OFFSET CASE + DPB T,[%DIPOF,,TT] + JRST GATLOC + +;Print location for fixed format card image +;8 cols wide, with "group" left justified, "pin number" right justified +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + PUSHJ P,PRNLOC ;A01 or J01 or C + LDB T,[%%PINN,,A] ;DIP PIN NUMBER + PUTSTR [ASCIZ / /] ;3 SPACES + MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC ;"A01" + 3 spaces + ## = 8 + +FOR NAME IN (CPARTP:,CONGIN:,SEQLOC:) +<NOTYET(NAME) +> +>;MWL + +CPNSEP: LDB TT,[%CONP,,T] + MOVEI TTT,0 + DPB TTT,[%CONP,,T] + POPJ P, + +;Merge connector'pin with connector'loc +; but check for overflow of connector pin, +; and carry into next connector loc - this +; is used by the UML printer + +CPNMER: PUSH P,A + SKIPN T ;INITIALIZE? + SKIPE TT + JRST CPNMR1 + MOVEI TT,1 ;J11 AND PIN 1 + DPB TT,[%CONN,,T] ;CONNECTOR TYPE STARTS AT ZERO +CPNMR1: LDB TTT,[%CONP,,T] + CAIG TT,=20 + JRST CPNMR2 +;Carry into the next connector + MOVEI TT,1 ;RESET PIN# + LDB TTT,[%CONN,,T] + AOS TTT + DPB TTT,[%CONN,,T] + SKIPE CONTAB(TTT) ;OVERFLOWS GROUP? + JRST CPNMR2 +;Overflows from one major row to next + MOVEI TTT,1 ;RESET TO J11 + DPB TTT,[%CONN,,T] + LDB TTT,[%CONL,,T] + AOS TTT + DPB TTT,[%CONL,,T] +CPNMR2: DPB TT,[%CONP,,T] + POP P,A + POPJ P, + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD +NOTYET(CPNMAP:) + +MDWL,< +MWL,< +SUBTTL WIRE WRAP ROUTINES -- FOONLY BOARDS + +^^FOOWTV__. + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + 5*8 ;NROWS (USED FOR UML ONLY) + 6*6 ;NCOLS (USED FOR UML ONLY) + 6 ;NCLPRG (USED FOR UML ONLY) + 5 ;NRWPRP (USED FOR UML ONLY) + =1560 ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(6*8) ;NPADS (USED FOR UML ONLY) + XWD -=20,1 ;PADLET (USED FOR UML ONLY) + XWD -1,0 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK FOOWTV,WTVLEN + +;TABLES FOR MAPIT + +;**************************************** DIP PINS + +DEFINE XY(X,Y) +< X*XPINSP,,Y*YPINSP +> + +;Pin position offset from socket origin (pin 10, lower left). DIP side! +PINTAB: +FOR Y_7, 0, -1 +< XY(0,Y) +> +FOR Y_0, 7, 1 +< XY(1,Y) +> + + MAPIT: JUMPL A,CONMAP ;MAP CONNECTOR LOCATION + PUSHJ P,MAPLOC ;MAP DIP LOCN + POPJ P, ;BAD LOCN + LDB TTT,[%%PINN,,A] ;PIN # +MAPIT0: ADD T,PINTAB-1(TTT) ;ADD EXTRA XY FOR PIN + SETZ TT, + CAIN TTT,BRDGND + MOVSI TT,GND + CAIN TTT,BRDPWR + MOVE TT,[PWR,,-=520] ;-5.20 VOLTS + SETZ TTT, ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + +;Convert PIN-SPEC in A into DIP X,Y locn (T) +;Y + UP +;X + RIGHT (FROM DIP SIDE) + +;For Y, <6-major row>*6" + <5-ROW>*1.0" + +MAPLOC: LDB T,[%DIPL,,A] + MOVNS T + ADDI T,6 + IMULI T,=6000 + LDB TT,[%DIPR,,A] + MOVNS TT + ADDI TT,5 + IMULI TT,=1000 + ADD T,TT +;For X, <6-Group>*3.0" + <6-Column>*.5" + LDB TT,[%DIPG,,A] + MOVNS TT + ADDI TT,6 + IMULI TT,=3000 + LDB TTT,[%DIPC,,A] + MOVNS TTT + ADDI TTT,6 + IMULI TTT,=500 + ADD TT,TTT + HRL T,TT + JRST CPOPJ1 + +;HERE FOR CONNECTOR PINS + +;For Y, <6-major row>*6" + <2-JNx>*3.0" + <20-conp> *.1" +;For X, 20.0" + <3-JxN>*.5" + +CONMAP: LDB T,[%CONL,,A] + MOVNS T + ADDI T,6 + IMULI T,=6000 + LDB TT,[%CONN,,A] + ADD T,CONTBL(TT) + LDB TT,[%CONP,,A] + MOVNS TT + ADDI TT,=20 + ADD T,TT + JRST CPOPJ1 + + +CONTBL: 0 + =21500,,=4000 + =21000,,=4000 + =20500,,=4000 + =21500,,=2000 + =21000,,=2000 + =20500,,=2000 + 0 + + +PAKSIZ: SKIPE ILLPAK(B) + POPJ P, + LDB T,[%DIPC,,A] + SUB T,PAKWID(B) + JUMPL T,CPOPJ + LDB T,[%DIPR,,A] + ADD T,PAKHGT(B) + CAILE T,5 + POPJ P, + JRST PAKDIM + +;Define illegal package types in this board +; -1 if illegal +ILLPAK: BLOCK NPACK + FOR @' I IN (22,24,36,40,48,64) + <ORG ILLPAK+K.'I  -1 + > + ORG ILLPAK+NPACK + + +;For UML, MAP a UML row, column into a diploc + +MAPRC: HLRZ TT,T ;ROW + HRRZS T ;COL + PUSH P,[0] + PUSH P,TT ;THE ROW + SOS T + IDIVI T,6 + ADDI TT,1 + DPB TT,[%DIPC,,-1(P)] + ADDI T,1 + DPB T,[%DIPG,,-1(P)] + POP P,T + SOS T + IDIVI T,5 + AOS TT + DPB TT,[%DIPR,,(P)] + DPB T,[%DIPL,,(P)] + POP P,T + JRST CPOPJ1 + +;Map a connector number (T) and pin number (tt,ttt) into +; a connector spec + +MAPPAD: MOVSI TTT,MAPCON(TT) + SOS T + IDIVI T,6 ;6 CONNECTORS PER MAJOR ROW + DPB T,[%CONL,,TTT] + AOS TT + DPB TT,[%CONN,,TTT] + MOVE T,TTT + POPJ P, + + +FPWR: SKIPA B,[BRDPWR] +FGND: MOVEI B,BRDGND + DPB B,[%%PINN,,A] + TLO A,MAPSOC + JUMPL A,FGNDC + POPJ P, + +FGNDC: SETZ A, ;NOT CLEVER FOR NOW + POPJ P, + +FOR NAME IN (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +>;MDWL +BEND FOONLY diff --git a/src/wl/lg627.439 b/src/wl/lg627.439 new file mode 100644 index 00000000..b50250ab --- /dev/null +++ b/src/wl/lg627.439 @@ -0,0 +1,1084 @@ +.ADD(ALLLOCS,LG627,LG627V) ;-*-Midas-*- +.ADD(ALLLOCS,LG631,LG627V) +MDWL,< +.ADD(ALLWW,LG627,L627TV) +.ADD(ALLWW,LG631,L627TV) +>;MDWL +;Note! These .ADD's must be outside of block structure + +BEGIN LG627 + +;Nomenclature for universal style boards: +; Field-size +; (5) %DIPG, group A,B,C, ... +; (5) %DIPC, column within group, A:S, A:T, A:S +; (8) %DIPN, pin # within column (1-62) + +%DIPG__<POINT 5,,22>-=18 ;Group (A:C) +%DIPC__<POINT 5,,27>-=18 ;Column (A:S) +%DIPN__<POINT 8,,35>-=18 ;Pin number (up to 63) +GPINOF__=100 ; (100-177) G pins are offset 100 from + ; neighboring pin +VPINOF__=200 ; (200-277) V pins are offset 200 from + ; neighboring pin + +%CONT__<POINT 1,,22>-=18 ;CONNECTOR TYPE 0  DEC 1  FLAT CABLE "J" +%CONN__<POINT 4,,26>-=18 ;CONNECTOR NUMBER (LETTER OR JACK #) +%CONP__<POINT 9,,35>-=18 ;CONNECTOR PIN # + +NGRPS__6 ; For UML ????? A - F ROWS +;GPINS__400 ;NOMEN FOR "G" PINS ON BOARD STARTS AT 400 +; ; 401 IS "G1", ETC. +;BRDGND__=10 ; PIN 10 IS DEDICATED GROUND +;BRDPWR__=20 ; PIN 20 IS DEDICATED POWER + + +MXDPIN__=36 ;MAXIMUM NUMBER OF DEC PINS/CONNECTOR + +;The LG627 board is a universal board. +;The DIP area is broken into three groups +;From DIP side: +;Group C consists of columns S thru A, each column +; is 62 pins high +;Group B consists of columns T thru A, also 62 high. +;Group A columns S thru G are 62 high, columns F thru A are only 13:62 + +;The V,G pins are located next to every other column, starting with A +;G pins are present every 8th pin starting at 62 +;V pins, every 8th starting at 58 + +;There are 9 26 pin Flat cable connectors on the back of the board. +;J1-J4 are vertically oriented above AA-AE, J5-J9 across the +; back of the board + + + +; All calculations are done from the DIP side. + +; (0,0) at LOWER left hand corner in left handed coordinate system. +; X+ to right, Y+ is up +; 0,0 corresponds to FV1 of DEC connectors. +; The first DIP pin column (CS62) starts at x=200,y=500 +; The last column of DIP pins is at x=14900, but the +; last V,G pins are at x=15000 + +grpxa__=14900 ;Rightmost X for group A +grpxb__=10100 ;Rightmost X for group B +grpxc__=4700 ;Rightmost X for group C +grpxl__=200 ;Leftmost X of DIP group C +grpyt__=6600 ;Top of DIP row +grpyb__grpyt-=6100 ;62 pins down + +conxj1__=14900 ;J1 flatcable X +conyj1__=5800 ;J1-J4 Y locn of pin 1 +conxj5__=13100 +conxdel__=2300 ;connectors are 2.3 inches apart +conyj5__=6900 + +COMMENT  + +AUGAT-LG627 CONNECTOR PIN FORMAT PRINTS AS J#-# OR LL# +THE J IS LITERAL. + +______|_____|_____|_____|_____|_____| +| 22 26 35 +| |1| 4 | 9 | +|_______|_|_______|_________________| + | | | +< | | |------------>PIN + | | + | |----------------------CONNECTOR NUMBER (JACK OR ROW LETTER) + | +< |--------------------------->CONNECTOR TYPE 0  DEC, 1  FLAT CABLE + + + + + + + +;THE TRANSFER VECTOR FOR THE AUGUAT 8136-LG627 BOARD + +^LG627V: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST CPOPJ ;LOCFUK +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG + JRST AUGDIP +>;MWL + [ASCIZ/LL#/] ; CUE FOR BOARD SLOT + [ASCIZ /#/] ; CUE FOR BOARD PIN +MDPC,< [ASCIZ/J#-# or LL# /] ;CUE FOR CONNECTOR PIN + [ASCIZ/LL# /] ;CUE FOR BODY LOC + [ASCID /AA01/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/LL#/] ;WIRELISTER BODY CUE + [ASCIZ/J# or L/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK LG627V,LTVLEN + +L2NSUB: BLOCK L2NLEN ;******* +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +;NOTE! G is included as a legal letter because it is a column name. +; However, it isn't a legal DEC pin name, so we must be careful. + +NNN__1 +FOR I IN(A,B,C,D,E,F,G,H,J,K,L,M,N,P,R,S,T,U,V) +< L2N2L I,0 +> +FOR I IN (I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + MOVE T,NOMTYP + MOVE TT,@LNAMES(T) + SETZ T, + CAMN TT,[ASCII/LG627/] + MOVE T,[PAR627,,PARAMS] + CAMN TT,[ASCII/LG631/] + MOVE T,[PAR631,,PARAMS] + SKIPN T + PUSHJ P,FUCKUP + BLT T,PARAMS+LPARAM-1 + POPJ P, + +;Parameters for differing board types sharing this Board file. +STORAGE(IMPURE) +PARAMS: +;;This table must be setup for the selected board type +MXJCON: 0 ;MAX NUMBER FLAT CABLE CONNECTORS +MXDCON: 0 ;MAX NUMBER OF DEC STYLE CONNECTORS +FLTMAX__=20 ;Max no of Flat cable conns among these boards +FLTSIZ: BLOCK FLTMAX ;Number of pins in connector + +Mwl,< +UMLCOL__6 ;UML IS PRINTED WITH DIP ROWS DOWN LENGTH OF THE PAPER +UMLROW: 0 ;LENGTH OF ROW IS UML #ROWS +FLTPIN: BLOCK FLTMAX ;x,y locations for FlatCable connectors +>;Mwl +LPARAM__.-PARAMS +STORAGE(PURE) + +;; *** VARIABLE STUFF FOR LG627 *** +PAR627: +FLT627__=9 ;TOTAL # OF SCOTCHFLEX CONNECTORS +DEC627__=6 + FLT627 ;MAX NUMBER FLAT CABLE CONNECTORS + DEC627 ;MAX NUMBER OF DEC STYLE CONNECTORS + +;FLTSIZ: +REPEAT FLTMAX,<=26  > + +;For UML +MWL,< +COL627__=30 ;30 DIPS IN EACH OF 6 ROWS ??? + COL627 ;LENGTH OF ROW IS UML #ROWS + +;**************************************** SCOTCH-FLEX PINS + +..tem__. + +;FLTPIN: ; X,,Y LOCATION OF LOWER LEFT PIN OF FLAT CABLE GROUP + ;INDEXED BY FLAT CABLE NUMBER-1 +..X__conxj1 ;J1-J4 ARE VERTICAL +REPEAT 4,< + ..X,,conyj1 +..X__..X-=400 +> + +..X__conxj5 ;J5-J9 ARE ALONG TOP +REPEAT 5,< + ..X,,conyj5 +..X__..X-conxdel +> + +REPEAT FLTMAX-<.-..TEM>,<0  > + + +>;MWL +CHECK PAR627,LPARAM + PAR631: +FLT631__=9 ;TOTAL # OF SCOTCHFLEX CONNECTORS +DEC631__=6 + FLT631 ;MAX NUMBER FLAT CABLE CONNECTORS + DEC631 ;MAX NUMBER OF DEC STYLE CONNECTORS + +;FLTSIZ: +..TEM__. +REPEAT 4,<=26  > +REPEAT 5,<=40  > +REPEAT FLTMAX-<.-..TEM>,<0  > + +;For UML +MWL,< +COL631__=30 ;30 DIPS IN EACH OF 6 ROWS ??? + COL631 ;LENGTH OF ROW IS UML #ROWS + +;**************************************** SCOTCH-FLEX PINS + +..tem__. + +;FLTPIN: ; X,,Y LOCATION OF LOWER LEFT PIN OF FLAT CABLE GROUP + ;INDEXED BY FLAT CABLE NUMBER-1 +..X__CONXJ1 ;J1-J4 ARE VERTICAL +REPEAT 4,< + ..X,,CONYJ1 +..X__..X-=400 +> + =13100,,=6900 ;J5 + =10400,,=6900 ;J6 + =7700,,=6900 ;J7 + =4500,,=6900 ;J8 + =2100,,=6900 ;J9 + +REPEAT FLTMAX-<.-..TEM>,<0  > + +>;MWL + +CHECK PAR631,LPARAM + +MWL,< +;**************************************** DEC CONNECTOR PINS + + +;CONNECTORS, DEC +DECCNY__=0 ;0.0" UP TO BOTTOM ROW OF DEC CONNECTORS +DCPINO__=200 ;.2" UP FROM BOTTOM TO SECOND ROW +DECX1__=2700 ;2.7" LEFT FOR LARGE CONNECTOR SPACES +DECX2__=2600 ;2.6" LEFT FOR SMALL CONNECTOR SPACES +GAP1T2__DECX2-=1900 ; THE SMALLER GAP BETWEEN DEC PADDLES +DCPINS__=1900 ;1.9" RIGHT FOR PIN A1 RELATIVE TO START OF CONNECTOR +DCPNSP__=100 ;.1" BETWEEN PINS HORIZONTALLY +DCGRSP__=200 ;.2" BETWEEN GROUPS OF PINS + +DCLOC: ;LOCATION OF DEC STYLE CONNECTORS + +X__DECX1*<DEC627/2>+DECX2*<DEC627/2-1> ;THE X OF V1 ON THE RIGHTMOST PADDLE! + ;INITIALLY FAR TO THE RIGHT, CONNECTORS LETTERED IN REVERSE +REPEAT DEC627/2, +< X,,DECCNY +X__X-DECX1 + X,,DECCNY +X__X-DECX2 +> +>;mwl + ;Print DIP location. +;(note that the DIP location is really the board pin location that +; pin 1 of the DIP goes into. Therefore there is allowance for +; naming V and G pins on the board.) + +PRNLOC: SETZ TT, + JUMPE A,CPOPJ + JUMPL A,CNLOC ;Connector or DIP? + LDB T,[%DIPG,,A] ;GROUP LETTER + JUMPE T,CPOPJ ;GROUP NULL? + PUTBYT @N2L(T) ;CONVERT TO LETTER AND PRINT + LDB T,[%DIPC,,A] ;Column letter + PUTBYT @N2L(T) ;CONVERT TO LETTER AND PRINT + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + LDB T,[%DIPN,,A] ;position within column + JUMPE T,PRNLO2 + CAIL T,VPINOF + JRST [ PUTBYT "V" + SUBI T,VPINOF + JRST PRNLO1] + CAIL T,GPINOF + JRST [ PUTBYT "G" + SUBI T,GPINOF + JRST PRNLO1] +PRNLO1: PUSHJ P,NPUTDEC ;PRINT IT OUT +PRNLO2: MOVEI TT,"-" ;Suggested separation char + POPJ P, + +CNLOC: LDB T,[%CONT,,A] ;CONNECTOR TYPE + JUMPE T,CNDEC ;DEC STYLE CONNECTOR + PUTBYT "J" + LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + MOVEI TT,"-" + POPJ P, + +CNDEC: LDB T,[%CONN,,A] ;CONNECTOR ROW NUMBER + PUTBYT @N2L(T) + SETZ TT, ;DEC DOESN'T WANT SEP BETWEEN A,A1 + POPJ P, + +PRNPIN: LDB T,[%%PINN,,A] + JUMPL A,PRNPNC +PRNPN1: +MWL,< + MOVEI TT,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM TT,NDIG + CAIL T,VPINOF + JRST [ PUTBYT "V" + SUBI T,VPINOF + JRST NPUTDEC] + CAIL T,GPINOF + JRST [ PUTBYT "G" + SUBI T,GPINOF + JRST NPUTDEC] + JRST NPUTDEC ;PRINT IT OUT +>;MWL +MDPC,< JRST PUTDEC > + + +PRNPNC: LDB TT,[%CONT,,A] ;DEC CONNECTOR PIN PRINTOUT + JUMPN TT,PRNPN1 + ASH T,-1 + PUTBYT @N2L(T) ;PRINT DEC CONNECTOR LETTER + LDB T,[%%PINN,,A] + ANDI T,1 + ADDI T,1 + MOVEI TT,1 + MOVEM TT,NDIG + JRST NPUTDEC ;PRINT AS 1 DIGIT TRAILING NUMBER + + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +; A = MBIT+PIN#,,LOC +; B = PACKAGE +;Skips if can map, with MAPSOC set. +; A = New MBIT+PIN#,,LOC +; B = FLAGS,, +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPUNI +; %MPROT etc. +;(Note: Pin 0 has a special hack just removes the within-socket offset, if any.) + +;Map onto post on board. Remeber that universal pattern is in +; three groups A,B,C. Columns are AA-AS,BA-BT, illegal, CA-CS + +MDWL,< +MAPOST: TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A ;Save slot spec +;Call MAPUNI to map onto column, row + LDB C,[%DIPC,,A] ;Dip column lettern + MOVNS C ;Reflect so larger is to right DIP side + LDB D,[%DIPN,,A] ;Row within column + LDB A,[%%PINN,,A] + JUMPE A,[ AOS -3(P) ;"strip dip-offset", NA to uni boards + JRST MAPOSX] + PUSHJ P,MAPUNI ;Map as universal board + JRST MAPOSX ;Fail +;Now error check, and look for movement between groups + SKIPLE D ;can only be rows 1-62 + CAILE D,=62 + JRST MAPOSX + MOVNS C ;convert back column # + LDB A,[%DIPG,,(P)] ;Which universal group? +MAPOSA: CAMN A,L2N+"A" + JRST [ CAMLE C,L2N+"S" ;overflowed into group B? + JRST [ SUB C,L2N+"S" + ADD C,L2N+"A" + SOS C ;S+1 is A + AOJA A,MAPOSB] + CAMGE C,L2N+"A" ;Underflowed? + JRST MAPOSX + CAMG C,L2N+"F" ;A-F can only be 13-62 + JRST [ CAIGE D,=13 + JRST MAPOSX + JRST MAPOS1] + JRST MAPOS1] ;OK +MAPOSB: CAMN A,L2N+"B" + JRST [ CAMGE C,L2N+"A" ;underflowed into group A? + JRST [ SUB C,L2N+"A" + AOS C + ADD C,L2N+"S" ;"A"-1 IS "S" + SOJA A,MAPOSA] + CAMLE C,L2N+"T" + JRST [ SUB C,L2N+"T" ;Overflowed into group C + ADD C,L2N+"A" + SUBI C,2 ;"T"+2 IS "A" + AOJA A,MAPOSC] + JRST MAPOS1] +MAPOSC: CAME A,L2N+"C" + JRST MAPOSX + CAMGE C,L2N+"A" + JRST [ SUB C,L2N+"A" ;Underflowed into group B + AOJE C,MAPOSX ;No column to left of A + AOS C + ADD C,L2N+"T" ;Rightmost col of group B + SOJA A,MAPOSB] + CAMLE C,L2N+"S" + JRST MAPOSX +MAPOS1: DPB A,[%DIPG,,(P)] + POP P,A + HRLI A,MAPSOC + SETZ T, + DPB T,[%DIPN,,A] + DPB D,[%%PINN,,A] + DPB C,[%DIPC,,A] +;B has flags from MAPUNI + AOSA -2(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, +>;MDWL + +;Read "DIP Slot" which in this case is Group,Column-letter,row-number +GTSLTL: PUSH P,A + MOVEI A,[[ASCIZ /LL#./] + 0] + PUSHJ P,LNPARS + JRST GTSL0 + JRST GTSL1 + SETZ TT, + PUSHJ P,GATLOC + JRST GTSL0 +; CAIE CHRREG,"@" +; JRST GTSL2 +; PUSH P,TT +; GETNUM +; POP P,TT +; JUMPE NUMREG,GTSL0 +; DPB NUMREG,[%DIPOF,,TT] +GTSL2: MOVEM TT,DESTIN + AOS -1(P) +GTSL1: AOS -1(P) +GTSL0: POP P,A + POPJ P, + +GATLOC: MOVE A,ARG1 + DPB A,[%DIPG,,TT] + MOVE A,ARG2 + DPB A,[%DIPC,,TT] + MOVE A,ARG3 + DPB A,[%DIPN,,TT] + JRST CPOPJ1 + +MD,< +;THIS SHOULD PROBABLY TRY FOR B-R-S ALSO, BUT...? +GTCONP: PUSH P,A + MOVEI A,[[ASCIZ /J#-#/] + [ASCIZ /LL#/] + 0] + PUSHJ P,LNPARSE + JRST GTCON0 + JRST GTCON1 ;NULL INPUT + PUSHJ P,GATCON ;GET JACK OR PADDLE PART OF LOC + JRST GTCON0 + LDB A,[%CONT,,TT] + JUMPE A,GTDCP ;GET DEC STYLE CONNECTOR PIN + MOVE A,ARG4 +GTCON3: DPB A,[%CONP,,TT] + HRRZM TT,DESTIN + AOS -1(P) +GTCON1: AOS -1(P) +GTCON0: POP P,A + POPJ P, + +GTDCP: SOSL A,ARG3 + CAILE A,1 + JRST GTCON0 + MOVE A,ARG2 + ASH A,1 + IOR A,ARG3 + JRST GTCON3 +>;MD + +GATCON: SETZ TT, + JUMPN A,GTCN1 ;DEC PADDLE? (VS. SCOTCHFLEX) + MOVE A,ARG2 ;ARG1 IS THE "J" + DPB A,[%CONN,,TT] + MOVEI A,1 +GTCN2: DPB A,[%CONT,,TT] ;THIS IS A FLAT CABLE CONNECTOR + TLO TT,MAPCON + JRST CPOPJ1 + +GTCN1: MOVE A,ARG1 + DPB A,[%CONN,,TT] + MOVEI A,0 ;THIS IS A DEC STYLE CONNECTOR + JRST GTCN2 + + +MWL,< + +GETLOC: MOVEI A,[[ASCIZ /J#/] ;0 - Scotchflex connector + [ASCIZ /LL#/] ;1 - Board socket + [ASCIZ /LL#@#/] ;2 - Board socket with offset + [ASCIZ /L/] ;3 - Dec connector + 0] + PUSHJ P,LNPARSE + POPJ P, + POPJ P, + SKIPE A ;STRING 0,3 ARE CONNECTOR FORMATS + CAIN A,3 ;DEC CONN MUST BE .NE. 0 FOR GATCON + JRST GATCON + SETZ TT, +; MOVE T,ARG4 +; CAIN A,2 ;THE OFFSET CASE +; DPB T,[%DIPOF,,TT] + JRST GATLOC + +;Print location for fixed format card image +;8 cols wide, with "group" left justified, "pin number" right justified +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + SETZM TCOUNT + PUSHJ P,PRNLOC ;Print LL, C, OR J01 + MOVEI T,6 + PUSHJ P,TTFILL + JUMPL A,RAYCON + JRST RAYCN1 + +RAYCON: LDB TT,[%CONT,,A] + JUMPN TT,RAYCN1 ;Scotchflex + LDB T,[%%PINN,,A] + TRNN T,1 + PUTBYT "1" + TRNE T,1 + PUTBYT "2" + ASH T,-1 + PUTBYT @N2L(T) + POPJ P, ;"C" + 5 spaces + #L = 8 + +RAYCN1: LDB T,[%%PINN,,A] + MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC ;"J01" + 3 spaces + ## = 8 + + ;AUGAT format + +;Print location for fixed format card image +;2-3 columns "GROUP", 2 columns "LOC", 3 columns pin +;DIP A.. 01 . 001 +;DECCON AJ. 01 . 0A1 +;FLAT J01 01 . 001 + +AUGDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + JUMPL A,AUGCON + LDB T,[%DIPG,,A] + PUTBYT @N2L(T) + PUTSTR [ASCIZ / /] ;2 SPACES + LDB T,[%DIPC,,A] + PUTBYT @N2L(T) + PUTSTR [ASCIZ / /] ;2 SPACES + LDB T,[%DIPN,,A] + MOVEI TT,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM TT,NDIG + CAIL T,VPINOF + JRST [ PUTBYT "V" + SUBI T,VPINOF + JRST NPUTDEC] + CAIL T,GPINOF + JRST [ PUTBYT "G" + SUBI T,GPINOF + JRST NPUTDEC] + MOVEI TT,3 ;OTHERWISE, 3 DIGIT FIELD + MOVEM TT,NDIG + JRST NPUTDEC ;PRINT IT OUT + +AUGCON: LDB TT,[%CONT,,A] + SKIPN TT ;IF DEC CONNECTOR + PUSHJ P,FUCKUP ;BARF + PUTBYT "J" + LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + PUTSTR [ASCIZ /01 /] + MOVEI TT,3 + MOVEM TT,NDIG + LDB T,[%%PINN,,A] + JRST NPUTDEC + +FOR NAME IN (CPARTP:,CONGIN:,SEQLOC:) +<NOTYET(NAME) +> +>;MWL + +CPNSEP: LDB TT,[%CONP,,T] + MOVEI TTT,0 + DPB TTT,[%CONP,,T] + POPJ P, + +CPNMER: PUSH P,A + SKIPN T + SKIPE TT + JRST CPNMR1 + MOVEI TT,1 ;T,TT=0 MEANS INITIALIZE TO FIRST + DPB TT,[%CONN,,T] ;CONNECTOR TYPE STARTS AT ZERO +CPNMR1: LDB TTT,[%CONT,,T] + JUMPE TTT,[ MOVEI A,MXDPIN ;IF A DEC CONN THEN MXDPIN IS MAX # + JRST CPNMR2] + LDB TTT,[%CONN,,T] + MOVE A,FLTSIZ-1(TTT) +CPNMR2: CAMG TT,A + JRST CNPMR1 + MOVEI TT,1 ;CARRY INTO JACK, FROM PIN# + LDB TTT,[%CONT,,T] + MOVE A,MXJCON + SKIPN TTT + MOVE A,MXDCON + LDB TTT,[%CONN,,T] + AOS TTT + DPB TTT,[%CONN,,T] + CAIGE TTT,A + JRST CNPMR1 + MOVEI TTT,1 + DPB TTT,[%CONN,,T] + LDB TTT,[%CONT,,T] + AOS TTT + DPB TTT,[%CONT,,T] +CNPMR1: DPB TT,[%CONP,,T] + POP P,A + POPJ P, + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD +NOTYET(CPNMAP:) + +MDWL,< +MWL,< +SUBTTL WIRE WRAP ROUTINES -- HEX DEC UNIVERSAL BOARDS + +^^L627TV__. ;TRANSFER VECTOR FOR QUAD HEIGHT UNIVERSAL DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + COL627 ;NROWS (USED FOR UML ONLY) + UMLCOL ;NCOLS (USED FOR UML ONLY) + UMLCOL ;NCLPRG (USED FOR UML ONLY) + 0 ;NRWPRP (USED FOR UML ONLY) + COL627*NGRPS ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(DEC627+FLT627) ;NPADS (USED FOR UML ONLY) + XWD -=25,1 ;PADLET (USED FOR UML ONLY) + XWD -2,1 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK L627TV,WTVLEN + + + ;Connector pin mapping table for MAPIT + +;**************************************** DEC CONNECTOR PINS +;PIN POSITIONS WITHIN ONE PADDLE + +X__DCPINS ;INITIAL X STARTING LOCATION +DCPINL: + +REPEAT 3, +< + REPEAT 6, + < X,,0 + X,,DCPINO + X__X-DCPNSP + > +X__X-DCGRSP+DCPNSP ;ALREADY SUB'ED AN EXTRA DCPNSP AT END OF RPT +> + +DCPWRG: 0 ;A1 + PWR,,500 ;A2 + 0 ;B1 + 0 ;B2 + 0 ;C1 + GND,,0 + 0 ;D1 + 0 + 0 ;E1 + 0 + 0 ;F1 + 0 + 1B0 ;G1 - not really legal for DEC + 1B0 + 0 ;H1 + 0 + 0 ;J1 + 0 + 0 ;K1 + 0 + 0 ;L1 + 0 + 0 ;M1 + 0 + 0 ;N1 + 0 + 0 ;P1 + 0 + 0 ;R1 + 0 + 0 ;S1 + 0 + GND,,0 ;T1 + 0 + 0 ;U1 + 0 + 0 ;V1 + 0 + + ;MAPIT - Convert board post spec to X,Y - used for routing +;A = PostSpec + +;MAPIT (WL) - CONVERT POST INTO X,Y AND BITS +;NOTE!! X,Y are viewed from DIP side, usually with X+ = right, Y+ = up +;A = MBIT+PIN#,,LOC +;SKIPS IF LEGAL POST +;T = X,,Y +;TT = PWR!GND,,VOLTAGE (If dedicated pin on board) +;TTT = (DISTANCE TO END OF ROW - FOR FUDGING CITY-BLOCK STUFF) + +MAPIT: JUMPL A,CONMAP ;MAP CONNECTOR LOCATION + SETZ TT, ;flags for Pwr, Gnd + PUSHJ P,MAPLOC ;MAP DIP LOCN + POPJ P, ;BAD LOCN +;Should return flags for Pwr or Gnd?? + SETZ TTT, ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + +;Convert PIN-SPEC in A into DIP X,Y locn (T) +;Y + UP +;X + RIGHT (FROM DIP SIDE) +MAPLOC: PUSH P,B + PUSH P,C + PUSH P,D + LDB B,[%DIPG,,A] + LDB C,[%DIPC,,A] + SUB C,L2N+"A" + IMULI C,=300 ;.3" BETWEEN COLUMNS + MOVNS C ;A is larger than S + LDB D,[%DIPN,,A] + CAIL D,VPINOF + JRST [ ADDI C,=100 ;V pin is to right + SUBI D,VPINOF + MOVE TT,[Pwr,,=500] ;+5.0V + JRST MAPLO1] + CAIL D,GPINOF + JRST [ ADDI C,=100 ;G pin is to right + SUBI D,GPINOF + MOVSI TT,Gnd + JRST MAPLO1] +MAPLO1: IMULI D,=100 + MOVEI T,GRPYT+=100 ;ROW 1 is 6.6" up + SUB T,D ; and Row 2-62 are lower + CAMN B,L2N+"A" + ADDI C,GRPXA + CAMN B,L2N+"B" + ADDI C,GRPXB + CAMN B,L2N+"C" + ADDI C,GRPXC + HRL T,C + POP P,D + POP P,C + POP P,B + JRST CPOPJ1 + +;HERE FOR CONNECTOR PINS + +CONMAP: LDB T,[%CONT,,A] + JUMPE T,CONDEC ;DEC STYLE CONNECTOR + LDB T,[%CONN,,A] ; T HAS CONNECTOR NUMBER + JUMPE T,CPOPJ + CAMLE T,MXJCON + POPJ P, + LDB TT,[%%PINN,,A] + MOVE TTT,FLTPIN-1(T) ;X,Y for whole connector + CAILE T,4 ;First 4 are vertical + JRST CONMJ5 + MOVE T,FLTSIZ-1(T) + ASH T,-1 + CAMLE TT,T ;2nd row on connector? + JRST [ SUB TTT,[=100,,0] + SUB TT,T + JRST .+1] + SOS TT + IMULI TT,=100 + ADD TTT,TT +CONM1: MOVE T,TTT + SETZB TTT,TT + JRST CPOPJ1 + +CONMJ5: MOVE T,FLTSIZ-1(T) + ASH T,-1 ;Pins in first row of connector + CAMLE TT,T + JRST [ SUBI TTT,=100 ;2nd row of connector + SUB TT,T + JRST .+1] + SOS TT + MOVNS TT + IMULI TT,=100 + HRLZS TT + ADD TTT,TT + JRST CONM1 + +;Find X,Y of DEC connector pin + +CONDEC: LDB TT,[%CONN,,A] + JUMPE TT,CPOPJ + CAMLE TT,MXDCON + POPJ P, + MOVE T,DCLOC-1(TT) ;PADDLE X,Y + LDB TT,[%%PINN,,A] + CAIL TT,2 ;2+0 IS A+1 PIN + CAILE TT,MXDPIN+2-1 + POPJ P, + ADD T,DCPINL-2(TT) + SKIPGE TT,DCPWRG-2(TT) ;Legal pin? + POPJ P, + SETZ TTT, + JRST CPOPJ1 + +;PAKSIZ (WL) - GET DIMENSIONS OF PACKAGE ON BOARD +;A = MBIT+PIN#,,LOC +;B = PACKAGE CODE +;SKIPS IF LOCATION IS LEGAL FOR THIS PACKAGE TYPE +;T = Xmin,,Ymin +;TT = Xmax,,Ymax + +PAKSIZ: SKIPE ILLPAK(B) + POPJ P, + PUSHJ P,PAKDIM ;Find outline of package on board + POPJ P, +For T IN (T,TT) +< + HLRZ TTT,T ;X dimension + CAIL TTT,GRPXL-=50 + CAILE TTT,GRPXA+=50 + POPJ P, + HRRZ TTT,T + CAIL TTT,GRPYB-=50 + CAILE TTT,GRPYT+=50 + POPJ P, +>;For + JRST CPOPJ1 + +;Define illegal package types in this board +; -1 if illegal +ILLPAK: BLOCK NPACK +; FOR @' I IN (22,36,48,64) +; <ORG ILLPAK+K.'I  -1 +; > + ORG ILLPAK+NPACK + +;??? No scheme for UML on universals yet +NOTYET(MAPRC:) +NOTYET(MAPPAD:) + +IFN 0,< +MAPRC: HLRZ TT,T ;(1,1) IS DIP IN UPPER LEFT HAND CORNER + SOJL TT,CPOPJ + CAML TT,NROWS + POPJ P, + HRRZS T ;ROW IN TT, COL IN T + SOJL T,CPOPJ + CAML T,NCOLS ;(0,0) IS NOW IN UPPER LEFT + POPJ P, + PUSH P,[0] + MOVNS TT + ADD TT,GRPCOL ;COL 30 IS FIRST ROW OF UML + DPB TT,[%DIPS,,(P)] + MOVNS T ;LAST UML COL CORRESPONDS TO FIRST DIP GROUP + MOVEI T,NGRPS(T) + DPB T,[%DIPG,,(P)] + POP P,T + JRST CPOPJ1 + +MAPPAD: SOS TT + ASH TT,1 ;TT,TTT HAVE COMPLEX PIN# + ADDI TT,(TTT) + CAMLE T,MXDCON + JRST MAPPD1 + AOS TT ;DEC PADDLES ARE PINLETTER*2+SIDE + CAILE TT,MXDPIN+2-1 ;EXISTS? + JRST MAPPDL ;NO, ERROR + HRLI T,0 +MAPPD2: MOVSI TTT,MAPCON(TT) ;PIN# IN LH + DPB T,[%CONN,,TTT] + HLRZS T + DPB T,[%CONT,,TTT] + SKIPA T,TTT +MAPPDL: SETZ T, ;LOSE RETURN + POPJ P, + +MAPPD1: SUB T,MXDCON + HRLI T,1 ;CONN TYPE IS SCOTCH + CAMLE TT,JACKSZ(T) + JRST MAPPDL + JRST MAPPD2 +>;IFN 0 + +;FPWR (WL) - FIND POWER PIN +;A = MBIT+PIN#,,LOC ;A Socket pin (MAPSOC) +;B = VOLTAGE (10 mV UNITS) +;RETURNS A=0 IF FAILS +;A = New MBIT+PIN#,,LOC + +FPWR: CAIE B,=500 ;+5.00V?? + JRST [ SETZ A, ;Don't know of any other power + POPJ P,] + JUMPL A,FPWRC ;For connector pin? + LDB B,[%DIPC,,A] ;V,G pins are in odd columns, + ; starting with a which is 1 + TRO B,1 + DPB B,[%DIPC,,A] +;Closest V pin is 8k+2 for pins [8k-1, 8k+6] + LDB T,[%DIPN,,A] + ADDI T,2 ;Pin 6 finds pin 10 + TRZ T,7 + ADDI T,2 + ADDI T,VPINOF + JRST FGND9 + +;FGND (WL) - FIND GROUND PIN +;A = MBIT+PIN#,,LOC ;A Socket pin (MAPSOC) +;RETURNS A=0 IF FAILS +;A = New MBIT+PIN#,,LOC + +FGND: JUMPL A,FGNDC + LDB B,[%DIPC,,A] ;V,G pins are in odd columns, starting with A + TRO B,1 + DPB B,[%DIPC,,A] +;Closest G pin is 8k+6 for pins [8k+1, 8k+8] + LDB T,[%DIPN,,A] + SUBI T,3 + TRZ T,7 + ADDI T,6 + ADDI T,GPINOF +FGND9: DPB T,[%%PINN,,A] + SETZ B, + DPB B,[%DIPN,,A] +FGNDC1: TLO A,MAPSOC + POPJ P, + +STORAGE(IMPURE) +GENVAR: 0 +GENFIX: 0 +STORAGE(PURE) + +;GenNom - break up asciz into nomen +;T = Ascii +;Returns: +;T = Group +;TT = Column + +GENNOM: LDB TT,[POINT 7,T,35] ;Column + MOVE TT,L2N(TT) + LDB T,[POINT 7,T,28] ;Group + MOVE T,L2N(T) + POPJ P, + + +GENTBL: +FOR I IN (AA,AB,AC,AD,AE,AF,AG,AH,AJ,AK,AL,AM,AN,AP,AR,AS) +< "I" +> +FOR I IN (BA,BB,BC,BD,BE,BF,BG,BH,BJ,BK,BL,BM,BN,BP,BR,BS,BT) +< "I" +> +FOR I IN (CA,CB,CC,CD,CE,CF,CG,CH,CJ,CK,CL,CM,CN,CP,CR,CS) +< "I" +> +LGENTB__.-GENTBL + +;Search for ground/pwr pins along top for flatcable, along bottom +; for DEC cables. + +FGNDC: + ;Fix routine for FlatCable Ground pins + MOVEI TTT,[CAIN T,1 ;Group A? + CAILE TT,6 ;Cols A-F? + SKIPA TTT,[GPINOF+6] ;Pin 6 for most columns + MOVEI TTT,GPINOF+=14 ; but only 14 for AA thru AF + POPJ P,] + LDB TT,[%CONT,,A] + SKIPN TT + ; or Fix routine for DecConnector GND pins + MOVEI TTT,[MOVEI TTT,GPINOF+=62 + POPJ P,] + JRST DOFIND + +FPWRC: MOVEI TTT,[CAIN T,1 ;Group A? + CAILE TT,6 ;Cols A-F? + SKIPA TTT,[VPINOF+=2] ;Pin 2 for most columns + MOVEI TTT,VPINOF+=18 ; but only 18 for AA thru AF + POPJ P,] + LDB TT,[%CONT,,A] + SKIPN TT ;DecConnector? + ;Fix routine for DecConnector GND pins + MOVEI TTT,[MOVEI TTT,VPINOF+=58 + POPJ P,] +DOFIND: MOVSI T,-LGENTB ;Setup generator + MOVEM T,GENVAR + MOVEM TTT,GENFIX + PUSHJ P,FINDCLOSEST + JRST FGNDC1 ;Closest in A +;CoRoutine to generate possible GNDS for FlatCable connectors + SKIPL TT,GENVAR ;Any more possiblities? + POPJ P, ;NO + MOVE T,GENTBL(TT) + AOBJP TT,.+1 + MOVEM TT,GENVAR + PUSHJ P,GENNOM + PUSHJ P,@GENFIX + SETZ A, + DPB T,[%DIPG,,A] + DPB TT,[%DIPC,,A] + DPB TTT,[%%PINN,,A] + JRST CPOPJ1 ;CoReturn + + +FOR NAME (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +>;MDWL +BEND LG627 diff --git a/src/wl/lg684.517 b/src/wl/lg684.517 new file mode 100644 index 00000000..0e7bcb59 --- /dev/null +++ b/src/wl/lg684.517 @@ -0,0 +1,1142 @@ +.ADD(ALLLOCS,LG684,LG684V) +.ADD(ALLLOCS,LG683,LG683V) +.add(alllocs,L8X30,lgx8v) ;8 ROW LG684 +MDWL,< +.ADD(ALLWW,LG684,L684TV) +.ADD(ALLWW,LG683,L683TV) +.add(allww,L8X30,lgx8tv) +>;MDWL +;Note! These .ADD's must be outside of block structure + +BEGIN LG684 + +%DIPG__<POINT 6,,23>-=18 ;DIP GROUP (The letter) +%DIPS__<POINT 6,,29>-=18 ;DIP SLOT (The number) +%DIPOF__<POINT 6,,35>-=18 ;DIP OFFSET + +%CONT__<POINT 1,,22>-=18 ;CONNECTOR TYPE 0  DEC 1  FLAT CABLE "J" +%CONN__<POINT 4,,26>-=18 ;CONNECTOR NUMBER (LETTER OR JACK #) +%CONP__<POINT 9,,35>-=18 ;CONNECTOR PIN # + +GPINS__400 ;NOMEN FOR "G" PINS ON BOARD STARTS AT 400 + ; 401 IS "G1", ETC. +BRDGND__=10 ; PIN 10 IS DEDICATED GROUND +BRDPWR__=20 ; PIN 20 IS DEDICATED POWER +MXDPIN__=36 ;MAXIMUM NUMBER OF DEC PINS/CONNECTOR + +;The L8X30 board has an area of 16 pin DIP's, in 7 rows (A-H), columns 5-30 +; and an 2 areas of 20 pin dips: rows A-F cols 1-4, and row J cols 1-30 +; (There is no H row for columns 1-4) + +;The LG684 board consists of 6 rows of 20 dips +;Row A, slot1 is the upper left (with connector paddles up, +; and from DIP side) + +;MAX # PINS ON EACH SCOTCHFLEX CONN (J0 IS ILLEGAL) + +JACKSZ: FOR I IN (0,50,50,40,40,50,50,40,40,50,50,40,40) +< =I +> + +COMMENT  + +AUGAT-LG684 CONNECTOR PIN FORMAT PRINTS AS J#-# OR LL# +THE J IS LITERAL. + +______|_____|_____|_____|_____|_____| +| 22 26 35 +| |1| 4 | 9 | +|_______|_|_______|_________________| + | | | +< | | |------------>PIN + | | + | |----------------------CONNECTOR NUMBER (JACK OR ROW LETTER) + | +< |--------------------------->CONNECTOR TYPE 0  DEC, 1  FLAT CABLE + + + + + + + + +MWL,< +comment  + +All calculations are done from the DIP side. + +(0,0) at LOWER left hand corner in left handed coordinate system. +X+ to right, Y+ is up +0,0 corresponds to FV1 of DEC connectors. + + + +XDIPSP__ =500 ; .500" DIP HORIZONTAL SPACING +YDIPSP__=1100 ;1.100" DIP VERTICAL SPACING +XGRPOF__=200 ;HORIZONTAL DISTANCE FROM ORIGIN TO DIP PIN10 OF F1 +YGRPOF__=600 ;VERTICAL DISTANCE FROM ORIGIN TO DIP PIN10 OF F1 + +XPINSP__ =300 ; .300" DIP PIN HORIZONTAL SPACING +YPINSP__ =100 ; .100" DIP PIN VERTICAL SPACING +XGNDOFF__-=100 ;OFFSET FROM DIP SLOT ORIGIN (ON EXTRA GROUND ROW) TO FIRST DIP + ;PIN ROW +;CONNECTORS, SCOTCHFLEX +FCXOFF__=100 ;.1" RIGHT FOR FIRST PIN OF FLAT CABLE CONNECTORS +FCYOFF__=7400 ;7.4" up to first pin of J2 relative to origin +FCYOF2__=300 ;.3" up for first pin of J1 relative to J2 +FCJ3OF__=2800 ;2.8" RIGHT FOR FIRST PIN OF J3 +FCGOF__=5100 ;5.1" RIGHT FOR FIRST PIN OF J5 +JCNXOF__=100 ;.1" BETWEEN PINS HORIZ. +JCNYOF__=100 ;.1" BETWEEN PINS VERT. + +;CONNECTORS, DEC +DECCNY__=0 ;0.0" UP TO BOTTOM ROW OF DEC CONNECTORS +DCPINO__=200 ;.2" UP FROM BOTTOM TO SECOND ROW +DECX1__=2700 ;2.7" LEFT FOR LARGE CONNECTOR SPACES +DECX2__=2600 ;2.6" LEFT FOR SMALL CONNECTOR SPACES +GAP1T2__DECX2-=1900 ; THE SMALLER GAP BETWEEN DEC PADDLES +DCPINS__=1900 ;1.9" RIGHT FOR PIN A1 RELATIVE TO START OF CONNECTOR +DCPNSP__=100 ;.1" BETWEEN PINS HORIZONTALLY +DCGRSP__=200 ;.2" BETWEEN GROUPS OF PINS + +>;MWL + +;THE TRANSFER VECTOR FOR THE AUGUAT 8136-LG684 BOARD + +^LGX8V: +^LG683V: +^LG684V: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST CPOPJ ;LOCFUK +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG + JRST AUGDIP ;PRINT GROUP, PIN, LOC IN AUGAT FORMAT +>;MWL + [ASCIZ/L#/] ; CUE FOR BOARD SLOT + [ASCIZ /#/] ; CUE FOR BOARD PIN +MDPC,< [ASCIZ/J#-# or LL# /] ;CUE FOR CONNECTOR PIN + [ASCIZ/L# /] ;CUE FOR BODY LOC + [ASCID /A01/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/L#/] ;WIRELISTER BODY CUE + [ASCIZ/J# or L/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK LG684V,LTVLEN +CHECK LG683V,LTVLEN + +L2NSUB: BLOCK L2NLEN ;******* +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +NNN__1 +FOR I IN(A,B,C,D,E,F,H,J,K,L,M,N,P,R,S,T,U,V) +< L2N2L I,0 +> +FOR I IN (G,I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + SETZM L8X30F + MOVE T,NOMTYP + MOVE T,@LNAMES(T) + CAMN T,[ASCII /L8X30/] + SETOM L8X30F + MOVE TT,[PAR684,,PARAMS] + CAMN T,[ASCII/LG683/] + MOVE TT,[PAR683,,PARAMS] + CAMN T,[ASCII /L8X30/] + MOVE TT,[PR8X30,,PARAMS] + BLT TT,PARAMS+LPARAM-1 + POPJ P, + +STORAGE(IMPURE) +PARAMS: +NGRPS: 0 ;NUMBER OF DIP ROWS +MXJCON: 0 ;MAX NUMBER FLAT CABLE CONNECTORS +MXDCON: 0 ;MAX NUMBER OF DEC STYLE CONNECTORS +GRPCOL: 0 ;# COLS IN GROUP +GRPDIP: 0 ;# DIPS IN GROUP +MWL,< +UMLROW: 0 ;LENGTH OF ROW IS UML #ROWS +FLTMAX__=12 +FLXPIN: BLOCK FLTMAX +DECMAX__=6 +DCLOC: BLOCK DECMAX +>;MWL +LPARAM__.-PARAMS +L8X30F: 0 ;-1 IFF kludge board + +STORAGE(PURE) + +;VARIABLE STUFF FOR HEX BOARD +PAR684: +COL684__=30 ;30 DIPS IN EACH OF 6 ROWS +FLT684__=12 ;TOTAL # OF SCOTCHFLEX CONNECTORS +DEC684__=6 + 6 + FLT684 ;MAX NUMBER FLAT CABLE CONNECTORS + DEC684 ;MAX NUMBER OF DEC STYLE CONNECTORS + COL684 ;# COLS IN GROUP + 1*COL684 ;# DIPS IN GROUP +MWL,< + COL684 ;LENGTH OF ROW IS UML #ROWS + +;**************************************** SCOTCH-FLEX PINS + +;FLXPIN: ; X,,Y LOCATION OF LOWER LEFT PIN OF FLAT CABLE GROUP + ;INDEXED BY FLAT CABLE NUMBER-1 +FOR X_0, <FLT684/4-1>, 1 +< X*FCGOF+FCXOFF,,FCYOFF+FCYOF2 ;E.G. J1 + X*FCGOF+FCXOFF,,FCYOFF ;E.G. J2 + X*FCGOF+FCXOFF+FCJ3OFF,,FCYOFF+FCYOF2 ;E.G. J3 + X*FCGOF+FCXOFF+FCJ3OFF,,FCYOFF ;E.G. J4 +> + +;**************************************** DEC CONNECTOR PINS + +;DCLOC: ;LOCATION OF DEC STYLE CONNECTORS + +X__DECX1*<DEC684/2>+DECX2*<DEC684/2-1> ;THE X OF V1 ON THE RIGHTMOST PADDLE! + ;INITIALLY FAR TO THE RIGHT, CONNECTORS LETTERED IN REVERSE +REPEAT DEC684/2, +< X,,DECCNY +X__X-DECX1 + X,,DECCNY +X__X-DECX2 +> +>;MWL +CHECK PAR684,LPARAM + +;VARIABLE PARAMETERS FOR QUAD HIGH BOARD +PAR683: +COL683__=20 ;30 DIPS IN EACH OF 6 ROWS +FLT683__=8 +DEC683__=4 + 6 + FLT683 ;MAX NUMBER FLAT CABLE CONNECTORS + DEC683 ;MAX NUMBER OF DEC STYLE CONNECTORS + COL683 ;# COLS IN GROUP + 1*COL683 ;# DIPS IN GROUP +MWL,< + COL683 ;LENGTH OF ROW IS UML #ROWS + +;**************************************** SCOTCH-FLEX PINS + +;FLXPIN: ; X,,Y LOCATION OF UPPER LEFT PIN OF FLAT CABLE GROUP + ;INDEXED BY FLAT CABLE NUMBER-1 +FOR X_0, <FLT683/4-1>, 1 +< X*FCGOF+FCXOFF,,FCYOFF+FCYOF2 ;E.G. J1 + X*FCGOF+FCXOFF,,FCYOFF ;E.G. J2 + X*FCGOF+FCXOFF+FCJ3OFF,,FCYOFF+FCYOF2 ;E.G. J3 + X*FCGOF+FCXOFF+FCJ3OFF,,FCYOFF ;E.G. J4 +> +BLOCK FLTMAX-FLT683 +;**************************************** DEC CONNECTOR PINS + +;DCLOC: ;LOCATION OF DEC STYLE CONNECTORS + +X__DECX1*<DEC683/2>+DECX2*<DEC683/2-1> ;THE X OF V1 ON THE RIGHTMOST PADDLE! + ;INITIALLY FAR TO THE RIGHT, CONNECTORS LETTERED IN REVERSE +REPEAT DEC683/2, +< X,,DECCNY +X__X-DECX1 + X,,DECCNY +X__X-DECX2 +> +BLOCK DECMAX-DEC683 +>;MWL + +CHECK PAR683,LPARAM + +;VARIABLE STUFF FOR HEX BOARD, 8 ROWS +PR8X30: +;COL684__=30 ;30 DIPS IN EACH OF 6 ROWS +;FLT684__=12 ;TOTAL # OF SCOTCHFLEX CONNECTORS +;DEC684__=6 + 8 ;NUMBER OF "GROUPS", ACTUALLY DIP ROWS A-F,H,J + FLT684 ;MAX NUMBER FLAT CABLE CONNECTORS + DEC684 ;MAX NUMBER OF DEC STYLE CONNECTORS + COL684 ;# COLS IN GROUP + 1*COL684 ;# DIPS IN GROUP +MWL,< + COL684 ;LENGTH OF ROW IS UML #ROWS + +;**************************************** SCOTCH-FLEX PINS + +;FLXPIN: ; X,,Y LOCATION OF LOWER LEFT PIN OF FLAT CABLE GROUP + ;INDEXED BY FLAT CABLE NUMBER-1 +FOR X_0, <FLT684/4-1>, 1 +< X*FCGOF+FCXOFF,,FCYOFF+FCYOF2 ;E.G. J1 + X*FCGOF+FCXOFF,,FCYOFF ;E.G. J2 + X*FCGOF+FCXOFF+FCJ3OFF,,FCYOFF+FCYOF2 ;E.G. J3 + X*FCGOF+FCXOFF+FCJ3OFF,,FCYOFF ;E.G. J4 +> + +;**************************************** DEC CONNECTOR PINS + +;DCLOC: ;LOCATION OF DEC STYLE CONNECTORS + +X__DECX1*<DEC684/2>+DECX2*<DEC684/2-1> ;THE X OF V1 ON THE RIGHTMOST PADDLE! + ;INITIALLY FAR TO THE RIGHT, CONNECTORS LETTERED IN REVERSE +REPEAT DEC684/2, +< X,,DECCNY +X__X-DECX1 + X,,DECCNY +X__X-DECX2 +> +>;MWL +CHECK PR8X30,LPARAM + +PRNLOC: SETZ TT, + JUMPE A,CPOPJ + JUMPL A,CNLOC + LDB T,[%DIPG,,A] ;GROUP LETTER + JUMPE T,CPOPJ ;GROUP NULL? + PUTBYT @N2L(T) ;CONVERT TO LETTER AND PRINT + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + LDB T,[%DIPS,,A] ;SLOT NUMBER WITHIN GROUP + PUSHJ P,NPUTDEC ;PRINT IT OUT + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + LDB T,[%DIPOF,,A] ;ANY SLOT OFFSET? + JUMPE T,PRNLC1 + PUTBYT "@" +MWL,< PUSHJ P,NPUTDEC > +MDPC,< PUSHJ P,PUTDEC > +PRNLC1: MOVEI TT,"-" + POPJ P, + +CNLOC: LDB T,[%CONT,,A] ;CONNECTOR TYPE + JUMPE T,CNDEC ;DEC STYLE CONNECTOR + PUTBYT "J" + LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + MOVEI TT,"-" + POPJ P, + +CNDEC: LDB T,[%CONN,,A] ;CONNECTOR ROW NUMBER + PUTBYT @N2L(T) + SETZ TT, ;DEC DOESN'T WANT SEP BETWEEN A,A1 + POPJ P, + +PRNPIN: LDB T,[%%PINN,,A] + JUMPL A,PRNPNC + CAIGE T,GPINS + JRST PRNPN1 + SUBI T,GPINS + PUTBYT "G" +PRNPNA: SKIPA TT,[1] +PRNPN1: +MWL,< + MOVEI TT,2 + MOVEM TT,NDIG + JRST NPUTDEC +>;MWL +MDPC,< JRST PUTDEC + JRST PUTDEC > + +PRNPNC: LDB TT,[%CONT,,A] ;DEC CONNECTOR PIN PRINTOUT + JUMPN TT,PRNPN1 + ASH T,-1 + PUTBYT @N2L(T) ;PRINT DEC CONNECTOR LETTER + LDB T,[%%PINN,,A] + ANDI T,1 + ADDI T,1 + JRST PRNPNA ;PRINT AS 1 DIGIT TRAILING NUMBER + + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +;A = MBIT+PIN#,,LOC +;B = PACKAGE +;Skips if can map, with MAPSOC set. +; Possibly MAPPWR or MAPGND if V or G posts on board +;A = New MBIT+PIN#,,LOC +;B = FLAGS,,PIN CHANGE +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPPL1 ;PIN NUMBER CHANGED BY 1 (KLUDGE) + +MDWL,< +MAPOST: TLNN A,CRDPIN ;SHOULDN'T BE ON + TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A + LDB T,[%DIPG,,A] ;Letter + LDB TT,[%DIPS,,A] ;Slot number + LDB D,[%DIPOF,,A] ;Offset field within socket + LDB A,[%%PINN,,A] ;Pin number + JUMPE A,MAPOS1 ;Just return the board socket, without offset + SKIPE L8X30F ;Check for kludge L8X30 board + JRST [ CAMG T,L2N+"H" + CAIGE TT,5 + JRST .+1 ;Not within <A:H><5-30>, just normal 20 pin + MOVEI C,=16 + JRST MAPOS8] + MOVEI C,=20 ;BOARD HAS 20 PIN SOCKETS +MAPOS8: PUSHJ P,MAPPER + JRST MAPOSX + LDB T,[%DIPS,,(P)] ;NOW OFFSET SLOT + MOVEI TT,-1(T) + ADD TT,C ;DOES OFFSET OVERFLOW GROUP? + CAML TT,GRPCOL + JRST MAPOSX + ADD T,C + DPB T,[%DIPS,,(P)] + LDB T,[%DIPG,,(P)] ;FIRST ROW IS A (=1) + ADD T,D ;DOES OFFSET OVERFLOW NO. OF ROWS? + CAMLE T,NGRPS ;LEGAL ROW # + JRST MAPOSX + DPB T,[%DIPG,,(P)] +MAPOS1: SETZ T, + DPB T,[%DIPOF,,(P)] ;WITHIN SOCKET OFFSET GOES AWAY + DPB A,[%%PINN,,(P)] + AOS -3(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, +>;MDWL + +GTSLTL: PUSH P,A + MOVEI A,[[ASCIZ /L#./] + 0] + PUSHJ P,LNPARS + JRST GTSL0 + JRST GTSL1 + SETZ TT, + PUSHJ P,GATLOC + JRST GTSL0 + CAIE CHRREG,"@" + JRST GTSL2 + PUSH P,TT + GETNUM + POP P,TT + JUMPE NUMREG,GTSL0 + DPB NUMREG,[%DIPOF,,TT] +GTSL2: MOVEM TT,DESTIN + AOS -1(P) +GTSL1: AOS -1(P) +GTSL0: POP P,A + POPJ P, + +GATLOC: SKIPE A,ARG1 + CAMLE A,NGRPS + POPJ P, + DPB A,[%DIPG,,TT] + SKIPE A,ARG2 + CAMLE A,GRPDIP + POPJ P, + DPB A,[%DIPS,,TT] + JRST CPOPJ1 + +MD,< +;THIS SHOULD PROBABLY TRY FOR B-R-S ALSO, BUT...? +GTCONP: PUSH P,A + MOVEI A,[[ASCIZ /J#-#/] + [ASCIZ /LL#/] + 0] + PUSHJ P,LNPARSE + JRST GTCON0 + JRST GTCON1 ;NULL INPUT + PUSHJ P,GATCON ;GET JACK OR PADDLE PART OF LOC + JRST GTCON0 + LDB A,[%CONT,,TT] + JUMPE A,GTDCP ;GET DEC STYLE CONNECTOR PIN + LDB A,[%CONN,,TT] ;WHICH JACK + HRRZ A,JACKSZ(A) + CAMGE A,ARG4 ;LEGAL PIN#? + JRST GTCON0 ;NO + SKIPN A,ARG4 + JRST GTCON0 +GTCON3: DPB A,[%CONP,,TT] + HRRZM TT,DESTIN + AOS -1(P) +GTCON1: AOS -1(P) +GTCON0: POP P,A + POPJ P, + +GTDCP: SKIPE A,ARG2 ;READ AND CONVERT DEC CONNECTOR PIN NUMBER + CAILE A,MXDPIN/2 + JRST GTCON0 ;LETTER TOO BIG + SOSL A,ARG3 + CAILE A,1 + JRST GTCON0 + MOVE A,ARG2 + ASH A,1 + IOR A,ARG3 + JRST GTCON3 +>;MD + +GATCON: SETZ TT, + JUMPN A,GTCN1 ;DEC PADDLE? (VS. SCOTCHFLEX) + SKIPE A,ARG2 ;ARG1 IS THE "J" + CAMLE A,MXJCON + POPJ P, + DPB A,[%CONN,,TT] + MOVEI A,1 +GTCN2: DPB A,[%CONT,,TT] ;THIS IS A FLAT CABLE CONNECTOR + TLO TT,MAPCON + JRST CPOPJ1 + +GTCN1: SKIPE A,ARG1 + CAMLE A,MXDCON ;MAX NUMBER OF DEC CONNECTORS + POPJ P, + DPB A,[%CONN,,TT] + MOVEI A,0 ;THIS IS A DEC STYLE CONNECTOR + JRST GTCN2 + + +MWL,< + +GETLOC: MOVEI A,[[ASCIZ /J#/] ;0 - Scotchflex connector + [ASCIZ /L#/] ;1 - Board socket + [ASCIZ /L#@#/] ;2 - Board socket with offset + [ASCIZ /L/] ;3 - Dec connector + 0] + SKIPE L8X30F + MOVEI A,[[ASCIZ /Z#/] ;0 - Scotchflex connector - not really there + [ASCIZ /L#/] ;1 - Board socket + [ASCIZ /L#@#/] ;2 - Board socket with offset + [ASCIZ /L/] ;3 - Dec connector + 0] + PUSHJ P,LNPARSE + POPJ P, + POPJ P, + SKIPE A ;STRING 0,3 ARE CONNECTOR FORMATS + CAIN A,3 ;DEC CONN MUST BE .NE. 0 FOR GATCON + JRST GATCON + SETZ TT, + MOVE T,ARG4 + CAIN A,2 ;THE OFFSET CASE + DPB T,[%DIPOF,,TT] + JRST GATLOC + +;Print location for fixed format card image +;8 cols wide, with "group" left justified, "pin number" right justified +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + PUSHJ P,PRNLOC ;A01 or J01 or C + LDB T,[%%PINN,,A] ;DIP PIN NUMBER + JUMPL A,RAYCON + CAIL T,GPINS + JRST RAYDP1 + PUTSTR [ASCIZ / /] ;3 SPACES + MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC ;"A01" + 3 spaces + ## = 8 + +RAYDP1: SUBI T,GPINS + PUTSTR [ASCIZ / /] ;2 SPACES + CAIGE T,=10 + PUTBYT 40 ;"A01" + 3 spaces + G# = 8 + PUTBYT "G" + JRST PUTDEC ;"A01" + 2 spaces + G## = 8 + +RAYCON: PUTSTR [ASCIZ / /] ;3 spaces + LDB TT,[%CONT,,A] + JUMPN TT,RAYCN1 ;Scotchflex + PUTSTR [ASCIZ / /] ;"C" + 5 spaces + LDB T,[%%PINN,,A] + TRNN T,1 + PUTBYT "1" + TRNE T,1 + PUTBYT "2" + ASH T,-1 + PUTBYT @N2L(T) + POPJ P, ;"C" + 5 spaces + #L = 8 + +RAYCN1: LDB T,[%%PINN,,A] + MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC ;"J01" + 3 spaces + ## = 8 + + + ;AUGAT format + +;Print location for fixed format card image +;2-3 columns "GROUP", 2 columns "LOC", 3 columns pin +;DIP A.. 01 . 001 +;DECCON AJ. 01 . 0A1 +;FLAT J01 01 . 001 + +AUGDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + JUMPL A,AUGCON + LDB T,[%DIPG,,A] + PUTBYT @N2L(T) + PUTSTR [ASCIZ / /] ;2 SPACES + LDB T,[%DIPS,,A] + MOVEI TTT,2 + MOVEM TTT,NDIG + PUSHJ P,NPUTDEC + PUTSTR [ASCIZ / /] ;1 SPACE + LDB T,[%%PINN,,A] + MOVEI TTT,3 + MOVEM TTT,NDIG + JRST NPUTDEC + +AUGCON: LDB TT,[%CONT,,A] + JUMPN TT,AUGCN1 ;Scotchflex + LDB T,[%CONN,,A] + PUTBYT @N2L(T) + PUTSTR [ASCIZ /J 01 0/] ;Constant garbage + LDB T,[%%PINN,,A] + LSH T,-1 + PUTBYT @N2L(T) + LDB T,[%%PINN,,A] + TRNN T,1 + PUTBYT "1" + TRNE T,1 + PUTBYT "2" + POPJ P, + +;Scotchflex flat cable connector +AUGCN1: PUTBYT "J" + LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + PUTSTR [ASCIZ /01 /] + MOVEI TT,3 + MOVEM TT,NDIG + LDB T,[%%PINN,,A] + JRST NPUTDEC + + +FOR NAME IN (CPARTP:,CONGIN:,SEQLOC:) +<NOTYET(NAME) +> +>;MWL + +CPNSEP: LDB TT,[%CONP,,T] + MOVEI TTT,0 + DPB TTT,[%CONP,,T] + POPJ P, + +CPNMER: PUSH P,A + SKIPN T + SKIPE TT + JRST CPNMR1 + MOVEI TT,1 ;T,TT=0 MEANS INITIALIZE TO FIRST + DPB TT,[%CONN,,T] ;CONNECTOR TYPE STARTS AT ZERO +CPNMR1: LDB TTT,[%CONN,,T] + HRRZ A,JACKSZ(TTT) + LDB TTT,[%CONT,,T] + SKIPN TTT + MOVEI A,MXDPIN + CAMG TT,A + JRST CNPMR1 + MOVEI TT,1 ;CARRY INTO JACK, FROM PIN# + LDB TTT,[%CONT,,T] + MOVE A,MXJCON + SKIPN TTT + MOVE A,MXDCON + LDB TTT,[%CONN,,T] + AOS TTT + DPB TTT,[%CONN,,T] + CAIGE TTT,A + JRST CNPMR1 + MOVEI TTT,1 + DPB TTT,[%CONN,,T] + LDB TTT,[%CONT,,T] + AOS TTT + DPB TTT,[%CONT,,T] +CNPMR1: DPB TT,[%CONP,,T] + POP P,A + POPJ P, + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD +NOTYET(CPNMAP:) + +MDWL,< +MWL,< +SUBTTL WIRE WRAP ROUTINES -- HEX DEC 20 PIN BOARDS + +^^L684TV__. ;TRANSFER VECTOR FOR HEX HEIGHT 20 PIN DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + COL684 ;NROWS (USED FOR UML ONLY) + 6 ;A-F NCOLS (USED FOR UML ONLY) + 6 ;NCLPRG (USED FOR UML ONLY) + 0 ;NRWPRP (USED FOR UML ONLY) + COL684*6 ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(DEC684+FLT684) ;NPADS (USED FOR UML ONLY) + XWD -=25,1 ;PADLET (USED FOR UML ONLY) + XWD -2,1 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK L684TV,WTVLEN + +^^L683TV__. ;TRANSFER VECTOR FOR QUAD HEIGHT 20 PIN DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + COL683 ;NROWS (USED FOR UML ONLY) + 6 ;NCOLS (USED FOR UML ONLY) + 6 ;NCLPRG (USED FOR UML ONLY) + 0 ;NRWPRP (USED FOR UML ONLY) + COL683*6 ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(DEC683+FLT683) ;NPADS (USED FOR UML ONLY) + XWD -=25,1 ;PADLET (USED FOR UML ONLY) + XWD -2,1 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK L683TV,WTVLEN + +^^LGX8TV__. ;TRANSFER VECTOR FOR HEX HEIGHT 20 PIN DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWRX8 ;FIND A POST WITH POWER + JRST FGNDX8 ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + COL684 ;NROWS (USED FOR UML ONLY) + 8 ;A-G NCOLS (USED FOR UML ONLY) + 8 ;NCLPRG (USED FOR UML ONLY) + 0 ;NRWPRP (USED FOR UML ONLY) + COL684*6 ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(DEC684+FLT684) ;NPADS (USED FOR UML ONLY) + XWD -=25,1 ;PADLET (USED FOR UML ONLY) + XWD -2,1 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK LGX8TV,WTVLEN + + +;TABLES FOR MAPIT + +;**************************************** DIP PINS + +DEFINE XY(X,Y) +< X*XPINSP,,Y*YPINSP +> + +;Pin position offset from socket origin (pin 10, lower left). DIP side! +PINTAB: +FOR Y_9, 0, -1 +< XY(0,Y) +> +FOR Y_0, 9, 1 +< XY(1,Y) +> + +;**************************************** DEC CONNECTOR PINS +;PIN POSITIONS WITHIN ONE PADDLE + +X__DCPINS ;INITIAL X STARTING LOCATION +DCPINL: + +REPEAT 3, +< + REPEAT 6, + < X,,0 + X,,DCPINO + X__X-DCPNSP + > +X__X-DCGRSP+DCPNSP ;ALREADY SUB'ED AN EXTRA DCPNSP AT END OF RPT +> + +DCPWRG: 0 ;A1 + PWR,,500 + 0 ;B1 + 0 + 0 ;C1 + GND,,0 +DCGNDT__.-DCPWRG+1 + 0 ;D1 + 0 + 0 ;E1 + 0 + 0 ;F1 + 0 + 0 ;H1 + 0 + 0 ;J1 + 0 + 0 ;K1 + 0 + 0 ;L1 + 0 + 0 ;M1 + 0 + 0 ;N1 + 0 + 0 ;P1 + 0 + 0 ;R1 + 0 + 0 ;S1 + 0 + GND,,0 ;T1 +DCGNDB__.-DCPWRG+1 + 0 + 0 ;U1 + 0 + 0 ;V1 + 0 + + MAPIT: JUMPL A,CONMAP ;MAP CONNECTOR LOCATION + PUSHJ P,MAPLOC ;MAP DIP LOCN + POPJ P, ;BAD LOCN + LDB TTT,[%%PINN,,A] ;PIN # + CAIL TTT,GPINS ;WANT POWER OR GROUND? + JRST PINPGP ;YES, RETURN FIX IT UP +MAPIT0: ADD T,PINTAB-1(TTT) ;ADD EXTRA XY FOR PIN + SKIPN L8X30F ;Kludge board? + JRST MAPIT1 + LDB TT,[%DIPG,,A] ;Letter + CAMLE TT,L2N+"H" + JRST MAPIT1 + LDB TT,[%DIPS,,A] ;Slot number + CAIGE TT,5 + JRST MAPIT1 ;NORMAL DIP AREA + SETZ TT, + CAIN TTT,=8 + MOVE TT,[PWR,,=1200] + CAIN TTT,=16 + MOVSI TT,GND + SETZ TTT, ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + +MAPIT1: SETZ TT, + CAIN TTT,BRDGND + MOVSI TT,GND + CAIN TTT,BRDPWR + MOVE TT,[PWR,,=500] ;+5.00 VOLTS + SETZ TTT, ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + +; TWP GROUND PINS FOR SOCKET + +PINPGP: CAIN TTT,GPINS+3 ;ONLY PIN 3 HAS A LEGAL GROUND PIN + POPJ P, ;OTHERWISE, ILLEGAL MAP + HRRZ TT,PINTAB-GPINS-1(TTT) ;GET Y OFFSET ONLY FOR DIP PIN + ADD T,TT ;ADD IT INTO PIN POSITION + ADD T,[XGNDOFF,,0] ;GND PINS ARE OFFSET IN X + MOVSI TT,GND +PINPG1: SETZ TTT, + JRST CPOPJ1 + +;Convert PIN-SPEC in A into DIP X,Y locn (T) +;Y + UP +;X + RIGHT (FROM DIP SIDE) +MAPLOC: LDB TT,[%DIPG,,A] ;GROUP LETTER + JUMPE TT,CPOPJ + CAMLE TT,NGRPS ;GROUP TOO BIG? + POPJ P, + LDB T,[%DIPS,,A] ;DIP # + JUMPE T,CPOPJ + CAMLE T,GRPDIP ;TOO MANY DIPS FOR SLOT + POPJ P, +;Slot 1 is X=0 + SOS T + IMULI T,XDIPSP ;SLOT NUMBER IS OFFSET HORIZONTALLY + HRLZ T,T +;Row F is Y=0 + MOVNS TT + ADD TT,NGRPS + IMULI TT,YDIPSP ;CALCULATE Y OFFSET + HRR T,TT + ADD T,[XGRPOF,,YGRPOF] ;ADD IN OFFSET FOR ENTIRE DIP ARRAY + JRST CPOPJ1 + +;HERE FOR CONNECTOR PINS + +CONMAP: LDB T,[%CONT,,A] + JUMPE T,CONDEC ;DEC STYLE CONNECTOR + LDB T,[%CONN,,A] ; T HAS CONNECTOR NUMBER + JUMPE T,CPOPJ + CAMLE T,MXJCON + POPJ P, + HRRZ TTT,JACKSZ(T) ;TTT HAS MAX NUMBER OF PINS FOR THIS CONNECTOR + LDB TT,[%%PINN,,A] + JUMPE TT,CPOPJ + CAMLE TT,TTT + POPJ P, ;ILLEGAL NUMBER OF PINS + ASH TTT,-1 + MOVE T,FLXPIN-1(T) ;X,Y for whole connector + CAMLE TT,TTT ;Bottom row? + JRST CNFCL + SOS TT ;YES + IMULI TT,JCNXOF + HRLZS TT ;X,,Y OFFSET OF PIN WITHIN CONNECTOR + ADD T,TT + SETZB TTT,TT + JRST CPOPJ1 + +;Top row Scotchflex pins, (all grounds) +CNFCL: SUBI TT,1(TTT) + IMULI TT,JCNXOF + HRLZS TT + HRRI TT,JCNYOF ;X,,Y OFFSET OF PIN WITHIN CONNECTOR + ADD T,TT + MOVSI TT,GND + SETZ TTT, + JRST CPOPJ1 + +CONDEC: LDB TT,[%CONN,,A] + JUMPE TT,CPOPJ + CAMLE TT,MXDCON + POPJ P, + MOVE T,DCLOC-1(TT) ;PADDLE X,Y + LDB TT,[%%PINN,,A] + CAIL TT,2 ;2+0 IS A+1 PIN + CAILE TT,MXDPIN+2-1 + POPJ P, + ADD T,DCPINL-2(TT) + MOVE TT,DCPWRG-2(TT) + SETZ TTT, + JRST CPOPJ1 + +PAKSIZ: SKIPE ILLPAK(B) + POPJ P, + LDB TT,[%DIPS,,A] ;STARTING DIP SLOT + LDB T,[%DIPG,,A] ;Row A, slot 1 is upper left + SUB T,PAKHGT(B) + ADD TT,PAKWID(B) ;HORIZONTAL EXTENT OF ADAPTOR + JUMPLE T,CPOPJ + JUMPLE TT,CPOPJ + CAMG T,NGRPS + CAMLE TT,GRPCOL ;MUST BE WITHIN GROUP HORIZONTALLY + POPJ P, + JRST PAKDIM + +;Define illegal package types in this board +; -1 if illegal +ILLPAK: BLOCK NPACK + FOR @' I IN (22,24,36,40,48,64) + <ORG ILLPAK+K.'I  -1 + > + ORG ILLPAK+NPACK + +MAPRC: HLRZ TT,T ;(1,1) IS DIP IN UPPER LEFT HAND CORNER + SOJL TT,CPOPJ + CAML TT,NROWS + POPJ P, + HRRZS T ;ROW IN TT, COL IN T + SOJL T,CPOPJ + CAML T,NCOLS ;(0,0) IS NOW IN UPPER LEFT + POPJ P, + PUSH P,[0] + MOVNS TT + ADD TT,GRPCOL ;COL 30 IS FIRST ROW OF UML + DPB TT,[%DIPS,,(P)] + MOVNS T ;LAST UML COL CORRESPONDS TO FIRST DIP GROUP + HRRZS T + ADD T,NGRPS + DPB T,[%DIPG,,(P)] + POP P,T + JRST CPOPJ1 + +MAPPAD: SOS TT + ASH TT,1 ;TT,TTT HAVE COMPLEX PIN# + ADDI TT,(TTT) + CAMLE T,MXDCON + JRST MAPPD1 + AOS TT ;DEC PADDLES ARE PINLETTER*2+SIDE + CAILE TT,MXDPIN+2-1 ;EXISTS? + JRST MAPPDL ;NO, ERROR + HRLI T,0 +MAPPD2: MOVSI TTT,MAPCON(TT) ;PIN# IN LH + DPB T,[%CONN,,TTT] + HLRZS T + DPB T,[%CONT,,TTT] + SKIPA T,TTT +MAPPDL: SETZ T, ;LOSE RETURN + POPJ P, + +MAPPD1: SUB T,MXDCON + HRLI T,1 ;CONN TYPE IS SCOTCH + CAMLE TT,JACKSZ(T) + JRST MAPPDL + JRST MAPPD2 + +FPWRX8: LDB T,[%DIPG,,A] ;Letter + LDB TT,[%DIPS,,A] ;Slot number + CAMG T,L2N+"H" + CAIGE TT,5 + JRST FPWR ;NORMAL DIP AREA +FPWRN: SETZ A, ;NO SUCH PIN + POPJ P, + +FPWR: CAIE B,=500 ;+5.00V?? + JRST FPWRN + MOVE T,A ;SAVE IF CONN PIN + MOVEI B,BRDPWR + DPB B,[%%PINN,,A] + TLO A,MAPSOC + JUMPL A,FPWRC + POPJ P, + +FGNDX8: LDB T,[%DIPG,,A] ;Letter + LDB TT,[%DIPS,,A] ;Slot number + CAMG T,L2N+"H" + CAIGE TT,5 + JRST FGND ;NORMAL DIP AREA +FGNDN: SETZ A, ;NO SUCH PIN + POPJ P, + +FGND: MOVE T,A + MOVEI B,BRDGND + DPB B,[%%PINN,,A] + TLO A,MAPSOC + JUMPL A,FGNDC + POPJ P, + +;Find ground for connector +FGNDC: LDB TT,[%CONT,,A] + JUMPE TT,FGNDDC + MOVE TT,L2N+"A" + JRST FPWRC1 + +;;??? MIGHT BE DECOMMITTED ??? + LDB TT,[%CONN,,A] ;USE ROW OF GNDS ON OTHER HALF OF CONN + LDB T,[%%PINN,,T] ;ORIGINAL PIN# + HRRZ TT,JACKSZ(TT) + ASH TT,-1 + CAMG T,TT + ADD T,TT +FGNDC1: DPB T,[%%PINN,,A] + TLO A,MAPSOC + POPJ P, + +;SEARCH FOR CLOSEST BOARD PIN TO WIRE TO +;A = MAPSOC+BRDPWR/GND,, +;T = ORIGINAL CONNECTOR PIN + +FPWRC: LDB TT,[%CONT,,A] ;CONNECTOR TYPE? + JUMPE TT,FGNDDC ;DEC PADDLE + MOVE TT,L2N+"A" ;SCOTCHFLEX IN REAR, NEXT TO "A" + JRST FPWRC1 + +FGNDDC: MOVE TT,L2N+"F" + SKIPE L8X30F + MOVE TT,L2N+"J" +FPWRC1: TDZ A,[MAPCON,,-1] ;CLEAR DIP LOC STUFF + DPB TT,[%DIPG,,A] ;FIND CONN GROUNDS ON "F" ROW + MOVEI TT,0 + DPB TT,[%DIPS,,A] ;THIS WILL BE SOCKET PIN + PUSH P,A ;-4(P) TEST LOC + MOVE A,T ;ORIGINAL CONNECTOR PIN + PUSHJ P,MAPIT ;GET X,Y + SETZ T, + HLRE TT,T + PUSH P,TT ;-3(P) X + HRRES T + PUSH P,T ;-2(P) Y + PUSH P,[0] ;-1(P) CLOSEST SO FAR + PUSH P,[377777,,-1] ;0(P) BEST DISTANCE SO FAR +FPWGL: LDB T,[%DIPS,,-4(P)] + AOS T + CAMLE T,GRPCOL ;GO THRU WHOLE ROW, LOOKING FOR BEST + JRST [ MOVE A,-1(P) + SUB P,[5,,5] + POPJ P,] + DPB T,[%DIPS,,-4(P)] + MOVE A,-4(P) + PUSHJ P,MAPIT + JRST FPWGL + HLRE TT,T + SUB TT,-3(P) ;X + IMUL TT,TT + HRRES T + SUB T,-2(P) + IMUL T,T + ADD T,TT ;DISTANCE + CAML T,0(P) + JRST FPWGL + MOVEM T,0(P) + MOVE A,-4(P) + MOVEM A,-1(P) + JRST FPWGL + +FOR NAME (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +>;MDWL +BEND LG684 diff --git a/src/wl/mpg21.502 b/src/wl/mpg21.502 new file mode 100644 index 00000000..7a9582bf --- /dev/null +++ b/src/wl/mpg21.502 @@ -0,0 +1,685 @@ +;<WIRELIST>MPG21.FAI.9, 15-NOV-75 19:03:46, EDIT BY HELLIWELL +.ADD(ALLLOCS,MPG21,LMP21V) +.ADD(ALLLOCS,PG21,LMP21V) + +MDWL,< +.ADD(ALLWW,MPG21,MP21TV) +.ADD(ALLWW,PG21,MP21TV) +>;MDWL +;Note! These .ADD's must be outside of block structure + +BEGIN MPG21 + +;THE TRANSFER VECTOR FOR THE AUGUAT 8136 PG21-180 BOARD + +^LMP21V: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< + JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST LOCFUK ;PATCHUP OLD VERSIONS +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG + JRST AUGDIP +>;MWL + [ASCIZ/ #LL#/] ;CUE FOR BOARD SLOT + [ASCIZ/ #/] ;CUE FOR BOARD PIN +MDPC,< [ASCIZ/ #LJ#-#/] ;CUE FOR CONNECTOR PIN + [ASCIZ/ #L#(@#)/] ;CUE FOR BODY LOC + [ASCID/1A01/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/#L#(@#) or #LJ#/] ;WIRELISTER BODY CUE + [ASCIZ/#LJ#/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK LMP21V,LTVLEN + +L2NSUB: BLOCK L2NLEN +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +NNN__1 +FOR I IN(A,B,C,D,E,F) +< L2N2L I,0 +> +FOR I IN (G,I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + + ;SOME BYTE POINTERS FOR EXTRACTING FIELDS + +%DIPPNL__<POINT 3,,20>-=18 ;PANEL NUMBER +%DIPG__<POINT 3,,23>-=18 ;DIP GROUP +%DIPS__<POINT 6,,29>-=18 ;DIP SLOT +%DIPOF__<POINT 6,,35>-=18 ;DIP OFFSET +;NOTE - Old format MPG21's have no offset, but the DIP slot was <POINT 12,,35> + +%CONP__<POINT 12,,35>-=18 ;CONNECTOR PIN # (AND JACK NUMBER <PINS 1-2*26>) +%CNPG__<POINT 5,,22>-=18 ;<PANEL-1>*NGRPS+GROUP +%CNJK__<POINT 1,,23>-=18 ;CONNECTOR JACK BIT + +MXPNL__5 ;max number of panels wrappable at once +NGRPS__6 ;PG21-180 HAS 6 GROUPS +GRPCOL__5 ;# COLS IN GROUP +GRPROW__6 ;# ROWS IN GROUP +MAXDIP__GRPROW*GRPCOL ;# DIPS IN GROUP +MAXCNP__=26 + +;The 8136-PG21 consists of 180 dip slots, organized into +;6 groups of 30 dips each. +;The groups are labeled A-F, with group A to left +;Withhin a group, slots are numbered: +; 5 4 3 2 1 +; 10 9 .... 6 +; 15 .... 11 +; 20 .... 16 +; 25 .... 21 +; 30 .... 26 + +;(All coordinates are from DIP side, assuming Scotchflex conns +; are at the top) + +COMMENT  + +AUGAT-8136-PG21 CONNECTOR PIN FORMAT PRINTS AS #LJ#(#) +WHERE L IS THE GROUP. THE J IS LITERAL. THE FIRST DIGIT IS THE PANEL +AND THE SECOND IS THE JACK. PIN IS LAST + +______|_____|_____|_____|_____|_____| +| 2223 35 +| 5 |1| 12 | +|_____ ___|_|_______________________| + | | | +< | | |------------>PIN + | | +< | |------------------------->JACK 01, 12 + | +< |-------------------------------># <PANEL-1>*NGRPS+GROUP + + + +;VARIOUS FIXUP ROUTINES +MD,< +;T = LOCATION FOR BODY +;(TT= RDVER .LT. 27) + +LOCFUK: CAIL TT,27 ;OLD VERSIONS HAVE DIFFERENT + POPJ P, + MOVE TT,NOMTYP ;GAD, THIS IS BLETCHEROUS + CAIN TT,PGNOM + JRST [ MOVEI TT,1 ;PATCH UP PG21'S TO LOOK LIKE 1 OF MPG21 + DPB TT,[%DIPPNL,,T] + JRST .+1] + LDB TT,[POINT 12,T,35] ;CONVERT MPG21'S LOC TO LOC/OFFSET + DPB TT,[%DIPS,,T] + SETZ TT, + DPB TT,[%DIPOF,,T] + POPJ P, +>;MD + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + POPJ P, + +PRNLOC: JUMPL A,CNLOC + LDB TT,[%DIPG,,A] + LDB T,[%DIPPNL,,A] ;PANEL NUMBER + IOR TT,T + JUMPE TT,CPOPJ ;BOTH BANEL AND GROUP NULL? + PUSHJ P,PUTDEC ;PANEL # + LDB T,[%DIPG,,A] ;GROUP LETTER + PUTBYT @N2L(T) ;CONVERT TO LETTER AND PRINT + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + LDB T,[%DIPS,,A] ;SLOT NUMBER WITHIN GROUP + PUSHJ P,NPUTDEC ;PRINT IT OUT + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + LDB T,[%DIPOF,,A] ;ANY SLOT OFFSET? + JUMPE T,PRNLC1 + PUTBYT "@" +MWL,< PUSHJ P,NPUTDEC > +MDPC,< PUSHJ P,PUTDEC > +PRNLC1: MOVEI TT,"-" + POPJ P, + +CNLOC: LDB T,[%CNPG,,A] + JUMPE T,CPOPJ + PUSH P,T+1 + SOS T + IDIVI T,NGRPS + AOS T+1 + EXCH T+1,(P) + AOS T + PUSHJ P,PUTDEC ;PANEL NUMBER + POP P,T + PUTBYT @N2L(T) ;GROUP LETTER + PUTBYT "J" + LDB T,[%CNJK,,A] + AOS T + PUSHJ P,PUTDEC + MOVEI TT,"-" + POPJ P, + +PRNPIN: TLNE A,MAPPWR!MAPGND + JRST [ MOVEI T,"G" + TLNN A,MAPGND + MOVEI T,"V" + PUTBYT (T) + POPJ P,] + LDB T,[%%PINN,,A] +MWL,< MOVEI TT,2 + MOVEM TT,NDIG + JRST NPUTDEC +> +MDPC,< JRST PUTDEC > + + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +;A = MBIT+PIN#,,LOC +;B = PACKAGE +;Skips if can map, with MAPSOC set. +; Possibly MAPPWR or MAPGND if V or G posts on board +;A = New MBIT+PIN#,,LOC +;B = FLAGS,,PIN CHANGE +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPPL1 ;PIN NUMBER CHANGED BY 1 (KLUDGE) + +MDWL,< +MAPOST: TLNN A,CRDPIN ;SHOULDN'T BE ON + TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A + LDB D,[%DIPOF,,A] ;OFFSET FIELD WITHIN SOCKET + LDB A,[%%PINN,,A] + JUMPE A,MAPOS1 + MOVEI C,=16 ;BOARD HAS 16 PIN SOCKETS + PUSHJ P,MAPPER + JRST MAPOSX + LDB T,[%DIPS,,(P)] ;NOW OFFSET SLOT + MOVEI TT,-1(T) + IDIVI TT,GRPCOL ;TTT GETS COL WITHIN ROW, TT ROW + SUB TTT,C ;DOES OFFSET OVERFLOW GROUP? + SKIPL TTT + CAIL TTT,GRPCOL + JRST MAPOSX + SUB T,C ;Column offset + ADD TT,D ;DOES OFFSET OVERFLOW GROUP? + CAIL TT,GRPROW + JRST MAPOSX + IMULI D,GRPCOL + ADD T,D + DPB T,[%DIPS,,(P)] +MAPOS1: SETZ T, + DPB T,[%DIPOF,,(P)] ;WITHIN SOCKET OFFSET GOES AWAY + DPB A,[%%PINN,,(P)] + AOS -3(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, +>;MDWL + +GTSLTL: SETZM DESTIN + GETNUM ;GET PANEL NUMBER + CAILE NUMREG,MXPNL ;MAX PANELS IN ONE ASSEMBLY + POPJ P, + DPB NUMREG,[%DIPPNL,,DESTIN] ;STORE AS PANEL NUMBER + CAIN CHRREG,12 ;END OF LINE? + JUMPE NUMREG,CPOPJ1 ;YES, AND NULL NUMBER, JUST RETURN + JUMPE NUMREG,CPOPJ ;OTHERWISE ZERO IS IN ERROR + PUSHJ P,CHKLET ;LETTER TYPED NEXT? + POPJ P, ;NO, ERROR + SKIPG D,L2N(CHRREG) ;GET NUMBER CORRESPONDING TO LETTER + POPJ P, ;NON-EX OR GIOQ!! + CAILE D,NGRPS ;LEGAL GROUP LETTER? + POPJ P, + DPB D,[%DIPG,,DESTIN] ;DEPOSIT AS GROUP LETTER + GETNUM ;GET NEXT NUMBER + JUMPE NUMREG,CPOPJ ;ZERO, ERROR + CAILE NUMREG,=30 ;EXCEEDS MAX SLOT NUMBER WITHIN GROUP? + POPJ P, ;YES + DPB NUMREG,[%DIPS,,DESTIN] ;DEPOSIT AS SLOT NUMBER + CAIE CHRREG,"@" ;ANY SLOT OFFSET? + JRST CPOPJ2 ;RETURN HAPPINESS + GETNUM + DPB NUMREG,[%DIPOF,,DESTIN] + JRST CPOPJ2 + +MD,< +GTCONP: SETZM DESTIN + GETNUM +LAY,< CAIE CHRREG,TEXIST > + CAIN CHRREG,12 + JUMPE NUMREG,CPOPJ1 ;CARRIAGE RETURN ONLY + JUMPE NUMREG,CPOPJ ;ERROR IF NO NUMBER + CAILE NUMREG,MXPNL ;MAX PANELS + POPJ P, ;ERROR OTHERWISE + SOS NUMREG + IMULI NUMREG,NGRPS + MOVEM NUMREG,DESTIN + PUSHJ P,CHKLET ;CHECK FOR LETTER + POPJ P, ;BAD LETTER, ERROR + SKIPN CHRREG,L2N(CHRREG) + POPJ P, + ADD CHRREG,DESTIN + SETZM DESTIN + DPB CHRREG,[POINT 5,DESTIN,22] + GETNUM + JUMPN NUMREG,CPOPJ ;BETTER NOT BE A NUMBER HERE + CAIE CHRREG,"J" ;AND LETTER BETTER BE J + POPJ P, + GETNUM + JUMPE NUMREG,CPOPJ ;BETTER BE A NUMBER HERE + CAIN CHRREG,"-" ;TERMINATED BY A - + CAILE NUMREG,2 ;AND LESS THAN OR EQUAL TO 2 + POPJ P, + SOS NUMREG + DPB NUMREG,[POINT 1,DESTIN,23] ;TEMP STORAGE FOR CONNECTOR NUMBER + GETNUM + JUMPE NUMREG,CPOPJ ;BETTER BE A NON ZERO NUMBER + CAILE NUMREG,MAXCNP ;LESS THAN 27 + POPJ P, + DPB NUMREG,[POINT 12,DESTIN,35] + CAIE CHRREG,12 ;TERMINATION HAD BETTER BE HERE AND EOL + POPJ P, + JRST CPOPJ2 ;ALL'S WELL THAT ENDS WELL +>;MD + +MWL,< + +GETLOC: GETNUM + JUMPE NUMREG,CPOPJ ;NON ZERO NUMBER + CAILE NUMREG,MXPNL ;PANEL # MAX + POPJ P, + LSH NUMREG,=15 ;INTO LEFT 3 BITS OF RIGHT HALF + HRLM NUMREG,(P) ;INTO LH OF PDL + PUSHJ P,CHKLET + POPJ P, ;NOT A LETTER + SKIPN CHRREG,L2N(CHRREG) + POPJ P, + DPB CHRREG,[POINT 3,(P),5] ;DEPOSIT GROUP LETTER INTO LH OF PDL + GETNUM + JUMPN NUMREG,[ CAILE NUMREG,=30 ;HERE FOR DIP LOC + POPJ P, ;ONLY 30 DIP SLOTS PER GROUP + HLRZ TT,(P) + DPB NUMREG,[%DIPS,,TT] + CAIE CHRREG,"@" + JRST CPOPJ1 + HRLM TT,(P) + GETNUM + HLRZ TT,(P) + DPB NUMREG,[%DIPOF,,TT] + JRST CPOPJ1] + LDB NUMREG,[POINT 3,(P),2] + SOS NUMREG + IMULI NUMREG,NGRPS + LDB TT,[POINT 3,(P),5] + ADD NUMREG,TT + DPB NUMREG,[POINT 5,(P),4] + PUSHJ P,CHKLET ;HERE TO DO CONNECTOR PIN + POPJ P, + CAIE CHRREG,"J" + POPJ P, + GETNUM + JUMPE NUMREG,CPOPJ + CAILE NUMREG,2 ;CHECK FOR LEGAL JACK # + POPJ P, + SOS NUMREG + DPB NUMREG,[POINT 1,(P),5] ;DEPOSIT CONNECTOR NUMBER INTO RH OF LH OF PDL + HLRZ TT,(P) + TRZ TT,7777 + TLO TT,MAPCON ;SIGNAL AS CONNECTOR + JRST CPOPJ1 + +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + PUSHJ P,PRNLOC + PUTSTR [ASCIZ / /] ;3 SPACES + TLNE A,MAPPWR!MAPGND + JRST RAYDP1 + LDB T,[%%PINN,,A] ;DIP PIN NUMBER + MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC + +RAYDP1: PUTBYT "0" + MOVEI T,"G" + TLNN A,MAPGND + MOVEI T,"V" + PUTBYT (T) + POPJ P, + +NOTYET(AUGDIP:,CPARTP:,CPARTP:,SEQLOC:) +>;MWL + +CPNSEP: MOVE TT,T + TRZ T,7777 + ANDI TT,7777 + POPJ P, + +CPNMER: SKIPN T + SKIPE TT + CAIA + MOVEI TT,1 ;T,TT=0 MEANS INITIALIZE TO FIRST + CAILE TT,MAXCNP ;CARRY INTO JACK, FROM PIN# + JRST [ ADDI T,10000 + MOVEI TT,1 + JRST .+1] + DPB TT,[001200,,T] + POPJ P, + + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD!! + +NOTYET(CPNMAP:) + +MDWL,< +MWL,< +SUBTTL WIRE WRAP ROUTINES -- MULTIPLE PG21'S + +comment  + +All calculations are done from the dip side. + +(0,0) at lower left hand corner in left handed coordinate system. +Dip sockets are arranged in 5x6 groups. These 30 dip groups come +in pairs. Each group comes with a pair of Scotch Flex(R) connectors +labeled "J1" and "J2". There can be up to 6 30 dip groups on one +board. The horizontal spacing between groups is 2.700". + +There are 5 panels, vertically arranged. The vertical spacing +is 7.500". + +5A30(8) is at (0,0). 5AJ2-26 is at (500,6100). 5AJ1-26 is at (500,6400). + +It follows that 5B30(8) is at (2700,0) + + +UMLCOL__GRPROW ;UML INTERCHANGES ROWS AND COLUMNS +UMLROW__GRPCOL +PNLOFT__=7500 ;7.500" VERTICAL SPACING BETWEEN PANELS +GXOFST__=2700 ;2.700" GROUP HORIZONTAL SPACING +XDIPSP__ =500 ; .500" DIP HORIZONTAL SPACING +YDIPSP__=1000 ;1.000" DIP VERTICAL SPACING +XPINSP__ =300 ; .300" DIP PIN HORIZONTAL SPACING +YPINSP__ =100 ; .100" DIP PIN VERTICAL SPACING +PXOFST__ =300 ; .300" X OFFSET FOR POWER PIN +PYOFST__ =800 ; .800" Y OFFSET FOR POWER AND GROUND PINS +JXOFST__ =500 ; .500" X OFFSET FOR JACKS +JYOFST__=6100 ;6.100" Y OFFSET FOR J2 +JYOFS1__ =300 ; .300" Y OFFSET FROM J2 TO J1 +PXPNSP__ =100 ; .100" CONNECTOR PIN VERTICAL SPACING +PYPNSP__ =100 ; .100" CONNECTOR PIN HORIZONTAL SPACING + + +^^MP21TV__. ;TRANSFER VECTOR FOR DOUBLE HEIGHT DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + MXPNL*UMLROW*NGRPS ;NROWS (USED FOR UML ONLY) + UMLCOL ;NCOLS (USED FOR UML ONLY) + UMLCOL ;NCLPRG (USED FOR UML ONLY) + UMLROW*2 ;NRWPRP (USED FOR UML ONLY) + MXPNL*MAXDIP*NGRPS ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(MXPNL*NGRPS*2) ;NPADS (USED FOR UML ONLY) + XWD -MAXCNP,1 ;PADLET (USED FOR UML ONLY) + XWD -1,0 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK MP21TV,WTVLEN + +;TABLES FOR MAPIT + +;**************************************** DIP PINS + +DEFINE XY(X,Y) +< X*XPINSP,,Y*YPINSP +> + +PINTAB: +FOR Y_7, 0, -1 +< XY(1,Y) +> +FOR Y_0, 7, 1 +< XY(0,Y) +> +;**************************************** DIP LOCATIONS + +DEFINE XY(X,Y) +< X*XDIPSP,,Y*YDIPSP +> + +DIPLOC: + FOR Y_5, 0, -1 +<FOR X_4, 0, -1 +< XY(X,Y) +>> +;**************************************** SCOTCH-FLEX PINS + +DEFINE XY(X,Y) +< X*PXPNSP,,Y*PYPNSP +> + +FLXPIN: + FOR Y_1, 0, -1 +<FOR X_0, =12, 1 +< XY(X,Y) +>> + MAPIT: JUMPL A,CONMAP + PUSHJ P,MAPLOC ;MAP DIP LOCN + POPJ P, ;BAD LOCN + LDB TT,[%%PINN,,A] ;PIN # + TLNE A,MAPPWR!MAPGND ;WANT POWER OR GROUND? + JRST PINPGP ;YES, RETURN FIX IT UP +MAPIT0: ADD T,PINTAB-1(TT) ;ADD EXTRA XY FOR PIN + SETZB TT,TTT ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + +;POWER AND GROUND PIN FOR DIP + +PINPGP: JUMPN TT,CPOPJ ;THE PIN # SHOULD BE ZERO + ADDI T,PYOFST ;FIX THE Y + TLNN A,MAPPWR + JRST [ MOVSI TT,GND ;HE WANTS GND + JRST PINPG1] + ADD T,[PXOFST,,0] ;HE WANTS PWR + MOVSI TT,PWR +PINPG1: SETZ TTT, + JRST CPOPJ1 + +;Convert PIN-SPEC in A into DIP X,Y locn (T) +MAPLOC: LDB TTT,[%DIPPNL,,A] ;GET PANEL NUMBER + JUMPE TTT,CPOPJ ;LOSER + MOVEI TT,MXPNL ;MAX NUMBER OF PANELS + CAILE TTT,MXPNL ;TOO BIG + POPJ P, + SUBM TT,TTT + IMULI TTT,PNLOFT ;VERTICAL OFFSET OF PANEL + LDB TT,[%DIPG,,A] ;GROUP LETTER + LDB T,[%DIPS,,A] ;DIP # + JUMPE T,CPOPJ + CAILE T,MAXDIP ;TOO MANY DIPS FOR SLOT + POPJ P, + MOVE T,DIPLOC-1(T) ;XY OF DIP SLOT + IMULI TT,GXOFST ;X FUDGE FOR GROUP + MOVSI TT,-GXOFST(TT) + ADD T,TT ;LOCATION OF DIP ON BOARD + ADD T,TTT ;ADD IN PANEL OFFSET + JRST CPOPJ1 + +;HERE FOR CONNECTOR PINS + +CONMAP: LDB TT,[%CNPG,,A] ;PANEL AND GROUP NUMBER + JUMPE TT,CPOPJ ;ILLEGAL PANEL NO + PUSH P,TT+1 + SOS TT + IDIVI TT,NGRPS + CAIL TT,MXPNL + JRST [ POP P,TT+1 + POPJ P,] ;TOO BIG A PANEL NUMBER + MOVEI T,MXPNL-1 + SUBM T,TT ;0 FOR PANEL <MXPNL> + IMULI TT,PNLOFT ;OFFSET BETWEEN PANELS + MOVE T,TT+1 + POP P,TT+1 + IMULI T,GXOFST + HRLZ T,T ;XY OF GROUP + ADD T,[JXOFST,,JYOFST] ;LOC OF J2 + ADD T,TT ;ADD IN PANEL OFFSET + LDB TT,[%CNJK,,A] + SKIPG TT + ADDI T,JYOFS1 ;ADD OFFSET FOR JACK 1 + LDB TT,[%%PINN,,A] ;PIN # + JUMPE TT,CPOPJ + CAILE TT,MAXCNP ;REASONABLE # OF PINS + POPJ P, + ADD T,FLXPIN-1(TT) + SETZB TT,TTT + JRST CPOPJ1 + +PAKSIZ: SKIPE ILLPAK(B) ;THIS PACKAGE KNOWN TO BOARD? + POPJ P, + LDB T,[%DIPS,,A] ;STARTING DIP SLOT + SOS T + IDIVI T,GRPCOL ;T  row with 0 on top, TT  column with 0 to right + SUB T,PAKHGT(B) ;Vertical extent-1 + SUB TT,PAKWID(B) ;Horizontal extent-1 + JUMPL T,CPOPJ + JUMPL TT,CPOPJ + CAIGE T,GRPROW + CAIL TT,GRPCOL ;MUST BE WITHIN GROUP HORIZONTALLY + POPJ P, + JRST PAKDIM ;GET PACKAGE DIMENSIONS + +;Define illegal package types in this board +ILLPAK: BLOCK NPACK +FOR @' I IN (22,24,36,40,48,64) +<ORG ILLPAK+K.'I  -1 +> +ORG ILLPAK+NPACK + +MAPRC: HLRZ TT,T ;(1,1) IS DIP IN UPPER LEFT HAND CORNER + SOJL TT,CPOPJ + CAML TT,NROWS + POPJ P, + HRRZS T ;ROW IN TT, COL IN T + SOJL T,CPOPJ + CAML T,NCOLS ;(0,0) IS NOW IN UPPER LEFT + POPJ P, + PUSH P,[0] + IDIVI TT,NGRPS*GRPCOL ;BREAK INTO PANEL#,COL WITHIN PANEL + ADDI TT,1 + DPB TT,[%DIPPNL,,(P)] + MOVE TT,TTT + IDIVI TT,GRPCOL ;BREAK INTO GROUP#,COL# + ADDI TT,1 + DPB TT,[%DIPG,,(P)] + MOVNS T ;LAST UML COL CORRESPONDS TO FIRST DIP ROW + MOVEI T,UMLCOL-1(T) + IMULI T,UMLROW ;DIPSLOTS COUNT BY UMLROWS, THEN UMLCOLS + ADDI T,1(TTT) + DPB T,[%DIPS,,(P)] + POP P,T + JRST CPOPJ1 + +MAPPAD: MOVE TTT,T ;JACK #, STARTING AT 1 + SETZ T, + CAIG TT,MAXCNP ;PIN # + CAILE TTT,<MXPNL>*NGRPS*2 ;2 JACKS PER GROUP + POPJ P, + SOS TTT + DPB TTT,[%CNJK,,T] + ASH TTT,-1 + AOS TTT + DPB TTT,[%CNPG,,T] + DPB TT,[%%PINN,,T] + TLO T,MAPCON + POPJ P, + + +FPWR: CAIE B,=500 ;NOT +5.00V?? + JRST [ SETZ A, + POPJ P,] + TLO A,MAPPWR!MAPSOC ;MAKE IT "V" PIN + JUMPL A,FPWRC ;CONNECTOR? + TLZ A,$$PINN + POPJ P, + +FGND: TLO A,MAPGND!MAPSOC ;MAKE IT "G" PIN + JUMPL A,FGNDC + TLZ A,$$PINN + POPJ P, + +FPWRC: ;FIND DIP SLOT CLOSEST TO CONN PIN +FGNDC: LDB T,[%CNPG,,A] + SOS T + IDIVI T,NGRPS + AOS T + AOS TT + TRZ A,-1 + DPB T,[%DIPPNL,,A] ;GET THE RIGHT PANEL,GROUP + DPB TT,[%DIPG,,A] + LDB T,[%%PINN,,A] + SOS T + IDIVI T,=13 + MOVE T,[ REPEAT 4,<2> + REPEAT 5,<3> + REPEAT 4,<4>](TT) + DPB T,[%DIPS,,A] + TLZ A,$$PINN + POPJ P, + +FOR NAME (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +>;MDWL +BEND MPG21 diff --git a/src/wl/mpg216.502 b/src/wl/mpg216.502 new file mode 100644 index 00000000..b0f2ad68 --- /dev/null +++ b/src/wl/mpg216.502 @@ -0,0 +1,714 @@ +;<WIRELIST>MPG216.FAI.9, 15-NOV-75 19:03:46, EDIT BY HELLIWELL +.ADD(ALLLOCS,MPG216,LM216V) +MDWL,< +.ADD(ALLWW,MPG216,M216TV) +>;MDWL +;Note! These .ADD's must be outside of block structure + +BEGIN MPG216 + +;THE TRANSFER VECTOR FOR THE AUGAT 8136 PG216-180 BOARD + +^LM216V: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST CPOPJ ;LOCFUK - FIXUP OLD NOMEN +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG + JRST AUGDIP +>;MWL + [ASCIZ/#LL#/] ; CUE FOR BOARD SLOT + [ASCIZ /#/] ; CUE FOR BOARD PIN +MDPC,< [ASCIZ/#LJ#-#/] ;CUE FOR CONNECTOR PIN + [ASCIZ/#L# /] ;CUE FOR BODY LOC + [ASCID /1A01/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/#L#/] ;WIRELISTER BODY CUE + [ASCIZ/#LJ#/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK LM216V,LTVLEN + +L2NSUB: BLOCK L2NLEN +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +NNN__1 +FOR I IN(A,B,C,D,E,F) +< L2N2L I,0 +> +FOR I IN (G,I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + + ;SOME BYTE POINTERS FOR EXTRACTING FIELDS + +%DIPPNL__<POINT 3,,20>-=18 ;PANEL NUMBER +%DIPG__<POINT 3,,23>-=18 ;DIP GROUP +%DIPS__<POINT 6,,29>-=18 ;DIP SLOT +%DIPOF__<POINT 6,,35>-=18 ;DIP OFFSET + +%CNPPNL__<POINT 3,,20>-=18 ;PANEL NUMBER (MUST BE SAME AS DIP) +%CNPG__<POINT 3,,23>-=18 ;CONN GROUP ( " " ) +%CNPJK__<POINT 1,,26>-=18 ;CONNECTOR JACK BIT +%CONP__<POINT 9,,35>-=18 ;CONNECTOR PIN # (AND JACK NUMBER <PINS 1-2*26>) +GPINS__400 ;NOMEN FOR "G" PINS ON BOARD STARTS AT 400 + ; 401 IS "G1", ETC. +MXPNL__5 ;max number of panels wrappable at once +NGRPS__6 ;PG216-180 HAS 6 GROUPS +GRPCOL__5 ;# COLS IN GROUP +GRPROW__6 ;# ROWS IN GROUP +GRPDIP__GRPROW*GRPCOL ;# DIPS IN GROUP +MXCNP1__=40 ;MAX # CONNECTOR PINS FOR J1 +MXCNP2__=50 ;MAX # CONNECTOR PINS FOR J2 +J1TO2__2 ;J1 IS OFFSET 2 PINS TO RIGHT OF J2 + +JACKSZ: MXCNP1 + MXCNP2 + + +;The 8136-PG216 consists of 180 dip slots, organized into +;6 groups of 30 dips each. +;The groups are labeled A-F, with group A to left +;Withhin a group, slots are numbered: +; 5 4 3 2 1 +; 10 9 .... 6 +; 15 .... 11 +; 20 .... 16 +; 25 .... 21 +; 30 .... 26 + +;(All coordinates are from DIP side, assuming Scotchflex conns +; are at the top) + +COMMENT  + +AUGAT-X8136-PG216 CONNECTOR PIN FORMAT PRINTS AS #LJ#-# +WHERE L IS THE GROUP. THE J IS LITERAL. THE FIRST DIGIT IS THE PANEL +AND THE SECOND IS THE JACK. PIN IS LAST + +______|_____|_____|_____|_____|_____| +| 20 23 26 35 +| 3 | 3 | | | 9 | +|_____|_____|___|_|_________________| + | | | | +< | | | |------------>PIN + | | | + | | |-------------------JACK 01, 12 + | | +< | |--------------------------># GROUP + | +< |-------------------------------># PANEL + + + + + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + POPJ P, + +PRNLOC: JUMPE A,CPOPJ + JUMPL A,CNLOC + LDB TT,[%DIPG,,A] + LDB T,[%DIPPNL,,A] ;PANEL NUMBER + IOR TT,T + JUMPE TT,CPOPJ ;BOTH BANEL AND GROUP NULL? + PUSHJ P,PUTDEC ;PANEL # + LDB T,[%DIPG,,A] ;GROUP LETTER + PUTBYT @N2L(T) ;CONVERT TO LETTER AND PRINT + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + LDB T,[%DIPS,,A] ;SLOT NUMBER WITHIN GROUP + PUSHJ P,NPUTDEC ;PRINT IT OUT + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + LDB T,[%DIPOF,,A] ;ANY SLOT OFFSET? + JUMPE T,PRNLC1 + PUTBYT "@" +MWL,< PUSHJ P,NPUTDEC > +MDPC,< PUSHJ P,PUTDEC > +PRNLC1: MOVEI TT,"-" + POPJ P, + +CNLOC: LDB T,[%CNPPNL,,A] ;PANEL NUMBER + PUSHJ P,PUTDEC ;PANEL # + LDB T,[%CNPG,,A] ;GROUP LETTER + PUTBYT @N2L(T) ;CONVERT TO LETTER AND PRINT + PUTBYT "J" + LDB T,[%CNPJK,,A] + AOS T + PUSHJ P,PUTDEC + MOVEI TT,"-" + POPJ P, + +PRNPIN: LDB T,[%%PINN,,A] + JUMPL A,PRNPN1 + CAIGE T,GPINS + JRST PRNPN1 + SUBI T,GPINS + PUTBYT "G" + SKIPA TT,[1] +PRNPN1: +MWL,< + MOVEI TT,2 + MOVEM TT,NDIG + JRST NPUTDEC +>;MWL +MDPC,< JRST PUTDEC + JRST PUTDEC > + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +;A = MBIT+PIN#,,LOC +;B = PACKAGE +;Skips if can map, with MAPSOC set. +; Possibly MAPPWR or MAPGND if V or G posts on board +;A = New MBIT+PIN#,,LOC +;B = FLAGS,,PIN CHANGE +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPPL1 ;PIN NUMBER CHANGED BY 1 (KLUDGE) + +MDWL,< +MAPOST: TLNN A,CRDPIN ;SHOULDN'T BE ON + TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A + LDB D,[%DIPOF,,A] ;OFFSET FIELD WITHIN SOCKET + LDB A,[%%PINN,,A] + JUMPE A,MAPOS1 + MOVEI C,=20 ;BOARD HAS 20 PIN SOCKETS + PUSHJ P,MAPPER + JRST MAPOSX + LDB T,[%DIPS,,(P)] ;NOW OFFSET SLOT + MOVEI TT,-1(T) + IDIVI TT,GRPCOL ;TTT GETS COL WITHIN ROW, TT ROW +;Slots are numbered right to left, so offset is subtracted + SUB TTT,C ;DOES OFFSET OVERFLOW GROUP? + CAIL TTT,GRPCOL + JRST MAPOSX + SUB T,C ;Column offset + ADD TT,D ;DOES OFFSET OVERFLOW GROUP? + CAIL TT,GRPROW + JRST MAPOSX + IMULI D,GRPCOL + ADD T,D + DPB T,[%DIPS,,(P)] +MAPOS1: SETZ T, + DPB T,[%DIPOF,,(P)] ;WITHIN SOCKET OFFSET GOES AWAY + DPB A,[%%PINN,,(P)] + AOS -3(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, +>;MDWL + +GTSLTL: PUSH P,A + MOVEI A,[[ASCIZ /#L#./] + 0] + PUSHJ P,LNPARS + JRST GTSL0 + JRST GTSL1 + SETZ TT, + PUSHJ P,GATLOC + JRST GTSL0 + CAIE CHRREG,"@" + JRST GTSL2 + PUSH P,TT + GETNUM + POP P,TT + JUMPE NUMREG,GTSL0 + DPB NUMREG,[%DIPOF,,TT] +GTSL2: MOVEM TT,DESTIN + AOS -1(P) +GTSL1: AOS -1(P) +GTSL0: POP P,A + POPJ P, + +GATLOC: SKIPE A,ARG1 + CAILE A,MXPNL + POPJ P, + DPB A,[%DIPPNL,,TT] + SKIPE A,ARG2 + CAILE A,NGRPS + POPJ P, + DPB A,[%DIPG,,TT] + SKIPE A,ARG3 + CAILE A,GRPDIP + POPJ P, + DPB A,[%DIPS,,TT] + JRST CPOPJ1 + +MD,< +GTCONP: SETZM DESTIN + PUSH P,A + MOVEI A,[[ASCIZ /#LJ#-#/] + 0] + PUSHJ P,LNPARS + JRST GTCON0 + JRST GTCON1 ;NULL INPUT + PUSHJ P,GATCON + JRST GTCON0 + MOVE A,ARG4 + ADDI A,JACKSZ-1(A) + EXCH A,ARG6 + CAMLE A,@ARG6 + JRST GTCON0 + DPB A,[%CONP,,TT] + HRRZM TT,DESTIN ;LH IS B-R-S, 0 FOR THIS BOARD + AOS -1(P) +GTCON1: AOS -1(P) +GTCON0: POP P,A + POPJ P, +>;MD + +GATCON: SETZ TT, + SKIPE A,ARG1 + CAILE A,MXPNL + POPJ P, + DPB A,[%CNPPNL,,TT] + SKIPE A,ARG2 + CAILE A,NGRPS + POPJ P, + DPB A,[%CNPG,,TT] + SKIPE A,ARG4 + CAILE A,2 + POPJ P, + SOS A + DPB A,[%CNPJK,,TT] + TLO TT,MAPCON + JRST CPOPJ1 + +MWL,< + +GETLOC: MOVEI A,[[ASCIZ /#L#/] + [ASCIZ /#L#@#/] + [ASCIZ /#LJ#/] + 0] + PUSHJ P,LNPARSE + POPJ P, + POPJ P, + CAIN A,2 + JRST GATCON + SETZ TT, + MOVE T,ARG5 + CAIN A,1 ;THE OFFSET CASE + DPB T,[%DIPOF,,TT] + JRST GATLOC + +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + PUSHJ P,PRNLOC + LDB T,[%%PINN,,A] ;DIP PIN NUMBER + CAIL T,GPINS + JRST RAYDP1 + PUTSTR [ASCIZ / /] ;3 SPACES + MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC + +RAYDP1: SUBI T,GPINS + PUTSTR [ASCIZ / /] ;2 SPACES + CAIGE T,=10 + PUTBYT 40 + PUTBYT "G" + JRST PUTDEC + +FOR NAME IN (AUGDIP:,CPARTP:,CONGIN:,SEQLOC:) +<NOTYET(NAME) +> +>;MWL + +CPNSEP: LDB TT,[%CONP,,T] + MOVEI TTT,0 + DPB TTT,[%CONP,,T] + POPJ P, + +CPNMER: SKIPN T + SKIPE TT + JRST CPNMR1 + MOVEI TT,1 ;T,TT=0 MEANS INITIALIZE TO FIRST + DPB TT,[%CNPG,,T] ;JACK STARTS OUT AT ZERO, NO INITIALIZATION + DPB TT,[%CNPPNL,,T] +CPNMR1: LDB TTT,[%CNPJK,,T] + CAMG TT,JACKSZ(TTT) + JRST CNPMR1 + MOVEI TT,1 ;CARRY INTO JACK, FROM PIN# + AOS TTT + DPB TTT,[%CNPJK,,T] + CAIGE TTT,2 + JRST CNPMR1 + LDB TTT,[%CNPG,,T] + AOS TTT + DPB TTT,[%CNPG,,T] + CAIGE TTT,NGRPS + JRST CNPMR1 + MOVEI TTT,1 + DPB TTT,[%CNPG,,T] + LDB TTT,[%CNPPNL,,T] + AOS TTT + DPB TTT,[%CNPPNL,,T] +CNPMR1: DPB TT,[%CONP,,T] + POPJ P, + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD +NOTYET(CPNMAP:) + +MDWL,< +MWL,< +SUBTTL WIRE WRAP ROUTINES -- MULTIPLE PG216'S + +comment  + +All calculations are done from the dip side. + +(0,0) at lower left hand corner in left handed coordinate system. +Dip sockets are arranged in 5x6 groups. These 30 dip groups come +in pairs. Each group comes with a pair of Scotch Flex(R) connectors +labeled "J1" and "J2". There can be up to 6 30 dip groups on one +board. The horizontal spacing between groups is 2.700". + +There are 5 panels, vertically arranged. The vertical spacing +is 7.500". + +5A30(8) is at (0,0). 5AJ2-26 is at (500,6100). 5AJ1-26 is at (500,6400). + +It follows that 5B30(8) is at (2700,0) + + +UMLCOL__GRPROW ;UML INTERCHANGES ROWS AND COLUMNS +UMLROW__GRPCOL +PNLOFT__=8100 ;8.100" VERTICAL SPACING BETWEEN PANELS +GXOFST__=2700 ;2.700" GROUP HORIZONTAL SPACING +XDIPSP__ =500 ; .500" DIP HORIZONTAL SPACING +YDIPSP__=1100 ;1.100" DIP VERTICAL SPACING +XPINSP__ =300 ; .300" DIP PIN HORIZONTAL SPACING +YPINSP__ =100 ; .100" DIP PIN VERTICAL SPACING +GNDXOF__ =100 ; .100" X OFFSET FOR TWP GROUND PINS +BRDGND__=10 ; PIN 10 IS DEDICATED GROUND +BRDPWR__=20 ; PIN 20 IS DEDICATED POWER +;CONNECTORS +JXOFST__ =0 ; .000" X OFFSET FOR JACKS +JYOFST__=6700 ;6.700" Y OFFSET FOR J2 +JYOFS1__ =300 ; .300" Y OFFSET FROM J2 TO J1 +PXPNSP__ =100 ; .100" CONNECTOR PIN VERTICAL SPACING +PYPNSP__ =100 ; .100" CONNECTOR PIN HORIZONTAL SPACING + + +^^M216TV__. ;TRANSFER VECTOR FOR DOUBLE HEIGHT DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + MXPNL*UMLROW*NGRPS ;NROWS (USED FOR UML ONLY) + UMLCOL ;NCOLS (USED FOR UML ONLY) + UMLCOL ;NCLPRG (USED FOR UML ONLY) + UMLROW*2 ;NRWPRP (USED FOR UML ONLY) + MXPNL*GRPDIP*NGRPS ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(MXPNL*NGRPS*2) ;NPADS (USED FOR UML ONLY) + XWD -MXCNP2,1 ;PADLET (USED FOR UML ONLY) + XWD -1,0 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK M216TV,WTVLEN + +;TABLES FOR MAPIT + +;**************************************** DIP PINS + +DEFINE XY(X,Y) +< X*XPINSP,,Y*YPINSP +> + +PINTAB: +FOR Y_9, 0, -1 +< XY(0,Y) ;first col of pins is on left (DIP side) +> +FOR Y_0, 9, 1 +< XY(1,Y) ;2nd col is on right, +X is to right +> +;**************************************** DIP LOCATIONS + +DEFINE XY(X,Y) +< X*XDIPSP,,Y*YDIPSP +> + +DIPLOC: + FOR Y_<GRPROW-1>, 0, -1 +<FOR X_<GRPCOL-1>, 0, -1 +< XY(X,Y) +>> +;**************************************** SCOTCH-FLEX PINS + +DEFINE XY(X,Y) +< X*PXPNSP,,Y*PYPNSP +> + +FLXPIN: + FOR Y_1, 0, -1 +<FOR X_0, <MXCNP2/2-1>, 1 +< XY(X,Y) +>> + MAPIT: JUMPL A,CONMAP + PUSHJ P,MAPLOC ;MAP DIP LOCN + POPJ P, ;BAD LOCN + LDB TTT,[%%PINN,,A] ;PIN # + CAIL TTT,GPINS ;WANT POWER OR GROUND? + JRST PINPGP ;YES, RETURN FIX IT UP +MAPIT0: ADD T,PINTAB-1(TTT) ;ADD EXTRA XY FOR PIN + SETZ TT, + CAIN TTT,BRDGND + MOVSI TT,GND + CAIN TTT,BRDPWR + MOVE TT,[PWR,,=500] ;+5.00 VOLTS + SETZ TTT, ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + +; TWP GROUND PINS FOR SOCKET + +PINPGP: ADD T,PINTAB-GPINS-1(TTT) + ADD T,[GNDXOF,,] ;EXTRA TWP GND PINS ARE .1 TO RIGHT + MOVSI TT,GND +PINPG1: SETZ TTT, + JRST CPOPJ1 + +;Convert PIN-SPEC in A into DIP X,Y locn (T) +;Y IS + UP +;X IS + RIGHT (FROM DIP SIDE) +MAPLOC: LDB TTT,[%DIPPNL,,A] ;GET PANEL NUMBER + JUMPE TTT,CPOPJ ;LOSER + MOVEI TT,MXPNL ;MAX NUMBER OF PANELS + CAILE TTT,MXPNL ;TOO BIG + POPJ P, + SUBM TT,TTT ;TTT gets <MXPNL-panel>, make 1 on top + IMULI TTT,PNLOFT ;VERTICAL OFFSET OF PANEL + LDB TT,[%DIPG,,A] ;GROUP LETTER + LDB T,[%DIPS,,A] ;DIP # + JUMPE T,CPOPJ + CAILE T,GRPDIP ;TOO MANY DIPS FOR SLOT + POPJ P, + MOVE T,DIPLOC-1(T) ;XY OF DIP SLOT + IMULI TT,GXOFST ;X FUDGE FOR GROUP, group A to left + MOVSI TT,-GXOFST(TT) + ADD T,TT ;LOCATION OF DIP ON BOARD + ADD T,TTT ;ADD IN PANEL OFFSET + JRST CPOPJ1 + +;HERE FOR CONNECTOR PINS + +CONMAP: LDB TTT,[%CNPPNL,,A] ;GET PANEL NUMBER + JUMPE TTT,CPOPJ ;LOSER + MOVEI TT,MXPNL ;MAX NUMBER OF PANELS + CAILE TTT,MXPNL ;TOO BIG + POPJ P, + SUBM TT,TTT + IMULI TTT,PNLOFT ;VERTICAL OFFSET OF PANEL + LDB TT,[%CNPG,,A] ;GROUP LETTER + IMULI TT,GXOFST ;X FUDGE FOR GROUP + HRLI TTT,-GXOFST(TT) + LDB TT,[%CNPJK,,A] + ADDI TTT,JYOFST ;VERT OFFSET TO J2 + SKIPG TT + ADDI TTT,JYOFS1 ; OFFSET TO J1 + LDB T,[%%PINN,,A] + JUMPE T,CPOPJ + JUMPE TT,[CAILE T,MXCNP1 ;MAKE J1 CORRESPOND TO J2'S 50 PINS + POPJ P, + CAILE T,MXCNP1/2 ;IN BOTTOM ROW? + ADDI T,<MXCNP2-MXCNP1>/2 ;J2'S BOTTOM ROW STARTS +5 PINS W.R.T. J1 + ADDI T,J1TO2 ;AND J1 IS DISPLACED 2 PINS RIGHT + JRST .+1] + CAILE T,MXCNP2 + POPJ P, + SETZ TT, + CAILE T,MXCNP2/2 ;BOTTOM ROW IS GND + MOVSI TT,GND + MOVE T,FLXPIN-1(T) ;X,Y OF PIN + ADD T,TTT + SETZ TTT, + JRST CPOPJ1 + +PAKSIZ: SKIPE ILLPAK(B) + POPJ P, +;Check if package sticks outside of a single group + LDB T,[%DIPS,,A] ;STARTING DIP SLOT + SOS T + IDIVI T,GRPCOL ;DIP ROW, DIP COL # + SUB T,PAKHGT(B) + SUB TT,PAKWID(B) ;HORIZONTAL EXTENT OF ADAPTOR + JUMPL T,CPOPJ + JUMPL TT,CPOPJ + CAIGE T,GRPROW + CAIL TT,GRPCOL ;MUST BE WITHIN GROUP HORIZONTALLY + POPJ P, + JRST PAKDIM + +;Define illegal package types in this board +ILLPAK: BLOCK NPACK +FOR @' I IN (22,24,36,40,48,64) +<ORG ILLPAK+K.'I  -1 +> +ORG ILLPAK+NPACK + +;T = UML-ROW-#,,UML-COL-# +COMMENT  + Map of the UML page printout + UML COL + 1 2 ... NCOLS +UML ROW ------------------------------ + 1 F26 F21 ... F1 + 2 F27 F22 ... F2 + ... + 5 F30 F25 ... F5 + + 6 E26 E21 ... E1 + ... + NCLPRP + + + + +MAPRC: HLRZ TT,T ;(1,1) IS DIP IN UPPER LEFT HAND CORNER + SOJL TT,CPOPJ + CAML TT,NROWS ;MAX # ROWS (FOR PRINTOUT OF ALL PANELS) + POPJ P, + HRRZS T ;ROW IN TT, COL IN T + SOJL T,CPOPJ + CAML T,NCOLS ;(0,0) IS NOW IN UPPER LEFT + POPJ P, + PUSH P,[0] +;UML row = F(panel-#, group, col-within-group) + IDIVI TT,NGRPS*GRPCOL ;BREAK INTO PANEL#,COL WITHIN PANEL + ADDI TT,1 + DPB TT,[%DIPPNL,,(P)] + MOVE TT,TTT + IDIVI TT,GRPCOL ;BREAK INTO GROUP#,COL# + MOVNS TT + ADDI TT,NGRPS ;GROUP F IS FIRST + DPB TT,[%DIPG,,(P)] + MOVNS T ;LAST UML COL CORRESPONDS TO FIRST DIP ROW + MOVEI T,UMLCOL-1(T) + IMULI T,UMLROW ;DIPSLOTS COUNT BY UMLROWS, THEN UMLCOLS + ADDI T,1(TTT) + DPB T,[%DIPS,,(P)] + POP P,T + JRST CPOPJ1 + +MAPPAD: SOS T ;STARTS AT 1 PANEL#*NGRPS+GROUP+JACK + LDB TTT,[POINT 1,T,35] ;THE JACK BIT + CAMLE TT,JACKSZ(TTT) + JRST [ SETZ T, + POPJ P,] + MOVSI TTT,MAPCON(TT) ;PIN# IN LH + DPB T,[%CNPJK,,TTT] + LSH T,-1 + IDIVI T,NGRPS + AOS TT + DPB TT,[%CNPG,,TTT] + AOS T + DPB T,[%CNPPNL,,TTT] + MOVE T,TTT + POPJ P, + +FPWR: CAIE B,=500 ;+5.00V?? + JRST FPWRE + LDB T,[%%PINN,,A] + MOVEI B,BRDPWR + DPB B,[%%PINN,,A] + TLO A,MAPSOC + JUMPL A,FPWRC + POPJ P, + +FPWRE: SETZ A, + POPJ P, + +FPWRC: LDB TT,[%CNPJK,,A] ;J1 OR J2? + JUMPN TT,FPWRC1 ;J2 + CAILE T,MXCNP1/2 ;SECOND ROW J1? + ADDI T,<MXCNP2-MXCNP1>/2 ;YES, ADJUST TO NUMBERING OF 2ND ROW J2 + ADDI T,J1TO2 +FPWRC1: CAILE T,MXCNP2 ;LEGAL? + JRST FPWRE + SOS T + IDIVI T,MXCNP2/2 ;TREAT ROW 2 AS ROW 1 +DEFINE FOO(N,SLOT) +<REPEAT N,<SLOT>> + MOVE T,(T)[ FOO(3,1) ;1-3 + FOO(5,2) ;4-8 + FOO(5,3) ;9-13 + FOO(5,4) ;14-18 + FOO(7,5)] ;19-25 + DPB T,[%DIPS,,A] + SETZ T, + DPB T,[%DIPOF,,A] + POPJ P, + +FGND: JUMPL A,FGNDC + MOVEI B,BRDGND + DPB B,[%%PINN,,A] + TLO A,MAPSOC + POPJ P, + +FGNDC: LDB TT,[%CNPJK,,A] + HRRZ TT,JACKSZ(TT) + ASH TT,-1 + LDB T,[%%PINN,,A] + CAMG T,TT + ADD T,TT + DPB T,[%%PINN,,A] + TLO A,MAPSOC + POPJ P, + +FOR NAME (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +>;MDWL +BEND MPG216 diff --git a/src/wl/mupac.502 b/src/wl/mupac.502 new file mode 100644 index 00000000..8b72d17a --- /dev/null +++ b/src/wl/mupac.502 @@ -0,0 +1,941 @@ +.ADD(ALLLOCS,MUPAC,MUPACV) +MDWL,< +.ADD(ALLWW,MUPAC,MUPATV) +>;MDWL +;Note! These .ADD's must be outside of block structure + +COMMENT  + +The MUPAC Model # 3244806-01 wire wrap board: + +The board has 6 rows of sockets, 20 in each row. + +However, between columns 10 and 15, there is a kludgey +universal pattern. Each universal column is 59 pins high, +spaced out: + (11) - .2" - (12) - .1" - (13) - .3" - (14) + + +The DIP slot nomenclature is: + + %DIPG %DIPS + ---------- ----------------------------- + "standard" <D,E,F,G,H,J> <01:10, 15:24> + "universal" <01:59> <11:14> + +Dip D01 is at upper left, viewed fom DIP side, +with the front edge connectors at the top + +The board uses 16 pin DIP sockets, with a "G" pin just +below pin 8, and a "V" pin above pin 16. (Actually, some +are "V1" and some are "V2" pins, but the are all treated as +5V). +It is also assumed that pin 8 has been grounded on the board. + +There are two front connectors, each with 3 rows of 36 pins. +There is one back connector, with 3 rows of 18 pins. + +The connector nomenclature is: + + %CONN %CONP + ---------- ------------------------------ + "front" <1:2><A,B,C> <01:36> + "back" <X,Y,Z> <01:18> + + where the "2" front connector is flagged + by %CONN having the 40 bit on. + + +BEGIN MUPAC + +%DIPG__<POINT 6,,23>-=18 ;DIP GROUP (The letter) +%DIPS__<POINT 6,,29>-=18 ;DIP SLOT (The number) +%DIPOF__<POINT 6,,35>-=18 ;DIP OFFSET + +define DIPSLT(letter,number) +< ifdif<letter><J><<"letter"+1-"A">=12 + =number6> + ifidn<letter><J><<"letter"+1-"A"-1>=12 + =number6> + > + + +%CONN__<POINT 6,,23>-=18 ;CONNECTOR NUMBER (LETTER OR JACK #) +%CONP__<POINT 12,,35>-=18 ;CONNECTOR PIN # + +define CONLOC(num1,letter,number) +< ifidn<num1><><<"letter"+l.x-"X">=12 + =number > + ifidn<num1><1><<"letter"+1-"A">=12 + =number > + ifidn<num1><2><<"letter"+41-"A">=12 + =number > +> + + +GPIN__0 ;"G" PIN, JUST BELOW PIN 8 +VPIN__=17 ;"V" PIN, JUST ABOVE PIN 16 +BRDGND__8 ; PIN 8 IS GROUNDED + +;TABLE TO TEST FOR UNIVERSAL DIP COLUMNS (%DIPS) + +UNICOL: FOR I_0,=10 +< 0 +> + FOR I_=11,=14 +< 1B0 +> + FOR I_=15,=24 +< 0 +> +MXDIPS__=24 ;MAX %DIPS +;L.D through L.J are the legal %DIPG for normal +MXUDPG__=59 ;MAX %DIPG FOR UNIVERSAL + +;EDGE CONNECTORS +MXFRONT__=36 ;MAX 36 PINS PER ROW IN FRONT +MXBACK__=18 ;MAX 18 PINS PER ROW IN BACK + + +;THE TRANSFER VECTOR FOR THE MUPAC WW BOARD + +^MUPACV: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES (UNUSED) + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST CPOPJ ;LOCFUK - FOR UPCONVERTING OLD DRWVERS +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG +>;MWL + [ASCIZ/B-R-S (#)/] ; CUE FOR BOARD SLOT + [ASCIZ /#/] ; CUE FOR BOARD PIN +MDPC,< [ASCIZ/#<A,B,C># or <X,Y,Z># /] ;CUE FOR CONNECTOR PIN + [ASCIZ/L# or L#@# or #-#/] ;CUE FOR BODY LOC + [ASCID /D01/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/L# or #-#/] ;WIRELISTER BODY CUE + [ASCIZ/#L or L/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK MUPACV,LTVLEN + +L2NSUB: BLOCK L2NLEN ;******* +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +NNN__1 +FOR I IN(A,B,C,D,E,F,G,H,J,K,L,M,N,P,R,S,T,U,V,W) +< L2N2L I,0 +> + +L.X__NNN +FOR I IN(X,Y,Z) +< L2N2L I,0 +> + +FOR I IN (I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +L.D__4 ;D IS 4TH LETTER +L.J__L.D+5 ;D,E,F,G,H,J + +ORG EN2L + + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + POPJ P, + + + +;Print Socket or DIP loc. +;A= (MAPCON),,loc +; returns TT the seperator charbetween loc-pin, if any + +PRNLOC: SETZ TT, + JUMPE A,CPOPJ + MOVEI T,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM T,NDIG + JUMPL A,CNLOC + LDB T,[%DIPS,,A] ;DIP COLUMN + SKIPGE UNICOL(T) ;IN UNIVERSAL AREA? + JRST [ PUSH P,T ;YES, SAVE COLUMN + LDB T,[%DIPG,,A] ;PRINT ROW 01-59 + PUSHJ P,NPUTDEC + PUTBYT "-" + POP P,T ;NOW COL 11-14 + PUSHJ P,NPUTDEC + JRST PRNLC1] +;In normal DIP sockets, print Letter-number + LDB T,[%DIPG,,A] ;GROUP LETTER + PUTBYT @N2L(T) ;CONVERT TO LETTER AND PRINT + LDB T,[%DIPS,,A] ;SLOT NUMBER WITHIN GROUP + PUSHJ P,NPUTDEC ;PRINT IT OUT + LDB T,[%DIPOF,,A] ;ANY SLOT OFFSET? + JUMPE T,PRNLC1 + PUTBYT "@" +MWL,< PUSHJ P,NPUTDEC > +MDPC,< PUSHJ P,PUTDEC > +PRNLC1: MOVEI TT,"-" + POPJ P, + +CNLOC: LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,"1" + TRZE T,40 + MOVEI TT,"2" + CAIGE T,L.D ;A,B,C is front conn + PUTBYT (TT) ; "1 or 2" + PUTBYT @N2L(T) ; "A,B,C X,Y,Z" + SETZ TT, ;NO SEPARATOR NECESSARY + POPJ P, + +PRNPIN: LDB T,[%%PINN,,A] + JUMPL A,PRNPN1 ;a connector pin? + CAIN T,VPIN ;No, check for V,G + JRST [ PUTBYT "V"  POPJ P,] + CAIN T,GPIN + JRST [ PUTBYT "G"  POPJ P,] +PRNPN1: MOVEI TT,2 + MOVEM TT,NDIG + JRST NPUTDEC + + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +;A = MBIT+PIN#,,LOC +;B = PACKAGE +;Skips if can map, with MAPSOC set. +; Possibly MAPPWR or MAPGND if V or G posts on board +;A = New MBIT+PIN#,,LOC +;B = FLAGS,,PIN CHANGE +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPPL1 ;PIN NUMBER CHANGED BY 1 (KLUDGE) + +MDWL,< +MAPOST: TLNN A,CRDPIN ;SHOULDN'T BE ON + TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A + LDB C,[%DIPS,,A] ;DIP COLUMN + LDB D,[%DIPG,,A] ;DIP ROW + LDB A,[%%PINN,,A] ;PIN# + JUMPE A,MAPOS1 ;SPECIAL HACK JUST TO FLUSH %DIPOF + SKIPGE UNICOL(C) ;IN UNIVERSAL AREA? + JRST MUPUNI ; YES +;Dip is in 16 pin socket area of board, call standard +;mapper routine which handles DIPs/SIPs/Adaptors and DIP-offsets. + SKIPE ILLPAK(B) ;CAN PACKAGE FIT IN DIP SOCKET? + JRST MAPOSX ; NOT QUITE + LDB D,[%DIPOF,,(P)] ;OFFSET FIELD WITHIN SOCKET + MOVEI C,=16 ;BOARD HAS 16 PIN SOCKETS + PUSHJ P,MAPPER ;RETURNS (PIN,FLAGS,HORIZ-OFF,VER-OFF) + JRST MAPOSX + LDB T,[%DIPS,,(P)] ;NOW OFFSET SLOT + MOVE TT,T + ADD TT,C + SKIPL UNICOL(TT) ;FALLS INTO UNIVERSAL COLMNS? + CAILE TT,MXDIPS ;FALLS OFF end of board? + JRST MAPOSX + ADD T,C + DPB T,[%DIPS,,(P)] + LDB T,[%DIPG,,(P)] ;FIRST ROW IS A (=1) + ADD T,D ;DOES OFFSET OVERFLOW NO. OF ROWS? + CAILE T,L.J ;LEGAL ROW # + JRST MAPOSX + DPB T,[%DIPG,,(P)] +MAPOS1: SETZ T, + DPB T,[%DIPOF,,(P)] ;WITHIN SOCKET OFFSET GOES AWAY + DPB A,[%%PINN,,(P)] + AOS -3(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, + +;Package is in universal area of board, +;A = Pin# +;B = package +;C = column (11-14) +;D = row (1-59) +;Check for legal packages, then make new location, +; with pin# equal to 0, the post location is entirely +; specified by "DIP" loc which is row-column. + +MUPUNI: HRRZ T,MAPDSP(B) ;WHAT TYPE OF PACKAGE? + CAIN B,K.SGR1 ;KLUDGEY S.GRAY 20 PIN DIP ADAPT + JRST [ CAIE C,=11 ;ONLY IN COL 11 + JRST MAPOSX + CAIG A,=10 ;2ND LEG? + JRST MAP1ST + SUBI A,=20+1 + MOVNS A + AOJA C,MAP1ST] + CAIN T,SIP + JRST MAP1ST ;LIKE 1ST ROW OF DIP + CAIE T,DIP ;IS DIP? + JRST MAPOSX ; NO, ILLEGAL THEN +;Is a DIP, check for legal columns depending on DIP leg spacing, +; then map column if pin is in 2nd row of DIP pins + HRRZ TT,PACKPN(B) + ASH TT,-1 ;# PINS ON ONE SIDE OF DIP + HRRZ T,DIPLEG(B) ;HOW FAR APART DIP legs? + CAIN T,=400 + JRST [ CAIE C,=12 ;ONLY IN COL 12 + JRST MAPOSX + CAMG A,TT ;FIRST ROW OF PINS? + JRST MAP1ST + MOVEI C,=14 ;MAPS INTO COL 14 + JRST MAP2ND] + CAIN T,=600 + JRST [ CAIE C,=11 + JRST MAPOSX + CAMG A,TT ;FIRST ROW OF PINS? + JRST MAP1ST + MOVEI C,=14 ;MAPS INTO COL 14 + JRST MAP2ND] + CAIE T,=300 ; .3" SPACING? + JRST MAPOSX ;NO, LOSE +;Standard .3" DIP + CAIE C,=11 ; ONLY LEGAL IN 11 OR 13 + CAIN C,=13 + CAIA + JRST MAPOSX + CAMG A,TT ;WHICH ROW OF DIP PINS? + JRST MAP1ST ; FIRST + CAIN C,=13 ;SECOND, 13 GOES TO 14 + MOVEI C,=14 + CAIN C,=11 ;11 GOES TO 13 + MOVEI C,=13 +MAP2ND: SUB A,PACKPN(B) + SUB D,A ; 16-PIN# IS DISPLACEMENT + CAIA +MAP1ST: ADDI D,-1(A) ;OFFSET ROW BY PIN# + skipl d + caile d,=59 + jrst maposx + DPB C,[%DIPS,,(P)] + DPB D,[%DIPG,,(P)] + SETZ A, ;NULL PIN #, ALL IS IN LOC + MOVSI B,%MPLOC!%MPUNI ;UNIVERSAL LOC INCLUDES PIN# + JRST MAPOS1 + +;Test for an illegal package in this board + +ILLPAK: BLOCK NPACK + FOR @' I IN (18,20,22,24,36,40,48,64,624aug,624xug) + <ORG ILLPAK+K.'I  -1 ;ILLEGAL IN THIS BOARD + > +ORG ILLPAK+NPACK + + +>;MDWL + +;THIS SHOULD CHECKFOR B-R-S ?? +;Read a body locn into DESTIN. +;returns - FAIL +; CRLF ONLY +; OK +; B-R-S seen + +MDPC,< +GTSLTL: PUSH P,A + MOVEI A,[[ASCIZ /L#./] + [asciz /#-#./] ;UNIVERSAL LOCN + 0] + PUSHJ P,LNPARS + JRST GTSL0 + JRST GTSL1 + PUSHJ P,GATLOC + JRST GTSL0 + CAIE CHRREG,"@" + JRST GTSL2 + PUSH P,TT + GETNUM + POP P,TT + JUMPE NUMREG,GTSL0 + DPB NUMREG,[%DIPOF,,TT] +GTSL2: MOVEM TT,DESTIN + AOS -1(P) +GTSL1: AOS -1(P) +GTSL0: POP P,A + POPJ P, +>;MDPC + +;Assemble loc from parsed argument + +GATLOC: SETZ TT, + CAIN A,1 ;UNIVERSAL STUFF? + JRST [ MOVE T,ARG3 ;#-# + CAIL T,=11 ;MUST BE COLS 11-14 + CAILE T,=14 + POPJ P, + DPB T,[%DIPS,,TT] + MOVE T,ARG1 ;MUST BE 1-59 + CAILE T,MXUDPG + POPJ P, + DPB T,[%DIPG,,TT] + JRST CPOPJ1] + MOVE T,ARG2 ;L# + CAILE T,MXDIPS ;MUST BE 1-10,15-24 + POPJ P, + CAIL T,=11 + CAILE T,=14 + CAIA + POPJ P, + DPB T,[%DIPS,,TT] ;DIP ROW, LETTER OR 1-59 + MOVE T,ARG1 + CAIL T,L.D + CAILE T,L.J + POPJ P, + DPB T,[%DIPG,,TT] ;DIP COLUMN, 1-24 + JRST CPOPJ1 + + +MD,< +;Read connector locn +; (This should probably try for B-R-S also, but...?) + +GTCONP: PUSH P,A + MOVEI A,[[ASCIZ /L#/] + [ASCIZ /#L#/] + 0] + PUSHJ P,LNPARSE + JRST GTCON0 + JRST GTCON1 ;NULL INPUT + PUSHJ P,GATCON ;GET JACK OR PADDLE PART OF LOC + JRST GTCON0 + MOVE T,ARG2 + CAIE A,0 + MOVE T,ARG3 +GTCON3: DPB T,[%CONP,,TT] + HRRZM TT,DESTIN + AOS -1(P) +GTCON1: AOS -1(P) +GTCON0: POP P,A + POPJ P, + +>;MD + +GATCON: SETZ TT, + JUMPE A,[ + MOVE T,ARG1 + CAIGE T,L.X ;BETTER BE X,Y,Z + POPJ P, + JRST GTCN2] + MOVE T,ARG2 + CAIL T,L.D ;BETTER BE A,B,C + POPJ P, + SOSLE ARG1 + TRO T,40 +GTCN2: DPB T,[%CONN,,TT] + TLO TT,MAPCON + JRST CPOPJ1 + +MWL,< + +GETLOC: MOVEI A,[[ASCIZ /L#/] ;0 - DIP or back connector + [ASCIZ /#-#/] ;1 - DIP in universal columns + [ASCIZ /L#@#/] ;2 - DIP with offset + [ASCIZ /L/] ;3 - BACK CONNECTOR + [ASCIZ /#L/] ;4 - front connector + 0] + PUSHJ P,LNPARSE + POPJ P, + POPJ P, + CAIL A,3 ;CONN OR DIP? + JRST [ SUBI A,3 + JRST GATCON] + PUSHJ P,GATLOC + POPJ P, + MOVE T,ARG4 + CAIN A,2 ;L#@# + DPB T,[%DIPOF,,TT] + JRST CPOPJ1 + +;Print location for fixed format card image +;8 cols wide, with "group" left justified, "pin number" right justified +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + PUTBYT "?" ;FOR NOW + POPJ P, + +FOR NAME IN (CPARTP:,CONGIN:) +<NOTYET(NAME) +> +>;MWL + +CPNSEP: LDB TT,[%CONP,,T] + MOVEI TTT,0 + DPB TTT,[%CONP,,T] + POPJ P, + +CPNMER: PUSH P,A + LDB T,[%CONN,,T] + SKIPN T + SKIPE TT + JRST CPNMR1 + MOVEI TT,1 ;INITITIALZE, PIN1 + MOVEI T,1 ;A +CPNMR1: MOVE TTT,T + TRZ TTT,40 ;1A OR 2A + CAIL TTT,L.D ;A,B,C? + JRST CPNBAK + CAILE TT,MXFRONT + JRST [ MOVEI TT,1 + AOS T + CAIN T,L.D + MOVEI T,41 + CAIN T,L.D+40 + MOVEI T,L.X + JRST .+1] +CPNMR2: DPB T,[%CONN,,T] + DPB TT,[%CONP,,T] + POP P,A + POPJ P, + +CPNBAK: CAIGE TT,MXBACK + JRST CPNMR2 + MOVEI TT,1 + AOS T + JRST CPNMR2 + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD +NOTYET(CPNMAP:) + +MWL,< +SUBTTL WIRE WRAP ROUTINES -- MUPAC BOARD + +comment  + +All calculations are done from the DIP side. + +(0,0) at LOWER left hand corner in left handed coordinate system. +X+ to right, Y+ is up + +(0,0) is .1" to left of J1(G), 1.0" below + +DIP socket pin 1 is upper left. + + MAP OF BOARD (DIP SIDE) + ----------------------- + 1A<1:36> 2A<1:36> +conns 1B " 2B " + 1C " 2C " + + D1 D2 ... D10 11 - 12 -13 -14 D14 ... D24 + E1 ... ... + F1 ... (59 pins per column) + G1 universal pattern + H1 ... + J1 ... + + X<1:18> +back conn Y<1:18> + Z<1:18> + + + + +^^MUPATV__. ;TRANSFER VECTOR FOR QUAD HEIGHT 20 PIN DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + +;Define a UML map, 20 rows x 6 columns, but leave out the +; universal pattern stuff because I can't figure out how +; to print it. + + =20 ;NROWS (USED FOR UML ONLY) + =6 ;NCOLS (USED FOR UML ONLY) + =6 ;NCLPRG (USED FOR UML ONLY) + 0 ;NRWPRP (USED FOR UML ONLY) + =120 ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(=9) ;NPADS (USED FOR UML ONLY) + -=36,,1 ;PADLET (USED FOR UML ONLY) + -1,,0 ;PADPIN (USED FOR UML ONLY) + +;Define some wire/wrap lengths ???? + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK MUPATV,WTVLEN + + +;Define locations on board, in 1 mil increments, from DIP side + +RADIX =10 +DIP00x__100 ;Column 1, pin 1 is .1" from 0 +DIP00y__6800 ;row D, pin 1 is 6.8" from 0 + +DEFINE INCR(STEP)< ..TEM  ..TEM__..TEM+STEP  > +DEFINE DECR(STEP)< ..TEM  ..TEM__..TEM-STEP  > + +;X location for pin 1 of socket in column # + +DIPX: ..TEM__DIP00X + 0 ;COL 0 + INCR(400) ;COL 1 to COL 2 + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(500) ;COL 10-pin-1 TO 11 + INCR(200) + INCR(100) + INCR(300) + INCR(200) ;COL 14 TO 15-pin-1 + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(400) + INCR(0) ;COL 24 + +DIPY: ..TEM__DIP00Y + 0  0  0  0 ;0, A,B,C + DECR(1000) ;ROW D + DECR(1000) + DECR(1000) + DECR(1000) + DECR(1000) + DECR(1000) ;ROW J + +;Offsets of DIP pin within socket + +PINX: 0 ;G PIN + 0 ;1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 ;8 + 300 ;9 + 300 + 300 + 300 + 300 + 300 + 300 + 300 ;16 + 300 ;V PIN + +PINY: -800 ;G PIN + 0 ;1 + -100 + -200 + -300 + -400 + -500 + -600 + -700 ;8 + -700 ;9 + -600 + -500 + -400 + -300 + -200 + -100 + 0 ;16 + 100 ;V PIN + +;Mapping for connectors, index by (CONnum*36)+connpin-1 +; where connum 0:8 are 1A,1B,1C,2A,2B,2C,X,Y,Z + + define conrow(x,y)< + for i_0,3500,100 + < x+i,,y  > > + +CONTBL: CONROW(100,7700) ;1A + CONROW(100,7600) ;1B + CONROW(100,7500) ;1C + CONROW(5300,7700) ;2A + CONROW(5300,7600) ;2B + CONROW(5300,7500) ;2C + CONROW(3600,500) ;X + CONROW(3600,400) ;Y + CONROW(3600,300) ;Z + +RADIX 8 + + +MAPIT: JUMPL A,CONMAP ;MAP CONNECTOR LOCATION + LDB T,[%DIPS,,A] ;DIP COLUMN + LDB TT,[%DIPG,,A] ;DIP ROW + SKIPN UNICOL(T) + JRST MAPITD ;IS A NORMAL 16 PIN SOCKET +;Pin is in universal pattern area + MOVNS TT + ADDI TT,=59 + IMULI TT,=100 ;IN .1" INCREMENTS + ADDI TT,=1000 ;ROW 59 IS 1.0" UP + HRLZ T,DIPX(T) ;XOLUMN X + HRR T,TT ;X,,Y + SETZB TT,TTT ;NO PWR,GND + JRST CPOPJ1 + +;Pin is in some dip socket +MAPITD: HRRZ T,DIPX(T) + HRRZ TT,DIPY(TT) + LDB TTT,[%%PINN,,A] ;WHICH PIN? + CAIN TTT,VPIN + JRST [ PUSH P,[PWR,,=500] + MOVEI TTT,=17 ;LOOKS LIKE PIN 17 + JRST MAPIT1] + CAIN TTT,GPIN + JRST [ PUSH P,[GND,,0] + MOVEI TTT,0 ;LOOKS LIKE PIN 0 + JRST MAPIT1] + PUSH P,[0] ;NEITHER PWR/GND +MAPIT1: ADD T,PINX(TTT) + ADD TT,PINY(TTT) + HRLZS T + HRR T,TT ;X,,Y + POP P,TT ;PWR/GND BITS + SETZ TTT, + JRST CPOPJ1 + +;Here for connector pins + +CONMAP: LDB TTT,[%CONN,,A] ;WHICH CONNECTOR GROUP? +;Compress the possible connector groups into an index + TRZE TTT,40 ;2A,2B,2C? + ADDI TTT,3 + CAIL TTT,L.X + SUBI TTT,L.X-7 + IMULI TTT,=36 + LDB TT,[%%PINN,,A] + ADDI TTT,-1(TT) ;CONGRP*36 + CONPIN -1 + MOVE T,CONTBL(TTT) ;GET PIN X,,Y +;Now check for the dedicated pwr/ground pins on front connectors + CAIE TT,1 + CAIN TT,=18 + CAIA + CAIN TT,=36 ;GROUND ON 1,18,36 + JRST [ MOVSI TT,GND ;FLAG AS GND PIN + JRST CONMA1] + CAIL TTT,2 ;IN 1A,1B,1C? + JRST CONMA2 ; NO + CAIL TT,4 ; PWR IS ON 4-8, 31-35 + CAILE TT,8 + JRST [ CAIL TT,=31 + CAILE TT,=35 + JRST CONMA2 + JRST .+1] + SKIPA TT,[PWR,,=500] +CONMA2: SETZ TT, +CONMA1: SETZ TTT, + JRST CPOPJ1 + +PAKSIZ: LDB T,[%DIPS,,A] ;DIP COLUMN + LDB TT,[%DIPG,,A] ;DIP ROW + SKIPE UNICOL(T) ;UNIVERSAL AREA? + JRST PAKDIM ;YES, ASSUME IT'S OK ??? + ADD TT,PAKHGT(B) + CAILE TT,L.J + POPJ P, ;BARF! FALLS OFF BOTTOM + CAIG T,=11 ;IN AREA TO LEFT OF UNIVERSAL? + JRST [ ADD T,PAKWID(B) + CAILE T,=11 ;BETTER NOT FALL INTO UNIVERSAL + POPJ P, + JRST PAKDIM] + ADD T,PAKWID(B) + CAILE T,=24 + POPJ P, + JRST PAKDIM + +MAPRC: HLRZ TT,T ;UML ROW is DIP column on card + HRRZS T ;UML COL is DIP row on card + EXCH T,TT + MOVNS T + ADDI T,=24+1 ;FIRST ROW IS 24 + CAIGE T,=15 + SUBI T,4 ;SKIP UNIVERSAL COLS + SKIPG T + POPJ P, + MOVNS TT + ADDI TT,L.J+1 + CAIGE TT,L.D + POPJ P, + MOVE TTT,T + SETZ T, + DPB TT,[%DIPG,,T] + DPB TTT,[%DIPS,,T] + JRST CPOPJ1 + +;Generate sequence of connector pins for UML printout +;T= connector "group" - 1A,1B,..,2A,...,X,... +;TT = padlet - 1:36 + +MAPPAD: CAILE T,=9 + JRST MAPLUZ + CAILE TT,=36 + JRST MAPLUZ + CAILE T,6 ;BACK CONN? + JRST [ ADDI T,L.X-7 + DPB T,[%CONN,,T] + JRST MAPPA1] + CAILE T,3 + JRST [ SUBI T,3  TRO T,40  JRST .+1] + DPB T,[%CONN,,T] + +MAPPA1: TLO T,MAPCON!MAPSOC + DPB TT,[%%PINN,,T] + SETZ TTT, + DPB TTT,[%CONP,,T] + POPJ P, + +MAPLUZ: SETZ T, + POPJ P, + +;Find a PWR/GND pin on board closest to this pin + +STORAGE(IMPURE) +FPWRGND: 0 ;EITHER VPIN OR GPIN +FPWRPTR: 0 ;INDEX OF CUURENT CANDIDATE +STORAGE(PURE) + +;A = MAPSOC+$$PINN,,LOC +;B = VOLTAGE + +FPWR: CAIE B,=500 ;+5.00V?? + JRST [ SETZ A, + POPJ P,] + SKIPA T,[MAPSOC+VPIN] +FGND: MOVEI T,MAPSOC+GPIN + MOVEM T,FPWRGND ;WHAT TO LOOK FOR + JUMPL A,FPWCON ;A CONNECTOR? + LDB T,[%DIPS,,A] ;COLUMN OF PIN + SKIPN UNICOL(T) ;IN UNIVERSAL AREA? + JRST [ MOVE T,FPWRGND ;NO, SIMPLE + DPB T,[%%PINN,,A] ;MAKE INTO V,G PIN + POPJ P,] +;In universal area, look for V,G pin on eother side + MOVEI T,FPWUNI-1 ;LIST OF SLOTS AROUND UNIVERSAL +FPWR1: MOVEM T,FPWRPTR + PUSHJ P,FINDCLOSEST + POPJ P, ;RETURNS HERE WITH BEST + AOS T,FPWRPTR + SKIPGE A,(T) + POPJ P, ;END OF LIST + HRL A,FPWRGND + JRST CPOPJ1 + +FPWCON: LDB TT,[%CONN,,A] ;FRONT OR BACK? + TRZ TT,40 + MOVEI T,FPWFR-1 ;Search on front dips slots + CAIL TT,L.X + MOVEI T,FPWBAK-1 ;Search on back dips slots + JRST FPWR1 + +;Search list around universal area + +FPWUNI: DIPSLT(D,10) + DIPSLT(E,10) + DIPSLT(F,10) + DIPSLT(G,10) + DIPSLT(H,10) + DIPSLT(J,10) + DIPSLT(D,15) + DIPSLT(E,15) + DIPSLT(F,15) + DIPSLT(G,15) + DIPSLT(H,15) + DIPSLT(J,15) + -1 + +FPWFR: DIPSLT(D,1) + DIPSLT(D,2) + DIPSLT(D,3) + DIPSLT(D,4) + DIPSLT(D,5) + DIPSLT(D,6) + DIPSLT(D,7) + DIPSLT(D,8) + DIPSLT(D,9) + DIPSLT(D,10) ;DON'T LOOK IN UNIVERSAL + DIPSLT(D,15) + DIPSLT(D,16) + DIPSLT(D,17) + DIPSLT(D,18) + DIPSLT(D,19) + DIPSLT(D,20) + DIPSLT(D,21) + DIPSLT(D,22) + DIPSLT(D,23) + DIPSLT(D,24) + -1 + +FPWBAK: DIPSLT(J,1) + DIPSLT(J,2) + DIPSLT(J,3) + DIPSLT(J,4) + DIPSLT(J,5) + DIPSLT(J,6) + DIPSLT(J,7) + DIPSLT(J,8) + DIPSLT(J,9) + DIPSLT(J,10) ;DON'T LOOK IN UNIVERSAL + DIPSLT(J,15) + DIPSLT(J,16) + DIPSLT(J,17) + DIPSLT(J,18) + DIPSLT(J,19) + DIPSLT(J,20) + DIPSLT(J,21) + DIPSLT(J,22) + DIPSLT(J,23) + DIPSLT(J,24) + -1 + +FOR NAME IN (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +BEND MUPAC diff --git a/src/wl/ncp13.43 b/src/wl/ncp13.43 new file mode 100644 index 00000000..86fce1bd --- /dev/null +++ b/src/wl/ncp13.43 @@ -0,0 +1,1031 @@ +.ADD(ALLLOCS,NCP13,NCP13V) ;-*-MIDAS-*- +MDWL,< +.ADD(ALLWW,NCP13,NC13TV) +>;MDWL +;Note! These .ADD's must be outside of block structure + +BEGIN ncp13 + +;Nomenclature for universal style boards: +; Field-size +; (5) %DIPG, group A,B,C, ... +; (5) %DIPC, column within group, A:S, A:T, A:S +; (8) %DIPN, pin # within column (1-62) + +%DIPG__<POINT 5,,22>-=18 ;Group +%DIPC__<POINT 5,,27>-=18 ;Column +%DIPN__<POINT 8,,35>-=18 ;Pin number (up to 255) +GPINOF__=100 ; (100-177) G pins are offset 100 from + ; neighboring pin +VPINOF__=200 ; (200-277) V pins are offset 200 from + ; neighboring pin + +%CONT__<POINT 1,,22>-=18 ;CONNECTOR TYPE 0  DEC 1  FLAT CABLE "J" +%CONN__<POINT 4,,26>-=18 ;CONNECTOR NUMBER (LETTER OR JACK #) +%CONP__<POINT 9,,35>-=18 ;CONNECTOR PIN # + +NGRPS__6 ; For UML ????? A - F ROWS + +MXPINC__=50 ;Number of pins in each column +MXDPIN__=36 ;MAXIMUM NUMBER OF DEC PINS/CONNECTOR + +GRPXL__=0 ;Left boundary of DIP area +GRPXA__=17*=300 ;Right edge of 18 columns +GRPYB__=0 +GRPYT__=5000 ;Top of 50 rows + +comment  +The NCP13 board has two groups (labeled A,B), with columns labeled "A,B,C,D,E,F,G,H,J" +for a total of 18 columns. Each column has 50 pins. There are +two (J1,J2) 26 pin flat-cable connectors centered above each of the groups. +The V,G pins are besides columns B,D,F,H in each group. +The V pin is adjacent to pins 8,16,24,32,40,48. +The G pin is adjacent to pins 4,12,20,28,36,44. +None of the pins on the I/O connectors are grounded. + +; All calculations are done from the DIP side. + +; (0,0) at LOWER left hand corner in left handed coordinate system. +; X+ to right, Y+ is up + + + +COMMENT  + +AUGAT-LG627 CONNECTOR PIN FORMAT PRINTS AS J#-# OR LL# +THE J IS LITERAL. + +______|_____|_____|_____|_____|_____| +| 22 26 35 +| |1| 4 | 9 | +|_______|_|_______|_________________| + | | | +< | | |------------>PIN + | | + | |----------------------CONNECTOR NUMBER (JACK OR ROW LETTER) + | +< |--------------------------->CONNECTOR TYPE 0  DEC, 1  FLAT CABLE + + + + + + + +;THE TRANSFER VECTOR FOR THE AUGUAT 8136-LG627 BOARD + +^NCP13V: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST CPOPJ ;LOCFUK +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG + JRST AUGDIP +>;MWL + [ASCIZ/LL#/] ; CUE FOR BOARD SLOT + [ASCIZ /#/] ; CUE FOR BOARD PIN +MDPC,< [ASCIZ/J#-# or LL# /] ;CUE FOR CONNECTOR PIN + [ASCIZ/LL# /] ;CUE FOR BODY LOC + [ASCID /AA01/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/LL#/] ;WIRELISTER BODY CUE + [ASCIZ/J# or L/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK NCP13V,LTVLEN + +L2NSUB: BLOCK L2NLEN ;******* +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +;NOTE! G is included as a legal letter because it is a column name. +; However, it isn't a legal DEC pin name, so we must be careful. + +NNN__1 +FOR I IN(A,B,C,D,E,F,G,H,J,K,L,M,N,P,R,S,T,U,V) +< L2N2L I,0 +> +FOR I IN (I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + MOVE T,NOMTYP + MOVE TT,@LNAMES(T) + SETZ T, + CAMN TT,[ASCII/NCP13/] + MOVE T,[parn13,,PARAMS] + SKIPN T + PUSHJ P,FUCKUP + BLT T,PARAMS+LPARAM-1 + POPJ P, + +;Parameters for differing board types sharing this Board file. +STORAGE(IMPURE) +PARAMS: +;;This table must be setup for the selected board type +MXJCON: 0 ;MAX NUMBER FLAT CABLE CONNECTORS +MXDCON: 0 ;MAX NUMBER OF DEC STYLE CONNECTORS +FLTMAX__=20 ;Max no of Flat cable conns among these boards +FLTSIZ: BLOCK FLTMAX ;Number of pins in connector + +Mwl,< +UMLCOL__6 ;UML IS PRINTED WITH DIP ROWS DOWN LENGTH OF THE PAPER +UMLROW: 0 ;LENGTH OF ROW IS UML #ROWS +FLTPIN: BLOCK FLTMAX ;x,y locations for FlatCable connectors +>;Mwl +LPARAM__.-PARAMS +STORAGE(PURE) + +;; *** Variable stuff for NCP13 *** +PARN13: + 4 ;MAX NUMBER FLAT CABLE CONNECTORS + 0 ;MAX NUMBER OF DEC STYLE CONNECTORS + +;FLTSIZ: +REPEAT FLTMAX,<=26  > + +;For UML +MWL,< +COL627__=30 ;30 DIPS IN EACH OF 6 ROWS ??? + COL627 ;LENGTH OF ROW IS UML #ROWS + +;**************************************** SCOTCH-FLEX PINS + +..tem__. + +;FLTPIN: ; X,,Y LOCATION OF UPPER RIGHT PIN (PIN 1) + ;INDEXED BY FLAT CABLE NUMBER-1 + + =1700,,=5800 ;J1 + =1700,,=5500 ;J2 + =4400,,=5800 ;J3 + =4400,,=5500 ;J4 + +REPEAT FLTMAX-<.-..TEM>,<0  > + + +>;MWL +CHECK PARN13,LPARAM + +MWL,< +NIL,< +;**************************************** DEC CONNECTOR PINS + + +;CONNECTORS, DEC +DECCNY__=0 ;0.0" UP TO BOTTOM ROW OF DEC CONNECTORS +DCPINO__=200 ;.2" UP FROM BOTTOM TO SECOND ROW +DECX1__=2700 ;2.7" LEFT FOR LARGE CONNECTOR SPACES +DECX2__=2600 ;2.6" LEFT FOR SMALL CONNECTOR SPACES +GAP1T2__DECX2-=1900 ; THE SMALLER GAP BETWEEN DEC PADDLES +DCPINS__=1900 ;1.9" RIGHT FOR PIN A1 RELATIVE TO START OF CONNECTOR +DCPNSP__=100 ;.1" BETWEEN PINS HORIZONTALLY +DCGRSP__=200 ;.2" BETWEEN GROUPS OF PINS + +DCLOC: ;LOCATION OF DEC STYLE CONNECTORS + +X__DECX1*<DEC627/2>+DECX2*<DEC627/2-1> ;THE X OF V1 ON THE RIGHTMOST PADDLE! + ;INITIALLY FAR TO THE RIGHT, CONNECTORS LETTERED IN REVERSE +REPEAT DEC627/2, +< X,,DECCNY +X__X-DECX1 + X,,DECCNY +X__X-DECX2 +> +>;NIL +>;mwl + ;Print DIP location. +;(note that the DIP location is really the board pin location that +; pin 1 of the DIP goes into. Therefore there is allowance for +; naming V and G pins on the board.) + +PRNLOC: SETZ TT, + JUMPE A,CPOPJ + JUMPL A,CNLOC ;Connector or DIP? + LDB T,[%DIPG,,A] ;GROUP LETTER + JUMPE T,CPOPJ ; NULL? + PUTBYT @N2L(T) + LDB T,[%DIPC,,A] ;Column letter + PUTBYT @N2L(T) + LDB T,[%DIPN,,A] ;Position of pin 1 within column + SKIPE T ;0 row means just column specification + PUSHJ P,PRNROW +PRNLO2: MOVEI TT,"-" ;Suggested separation char + POPJ P, + +CNLOC: LDB T,[%CONT,,A] ;CONNECTOR TYPE + JUMPE T,CNDEC ;DEC STYLE CONNECTOR + PUTBYT "J" + LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + MOVEI TT,"-" + POPJ P, + +CNDEC: LDB T,[%CONN,,A] ;CONNECTOR ROW NUMBER + PUTBYT @N2L(T) + SETZ TT, ;DEC DOESN'T WANT SEP BETWEEN A,A1 + POPJ P, + +PRNROW: LDB T,[%DIPN,,A] + JUMPL A,PRNPNC + JRST PRNPN1 + +PRNPIN: LDB T,[%%PINN,,A] + JUMPL A,PRNPNC +PRNPN1: +MWL,< MOVEI TT,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM TT,NDIG + CAIL T,VPINOF + JRST [ PUTBYT "V" + SUBI T,VPINOF + JRST NPUTDEC] + CAIL T,GPINOF + JRST [ PUTBYT "G" + SUBI T,GPINOF + JRST NPUTDEC] + JRST NPUTDEC ;PRINT IT OUT +>;MWL +MDPC,< JRST PUTDEC > + + +PRNPNC: LDB TT,[%CONT,,A] ;DEC CONNECTOR PIN PRINTOUT + JUMPN TT,PRNPN1 ;flat cable connector + ASH T,-1 + PUTBYT @N2L(T) ;PRINT DEC CONNECTOR LETTER + LDB T,[%%PINN,,A] + ANDI T,1 + ADDI T,1 + MOVEI TT,1 + MOVEM TT,NDIG + JRST NPUTDEC ;PRINT AS 1 DIGIT TRAILING NUMBER + + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +; Returns %%PINN = 0, %DIPN has row +; A = MBIT+PIN#,,LOC +; B = PACKAGE +;Skips if can map, with MAPSOC set. +; A = New MBIT+PIN#,,LOC +; B = FLAGS,, +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPUNI +; %MPROT etc. +;(Note: Pin 0 has a special hack just removes the within-socket offset, if any.) + +;Map onto post on board. Remeber that universal pattern is in +; two groups A,B. Columns are AA-AJ, BA-BJ + +MDWL,< +MAPOST: TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A ;Save slot spec +;Call MAPUNI to map onto column, row + LDB C,[%DIPC,,A] ;Dip column lettern + LDB D,[%DIPN,,A] ;Row within column + LDB A,[%%PINN,,A] + JUMPE A,[ AOS -3(P) ;"strip dip-offset", NA to uni boards + JRST MAPOSX] + PUSHJ P,MAPUNI ;Map as universal board + JRST MAPOSX ;Fail +;Now error check, and look for movement between groups + SKIPLE D ;can only be rows 1-50 + CAILE D,MXPINC + JRST MAPOSX + LDB A,[%DIPG,,(P)] ;Which universal group? +MAPOSA: CAMN A,L2N+"A" + JRST [ CAMLE C,L2N+"J" ;overflowed into group B? + JRST [ SUB C,L2N+"J" + ADD C,L2N+"A" + SOS C ;J+1 is A + AOJA A,MAPOSB] + CAMGE C,L2N+"A" ;Underflowed? + JRST MAPOSX + JRST MAPOS1] ;OK +MAPOSB: CAMN A,L2N+"B" + JRST [ CAMGE C,L2N+"A" ;underflowed into group A? + JRST [ SUB C,L2N+"A" + AOS C + ADD C,L2N+"J" ;"A"-1 IS "J" + SOJA A,MAPOSA] + CAMLE C,L2N+"J" + JRST MAPOSX ;Overflowed off right of group B + JRST MAPOS1] + JRST MAPOSX +MAPOS1: DPB A,[%DIPG,,(P)] + POP P,A + HRLI A,MAPSOC + SETZ T, + DPB T,[%%PINN,,A] + DPB D,[%DIPN,,A] + DPB C,[%DIPC,,A] +;B has flags from MAPUNI + AOSA -2(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, +>;MDWL + +;Read "DIP Slot" which in this case is Group,Column-letter,row-number +GTSLTL: PUSH P,A + MOVEI A,[[ASCIZ /LL#./] + 0] + PUSHJ P,LNPARS + JRST GTSL0 + JRST GTSL1 + SETZ TT, + PUSHJ P,GATLOC + JRST GTSL0 +GTSL2: MOVEM TT,DESTIN + AOS -1(P) +GTSL1: AOS -1(P) +GTSL0: POP P,A + POPJ P, + +GATLOC: MOVE A,ARG1 + DPB A,[%DIPG,,TT] + MOVE A,ARG2 + DPB A,[%DIPC,,TT] + MOVE A,ARG3 + DPB A,[%DIPN,,TT] + JRST CPOPJ1 + +MD,< +;THIS SHOULD PROBABLY TRY FOR B-R-S ALSO, BUT...? +GTCONP: PUSH P,A + MOVEI A,[[ASCIZ /J#-#/] + [ASCIZ /LL#/] + 0] + PUSHJ P,LNPARSE + JRST GTCON0 + JRST GTCON1 ;NULL INPUT + PUSHJ P,GATCON ;GET JACK OR PADDLE PART OF LOC + JRST GTCON0 + LDB A,[%CONT,,TT] + JUMPE A,GTDCP ;GET DEC STYLE CONNECTOR PIN + MOVE A,ARG4 +GTCON3: DPB A,[%CONP,,TT] + HRRZM TT,DESTIN + AOS -1(P) +GTCON1: AOS -1(P) +GTCON0: POP P,A + POPJ P, + +GTDCP: SOSL A,ARG3 + CAILE A,1 + JRST GTCON0 + MOVE A,ARG2 + ASH A,1 + IOR A,ARG3 + JRST GTCON3 +>;MD + +GATCON: SETZ TT, + JUMPN A,GTCN1 ;DEC PADDLE? (VS. SCOTCHFLEX) + MOVE A,ARG2 ;ARG1 IS THE "J" + DPB A,[%CONN,,TT] + MOVEI A,1 +GTCN2: DPB A,[%CONT,,TT] ;THIS IS A FLAT CABLE CONNECTOR + TLO TT,MAPCON + JRST CPOPJ1 + +GTCN1: MOVE A,ARG1 + DPB A,[%CONN,,TT] + MOVEI A,0 ;THIS IS A DEC STYLE CONNECTOR + JRST GTCN2 + + +MWL,< + +GETLOC: MOVEI A,[[ASCIZ /J#/] ;0 - Scotchflex connector + [ASCIZ /LL#/] ;1 - Board socket + [ASCIZ /LL#@#/] ;2 - Board socket with offset + [ASCIZ /L/] ;3 - Dec connector + 0] + PUSHJ P,LNPARSE + POPJ P, + POPJ P, + SKIPE A ;STRING 0,3 ARE CONNECTOR FORMATS + CAIN A,3 ;DEC CONN MUST BE .NE. 0 FOR GATCON + JRST GATCON + SETZ TT, +; MOVE T,ARG4 +; CAIN A,2 ;THE OFFSET CASE +; DPB T,[%DIPOF,,TT] + JRST GATLOC + +;Print location for fixed format card image +;8 cols wide, with "group" left justified, "pin number" right justified +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + SETZM TCOUNT + JUMPL A,RAYCON + PUSH P,A + SETZ TT, + DPB TT,[%DIPN,,A] + PUSHJ P,PRNLOC ;Print LL + POP P,A + LDB TT,[%DIPN,,A] ;How many letters? depends on V or G + MOVEI T,6 + CAIL TT,GPINOF + MOVEI T,5 + PUSHJ P,TTFILL + JRST PRNROW + +RAYCON: PUSHJ P,PRNLOC ;PRINTS C OR J01 + MOVEI T,6 + PUSHJ P,TTFILL + LDB TT,[%CONT,,A] + JUMPN TT,RAYCN1 ;Scotchflex + LDB T,[%%PINN,,A] + TRNN T,1 + PUTBYT "1" + TRNE T,1 + PUTBYT "2" + ASH T,-1 + PUTBYT @N2L(T) + POPJ P, ;"C" + 5 spaces + #L = 8 + +RAYCN1: LDB T,[%%PINN,,A] +RAYCN2: MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC ;"J01" + 3 spaces + ## = 8 + + ;AUGAT format + +;Print location for fixed format card image +;2-3 columns "GROUP", 2 columns "LOC", 3 columns pin +;DIP A.. 01 . 001 +;DECCON AJ. 01 . 0A1 +;FLAT J01 01 . 001 + +AUGDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + JUMPL A,AUGCON + LDB T,[%DIPG,,A] + PUTBYT @N2L(T) + PUTSTR [ASCIZ / /] ;2 SPACES + LDB T,[%DIPC,,A] + PUTBYT @N2L(T) + PUTSTR [ASCIZ / /] ;2 SPACES + LDB T,[%DIPN,,A] + MOVEI TT,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM TT,NDIG + CAIL T,VPINOF + JRST [ PUTBYT "V" + SUBI T,VPINOF + JRST NPUTDEC] + CAIL T,GPINOF + JRST [ PUTBYT "G" + SUBI T,GPINOF + JRST NPUTDEC] + MOVEI TT,3 ;SETUP FOR 3 DIGIT NUMBER PRINT + MOVEM TT,NDIG + JRST NPUTDEC ;PRINT IT OUT + +AUGCON: LDB TT,[%CONT,,A] + SKIPN TT ;IF DEC CONNECTOR + PUSHJ P,FUCKUP ;BARF + PUTBYT "J" + LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + PUTSTR [ASCIZ /01 /] + MOVEI TT,3 + MOVEM TT,NDIG + LDB T,[%%PINN,,A] + JRST NPUTDEC + +FOR NAME IN (CPARTP:,CONGIN:,SEQLOC:) +<NOTYET(NAME) +> +>;MWL + +CPNSEP: LDB TT,[%CONP,,T] + MOVEI TTT,0 + DPB TTT,[%CONP,,T] + POPJ P, + +CPNMER: PUSH P,A + SKIPN T + SKIPE TT + JRST CPNMR1 + MOVEI TT,1 ;T,TT=0 MEANS INITIALIZE TO FIRST + DPB TT,[%CONN,,T] ;CONNECTOR TYPE STARTS AT ZERO +CPNMR1: LDB TTT,[%CONT,,T] + JUMPE TTT,[ MOVEI A,MXDPIN ;IF A DEC CONN THEN MXDPIN IS MAX # + JRST CPNMR2] + LDB TTT,[%CONN,,T] + MOVE A,FLTSIZ-1(TTT) +CPNMR2: CAMG TT,A + JRST CNPMR1 + MOVEI TT,1 ;CARRY INTO JACK, FROM PIN# + LDB TTT,[%CONT,,T] + MOVE A,MXJCON + SKIPN TTT + MOVE A,MXDCON + LDB TTT,[%CONN,,T] + AOS TTT + DPB TTT,[%CONN,,T] + CAIGE TTT,A + JRST CNPMR1 + MOVEI TTT,1 + DPB TTT,[%CONN,,T] + LDB TTT,[%CONT,,T] + AOS TTT + DPB TTT,[%CONT,,T] +CNPMR1: DPB TT,[%CONP,,T] + POP P,A + POPJ P, + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD +NOTYET(CPNMAP:) + +MDWL,< +MWL,< +SUBTTL WIRE WRAP ROUTINES -- HEX DEC UNIVERSAL BOARDS + +^^NC13TV__. ;TRANSFER VECTOR FOR QUAD HEIGHT UNIVERSAL DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + COL627 ;NROWS (USED FOR UML ONLY) + UMLCOL ;NCOLS (USED FOR UML ONLY) + UMLCOL ;NCLPRG (USED FOR UML ONLY) + 0 ;NRWPRP (USED FOR UML ONLY) + COL627*NGRPS ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(4) ;NPADS (USED FOR UML ONLY) + XWD -=25,1 ;PADLET (USED FOR UML ONLY) + XWD -2,1 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK NC13TV,WTVLEN + + + ;Connector pin mapping table for MAPIT + +NIL,< +;**************************************** DEC CONNECTOR PINS +;PIN POSITIONS WITHIN ONE PADDLE + +X__DCPINS ;INITIAL X STARTING LOCATION +DCPINL: + +REPEAT 3, +< + REPEAT 6, + < X,,0 + X,,DCPINO + X__X-DCPNSP + > +X__X-DCGRSP+DCPNSP ;ALREADY SUB'ED AN EXTRA DCPNSP AT END OF RPT +> + +DCPWRG: 0 ;A1 + PWR,,500 ;A2 + 0 ;B1 + 0 ;B2 + 0 ;C1 + GND,,0 + 0 ;D1 + 0 + 0 ;E1 + 0 + 0 ;F1 + 0 + 1B0 ;G1 - not really legal for DEC + 1B0 + 0 ;H1 + 0 + 0 ;J1 + 0 + 0 ;K1 + 0 + 0 ;L1 + 0 + 0 ;M1 + 0 + 0 ;N1 + 0 + 0 ;P1 + 0 + 0 ;R1 + 0 + 0 ;S1 + 0 + GND,,0 ;T1 + 0 + 0 ;U1 + 0 + 0 ;V1 + 0 + +>;NIL + ;MAPIT - Convert board post spec to X,Y - used for routing +;A = PostSpec + +;MAPIT (WL) - CONVERT POST INTO X,Y AND BITS +;NOTE!! X,Y are viewed from DIP side, usually with X+ = right, Y+ = up +;A = MBIT+PIN#,,LOC +;SKIPS IF LEGAL POST +;T = X,,Y +;TT = PWR!GND,,VOLTAGE (If dedicated pin on board) +;TTT = (DISTANCE TO END OF ROW - FOR FUDGING CITY-BLOCK STUFF) + +MAPIT: JUMPL A,CONMAP ;MAP CONNECTOR LOCATION + SETZ TT, ;flags for Pwr, Gnd + PUSHJ P,MAPLOC ;MAP DIP LOCN + POPJ P, ;BAD LOCN +;Should return flags for Pwr or Gnd?? + SETZ TTT, ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + +;Convert PIN-SPEC in A into DIP X,Y locn (T) +;Y + UP +;X + RIGHT (FROM DIP SIDE) +MAPLOC: PUSH P,B + PUSH P,C + PUSH P,D + LDB B,[%DIPG,,A] + LDB C,[%DIPC,,A] + SUB C,L2N+"A" + IMULI C,=300 ;.3" BETWEEN COLUMNS + LDB D,[%DIPN,,A] + CAIL D,VPINOF + JRST [ ADDI C,=100 ;V pin is to right + SUBI D,VPINOF + MOVE TT,[Pwr,,=500] ;+5.0V + JRST MAPLO1] + CAIL D,GPINOF + JRST [ ADDI C,=100 ;G pin is to right + SUBI D,GPINOF + MOVSI TT,Gnd + JRST MAPLO1] +MAPLO1: IMULI D,=100 + MOVEI T,=4900+=100 ;ROW 1 is 4.9" up + SUB T,D ; and Row 2-50 are lower + CAMN B,L2N+"A" + ADDI C,0 + CAMN B,L2N+"B" + ADDI C,=2700 ;Group B is 2.7 inches to right + HRL T,C + POP P,D + POP P,C + POP P,B + JRST CPOPJ1 + +;HERE FOR CONNECTOR PINS + +CONMAP: LDB T,[%CONT,,A] + JUMPE T,CONDEC ;DEC STYLE CONNECTOR + LDB T,[%CONN,,A] ; T HAS CONNECTOR NUMBER + JUMPE T,CPOPJ + CAMLE T,MXJCON + POPJ P, + LDB TT,[%%PINN,,A] + MOVE TTT,FLTPIN-1(T) ;X,Y for whole connector +CONMJ5: MOVE T,FLTSIZ-1(T) + ASH T,-1 ;Pins in first row of connector + CAMLE TT,T + JRST [ SUBI TTT,=100 ;2nd row of connector + SUB TT,T + JRST .+1] + SOS TT + MOVNS TT + IMULI TT,=100 + HRLZS TT + ADD TTT,TT +CONM1: MOVE T,TTT + SETZB TTT,TT + JRST CPOPJ1 + +;Find X,Y of DEC connector pin + +CONDEC: +NIL,< + LDB TT,[%CONN,,A] + JUMPE TT,CPOPJ + CAMLE TT,MXDCON + POPJ P, + MOVE T,DCLOC-1(TT) ;PADDLE X,Y + LDB TT,[%%PINN,,A] + CAIL TT,2 ;2+0 IS A+1 PIN + CAILE TT,MXDPIN+2-1 + POPJ P, + ADD T,DCPINL-2(TT) + SKIPGE TT,DCPWRG-2(TT) ;Legal pin? + POPJ P, + SETZ TTT, +>;NIL + JRST CPOPJ1 + +;PAKSIZ (WL) - GET DIMENSIONS OF PACKAGE ON BOARD +;A = MBIT+PIN#,,LOC +;B = PACKAGE CODE +;SKIPS IF LOCATION IS LEGAL FOR THIS PACKAGE TYPE +;T = Xmin,,Ymin +;TT = Xmax,,Ymax + +PAKSIZ: SKIPE ILLPAK(B) + POPJ P, + PUSHJ P,PAKDIM ;Find outline of package on board + POPJ P, +For T IN (T,TT) +< + HLRE TTT,T ;X dimension + CAML TTT,[GRPXL-=100] + CAMLE TTT,[GRPXA+=100] + POPJ P, + HRRE TTT,T + CAML TTT,[GRPYB-=100] + CAMLE TTT,[GRPYT+=100] + POPJ P, +>;For + JRST CPOPJ1 + +;Define illegal package types in this board +; -1 if illegal +ILLPAK: BLOCK NPACK +; FOR @' I IN (22,36,48,64) +; <ORG ILLPAK+K.'I  -1 +; > + ORG ILLPAK+NPACK + +;??? No scheme for UML on universals yet +NOTYET(MAPRC:) +NOTYET(MAPPAD:) + +IFN 0,< +MAPRC: HLRZ TT,T ;(1,1) IS DIP IN UPPER LEFT HAND CORNER + SOJL TT,CPOPJ + CAML TT,NROWS + POPJ P, + HRRZS T ;ROW IN TT, COL IN T + SOJL T,CPOPJ + CAML T,NCOLS ;(0,0) IS NOW IN UPPER LEFT + POPJ P, + PUSH P,[0] + MOVNS TT + ADD TT,GRPCOL ;COL 30 IS FIRST ROW OF UML + DPB TT,[%DIPS,,(P)] + MOVNS T ;LAST UML COL CORRESPONDS TO FIRST DIP GROUP + MOVEI T,NGRPS(T) + DPB T,[%DIPG,,(P)] + POP P,T + JRST CPOPJ1 + +MAPPAD: SOS TT + ASH TT,1 ;TT,TTT HAVE COMPLEX PIN# + ADDI TT,(TTT) + CAMLE T,MXDCON + JRST MAPPD1 + AOS TT ;DEC PADDLES ARE PINLETTER*2+SIDE + CAILE TT,MXDPIN+2-1 ;EXISTS? + JRST MAPPDL ;NO, ERROR + HRLI T,0 +MAPPD2: MOVSI TTT,MAPCON(TT) ;PIN# IN LH + DPB T,[%CONN,,TTT] + HLRZS T + DPB T,[%CONT,,TTT] + SKIPA T,TTT +MAPPDL: SETZ T, ;LOSE RETURN + POPJ P, + +MAPPD1: SUB T,MXDCON + HRLI T,1 ;CONN TYPE IS SCOTCH + CAMLE TT,JACKSZ(T) + JRST MAPPDL + JRST MAPPD2 +>;IFN 0 + + +VCCCOL: 2 + 2 + 2 + 4 + 4 + 6 + 6 + 8 + 8 + +VCCROW: 8,,4 + 8,,4 + 8,,4 + 8,,4 + 8,,4 + 8,,4 + 8,,4 + 8,,4 ;8 + 8,,=12 + 8,,=12 + 8,,=12 + 8,,=12 ;12 + =16,,=12 + =16,,=12 + =16,,=12 + =16,,=12 ;16 + =16,,=20 + =16,,=20 + =16,,=20 + =16,,=20 ;20 + =24,,=20 + =24,,=20 + =24,,=20 + =24,,=20 ;24 + =24,,=28 + =24,,=28 + =24,,=28 + =24,,=28 ;28 + =32,,=28 + =32,,=28 + =32,,=28 + =32,,=28 ;32 + =32,,=36 + =32,,=36 + =32,,=36 + =32,,=36 ;36 + =40,,=36 + =40,,=36 + =40,,=36 + =40,,=36 ;40 + =40,,=44 + =40,,=44 + =40,,=44 + =40,,=44 ;44 + =48,,=44 + =48,,=44 + =48,,=44 + =48,,=44 ;48 + =48,,=44 + =48,,=44 ;50 + + +;FPWR (WL) - FIND POWER PIN +;A = MBIT+PIN#,,LOC ;A Socket pin (MAPSOC) +;B = VOLTAGE (10 mV UNITS) +;RETURNS A=0 IF FAILS +;A = New MBIT+PIN#,,LOC + +FPWR: CAIE B,=500 ;+5.00V?? + JRST [ SETZ A, ;Don't know of any other power + POPJ P,] + JUMPL A,FPWRC ;For connector pin? + LDB B,[%DIPC,,A] ;Column + HRRZ B,VCCCOL-1(B) ;Map into the closest column that has pwr/gnd pins + DPB B,[%DIPC,,A] + LDB T,[%DIPN,,A] + SKIPN T + PUSHJ P,FUCKUP + HLRZ T,VCCROW-1(T) + ADDI T,VPINOF + JRST FGND9 + +;FGND (WL) - FIND GROUND PIN +;A = MBIT+PIN#,,LOC ;A Socket pin (MAPSOC) +;RETURNS A=0 IF FAILS +;A = New MBIT+PIN#,,LOC + +FGND: JUMPL A,FGNDC + LDB B,[%DIPC,,A] ;Column + HRRZ B,VCCCOL-1(B) ;Map into the closest column that has pwr/gnd pins + DPB B,[%DIPC,,A] + LDB T,[%DIPN,,A] + HRRZ T,VCCROW-1(T) + ADDI T,GPINOF +FGND9: DPB T,[%DIPN,,A] + SETZ B, + DPB B,[%%PINN,,A] + TLO A,MAPSOC + POPJ P, + +STORAGE(IMPURE) +GENVAR: 0 +GENFIX: 0 +STORAGE(PURE) + +;GenNom - break up asciz into nomen +;T = Ascii +;Returns: +;T = Group +;TT = Column + +GENNOM: LDB TT,[POINT 7,T,35] ;Column + MOVE TT,L2N(TT) + LDB T,[POINT 7,T,28] ;Group + MOVE T,L2N(T) + POPJ P, + + +GENTBL: +FOR I IN (AB,AD,AF,AH) +< "I" +> +FOR I IN (BB,BD,BF,BH) +< "I" +> +LGENTB__.-GENTBL + +;Search for ground/pwr pins along top for flatcable, along bottom +; for DEC cables. + +FGNDC: + ;Fix routine for FlatCable Ground pins + MOVEI TTT,[MOVEI TTT,GPINOF+4 + POPJ P,] + LDB TT,[%CONT,,A] + SKIPN TT + ; or Fix routine for DecConnector GND pins + MOVEI TTT,[MOVEI TTT,GPINOF+=62 + POPJ P,] + JRST DOFIND + +FPWRC: MOVEI TTT,[MOVEI TTT,VPINOF+=8 + POPJ P,] + LDB TT,[%CONT,,A] + SKIPN TT ;DecConnector? + ;Fix routine for DecConnector GND pins + MOVEI TTT,[MOVEI TTT,VPINOF+=58 + POPJ P,] +DOFIND: MOVSI T,-LGENTB ;Setup generator + MOVEM T,GENVAR + MOVEM TTT,GENFIX + PUSHJ P,FINDCLOSEST + JRST FGNDC1 ;Closest in A +;CoRoutine to generate possible GNDS for FlatCable connectors + SKIPL TT,GENVAR ;Any more possiblities? + POPJ P, ;NO + MOVE T,GENTBL(TT) + AOBJP TT,.+1 + MOVEM TT,GENVAR + PUSHJ P,GENNOM + PUSHJ P,@GENFIX + MOVSI A,MAPSOC + DPB T,[%DIPG,,A] + DPB TT,[%DIPC,,A] + DPB TTT,[%DIPN,,A] + JRST CPOPJ1 ;CoReturn + +FGNDC1: TLO A,MAPSOC + POPJ P, + +FOR NAME (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +>;MDWL +BEND ncp13 diff --git a/src/wl/ug61c.13 b/src/wl/ug61c.13 new file mode 100644 index 00000000..203da76c --- /dev/null +++ b/src/wl/ug61c.13 @@ -0,0 +1,1049 @@ + +.ADD(ALLLOCS,UG61C,UG61CV) ;-*-MIDAS-*- +MDWL,< +.ADD(ALLWW,UG61C,U61CTV) +>;MDWL +;Note! These .ADD's must be outside of block structure + +BEGIN ug61c + +;Nomenclature for universal style boards: +; Field-size +; (5) %DIPG, group A,B,C, ... +; (5) %DIPC, column within group, A:S, A:T, A:S +; (8) %DIPN, pin # within column (1-62) + +%DIPG__<POINT 5,,22>-=18 ;Group +%DIPC__<POINT 5,,27>-=18 ;Column +%DIPN__<POINT 8,,35>-=18 ;Pin number (up to 255) +GPINOF__=100 ; (100-177) G pins are offset 100 from + ; neighboring pin +VPINOF__=200 ; (200-277) V pins are offset 200 from + ; neighboring pin + +%CONT__<POINT 1,,22>-=18 ;CONNECTOR TYPE 0  DEC 1  FLAT CABLE "J" +%CONN__<POINT 4,,26>-=18 ;CONNECTOR NUMBER (LETTER OR JACK #) +%CONP__<POINT 9,,35>-=18 ;CONNECTOR PIN # + +NGRPS__6 ; For UML ????? A - F ROWS + +MXPINC__=50 ;Number of pins in each column +MXDPIN__=36 ;MAXIMUM NUMBER OF DEC PINS/CONNECTOR + +GRPXL__=0 ;Left boundary of DIP area +GRPXA__=26*=300 ;Right edge of 27 columns +GRPYB__=0 +GRPYT__=5000 ;Top of 50 rows + +comment  +The UG61C board has 3 groups (labeled A,B,C), with columns labeled "A,B,C,D,E,F,G,H,J" +for a total of 27 columns. Each column has 50 pins. There are +2 (J1-J6) 26 pin flat-cable connectors centered above each of the groups. +The V,G pins are besides columns B,D,F,H in each group. +The V pin is adjacent to pins 8,16,24,32,40,48. +The G pin is adjacent to pins 4,12,20,28,36,44. +None of the pins on the I/O connectors are grounded. + +; All calculations are done from the DIP side. + +; (0,0) at LOWER left hand corner in left handed coordinate system. +; X+ to right, Y+ is up + + + +COMMENT  + +AUGAT-LG627 CONNECTOR PIN FORMAT PRINTS AS J#-# OR LL# +THE J IS LITERAL. + +______|_____|_____|_____|_____|_____| +| 22 26 35 +| |1| 4 | 9 | +|_______|_|_______|_________________| + | | | +< | | |------------>PIN + | | + | |----------------------CONNECTOR NUMBER (JACK OR ROW LETTER) + | +< |--------------------------->CONNECTOR TYPE 0  DEC, 1  FLAT CABLE + + + + + + + +;THE TRANSFER VECTOR FOR THE AUGUAT 8136-UG61 BOARD + +^UG61CV: + JRST LCINIT ;BOARD INITIALIZATION + JRST QUPIN ;CHECKS FOR WILD CONNECTOR BODIES + JRST $SLTOUT ;PRINTS CARD LOC (B-R-S) + JRST $GETSLT ;READS CARD LOC (B-R-S) + JRST PRNLOC ;PRINTS SOCKET, DIP, OR CONNECTOR LOC + JRST PRNPIN ;PRINTS SOCKET, DIP, OR CONNECTOR PIN + JRST CPNSEP ;SEPARATE CONNECTORS LOC/PIN PARTS FROM 18 BIT FORM + JRST CPNMER ;MERGE CONN LOC/PIN PARTS BACK + JRST CPNMAP ;MAP CARD LOC, CPIN-LOC INTO BACKPANEL PIN LOC +MDWL,< JRST MAPOST > ;CONVERT FROM DIP-LOC/PIN TO POST + +MDPC,< + JRST GTSLTL ;READS (B-R-S) AND BODY LOCN +MD,< JRST GTCONP ;READS (B-R-S) AND CONNECTOR PIN + JRST CPOPJ ;LOCFUK +>;MD +>;MDPC + +MWL,< + JRST GETLOC ;READS EITHER DIP LOC, OR CONNECTOR LOC + JRST RAYDIP ;PRINTS DIP, OR CONNECTOR LOC IN FORTRAN FORM + JRST CPARTP ; (PRINT EDGE PIN TO PARTITION FILE) + JRST SEQLOC ;TESTS FOR BODY LOCS BEING SEQUENTIAL + JRST CONGIN ;GENERATE NEXT INVENTED PIN TO REPLACE "U" PINS + JRST $GTSLTT ;GETSLT, BUT WITH FIRST CHAR IN CHRREG + JRST AUGDIP +>;MWL + [ASCIZ/LL#/] ; CUE FOR BOARD SLOT + [ASCIZ /#/] ; CUE FOR BOARD PIN +MDPC,< [ASCIZ/J#-# or LL# /] ;CUE FOR CONNECTOR PIN + [ASCIZ/LL# /] ;CUE FOR BODY LOC + [ASCID /AA01/] ;PROTOTYPE FOR BODY LOC +>;MDPC +MWL,< [ASCIZ/LL#/] ;WIRELISTER BODY CUE + [ASCIZ/J# or L/] ;WIRELISTER CONNECTOR BODY CUE +>;MWL +CHECK UG61CV,LTVLEN + +L2NSUB: BLOCK L2NLEN ;******* +N2LSUB: REPEAT N2LLEN, < "?" +> +EN2L__. + +;NOTE! G is included as a legal letter because it is a column name. +; However, it isn't a legal DEC pin name, so we must be careful. + +NNN__1 +FOR I IN(A,B,C,D,E,F,G,H,J,K,L,M,N,P,R,S,T,U,V) +< L2N2L I,0 +> +FOR I IN (I,O,Q) +< L2N2L I,1B0 +> + +N2LMAX__NNN-1 + +ORG EN2L + + +LCINIT: MOVE T,[L2NSUB,,L2N] + BLT T,L2N+L2NLEN+N2LLEN-1 + MOVEI T,N2LMAX + MOVEM T,MAXN2L + MOVE T,NOMTYP + MOVE TT,@LNAMES(T) + SETZ T, + CAMN TT,[ASCII/UG61C/] + MOVE T,[PARU61,,PARAMS] + SKIPN T + PUSHJ P,FUCKUP + BLT T,PARAMS+LPARAM-1 + POPJ P, + +;Parameters for differing board types sharing this Board file. +STORAGE(IMPURE) +PARAMS: +;;This table must be setup for the selected board type +MXJCON: 0 ;MAX NUMBER FLAT CABLE CONNECTORS +MXDCON: 0 ;MAX NUMBER OF DEC STYLE CONNECTORS +FLTMAX__=20 ;Max no of Flat cable conns among these boards +FLTSIZ: BLOCK FLTMAX ;Number of pins in connector + +Mwl,< +UMLCOL__6 ;UML IS PRINTED WITH DIP ROWS DOWN LENGTH OF THE PAPER +UMLROW: 0 ;LENGTH OF ROW IS UML #ROWS +FLTPIN: BLOCK FLTMAX ;x,y locations for FlatCable connectors +>;Mwl +LPARAM__.-PARAMS +STORAGE(PURE) + +;; *** Variable stuff for UG61C *** +PARU61: + 6 ;MAX NUMBER FLAT CABLE CONNECTORS + 0 ;MAX NUMBER OF DEC STYLE CONNECTORS + +;FLTSIZ: +REPEAT FLTMAX,<=26  > + +;For UML +MWL,< +COL627__=30 ;30 DIPS IN EACH OF 6 ROWS ??? + COL627 ;LENGTH OF ROW IS UML #ROWS + +;**************************************** SCOTCH-FLEX PINS + +..tem__. + +;FLTPIN: ; X,,Y LOCATION OF UPPER RIGHT PIN (PIN 1) + ;INDEXED BY FLAT CABLE NUMBER-1 + + =1700,,=5800 ;J1 + =1700,,=5500 ;J2 + =4400,,=5800 ;J3 + =4400,,=5500 ;J4 + +REPEAT FLTMAX-<.-..TEM>,<0  > + + +>;MWL +CHECK PARU61,LPARAM + +MWL,< +NIL,< +;**************************************** DEC CONNECTOR PINS + + +;CONNECTORS, DEC +DECCNY__=0 ;0.0" UP TO BOTTOM ROW OF DEC CONNECTORS +DCPINO__=200 ;.2" UP FROM BOTTOM TO SECOND ROW +DECX1__=2700 ;2.7" LEFT FOR LARGE CONNECTOR SPACES +DECX2__=2600 ;2.6" LEFT FOR SMALL CONNECTOR SPACES +GAP1T2__DECX2-=1900 ; THE SMALLER GAP BETWEEN DEC PADDLES +DCPINS__=1900 ;1.9" RIGHT FOR PIN A1 RELATIVE TO START OF CONNECTOR +DCPNSP__=100 ;.1" BETWEEN PINS HORIZONTALLY +DCGRSP__=200 ;.2" BETWEEN GROUPS OF PINS + +DCLOC: ;LOCATION OF DEC STYLE CONNECTORS + +X__DECX1*<DEC627/2>+DECX2*<DEC627/2-1> ;THE X OF V1 ON THE RIGHTMOST PADDLE! + ;INITIALLY FAR TO THE RIGHT, CONNECTORS LETTERED IN REVERSE +REPEAT DEC627/2, +< X,,DECCNY +X__X-DECX1 + X,,DECCNY +X__X-DECX2 +> +>;NIL +>;mwl + ;Print DIP location. +;(note that the DIP location is really the board pin location that +; pin 1 of the DIP goes into. Therefore there is allowance for +; naming V and G pins on the board.) + +PRNLOC: SETZ TT, + JUMPE A,CPOPJ + JUMPL A,CNLOC ;Connector or DIP? + LDB T,[%DIPG,,A] ;GROUP LETTER + JUMPE T,CPOPJ ; NULL? + PUTBYT @N2L(T) + LDB T,[%DIPC,,A] ;Column letter + PUTBYT @N2L(T) + LDB T,[%DIPN,,A] ;Position of pin 1 within column + SKIPE T ;0 row means just column specification + PUSHJ P,PRNROW +PRNLO2: MOVEI TT,"-" ;Suggested separation char + POPJ P, + +CNLOC: LDB T,[%CONT,,A] ;CONNECTOR TYPE + JUMPE T,CNDEC ;DEC STYLE CONNECTOR + PUTBYT "J" + LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + MOVEI TT,"-" + POPJ P, + +CNDEC: LDB T,[%CONN,,A] ;CONNECTOR ROW NUMBER + PUTBYT @N2L(T) + SETZ TT, ;DEC DOESN'T WANT SEP BETWEEN A,A1 + POPJ P, + +PRNROW: LDB T,[%DIPN,,A] + JUMPL A,PRNPNC + JRST PRNPN1 + +PRNPIN: LDB T,[%%PINN,,A] + JUMPL A,PRNPNC +PRNPN1: +MWL,< MOVEI TT,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM TT,NDIG + CAIL T,VPINOF + JRST [ PUTBYT "V" + SUBI T,VPINOF + JRST NPUTDEC] + CAIL T,GPINOF + JRST [ PUTBYT "G" + SUBI T,GPINOF + JRST NPUTDEC] + JRST NPUTDEC ;PRINT IT OUT +>;MWL +MDPC,< MOVEI TT,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM TT,NDIG + JRST NPUTDEC > + + +PRNPNC: LDB TT,[%CONT,,A] ;DEC CONNECTOR PIN PRINTOUT + JUMPN TT,PRNPN1 ;flat cable connector + ASH T,-1 + PUTBYT @N2L(T) ;PRINT DEC CONNECTOR LETTER + LDB T,[%%PINN,,A] + ANDI T,1 + ADDI T,1 + MOVEI TT,1 + MOVEM TT,NDIG + JRST NPUTDEC ;PRINT AS 1 DIGIT TRAILING NUMBER + + ;CONVERT PIN-SPEC TO POST-SPEC +;MAPOST (DWL) - CONVERT FROM DIP-LOC,PIN# TO SOCKET-LOC, PIN# +; Returns %%PINN = 0, %DIPN has row +; A = MBIT+PIN#,,LOC +; B = PACKAGE +;Skips if can map, with MAPSOC set. +; A = New MBIT+PIN#,,LOC +; B = FLAGS,, +; %MPLOC ;LOC WAS CHANGED +; %MPPIN ;PIN WAS CHANGED, DIFFERENCE IN RH (TO CHECK FOR +1) +; %MPUNI +; %MPROT etc. +;(Note: Pin 0 has a special hack just removes the within-socket offset, if any.) + +;Map onto post on board. Remeber that universal pattern is in +; two groups A,B. Columns are AA-AJ, BA-BJ + +MDWL,< +MAPOST: TLOE A,MAPSOC + OUTSTR [ASCIZ /PIN ALREADY MAPPED TO POST??? +/] + JUMPL A,[SETZ B, ;CONNECTOR, NO CHANGE + JRST CPOPJ1] + PUSH P,C + PUSH P,D + PUSH P,A ;Save slot spec +;Call MAPUNI to map onto column, row + LDB C,[%DIPC,,A] ;Dip column lettern + LDB D,[%DIPN,,A] ;Row within column + LDB A,[%%PINN,,A] + JUMPE A,[ AOS -3(P) ;"strip dip-offset", NA to uni boards + JRST MAPOSX] + PUSHJ P,MAPUNI ;Map as universal board + JRST MAPOSX ;Fail +;Now error check, and look for movement between groups + SKIPLE D ;can only be rows 1-50 + CAILE D,MXPINC + JRST MAPOSX + LDB A,[%DIPG,,(P)] ;Which universal group? +MAPOSA: CAMN A,L2N+"A" + JRST [ CAMLE C,L2N+"J" ;overflowed into group B? + JRST [ SUB C,L2N+"J" + ADD C,L2N+"A" + SOS C ;J+1 is A + AOJA A,MAPOSB] + CAMGE C,L2N+"A" ;Underflowed? + JRST MAPOSX + JRST MAPOS1] ;OK +MAPOSB: CAMN A,L2N+"B" + JRST [ CAMGE C,L2N+"A" ;underflowed into group A? + JRST [ SUB C,L2N+"A" + AOS C + ADD C,L2N+"J" ;"A"-1 IS "J" + SOJA A,MAPOSA] + CAMLE C,L2N+"J" + JRST [ SUB C,L2N+"J" ;Overflowed into group C + ADD C,L2N+"A" + SOS C ;J+1 is A + AOJA A,MAPOSC] + JRST MAPOS1] +MAPOSC: CAME A,L2N+"C" + JRST MAPOSX + CAMGE C,L2N+"A" + JRST [ SUB C,L2N+"A" ;Underflowed into group B + AOJE C,MAPOSX ;No column to left of A + AOS C + ADD C,L2N+"J" ;Rightmost col of group B + SOJA A,MAPOSB] + CAMLE C,L2N+"J" + JRST MAPOSX +MAPOS1: DPB A,[%DIPG,,(P)] + POP P,A + HRLI A,MAPSOC + SETZ T, + DPB T,[%%PINN,,A] + DPB D,[%DIPN,,A] + DPB C,[%DIPC,,A] +;B has flags from MAPUNI + AOSA -2(P) +MAPOSX: POP P,A + POP P,D + POP P,C + POPJ P, +>;MDWL + +;Read "DIP Slot" which in this case is Group,Column-letter,row-number +GTSLTL: PUSH P,A + MOVEI A,[[ASCIZ /LL#./] + 0] + PUSHJ P,LNPARS + JRST GTSL0 + JRST GTSL1 + SETZ TT, + PUSHJ P,GATLOC + JRST GTSL0 +GTSL2: MOVEM TT,DESTIN + AOS -1(P) +GTSL1: AOS -1(P) +GTSL0: POP P,A + POPJ P, + +GATLOC: MOVE A,ARG1 + DPB A,[%DIPG,,TT] + MOVE A,ARG2 + DPB A,[%DIPC,,TT] + MOVE A,ARG3 + DPB A,[%DIPN,,TT] + JRST CPOPJ1 + +MD,< +;THIS SHOULD PROBABLY TRY FOR B-R-S ALSO, BUT...? +GTCONP: PUSH P,A + MOVEI A,[[ASCIZ /J#-#/] + [ASCIZ /LL#/] + 0] + PUSHJ P,LNPARSE + JRST GTCON0 + JRST GTCON1 ;NULL INPUT + PUSHJ P,GATCON ;GET JACK OR PADDLE PART OF LOC + JRST GTCON0 + LDB A,[%CONT,,TT] + JUMPE A,GTDCP ;GET DEC STYLE CONNECTOR PIN + MOVE A,ARG4 +GTCON3: DPB A,[%CONP,,TT] + HRRZM TT,DESTIN + AOS -1(P) +GTCON1: AOS -1(P) +GTCON0: POP P,A + POPJ P, + +GTDCP: SOSL A,ARG3 + CAILE A,1 + JRST GTCON0 + MOVE A,ARG2 + ASH A,1 + IOR A,ARG3 + JRST GTCON3 +>;MD + +GATCON: SETZ TT, + JUMPN A,GTCN1 ;DEC PADDLE? (VS. SCOTCHFLEX) + MOVE A,ARG2 ;ARG1 IS THE "J" + DPB A,[%CONN,,TT] + MOVEI A,1 +GTCN2: DPB A,[%CONT,,TT] ;THIS IS A FLAT CABLE CONNECTOR + TLO TT,MAPCON + JRST CPOPJ1 + +GTCN1: MOVE A,ARG1 + DPB A,[%CONN,,TT] + MOVEI A,0 ;THIS IS A DEC STYLE CONNECTOR + JRST GTCN2 + + +MWL,< + +GETLOC: MOVEI A,[[ASCIZ /J#/] ;0 - Scotchflex connector + [ASCIZ /LL#/] ;1 - Board socket + [ASCIZ /LL#@#/] ;2 - Board socket with offset + [ASCIZ /L/] ;3 - Dec connector + 0] + PUSHJ P,LNPARSE + POPJ P, + POPJ P, + SKIPE A ;STRING 0,3 ARE CONNECTOR FORMATS + CAIN A,3 ;DEC CONN MUST BE .NE. 0 FOR GATCON + JRST GATCON + SETZ TT, +; MOVE T,ARG4 +; CAIN A,2 ;THE OFFSET CASE +; DPB T,[%DIPOF,,TT] + JRST GATLOC + +;Print location for fixed format card image +;8 cols wide, with "group" left justified, "pin number" right justified +RAYDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + SETZM TCOUNT + JUMPL A,RAYCON + PUSH P,A + SETZ TT, + DPB TT,[%DIPN,,A] + PUSHJ P,PRNLOC ;Print LL + POP P,A + LDB TT,[%DIPN,,A] ;How many letters? depends on V or G + MOVEI T,6 + CAIL TT,GPINOF + MOVEI T,5 + PUSHJ P,TTFILL + JRST PRNROW + +RAYCON: PUSHJ P,PRNLOC ;PRINTS C OR J01 + MOVEI T,6 + PUSHJ P,TTFILL + LDB TT,[%CONT,,A] + JUMPN TT,RAYCN1 ;Scotchflex + LDB T,[%%PINN,,A] + TRNN T,1 + PUTBYT "1" + TRNE T,1 + PUTBYT "2" + ASH T,-1 + PUTBYT @N2L(T) + POPJ P, ;"C" + 5 spaces + #L = 8 + +RAYCN1: LDB T,[%%PINN,,A] +RAYCN2: MOVEI TTT,2 + MOVEM TTT,NDIG + JRST NPUTDEC ;"J01" + 3 spaces + ## = 8 + + ;AUGAT format + +;Print location for fixed format card image +;2-3 columns "GROUP", 2 columns "LOC", 3 columns pin +;DIP A.. 01 . 001 +;DECCON AJ. 01 . 0A1 +;FLAT J01 01 . 001 + +AUGDIP: TLNN A,MAPSOC + PUSHJ P,FUCKUP + JUMPL A,AUGCON + LDB T,[%DIPG,,A] + PUTBYT @N2L(T) + PUTSTR [ASCIZ / /] ;2 SPACES + LDB T,[%DIPC,,A] + PUTBYT @N2L(T) + PUTSTR [ASCIZ / /] ;2 SPACES + LDB T,[%DIPN,,A] + MOVEI TT,2 ;SETUP FOR 2 DIGIT NUMBER PRINT + MOVEM TT,NDIG + CAIL T,VPINOF + JRST [ PUTBYT "V" + SUBI T,VPINOF + JRST NPUTDEC] + CAIL T,GPINOF + JRST [ PUTBYT "G" + SUBI T,GPINOF + JRST NPUTDEC] + MOVEI TT,3 ;OTHERWISE, 3 DIGIT FIELD + MOVEM TT,NDIG + JRST NPUTDEC ;PRINT IT OUT + +AUGCON: LDB TT,[%CONT,,A] + SKIPN TT ;IF DEC CONNECTOR + PUSHJ P,FUCKUP ;BARF + PUTBYT "J" + LDB T,[%CONN,,A] ;CONNECTOR NUMBER + MOVEI TT,2 + MOVEM TT,NDIG + PUSHJ P,NPUTDEC + PUTSTR [ASCIZ /01 /] + MOVEI TT,3 + MOVEM TT,NDIG + LDB T,[%%PINN,,A] + JRST NPUTDEC + + +FOR NAME IN (CPARTP:,CONGIN:,SEQLOC:) +<NOTYET(NAME) +> +>;MWL + +CPNSEP: LDB TT,[%CONP,,T] + MOVEI TTT,0 + DPB TTT,[%CONP,,T] + POPJ P, + +CPNMER: PUSH P,A + SKIPN T + SKIPE TT + JRST CPNMR1 + MOVEI TT,1 ;T,TT=0 MEANS INITIALIZE TO FIRST + DPB TT,[%CONN,,T] ;CONNECTOR TYPE STARTS AT ZERO +CPNMR1: LDB TTT,[%CONT,,T] + JUMPE TTT,[ MOVEI A,MXDPIN ;IF A DEC CONN THEN MXDPIN IS MAX # + JRST CPNMR2] + LDB TTT,[%CONN,,T] + MOVE A,FLTSIZ-1(TTT) +CPNMR2: CAMG TT,A + JRST CNPMR1 + MOVEI TT,1 ;CARRY INTO JACK, FROM PIN# + LDB TTT,[%CONT,,T] + MOVE A,MXJCON + SKIPN TTT + MOVE A,MXDCON + LDB TTT,[%CONN,,T] + AOS TTT + DPB TTT,[%CONN,,T] + CAIGE TTT,A + JRST CNPMR1 + MOVEI TTT,1 + DPB TTT,[%CONN,,T] + LDB TTT,[%CONT,,T] + AOS TTT + DPB TTT,[%CONT,,T] +CNPMR1: DPB TT,[%CONP,,T] + POP P,A + POPJ P, + +QUPIN: SETZ A, ;NO RULE NUMBER + POPJ P, ;AND IT'S NOT WILD +NOTYET(CPNMAP:) + +MDWL,< +MWL,< +SUBTTL WIRE WRAP ROUTINES -- HEX DEC UNIVERSAL BOARDS + +^^U61CTV__. ;TRANSFER VECTOR FOR QUAD HEIGHT UNIVERSAL DEC BOARDS + + + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTPP ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + COL627 ;NROWS (USED FOR UML ONLY) + UMLCOL ;NCOLS (USED FOR UML ONLY) + UMLCOL ;NCLPRG (USED FOR UML ONLY) + 0 ;NRWPRP (USED FOR UML ONLY) + COL627*NGRPS ;DIPSLT_NROWS*NCOLS (USED FOR UML ONLY) + SETPAD(4) ;NPADS (USED FOR UML ONLY) + XWD -=25,1 ;PADLET (USED FOR UML ONLY) + XWD -2,1 ;PADPIN (USED FOR UML ONLY) + =10 ;FRACTN + =200*2 ;WRAPMG .200" INSULATION AROUND EACH POST + =1500 ;POSTMG .750" BARE WIRE AROUND EACH POST + 0 ;NEXTR +CHECK U61CTV,WTVLEN + + + ;Connector pin mapping table for MAPIT + +NIL,< +;**************************************** DEC CONNECTOR PINS +;PIN POSITIONS WITHIN ONE PADDLE + +X__DCPINS ;INITIAL X STARTING LOCATION +DCPINL: + +REPEAT 3, +< + REPEAT 6, + < X,,0 + X,,DCPINO + X__X-DCPNSP + > +X__X-DCGRSP+DCPNSP ;ALREADY SUB'ED AN EXTRA DCPNSP AT END OF RPT +> + +DCPWRG: 0 ;A1 + PWR,,500 ;A2 + 0 ;B1 + 0 ;B2 + 0 ;C1 + GND,,0 + 0 ;D1 + 0 + 0 ;E1 + 0 + 0 ;F1 + 0 + 1B0 ;G1 - not really legal for DEC + 1B0 + 0 ;H1 + 0 + 0 ;J1 + 0 + 0 ;K1 + 0 + 0 ;L1 + 0 + 0 ;M1 + 0 + 0 ;N1 + 0 + 0 ;P1 + 0 + 0 ;R1 + 0 + 0 ;S1 + 0 + GND,,0 ;T1 + 0 + 0 ;U1 + 0 + 0 ;V1 + 0 + +>;NIL + ;MAPIT - Convert board post spec to X,Y - used for routing +;A = PostSpec + +;MAPIT (WL) - CONVERT POST INTO X,Y AND BITS +;NOTE!! X,Y are viewed from DIP side, usually with X+ = right, Y+ = up +;A = MBIT+PIN#,,LOC +;SKIPS IF LEGAL POST +;T = X,,Y +;TT = PWR!GND,,VOLTAGE (If dedicated pin on board) +;TTT = (DISTANCE TO END OF ROW - FOR FUDGING CITY-BLOCK STUFF) + +MAPIT: JUMPL A,CONMAP ;MAP CONNECTOR LOCATION + SETZ TT, ;flags for Pwr, Gnd + PUSHJ P,MAPLOC ;MAP DIP LOCN + POPJ P, ;BAD LOCN +;Should return flags for Pwr or Gnd?? + SETZ TTT, ;FLUSH AWAY THOSE GOODIES + JRST CPOPJ1 + +;Convert PIN-SPEC in A into DIP X,Y locn (T) +;Y + UP +;X + RIGHT (FROM DIP SIDE) +MAPLOC: PUSH P,B + PUSH P,C + PUSH P,D + LDB B,[%DIPG,,A] + LDB C,[%DIPC,,A] + SUB C,L2N+"A" + IMULI C,=300 ;.3" BETWEEN COLUMNS + LDB D,[%DIPN,,A] + CAIL D,VPINOF + JRST [ ADDI C,=100 ;V pin is to right + SUBI D,VPINOF + MOVE TT,[Pwr,,=500] ;+5.0V + JRST MAPLO1] + CAIL D,GPINOF + JRST [ ADDI C,=100 ;G pin is to right + SUBI D,GPINOF + MOVSI TT,Gnd + JRST MAPLO1] +MAPLO1: IMULI D,=100 + MOVEI T,=4900+=100 ;ROW 1 is 4.9" up + SUB T,D ; and Row 2-50 are lower + CAMN B,L2N+"A" + ADDI C,0 + CAMN B,L2N+"B" + ADDI C,=2700 ;Group B is 2.7 inches to right + CAMN B,L2N+"C" + ADDI C,=5400 ;Group C is 5.4 inches to right + HRL T,C + POP P,D + POP P,C + POP P,B + JRST CPOPJ1 + +;HERE FOR CONNECTOR PINS + +CONMAP: LDB T,[%CONT,,A] + JUMPE T,CONDEC ;DEC STYLE CONNECTOR + LDB T,[%CONN,,A] ; T HAS CONNECTOR NUMBER + JUMPE T,CPOPJ + CAMLE T,MXJCON + POPJ P, + LDB TT,[%%PINN,,A] + MOVE TTT,FLTPIN-1(T) ;X,Y for whole connector +CONMJ5: MOVE T,FLTSIZ-1(T) + ASH T,-1 ;Pins in first row of connector + CAMLE TT,T + JRST [ SUBI TTT,=100 ;2nd row of connector + SUB TT,T + JRST .+1] + SOS TT + MOVNS TT + IMULI TT,=100 + HRLZS TT + ADD TTT,TT +CONM1: MOVE T,TTT + SETZB TTT,TT + JRST CPOPJ1 + +;Find X,Y of DEC connector pin + +CONDEC: +NIL,< + LDB TT,[%CONN,,A] + JUMPE TT,CPOPJ + CAMLE TT,MXDCON + POPJ P, + MOVE T,DCLOC-1(TT) ;PADDLE X,Y + LDB TT,[%%PINN,,A] + CAIL TT,2 ;2+0 IS A+1 PIN + CAILE TT,MXDPIN+2-1 + POPJ P, + ADD T,DCPINL-2(TT) + SKIPGE TT,DCPWRG-2(TT) ;Legal pin? + POPJ P, + SETZ TTT, +>;NIL + JRST CPOPJ1 + +;PAKSIZ (WL) - GET DIMENSIONS OF PACKAGE ON BOARD +;A = MBIT+PIN#,,LOC +;B = PACKAGE CODE +;SKIPS IF LOCATION IS LEGAL FOR THIS PACKAGE TYPE +;T = Xmin,,Ymin +;TT = Xmax,,Ymax + +PAKSIZ: SKIPE ILLPAK(B) + POPJ P, + PUSHJ P,PAKDIM ;Find outline of package on board + POPJ P, +For T IN (T,TT) +< + HLRE TTT,T ;X dimension + CAML TTT,[GRPXL-=100] + CAMLE TTT,[GRPXA+=100] + POPJ P, + HRRE TTT,T + CAML TTT,[GRPYB-=100] + CAMLE TTT,[GRPYT+=100] + POPJ P, +>;For + JRST CPOPJ1 + +;Define illegal package types in this board +; -1 if illegal +ILLPAK: BLOCK NPACK +; FOR @' I IN (22,36,48,64) +; <ORG ILLPAK+K.'I  -1 +; > + ORG ILLPAK+NPACK + +;??? No scheme for UML on universals yet +NOTYET(MAPRC:) +NOTYET(MAPPAD:) + +IFN 0,< +MAPRC: HLRZ TT,T ;(1,1) IS DIP IN UPPER LEFT HAND CORNER + SOJL TT,CPOPJ + CAML TT,NROWS + POPJ P, + HRRZS T ;ROW IN TT, COL IN T + SOJL T,CPOPJ + CAML T,NCOLS ;(0,0) IS NOW IN UPPER LEFT + POPJ P, + PUSH P,[0] + MOVNS TT + ADD TT,GRPCOL ;COL 30 IS FIRST ROW OF UML + DPB TT,[%DIPS,,(P)] + MOVNS T ;LAST UML COL CORRESPONDS TO FIRST DIP GROUP + MOVEI T,NGRPS(T) + DPB T,[%DIPG,,(P)] + POP P,T + JRST CPOPJ1 + +MAPPAD: SOS TT + ASH TT,1 ;TT,TTT HAVE COMPLEX PIN# + ADDI TT,(TTT) + CAMLE T,MXDCON + JRST MAPPD1 + AOS TT ;DEC PADDLES ARE PINLETTER*2+SIDE + CAILE TT,MXDPIN+2-1 ;EXISTS? + JRST MAPPDL ;NO, ERROR + HRLI T,0 +MAPPD2: MOVSI TTT,MAPCON(TT) ;PIN# IN LH + DPB T,[%CONN,,TTT] + HLRZS T + DPB T,[%CONT,,TTT] + SKIPA T,TTT +MAPPDL: SETZ T, ;LOSE RETURN + POPJ P, + +MAPPD1: SUB T,MXDCON + HRLI T,1 ;CONN TYPE IS SCOTCH + CAMLE TT,JACKSZ(T) + JRST MAPPDL + JRST MAPPD2 +>;IFN 0 + + +VCCCOL: 2 + 2 + 2 + 4 + 4 + 6 + 6 + 8 + 8 + +VCCROW: 8,,4 + 8,,4 + 8,,4 + 8,,4 + 8,,4 + 8,,4 + 8,,4 + 8,,4 ;8 + 8,,=12 + 8,,=12 + 8,,=12 + 8,,=12 ;12 + =16,,=12 + =16,,=12 + =16,,=12 + =16,,=12 ;16 + =16,,=20 + =16,,=20 + =16,,=20 + =16,,=20 ;20 + =24,,=20 + =24,,=20 + =24,,=20 + =24,,=20 ;24 + =24,,=28 + =24,,=28 + =24,,=28 + =24,,=28 ;28 + =32,,=28 + =32,,=28 + =32,,=28 + =32,,=28 ;32 + =32,,=36 + =32,,=36 + =32,,=36 + =32,,=36 ;36 + =40,,=36 + =40,,=36 + =40,,=36 + =40,,=36 ;40 + =40,,=44 + =40,,=44 + =40,,=44 + =40,,=44 ;44 + =48,,=44 + =48,,=44 + =48,,=44 + =48,,=44 ;48 + =48,,=44 + =48,,=44 ;50 + + +;FPWR (WL) - FIND POWER PIN +;A = MBIT+PIN#,,LOC ;A Socket pin (MAPSOC) +;B = VOLTAGE (10 mV UNITS) +;RETURNS A=0 IF FAILS +;A = New MBIT+PIN#,,LOC + +FPWR: CAIE B,=500 ;+5.00V?? + JRST [ SETZ A, ;Don't know of any other power + POPJ P,] + JUMPL A,FPWRC ;For connector pin? + LDB B,[%DIPC,,A] ;Column + HRRZ B,VCCCOL-1(B) ;Map into the closest column that has pwr/gnd pins + DPB B,[%DIPC,,A] + LDB T,[%DIPN,,A] + SKIPN T + PUSHJ P,FUCKUP + HLRZ T,VCCROW-1(T) + ADDI T,VPINOF + JRST FGND9 + +;FGND (WL) - FIND GROUND PIN +;A = MBIT+PIN#,,LOC ;A Socket pin (MAPSOC) +;RETURNS A=0 IF FAILS +;A = New MBIT+PIN#,,LOC + +FGND: JUMPL A,FGNDC + LDB B,[%DIPC,,A] ;Column + HRRZ B,VCCCOL-1(B) ;Map into the closest column that has pwr/gnd pins + DPB B,[%DIPC,,A] + LDB T,[%DIPN,,A] + HRRZ T,VCCROW-1(T) + ADDI T,GPINOF +FGND9: DPB T,[%DIPN,,A] + SETZ B, + DPB B,[%%PINN,,A] + TLO A,MAPSOC + POPJ P, + +STORAGE(IMPURE) +GENVAR: 0 +GENFIX: 0 +STORAGE(PURE) + +;GenNom - break up asciz into nomen +;T = Ascii +;Returns: +;T = Group +;TT = Column + +GENNOM: LDB TT,[POINT 7,T,35] ;Column + MOVE TT,L2N(TT) + LDB T,[POINT 7,T,28] ;Group + MOVE T,L2N(T) + POPJ P, + + +GENTBL: +FOR I IN (AB,AD,AF,AH) +< "I" +> +FOR I IN (BB,BD,BF,BH) +< "I" +> +LGENTB__.-GENTBL + +;Search for ground/pwr pins along top for flatcable, along bottom +; for DEC cables. + +FGNDC: + ;Fix routine for FlatCable Ground pins + MOVEI TTT,[MOVEI TTT,GPINOF+4 + POPJ P,] + LDB TT,[%CONT,,A] + SKIPN TT + ; or Fix routine for DecConnector GND pins + MOVEI TTT,[MOVEI TTT,GPINOF+=62 + POPJ P,] + JRST DOFIND + +FPWRC: MOVEI TTT,[MOVEI TTT,VPINOF+=8 + POPJ P,] + LDB TT,[%CONT,,A] + SKIPN TT ;DecConnector? + ;Fix routine for DecConnector GND pins + MOVEI TTT,[MOVEI TTT,VPINOF+=58 + POPJ P,] +DOFIND: MOVSI T,-LGENTB ;Setup generator + MOVEM T,GENVAR + MOVEM TTT,GENFIX + PUSHJ P,FINDCLOSEST + JRST FGNDC1 ;Closest in A +;CoRoutine to generate possible GNDS for FlatCable connectors + SKIPL TT,GENVAR ;Any more possiblities? + POPJ P, ;NO + MOVE T,GENTBL(TT) + AOBJP TT,.+1 + MOVEM TT,GENVAR + PUSHJ P,GENNOM + PUSHJ P,@GENFIX + MOVSI A,MAPSOC + DPB T,[%DIPG,,A] + DPB TT,[%DIPC,,A] + DPB TTT,[%DIPN,,A] + JRST CPOPJ1 ;CoReturn + +FGNDC1: TLO A,MAPSOC + POPJ P, + +FOR NAME (GNDCLR:,WAGGND:,GNDOUT:,VCCOUT:) +<NOTYET(NAME) +> +>;MWL +>;MDWL +BEND ug61c diff --git a/src/wl/w940.308 b/src/wl/w940.308 new file mode 100644 index 00000000..4b302467 --- /dev/null +++ b/src/wl/w940.308 @@ -0,0 +1,935 @@ +;<WIRELIST>W940.FAI.13, 15-NOV-75 19:05:04, EDIT BY HELLIWELL +MDWL,< +.ADD(ALLWW,W940,W940TV) +.ADD(ALLWW,W941,W941TV) +.ADD(ALLWW,W942,W940TV) +.ADD(ALLWW,W943,W941TV) +.ADD(ALLWW,W946,W946TV) +;Note! These .ADD's must be outside of block structure + +MWL,< + +BEGIN WW940 + +comment  + +These are formats for W940 series wire wrap cards. If the sign bit is 0 +then it is a dip pin otherwise it is a connector pin. + +dip pin spec: E#(#) +The E must literally be there. The first # is the slot, the letter is the pin. +There is a hack for specifying slots via a letter number-matrix. + +______|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| +| 11 17 23 35 +| 12 | 6 | 6 | 12 | +|_______________________|___________|___________|_______________________| + | | | | +< | | | |----------->loc # + | | | +< | | |------------------------------>loc letter + | | +< | |------------------------------------------>dip pin # + | +< |----------------------------------------------------------->flags + +connector pin spec: LL# +The first letter is the paddle, the second letter is the pin and the # is the +side of the board. + +______|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| +| 11 17 23 29 35 +| 12 | 6 | 6 | 6 | 6 | +|_______________________|___________|___________|___________|___________| + | | | | | +< | | | | |------>side + | | | | +< | | | |------------------>pin letter + | | | +< | | |------------------------------>paddle + | | +< | |------------------------------------------>not used + | +< |----------------------------------------------------------->flags + + +^W941TV__. ;TRANSFER VECTOR FOR DOUBLE HEIGHT DEC BOARDS + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE W/W INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTCB ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + 5 ;NROWS FOR DOUBLE HEIGHT + 5 ;NCOLS + 0 ;NCLPRG + 0 ;NRWPRP + =25 ;DIPSLT_NROWS*NCOLS + SETPAD(2) ;NPADS + XWD -=18,1 ;PADLET + XWD -2,1 ;PADPIN + =8 ;FRACTN + ITS,<=400;>0 ;WRAPMG + ITS,<=1500;>=1000 ;POSTMG + =250 ;NEXTR +CHECK W941TV,WTVLEN + +^W940TV__. ;TRANSFER VECTOR FOR QUAD HEIGHT DEC BOARDS + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST CPOPJ ;THE W/W INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTCB ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + =10 ;NROWS FOR QUAD HEIGHT + 5 ;NCOLS + 0 ;NCLPRG + 0 ;NRWPRP + =50 ;DIPSLT + SETPAD(4) ;NPADS + XWD -=18,1 ;PADLET + XWD -2,1 ;PADPIN + =8 ;FRACTN + ITS,<=400;>0 ;WRAPMG + ITS,<=1500;>=1000 ;POSTMG + =250 ;NEXTR +CHECK W940TV,WTVLEN + +CONOFF__=57*=125 +XFDG__=250 + + +MAPRC: SKIPE LNGRID ;IF LNGRID SET, + JRST [ TDNE T,[777700,,770000] + POPJ P, + HLRZ TT,T ;THEN RC IS LN + MOVNS T + ADD T,NCOLS + ADDI T,1 ;REVERSE COLUMNS + DPB TT,[POINT 24,T,23] + JRST CPOPJ1] + HLRZ TT,T + CAMLE TT,NROWS + POPJ P, + HRRZ T,T + CAMLE T,NCOLS + POPJ P, + IMUL TT,NCOLS + SUB T,NCOLS + ADDI T,(TT) + HRRZ TT,L2N+"E" + LSH TT,14 + IOR T,TT + JRST CPOPJ1 + +;MAP NUMBERS IN T, TT, AND TTT INTO EDGE PIN NAME +MAPPAD: LSH T,14 + LSH TT,6 + IOR T,TT + IOR T,TTT + POPJ P, + +PINMAP: PUSHJ P,MAPIT + JRST PINERR + JRST CONERR + JRST CPOPJ1 + +PINBIT: PUSHJ P,MAPIT + JFCL + SETZ TT, + POPJ P, + +MAPIT: JUMPL A,CONMAP ;IS IT A CONNECTOR PIN? + LDB T,[POINT 6,A,23] ;GET LOC LETTER + LDB TT,[POINT 12,A,35] ;GET LOC NUMBER + JUMPE TT,CPOPJ ;0 IS A NO,NO + SKIPE LNGRID ;LETTER NUMBER GRID? + JRST LNGMAP ;YES, DIFFERENT MAPPING + MOVE TTT,N2L(T) ;GET LETTER + CAIE TTT,"E" ;IT'S GOT TO BE AN "E" OR ITS WRONG + POPJ P, +LNGMPD: CAMLE TT,DIPSLT ;THATS TOO BIG + POPJ P, + MOVE T,DIPLOC-1(TT) ;PUT XY IN T + LDB TT,[POINT 6,A,17] ;GET THE PIN # + TLNE A,MAPPWR!MAPGND ;POWER OR GROUND PIN? + JRST PINPGP + CAIN B,=14 ;I KNOW WHICH WAY 14 PIN DIPS GO IN TOO! + CAIG TT,7 ;WHICH MEANS PIN #'S GREATER THAN 7 ADD 2 + JRST MAPIT0 ;NO + ADDI TT,2 ;YES, FUDGE PIN # BY 2 +;I THINK I STILL NEED THIS! + ADD A,[2,,0] ;ALSO RETURN CORRECTED PIN # FOR DSTCLC + TLO A,PLUS2 ;AND INDICATE IT IS A PLUS 2 VERSION +MAPIT0: ADD T,PINTAB-1(TT) ;ADD EXTRA XY FOR PIN + MOVE TTT,DETAB-1(TT) ;GET DISTANCE TO END OF DIP PATTERN (SHORTEST) + SETZ TT, ;NO AUTOMATIC GND OR PWR + JRST CPOPJ2 + +LNGMAP: CAMLE T,NROWS + POPJ P, + IMUL T,NCOLS + SUBI T,-1(TT) + MOVE TT,T + JRST LNGMPD + +PINPGP: JUMPN TT,CPOPJ ;PIN FIELD SHOULD BE CLEAR + ADD T,[=8*=125,,0] ;BOTH GET THIS + TLNN A,MAPPWR ;POWER? + JRST [ MOVSI TT,GND ;NO, RETURN GND BIT + SETZ TTT, ;AT END + JRST CPOPJ2] + SUBI T,6*=125 ;YES, IT IS UP THIS MUCH + MOVSI TT,PWR + SETZ TTT, + JRST CPOPJ2 + +CONMAP: AOS (P) + LDB T,[POINT 6,A,29] ;GET PIN LETTER + MOVEM T,LETTER# + CAILE T,=18 ;LEGAL? + POPJ P, + SUBI T,1 ;NORMALIZE TO 0 + IMULI T,=125 ;GENERATE Y POSITION + LDB TT,[POINT 6,A,23] ;GET PADDLE + JUMPLE TT,CPOPJ + CAMLE TT,NPADS + POPJ P, + ADD T,YFDG-1(TT) + LDB TT,[POINT 6,A,35] ;GET SIDE + MOVEM TT,SIDE# + SOJL TT,CPOPJ ;FUDGE IT AND CHECK FOR LEGAL + CAILE TT,1 ;TOO BIG? + POPJ P, + LSH TT,1 + LDB TTT,[POINT 1,A,29] ;EVEN OR ODD CONNECTOR PIN + TRC TTT,1 + IOR TT,TTT + IMULI TT,XFDG + ADDI TT,CONOFF + HRL T,TT + MOVE TT,LETTER + LSH TT,2 + IOR TT,SIDE +VGCON1: CAIN TT,<1*4>+2 ;CHECK FOR POWER AND GROUND PINS + MOVSI TT,PWR + CAIN TT,<3*4>+2 + MOVSI TT,GND + CAIN TT,<=16*4>+1 + MOVSI TT,GND + SETZ TTT, ;NO SHORTEST DISTANCE TO END OF DIP! + JRST CPOPJ1 + +VGCON: LDB TT,[POINT 8,A,31] + TRO TT,1 + TRNE A,2 + ADDI TT,1 + JRST VGCON1 + +PINERR: LDB T,[POINT 6,A,23] + OUTCHR N2L(T) + LDB T,[POINT 12,A,35] + PUSHJ P,NUMPNT + OUTCHR["("] + LDB T,[POINT 6,A,17] +LSTNUM: PUSHJ P,NUMPNT + OUTSTR[ASCIZ/) MAPPING ERROR! +/] + POPJ P, + +CONERR: LDB T,[POINT 6,A,23] + OUTCHR N2L(T) + OUTCHR["("] + LDB T,[POINT 6,A,29] + OUTCHR N2L(T) + LDB T,[POINT 6,A,35] + JRST LSTNUM + ;FIND POWER AND GROUND PINS +FPWR: JUMPL A,FPWRC + TLZ A,$$PINN ;CLEAR PIN FIELD + TLO A,MAPPWR ;AND SET MAPPWR BIT + POPJ P, + +FPWRC: TRZ A,7777 ;CLEAR THIS PART + HRRZ T,"A"+L2N + LSH T,6 + TRO A,2(T) ;SET AS A2 + POPJ P, + +FGND: JUMPL A,FGNDC + TLZ A,$$PINN + TLO A,MAPGND ;MAKE IT "G" PIN + POPJ P, + +FGNDC: LDB T,[POINT 6,A,29] ;GET LETTER + TRZ A,7777 ;CLEAR THIS + CAMG T,"K"+L2N ;SHOULD ONLY LOOK AT RH, BUT SIGN BIT PROBABLY ISN'T ON FOR "K" + JRST [ HRRZ T,"C"+L2N + LSH T,6 + TRO T,2 ;C2 + JRST FGNDC1] + HRRZ T,"T"+L2N + LSH T,6 + TRO T,1 ;T1 +FGNDC1: TRO A,(T) + POPJ P, + +PGPRTM: SETOM PMINUS# + CAIA +PGPRNT: SETZM PMINUS + LDB T,[POINT 6,A,23] + PUTBYT @N2L(T) + JUMPL A,PGCPNT + LDB T,[POINT 12,A,35] + PUSHJ P,DECOUT + PUTBYT "(" + TLNN A,MAPPWR!MAPGND + JRST NPGPNT + TLNN A,MAPPWR + SKIPA T,["G"] + MOVEI T,"V" + PUTBYT @T +PGPN1: PUTBYT ")" + POPJ P, + +NPGPNT: LDB T,[%%PINN,,A] + SKIPN PMINUS + JRST NPGPN1 + TLNE A,PLUS1 + JRST [ PUSHJ P,DECOUT + PUTBYT "-" + JRST PGPN1] + TLNE A,PLUS2 + CAIG T,7 + JRST PGPN0 + PUSHJ P,DECOUT + PUTSTR[ASCIZ/-2/] + JRST PGPN1 + +NPGPN1: TLNE A,PLUS1 + SOJA T,PGPN2 + CAIG T,7 + JRST [PGPN0: PUSHJ P,DECOUT ;LESS THAN 8 AND NOT PLUS1 FORM, NO + AT ALL + JRST PGPN1] + TLNE A,PLUS2 + SUBI T,2 +PGPN2: PUSHJ P,DECOUT + TLNE A,PLUS1 + PUTBYT "+" + TLNE A,PLUS2 + PUTSTR[ASCIZ/+2/] + JRST PGPN1 + +PGCPNT: PUTBYT "(" + LDB T,[POINT 6,A,29] + PUTBYT @N2L(T) + LDB T,[POINT 6,A,35] + PUSHJ P,DECOUT + JRST PGPN1 + GNDCLR: OUTSTR[ASCIZ/YOU CAN'T PUT 24 PIN DIPS ON DEC CARDS! +/] + POPJ P, + +WAGGND: MOVSI B,-GNDLEN +WGLOP: HLRZ TTT,GNDNAM(B) ;PICK UP SIDE NUMBER + JUMPE TTT,WGLOP1 + PUTSTR[ASCIZ/777777000000000000/];CPIN ID OF -1, NO FILE NAME + LDB TTT,[POINT 7,GNDNAM(B),6] ;PADDLE LETTER + HRRZ T,L2N(TTT) + IMULI T,=100 + LDB TTT,[POINT 7,GNDNAM(B),6] + HRRZ TTT,L2N(TTT) + LSH TTT,1 + ADD T,TTT + HRRZ TTT,GNDNAM(B) + ANDI TTT,1 + SUB T,TTT + PUSHJ P,DECOUT ;GUARANTEED TO BE 3 DIGITS + PUTSTR[ASCIZ/ 3/] ;MARK AS GROUND + PUSHJ P,F4CRLF +WGLOP1: AOBJN B,WGLOP + MOVSI B,-VCCLEN +VCCLOP: HLRZ TTT,VCCNAM(B) ;PICK UP SIDE NUMBER + JUMPE TTT,VCCLP1 + PUTSTR[ASCIZ/777777000000000000/];CPIN ID OF -1, NO FILE NAME + LDB TTT,[POINT 7,VCCNAM(B),6] ;PADDLE LETTER + HRRZ T,L2N(TTT) + IMULI T,=100 + LDB TTT,[POINT 7,VCCNAM(B),6] + HRRZ TTT,L2N(TTT) + LSH TTT,1 + ADD T,TTT + HRRZ TTT,VCCNAM(B) + ANDI TTT,1 + SUB T,TTT + PUSHJ P,DECOUT ;GUARANTEED TO BE EXACTLY 3 DIGITS + PUTSTR[ASCIZ/ 2/] ;MARK AS VCC + PUSHJ P,F4CRLF +VCCLP1: AOBJN B,VCCLOP + POPJ P, +;FORMAT: +; 777777000000000000NNN M +;NNN = PADDLE # * 100 + PIN * 2 - (SIDE MOD 2) +;M = 2 FOR VCC, 3 FOR GND + + +GNDOUT: MOVSI A,-GNDLEN + JRST GNDO2 + +GNDO0: TRNN A,3 ;MULTIPLE OF 4? + JRST GNDO1 + PUTBYT 11 + JRST GNDO2 + +GNDO1: PUTSTR[ASCIZ/ +/] +GNDO2: HLLZ T,GNDNAM(A) + JUMPE T,[PUTBYT "E" + MOVE T,GNDNAM(A) + PUSHJ P,DECOUT + PUTSTR[ASCIZ/(G)/] + JRST GNDO3] + LDB TTT,[POINT 7,GNDNAM(A),6] + XCT PUTCHR + PUTBYT "(" + LDB TTT,[POINT 7,GNDNAM(A),13] + XCT PUTCHR + HRRZ T,GNDNAM(A) + PUSHJ P,DECOUT + PUTBYT ")" +GNDO3: PUTBYT 11 + HLRE T,GNDTAB(A) + PUSHJ P,MILOUT + PUTBYT "," + HRRE T,GNDTAB(A) + PUSHJ P,MILOUT + AOBJN A,GNDO0 + PUTSTR[BYTE(7)15,14] + POPJ P, + +VCCOUT: MOVSI A,-VCCLEN + JRST VCCO2 + +VCCO0: TRNN A,3 ;MULTIPLE OF 4? + JRST VCCO1 + PUTBYT 11 + JRST VCCO2 + +VCCO1: PUTSTR[ASCIZ/ +/] +VCCO2: HLLZ T,VCCNAM(A) + JUMPE T,[PUTBYT "E" + MOVE T,VCCNAM(A) + PUSHJ P,DECOUT + PUTSTR[ASCIZ/(V)/] + JRST VCCO3] + LDB TTT,[POINT 7,VCCNAM(A),6] + XCT PUTCHR + PUTBYT "(" + LDB TTT,[POINT 7,VCCNAM(A),13] + XCT PUTCHR + HRRZ T,VCCNAM(A) + PUSHJ P,DECOUT + PUTBYT ")" +VCCO3: PUTBYT 11 + HLRE T,VCCTAB(A) + PUSHJ P,MILOUT + PUTBYT "," + HRRE T,VCCTAB(A) + PUSHJ P,MILOUT + AOBJN A,VCCO0 + PUTSTR[BYTE(7)15,14] + POPJ P, + ;TABLES + +RADIX =10 + +DEFINE F(I) +<<I*125>> + +DEFINE XY(A,B,SECTION) +< <XWD A*125,0>+B*125+5250*SECTION +> + + +DEFINE ONESECTION(SECTION) +< XY(41,6,SECTION) + XY(31,6,SECTION) + XY(20,6,SECTION) + XY(10,6,SECTION) + XY(0,6,SECTION) + XY(41,14,SECTION) + XY(31,14,SECTION) + XY(20,14,SECTION) + XY(10,14,SECTION) + XY(0,14,SECTION) + XY(41,22,SECTION) + XY(31,22,SECTION) + XY(20,22,SECTION) + XY(10,22,SECTION) + XY(0,22,SECTION) + XY(41,30,SECTION) + XY(31,30,SECTION) + XY(20,30,SECTION) + XY(10,30,SECTION) + XY(0,30,SECTION) + XY(41,38,SECTION) + XY(31,38,SECTION) + XY(20,38,SECTION) + XY(10,38,SECTION) + XY(0,38,SECTION) +> + +DIPLOC: ONESECTION(0) ;DOUBLE HEIGHT + ONESECTION(1) ;QUAD + ONESECTION(2) ;HEX + +PINTAB: XY(0,0,0) + XY(1,0,0) + XY(2,0,0) + XY(3,0,0) + XY(4,0,0) + XY(5,0,0) + XY(6,0,0) + XY(7,0,0) + XY(7,-6,0) + XY(6,-6,0) + XY(5,-6,0) + XY(4,-6,0) + XY(3,-6,0) + XY(2,-6,0) + XY(1,-6,0) + XY(0,-6,0) + +DEFINE DIST(A) +< A*125 +> + +DETAB: DIST(0) + DIST(1) + DIST(2) + DIST(3) + DIST(4) + DIST(3) + DIST(2) + DIST(1) + DIST(1) + DIST(2) + DIST(3) + DIST(4) + DIST(3) + DIST(2) + DIST(1) + DIST(0) + +YFDG: +FOR I_0,5 +< I*=21*=125 +> + ;GROUND AND POWER PINS +DEFINE PINS +< ONEPINS(0) + ONEPINS(1) + ONEPINS(2) +> + +DEFINE ONEPINS(SECTION) +< + VGMAC(SECTION,8,6,5) + VGMAC(SECTION,8,14,10) + VGMAC(SECTION,8,22,15) + VGMAC(SECTION,8,30,20) + VGMAC(SECTION,8,38,25) + VGMAC(SECTION,18,6,4) + VGMAC(SECTION,18,14,9) + VGMAC(SECTION,18,22,14) + VGMAC(SECTION,18,30,19) + VGMAC(SECTION,18,38,24) + VGMAC(SECTION,28,06,3) + VGMAC(SECTION,28,14,8) + VGMAC(SECTION,28,22,13) + VGMAC(SECTION,28,30,18) + VGMAC(SECTION,28,38,23) + VGMAC(SECTION,39,06,2) + VGMAC(SECTION,39,14,7) + VGMAC(SECTION,39,22,12) + VGMAC(SECTION,39,30,17) + VGMAC(SECTION,39,38,22) + VGMAC(SECTION,49,06,1) + VGMAC(SECTION,49,14,6) + VGMAC(SECTION,49,22,11) + VGMAC(SECTION,49,30,16) + VGMAC(SECTION,49,38,21) + VGCMAC(SECTION,53,2,A,C,2) + VGCMAC(SECTION,55,15,A,T,1) + VGCMAC(SECTION,53,23,B,C,2) + VGCMAC(SECTION,55,36,B,T,1) +> + +DEFINE VGMAC(A,B,C,D) +< XY(B,C,A) +> + +DEFINE VGCMAC(A,B,C,D,E,F) +< XY(B,C,A) +> + +GNDTAB: PINS +GNDLEN__.-GNDTAB + +DEFINE VGMAC(A,B,C,D) +< D +> + +DEFINE VGCMAC(A,B,C,D,E,F) +< <BYTE(7)"D"+2*A,"E">+F +> + +GNDNAM: PINS + +DEFINE ONEPINS(SECTION) +< + VGMAC(SECTION,8,0,5) + VGMAC(SECTION,8,8,10) + VGMAC(SECTION,8,16,15) + VGMAC(SECTION,8,24,20) + VGMAC(SECTION,8,32,25) + VGMAC(SECTION,18,0,4) + VGMAC(SECTION,18,8,9) + VGMAC(SECTION,18,16,14) + VGMAC(SECTION,18,24,19) + VGMAC(SECTION,18,32,24) + VGMAC(SECTION,28,0,3) + VGMAC(SECTION,28,8,8) + VGMAC(SECTION,28,61,13) + VGMAC(SECTION,28,24,18) + VGMAC(SECTION,28,32,23) + VGMAC(SECTION,39,0,2) + VGMAC(SECTION,39,8,7) + VGMAC(SECTION,39,16,12) + VGMAC(SECTION,39,24,17) + VGMAC(SECTION,39,32,22) + VGMAC(SECTION,49,0,1) + VGMAC(SECTION,49,8,6) + VGMAC(SECTION,49,16,11) + VGMAC(SECTION,49,24,16) + VGMAC(SECTION,49,32,21) + VGCMAC(SECTION,57,0,A,A,2) + VGCMAC(SECTION,57,21,B,A,2) +> + +DEFINE VGMAC(A,B,C,D) +< XY(B,C,A) +> + +DEFINE VGCMAC(A,B,C,D,E,F) +< XY(B,C,A) +> + +VCCTAB: PINS +VCCLEN__.-VCCTAB + +DEFINE VGMAC(A,B,C,D) +< D +> + +DEFINE VGCMAC(A,B,C,D,E,F) +< <BYTE(7)"D"+2*A,"E">+F +> + +VCCNAM: PINS + +RADIX 8 +BEGIN WW946 + +;PIN DATA STRUCTURE SAME AS OTHER DEC BOARDS + +^W946TV: + -1 ;FLAGS IF WIRE WRAP OR PC BOARD + JRST W946IN ;THE W/W INIT ROUTINE + JRST MAPRC ;MAP ROW/COLS INTO GENERATED LOCS + JRST MAPPAD ;MAP PADDLE/LETTER/SIDE INTO CONN LOCS + JRST DISTCB ;DISTANCE CALC ROUTINE + JRST FPWR ;FIND A POST WITH POWER + JRST FGND ;FIND A POST WITH GND + JRST MAPIT ;CONVERT POST INTO X,Y,BITS + JRST PAKSIZ ;FIND DIMENSION OF DIP OUTLINE + JRST GNDCLR ;? + JRST WAGGND ;? + JRST GNDOUT ;? + JRST VCCOUT ;? + + =18 ;NROWS + 6 ;NCOLS + 0 ;NCLPRG + 0 ;NRWPRP + =108 ;DIPSLT=NROWS*NCOLS + SETPAD(6) ;NPADS + XWD -=18,1 ;PADLET + XWD -2,1 ;PADPIN + =8 ;FRACTN + ITS,<=400;>=500 ;WRAPMG--TOTAL FOR BOTH ENDS OF RUN!! + ITS,<=1500;>=2000 ;POSTMG--" + =250 ;NEXTR +CHECK W946TV,WTVLEN + +W946IN: SETOM LNGRID + SETOM WIRGND + POPJ P, + + ;MAPIT, PINMAP, PINBIT, MAPRC, PINPGP, CONMAP + +MAPRC: TDNE T,[777700,,770000] ;ROW,,COLUMN FROM UML ROUTINE IN T + POPJ P, ;BLESS THE RC FROM UML + MOVSS T ;PUT THE ROW FROM UML INTO THE NUMBER POSITION + HLRZ TT,T ;PUT THE COLUMN FROM UML INTO RIGHT SIDE OF TT + MOVNS TT ;AND MUNG THE COLUMN LETTER SO TED LIKES IT + ADDI TT,1 + ADD TT,NCOLS + DPB TT,[POINT 24,T,23] ; SO IT CAN BE STUFFED INTO THE LOC LETTER FIELD + JRST CPOPJ1 + +PINMAP: PUSHJ P,MAPIT + JRST PINERR + JRST CONERR + JRST CPOPJ1 + +PINBIT: PUSHJ P,MAPIT + JFCL + SETZ TT, + POPJ P, + +MAPIT: JUMPL A,CONMAP ;IS IT A CONNECTOR PIN? + LDB T,[POINT 6,A,23] ;GET LOC LETTER (COLUMN A-F) + LDB TT,[POINT 12,A,35] ;GET LOC NUMBER (ROW 1-18) + JUMPE TT,CPOPJ ;0 IS A NO,NO + CAMLE T,NCOLS ;CHECK FOR OUT OF BOUNDS + POPJ P, + CAMLE TT,NROWS + POPJ P, + +;PUT XY IN T: + SUBI T,1 ;T_COL-1 + IMULI T,=1125 ;T_(COL-1)*INTER.COLUMN.SPACING + SUBI TT,1 ;TT_ROW-1 + IDIVI TT,6 ;TT_(ROW-1) DIV 6, TTT_(ROW-1) MOD 6 + IMULI TT,=5250 ;TT_((ROW-1) DIV 6)*INTER.PATTERN.SPACING + IMULI TTT,=750 ;TTT_((ROW-1) MOD 6)*INTER.ROW.SPACING + ADDI TT,=250(TTT) ;DIP PATTERN STARTS INSIDE OF CONNECTOR PATTERN + HRLZS T ; ON THIS TURKEY CARD. + HRR T,TT ;MOVE X TO LHW(T), Y TO RHW(T) + + LDB TT,[POINT 6,A,17] ;GET THE PIN # + TLNE A,MAPPWR!MAPGND ;POWER OR GROUND PIN? + JRST PINPGP + CAIN B,=14 ;I KNOW WHICH WAY 14 PIN DIPS GO IN TOO! + CAIG TT,7 ;WHICH MEANS PIN #'S GREATER THAN 7 ADD 2 + JRST MAPIT0 ;NO (14 PIN DIPS NORMALLY GET MUNGED BEFORE THEY GET HERE) + ADDI TT,2 ;YES, FUDGE PIN # BY 2 +;I THINK I STILL NEED THIS! (I BET NONE OF THIS CODE EVER GETS EXECUTED-TAG) + ADD A,[2,,0] ;ALSO RETURN CORRECTED PIN # FOR DSTCLC + TLO A,PLUS2 ;AND INDICATE IT IS A PLUS 2 VERSION +MAPIT0: PUSH P,TT + CAIG TT,=8 ;CALCULATE EXTRA XY FOR PIN-DIPLOC IS XY OF PIN 16 + JRST MAPIT1 ;DO IT DIFFERENT IF PIN IS 8 OR LESS + MOVEI TTT,=16 ;PIN IS 9-16, NEEDS NO Y CORRECTION + SUB TTT,TT ;GET #PINS FROM PIN 16 + IMULI TTT,=125 ;MULTIPLY BY INTERPIN SPACING + HRLZ TT,TTT ;LINE IT UP WITH X IN T +MAPIT3: ADD T,TT ;FIX T + POP P,TT + MOVE TTT,DETAB-1(TT) ;GET DISTANCE TO END OF DIP PATTERN (SHORTEST) + SETZ TT, ;NO AUTOMATIC GND OR PWR + JRST CPOPJ2 + +MAPIT1: SUBI TT,1 ;PIN IS 8 OR LESS, GET #PINS FROM PIN 1 + IMULI TT,=125 ;CONVERT TO MILS + HRLZS TT ;LINE UP WITH X IN T + HRRI TT,=625 ;INCLUDE INTERROW SPACING + JRST MAPIT3 + + +PINPGP: JUMPN TT,CPOPJ ;PIN FIELD SHOULD BE CLEAR + TRNN A,10000 ;IS COLUMN A,C, OR E? (ODD COLUMNS GET DIFFERENT + JRST EVENCL ;POWER AND GROUND TREATMENT) + ADD T,[=8*=125,,0] ;BOTH GET THIS + TLNN A,MAPPWR ;POWER? + JRST [ MOVSI TT,GND ;NO, RETURN GND BIT + ADDI T,=625 ;AND FUDGE Y + SETZ TTT, ;AT END OF PATTERN + JRST CPOPJ2] + MOVSI TT,PWR + SETZ TTT, + JRST CPOPJ2 + +EVENCL: TLNN A,MAPPWR ;POWER? + JRST [ MOVSI TT,GND ;MAKE INTO PHANTOM GND PIN IN SAME PLACE AS PIN 8 + ADD T,[7*=125,,=625] + SETZ TTT, + JRST CPOPJ2] + MOVSI TT,PWR + SUB T,[=125,,0] ;MAP TO POWER PIN BETWEEN SOCKETS + SETZ TTT, + JRST CPOPJ2 + +CONMAP: AOS (P) + LDB TT,[POINT 6,A,23] ;GET PADDLE + CAMLE TT,NPADS ;TOO LARGE? + POPJ P, + SOJL TT,CPOPJ ;NORMALIZE & CHECK FOR TOO SMALL + MOVEM TT,SAVPAD# + + LDB T,[POINT 6,A,29] ;GET PIN + MOVEM T,LETTER# + CAILE T,=18 ;LEGAL? + POPJ P, + SOJL T,CPOPJ ;NORMALIZE AND CHECK + TRNE TT,1 ;SKIP UNLESS WE'RE ON PADDLE B, C, OR F + ADDI T,=18 ;CPIN PATTERN REPEATS EVERY TWO PADDLES ON A W946 + + LDB TT,[POINT 6,A,35] ;GET SIDE + MOVEM TT,SIDE# + SOJL TT,CPOPJ ;NORMALIZE AND CHECK + CAILE TT,1 ;TOO BIG? + POPJ P, + CAIE TT, ;IF WE'RE ON SIDE 2, + ADDI T,=36 ;THEN INDEX TO SIDE TWO PORTION OF CPIN TABLE + MOVE T,CPINTB(T) ;GET X,Y OF CPIN RELATIVE TO AA2 + ADD T,[=6750,,0] ;ADD OFFSET OF AA2 + MOVE TT,SAVPAD ;GET PADDLE AGAIN + ADD T,YFDG(TT) ;ADD PADDLE Y OFFSET + MOVE TT,LETTER ;SET UP FOR VGCON1 + LSH TT,2 + IOR TT,SIDE +VGCON1: CAIN TT,<1*4>+2 ;CHECK FOR POWER AND GROUND PINS (A2,C2,OR T1) + MOVSI TT,PWR + CAIN TT,<3*4>+2 + MOVSI TT,GND + CAIN TT,<=16*4>+1 + MOVSI TT,GND + SETZ TTT, ;TTT OTHER THAN ZERO HAS NO MEANING FOR CPIN + JRST CPOPJ1 + +VGCON: LDB TT,[POINT 8,A,31] + TRO TT,1 + TRNE A,2 + ADDI TT,1 + JRST VGCON1 + +FOR NAME (GNDCLR,WAGGND,GNDOUT,VCCOUT) +<NAME: OUTSTR [ASCIZ /NAME NOT IMPLEMENTED FOR W946! +/] + JRST ERRET +> + ;TABLES FOR W946 + +RADIX =10 + +DEFINE XY(X,Y)<XWD 125*X,125*Y> + +DEFINE Y(Y)<XWD 0,125*Y> + +CPINTB: XY(3,1) ;AA1 + XY(1,1) ;AB1 + XY(3,3) ;AC1 + XY(1,3) ;AD1 + XY(3,5) ;AE1 + XY(1,5) ;AF1 + XY(3,7) ;AH1 + XY(1,7) ;AJ1 + XY(3,9) ;AK1 + XY(1,9) ;AL1 + XY(3,11);AM1 + XY(1,11);AN1 + XY(3,13);AP1 + XY(1,13);AR1 + XY(3,15);AS1 + XY(1,15);AT1 + XY(1,18);AU1 YEAH, IT'S SCREWY, ALL RIGHT. + XY(2,18);AV1 + XY(3,20);BA1 + XY(1,20);BB1 + XY(3,22);BC1 + XY(1,22);BD1 + XY(3,24);BE1 + XY(1,24);BF1 + XY(3,26);BH1 + XY(1,26);BJ1 + XY(3,28);BK1 + XY(1,28);BL1 + XY(3,30);BM1 + XY(1,30);BN1 + XY(3,32);BP1 + XY(1,32);BR1 + XY(3,34);BS1 + XY(1,34);BT1 + XY(3,37);BU1 HICCUP + XY(1,37);BV1 + Y(0) ;AA2 + Y(1) ;AB2 + Y(2) ;AC2 + Y(3) ;AD2 + Y(4) ;AE2 + Y(5) ;AF2 + Y(6) ;AH2 + Y(7) ;AJ2 + Y(8) ;AK2 + Y(9) ;AL2 + Y(10) ;AM2 + Y(11) ;AN2 + Y(12) ;AP2 + Y(13) ;AR2 + Y(14) ;AS2 + Y(15) ;AT2 + Y(17) ;AU2 HICCUP + Y(18) ;AV2 + Y(20) ;BA2 + Y(21) ;BB2 + Y(22) ;BC2 + Y(23) ;BD2 + Y(24) ;BE2 + Y(25) ;BF2 + Y(26) ;BH2 + Y(27) ;BJ2 + Y(28) ;BK2 + Y(29) ;BL2 + Y(30) ;BM2 + Y(31) ;BN2 + Y(32) ;BP2 + Y(33) ;BR2 + Y(34) ;BS2 + Y(35) ;BT2 + Y(37) ;BU2 HICCUP + Y(38) ;BV2 + + +YFDG: 0 + 0 + =5250 + =5250 + =10500 + =10500 + +RADIX 8 + +BEND WW946 +^W946TV__W946TV +BEND WW940 +>;MWL +>;MDWL diff --git a/src/wl/wboard.2 b/src/wl/wboard.2 new file mode 100644 index 00000000..6e4e1b52 --- /dev/null +++ b/src/wl/wboard.2 @@ -0,0 +1,16 @@ +title boards +;;For producing separate REL boards file for WL +COMMENT  +.XCREF A,B,C,D,E,F,G,H,M,P,T,TT,TTT + + +.insert WLDEFS +.insert BOARD0 + +XLIST +LIT +STORAGE(IMPURE) +VAR +LIST + +END diff --git a/src/wl/wl.314 b/src/wl/wl.314 new file mode 100644 index 00000000..86c1320c --- /dev/null +++ b/src/wl/wl.314 @@ -0,0 +1,17 @@ +COMMENT  +.XCREF A,B,C,D,E,F,G,H,I,L,P,T,TT,TTT,W,FETCH + +.insert wldefs +.INSERT WLFST +.INSERT WLIN +.INSERT WLOUT1 +.INSERT WLOUT2 +;.INSERT WLRDC +.INSERT WLDIP +.INSERT WLROUT +.INSERT SIGSUB + +;.insert board0 +; Load this with the WBOARDS.REL + +.INSERT WLLAST diff --git a/src/wl/wl.loader b/src/wl/wl.loader new file mode 100644 index 00000000..2fd11799 --- /dev/null +++ b/src/wl/wl.loader @@ -0,0 +1,5 @@ +MSAIL;JOBDAT$L +MWL;WL$L +MWL;WBOARD$L +1? +JWL$TD diff --git a/src/wl/wl.login b/src/wl/wl.login new file mode 100644 index 00000000..dcb1005d --- /dev/null +++ b/src/wl/wl.login @@ -0,0 +1,13 @@ +:STINK WL +1L DECSYS;DECBOT BIN +.JBSA/STRT +56/107 +: +********* OK, now do the following ********* + :DELETE DATDRW;NODIPS OBIN + :RENAME DATDRW;NODIPS BIN, NODIPS OBIN + :PDUMP DATDRW;NODIPS BIN ; This is the file linked to by SYS1;TS NODIPS + :GO + "TOP MODE" + XRESIDENT ;read in NDIPS.DIP and dump it out + diff --git a/src/wl/wldefs.5 b/src/wl/wldefs.5 new file mode 100644 index 00000000..64f35072 --- /dev/null +++ b/src/wl/wldefs.5 @@ -0,0 +1,344 @@ +DEFINE SETSW $ (NAME,DEFVAL) +< IFNDEF NAME$SW,<NAME$SW__IFIDN <DEFVAL> <> <0;>DEFVAL +> + NAME$SW__NAME$SW +> + +DEFINE ONOFSW $ (NAME) +< IFN NAME$SW,<NAME$SW__-1> ;MAKE IT NICE FOR  AND  +> +DEFINE DEFSW $ (NAME) +< DEFINE NAME,<IFN NAME$SW> + DEFINE NO$NAME,<IFE NAME$SW> +> +DEFINE MAKESW(NAME,VAL) +< SETSW(NAME,VAL) + ONOFSW(NAME) + DEFSW(NAME) +> + +MAKESW(STAN) +MAKESW(DEC) +MAKESW(CMU) +MAKESW(ITS) +MAKESW(III) + +DEFINE STANFO,<STAN> ;LONG FORM FOR HYSTERICAL RAISINS + +DEFINE CHECK $ (SITE,VAR) <IFDEF VAR,<SITE$SW__-1;>> +IFE STANSW!DECSW!CMUSW!ITSSW!IIISW,< +;IF NO SITE SET MANUALLY ABOVE, WE MUST DECIDE FOR OURSELVES WHERE WE ARE +CHECK(ITS,.IOT) CHECK(CMU,CMUDEC) CHECK(STAN,SPWBUT) DECSW__-1 +> + +DEFINE MOR (A) +<TMPSW__0 +FOR B IN (A) +< B,<TMPSW__-1> +> +IFN TMPSW> + +DEFINE MWL,<IFE 0> ;THIS IS WL +DEFINE MPC,<IFN 0> ;NOT PC +DEFINE MD,<IFN 0> ;OR D +DEFINE MDPC,<IFN 0> + +MAKESW(ROUTE,-1) ;WIRE WRAP ROUTER -- OPTIMIZES RUNS + +NODEC,<VIROSSW__0> +MAKESW(VIROS,-1) + + +MAKESW(USAGE,-1) ;FREE STORAGE USAGE COUNTERS + +MAKESW(DECOS,DECSW!CMUSW!IIISW) ;SITE HAS DEC LIKE OPERATING SYSTEM + +MAKESW(TTYBT,DECOSSW) ;SITE CAN SET TTY BREAK TABLE + +MAKESW(ESCMP,DECSW!CMUSW!IIISW) ;MUST MAP ESCAPES FROM TTY INTO ALTMODES + ;YOU ONLY NEED THIS IF 176, 175, AND 33 ARE ALL ALTMODE +MAKESW(SKEY,DECSW!IIISW) ;SKEYSW=1 FOR STANDARD ASCII KEYBOARDS WHICH + ;REQUIRE TRANSLATING ALTMODES TO CTRL AND META + ;AC DEFS +EXTERNAL .JBFF,.JBSA,.JBSYM,.JBREL,.JBDDT,.JBOPC,.JBREN,.JBHRL + +;AC0 FLAG BITS +FLAG__1 ;TEMPORARY FLAG BIT +ASCFLG__2 ;=1 ASCII INPUT =0 FULL WORD INPUT +PCNOTD__4 ;READING PC FILE, NOT D +CONLY__10 ;CONNECTOR INTERCONNECTIONS NEEDED ONLY +ISBACK__20 ;IS BACK PANEL LIST WE ARE DOING +;40 AVAILABLE +DOBEQ__100 ;DOING BACK PANEL EQUIVALENCES +DOALLC__200 ;DO ALL CARDS AT TTY PRINT +DOERRS__400 ;DOING ERROR SUMMARY +DOWIE__1000 ;DOING OUTPUT OF WIRE LIST INPUT ERRORS +DOGIN__2000 ;INVENTING PIN NAMES FOR "U" PINS IN SIMPLE FILE +DOPRTL__4000 ;DOING PARTS LIST, NOT STUFF LISTING +DOPWR__10000 ;DO ALL PWR IN BSIMPLE + +ROUTE,<DOROUT__100000 ;DOING OUTPUT OF WIRE LIST USING ROUTER> +REFLAG__200000 ;DO REFERENCE HACK IN 'WL' FILE +PETIT__400000 ;SPACES ARE SIGNIFICANT - PETIT SWITCH + +;LEFT HALF BITS +NOT__1 ;NOT IN T +NOTT__2 ;NOT IN TT +TFLG__4 ;TEMPORARY FLAG +SEMFLG__10 ;SEMI COLON SEEN IN TILDANOT +NOFF__20 ;NO FORM FEED NEEDED WHEN HEADER GOES OUT +ASKHIM__40 ;ASK FLAG + +DEC,<COMLIN__40000> ;ANY LINE OUTPUT SHOULD BE A COMMENT LINE + ;I.E. PRECEEDED BY "/" +SIMTAB__100000 ;SIMULATE TABS WITH SPACES +DOLC__200000 ;DO LOADING AND COUNTS IN GATHER +BAKGAT__400000 ;TELLS GATHER THIS IS A BACK PANEL WIRE LIST + + +A_1 +B_2 +C_3 +D_4 +E_5 +F_6 +G_7 +H_10 +L_11 ;CURRENT ID LIST +W_12 ;CURRENT CARD LIST +T_13 +TT_14 +TTT_15 +TTTT_16 +P_17 + ;Parameters + +;MAX NUMBER OF PADDLES FOR UML OUTPUT +MAXPAD__=64 + + ;OPDEFS +OPDEF PUTSTR[1B8] ;OUTPUT STRING (VARIOUS TYPES) +OPDEF PUTSIX[2B8] ;PUTSIX [''] +OPDEF PUTBYT[3B8] ;PUTBYT CHAR +OPDEF ASK[4B8] ;ASK [ASCIZ //] - SKIPS TWICE ON Y +OPDEF ERRSTR[5B8] ;ERRSTR #,[ASCIZ //] + +CMU,< +OPDEF CMUDEC [CALLI -2] +OPDEF DECCMU [CALLI -3] +>;CMU + +ITS,< +OPDEF CALL [ 40B8] +OPDEF INIT [ 41B8] +OPDEF CALLI [ 47B8] +OPDEF OPEN [ 50B8] +OPDEF TTYUUO [ 51B8] +OPDEF RENAME [ 55B8] +OPDEF IN [ 56B8] +OPDEF OUT [ 57B8] +OPDEF SETSTS [ 60B8] +OPDEF STATO [ 61B8] +OPDEF GETSTS [ 62B8] +OPDEF STATZ [ 63B8] +OPDEF INBUF [ 64B8] +OPDEF OUTBUF [ 65B8] +OPDEF INPUT [ 66B8] +OPDEF OUTPUT [ 67B8] +OPDEF CLOSE [ 70B8] +OPDEF RELEASE [ 71B8] +OPDEF MTAPE [ 72B8] +OPDEF UGETF [ 73B8] +OPDEF USETI [ 74B8] +OPDEF USETO [ 75B8] +OPDEF LOOKUP [ 76B8] +OPDEF ENTER [ 77B8] +OPDEF UJEN [100B8] +OPDEF PTYUUO [711B8] + +OPDEF PTWR1S [PTYUUO 7,] +OPDEF PTWRS9 [PTYUUO 12,] +OPDEF PTJOBX [PTYUUO 16,] + +OPDEF DSKPPN [CALLI 400071] +OPDEF SWAP [CALLI 400004] +>;ITS + +NOSTAN,< +OPDEF RESET[CALLI] +OPDEF DEVCHR[CALLI 4] +OPDEF CORE[CALLI 11] +OPDEF EXIT[CALLI 12] +OPDEF DATE[CALLI 14] +OPDEF MSTIME[CALLI 23] +OPDEF GETPPN [CALLI 24] + +OPDEF INCHRW [TTYUUO 0,] +OPDEF OUTCHR [TTYUUO 1,] +OPDEF INCHRS [TTYUUO 2,] +OPDEF OUTSTR [TTYUUO 3,] +OPDEF INCHWL [TTYUUO 4,] +OPDEF INCHSL [TTYUUO 5,] +OPDEF GETLIN [TTYUUO 6,] +OPDEF SETLIN [TTYUUO 7,] +OPDEF RESCAN [TTYUUO 10,] +OPDEF CLRBFI [TTYUUO 11,] +OPDEF CLRBFO [TTYUUO 12,] +OPDEF INSKIP [TTYUUO 13,] +OPDEF SETACT [TTYUUO 15,] +>;NOSTAN + +DECOS,<OPDEF DSKPPN[GETPPN]> + +;ALL THE SPECIAL FORMS OF PUTSTR +OPDEF PUTSIG[PUTSTR 1,] ;OUTPUT, BUT CHECK FOR A/P +OPDEF PUTCOM[PUTSTR 2,] ;OUTPUT COMMENT ONLY +OPDEF BINSTR[PUTSTR 3,] ;OUTPUT TO FILE +OPDEF BINSIG[PUTSTR 4,] ;OUTPUT SIGNAL NAME (WITH A/P) TO FILE +OPDEF BINSGU[PUTSTR 5,] ;OUTPUT TO FILE, PREFIX GLOBAL CHARACTER +DEC,<OPDEF OUTSIG[PUTSTR 6,]> ;DEC MUST FIX SIGNAL NAME +NODEC,<OPDEF OUTSIG[OUTSTR]> ;STANFORD AND ITS CAN JUST PRINT +OPDEF PUTXGP[PUTSTR 7,] ;IMAGE OUTPUT TO XGP + ;Simple macros + + DEFINE CRLF +< PUTSTR[BYTE(7)15,12] > +;HAS TO BE EXACTLY 1 INSTRUCTION + +DEFINE DIPCHECK<> +;JUST A MARKER + +;For commenting things out +DEFINE NIL +<IFN 0,> + + SUBTTL BITS + + +; BODY ENTRY (BBIT) +BTMP1__400000 ;TEMP MARK BIT +PRX2ND__200000 ;SECOND OCCURENCE OF THIS PRPX POINTER +BPACKP__100000 ;PACKAGE PROP OTHER THAN DEFAULT WAS SEEN + +BWILD__1000 ;THIS IS A WILD CONNECTOR +BEDGE__400 ;EDGE PIN BODY + CBODY__BEDGE!BWILD ;CON BODY BITS +BANYPOS__200 ;INDICATES XPOS AND YPOS ARE VALID +BXPOSL__3 ;3 BITS WORTH +BXPOSB__4 ;4 FROM RIGHT +BYPOSL__2 ;2 BITS WORTH +BYPOSB__2 ;2 FROM RIGHT + +;BITS FROM D WHICH MUST BE STORED IN BODY BITS ABOVE + +;BITS IN PIN ENTRY IN WIRE LIST (PBIT) +PTMP1__400000 ;MARK BIT +PTMP2__200000 ;ANOTHER + +TRMBTS__140000 ;TERMINATOR RULE BITS (FOR CON ONLY) + TRMBSZ__2 ;NUMBER OF BITS + TRMBPS__3 ;LOW ORDER BIT +CANYPOS__20000 + ;17400 POS BITS +CXPOSL__3 +CXPOSB__12 ;DISTANCE FROM RIGHT EDGE OF HALFWORD +CYPOSL__2 +CYPOSB__10 ;DISTANCE FROM RIGHT EDGE OF HALFWORD + +DUP__200 ;THIS PIN IS A DUPLICATE OF ANOTHER PIN IN RUN +PIDPIN__100 ;NO PIN #, USED PID! +PSHARE__40 ;THIS INPUT LOAD IS ALREADY SHARED WITH ANOTHER PIN +INVENT__20 ;THIS IS AN INVENTED POWER OR GROUND PIN +;QBITS USED ONLY ON BP PINS +QBITS__37 ;BIT MASK TO GET QUALIFIER LETTER FROM THIS HALFWORD + ;LSB OF BIT MASK MUST EQUAL 17 + ; IS FOR TABLE TEST INSIDE SIGSUB + + +;POINT BITS FROM DRAWING PROG ('WD' FILE) +DEFPIN__4000 ;THIS PIN IS DEFAULTED, NOT EXPLICIT (BODY PINS ONLY) +CPNBTS__6000 ;BITS FOR TERMINATOR RULES (CPINS ONLY) + CPNBPS__7 ;LOW ORDER BIT POS + CPNBSZ__2 ;# OF BITS + +;BITS IN DPBIT, TBIT, AND CBIT (TYPE BITS) +INLD__400000 ;INPUT LOAD +OUTLD__200000 ;OUTPUT LOAD +NULLD__100000 ;NO LOADING AT PRESENT +GND__40000 ;GROUND CONNECTION +PWR__20000 ;POWER CONNECTION + VPWR__=500 ;TTL POWER +TRI__10000 ;TRI-STATE OUTPUT +SHARE__4000 ;SHARE INPUT LOAD BIT (OR EXTRA OUTPUT) +OPENC__2000 ;OPEN COLLECTOR OUTPUT +PULL__1000 ;THIS OUTPUT IS A PULLUP +ECL__400 ;ECL PIN +TTL__200 ;TTL PIN +CLK__100 ;CLK SEEN AS FIRST 3 CHARS OF USE +TERM__40 ;TERMINATOR PIN +FFOUT__20 ;FLIP-FLOP OUTPUT +DRVREQ__10 ;DRIVE REQUIRED FOR THIS INPUT +FFIN__4 ;FLIP-FLOP INPUT + +ANYCON__1 ;THERE IS A CONNECTOR IN THIS RUN (NOT USED IN DPBIT) + +;BITS FROM OLD VERSION DIP FILE +VEE__200 ;-5.5V ECL POWER + VEEVLT__-=520 +OTTL__100 ;OLD TTL BIT +VBB__40 ;-1.5V ECL THRESHOLD + VBBVLT__-=150 +VTT__20 ;-2V ECL TERMINATORS + VTTVLT__-=200 +OCLK__10 ;OLD CLK BIT + + +ALLTYP__INLD!OUTLD!NULLD!GND!PWR!TRI!SHARE!OPENC!PULL!TERM ;ALL TYPE BITS +INBITS__INLD!SHARE!NULLD ;ALL INPUT BITS + + + ;BITS IN WBIT (WIRE BITS) +SNC__400000 ;THIS WIRE HAS THE NAME "NC" +SHI__200000 ;THIS WIRE HAS THE NAME "HI" +SPWR__100000 ;THIS WIRE HAS THE NAME "VCC" +SGND__40000 ;THIS WIRE HAS THE NAME "GND" +SCANON__20000 ;THIS SIGNAL IS THE CANONICAL +5.00V + +CABRUN__400 ;PUT C QUALIFIER ON EDGE PINS +WNULL__200 ;COMPLETELY NULL WIRE +WSINGL__100 ;WIRE WITH ONLY 1 PIN +GLB2__40 ;THIS IS THE SIGNAL TO COME OUT IN THE SIMPLE FILE +GLB1__20 ;THIS IS ONLY SIGNAL TO GO TO BACK PANEL +GENSIG__10 ;THIS IS A GENERATED SIGNAL +WTMP1__4 ;TEMP MARK BIT FOR WIRE HEADER +SIG1__2 ;THIS SIGNAL BLOCK IS THE FIRST OF A SET OF EQUIVALENT NAMES +NAM2ND__1 ;INTERNAL WIRE HEADER BIT FOR SECOND NON-EQUIVALENT NAME OF SIGNAL + +SIGBIT__SNC!SHI!SPWR!SGND ;WIRE TYPE BITS + + +;RUN BITS FROM DRAWING PROG ('WD' FILE) +CABBDY__1 ;"CABLE" BODY PIN ON RUN + + +ROUTE,< +;BITS IN PNTBL WORD USED BY ROUTER +RPGPIN__400000 ;THIS IS A POWER OR GROUND PIN, IT IS NOT IN WIRE LIST +RERPIN__200000 ;THIS PIN IS IN ERROR IN SOME WAY, DON'T WIRE IT! +ROUMRK__100000 ;MARK BIT FOR ROUTER +;BITS 5-14 ORDER # +;BITS 15-17 "SCT" CHARS +>;ROUTE + + +;BITS IN PROPERTY VALUE BLOCKS +DEFPRP__400000 ;THIS IS THE DEFAULT PROPERTY AT THIS LEVEL +PARTNM__200000 ;THIS IS A PART NUMBER BLOCK +PNUSED__100000 ;THIS PART NUMBER BLOCK IN USE +NULVAL__40000 ;THIS IS A NULL VALUE STRING AND SHOULDN'T NORMALLY BE PRINTED + +PRTMP1__1 ;TEMP MARK BIT + + +;BITS IN PLBK FOR PARTS LIST THREAD +PL2ND__400000 ;THIS IS SECOND OCCURENCE OF SAME PART NUMBER diff --git a/src/wl/wldip.329 b/src/wl/wldip.329 new file mode 100644 index 00000000..574f2340 --- /dev/null +++ b/src/wl/wldip.329 @@ -0,0 +1,2637 @@ +;<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 diff --git a/src/wl/wlfst.517 b/src/wl/wlfst.517 new file mode 100644 index 00000000..8b7e1a03 --- /dev/null +++ b/src/wl/wlfst.517 @@ -0,0 +1,4495 @@ +;<WIRELIST>WLFST.FAI.328, 29-NOV-75 17:58:36, EDIT BY HELLIWELL +TITLE WL + +XALLNOLIT + +EXTERNAL MAPOST,MAPCON,MAPSOC,%%PINN,$$PINN +EXTERNAL LCINIT,GETSLT,SLTOUT,PRNLOC,PRNPIN +EXTERNAL CPNMER,CPNSEP,CPNMAP,QUPIN +EXTERNAL PINCUE,SLTCUE +EXTERNAL BPINPN,RPNAM,LOCOUT +EXTERNAL GETNOM,CLRNOM,SETNOM,FNDNOM,AVAIL +EXTERNAL DEFNOM,LOCTVV,NOMTYP +EXTERNAL N2L,L2N,LNAMES,PUTDEC,MAXN2L + +EXTERNAL GETLOC,RAYDIP,AUGDIP,CPARTP,SEQLOC,CONGIN,GTSLTT +EXTERNAL WBDCUE,CBCUE +EXTERNAL DEFWW,CLRWW,FNDWW,SETWW,WWTYP,WNAMES +EXTERNAL GETBRD,MAPOST +EXTERNAL APACK,PACKNM,MATPAK +EXTERNAL PINMAP,PINBIT,BPNPIN,PRBCN,PRCNPN,LOCPNW +EXTERNAL LOCPNC,PADPRT,WLOCOUT,LOCPNM,LOCPNP + +EXTERNAL NROWS,NCOLS,NCLPRG,NRWPRP,DIPSLT,NPADS,PADLET +EXTERNAL PADPIN,FRACTN,WRAPMG,POSTMG,NEXTR +EXTERNAL MAPRC,WAGGND,ISWW,FGND,FPWR,RPNAMA +EXTERNAL WWINIT,MAPPAD,DSTCLC,MAPIT,PAKSIZ,GNDCLR +EXTERNAL GNDOUT,VCCOUT + +EXTERNAL NPACK,PACKPN,PAKSIZ,MAKCPN,WIRGND,LNGRID +EXTERNAL LOCPIN,DECOUT,NDECOU,TRPNAM + +INTERNAL CPOPJ,CPOPJ1,CPOPJ2,CPOPJ3,POPAJ +INTERNAL SLICEL,DECIN,TDECIN,TCOUNT,TFILL,TTFILL,NDIG +INTERNAL TREADU,PUTFS,GETCHR, FUCKUP + +VMAJOR__8 ;MAJOR VERSION # +VMINOR__0 ;MINOR VERSION LETTER +VGROUP__2 ;MODIFYING GROUP +VEDIT__30 ;EDIT NUMBER + +ORG 137 + <BYTE (3) VGROUP (9) VMAJOR (6) VMINOR>+VEDIT +ORG + ;IO CHANNELS, IOVERSIONS, FLAG BITS, ACS +;IO CHANNEL ASSIGNMENTS +DAT__0 +LST__1 +IDSK__2 +DECOS,<TTYCHN__3> + +ITS,<FONTCH__4> + +;SOME FILE EXTENSIONS AND VERSION STUFF +NODEC,< +NOIII,< +CMU,< EXTSAV__'SAV' > +NOCMU,< EXTSAV__'DMP' > +ITS,< EXTSAV__'BIN' > +>;NOIII +>;NODEC + +;IO VERSION #'S +WDVER__15 +WPCVER__400002 +WDRVER__1 +BACVER__13 +LESVER__1 +DIPVER__5 + +COMMENT  +;WDVER CHANGES +14 ?? +15 Package info in bodies. + +;DIPVER changes +4 ?? +5 Package name string in DIP + + + ;DEFINITIONS + +;SPECIAL CHARACTER DEFS + GENCHR__"%" ;FIRST CHAR OF GENERATED NAMES + GENLEN__=20 ;MAX LENGTH OF PIN NAME + ;BBRRSS LNNNN(PPPPPP) + GNPCLN__GENLEN-7 ;NEVER NEED BBRRSS FOR PC + FORALL__"" ;"BOTH" CHAR FOR P COMMANDS +NOSKEY,<NOTCHR__""> ;NOT AT STANFORD +SKEY,< NOTCHR__"-"> ;MINUS AT DEC +ITS,< NOTCHR__"-"> ;ALSO MIT +STANFO,<ALTMOD__175 > +NOSTANFO,<ALTMOD__33 > + ALTCHR__33 ;ALTMODE FROM DSKIN IF ALTMOD IS NOT EQUAL TO 33 +NOSKEY,<CBCHR__"'"> ;CHAR WHICH INCREMENTS CONTROL BITS FOR TTY +SKEY,< TEXIST__""> ;THERE EXISTS CHARACTER FOR FILENAME +NOSKEY,<TEXIST__25> + WLDCHR__"*" +NOSKEY,<BWAROW__""> +SKEY,< BWAROW__"@"> +NOSTANFO,<UBAR__"_"> +STANFO,<UBAR__""> +NOSKEY,< + CTRL__"" ;CONTROL + META__3 ;META + CTLMTA__"" ;BOTH +INTERNAL CTRL,META,CTLMTA +>;NOSKEY + + +;SPECIAL TYPE CHARACTERS +PWRCHR__"V" +GNDCHR__"G" + +;CONTROL CODES FOR 'LES' FILE +LESWIR__1 ;THE FOLLOWING IS A WIRE + +;DAT FILE OUTPUT NAME (TO FORTRAN) +DATNAM__<'FOR20 '> + +;MAX PINS IN RUN FOR ROUTER +MAXP__=64 ;NUMBER PINS/RUN MAX. + +;MAX # OF PINS FOR VERIFY STUFF (TABLE LIMITATION) - BODY/DIP MATCHING ERRORS +MAXPIN__=64 ;ALLOW 64 PIN IC'S + +;# OF BITS OF HASH FOR SIGNAL NAMES +HASHB__=9 ;TRY 9 FOR NOW +HASHL__1HASHB ;SIZE OF TABLE + +;MAX LENGTH OF SIGNAL OR BODY NAME IN WORDS +MXSTLN__=500/5 ;WHAT ABOUT [<><><><><>] + +PDLLEN__1000 ;OH WELL, THIS IS THE PRICE YOU PAY FOR RECURSIVE ROUTINES + +RADIX =10 +;BOTTOM PAGE MARGINS FOR VARIOUS OUTPUT STUFF +FILMAR__4 ;FILLST OUTPUT AT FRONT OF MOST FILES +WLBMAR__7 ;'WL' BODIES +WLWMAR__10 ;'WL' WIRES +WLZMAR__10 ;'WLZ' WIRES +WDCMAR__4 ;'BL' DIP COUNTS +WSBMAR__15 ;'WLS' BODIES +PREMAR__3 ;'WLS' PART NUMBER ERRORS +BVMAR__20 ;'WLS' VERIFY CONNECTOR PIN USAGE +TRCMAR__20 ;'WLS' CHECK FOR TERMINATOR RULES +POLMAR__2 ;'WLS' POLARITY ERRORS +WSWMAR__8 ;'WLS' SIGNAL NAMES +STFMAR__3 ;'STF' DIP STUFFING LIST +PRTMAR__2 ;'PRT' PARTS LIST +OTSMAR__6 ;'OTS' OUTPUT TERMINATION SUMMARY +OTLMAR__2 ;'OTL' TERMINATION TEST POINT LIST +MPLMAR__20 ;'MPL' MASTER PARTS LIST +MPMMAR__2 ;'MPL' MODULE COUNT LIST +WUPMAR__20 ;'WLU' BODY/PIN/SIGNAL +WUCMAR__3 ;'WLU' CON PIN/SIGNAL +WVMAR__15 ;'WLV' VERIFY BODIES AND PINS +WSSMAR__4 ;'WSS' SIGNAL SUMMARY +WCIMAR__15 ;'WLC' INCORRECT WIRES +WLDMAR__5 ;'WLD' INCORRECT PINS/SOCKET +WCWMAR__20 ;'WLC' WHOLE WRONG WIRES +WCLMAR__5 ;'WLC' SINGLE PINS +WWPMAR__15 ;'WWC' WIRE WRAP OUTPUT +DIPMAR__5 ;'LSD' DIP LIST +UMLMAR__6 ;'UML' 6 LINES PER ROW OF DIPS +DEC,< +SREMAR__2 ;'SR' EDGE PIN LIST +SRDMAR__2 ;'SR' DIPTYPE LIST +SRNMAR__5 ;'SR' NODE LIST +>;DEC + +RADIX 8 + +;PAGE SIZE FOR OUTPUT STUFF +NODECOS,< +STDPAG__=52 +STDWID__=120 +>;NODECOS +DECOS,< +STDPAG__=60 +STDWID__=132 +>;DECOS +ITS,< +STDPAG__=60 +STDWID__=132 +XGPHBI__=192 ;XGP HORIZONTAL BITS PER INCH +XGPVBI__=192 ;XGP VERTICAL BITS PER INCH +>;ITS + ;MACROS + DEFINE GETFS $ (A,BLK) +<%%BLK__IFDIF<BLK><><V.$BLK;>1 + SKIPN A,@FSTPNT+%%BLK + JSR NOFST + EXCH A,FSTPNT+%%BLK +> + + DEFINE FSTRET $ (A,BLK) +<%%BLK__IFDIF<BLK><><V.$BLK;>1 + HLLI A, + EXCH A,FSTPNT+%%BLK + HRRZM A,@FSTPNT+%%BLK +> + + DEFINE PGETFS $ (A,BLK) +<%%BLK__IFDIF<BLK><><V.$BLK;>1 + MOVEI A,%%BLK+1 + ADD A,FSTOP + CAMLE A,.JBREL + JSR MORCOR + EXCH A,FSTOP +USAGE,<AOS FSTCNT+%%BLK> +> + SUBTTL STRUCTURE MACROS +;THE FOLLOWING NAMES ARE USED IN STRUCTURE POINTER DEFINITIONS +;F.XXX INSTRUCTION TO FETCH VALUE +;S.XXX " STORE " +;V.XXX VALUE OF INDEX INTO BLOCK +; OR LENGTH OF A BLOCK-1 +;C.XXX INSTRUCTION TO CLEAR CELL + +DEFINE CAT $ (A,B)<A$B> + +DEFINE FETCH $ (AC1,AC2,INDEX) +< F.$INDEX AC1,V.$INDEX(AC2) +> + +DEFINE STORE $ (AC1,AC2,INDEX) +< S.$INDEX AC1,V.$INDEX(AC2) +> + +DEFINE CLEAR $ (AC1,INDEX) +< C.$INDEX V.$INDEX(AC1) +> + +DEFINE BCLEAR $ (AC1,AC2,INDEX) +< SETZM (AC2) +IFG V.$INDEX,< + MOVSI AC1,(AC2) + HRRI AC1,1(AC2) + BLT AC1,ADDR(AC2,INDEX) + > +> + +DEFINE SBLOCK +< INDEX__0 +> + +DEFINE EBLOCK $ (NAME) +< V.$NAME__INDEX-1 +IFG INDEX-FSTLEN<FSTLEN__INDEX> +> + +DEFINE ADDR $ (AC1,INDEX)<V.$INDEX(AC1)> + +DEFINE RADDR $ (AC1,INDEX1,INDEX2)<V.$INDEX1-V.$INDEX2(AC1)> + +DEFINE HWDS $ (LEFT,RIGHT,LE,RE) +< +IFDIF<LEFT><>< +IFDIF<LE><E><DEFINE F.$LEFT <HLRZ >> +IFIDN<LE><E><DEFINE F.$LEFT <HLRE >> +DEFINE S.$LEFT <HRLM > +DEFINE C.$LEFT <HRRZS > +V.$LEFT__INDEX +> +IFDIF<RIGHT><>< +IFDIF<RE><E><DEFINE F.$RIGHT <HRRZ >> +IFIDN<RE><E><DEFINE F.$RIGHT <HRRE >> +DEFINE S.$RIGHT <HRRM > +DEFINE C.$RIGHT <HLLZS > +V.$RIGHT__INDEX +> +INDEX__INDEX+1 +> + +DEFINE FWD $ (WORD) +< +IFDIF<WORD><>< +DEFINE F.$WORD <MOVE > +DEFINE S.$WORD <MOVEM > +DEFINE C.$WORD <SETZM > +V.$WORD__INDEX +> +INDEX__INDEX+1 +> + SUBTTL NOTES + +COMMENT  +NOTES: +-------------------------------------------------------------------------------- +WIRE FORMAT: + + (ALPH) (ALPH) +WIRES --- <HEADER> ------------- <EQUIVALENTS> --------- ... other signals ... + SIG1 - \ -SIG1 + | \ + | (NNAM) | +  | + <OTHER NAME> | + NAM2ND | + (WPIN) ------ + | + | (NNAM) +  + +Note: Only the "header" signal has the wire. The equivalents are alpha sorted + after the header, as is the NAM2ND list. + +--------------------------------------------------------------------------- + +Body list: + Bodies are in list (WBDY) sorted by BLOC, BID, and containing file. + Bodies with the same slot locn, but different BIDs are stored + separately. + + After all the normal bodies, there are "connector bodies" which + bundle all the pins for one paddle together. + +Locations: + The board slot is given by FCRD in the wirelist header. + For normal bodies the slot specification is stored in BLOC. + The pin location is found in PINN. + + For connector bodies the BLOC gives the paddle (or jack locn) and + the pin# is the pin locn within the jack. + However there is also an 18 bit format that combines the loc and pin#. + There exist routines, CPNMRG and CPNSEP to convert both ways. + The main reason this is different from DIPs is: + o In the drawing program, only 18 bits are allocated for + CPIN location on the board. Therefore the "dip location" + and pin name must fit in one halfword. + o For backpanel wirelists, the "body loc" is the card B-R-S, + and the PINN is the CPIN loc. + +--------------------------------------------------------------------------- + +HASHTB: +All the signals are strung onto one list, however segments are pointed to by +buckets in the hash table. +Each entry is: + Previous(List),, end of list + +(The first bucket is used for generated signal names.) +The first bucket is initialized to point to the wire header "WIRES" slot. + +--------------------------------------------------------------------------- +Invented PWR/GND signals. + +When the bodies are read in from a WD file, any DIPTYPE that has pins +marked as type PWR or GND will have a signal created for it, marked +by the INVENT bit. The Volts column of the DIP definition is used to +create a signal called "+5.0V" for example. + +When signal names are read-in, GND, VCC, HI, NC, and all forms like +5.0V +are checked for, and appropriate bits set in the signals flags. + +When a DIP pin that was V or G is explicitly wired in the input file, +the invented pin is found and deleted. This allows user wiring of DIP pins that +normally get automatically connected to power or ground. +--------------------------------------------------------------------------- + + SUBTTL DATA STRUCTURES +; STRUCTURE DEFINTIONS + +FSTLEN__2 ;THIS WILL ACCUMULATE LONGEST BLOCK + + +;PC OR D LIST HEADERS + +SBLOCK +HWDS (BKNM,BLST) ;BACK PANEL FILENAME LIST AND WIRE LIST + ;BKNM MUST BE LEFT HALF POINTER +HWDS (WLNM,WIRL) ;TITLE STRING AND D WIRELIST POINTER + ;WIRL MUST BE RIGHT HALF +HWDS (WLID,PCWL) ;ID STRING AND PC WIRELIST POINTER + ;PCWL MUST BE RIGHT HALF +HWDS (,INXT) ;NEXT WIRE LIST (ID) +EBLOCK LSTHEAD +NIL,<BKNM#,BLST#,WLNM#,WIRL#,WLID#,PCWL#,INXT#,LSTHEAD#,> + +;FILENAME BLOCK FOR LIST OF FILENAMES FOR BACK PANEL LIST +;AND SINGLE CARD WIRE LISTS + +SBLOCK +FWD (FILN) ;FILENAME +HWDS (FEXT,) ;EXT AND UNUSED +FWD (FPPN) ;PPN +FWD (FDAT) ;DATE AND TIME FROM LOOKUP OF DRW FILE +FWD (FPOL) ;NUMBER OF POLARITY CHECK ERRORS FOUND BY DWG PROG +HWDS (FNXT,FMOD) ;NEXT FILENAME LINK AND MODULE NAME POINTER + ;FNXT MUST BE LEFT HALF POINTER +HWDS (FVAR,FPRF) ;VARIABLE AND PREFIX +HWDS (TIT1,TIT2) ;TITLE LINES 1 AND 2 +HWDS (FREV,AUTHOR) ;REVISION STRING AND AUTHOR +HWDS (FPROJ,FPAGE) ;PROJECT AND PAGE STRINGS +HWDS (FOF,FNXH) ;OF STRING AND NEXT HIGHER ASSEMBLY STRING +HWDS (FWWT,FNOM) ;BOARD TYPE STRING AND NOMENCLATURE TYPE STRING +HWDS (MUBN,MLBN,E,E) ;VARIABLE UPPER, LOWER BOUNDS FROM INPUT TERM +HWDS (MCRD,MVLS) ;CARD LOC, VARIABLE LIST FROM INPUT TERM +EBLOCK FBLK +NIL,<FILN#,FEXT#,FPPN#,FDAT#,FPOL#,FNXT#,FMOD#,FVAR#,FPRF#,TIT1#,TIT2#,FREV#, +AUTHOR#,FPROJ#,FPAGE#,FOF#,FNXH#,FWWT#,FNOM#,MUBN#,MLBN#,MCRD#,MVLS#,FBLK#,> + + +;NORMAL WIRE LIST HEADER UNIT (ONE CARD) + +SBLOCK +HWDS (NGEN,NXTWL) ;GEN NUMBER AND NEXT WLBLOCK + ;NXTWL MUST BE RIGHT HALFWORD +HWDS (FILS,WIRES) ;FILENAME LIST AND SIGNAL LIST + ;WIRES MUST BE RIGHT HALFWORD +HWDS (FCRD,WBDY) ;LAST CARD AND LOC BLOCKS + ;WBDY MUST BE RIGHT HALFWORD +FWD(HASHTB) ;FIRST WORD OF HASH TABLE +INDEX__INDEX+HASHL-1 ;REST OF TABLE +EBLOCK WLBLOCK +NIL,<NGEN#,NXTWL#,FILS#,WIRES#,FCRD#,WBDY#,HASHTB#,WLBLOCK#,> + + +;BODY BLOCK + +SBLOCK +HWDS (DIPT,NXTB) ;DIPTYPE POINTER AND NEXT BODY +HWDS (BID,BPIN) ;BODY ID AND BODY PIN LIST + ;BPIN MUST BE RIGHT HALF POINTER +HWDS (BBIT,BPAK) ;BODY BITS,, PACKAGE CODE FROM D +HWDS (PRPX,PRTN) ;EXTRA PROPERTIES LIST AND PART NUMBER BLOCK POINTER +HWDS (BLOC,FILB) ;BODY LOC AND FILENAME POINTER +FWD (BNAM) ;FIRST WORD OF BODY NAME (THE REST FOLLOW SEQUENTIALLY) +EBLOCK BHEAD +NIL,<DIPT#,NXTB#,BID#,BPIN#,BBIT#,BPAK#,PRPX#,PRTN#,BLOC#,FILB#,BNAM#,BHEAD#,> + +;WIRE HEADER + +SBLOCK +HWDS (WBIT,ALPH) ;WIRE BITS AND TEXT LINK + ;ALPH MUST BE RIGHT HALF POINTER +HWDS (TBIT,WPIN) ;TYPE BITS AND PIN LIST + ;WPIN MUST BE RIGHT HALF POINTER +HWDS (NNAM,WTMP) ;NEXT NAME FOR WIRE AND TMP STORE +HWDS (WVOL,WRN,E,) ;VOLTAGE (SPWR) AND WIRE RULE NUMBER (BP ONLY) +FWD (SCMP) ;COMPARE WORD +FWD (SPNT) ;PRINT NAME (MUST FOLLOW SCMP) +EBLOCK WHEAD +NIL,<WBIT#,ALPH#,TBIT#,WPIN#,NNAM#,WTMP#,WVOL#,WRN#,SCMP#,SPNT#,WHEAD#,> +;WBIT - type bits for signal (SNC, etc.) +;TBIT - combined type bits for pins on this wire + +;PIN BLOCK + +SBLOCK +HWDS (PBDY,NXTP) ;BODY POINTER AND NEXT PIN + ;NXTP MUST BE RIGHT HALF POINTER +HWDS (HPNT,NXBP) ;POINTER TO WHEAD AND BODY PIN LINK +HWDS (PID,PINN) ;POINT ID AND PIN # +INDEX__INDEX-1 +HWDS (CBIT,) ;FOR BACK PANEL, PID IS REALLY CBIT +HWDS (PBIT,FILP) ;PIN BITS AND FILENAME POINTER +HWDS (PTYP,RDCN) ;TYPE POINTER AND REDAC LIBRARY NUMBER +INDEX__INDEX-1 +HWDS (HILD,LILD,E,E) ;HI LOADING FOR BP PIN, NOT PTYP, RDCN +EBLOCK PHEAD +HWDS (HOLD,LOLD,E,E) ;LOW LOADING FOR BP PIN. +HWDS (FILO,) ;SOURCE FILE BLOCK POINTER AND UNUSED +EBLOCK BPHEAD +NIL,<PBDY#,NXTP#,HPNT#,NXBP#,PID#,PINN#,CBIT#,PBIT#,FILP#,PTYP#,RDCN#, +HILD#,LILD#,HOLD#,LOLD#,FILO#,BPHEAD#,> + + ;DIP TYPE HEADER BLOCK + +SBLOCK +HWDS (DNAM,NXTD) ;DIPNAME AND NEXT POINTER +HWDS (DPNN,DPIN) ;NUMBER OF PINS ACTUALLY DEFINED ON DIP, DIP PIN LIST +FWD (DTMP) ;TMP CELL FOR DIP COUNTS +HWDS (PRPN,PRPV) ;PROPERTY NAME LIST, PROPERTY VALUE LIST +HWDS (DPAK,) ;PACKAGE CODE FOR DIP +EBLOCK DHEAD +NIL,<DNAM#,NXTD#,DPNN#,DPIN#,DTMP#,PRPN#,PRPV#,DPAK#,DHEAD#,> + +;DIP PIN BLOCK + +SBLOCK +HWDS (DPBIT,DPNXT) ;BITS AND NEXT +FWD (DUSE) ;SIXBIT USE FIELD +HWDS (LHI,LLOW,E,E) ;HI AND LOW LOADING +HWDS (SCTB,SCTP) ;SECT BITS AND SECT PIN # +HWDS (PSWP,DPNM) ;PIN SWAPPING/SHARING # AND PIN NAME +EBLOCK DPHEAD +NIL,<DPBIT#,DPNXT#,DUSE#,LHI#,LLOW#,SCTB#,SCTP#,PSWP#,DPNM#,DPHEAD#,> + +;PROPERTY NAME BLOCK + +SBLOCK +HWDS (PRNN,PRNS) ;NEXT PROPERTY NAME BLOCK AND PROPERTY NAME STRING +EBLOCK PNBK +NIL,<PRNN#,PRNS#,PNBK#,> + +;PROPERTY VALUE BLOCK + +SBLOCK +HWDS (PRBT,PRNV) ;PROPERTY VALUE BITS AND NEXT PROPERTY VALUE BLOCK +HWDS (PRPP,PRNP) ;PREVIOUS PROPERTY VALUE (UP TREE) AND NEXT PROPERTY VALUE (DOWN TREE) +HWDS (PRNB,PRVS) ;PROPERTY NAME BLOCK AND PROPERTY VALUE STRING +EBLOCK PVBK +NIL,<PRBT#,PRNV#,PRPP#,PRNP#,PRNB#,PRVS#,PVBK#,> + +;BACK PANEL MODULE INFO BLOCK + +SBLOCK +HWDS (MNUM,MNXT) ;MODULES PER MACHINE, NEXT MODULE BLOCK +HWDS (MNAM,) ;MODULE NAME STRING +EBLOCK BMOD +NIL,<MNUM#,MNXT#,MNAM#,BMOD#,> + +;PARTS LIST THREAD BLOCK + +SBLOCK +HWDS (PLBT,NXPL) ;PLBK BITS, NEXT PLBK +HWDS (PLPT,MDCN) ;POINTER TO PVBK OF PART NUMBER, MASTER PART COUNT LIST(MDBLOCK) +EBLOCK PLBK +NIL,<PLBT#,NXPL#,PLPT#,MDCN#,PLBK#,> + + ;MASTER COUNT DIPTYPE BLOCK + +SBLOCK +HWDS (MDIP,MDNX) ;DIPTYPE, NEXT (MDBLOCK) +HWDS (,MXPT) ;POINTER TO EXTRA PART BLOCK (MXBLOCK) +EBLOCK MDBLOCK +NIL,<MDIP#,MDNX#,MXPT#,MDBLOCK#,> + +;MASTER COUNT EXTRA PROPERTY BLOCK + +SBLOCK +HWDS (MPRX,MXNX) ;EXTRA PROPERTY LIST, NEXT (MXBLOCK) +HWDS (,MCPT) ;PART COUNT BLOCK POINTER +EBLOCK MXBLOCK +NIL,<MPRX#,MXNX#,MCPT#,MXBLOCK#,> + + +;MASTER COUNT PART COUNT BLOCK + +SBLOCK +HWDS (MODC,MCNX) ;MODULE COUNT BLOCK POINTER (BMOD), NEXT (MCBLOCK) +FWD (MAPP) ;APPROXIMATE COUNT +FWD (MREA) ;REAL COUNT +EBLOCK MCBLOCK +NIL,<MODC#,MCNX#,MAPP#,MREA#,MCBLOCK#,> + + +;DIRECTORY LIST BLOCK + +SBLOCK +HWDS (DEXT,DIRNXT) +FWD (DFIL) +FWD (DPPN) +HWDS (,CVAR) ;CARD AND VARIABLE LIST POINTER (MUST BE RIGHT HALF) +EBLOCK DIRHEAD +NIL,<DEXT#,DIRNXT#,DFIL#,DPPN#,CVAR#,DIRHEAD#,> + + +;CARD LOC AND BOUND BLOCK + +SBLOCK +HWDS (,NSLC) ;NEXT SLICE +HWDS (CDLC,VLST) ;CARD LOC AND VARIABLE LIST POINTER +HWDS (LBND,UBND,E,E) ;UPPER AND LOWER BOUNDS (EXTEND SIGN ON FETCH) +EBLOCK CBND +NIL,<NSLC#,CDLC#,VLST#,LBND#,UBND#,CBND#,> + + +;VARIABLE BLOCK IN VARLIST + +SBLOCK +HWDS (VAL,NVAR,E) ;VALUE(EXTEND SIGN ON FETCH) AND NEXT +HWDS (WID,LET) ;WIDTH,,LETTER +EBLOCK VBLK +NIL,<VAL#,NVAR#,WID#,LET#,VBLK#,> + + +;GND AND VCC PIN BLOCKS FOR ROUTER + +ROUTE,< +SBLOCK +HWDS (PNTR,NWRD) ;PIN POINTER,,NEXT BLOCK +FWD (PNAM) ;PIN NAME +EBLOCK WBLK +>;ROUTE +NIL,<PNTR#,NWRD#,PNAM#,WBLK#,> + + +;CURRENT@VOLTAGE LIST FOR WLS FILE + +SBLOCK +HWDS (VLTS,NXTM,E) ;VOLTS (W/SIGN) AND NEXT BLOCK POINTER +FWD (MAMP) ;# OF MILLIAMPS AT VOLTS +EBLOCK MABLK +NIL,<VLTS#,NXTM#,MAMP#,MABLK#,> + + +;2 WORD TMP LIST BLOCK + +SBLOCK +HWDS (TVAL,NXTT) ;FLAG,, LINK +HWDS (TLFT,TRHT) ;LEFT AND RIGHT TEMP CELLS +EBLOCK TBLK +NIL,<TVAL#,NXTT#,TLFT#,TRHT#,TBLK#,> + + +;COUNT BLOCK FOR WSS, WCS, AND WLS PRINT SUBR +SBLOCK +HWDS (CFIL,NXTC) ;FILE POINTER AND NEXT +HWDS (ICNT,OCNT) ;# INPUTS, #OUTPUTS +HWDS (CCNT,ZCNT) ;# CONNECTORS+BITS, # TERMINATORS +EBLOCK CBLK +NIL,<CFIL#,NXTC#,ICNT#,OCNT#,CCNT#,ZCNT#,CBLK#,> + SUBTTL DATA +DEFINE DATA(LABEL,SIZE) +< +LABEL +IFIDN <SIZE><><BLOCK 1> +IFDIF <SIZE><><BLOCK SIZE> +>;END DATA + +SAVEXT__'DMP' +CMU,<SAVEXT__'SAV'> + +ITS,< VALBFL__=80/5 > ;SIZE OF ITS VALRET BUFFER, 80 CHARACTERS + + LIBPPN_'DATDRW' +CMU,< LIBPPN_<10053,,473002>> ;E130RG02 +DEC,< +NOVIROS,< LIBPPN__0 > +VIROS,< LIBPPN__<4,,253> > +>;DEC +III,<LIBPPN__<10,,76>> + +DIPPPN: LIBPPN + +ZEROBEGIN: +ITS,< + DATA XGP: + DATA XGPVSP: + DATA XGPFNT: + DATA XGPEXT: + DATA XGPPPN: + DATA VALBUF:,VALBFL + DATA IMAGE: +>;ITS + DATA LOADMG: + DATA GNDFLG: + DATA OFFSET: + DATA MSINGL: + DATA USEDWL: + DATA CURDIP: + DATA DEPTH: + DATA VARERR: + DATA SIGCHR: + DATA EXPER2: + DATA DVER: + DATA LOW2UP: + DATA LOSBIT: + DATA LOSNAM: + DATA CONFLG: + DATA WWPBDY: + DATA WWPBIT: + DATA WWPTYP: + DATA WWFILN: + DATA WWPINN: + DATA UPINS:,MAXPIN + DATA STRTAB:,MXSTLN + DATA TPTRP: + DATA TTPTRP: + DATA ANYOVR: + DATA TTYFLG: + DATA SECTMP: + DATA LSTDIP: + DATA LSTBOD: + DATA FSTBOD: + DATA DOOVLP: + DATA NEEDER: + DATA DIDERR: + DATA PRPPTR: + DATA PRXPTR: + DATA PININC: + DATA BSLOT: + DATA BAKBIT: + DATA BAKILD: + DATA BAKOLD: + DATA BAKSFL: + DATA CDSKPC: + DATA GINPIN: + DATA LSLOT: + DATA FSLOT: + DATA TOTDIP: + DATA REALDV: + DATA WLLIST: + DATA REFLST: + DATA PRPLST: + DATA PID: + DATA WIRTMP: + DATA SHRNUM: + DATA PADDLE:,MAXPAD + DATA MROW: + DATA MROWPP: + DATA GSAVE: + DATA UMLEHT: + DATA UMLPGF: + DATA MCOL: + DATA COLLOP: + DATA LSTPIN: + DATA DEFLST: + DATA ERRP: + DATA FACTR1: + DATA FACTR2: + DATA DISPWD: + DATA PROMPT: + DATA DOOXWD: + DATA FSTPNT:,FSTLEN +USAGE,< DATA FSTCNT:,FSTLEN + DATA FSTTMP:,FSTLEN +>;USAGE + DATA FSTOP: + DATA SHIFT: + DATA GOODW: + DATA BADW: + DATA LAST: + DATA SIGN: + DATA SAVEA: + DATA SAVEB: + DATA SAVET: + DATA UUOSAV: + DATA MIN: + DATA DIPLST: + DATA PARTLIST: + DATA NULPART: + DATA LSTPART: + DATA LPRPX: + DATA DIRLST: + DATA IDRLST: + DATA STRING: + DATA DSTRNG: + DATA NEWPNT: + DATA GETCHR: + DATA PUTCHR: + DATA SVPTCH: + DATA SLICE: + DATA SLICEL: + DATA LOWER: + DATA UPPER: + DATA WIDTH: + DATA VARLST: + DATA BESLOC: + DATA BESPIN: + DATA PINLOC: + DATA PINNUM: + DATA PINTMP: + DATA BID: + DATA DEFEXT: + DATA THSFIL: + DATA OLDBOD: + DATA DIPPNT: + DATA LETTER: + DATA NUMBER: + DATA HEADER: + DATA LINCNT: + DATA PAGLEN: + DATA LWIDTH: + DATA MARGIN: + DATA OVRFLW: + DATA SMPCNT: + DATA TCOUNT: + DATA LCOUNT: + DATA NBODS: + DATA RBODS: + DATA NDIPS: + DATA TMPCN1: + DATA TMPCN2: + DATA AMPLST: + DATA LSTHD:,3 + DATA LSTBUF:,210*2 + DATA DATHD:,3 + DATA DATBUF:,210 + DATA LSTNAM: +NODEC,< +NOIII,< DATA (SAVBLK:) ;THIS MUST PRECEDE FILNAM FOR SWAP UUO +>;NOIII +>;NODEC + DATA FILNAM: + DATA FILEXT: + DATA FILDAT: + DATA FILPPN: + DATA ATPPN: +CMU,< DATA PPNBUF:,3 > ;FOR CONVERTING PPN'S + DATA PNTNAM: + DATA PNTEXT: + DATA PNTDAT: + DATA PNTPPN: + DATA ALLNAM: + DATA ALLPPN: + DATA ALLCRD: + DATA SAVFLG: + DATA DEFECL: + DATA ECLBIT: + DATA SAVEP: + DATA NDIG: + DATA MODULE: + DATA MODLST: + DATA MPLTIT: +DEC,< DATA RDCSAV: + DATA RDCSVB: + DATA RDCLIB: + DATA IGNTRM: +>;DEC +NOTTYBT,< + DATA SAVLIN: + DATA BUFPTR: + DATA TTBUF:,=75/5 + TTBEND_.-1 +>;NOTTYBT +ZEROEND__.-1 + DATA PDL:,PDLLEN + DATA PATCH:,100 + DATA ZPPN: +DIPNAM: 'NDIPS ' + 'DIP ' + 0 + 0 + +; ERROR COUNTS FOR WLS SUMMARY, CLEARED BY BLT (LOPSET) +CNTTAB: DATA ANYOUT: + DATA NIN: + DATA NOUT: + DATA NINOUT: + DATA NTRI: + DATA NOC: + DATA NPULL: + DATA NTERM: + DATA NTRMOUT: + DATA NTRMIN: + DATA NULLS: + DATA NCONS: + DATA NGND: + DATA NPWR: + DATA PVOLTS: + DATA ILVOLT: + DATA PMAMPS: +LODTAB: DATA LINL: + DATA LINH: + DATA LOUTL: + DATA LOUTH: + DATA LOCL: + DATA LPULLH: + DATA LTRIL: + DATA LTRIH: +LODLEN__.-LODTAB + +LODSAV: BLOCK LODLEN + +RESIDENT: 0 ;IF SET THIS IS PERMANENT RESIDENT DIPLST +OLDFF: 0 ;SAVED .JBFF + +DATA DSKCNT: +DATA DSKNAM: +DATA DSKEXT: +DATA DSKDAT: +DATA DSKPP: +DATA DSKFLG: +DATA DSKACT: +DATA CBITS: +DATA IDSKHD:,3 +DATA IDSKBF:,203 + +;R$G TO GET BACK AFTER ^C DD. +R: JRST @130 +CPOPJ3:AOS (P) +CPOPJ2:AOS (P) +CPOPJ1:AOS(P) +CPOPJ: POPJ P, + SUBTTL DUMP FILE +;HERE WE SAVE A DUMP FILE OF THIS WIRE LISTER +SAVE: +NODEC,< +NOIII,< + MOVSI T,EXTSAV + MOVEM T,DEFEXT + PUSHJ P,SETFIL + POPJ P, + MOVE T,.JBREL +NOITS,< +NOCMU,< LSH T,-12 + ADDI T,1 + HRLI T,CONT ;STARTUP LOC + MOVSM T,FILDAT +>;NOCMU +>;NOITS +CMU,< PUSH P,.JBSA + HRLM T,.JBSA + PUSH P,FILPPN + SETZM FILPPN ;AT CMU IT'S A NOT A PPN IN THIS ARG! +>;CMU + MOVSI T,'DSK' + MOVEM T,SAVBLK +>;NOIII +>;NODEC + MOVEI T,1(P) + BLT T,17(P) ;BLT 17 AC'S ONTO STACK + MOVEM P,SAVEP +NODEC,< +NOIII,< ADD P,[17,,17] + MOVSI T,SAVBLK + PUSH P,DSKACT ;SAVE OLD STATE + SETZM DSKACT ;HOLD DISK INPUT +ITS,< JRST ITSAVE > ;ITS IS DIFFERENT - PJ +NOITS,< +NOCMU,< SWAP T, > +CMU,< MOVSM T,DMPARG + RESET +EXTERNAL SAVJOB + JSR SAVJOB +DMPARG: 0 + JRST [ HRRE T,FILEXT + JUMPE T,CONT + HALT . ] +>;CMU + POP P,T ;GET OLD STATE + JUMPE T,CONT ;IF ALREADY OFF, JUST CONT + PUSHJ P,DSKCON ;ELSE THIS WILL RESET DSKIN FILE (WE REALLY HAVE A STACK) +>;NOITS +>;NOIII +>;NODEC +IFN DECSW!IIISW,< + SETZM DSKACT + OUTSTR[ASCIZ/SAVE CORE IMAGE WITH "SAVE" COMMAND. +THEN TYPE "START" OR "RUN". +/] + MOVEI T,CONT + HRRM T,.JBSA + EXIT 1, +>;IFN DECSW!IIISW +CONT: OUTSTR[ASCIZ/ +/] +IFN DECSW!IIISW,< + SKIPE DSKFLG + OUTSTR[ASCIZ/DISK INPUT HOLDING, TYPE "XDSKCON" TO CONTINUE IT. +/] +>;IFN DECSW!IIISW +NOCMU,< MOVEI T,STRT + HRRM T,.JBSA ;RESTORE START-UP +>;NOCMU + MOVE P,SAVEP + MOVSI T,1(P) + BLT T,16 ;GET BACK AC'S +CMU,< POP P,FILPPN + POP P,.JBSA +>;CMU + POPJ P, + +ITS,< +ITSAVE: MOVEI T,CONT + HRL T,FSTOP + MOVEM T,.JBSA + PUSHJ P,VALINI ;FLUSH CORE SET POINTERS, ETC. + MOVEI TT,[ASCIZ /Y /] + PUSHJ P,DDTSTR + MOVE TT,FILPPN + PUSHJ P,DDTSIX + MOVEI T,";" + PUSHJ P,DDTPUT + MOVE TT,FILNAM + PUSHJ P,DDTSIX + MOVEI T,40 + PUSHJ P,DDTPUT + MOVE TT,FILEXT + PUSHJ P,DDTSIX + JRST VALRET + +VALINI: HLRZ T,.JBSA ;CORE SIZE + LSH T,-12 ;PAGE # OF HIGHEST LOW PAGE + MOVSI TT,-377(T) ;-# PAGES TO FLUSH + HRRI TT,1(T) ;STARTING 1 PAST LAST PAGE + .CALL [ SETZ ;FLUSH THE DEC COMPATIBLITIY ROUTINES + SIXBIT /CORBLK/ + 1000,,0 ;FLUSH PAGES + 1000,,-1 ;FROM SELF + SETZ TT] + .VALUE + SETZM VALBUF + MOVE TT,[VALBUF,,VALBUF+1] + BLT TT,VALBUF+VALBFL-1 + MOVEI TT,[ASCIZ /: TYPE <cr> TO DUMP ME OUT, OR <control>D TO ABORT  +/] + MOVE TTT,[440700,,VALBUF] +DDTSTR: HRLI TT,440700 +DDTST1: ILDB T,TT + JUMPE T,CPOPJ + PUSHJ P,DDTPUT + JRST DDTST1 + +DDTPUT: IDPB T,TTT + POPJ P, + +DDTSIX: JUMPE TT,CPOPJ + MOVEI T,0 + LSHC T,6 + ADDI T,40 + PUSHJ P,DDTPUT + JRST DDTSIX +>;ITS + SUBTTL IOPAC-UUOCON + +LOC 41 +PUSHJ P,$UUOCON +RELOC + +^$UUOCON:MOVEM T,UUOSAV + LDB T,[POINT 9,40,8] + CAILE T,5 + MOVEI T,0 + MOVE T,(T)[[HALT CPOPJ] + STRPUT + SIXPUT + OUTBYT + .ASK + STRERR] + EXCH T,UUOSAV + JRST 2,@UUOSAV + SUBTTL IOPAC-OUTPUT SUBRS +.ASK: OUTSTR @40 + PUSH P,TTT + PUSHJ P,TTYIN + JFCL + HRRZS -1(P) + CAIE TTT,"Y" + CAIN TTT,"y" + HRROS -1(P) +.ASK1: CAIN TTT,ALTMOD + JRST [ OUTSTR[ASCIZ/ +/] + POP P,TTT + POPJ P,] + CAIN TTT,12 + JRST .ASK2 + PUSHJ P,TTYIN + JFCL + JRST .ASK1 + +.ASK2: POP P,TTT + SKIPGE (P) + AOS (P) + JRST CPOPJ1 + + ;ERRSTR AC,[ASCIZ//] +;PRINT ERROR MESSAGE AT RIGHT SIDE OF PAGE, WITH AC="SERIOUSNESS NUMBER" +STRERR: PUSH P,T + PUSH P,TT + PUSH P,TTT + PUSH P,40 ;SAVE ARGS HERE + SKIPE TTYFLG ;TTY? +NOSKEY,< SKIPA TT,[9*8-2] > ;YES, 8 TABS WORTH +SKEY,< SKIPA TT,[8*8-2] > + MOVEI TT,=13*8-2 ;NO, 13 + HRRZ T,(P) ;START OF STRING + TLOA T,(<POINT 7,0>) ;MAKE IT BYTE POINTER + SUBI TT,1 + ILDB TTT,T + JUMPN TTT,.-2 + PUSH P,TT + CAMG TT,LCOUNT ;AT LEAST ONE BETWEEN US AND LAST THING? + CRLF ;NO, RETURN + MOVE TT,(P) + LSH TT,-3 ;LAST TAB STOP BEFORE OUR STRING + MOVE T,LCOUNT ;GET CURRENT LINE POSITION + LSH T,-3 ;CONVERT BOTH TO TABS + SUB TT,T ;THIS IS HOW MANY TABS WE CAN DO + SKIPA TTT,[11] + XCT PUTCHR + SOJGE TT,.-1 + POP P,T + SUB T,LCOUNT + SKIPA TTT,[40] ;NOW SPACES TO START OF STRING + XCT PUTCHR + SOJGE T,.-1 + HRRZ T,(P) ;START OF STRING + PUSHJ P,STRPT1 ;PRINT ROUTINE + PUTSTR[ASCIZ/ ____ /] + POP P,T ;NOW THE # + LSH T,-=18-5 + ANDI T,17 + PUSHJ P,DECOUT + CRLF + POP P,TTT + POP P,TT + POP P,T + POPJ P, + + ;SIXPUT - OUTPUT ONE WORD OF SIXBIT +SIXPUT: PUSH P,T + PUSH P,TT + PUSH P,TTT + MOVE TT,@40 + PUSHJ P,SIXLOP + POP P,TTT + POP P,TT + POP P,T + POPJ P, + +SIXLOP: JUMPE TT,CPOPJ + SETZ T, + LSHC T,6 + MOVEI TTT,40(T) + XCT PUTCHR + JRST SIXLOP + +OUTBYT: PUSH P,TTT + MOVEI TTT,@40 + XCT PUTCHR + POP P,TTT + POPJ P, + + ;BYTOUT - OUTPUT CHARACTER TO FILE +^F4OUT: CAIN TTT,11 ;CHECK FOR ILLEGAL CHARS, ETC.? + MOVEI TTT,40 + JRST BYTOUT + +^F4CRLF:MOVE TTT,LSTHD+2 + CAIG TTT,2 ;IF NO ROOM FOR LF, THEN + SETZM LSTHD+2 ;FORCE OUTPUT + MOVEI TTT,15 + PUSHJ P,BYTOUT + MOVEI TTT,12 +;FALL INTO BYTOUT +^BYTOUT: +ITS,< SKIPE IMAGE + JRST NOSIMB +>;ITS + JUMPE TTT,CPOPJ +DEC,< TLNE COMLIN ;COMMENT LINE? + SKIPE LCOUNT ;YES, BEGIN LINE? + JRST NOCOML ;NO + CAIE TTT,15 + CAIN TTT,12 + JRST NOCOML ;NOT BEFORE VERTICAL POSITIONING + CAIN TTT,14 + JRST NOCOML + PUSH P,TTT + MOVEI TTT,"/" + PUSHJ P,NOCOML ;PUT OUT COMMENT CHAR + POP P,TTT +NOCOML: +>;DEC + CAIN TTT,11 + JRST BYTTAB +NOSIMB: SOSG LSTHD+2 + OUT LST, + CAIA + JRST [ OUTSTR[ASCIZ/OUTPUT ERROR! +/] + EXIT 1, + POPJ P,] + IDPB TTT,LSTHD+1 +ITS,< SKIPE IMAGE + POPJ P, +>;ITS +.COUNT: CAIN TTT,12 + JRST [ AOS LINCNT ;COUNT ANOTHER LINE + POPJ P,] + CAIN TTT,14 + JRST [ SETZM LINCNT ;JUST IN CASE + POPJ P,] ;FORM FEED DOES NOTHING FOR NOW + CAIN TTT,15 + JRST [ SETZM LCOUNT + POPJ P,] + CAIN TTT,11 + JRST TABCNT + AOS LCOUNT + AOS TCOUNT + POPJ P, + +BYTTAB: TLNN SIMTAB ;MUST WE SIMULATE? + JRST NOSIMB ;NO + PUSH P,TTT +BYTTB1: MOVEI TTT,40 + PUSHJ P,BYTOUT + MOVE TTT,LCOUNT + TRNE TTT,7 ;AT TAB STOP YET? + JRST BYTTB1 + POP P,TTT + POPJ P, + +TABCNT: PUSH P,TTT + MOVE TTT,LCOUNT + ADDI TTT,10 + ANDCMI TTT,7 + EXCH TTT,LCOUNT + SUB TTT,LCOUNT + MOVNS TTT ;HOW MUCH DID TAB MOVE? + ADDM TTT,TCOUNT + POP P,TTT + POPJ P, + + ;FILL, SPFILL, TTYOUT - OUTPUT CHAR TO TTY +FILL: PUTBYT 11 + CAMLE A,LCOUNT ;THERE YET? + JRST FILL + POPJ P, + +SPFILL: PUSH P,A + TRZ A,7 + CAMLE A,LCOUNT + PUSHJ P,FILL + POP P,A + SUB A,LCOUNT + JUMPLE A,CPOPJ + PUTBYT 40 + SOJG A,.-1 + POPJ P, + +TTFILL: PUSH P,A + MOVE A,T + PUSHJ P,TFILL + POP P,A + POPJ P, + +TFILL: SUB A,TCOUNT + JUMPLE A,CPOPJ + PUTBYT 40 + SOJG A,.-1 + POPJ P, + +^TTYOUT:JUMPE TTT,CPOPJ +DEC,< TLNE COMLIN ;COMMENT LINE? + SKIPE LCOUNT ;YES, BEGIN LINE? + JRST NOCOMT ;NO + CAIE TTT,15 + CAIN TTT,12 + JRST NOCOMT ;NOT BEFORE VERTICAL POSITIONING + CAIN TTT,14 + JRST NOCOMT + PUSH P,TTT + MOVEI TTT,"/" + PUSHJ P,NOCOMT ;PUT OUT COMMENT CHAR + POP P,TTT +NOCOMT: +>;DEC + CAIN TTT,11 + JRST TTYTAB +NOSIMT: OUTCHR TTT + JRST .COUNT + +TTYTAB: TLNN SIMTAB ;DO WE HAVE TO SIMULATE TAB? + JRST NOSIMT ;NO + PUSH P,TTT +TTYTB1: MOVEI TTT,40 + PUSHJ P,TTYOUT + MOVE TTT,LCOUNT + TRNE TTT,7 ;ARE WE AT A TAB STOP YET? + JRST TTYTB1 ;NO + POP P,TTT + POPJ P, + + ;FILPNT - PRINT FILE NAME (AT A) +^FILPNT: +NOITS,< + PUTSIX (A) + PUTBYT "." + HLLZ TT,1(A) + PUTSIX TT +DECOS,< SKIPN 3(A) + POPJ P, +>;DECOS + PUTBYT "[" +NOCMU,< HLLZ TT,3(A) + PUSHJ P,LSIXOUT + PUTBYT "," + HRLZ TT,3(A) + PUSHJ P,LSIXOUT +>;NOCMU +CMU,< SKIPN TTT,3(A) + DSKPPN TTT, + MOVE TT,[TTT,,PPNBUF] + DECCMU TT, ;CONVERT DEC PPN TO CMU PPN (ASCIZ) + JRST [ PUTSIX 3(A) ;IF NOT A CMU PPN, PUT IT OUT IN SIXBIT + JRST .+2] + PUTSTR PPNBUF +>;CMU + PUTBYT "]" + POPJ P, +>;NOITS +ITS,< + PUTSIX 3(A) + PUTBYT ";" + PUTSIX (A) + PUTBYT 40 + PUTSIX 1(A) + POPJ P, +>;ITS + + ;LSIXOUT, LOCT, STRPUT +NOCMU,< +^LSIXOUT: +NODEC,< +NOIII,< TLNN TT,777700 + LSH TT,14 + TLNN TT,770000 + LSH TT,6 + JRST SIXLOP ;JUMP INTO PRINT ROUTINE +>;NOIII +>;NODEC +IFN DECSW!IIISW,< HLRZ T,TT +LOCT: IDIVI T,10 + HRLM TT,(P) + JUMPE T,.+2 + PUSHJ P,LOCT + HLRZ TTT,(P) + ADDI TTT,60 + XCT PUTCHR + POPJ P, +>;IFN DECSW!IIISW +>;NOCMU + + ;STRPUT - PUT STRING ROUTINES +STRPUT: PUSH P,T + PUSH P,TT + PUSH P,TTT + MOVEI T,@40 ;SETUP FOR ROUTINES + LDB TT,[POINT 4,40,12] + CAILE TT,MAXSAC + SETZ TT, + PUSHJ P,@SUUOTB(TT) + POP P,TTT + POP P,TT + POP P,T + POPJ P, + +SUUOTB: STRPT1 ;ASCIZ STRING + SIGPUT ; " (BUT DIFFERENT AT DEC) + COMPUT ;OUTPUT COMMENT ONLY + STRBIN ;OUTPUT ASCII TO BINARY MODE FILE + SIGBIN ; " (BUT SIGNAL STUFF AT DEC) + SGUBIN ; " " (PREFIX WITH GLOBAL CHAR) +DEC,< SIGOUT > ;OUTPUT SIGNAL TO TTY +ITS,< STRXGP > ;IMAGE OUTPUT FOR XGP (DON'T COUNT CHARS) +MAXSAC__.-SUUOTB-1 + +ITS,< +STRXGP: SETOM IMAGE + PUSHJ P,STRPT1 + SETZM IMAGE + POPJ P, +>;ITS + +NODEC,<SIGPUT: > +STRPT1: HRLI T,(<POINT 7,0>) +STRPT3: ILDB TTT,T + JUMPE TTT,CPOPJ +STRPT2: XCT PUTCHR + JRST STRPT3 + + ;GNDPUT, SMPPUT - OUTPUT NAME AT LEFT PART OF MARGIN +;T = STRING +;TT = MAX LENGTH,, INDENT COLUMN (?) +^GNDPUT:SETOM GNDFLG + CAIA +^SMPPUT:SETZM GNDFLG + MOVEM TT,SMPCNT ;SAVE LENGTH,,SPACING + SETZM OVRFLW ;NO OVERFLOW YET + HRLI T,(<POINT 7,0>) + SETZM TCOUNT ;CLEAR TMP COUNT + HLRZ TT,SMPCNT ;GET LENGTH + ILDB TTT,T + CAIN TTT,NOTCHR + TLOA NOT + TLZA NOT + ILDB TTT,T + JRST DSTRO4 + +DSTRO0: XCT PUTCHR + ILDB TTT,T +DSTRO4: JUMPE TTT,DSTRO1 +DEC,< CAIE TTT,11 > ;ARE WE AT AP STUFF? + CAIN TTT,";" ;DON'T CONFUSE DAVE WITH COMMENTS + JRST DSTRO1 + SOJGE TT,DSTRO0 + SETOM OVRFLW ;SIGNAL OVERFLOW +DSTRO1: PUSH P,A + HRRZ A,SMPCNT + SUB A,TCOUNT + ADD A,LCOUNT + PUSHJ P,SPFILL + POP P,A + SKIPE GNDFLG + JRST [ PUTSTR [ASCIZ/G /] + POPJ P,] +NODEC,< TLNN NOT + SKIPA TTT,[40] + MOVEI TTT,"-" + XCT PUTCHR + MOVEI TTT,40 + XCT PUTCHR + POPJ P, +>;NODEC +DEC,< LDB TTT,T + CAIA +DSTRO2: ILDB TTT,T + JUMPE TTT,DSTRO3 + CAIN TTT,";" + JRST DSTRO3 + CAIE TTT,11 + JRST DSTRO2 + ILDB TTT,T + TLNE NOT + MOVEI TTT,"-" + XCT PUTCHR ;ASSERTION + ILDB TTT,T + XCT PUTCHR ;POLARITY + POPJ P, + +DSTRO3: MOVEI TTT," " + TLNE NOT + MOVEI TTT,"-" + XCT PUTCHR + MOVEI TTT," " + XCT PUTCHR + POPJ P, +>;DEC + ;SIGOUT, SIGPUT + +DEC,< +;SIGNAL OUT TO TTY +SIGOUT: PUSH P,PUTCHR ;SAVE CURRENT OUTPUT CALL + MOVE TTT,[OUTCHR TTT] + MOVEM TTT,PUTCHR + PUSHJ P,SIGPUT ;PRINT SIGNAL + POP P,PUTCHR + POPJ P, + +SIGPUT: HRLI T,(<POINT 7,0>) +SIGPT0: ILDB TTT,T + JUMPE TTT,CPOPJ + CAIN TTT,";" + JRST STRPT2 ;NO A/P, JUST PRINT REST OF STRING + CAIN TTT,11 + JRST SIGPT1 + XCT PUTCHR + JRST SIGPT0 + +SIGPT1: MOVEI TTT,40 + XCT PUTCHR + ILDB TTT,T + CAIN TTT,40 + JRST STRPT3 + MOVEI TTT,"(" + XCT PUTCHR + LDB TTT,T + XCT PUTCHR + MOVEI TTT,")" + JRST STRPT2 +>;DEC + +STRBIN: PUSHJ P,SETBIN + PUSHJ P,STRPT1 +CLRBIN: PUSHJ P,WRTZERO + SOS TT,LSTHD+2 + IDIVI TT,5 + ADDI TT,1 + MOVEM TT,LSTHD+2 + MOVEI TT,(<POINT 36,0,35>) + HRLM TT,LSTHD+1 + POPJ P, + +SETBIN: SOS TT,LSTHD+2 + IMULI TT,5 + ADDI TT,1 + MOVEM TT,LSTHD+2 + MOVEI TT,(<POINT 7,0,34>) + HRLM TT,LSTHD+1 + POPJ P, + +SIGBIN: PUSHJ P,SETBIN +SIGBN1: PUSHJ P,SIGPUT + JRST CLRBIN + +SGUBIN: PUSHJ P,SETBIN + MOVEI TTT,GLBCHR + XCT PUTCHR + JRST SIGBN1 + +;COMPUT - OUTPUT COMMENT PART ONLY +COMPUT: MOVEI T,@40 + HRLI T,(<POINT 7,0>) +COMOU1: ILDB TTT,T + JUMPE TTT,CPOPJ + CAIE TTT,";" + JRST COMOU1 + JRST STRPT3 + +^STRTTY:PUSH P,PUTCHR + MOVE TTT,[OUTCHR TTT] + MOVEM TTT,PUTCHR + PUSHJ P,STROUT + POP P,PUTCHR + POPJ P, + +;STROUT - PRINT STRING +;A = STRING + +^STROUT:JUMPE A,CPOPJ +STROU2: HRLI A,(<POINT 7,0,35>) +STROU1: ILDB TTT,A + XCT PUTCHR + TLNE A,760000 + JRST STROU1 + HRR A,-1(A) + TRNE A,-1 + JRST STROU1 + POPJ P, + +^MILOUT:IDIVI T,=1000 + PUSH P,TT + PUSHJ P,DECOUT + PUTBYT "." + MOVEI T,3 + MOVEM T,NDIG + POP P,T + JRST NDECOUT + +^LDOUT: SKIPGE T + PUTBYT "-" + MOVM T,T + IDIVI T,=100 + PUSH P,TT + PUSHJ P,DECOUT + PUTBYT "." + MOVEI T,2 + MOVEM T,NDIG + POP P,T + JRST NDECOUT + +^TTYDEC:IDIVI T,=10 + HRLM TT,(P) + JUMPE T,.+2 + PUSHJ P,TTYDEC + HLRZ TT,(P) + ADDI TT,60 + OUTCHR TT + POPJ P, + +^DECOU4:SKIPA TT,[4] +^DECOU5:MOVEI TT,5 + MOVEM TT,NDIG +DECOU6: IDIVI T,=10 + ADDI TT,60 + JUMPN T,DECOU7 + CAIE TT,60 + JRST DECOU7 + MOVE T,NDIG + CAIE T,5 + SUBI TT,20 + SETZ T, +DECOU7: HRLM TT,(P) + SOSG NDIG + JUMPE T,.+2 + PUSHJ P,DECOU6 + HLRZ TT,(P) + PUTBYT (TT) + POPJ P, + SUBTTL IOPAC-INPUT SUBRS +^BYTIN: SOSG DAT,DATHD+2 + IN DAT, + CAIA + JRST [ STATO DAT,1B22 + OUTSTR[ASCIZ/INPUT ERROR! +/] + SETZ TTT, + JRST CPOPJ] + ILDB TTT,DATHD+1 + TRNN ASCFLG + JRST CPOPJ1 + MOVE TTT,@DATHD+1 + TRNN TTT,1 ;FLUSH LINE NUMBERS! + JRST GOTIT + MOVNI TTT,5 + ADDM TTT,DATHD+2 + AOS DATHD+1 + JRST BYTIN +GOTIT: LDB TTT,DATHD+1 + TRNN ASCFLG + JRST CPOPJ1 + CAIE TTT,15 + CAIN TTT,14 + JRST BYTIN + JUMPE TTT,BYTIN + CAIL TTT,"a" + CAILE TTT,"z" + CAIA + SUBI TTT,40 + JRST CPOPJ1 + +^INDCHR:PUSHJ P,BYTIN + POPJ P, +IFN ALTMOD-ALTCHR,< + CAIN TTT,ALTCHR + MOVEI TTT,ALTMOD +>;ALTMOD-ALTCHR + JRST CPOPJ1 + +^TTYINC:SETZM CBITS + SKIPE DSKACT + PUSHJ P,DSKINC + JRST TTYINQ + POPJ P, + +^LETCHK:CAIL TTT,"A" + CAILE TTT,"Z" + CAIA + JRST CPOPJ1 + CAIL TTT,"A"+40 + CAILE TTT,"Z"+40 + POPJ P, + SUBI TTT,40 + JRST CPOPJ1 + +^TTYINB:SETZM CBITS + SKIPE DSKACT + PUSHJ P,DSKINC + JRST TTYINY + POPJ P, + +TTYINY: +NOTTYBT,< + SKIPE SAVLIN ;DO WE NEED SPECIAL CODE? + JRST TTYIN1 ;YES +>;NOTTYBT + INCHWL TTT +TTYINX: CAIN TTT,15 + JRST .-2 +NOSKEY,< CAIN TTT,CBCHR ;CONTROL BIT CHAR? + JRST TTYINZ + CAIN TTT,CTRL + JRST [ MOVEI TTT,200 + IORM TTT,CBITS + JRST TTYINQ] + CAIN TTT,META + JRST [ MOVEI TTT,400 + IORM TTT,CBITS + JRST TTYINQ] + CAIN TTT,CTLMTA + JRST [ MOVEI TTT,600 + IORM TTT,CBITS + JRST TTYINQ] +>;NOSKEY +ESCMP,< CAIL TTT,175 + CAILE TTT,176 + CAIN TTT,33 + JRST TTYINZ ;ALTMODE HACK + CAIN TTT,177 ;RUBOUT? + JRST [ SKIPN CBITS ;IF ALTMODES TYPED? + JRST .+1 + OUTSTR[ASCIZ/ XXX /] + JRST TTYINB] ;THEN FLUSH THEM AND START AGAIN +>;ESCMP + IOR TTT,CBITS + POPJ P, + +TTYINZ: MOVEI TTT,200 + ADD TTT,CBITS + ANDI TTT,600 + MOVEM TTT,CBITS +SKEY,< JUMPE TTT,[MOVEI TTT,ALTMOD + POPJ P,] +>;SKEY +TTYINQ: INCHRW TTT + JRST TTYINX + +NOTTYBT,< +^LINCLR:PUSH P,BUFPTR + SETZ TTT, + IDPB TTT,BUFPTR + POP P,BUFPTR + POPJ P, + +TTYIN2: MOVEI TTT,0 + IDPB TTT,BUFPTR + MOVE TTT,[POINT 7,TTBUF] + MOVEM TTT,BUFPTR +TTYIN1: ILDB TTT,BUFPTR + JUMPN TTT,CPOPJ +TTYIN4: MOVE TTT,[POINT 7,TTBUF] + MOVEM TTT,BUFPTR + SETZM TTBEND +TTYIN5: INCHRW TTT + JUMPE TTT,TTYIN5 + CAIN TTT,15 + JRST TTYIN5 + CAIN TTT,177 + JRST TTYIN3 + CAIN TTT,"" + JRST TTYIN4 + CAIGE TTT,175 + CAIN TTT,33 + MOVEI TTT,ALTMOD + IDPB TTT,BUFPTR + CAIE TTT,11 + CAIN TTT,12 + JRST TTYIN2 + CAIE TTT,ALTMOD + SKIPE TTBEND + JRST TTYIN2 + JRST TTYIN5 + +TTYIN3: REPEAT 4,< IBP BUFPTR > + SOS TTT,BUFPTR + CAMN TTT,[POINT 7,TTBUF-1,27] + JRST TTYIN4 + JRST TTYIN5 +>;NOTTYBT +^TTYIN: PUSHJ P,TTYINB +STANFO,<CAIN TTT,612 ;THIS IS SPECIAL + POPJ P, ;GIVE EOF RETURN +>;STANFO + ANDI TTT,177 + CAIN TTT,15 ;IGNORE CR'S HERE + JRST TTYIN + JRST CPOPJ1 + +^DSKINC:SOSG IDSKHD+2 + IN IDSK, + CAIA + JRST [ STATO IDSK,1B22 + OUTSTR[ASCIZ/ +INPUT ERROR ON INDIRECT FILE!/] + OUTSTR[ASCIZ/ +END OF INDIRECT FILE! +/] + SETZM DSKFLG + SETZM DSKACT + RELEASE IDSK, + POPJ P,] + AOS DSKCNT ;COUNT CHAR (REGARDLESS OF WHAT IT IS) + IBP IDSKHD+1 + MOVE TTT,@IDSKHD+1 + TRNN TTT,1 + JRST DSKIND + MOVNI TTT,5 + ADDM TTT,IDSKHD+2 + AOS IDSKHD+1 + JRST DSKINC + +DSKIND: LDB TTT,IDSKHD+1 + JUMPE TTT,DSKINC +NOSKEY,< CAIN TTT,CBCHR + JRST [ MOVEI TTT,200 + ADD TTT,CBITS + ANDI TTT,600 + MOVEM TTT,CBITS + SKIPE DSKACT + OUTCHR [CBCHR] + JRST DSKINC ] + CAIN TTT,CTRL + JRST [ MOVEI TTT,200 + IORM TTT,CBITS + SKIPE DSKACT + OUTCHR[CTRL] + JRST DSKINC] + CAIN TTT,META + JRST [ MOVEI TTT,400 + IORM TTT,CBITS + SKIPE DSKACT + OUTCHR[META] + JRST DSKINC] + CAIN TTT,CTLMTA + JRST [ MOVEI TTT,600 + IORM TTT,CBITS + SKIPE DSKACT + OUTCHR[CTLMTA] + JRST DSKINC] +>;NOSKEY +SKEY,< CAIN TTT,33 + JRST [ SKIPE DSKACT + OUTCHR["$"] + MOVEI TTT,200 + ADD TTT,CBITS + ANDI TTT,600 + MOVEM TTT,CBITS + JUMPN TTT,DSKINC + MOVEI TTT,ALTMOD + JRST NXDACT] +>;SKEY + CAIE TTT,14 + CAIN TTT,15 + JRST DSKINC +IFN ALTMOD-ALTCHR,< + CAIN TTT,ALTCHR + MOVEI TTT,ALTMOD +>;ALTMOD-ALTCHR + SKIPN DSKACT + JRST NXDACT + CAIN TTT,12 + OUTCHR[15] +DECOS,< CAIGE TTT,40 + JRST [ CAIE TTT,11 + CAIN TTT,12 + JRST .+1 + OUTCHR["^"] + ADDI TTT,100 + OUTCHR TTT + SUBI TTT,100 + JRST NXDACT] +>;DECOS + OUTCHR TTT +NXDACT: IOR TTT,CBITS + SETZM CBITS + JRST CPOPJ1 + +^IN0: INIT DAT,0 + 'DSK ' + DATHD + JRST [LOSIN: OUTSTR[ASCIZ/INIT FAILED OF DSK! +/] + EXIT 1, + POPJ P,] + TRO ASCFLG +SETIN: MOVEI T,DATBUF + EXCH T,.JBFF + INBUF DAT,1 + MOVEM T,.JBFF + JRST CPOPJ1 + +^IN10: INIT DAT,10 + 'DSK ' + DATHD + JRST LOSIN + TRZ ASCFLG + JRST SETIN + +^GETWRT:SETZ A, + MOVE T,[POINT 6,A] +GETWR1: CAIE TTT,ALTMOD + CAIGE TTT,40 + JRST CPOPJ1 + CAIL TTT,140 + SUBI TTT,40 + SUBI TTT,40 + TLNE T,770000 + IDPB TTT,T +GETWR2: XCT GETCHR + POPJ P, + CAIE TTT,14 + CAIN TTT,15 + JRST GETWR2 + JRST GETWR1 + +^GETWRN:SETZ A, + MOVE T,[POINT 6,A] + PUSHJ P,CHRCK1 + POPJ P, + JRST CKSPC + JRST CHROK + +ITS,< +^FILWRD: + SETZ A, + MOVE T,[POINT 6,A] +FILW1: XCT GETCHR + POPJ P, +FILW2: CAIE TTT,11 + CAIN TTT,40 + JRST FILW1 + JRST FILW4 +FILW3: XCT GETCHR + POPJ P, +FILW4: CAIE TTT,14 + CAIN TTT,15 + JRST FILW3 + CAIL TTT,"a" + CAILE TTT,"z" + CAIA + SUBI TTT,40 ;LOWER CASE + CAIL TTT,40 + CAILE TTT,"_" + JRST CPOPJ1 ;NOT SIXBIT + CAIE TTT,11 + CAIN TTT,40 + JRST CPOPJ1 + CAIN TTT,";" + JRST CPOPJ1 + SUBI TTT,40 + TLNE T,770000 + IDPB TTT,T + JRST FILW3 +>;ITS + +NOCMU,< +^RDPPN: +IFN DECSW!IIISW,< + SETZ A, +OCTSPC: XCT GETCHR + POPJ P, + CAIE TTT,11 + CAIN TTT,40 + JRST OCTSPC +GETOCT: CAIL TTT,"0" + CAILE TTT,"7" + JRST CPOPJ1 + ASH A,3 + ADDI A,-60(TTT) + XCT GETCHR + POPJ P, + JRST GETOCT +>;IFN DECSW!IIISW +NODEC,< +NOIII,< PUSHJ P,GETWRD + POPJ P, + HLRZ A,A + TRNN A,7777 + LSH A,-14 + TRNN A,77 + LSH A,-6 + JRST CPOPJ1 +>;NOIII +>;NODEC +>;NOCMU + +^GETWRD: + SETZ A, + MOVE T,[POINT 6,A] +SKPSPC: PUSHJ P,CHRCHK + POPJ P, ;EOF + JRST CKSPC ;BREAK CHAR. + JRST CHROK + +CKSPC: CAIE TTT,11 + CAIN TTT,40 + JRST SKPSPC + JRST CPOPJ1 ;BREAK ALREADY + +CHRGET: PUSHJ P,CHRCHK + POPJ P, ;EOF + JRST CPOPJ1 ;BREAK CHARACTER +CHROK: SUBI TTT,40 + TLNE T,770000 ;END OF WORD? + IDPB TTT,T ;NO + JRST CHRGET + +CHRCHK: XCT GETCHR + POPJ P, +CHRCK1: CAIE TTT,14 + CAIN TTT,15 + JRST CHRCHK + CAIL TTT,"0" + CAILE TTT,"9" + CAIA + JRST CPOPJ2 + CAIL TTT,"a" + CAILE TTT,"z" + CAIA + SUBI TTT,40 ;CHANGE UPPER TO LOWER + CAIL TTT,"A" + CAILE TTT,"Z" + JRST CPOPJ1 + JRST CPOPJ2 + +^SLDECIN:CAIE TTT,"-" + JRST LDECIN + XCT GETCHR + POPJ P, + PUSHJ P,LDECIN + POPJ P, + MOVN A,A + JRST CPOPJ1 + +^LDECIN:PUSHJ P,TDECIN + POPJ P, + IMULI A,=100 + CAIE TTT,"." + JRST CPOPJ1 + PUSH P,B + MOVEI B,=10 ;MULTIPLIER +LDEC1: XCT GETCHR + JRST [ POP P,B + POPJ P,] + CAIG TTT,"9" + CAIGE TTT,"0" + JRST [ POP P,B + JRST CPOPJ1] + SUBI TTT,60 + IMUL TTT,B + ADD A,TTT + IDIVI B,=10 + JRST LDEC1 + +^SDECIN:XCT GETCHR + JRST [ SETZ A, + POPJ P,] + CAIE TTT,"-" + JRST TDECIN + PUSHJ P,DECIN + SOS (P) ;FLAG EOF, BUT NEGATE ANYWAY + MOVN A,A + JRST CPOPJ1 + +^DECIN: XCT GETCHR + JRST [ SETZ A, + POPJ P,] +^TDECIN:CAIE TTT,11 + CAIN TTT,40 + JRST DECIN + SETZ A, + JRST DECLP1 +DECLOP: XCT GETCHR + POPJ P, +DECLP1: CAIL TTT,"0" + CAILE TTT,"9" + JRST CPOPJ1 + IMULI A,=10 + ADDI A,-60(TTT) + AOS NDIG + JRST DECLOP + +^O6IN: MOVEI T,6 + SETZ A, +OIN: XCT GETCHR + POPJ P, + ANDI TTT,7 + LSH A,3 + IOR A,TTT + SOJG T,OIN + JRST CPOPJ1 + +^I3IN: SKIPA T,[3] +^I5IN: MOVEI T,5 + SETZ A, + XCT GETCHR + POPJ P, + CAIN TTT,12 + JRST CPOPJ1 + JRST IIN1 + +IIN: XCT GETCHR + POPJ P, +IIN1: IMULI A,=10 + ANDI TTT,17 + ADD A,TTT + SOJG T,IIN + JRST CPOPJ2 + + SUBTTL SUBRS CALLED BY PERMUT +^^SIGGET:ILDB TTT,A + POPJ P, + +^^GETVAR:MOVE TT,VARLST + PUSH P,TTT +GETVR1: FETCH(TTT,TT,LET) + CAMN TTT,(P) + JRST ISVAR ;YES + FETCH(TT,TT,NVAR) + JUMPN TT,GETVR1 + POP P,TTT + SETOM EXPER2 ;VARIABLE ERROR + MOVEI TT,1 + LSH TT,-"A"(TTT) + TDNE TT,VARERR ;HAVE WE HAD THIS ERROR ALREADY? + JRST GETVR2 + IORM TT,VARERR ;NO, SAVE IT + PUTSTR[ASCIZ/NO VALUE FOR VARIABLE "/] + PUTBYT (TTT) + PUTSTR[ASCIZ/". +/] + POPJ P, ;ERROR RETURN SO SIGNAL WILL PRINT + +GETVR2: SETZ TT, ;IF NO VAR ERROR PRINT, THE GIVE OK RETURN + JRST CPOPJ1 + +ISVAR: FETCH(TTT,TT,WID) + CAMLE TTT,NDIG + MOVEM TTT,NDIG + FETCH(TT,TT,VAL) ;RETURN VALUE + POP P,TTT + JRST CPOPJ1 + +WHERRP: PUTSTR[ASCIZ/CAUSED BY SIGNAL - /] + PUTSIG ADDR(G,SPNT) + PUTSTR[ASCIZ/ +/] + POPJ P, + SUBTTL RSTR, TRSTR +;RSTR - READ STRING +;SKIPS IF GOT STRING +;T = STRING + +^RSTR: XCT GETCHR + SETZ TTT, + JUMPE TTT,CPOPJ + GETFS (T) + SETZM (T) + HRLM T,(P) + JRST RSTR2 + +RSTR1: GETFS (TT) + SETZM (TT) + HRRM TT,(T) + MOVE T,TT +RSTR2: MOVEM TTT,1(T) + TRNE TTT,377 + XCT GETCHR + JRST RSTR3 + JUMPN TTT,RSTR1 +RSTR3: HLRZ T,(P) + JRST CPOPJ1 + +^TISTRU: SETOM LOW2UP + JRST ISTR0 + +^ISTR: SETZM LOW2UP + XCT GETCHR + POPJ P, +ISTR0: CAIN TTT,ALTMOD + JRST CPOPJ1 + CAIE TTT,11 + CAIN TTT,12 + JRST CPOPJ2 + GETFS(B) + SETZM (B) + SETZM 1(B) + MOVSI TT,(<POINT 7,0>) + HRRI TT,1(B) +ISTR1: TLNE TT,760000 + JRST ISTR2 + PUSH P,TTT + GETFS(TTT) + SETZM (TTT) + SETZM 1(TTT) + HRRM TTT,-1(TT) + HRR TT,TTT + POP P,TTT +ISTR2: SKIPN LOW2UP + JRST ISTR3 + CAIL TTT,"A"+40 + CAILE TTT,"Z"+40 + CAIA + SUBI TTT,40 +ISTR3: IDPB TTT,TT + XCT GETCHR + POPJ P, + CAIN TTT,ALTMOD + JRST [ PUSHJ P,PUTFS + JRST CPOPJ1] + CAIE TTT,11 + CAIN TTT,12 + JRST CPOPJ3 + JRST ISTR1 + + +;TRSTR - READ INTO STRTAB, CHECK FOR SIZE OVERFLOW, NULL STRING +^TRSTR: MOVE T,[-MXSTLN,,STRTAB] +TRSTR1: XCT GETCHR + POPJ P, + MOVEM TTT,(T) + TRNE TTT,376 ;END OF ASCIZ? + AOBJN T,TRSTR1 + JUMPL T,TRSTR3 ;END OK? + TRZ TTT,377 + MOVEM TTT,(T) ;STORE WORD WITH ONE CHAR ZEROED + OUTSTR[ASCIZ/STRING TOO LONG, TRUNCATED TO: +/] + OUTSTR STRTAB + OUTSTR[ASCIZ/ +/] +TRSTR2: XCT GETCHR + POPJ P, + TRNE TTT,376 + JRST TRSTR2 +TRSTR3: SKIPE STRTAB + AOS (P) + JRST CPOPJ1 + +^TTYSIG:PUSHJ P,SIGIN + JFCL ;EOF RETURN + SKIPE STRTAB + CAIN TTT,ALTMOD + POPJ P, ;NULL RETURN ON ALTMODE + CAIE TTT,11 + JRST CPOPJ1 +TTYSKP: XCT GETCHR + JRST TTYSK1 + CAIE TTT,12 + CAIN TTT,ALTMOD + JRST TTYSK1 + JRST TTYSKP + +TTYSK1: OUTSTR[ASCIZ/ILLEGAL TAB IN SIGNAL NAME! +/] + POPJ P, + +^SIGIN: MOVE T,[POINT 7,STRTAB] + SETZM STRTAB ;FOR TEST LATER +TTYSG1: XCT GETCHR + JRST [ SKIPN STRTAB + POPJ P, ;GIVE EOF RETURN IF NO STRING + MOVEI TTT,12 + JRST TTYSG3] + CAIN TTT,ALTMOD + POPJ P, + CAIE TTT,11 + CAIN TTT,12 + JRST TTYSG3 + CAMN T,[POINT 7,STRTAB+MXSTLN-1,27] + JRST [ OUTSTR[ASCIZ/STRING TOO LONG, TRUNCATING! +/] + TTYSG2: XCT GETCHR + MOVEI TTT,12 + CAIE TTT,12 + CAIN TTT,ALTMOD + POPJ P, + JRST TTYSG2] + IDPB TTT,T + JRST TTYSG1 + +TTYSG3: SETZ TT, ;END FINISH OUT + IDPB TT,T + TLNE T,760000 + JRST .-2 + JRST CPOPJ1 + SUBTTL FREE STORAGE ROUTINES + +^FSTINI:MOVEI T,[0] ;GET A POINTER TO A 0 + MOVEM T,FSTPNT + MOVE T,[FSTPNT,,FSTPNT+1] + BLT T,FSTPNT+FSTLEN-1 ;FILL TABLE + MOVE T,.JBFF + MOVEM T,FSTOP ;SET AS TOP OF DIVIDED CORE + CORE T, ;MAYBE CORE DOWN + JFCL ;IGNORE ERROR + POPJ P, + + +^NOFST: 0 + MOVEM A,SAVEA + MOVEM B,SAVEB + MOVE B,@NOFST ;GET POINTER INTO FS TABLE +CHKFST: +III,< SKIPN A,.JBHRL > + MOVE A,.JBREL + SUB A,FSTOP + CAIL A,-FSTPNT(B) ;ENOUGH? + JRST ISFST1 ;YES +NOFST3: +III,< SKIPN A,.JBHRL > + MOVE A,.JBREL + ADDI A,2000 ;ANOTHER K +III,< TRNE A,400000 ;OVER 128K? + JRST [ MOVSS A ;YES, SPLIT INTO TWO SEGS + HRRI A,377777 + JRST .+1] +>;III + CORE A, + JRST [ OUTSTR[ASCIZ/CORE UUO FAILED AT NOFST! +/] + EXIT 1, + JRST NOFST3] +III,< SKIPE .JBHRL ;USING 2 SEGS? + PUSHJ P,TRYUWP +>;III + JRST CHKFST + + +III,< +TRYUWP: MOVEI A,0 ;WRITE PERMIT THE UPPER + SETUWP A, + CAIA + POPJ P, + OUTSTR [ASCIZ / + ## LOSE BIG - CAN'T WRITE PERMIT THE UPPER SEGMENT ## +/] + EXIT 1, + JRST TRYUWP +>;III + +ISFST1: MOVE A,FSTOP + EXCH A,(B) + HRRZM A,@(B) +USAGE,< AOS FSTCNT-FSTPNT(B) ;INC COUNT> + MOVEI A,-FSTPNT+1(B) ;THIS IS LENGTH OF NEW BLOCK + ADDM A,FSTOP ;ADVANCE FSTOP + MOVE B,SAVEB + MOVE A,SAVEA + SOS NOFST + SOS NOFST ;RETURN TO SKIPN + JRST @NOFST + +^MORCOR: 0 + MOVEM A,SAVEA +NOIII,< AOS A,.JBREL > +III,< MOVE A,MORCOR + LDB A,[POINT 4,-2(A),12] ;AC FIELD OF COMPARE + CAIE A,A + SKIPA A,(A) + MOVE A,SAVEA + CAMG A,.JBHRL + JRST MRCRE2 + SKIPN .JBHRL + AOSA A,.JBREL + AOS A,.JBHRL + TRNE A,400000 ;OVER128K? + JRST [ MOVSS A ;SPLIT INTO 2 SEGS + HRRI A,377777 + JRST .+1] +>;III + PUSH P,A + CORE A, + JRST [ OUTSTR[ASCIZ/CORE UUO FAILED AT MORCOR! +/] + EXIT 1, + MOVE A,(P) + JRST .-2] + POP P,A +III,< SKIPE .JBHRL ;USING TWO SEGS? + PUSHJ P,TRYUWP +>;III + MOVNI A,2 + ADDM A,MORCOR ;RETURN TO TEST INSTRUCTION +MRCRE2: MOVE A,SAVEA + JRST @MORCOR + +^TPUTFS:MOVE B,T +^PUTFS: HLLI B, + JUMPE B,CPOPJ + PUSH P,T + MOVS T,FSTPNT+1 + HRRZM B,FSTPNT+1 +PUTFS1: HRR T,B + HRRZS B,(B) ;PICKUP LINK, CLEAR LH + JUMPN B,PUTFS1 + HLRZM T,(T) ;LINK END TO OLD FS LIST + POP P,T + POPJ P, + + SUBTTL TEXT ROUTINES +;CALL WITH POINTER TO ASCIZ STRING IN TT +;RETURNS WITH FS STRING IN T +;CLOBBERS TT AND TTT +ASCCOP: GETFS(T) + PUSH P,T +ASCCP1: MOVE TTT,(TT) + MOVEM TTT,1(T) + TRNN TTT,376 + JRST ASCCP2 + SKIPN 1(TT) + JRST ASCCP2 + GETFS(TTT) + HRRZM TTT,(T) + MOVE T,TTT + AOJA TT,ASCCP1 + +ASCCP2: SETZM (T) + POP P,T + POPJ P, + +;CALL WITH POINTER TO FS STRING IN TT +;RETURNS WITH COPY OF STRING IN T +;CLOBBERS TT AND TTT +LSTCOP: GETFS(T) + HRLM T,(P) + JRST LSTCP1 + +LSTCP2: GETFS(TTT) + MOVEM TTT,(T) + MOVE T,TTT +LSTCP1: MOVE TTT,1(TT) + MOVEM TTT,1(T) + HRRZ TT,(TT) + JUMPN TT,LSTCP2 + SETZM (T) + HLRZ T,(P) + POPJ P, + ;TXTMAT - MATCH TEXT STRINGS +;T = STRING 1 +;TT = STRING 2 +;RETURNS +; UNEQUAL, T .LT. TT +; UNEQUAL, T .GT. TT +; EQUAL + +;TXTPAR - ACCEPT PARTIAL MATCH +;RETURNS +; NO MATCH +; T .GT. TT +; PARTIAL MATCH, T SUBSTRING OF TT +; EXACT MATCH, T = TT + +^TXTPAR:PUSHJ P,TXTMAT + JRST TXTPR1 + JRST CPOPJ1 ;TT LESS THAN T, JUST INDICATE THIS + JRST CPOPJ3 ;EXACT + +TXTPR1: JUMPE T,CPOPJ2 ;IF T ENDS, THEN PARTIAL MATCH + ADD TT,[POINT 7,1] + PUSHJ P,ASCPR0 + POPJ P, + JRST CPOPJ2 ;PARTIAL MATCH + +TXTMA2: MOVE TTT,1(T) + CAME TTT,1(TT) + JRST TXTMA1 + HRRZ T,(T) + HRRZ TT,(TT) +^TXTMAT:JUMPE T,[JUMPE TT,CPOPJ2 ;EQUAL + POPJ P,] ;UNEQUAL T LESS THAN TT + JUMPN TT,TXTMA2 + JRST CPOPJ1 ;UNEQUAL TT LESS THAN T + +TXTMA1: LSH TTT,-1 + PUSH P,TT + MOVE TT,1(TT) + LSH TT,-1 + CAML TTT,TT + AOS -1(P) ;UNEQUAL TT LESS THAN T + POP P,TT + POPJ P, ;UNEQUAL T LESS THAN TT + + ;TEXT MATCHING ROUTINES +;ASCPAR - PARTIAL MATCH +;T = STRING +;TT = ASCIZ +;RETURNS +; UNEQUAL +; PARTIAL MATCH, T SUBSTRING OF TT +; EXACT MATCH + +^ASCPAR:PUSHJ P,ASCMAT + CAIA + JRST CPOPJ2 ;DOUBLE SKIP FOR EXACT MATCH + JUMPE T,CPOPJ1 ;IF FS STRING ENDS, THEN PARTIAL MATCH + HRLI TT,(<POINT 7,0>) +ASCPR0: ADD T,[POINT 7,1] + PUSH P,A +ASCPR1: ILDB TTT,T + JUMPE TTT,[POP P,A + JRST CPOPJ1] ;IF FS STRING ENDS, THEN PARTIAL MATCH + ILDB A,TT + CAMN A,TTT + JRST ASCPR1 + POP P,A + POPJ P, ;NO MATCH AT ALL + +;ASCMAT - MATCH STRING AGAINST ASCIZ +;T = STRING +;TT = ASCIZ +;RETURNS +; UNEQUAL +; MATCH + +^ASCMAT:MOVE TTT,(TT) + CAME TTT,1(T) + POPJ P, + ADDI TT,1 + HRRZ T,(T) + JUMPN T,ASCMAT + TRNE TTT,376 + SKIPN (TT) + AOS (P) + POPJ P, + +;SEQMAT - COMPARE STRING AGAINST ASCIZ +;T = STRING +;TT = ASCIZ +;RETURNS +; T .LT. TT +; T .GT. TT +; T EQUAL TT + +^SEQMAT:MOVE TTT,(TT) + CAME TTT,(T) + JRST SEQMT1 + TRNN TTT,376 + JRST [ AOS (P) + MOVE TTT,(T) + TRNN TTT,376 + AOS (P) ;T=TT + POPJ P,] ;TT LESS THAN T + MOVE TTT,(T) + TRNN TTT,376 + POPJ P, ;T LESS THAN TT + ADDI TT,1 + AOJA T,SEQMAT + +SEQMT1: LSH TTT,-1 + MOVE TT,(T) + LSH TT,-1 + CAML TT,TTT + AOS (P) ;TT LESS THAN T + POPJ P, ;T LESS THAN TT + SUBTTL TOP LEVEL + +CLEARS: SETZ + SETZM ZEROBEGIN + MOVE T,[XWD ZEROBEGIN,ZEROBEGIN+1] + BLT T,ZEROEND + MOVSI T,DIRLST + MOVEM T,DIRLST + PUSHJ P,CLPAGE ;INIT PAGE LENGTH + PUSHJ P,CLRWID ;INIT LINE LENGTH + PUSHJ P,CLRNOM ;INITIALIZE BOARD TYPE POINTERS + PUSHJ P,CLRWW + PUSHJ P,CLOADM ;RESET LOAD MARGIN TO 100% + JRST FSTINI ;INITIALIZE FREE STORAGE! + +UNRESI: SKIPN RESIDENT + POPJ P, + SETZM RESIDENT + MOVE T,OLDFF + HRLM T,.JBSA + MOVEM T,.JBFF + POPJ P, + +STRESI: ASK [ASCIZ /THIS WILL FLUSH ALL WIRELISTS, +READ IN DIP DEFINITIONS, +AND LOCK THEM DOWN. TYPE "Y" TO GO ON. /] + POPJ P, ;LET HIM OUT + POPJ P, ;LET HIM OUT +REE: MOVE P,[IOWD PDLLEN,PDL] + PUSHJ P,UNRESI + RESET + PUSHJ P,CLEARS + PUSHJ P,DIPCHK + OUTSTR[ASCIZ/MOBY LOSSAGE FROM DIPCHK AT RESIDENT DIPLST CODE! +/] + MOVE T,DIPLST + JUMPE T,STRT + MOVEM T,RESIDENT + HLRZ T,.JBSA + MOVEM T,OLDFF ;REMEMBER OLD .JBFF + MOVE T,FSTOP ;THIS IS FIRST WORD WE AREN'T USING + HRLM T,.JBSA +ITS,< + PUSHJ P,VALINI ;FLUSH ALL EXTRA CORE, AND THE SIMULATOR + MOVEI TT,[ASCIZ /Y DATDRW;WL BIN/] + PUSHJ P,DDTSTR ;PUT OUT FINAL STRING +VALRET: MOVEI T,0 + PUSHJ P,DDTPUT ;AND A NULL FOR GOOD MEASURE + MOVEI T,VALBUF+VALBFL + SUBI T,(TTT) + SKIPG T + .VALUE [ASCIZ /: VALRET BUFFER OVERFLOW, PROCEED AT YOUR OWN RISK  +/] + .VALUE VALBUF + .BREAK 16,60000 ;AUTO EXPUNGE +>;ITS +STRT: MOVE P,[IOWD PDLLEN,PDL] + RESET + SETZM DSKFLG ;CLEAR DSKIN + SETZM DSKACT ;AND ACTIVE + SETZM ZPPN ;INITIALIZE DEFAULT INPUT PPN +STRTC: PUSHJ P,CLEARS ;CLEAR TABLES + MOVE T,RESIDENT ;RESIDENT DIPS? + MOVEM T,DIPLST ;STORE POINTER + PUSHJ P,THREAD ;THREAD ANY PART NUMBERS WE HAVE NOW + PUSHJ P,TOPMOD ;TOP MODE + PUSHJ P,WIRINI ;SET DEFAULT WIRE LIST +MAIN: HRRZ T,DIRLST + SKIPE T ;EMPTY LIST? + PUSHJ P,DIRRET ;NO, RETURN LIST FROM LAST LOSER + SKIPE B,IDRLST + PUSHJ P,IDRRET ;NO, RETURN LIST FROM LAST LOSER + SETZM VARLST ;NO VARS NOW + RELEASE DAT, ;FLUSH ANY IO THAT WAS GOING ON + RELEASE LST, ;POSSIBLE IERROR FILE ALSO + OUTSTR @PROMPT ;PRINT APPROPRIATE PROMPT +CMU,< PUSHJ P,TTYINC > ;READ TTY IN CHAR MODE TO GOBBLE CBCHR +NOCMU,< PUSHJ P,TTYINB > ;ITS A LOSER WHEN I CHANGE MY MIND ABOUT WHAT I TYPED + MOVE A,TTT + LDB B,[POINT 2,A,28] + ANDI A,177 + CAIL A,"a" + CAILE A,"z" + CAIA + SUBI A,40 + XCT @DISPWD + JRST MAIN + JRST ERRET + +CERRET:SKIPE DSKACT + JRST IERRET + OUTSTR[ASCIZ/??? +/] + JRST GOMAIN + +NERRET:SKIPE DSKACT + JRST IERRET + JRST ERRET1 + +FUCKUP: OUTSTR [ASCIZ / +Ghastly internal error, fetch a wizard, quick! +/] + HALT .+1 + POPJ P, + +ERRET: SKIPE DSKACT + JRST IERRET + OUTSTR[ASCIZ/??? +/] + JRST ERRET1 + +IERRET: RELEASE IDSK, + SETZM DSKACT + OUTSTR[ASCIZ/ERROR IN DSKIN FILE, DSKHLD DONE! +/] +ERRET1: INCHSL A ;NOW FLUSH ANY INPUT + JRST GOMAIN + CAIE T,12 + CAIN T,ALTMOD + JRST GOMAIN + JRST ERRET1 + +GOMAIN: MOVE P,[IOWD PDLLEN,PDL] + JRST MAIN + +DDTCAL: SKIPN TT,.JBDDT + JRST [ OUTSTR[ASCIZ/SORRY, NO DDT! +/] + POPJ P,] + MOVE T,[10000,,CPOPJ] + MOVEM T,.JBOPC + JRST (TT) + +DOEXIT: EXIT 1, + JRST STRT + + +;dtb:,command,com: +TOPTAB: CAIA +FOR I_1,11 +< CAIA +> + OUTCHR[15] +FOR I_13,77 +< CAIA +> + PUSHJ P,DSKIN ; @ + CAIA ; A + XCT (B)[JRST ERRET ; B + PUSHJ P,BREADD + PUSHJ P,RDPART + PUSHJ P,READEQ] + XCT (B)[JRST ERRET ; C + PUSHJ P,WIRCOM + PUSHJ P,DIPCOM + PUSHJ P,WDECO] + XCT (B)[JRST ERRET ; D + JRST ERRET + JRST ERRET + PUSHJ P,DIPMOD] + JRST DOEXIT ;E + CAIA ;F + CAIA ;G + CAIA ;H + XCT (B)[JRST ERRET ;I + PUSHJ P,WREADD + PUSHJ P,WREADP + PUSHJ P,RDWEQ] + CAIA ;J + CAIA ;K + XCT (B)[JRST ERRET ;L + PUSHJ P,LIST + PUSHJ P,SUMLST + PUSHJ P,USEPIN] + CAIA ;M + XCT (B)[JRST ERRET ;N + PUSHJ P,NTITLE + JRST ERRET + JRST ERRET] + CAIA ;O + XCT (B)[PUSHJ P,TLIST ;P + PUSHJ P,TLISTB + PUSHJ P,TTYUSE + PUSHJ P,TLISTA] +FOR I_"Q","T" +< CAIA +> + XCT (B)[JRST ERRET ;U + JRST ERRET + JRST ERRET + PUSHJ P,DTOPC] + CAIA ;V + XCT (B)[JRST ERRET ;W + PUSHJ P,PUTOUT ;WRITE WDR FILE + PUSHJ P,BAKOUT ;WRITE BAC FILE + JRST ERRET] + XCT (B)[PUSHJ P,DOOX ;X + PUSHJ P,DOOXA + PUSHJ P,DOOXA + PUSHJ P,DOOXA] +FOR I_"Y",136 +< CAIA +> + XCT (B)[PUSHJ P,WIRGET ;Z + PUSHJ P,WIRFOR + PUSHJ P,WIRBAK + PUSHJ P,WIRPNT] +FOR I_140,200 +< CAIA +> +;END OF TOPTAB + + + +DIPTAB: CAIA +FOR I_1,11 +< CAIA +> + OUTCHR[15] +FOR I_13,77 +< CAIA +> + PUSHJ P,DSKIN + PUSHJ P,DIPPRP ;ALTER PROPERTY TREE + CAIA + PUSHJ P,DIPCOP ;COPY DIP DEF + PUSHJ P,DIPDEL ;DELETE DIP DEF + PUSHJ P,TOPMOD ;GO BACK TO MAIN LOOP +FOR I_"F","H" +< CAIA +> + PUSHJ P,DIPIN ;READ DIP FILE +FOR I_"J","K" +< CAIA +> + PUSHJ P,DIPPRA ;LIST ALL DEF'S + PUSHJ P,MODIFY ;MODIFY DIP DEFINITION + PUSHJ P,NDNAME ;NEW DIP FILE NAME OR JUST PRINT + CAIA ;O + PUSHJ P,DIPPRN ;PRINT DIP DEFINITION + CAIA + PUSHJ P,DIPREN ;RENAME A DIP NAME + PUSHJ P,SETPAK ;SET PACKAGE TYPE +FOR I_"T","V" +< CAIA +> + PUSHJ P,DIPWRT ;WRITE DIP FILE + XCT (B)[PUSHJ P,DDOOX + PUSHJ P,DDOOXA + PUSHJ P,DDOOXA + PUSHJ P,DDOOXA] +FOR I_"Y",177 +< CAIA +> + CAIA + +TOPMOD: MOVE T,[TOPTAB(A)] + MOVEM T,DISPWD + MOVEI T,[ASCIZ/*/] + MOVEM T,PROMPT + OUTSTR[ASCIZ/TOP MODE! +/] + POPJ P, + +DIPMOD: MOVE T,[DIPTAB(A)] + MOVEM T,DISPWD + MOVEI T,[ASCIZ/*/] + MOVEM T,PROMPT + OUTSTR[ASCIZ/DIP SUB-MODE! +/] + POPJ P, + + SUBTTL X SCANNER +DOOXA: OUTSTR[ASCIZ/ +Si?/] + JRST DOOX +DDOOXA: OUTSTR[ASCIZ/ +Si?/] +DDOOX: SKIPA T,[-DTBLEN,,DXTAB] +DOOX: MOVE T,[-TABLEN,,XTAB] + MOVEM T,DOOXWD + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR +IGNSP1: XCT GETCHR + JFCL + CAIE TTT,40 ;IGNORE LEADING BLANKS + CAIN TTT,11 + JRST IGNSP1 + CAIN TTT,"?" + JRST PUSE ;PRINT USE TABLE + CAIN TTT,"-" + TLOA TFLG + TLZA TFLG + MOVEI TTT,40 ;SKIP ANY SPACES + PUSHJ P,GETWRN ;FIRST CHAR IN T + JFCL + PUSHJ P,CHRCK1 ;SKIP BLANKS + JFCL ;IGNORE EOF + JFCL ;IGNORE KIND OF CHAR + CAIE TTT,12 ;EOL? + JRST ERRET + JUMPE A,CPOPJ ;NULL COMMAND? + MOVSI TTT,770000 + SETZ TT, ;CLEAR MASK + TDNE A,TTT + TDO TT,TTT + LSH TTT,-6 + JUMPN TTT,.-3 + SETZ T, ;NO PARTIAL MATCH FOUND YET! + MOVE D,DOOXWD +XLOP: CAMN A,(D) + JRST EXACT + MOVE TTT,TT + AND TTT,(D) + CAMN TTT,A + JRST [ JUMPN T,XAMBIG ;TOO MANY MATCHES? + MOVE T,D + JRST .+1] + AOBJN D,XLOP + JUMPE T,CERRET ;ANY MATCH? + MOVE D,T ;YES, CALL IT + TLNE TFLG + OUTCHR["-"] + PUTSIX (D) + OUTSTR[ASCIZ/ +/] +EXACT: ADDI D,XDIS-XTAB + TLNN TFLG ;IS THIS A NOT + SKIPA A,(D) ;NO + MOVS A,(D) ;YES + TRNN A,-1 ;ANY DISPATCH FOR THIS FLAVOR? + JRST CERRET + JRST (A) ;YES + +XAMBIG: OUTSTR[ASCIZ/SORRY, AMBIGUOUS +/] + POPJ P, + SUBTTL X TABLES +;COMMANDS FOR TOP MODE +DEFINE XARGS +< XMAC SPACES,SETSPC,CLRSPC,<SEE SPACES IN SIGNAL NAMES> + XMAC REFERENCES,SETREF,CLRREF,<ENABLE MULTIPLE SIGNAL NAME REFERENCES> + XMAC STATUS,PSTATE,,<PRINT CURRENT STATUS> + XMAC DEFPPN,STZPPN,CLZPPN,<SET DEFAULT PPN FOR INPUT ONLY> + XMAC USED,USED,USEPC,<USE D WIRELIST> + XMAC USEPC,USEPC,USED,<USE PC WIRELIST> + XMAC WLID,WIRID,,<CHANGE WIRELIST ID> + XMAC FILES,PFILES,,<PRINT FILE LIST FOR CARD> + XMAC BFILES,BFILES,,<PINT FILE LIST FOR BACKPANEL> + XMAC WLSSEL,WLSSEL,,<WRITE 'WLS' FILE AND SELECT CATEGORY(S)> + XMAC BSSEL,BSSEL,,<WRITE 'BS' FILE AND SELECT CATEGORY(S)> + XMAC MAKALL,MAKALL,,<WRITE 'WL', 'WLS', AND 'WLU' FILES> + XMAC BMAKALL,BMAKAL,,<WRITE 'BL', AND 'BLS' FILES> + XMAC PART,DOPART,,<WRITE WAGNER PARTITION FILE> + XMAC UML,PNTUML,,<MAKE UML LISTING> + XMAC SIGSUM,DOREF,,<MAKE SIGNAL SUMMARY> + XMAC CONSUM,SIGCOM,,<MAKE CONNECTORS NEEDED SUMMARY> +DEC,< XMAC UMAKE,UMLOUT,,<MAKE 'UML' FILE FOR SETTING "U" NUMBERS FROM REAL PINS> + XMAC FIXCON,CPNOUT,,<OUTPUT LIST OF CONNECTOR PINS FOR UPDATING DRAWINGS> + XMAC SPREFIX,SPIOUT,,<OUTPUT SIGNAL LIST FOR "GREAT SIGNAL NAME CHANGE"> +>;dec + XMAC STUFF,STFLST,,<MAKE DIP STUFFING LIST FOR CARD> + XMAC LPART,PRTLST,,<MAKE PARTS LIST> + XMAC MPART,MPART,,<MAKE MASTER PARTS LIST (FROM BAC FILES)> + XMAC OUTSUM,OUTSUM,,<WRITE OUTPUT PIN TERMINATION SUMMARY> + XMAC TERMLIST,TRMLST,,<WRITE TERMINATOR TEST POINT LIST> + XMAC TEST,TSTWRT,,<WRITE CARD TESTER FILE> + XMAC SIMPLE,WIRWRT,,<OUTPUT BACK PANEL TO DEC WIRELISTER> + XMAC ASIMPLE,ASIMPLE,,<WRITE 'SMP' FILE, BUT ASSIGN REAL PIN NAMES IN PLACE OF "U" PIN NAMES> + XMAC BSIMPLE,BSIMPLE,,<WRITE 'SMP' FILE INCLUDING ALL PWR PINS> + XMAC OSIMPLE,OSIMPLE,,<WRITE 'SMP' FILE OFFSETTING SLOT NUMBERS> + XMAC PSIMPLE,PSIMPLE,,<WRITE 'SMP' FILE WITH ONLY POWER PINS IN IT> + XMAC SSIMPLE,SSIMPLE,,<WRITE 'SMP' FILE, ASK ABOUT SPECIFIC FEATURES> +DEC,< XMAC REDAC,REDAC,,<OUTPUT REDAC CONNECTION LIST> + XMAC CALDEC,REDAC,,<OUTPUT CALDEC CONNECTION LIST> + XMAC CS,CSWRT,,<OUTPUT 'CS' CIRCUIT SCHEMATIC NETWORK FILE FOR WRLCOM (BOARD)> + XMAC BCS,BCSWRT,,<OUTPUT 'CS' CIRCUIT SCHEMATIC NETWORK FILE FOR WRLCOM (BACKPANEL)> + XMAC SR,SRWRT,,<OUTPUT 'SR' SCHEMATIC REPRESENTATION FOR MODULE TEST GENERATOR> + XMAC WRESISTOR,RESFIL,,<OUTPUT FILE FOR RESISTOR DRAWING> + XMAC TAPR8,TP8WRT,,<OUTPUT TAPR-8 CONNECTION FILE> +>;DEC + XMAC ERRSUM,ERRSUM,,<LOGIC ERROR SUMMARY BACK TO D> + XMAC BLIST,BAKLST,,<BACK PANEL WIRE LIST> + XMAC BSUM,BACSUM,,<BACK PANEL SUMMARY> + XMAC BPRINT,TLSTBP,,<PRINT BACK PANEL SIGNAL> + XMAC IERROR,SETWIE,CLRWIE,<ENABLE WIRE LIST INPUT ERRORS TO GO TO FILE> +USAGE,< XMAC USAGE,UCOUNT,,<COUNT FREE STORAGE USAGE> > + XMAC WIREGND,STWGND,CLWGND,<ENABLE WIRING OF GROUND PINS ON DIPS> + XMAC LNGRID,SETLNG,CLRLNG,<SWITCH DEC CARD TO A LETTER NUMBER GRID> + XMAC MARGIN,SLOADM,CLOADM,<SET MARGIN FOR RUN OVERLOAD ERROR> +ROUTE,< XMAC ROUTE,ROUTIT,,<ROUTED WIRE LIST> + XMAC ZLEVEL,ZLEVP,,<MAKE Z LEVEL WRAP LIST> + XMAC RAYTHEON,RAYP,,<RATHEON WIRE WRAP LIST "FROM-TO" FORMAT> + XMAC AUGAT,AUGP,,<AUGAT WIRE WRAP LIST "FROM-TO" FORMAT> + XMAC RAY,RAYP,,<RATHEON WIRE WRAP LIST "FROM-TO" FORMAT> + XMAC RAYTT,RAYTT,,<RATHEON WIRE WRAP LIST "TO-TO" FORMAT> + XMAC ANADU,ANADU,anano,<ROUTED WIRE LIST FOR POST-PROCESSOR> +>;ROUTE +>;XARGS + +;COMMANDS FOR BOTH MODES +DEFINE BXARGS +< XMAC BOARD,WWSET,CLRWW,<SELECT WIREWRAP BOARD TYPE> + XMAC NOMENCLATURE,NOMSET,CLRNOM,<SELECT NOMENCLATURE> + XMAC AVAILABLE,AVAIL,,<LIST AVAILABLE NOMENCLATURE AND BOARD TYPES> + XMAC DDT,DDTCAL,,<CALL DDT> + XMAC SAVE,SAVE,,<SAVE A DUMP FILE> + XMAC ECL,SETECL,CLRECL + XMAC TTL,SETTTL,CLRECL + XMAC RESIDENT,STRESI,UNRESI,<MAKE DIP DEFS RESIDENT> + XMAC CLEAR,STRTC,,<CLEAR CORE EXCEPT FOR RESIDENT DIP DEFS> + XMAC DSKIN,DSKIN,,<ACCEPT TTY INPUT FROM DISK> + XMAC DSKHLD,DSKHLD,,<HOLD DISK INPUT(CLOSES FILE)> + XMAC DSKCON,DSKCON,,<CONTINUE DISK INPUT(REOPENS FILE, READS TO LAST POSITION)> + XMAC DSKSKP,DSKSKP,,<SKIP OVER LINES IN DSKIN FILE> + XMAC PAGE,STPAGE,CLPAGE,<SET LINES PER PAGE (FOR LISTINGS)> + XMAC WIDTH,SETWID,CLRWID,<SET CHARACTERS PER LINE (FOR LISTINGS)> +ITS,< XMAC XGP,SETXGP,CLRXGP,<PRODUCE XGP OUTPUT> > +> + +;COMMANDS FOR DIP MODE +DEFINE DXARGS +< + XMAC APACK,APACK,,<LIST AVAILABLE PACKAGE TYPES> +> + +DEFINE XMAC(A,B,C,D) +< <SIXBIT/A/> +> + +XTAB: XARGS +DXTAB: BXARGS +TABLEN__.-XTAB + DXARGS +DTBLEN__.-DXTAB + +DEFINE XMAC(A,B,C,D) +< IFIDN<C><><0>C,,B +> + +XDIS: XARGS +DXDIS: BXARGS + DXARGS + +DEFINE XMAC(A,B,C,D) +< [ASCIZ/D/] +> + +UTAB: XARGS +BUTAB: BXARGS +DUTAB: DXARGS +DUEND__. + SUBTTL USAGE COUNTERS +USAGE,< +UCOUNT: + SETZM FSTTMP + MOVE T,[FSTTMP,,FSTTMP+1] + BLT T,FSTTMP+FSTLEN-1 ;CLEAR OUT TMP TABLE + SETZB D,E + MOVE L,DEFLST + PUSHJ P,DODCNT + FETCH(W,L,PCWL) + JRST DOPCCN + +DODCNT: FETCH(W,L,BLST) + JUMPE W,NOUBAK + OUTSTR[ASCIZ/ +BACK PANEL LIST: +/] + SETZB A,D + FETCH(H,L,BKNM) + JUMPE H,NXBKNM +BKNMCT: ADDI A,1 + FETCH(H,H,FNXT) + JUMPN H,BKNMCT + MOVEI T,1+ADDR(0,FBLK) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,A + ADDM T,FSTTMP+ADDR(0,FBLK) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,A + IMULI T,1+ADDR(0,FBLK) + MOVE D,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ FILENAME BLOCKS +/] +NXBKNM: TRO ISBACK + PUSHJ P,WCNT +NOUBAK: FETCH(W,L,WIRL) +DOPCCN: JUMPE W,NOUCNT + TRZ ISBACK + OUTSTR[ASCIZ/ +CARD(S): +/] +UCNT3: OUTSTR[ASCIZ/ +/] + FETCH(T,W,FCRD) + HRLZM T,SLICEL + JUMPE T,.+2 + PUSHJ P,PSLICL + OUTSTR[ASCIZ/ +/] + SETZ D, + PUSHJ P,WCNT + FETCH(W,W,NXTWL) + JUMPN W,UCNT3 +NOUCNT: CAMN E,D + JRST NOTOT + OUTSTR[ASCIZ/GRAND TOTAL = /] + MOVE T,E + PUSHJ P,TTYDEC +NOTOT: OUTSTR[ASCIZ/ + +/] + MOVE A,[-FSTLEN,,1] + OUTSTR[ASCIZ/SIZE COUNT TOTAL +/] + SETZB D,E +UCNT1: SKIPN FSTCNT-1(A) + JRST NALLOC + MOVEI T,(A) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,FSTCNT-1(A) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVEI T,(A) + IMUL T,FSTCNT-1(A) + ADD D,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ ALLOCATED +/] + MOVE C,FSTPNT-1(A) + SETZ B, + SKIPE C,(C) + AOJA B,.-1 + JUMPE B,NFREE + OUTCHR[11] + MOVE T,B + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,B + IMULI T,(A) + SUB D,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ FREE +/] +NFREE: SKIPN T,FSTTMP-1(A) + JRST NALLOC + OUTCHR[11] + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,FSTTMP-1(A) + IMULI T,(A) + ADD E,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ IN USE +/] +NALLOC: AOBJN A,UCNT1 + JUMPE D,CPOPJ + OUTSTR[ASCIZ/TOTAL ALLOCATED - FREE = /] + MOVE T,D + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ +/] + OUTSTR[ASCIZ/ TOTAL IN USE = /] + MOVE T,E + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ +/] + MOVE T,D + SUB T,E + JUMPE T,CPOPJ + OUTSTR[ASCIZ/ TOTAL LOST = /] + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ +/] + POPJ P, + +WCNT: AOS FSTTMP+ADDR(0,WLBLOCK) + SETZB A,B + MOVEI H,RADDR(W,WBDY,NXTB) + JRST WCNT1 + +WCNT2: ADDI A,1 + MOVEI G,ADDR(H,BNAM) + MOVE B,G +BCNT1: MOVE T,(G) + TRNE T,376 + AOJA G,BCNT1 + SUBM G,B +WCNT1: FETCH(H,H,NXTB) + JUMPN H,WCNT2 + MOVEI T,1+ADDR(0,BHEAD) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,A + ADDM T,FSTTMP+ADDR(0,BHEAD) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVEI T,1+ADDR(0,BHEAD) + IMUL T,A + ADD D,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ BODIES +1 /] + MOVE T,B + ADDM T,FSTTMP + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,B + ADD D,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ BODY NAMES-1 +/] + MOVEI H,RADDR(W,WIRES,ALPH) + SETZB A,B + SETZB C,F + SETZ TT, + JRST WCNT3 + +WCNT4: ADDI B,1 + MOVEI G,ADDR(H,SPNT) + MOVE T,G +WCNTS: MOVE TTT,(G) + TRNE TTT,376 + AOJA G,WCNTS + SUB G,T + ADD F,G + FETCH(T,H,WBIT) + TRNE T,NAM2ND + JRST WCNT3 + ADDI A,1 + SETZM LSLOT + MOVEI G,RADDR(H,WPIN,NXTP) + JRST WCNT5 + +WCNT6: ADDI C,1 +WCNT5: FETCH(G,G,NXTP) + JUMPN G,WCNT6 +WCNT3: FETCH(H,H,ALPH) + JUMPN H,WCNT4 + OUTCHR[11] + MOVE T,A + PUSHJ P,TTYDEC + OUTCHR[11] + OUTSTR[ASCIZ/ WIRES +/] + MOVEI T,1+ADDR(0,WHEAD) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,B + ADDM T,FSTTMP+ADDR(0,WHEAD) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVEI T,1+ADDR(0,WHEAD) + IMUL T,B + ADD D,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ SIGNAL BLOCKS +1 /] + MOVE T,F + ADDM T,FSTTMP + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,F + ADD D,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ SIGNAL NAMES-1 +/] + MOVEI T,1+ADDR(0,PHEAD) + TRNE ISBACK + MOVEI T,1+ADDR(0,BPHEAD) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVE T,C + TRNN ISBACK + ADDM T,FSTTMP+ADDR(0,PHEAD) + TRNE ISBACK + ADDM T,FSTTMP+ADDR(0,BPHEAD) + PUSHJ P,TTYDEC + OUTCHR[11] + MOVEI T,1+ADDR(0,PHEAD) + TRNE ISBACK + MOVEI T,1+ADDR(0,BPHEAD) + IMUL T,C + ADD D,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ PINS +/] + OUTSTR[ASCIZ/ TOTAL = /] + MOVE T,D + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ +/] + ADD E,D + POPJ P, +>;USAGE + SUBTTL MORE EXTENDED SUBRS +MAKALL: SETZM ALLNAM + SETZM ALLCRD + PUSHJ P,LIST + PUSHJ P,ALLWLS + PUSHJ P,ALLUSE +ITS,< TRZ DOPRTL + PUSHJ P,ALLSTF +>;ITS ; STF LISTS WERE FLUSHED FROM DEC VERSION +NODEC,< POPJ P,> +DEC,< TRO DOPRTL ;DO PARTS LIST + JRST ALLSTF +>;DEC + +BMAKAL: MOVE L,DEFLST + FETCH(W,L,BLST) + JUMPE W,[OUTSTR[ASCIZ/NO BACK PANEL WIRELIST. +/] + POPJ P,] + PUSHJ P,BAKLST + JRST ALLBS + +PUSE: XCT GETCHR + JFCL + CAIE TTT,12 + JRST ERRET + OUTSTR[ASCIZ/COMMAND  ********* MEANING ******************* +? PRINT THIS LIST +/] + MOVE A,[UTAB-BUTAB,,0] + OUTSTR[ASCIZ/ +TOP MODE: +/] + PUSHJ P,PUSE1 + MOVE A,[BUTAB-DUTAB,,BUTAB-UTAB] + OUTSTR[ASCIZ/ +TOP MODE OR DIP SUB-MODE: +/] + PUSHJ P,PUSE1 + MOVE A,[DUTAB-DUEND,,DUTAB-UTAB] + OUTSTR[ASCIZ/ +DIP SUB-MODE: +/] +PUSE1: PUTSIX XTAB(A) ;SIXBIT COMMAND NAME + HLRZ T,XDIS(A) + SKIPE T ;-? + OUTCHR["-"] ;YES + OUTCHR[11] + PUTSTR @UTAB(A) + OUTSTR[ASCIZ/ +/] + AOBJN A,PUSE1 + POPJ P, + +WWSET: SKIPGE A,WWTYP + JRST GETBRD + OUTSTR[ASCIZ/BOARD TYPE IS: /] + OUTSTR @WNAMES(A) + OUTSTR[ASCIZ/ +/] + JRST GETBRD + +NOMSET: SKIPGE A,NOMTYP + JRST GETNOM + OUTSTR[ASCIZ/NOMENCLATURE TYPE IS: /] + OUTSTR @LNAMES(A) + OUTSTR[ASCIZ/ +/] + JRST GETNOM + +PFILES: TRZA ISBACK +BFILES: TRO ISBACK + MOVE TTT,[PUSHJ P,TTYOUT] + MOVEM TTT,PUTCHR + SETOM TTYFLG + SETZM LCOUNT + SETZM LINCNT + TLO NOFF + MOVE L,DEFLST + TRNE ISBACK + JRST [ FETCH(W,L,BLST) + JRST AFILES] + PUSHJ P,LSTGET + POPJ P, +AFILES: PUSHJ P,TFILES + PUTHDR + POPJ P, + +SETECL: SKIPA T,[ECL] +SETTTL: MOVEI T,TTL + MOVEM T,DEFECL + POPJ P, + +CLRECL: SETZM DEFECL + POPJ P, + +SETLNG: SKIPN ISWW + JRST NXWW + SETOM LNGRID + POPJ P, + +NXWW: OUTSTR[ASCIZ/SORRY, COMMAND VALID FOR WIRE WRAP BOARDS ONLY. +/] + POPJ P, + +CLRLNG: SKIPN ISWW + JRST NXWW + SETZM LNGRID + POPJ P, + +STWGND: SKIPN ISWW + JRST NXWW + SETOM WIRGND + POPJ P, + +CLWGND: SKIPN ISWW + JRST NXWW + SETZM WIRGND + POPJ P, + +STPAGE: OUTSTR[ASCIZ/LINES PER PAGE = /] + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + PUSHJ P,DECIN + JFCL + CAIE TTT,12 + JRST ERRET + JUMPE A,ERRET + MOVEM A,PAGLEN + POPJ P, + +CLPAGE: MOVEI TTT,STDPAG + MOVEM TTT,PAGLEN + POPJ P, + +SETWID: OUTSTR[ASCIZ/CHARACTERS PER LINE = /] + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + PUSHJ P,DECIN + JFCL + CAIE TTT,12 + JRST ERRET + JUMPE A,ERRET + MOVEM A,LWIDTH + POPJ P, + +CLRWID: MOVEI TTT,STDWID + MOVEM TTT,LWIDTH + POPJ P, + +SLOADM: OUTSTR[ASCIZ/% OF MAXIMUM = /] + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + PUSHJ P,DECIN + JFCL + CAIE TTT,12 + JUMPLE A,ERRET + MOVEM A,LOADMG + POPJ P, + +CLOADM: MOVEI TTT,=100 + MOVEM TTT,LOADMG + POPJ P, + SUBTTL XGP ROUTINES FOR ITS +ITS,< +CLRXGP: SETZM XGP + MOVEI T,STDPAG + MOVEM T,PAGLEN + POPJ P, + +FONTI: .CALL [ SETZ + SIXBIT /IOT/ + 1000,,FONTCH + SETZ T] + JRST ERRET + POPJ P, + +SETXGP: SETZM XGP + MOVE T,[SIXBIT /KST/] + MOVEM T,DEFEXT + MOVEI T,0 ;ALL KINDS OF KLUDGERY TO DEFAULT PPN CORRECTLY + DSKPPN T, + PUSH P,T + MOVE T,[SIXBIT /FONTS/] + DSKPPN T, + PUSHJ P,SETFIL + CAIA + JRST SETXG1 ;RESTORE DSKPPN AND OPEN FONT + MOVE T,[SIXBIT /20FG/] ;GIVE HIM FIX20 + MOVEM T,FILNAM + MOVE T,[SIXBIT /KST/] + MOVEM T,FILEXT + MOVE T,[SIXBIT /FONTS/] + MOVEM T,FILPPN + PUSH P,A + MOVEI A,FILNAM + PUSHJ P,FILPNT + POP P,A +SETXG1: POP P,T + DSKPPN T, + .CALL [ SETZ + SIXBIT /OPEN/ + 1000,,FONTCH + [SIXBIT /DSK/] + FILNAM + FILEXT + FILPPN + 405000,,4] ;IMAGE, UNIT, INPUT + JRST ERRET + PUSHJ P,FONTI ;IGNORE KSTID + PUSHJ P,FONTI ;BYTE (9) CPA, BASE_LINE (18) HEIGHT + .CALL [ SETZ + SIXBIT /CLOSE/ + SETZI FONTCH] + JRST ERRET + HRRZS T + MOVEM T,XGPFNT ;HEIGHT + IDIVI T,5 ;VSP + MOVEM T,XGPVSP + ADDM T,XGPFNT + MOVEI T,=11*XGPVBI-=256 ;11"-TOP AND BOTTOM MARGINS + IDIV T,XGPFNT + MOVEI T,1(T) ;FIRST LINE GOES IN TOP MARGIN + MOVEM T,PAGLEN ;THATS THE PAGE LENGTH + OUTSTR [BYTE (7) 15, 12] + OUTSTR [ASCIZ /LINES PER PAGE = /] + PUSHJ P,DECOUT + OUTSTR [BYTE (7) 15, 12] + MOVE T,FILNAM + MOVEM T,XGPFNT + MOVE T,FILEXT + MOVEM T,XGPEXT + MOVE T,FILPPN + MOVEM T,XGPPPN + SETOM XGP + POPJ P, +>;ITS + SUBTTL EXTENDED SUBRS +SETSPC: TRO PETIT ;SPACES ARE SIGNIFICANT + POPJ P, + +CLRSPC: TRZ PETIT ;SPACES AREN'T SIGNIFICANT + POPJ P, + +SETREF: TRO REFLAG ;ENABLE REFERENCE HACK + POPJ P, + +CLRREF: TRZ REFLAG ;DISABLE REFERENCE HACK + POPJ P, + +SETWIE: TRO DOWIE + POPJ P, + +CLRWIE: TRZ DOWIE + POPJ P, + +USED: SETOM USEDWL + POPJ P, + +USEPC: SETZM USEDWL + POPJ P, + +STZPPN: +NOCMU,< +NOITS,< OUTSTR [ASCIZ/DEFAULT INPUT P,PN? /] + PUSHJ P,RDPPN + JRST ERRET + JUMPE A,[CAIE TTT,12 + JRST ERRET + JRST CLZPPN] + HRLM A,(P) + CAIN TTT,12 + JRST [ SETZ A, + DSKPPN A, +NOSTAN,< HLR A,(P) > +STAN,< HLL A,(P) > + JRST GOTPN] + CAIN TTT,"," + PUSHJ P,RDPPN + JRST ERRET + JUMPE A,ERRET + CAIE TTT,12 + JRST ERRET + HLL A,(P) +GOTPN: +>;NOITS +>;NOCMU +ITS,< OUTSTR[ASCIZ/DEFAULT INPUT PPN? /] + PUSHJ P,FILWRD + JRST ERRET + CAIE TTT,12 + JRST ERRET +>;ITS +CMU,< OUTSTR [ASCIZ/DEFAULT INPUT PPN? /] + SETZM PPNBUF ;CLEAR OUT A BUFFER FOR THE PPN + SETZM PPNBUF+1 + SETZM PPNBUF+2 + MOVE A,[POINT 7,PPNBUF] + MOVEI T,=13 ;13 CHARACTERS AT MOST! +CMUPP1: XCT GETCHR ;GET A CHAR + JRST CMUPP3 + CAIE TTT,15 ;IGNORE CR + CAIN TTT,40 ;AND SPACE + JRST CMUPP1 + CAIN TTT,12 ;LF + JRST CMUPP3 ;YES, THAT'S ALL FOLKS. + CAIE TTT,"[" ;IGNORE [ + CAIN TTT,"]" ;AND ] + JRST CMUPP1 + CAIL TTT,"a" ;CONVERT LOWER CASE TO UPPER CASE + CAILE TTT,"z" + JRST .+2 + SUBI TTT,40 ;CONVERT IT +CMUPP2: IDPB TTT,A + SOJGE T,CMUPP1 ;AND GO GET ANOTHER CHAR UNLES WE HAVE 13+1 + JRST ERRET ;FUNNY, WE DIDN'T GET THERE IN 13 CHARACTERS! +CMUPP3: MOVE T,[XWD A,PPNBUF] + CMUDEC T, ;CONVERT THE PPN TO DEC FORMAT + JRST ERRET ;WHOOPS, BAD PPN +>;CMU + MOVEM A,ZPPN + POPJ P, + +CLZPPN: SETZM ZPPN + POPJ P, + + +PSTATE: OUTSTR[ASCIZ/SPACES ARE/] + TRNN PETIT + OUTSTR[ASCIZ/N'T/] + OUTSTR[ASCIZ/ SIGNIFICANT. +REFERENCE HACK IS/] + TRNN REFLAG + OUTSTR[ASCIZ/N'T/] + OUTSTR[ASCIZ/ ENABLED. +/] + OUTSTR[ASCIZ/DEFAULT WIRE LIST = /] + MOVE T,DEFLST + FETCH(A,T,WLID) + PUSHJ P,STRTTY + OUTSTR[ASCIZ/ (/] + SKIPE USEDWL + OUTCHR["D"] + SKIPN USEDWL + OUTSTR[ASCIZ/PC/] + OUTCHR[")"] + FETCH(A,L,WLNM) + JUMPE A,NOWLNM + OUTCHR[" "] + PUSHJ P,STRTTY +NOWLNM: OUTSTR[ASCIZ/ +/] + OUTSTR[ASCIZ/LINES PER PAGE = /] + MOVE T,PAGLEN + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ +/] + OUTSTR[ASCIZ/CHARACTERS PER LINE = /] + MOVE T,LWIDTH + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ +/] + SKIPN ISWW + JRST NXWW1 + SKIPN WIRGND + OUTSTR[ASCIZ/NOT /] + OUTSTR[ASCIZ/WIRING GROUNDS. +/] +NXWW1: SKIPN ZPPN + JRST NOZPPN + OUTSTR[ASCIZ/DEFAULT INPUT P,PN = /] +NOCMU,< HLLZ TT,ZPPN + PUSHJ P,LSIXOUT + OUTCHR[","] + HRLZ TT,ZPPN + PUSHJ P,LSIXOUT +>;NOCMU +CMU,< MOVE TT,[ZPPN,PPNBUF] + DECCMU TT, + JRST [ PUTSIX ZPPN + JRST .+2] + OUTSTR PPNBUF +>;CMU + OUTSTR[ASCIZ/ +/] +NOZPPN: MOVE T,DEFECL + TRNE T,ECL + OUTSTR[ASCIZ/DIP-MODE, DEFAULT ECL PINS. +/] + TRNE T,TTL + OUTSTR[ASCIZ/DIP-MODE, DEFAULT TTL PINS. +/] + SKIPN DIPLST + JRST DSKICK + OUTSTR[ASCIZ/DIPS ARE IN/] + SKIPE RESIDENT + OUTSTR[ASCIZ/ AND PERMANENTLY CORE RESIDENT/] + OUTSTR[ASCIZ/. +/] +DSKICK: SKIPN DSKFLG + JRST CKWWT + OUTSTR[ASCIZ/DSKIN: /] + MOVEI A,DSKNAM + PUSHJ P,FILPNT + SKIPN DSKACT + JRST [ OUTSTR[ASCIZ/HOLDING +/] + JRST CKWWT] + OUTSTR[ASCIZ/ACTIVE +/] +CKWWT: SKIPGE T,WWTYP + JRST CKNOMT + OUTSTR[ASCIZ/BOARD TYPE: /] + OUTSTR @WNAMES(T) + OUTSTR[ASCIZ/ +/] +CKNOMT: SKIPGE T,NOMTYP + POPJ P, + OUTSTR[ASCIZ/NOMENCLATURE TYPE: /] + OUTSTR @LNAMES(T) + OUTSTR [ASCIZ/ +/] + POPJ P, + +DSKIN: PUSHJ P,DSKINB + JFCL + POPJ P, + +DSKINB: MOVSI T,'TXT' + MOVEM T,DEFEXT + PUSHJ P,SETFIL ;GET A FILE NAME + POPJ P, ;QUIT +DSKINA: INIT IDSK,0 + 'DSK ' + IDSKHD + JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! +/] + SETZM DSKFLG + SETZM DSKACT + POPJ P,] + MOVEI T,IDSKBF + EXCH T,.JBFF + INBUF IDSK,1 + MOVEM T,.JBFF + MOVE T,FILPPN + LOOKUP IDSK,FILNAM + JRST [ MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + OUTSTR[ASCIZ/ LOOKUP FAILED, CODE = /] + HRRZ T,FILEXT + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +/] + SETZM DSKFLG + SETZM DSKACT + RELEASE IDSK, + POPJ P,] + MOVEM T,DSKPP + MOVE T,FILNAM + MOVEM T,DSKNAM + HLLZ T,FILEXT + MOVEM T,DSKEXT + SETZM DSKCNT ;NO CHARS READ YET! + SETOM DSKFLG ;NOW READING INDIRECT FILE + SETOM DSKACT ;ACTIVATE IT + SETZM CBITS + OUTSTR[ASCIZ/ +/] + JRST CPOPJ1 + +DSKHLD: SKIPE DSKFLG + JRST DSKHL1 + OUTSTR[ASCIZ/NO FILE OPEN YET. +/] + PUSHJ P,DSKINB + POPJ P, ;LOSE +DSKHL1: SKIPN DSKACT + JRST [ OUTSTR[ASCIZ/ALREADY HOLDING! +/] + POPJ P,] + SETZM DSKACT + RELEASE IDSK, ;JUST FOR FUN, RELEASE IT + POPJ P, + +DSKCON: SKIPN DSKFLG + JRST ERRET + SKIPE DSKACT + POPJ P, + PUSHJ P,DSKCN0 + POPJ P, + POPJ P, + +DSKCN0: MOVE T,DSKNAM + MOVEM T,FILNAM + MOVE T,DSKEXT + MOVEM T,FILEXT + MOVE T,DSKPP + MOVEM T,FILPPN + SETZM FILDAT + PUSH P,DSKCNT + PUSHJ P,DSKINA + JRST [ POP P,(P) + POPJ P,] + POP P,A + SETZM DSKACT ;DEACTIVATE SO WON'T ECHO +DSKCN1: CAMG A,DSKCNT ;THERE YET? + JRST DSKCN2 ;YES + PUSHJ P,DSKINC ;NO, READ SOME MORE + POPJ P, ;RAN OUT?????? + JRST DSKCN1 + +DSKCN2: SKIPN DSKFLG ;STILL IN FILE? + POPJ P, + SETOM DSKACT ;YES, ACTIVATE INPUT AGAIN + JRST CPOPJ1 + +DSKSKP: SKIPE DSKFLG + JRST DSKSK0 + OUTSTR[ASCIZ/NO FILE OPEN YET. +/] + PUSHJ P,DSKINB + POPJ P, + PUSH P,[0] + JRST DSKSK1 + +DSKSK0: PUSH P,DSKACT + SKIPE DSKACT + JRST DSKSK1 + PUSHJ P,DSKCN0 + POPJ P, +DSKSK1: SETOM DSKACT + PUSHJ P,DSKINC + JRST DSKSK2 + CAIE TTT,12 + JRST DSKSK1 + SETZM DSKACT ;NOW GET FROM TTY + ASK[ASCIZ/STOP?/] + JRST DSKSK2 + JRST DSKSK1 + POP P,DSKACT + POPJ P, + +DSKSK2: POP P,(P) + SETZM DSKACT + POPJ P, + +IERR: SKIPN DSKACT ;DOING DISK INPUT? + JRST [ CLRBFI ;NO + POPJ P,] + OUTSTR[ASCIZ/ +MANUAL INTERVENTION REQUIRED, DSKHLD DONE. +/] + SETZM DSKACT + RELEASE IDSK, + POPJ P, + SUBTTL MAKLST +;READ A FILENAME AND GO INDIRECT IF NECESSARY! + +MAKLST: SETZM VARLST ;CLEAR THESE + SETZM SLICEL + SKIPN T,ZPPN + DSKPPN T, + MOVEM T,ATPPN ;SET DEFAULT PPN + TLZ TFLG ;FLAG NO VAR LIST YET + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUSHJ P,GETWRD + JRST TTYEOF + CAIN TTT,"@" + JUMPE A,INDIR + PUSHJ P,TERMA + JRST TTYEOF ;EOF????? + POPJ P, + MOVE T,FILNAM + MOVEM T,LSTNAM ;REMEMBER NAME FOR ^E + POPJ P, + +TTYEOF: OUTSTR[ASCIZ/UNEXPECTED EOF FROM TTY. +/] + JRST NERRET + +NONAME: OUTSTR[ASCIZ/NO FILESPEC AFTER @. +/] + JRST NERRET + +INDIR: MOVE T,DEFEXT + HLLM T,(P) ;SAVE OLD EXT + MOVSI T,'DIR' + MOVEM T,DEFEXT ;SET DEFAULT FOR @FILE + PUSHJ P,GTERM ;READ INDIRECT FILESPEC + JRST TTYEOF ;EOF?????? + JRST NONAME ;@ WITH NO NAME?? + HLLZ T,(P) + MOVEM T,DEFEXT ;RESET DEFAULT EXT + HRRZ T,DIRLST + MOVEM T,IDRLST + MOVEI T,DIRLST + HRLZM T,DIRLST + PUSHJ P,IN0 ;SETUP FOR TEXT INPUT + POPJ P, ;GIVE UP + MOVE T,[PUSHJ P,INDCHR] + MOVEM T,GETCHR + MOVE E,IDRLST + FETCH(E,E,CVAR) ;GET VAR POINTER +INDIRA: MOVE A,IDRLST + FETCH(T,A,DFIL) + MOVEM T,FILNAM + FETCH(T,A,DEXT) + HRLZM T,FILEXT + FETCH(T,A,DPPN) + MOVEM T,FILPPN + SKIPN T,ZPPN + MOVE T,FILPPN + MOVEM T,ATPPN ;USE AS DEFAULT PPN ALSO + SETZM VARLST ;ASSUME NO VARS + JUMPE E,NOCLVR ;ANY CARD OR VAR LIST? + TLO TFLG ;FLAG VARS AND OR BOUNDS AND OR CARD LOC + FETCH(T,E,CDLC) ;CARD LOC + HRLZM T,SLICEL ;SETUP INFO TO COPY + FETCH(T,E,LBND) ;LOWER BOUND + MOVEM T,LOWER + FETCH(T,E,UBND) ;UPPER BOUND + MOVEM T,UPPER + FETCH(T,E,VLST) ;VARIABLE LIST + MOVEM T,VARLST +NOCLVR: OUTCHR ["@"] + PUSH P,A + MOVEI A,FILNAM + PUSHJ P,FILPNT + POP P,A + LOOKUP DAT,FILNAM + JRST [ OUTSTR[ASCIZ/ LOOKUP FAILED, CODE = /] + HRRZ T,FILEXT+1 + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +/] + JUMPE E,CPOPJ + ASK[ASCIZ/TYPE Y TO GO ON?/] + POPJ P, + POPJ P, + JRST INDIRB] + MOVE T,FILNAM + MOVEM T,LSTNAM ;REMEMBER @NAME FOR OUTPUT + SKIPN SLICEL + JRST NDISLC + OUTCHR[11] + PUSHJ P,PSLICL +NDISLC: SKIPN VARLST + JRST INDIRC + SKIPN SLICEL + OUTCHR[11] + OUTCHR["("] + MOVE T,LOWER + CAMN T,[-400000] + JRST NPLWR + PUSHJ P,DECOUT + OUTCHR[74] +NPLWR: MOVE T,UPPER + CAIN T,377777 + JRST NPUPR + PUSHJ P,DECOUT + OUTCHR[76] +NPUPR: SKIPN A,VARLST + JRST VARDNI + CAIA +VARLPI: OUTCHR[","] + FETCH(T,A,LET) + OUTCHR T + OUTCHR["="] + FETCH(T,A,VAL) + FETCH(TT,A,WID) + MOVEM TT,NDIG + PUSHJ P,NDECOUT + FETCH(A,A,NVAR) + JUMPN A,VARLPI +VARDNI: OUTCHR[")"] +INDIRC: PUSH P,VARLST + PUSH P,SLICEL + PUSHJ P,GTERM + JRST [ POP P,SLICEL + POP P,VARLST + JRST INDIRB] + JFCL ;IGNORE NULL + POP P,SLICEL + POP P,VARLST ;RESTORE INDIRECT VARLST + JRST INDIRC + +INDIRB: OUTSTR[ASCIZ/ +/] + JUMPE E,CPOPJ + FETCH(E,E,NSLC) + JUMPN E,INDIRA + POPJ P, + +DIRRET: HRRZ B,DIRLST + MOVSI T,DIRLST + MOVEM T,DIRLST ;POINT DIRLST TO ITSELF +RETIT: MOVE A,B + FETCH(B,B,DIRNXT) ;GET NEXT POINTER NOW + FETCH(C,A,CVAR) ;GET CARD AND VAR HEADER + FSTRET(A,DIRHEAD) ;RETURN HEAD + JUMPE C,RETIT1 ;LEAVE IF NO VARLIST +RETIT2: FETCH(D,C,VLST) ;VAR LIST POINTER + JUMPE D,RETIT3 +RETIT4: MOVE A,D + FETCH(D,D,NVAR) + FSTRET(A,VBLK) + JUMPN D,RETIT4 +RETIT3: MOVE A,C + FETCH(C,C,NSLC) + FSTRET(A,CBND) + JUMPN C,RETIT2 +RETIT1: JUMPN B,RETIT + POPJ P, + +IDRRET: SETZM IDRLST + JRST RETIT + SUBTTL GTERM +;READ ONE TERM FOR MAKLST + +GTERM: PUSHJ P,GETWRD ;READ WORD + JRST [ JUMPN A,MIDEOF ;ERROR IF NOT NULL WORD + POPJ P,] ;EOF +TERMA: PUSHJ P,FTERM0 + JRST MIDEOF ;TOO LATE FOR EOF, ERROR + JRST [ SKIPN FILNAM ;NO LF, NULL NAME ILLEGAL + JRST NOFNAM + JRST TERM1] + SKIPN FILNAM ;NO LF SEEN + JRST CPOPJ1 ;NULL NAME RETURN +TERM1: GETFS(T,DIRHEAD) + HLRZ TT,DIRLST + STORE(T,TT,DIRNXT) + HRLM T,DIRLST + CLEAR(T,DIRNXT) + MOVE TT,FILNAM + STORE(TT,T,DFIL) ;STORE FILENAME + HLRZ TT,FILEXT + STORE(TT,T,DEXT) ;STORE EXT + MOVE TT,FILPPN + STORE(TT,T,DPPN) ;STORE PPN + CLEAR(T,CVAR) ;CLEAR CVAR POINTER + MOVEI B,RADDR(T,CVAR,NSLC) ;THIS WILL LOOK LIKE AN NSLC POINTER + JRST TERM4 + +TERM3: XCT GETCHR + JRST MIDEOF ;ILLEGAL EOF +TERM4: CAIN TTT,"," + JRST TERM3 ;SKIP COMMAS LIKE SPACES + CAIE TTT,40 + CAIN TTT,11 + JRST TERM3 + CAIN TTT,12 + JRST TERME + GETFS(T,CBND) ;EITHER NEED BLOCK OR ERROR + STORE(T,B,NSLC) ;STORE AS HIS NEXT SLICE BLOCK + MOVE B,T + BCLEAR(T,B,CBND) ;CLEAR OUT BLOCK + PUSHJ P,GTSLTT ;TRY TO READ SLOT + JRST ILLSLT ;APPEARED TO BE THERE, BUT WRONG FORMAT + HLRZ A,SLICEL + STORE(A,B,CDLC) ;STORE CARD LOC + CAIE TTT,"(" + JRST [ JUMPE A,ILLSLT + CAIE TTT,12 + CAIN TTT," " + JRST TERM4 ;SPACE AND LF ARE OK + CAIE TTT,"," ;AND COMMA + CAIN TTT,11 ;AND TAB + JRST TERM4 + JRST ILLSLT] +;HERE WE ARE READING A VARIABLE LIST + MOVNI T,400000 + STORE(T,B,LBND) + MOVEI T,377777 + STORE(T,B,UBND) + PUSHJ P,VCOPY ;COPY ANY VARS FROM HIGHER UP + MOVEI C,RADDR(B,VLST,NVAR);MAKE IT LOOK LIKE AN NVAR POINTER +GOTULB: PUSHJ P,SDECIN + JRST MIDEOF + CAIE TTT,74 + JRST CKUPR + HRLM A,1(C) + PUSHJ P,SDECIN + JRST MIDEOF +CKUPR: CAIE TTT,76 + JRST [ JUMPN A,ILLBND + JRST GOTLET] + HRRM A,1(C) + HLRE T,1(C) + CAMLE T,A + JRST ILLBND +RVARS1: XCT GETCHR + JRST MIDEOF +GOTLET: PUSHJ P,LETCHK + JRST ILLVAR + MOVEM TTT,LETTER + SETZM NDIG + PUSHJ P,SDECIN + JRST MIDEOF + CAIN TTT,"=" + JUMPE A,[SETZM NDIG + PUSHJ P,SDECIN + JRST MIDEOF + JRST .+1] + MOVEM A,WIDTH + MOVEI C,RADDR(B,VLST,NVAR) + MOVE T,LETTER + JRST CKVAR1 + +CKVAR2: FETCH(TT,C,LET) + CAMN T,TT + JRST [ FETCH(D,D,NVAR) + JRST CKVAR3] +CKVAR1: MOVE D,C + FETCH(C,C,NVAR) + JUMPN C,CKVAR2 + GETFS(C,VBLK) + CLEAR(C,NVAR) + STORE(C,D,NVAR) +CKVAR3: MOVE T,LETTER + STORE(T,C,LET) + MOVE T,WIDTH + STORE(T,C,VAL) + MOVE T,NDIG + STORE(T,C,WID) + CAIN TTT,"," + JRST RVARS1 ;MORE VARS + CAIE TTT,")" + JRST ILLVAR + JRST TERM3 + +MIDEOF: OUTSTR[ASCIZ/EOF IN MIDDLE OF TERM. +/] + JRST NERRET + +NOFNAM: OUTSTR[ASCIZ/NO FILENAME SEEN IN FILESPEC. +/] + JRST NERRET + +ILLSLT: OUTSTR[ASCIZ/ILLEGAL BOARD LOCATION. +/] + JRST NERRET + +ILLBND: OUTSTR[ASCIZ/ERROR IN BOUNDS ARGS. +/] + JRST NERRET + +ILLVAR: OUTSTR[ASCIZ/ERROR IN VARIABLE SPECIFICATION. +/] + JRST NERRET + +TERME: HLRZ B,DIRLST + FETCH(T,B,CVAR) ;CARD VAR LIST + JUMPN T,TERMF1 + SKIPN SLICEL ;ANY CRDLOC + SKIPE VARLST ;OR VARS? + CAIA ;YES, COPY THEM + JRST CPOPJ2 ;NO, THAT'S ALL + GETFS(T,CBND) + STORE(T,B,CVAR) + MOVE B,T + CLEAR(B,NSLC) + CLEAR(B,VLST) + HLRZ T,SLICEL + STORE(T,B,CDLC) + PUSHJ P,VCOPY + JRST CPOPJ2 + +;SET SLICE FROM I FILE +TERMF1: FETCH(B,B,CVAR) ;DO EACH +TERMG: FETCH(T,B,CDLC) + JUMPN T,TERMF ;ALREADY GOT ONE? + MOVE T,SLICEL + STORE(T,B,CDLC) ;STORE ONE FROM I FILE +TERMF: FETCH(B,B,NSLC) + JUMPN B,TERMG + JRST CPOPJ2 + +VCOPY: TLNN TFLG ;ANYTHING FROM INDIRECT TERM? + POPJ P, ;NO, RETURN IMMEDIATELY + MOVE T,UPPER + STORE(T,B,UBND) + MOVE T,LOWER + STORE(T,B,LBND) + SKIPN D,VARLST ;ANY VARS? + POPJ P, ;NO, THATS ALL + MOVEI C,RADDR(B,VLST,NVAR) +VCOPY1: GETFS(T,VBLK) + STORE(T,C,NVAR) + MOVE C,T + FETCH(T,D,VAL) + STORE(T,C,VAL) + FETCH(T,D,LET) + STORE(T,C,LET) + FETCH(T,D,WID) + STORE(T,C,WID) + FETCH(D,D,NVAR) + JUMPN D,VCOPY1 + CLEAR(C,NVAR) ;CLEAR LAST LINK + POPJ P, + +FVCOPY: HRRZ T,PINLOC + STORE(T,B,MCRD) + MOVE T,UPPER + STORE(T,B,MUBN) + MOVE T,LOWER + STORE(T,B,MLBN) + SKIPN D,VARLST + POPJ P, + MOVEI C,RADDR(B,MVLS,NVAR) + JRST VCOPY1 + SUBTTL FILENAME SCANNER +FTERM0: MOVE T,ATPPN + JRST FTERM1 + +FTERM: PUSHJ P,GETWRD + POPJ P, + SETZ T, +NODECOS,< DSKPPN T,> +FTERM1: MOVEM T,FILPPN + MOVE T,DEFEXT + MOVEM T,FILEXT + SETZM FILDAT +NOITS,< + JUMPN A,NEXIST + CAIE TTT,TEXIST + JRST NEXIST + PUSHJ P,CHRCHK + POPJ P, + CAIA ;DELIMITER AS EXPECTED + JRST CPOPJ1 + SKIPN A,LSTNAM + JRST CPOPJ1 +NEXIST: MOVEM A,FILNAM + CAIE TTT,"." + JRST FTERM2 + PUSHJ P,GETWRD + POPJ P, + HLLZM A,FILEXT +FTERM2: CAIE TTT,"[" + JRST FTERM3 +NOCMU,< + PUSHJ P,RDPPN + POPJ P, + HRLM A,FILPPN + CAIE TTT,"," + JRST NOPRG + PUSHJ P,RDPPN + POPJ P, + HRRM A,FILPPN +NOPRG: CAIN TTT,12 + JRST CPOPJ2 +>;NOCMU +CMU,< SETZM PPNBUF ;CLEAR OUT A BUFFER FOR THE PPN + SETZM PPNBUF+1 + SETZM PPNBUF+2 + MOVE A,[POINT 7,PPNBUF] + MOVEI T,=13 ;13 CHARACTERS AT MOST! +CMUPP4: XCT GETCHR ;GET A CHAR + POPJ P, + CAIL TTT,"0" ;0-9 ARE LEGAL IN PPN'S + CAILE TTT,"9" + CAIN TTT,"," ;SO IS COMMA + JRST CMUPP5 ;SO GO STORE IT + PUSHJ P,LETCHK + JRST CMUPP6 ;NO, MUST BE THE END +CMUPP5: IDPB TTT,A + SOJG T,CMUPP4 ;AND GO GET ANOTHER CHAR UNLES WE HAVE 13 + XCT GETCHR ;IN WHICH CASE WE GET THE "]" (WE HOPE!) + POPJ P, +CMUPP6: MOVE T,[XWD FILPPN,PPNBUF] + CMUDEC T, ;CONVERT THE PPN TO DEC FORMAT + POPJ P, ;WHOOPS, BAD PPN +>;CMU + CAIE TTT,"]" + POPJ P, + XCT GETCHR + POPJ P, +FTERM3: CAIN TTT,12 + AOS (P) + JRST CPOPJ1 +>;NOITS +ITS,< + CAIE TTT,";" + JRST FTERM2 + MOVEM A,FILPPN + PUSHJ P,FILWRD + POPJ P, +FTERM2: JUMPN A,NEXIST + CAIE TTT,TEXIST + JRST NEXIST + PUSHJ P,CHRCHK + POPJ P, ;EOF + CAIA ;DELIMITER + JRST CPOPJ1 ;ERROR + SKIPN A,LSTNAM + JRST CPOPJ1 +NEXIST: MOVEM A,FILNAM + CAIE TTT,40 + CAIN TTT,11 + JRST [ PUSHJ P,FILWRD + POPJ P, + JUMPE A,.+1 + MOVEM A,FILEXT + JRST .+1] +FTERM3: CAIN TTT,12 + JRST CPOPJ2 + CAIN TTT,"|" ;ALLOW CARD SPEC IN ITS FILE NAME + JRST [ MOVEI TT,40 ;SNAME;NAME1 NAME2|<CARD SPEC> + JRST CPOPJ2] + CAIN TTT,ALTMOD + JRST [ MOVEI TTT,40 + JRST CPOPJ1] + PUSHJ P,FILWRD + JRST FTERM3 +>;ITS + + +;STANDARD FILENAME SETUP (SINGLE FILENAME) +SETFIL: MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUTSIX DEFEXT + OUTSTR[ASCIZ/ FILENAME?/] + PUSHJ P,CFILE + POPJ P, + AOS (P) + PUSH P,A + MOVEI A,FILNAM + PUSHJ P,FILPNT + POP P,A + POPJ P, + +CFILE: MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + PUSHJ P,FTERM + JRST ERRET + JRST ERRET + SKIPE FILNAM + AOS (P) + POPJ P, + SUBTTL WIRINI, WIRGET, LSTGET, NTITLE, BRS1W, TREAD, TREADU +WIRINI: GETFS(L,LSTHEAD) + BCLEAR(T,L,LSTHEAD) + MOVEM L,WLLIST + MOVEM L,DEFLST + MOVEI TT,[ASCIZ/NIL/] + PUSHJ P,ASCCOP + STORE(T,L,WLID) ;NULL ID + PUSHJ P,USED ;USE D WIRELIST +DEC,< TRO PETIT!REFLAG > + POPJ P, + +WIRFOR: MOVE L,DEFLST + FETCH(L,L,INXT) + SKIPN L + MOVE L,WLLIST +WIRBK2: MOVEM L,DEFLST + FETCH(A,L,WLID) + PUSHJ P,STRTTY + OUTSTR[ASCIZ/ +/] + POPJ P, + +WIRBAK: MOVE W,DEFLST + CAMN W,WLLIST ;IF THIS IS FRONT, + SETZ W, ;THEN SEARCH FOR END + MOVE L,WLLIST +WIRBK1: FETCH(T,L,INXT) + CAMN T,W + JRST WIRBK2 + FETCH(L,L,INXT) + JUMPN L,WIRBK1 + JRST CPOPJ1 ;LOSE! + +WIRGET: PUSHJ P,FNDID + POPJ P, + JRST WIRGT1 + MOVEM L,DEFLST + JRST PUTFS + +WIRGT1: GETFS(L,LSTHEAD) + BCLEAR(T,L,LSTHEAD) + MOVE T,STRING + STORE(T,L,WLID) + MOVE W,DEFLST + FETCH(T,W,INXT) + STORE(T,L,INXT) + STORE(L,W,INXT) + MOVEM L,DEFLST + OUTSTR[ASCIZ/NEW WIRELIST. +/] + POPJ P, + +NOID: OUTSTR[ASCIZ/NO SUCH WIRELIST ID. +/] + MOVE B,STRING + JRST PUTFS + +FNDID: PUSHJ P,TREADU + POPJ P, + POPJ P, + MOVEM B,STRING + MOVE L,WLLIST +FNDID1: FETCH(T,L,WLID) + MOVE TT,STRING + PUSHJ P,TXTMAT + JRST FNDID2 + JRST FNDID2 + JRST CPOPJ2 + +FNDID2: FETCH(L,L,INXT) + JUMPN L,FNDID1 + JRST CPOPJ1 + + +WIRID: MOVE L,DEFLST + OUTSTR[ASCIZ/CURRENT WIRELIST ID IS /] + FETCH(A,L,WLID) + PUSHJ P,STRTTY + OUTSTR[ASCIZ/ +WIRELIST ID? /] + PUSHJ P,TREADU + POPJ P, + POPJ P, + FETCH(T,L,WLID) + STORE(B,L,WLID) + MOVE B,T + JRST PUTFS + +WIRPNT: OUTSTR[ASCIZ/ +/] + MOVE L,DEFLST +WIRPT1: FETCH(A,L,WLID) + PUSHJ P,STRTTY + FETCH(A,L,WLNM) + JUMPE A,WIRPT2 + OUTCHR[11] + PUSHJ P,STRTTY +WIRPT2: OUTSTR[ASCIZ/ +/] + FETCH(W,L,BLST) + JUMPE W,WIRPT3 + FETCH(W,W,WBDY) + JUMPE W,WIRPT3 + OUTSTR[ASCIZ/ BP /] + SETZ T, +WIRBP1: ADDI T,1 + FETCH(W,W,NXTB) + JUMPN W,WIRBP1 + PUSHJ P,WIRPT9 +WIRPT3: ADDI T,1 + FETCH(W,L,WIRL) + JUMPE W,WIRPT4 + OUTSTR[ASCIZ/ D /] + SETZ T, +WIRD1: ADDI T,1 + FETCH(W,W,NXTWL) + JUMPN W,WIRD1 + PUSHJ P,WIRPT9 +WIRPT4: FETCH(W,L,PCWL) + JUMPE W,WIRPT5 + OUTSTR[ASCIZ/ PC /] + SETZ T, +WIRPC1: ADDI T,1 + FETCH(W,W,NXTWL) + JUMPN W,WIRPC1 + PUSHJ P,WIRPT9 +WIRPT5: FETCH(L,L,INXT) + SKIPN L + MOVE L,WLLIST + CAME L,DEFLST + JRST WIRPT1 + POPJ P, + +WIRPT9: PUSH P,T + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ BOARD/] + POP P,T + CAIE T,1 + OUTCHR["S"] + OUTSTR[ASCIZ/ +/] + POPJ P, + + +NTITLE: MOVE L,DEFLST + FETCH(A,L,WLNM) + JUMPE A,NTITL1 + OUTSTR[ASCIZ/CURRENT TITLE IS /] + PUSHJ P,STRTTY + OUTSTR[ASCIZ/ +/] +NTITL1: OUTSTR[ASCIZ/WIRE LIST TITLE?/] + PUSHJ P,TREAD + POPJ P, + SETZ B, ;STORE 0 FOR BLANK LINE + FETCH(T,L,WLNM) ;GET WIRE LIST NAME POINTER + STORE(B,L,WLNM) + JUMPE T,CPOPJ + MOVE B,T + JRST PUTFS + +LSTGET: FETCH(W,L,WIRL) + SKIPN USEDWL + FETCH(W,L,PCWL) +LSTGT0: MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + JUMPE W,NXCARD + FETCH(T,W,NXTWL) + JUMPE T,[FETCH(T,W,FCRD) + HRLZM T,SLICEL ;SAVE FOR FURTHER REFERENCES + HRLZM T,ALLCRD + JUMPE T,BLANKL ;DON'T PRINT BLANK + OUTCHR[11] + PUSHJ P,BRS1W + BLANKL: OUTSTR[ASCIZ/ +/] + JRST CPOPJ1] ;IF ONLY ONE, JUST RETURN IT! + OUTSTR[ASCIZ/CARD LIST (/] + OUTSTR @SLTCUE ;PRINT CUE MESSAGE HERE + OUTSTR[ASCIZ/)?/] + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + PUSHJ P,GETSLT + JRST LSTERR + CAIE TTT,12 + JRST LSTERR +GETLOP: FETCH(T,W,FCRD) ;GET CARD SPEC + HRLZ T,T + CAMN T,SLICEL + JRST [ MOVEM T,ALLCRD + JRST CPOPJ1] + FETCH(W,W,NXTWL) + JUMPN W,GETLOP +NXCARD: OUTSTR[ASCIZ/NO SUCH CARD! +/] + POPJ P, + +BRS1W: PUSH P,A + FETCH(A,W,FCRD) + PUSH P,TTT + PUSH P,PUTCHR + MOVE TTT,[OUTCHR TTT] + MOVEM TTT,PUTCHR + PUSHJ P,SLTOUT + POP P,PUTCHR + POP P,TTT + POP P,A + POPJ P, + +LSTERR: SETZ W, ;RETURN NULL POINTER + CAIN TTT,ALTMOD + POPJ P, + OUTSTR[ASCIZ/INPUT ERROR! +/] + CAIE TTT,12 + PUSHJ P,TREAD ;GOBBLE REST OF LINE + POPJ P, + POPJ P, + JRST PUTFS + + ;TREAD - READ TEXT STRING +; (TREADU CONVERTS TO UPPER CASE) +;RETURNS, +1 - ALTMODE, +2 - NULL STRING, +3 - else +;B = STRING +TREADU: SETOM LOW2UP + CAIA +TREAD: SETZM LOW2UP + GETFS (B) + HRRZ T,B + ADD T,[POINT 7,1] + SETZM -1(T) + SETZM (T) +TREAD2: PUSHJ P,TTYIN + JFCL + CAIN TTT,ALTMOD ;LET HIM OUT ON ALTMODE AND + JRST [ OUTSTR[ASCIZ/ +/] + JRST PUTFS] ;RETURN STRING + CAIN TTT,12 ;ON LF + JRST [ AOS (P) + SKIPE 1(B) + JRST CPOPJ1 + JRST PUTFS] + TLNE T,760000 ;END OF WORD? + JRST TREAD1 ;NO + GETFS (TT) + HRRM TT,-1(T) + HRR T,TT + SETZM (T) + SETZM 1(T) +TREAD1: SKIPN LOW2UP + JRST TREAD3 + CAIL TTT,"A"+40 + CAILE TTT,"Z"+40 + CAIA + SUBI TTT,40 ;CONVERT LC TO UC +TREAD3: IDPB TTT,T + JRST TREAD2 diff --git a/src/wl/wlin.332 b/src/wl/wlin.332 new file mode 100644 index 00000000..efcd5a08 --- /dev/null +++ b/src/wl/wlin.332 @@ -0,0 +1,2365 @@ +;<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 diff --git a/src/wl/wllast.300sav b/src/wl/wllast.300sav new file mode 100755 index 00000000..1c8b7102 --- /dev/null +++ b/src/wl/wllast.300sav @@ -0,0 +1,5 @@ + +XLIST +LIT +LIST +END STRT diff --git a/src/wl/wlout1.504 b/src/wl/wlout1.504 new file mode 100644 index 00000000..60433475 --- /dev/null +++ b/src/wl/wlout1.504 @@ -0,0 +1,3420 @@ +;<WIRELIST>WLOUT1.FAI.147, 25-NOV-75 17:53:17, EDIT BY HELLIWELL +SUBTTL 'TTY' PRINT ONE SIGNAL ON TTY! +TLSTBP: TRO ISBACK + OUTSTR[ASCIZ/ +SIGNAL NAME?/] + JRST TLIST1 + +TLISTA: OUTSTR[ASCIZ/ +SIGNAL NAME?/] + TRZ ISBACK + TRO DOALLC + JRST TLIST2 + +TLISTB: OUTSTR[ASCIZ/ +SIGNAL NAME?/] +TLIST: TRZ ISBACK +TLIST1: TRZ DOALLC +TLIST2: +ROUTE,< TRZ DOROUT > + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + PUSHJ P,TTYSIG + POPJ P, ;NULL STRING OR ALTMODE + LDB T,[POINT 7,STRTAB,6];GET FIRST CHAR + CAIE T,FORALL ;USE FOR ALL CHAR AS "BOTH" SIGS + JRST TLISTX + MOVEI T," " + DPB T,[POINT 7,STRTAB,6] + PUSHJ P,TLISTX + MOVEI T,NOTCHR + DPB T,[POINT 7,STRTAB,6] +TLISTX: MOVE A,[POINT 7,STRTAB] ;POINTER TO BEGINNING OF STRING + PUSHJ P,PERMUT + MOVEI T,CMPWRD + MOVEM T,SAVET + MOVE T,[PUSHJ P,TTYOUT] ;THIS GUY WILL COUNT ALL THE RIGHT THINGS + MOVEM T,PUTCHR + SETOM TTYFLG ;FLAG TTY OUTPUT + SETZM LCOUNT ;NORMALLY DONE BY OUTSET + SETZM CDSKPC ;COUNT OF # SIGNALS SEEN + MOVE L,DEFLST + TRNE ISBACK + JRST [ FETCH(W,L,BLST) + JUMPE W,XBAK + PUSHJ P,ISBP ;CALL SUBR + SKIPG CDSKPC + OUTSTR[ASCIZ/SIGNAL NOT FOUND! +/] + POPJ P,] + TRNN DOALLC + JRST DOONE + FETCH(W,L,WIRL) + SKIPN USEDWL + FETCH(W,L,PCWL) + JUMPE W,NXCARD +DOALL: PUSHJ P,ISBP + FETCH(W,W,NXTWL) + JUMPN W,DOALL + POPJ P, + +DOONE: PUSHJ P,LSTGET ;NOW GET RIGHT CARD + POPJ P, + PUSHJ P,ISBP + SKIPG CDSKPC + OUTSTR[ASCIZ/SIGNAL NOT FOUND! +/] + POPJ P, + + ;ISBP - PRINT SIGNAL ASKED FOR +;W = WIRELIST +;PERMTB = SIGNAL NAME +;(ALSO SAVBIT,VOLTAGE RELEVANT) + +ISBP: LDB TTT,[POINT 7,PERMTB,6];FIRST CHAR OF NAME + CAIN TTT,GENCHR ;IS IT GENERATED? + JRST REDGEN ;READ # FROM STRING +NOTGEN: PUSHJ P,TXTFND ;FIND THIS SIGNAL NAME + POPJ P, + MOVE C,E ;EQUIVALENT, USE E +ISGENP: AOS CDSKPC ;COUNT SIGS SEEN + FETCH(T,C,WBIT) + TRNN T,NAM2ND + SKIPA G,C + FETCH(G,C,WPIN) + TRNN ISBACK + TRNN DOALLC ;NEED CARD LOC? + JRST TLISTT + FETCH(T,W,FCRD) + HRLZM T,SLICEL + SKIPE SLICEL + PUSHJ P,PSLICL + CRLF +TLISTT: SKIPA F,G ;ALL RIGHT, SO F CAN'T BE AC 0 +TLISTS: CRLF + PUTSIG ADDR(F,SPNT) + FETCH(F,F,NNAM) + JUMPN F,TLISTS + TRNE ISBACK + JRST BAKLOP + JRST WIRLOP + +REDGEN: MOVEI T,CMPWRD + MOVEM T,SAVET + PUSHJ P,GENFND + JRST NOTGEN ;NOT FOUND, TRY AS REGULAR SIGNAL + MOVE C,E + JRST ISGENP + SUBTTL 'WL' 'BL' SETUP, CALL BODY LIST SUBR +;LIST BODIES CROSS-REFERENCE AND WIRE LISTS + +ROUTE,< +ROUTIT: SKIPN ISWW + JRST NXWW + TRO DOROUT + TRZ ISBACK + SETZM TINCHS + SETZM NWIRES + SETZM NRUNS + JRST LIST0 +>;ROUTE + +BAKLST: TROA ISBACK +LIST: TRZ ISBACK +LIST0: MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE L,DEFLST + TRNE ISBACK + JRST [ FETCH(W,L,BLST) + JUMPE W,[XBAK:OUTSTR[ASCIZ/NO BACK PANEL WIRELIST! +/] + POPJ P,] + MOVSI T,'BL ' + JRST BLSTNM] + PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD! + POPJ P, +ROUTE,< TRNN DOROUT + JRST NROUT1 + PUSHJ P,CLEARP ;CLEAR MARK BITS FOR ROUTER + MOVSI T,'WLR' + JRST ISROUT + +NROUT1: +>;ROUTE + MOVSI T,'WL ' ;WIRE LIST FILE EXTENSION +ISROUT: +BLSTNM: MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + PUSHJ P,FILLST + PUTHDR ;ROUTINE TO CALL AFTER HEADER SETUP + TRNE ISBACK + SKIPA T,[[ASCIZ/SLOTS IN USE/]] + MOVEI T,[ASCIZ/LOC DIPTYPE BODY FILE POS/] + MOVEM T,HEADER + SETZM LINCNT + MOVEI T,WLBMAR + MOVEM T,MARGIN + MOVEI H,RADDR(W,WBDY,NXTB) + SETZM SAVET ;LAST LOC PRINTED + TRNE ISBACK + JRST SLTLST + SETZM NBODS ;LAST BODY NAME PRINTED + SETZM LSTDIP ;LAST DIP NAME PRINTED + JRST BSTR1 + +BSTR: PUSHJ P,LSTLOP +BSTR1: FETCH(H,H,NXTB) + JUMPN H,BSTR + JRST NOBODS + +;PRINT "BODIES" FOR BACKPANEL LIST +SLTLS1: SKIPL LINCNT + PUSHJ P,PUTHDR + FETCH(A,H,BLOC) + PUSHJ P,SLTOUT + MOVE T,LCOUNT + CAIGE T,=64 ;MORE THAN 9 COLUMNS? + JRST [ PUTBYT 11 ;NO, TAB NOT CRLF + JRST SLTLST] + CRLF +SLTLST: FETCH(H,H,NXTB) + JUMPN H,SLTLS1 + JRST NOSLTS + + ; BODY LIST SUBR +LSTLOP: FETCH(A,H,BLOC) + CAMN A,SAVET ;DIFFERENT LOC FROM LAST? + JRST [ JUMPN A,SAMLOC ;IF NOT ZERO GO ON + SKIPGE LINCNT ;NEED A HEADER + JRST SAMLOC ;NO + PUSHJ P,PUTHDR ;YES + JRST SAMLC1] ;CONTINUE + MOVEM A,SAVET + SKIPL LINCNT + PUSHJ P,PUTHDR + FETCH(T,H,BBIT) + PUSHJ P,WLOCOUT ;PRINT LOC (IN A, BBIT IN T) +SAMLC1: SETZM NBODS ;CLEAR LAST BODY NAME POINTER, SO WILL PRINT ON NEW PAGE + SETZM LSTDIP ;ALSO DIP TYPE +SAMLOC: PUTBYT 11 + FETCH(T,H,BBIT) + TRNE T,CBODY ;CON? + SKIPA A,[-1] + FETCH(A,H,DIPT) ;DIP POINTER + SKIPN A + MOVNI A,2 + CAMN A,LSTDIP + JRST SAMDIP + MOVEM A,LSTDIP + JUMPL A,[PUTSTR (A)2+[ASCIZ/NONE/ + ASCIZ/CON/] + JRST SAMDIP] + FETCH(A,A,DNAM) ;NAME POINTER + PUSHJ P,PRINT7 ;PRINT 7 CHARS OF NAME +SAMDIP: PUTBYT 11 + MOVEI T,ADDR(H,BNAM) + EXCH T,NBODS + JUMPE T,NSAMBD + MOVE TT,NBODS + PUSHJ P,SEQMAT + JFCL + CAIA + JRST SAMBOD +NSAMBD: PUTSTR ADDR(H,BNAM) +SAMBOD: PUTBYT 11 + FETCH(A,H,FILB) + PUTSIX ADDR(A,FILN) ;FILENAME + PUTBYT 11 + FETCH(A,H,BBIT) + PUSHJ P,BPPNT + CRLF + POPJ P, + + ;PBODY - PRINT "<BODY NAME> AT <SOCKET>, DRAWING LOC <X,Y>" +;A = BODY +PBODY: PUSH P,A + PUTSTR [ASCIZ /BODY "/] + PUTSTR ADDR(A,BNAM) + PUTSTR [ASCIZ /"/] + FETCH(A,A,BLOC) + JUMPE A,PBODY1 + PUTSTR [ASCIZ / AT /] + PUSHJ P,LOCOUT +PBODY1: MOVE A,(P) + FETCH(A,A,BBIT) + TRNN A,BANYPOS + PUTSTR [ASCIZ /, DRAWING LOC /] + PUSHJ P,BPPNT + JRST POPAJ + +BPPNT: TRNN A,BANYPOS ;ANY POSITIONS? + POPJ P, + LDB T,[POINT BYPOSL,A,35-BYPOSB] + PUTBYT @N2L+1(T) + LDB T,[POINT BXPOSL,A,35-BXPOSB] + ADDI T,1 + JRST DECOUT + +;PRINT CONNECTOR PIN APPROX X,Y +CNPNT: TRNN A,CANYPOS ;ANY POSITIONS? + POPJ P, + LDB T,[POINT CYPOSL,A,35-CYPOSB] + PUTBYT @N2L+1(T) + LDB T,[POINT CXPOSL,A,35-CXPOSB] + ADDI T,1 + JRST DECOUT + ; PRINT SIGNAL NAMES, CALL WIRE SUBR +NOSLTS: MOVEI T,[ASCIZ/SIGNAL NAME INPUT OUTPUT SOURCE + SLOT PIN Q TYPES LOW HI LOW HI FILE POS PRINT/] + JRST GWHDR + +NOBODS: MOVEI T,[ASCIZ/SIGNAL NAME + LOC(PIN#) TYPE LOW HI USE DIPTYPE BODY FILE POS/] +ROUTE,< TRNE DOROUT + MOVEI T,[ASCIZ/SIGNAL NAME + LOC(PIN#) Z TYPE LOW HI INCHES USE DIPTYPE BODY FILE POS/] +>;ROUTE +GWHDR: MOVEM T,HEADER + SETZM LINCNT ;FORCE NEW HEADER OUT (USE SAME MARGIN) + MOVEI T,WLWMAR + MOVEM T,MARGIN + SETZM ISRAY +ROUTE,< TRNN DOROUT ;ROUTING? + JRST NOVGRN + MOVE T,[RPGY,,FUCKUP] ;THIS IS ROUTINE TO CALL + PUSHJ P,PGSPEC ;CALL SPECIAL ROUTINE TO DO PWR AND GND +NOVGRN: +>;ROUTE + FETCH(H,W,WIRES) + JUMPE H,NOSTRS +STRLOP: MOVE G,H + FETCH(A,H,WBIT) + PUSHJ P,GWIRBT ;GET WIRE BITS IN LEFT HALF OF A +ROUTE,< TRNN DOROUT ;IF ROUTING + JRST ROUSIN + TLNE A,SPWR!SGND ;DID PWR AND GND, SO + JRST WIRNON ;SKIP IT NOW + JRST ROUGEN +ROUSIN: +>;ROUTE + TLC A,GENSIG!WSINGL ;SINGLE UNNAMED PIN? + TLNN A,WNULL ;OR NULL RUN? + TLCN A,GENSIG!WSINGL + JRST WIRNON ;YES, DO IT LATER +ROUGEN: PUSHJ P,DOSTRS ;CHECK AND MAYBE PRINT SIGNAL NAMES + JRST WIRNON ;NO PRINT WIRE +ISWIRE: MOVE G,H ;WIRE POINTER + TRNE ISBACK + JRST [ PUSHJ P,BAKLOP + JRST WIRNON] +WIRSOM: +ROUTE,< TRNE DOROUTE + JRST WIRROU +ROUSIM: ;SIMPLE RUNS JUMP BACK HERE + SETOM ZLEVN ;DISABLE Z LEVEL PRINT + SETZM WIRELN ;CLEAR WIRE LENGTH CELL +>;ROUTE + PUSHJ P,WIRLOP +WIRNON: FETCH(H,H,ALPH) + JUMPN H,STRLOP +ROUTE,< TRNE DOROUT + JRST NOSTRS +>;ROUTE + MOVEI T,[ASCIZ/UNUSED PINS INPUT OUTPUT + SLOT PIN TYPES LOW HI LOW HI FILE/] + TRNN ISBACK + MOVEI T,[ASCIZ/UNUSED PINS + LOC(PIN#) TYPE LOW HI USE DIPTYPE BODY FILE POS/] + MOVEM T,HEADER + SETZM LINCNT + FETCH(H,W,WIRES) +GENSIN: FETCH(A,H,WBIT) + MOVE G,H + PUSHJ P,GWIRBT + TLNE A,GENSIG!WNULL + TLNN A,WSINGL!WNULL + JRST NOGNSN + PUSHJ P,DOSTRS + JRST NOGNSN + MOVE G,H + TRNN ISBACK + JRST WIRGSN + PUSHJ P,BAKLOP + JRST NOGNSN + +WIRGSN: PUSHJ P,WIRLOP +NOGNSN: FETCH(H,H,ALPH) + JUMPN H,GENSIN +NOSTRS: +ROUTE,< TRNN DOROUTE + JRST NOWIRS + SKIPL LINCNT + PUSHJ P,PUTHDR + CRLF + CRLF + PUSHJ P,PTOTS ;TOTALS TO FILE + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUSHJ P,PTOTS ;AND TO TTY +NOWIRS: +>;ROUTE + RELEASE LST, + POPJ P, + +GWIRBT: TRNN A,NAM2ND ;IS IT HEADER BLOCK? + JRST [ HRL A,A ;YES, JUST COPY BITS + POPJ P,] + FETCH(T,H,WPIN) + FETCH(T,T,WBIT) + HRL A,T + POPJ P, + +DOSTRS: TRNE REFLAG ;DOING REFERENCE HACK? + JRST STRLP0 ;YES, SKIP TEST + TRNE A,NAM2ND ;SECOND NAME? + POPJ P, ;YES, SKIP IT +STRLP0: SKIPL LINCNT + PUSHJ P,PUTHDR +STANFO,< CAIA > ;SOME PEOPLE WANT TO WASTE SPACE +STRLP1: CRLF + PUTSIG ADDR(G,SPNT) + FETCH(G,G,NNAM) ;NEXT ONE + JUMPN G,STRLP1 + FETCH(G,H,WBIT) + TRNN G,NAM2ND ;DID WE START WITH FIRST? + JRST CPOPJ1 ;YES, DONE + FETCH(G,H,WPIN) ;NO, GET FIRST + CRLF + PUTSIG ADDR(G,SPNT) + PUTSTR[ASCIZ/ ____ REFERENCE/] + JRST STRLP3 + +STRLP2: CRLF + PUTSIG ADDR(G,SPNT) +STRLP3: FETCH(G,G,NNAM) ;NEXT + CAIE G,(H) ;BACK TO OURSELVES YET? + JUMPN G,STRLP2 + CRLF + CRLF ;MAKE SURE IT IS SEPARATED + POPJ P, + +ROUTE,< +WIRROU: FETCH(T,H,WBIT) ;WE KNOW NOW THAT THIS IS A HEADER BLOCK + TRNE T,SPWR!SGND + JRST WIRNON ;DONE ALREADY + TRNE T,WNULL + JRST [ ERRSTR 0,[ASCIZ/NULL RUN/] + JRST ROUSIM] + TRNE T,WSINGL + JRST [ ERRSTR 0,[ASCIZ/ONE PIN RUN/] + JRST ROUSIM] + TRNE T,SNC + JRST [ ERRSTR 0,[ASCIZ/NO-CONNECTION RUN/] + JRST ROUSIM] + PUSHJ P,ROUWR1 ;ROUTE AND PRINT + JRST WIRNON + +PTOTS: MOVE T,NWIRES + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ TOTAL WIRES +/] + MOVE T,NRUNS + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ TOTAL RUNS +/] + MOVE T,TINCHS + MOVEM T,WIRELN + PUSHJ P,DOWLEN + PUTSTR[ASCIZ/ INCHES OF WIRE +/] + POPJ P, +>;ROUTE + ; PRINT WIRE SUBR +WIRLOP: MOVEM G,WIRTMP ;SAVE WIRE HEADER POINTER + FETCH(G,G,WPIN) ;GET FIRST PIN + JUMPN G,WIRLP1 ;IS THERE ONE? + ERRSTR 0,[ASCIZ/NULL WIRE/] + POPJ P, + +;COME BACK HERE IF CAN'T ROUTE +WIRLP1: PUSHJ P,WIRLP0 ;PRINT A PIN + FETCH(G,G,NXTP) + JUMPN G,WIRLP1 + JRST WIRERR ;END ROUTINE + +WIRLP0: +NODEC,< MOVE T,LCOUNT ;WELL, IF THE SIGNAL NAME IS ON THE + CAIL T,8 ;SAME LINE AS A PIN, COBOL WILL LOSE!! +>;NODEC +DEC,< SKIPE LCOUNT > + CRLF + PUTBYT 11 + FETCH(F,G,PBDY) ;F GETS BODY POINTER + SETZM TCOUNT + FETCH(A,F,BLOC) + FETCH(T,G,PINN) + HRLI A,(T) + FETCH(T,F,BBIT) + TRNN T,CBODY ;CONNECTOR PIN? + JRST NCONPN ;NO +; Print "Pinloc Z\ PG CON" +; Zlevel info, default pinanme, invented flag + PUSHJ P,LOCPNW + FETCH(T,G,PBIT) + PUSHJ P,PTAB + SKIPN ISWW + JRST NCGND + FETCH(A,F,BLOC) ;ON W/W BOARDS, FLAG CONNECTORS THAT ARE PWR/GND + FETCH(TT,G,PINN) + HRL A,TT + TLO A,MAPCON + PUSHJ P,PINBIT + TLNN TT,PWR + JRST NCPWR + PUTBYT PWRCHR +NCPWR: TLNN TT,GND + JRST NCGND + PUTBYT GNDCHR +NCGND: FETCH(T,G,PBIT) ;GET PIN BITS + TRNN T,TRMBTS ;ANY TERMINATOR RULE? + JRST NTRMRL ;NO + PUTBYT "(" + LDB T,[POINT TRMBSZ,T,TRMBPS+=18] + PUSHJ P,DECOUT + PUTBYT ")" +NTRMRL: SETZ A, ;CLEAR PIN TYPE POINTER + PUTSTR[ASCIZ/ CON /] + JRST NOTNAM + + ;PRINT DIP PIN INFO +; " Pinloc Z\ *% type" +NCONPN: FETCH(B,F,BPAK) + PUSHJ P,LOCPNP + FETCH(T,G,PBIT) + PUSHJ P,PTAB + FETCH(A,G,PTYP) + JUMPN A,GOTPIN + PUTSTR[ASCIZ/UN /] + JRST WASNUL + +GOTPIN: FETCH(TT,A,DPBIT) + TRNN TT,NULLD ;NULL LOAD? + JRST NOTNUL + PUTSTR[ASCIZ/NC /] + JRST WASNUL + +NOTNUL: TRNE TT,INLD!GND!PWR!TERM!OUTLD ;DO WE RECOGNIZE THIS PIN? + JRST WILPNT ;YES, WILL PRINT + PUTSTR[ASCIZ/OOPS /] + JRST WASNUL + +WILPNT: EXCH A,TT + PUSHJ P,PNTYPE ;PRINT TYPE CHARACTERS + EXCH A,TT + PUTBYT 11 + FETCH(B,G,PBIT) ;FOR DUP CHECK + FETCH(T,A,LLOW) + FETCH(TTT,A,LHI) + HRL T,TTT + TRNN TT,INLD + JRST NINLD + PUSH P,T + FETCH(TTT,G,PBIT) + TRNN TTT,PSHARE ;SHARED LOAD? + JRST WASNEG + PUTBYT "(" + HRRE T,(P) + PUSHJ P,LDOUT + PUTSTR[ASCIZ/) /] + POP P,T + HLRZ T,T + PUSHJ P,LDOUT + JRST WASSHR + +NINLD: TRNE TT,GND + JRST WASNUL ;NOTHING FOR GROUNDS + TRNN TT,PWR + JRST NTPWR + HLRE TT,T + HRRE T,T + PUSH P,TT + SKIPLE T + PUTBYT "+" + PUSHJ P,LDOUT + PUTSTR[ASCIZ/V /] + POP P,T + PUSHJ P,LDOUT + PUTSTR[ASCIZ/MA/] + JRST WASSHR + +NTPWR: TRNN TT,TERM ;TERMINATOR? + JRST NTTERM + PUSH P,T + JRST WASNEG + + +;HERE WE KNOW IT IS AN OUTPUT (THAT'S ALL THAT'S LEFT). +NTTERM: TRNN TT,OPENC + JRST NOPENC + HRRE T,T + TRNN B,DUP + JRST WASLCL + PUTBYT "(" + PUSHJ P,LDOUT + PUTBYT ")" + JRST WASNUL + +NOPENC: PUSH P,T + TRNE TT,PULL ;OUTPUT PULLUP? + JRST WASPUL +WASNEG: TRNE B,DUP + PUTBYT "(" + HRRE T,(P) + PUSHJ P,LDOUT + TRNE B,DUP + PUTBYT ")" +WASPUL: PUTBYT 11 + TRNE B,DUP + PUTBYT "(" + POP P,T + HLRE T,T + PUSHJ P,LDOUT + TRNE B,DUP + PUTBYT ")" + JRST WASSHR + +WASLCL: PUSHJ P,LDOUT +WASNUL: PUTBYT 11 +WASSHR: +ROUTE,< TRNN DOROUT ;NEED INCHES COLUMN? + JRST NOWLEN + PUTBYT 11 + SKIPN WIRELN + JRST NOWLEN ;NO + PUSHJ P,DOWLEN +NOWLEN: +>;ROUTE + PUTBYT 11 + JUMPE A,NOUSE1 ;ANY TYPE POINTER + FETCH(A,A,DUSE) + PUTSIX A +NOUSE1: PUTBYT 11 + FETCH(T,F,DIPT) ;DIP TYPE POINTER + SETZM TCOUNT + JUMPE T,WNONAM + FETCH(A,T,DNAM) ;DIP NAME + PUSHJ P,STROUT +WNONAM: PUTBYT 11 + PUTSTR ADDR(F,BNAM) +NOTNAM: PUTBYT 11 + FETCH(A,G,FILP) ;PIN FILE POINTER + PUTSIX ADDR(A,FILN) + PUTBYT 11 + FETCH(A,F,BBIT) ;APPROX POS + TRNN A,CBODY + JRST BPPNT ;AND PRINT + FETCH(A,G,PBIT) + JRST CNPNT + + ;PTAB - PRINT ZLEVEL INFO AND FLAG INVENTED/DEFAULT PIN NAME +;T = PBIT +;ZLEVN = Z-LEVEL +PTAB: MOVE TT,TCOUNT + SUBI TT,=17 ;LOC NAMES CAN BE 16 LONG + PUTBYT " " + AOJL TT,.-1 +ROUTE,< TRNN DOROUT ;ARE WE ROUTING? (NEED Z LEVEL) + JRST NOZLEV + MOVE TT,ZLEVN + JUMPL TT,NOZLV1 + PUSH P,T +STANFO,< PUTSTR (TT)[ + ASCIZ/ |/ ;0 MIDDLE OF RUN LEVEL 1 + ASCIZ/ |/ ;1 " 2 + ASCIZ/ \/ ;2 BEGIN RUN LEVEL 1 TO 2 + ASCIZ/ ./ ;3 BEGIN RUN LEVEL 1 TO 1 + ASCIZ/ |/ ];4 END RUN +>;STANFO +NOSTANFO,< PUTSTR (TT)[ + ASCIZ/ !./ ;0 MIDDLE OF RUN LEVEL 1 + ASCIZ/ .!/ ;1 " 2 + ASCIZ/ \/ ;2 BEGIN RUN LEVEL 1 TO 2 + ASCIZ/ ./ ;3 BEGIN RUN LEVEL 1 TO 1 + ASCIZ/ !/ ];4 END RUN +>;NOSTANFO + TRNE TT,1 + TDZA TT,TT + MOVEI TT,1 + MOVEM TT,ZLEVN + POP P,T +NOZLV1: +NOZLEV: +>;ROUTE + PUTBYT 11 + TRNE T,PIDPIN + SKIPA TTT,["*"] + MOVEI TTT," " + TRNE T,INVENT + MOVEI TTT,"%" + XCT PUTCHR + POPJ P, + ; END WIRE SUBR, PRINT ERRORS +;WIRTMP = WIRE +FINWIR: MOVEM G,WIRTMP +WIRERR: MOVE G,WIRTMP + FETCH(T,G,WBIT) + TRNE T,SNC ;IS THIS AN NC WIRE? + JRST BAKSNC ;YES, PRINT MESSAGE AND BE DONE + TLZ BAKGAT ;NOT BACKPANEL + TLO DOLC ;ACCUMULATE LOADING AND COUNTS + PUSHJ P,LOPSET ;SETUP COUNTERS AND A + PUSHJ P,GATHER + PUSHJ P,LODMER ;CALC PROPER LOADING + MOVE G,WIRTMP + TLNN A,CABRUN + JRST ISSIG + PUSH P,A + MOVEI A,8 + CAMG A,LCOUNT + CRLF + PUSHJ P,FILL + POP P,A + PUTSTR[ASCIZ/ "CABLE RUN"/] +ISSIG: TLNE A,WSINGL!WNULL ;THESE DON'T NEED LOADING SUMMARY + JRST NOTLEN + PUSH P,A + MOVEI A,5*8 ;4TH TAB STOP +; CAMG A,LCOUNT + CRLF + PUSHJ P,FILL + POP P,A + SKIPE T,NPULL + JRST [ CAME T,ANYOUT ;ALL OUTPUTS PULLUPS? + JRST .+1 + TLO TFLG + PUTBYT "(" + MOVE T,LINH + PUSHJ P,LDOUT + PUTBYT ")" + PUTBYT "/" + JRST PULNLY] + TLZ TFLG ;ASSUME NOT PRINT HI + SKIPN T,LINL + JRST [ SKIPN NPWR + JRST NOTPWR + PUTSTR [ASCIZ/PWR/] + JRST NOHIPN + NOTPWR: SKIPN NGND + JRST .+1 + PUTSTR [ASCIZ/GND/] + JRST NOHIPN] + PUSHJ P,LDOUT + SKIPN NTERM + SKIPE NIN + SKIPN ANYOUT + JRST NOHIPN + SKIPE LINH + SKIPN LOUTH + JRST NOHIPN + SKIPE LINL + SKIPN LOUTL + JRST NOHIPN + MOVE T,LINL + ADD T,LOUTL + JUMPE T,MUSTHI + EQV T,LOUTL + JUMPGE T,MUSTHI + JRST MUSTHI ;BETTER PRINT HI + HRLZ T,LINL + IDIV T,LOUTL + MOVM T,T + HRLZ TT,LINH + IDIV TT,LOUTH + MOVM TT,TT + CAMGE TT,T + JRST NOHIPN +MUSTHI: TLO TFLG + PUTBYT "(" + MOVE T,LINH + PUSHJ P,LDOUT + PUTBYT ")" +NOHIPN: PUTBYT "/" + MOVE T,LOUTL + PUSHJ P,LDOUT + TLNN TFLG + JRST NOTOUT +PULNLY: PUTBYT "(" + MOVE T,LOUTH + PUSHJ P,LDOUT + PUTBYT ")" +NOTOUT: +ROUTE,< TRNN DOROUTE + JRST NOTLEN + SKIPE T,INCHES ;ANY TOTAL WIRE LENGTH? + CAMN T,WIRELN ;ONLY PRINT IF DIFFERENT FROM LAST + JRST NOTLEN + MOVEM T,WIRELN + PUSH P,A + MOVEI A,=48 + PUSHJ P,FILL + POP P,A + PUSHJ P,DOWLEN +>;ROUTE +NOTLEN: MOVSI F,-SUMLEN + PUSHJ P,ERRLOP +ERDONE: SKIPE LCOUNT ;AT LEFT? + CRLF ;NO, GET THERE + POPJ P, + ; HEADER SUBRS +PUTHDR: TLZN NOFF + PUTSTR[BYTE(7)15,14] + PUSH P,A + MOVN TTT,PAGLEN + ADD TTT,MARGIN + MOVEM TTT,LINCNT + FETCH(A,L,WLNM) ;NAME OF WIRE LIST + SETZM TCOUNT + PUSHJ P,STROUT + PUSHJ P,PNTBRW ;PRINT BAY-RACK-SLOT + POP P,A + CRLF + PUTSTR @HEADER + PUTSTR[ASCIZ/ + +/] + POPJ P, + +;TITLE PARAMETERS +FNPOS__=32 ;4 COLUMNS FOR WIRE LIST TITLE +DTPOS__FNPOS+=24 ;SO THE LINE OVERFLOWS IF DEC HAS LARGEST NAME +CLPOS__DTPOS+=24 + +PNTBRW: FETCH(A,W,FCRD) +PNTBRS: PUSH P,A + PUSHJ P,PNTFDT + SKIPN (P) + JRST [ POP P,(P) + POPJ P,] + MOVEI A,CLPOS + PUSHJ P,FILL + POP P,A + JRST SLTOUT + +PNTFDT: SKIPE TTYFLG + POPJ P, + SKIPN PNTNAM + JRST PNTDT + MOVEI A,FNPOS + PUSHJ P,FILL + MOVEI A,PNTNAM + PUSHJ P,FILPNT +PNTDT: MOVEI A,DTPOS + PUSHJ P,FILL + DATE A, ;DATE + HRLZ A,A + MSTIME T, + IDIVI T,=60*=1000 ;TIME IN MINUTES + HRR A,T +PRNTDT: HLRZ T,A + IDIVI T,=31 + HRLM T,(P) + MOVEI T,1(TT) + IDIVI T,=10 + PUTBYT 60(T) + PUTBYT 60(TT) + PUTBYT "-" + HLRZ T,(P) + IDIVI T,=12 + HRLM T,(P) + PUTSTR DATES(TT) + HLRZ T,(P) + ADDI T,=64 + IDIVI T,=10 + PUTBYT 60(T) + PUTBYT 60(TT) + PUTSTR[ASCIZ/ /] + HRRZ T,A + IDIVI T,=60*=10 + PUTBYT 60(T) + MOVE T,TT + IDIVI T,=60 + PUTBYT 60(T) + MOVE T,TT + IDIVI T,=10 + PUTBYT 60(T) + PUTBYT 60(TT) + POPJ P, + +DATES: ASCIZ/JAN-/ + ASCIZ/FEB-/ + ASCIZ/MAR-/ + ASCIZ/APR-/ + ASCIZ/MAY-/ + ASCIZ/JUN-/ + ASCIZ/JUL-/ + ASCIZ/AUG-/ + ASCIZ/SEP-/ + ASCIZ/OCT-/ + ASCIZ/NOV-/ + ASCIZ/DEC-/ + +FILLST: SKIPE TTYFLG ;NOT TO TTY + JRST CPOPJ1 +TFILES: PUSH P,@(P) ;SAVE HEADER DISPATCH ON STACK + PUSH P,B + TRNN ISBACK + FETCH(B,W,FILS) + TRNE ISBACK + FETCH(B,L,BKNM) + JUMPE B,FILLS2 + MOVEI T,[ASCIZ/FILNAM.EXT[P,PN] DATE TIME MODULE(DWG NUM) REV AUTHOR + TITLE 1 PROJECT NOMENCLATURE + TITLE 2 SHEET n OF m BOARD TYPE + CARD LOC(VARIABLE SETTINGS) NEXT HIGHER ASSEMBLY/] + MOVEM T,HEADER +ITS,< SKIPE XGP + PUSHJ P,XGPSTR ;PUT XGP INFO OUT +>;ITS + MOVEI T,FILMAR ;FILENAME LIST MARGIN + MOVEM T,MARGIN + SETZM LINCNT ;ALWAYS START NEW PAGE +FILLS1: SKIPL LINCNT + PUSHJ P,@-1(P) + PUSHJ P,FBLKPN + FETCH(B,B,FNXT) + JUMPN B,FILLS1 +FILLS2: POP P,B + POP P,(P) + JRST CPOPJ1 + +FBLKPN: PUSH P,A + PUTSIX ADDR(B,FILN) + PUTBYT "." + FETCH(A,B,FEXT) + HRLZ A,A + PUTSIX A + PUTBYT "[" + SETZM TCOUNT + FETCH(TT,B,FPPN) +NOCMU,< HLLZ TT,TT + PUSHJ P,LSIXOUT + PUTBYT "," + FETCH(TT,B,FPPN) + HRLZ TT,TT + PUSHJ P,LSIXOUT +>;NOCMU +CMU,< MOVE TTT,[TT,,PPNBUF] + DECCMU TTT, + JRST [ PUTSIX ADDR(B,FPPN) + JRST .+2] + PUTSTR PPNBUF +>;CMU + PUTBYT "]" + MOVEI A,=24 + PUSHJ P,FILL + FETCH(A,B,FDAT) + SKIPE A + PUSHJ P,PRNTDT + PUTBYT 11 + FETCH(A,B,FMOD) + PUSHJ P,STROUT + FETCH(A,B,FVAR) + JUMPE A,NPVAR + PUTBYT "-" + PUSHJ P,STROUT +NPVAR: FETCH(A,B,FPRF) + JUMPE A,NPPRF + PUTBYT "-" + PUSHJ P,STROUT +NPPRF: MOVEI A,=56 + PUSHJ P,FILL + FETCH(A,B,FREV) + PUSHJ P,STROUT + FETCH(A,B,AUTHOR) + PUTBYT 11 + PUSHJ P,STROUT + CRLF + FETCH(A,B,TIT1) + JUMPE A,NOTIT1 + PUTBYT 11 + PUSHJ P,STROUT +NOTIT1: FETCH(A,B,FPROJ) + JUMPE A,NOPROJ + MOVEI A,=40 + PUSHJ P,FILL + FETCH(A,B,FPROJ) + PUSHJ P,STROUT +NOPROJ: FETCH(A,B,FNOM) + JUMPE A,NONOM + MOVEI A,=56 + PUSHJ P,FILL + FETCH(A,B,FNOM) + PUSHJ P,STROUT +NONOM: CRLF + FETCH(A,B,TIT2) + JUMPE A,NOTIT2 + PUTBYT 11 + PUSHJ P,STROUT +NOTIT2: FETCH(A,B,FPAGE) + JUMPN A,ISPAGE + FETCH(A,B,FOF) + JUMPE A,NOPAGE +ISPAGE: MOVEI A,=40 + PUSHJ P,FILL + PUTSTR[ASCIZ/SHEET /] + FETCH(A,B,FPAGE) + JUMPE A,.+2 + PUSHJ P,STROUT + FETCH(A,B,FOF) + JUMPE A,NOPAGE + PUTSTR[ASCIZ/ OF /] + PUSHJ P,STROUT +NOPAGE: FETCH(A,B,FWWT) + JUMPE A,NOWWT + MOVEI A,=56 + PUSHJ P,FILL + FETCH(A,B,FWWT) + PUSHJ P,STROUT +NOWWT: CRLF + FETCH(T,B,MCRD) + HRLZM T,SLICEL + FETCH(T,B,MVLS) + MOVEM T,VARLST + SKIPN SLICEL ;IS THERE A CARD LOC + JUMPE T,NOTIT3 ;NO, JUMP IF NO VARIABLES EITHER + FETCH(T,B,MUBN) + MOVEM T,UPPER + FETCH(T,B,MLBN) + MOVEM T,LOWER + PUSHJ P,PSLVAR +NOTIT3: FETCH(A,B,FNXH) + JUMPE A,NONXH + MOVEI A,=40 + PUSHJ P,FILL + FETCH(A,B,FNXH) + PUSHJ P,STROUT +NONXH: CRLF +POPAJ: POP P,A + POPJ P, +ITS,< +;PUT XGP INFO ON FIRST PAGE FOR ITS XGP SYSTEM + +XGPSTR: SETZM MARGIN ;FLUSH AGAINST THE LEFT MARGIN + MOVNI T,STDPAG ;AVOID AN EXTRANEOUS FORM FEED + MOVEM T,LINCNT + PUTSTR [ASCIZ /;SKIP 1 +;TOPMAR 128 +;BOTMAR 0 +;VSP /] + SKIPN T,XGPVSP + MOVEI T,6 ;COUGH UP REASONABLE DEFAULT + PUSHJ P,DECOUT + PUTSTR [ASCIZ / +;KSET DSK:/] + SKIPN T,XGPPPN + MOVE T,[SIXBIT /FONTS/] + PUTSIX T + PUTBYT ";" + SKIPN T,XGPFNT + MOVE T,[SIXBIT /25FG/] + PUTSIX T + PUTBYT 40 + SKIPN T,XGPEXT + MOVE T,[SIXBIT /KST/] + PUTSIX T + PUTSTR [BYTE (7) 15,12] + PUTBYT 14 ;THROW IN A FORM FEED + POPJ P, +>;ITS + ; BACK PANEL LISTING SUBRS +BAKLOP: SETOM CONFLG ;AOS THIS FLAG IF MORE THAN ONE CARD + MOVEM G,WIRTMP ;WIRE HEADER + FETCH(G,G,WPIN) ;THERE HAS TO BE AT LEAST ONE! + JUMPE G,BAKLP0 + MOVE T,LCOUNT + CAIL T,8 +BAKLP1: CRLF + PUSHJ P,SLIT + FETCH(G,G,NXTP) + JUMPN G,BAKLP1 +BAKLP0: MOVE G,WIRTMP + TLO DOLC!BAKGAT + PUSHJ P,LOPSET + PUSHJ P,GATHER + PUSHJ P,LODMER ;DO LOADING CALC + MOVE G,WIRTMP + FETCH(T,G,WRN) + JUMPE T,NBAKWR + PUSH P,A + MOVEI A,=8 + CAMG A,LCOUNT + CRLF + PUSHJ P,FILL + PUTSTR[ASCIZ/WR = /] + FETCH(T,G,WRN) + PUSHJ P,DECOUT + POP P,A +NBAKWR: TLNE A,SNC ;NO CONNECTION? + JRST BAKSNC ;YES + SKIPG CONFLG ;MORE THAN 1 CARD? + JRST NOSUMB ;NO, NO SUMMARY LINE + PUSH P,A + MOVEI A,=24 + CAMG A,LCOUNT + CRLF + PUSHJ P,FILL + POP P,A + PUSHJ P,PNTYPE + PUSHJ P,CLOADS +NOSUMB: MOVE F,[-NBLEN,,SUMLEN] + PUSHJ P,ERRLOP + JRST ERDONE + + ;SLIT - PRINT BACKPANEL PIN (G) +;" B-R-S post Qletter type-load WD-file X,Y source-file" +SLIT: FETCH(F,G,PBDY) + PUTBYT 11 + FETCH(A,F,BLOC) ;B-R-S TO A + PUSHJ P,SLTOUT + PUTBYT 11 + FETCH(A,G,PINN) + PUSHJ P,PRBCN ;PRINT LOC AS BACKPANEL POST, NOT CARD-LOC/PIN + FETCH(T,G,PBIT) + ANDI T,QBITS ;EXTRACT Q LETTER FROM BITS + JUMPE T,NOBAKQ ;IS THERE ONE? + MOVEI A,=22 + SUB A,LCOUNT + CAIA + PUTBYT 40 + SOJGE A,.-1 + PUTBYT @QN2L(T) +NOBAKQ: PUTBYT 11 + FETCH(A,G,PBIT) + TRNE A,DUP + TDZA A,A + FETCH(A,G,CBIT) ;CON/CARD BITS + JUMPE A,[PUTSTR[ASCIZ/ /] + JRST SLIT3] + AOS CONFLG ;AOS THIS TO INDICATE ANOTHER CARD + PUSHJ P,PNTYPE ;PRINT DIPPIN TYPE BITS, (I,O,N...) + MOVE C,G + PUSHJ P,LOADIT ;PRINT LOADING FOR PIN +SLIT3: PUTBYT 11 + FETCH(A,G,FILP) + PUTSIX ADDR(A,FILN) ;FILENAME + PUTBYT 11 + FETCH(A,G,PBIT) + PUSHJ P,CNPNT ;PRINT APPROX DRAWING X,Y + FETCH(A,G,FILO) ;SOURCE FILE BLOCK POINTER + JUMPE A,CPOPJ ;DONE IF NONE + PUTBYT 11 + PUTSIX ADDR(A,FILN) ;FILENAME + POPJ P, + + ;LOADIT - PRINT LOADING FOR BACKPANEL PIN (C) +; (ACCUMULATE TOTAL LOADING) +LOADIT: FETCH(T,C,LILD) + ADDM T,LINL ;GATHER LOADING FOR BS FILE OUTPUT + PUSHJ P,SLITLH + FETCH(T,C,HILD) + ADDM T,LINH + PUSHJ P,SLITLH + FETCH(T,C,LOLD) + ADDM T,LOUTL + PUSHJ P,SLITLH + FETCH(T,C,HOLD) + ADDM T,LOUTH + JRST SLITLH + +CLOADS: MOVE T,LINL + PUSHJ P,SLITLH + MOVE T,LINH + PUSHJ P,SLITLH + MOVE T,LOUTL + PUSHJ P,SLITLH + MOVE T,LOUTH +SLITLH: PUTBYT 11 + PUSHJ P,LDOUT + POPJ P, + +BAKSNC: PUSH P,A + MOVEI A,=24 + CAMG A,LCOUNT + CRLF + PUSHJ P,FILL + POP P,A + PUTSTR [ASCIZ /THIS RUN IS NOT TO BE WIRED/] + JRST ERDONE + SUBTTL 'WLS' 'BS' 'LES' SETUP, BODY SUMMARIES +;HERE WE GENERATE A WIRE LIST SUMMARY! +ALLWLS: TRZA ISBACK +ALLBS: TRO ISBACK + TDZ [ASKHIM,,DOERRS] + JRST SUMALL + +ERRSUM: TRZ ISBACK + TRO DOERRS + JRST ALLSUM + +BSSEL: TLOA ASKHIM +BACSUM: TLZ ASKHIM + TRO ISBACK + JRST ALLSUM + +WLSSEL: TLOA ASKHIM +SUMLST: TLZ ASKHIM + TRZ ISBACK + TRZ DOERRS +ALLSUM: SETZM ALLNAM + SETZM ALLCRD +SUMALL: MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE L,DEFLST + TRNE ISBACK + JRST [ FETCH(W,L,BLST) + JUMPE W,XBAK + MOVSI T,'BS ' + MOVEI TT,0 + JRST DOBS] + SKIPE T,ALLCRD + JRST [ MOVEM T,SLICEL + JRST GALCRD] + PUSHJ P,LSTGET + POPJ P, +GALCRD: PUSHJ P,CLEARP + TRNE DOERRS + JRST [ MOVSI T,'LES' + MOVEI TT,10 ;FULL WORD MODE + JRST DOBS] + MOVSI T,'WLS' ;WIRE LIST SUMMARY FILE EXTENSION + MOVEI TT,0 ;DATA MODE +DOBS: MOVSI TTT,'DSK' + PUSHJ P,ALLSET + POPJ P, + MOVEI TTT,LESVER + TRNE DOERRS + PUSHJ P,WORDOUT ;WRITE VERSION # + TRNE DOERRS + JRST NOFLST + PUSHJ P,FILLST + PUTHDR +NOFLST: + ; CARD DIP SUMMARY + TRNE ISBACK!DOERRS + JRST NODIPS ;SKIP FIRST PART FOR BACK PANEL + TLNN ASKHIM + JRST DOBSUM + SKIPE TTYFLG + CLOSE LST, ;FORCE OUTPUT IF TTY + ASK[ASCIZ\DIPTYPE/BODY SUMMARY?\] + JRST WLSQT + JRST NODIPS +DOBSUM: MOVEI T,[ASCIZ/DIPTYPE BODY NAME # SECTION TOTAL DIPS #SPARE SECTIONS MA @V/] + MOVEM T,HEADER + SETZM LINCNT + MOVEI T,WSBMAR + MOVEM T,MARGIN + PUSHJ P,CLEARB ;CLEAR MARK BIT FOR BODIES + PUSHJ P,DCLEAR ;CLEAR DIP COUNTS + PUSHJ P,DCNTW ;COUNT ASSIGNED DIPS + PUSHJ P,AMPRET ;RETURN CURRENT@VOLTAGE LIST + SETZM TOTDIP ;ZERO TOTAL DIP COUNTER + SETZM REALDV ;CLEAR REAL(.GE.14 PINS) DIP COUNT + SETZM TMPCN1 ;ASSIGNED TOTDIP + SETZM TMPCN2 ;ASSIGNED REALDV + SKIPN H,DIPLST ;PREPARE TO RUN DOWN DIPLST + JRST NODIPC ;NONE +NODIP1: PUSHJ P,NXTDIP + FETCH(H,H,NXTD) + JUMPN H,NODIP1 + SKIPN TOTDIP ;ANY DIPS AT ALL? + SKIPE TMPCN1 + CAIA + JRST NTOTDP + PUTSTR[ASCIZ/ GRAND TOTAL = /] + MOVE T,TOTDIP + PUSHJ P,DECOUT + PUTBYT "(" + MOVE T,REALDV + PUSHJ P,DECOUT + SKIPN T,TMPCN1 + JRST NODIP2 + PUTSTR[ASCIZ/) + WITH LOCATION= /] + MOVE T,TMPCN1 + PUSHJ P,DECOUT + PUTBYT "(" + MOVE T,TMPCN2 + PUSHJ P,DECOUT +NODIP2: PUTSTR[ASCIZ/) +NUMBER IN PARENS IS REAL (.GE.14 PINS) DIPS. + +/] +NTOTDP: SKIPN G,AMPLST ;ANY CURRENTS? + JRST NOCURN ;NO + PUTSTR[ASCIZ/TOTAL CURRENTS: +/] +CURN1: FETCH(T,G,MAMP) + SETZM TCOUNT + PUSHJ P,LDOUT + PUTSTR[ASCIZ/MA/] + MOVE T,TCOUNT + CAIGE T,8 + PUTBYT 11 + PUTSTR[ASCIZ/ @/] + FETCH(T,G,VLTS) + PUSHJ P,LDOUT + PUTSTR[ASCIZ/V +/] + FETCH(G,G,NXTM) + JUMPN G,CURN1 + CRLF + CRLF + PUSHJ P,AMPRET ;NOW GIVE BACK LIST +NOCURN: SETZ H, + PUSHJ P,NXTDIP ;LIST ALL UNASSIGNED DIPS! +NODIPC: MOVEI H,RADDR(W,WBDY,NXTB) + TLZ TFLG + SETZM NDIPS + SETOM NBODS + JRST DIPC1 + +DIPC2: FETCH(T,H,BBIT) + TRNN T,CBODY + JRST DIPC1 ;NOT CON + TLON TFLG + PUTSTR[ASCIZ/CONS PADDLE # PINS TOTAL PINS +/] + AOSE NBODS + CRLF + PUTSTR[ASCIZ/ "/] + FETCH(A,H,BLOC) + PUSHJ P,WLOCOUT + PUTBYT 42 + FETCH(G,H,BPIN) ;CON PIN LIST + JUMPE G,DIPC1 + PUTSTR[ASCIZ/ /] + SETZ T, +DIPC3: FETCH(TT,G,PBIT) + TRNN TT,DUP ;DON'T COUNT DUPS + ADDI T,1 ;COUNT THEM + FETCH(G,G,NXBP) ;NEXT PIN OF CON + JUMPN G,DIPC3 + ADDM T,NDIPS ;ADD TO TOTAL + PUSHJ P,DECOUT ;PRINT THESE +DIPC1: FETCH(H,H,NXTB) ;NEXT BODY + JUMPN H,DIPC2 + TLNN TFLG + JRST NODIPS + PUTSTR[ASCIZ/ /] + MOVE T,NDIPS + PUSHJ P,DECOUT + CRLF + JRST NODIPS + + +;NXTDIP - SUMMARIZE NO. OF SECTIONS FOR DIP TYPE (H) +NXTDIP: TLZ TFLG ;NOTE NONE FOUND YET! + SETZM SAVET + SETZM NBODS + SETZM NDIPS + SETZM RBODS + JUMPE H,[SETO F, ;FLAG NO DIP DEF + JRST BLANKD] +DIPCHECK + PUSHJ P,SECCAL ;CALC SEC/DIP +BLANKD: MOVEM F,FACTR1 ;SAVE HERE + MOVEI G,RADDR(W,WBDY,NXTB) + JRST NXTDP1 + +;Summarize for all body names that are really this DIPTYPE +NXTDP2: FETCH(T,G,BBIT) ;LOC + TRNE T,CBODY ;CON? + JRST NXTDP1 ;YES, SKIP IT + FETCH(T,G,DIPT) ;POINTER TO DIP TYPE + CAME T,H ;SAME DIP? + JRST NXTDP1 ;NO + FETCH(T,G,BBIT) ;GET BODY BITS + TROE T,BTMP1 ;MARK AND CHECK + JRST NXTDP1 ;DONE ALREADY, FIND ANOTHER + STORE(T,G,BBIT) + TLOE TFLG ;PUT OUT DIP NAME YET? + JRST NXTDP4 ;YES, SUMMARIZE LAST BODY + SKIPL LINCNT + PUSHJ P,PUTHDR + JUMPE H,NXTDP5 + FETCH(A,H,DNAM) + PUSHJ P,PRINT7 ;NO, PRINT DIP NAME + JRST NXTDP5 + +NXTDP4: MOVE T,TCOUNT + CAIGE T,8 + PUTBYT 11 + PUTSTR[ASCIZ/ /] + MOVE T,NBODS + ADDM T,NDIPS + PUSHJ P,DECOUT + SETZM NBODS + CRLF +;Summarize on one line the section usage for one body that is the current DIPTYPE +NXTDP5: PUTBYT 11 + MOVEI A,ADDR(G,BNAM) + MOVEM A,SAVET ;REMEMBER THIS GUY + SETZM TCOUNT + PUTSTR ADDR(G,BNAM) ;BODY NAME (THAT IS OF THE CURRENT DIP TYPE) + MOVE F,G ;NOW GO DOWN FROM HERE + JRST NXTDP6 + +;Find next instance of same body +NXTDP7: FETCH(T,F,BBIT) + TRNE T,CBODY ;CON? + JRST NXTDP8 ;YES, SKIP IT + FETCH(T,F,DIPT) + CAME T,H + JRST NXTDP8 + MOVEI T,ADDR(F,BNAM) + MOVE TT,SAVET + PUSHJ P,SEQMAT ;SAME BODY? + JRST NXTDP8 ;NOT EQUAL + JRST NXTDP8 ; " + FETCH(T,F,BBIT) + TROE T,BTMP1 + JRST NXTDP8 + STORE(T,F,BBIT) +NXTDP6: SKIPG T,FACTR1 ;1 SEC/DIP? (OR NONE?) + JRST [ MOVEI T,1 ;COUNT 1 BODY + JRST ONESEC] +;See how many sections this body uses + MOVEI A,RADDR(F,BPIN,NXBP) + SETZB T,FACTR2 ;ACCUMULATE BITS HERE + JRST SECCL1 + +SECCL2: FETCH(TT,A,PTYP) + JUMPE TT,SECCL1 ;ANY TYPE POINTER + FETCH(TTT,TT,DPBIT) + TRNN TTT,INLD!OUTLD!TERM ;INPUT OR OUTPUT PINS? + JRST SECCL1 ;NO + FETCH(TT,TT,SCTB) ;SECTION BITS + MOVE TTT,TT + ANDI TTT,-1(TT) ;FOR NOW, ONLY COUNT PINS THAT ARE WHOLLY + JUMPN TTT,SECCL1 ; WITHIN ONE SECTION + MOVS TT,TT + JFFO TT,.+2 + JRST SECCL1 + MOVE TTT,SCTTAB(TTT) + TDOE TTT,FACTR2 ;ANY IN THIS SEC YET? + JRST SECCL1 ;YES + MOVEM TTT,FACTR2 + ADDI T,1 ;COUNT ANOTHER NEW SEC IN THIS BODY +SECCL1: FETCH(A,A,NXBP) + JUMPN A,SECCL2 +ONESEC: ADDM T,NBODS ;ADD TO COUNT + FETCH(TT,F,BLOC) + JUMPE TT,NXTDP8 + ADDM T,RBODS +NXTDP8: FETCH(F,F,NXTB) + JUMPN F,NXTDP7 +NXTDP1: FETCH(G,G,NXTB) + JUMPN G,NXTDP2 + TLNN TFLG ;DID WE FIND ANY? + POPJ P, ;NO + MOVE T,TCOUNT + CAIGE T,=8 + PUTBYT 11 + PUTSTR[ASCIZ/ /] + MOVE T,NBODS + ADDB T,NDIPS + EXCH T,NBODS ;STORE TOTAL BODIES, GET CURRENT NUMBER + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ /] + MOVE T,NDIPS + SKIPGE FACTR1 ;BODIES ONLY? + JRST NODEF + ADD T,FACTR1 ;ADD # OF SEC'S -1 + AOS FACTR1 ;MAKE IT # OF SEC'S + IDIV T,FACTR1 + MOVEM T,NDIPS ;SAVE # OF DIPS + ADDM T,TOTDIP ;ADD TOTAL DIPS + JUMPE H,NTREAL + FETCH(TTT,H,DPNN) + CAIL TTT,=14 ;IS THIS REAL (.GE.14 PINS) + ADDM T,REALDV ;YES, COUNT IT +NTREAL: SUB TT,FACTR1 + MOVN TT,TT + HRLM TT,(P) + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ /] + HLRZ T,(P) + SUBI T,1 + PUSHJ P,DECOUT + JUMPE H,NODEF0 + MOVE T,NBODS + CAME T,RBODS ;IF ALL BODIES HAVE LOCS, PRINT LATER + PUSHJ P,AMPL ;THEN PRINT CURRENT AND ADD TO TOTAL + SKIPN RBODS ;ANY REAL BODIES? + JRST NODEF0 ;NO + PUTSTR[ASCIZ/ + WITH LOCATIONS /] + MOVE T,RBODS + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ /] + FETCH(T,H,DTMP) + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ /] + FETCH(T,H,DTMP) + IMUL T,FACTR1 + SUB T,RBODS + PUSHJ P,DECOUT + FETCH(T,H,DTMP) + MOVEM T,NDIPS ;SAVE HERE FOR AMPL + ADDM T,TMPCN1 + FETCH(TTT,H,DPNN) + CAIL TTT,=14 ;IS THIS REAL(.GE.14 PINS) + ADDM T,TMPCN2 ;YES + JUMPE T,NODEF0 ;QUIT NOW IF NO REAL DIPS + MOVE T,NBODS + CAMN T,RBODS ;NO PRINT IF NOT ALL BODIES HAVE LOC + PUSHJ P,AMPL ;LIST AMPS HERE, AND TOTAL + JRST NODEF0 + + +AMPL: PUTBYT 11 + MOVEI G,RADDR(H,DPIN,DPNXT) + JRST AMPL2 +AMPL1: FETCH(T,G,DPBIT) + TRNN T,PWR ;POWER PIN? + JRST AMPL2 ;NO + FETCH(T,G,LLOW) ;GET VOLTAGE + MOVEI B,AMPLST-ADDR(0,NXTM) + JRST AMPL3 + +AMPL4: FETCH(TT,B,VLTS) ;GET VOLTS FROM LIST + CAMGE TT,T ;TO RIGHT ENTRY YET? + JRST AMPL5 ;PASSED IT. + CAMN TT,T ;PERHAPS THERE NOW? + JRST AMPL6 ;YES +AMPL3: MOVE A,B ;REMEMBER PREVIOUS + FETCH(B,B,NXTM) ;GET NEXT + JUMPN B,AMPL4 ;LOOP IF THERE IS ONE +AMPL5: GETFS(TT,MABLK) ;NO ENTRY FOR THIS VOLTAGE, MAKE ONE + STORE(B,TT,NXTM) ;SET NEXT + MOVE B,TT + STORE(B,A,NXTM) ;MAKE US NEXT OF LAST + STORE(T,B,VLTS) ;STORE VOLTAGE + CLEAR(B,MAMP) ;CLEAR CURRENT +AMPL6: FETCH(T,G,LHI) ;PWR SUPPLY CURRENT + IMUL T,NDIPS + FETCH(TT,B,MAMP) ;GET CURRENT + ADD TT,T ;ADD TO TOTAL + STORE(TT,B,MAMP) ;STORE TOTAL BACK IN BLOCK + PUSH P,T + PUTBYT 11 ;SPACE OUT SOME + POP P,T + SETZM TCOUNT + PUSHJ P,LDOUT ;PRINT CURRENT + PUTSTR[ASCIZ/MA/] + MOVE T,TCOUNT + CAIGE T,8 + PUTBYT 11 + PUTSTR[ASCIZ/ @/] + FETCH(T,G,LLOW) ;GET VOLTAGE AGAIN + PUSHJ P,LDOUT + PUTBYT "V" +AMPL2: FETCH(G,G,NXTDP) ;NEXT DIP PIN + JUMPN G,AMPL1 + POPJ P, + +NODEF: PUSHJ P,DECOUT ;AND PRINT # OF DIPS + PUTSTR[ASCIZ/ TOTAL BODIES (NOT DIPS)/] +NODEF0: CRLF + CRLF + POPJ P, + +AMPRET: SKIPN T,AMPLST + POPJ P, +AMPRT1: FETCH(TT,T,NXTM) + FSTRET(T,MABLK) + MOVE T,TT + JUMPN T,AMPRT1 + SETZM AMPLST + POPJ P, + +;COUNT ASSIGNED DIPS +DCNTW: SETZM LSLOT + SETZM CDSKPC + MOVEI H,RADDR(W,WBDY,NXTB) + JRST DCNT3 + +DCNT4: FETCH(T,H,BLOC) + JUMPE T,[AOS CDSKPC ;INC COUNT OF UNLOC'D DIPS + JRST DCNT3] + EXCH T,LSLOT + CAMN T,LSLOT ;NEW SLOT? + JRST DCNT3 + FETCH(A,H,DIPT) ;DIP POINTER + JUMPE A,DCNT3 ;ANY? + FETCH(T,A,DTMP) + ADDI T,1 ;INC COUNT + STORE(T,A,DTMP) +DCNT3: FETCH(H,H,NXTB) + JUMPN H,DCNT4 + POPJ P, + +NODIPS: + ; VERIFICATION STUFF + TRNE ISBACK!DOERRS + JRST VERDON + TLNN ASKHIM + JRST VER0 + SKIPE TTYFLG + CLOSE LST, ;FORCE OUTPUT IF TTY + ASK[ASCIZ\BODY/DIP SOCKET MATCHING ERRORS?\] + JRST WLSQT + JRST VERDON +VER0: MOVEI T,[ASCIZ\ BODY/DIP SOCKET MATCHING ERRORS +LOC DIP(S) BODY(S) FILE POS PIN\] + MOVEM T,HEADER + MOVEI T,WVMAR + MOVEM T,MARGIN + SETZM LINCNT ;FORCE NEW PAGE + SETZM GOODW +;Go through all bodies in wirelist + FETCH(H,W,WBDY) +VER1: JUMPE H,VERDON +; Build list (GOODW) of bodies in same loc + SKIPE B,GOODW + PUSHJ P,TRET + SETZM GOODW ;USE THIS AS LIST HEAD + SETZM BADW ;CURRENT DIP POINTER + SETZM SLICEL ;CURRENT LOC + TLZ TFLG ;FLAG LOC NOT OUT YET +VER2: FETCH(TT,H,BBIT) + TRNE TT,CBODY ;CON? + JRST[ SKIPE GOODW ;YES, ANY OTHER BODIES IN LIST YET? + JRST VER5 ;YES, JUST DO THEM + JRST VER3] + FETCH(TT,H,BLOC) + JUMPE TT,[SKIPL LINCNT + PUSHJ P,PUTHDR + MOVE E,H + PUSHJ P,VERLIN + ERRSTR 1,[ASCIZ/NO LOCATION SET/] + MOVE F,H ;PUT BODY POINTER INTO F + SETZM UPINS ;CLEAR USED PIN POINTERS + MOVE T,[UPINS,,UPINS+1] + BLT T,UPINS+MAXPINS-1 ;WHOLE TABLE + PUSH P,SLICEL + SETZM SLICEL + PUSHJ P,VERP6 + POP P,SLICEL + JRST VER3] + SKIPN SLICEL + JRST VER4 + CAME TT,SLICEL + JRST VER5 ;WE HAVE LIST +VER4: MOVEM TT,SLICEL + PGETFS(TT,TBLK) + STORE(H,TT,TRHT) ;STORE BODY IN RIGHT HALF + MOVE T,GOODW + STORE(T,TT,NXTT) + MOVEM TT,GOODW +VER3: FETCH(H,H,NXTB) + JUMPN H,VER2 + +; Now check all bodies for same DIPTYPE +VER5: SKIPN G,GOODW + JRST VERDON ;IF NOTHING IN LIST, ALL DONE! +VER6: FETCH(TT,G,TRHT) ;GET DIP POINTER + FETCH(TT,TT,DIPT) + SKIPN BADW ;ANY YET? + JRST VER7 + CAME TT,BADW ;YES, SAME? + JRST [ PUSHJ P,VERALL + ERRSTR 3,[ASCIZ/MULTIPLE DIP TYPES/] + JRST VERPCK] ;NOW CHECK FOR BAD PINS +VER7: MOVEM TT,BADW + FETCH(G,G,NXTT) + JUMPN G,VER6 + SKIPE BADW ;DID THEY HAVE A DIPTYPE? + JRST VERPCK + ; No DIPTYPE for body, complain bitterly +NANYDP: PUSHJ P,VERLOC + SKIPA G,GOODW +NANYD1: CRLF + FETCH(E,G,TRHT) + PUTBYT 11 + FETCH(A,E,DIPT) ;DIP TYPE POINTER + JUMPE A,NANYD2 + FETCH(A,A,DNAM) + PUSHJ P,STROUT + JRST NANYD3 + +NANYD2: FETCH(A,E,PRPX) ;LOOK IN EXTRA PROPERTY LIST FOR DIPTYPE + JUMPE A,NANYD3 +NANYD4: FETCH(T,A,TLFT) + MOVEI TT,[ASCIZ/DIPTYPE/] + PUSHJ P,ASCMAT + JRST NANYD5 + FETCH(A,A,TRHT) + PUSHJ P,STROUT + JRST NANYD3 + +NANYD5: FETCH(A,A,NXTT) + JUMPN A,NANYD4 +NANYD3: PUSHJ P,VERER3 + FETCH(G,G,NXTT) + JUMPN G,NANYD1 + ERRSTR 3,[ASCIZ/MISSING OR UNKNOWN DIPTYPE/] + JRST VERPCK + + ;Check pins on DIP for too big, incompletely used sections,... +;(GOODW has list of bodies in same loc) +VERPCK: MOVE G,GOODW ;NOW CHECK EACH PIN OF DIP + SETZM UPINS ;CLEAR USED PIN POINTERS + MOVE T,[UPINS,,UPINS+1] + BLT T,UPINS+MAXPINS-1 ;WHOLE TABLE +VERP1: FETCH(F,G,TRHT) ;BODY POINTER + PUSHJ P,VERP6 + FETCH(G,G,NXTT) + JUMPN G,VERP1 ;ANOTHER BODY + JRST VER1 + +;VERP6 - check pins on a single body +;f = body +;SLICEL = socket location of body + +VERP6: MOVEM F,SAVET + MOVE A,F + PUSHJ P,MAXDPN ;FIND HOW MANY PINS ON DIP + CAILE T,MAXPIN + JRST [ PUSHJ P,VERLNA + PUSHJ P,DECOUT + ERRSTR 3,[ASCIZ / TOO MANY PINS IN DIP DEFINITION!/] + POPJ P,] + MOVEM T,FACTR1 ;SIZE OF DIP TO CHECK PINS AGAINST + MOVEI F,RADDR(F,BPIN,NXBP);PREPARE TO GO DOWN BODY PIN LIST + JRST VERP3 + +VERP2: SKIPN SLICEL ;ONLY CHECK PIDPIN IF WE HAVE LOC + JRST VERPOK + FETCH(T,F,PBIT) + TRNE T,PIDPIN ;REALLY JUST PID? + JRST [ FETCH(T,F,PINN) + PUSHJ P,VERLNA + PUSHJ P,DECOUT + ERRSTR 1,[ASCIZ/DEFAULT, NOT EXPLICIT PIN #/] + JRST .+1] + +;It would be nice to be able to check if the pin assignment +;is legal given the DIP definition, but we don't +;have the information in the WD file as to the default +;pin name of each body pin + +;Check to see if any dedicated pwr/gnd pins on W/W boards conflict with DIPs + MOVE B,SAVET ;Body + FETCH(B,B,BPAK) + MOVE A,SLICEL ;Slot location + FETCH(T,F,PINN) + HRL A,T + PUSHJ P,MAPOST ;GET SOCKET ON BOARD WHERE THIS WILL BE + JRST VERPOK ;CAN'T FIND BOARD PIN?? + PUSHJ P,PINBIT + TLNN TT,PWR!GND + JRST VERPOK +;Board is committed to PWR,GND, see if that is exactly the signal called for + FETCH(E,F,HPNT) ;Wire header + FETCH(TTT,E,WBIT) + TLNE TT,GND ;BOARD HAS GND HERE? + JRST [ TRNE TTT,SGND ;And that's whats caled for? + JRST VERGN1 + MOVEI A,[ASCIZ /BOARD HAS GND ON THIS PIN/] + JRST VERGN2] +VERGN1: TLNN TT,PWR ;BOARD HAS PWR HERE? + JRST VERPOK + MOVEI A,[ASCIZ/BOARD HAS PWR ON THIS PIN/] + TRNN TTT,SPWR ;Signal is name of a voltage? + JRST VERGN2 + FETCH(TTT,E,WVOL) ;POWER SUPPLY VOLTAGE HERE + CAIN TTT,(TT) + JRST VERPOK +VERGN2: PUSH P,A + PUSHJ P,VERLNA + FETCH(T,F,PINN) + PUSHJ P,DECOUT + POP P,A + ERRSTR 1,(A) +;Pin checked for conflicts with PWR/GND, now check pin#, type +VERPOK: FETCH(T,F,PINN) + MOVE TT,F + CAMG T,FACTR1 ;LARGER PIN # THAN #PINS ON DIP? + CAILE T,MAXPIN ;OVERFLOW TABLE? + JRST [ PUSHJ P,VERLNA + PUSHJ P,DECOUT + ERRSTR 0,[ASCIZ/PIN # TOO BIG FOR DIP/] + JRST VERP3] + FETCH(A,F,PTYP) ;PIN TYPE BLOCK + JUMPE A,VERP4 ;ANY? + FETCH(TTT,A,DPBIT) + TRNE TTT,NULLD + JRST VERP4 + TRNN TTT,INLD!OUTLD!TERM + JRST VERP5 + FETCH(TTT,A,SCTB) + HRL TT,TTT ;PICKUP SECTION BITS +VERP5: EXCH TT,UPINS-1(T) ;STORE BITS AND PIN POINTER + JUMPN TT,[FETCH(A,TT,HPNT) ;GET HEADER FOR ONE PIN + FETCH(E,F,HPNT) ;AND THE OTHER + CAMN A,E ;SAME WIRE MEANS DUP + JRST VERP3 + PUSH P,TT ;SAVE FIRST PIN FOUND THERE + PUSHJ P,VERLNA + PUSHJ P,DECOUT + CRLF + POP P,E ;GET FIRST PIN POINTER + FETCH(E,E,PBDY) ;BODY OF THIS PIN + PUSHJ P,VERLIN ;DON'T REPEAT PIN # + ERRSTR 2,[ASCIZ/PIN # USED MORE THAN ONCE/] + JRST VERP3] +VERP3: FETCH(F,F,NXBP) + JUMPN F,VERP2 + ; Now check to see if all pins of each used section are used + MOVE F,SAVET + FETCH(F,F,DIPT) + JUMPE F,CPOPJ + SETOM FACTR2 ;ASSUME ALL SECTIONS INCLUDED INITIALLY + MOVEI F,RADDR(F,DPIN,DPNXT) + JRST VERP8 + +VERP7: FETCH(T,F,DPNM) + CAIG T,MAXPIN + SKIPE UPINS-1(T) ;Previously setup, SCTB,,WHEAD of this pin if non-zero + JRST VERP8 + FETCH(TT,F,SCTB) + ANDCAM TT,FACTR2 ;CAN'T BE ANY OF THESE SECTIONS +VERP8: FETCH(F,F,DPNXT) + JUMPN F,VERP7 + MOVEI T,MAXPIN-1 +VERP9: HLRZ TT,UPINS(T) + JUMPE TT,VERP10 + TDNN TT,FACTR2 ;THIS PIN IN ONE OF THE SECTIONS OF WHICH WE HAVE ALL? + JRST VERP11 +VERP10: HRRZS UPINS(T) ;DONE CHECKING IT, CLEAR BITS FOR NEXT GUY + SOJGE T,VERP9 + POPJ P, + +VERP11: HRRZS UPINS(T) ;CLEAR THE REST OF THE BITS FOR THIS BODY + SOJGE T,VERP11 + PUSHJ P,VERLNA + ERRSTR 2,[ASCIZ/NOT ALL PINS OF SECTIONS USED/] + POPJ P, + +VERP4: FETCH(TTT,G,TRHT) ;DIP POINTER + FETCH(TTT,TTT,DIPT) + JUMPE TTT,VERP5 ;DON'T COMPLAIN IF NO DIP + PUSHJ P,VERLNA + PUSH P,T + PUSHJ P,DECOUT + POP P,T + ERRSTR 3,[ASCIZ/UN OR NC PIN/] + JRST VERP5 + + VERLNA: HRLM T,(P) + TLNN TFLG ;LOC OUT YET? + PUSHJ P,VERLOC ;NO, PUT IT OUT + MOVE E,SAVET + PUSHJ P,VERLIN ;BODY LINE + PUTBYT 11 + HLRZ T,(P) + POPJ P, + +VPKLIP: PUSHJ P,VPKLIN + MOVE T,BADW + JRST PRNPAK + +;PRINT ERROR LINE, GO BACK AND PUT OUT ALL OTHERS IN THIS LOC IF +; WEREN'T PRINTED YET. + +VPKLIN: SKIPE NEEDER ;LINE IN ERROR YET? + JRST VPKLN1 ; YES, JUST PRINT NEXT LINE + SETOM NEEDER + PUSHJ P,VERLOC ;OUTPUT LOC IF FIRST + EXCH H,FSTBOD +VPKLN2: CAMN H,FSTBOD ;OUTPUT ALL PREVIOUS BODS IN THIS LOC + JRST VPKLN1 + MOVE E,H + PUSHJ P,VERLIN + PUTBYT 11 + FETCH(T,E,BPAK) + PUSHJ P,PRNPAK + CRLF + FETCH(H,H,NXTB) + JRST VPKLN2 + +VPKLN1: SETOM DIDERR + MOVE E,SAVET ;BODY + PUSHJ P,VERLIN + PUTBYT 11 + POPJ P, + +VERALL: PUSHJ P,VERLOC ;NO CHECK FOR LOC, WE ARE FIRST + SKIPA G,GOODW ;SKIP FIRST CRLF +VERERB: CRLF + FETCH(E,G,TRHT) + PUSHJ P,VERLIN + FETCH(G,G,NXTT) + JUMPN G,VERERB + POPJ P, + +VERLOC: SKIPL LINCNT + PUSHJ P,PUTHDR + TLO TFLG ;FLAG LOC OUT + SKIPN A,SLICEL + POPJ P, + SETZ T, ;THESE BODIES DON'T HAVE ANY INTERSTING BITS + JRST WLOCOUT + +VERLIN: PUTBYT 11 + FETCH(A,E,DIPT) ;DIP TYPE POINTER + JUMPE A,VERER3 + FETCH(A,A,DNAM) + PUSHJ P,STROUT +VERER3: PUTBYT 11 + PUTSTR ADDR(E,BNAM) + PUTBYT 11 + FETCH(A,E,FILB) + PUTSIX ADDR(A,FILN) + PUTBYT 11 + FETCH(A,E,BBIT) + JRST BPPNT + +TRET1: MOVE B,T +TRET: FETCH(T,B,NXTT) + FSTRET(B,TBLK) + JUMPN T,TRET1 + POPJ P, + +VERDON: SKIPN ISWW + JRST VPKDON +; Now check the package codes, and package overlaps on board + MOVEI T,[ASCIZ \ Body/DIP Package Errors +LOC DIP BODY FILE POS PACKAGE\] + MOVEM T,HEADER + SETZM LINCNT ;FORCE NEW PAGE + SETZM SLICEL + SETZM NEEDER + FETCH(H,W,WBDY) +VPK1: JUMPE H,VPKDON + FETCH(TT,H,BBIT) + TRNE TT,CBODY ;CONNECTORS ARE AT END OF BODIES + JRST VPKDON + MOVEM H,SAVET + FETCH(TT,H,BLOC) + SKIPE TT ;NO LOC, TREAT AS NEW BODY + CAME TT,SLICEL + JRST [ SETOM BADW ;NEW LOC, CAN HAVE NEW PACKAGE + SETOM DOOVLP ;DO OVERLAP CHECK + MOVEM H,FSTBOD + SKIPE NEEDER ;WAS PREVIOUS PRINTED? + CRLF ;SEPARATE BY BLANK LINE + SETZM NEEDER ;SO FAR, THIS LOC ISN'T IN ERR + JRST .+1] + MOVEM TT,SLICEL + SETZM DIDERR ;WE HAVEN'T PRINTED THIS ERR YET + FETCH(G,H,BPAK) + JUMPE G,[PUSHJ P,VPKLIN + ERRSTR 1,[ASCIZ /NO PACKAGE CODE/] + JRST VPK2] + EXCH G,BADW + JUMPL G,VPK1A + CAMN G,BADW ;SAME AS OTHER BODIES IN THIS LOC? + JRST VPK1A + SETOM DOOVLP ;DIFFERENT PACKAGE TYPE, REPEAT OVERLAP CHECK + PUSHJ P,VPKLIP + ERRSTR 1,[ASCIZ /MULTIPLE PACKAGES IN SAME LOC/] +VPK1A: MOVEM H,LSTBOD ;THE BODY IN THIS LOC + FETCH(TT,H,BBIT) +; Check if D's idea of default package agrees with DIPTYPE + FETCH(T,H,DIPT) ;YES, SEE IF IT AGREES + JUMPE T,[TRNE TT,BPACKP ;IF EXPLICIT, DOESN'T NEED TO BE DIP + JRST VPK3 + PUSHJ P,VPKLIP + ERRSTR 1,[ASCIZ /NO PACKAGE FOR DIPTYPE/] + JRST VPK4] + FETCH(T,T,DPAK) + CAMN T,BADW ;IS D'S PACKAGE CODE UP TO DATE? + JRST VPK3 + PUSH P,T + PUSHJ P,VPKLIP + PUTBYT 11 + POP P,T + PUSHJ P,PRNPAK + ERRSTR 1,[ASCIZ /PACKAGE DIFFERS FROM NDIPS.DIP/] + JRST VPK3 + +;Body has explicit PACKAGE property, check if code was compiled properly in D +VPK3: FETCH(TT,H,BBIT) + TRNN TT,BPACKP + JRST VPK4 + FETCH(F,H,PRPX) +VPK3A: JUMPE F,[PUSHJ P,VPKLIP + ERRSTR 1,[ASCIZ /PACKAGE NOT DEFAULT, OR PROP/] + JRST VPK4] + FETCH(T,F,TLFT) + MOVEI TT,[ASCIZ /PACKAGE/] + PUSHJ P,ASCMAT + JRST [ FETCH(F,F,NXTT) + JRST VPK3A] + FETCH(T,F,TRHT) + PUSHJ P,MATPAK + JRST [ PUSHJ P,VPKLIP + PUTBYT 11 + FETCH(A,F,TRHT) + PUSHJ P,STROUT + ERRSTR 1,[ASCIZ /PACKAGE PROP NOT RECOGNIZED/] + JRST VPK4] + CAMN A,BADW + JRST VPK4 + PUSH P,A + PUSHJ P,VPKLIP + PUTBYT 11 + POP P,T + PUSHJ P,PRNPAK + ERRSTR 1,[ASCIZ /INTERNAL PACKAGE WRONG IN .DRW??/] + ; Check for DIP legal in location on board +VPK4: SKIPN A,SLICEL + JRST VPK2 + MOVE B,BADW + PUSHJ P,PAKSIZ + JRST [ PUSHJ P,VPKLIN + ERRSTR 1,[ASCIZ /PACKAGE IN ILLEGAL LOCATION/] + JRST VPK2] + AOSE DOOVLP + JRST VPK2 +; Now check against all other bodies for overlaps + HLREM T,MINX + HLRE TTT,TT + CAMGE TTT,MINX + EXCH TTT,MINX + MOVEM TTT,MAXX + HRREM T,MINY + HRRES TT + CAMGE TT,MINY + EXCH TT,MINY + MOVEM TT,MAXY + PUSH P,H +VPK5: FETCH(H,H,NXTB) + JUMPE H,VPK6 + FETCH(A,H,BLOC) + JUMPE A,VPK5 + CAMN A,SLICEL ;BUT NOT OTHER BODIES IN SAME LOC + JRST VPK5 + FETCH(B,H,BPAK) + JUMPE B,VPK5 + PUSHJ P,PAKSIZ + JRST VPK5 ;WILL CATCH THIS GUY LATER +DEFINE FOO ' (HXXE,XY) +< HXXE TTT,T + HXXE TTTT,TT + CAML TTT,MIN'XY ;SIDE OUTSIDE A TO LEFT? + JRST [ CAMLE TTT,MAX'XY ;NO, SIDE A OUTSIDE TO RIGHT? + CAMG TTTT,MAX'XY ; (AND SIDE B OUTSIDE ALSO) + JRST VPK6'XY ;NO, IF IT OVERLAPS OTHER AXIS ALSO, LOSE + JRST VPK5] ;IT'S OUTSIDE TO RIGHT + CAMGE TTTT,MIN'XY ;STRADDLES MIN'XY + JRST VPK5 ;IT'S OUTSIDE TO LEFT +VPK6'XY: +> + FOO(HLRE,X) + FOO(HRRE,Y) +VPK6ER: EXCH H,(P) ;RESTORE H TEMPORARILY FOR VPKLIP + PUSH P,B + PUSHJ P,VPKLIP + CRLF + EXCH H,-1(P) ;GET H BACK + MOVE E,H + FETCH(A,E,BLOC) + PUSHJ P,LOCOUT + PUSHJ P,VERLIN + PUTBYT 11 + POP P,T + PUSHJ P,PRNPAK + ERRSTR 1,[ASCIZ /PACKAGES OVERLAP!!/] + JRST VPK5 + +VPK6: POP P,H +VPK2: SKIPE NEEDER + SKIPE DIDERR + JRST VPK2A + PUSHJ P,VPKLIP + CRLF +VPK2A: FETCH(H,H,NXTB) + JRST VPK1 + +MINX: 0 +MAXX: 0 +MINY: 0 +MAXY: 0 + +PRNPAK: CAIL T,NPACK + JRST PUTDEC + PUTSTR @PACKNM(T) + POPJ P, + +VPKDON: + ; PART NUMBER ERRORS +DEC,< ; Make it unanimous +NOITS,< ;I AGREE, SCREW PART NUMBERS +NOSTAN,< + TRNE ISBACK!DOERRS + JRST NPNERR + TLNN ASKHIM + JRST DOPNER + SKIPE TTYFLG + CLOSE LST, + ASK[ASCIZ/PART NUMBER ERRORS?/] + JRST WLSQT + JRST NPNERR +DOPNER: MOVEI T,[ASCIZ/ PART NUMBER ERRORS +LOC BODY FILE POS DIPTYPE PROPERTIES/] + MOVEM T,HEADER + MOVEI T,PREMAR + MOVEM T,MARGIN + SETZM LINCNT + MOVEI H,RADDR(W,WBDY,NXTB) + JRST DOPN1 + +DOPN2: FETCH(T,H,BBIT) + TRNE T,CBODY + JRST DOPN1 + FETCH(T,H,DIPT) + JUMPE T,[FETCH(T,H,PRTN) ;IF NO DIPTYPE + JUMPE T,DOPN1 + FETCH(T,H,PRPX) ;AND HAS PART NUMBER + JUMPE T,DOPN1 + JRST DOPN3] ;AND EXTRA PROPERTIES, THEN ERROR + FETCH(T,H,PRTN) + JUMPE T,DOPN3 + FETCH(T,H,PRPX) + JUMPE T,DOPN1 +DOPN3: SKIPL LINCNT + PUSHJ P,PUTHDR + FETCH(A,H,BLOC) + FETCH(T,H,BBIT) + PUSHJ P,WLOCOUT + PUTBYT 11 + PUTSTR ADDR(H,BNAM) + PUTBYT 11 + FETCH(A,H,FILB) + PUTSIX ADDR(A,FILN) + PUTBYT 11 + FETCH(A,H,BBIT) + PUSHJ P,BPPNT + FETCH(A,H,DIPT) ;DIP TYPE POINTER + JUMPE A,DOPN4 + PUTBYT 11 + FETCH(A,A,DNAM) + PUSHJ P,STROUT +DOPN4: FETCH(G,H,PRPX) + JUMPE G,DOPN5 +DOPN6: MOVE T,LWIDTH + SUBI T,=24 ;MUST BE THIS MUCH SPACE LEFT + CAMGE T,LCOUNT + CRLF + MOVEI A,=48 + CAMLE A,LCOUNT + PUSHJ P,FILL + MOVE T,LCOUNT + CAIE T,=48 + PUTSTR[ASCIZ/, /] + FETCH(A,G,TLFT) + PUSHJ P,STROUT + PUTBYT ":" + FETCH(A,G,TRHT) + PUSHJ P,STROUT + FETCH(G,G,NXTT) + JUMPN G,DOPN6 +DOPN5: FETCH(T,H,PRTN) + JUMPN T,DOPN7 + FETCH(T,H,PRPX) + JUMPE T,DOPN8 + ERRSTR 2,[ASCIZ/NO PART NUMBER FOUND/] + JRST DOPN1A + +DOPN8: ERRSTR 1,[ASCIZ/BODY HAS NO PROPERTIES, SO NO PART NUMBER/] +DOPN1A: FETCH(T,H,DIPT) + JUMPE T,DOPN1 + FETCH(T,T,PRPN) + SKIPN T + ERRSTR 3,[ASCIZ/NO PROPERTIES IN DIP DEF/] + JRST DOPN1 + +DOPN7: ERRSTR 2,[ASCIZ/EXTRA PROPERTIES/] +DOPN1: FETCH(H,H,NXTB) + JUMPN H,DOPN2 +NPNERR: +>;NOSTAN +>;NOITS +>;DEC + ; REDUNDANT BACK PANEL PIN CHECK + TRNE DOERRS + JRST NREDUN + TLNN ASKHIM + JRST DOREDN + SKIPE TTYFLG + CLOSE LST, ;FORCE OUTPUT IF TTY + ASK[ASCIZ/REDUNDANT CONNECTOR PIN CHECK?/] + JRST WLSQT + JRST NREDUN ;NO +DOREDN: MOVEI T,[ASCIZ/ MULTIPLY USED CONNECTOR PINS +LOC PIN FILES POS SIGNALS/] + MOVEM T,HEADER + MOVEI T,BVMAR + MOVEM T,MARGIN + SETZM LINCNT + MOVEI H,RADDR(W,WBDY,NXTB) + JRST BV1 + +BV2: TRNE ISBACK + JRST BV6 + FETCH(T,H,BBIT) ;BODY BITS + TRNN T,CBODY ;CONNECTOR BODY? + JRST BV1 ;NO, SKIP IT +BV6: FETCH(G,H,BPIN) + JUMPE G,BV1 ;SKIPE IF NO PINS??????? + TLZ TFLG ;NOTE STARTING NEW LOC + FETCH(F,G,PINN) ;PADDLE PIN SIDE + JRST BV3 + +;Print connector pins +;If backpanel wirelist, <Card-Slot> Connector-loc Connector-pin-number +;Else (within card format), <Connector-loc> connector-pin-number + +BV4: FETCH(TT,G,PBIT) + TRNE TT,DUP + JRST BV3 + FETCH(TT,G,PINN) ;PADDLE PIN SIDE + EXCH TT,F ;SET AS NEW ONE + CAME TT,F ;SAME AS LAST?? + JRST BV3 ;NO, DON'T PRINT + SKIPL LINCNT ;TOP OF NEW PAGE? + PUSHJ P,[TLZ TFLG ; YES, FORCE LOC OUT AGAIN + JRST PUTHDR] + TLOE TFLG ;LOC OUT YET? + JRST BV5 + FETCH(A,H,BLOC) + TRNN ISBACK + JRST [ FETCH(T,H,BBIT) + PUSHJ P,WLOCOUT + JRST BV5] + PUSHJ P,SLTOUT ;BACK WIRELIST, OUT OUT DAMN SLOT +BV5: PUTBYT 11 + PUSH P,A + TRNE ISBACK ;Backpanel wirelist? + JRST [ MOVEI A,(F) ;Is 18-bit-CPIN BODY + PIN# + PUSHJ P,PRBCN + JRST BV5A] + FETCH(A,H,BLOC) ;CONNECTOR BODY LOC + MOVEI T,(F) ;PIN NUMBER + PUSHJ P,PRCNPN ;Print conn pin (within card format) +BV5A: POP P,A + PUTBYT 11 + FETCH(T,D,FILP) + PUTSIX ADDR(T,FILN) ;FILE 1 + PUTBYT 11 + FETCH(A,D,PBIT) + PUSHJ P,CNPNT + PUTBYT 11 + FETCH(T,D,HPNT) + PUTSIG ADDR(T,SPNT) ;SIGNAL 1 + CRLF + PUTSTR[ASCIZ/ /] + FETCH(T,G,FILP) + PUTSIX ADDR(T,FILN) ;FILE 2 + PUTBYT 11 + FETCH(A,G,PBIT) + PUSHJ P,CNPNT + PUTBYT 11 + FETCH(T,G,HPNT) + PUTSIG ADDR(T,SPNT) ;SIGNAL 2 + CRLF +BV3: MOVE D,G + FETCH(G,G,NXBP) ;NEXT PIN + JUMPN G,BV4 +BV1: FETCH(H,H,NXTB) ;ANOTHER SLOT PLEASE + JUMPN H,BV2 + +NREDUN: + ; EDGE PINS WITH NO TERMINTOR RULES +DEC,< TRNE DOERRS + JRST NTRCHK + TLNN ASKHIM + JRST DOTRCK + SKIPE TTYFLG + CLOSE LST, ;FORCE OUTPUT IF TTY + ASK[ASCIZ/CONNECTOR PINS WITHOUT TERMINATOR RULES?/] + JRST WLSQT + JRST NTRCHK ;NO +DOTRCK: MOVEI T,[ASCIZ/ CONNECTOR PINS WITHOUT TERMINATOR RULES +LOC PIN FILE POS SIGNAL/] + MOVEM T,HEADER + MOVEI T,TRCMAR + MOVEM T,MARGIN + SETZM LINCNT + MOVEI H,RADDR(W,WBDY,NXTB) + JRST TRCK1 + +TRCK2: TRNE ISBACK + JRST TRCK6 + FETCH(T,H,BBIT) ;BODY BITS + TRNN T,CBODY ;CONNECTOR BODY? + JRST TRCK1 ;NO, SKIP IT +TRCK6: TLZ TFLG ;NOTE STARTING NEW LOC + MOVEI G,RADDR(H,BPIN,NXBP) + JRST TRCK3 + +TRCK4: FETCH(T,G,PBIT) + TRNE T,DUP + JRST TRCK3 + FETCH(TT,G,HPNT) + FETCH(TT,TT,WBIT) + TRNE TT,SNC!SPWR!SGND ;IGNORE POWER, GROUND, AND NC + JRST TRCK3 + MOVE F,G ;LOOK AT ALL COPIES +TRCK7: TRNE T,TRMBTS ;ANY TERMINATOR RULE? + JRST TRCK3 + FETCH(F,F,NXBP) ;NEXT PIN + JUMPE F,TRCK8 ;JUMP IF NO MORE PINS + FETCH(T,F,PBIT) + TRNE T,DUP ;STILL SAME PIN? + JRST TRCK7 ;YES +TRCK8: MOVE F,G + SKIPL LINCNT + PUSHJ P,[TLZ TFLG ;FORCE LOC OUT AGAIN + JRST PUTHDR] + TLOE TFLG ;LOC OUT YET? + JRST TRCK5 + FETCH(A,H,BLOC) + TRNN ISBACK + JRST [ FETCH(T,H,BBIT) + PUSHJ P,WLOCOUT + JRST TRCK5] + PUSHJ P,SLTOUT ;OUT OUT DAMN SLOT +TRCK5: PUTBYT 11 + PUSH P,A + FETCH(A,F,PINN) + TRNN ISBACK + PUSHJ P,PRCNPN + TRNE ISBACK + PUSHJ P,PRBCN + POP P,A +TRCK9: PUTBYT 11 + FETCH(T,F,FILP) + PUTSIX ADDR(T,FILN) ;FILE 1 + PUTBYT 11 + FETCH(A,F,PBIT) + PUSHJ P,CNPNT + PUTBYT 11 + FETCH(T,F,HPNT) + PUTSIG ADDR(T,SPNT) ;SIGNAL 1 + CRLF + FETCH(F,F,NXBP) + JUMPE F,TRCK3 + FETCH(T,F,PBIT) + TRNN T,DUP + JRST TRCK3 + PUTBYT 11 + JRST TRCK9 + +TRCK3: FETCH(G,G,NXBP) ;NEXT PIN + JUMPN G,TRCK4 +TRCK1: FETCH(H,H,NXTB) ;ANOTHER SLOT PLEASE + JUMPN H,TRCK2 + +NTRCHK: + ; COUNT OF POLARITY ERRORS FROM DWG PROG + TRNE ISBACK!DOERRS + JRST NPOLCK + TLNN ASKHIM + JRST DOPOL + SKIPE TTYFLG + CLOSE LST, ;FORCE OUTPUT IF TTY + ASK[ASCIZ/POLARITY ERROR COUNTS?/] + JRST WLSQT + JRST NPOLCK +DOPOL: MOVEI T,[ASCIZ/ POLARITY ERROR COUNTS BY DRAWING +FILE EXT PPN MODULE COUNT OF ERRORS/] + MOVEM T,HEADER + MOVEI T,POLMAR + MOVEM T,MARGIN + SETZM LINCNT + MOVEI H,RADDR(W,FILS,FNXT) + JRST DOPOL1 + +DOPOL2: FETCH(T,H,FPOL) + JUMPE T,DOPOL1 + SKIPL LINCNT + PUSHJ P,PUTHDR + PUTSIX ADDR(H,FILN) + PUTBYT 11 + FETCH(TT,H,FEXT) + HRLZ TT,TT + PUTSIX TT + PUTBYT 11 + FETCH(TT,H,FPPN) + HLLZ TT,TT + PUSHJ P,LSIXOUT + PUTBYT "," + FETCH(TT,H,FPPN) + HRLZ TT,TT + PUSHJ P,LSIXOUT + MOVEI A,=32 + PUSHJ P,FILL + FETCH(A,H,FMOD) + PUSHJ P,STROUT + PUTSTR[ASCIZ/ /] + FETCH(T,H,FPOL) + PUSHJ P,DECOUT + CRLF +DOPOL1: FETCH(H,H,FNXT) + JUMPN H,DOPOL2 +NPOLCK: +>;DEC + ; MAIN LOOP + TRNE ISBACK + SKIPA F,[-NBLEN,,SUMLEN] + MOVSI F,-SUMLEN + MOVEI T,WSWMAR + MOVEM T,MARGIN +WIRSM1: TLNN ASKHIM + JRST WIRSMD + SKIPE TTYFLG + CLOSE LST, ;FORCE OUTPUT IF TTY + OUTSTR @HDRTAB(F) + ASK[ASCIZ/?/] + JRST WLSQT + JRST ASKNXT +WIRSMD: MOVE T,HDRTAB(F) + MOVEM T,HEADER + SETZM LINCNT + MOVEI H,RADDR(W,WIRES,ALPH) + SETZM NBODS ;COLLECT # OF UNNAMED SIGS HERE + JRST WIRSM3 + +WIRSM2: FETCH(A,H,WBIT) + HRLZ A,A + TLNN A,NAM2ND ;IS THIS A WIRE HEADER? + TLNE A,SNC ;YES, IS IT NC WIRE? + JRST WIRSM3 ;YES, SKIP IT + MOVE G,H + HLRZ TT,SUMTAB(F) ;GET CONTROL BITS + JUMPE TT,[FETCH(TT,H,TBIT) + HRR A,TT + JRST WIRSMN] + TRNN TT,NEEDLC + TLZA DOLC + TLO DOLC + TRNN ISBACK ;ARE WE BACK PANELING? + TLZA BAKGAT + TLO BAKGAT ;INDICATE BACK PANEL + PUSH P,G + SETZ A, ;CLEAR BIT ACCUMULATORS + TLNE DOLC ;DOING LOADING AND COUNTS? + PUSHJ P,LOPSET + PUSHJ P,GATHER ;GATHER REQUIRED INFO + TLNE DOLC + PUSHJ P,LODMER ;CALC PROPER LOADING + POP P,G +WIRSMN: PUSHJ P,@SUMTAB(F) + JRST WIRSM3 + TRNE DOERRS + JRST ERRSPN + PUSH P,T + SKIPL LINCNT + PUSHJ P,WLSHDR + POP P,T + PUTSIG ADDR(H,SPNT) + TRNE ISBACK + JRST BKSMLS + MOVE T,LCOUNT + CAIGE T,=24 ;3 TABS WORTH YET? + JRST ISTHRE + CRLF + PUTSTR[ASCIZ/ /] + JRST WASTHR + +ISTHRE: LSH T,-3 ;# OF TAB STOPS WE ALREADY HAVE + SUBI T,3 + PUTBYT 11 + AOJL T,.-1 +WASTHR: PUSH P,F + PUSHJ P,ONECRD + POP P,F +WIRSM3: FETCH(H,H,ALPH) + JUMPN H,WIRSM2 + TRNN DOERRS + JRST ASKNXT + SKIPE LINCNT + PUSHJ P,WRTZERO ;END THIS CATEGORY +ASKNXT: AOBJN F,WIRSM1 + TRNE DOERRS + PUSHJ P,WRTZERO ;END ERROR SUMMARY WITH NULL HEADER +WLSQT: RELEASE LST, + POPJ P, + +BKSMLS: FETCH(E,G,WPIN) + JUMPE E,BKSM5 ;YUCK +FOR I IN(LINL,LINH,LOUTL,LOUTH) +< SETZM I +> + SETOM SAVET + MOVE T,LCOUNT + CAIL T,=16 ;TWO TABS WORTH + CRLF ;TO MUCH, CRLF + MOVE T,LCOUNT + CAIGE T,8 +BKSM2: PUTBYT 11 + PUTBYT 11 + FETCH(T,E,CBIT) + JUMPE T,BKSM3 + FETCH(A,E,PBDY) + FETCH(A,A,BLOC) + PUSHJ P,SLTOUT +BKSM3: PUTBYT 11 + FETCH(A,E,PINN) + PUSHJ P,PRBCN + MOVE C,D + PUSHJ P,BMSMLD ;LOADING OUT + PUTBYT 11 + FETCH(A,E,FILP) + PUTSIX ADDR(A,FILN) + CRLF + FETCH(E,E,NXTP) + JUMPN E,BKSM2 + SKIPG SAVET ;MORE THAN ONE LOADING LINE? + JRST WIRSM3 + PUTSTR[ASCIZ/ /] + PUSHJ P,CLOADS +BKSM5: CRLF + JRST WIRSM3 + +BMSMLD: +FOR I IN(HILD,LILD,HOLD,LOLD) +< FETCH(T,C,I) + JUMPN T,BMSML1 +> + PUTSTR[ASCIZ/ /] + POPJ P, + +BMSML1: AOS SAVET + JRST LOADIT + +WLSHDR: TRNN ISBACK + JRST WLSHD1 + PUSHJ P,PUTHDR + PUTSTR[ASCIZ/SIGNAL NAME CARD PIN LOW IN HI IN LOW OUT HI OUT FILE + +/] + POPJ P, + +WLSHD1: PUSHJ P,PUTHDR + PUTSTR[ASCIZ/SIGNAL NAME LOW IN HI IN LOW OUT HI OUT FILNAM #I,#O Z# C# + +/] + POPJ P, + + +ERRSPN: FETCH(A,G,WPIN) ;NOW PINS + JUMPE A,WIRSM3 ;DON'T PRINT WIRES WITH NO PINS + SKIPN LINCNT + PUSHJ P,WRTWCD ;PUT OUT WIRE CODE AND HEADING + MOVE B,G +ERRSP1: BINSIG ADDR(B,SPNT) ;WRITE SIGNAL NAME + FETCH(B,B,NNAM) + JUMPN B,ERRSP1 + PUSHJ P,WRTZERO +ERRSP2: FETCH(TTT,A,PID) + FETCH(TT,A,PBDY) + FETCH(T,TT,BBIT) + TRNE T,CBODY ;IF CONNECTOR THIS IS ALL OF PID + JRST ERRSPC + FETCH(TT,TT,BID) + HRL TTT,TT ;ELSE THIS IS THE REST + MOVS TTT,TTT ;BID IN RIGHT HALF +ERRSPC: PUSHJ P,WORDOUT + FETCH(TTT,A,FILP) + FETCH(TTT,TTT,FILN) + PUSHJ P,WORDOUT ;FILENAME + FETCH(A,A,NXTP) + JUMPN A,ERRSP2 + PUSHJ P,WRTZERO + JRST WIRSM3 + +WRTWCD: MOVEI TTT,LESWIR + PUSHJ P,WORDOUT +WRTHD: AOS LINCNT ;USE THIS TO NOTE HEADER OUT + OUTSTR @HEADER ;TELL HIM A CATEGORY IS GOING OUT + OUTSTR[ASCIZ/ +/] + BINSTR @HEADER + POPJ P, + ; TABLES FOR SUMMARY + +DEFINE NAMESW +< +SUMMAC NEEDT,NOOUTP,<RUNS WITH NO OUTPUTS>,1,<NO DRIVE> +SUMMAC NEEDLC,NOHID,<RUNS WITH NO HIGH DRIVE>,3,<NO HIGH DRIVE> +SUMMAC NEEDLC,NOLOD,<RUNS WITH NO LOW DRIVE>,3,<NO LOW DRIVE> +SUMMAC NEEDT!NEEDLC,OVRLOD,<RUNS WHICH ARE OVERLOADED>,2,<OVERLOADED> +SUMMAC NEEDT!NEEDLC,HEAVYL,<BACKPANEL RUNS WHICH ARE HEAVILY LOADED>,0,<HEAVILY LOADED> +SUMMAC NEEDT,NOINP,<RUNS WITH NO INPUTS>,1,<UNUSED SIGNAL> +SUMMAC NEEDLC,EXTRAC,<RUNS WITH MORE THAN 1 CONNECTOR PIN>,0,<MORE THAN 1 CONNECTOR PIN> +SUMMAC NEEDT,INACTI,<INACTIVE INPUTS>,0,<INACTIVE INPUT> +SUMMAC NEEDT,EXOUT,<UNUSED EXTRA OUTPUTS>,0,<UNUSED EXTRA OUTPUT> +SUMMAC NEEDT!NEEDLC,MULTP,<RUNS WITH MORE THAN 1 PULLUP>,2,<MORE THAN 1 PULLUP> +SUMMAC NEEDT!NEEDLC,UNWIR,<RUNS WITH UN OR NC PINS>,0,<UN OR NC PIN(S)> +SUMMAC NEEDT!NEEDLC,ILWORS,<RUNS WITH WIRE OR WARNINGS, ALL OUTPUTS ON SAME DIP>,1,<"WIRE-OR", ALL OUTPUTS ON SAME DIP> +SUMMAC NEEDT!NEEDLC,ILWORD,<RUNS WITH WIRE OR WARNINGS, OUTPUTS ON DIFFERENT DIPS>,2,<"WIRE-OR", OUTPUTS ON DIFFERENT DIPS> +SUMMAC NEEDT!NEEDLC,ILWORE,<RUNS WITH WIRE OR WARNINGS, RUN GOES TO BACKPANEL>,3,<"WIRE-OR", SIGNAL GOES TO BACKPANEL> +SUMMAC NEEDT,ILBPRC,<UNNAMED BACKPANEL RUNS>,3,<UNNAMED BACKPANEL RUN> +SUMMAC NEEDT!NEEDLC,MULTZ,<RUNS WITH MORE THAN 1 TERMINATOR>,2,<MORE THAN 1 TERMINATOR> +SUMMAC NEEDT,MLTMRL,<RUNS WITH MULTIPLE TERMINATION RULES>,3,<MULTIPLE TERMINATOR RULES> +SUMMAC NEEDT!NEEDLC,NEEDZ,<RUNS WHICH NEED TERMINATION>,2,<TERMINATION NEEDED> +SUMMAC NEEDT!NEEDLC,ILLZ,<RUNS WITH ILLEGAL TERMINATION>,2,<ILLEGAL TERMINATION> +SUMMAC NEEDT!NEEDLC,QUESTZ,<RUNS WITH QUESTIONABLE TERMINATION>,1,<QUESTIONABLE TERMINATION> +SUMMAC NEEDT!NEEDLC,ILFFI,<FLIP-FLOP OUTPUT DRIVING FLIP-FLOP INPUTS OF OTHER DIPS>,1,<FLIP-FLOP OUTPUT DRIVING FLIP-FLOP INPUTS OF OTHER DIPS> +SUMMAC NEEDT,NILWIR,<RUNS WITH NO INPUTS OR OUTPUTS>,3,<NO INPUTS OR OUTPUTS> +SUMMAC NEEDT,OUTPWR,<RUNS WITH INPUTS AND/OR OUTPUTS CONNECTED TO POWER>,3,<INPUT AND/OR OUTPUT CONNECTED TO POWER> +SUMMAC NEEDT,ILGNDO,<RUNS WITH OUTPUT CONNECTED TO GROUND>,3,<OUTPUT CONNECTED TO GROUND> +SUMMAC NEEDT,ILLVG,<RUNS WITH POWER CONNECTED TO GROUND>,3,<POWER CONNECTED TO GROUND> +SUMMAC NEEDLC,ILLMIX,<RUNS WITH MIXED POWER VOLTAGES>,3,<MIXED POWER VOLTAGES> +SUMMAC NEEDT,ILLET,<RUNS WITH ECL CONNECTED TO TTL>,3,<ECL CONNECTED TO TTL> +> + +DEFINE NAMESB +< +SUMMAC ,NOOUTA,<RUNS WITH NO OUTPUTS>,1,<NO DRIVE> +SUMMAC NEEDLC,NOHIDB,<RUNS WITH NO HIGH DRIVE>,3,<NO HIGH DRIVE> +SUMMAC NEEDLC,NOLODB,<RUNS WITH NO LOW DRIVE>,3,<NO LOW DRIVE> +SUMMAC NEEDLC,OVRLOD,<RUNS WHICH ARE OVERLOADED>,2,<OVERLOADED> +SUMMAC NEEDT,ILBPRB,<UNNAMED BACKPANEL RUNS>,3,<UNNAMED BACKPANEL RUN> +SUMMAC ,OUTONE,<RUNS UNUSED ON BACK PANEL>,1,<UNUSED SIGNAL> +SUMMAC ,BPSING,<RUNS APPEARING ON ONLY 1 CARD>,2,<APPEARS ON ONLY 1 CARD> +SUMMAC NEEDT!NEEDLC,MULTP,<RUNS WITH MORE THAN 1 PULLUP>,2,<MORE THAN 1 PULLUP> +SUMMAC NEEDLC,ILLWOR,<RUNS WITH WIRE OR WARNINGS>,1,<"WIRE-OR" WARNING> +SUMMAC NEEDT!NEEDLC,ILFFI,<FLIP-FLOP OUTPUT DRIVING FLIP-FLOP INPUTS OF OTHER DIPS>,3,<FLIP-FLOP OUTPUT DRIVING FLIP-FLOP INPUTS OF OTHER DIPS> +SUMMAC NEEDT!NEEDLC,ILFFO,<FLIP-FLOP OUTPUTS DRIVING MORE THAN 1 OTHER BOARD>,2,<FLIP-FLOP OUTPUT DRIVING MORE THAN 1 OTHER BOARD> +SUMMAC ,MORONE,<RUNS WITH MORE THAN ONE PIN ON A CARD>,1,<MORE THAN 1 PIN ON A CARD> +SUMMAC NEEDT!NEEDLC,MULTZ,<RUNS WITH MORE THAN 1 TERMINATOR>,1,<MORE THAN 1 TERMINATOR> +SUMMAC NEEDT!NEEDLC,NEEDBZ,<RUNS WHICH NEED TERMINATION>,1,<TERMINATION NEEDED> +SUMMAC NEEDT!NEEDLC,ILLBZ,<RUNS WITH ILLEGAL TERMINATION>,2,<ILLEGAL TERMINATION> +SUMMAC NEEDT!NEEDLC,QUESBZ,<RUNS WITH QUESTIONABLE TERMINATION>,1,<QUESTIONABLE TERMINATION> +SUMMAC ,NILWIR,<RUNS WITH NO INPUTS OR OUTPUTS>,3,<NO INPUTS OR OUTPUTS> +SUMMAC ,OUTPWR,<RUNS WITH INPUTS OR OUTPUTS CONNECTED TO POWER>,3,<INPUT AND/OR OUTPUT CONNECTED TO POWER> +SUMMAC ,ILGNDO,<RUNS WITH OUTPUT CONNECTED TO GROUND>,3,<OUTPUT CONNECTED TO GROUND> +SUMMAC ,ILLVG,<RUNS WITH POWER CONNECTED TO GROUND>,3,<POWER CONNECTED TO GROUND> +SUMMAC NEEDLC,ILLMIX,<RUNS WITH MIXED POWER VOLTAGES>,3,<MIXED POWER VOLTAGES> +SUMMAC NEEDT,ILLET,<RUNS WITH ECL CONNECTED TO TTL>,2,<ECL CONNECTED TO TTL> +> + +DEFINE SUMMAC(A,B,C,D,E) +< A,,B +> + +;BITS IN TABLE CANNOT EXTEND INTO INDIRECT OR INDEX FIELDS +NEEDT__400000 ;NEED TYPE BITS FROM GATHER +NEEDLC__200000 ;NEED LOADING BITS FROM GATHER + +SUMTAB: + NAMESW +SUMLEN__.-SUMTAB + NAMESB +NBLEN__.-SUMTAB-SUMLEN + +DEFINE SUMMAC(A,B,C,D,E) +< [ASCIZ\C\] +> + +HDRTAB: + NAMESW + NAMESB + + +DEFINE SUMMAC(A,B,C,D,E) +< ERRSTR D,[ASCIZ \E\] +> + +ERRTAB: NAMESW + NAMESB +PURGE NAMESW,NAMESB + ; SUMMARY ROUTINES +NOOUTP: TLC A,WSINGL!GENSIG + TLCN A,WSINGL!GENSIG + TRNE A,DRVREQ ;IS SINGLE UNNAMED PIN, NEED DRIVE? + CAIA ;YES + POPJ P, ;SINGLE PIN WITH NO DRIVE REQUIRED + TRNN A,ANYCON ;NON-EDGE RUNS WITH NO OUTPUTS + PUSHJ P,NOOUTA + POPJ P, + PUSHJ P,EXTRAI ;IS THIS AN INACTIVE INPUT + AOS (P) + POPJ P, ;YES, NOT IN THIS CATEGORY + +NOOUTA: TDNN A,[SPWR!SGND,,OUTLD] ;RUNS WITH NO OUTPUTS + TRNN A,INLD!PWR!GND + POPJ P, + JRST CPOPJ1 + +;INACTIVE INPUTS +INACTI: TLC A,WSINGL!GENSIG + TLCN A,WSINGL!GENSIG + TRNE A,DRVREQ ;IS SINGLE UNNAMED PIN, NEED DRIVE? + CAIA + POPJ P, ;SINGLE PIN WITH NO DRIVE REQUIRED + TRNN A,ANYCON + PUSHJ P,NOOUTA + POPJ P, + PUSHJ P,EXTRAI + POPJ P, + JRST CPOPJ1 + +MULTP: MOVE T,NPULL + CAILE T,1 + AOS (P) + POPJ P, + + ;ECL FF OUTPUT DRIVING TOO MANY CARDS +ILFFO: TRC A,ECL!FFOUT + TRCE A,ECL!FFOUT + POPJ P, ;NOT ECL FF OUTPUT + MOVE TT,CONFLG + CAILE TT,1 ;HOW MANY CARDS(STARTED AS -1)? + AOS (P) ;TOO MANY + POPJ P, + +;ECL FF OUTPUT DRIVING ECL FF INPUTS OF OTHER DIPS +ILFFI: TRC A,ECL!FFOUT + TRCE A,ECL!FFOUT + POPJ P, ;NOT ECL FF OUTPUT + TRC A,ECL!FFIN + TRCE A,ECL!FFIN ;MUST BE ECL FF INPUTS ALSO + POPJ P, ;NOPE + FETCH(TT,G,WPIN) ;FIRST PIN +ILFFI1: FETCH(TTT,TT,PBIT) + TRNE TTT,DUP + JRST ILFFI2 + TRNE ISBACK + JRST [ FETCH(TTT,TT,CBIT) + JRST ILFFI5] + FETCH(TTT,TT,PTYP) + JUMPE TTT,ILFFI2 + FETCH(TTT,TTT,DPBIT) +ILFFI5: TRC TTT,ECL!FFOUT + TRCE TTT,ECL!FFOUT + JRST ILFFI2 + FETCH(TTT,TT,PBDY) + MOVEM TTT,TMPCN2 + FETCH(TTT,TTT,BLOC) + MOVEM TTT,TMPCN1 ;SAVE LOC HERE + MOVEM TT,SAVET ;AND PIN HERE + FETCH(TT,G,WPIN) ;START AT FRONT AGAIN +ILFFI3: FETCH(TTT,TT,PBIT) + TRNE TTT,DUP + JRST ILFFI4 + TRNE ISBACK + JRST [ FETCH(TTT,TT,CBIT) + JRST ILFFI6] + FETCH(TTT,TT,PTYP) + JUMPE TTT,ILFFI4 + FETCH(TTT,TTT,DPBIT) +ILFFI6: TRC TTT,ECL!FFIN + TRCE TTT,ECL!FFIN + JRST ILFFI4 + FETCH(TTT,TT,PBDY) + CAMN TTT,TMPCN2 + JRST ILFFI4 ;ON SAME BODY IS ALWAYS SAME DIP + FETCH(TTT,TTT,BLOC) + CAME TTT,TMPCN1 + JRST CPOPJ1 ;FF OUTPUT DRIVES FF INPUT OF OTHER DIP + JUMPE TTT,CPOPJ1 ;NO LOC IS NOT SAME DIP +ILFFI4: FETCH(TT,TT,NXTP) + JUMPN TT,ILFFI3 + MOVE TT,SAVET +ILFFI2: FETCH(TT,TT,NXTP) + JUMPN TT,ILFFI1 + POPJ P, + + ;RUN ON SINGLE CARD +BPSING: FETCH(T,G,WPIN) + JUMPE T,CPOPJ + SETO TT, ;COUNT OF CARDS +BPSNG1: FETCH(TTT,T,PBIT) + TRNE TTT,DUP ;SKIP DUPS + JRST BPSNG2 + FETCH(TTT,T,CBIT) + SKIPE TTT ;NOT 0 MEANS CARD OCCURENCE + AOJG TT,CPOPJ ;COUNT UP AND QUIT IF .GT. 1 +BPSNG2: FETCH(T,T,NXTP) + JUMPN T,BPSNG1 + JUMPE TT,CPOPJ1 ;SKIP IF EXACTLY 1 CARD + POPJ P, + +;UNUSED BACK PANEL RUNS +OUTONE: TLNN A,SPWR!SGND ;SKIP THESE + TRNN A,OUTLD ;MUST HAVE SOME OUTPUTS ON RUN + POPJ P, + TRNE A,INLD!PWR!GND ;IF NO INPUTS AT ALL, + JRST CPOPJ1 ;THEN UNUSED + SETZM TMPCN1 + FETCH(TT,G,WPIN) ;FIRST PIN (AT LEAST ONE) +OUTTWO: FETCH(TTT,TT,CBIT) ;GET CON/CARD BITS + JUMPE TTT,OUTTHREE ;ANY? + CAME TTT,TMPCN1 ;SAME CARD? + SKIPN TMPCN1 ;NO, SEEN ONE YET? + CAIA ;SAME OR FIRST + POPJ P, ;MORE THAN ONE CARD +OUTTHREE:FETCH(TT,TT,NXTP) + JUMPN TT,OUTTWO + JRST CPOPJ1 ;ONLY OUTPUTS! + +;MORE THAN ONE PIN ON RUN ON CARD +MORONE: TLNE A,SPWR!SGND!SHI!SNC ;THESE RUNS ARE OK + POPJ P, + MOVEI TT,RADDR(G,WPIN,NXTP) + SETZM SAVET + JRST MORON2 + +MORON1: FETCH(TTT,TT,PBIT) + TRNE TTT,DUP + JRST MORON2 + FETCH(TTT,TT,PBDY) + FETCH(TTT,TTT,BLOC) + EXCH TTT,SAVET + CAMN TTT,SAVET ;SAME CARD? + JRST CPOPJ1 ;YES, BINGO +MORON2: FETCH(TT,TT,NXTP) + JUMPN TT,MORON1 + POPJ P, + +;MORE THAN ONE TERMINATION RULE ON RUN +MLTMRL: TRNN A,ANYCON ;ANY CONNECTORS? + POPJ P, ;NO, OK THEN + MOVEI TT,RADDR(G,WPIN,NXTP) + SETZM SAVET ;CLEAR LAST RULE SEEN + JRST MLTRL2 + +MLTRL1: FETCH(TTT,TT,PBIT) + TRNN TTT,TRMBTS ;ANY TERMINATOR RULE? + JRST MLTRL2 ;NO, SKIP IT + LDB TTT,[POINT TRMBSZ,TTT,TRMBPS+=18] + EXCH TTT,SAVET ;SAVE NEW, GET OLD + JUMPE TTT,MLTRL2 ;OK IF FIRST + CAME TTT,SAVET ;SAME RULE? + JRST CPOPJ1 ;NO, LOSE +MLTRL2: FETCH(TT,TT,NXTP) + JUMPN TT,MLTRL1 + POPJ P, + + ;UNNAMED BACKPANEL RUNS (CARD) +ILBPRC: TLNE A,GENSIG + TRNN A,ANYCON + POPJ P, + JRST CPOPJ1 + +;UNNAMED BACKPANEL RUNS (BP) +ILBPRB: TLNE A,GENSIG + AOS (P) + POPJ P, + +;NON-EDGE RUNS WITH NO INPUTS +NOINP: TDNE A,[SPWR!SGND,,OUTLD] ;IS IT EVEN GENERATED? + TRNE A,ANYCON!INLD!GND!PWR + POPJ P, ;NO + PUSHJ P,EXTRAO + JRST CPOPJ1 + POPJ P, + +EXTRAC: TLNE A,SPWR!SGND!SNC!SHI + POPJ P, + MOVE T,NCONS + CAILE T,1 + AOS (P) + POPJ P, + +;UNUSED EXTRA OUTPUTS +EXOUT: TDNE A,[SPWR!SGND,,OUTLD] + TRNE A,ANYCON!INLD!GND!PWR + POPJ P, + JRST EXTRAO + +;RUNS WITH NOTHING +NILWIR: TRC A,ANYCON!TERM + TRCN A,ANYCON!TERM + POPJ P, ;EDGE PIN TO TERM OK + TRNN A,INLD!OUTLD!PWR!GND + AOS (P) + POPJ P, + +;RUNS WITH UN OR NC +UNWIR: TRNN A,NULLD ;ANY NULLS? + SKIPE NULLS ;OR UN'S + AOS (P) + POPJ P, + +;OUTPUTS AND PWR +OUTPWR: TRNE A,PWR + TDNN A,[SGND,,OUTLD!INLD] + POPJ P, + JRST CPOPJ1 + +;OUTPUTS AND GND +ILGNDO: TRNE A,GND + TDNN A,[SPWR,,OUTLD] + POPJ P, + JRST CPOPJ1 + +;GND AND PWR +ILLVG: TRC A,PWR!GND + TRCN A,PWR!GND + AOS (P) + POPJ P, + +;MIXED VOLTAGES +ILLMIX: SKIPE ILVOLT + AOS (P) + POPJ P, + + ;ECL CONNECTED TO TTL +ILLET: TRC A,ECL!TTL + TRCN A,ECL!TTL + AOS (P) + POPJ P, + +HEAVYL: TLNN A,SPWR!SGND!SHI + TRNN A,ANYCON + POPJ P, + MOVM T,LINL + CAIL T,=1000 + AOS (P) + POPJ P, + +NOHID: SKIPE NCONS ;NO CHECK FOR EDGE RUNS (ON CARD) + POPJ P, +NOHIDB: SKIPE ANYOUT + SKIPN LINH ;HIGH SINKS? + POPJ P, ;NO + SKIPN LOUTH ;YES, HIGH SOURCE? + AOS (P) ;NO, ERROR + POPJ P, + +NOLOD: SKIPE NCONS + POPJ P, +NOLODB: SKIPE T,ANYOUT + SKIPN LINL + POPJ P, + CAME T,NPULL ;NO CHECK IF ALL PULLUPS + SKIPE LOUTL ;NOT ALL PULLUPS, ANY DRIVE? + POPJ P, ;OK + JRST CPOPJ1 ;LOSE + +;OVERLOADS +OVRLOD: TRNE A,INLD!TERM ;INPUTS AND + SKIPN TT,ANYOUT ;OUTPUTS? + POPJ P, ;NO + CAMN TT,NPULL + JRST CKHOVR + SKIPN TT,LOUTL + JRST CKHOVR + PUSHJ P,LOLOAD + JUMPGE T,ISOVR +CKHOVR: PUSHJ P,HILOAD + JUMPL T,CPOPJ +ISOVR: AOS (P) + POPJ P, + + ;ILLEGAL WIRE OR'S +ILWORS: PUSHJ P,ILLWOR + POPJ P, + PUSHJ P,WORSAM ;CHECK IF ON SAME DIP + POPJ P, + JRST CPOPJ1 ;ON SAME DIP + +ILWORD: PUSHJ P,ILLWOR + POPJ P, + PUSHJ P,WORSAM + JRST CPOPJ1 + POPJ P, + +WORSAM: SETOM SAVET + MOVEI TT,RADDR(G,WPIN,NXTP) + JRST WORSM1 + +WORSM2: FETCH(TTT,TT,PTYP) + JUMPE TTT,WORSM1 + FETCH(TTT,TTT,DPBIT) + TRNN TTT,OUTLD + JRST WORSM1 + FETCH(TTT,TT,PBDY) + FETCH(TTT,TTT,BLOC) + JUMPE TTT,CPOPJ ;ON DIFFERENT DIPS IF NO LOC + SKIPGE SAVET + MOVEM TTT,SAVET + CAME TTT,SAVET ;DIFFERENT LOCS? + POPJ P, ;YES, DIRECT RETURN +WORSM1: FETCH(TT,TT,NXTP) + JUMPN TT,WORSM2 + JRST CPOPJ1 ;ALL ON SAME DIP + +ILWORE: PUSHJ P,ILLWOR + POPJ P, + TRNE A,ANYCON ;ANY EXTERNAL CONNECTIONS? + AOS (P) ;YES, LEAVES BOARD + POPJ P, + +;WIRE OR +ILLWOR: SKIPN TT,ANYOUT + POPJ P, + CAMN TT,NOUT ;ALL NORMAL OUTPUTS? + JRST [ CAIE TT,1 + AOS (P) + POPJ P,] + CAMN TT,NTRI + POPJ P, + SUB TT,NPULL + CAME TT,NOC + AOS (P) + POPJ P, + + ;TERMINATION CHECKS +NEEDZ: TRC A,INLD!OUTLD!ECL + TRCN A,INLD!OUTLD!ECL + TRNE A,ANYCON + POPJ P, + SKIPN NTERM + AOS (P) + POPJ P, + +ILLZ: TRNN A,ECL + POPJ P, + TRNE A,ANYCON + TRNN A,OUTLD + POPJ P, + SKIPE NTERM + AOS (P) + POPJ P, + +QUESTZ: TRNN A,ECL + POPJ P, + TRNN A,ANYCON + JRST QNCONZ + TRNN A,OUTLD + SKIPE NTERM + POPJ P, + TRNE A,INLD + AOS (P) + POPJ P, + +QNCONZ: TRNN A,INLD + TRNN A,OUTLD + POPJ P, + SKIPE NTERM + AOS (P) + POPJ P, + +MULTZ: MOVE T,NTERM + CAILE T,1 + TRNN A,ECL + POPJ P, + JRST CPOPJ1 + +NEEDBZ: SKIPN NTERM + TRNN A,ECL + POPJ P, + TRC A,INLD!OUTLD + TRCN A,INLD!OUTLD + AOS (P) + POPJ P, + +ILLBZ: TRNE A,ECL + SKIPN NTRMOUT + POPJ P, + JRST CPOPJ1 + +QUESBZ: SKIPE NTRMOUT + POPJ P, ;CAUGHT BY ILLEGAL CASE + TRNE A,ECL + SKIPG T,NTERM + POPJ P, + CAMN T,NTRMIN + CAIE T,1 + AOS (P) + POPJ P, + ;MORE COMMON SUBRS FOR 'WL' AND 'WLS' +ERRLOP: PUSHJ P,@SUMTAB(F) + JRST ERRLP1 + XCT ERRTAB(F) +ERRLP1: AOBJN F,ERRLOP + POPJ P, + +LOPSET: SETZB A,CNTTAB ;ZERO COUNTS AND LOADING + MOVE T,[CNTTAB,,CNTTAB+1] + BLT T,LODTAB+LODLEN-1 + POPJ P, + +LOACAL: SKIPN TT,(TTT) + JRST LOASTO + JUMPG TT,LOACL1 ;TAKE MIN OF ALL DRIVES + CAMGE TT,T ;NEG DRIVE +LOASTO: MOVEM T,(TTT) + POPJ P, + +LOACL1: CAMLE TT,T + JRST LOASTO + POPJ P, + +LODMER: PUSHJ P,LODMR1 + MOVEM T,LOUTL + MOVEM TT,LOUTH + POPJ P, + +LODMR1: SKIPE T,LOUTL ;NORMAL OUTPUT? + JRST LODMRH + SKIPN T,LTRIL + SKIPA T,LOCL + SKIPN TT,LOCL + JRST LODMRH + JUMPG T,[CAMLE T,TT + MOVE T,TT + JRST LODMRH] + CAMGE T,TT + MOVE T,TT +LODMRH: SKIPN TT,LOUTH + MOVE TT,LTRIH + ADD TT,LPULLH + POPJ P, + +LOLOAD: MOVE T,LOUTL + IMUL T,LOADMG ;LOAD MARGIN + PUSH P,T + MOVE T,LINL + IMULI T,=100 + ADDM T,(P) + POP P,T + SKIPN T + SKIPA T,[-1] ;IF IT COMES OUT EXACT + EQV T,LOUTL + POPJ P, + +HILOAD: MOVE T,LOUTH + IMUL T,LOADMG ;LOAD MARGIN + PUSH P,T + MOVE T,LINH + IMULI T,=100 + ADDM T,(P) + POP P,T + SKIPN T + SKIPA T,[-1] + EQV T,LOUTH + POPJ P, + + +EXTRAI: FETCH(T,G,WBIT) + TRNE T,GENSIG ;MUST NOT HAVE NAME OF ITS OWN + TRNN T,WSINGL ;MUST BE SINGLE PIN + POPJ P, + FETCH(TTT,G,WPIN) ;GET FIRST (AND ONLY) PIN + FETCH(TT,TTT,PTYP) + JUMPE TT,CPOPJ ;NO TYPE, NO SINGLE OUTPUT + FETCH(T,TT,DPBIT) ;TYPE BITS + TRNN T,SHARE ;ARE WE THE RIGHT GUY? + POPJ P, ;NO + FETCH(TT,TT,PSWP) + JUMPE TT,CPOPJ ;IF NO SHARE #, NO POSSIBLE MATCH + MOVEM TT,SHRNUM + FETCH(T,TTT,PBDY) ;BODY POINTER + FETCH(T,T,BPIN) ;AND FIRST PIN + PUSH P,A +EXTRI1: CAIN T,(TTT) ;DON'T LOOK AT US! + JRST EXTRI2 + FETCH(TT,T,PTYP) + JUMPE TT,EXTRI2 + FETCH(TT,TT,PSWP) ;WE KNOW THE # WON'T MATCH IF NOT INPUT + CAME TT,SHRNUM ;SAME GROUP? + JRST EXTRI2 ;NO + PUSH P,T + HRLM G,(P) + FETCH(G,T,HPNT) + TLZ DOLC!BAKGAT + SETZ A, + PUSHJ P,GATHER + POP P,T + HLRZ G,T + TLNE A,SGND ;IS THIS RUN EVER CALLED "GND"? + JRST [ POP P,A + JRST CPOPJ1] ;YES, INACTIVE INPUT +EXTRI2: FETCH(T,T,NXBP) + JUMPN T,EXTRI1 + POP P,A + POPJ P, + +EXTRAO: FETCH(T,G,WBIT) + TRNN T,WSINGL ;MUST BE SINGLE PIN + POPJ P, + FETCH(TTT,G,WPIN) ;GET FIRST (AND ONLY) PIN + FETCH(TT,TTT,PTYP) + JUMPE TT,CPOPJ ;NO TYPE, NO SINGLE OUTPUT + FETCH(T,TT,DPBIT) ;TYPE BITS + TRNN T,OUTLD ;ARE WE THE RIGHT GUY? + POPJ P, ;NO + FETCH(TT,TT,PSWP) + JUMPE TT,CPOPJ ;IF NO SHARE #, NO POSSIBLE MATCH + MOVEM TT,SHRNUM + FETCH(T,TTT,PBDY) ;BODY POINTER + FETCH(T,T,BPIN) ;AND FIRST PIN + PUSH P,A +EXTRO1: CAIN T,(TTT) ;DON'T LOOK AT US! + JRST EXTRO2 + FETCH(TT,T,PTYP) + JUMPE TT,EXTRO2 + FETCH(TT,TT,PSWP) ;WE KNOW THE # WON'T MATCH IF NOT OUTPUT + CAME TT,SHRNUM ;SAME GROUP? + JRST EXTRO2 ;NO + PUSH P,T + HRLM G,(P) + FETCH(G,T,HPNT) + TLZ DOLC!BAKGAT + SETZ A, + PUSHJ P,GATHER + POP P,T + HLRZ G,T + TRNE A,ANYCON!INLD ;IS THIS OUTPUT USED, OR DOES IT GO TO BACK PANEL? + JRST [ POP P,A + JRST CPOPJ1] ;YES, EXTRA UNUSED OUTPUT +EXTRO2: FETCH(T,T,NXBP) + JUMPN T,EXTRO1 + POP P,A + POPJ P, + + ;MAXDPN - Find largest DipPinName +; Either # pins on package or largest pin # mentioned in dip def +;A = Body +;Returns: +;T = DIP size + +MAXDPN: MOVEI T,MAXPIN ;ASSUME MAX IF NO DIPTYPE + FETCH(A,A,DIPT) + JUMPE A,CPOPJ + FETCH(T,A,DPAK) + JUMPE T,MAXDP3 ;ANY PACKAGE MENTIONED? + HRRZ T,PACKPN(T) ;YES, TAKE IT'S WORD FOR # PINS + POPJ P, + +;Look for biggest mention pin name in DipDef +MAXDP3: FETCH(T,A,DPNN) ;INITIALIZE TO # DEFINED PINS AS MAX + MOVEI A,RADDR(A,DPIN,DPNXT) + JRST MAXDP1 + +MAXDP2: FETCH(TT,A,DPNM) ;PIN NAME IN DIP DEF + CAMLE TT,T + MOVE T,TT ;BIGGEST SO FAR +MAXDP1: FETCH(A,A,DPNXT) + JUMPN A,MAXDP2 + POPJ P, + ; GATHER LOADING AND TYPE BITS +;G = WIRE POINTER +;0 = GATHER CONTROL BITS IN LH AC 0 +;RETURNS +;A = ACCUMULATED BITS, LH=WBIT RH=TBIT +;WBIT - signal type bits (SPWR, SGND, ...) +;TBIT - summary pin type bits on this wire. (INLD, OUTLD, PWR, GND, etc.) +;LOADING AND COUNTS ARE KEPT IN STANDARD PLACES +;LINL,LINH,LOUTL,LOUTH,LOCL,LPULLH,LTRIL,LTRIH +;CLOBBERS T, TT, TTT + +GATHER: FETCH(T,G,WBIT) + TLO A,(T) + FETCH(TT,G,WVOL) + TRNE T,SPWR + MOVEM TT,PVOLTS ;FORCE ERRORS IF SIGNAL DISAGREES WITH DIP PIN + FETCH(T,G,TBIT) + TRO A,(T) + FETCH(G,G,WPIN) + JUMPE G,CPOPJ + TLNE BAKGAT + JRST GDOBAK + FETCH(T,G,TBIT) + TRNE T,ANYCON + JRST GATHR1 + TLNN DOLC + POPJ P, +GATHR1: FETCH(TT,G,PBIT) + TRNE TT,DUP + JRST GATHR5 + FETCH(T,G,PBDY) + FETCH(T,T,BBIT) + TRNE T,CBODY + JRST GATC + TLNN DOLC + JRST GATHR5 + FETCH(T,G,PTYP) + JUMPN T,GATHR4 + AOS NULLS + JRST GATHR5 + +; A connector body +GATC: SKIPE ISWW + TLNE DOLC + AOS NCONS + SKIPN ISWW + JRST GATHR5 + PUSH P,A + FETCH(A,G,PBDY) ;CHECK TO SEE IF CONNECTOR IS DEDICATED + FETCH(A,A,BLOC) + FETCH(TT,G,PINN) + HRLI A,MAPCON(TT) + PUSHJ P,PINBIT ;SEE IF PIN IS A DEDICATED PIN + POP P,A + JUMPE TT,GATHR5 + HLRZS TT + TRO A,(TT) + TLNN DOLC + JRST GATHR5 + TRNE TT,PWR + AOS NPWR + TRNE TT,GND + AOS NGND + JRST GATHR5 + +GATHR4: SETZ TT, + SKIPN ISWW + JRST GATHR9 + PUSH P,A + PUSH P,T + FETCH(A,G,PBDY) ;FIRST SEE IF BOARD IS DEDICATED + FETCH(B,A,BPAK) + FETCH(A,A,BLOC) + FETCH(TT,G,PINN) + HRL A,TT + PUSHJ P,MAPOST + TDZA TT,TT ;CAN'T FIND BOARD PIN? + PUSHJ P,PINBIT ;SEE IF PIN IS A DEDICATED PIN + POP P,T + POP P,A + HLRZS TT + TRO A,(TT) ;MAKE PIN TYPE BITS INCLUDE FORCED PWR/GND +GATHR9: FETCH(TTT,T,DPBIT) + TRO TTT,(TT) + FETCH(TT,T,LHI) + FETCH(T,T,LLOW) + TRNE TTT,NULLD + JRST [ AOS NULLS + JRST GATHR5] + TRNE TTT,GND + JRST [ AOS NGND + JRST GATHR5] + TRNE TTT,PWR + JRST [ AOS NPWR + ADDM TT,PMAMPS + JUMPE T,GATHR5 + EXCH T,PVOLTS + JUMPE T,GATHR5 + CAME T,PVOLTS + SETOM ILVOLT + JRST GATHR5] + TRNE TTT,INLD + JRST [ AOS NIN + FETCH(TTT,G,PBIT) + ADDM TT,LINH + TRNN TTT,PSHARE + ADDM T,LINL + JRST GATHR5] + TRNE TTT,TERM + JRST [ AOS NTERM + ADDM T,LINL + TRNE TTT,ECL + ADDM TT,LOUTH + TRNN TTT,ECL + ADDM TT,LINH + JRST GATHR5] + TRNN TTT,OUTLD + JRST GATHR5 + AOS ANYOUT + TRNE TTT,OPENC + JRST [ AOS NOC + MOVEI TTT,LOCL ;TAKE MIN OF OC OUTPUTS + PUSHJ P,LOACAL + JRST GATHR5] + TRNE TTT,TRI + JRST [ AOS NTRI + MOVEI TTT,LTRIL + PUSH P,TT + PUSHJ P,LOACAL + POP P,T + MOVEI TTT,LTRIH + PUSHJ P,LOACAL + JRST GATHR5] + TRNE TTT,PULL + JRST [ AOS NPULL + ADDM TT,LPULLH + JRST GATHR5] + AOS NOUT + ADDM TT,LOUTH + ADDM T,LOUTL +GATHR5: FETCH(G,G,NXTP) + JUMPN G,GATHR1 + POPJ P, + +GDOBAK: FETCH(T,G,PBIT) + TRNE T,DUP + JRST GATBKN + FETCH(TTT,G,CBIT) ;CON/CARD BITS + TRNN TTT,INLD!TERM ;ANY INPUTS? + JRST GATBKO ;NO, CHECK OUT + TRCE TTT,INLD + AOS NIN + TRCE TTT,TERM + AOS NTERM + TRCN TTT,TERM!INLD + AOS NTRMIN + FETCH(T,G,HILD) + ADDM T,LINH + FETCH(T,G,LILD) + ADDM T,LINL +GATBKO: FETCH(TT,G,HOLD) + FETCH(T,G,LOLD) + TRNN TTT,OUTLD ;ANY OUTPUTS? + JRST GATBKX ;NO, LOOP + AOS ANYOUT + TRNE TTT,INLD + AOS NINOUT + TRNE TTT,TERM + AOS NTRMOUT + TRNE TTT,TRI + JRST [ AOS NTRI + MOVEI TTT,LTRIL + PUSH P,TT + PUSHJ P,LOACAL + POP P,T + MOVEI TTT,LTRIH + PUSHJ P,LOACAL + JRST GATBKN] + TRNN TTT,OPENC!PULL + JRST [ AOS NOUT + JRST GATBKX] + TRNN TTT,PULL + JRST GATBKC + AOS NPULL + ADDM TT,LPULLH +GATBKC: TRNN TTT,OPENC + JRST GATBKN + AOS NOC + MOVEI TTT,LOCL + PUSHJ P,LOACAL + JRST GATBKN + +GATBKX: ADDM T,LOUTL + ADDM TT,LOUTH +GATBKN: FETCH(G,G,NXTP) + JUMPN G,GDOBAK + POPJ P, diff --git a/src/wl/wlout2.513 b/src/wl/wlout2.513 new file mode 100644 index 00000000..842badd6 --- /dev/null +++ b/src/wl/wlout2.513 @@ -0,0 +1,5194 @@ +;<WIRELIST>WLOUT2.FAI.346, 17-NOV-75 09:49:18, EDIT BY HELLIWELL +SUBTTL <CTRL><META>U COPY DIP ASSIGNMENTS FROM D WIRE LIST TO PC WIRE LIST +DTOPC: MOVE L,DEFLST + FETCH(W,L,WIRL) + PUSHJ P,LSTGT0 ;GET A CARD NAME + POPJ P, + HRRM W,GOODW + FETCH(W,L,PCWL) ;GET POINTER TO FIRST CARD BLOCK + JUMPE W,NXCRD1 ;IS THERE ONE? + PUSHJ P,GETLOP ;LOOKUP SAME CARD + JRST NXCRD1 + HRRM W,BADW + OUTSTR[ASCIZ/ +/] +FIXDIP: MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + HRRZ H,GOODW + MOVEI H,RADDR(H,WBDY,NXTB);POINT TO BODY LIST LINK + SETZM LETTER + SETZM SLICEL + JRST DTOPC1 + +DTOPC2: FETCH(T,H,BLOC) + JUMPE T,DTOPC1 ;ANY LOC? + CAMN T,SLICEL ;DIFFERENT FROM LAST? + JRST DTOPC1 ;NO, SKIP IT + MOVEM T,SLICEL ;REMEMBER LAST + FETCH(TT,H,DIPT) ;DIP TYPE POINTER + JUMPE TT,DTOPC1 + MOVEM T,LETTER + MOVEM TT,DIPPNT + HRRZ C,BADW + MOVEI C,RADDR(C,WBDY,NXTB) + PUSHJ P,BDLNXT ;FIND AND MAP ALL SUCH LOCS IN PC LIST! + TRNE FLAG + JRST DTOPC1 + MOVE A,LETTER + PUSHJ P,LOCOUT + OUTSTR[ASCIZ/ NOT FOUND IN "OTHER" LIST! +/] +DTOPC1: FETCH(H,H,NXTB) + JUMPN H,DTOPC2 + POPJ P, + +NXCRD1: OUTSTR[ASCIZ/SAME CARD DOESN'T EXIST IN "OTHER" WIRE LIST! +/] + POPJ P, + + ;BDLNXT - LINK ALL BODIES IN SAME LOC TO SAME DIPTYPE +; (Also update PTYP links for all the body pins) +;C = BODY LIST +;DIPPNT = DIPTYPE +;FLAG = Body was found + +BDLNXT: PUSHJ P,FN2BOD ;FIND BODY BY LOC IN LETTER + POPJ P, ;NO MORE + TRO FLAG + FETCH(T,C,DIPT) ;DIP TYPE POINTER + JUMPN T,BDLNXT ;ALREADY LINKED? + PUSHJ P,LNKDIP + JRST BDLNXT + +FN2BOD: FETCH(C,C,NXTB) + JUMPE C,CPOPJ + FETCH(TT,C,BLOC) + CAME TT,LETTER + JRST FN2BOD + JRST CPOPJ1 + +LNKDIP: MOVE A,DIPPNT + STORE(A,C,DIPT) ;STORE DIP POINTER + FETCH(E,C,BPIN) + JUMPE E,CPOPJ ;SKIP THIS IF NO PINS + PUSH P,C +LNKDP1: FETCH(F,E,PBDY) ;SETUP BODY POINTER + FETCH(G,E,HPNT) ;WIRE HEADER + FETCH(T,E,PINN) ;PIN # + MOVEM T,PINNUM + PUSHJ P,PTLINK ;LINK UP PIN TO TYPE + JUMPE T,LNKDP2 ;THIS IS 0 IF NO LINKUP + PUSHJ P,LBCOPY ;DO LOADING AND SHARE CHECK +LNKDP2: FETCH(E,E,NXBP) + JUMPN E,LNKDP1 ;LOOP FOR THEM ALL + POP P,C ;RESTORE BODY POINTER + POPJ P, + SUBTTL 'UML' REPLACE REAL PIN NAMES WITH "U" PIN NAMES +DEC,< +UMLOUT: MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + MOVSI T,'UML' ;STUFFING EXT + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + PUSHJ P,UGINSET + PUTSTR[ASCIZ/PINS +/] + FETCH(H,W,WBDY) ;NOW GO DOWN BODY LIST + JUMPE H,UMLBNX ;JUMP IF NONE +UMLO1: FETCH(T,H,BBIT) + TRNN T,CBODY ;CONNECTOR? + JRST UMLO2 ;NO + FETCH(G,H,BPIN) ;YES, GET FIRST PIN +UMLO3: FETCH(T,G,PBIT) + TRNE T,DUP ;DON'T DO DUPLICATES + JRST UMLO4 + FETCH(A,G,HPNT) + FETCH(A,A,TBIT) ;GET WIRE TYPE BITS + PUSHJ P,UGIN + JRST UMLO4 + PUSH P,A + FETCH(A,H,BLOC) + FETCH(T,G,PINN) + HRL A,T + PUSHJ P,LOCPNC + PUTBYT 11 + POP P,A + PUSHJ P,LOCPNC + CRLF +UMLO4: FETCH(G,G,NXBP) + JUMPN G,UMLO3 +UMLO2: FETCH(H,H,NXTB) + JUMPN H,UMLO1 +UMLBNX: PUTSTR[ASCIZ/END +/] + RELEASE LST, + POPJ P, + SUBTTL 'CPN' ADD CONNECTOR PIN DESIGNATION TO EACH SIGNAL NAME IN DRW FILE +CPNOUT: MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + MOVSI T,'CPN' ;CON PIN EXT + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + PUSHJ P,CLEARW ;CLEAR WIRE MARK BITS + TLZ TFLG ;FLAG NOTHING TYPED YET + MOVEI H,RADDR(W,WIRES,ALPH) + JRST CPNC1 + +CPNC2: FETCH(T,H,WBIT) + TRNE T,NAM2ND!WNULL!WSINGL ;SKIP FAKES, NULLS, AND SINGLES + JRST CPNC1 + SETO TT, + MOVEI G,RADDR(H,WPIN,NXTP) + JRST CPNC3 + +CPNC4: FETCH(T,G,PBIT) + TRNE T,DUP + JRST CPNC3 + FETCH(T,G,PBDY) + FETCH(T,T,BBIT) + TRNE T,CBODY + AOJG TT,CPNC5 ;JUMP IF SECOND PIN +CPNC3: FETCH(G,G,NXTP) + JUMPN G,CPNC4 + JRST CPNC1 + +CPNC5: FETCH(T,H,WBIT) + TRO T,WTMP1 + STORE(T,H,WBIT) + TRNE T,SPWR!SGND!SHI!SNC ;DON'T PRINT THESE + JRST CPNC1 + TLON TFLG ;HEADING PRINTED? + OUTSTR[ASCIZ/THE FOLLOWING MULTI-EDGE-PIN RUNS WILL BE SKIPPED: +/] + MOVE G,H +CPNC6: OUTSIG ADDR(G,SPNT) + OUTSTR[ASCIZ/ +/] + FETCH(G,G,NNAM) + JUMPN G,CPNC6 +CPNC1: FETCH(H,H,ALPH) + JUMPN H,CPNC2 + FETCH(H,W,WBDY) ;NOW GO DOWN BODY LIST + JUMPE H,CPNBNX ;JUMP IF NONE +CPNO1: FETCH(T,H,BBIT) + TRNN T,CBODY ;CONNECTOR? + JRST CPNO2 ;NO + FETCH(G,H,BPIN) ;YES, GET FIRST PIN +CPNO3: FETCH(T,G,PBIT) + TRNE T,DUP ;DON'T DO DUPLICATES + JRST CPNO4 + FETCH(F,G,HPNT) + FETCH(T,F,WBIT) ;GET WIRE TYPE BITS + TRNE T,SPWR!SGND!SNC!SHI!WTMP1 ;NOT FOR THESE + JRST CPNO4 +CPNO5: FETCH(A,H,BLOC) + FETCH(T,G,PINN) + HRL A,T + PUSHJ P,LOCPNC + PUTBYT 11 + PUTSIG ADDR(F,SPNT) + CRLF + FETCH(F,F,NNAM) + JUMPN F,CPNO5 +CPNO4: FETCH(G,G,NXBP) + JUMPN G,CPNO3 +CPNO2: FETCH(H,H,NXTB) + JUMPN H,CPNO1 +CPNBNX: RELEASE LST, + POPJ P, + SUBTTL 'SPI' ADD CONNECTOR PIN DESIGNATION TO EACH SIGNAL NAME IN DRW FILE +SPIOUT: MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + MOVSI T,'SPI' ;CON PIN EXT + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + TLO SIMTAB ;SIMULATE TABS, THIS IS FOR COBOL + PUSHJ P,CLEARW ;CLEAR WIRE MARK BITS + FETCH(H,W,WBDY) ;NOW GO DOWN BODY LIST + JUMPE H,SPIBNX ;JUMP IF NONE +SPIO1: FETCH(T,H,BBIT) + TRNN T,CBODY ;CONNECTOR? + JRST SPIO2 ;NO + FETCH(G,H,BPIN) ;YES, GET FIRST PIN +SPIO3: FETCH(T,G,PBIT) + TRNE T,DUP ;DON'T DO DUPLICATES + JRST SPIO4 + FETCH(F,G,HPNT) + FETCH(T,F,WBIT) + TRNE T,SPWR!SGND!SNC!SHI ;SKIP THESE + JRST SPIO4 + FETCH(A,H,BLOC) + FETCH(T,G,PINN) + HRL A,T + PUSHJ P,LOCPNC + PUTBYT 11 + FETCH(T,F,WBIT) + MOVEI E,"0" ;CODE 0 FOR FIRST SIGNAL LINE + TROE T,WTMP1 ;MARK RUN OUT + MOVEI E,"1" ;CODE 1 FOR REPEATED SIGNAL LINE + STORE(T,F,WBIT) + PUSHJ P,SPIO5 +SPIO4: FETCH(G,G,NXBP) + JUMPN G,SPIO3 +SPIO2: FETCH(H,H,NXTB) + JUMPN H,SPIO1 +SPIBNX: FETCH(F,W,WIRES) + JUMPE F,SPIWNX +SPIW1: FETCH(T,F,WBIT) + TRNE T,WTMP1!NAM2ND!WNULL!GENSIG!SPWR!SGND!SNC!SHI ;DON'T DO ANY OF THESE + JRST SPIW2 + MOVEI E,"3" ;CODE 3 FOR NON-EDGE SIGNAL + PUSHJ P,SPIO5 +SPIW2: FETCH(F,F,ALPH) + JUMPN F,SPIW1 +SPIWNX: RELEASE LST, + POPJ P, + +SPIO5: PUSH P,F +SPIO5A: MOVEI A,=8 + PUSHJ P,SPFILL + FETCH(D,F,WPIN) + SETZ C, +SPIO6: FETCH(T,D,PTYP) + JUMPE T,SPIO7 + FETCH(T,T,DPBIT) + TRNN T,OUTLD + JRST SPIO7 + JUMPN C,SPIO8 + MOVE C,D +SPIO7: FETCH(D,D,NXTP) + JUMPN D,SPIO6 + JUMPE C,SPIO8 + FETCH(A,C,FILP) + FETCH(A,A,FPRF) + PUSHJ P,PRINT4 ;ONLY 4 CHARS +SPIO8: MOVEI A,=16 + PUSHJ P,SPFILL + PUTBYT (E) + MOVEI E,"2" ;CODE 2 FOR MULTIPLE SIGNAL NAMES + PUTBYT " " + MOVEI T,ADDR(F,SPNT) + MOVE TT,[=64,,=64] + PUSHJ P,SMPPUT ;64 CHARS SIGNAL NAME, ASSERTION/POLARITY + SKIPE OVRFLW ;OVERFLOW? + PUTSTR[ASCIZ/ */] ;YES, FLAG IT + CRLF + FETCH(F,F,NNAM) + JUMPN F,SPIO5A + POP P,F + POPJ P, +>;DEC + SUBTTL 'STF' AND 'PRT' DIP STUFFING AND PARTS LISTS +PRTLST: TROA DOPRTL +STFLST: TRZ DOPRTL + SETZM ALLNAM + SETZM ALLCRD +ALLSTF: MOVE L,DEFLST + SKIPE T,ALLCRD + JRST [ MOVEM T,SLICEL + JRST GALSTF] + PUSHJ P,LSTGET + POPJ P, +GALSTF: FETCH(H,W,WBDY) + JUMPE H,[OUTSTR[ASCIZ/NO BODIES AT ALL! +/] + POPJ P,] ;SKIP IF NO BODIES + TRNE DOPRTL + SKIPA T,['PRT '] + MOVSI T,'STF' ;STUFFING EXT + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,ALLSET + POPJ P, + PUSHJ P,FILLST + PUTHDR + TRNE DOPRTL + JRST PRT1 + MOVEI T,[ASCIZ/PART NUMBER DIPTYPE LOC BODY FILE POS/] + MOVEM T,HEADER + MOVEI T,STFMAR + MOVEM T,MARGIN + SETZM LINCNT + PUSHJ P,CLEARB + SETZM CDSKPC ;COUNT OF NUMBER OF BODIES WITHOUT DIPS + MOVEI H,RADDR(W,WBDY,NXTB);GO MARK ALL BODIES WITHOUT LOCS + JRST STFC2 + +STFC1: FETCH(T,H,BLOC) + JUMPN T,STFC2 + AOS CDSKPC + FETCH(T,H,BBIT) + TRO T,BTMP1 + STORE(T,H,BBIT) +STFC2: FETCH(H,H,NXTB) + JUMPN H,STFC1 + MOVEI T,PARTLIST-ADDR(0,NXPL) + MOVEM T,LSTPART ;SET PARTLIST AS LAST PART +STFA0: SKIPN T,LSTPART + JRST STFDON + JRST STFA1 + +STFA2: FETCH(TT,T,PLPT) + FETCH(TT,TT,PRBT) + TRNE TT,PNUSED + JRST STFA3 +STFA1: FETCH(T,T,NXPL) + JUMPN T,STFA2 +STFA3: MOVEM T,LSTPART + PUSHJ P,STFADO + JRST STFA0 + + +STFADO: TRZ FLAG ;FLAG PART NUMBER NOT PRINTED YET + MOVEI H,RADDR(W,WBDY,NXTB);GOING DOWN BODY LIST + CAIA ;SKIP CRLF INITIALLY +STF1: CRLF + SETZM LSLOT ;FORGET LAST SLOT + SETOM LSTDIP ;AND DIP TYPE +STF3: FETCH(H,H,NXTB) ;NEXT BODY + JUMPE H,CPOPJ + FETCH(TTT,H,BBIT) + TRNE TTT,CBODY!BTMP1 ;CONNECTOR BODY? + JRST STF3 ;YES, SKIP + FETCH(T,H,PRTN) + PUSHJ P,PNCHK ;CORRECT PART NUMBER? + JRST STF3 ;NO + FETCH(TTT,H,BBIT) + TRO TTT,BTMP1 + STORE(TTT,H,BBIT) + FETCH(T,H,DIPT) ;GET DIP TYPE + MOVEM T,LSTDIP + FETCH(TT,H,BLOC) + MOVEM TT,LSLOT + SKIPL LINCNT + PUSHJ P,PUTHDR + TROE FLAG + JRST STF8 + SKIPN A,LSTPART + JRST STF8B + FETCH(A,A,PLPT) + FETCH(A,A,PRVS) + PUSHJ P,STROUT + JRST STF8 + +STF8B: PUTSTR[ASCIZ\N/A\] +STF8: MOVEI A,=16 + PUSHJ P,FILL + SKIPN A,LSTDIP + JRST [ PUTSTR[ASCIZ\N/A\] + JRST STF8A] + FETCH(A,A,DNAM) + PUSHJ P,STROUT ;DIP NAME +STF8A: MOVE G,H ;START WITH CURRENT BODY +STF4: MOVEI A,=32 + PUSHJ P,FILL + FETCH(A,G,BLOC) + FETCH(T,G,BBIT) + PUSHJ P,WLOCOUT + PUTSTR[ASCIZ/( )/] +STF5: MOVEI A,=40 + PUSHJ P,FILL + PUTSTR ADDR(G,BNAM) + PUTBYT 11 + FETCH(A,G,FILB) + PUTSIX ADDR(A,FILN) + PUTBYT 11 + FETCH(A,G,BBIT) + PUSHJ P,BPPNT + CRLF +STF7: FETCH(G,G,NXTB) + JUMPE G,STF1 ;TRY ANOTHER DIP YET? + FETCH(T,G,DIPT) + CAME T,LSTDIP + JRST STF7 + FETCH(T,G,PRTN) + PUSHJ P,PNCHK + JRST STF7 + FETCH(T,G,BBIT) + TRO T,BTMP1 + STORE(T,G,BBIT) + FETCH(T,G,BLOC) + CAMN T,LSLOT + JRST STF5 + MOVEM T,LSLOT + JRST STF4 + +STFDON: SKIPN T,CDSKPC + JRST STFDN1 + CRLF + PUTSTR[ASCIZ/NUMBER OF BODIES WITH NO LOCATION SET = /] + PUSHJ P,DECOUT + CRLF +STFDN1: RELEASE LST, + POPJ P, + +PNCHK: SKIPN TT,LSTPART + JRST [ JUMPN T,CPOPJ ;NOT NOW + JRST CPOPJ1] +PNCHK2: FETCH(TTT,TT,PLPT) + CAMN TTT,T + JRST CPOPJ1 + FETCH(TT,TT,NXPL) + JUMPE TT,CPOPJ + FETCH(TTT,TT,PLBT) + TRNE TTT,PL2ND + JRST PNCHK2 + POPJ P, + + +PRT1: MOVEI T,[ASCIZ/ +PART NUMBER DIPTYPE COUNT DESCRIPTION LOCATIONS/] + MOVEM T,HEADER + MOVEI T,PRTMAR + MOVEM T,MARGIN + SETZM LINCNT + PUSHJ P,CLEARB + SETOM NBODS + MOVEI T,PARTLIST-ADDR(0,NXPL) + MOVEM T,LSTPART ;SET PARTLIST AS LAST PART +PRTA0: SKIPN T,LSTPART + JRST STFDN1 ;DONE, DON'T DUMP TOTALS FOR N/A + JRST PRTA1 + +PRTA2: FETCH(TT,T,PLPT) + FETCH(TT,TT,PRBT) + TRNE TT,PNUSED + JRST PRTA3 +PRTA1: FETCH(T,T,NXPL) + JUMPN T,PRTA2 +PRTA3: PUSH P,T + SKIPLE NBODS + PUSHJ P,PRTDMP ;DUMP OUT TOTALS OF LAST PART NUMBER + TRZ FLAG + SETOM NBODS + SETZM TMPCN1 + SETZM TMPCN2 + POP P,T +PRTA6: MOVEM T,LSTPART + PUSHJ P,PRTADO + TRNN FLAG ;DID WE PRINT ANY YET? + JRST PRTA0 ;NO, JUST LOOP BACK + SKIPN T,LSTPART + JRST STFDN1 +PRTA4: FETCH(T,T,NXPL) + JUMPE T,PRTA3 + FETCH(TT,T,PLBT) + TRNN TT,PL2ND + JRST PRTA2 ;JUMP INTO NORMAL LOOP IF NOT SAME NUMBER + FETCH(TT,T,PLPT) + FETCH(TT,TT,PRBT) + TRNN TT,PNUSED + JRST PRTA4 + JRST PRTA6 + + +PRTADO: MOVEI H,RADDR(W,WBDY,NXTB) + JRST PRT2 + +PRT3: FETCH(TTT,H,BBIT) + TRNE TTT,CBODY!BTMP1 ;SKIP CONS + JRST PRT2 + FETCH(T,H,PRTN) + SKIPE TT,LSTPART + FETCH(TT,TT,PLPT) + CAME TT,T + JRST PRT2 + HRLZM T,LSTDIP + FETCH(T,H,BBIT) + TRO T,BTMP1 + STORE(T,H,BBIT) + FETCH(T,H,DIPT) + HRRM T,LSTDIP + FETCH(T,H,PRPX) + MOVEM T,LPRPX + SETZM LSLOT ;NO LOC COUNTED YET + SKIPL LINCNT + PUSHJ P,PUTHDR + SETZM NDIPS + SETZM TOTDIP + MOVE G,H ;START WITH THIS BODY +PRT4: FETCH(TTT,G,BBIT) + TRNE TTT,CBODY + JRST PRT6 + FETCH(T,G,DIPT) + FETCH(TT,G,PRTN) + HRL T,TT + CAME T,LSTDIP + JRST PRT6 + FETCH(T,G,PRPX) + CAME T,LPRPX + JRST PRT6 + TRO TTT,BTMP1 + STORE(TTT,G,BBIT) + FETCH(T,G,BLOC) + JUMPN T,PRT5 + MOVSI T,1 + ADDM T,TOTDIP + JRST PRT6 + +PRT5: AOS TOTDIP + CAME T,LSLOT + AOS NDIPS + MOVEM T,LSLOT +PRT6: FETCH(G,G,NXTB) + JUMPN G,PRT4 + AOS NBODS ;COUNT ANOTHER LINE PRINTED + TROE FLAG + JRST PRT9 + SKIPN A,LSTPART + JRST PRT9B + FETCH(A,A,PLPT) + FETCH(A,A,PRVS) + PUSHJ P,STROUT + JRST PRT9 + +PRT9B: PUTSTR[ASCIZ\N/A\] +PRT9: MOVEI A,=16 + PUSHJ P,FILL + HRRZ G,LSTDIP + JUMPE G,[PUTSTR[ASCIZ\N/A\] + JRST PRT9A] + FETCH(A,G,DNAM) + PUSHJ P,STROUT +PRT9A: MOVEI A,=32 + PUSHJ P,FILL + MOVE T,NDIPS + ADDM T,TMPCN1 + PUSHJ P,DECOUT + MOVE T,TOTDIP + ADDM T,TMPCN2 + SKIPN T,LSTPART + JRST PRT8 + FETCH(T,T,PLPT) + FETCH(T,T,PRPP) ;SKIP PART NUMBER +PRT8: MOVEM T,PRPPTR + MOVE T,LPRPX + MOVEM T,PRXPTR + MOVE G,H + SETZM FSLOT + SETZM LSLOT +PRT7: PUSHJ P,PRPLIN ;ONE LINE OF PROPERTIES + JRST PRT7A ;NO MORE PROPERTIES + PUSHJ P,LOCLIN + JFCL + CRLF + JRST PRT7 + +PRT7A: PUSHJ P,LOCLIN + JRST PRT7B + CRLF + JRST PRT7A ;LOOP TILL DONE + +PRT7B: SKIPE LCOUNT + CRLF +PRT2: FETCH(H,H,NXTB) + JUMPN H,PRT3 + POPJ P, + + +PRPLIN: SKIPN B,PRPPTR + JRST PRPLX1 +PRPL0: FETCH(T,B,PRBT) + TRNN T,NULVAL + JRST PRPL0A + FETCH(B,B,PRPP) + JUMPN B,PRPL0 + MOVEM B,PRPPTR + JRST PRPLX1 + +PRPL0A: MOVEI A,=40 + PUSHJ P,FILL +PRPL1: MOVE T,LCOUNT + CAIG T,=40 + JRST PRPL2 + SUBI T,=78+2 ;COUNT DELIMITERS HERE + MOVEM T,TCOUNT + PUSH P,PUTCHR + MOVE T,[PUSHJ P,TAOS] + MOVEM T,PUTCHR + FETCH(A,B,PRVS) + PUSHJ P,STROUT + POP P,PUTCHR + SKIPLE TCOUNT + JRST CPOPJ1 ;END THIS LINE + PUTSTR[ASCIZ/, /] +PRPL2: FETCH(A,B,PRVS) + PUSHJ P,STROUT +PRPL3: FETCH(B,B,PRPP) + MOVEM B,PRPPTR + JUMPE B,CPOPJ1 + FETCH(T,B,PRBT) + TRNE T,NULVAL + JRST PRPL3 + JRST PRPL1 + +PRPLX1: SKIPN B,PRXPTR + POPJ P, + MOVEI A,=40 + PUSHJ P,FILL +PRPLX2: MOVE T,LCOUNT + CAIG T,=40 + JRST PRPLX3 + SUBI T,=78-3 ;COUNT DELIMITERS HERE + MOVEM T,TCOUNT + PUSH P,PUTCHR + MOVE T,[PUSHJ P,TAOS] + MOVEM T,PUTCHR + FETCH(A,B,TLFT) + PUSHJ P,STROUT + FETCH(A,B,TRHT) + PUSHJ P,STROUT + POP P,PUTCHR + SKIPLE TCOUNT + JRST CPOPJ1 ;END THIS LINE + PUTSTR[ASCIZ/, /] +PRPLX3: FETCH(A,B,TLFT) + PUSHJ P,STROUT + PUTBYT ":" + FETCH(A,B,TRHT) + PUSHJ P,STROUT + FETCH(B,B,NXTT) + MOVEM B,PRXPTR + JUMPN B,PRPLX2 + JRST CPOPJ1 + + +LOCLIN: HLRZ T,TOTDIP + JUMPN T,LOCLN0 + JUMPE G,LOCLN7 +LOCLN1: FETCH(T,G,BBIT) + TRNE T,CBODY + JRST LOCLN2 + FETCH(T,G,DIPT) + FETCH(TT,G,PRTN) + HRL T,TT + CAME T,LSTDIP + JRST LOCLN2 + FETCH(T,G,PRPX) + CAME T,LPRPX + JRST LOCLN2 + FETCH(A,G,BLOC) + JUMPE A,LOCLN2 + CAMN A,LSLOT + JRST LOCLN2 + SKIPN FSLOT + JRST [ MOVEM A,FSLOT + MOVEM A,LSLOT + JRST LOCLN2] + MOVE T,LSLOT + MOVE TT,A + PUSHJ P,SEQLOC + CAIA + JRST [ MOVEM A,LSLOT + JRST LOCLN2] +LOCLN8: PUSHJ P,LOCLPN + JRST CPOPJ1 + MOVE T,FSLOT + CAMN T,LSLOT + JRST LOCLN6 + MOVE TT,LSLOT + PUSHJ P,SEQLOC + JRST LOCLN6 + MOVE T,LSLOT + MOVEM T,FSLOT + PUSHJ P,LOCLPN + JRST CPOPJ1 +LOCLN6: JUMPE G,[SETZM FSLOT + POPJ P,] + FETCH(A,G,BLOC) + MOVEM A,FSLOT + MOVEM A,LSLOT +LOCLN2: FETCH(G,G,NXTB) + JUMPN G,LOCLN1 +LOCLN7: SKIPE FSLOT + JRST LOCLN8 + POPJ P, + + +LOCLPN: TLZ TFLG + MOVE T,FSLOT + CAMN T,LSLOT + JRST LOCLN4 + MOVE TT,LSLOT + PUSHJ P,SEQLOC + TLO TFLG +LOCLN4: MOVE T,LCOUNT + CAIGE T,=80 + JRST [ MOVEI A,=80 + PUSHJ P,FILL + JRST LOCLN3] + SUB T,LWIDTH + ADDI T,2 ;COUNT DELIMITERS HERE + MOVEM T,TCOUNT + PUSH P,PUTCHR + MOVE T,[PUSHJ P,TAOS] + MOVEM T,PUTCHR + MOVE A,FSLOT + FETCH(T,G,BBIT) + PUSHJ P,WLOCOUT + TLNN TFLG + JRST LOCLN5 + AOS TCOUNT ;ONE CHARACTER FOR DASH BETWEEN LOCS + MOVE A,LSLOT + FETCH(T,G,BBIT) + PUSHJ P,WLOCOUT +LOCLN5: POP P,PUTCHR + SKIPLE TCOUNT + POPJ P, + PUTSTR[ASCIZ/, /] +LOCLN3: AOS (P) ;WILL PRINT, SKIP + MOVE A,FSLOT + FETCH(T,G,BBIT) + PUSHJ P,WLOCOUT + TLNN TFLG + POPJ P, + PUTBYT "-" + MOVE A,LSLOT + FETCH(T,G,BBIT) + JRST WLOCOUT + +LOCLN0: MOVEI A,=80 + PUSHJ P,FILL + PUTSTR[ASCIZ/NO. OF GATES WITH NO REF. DES. = /] + HLRZ T,TOTDIP + PUSHJ P,DECOUT + HRRZS TOTDIP + JRST CPOPJ1 + +PRTDMP: MOVEI A,=24 + PUSHJ P,FILL + PUTSTR[ASCIZ/TOTAL = /] + MOVE T,TMPCN1 + PUSHJ P,DECOUT + HLRZ T,TMPCN2 + JUMPE T,PRTDM1 + PUTSTR[ASCIZ/ NO. OF GATES WITH NO REF. DES. = /] + HLRZ T,TMPCN2 + PUSHJ P,DECOUT +PRTDM1: CRLF + POPJ P, + +TAOS: SKIPE TTT + AOS TCOUNT + POPJ P, + SUBTTL 'OTS' OUTPUT TERMINATION SUMMARY +OUTSUM: SKIPN DIPLST + JRST [ OUTSTR[ASCIZ/SORRY, NO DIPS. +/] + POPJ P,] + MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + FETCH(H,W,WBDY) + JUMPE H,[OUTSTR[ASCIZ/NO BODIES AT ALL! +/] + POPJ P,] ;SKIP IF NO BODIES + MOVSI T,'OTS' ;OUTPUT TERMINATION SUMMARY EXT + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + PUSHJ P,FILLST + PUTHDR + MOVEI T,[ASCIZ/DIPTYPE PIN # OFF ON TOTAL + BOARD/] + MOVEM T,HEADER + MOVEI T,OTSMAR + MOVEM T,MARGIN + SETZM LINCNT + PUSHJ P,DCLEAR ;CLEAR DIP TEMP CELL + SETZM CDSKPC + MOVEI H,RADDR(W,WBDY,NXTB);GOING DOWN BODY LIST +OTS1: SETZM LSLOT ;FORGET LAST SLOT + SETZM LSTDIP ;AND DIP TYPE +OTS2: FETCH(H,H,NXTB) ;NEXT BODY + JUMPE H,OTSDON + FETCH(TTT,H,BBIT) + TRNE TTT,CBODY ;CONNECTOR BODY? + JRST OTS2 ;YES, SKIP + FETCH(G,H,DIPT) ;GET DIP TYPE + JUMPE G,[AOS CDSKPC + JRST OTS2] + FETCH(TTT,G,DTMP) + TROE TTT,1 ;THIS DIP DONE YET? + JRST OTS2 ;YES + STORE(TTT,G,DTMP) ;NO, STORE BIT ON + MOVEM G,LSTDIP + TLZ TFLG ;FLAG DIPTYPE NOT PRINTED YET + MOVEI G,RADDR(G,DPIN,DPNXT) + JRST OTS4 + +OTS3: FETCH(E,G,DPNM) + FETCH(T,G,DPBIT) ;GET PIN TYPE BITS + TRNN T,OUTLD ;OUTPUT? + JRST OTS4 ;NO, TRY NEXT ONE + MOVE F,H ;GOT ONE, START WITH FIRST BODY + SETZ D, ;CLEAR COUNTS + JRST OTS5 + +OTS6: FETCH(T,F,DIPT) ;GET DIP TYPE + CAMN T,LSTDIP ;SAME DIP? + JRST OTS5 ;YES +OTS7: FETCH(F,F,NXTB) ;LOOK FOR ANOTHER BODY OF THIS DIP TYPE + JUMPN F,OTS6 + JUMPE D,OTS4 ;IF NO COUNT, GO STRAIGHT TO NEXT PIN + TLOE TFLG ;DIP NAME OUT YET? + JRST OTS10 ;YES + SKIPL LINCNT + PUSHJ P,PUTHDR + MOVE A,LSTDIP + FETCH(A,A,DNAM) + PUSHJ P,STROUT ;PRINT DIP NAME + MOVE T,LCOUNT + CAIGE T,8 + PUTBYT 11 + CAIA +OTS10: PUTBYT 11 + PUTBYT 11 + MOVE T,E + PUSHJ P,DECOUT ;PIN # + PUTBYT 11 + HLRZ T,D + PUSHJ P,DECOUT ;# OFF BOARD + PUTBYT 11 + HRRZ T,D + PUSHJ P,DECOUT ;# ON BOARD + PUTBYT 11 + HLRZ T,D + ADDI T,(D) + PUSHJ P,DECOUT ;TOTAL + CRLF + JRST OTS4 ;TRY ANOTHER DIP PIN + +OTS5: FETCH(C,F,BPIN) ;GET BODY PIN LIST + JUMPE C,OTS7 ;IF NONE, LOOP BACK FOR ANOTHER BODY +OTS8: FETCH(T,C,PBIT) + TRNE T,DUP ;SKIP DUP'S + JRST OTS9 + FETCH(T,C,PINN) ;GET PIN # + CAME T,E ;SAME AS ONE WE ARE DOING? + JRST OTS9 + FETCH(TT,C,HPNT) ;GET WIRE HEADER POINTER + FETCH(T,TT,WBIT) ;WIRE TYPE BITS + TRNE T,WNULL!WSINGL ;IGNORE THESE PINS + JRST OTS9 + FETCH(T,TT,TBIT) ;GET ACCUMULATED TYPE BITS + TRNN T,ANYCON ;IS THERE A TERMINATOR ON THIS RUN? + AOJA D,OTS9 ;NO, COUNT UNTERMINATED + ADD D,[1,,0] ;YES, COUNT AS TERMINATED +OTS9: FETCH(C,C,NXBP) ;NEXT BODY PIN + JUMPN C,OTS8 + JRST OTS7 ;GET ANOTHER BODY + +OTS4: FETCH(G,G,DPNXT) ;NEXT DIP PIN + JUMPN G,OTS3 + JRST OTS1 ;TRY FOR ANOTHER DIP + +OTSDON: SKIPN T,CDSKPC + JRST OTSDN1 + CRLF + PUTSTR[ASCIZ/NUMBER OF BODIES WITH NO DIP TYPE = /] + PUSHJ P,DECOUT + CRLF +OTSDN1: RELEASE LST, + POPJ P, + SUBTTL 'OTL' OUTPUT TERMINATION LISTING +TRMLST: SKIPN DIPLST + JRST [ OUTSTR[ASCIZ/SORRY, NO DIPS. +/] + POPJ P,] + MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + FETCH(H,W,WBDY) + JUMPE H,[OUTSTR[ASCIZ/NO BODIES AT ALL! +/] + POPJ P,] ;SKIP IF NO BODIES + MOVSI T,'OTL' ;OUTPUT TERMINATION LIST EXT + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + PUSHJ P,FILLST + PUTHDR + PUSHJ P,CLEARP ;CLEAR PIN MARK BITS + MOVEI H,RADDR(W,WIRES,ALPH) + JRST TRML1 + +TRML2: FETCH(T,H,WBIT) + TRNE T,NAM2ND!WNULL!WSINGL!SNC!SHI!SPWR!SGND ;INTERESTING RUN? + JRST TRML1 ;NO, SKIP IT + FETCH(G,H,WPIN) + SETZB F,E ;NO CON FOUND YET +TRML3: FETCH(T,G,PTYP) + JUMPE T,TRML6 + FETCH(T,T,DPBIT) + TRNE T,OUTLD ;FOUND OUTPUT? + JRST TRML5 ;YES, WIN IMMEDIATELY + JUMPN F,TRML4 ;LOOK NO FURTHER IF WE HAVE CON +TRML6: FETCH(T,G,PBDY) + FETCH(T,T,BBIT) + TRNE T,CBODY + JRST [ MOVE F,G ;REMEMBER CON + JRST TRML4] + JUMPN E,TRML4 + FETCH(T,G,PTYP) + JUMPE T,TRML4 + FETCH(T,T,DPBIT) + TRNN T,TERM ;DON'T REMEMBER TERM + MOVE E,G +TRML4: FETCH(G,G,NXTP) + JUMPN G,TRML3 + SKIPE G,F + JRST TRML5 ;WE HAVE CON + SKIPN G,E ;NO CON, DO WE HAVE NON TERM? + FETCH(G,H,WPIN) ;NO, USE FIRST PIN OF RUN +TRML5: FETCH(T,G,PBIT) + TRO T,PTMP1 + STORE(T,G,PBIT) +TRML1: FETCH(H,H,ALPH) + JUMPN H,TRML2 + TRZ CONLY +TRMLB0: TRNE CONLY + SKIPA T,[[ASCIZ/UNTERMINATED RUNS +TEST PIN DIPTYPE SIGNAL/]] + MOVEI T,[ASCIZ/TERMINATED RUNS +TEST PIN DIPTYPE TERM PIN VALUE SIGNAL/] + MOVEM T,HEADER + MOVEI T,OTLMAR + MOVEM T,MARGIN + SETZM LINCNT + MOVEI H,RADDR(W,WBDY,NXTB) + JRST TRMLB1 + +TRMLB2: FETCH(G,H,BPIN) +TRMLB4: FETCH(T,G,PBIT) + TRNN T,PTMP1 + JRST TRMLB3 + FETCH(T,G,HPNT) + FETCH(T,T,TBIT) + TRNE CONLY + TRC T,TERM ;INVERT TEST ON SECOND PASS + TRNN T,TERM + JRST TRMLB3 + SKIPL LINCNT + PUSHJ P,PUTHDR + FETCH(A,H,BLOC) + FETCH(T,G,PINN) + HRL A,T + FETCH(T,H,BBIT) + TRNN T,CBODY + JRST TRMLB5 + PUSHJ P,LOCPNW + JRST TRMLB6 + +TRMLB5: FETCH(B,H,BPAK) + PUSHJ P,LOCPNP +TRMLB6: MOVEI A,=16 + PUSHJ P,FILL + FETCH(T,H,BBIT) + TRNN T,CBODY + JRST TRMLB7 + PUTSTR[ASCIZ/CON/] + JRST TRMLB8 + +TRMLB7: FETCH(A,H,DIPT) + JUMPE A,TRMLB8 + FETCH(A,A,DNAM) + PUSHJ P,STROUT +TRMLB8: FETCH(F,G,HPNT) + TRNE CONLY + JRST TRMLC1 + FETCH(E,F,WPIN) + PUSHJ P,TRMPNT + JFCL + MOVEI A,=64 + PUSHJ P,FILL + FETCH(F,G,HPNT) + PUTSIG ADDR(F,SPNT) + CRLF +TRMLB9: PUSHJ P,TRMPNT + JRST TRMLB3 + CRLF + JRST TRMLB9 + +TRMLC1: MOVEI A,=32 + PUSHJ P,FILL + PUTSIG ADDR(F,SPNT) + CRLF +TRMLB3: FETCH(G,G,NXBP) + JUMPN G,TRMLB4 +TRMLB1: FETCH(H,H,NXTB) + JUMPN H,TRMLB2 + TRON CONLY ;SECOND PASS YET? + JRST TRMLB0 ;NO, DO IT + RELEASE LST, + POPJ P, + +TRMPN1: FETCH(T,E,PTYP) + JUMPE T,TRMPN2 + FETCH(T,T,DPBIT) + TRNE T,TERM + JRST TRMPN3 +TRMPN2: FETCH(E,E,NXTP) +TRMPNT: JUMPN E,TRMPN1 + POPJ P, + +TRMPN3: MOVEI A,=32 + PUSHJ P,FILL + PUSH P,F + FETCH(F,E,PBDY) + FETCH(T,F,BBIT) + FETCH(A,F,BLOC) + FETCH(TT,E,PINN) + HRL A,TT + FETCH(B,F,BPAK) + PUSHJ P,LOCPNP + MOVEI A,=48 + PUSHJ P,FILL + PUSH P,E + PUSHJ P,VALPNT ;PRINT VALUE OF TERM + POP P,E + POP P,F + FETCH(E,E,NXTP) + JRST CPOPJ1 + SUBTTL 'RES' FILE FOR RESISTOR DRAWING +DEC,< +RESFIL: MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + MOVSI T,'RES' ;RESISTOR FILE + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + TLO SIMTAB ;ALWAYS SIMULATE TABS + MOVEI H,RADDR(W,WIRES,ALPH) + JRST RESFL1 + +RESFL2: FETCH(T,H,WBIT) + TRNE T,NAM2ND + JRST RESFL1 ;ONLY LOOK AT REAL WIRES + FETCH(T,H,TBIT) + TRC T,ECL!TERM + TRCE T,ECL!TERM ;ANY ECL TERMS ON THIS WIRE? + JRST RESFL1 + MOVEI G,RADDR(H,WPIN,NXTP) + JRST RESFL3 + +RESFL4: FETCH(T,G,PTYP) + JUMPE T,RESFL3 + FETCH(T,T,DPBIT) + TRC T,ECL!TERM + TRCE T,ECL!TERM + JRST RESFL3 + FETCH(T,G,PBIT) + FETCH(F,G,PBDY) + TRNE T,DUP ;DON'T REPEAT LOC IF DUP + JRST RESFL5 + FETCH(A,F,BLOC) + FETCH(T,G,PINN) + HRL A,T + FETCH(B,F,BPAK) + PUSHJ P,LOCPNP ;PUT OUT LOC +RESFL5: MOVEI A,=16 + PUSHJ P,FILL + FETCH(A,G,FILP) + PUTSIX ADDR(A,FILN) + PUTBYT 11 + FETCH(A,F,BBIT) + PUSHJ P,BPPNT ;DWG POS + PUTBYT 11 + PUSHJ P,VALPNT + MOVEI A,=48 + PUSHJ P,FILL + FETCH(A,G,HPNT) + PUTSIG ADDR(A,SPNT) + CRLF +RESFL3: FETCH(G,G,NXTP) + JUMPN G,RESFL4 +RESFL1: FETCH(H,H,ALPH) + JUMPN H,RESFL2 + RELEASE LST, + POPJ P, +>;DEC + + ;VALPNT -PRINT "VALUE" PROPERTY OF RESISTOR +;CALL WITH F:POINTER TO BODY +;CLOBBERS E, A, T, TT, TTT +VALPNT: FETCH(E,F,PRTN) + JUMPE E,RESFL6 +RESFL7: FETCH(T,E,PRNB) + FETCH(T,T,PRNS) + MOVEI TT,[ASCIZ/VALUE/] + PUSHJ P,ASCPAR ;IS THIS VALUE PROPERTY? + JRST RESFL8 + JRST RESFL8 + FETCH(A,E,PRVS) + JRST STROUT + +RESFL8: FETCH(E,E,PRPP) + JUMPN E,RESFL7 +RESFL6: PUTSTR[ASCIZ\N/A\] + POPJ P, + SUBTTL 'MPL' MASTER PARTS LIST - READ COUNTS +MPART: SKIPN H,MODLST + JRST [ OUTSTR[ASCIZ/NO MODULES. +/] + POPJ P,] +CLMCNT: CLEAR(H,MNUM) + FETCH(H,H,MNXT) + JUMPN H,CLMCNT + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE T,[PUSHJ P,TTYOUT] + MOVEM T,PUTCHR + MOVSI T,'MCF' + MOVEM T,DEFEXT + TLZ ASKHIM ;ASSUME WILL NOT READ FILE + PUSHJ P,SETFIL + JRST NOMODC + TLO ASKHIM ;WE ARE READING FILE + PUSHJ P,IN0 ;READ IN TEXT MODE + POPJ P, ;FOO + LOOKUP DAT,FILNAM + JRST [ OUTSTR[ASCIZ/LOOKUP FAILED, CODE= /] + HRRZ T,FILEXT + PUSHJ P,DECOUT + OUTSTR[ASCIZ/ +/] + POPJ P,] + OUTSTR[ASCIZ/ +/] + MOVE T,[PUSHJ P,BYTIN] + MOVEM T,GETCHR + SKIPE B,MPLTIT + PUSHJ P,PUTFS + SETZM MPLTIT + PUSHJ P,ISTR + JRST IMCFE + JFCL ;ALTMODE FROM FILE, IGNORE IT + SETZ B, ;NULL, STORE NULL + MOVEM B,MPLTIT + CAIN TTT,12 + JRST IMCF1 + PUTSTR[ASCIZ/ILLEGAL TAB OR ALTMODE IN TITLE LINE: +/] + SKIPE A,MPLTIT + PUSHJ P,STROUT + PUTBYT 11 + JRST ILLLN3 + +IMCF1: PUSHJ P,ISTR + JRST IMCFE ;END OF FILE HERE OK + JRST ILLLIN ;ALTMODE ILLEGAL + JRST ILLLIN ;ILLEGAL LINE, SKIP IT + MOVEM B,STRING + SETZ B, + CAIE TTT,11 + JRST IMCF2 + PUSHJ P,DECIN + JRST MCFEOB + MOVE B,A +IMCF2: CAIE TTT,12 + JRST ILLLN1 ;ILLEGAL FORMAT LINE + MOVE A,MODLST +IMCF3: FETCH(T,A,MNAM) + MOVE TT,STRING + PUSHJ P,TXTMAT + JRST IMCF4 + JRST IMCF5 + FETCH(T,A,MNUM) + JUMPE T,IMCFOK + PUTSTR[ASCIZ/COUNT FOR MODULE APPEARS MORE THAN ONCE: +/] + PUSH P,A + FETCH(A,A,MNAM) + PUSHJ P,STROUT + POP P,A + PUTBYT 11 + FETCH(T,A,MNUM) + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ OLD /] + MOVE T,B + PUSHJ P,DECOUT + PUTSTR[ASCIZ/ NEW +/] +IMCFOK: STORE(B,A,MNUM) + MOVE B,STRING + PUSHJ P,PUTFS + JRST IMCF1 + +IMCF4: FETCH(A,A,MNXT) + JUMPN A,IMCF3 +IMCF5: PUTSTR[ASCIZ/MODULE NOT FOUND: +/] + MOVE A,STRING + PUSHJ P,STROUT + PUTSTR[ASCIZ/ +/] + MOVE B,STRING + PUSHJ P,PUTFS + JRST IMCF1 + +ILLLN1: PUTSTR[ASCIZ/FORMAT ERROR IN LINE STARTING: +/] + MOVE A,STRING + PUSHJ P,STROUT + PUTSTR[ASCIZ/ +/] + MOVE B,STRING + PUSHJ P,PUTFS +ILLLN2: XCT GETCHR + JRST MCFEOF + CAIE TTT,12 + JRST ILLLN2 + JRST IMCF1 + +ILLLIN: CAIN TTT,12 + JRST IMCF1 ;JUST SKIP BLANK LINES + PUTSTR[ASCIZ/NULL MODULE NAME ON LINE: + /] +ILLLN3: XCT GETCHR + JRST [ PUTSTR[ASCIZ/ +/] + JRST MCFEOF] + CAIN TTT,12 + JRST [ PUTSTR[ASCIZ/ +/] + JRST IMCF1] + PUTBYT (TTT) + JRST ILLLN3 + +MCFEOB: MOVE B,STRING + PUSHJ P,PUTFS +MCFEOF: PUTSTR[ASCIZ/END OF FILE IN MID-LINE. +/] +IMCFE: RELEASE DAT, +NOMODS: OUTSTR[ASCIZ/% SPARES? /] + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + PUSHJ P,DECIN + JFCL + CAIE TTT,12 + JRST [ PUSHJ P,IERR + OUTSTR[ASCIZ/INPUT ERROR. +/] + JRST NOMODS] + MOVEM A,FACTR1 + ; MASTER PARTS LIST - LISTING +NOMODC: MOVSI T,'MPL' ;MASTER PARTS LIST EXT + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + PUSHJ P,FILLST + MHDRA + MOVEI T,MPMMAR + MOVEM T,MARGIN + SETZM LINCNT + MOVEI T,[ASCIZ/MODULE COUNT/] + MOVEM T,HEADER + MOVE H,MODLST +MODPN1: SKIPL LINCNT + PUSHJ P,MHDRA + FETCH(A,H,MNAM) + PUSHJ P,STROUT + PUTBYT 11 + FETCH(T,H,MNUM) + PUSHJ P,DECOUT + CRLF + FETCH(H,H,MNXT) + JUMPN H,MODPN1 + MOVEI T,MPLMAR + MOVEM T,MARGIN + SETZM LINCNT + SKIPN H,PARTLIST + JRST MPART2 +MPART1: FETCH(G,H,MDCN) + SKIPE G + PUSHJ P,MPRTDO + FETCH(H,H,NXPL) + JUMPN H,MPART1 +MPART2: SKIPE G,NULPART + PUSHJ P,MPRTDO + JRST MPARTE + +MPRTDO: ;CLEAR SUBTOTAL COUNTS HERE +MPRTD1: FETCH(F,G,MXPT) +MPRTD2: FETCH(E,F,MCPT) + SETZM LSTDIP + SETZM NDIPS + SETZM CONFLG + TLZ TFLG +MPRTD3: FETCH(D,E,MODC) + FETCH(T,D,MNUM) + TLNE ASKHIM + JUMPE T,MPRTD4 + TLOE TFLG + JRST MPRTD5 + SKIPL LINCNT + PUSHJ P,MHDR + JUMPE H,MPRTE0 + FETCH(A,H,PLPT) + FETCH(A,A,PRVS) + PUSHJ P,STROUT + JRST MPRTE1 + +MPRTE0: PUTSTR[ASCIZ\N/A\] +MPRTE1: MOVEI A,=16 + PUSHJ P,FILL + FETCH(A,G,MDIP) + JUMPE A,[PUTSTR[ASCIZ\N/A\] + JRST MPRTE2] + FETCH(A,A,DNAM) + PUSHJ P,STROUT +MPRTE2: JUMPE H,MPRTE3 + FETCH(C,H,PLPT) + JRST MPRTE4 + +MPRTE5: FETCH(T,C,PRBT) + TRNE T,NULVAL + JRST MPRTE4 + MOVE T,LWIDTH + SUB T,LCOUNT + CAIGE T,=16 ;AT LEAST 2 TABS STOPS LEFT? + CRLF ;NO, NEW LINE + MOVEI A,=32 + CAML A,LCOUNT + JRST [ PUSHJ P,FILL + JRST MPRTE6] + PUTSTR[ASCIZ/, /] +MPRTE6: FETCH(A,C,PRVS) + PUSHJ P,STROUT +MPRTE4: FETCH(C,C,PRPP) + JUMPN C,MPRTE5 + CRLF +MPRTE3: FETCH(C,F,MPRX) + JUMPE C,MPRTF1 +MPRTF2: MOVE T,LWIDTH + SUB T,LCOUNT + CAIGE T,=24 + CRLF + MOVEI A,=32 + CAML A,LCOUNT + JRST [ PUSHJ P,FILL + JRST MPRTF3] + PUTSTR[ASCIZ/, /] +MPRTF3: FETCH(A,C,TLFT) + PUSHJ P,STROUT + PUTBYT ":" + FETCH(A,C,TRHT) + PUSHJ P,STROUT + FETCH(C,C,NXTT) + JUMPN C,MPRTF2 +MPRTF1: SKIPE LCOUNT + CRLF +MPRTD5: HRRZS CONFLG ;HAVEN'T USED APPROX COUNT ON THIS MODULE YET + PUTBYT 11 + FETCH(A,D,MNAM) + PUSHJ P,STROUT + PUTBYT 11 + FETCH(A,D,MNUM) + SKIPE T,A + PUSHJ P,DECOU5 + PUTBYT 11 + FETCH(T,E,MAPP) + JUMPN T,[SETOM CONFLG + JRST MPRTD6] + FETCH(T,E,MREA) +MPRTD6: IMUL A,T + ADDM T,LSTDIP + ADDM A,NDIPS + PUSHJ P,DECOU5 + SKIPGE CONFLG ;IS THIS APPROX NUMBER? + PUTBYT "A" ;YES + TLNN ASKHIM ;DO WE HAVE MODULE COUNT? + JRST MPRTD7 ;NO, SO NO TOTAL FOR MODULE TYPE + PUTBYT 11 + MOVE T,A + PUSHJ P,DECOU5 + SKIPGE CONFLG + PUTBYT "A" +MPRTD7: CRLF +MPRTD4: FETCH(E,E,MCNX) + JUMPN E,MPRTD3 + TLNE ASKHIM ;SKIP SUMMARY IF MODULE COUNTS ONLY + SKIPN H ;SKIP ALSO IF NO PART NUMBER + JRST MPRTD9 + MOVEI A,=24 + PUSHJ P,FILL + MOVE T,LSTDIP + PUSHJ P,DECOU5 + SKIPE CONFLG + PUTBYT "A" + SKIPN T,NDIPS + JRST MPRTD8 + PUTBYT 11 + PUSHJ P,DECOU5 + SKIPE CONFLG + PUTBYT "A" + PUTBYT 11 + MOVE A,NDIPS + IMUL A,FACTR1 + IDIVI A,=100 + CAIL B,=50 + ADDI A,1 + SKIPN A + MOVEI A,1 + MOVE T,A + PUSHJ P,DECOU5 + SKIPE CONFLG + PUTBYT "A" + PUTBYT 11 + ADD A,NDIPS + MOVE T,A + PUSHJ P,DECOU5 + SKIPE CONFLG + PUTBYT "A" +MPRTD8: CRLF +MPRTD9: FETCH(F,F,MXNX) + JUMPN F,MPRTD2 + FETCH(G,G,MDNX) + JUMPN G,MPRTD1 +;SUBTOTALS HERE? + POPJ P, + +MPARTE: SKIPE B,MPLTIT + PUSHJ P,PUTFS + SETZM MPLTIT + RELEASE LST, + POPJ P, + +MHDR0: TLZN NOFF + PUTSTR[BYTE(7)15,14] + PUSH P,A + MOVN TTT,PAGLEN + ADD TTT,MARGIN + MOVEM TTT,LINCNT + SETZM TCOUNT + SKIPE A,MPLTIT + PUSHJ P,STROUT + PUSHJ P,PNTFDT + CRLF + POP P,A + POPJ P, + +MHDRA: PUSHJ P,MHDR0 + PUTSTR @HEADER + PUTSTR[ASCIZ/ +/] + POPJ P, + + +MHDR: PUSHJ P,MHDR0 + PUTSTR [ASCIZ/PART NUMBER DIPTYPE DESCRIPTION + MODULE # OF # OF # OF /] + MOVE T,FACTR1 + PUSHJ P,DECOUT + PUTSTR[ASCIZ\ % TOTAL + NAME MODULES PARTS/ PARTS SPARE # OF + MODULE * # OF PARTS PARTS + MODULES + +\] + POPJ P, + SUBTTL 'TTY' PIN/SIGNAL/BODY FOR ONE LOC +TTYUSE: MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + OUTSTR[ASCIZ/DIP(/] + OUTSTR @WBDCUE + OUTSTR[ASCIZ/) OR CONNECTOR(/] + OUTSTR @CBCUE + OUTSTR[ASCIZ/) LOCATION?/] + PUSHJ P,GETLOC + JRST ERRET + CAIE TTT,12 + JRST ERRET + HRRZM TT,LETTER + HRRZM TT,SAVET + HLLZM TT,NUMBER ;SAVE MAPCON BIT + MOVEI H,RADDR(W,WBDY,NXTB) +TTYULP: PUSHJ P,SERLOC ;Find loc in LETTER + JRST [ OUTSTR[ASCIZ/NO SUCH LOC! +/] + POPJ P,] + MOVEM H,FSTBOD + MOVE T,[PUSHJ P,TTYOUT] + MOVEM T,PUTCHR + SETOM TTYFLG + SETZM LCOUNT + FETCH(T,H,BBIT) + TRNE T,CBODY + JRST TTYCUS ;YES + SKIPGE NUMBER ;DOUBLE CHECK THAT WE WEREN'T LOOKING FOR CONN + JRST TTYULP + OUTSTR[ASCIZ/LOC DIPTYPE BODY POS FILE + PIN # TYPE HI LOW USE SIGNAL NAME + +/] +TTYUS2: PUSHJ P,USEP3 ;PRINT LINE FOR THIS BODY + PUSHJ P,SERLOC + CAIA + JRST TTYUS2 ;Print any others in same loc (LETTER) + SKIPN ISWW + POPJ P, + PUTBYT 11 + PUTSTR [ASCIZ /AT X,Y= /] + MOVE A,FSTBOD + FETCH(B,A,BPAK) + FETCH(A,A,BLOC) + PUSHJ P,PAKSIZ + JFCL + PUSH P,T ;MIN X,,Y + PUSH P,TT + HLRE T,T ;MIN X + PUSHJ P,DECOUT + PUTBYT "/" + HLRE T,(P) + PUSHJ P,DECOUT + PUTSTR [ASCIZ /, /] + HRRE T,-1(P) + PUSHJ P,DECOUT + PUTBYT "/" + HRRE T,(P) + PUSHJ P,DECOUT + CRLF + SUB P,[2,,2] + POPJ P, + +TTYCUS: SKIPL NUMBER ;WE WERE REALLY LOOKING FOR A BODY + JRST TTYULP + OUTSTR[ASCIZ/CONNECTORS +PIN FILE POS TYPES SIGNAL NAME + +/] + MOVNI T,10000 ;SUPPRESS NEW PAGE + MOVEM T,LINCNT + JRST USEC3A ;PRINT CONNECTOR LINES + +;SERLOC - Search for a body (or connector body) in location (LETTER) +; ignore any DIP location within-socket-offset +;H - locative to body list +; skip if found + +SERLOC: FETCH(H,H,NXTB) + JUMPE H,CPOPJ + FETCH(A,H,BLOC) + SKIPE ISWW + PUSHJ P,MAPOST ;remove any DIP offset + CAI + HRRZS A + CAME A,LETTER + JRST SERLOC + JRST CPOPJ1 + SUBTTL 'WLU' BODY/PIN/SIGNAL +USEPIN: SETZM ALLNAM + SETZM ALLCRD +ALLUSE: MOVE L,DEFLST + SKIPE T,ALLCRD + JRST [ MOVEM T,SLICEL + JRST GALCD1] + PUSHJ P,LSTGET + POPJ P, +GALCD1: FETCH(H,W,WBDY) + JUMPE H,[OUTSTR[ASCIZ/NO BODIES AT ALL! +/] + POPJ P,] ;SKIP IF NO BODIES + MOVSI T,'WLU' ;WIRE LIST VERIFY FILE EXTENSION + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,ALLSET + POPJ P, + PUSHJ P,FILLST + PUTHDR + MOVEI T,[ASCIZ/LOC DIPTYPE BODY POS FILE + PIN # TYPE HI LOW USE SIGNAL NAME/] + MOVEM T,HEADER + MOVEI T,WUPMAR + MOVEM T,MARGIN + SETZM LINCNT + SETOM SAVET +USEP2: FETCH(T,H,BBIT) + TRNE T,CBODY ;CON? + JRST USEC1 ;YES, DO IT DIFFERENTLY + FETCH(T,H,BLOC) + JUMPE T,USENLC + CAMN T,SAVET + JRST USEP3X +USENLC: MOVEM T,SAVET + SKIPL LINCNT ;NEED A HEADER? + PUSHJ P,PUTHDR ;WE ALWAYS GET A HEADER HERE +USEP3X: PUSHJ P,USEP3 ;POOT OUT THIS BODY + FETCH(H,H,NXTB) + JUMPN H,USEP2 +USE0: RELEASE LST, + POPJ P, + +USEP3: FETCH(A,H,BLOC) + FETCH(T,H,BBIT) + PUSHJ P,WLOCOUT ;OUT OUT DAMN LOC + PUTBYT 11 + FETCH(A,H,DIPT) + JUMPE A,[PUTSTR[ASCIZ/NONE/] + JRST USEP4] + FETCH(A,A,DNAM) + PUSHJ P,STROUT ;DIPTYPE +USEP4: PUTBYT 11 + SKIPN ADDR(H,BNAM) + PUTSTR[ASCIZ/NONE/] + PUTSTR ADDR(H,BNAM) + PUTBYT 11 + FETCH(A,H,BBIT) + PUSHJ P,BPPNT + PUTBYT 11 + FETCH(A,H,FILB) + PUTSIX ADDR(A,FILN) ;FILENAME + FETCH(F,H,BPIN) + JUMPN F,USEP8A + PUTSTR[ASCIZ/ NO PINS/] + CRLF + POPJ P, ;JUST GET ANOTHER BODY + +USEP8A: CRLF +USEP8: PUTSTR[ASCIZ/ /] + FETCH(T,F,PINN) + SETZM TCOUNT + PUSHJ P,DECOUT ;PIN # + FETCH(T,F,PBIT) + TRNN T,PIDPIN + JRST USEP80 + MOVE TT,TCOUNT + SUBI TT,7 + PUTBYT " " + AOJL TT,.-1 + PUTBYT "*" + JRST USEP81 + +USEP80: PUTBYT 11 +USEP81: FETCH(G,F,PTYP) + JUMPN G,USEP82 + PUTSTR[ASCIZ/UN /] + JRST USEP83 + +USEP82: PUSHJ P,PNTTYP + PUTBYT 11 + PUSHJ P,PNTLOD ;THERE'S A TAB IN HERE + PUTBYT 11 + FETCH(A,G,DUSE) + PUTSIX A +USEP83: FETCH(B,F,HPNT) +;Print signal on pin, and all its synonyms +USEP9: PUTBYT 11 + FETCH(TT,B,WBIT) + TRNE TT,SPWR!SGND ;Print GND as simple name + JRST [ MOVE A,B + PUSHJ P,GCANON + PUTSIG ADDR(A,SPNT) + CRLF + JRST USEP10] + PUTSIG ADDR(B,SPNT) + CRLF + FETCH(B,B,NNAM) + JUMPE B,USEP10 + PUTSTR[ASCIZ/ /] + JRST USEP9 + +USEP10: FETCH(F,F,NXBP) ;NEXT PIN OF BODY + JUMPN F,USEP8 + POPJ P, + +USEC1: SETZM LINCNT + MOVEI T,WUCMAR + MOVEM T,MARGIN + MOVEI T,[ASCIZ/CONNECTORS +PIN FILE POS TYPES SIGNAL NAME/] + MOVEM T,HEADER + SETZM SAVET +USEC2: FETCH(T,H,BLOC) + CAMN T,SAVET ;NEW LOC? + JRST USEC3X + MOVEM T,SAVET + PUSHJ P,PUTHDR ;YES, NEW PAGE +USEC3X: PUSHJ P,USEC3A + FETCH(H,H,NXTB) + JUMPN H,USEC2 + JRST USE0 + +USEC3A: FETCH(G,H,BPIN) +USEC3: SKIPL LINCNT + PUSHJ P,PUTHDR ;NEW HEADER + MOVE A,SAVET + FETCH(T,G,PINN) + HRLI A,(T) + FETCH(T,H,BBIT) + PUSHJ P,LOCPNW + PUTBYT 11 + FETCH(A,G,FILP) + SETZM TCOUNT + PUTSIX ADDR(A,FILN) ;FILENAME + PUTBYT 11 + FETCH(A,G,PBIT) + PUSHJ P,CNPNT + MOVEI A,=20 + PUSHJ P,SPFILL ;FILL WITH SPACES TO TYPE BITS + FETCH(B,G,HPNT) + FETCH(A,B,TBIT) ;WIRE TYPE BITS + PUSHJ P,PNTYPE + FETCH(T,G,PBIT) ;GET PIN BITS + TRNN T,TRMBTS ;ANY TERMINATOR RULE? + JRST USEC4 ;NO + PUTBYT "(" + LDB T,[POINT TRMBSZ,T,TRMBPS+=18] + PUSHJ P,DECOUT + PUTBYT ")" +USEC4: MOVEI A,=32 + PUSHJ P,FILL ;FILL WITH TABS + PUTSIG ADDR(B,SPNT) + CRLF + FETCH(B,B,NNAM) + JUMPE B,USEC5 + JRST USEC4 + +USEC5: FETCH(G,G,NXBP) ;NEXT PIN + JUMPN G,USEC3 + POPJ P, + SUBTTL 'UML' UTILIZATION FILE - DIPS +DIPBOX__=12 ;WIDTH OF BOX FOR 1 DIP +UMLINE: BYTE(7)UBAR,UBAR,UBAR,UBAR,UBAR,UBAR,UBAR,UBAR,UBAR,UBAR,UBAR,UBAR,0 + ;Yes Virginia, there are 12. of them +MTDIP: [ASCIZ /| |/] ;8 SPACES + 2BARS +MTDIP1: [ASCIZ /|--------|/] ;8 SPACES + 2BARS + +PNTUML: SKIPN ISWW + JRST NXWW + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE L,DEFLST + PUSHJ P,LSTGET + JRST [ OUTSTR[ASCIZ/YOU GET A BLANK UML! +/] + SETZ W, + JRST .+1] + MOVSI T,'UML' ;WIRE LIST UML FILE EXTENSION + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, +NOITS,< JUMPE W,PNTUM1 > +ITS,< + JUMPE W,[SKIPE XGP ;BETTER NOT CALL FILLST OR CONFUSION WILL REIGN + PUSHJ P,XGPSTR + JRST PNTUM1] +>;ITS + PUSHJ P,FILLST + PUTHDR +PNTUM1: MOVEI T,[ASCIZ/ ******* DIP MAP *******/] + MOVEM T,HEADER + MOVEI T,UMLMAR + MOVEM T,MARGIN + SETZM LINCNT ;FORCE HEADER FIRST TIME + MOVE T,NCOLS + MOVEM T,MCOL + +;The board type specifies how many rows/cols of DIP boxes +; make the UML map. +;This stuff decides if that map overflows a page horiz. or +; verticaly, and if so breaks it up into more than one page + +UML3: SKIPLE TT,NCLPRG ;NO COLS TO PRINT ON PAGE + CAILE TT,=8 ;DEFAULT IS 8 + MOVEI TT,=8 +;Number of columns is MIN(8, cols-to-go) + MOVE T,MCOL + SUB T,TT + JUMPGE T,UML3A ;ALL COLS FIT ON THIS PAGE? + ADD TT,T ;YES + SETZ T, +UML3A: ADDI T,1 + MOVEM T,MCOL + MOVNS TT + HRLZS TT ;AOBJN POINTER + MOVEM TT,COLLOP ;-#COLS TO PRINT,, + MOVE T,NROWS ;NUMBER OF ROWS FROM CARD DEF + MOVEM T,MROW + MOVEI G,1 ;START WITH UML ROW 1 + SETZM MROWPP ;NO ROWS YET, (FOR TOP TESTED LOOP) + +UML4: MOVN T,MROWPP ;REDUCE COUNT BY # ROWS PRINTED + ADDB T,MROW + JUMPLE T,UML16 ;DONE WITH THIS SET OF UMLCOLS + SKIPL LINCNT ;PREVIOUS PAGE PRINTED? + PUSHJ P,PUTHDR + MOVM T,LINCNT ;# LINES LEFT TO PRINT + ADDI T,UMLMAR ;(PUTHDR SUBS OFF MARGIN) + IDIVI T,UMLMAR ;HOW MANY UML ROWS MAX PER PAGE? + SKIPLE TT,NRWPRP ;SPECIFIED NUMBER OF ROWS PER PAGE? + CAML TT,T ;MIN + CAIA + MOVE T,TT + CAMLE T,MROW ;MORE THAN ARE LEFT? + MOVE T,MROW + MOVEM T,MROWPP ;# ROWS OF DIPS TO PRINT ON NEXT PAGE + MOVNS T + HRL G,T + MOVEM G,GSAVE + PUSHJ P,ANYUML ;ANY UML ON THIS PAGE? + AOBJN G,.-1 + JUMPGE G,UML4 ;NO DIPS, SKIP THIS PAGE + SETZM LINCNT ;WE'LL PRINT THIS PAGE, FORCE NEW HEADER NEXT TIME + MOVE G,GSAVE +UML4A: PUSHJ P,UMBORD ;DO THE TOP LINE OF DIP BOXES + CRLF + PUSHJ P,UMLDIP ;DO DIP NAMES + CRLF + PUSHJ P,UMLFIL ;Drawing file name that uses this slot +; PUSHJ P,UMLBLK ;BLANK LINE + CRLF + PUSHJ P,UMSECS ;SECTION USAGE + PUTBYT 15 ;CARRIAGE RETURN ONLY + PUSHJ P,UMBORD + CRLF + PUSHJ P,UMLOCS ;UML DIP LOCATIONS + CRLF + AOBJP G,UML4 ;NO CR AT END OF LOOP + CRLF + JRST UML4A + +UML16: + SOSLE MCOL ;COLS LEFT OVER THAT DIDN'T FIT ON PAGE? + JRST UML3 + JRST UMLEDG ;DO THE EDGE CONNECTORS NOW + +;G = -#,,ROW +ANYUML: MOVE E,COLLOP ;WILL ANY DIPS BE FOUND ON THIS ROW? +ANYUM1: PUSHJ P,LOCFND + CAIA + JRST CPOPJ1 + AOBJN E,ANYUM1 + POPJ P, + +;HERE TO PRINT DIP TYPES FOR A ROW OF UML + +UMLDIP: MOVE E,COLLOP ;ITERATION COUNT +UML7: SETZM TCOUNT + PUTSTR[ASCIZ/|/] + PUSHJ P,LOCFND + JRST [ PUTSTR @MTDIP1 + JRST UML8A] + PUTBYT 40 + FETCH(A,H,DIPT) ;DIP POINTER + JUMPE A,[PUTSTR[ASCIZ/?NONE?/] + JRST UML8] + FETCH(A,A,DNAM) ;DIP NAME + PUSHJ P,PRINT8 +UML8: MOVEI A,DIPBOX-1 + PUSHJ P,TFILL +UML8A: PUTBYT "|" + AOBJP E,CPOPJ ;THATS ALL FOR DIP NAMES + PUTSTR SPACING + JRST UML7 + +;HERE TO PRINT DIP LOCS FOR A ROW OF UML + +UMLOCS: MOVE E,COLLOP +UML10: SETZM TCOUNT + PUTSTR[ASCIZ/ /] + PUSHJ P,MAPRCU + JRST UML10B + MOVE A,T + PUSHJ P,LOCOUT +UML10B: MOVEI A,DIPBOX + PUSHJ P,TFILL + AOBJP E,CPOPJ ;THATS ALL FOR UML DIP LOCS + PUTSTR SPACING + JRST UML10 + +UMBORD: MOVE E,COLLOP ;DO THE UML TOP OR BOTTOM LINE +UMBOR0: PUTSTR UMLINE + AOBJP E,CPOPJ + PUTSTR SPACING + JRST UMBOR0 + +UMLFIL: +UMLBLK: MOVE E,COLLOP ;ITERATION COUNT +UMBLK0: SETZM TCOUNT + PUTBYT "|" + PUSHJ P,LOCFND + JRST [ PUTSTR @MTDIP ;NO DIP IN THIS SLOT, CAUSE DOUBLE BOX + JRST UMBLK2] +;Draw attention to this slot, DIP type not defined + MOVEI B,"|" + FETCH(A,H,DIPT) ;DIP POINTER + JUMPE A,UMBLK1 +;Print file name of user + FETCH(A,H,FILB) ;GET FILE BLOCK + PUTSIX ADDR(A,FILN) + MOVEI B,40 +UMBLK1: MOVE A,TCOUNT + SUBI A,DIPBOX-1 + PUTBYT (B) + AOJL A,.-1 +UMBLK2: PUTBYT "|" + AOBJP E,CPOPJ ;THATS ALL FOR DIP NAMES + PUTSTR SPACING + JRST UMBLK0 + ;HERE FOR A ROW OF SECTION USAGE IN UML + +UMSECS: MOVE E,COLLOP +UML12: SETZM TCOUNT + PUTBYT "|" + PUSHJ P,LOCFND ;FIND LOC - sets DIP location into PINLOC + JRST [ PUTSTR @MTDIP1 ;NO LOC NO NOTHING + JRST UML20] + PUTBYT 40 + FETCH(A,H,DIPT) ;DIP TYPE + JUMPE A,[MOVEI A,1 ;IF NO DIP TYPE, INDICATE 1 SECTION + MOVEM A,FACTR1 ;LOOK LIKE 1 SECT DIP + SETOM FACTR2 ;SEC USED + JRST UML27] + +;Count # sections in DIPtype + SETZM FACTR1 ;INIT BIGGEST SECT # + FETCH(A,A,DPIN) ;FIRST PIN OF DIP DEF +UML21: FETCH(T,A,DPBIT) ;PIN TYPE BITS + TRNN T,INLD!OUTLD!TERM + JRST UML22 + FETCH(T,A,SCTB) ;SECTION BITS + MOVS T,T + JFFO T,.+2 + JRST UML22 + AOS TT + CAMLE TT,FACTR1 + MOVEM TT,FACTR1 +UML22: FETCH(A,A,DPNXT) + JUMPN A,UML21 + +;Now flag which sections used + SETZM FACTR2 ;INIT SECT USE BITS +UML26: MOVEI A,RADDR(H,BPIN,NXBP) ;NOW CALC SECTION USAGE + JRST UML23 + +UML24: FETCH(TTT,A,PTYP) + JUMPE TTT,UML23 + FETCH(T,TTT,DPBIT) ;PIN TYPE BITS + TRNN T,INLD!OUTLD!TERM + JRST UML23 + FETCH(T,TTT,SCTB) ;SECTION BITS + MOVS T,T + JFFO T,.+1 + MOVE TT,SCTTAB(TT) ;PICKUP CORRESPONDING BIT + IORM TT,FACTR2 ;MARK BIT FOR SECTION +UML23: FETCH(A,A,NXBP) + JUMPN A,UML24 +;Continue with other bodies in same DIP location + FETCH(H,H,NXTB) ;NEXT BODY + FETCH(A,H,BLOC) ;LOC + PUSHJ P,MAPOST ;Strip away any socket offset + SETZ A, + HRRZS A + FETCH(TT,H,BBIT) + TRNN TT,CBODY ;YES, IS THIS CONN THO? + CAME A,PINLOC ;IS THIS IT? + CAIA + JRST UML26 ;YES, LOOP BACK + +;Print section usage - ooxo +UML27: MOVEI A,DIPBOX-1 + SUB A,TCOUNT ;ROOM LEFT FOR SECTION BITS + CAMGE A,FACTR1 + MOVEM A,FACTR1 + SUB A,FACTR1 + CAIA + PUTBYT " " + SOJGE A,.-1 + MOVSI A,400000 +UML25: TDNN A,FACTR2 + JRST [ PUTBYT "o" + JRST .+2] + PUTBYT "x" + LSH A,-1 + SOSLE FACTR1 + JRST UML25 +UML20: PUTBYT "|" + AOBJP E,CPOPJ ;THAT ALL FOR SECTION USAGE + PUTSTR SPACING + JRST UML12 + ; UTILIZATION FILE - PADDLES +CONBOX__=29 ;SIZE OF COLUMN FOR ONE CONN + +UMLEDG: SETZM UMLEHT ;UML EDGE HEIGHT, HACK TO FIT MORE THAT ONE PER PAGE + SETOM UMLPGF ;MAKE THE FIRST PAGE HAPPEN + MOVEI T,[ASCIZ/ ******* EDGE CONNECTIONS Flags: (# Output, @ Terminator, ---- Dedicated ground, ++++ Dedicated power) *******/] + MOVEM T,HEADER + MOVN G,NPADS + HRLZ G,G +UMLC0: MOVEM G,MROW + HLLZ G,G +III,< CAMG G,[-3,,0] ;IF MORE THAN 4 TO GO + MOVSI G,-3 ;ONLY DO 4 NOW +>;III +NOIII,< CAMG G,[-4,,0] ;IF MORE THAN 4 TO GO + MOVSI G,-4 ;ONLY DO 4 NOW +>;NOIII + HRR G,MROW + MOVEM G,MCOL +UMLC1: PUSHJ P,LOCFNC ;Is there a paddle[i] ? + TDZA H,H ;None, make a 0 + FETCH(H,H,BPIN) ;PIN LIST + MOVEM H,PADDLE(G) + AOBJN G,UMLC1 + AOSN UMLPGF ;UML PAGE FLAG + PUSHJ P,PUTHDR + MOVE T,LINCNT + SKIPN UMLEHT ;DO WE WANT TO KNOW THE # LINES IN THE HEADER? + MOVEM T,UMLEHT ;YES, NEGATIVE MEANS WE ARE DOING FIRST GROUP + +;Label the 4 columns with the paddle name + MOVE G,MCOL +UMLL1: SETZM TCOUNT + MOVEI A,CONBOX/2-3 ;APPROX CENTERED + PUSHJ P,TFILL + MOVEI T,1(G) + HRRZ TT,PADLET ;FIRST PIN + HRRZ TTT,PADPIN + PUSHJ P,MAPPAD + MOVE A,T + SKIPE A ;NO PADDLE THERE + PUSHJ P,PADPRT + MOVEI A,CONBOX + PUSHJ P,TFILL + AOBJN G,UMLL1 + CRLF +;Now print the connector "groups", fitting them onto the same page if possible. + MOVE F,MCOL + PUSHJ P,UMLCP + MOVE G,MROW +NOIII,< ADD G,[4,,4] > ;ADVANCE BY 4 +III,< ADD G,[3,,3] > ;ADVANCE BY 3 + SKIPL T,UMLEHT ;SKIP IF THIS IS FIRST GROUP + JRST UMLL2 ; NOT FIRST, DECIDE IF MORE WILL FIT ON THE PAGE + SUB T,LINCNT + SUBI T,1 ;ONE BLANK LINE BETWEEN GROUPS + MOVNM T,UMLEHT + MOVNS T +UMLL2: ADD T,LINCNT ;WILL NEXT GROUP OVERFLOW PAGE? + JUMPG T,[SETOM UMLPGF ; NO, CAUSE A CALL TO PUTHDR + JRST UMLL3] + CRLF ;PUT IN BLANK LINE BETWEEN GROUPS +UMLL3: JUMPL G,UMLC0 ;ANY MORE? + RELEASE LST, + POPJ P, + + +;PRINT CONNECTOR TABLES +UMLCP: MOVEM F,COLLOP ;-COL#,,PADDLE# + MOVE G,PADLET ;-#PADDLE-LETTERS,,FIRST LETTER# +;"____________________" on first line. +UMLC2: HLRE A,COLLOP + IMULI A,CONBOX ;PAGE WIDTH + PUTBYT UBAR + AOJLE A,.-1 +;Now print row for all pins with this same leading letter. +UMLC2A: MOVE E,PADPIN ;-#PINS-WITHIN-LETTER,,FIRST PIN# +UMLC2B: PUSHJ P,UMLCS + AOBJN E,.-1 +ITS,< SKIPE XGP + JRST [ PUTXGP [BYTE(7)177,1,47,1] ;STOP UNDERBAR + AOBJN G,UMLC2A + JRST UMLC2C] +>;ITS + PUTBYT 15 + AOBJN G,UMLC2 + HLRE A,COLLOP + IMULI A,CONBOX + PUTBYT UBAR + AOJLE A,.-1 +UMLC2C: PUTSTR[ASCIZ/ +/] + POPJ P, + +;Print one line of connector info +UMLCS: PUTSTR[ASCIZ/ +|/] ;FINISH THE PREVIOUS ROW +;(On XGP, use underline featrure on last row of box) + HLRE T,E + AOJN T,UMLC3A ;LAST LINE OF GROUP? +ITS,< SKIPN XGP ;AND ON XGP + JRST UMLC3A + PUTXGP [BYTE(7)177,1,46] ;START UNDERBAR +>;ITS +UMLC3A: MOVE F,COLLOP +UMLC3: SETZM TCOUNT + MOVEI A,40 ;FLAG CHAR + HRLM A,(P) + MOVEI T,1(F) ;PADDLE# + MOVEI TT,(G) ;LETTER# + MOVEI TTT,(E) ;PIN# + PUSHJ P,MAPPAD + JUMPE T,UMLC6A ;NO SUCH PIN + MOVEM T,LSTPIN + MOVE A,T + PUSHJ P,PRNPIN + LDB T,[%%PINN,,A] ;JUST THE PIN # + PUTBYT 40 + SKIPN TT,PADDLE(F) ;PIN LIST FOR THIS PADDLE + JRST UMLC6 +UMLC4: FETCH(TTT,TT,PINN) + CAME TTT,T + JRST [ FETCH(TT,TT,NXBP) ;NEXT PIN ON CONNECTOR + JUMPN TT,UMLC4 + JRST UMLC6] + FETCH(A,TT,HPNT) + FETCH(T,A,TBIT) + MOVEI TT,"@" + TRNE T,TERM + HRLM TT,(P) + MOVEI TT,"#" + TRNE T,OUTLD + HRLM TT,(P) + MOVEI A,ADDR(A,SPNT) + PUSHJ P,PRNTCS +UMLC6: MOVE A,LSTPIN + PUSHJ P,PINBIT ;CHECK FOR PWR OR GND + MOVEI A," " + TLNE TT,PWR + MOVEI A,"+" + TLNE TT,GND + MOVEI A,"-" +UMLC6A: MOVE T,TCOUNT + SUBI T,CONBOX-3 ;SPACE, FLAG, AND V-BAR + SKIPGE T + PUTBYT (A) + AOJL T,.-1 + PUTBYT " " + HLRZ A,(P) + PUTBYT (A) + PUTBYT "|" + AOBJN F,UMLC3 + POPJ P, + ; UTILIZATION FILE - SUBRS +;Print signal name within space allowed. +PRNTCS: ADD A,[POINT 7,0] + MOVEI T,CONBOX-3 + SUB T,TCOUNT +PRNTCT: ILDB TTT,A + JUMPE TTT,CPOPJ + CAIN TTT,11 ;Flush tabs that appear because of H,L hack + MOVEI TTT,40 + XCT PUTCHR + SOJG T,PRNTCT + POPJ P, + +MAPRCU: HRRZ T,E + ADD T,MCOL ;UML COL + HRL T,G ;UML ROW + PUSHJ P,MAPRC ;T = UML ROW,,UML COL + POPJ P, + JRST CPOPJ1 + +LOCFNC: HRRZ TT,PADLET ;First pin on this paddle, from board definition + HRRZ TTT,PADPIN + MOVEI T,1(G) ;PADDLE# + PUSHJ P,MAPPAD + HRRZM T,PINLOC ;The paddle "body" location + JUMPE W,CPOPJ + MOVEI H,RADDR(W,WBDY,NXTB) + JRST LOCFCA + +LOCFC1: FETCH(A,H,BLOC) + CAME A,PINLOC + JRST LOCFCA + FETCH(TT,H,BBIT) + TRNE TT,CBODY + JRST CPOPJ1 +LOCFCA: FETCH(H,H,NXTB) + JUMPN H,LOCFC1 + POPJ P, + +;FIND FIRST BODY IN LOC +; G = -#,,ROW +; E = -#,,column-within-page (add MCOL) +;Return pointer to Body in H +LOCFND: PUSHJ P,MAPRCU + POPJ P, + HRRZM T,PINLOC ;LOC TO FIND + JUMPE W,CPOPJ + SETZM BESLOC ;Best body found in this location + SETZM BESPIN ;DIP size for that body + MOVEI H,RADDR(W,WBDY,NXTB) + JRST LOCFNA + +LOCFN1: FETCH(A,H,BLOC) ;LOC + PUSHJ P,MAPOST ;Strip away any socket offset + SETZ A, + HRRZS A + CAME A,PINLOC ;IS THIS IT? + JRST LOCFNA ;NO + FETCH(TT,H,BBIT) + TRNE TT,CBODY ;YES, IS THIS CONN THO? + JRST LOCFNA + FETCH(TT,H,BPAK) ;How many pins on package? + HRRZ TT,PACKPN(TT) + CAMG TT,BESPIN ;Only find the biggest package in this slot + JRST LOCFNA + MOVEM TT,BESPIN + MOVEM H,BESLOC +LOCFNA: FETCH(H,H,NXTB) + JUMPN H,LOCFN1 + SKIPE H,BESLOC ;Any body found? + AOS (P) + POPJ P, + +SPACING:ASCIZ/ / ;3 SPACES FOR NOW + +UMLBRS: PUSHJ P,PNTBRW + PUTSTR[ASCIZ/ + +/] + POPJ P, + +PRINT4: JUMPE A,CPOPJ + MOVEI T,4 + JRST PRINTN + +PRINT8: JUMPE A,CPOPJ + MOVEI T,8 + JRST PRINTN + +PRINT5: JUMPE A,CPOPJ + SKIPA T,[5] +PRINT7: MOVEI T,7 +PRINTN: ADD A,[POINT 7,1] +PRINTQ: TLNE A,760000 + JRST PRINTZ + HRR A,-1(A) + TRNN A,-1 + POPJ P, +PRINTZ: ILDB TTT,A + JUMPE TTT,CPOPJ + XCT PUTCHR + SOJG T,PRINTQ + POPJ P, + SUBTTL 'TST' BINARY WIRE LIST TO SIMULATOR +;THIS OUTPUT IS COURRENTLY INTENDED FOR RUBIN'S SIMULATOR + +TSTWRT: MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + MOVSI T,'TST' ;CARD TESTER FILE EXTENSION + MOVEI TT,10 ;FULL WORDS + MOVSI TTT,'DSK' + PUSHJ P,OUTSET ;SETUP OUTPUT STUFF + POPJ P, ;LET HIM OUT HERE + MOVEI A,RADDR(W,WBDY,NXTB) + JRST TSTB1 + +TSTB2: FETCH(T,A,DIPT) ;DIP TYPE + JUMPE T,[PUSH P,A + FETCH(T,A,BBIT) + TRNE T,CBODY + JRST ISCON + SKIPN ADDR(A,BNAM) + OUTSTR[ASCIZ/UNNAMED BODY/] + OUTSTR ADDR(A,BNAM) + OUTSTR[ASCIZ/ HAS NO DIP TYPE! +/] + ISCON: POP P,A + JRST TSTB1] + FETCH(T,T,DNAM) ;DIP NAME + PUSHJ P,WSTR + MOVE TTT,A + PUSHJ P,WORDOUT + FETCH(TTT,A,BLOC) + PUSHJ P,WORDOUT +TSTB1: FETCH(A,A,NXTB) + JUMPN A,TSTB2 + PUSHJ P,WRTZERO ;TERMINATE NAMES + MOVEI A,RADDR(W,WIRES,ALPH) + JRST TSTP1 + +TSTP2: FETCH(B,A,WBIT) + TRNE B,NAM2ND + JRST TSTP1 ;ONLY REAL WIRES + SETZ C, + TRNE B,SPWR + AOSA C ;CODE = 3 + TRNE B,SHI + AOSA C ;CODE = 2 + TRNE B,SGND + AOJA C,TSTTX4 ;CODE = 1 +; TRNE B,WSINGL ;DON'T SEND NON-SPECIAL SINGLE PIN RUNS +; JRST TSTP1 +TSTTX4: MOVE B,A ;START WITH THIS ONE +TSTTX0: BINSIG ADDR(B,SPNT) ;PUT OUT SIGNAL NAME + FETCH(B,B,NNAM) ;NEXT NAME BLOCK + JUMPN B,TSTTX0 + MOVE TTT,C + PUSHJ P,WORDOUT ;SEND CODE FOR STRING + FETCH(B,A,WPIN) ;GET FIRST PIN + JUMPE B,TSTPZ ;ANY PINS AT ALL? +TSTP3: FETCH(TT,B,PBIT) + TRNE TT,DUP + JRST TSTP5 + FETCH(TTT,B,PINN) ;PIN # + FETCH(T,B,PBDY) + FETCH(TT,T,BBIT) + TRNE TT,CBODY + JRST [ FETCH(T,T,BLOC) + MOVE TT,TTT + PUSHJ P,CPNMER + MOVE TTT,T + JRST TSTP4] + HRL TTT,T ;USE BODY CORE LOC AS UNIQUE # +TSTP4: PUSHJ P,WORDOUT +TSTP5: FETCH(B,B,NXTP) + JUMPN B,TSTP3 +TSTPZ: PUSHJ P,WRTZERO +TSTP1: FETCH(A,A,ALPH) + JUMPN A,TSTP2 + PUSHJ P,WRTZERO + RELEASE LST, + POPJ P, + +WASCIZ: MOVE TTT,(T) + PUSHJ P,WORDOUT + TRNE TTT,376 + AOJA T,WASCIZ + POPJ P, + +WSTR1: MOVE TTT,1(T) + PUSHJ P,WORDOUT + TRNN TTT,376 ;END? + POPJ P, ;YES + HRRZ T,(T) +WSTR: JUMPN T,WSTR1 +WRTZERO:TDZA TTT,TTT +WRTMARK:MOVEI TTT,400000 +WORDOUT:SOSG LSTHD+2 + OUT LST, + CAIA + OUTSTR[ASCIZ/OUTPUT ERROR! +/] + IDPB TTT,LSTHD+1 + POPJ P, + SUBTTL 'TP8' OUTPUT TO TAPR-8 WIRE WRAP SYSTEM +DEC,< +TP8WRT: MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + MOVSI T,'TP8' ;TAPR-8 EXTENSION + MOVEI TT,0 ;TEXT FILE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET ;SETUP OUTPUT STUFF + POPJ P, ;LET HIM OUT HERE + SETZM CDSKPC + SETZM NDIPS + SETZM NBODS + MOVEI H,RADDR(W,WIRES,ALPH) + JRST TP8R1 + +TP8R2: FETCH(T,H,WBIT) + TRNE T,NAM2ND!WNULL!WSINGL!SNC + JRST TP8R1 + MOVEI G,RADDR(H,WPIN,NXTP) + TRZ FLAG ;FLAG NO PINS OUT YET + SETZ F, ;HOLDS FIRST PIN + JRST TP8R3 + +TP8R4: FETCH(T,G,PBIT) + TRNE T,DUP + JRST TP8R3 ;SKIP DUPLICATES + FETCH(B,G,PBDY) + FETCH(T,B,BLOC) + JUMPE T,[AOS NBODS + JRST TP8R3] + FETCH(T,B,BBIT) + TRNE T,CBODY + JRST TP8R5 + FETCH(T,B,DIPT) + JUMPE T,[AOS NDIPS ;COUNT PIN WITHOUT DIPTYPE + JRST TP8R5] + FETCH(T,T,DPNN) + CAIE T,=14 + CAIN T,=16 + JRST TP8R5 + CAIE T,=24 + AOS CDSKPC +TP8R5: JUMPE F,[MOVE F,G + JRST TP8R3] + TROE FLAG + JRST TP8R6 + PUTSTR ADDR(H,SPNT) + CRLF + EXCH F,G + PUSHJ P,TP8PIN + EXCH F,G +TP8R6: PUSHJ P,TP8PIN +TP8R3: FETCH(G,G,NXTP) + JUMPN G,TP8R4 + TRNE FLAG ;ANY PINS PUT OUT? + CRLF +TP8R1: FETCH(H,H,ALPH) + JUMPN H,TP8R2 + CRLF + RELEASE LST, + SKIPN T,NDIPS + JRST TP8E1 + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ PINS OUTPUT WITH NO DIP TYPE. +/] +TP8E1: SKIPN T,NBODS + JRST TP8E2 + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ PINS SKIPPED DUE TO NO BODY LOC. +/] +TP8E2: SKIPN T,CDSKPC + POPJ P, + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ PINS OUTPUT WHICH WEREN'T 14, 16, OR 24 PIN DIPS. +/] + POPJ P, + +TP8PIN: FETCH(A,G,PINN) + FETCH(B,G,PBDY) + FETCH(T,B,BLOC) + HRL A,T + FETCH(TT,B,BBIT) + FETCH(T,B,DIPT) + SKIPE T + FETCH(T,T,DPNN) + PUSHJ P,TP8LOC + CRLF + POPJ P, +>;DEC + SUBTTL 'SMP' BACK PANEL OUTPUT TO DEC SYSTEM +;DEC WIRE LIST OUTPUT + +;SELECT MODE +SSIMPLE:TRZ DOGIN!DOPWR!CONLY ;ASSUME ALL OFF + SETZM OFFSET ;IN CASE NO OFFSET + ASK [ASCIZ /INVENT NAMES FOR "U" PINS?/] + POPJ P, + CAIA + TRO DOGIN + ASK [ASCIZ /OUTPUT POWER PINS?/] + POPJ P, + JRST SSIMP1 + TRO DOPWR + ASK [ASCIZ /OUTPUT ONLY POWER PINS?/] + POPJ P, + JRST SSIMP1 + TRO CONLY +SSIMP1: ASK [ASCIZ /OFFSET SLOTS?/] + POPJ P, + JRST OSIMP1 + CAIA +OSIMPLE:TRZ DOGIN!DOPWR!CONLY + OUTSTR[ASCIZ/TYPE OFFSET FOR SLOTS (N OR -N)? /] + MOVE TTT,[PUSHJ P,TTYIN] + MOVEM TTT,GETCHR + PUSHJ P,SDECIN + JFCL + CAIE TTT,12 + JRST ERRET + MOVEM A,OFFSET ;SAVE OFFSET + JRST OSIMP1 + +BSIMPLE:TRZ DOGIN!CONLY + TRO DOPWR + JRST BSIMP1 + +PSIMPLE:TRO DOPWR!CONLY + TRZ DOGIN + JRST BSIMP1 + +ASIMPLE:TROA DOGIN +WIRWRT: TRZ DOGIN + TRZ DOPWR!CONLY +BSIMP1: SETZM OFFSET ;NO OFFSET NORMALLY +OSIMP1: MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE L,DEFLST + FETCH(W,L,BLST) + JUMPE W,XBAK ;ANY BACK PANEL STUFF? + MOVSI T,'SMP' ;IT'S SIMPLE! + MOVEI TT,0 ;MODE 0 + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + SKIPN ISWW + JRST SMPVG5 + MOVEI H,RADDR(W,WBDY,NXTB) ;GO DOWN BODY LIST (CARDS) + JRST SMPVG1 + +SMPVG2: FETCH(G,H,BLOC) ;GET CARD LOC + MOVEM G,SLICEL ;SAVE CARD HERE FOR PRINT OUT + MOVN G,NPADS + MOVS G,G + HRRI G,1 ;START WITH PADDLE 1 +SMPVG3: MOVE F,PADLET +SMPVG4: MOVE E,PADPIN +SMPVG6: MOVEI T,(G) + MOVEI TT,(F) + MOVEI TTT,(E) + PUSHJ P,MAPPAD + MOVE A,T + PUSHJ P,SMPVG ;SIDE 2 ALSO + AOBJN E,SMPVG6 + AOBJN F,SMPVG4 + AOBJN G,SMPVG3 +SMPVG1: FETCH(H,H,NXTB) + JUMPN H,SMPVG2 +SMPVG5: MOVEI B,RADDR(W,WBDY,NXTB) ;GO DOWN BODY LIST + SETZM FACTR1 ;CLEAR COUNT OF NX PINS SKIPPED + SETZM FACTR2 ;****** TEMPRORARY FIX ******* CLEAR COUNT OF POWER PINS SKIPPED + SETOM CDSKPC + JRST WIRW1 + +WIRW2: AOS T,CDSKPC + CAILE T,7 + JRST [ OUTSTR[ASCIZ/ +/] + SETZM CDSKPC + JRST WIRPN1] + SKIPE CDSKPC + OUTCHR[11] +WIRPN1: FETCH(A,B,BLOC) + PUSH P,PUTCHR + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUSHJ P,SLTOUT + POP P,PUTCHR + SETZM GINPIN ;START INVENTED PINS OVER + MOVEI D,RADDR(B,BPIN,NXBP) ;NOW DO EACH PIN OF SLOT + PUSH P,B + JRST WIRW3 + +WIRW4: FETCH(E,D,PINN) ;PADDLE PIN SIDE + FETCH(B,D,HPNT) + FETCH(F,B,WBIT) + FETCH(TTT,D,PBIT) + TRNE TTT,DUP + JRST WIRW3 + TRNN F,SPWR ;IS IT A POWER PIN + JRST CKCNLY + TRNN DOPWR ;DON'T SEND POWER PINS UNLESS SPECIAL MODE + JRST SKPVLT + JRST SNDPIN + +CKCNLY: TRNE CONLY + JRST WIRW3 ;SKIP REGULAR PINS FOR PSIMPLE +SNDPIN: FETCH(TTT,D,PBDY) + FETCH(TTT,TTT,BBIT) + TRNE TTT,BWILD ;SKIP "U" PINS + JRST CHKGIN +GOTGIN: SETZM LOUTL + SETZM LOUTH + TRNE F,SGND ;AVOID SETTING LOADING FOR GROUND + JRST PIKSMP ;PICK GROUND SIGNAL NAME TO PRINT + FETCH(TTT,D,CBIT) + JUMPE TTT,NOLOAD ;REAL ONE? + FETCH(T,D,HOLD) + MOVM T,T + MOVNM T,LOUTH + FETCH(T,D,LOLD) + MOVM T,T + MOVNM T,LOUTL + FETCH(T,D,HILD) + MOVM T,T + ADDM T,LOUTH + FETCH(T,D,LILD) + MOVM T,T + ADDM T,LOUTL +NOLOAD: TRNE F,SHI ;HI RUN? + JRST [ FETCH(T,B,TBIT) + TRNE T,ECL + JRST .+1 + FETCH(T,B,WRN) ;GET WIRE RULE NUMBER + CAIE T,=19 + CAIN T,=20 + JRST .+1 ;NO +3 IF ECL + CAIN T,=21 + JRST .+1 + PUTSTR[ASCIZ/+3 /] + JRST WASHIR] + TRNN F,SNC + JRST PIKSMP + PUTSTR[ASCIZ/NC /] + FETCH(C,D,PBDY) + FETCH(C,C,BLOC) + MOVE A,E + HRL A,C + MOVE T,OFFSET + PUSHJ P,BPNPIN ;MAKE NC RUN UNIQUE BY ADDING PIN NAME + MOVEI A,=24 + PUSHJ P,FILL + PUTSTR[ASCIZ/ /];NO ASSERTION POLARITY + JRST WASHIR + +PIKSMP: PUSHJ P,SMPSIG ;WIRE HEAD IN B, PICK RIGHT SIGNAL +WASHIR: PUTBYT " " + FETCH(C,D,PBDY) + FETCH(C,C,BLOC) + MOVE A,E + HRL A,C + MOVE T,OFFSET + PUSHJ P,BPNPIN + MOVEI A,=40 + PUSHJ P,FILL + FETCH(T,D,FILO) ;GET SOURCE FILE BLOCK POINTER + SKIPN T ;USE IT IF THERE + FETCH(T,D,FILP) + FETCH(A,T,FPRF) ;GET PREFIX STRING + PUSHJ P,PRINT4 ;ONLY 4 CHARS ALLOWED + MOVEI A,=48 + PUSHJ P,FILL + FETCH(A,D,FILP) + FETCH(A,A,FMOD) + PUSHJ P,PRINT5 ;MODULE NAME (ONLY 5 CHARS) + FETCH(A,D,PBIT) + ANDI A,QBITS + JUMPE A,NOQBIT + MOVE A,QN2L(A) + JRST GOTQ + +NOQBIT: FETCH(T,D,CBIT) + TRNE T,TERM + JRST [ MOVEI A,"T" + JRST GOTQ] + TRNN T,OUTLD ;OUTPUTS? + JRST NSMPO + FETCH(A,B,TBIT) + TRNE A,ECL + JRST NOTSHI + FETCH(A,B,WRN) + CAIE A,=19 + CAIN A,=20 + JRST NOTSHI ;NOT +3 IF ECL + CAIN A,=21 + JRST NOTSHI + TRNE F,SHI + SKIPA A,["+"] +NOTSHI: +NODEC,< MOVEI A,"S" > +DEC,< MOVEI A,"O" > +GOTQ: PUTBYT " " + PUTBYT @A + CAIN A,"C" ;CABLE? + TLOA TFLG ;YES +NSMPO: TLZ TFLG ;NO + MOVEI A,=56 + PUSHJ P,FILL + MOVE T,LOUTH + PUSHJ P,DECOUT + PUTBYT "," + MOVE T,LOUTL + IDIVI T,=10 ;DIFFERENT UNITS + PUSHJ P,DECOUT + FETCH(TT,B,TBIT) ;WIRE TYPE BITS + SETZ TTT, ;ZERO WIRE RULE NUMBER + FETCH(T,B,WBIT) + TRNN T,SPWR!SGND!SHI!SNC;DON'T CHECK FOR CLK ON THESE RUNS + TRNN TT,CLK ;CLOCK LINE? + TLNE TFLG ;IS IT CABLE? + MOVEI TTT,5 ;YES, FORCE TWISTED PAIR + TRNN TT,ECL ;ECL ON WIRE? + JRST NSMPO1 + MOVEI TTT,=19 ;WIRE RULE 19 + FETCH(TT,D,CBIT) ;GET BITS FOR THIS PIN + TRNE TT,FFOUT ;UNLESS FF OUTPUT + MOVEI TTT,=21 ;THEN ITS 21 +NSMPO1: FETCH(T,B,WRN) + IDIVI T,=100 + SKIPN TT ;IS THERE A NUMBER PART FROM DRAWING? + MOVE TT,TTT ;NO, USE POSSIBLE GENERATED ONE + FETCH(TTT,B,WBIT) ;GET WIRE TYPE BITS + TRNE TTT,SNC ;IS IT AN NC (NO CONNECTION) + TRO T,4 ;YES, TURN ON WIRE TYPE 400 TO SIMPLE FILE + IMULI T,=100 + ADD T,TT + JUMPE T,NOWRN ;DON'T PRINT 0 + PUSH P,T + PUTSTR[ASCIZ/ */] + POP P,T + PUSHJ P,DECOUT +NOWRN: CRLF +WIRW3: FETCH(D,D,NXBP) + JUMPN D,WIRW4 + POP P,B +WIRW1: FETCH(B,B,NXTB) ;DO EACH SLOT + JUMPN B,WIRW2 + OUTSTR[ASCIZ/ +/] + RELEASE LST, + SKIPN T,FACTR2 + JRST CKNX + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ POWER PINS SKIPPED. +/] +CKNX: SKIPN T,FACTR1 + POPJ P, + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ WILD PINS SKIPPED. +/] + POPJ P, + +SKPNX: AOS FACTR1 + JRST WIRW3 + +SKPVLT: AOS FACTR2 + JRST WIRW3 + +CHKGIN: SKIPL GINPIN ;DID WE RUN OUT OF NAMES? + TRNN DOGIN ;NO, ARE WE INVENTING THEM? + JRST SKPNX ;NO, SKIP PIN +NEWGIN: MOVE A,GINPIN + FETCH(T,D,PBDY) + FETCH(T,T,BLOC) + HRL A,T ;NEEDS CARD LOC FOR EXTENT + PUSHJ P,CONGIN ;INVENT NEXT NAME + JRST [ SETOM GINPIN + OUTSTR[ASCIZ/ +RAN OUT OF REAL PIN NAMES TO REPLACE "U" PIN NAMES. +/] + JRST SKPNX] + HRRZM A,GINPIN + MOVE A,(P) ;GET POINTER TO CARD BODY HEADER + FETCH(A,A,BPIN) ;START LOOKING AT PINS +NEWGN1: FETCH(T,A,PINN) + CAMN T,GINPIN ;THIS PIN IN USE ALREADY? + JRST NEWGIN ;YES, INVENT ANOTHER + FETCH(A,A,NXBP) ;LOOK AT NEXT + CAMG T,GINPIN ;HAVE WE PASSED THIS PIN'S PLACE? + JUMPN A,NEWGN1 ;NO, KEEP LOOKING +NEWGN2: MOVE E,GINPIN ;USE NEW NAME + JRST GOTGIN + +SMPSIG: SETZ C, + MOVE A,B +SMPSG1: FETCH(T,A,WBIT) + TRNN T,GLB2 + JRST SMPSG2 + JUMPE C,SMPSG3 + OUTSTR[ASCIZ/ +MULTIPLE SIGNALS REQUESTED TO GO TO SIMPLE FILE: +/] + OUTSIG ADDR(C,SPNT) + OUTSTR[ASCIZ/ +/] + OUTSIG ADDR(A,SPNT) + OUTSTR[ASCIZ/ +/] +SMPSG3: MOVE C,A +SMPSG2: FETCH(A,A,NNAM) + JUMPN A,SMPSG1 + SKIPN A,C + MOVE A,B + MOVEI T,ADDR(A,SPNT) + MOVE TT,[=22,,=24] ;22 CHARS IN NAME, USING 24 COLUMNS + TRNE F,SGND ;GROUND IS SPECIAL + JRST GNDPUT + JRST SMPPUT ;PLUS ASSERTION/POLARITY + +DIG3: SKIPGE T + PUTBYT "-" + MOVM T,T + MOVEI TT,3 + MOVEM TT,NDIG + JRST NDECOUT + +SMPVG: PUSH P,A + PUSHJ P,PINBIT ;MAP IT + TLNN TT,GND ;GROUND PIN? + JRST SMPVGE ;NO + PUTSTR[ASCIZ/ G /] + MOVE A,(P) + PUSHJ P,MAKCPN ;CONVERT TO 18 BIT FORMAT + HRL A,SLICEL + MOVE T,OFFSET + PUSHJ P,BPNPIN + MOVEI A,=40 + PUSHJ P,FILL + PUTSTR[ASCIZ/ G +/] +SMPVGE: POP P,A + POPJ P, + SUBTTL 'WDR' 'BAC' WIRE LIST BACK TO PC PROG +;WRITE ROUTER WIRE LIST FILE FOR INPUT TO PC PROG +BAKOUT: TROA ISBACK +PUTOUT: TRZ ISBACK + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE L,DEFLST + TRNE ISBACK + JRST [ FETCH(W,L,WIRL) ;ALL LISTS FOR BACKOUT + JUMPE W,[OUTSTR[ASCIZ/NO CARDS AT ALL! +/] + POPJ P,] + MOVSI T,'BAC' + JRST SETWNM] + PUSHJ P,LSTGET + POPJ P, + MOVSI T,'WDR' ;EXTENSION FOR ROUTER WIRE LIST +SETWNM: MOVEI TT,10 ;FULL WORDS + MOVSI TTT,'DSK' + PUSHJ P,OUTSET ;SETUP OUTPUT STUFF + POPJ P, ;LET HIM OUT HERE + TRNE ISBACK + JRST BAKOU0 + MOVEI TTT,WDRVER ;FIRST IDENTIFY US + PUSHJ P,WORDOUT + PUSHJ P,WLOUT + PUSHJ P,WRTZERO ;MARK END OF IT ALL + PUSHJ P,WRTZERO ;ONE MORE FOR GOOD MEASURE + RELEASE LST, + POPJ P, + +BAKOU0: MOVEI TTT,BACVER + PUSHJ P,WORDOUT +BAKFO1: FETCH(TTT,W,FCRD) + PUSHJ P,WORDOUT + FETCH(T,W,FCRD) ;CARD LOC + JUMPE T,[OUTSTR[ASCIZ/NONE/] + JRST BAKOUZ] + PUSHJ P,BRS1W +BAKOUZ: MOVEI H,RADDR(W,FILS,FNXT) + JRST BAKFO2 +BAKFO3: FETCH(TTT,H,FILN) + PUSHJ P,WORDOUT + FETCH(TTT,H,FEXT) + HRLZ TTT,TTT + PUSHJ P,WORDOUT +FOR I IN(FPPN,FDAT) +< FETCH(TTT,H,I) + PUSHJ P,WORDOUT +> +FOR I IN(FREV,FMOD,FVAR,FPRF,AUTHOR,TIT1,TIT2,FPROJ,FPAGE,FOF,FNXH) +< FETCH(T,H,I) + PUSHJ P,WSTR +> + FETCH(T,H,FNOM) + PUSHJ P,WSTR ;WRITE NOMENCLATURE TYPE + FETCH(T,H,FWWT) + PUSHJ P,WSTR ;WRITE BOARD TYPE +BAKFO2: FETCH(H,H,FNXT) + JUMPN H,BAKFO3 + PUSHJ P,WRTZERO ;END NAME BLOCKS + PUSHJ P,WLOUT + PUSHJ P,WRTZERO ;END OF RUNS + PUSHJ P,DPRINT ;COUNT PARTS AND OUTPUT COUNTS + SKIPN T,CDSKPC + JRST ALLDOK + OUTSTR[ASCIZ/, /] + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ BODIES WITH NO LOCS./] +ALLDOK: OUTSTR[ASCIZ/ +/] + FETCH(W,W,NXTWL) + JUMPN W,BAKFO1 + MOVSI TTT,400000 + PUSHJ P,WORDOUT + RELEASE LST, + POPJ P, + +WLOUT: MOVEI H,RADDR(W,WIRES,ALPH) + JRST WLOUT1 + +WLOUT2: FETCH(TT,H,WBIT) + TRNE TT,NAM2ND + JRST WLOUT1 ;SKIP FAKE WIRES + TRNN ISBACK + JRST WLOUTB + FETCH(TT,H,TBIT) + TRNN TT,ANYCON ;GET TO BACK PANEL? + JRST WLOUT1 ;SKIP RUNS WHICH DON'T MAKE IT TO BACK PANEL + TLO DOLC + TLZ BAKGAT + MOVE G,H + SETZB A,CNTTAB + MOVE T,[CNTTAB,,CNTTAB+1] + BLT T,LODTAB+LODLEN-1 + PUSHJ P,GATHER ;ACCUMULATE LOADING + PUSHJ P,LODMER ;CALC PROPER LOADING + MOVE TTT,A ;WRITE WBIT, TBIT + PUSHJ P,WORDOUT + MOVE TTT,LINL + HRL TTT,LINH + PUSHJ P,WORDOUT ;INPUT LOADING + MOVE TTT,LOUTL + HRL TTT,LOUTH + PUSHJ P,WORDOUT ;OUTPUT LOADING + FETCH(G,H,WPIN) ;GET FIRST PIN + JUMPE G,BACO1 ;SKIP IF NO PINS + FETCH(T,H,TBIT) ;TYPE BITS + TRNN T,OUTLD ;ANY OUTPUTS? + JRST BACO1 ;NO +BACO3: FETCH(T,G,PTYP) ;GET TYPE POINTER + JUMPE T,BACO4 + FETCH(T,T,DPBIT) ;GET TYPE BITS + TRNE T,OUTLD ;IS THIS AN OUTPUT + JRST [ FETCH(TT,G,FILP) ;YES, OUTPUT SOURCE PRINT + FETCH(TTT,TT,FILN) + PUSHJ P,WORDOUT ;FILENAME + FETCH(TTT,TT,FEXT) + HRLZ TTT,TTT + PUSHJ P,WORDOUT + FETCH(TTT,TT,FPPN) + PUSHJ P,WORDOUT ;PPN + JRST BACO2] +BACO4: FETCH(G,G,NXTP) + JUMPN G,BACO3 +BACO1: PUSHJ P,WRTZERO ;NO OUTPUTS, OUTPUT 0 +BACO2: TLZ TFLG ;NO GLOBALS OUT YET + MOVE G,H + FETCH(T,H,WBIT) + TRNE T,GENSIG ;IS THIS EDGE RUN UNNAMED (I.E. GENERATED NAME) + JRST WLOUTZ ;YES, WRITE NO SIGNAL NAME SO IT + ;WILL BE REGENERATED LATER WITH CARD LOC IN IT +WLOUTG: FETCH(T,G,WBIT) + TRNN T,GLB1 ;GLOBAL NAME? + JRST WLOUTH + TLO TFLG + PUSHJ P,BACSTR +WLOUTH: FETCH(G,G,NNAM) + JUMPN G,WLOUTG + TLNE TFLG + JRST WLOUTZ ;GLOBALS OUT! + JRST WLOUTC ;NO GLOBALS, OUT ALL. + +WLOUTB: FETCH(G,H,WPIN) + JUMPE G,WLOUT1 ;FLUSH NULL WIRES! +WLOUTC: MOVE G,H +WLOUT3: PUSHJ P,BACSTR + FETCH(G,G,NNAM) + JUMPN G,WLOUT3 +WLOUTZ: PUSHJ P,WRTZERO + FETCH(G,H,WPIN) ;FIRST PIN +WLOUT5: FETCH(A,G,PBDY) ;BODY POINTER + FETCH(B,A,BLOC) ;BODY LOC + FETCH(T,A,BBIT) + TRNN ISBACK + JRST WLOUTW + TRNN T,CBODY + JRST WLOUT6 + MOVE T,B + FETCH(TT,G,PINN) + PUSHJ P,CPNMER + FETCH(TTT,G,PID) ;CPIN ID + HRL TTT,T + PUSHJ P,WORDOUT ;PPS,,CPID + FETCH(TT,G,PBIT) + LDB TTT,[POINT CXPOSL,TT,35-CXPOSB] + LDB TT,[POINT CYPOSL,TT,35-CYPOSB] + DPB TT,[POINT 9,TTT,35-9] + ADDI TTT,1001 + PUSHJ P,WORDOUT + FETCH(TT,G,FILP) + FETCH(TTT,TT,FILN) + PUSHJ P,WORDOUT ;FILENAME + FETCH(TTT,TT,FEXT) + HRLZ TTT,TTT + PUSHJ P,WORDOUT + FETCH(TTT,TT,FPPN) + PUSHJ P,WORDOUT ;PPN + JRST WLOUT6 + +WLOUTW: TRNN T,CBODY ;CONNECTOR? + JRST WLOUTV ;NO + MOVE T,B + FETCH(TT,G,PINN) + PUSHJ P,CPNMER + FETCH(TTT,W,FCRD) + HRL TTT,T + PUSHJ P,WORDOUT ;WRITE IT + JRST WLOUT6 + +WLOUTV: FETCH(TTT,A,BID) + PUSHJ P,WORDOUT ;WRITE BODY ID + FETCH(TTT,G,PINN) ;PIN # +NIL,< ;IS THIS REALLY RIGHT?? **BUG** + PUSH P,A + PUSH P,B + FETCH(B,A,BPAK) ;MAP TO REAL PIN# + FETCH(A,A,BLOC) + HRL A,TTT ;PIN#,,LOC + PUSHJ P,MAPOST + JFCL + LDB TTT,[%%PINN,,A] + POP P,B + POP P,A +>;NIL + FETCH(TT,G,PTYP) ;TYPE POINTER +WLOUTX: JUMPE TT,.+3 ;WAS THERE A TYPE POINTER? + FETCH(TT,TT,DPBIT) ;TYPE BITS + HRL TTT,TT + PUSHJ P,WORDOUT ;WRITE IT + MOVE TTT,B + PUSHJ P,WORDOUT ;NLNLN +WLOUT6: FETCH(G,G,NXTP) + JUMPN G,WLOUT5 +WLOUT4: PUSHJ P,WRTZERO ;MARK END OF WIRE +WLOUT1: FETCH(H,H,ALPH) ;FOLLOW LIST + JUMPN H,WLOUT2 + POPJ P, + +BACSTR: FETCH(T,G,WBIT) + TRNN T,GLB2 ;NEED UP ARROW IN BAC FILE? + JRST [ BINSIG ADDR(G,SPNT) ;NO + POPJ P,] + BINSGU ADDR(G,SPNT) + POPJ P, + ;OUTPUT PART COUNTS TO BAC FILE +DPRINT: PUSHJ P,CLEARB + SETZM CDSKPC + MOVEI H,RADDR(W,WBDY,NXTB) + JRST DPRNT1 + +DPRNT2: FETCH(T,H,BBIT) + TRNN T,CBODY ;DON'T DO CONNECTORS + TROE T,BTMP1 + JRST DPRNT1 + MOVEM H,NBODS + STORE(T,H,BBIT) + FETCH(T,H,DIPT) + MOVEM T,LSTDIP + TRZ FLAG ;FLAG DIPTYPE NOT OUT YET +DPRNT3: MOVEM H,RBODS + FETCH(T,H,PRTN) + MOVEM T,LSTPART + FETCH(T,H,PRPX) + MOVEM T,LPRPX + SETZM TMPCN1 + SETZM TMPCN2 + SETZM LSLOT + TLZ TFLG ;FLAG NO 0 LOCS YET +DPRNT4: PUSHJ P,ACOUNT +DPRNT7: FETCH(H,H,NXTB) + JUMPE H,DPRNT6 + FETCH(T,H,BBIT) + TRNN T,CBODY + TROE T,BTMP1 + JRST DPRNT7 + FETCH(TT,H,DIPT) + CAME TT,LSTDIP + JRST DPRNT7 + FETCH(TT,H,PRTN) + CAME TT,LSTPART + JRST DPRNT7 + FETCH(TT,H,PRPX) + CAME TT,LPRPX + JRST DPRNT7 + STORE(T,H,BBIT) + JRST DPRNT4 + +DPRNT6: PUSHJ P,ACNT7 ;FIX SECTION COUNT TO APPROX DIP COUNT + TROE FLAG + JRST DPRNP1 + SKIPN T,LSTDIP + JRST [ MOVEI T,[0 + ASCIZ\N/A\] + JRST .+2] + FETCH(T,T,DNAM) + PUSHJ P,WSTR ;WRITE STRING +DPRNP1: TLNN TFLG + TDZA TTT,TTT + MOVE TTT,TMPCN2 + PUSHJ P,WORDOUT + MOVE TTT,TMPCN1 + PUSHJ P,WORDOUT + SKIPN H,LSTPART + JRST DPRNP3 +;NOTE, HERE WE WRITE ACTUAL PART NUMBER SO ERROR WILL OCCUR IF CHANGED +DPRNP2: FETCH(T,H,PRNB) + FETCH(T,T,PRNS) + PUSHJ P,WSTR + FETCH(T,H,PRVS) + PUSHJ P,WSTR + FETCH(H,H,PRPP) + JUMPN H,DPRNP2 +DPRNP3: SKIPN H,LPRPX + JRST DPRNP5 +DPRNP4: FETCH(T,H,TLFT) + PUSHJ P,WSTR + FETCH(T,H,TRHT) + PUSHJ P,WSTR + FETCH(H,H,NXTT) + JUMPN H,DPRNP4 +DPRNP5: PUSHJ P,WRTZERO + MOVE H,RBODS +DPRNT8: FETCH(H,H,NXTB) + JUMPE H,DPRNT5 + FETCH(T,H,BBIT) + TRNN T,CBODY + TROE T,BTMP1 + JRST DPRNT8 + FETCH(TT,H,DIPT) + CAME TT,LSTDIP + JRST DPRNT8 + STORE(T,H,BBIT) + JRST DPRNT3 + +DPRNT5: MOVNI TTT,1 + TRNE FLAG + PUSHJ P,WORDOUT ;MARK END OF DIPTYPE + MOVE H,NBODS +DPRNT1: FETCH(H,H,NXTB) + JUMPN H,DPRNT2 + JRST WRTZERO + +ACOUNT: FETCH(T,H,BLOC) + JUMPE T,[TLO TFLG ;FLAG NO LOC FOR SOME BODIES + AOS CDSKPC ;AND COUNT EACH ONE + JRST ACNT1] + CAME T,LSLOT + AOS TMPCN1 ;COUNT EACH LOC ONCE + MOVEM T,LSLOT +ACNT1: SETZB F,FACTR1 ;ACCUMULATE COUNT AND SECT BITS HERE + MOVEI G,RADDR(H,BPIN,NXBP) + JRST ACNT5 + +ACNT6: FETCH(TT,G,PTYP) ;TYPE POINTER + JUMPE TT,ACNT5 + FETCH(TTT,TT,DPBIT) ;BITS + TRNN TTT,INLD!OUTLD!TERM ;ONLY INPUTS OR OUTPUTS + JRST ACNT5 + FETCH(TT,TT,SCTB) ;SECTION BITS + MOVS TT,TT ;TO LEFT HALF + JFFO TT,.+2 ;(1 SEC/DIP WORKS RIGHT) + JRST ACNT5 + MOVE TTT,SCTTAB(TTT) ;GET THE BIT + TDOE TTT,FACTR1 ;TURN ON NEW BIT AND TEST + JRST ACNT5 ;ALREADY ON, DON'T COUNT AGAIN + MOVEM TTT,FACTR1 + ADDI F,1 ;INC COUNT +ACNT5: FETCH(G,G,NXBP) + JUMPN G,ACNT6 + ADDM F,TMPCN2 + POPJ P, + +ACNT7: SKIPE A,TMPCN2 + SKIPN H,LSTDIP + POPJ P, + PUSHJ P,SECCAL ;CALC SEC/DIP (RETURNS IN F) + ADDI A,(F) + IDIVI A,1(F) ;CALC DIPS + MOVEM A,TMPCN2 + POPJ P, + SUBTTL 'WSS' 'WCS' REFERENCE LISTINGS +SIGCOM: TROA CONLY +DOREF: TRZ CONLY + TRZ ISBACK + MOVE T,[PUSHJ P,TTYIN] + MOVEM T,GETCHR + MOVE L,DEFLST + FETCH(E,L,WIRL) + JUMPE E,[NCRDS:OUTSTR[ASCIZ/NO CARDS, YOU DUMMY! +/] + POPJ P,] + TRNE CONLY + JRST [CRDS1:FETCH(T,E,NXTWL) + JUMPE T,[OUTSTR[ASCIZ/HOW MANY INTERCONNECTIONS DO YOU EXPECT BETWEEN ONE CARD? +/] + POPJ P,] + MOVSI T,'WCS' ;CONNECTOR NEEDED LISTING + JRST .+2] + MOVSI T,'WSS' ;REFERENCE LISTING + MOVEI TT,0 ;DATA MODE 0 + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + MOVEI T,WSSMAR + MOVEM T,MARGIN + SETZM REFLST + HRROS REFLST +DOREF1: FETCH(F,E,HASHTB) ;GENLAST + FETCH(F,F,ALPH) ;FIRST REAL NAME (NOTE WE ASSUME FIRST NAME IN LIST HAS SIG1 ON) + JUMPE F,DOREF0 + GETFS(G,TBLK) + STORE(F,G,TRHT) ;STORE SIGNAL NAME BLOCK POINTER HERE + FETCH(T,E,FCRD) ;CARD LOC + STORE(T,G,TLFT) + PUSHJ P,SORTIN + JFCL + JFCL +DOREF0: FETCH(E,E,NXTWL) ;NEXT CARD + JUMPN E,DOREF1 ;SORT THEM ALL IN +DOREF2: HRRZ H,REFLST ;FIRST NAME + JUMPE H,DOREFE ;DONE? + HLLZS REFLST ;CLEAR LIST + TRNN CONLY ;ONLY SOME SIGNALS? + JRST NCONLY + MOVE G,H + SETZ TT, ;CLEAR BIT HOLDERS +CSET1: FETCH(T,G,TVAL) ;ORDER # + JUMPN T,CSET3 ;NO CONNECTIONS FOUND YET, I GIVE UP + FETCH(TTT,G,TRHT) ;WIRE HEAD POINTER + FETCH(T,TTT,WBIT) ;WIRE BITS + TRNE T,NAM2ND + FETCH(TTT,TTT,WPIN) + FETCH(T,TTT,TBIT) + TRNN T,ANYCON ;DOES IT GET TO BACK PANEL + JRST [ TRNN T,OUTLD + JRST [ TRNN T,INLD + JRST CSET2 ;NO IN, OUT, OR CONS + TLNN TT,OUTLD ;ANY OUTPUTS ON OTHER CARDS? + TRNE TT,OUTLD ;OR BACK PANEL + JRST NCONLY ;YES, DO IT + TLO TT,INLD ;INPUT ONLY ON CARD + JRST CSET2] + TLNE TT,INLD + JRST NCONLY + TLO TT,OUTLD ;HAVE OUTPUT ON CARD + JRST CSET2] + TRNN T,OUTLD + JRST [ TRNE T,INLD + TRO TT,INLD ;INPUT ON BACKPANEL + JRST CSET2] + TRO TT,OUTLD + TLNE TT,INLD ;INPUT ON CARD? + JRST NCONLY ;YES, PRINT +CSET2: FETCH(G,G,NXTT) + JUMPN G,CSET1 +CSET3: TRNE TT,INLD ;INPUT ON BACKPANEL? + TRNE TT,OUTLD ;AND NO OUTPUT + JRST CRFSKP ;NO + TLNN TT,OUTLD ;AND OUTPUT ON CARD? + JRST CRFSKP ;NO +NCONLY: SKIPL LINCNT + PUSHJ P,RHDR + FETCH(A,H,TRHT) ;SIGNAL NAME BLOCK + SETZM TCOUNT + PUTSIG ADDR(A,SPNT) ;PRINT SIGNAL NAME + MOVE G,H + JRST DOREFW ;DO REST OF EQUIVALENTS FOR THIS WIRE, THEN REST OF CARDS + +DOREFY: FETCH(T,G,TVAL) ;ORDER # + JUMPN T,DOREF3 + FETCH(A,G,TRHT) ;SIGNAL NAME BLOCK +DOREFZ: PUTCOM ADDR(A,SPNT) ;PUT OUT COMMENT AT END OF NAME +DOREFW: FETCH(A,A,NNAM) + JUMPE A,DOREFX ;QUIT IF END THIS WIRE + FETCH(T,A,WBIT) + TRNN T,SIG1 ;ALSO IF WE GET TO NEW FIRST NAME (CAN'T BE EQUIVALENT) + JRST DOREFZ +DOREFX: FETCH(G,G,NXTT) + JUMPN G,DOREFY +DOREF3: MOVE T,TCOUNT + CAIL T,=16 + JRST [ CRLF + PUTSTR[ASCIZ/ /] + JRST WASSIG] + PUTBYT 11 + CAIGE T,8 + PUTBYT 11 +WASSIG: FETCH(T,H,TLFT) ;BAY-RACK-SLOT + HRLZM T,SLICEL + SKIPE SLICEL + PUSHJ P,PSLICL + PUTBYT 11 + FETCH(G,H,TRHT) ;SIGNAL NAME BLOCK + SETZM TCOUNT + PUSHJ P,ONECRD ;PUT OUT LINE(S) FOR ONE CARD + SETZM TCOUNT ;FLAG AT LEFT MARGIN + PUSHJ P,REFRET + JUMPE H,DOREF2 ;ALL GONE, GO AGAIN + FETCH(T,H,TVAL) + JUMPE T,DOREF3 +DOREF6: MOVEI B,REFLST ;ALL 0'S GONE, RE-SORT THE REST + HRRZ C,REFLST +DOREF5: MOVE G,H + FETCH(H,H,NXTT) + PUSHJ P,MERGIN ;MERGE INTO LIST + JRST CPYRST ;WENT AT END, COPY THE REST + JRST MERNUM ;EQV, DO REST + +CRFSKP: PUSHJ P,REFRET + JUMPE H,DOREF2 + FETCH(T,H,TVAL) + JUMPE T,CRFSKP + JRST DOREF6 + +DOREFE: RELEASE LST, + POPJ P, + +ONECRD: FETCH(E,G,WBIT) + TRNE E,NAM2ND + FETCH(G,G,WPIN) + FETCH(E,G,TBIT) + SETZB A,LODTAB + MOVE T,[LODTAB,,LODTAB+1] + BLT T,LODTAB+LODLEN-1 + TLO DOLC + TLZ BAKGAT + PUSH P,G + PUSHJ P,GATHER + PUSHJ P,LODMER ;CALC PROPER LOADING + POP P,G + MOVE T,LINL + PUSHJ P,LDOUT + PUTBYT 11 + MOVE T,LINH + PUSHJ P,LDOUT + PUTBYT 11 + SKIPN NOUT + JRST [ TRNE E,GND + JRST [ PUTSTR[ASCIZ/GND /] + JRST NTOUT] + TRNN E,PWR + JRST .+1 + SKIPLE T,PVOLTS + PUTBYT "+" + PUSHJ P,LDOUT + PUTSTR[ASCIZ/ VOLTS/] + JRST NTOUT] + MOVE T,LOUTL + PUSHJ P,LDOUT + PUTBYT 11 + MOVE T,LOUTH + PUSHJ P,LDOUT +NTOUT: FETCH(G,G,WPIN) ;FIRST PIN + JUMPE G,[PUTSTR[ASCIZ/ NO PINS/] + JRST NTPINS] + SETZ F, ;CLEAR FILE LIST +FSET1: FETCH(D,G,PBDY) + FETCH(D,D,BBIT) ;BODY BITS + FETCH(T,G,FILP) ;FILE NAME POINTER + MOVEI B,F+ADDR(0,NXTC) + JRST FSET2 + +FSET3: FETCH(TTT,B,CFIL) + FETCH(TTT,TTT,FILN) + CAMG TTT,ADDR(T,FILN) + JRST [ CAME TTT,ADDR(T,FILN) + JRST FSET4 + MOVE C,B + JRST FSET5] +FSET2: MOVE A,B + FETCH(B,B,NXTC) + JUMPN B,FSET3 +FSET4: GETFS(C,CBLK) + BCLEAR(TT,C,CBLK) + STORE(C,A,NXTC) + STORE(B,C,NXTC) + STORE(T,C,CFIL) +FSET5: TRNN ISBACK ;BACK PANEL? + JRST FSET7 ;NO + FETCH(TT,C,ICNT) + ADDI TT,1 ;COUNT A PIN + STORE(TT,C,ICNT) + JRST FSETE + +FSET7: TRNN D,CBODY ;CON? + JRST FSET6 + FETCH(TT,C,CCNT) + ADDI TT,1 + TRNN D,BWILD ;FRONT? + TROA TT,400000 ;YES + TRO TT,200000 ;NO + STORE(TT,C,CCNT) + JRST FSETE + +FSET6: FETCH(T,G,PTYP) + JUMPE T,FSETE + FETCH(T,T,DPBIT) + TRNE T,OUTLD + JRST [ FETCH(T,C,OCNT) + ADDI T,1 + STORE(T,C,OCNT) + JRST FSETE] + TRNE T,TERM + JRST [ FETCH(TT,C,ZCNT) + ADDI TT,1 + STORE(TT,C,ZCNT) + JRST FSETE] + FETCH(T,C,ICNT) + ADDI T,1 + STORE(T,C,ICNT) +FSETE: FETCH(G,G,NXTP) ;NEXT PIN OF WIRE + JUMPN G,FSET1 + SETOM FACTR1 + MOVE G,F + TRNE ISBACK + JRST NTABB +NTABA: FETCH(T,G,OCNT) + SKIPE T ;FIRST PRINT DRAWING NAMES WITH OUTPUTS + PUSHJ P,NTAB + FETCH(G,G,NXTC) + JUMPN G,NTABA +NTABB: MOVE G,F +NTABC: FETCH(T,G,OCNT) + TRNN ISBACK ;THIS IS ONLY LOOP FOR BACK PANEL + SKIPN T ;FOR CARDS NOW WE DO ONES WITHOUT OUTPUTS + PUSHJ P,NTAB + MOVE A,G + FETCH(G,G,NXTC) + FSTRET(A,CBLK) + JUMPN G,NTABC +NTPINS: CRLF + POPJ P, + +NTAB: AOS T,FACTR1 + CAIGE T,4 + JRST NTAB1 + SETZM FACTR1 + CRLF + PUTSTR[ASCIZ/ /] +NTAB1: PUTBYT 11 + FETCH(A,G,CFIL) + SETZM TCOUNT + PUTSIX ADDR(A,FILN) + TRNN ISBACK + JRST NTAB2 + PUTBYT 11 + FETCH(T,G,ICNT) + JRST DECOUT + +NTAB2: MOVE T,TCOUNT + SUBI T,6 + PUTBYT " " + AOJLE T,.-1 + FETCH(T,G,ICNT) + PUSHJ P,DECOUT + PUTBYT "," + FETCH(T,G,OCNT) + PUSHJ P,DECOUT + FETCH(T,G,ZCNT) + JUMPE T,NOZPNT + PUTBYT "Z" + CAIE T,1 + PUSHJ P,DECOUT +NOZPNT: FETCH(T,G,CCNT) + TRZE T,200000 ;WILD? + JRST [ TRZE T,400000 + JRST [ PUTBYT BWAROW + CAILE T,2 + JRST DECOUT + POPJ P,] + PUTBYT WLDCHR + JRST ISBCON] + TRZN T,400000 ;FRONT? + POPJ P, + PUTBYT "_" +ISBCON: CAIE T,1 ;DON'T PRINT IN THIS CASE + JRST DECOUT + POPJ P, + +REFRET: MOVE G,H + FETCH(H,H,NXTT) + FETCH(T,G,TRHT) ;SIGNAL BLOCK POINTER +REFRT1: FETCH(T,T,ALPH) + JUMPE T,[FSTRET(G,TBLK) ;END OF LIST, GIVE BACK BLOCK + POPJ P,] + FETCH(TT,T,WBIT) + TRNN TT,SIG1 ;FIRST EQUIVALENT SIGNAL? + JRST REFRT1 ;NO, TRY ANOTHER + STORE(T,G,TRHT) + PUSHJ P,SORTIN ;SORT NEXT STRING INTO NEW LIST + JFCL + POPJ P, + ; SORT SUBRS +MERNM1: FETCH(T,H,TVAL) + CAME T,FACTR1 ;STILL SAME OLD ORDER #? + JRST DOREF5 + MOVE T,FACTR2 + STORE(T,H,TVAL) + MOVE G,H + FETCH(H,H,NXTT) + FETCH(TTT,G,TLFT) +MERNM2: JUMPE C,MERNM3 + FETCH(T,C,TVAL) ;ORDER # + CAME T,FACTR2 ;ONE OF THIS GROUP? + JRST MERNM3 ;NO + FETCH(T,C,TLFT) + CAML T,TTT + JRST MERNM3 + MOVE B,C + FETCH(C,C,NXTT) + JUMPN C,MERNM2 +MERNM3: STORE(C,G,NXTT) + STORE(G,B,NXTT) + MOVE B,G +MERNUM: JUMPN H,MERNM1 + JRST DOREF2 + +CPYRST: STORE(H,G,NXTT) ;LINK REST ONTO END + JUMPE H,DOREF2 +DOREF7: FETCH(T,H,TVAL) ;NOW SET NEW ORDER #'S + CAMN T,FACTR1 + JRST DOREF8 + MOVEM T,FACTR1 + AOSA T,FACTR2 +DOREF8: MOVE T,FACTR2 + STORE(T,H,TVAL) + FETCH(H,H,NXTT) + JUMPN H,DOREF7 + JRST DOREF2 + +MERGIN: FETCH(T,G,TVAL) + MOVEM T,FACTR1 + JRST SORTN2 + +SORTIN: MOVEI C,REFLST + FETCH(T,G,TVAL) + MOVEM T,FACTR1 +SORTN1: MOVE B,C + FETCH(C,C,NXTT) +SORTN2: JUMPE C,PUTHER + FETCH(TT,C,TRHT) + MOVEI TT,ADDR(TT,SCMP) + FETCH(T,G,TRHT) + MOVEI T,ADDR(T,SCMP) + PUSHJ P,ALPHA + JRST PUTHER + JRST SORTN1 ;NOT THERE YET + JFCL ;EQUIVALENT + JFCL ;EQUIVALENT + FETCH(T,C,TVAL) ;EQUAL + MOVEM T,FACTR2 + STORE(T,G,TVAL) + FETCH(TTT,G,TLFT) + JRST SORTN9 + +SORTN3: MOVE B,C + FETCH(C,C,NXTT) +SORTN9: JUMPE C,SORTN8 + FETCH(TT,C,TVAL) + CAME TT,T + JRST SORTN8 + FETCH(TT,C,TLFT) + CAMGE TT,TTT + JRST SORTN3 + STORE(G,B,NXTT) + STORE(C,G,NXTT) + MOVE B,G + JRST CPOPJ1 + +SORTN8: STORE(G,B,NXTT) + STORE(C,G,NXTT) + MOVE B,G + SKIPN C ;IF THIS IS 0 + POPJ P, ;THEN WE ARE AT REAL END + JRST CPOPJ1 + +PUTHER: FETCH(T,B,TVAL) + ADDI T,1 + MOVEM T,FACTR2 + STORE(T,G,TVAL) + STORE(G,B,NXTT) + STORE(C,G,NXTT) + MOVE B,G + JUMPE C,CPOPJ ;AT END + MOVE A,C +SORTN5: FETCH(T,A,TVAL) + ADDI T,1 + STORE(T,A,TVAL) + FETCH(A,A,NXTT) + JUMPN A,SORTN5 + JRST CPOPJ1 + +RHDR: TLZN NOFF + PUTSTR[BYTE(7)15,14] + MOVN TTT,PAGLEN + ADD TTT,MARGIN + MOVEM TTT,LINCNT + TRNE CONLY + JRST RHDR3 + PUTSTR[ASCIZ/REF LISTING/] + JRST RHDR2 + +RHDR3: PUTSTR[ASCIZ/CONNECTORS NEEDED/] +RHDR2: FETCH(A,L,WLNM) + JUMPE A,RHDR1 + PUTSTR[ASCIZ/ FOR /] + PUSHJ P,STROUT ;PRINT WIRE LIST NAME +RHDR1: PUSHJ P,PNTFDT + PUTSTR[ASCIZ/ +SIGNAL NAME + CARD LOW IN HI IN LOW OUT HI OUT FILNAM #I,#O Z# C# + +/] + POPJ P, + SUBTTL 'WLC' COMPARE 2 WIRE LISTS +WDECO: TRZ PCNOTD + OUTSTR[ASCIZ/ID OF "OLD" WIRELIST?/] + PUSHJ P,FNDID + POPJ P, + JRST NOID + HRLZM L,GOODW + OUTSTR[ASCIZ/ID OF "NEW" WIRELIST?/] + PUSHJ P,FNDID + POPJ P, + JRST NOID + HRLZM L,BADW + MOVE L,BADW + CAME L,GOODW + JRST WDECOA + OUTSTR [ASCIZ /SORRY, CAN'T COMPARE A WIRELIST TO ITSELF. +/] + POPJ P, + +WIRCOM: TRO PCNOTD + MOVE L,DEFLST + HRLZM L,GOODW + HRLZM L,BADW +WDECOA: HLRZ L,GOODW + FETCH(W,L,WIRL) + PUSHJ P,LSTGT0 + POPJ P, + HRRM W,GOODW + HLRZ L,BADW + FETCH(W,L,WIRL) + TRNE PCNOTD + FETCH(W,L,PCWL) + JUMPE W,NXCRD1 + HRLM W,(P) + PUSHJ P,GETLOP ;TRY TO FIND SAME CARD IN OTHER WIRELIST + CAIA + JRST WDECOK + OUTSTR[ASCIZ/SAME CARD NOT FOUND IN /] + TRNE PCNOTD + OUTSTR[ASCIZ/PC/] + FETCH(A,L,WLID) + TRNN PCNOTD + JRST [ OUTCHR [42] + PUSHJ P,STRTTY + OUTCHR[42] + JRST .+1] + OUTSTR[ASCIZ/ WIRELIST. +/] + HLRZ W,(P) + PUSHJ P,LSTGT0 + JRST NXCRD1 +WDECOK: HRRM W,BADW + TRNN PCNOTD + JRST [ MOVSI T,'WDC' + JRST WDECO1] + PUSHJ P,FIXDIP ;TRY TO COPY DIP TYPES ACROSS + MOVSI T,'WLC' ;ERROR LISTING FOR WIRE LIST COMPARISON +WDECO1: MOVEI TT,0 ;DATA MODE 0 + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + TRNN PCNOTD ;FOR PC CARDS + JRST WDECO2 + HRRZ W,GOODW + PUSHJ P,FILLST ;PUT OUT DRAWING FILE HEADER + CHDR + PUSHJ P,DOWLD ;PUT A WLD IN THE FRONT OF THIS FILE + JRST WDECO3 + +WDECO2: HRRZ W,GOODW ;FOR D, PUT OUT BOTH FILE HEADERS + PUSHJ P,FILLST + CHDRO + HRRZ W,BADW + PUSHJ P,FILLST + CHDRN +WDECO3: HRRZ W,GOODW + PUSHJ P,CLEARW + HRRZ W,BADW + PUSHJ P,CLEARW + TRNN PCNOTD + SKIPA T,[[ASCIZ/ RUNS WITH CHANGES +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS ADD DELETE/]] + MOVEI T,[ASCIZ/ WIRES WITH SHORTS OR OPENS +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS SHORT OPEN/] + MOVEM T,HEADER + SETZM LINCNT + MOVEI T,WCIMAR + MOVEM T,MARGIN + HRRZ W,GOODW + MOVEI W,RADDR(W,WIRES,ALPH);WIRES + JRST WIRCM2 + +WIRCM3: FETCH(T,W,WBIT) + TRNE T,NAM2ND!WNULL ;WNULL WILL BE HONEST IF NAM2ND IS OFF + JRST WIRCM2 ;SKIP FAKE WIRES + SETZM MSINGL ;CLEAR 1 PIN RUN MATCH + FETCH(T,W,TBIT) + FETCH(H,W,WPIN) + TRNN T,OUTLD ;ANY OUTPUTS + JRST CONFN0 +OUTFN2: FETCH(T,H,PBIT) + TRNE T,DUP + JRST OUTFN1 + FETCH(T,H,PTYP) + JUMPE T,OUTFN1 + FETCH(T,T,DPBIT) + TRNE T,OUTLD ;OUTPUT PIN? + PUSHJ P,PINFNH ;TRY TO FIND IN BADW + JRST OUTFN1 ;LOSE + JRST ISLINK ;THIS IS IT + +OUTFN1: FETCH(H,H,NXTP) + JUMPN H,OUTFN2 + FETCH(H,W,WPIN) + FETCH(T,W,TBIT) +CONFN0: TRNN T,ANYCON + JRST INFN0 +FNCON2: FETCH(T,H,PBIT) + TRNE T,DUP + JRST FNCON1 + FETCH(T,H,PBDY) + FETCH(T,T,BBIT) + TRNN T,BWILD + TRNN T,CBODY + JRST FNCON1 + PUSHJ P,PINFNH + JRST FNCON1 + JRST ISLINK + +FNCON1: FETCH(H,H,NXTP) + JUMPN H,FNCON2 + FETCH(H,W,WPIN) + FETCH(T,W,TBIT) +INFN0: TRNN T,INLD + JRST UNFN2 +INFN2: FETCH(T,H,PBIT) + TRNE T,DUP + JRST INFN1 + FETCH(T,H,PTYP) + JUMPE T,INFN1 + FETCH(T,T,DPBIT) + TRNE T,INLD + PUSHJ P,PINFNH + JRST INFN1 + JRST ISLINK + +INFN1: FETCH(H,H,NXTP) + JUMPN H,INFN2 + FETCH(H,W,WPIN) +UNFN2: FETCH(T,H,PBIT) + TRNE T,DUP + JRST UNFN1 + PUSHJ P,PINFNH + JRST UNFN1 + JRST ISLINK + +UNFN1: FETCH(H,H,NXTP) + JUMPN H,UNFN2 + TRNE PCNOTD ;IF COMPARING PC TO DRW, + JRST WIRCM2 ;THEN ONLY SEE WIRES + SKIPE MSINGL ;DID WE FIND SINGLE PIN MATCH? + JRST ISLNKS ;YES, GO USE IT +WIRCM2: FETCH(W,W,ALPH) + JUMPN W,WIRCM3 + HRRZ W,GOODW + MOVEI G,RADDR(W,WIRES,ALPH) + TRNN PCNOTD + SKIPA T,[[ASCIZ/ DELETED RUNS +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS/]] + MOVEI T,[ASCIZ/ MISSING WIRES +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS/] + MOVEM T,HEADER + SETZM LINCNT + MOVEI T,WCWMAR + MOVEM T,MARGIN + JRST WIRCM6 + +WIRCM4: FETCH(F,G,WBIT) + TRNE F,NAM2ND!WNULL!WSINGL + JRST WIRCM6 ;ALWAYS SKIP FAKE HEADERS, NULLS, AND SINGLES + TROE F,WTMP1 ;RUN COMPARED YET? + JRST WIRCM6 ;YES + STORE(F,G,WBIT) ;STORE WITH BIT SET + PUSHJ P,CCHK + PUTSIG ADDR(G,SPNT) + FETCH(E,G,WPIN) +WIRCM8: PUSHJ P,PINPNT + CRLF + FETCH(E,E,NXTP) + JUMPN E,WIRCM8 +WIRCM6: FETCH(G,G,ALPH) + JUMPN G,WIRCM4 + HRRZ W,BADW + MOVEI G,RADDR(W,WIRES,ALPH) + TRNN PCNOTD + SKIPA T,[[ASCIZ/ ADDED RUNS +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS/]] + MOVEI T,[ASCIZ/ EXTRA WIRES +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS/] + MOVEM T,HEADER + SETZM LINCNT + MOVEI T,WCWMAR + MOVEM T,MARGIN + JRST WIRCN6 + +WIRX2: TLO TFLG ;NAME NOT OUT YET + PUSHJ P,ISLNKX + JRST WIRCN6 + +WIRCN4: FETCH(A,G,WBIT) + TRNE A,NAM2ND!WNULL!WSINGL + JRST WIRCN6 ;ALWAYS SKIP FAKE HEADERS, NULLS, AND SINGLES + TRNN PCNOTD + JRST WIRCN7 ;SKIP TESTS IF BOTH WD FILES + TRNE A,SPWR!SGND + JRST WIRX2 ;IS GND OR PWR +WIRCN7: TROE A,WTMP1 ;MATCHED ALREADY? + JRST WIRCN6 ;YES + STORE(A,G,WBIT) + pushj p,cchk + PUTSIG ADDR(G,SPNT) + FETCH(E,G,WPIN) +WIRCN8: PUSHJ P,PINPNT + CRLF + FETCH(E,E,NXTP) + JUMPN E,WIRCN8 +WIRCN6: FETCH(G,G,ALPH) + JUMPN G,WIRCN4 + HRRZ W,GOODW + MOVEI G,RADDR(W,WIRES,ALPH) + TRNN PCNOTD + SKIPA T,[[ASCIZ/ DELETED PINS +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS/]] + MOVEI T,[ASCIZ/ LONESOME PINS FROM LOGIC DRAWING +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS/] + MOVEM T,HEADER + SETZM LINCNT + MOVEI T,WCLMAR + MOVEM T,MARGIN + JRST WIRCO6 + +WIRCO4: FETCH(F,G,WBIT) + TRNE F,WSINGL + TRNE F,NAM2ND!WNULL + JRST WIRCO6 ;SKIP FAKE WIRES AND NULLS AND NON SINGLES + TROE F,WTMP1 + JRST WIRCO6 ;DONE ALREADY + STORE(F,G,WBIT) + pushj p,cchk + PUTSIG ADDR(G,SPNT) + FETCH(E,G,WPIN) + PUSHJ P,PINPNT + CRLF +WIRCO6: FETCH(G,G,ALPH) + JUMPN G,WIRCO4 + TRNE PCNOTD + JRST WDECON + HRRZ W,BADW + MOVEI G,RADDR(W,WIRES,ALPH) + MOVEI T,[ASCIZ/ ADDED PINS +SIGNAL NAME + LOC(PIN#) TYPE USE DIPTYPE BODY FILE POS/] + MOVEM T,HEADER + SETZM LINCNT + MOVEI T,WCLMAR + MOVEM T,MARGIN + JRST WIRCP6 + +WIRCP4: FETCH(F,G,WBIT) + TRNE F,WSINGL + TRNE F,NAM2ND!WNULL + JRST WIRCP6 ;SKIP FAKE WIRES AND NULLS AND NON SINGLES + TROE F,WTMP1 + JRST WIRCP6 ;DONE ALREADY + STORE(F,G,WBIT) + pushj p,cchk + PUTSIG ADDR(G,SPNT) + FETCH(E,G,WPIN) + PUSHJ P,PINPNT + CRLF +WIRCP6: FETCH(G,G,ALPH) + JUMPN G,WIRCP4 + JRST WDECOE + +WDECON: MOVEI T,[ASCIZ/PWR OR GND PINS NOT WIRED TO PWR OR GND ON PC CARD +LOC(PIN#) TYPE USE DIPTYPE FILE SIGNAL/] + MOVEM T,HEADER + SETZM LINCNT + MOVEI T,WCLMAR + MOVEM T,MARGIN + HRRZ W,BADW + MOVEI W,RADDR(W,WBDY,NXTB) + JRST WIRVG1 + +WIRVG2: FETCH(T,W,DIPT) + JUMPE T,WIRVGA ;ANY DIP TYPE? + MOVEI E,RADDR(W,BPIN,NXBP) + JRST WIRVG3 + +WIRVG4: FETCH(A,E,PTYP) + JUMPE A,WIRVG3 + FETCH(TT,A,DPBIT) + TRNE TT,PWR!GND + JRST WIRVGC +WIRVG3: FETCH(E,E,NXBP) + JUMPN E,WIRVG4 + JRST WIRVG1 + +WIRVGE: PUSHJ P,PINVG + JRST WIRVG3 + +PINVG: PUSHJ P,CCHK + PUSHJ P,PINVGP +PINVGC: PUTBYT 11 + FETCH(A,E,HPNT) + PUTSIG ADDR(A,SPNT) + CRLF + POPJ P, + +WIRVGC: FETCH(T,E,HPNT) + FETCH(T,T,WBIT) + TRNN T,SPWR!SGND + JRST WIRVGE + TRNN TT,PWR + JRST WIRVGD + TRNN T,SPWR + JRST WIRVGE + JRST WIRVG3 + +WIRVGD: TRNN T,SGND + JRST WIRVGE + JRST WIRVG3 + +WIRVGA: + SKIPN ISWW + JRST WIRVG1 + FETCH(T,W,BBIT) + TRNN T,BWILD + TRNN T,CBODY + JRST WIRVG1 ;NO + FETCH(F,W,BLOC) + TLO F,MAPCON + MOVEI E,RADDR(W,BPIN,NXBP) + JRST WIRVGX + +WIRVGY: MOVE A,F + FETCH(TT,E,PINN) + HRLI A,MAPCON(TT) + PUSHJ P,PINBIT + TLNN TT,PWR!GND + JRST WIRVGX + FETCH(T,E,HPNT) + FETCH(T,T,WBIT) + TRNN T,SPWR + JRST WIRVGW + TLNE TT,PWR + JRST WIRVGX + JRST WIRVGZ + +WIRVGW: TRNE T,SGND + TLNE TT,GND + JRST WIRVGX +WIRVGZ: HLLM TT,(P) + PUSHJ P,CCHK + PUSHJ P,PINPNF + HLRZ TT,(P) + TRNE TT,PWR + PUTBYT PWRCHR + TRNE TT,GND + PUTBYT GNDCHR + PUSHJ P,WASCON + PUSHJ P,PINVGC +WIRVGX: FETCH(E,E,NXBP) + JUMPN E,WIRVGY +WIRVG1: FETCH(W,W,NXTB) + JUMPN W,WIRVG2 +WDECOE: RELEASE LST, + POPJ P, + +ISLNKS: HLRZ H,MSINGL ;GET PIN WE MATCHED + HRRZ F,MSINGL ;GET ITS MATCH + FETCH(G,F,HPNT) ;GET ITS WIRE HEADER +ISLINK: FETCH(T,W,WBIT) + TRO T,WTMP1 ;MARK RUN MATCHED + STORE(T,W,WBIT) + TRC T,WSINGL!GENSIG + TRCE T,WSINGL!GENSIG ;BUT DON'T MARK NEW RUN IF OLD IS SINGLE GENSIG + JRST ISLNK6 + FETCH(TT,G,WBIT) + TRNN TT,WSINGL ;GO AHEAD WITH SINGLES + JRST WIRCM2 ;MULTIPLE PIN RUNS WILL MATCH OTHER RUNS, OR BE ADDS LATER +ISLNK6: TLO TFLG ;NO SIGNAL NAME OUT YET + MOVE A,W + PUSHJ P,CLEARA ;CLEAR PRINT BITS + MOVE A,G + PUSHJ P,CLEARA ;ON BOTH WIRES + MOVE TT,H + PUSHJ P,PTSETA ;MARK AS MATCHED, BUT NOT PRINTED + MOVE TT,F + PUSHJ P,PTSETB ;MARK AS PRINTED AND MATCHED ALREADY + TRNE PCNOTD + JRST ISLNK0 + FETCH(T,W,WBIT) + TRNE T,GENSIG + JRST [ FETCH(T,G,WBIT) + TRNN T,GENSIG + JRST .+1 + JRST ISLNK0] ;DON'T COMPARE SIGNAL NAMES IF BOTH GENERATED + MOVE H,W + MOVE F,G +ECOSIG: JUMPE H,[JUMPE F,ECOSG1 + JRST CKADD] + JUMPE F,CKDEL + MOVEI T,ADDR(H,SCMP) + MOVEI TT,ADDR(F,SCMP) + PUSHJ P,ALPHA + JRST CKDEL + JRST CKADD + JRST CKDEL + JRST CKADD + FETCH(T,H,WBIT) + TRO T,WTMP1 + STORE(T,H,WBIT) + FETCH(H,H,NNAM) + FETCH(T,F,WBIT) + TRO T,WTMP1 + STORE(T,F,WBIT) + FETCH(F,F,NNAM) + JRST ECOSIG + +CKADD: FETCH(T,F,WBIT) + TRZ T,WTMP1 ;CLEAR BIT IN CASE WE HAVE BEEN THROUGH HERE BEFORE + STORE(T,F,WBIT) + FETCH(F,F,NNAM) + JRST ECOSIG + +CKDEL: TLZN TFLG + JRST CKDEL1 + pushj p,cchk +CKDEL1: PUTSIG ADDR(H,SPNT) + MOVEI A,=72 + PUSHJ P,FILL + PUTSTR[ASCIZ/ D/] + CRLF + FETCH(T,H,WBIT) + TRO T,WTMP1 + STORE(T,H,WBIT) + FETCH(H,H,NNAM) + JRST ECOSIG + +ECOSG1: MOVE F,G +ECOSG2: FETCH(T,F,WBIT) + TROE T,WTMP1 + JRST ECOSG3 + STORE(T,F,WBIT) + TLZN TFLG + JRST ECOSG4 + pushj p,cchk +ECOSG4: PUTSIG ADDR(F,SPNT) + MOVEI A,=64 + PUSHJ P,FILL + PUTSTR[ASCIZ/ A/] + CRLF +ECOSG3: FETCH(F,F,NNAM) + JUMPN F,ECOSG2 +ISLNK0: FETCH(T,W,WBIT) + TRO T,WTMP1 + STORE(T,W,WBIT) + FETCH(T,G,WBIT) + TRO T,WTMP1 + STORE(T,G,WBIT) + MOVEI H,RADDR(W,WPIN,NXTP) + JRST ISLNK1 + +ISLNK2: FETCH(T,H,PBIT) + TRNE T,PTMP2 ;MATCHED ALREADY? + JRST ISLNK1 + PUSHJ P,PINFNG ;NO, FIND MATCH + JRST MISING ;DELETED + MOVE TT,H + PUSHJ P,PTSETA ;MARK AS MATCHED, BUT NOT PRINTED + MOVE TT,F + PUSHJ P,PTSETB ;MARK AS MATCHED AND PRINTED +ISLNK1: FETCH(H,H,NXTP) + JUMPN H,ISLNK2 + PUSHJ P,ISLNKX ;NOW DO ADDED PINS + TLNE TFLG ;ANYTHING PRINTED + JRST WIRCM2 ;NO + MOVEI H,RADDR(W,WPIN,NXTP) ;YES, PRINTED MATCHED PINS ALSO + JRST MDUMP1 + +MDUMP2: FETCH(T,H,PBIT) + TRNE T,PTMP1 ;PRINTED YET? + JRST MDUMP1 ;YES + MOVE E,H + PUSH P,W + HRRZ W,GOODW + PUSHJ P,PINPNT + CRLF + POP P,W +MDUMP1: FETCH(H,H,NXTP) + JUMPN H,MDUMP2 + JRST WIRCM2 + +ISLNKX: MOVEI F,RADDR(G,WPIN,NXTP) + JRST ISLNK3 + +ISLNK4: FETCH(T,F,PBIT) + TRNE T,PTMP1 ;PRINTED YET? + JRST ISLNK3 ;YES + MOVE TT,F + PUSHJ P,PTSET + FETCH(A,G,WBIT) + TRNN A,SPWR!SGND + JRST ISNTPG + FETCH(T,F,PBDY) + FETCH(T,T,BBIT) + TRNN T,CBODY ;CONNECTOR? + JRST ISNTC ;NO + SKIPN ISWW + JRST ISNTPG + TRNE T,BWILD ;ONLY REAL ONES + JRST ISNTPG + FETCH(TT,F,PINN) + FETCH(T,F,PBDY) + FETCH(T,T,BLOC) + PUSHJ P,CPNMER + MOVE A,T + TLO A,MAPCON + PUSHJ P,PINBIT + JUMPE TT,ISNTPG + MOVS TT,TT + FETCH(A,G,WBIT) + JRST VPCHK0 + +ISNTC: FETCH(TT,F,PTYP) + JUMPE TT,ISNTPG + FETCH(TT,TT,DPBIT) +VPCHK0: TRNN TT,PWR + JRST ISNTP + TRNN A,SPWR + JRST ISNTPG + JRST ISLNK3 ;IS PWR ON PWR, SKIP IT + +ISNTP: TRNN TT,GND + JRST ISNTPG + TRNE A,SGND + JRST ISLNK3 + JRST ISNTPG +ISNTPG: TLZN TFLG ;SIGNAL NAME OUT YET? + JRST ISLNK5 ;YES + pushj p,cchk + PUTSIG ADDR(W,SPNT) + TRNN PCNOTD + JRST ISLNK5 + CRLF + PUTSIG ADDR(G,SPNT) +ISLNK5: MOVE E,F + PUSH P,W + HRRZ W,BADW + PUSHJ P,PINPNT + POP P,W + MOVEI A,=64 + PUSHJ P,FILL + TRNN PCNOTD + PUTSTR[ASCIZ/ A/] + TRNE PCNOTD + PUTSTR[ASCIZ/ S/] + CRLF +ISLNK3: FETCH(F,F,NXTP) + JUMPN F,ISLNK4 + POPJ P, + +MISING: MOVE TT,H + PUSHJ P,PTSET + TLZN TFLG ;NAME OUT YET? + JRST MISNG1 + pushj p,cchk + PUTSIG ADDR(W,SPNT) + TRNN PCNOTD + JRST MISNG1 + CRLF + PUTSIG ADDR(G,SPNT) +MISNG1: MOVE E,H + PUSH P,W + HRRZ W,GOODW + PUSHJ P,PINPNT + MOVEI A,=72 + PUSHJ P,FILL + TRNN PCNOTD + PUTSTR[ASCIZ/ D/] + TRNE PCNOTD + PUTSTR[ASCIZ/ O/] + CRLF + POP P,W + JRST ISLNK1 + ; SUBRS FOR WIRCOM +PTSETB: PUSH P,[PTMP1!PTMP2] + JRST PTSET0 + +PTSETA: PUSH P,[PTMP2] + JRST PTSET0 + +PTSET: PUSH P,[PTMP1] +PTSET0: FETCH(T,TT,PBIT) +PTSET1: IOR T,(P) + STORE(T,TT,PBIT) + FETCH(TT,TT,NXTP) + JUMPE TT,PTSET2 + FETCH(T,TT,PBIT) + TRNE T,DUP + JRST PTSET1 +PTSET2: POP P,(P) + POPJ P, + +CLEARP: HLRZ A,1(W) + MOVEI A,RADDR(W,WIRES,ALPH) + JRST CLEAR1 + +CLEAR2: PUSHJ P,CLEARA +CLEAR1: FETCH(A,A,ALPH) + JUMPN A,CLEAR2 + POPJ P, + +CLEARA: FETCH(B,A,WBIT) + TRNE B,NAM2ND + POPJ P, ;SKIP FAKE WIRES + MOVEI B,RADDR(A,WPIN,NXTP) + JRST CLEAR3 + +CLEAR4: FETCH(T,B,PBIT) + TRZ T,PTMP1!PTMP2 + STORE(T,B,PBIT) +CLEAR3: FETCH(B,B,NXTP) + JUMPN B,CLEAR4 + POPJ P, + +;HERE TO PUT OUT HEADER FOR OLD FILE ONLY +CHDRO: PUSHJ P,CHDR + PUTSTR[ASCIZ/"OLD" WIRE LIST: + +/] + POPJ P, + +;HERE TO PUT OUT HEADER FOR NEW FILE ONLY +CHDRN: PUSHJ P,CHDR + PUTSTR[ASCIZ/"NEW" WIRE LIST: + +/] + POPJ P, + +CCHK: SKIPGE LINCNT + JRST [ CRLF + POPJ P,] +CHDR: TLZN NOFF + PUTSTR[BYTE(7)15,14] + PUSH P,A + MOVN A,PAGLEN ;INIT COUNT TO TOP OF PAGE + ADD A,MARGIN + MOVEM A,LINCNT + HLRZ A,GOODW + FETCH(A,A,WLNM) + JUMPE A,[HLRZ A,BADW + FETCH(A,A,WLNM) + JUMPE A,BTHBNK + PUTSTR[ASCIZ/Unnamed wire list/] + JRST .+2] + PUSHJ P,STROUT + PUTSTR[ASCIZ/ - vs - /] + HLRZ A,BADW + FETCH(A,A,WLNM) + JUMPE A,[PUTSTR[ASCIZ/Unnamed wire list/] + JRST ONEBNK] + PUSHJ P,STROUT +ONEBNK: CRLF +BTHBNK: HRRZ A,GOODW + FETCH(A,A,FCRD) + PUSHJ P,PNTBRS + CRLF + PUTSTR @HEADER + PUTSTR[ASCIZ/ + +/] + POP P,A + POPJ P, + +PINPNX: FETCH(D,E,PBDY) + JRST PINPNY + +PINPNT: MOVE T,LCOUNT + CAIL T,8 ;PUT ON SAME LINE IF ROOM + CRLF + PUTBYT 11 +PINVGP: PUSHJ P,PINPNF +WASCON: PUTBYT 11 + JUMPE B,WASNCN + FETCH(A,B,DUSE) + PUTSIX A +WASNCN: PUTBYT 11 + FETCH(T,D,DIPT) ;DIP POINTER + SETZM TCOUNT + JUMPE T,[FETCH(T,D,BBIT) + TRNE T,CBODY + PUTSTR[ASCIZ/CON/] + JRST WNONM1] + FETCH(A,T,DNAM) + PUSHJ P,STROUT +WNONM1: PUTBYT 11 + PUTSTR ADDR(D,BNAM) + PUTBYT 11 + FETCH(A,E,FILP) + PUTSIX ADDR(A,FILN) + PUTBYT 11 + FETCH(A,D,BBIT) + TRNN A,CBODY + JRST BPPNT + FETCH(A,E,PBIT) + JRST CNPNT + +PINPNF: FETCH(D,E,PBDY) + FETCH(A,D,BLOC) + SETZM TCOUNT + FETCH(T,E,PINN) + HRL A,T + FETCH(T,D,BBIT) + TRNN T,CBODY + JRST PNNC + PUSHJ P,LOCPNW + FETCH(T,E,PBIT) + PUSHJ P,PTAB + SETZ B, ;FLAG TO WASCON NOT TO PRINT USE + POPJ P, + +PNNC: FETCH(B,D,BPAK) + PUSHJ P,LOCPNP + FETCH(T,E,PBIT) + PUSHJ P,PTAB +PINPNY: FETCH(B,E,PTYP) + JUMPE B,[PUTSTR[ASCIZ/UN/] + POPJ P,] + FETCH(A,B,DPBIT) + PUSHJ P,PNTYPE + POPJ P, + +;ENTER WITH LOGIC PIN TO FIND IN H +PINFNH: FETCH(A,H,PBDY) ;BODY POINTER + FETCH(A,A,BLOC) ;LOC OF BODY + JUMPE A,CPOPJ ;CAN'T FIND IF NO LOC!!!!!! + FETCH(B,H,PINN) ;PIN # + HRRZ G,BADW + MOVEI G,RADDR(G,WBDY,NXTB) + JRST BDFNH1 + +BDFNH2: FETCH(C,G,BLOC) ;LOC + CAMN A,C ;SAME LOC? + JRST BDFNH3 +BDFNH1: FETCH(G,G,NXTB) + JUMPN G,BDFNH2 + POPJ P, ;LOSE + +BDFNH3: MOVEI F,RADDR(G,BPIN,NXBP) + JRST PNFNH1 + +PNFNH2: FETCH(T,F,PBIT) + TRNE T,DUP + JRST PNFNH1 + FETCH(T,F,PINN) + CAME T,B ;PIN # + JRST PNFNH1 + FETCH(C,F,HPNT) ;WIRE POINTER + FETCH(T,C,WBIT) + TRNE T,WTMP1 ;DON'T FIND PREVIOUSLY MATCHED PINS + JRST PNFNH1 ;BUT KEEP TRYING + TRNN T,WSINGL ;DON'T FIND SINGLES + JRST [ MOVE G,C ;RETURN WIRE HEADER IN G + JRST CPOPJ1] + SKIPE MSINGL ;ALREADY GOT BEST SINGLE? + JRST PNFNH1 + MOVEM F,MSINGL ;NO, SAVE THIS ONE + HRLM H,MSINGL +;CONTINUE TO SEARCH FOR NON-SINGLE OR UNMATCHED PIN +PNFNH1: FETCH(F,F,NXBP) + JUMPN F,PNFNH2 + JRST BDFNH1 + +;ENTER WITH LOGIC PIN IN H, PC WIRE IN G +PINFNG: MOVEI F,RADDR(G,WPIN,NXTP) + FETCH(A,H,PBDY) + FETCH(A,A,BLOC) ;LOC + FETCH(B,H,PINN) ;PIN # + JRST PINFN1 + +PINFN2: FETCH(T,F,PINN) ;PIN # + CAME T,B + JRST PINFN1 + FETCH(T,F,PBDY) ;BODY POINTER + FETCH(T,T,BLOC) ;LOC + CAMN A,T + JRST CPOPJ1 +PINFN1: FETCH(F,F,NXTP) + JUMPN F,PINFN2 + POPJ P, + SUBTTL 'WLD' DIP LOC CHECK +DIPCOM: MOVE L,DEFLST + HRLZM L,GOODW + HRLZM L,BADW + FETCH(W,L,WIRL) + PUSHJ P,LSTGT0 + POPJ P, + HRRM W,GOODW + HLRZ L,BADW + FETCH(W,L,PCWL) + JUMPE W,NXCRD1 + PUSHJ P,GETLOP + JRST NXCRD1 + HRRM W,BADW + MOVSI T,'WLD' ;ERROR LISTING FOR WIRE LIST COMPARISON + MOVEI TT,0 ;DATA MODE 0 + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + HRRZ W,GOODW + PUSHJ P,FILLST + CHDR + PUSHJ P,DOWLD + RELEASE LST, + POPJ P, + + +DOWLD: PUSHJ P,CLEARB + MOVEI T,[ASCIZ\DIP TYPE/SOCKET MIS-MATCHING +LOC BODY FILE POS DIPTYPE PINS PC PINS\] + MOVEM T,HEADER + MOVEI T,WLDMAR + MOVEM T,MARGIN + SETZM LINCNT + HRRZ W,GOODW + MOVEI H,RADDR(W,WBDY,NXTB) + SETZM LETTER + JRST DIPC1Z + +DIPC2Z: FETCH(TT,H,BBIT) + FETCH(T,H,BLOC) + TRNE TT,CBODY ;CON? + JRST DIPC1X ;YES, DO DIFFERENTLY + JUMPE T,[MOVEM T,LETTER ;BLANK LOC + SETZM PINNUM + PUSHJ P,BDPNTA + ERRSTR 0,[ASCIZ/NO LOCATION IN LOGIC DRAWING/] + JRST DIPC1Z] + CAMN T,LETTER ;NEW LOC? + JRST DIPC1Z ;NO, GET ANOTHER + MOVEM T,LETTER + MOVE C,BADW + MOVEI C,RADDR(C,WBDY,NXTB) + PUSHJ P,FN2BOD ;FIND THE LOC + JRST [ SETZM PINNUM + PUSHJ P,BDPNTA + ERRSTR 1,[ASCIZ/NO SUCH LOCATION ON PC CARD/] + JRST DIPC1Z] + FETCH(T,C,BBIT) + TRO T,BTMP1 + STORE(T,C,BBIT) + PUSHJ P,DIPMAX ;FIND MAX PIN # OF SOCKET + FETCH(TTT,H,DIPT) ;DIPTYPE + JUMPE TTT,[PUSHJ P,BDPNTA + ERRSTR 0,[ASCIZ/NO DIP TYPE/] + JRST DIPC1A] + FETCH(TTT,TTT,DPNN) ;# OF PINS + CAME TTT,PINNUM ;SAME # OF PINS?, NO ERROR + JRST [ HRLM TTT,PINNUM ;STORE # OF PINS FOR PRINTING + PUSHJ P,BDPNT + ERRSTR 2,[ASCIZ/WRONG NUMBER OF PINS FOR DIP/] + JRST DIPC1A] + HRLM C,(P) + PUSHJ P,FN2BOD ;SEE IF THERE IS ANOTHER + JRST DIPC1Z ;NO, OK + SKIPL LINCNT + PUSHJ P,CHDR + CRLF + MOVE T,C + HLRZ C,(P) + HRLM T,(P) + MOVE A,LETTER + FETCH(T,C,BBIT) ;BODY BITS + PUSHJ P,WLOCOUT + PUSHJ P,DIPC1C ;REST OF LINE + HLRZ C,(P) + JRST DIPC1B + +DIPC1A: PUSHJ P,FN2BOD ;TRY TO FIND ANOTHER SUCH LOC + JRST DIPC1Z +DIPC1B: PUSHJ P,DIPC1C + JRST DIPC1A + +DIPC1C: PUTSTR[ASCIZ/ /] + PUSHJ P,DIPMAX ;GET MAX PINS + MOVE T,PINNUM + PUSHJ P,DECOUT + ERRSTR 3,[ASCIZ/MULTIPLE DIPS WITH SAME LOC/] + POPJ P, + +DIPC1X: FETCH(TT,H,BBIT) + TRNE TT,BWILD ;SKIP WILD CARD CPINS + JRST DIPC1Z + MOVEM T,LETTER ;STORE LOC + MOVE C,BADW + MOVEI C,RADDR(C,WBDY,NXTB) + PUSHJ P,FN2BOD ;FIND CON ON PC CARD + JRST DIPC1N ;NO SUCH PADDLE + FETCH(F,C,BPIN) ;FIRST PIN ON PC CARD + FETCH(G,H,BPIN) ;FIRST PIN + TLZ TFLG ;NO LOC OUT YET +DIPC1Y: FETCH(T,G,PINN) +DIPC2Y: JUMPE F,DIPC1M ;IF NO MORE PC PINS, THEN ERROR + FETCH(TT,F,PINN) ;PIN # + CAMGE T,TT ;PAST RIGHT PLACE YET? + JRST DIPC1M ;YES, ERROR + CAMN T,TT ;IS THIS IT? + JRST DIPC1W ;YES, NEXT + FETCH(F,F,NXBP) + JRST DIPC2Y ;NEXT PC PIN + +DIPC1W: FETCH(G,G,NXBP) + JUMPN G,DIPC1Y + JRST DIPC1Z + +DIPC1M: SKIPGE LINCNT + JRST DIPC0L + PUSHJ P,CHDR + TLZ TFLG ;NEED LOC AGAIN +DIPC0L: TLOE TFLG ;LOC NEEDED? + JRST DIPC1L ;NO + MOVE A,LETTER + FETCH(T,H,BBIT) + PUSHJ P,WLOCOUT +DIPC1L: PUSHJ P,CPINPN + ERRSTR 2,[ASCIZ/NON EX PIN ON PADDLE/] + JRST DIPC1W + +CPINPN: PUTSTR[ASCIZ/ /] ;NO BODY + FETCH(A,G,FILP) + PUTSIX ADDR(A,FILN) ;FILE NAME + PUTSTR[ASCIZ/ CON /] ;DIP TYPE + HRRZ A,LETTER + FETCH(T,G,PINN) + PUSHJ P,PRCNPN + PUTBYT 11 + SKIPN T,PINNUM + POPJ P, + JRST PRCNPN + +DIPC1N: TLZ TFLG +DIPC2N: SKIPGE LINCNT + JRST DIPC3N + PUSHJ P,CHDR + TLZ TFLG +DIPC3N: TLOE TFLG + JRST DIPC4N + MOVE A,LETTER + FETCH(T,H,BBIT) + PUSHJ P,WLOCOUT + FETCH(G,H,BPIN) +DIPC4N: PUSHJ P,CPINPN + ERRSTR 2,[ASCIZ/NO SUCH PADDLE ON PC CARD/] + FETCH(G,G,NXBP) + JUMPN G,DIPC2N +DIPC1Z: FETCH(H,H,NXTB) + JUMPN H,DIPC2Z + MOVEI T,[ASCIZ/DIP SOCKETS NOT USED IN LOGIC DRAWING +LOC PINS/] + MOVEM T,HEADER + SETZM LINCNT + MOVE C,BADW + MOVEI C,RADDR(C,WBDY,NXTB) ;NOW FIND THE SLACKERS + JRST DIPC8 + +DIPC7: FETCH(T,C,BBIT) + TRNE T,BTMP1!CBODY + JRST DIPC8 ;ALREADY SEEN, OK + SKIPL LINCNT + PUSHJ P,CHDR + FETCH(T,C,BBIT) + FETCH(A,C,BLOC) + PUSHJ P,WLOCOUT + PUTBYT 11 + PUSHJ P,DIPMAX + MOVE T,PINNUM + PUSHJ P,DECOUT + CRLF +DIPC8: FETCH(C,C,NXTB) + JUMPN C,DIPC7 + POPJ P, + +DIPMAX: SETZ TTT, ;MAX PC PIN SO FAR + MOVEI A,RADDR(C,BPIN,NXBP) + JRST DIPC2A + +DIPC2B: FETCH(TT,A,PINN) ;PIN # + CAMLE TT,TTT + MOVE TTT,TT +DIPC2A: FETCH(A,A,NXBP) + JUMPN A,DIPC2B + MOVEM TTT,PINNUM + POPJ P, + +BDPNTA: FETCH(T,H,DIPT) ;DIP POINTER + SKIPE T ;ANY DIP TYPE? + FETCH(T,T,DPNN) ;YES, GET NUMBER OF PINS + HRLM T,PINNUM ;NUMBER OF PINS ON DIP +BDPNT: SKIPL LINCNT + PUSHJ P,CHDR + CRLF + MOVE A,LETTER + FETCH(T,H,BBIT) + PUSHJ P,WLOCOUT ;PRINT LOC + PUTBYT 11 + SKIPN ADDR(H,BNAM) + PUTSTR[ASCIZ/NONE/] + PUTSTR ADDR(H,BNAM) + PUTBYT 11 + FETCH(A,H,FILB) + PUTSIX ADDR(A,FILN) + PUTBYT 11 + FETCH(A,H,BBIT) + PUSHJ P,BPPNT + PUTBYT 11 + FETCH(A,H,DIPT) + JUMPE A,[PUTSTR[ASCIZ/NONE/] + JRST BDPNT2] + FETCH(A,A,DNAM) + PUSHJ P,STROUT +BDPNT2: PUTBYT 11 + HLRZ T,PINNUM + SKIPE T + PUSHJ P,DECOUT + PUTBYT 11 + HRRZ T,PINNUM + JUMPE T,CPOPJ + JRST DECOUT + +CLEARB: MOVEI TT,RADDR(W,WBDY,NXTB) + JRST CLRB1 + +CLRB2: FETCH(TTT,TT,BBIT) + TRZ TTT,BTMP1 + STORE(TTT,TT,BBIT) +CLRB1: FETCH(TT,TT,NXTB) + JUMPN TT,CLRB2 + POPJ P, + +CLEARW: MOVEI T,RADDR(W,WIRES,ALPH) + JRST CLRW1 + +CLRW2: FETCH(TT,T,WBIT) + TRZ TT,WTMP1 + STORE(TT,T,WBIT) +CLRW1: FETCH(T,T,ALPH) + JUMPN T,CLRW2 + POPJ P, + SUBTTL 'DAT' PARTITION FILE OUTPUT +DOPART: MOVE L,DEFLST + PUSHJ P,LSTGET + POPJ P, + PUSHJ P,DIPCHK + JRST [ OUTSTR[ASCIZ/SORRY, COULDN'T GET DIPS IN! +/] + POPJ P,] + PUSH P,LSTNAM ;SAVE DEFAULT NAME + MOVE T,[DATNAM] + MOVEM T,LSTNAM ;SET TO THIS FOR NOW + MOVSI T,'DAT' ;PARTITION FILE EXTENSION + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + JRST [ POP P,LSTNAM + POPJ P,] ;HE GAVE UP! + POP P,LSTNAM + ASK[ASCIZ/PASS PRE-PLACED DIP LOCATIONS?/] + JRST PARTQT + TRZA FLAG + TRO FLAG + PUSHJ P,PARDEF ;PUT OUT BODY DEFS IN FRONT OF FILE + MOVEI T,3 ;AVOID SPECIAL SIGS + MOVEM T,FACTR1 ;INIT SIGNAL # COUNTER + MOVEI H,RADDR(W,WIRES,ALPH) + JRST PART1 + +PART2: FETCH(B,H,WBIT) + TRNE B,NAM2ND!WNULL + JRST PART1 ;SKIP FAKE WIRES + MOVEI T,2 + TRNE B,SPWR + JRST PARTGS ;2 = CODE FOR PWR + TRNN B,WSINGL ;SINGLE OR + TRNE B,SNC ;NAME NC + SOJA T,PARTGS ;1 = CODE FOR NC + TRNE B,SGND + AOJA T,PARTGS ;3 = CODE FOR GND + AOS T,FACTR1 ;NOT PWR OR GND, GENERATE A NEW NUMBER +PARTGS: STORE(T,H,WTMP) ;STORE SEQ. # IN LH OF WIRE HEAD WORDS +PART1: FETCH(H,H,ALPH) ;NEXT WIRE + JUMPN H,PART2 + MOVEI H,RADDR(W,WBDY,NXTB) + JRST BPART1 + +BPART2: FETCH(T,H,DIPT) ;DIP TYPE + JUMPE T,BPART1 ;LOSER + FETCH(T,T,DTMP) ;GET DIP # (GENERATED BY PARDEF) + JUMPE T,BPART1 ;SKIP ONES WITH NO DIP #! (THEY WEREN'T 14 OR 16 PIN DIPS) + FETCH(T,H,BPIN) + JUMPE T,BPART1 ;SKIP ONES WITH NO PINS! + PUSHJ P,MAXSET ;CALC MAX SECT PIN # + SETOM FACTR1 ;SET LAST SEC # + PUSHJ P,NXTSEC ;FIND FIRST + JRST [ OUTSTR[ASCIZ/GROSS LOSSAGE AT BPART, NO SECTIONS FOUND FOR BODY /] + OUTSTR ADDR(H,BNAM) + OUTSTR[ASCIZ/ +/] + JRST BPART1] +BPART3: MOVEM T,FACTR1 ;MAKE IT THE ONE + PUSHJ P,BHPNT ;PRINT BODY HEADER + PUSHJ P,F4CRLF + SETZ G, + MOVEI F,G ;START HERE FOR ID LIST + MOVE D,FACTR2 ;THIS IS SETUP TO AOBJN POINTER +SPART0: PUSHJ P,PNFND ;PIN FOR PIN# IN D AND SECT # IN FACTR1 + JRST [ PUSHJ P,PINID0 ;PIN ID FOR NO PIN + MOVEI T,1 ;THIS SIGNAL # + JRST SPART1] + PUSHJ P,PHPNT ;PRINT SIGNAL # AND LINK ID INTO LIST +SPART1: PUSHJ P,DEC5 + AOBJN D,SPART0 ;DO THEM ALL +BPART4: PUSHJ P,F4CRLF ;END OF SIGNAL #'S + PUSHJ P,PIDPNT ;POOT OUT ID'S + PUSHJ P,NXTSEC ;TRY FOR ANOTHER SECTION + CAIA + JRST BPART3 ;GOT ANOTHER, LOOP BACK +BPART1: FETCH(H,H,NXTB) ;ANOTHER BODY + JUMPN H,BPART2 + PUTSTR[ASCIZ/ 0/] ;END BODIES + PUSHJ P,F4CRLF + SKIPE ISWW + PUSHJ P,WAGGND ;PUT OUT GND AND PWR FIRST + SKIPN ISWW + OUTSTR[ASCIZ/SINCE THIS IS NOT A WIRE WRAP BOARD +I CAN'T PASS PWR AND GND EDGE CONNECTIONS! +/] + MOVEI H,RADDR(W,WBDY,NXTB) ;BACK TO BODY LIST + JRST CPART1 + +CPART2: FETCH(T,H,BBIT) ;LOC + TRNN T,CBODY ;CONNECTOR? + JRST CPART1 ;NO, SKIP IT + FETCH(T,H,BLOC) + MOVEM T,FACTR1 + MOVEI G,RADDR(H,BPIN,NXBP) + JRST CPART3 + +CPART4: FETCH(T,G,PID) ;PIN ID + PUSHJ P,OCT6 ;PRINT IT + FETCH(D,G,FILP) + FETCH(D,D,FILN) + HLRZ T,D + PUSHJ P,OCT6 ;LH FILENAME + HRRZ T,D + PUSHJ P,OCT6 ;RH FILENAME + FETCH(TT,G,PBDY) + FETCH(TT,TT,BBIT) + TRNE TT,BWILD + TDZA TT,TT + FETCH(TT,G,PINN) + MOVE T,FACTR1 + PUSHJ P,CPARTP + FETCH(T,G,HPNT) + FETCH(T,T,WTMP) ;SIGNAL # + PUSHJ P,DEC5 + PUSHJ P, F4CRLF ;THAT'S ALL +CPART3: FETCH(G,G,NXBP) ;LOOP THROUGH PINS + JUMPN G,CPART4 +CPART1: FETCH(H,H,NXTB) ;NEXT BODY + JUMPN H,CPART2 + PUTSTR[ASCIZ/ 0/] ;END OF CONNECTOR PINS + PUSHJ P,F4CRLF +PARTQT: RELEASE LST, ;FINI + POPJ P, + +PIDPNT: JUMPE G,F4CRLF ;ANY LIST AT ALL? +PIDPN1: MOVE F,G + FETCH(T,F,TRHT) ;PIN ID + PUSHJ P,OCT6 ;PRINT IT + FETCH(G,G,NXTT) + FSTRET(F,TBLK) + JUMPN G,PIDPN1 + JRST F4CRLF ;DO CRLF + + +PHPNT: FETCH(T,A,PID) + GETFS(TT,TBLK) + STORE(T,TT,TRHT) + CLEAR(TT,NXTT) + STORE(TT,F,NXTT) + MOVE F,TT ;NEW END + FETCH(T,A,HPNT) + FETCH(T,T,WTMP) + POPJ P, ;RETURN SIGNAL # IN T + +PINID0: GETFS(TT,TBLK) ;STORE A 0 ID IN ID LIST + CLEAR(TT,NXTT) + CLEAR(TT,TRHT) + STORE(TT,F,NXTT) + MOVE F,TT + POPJ P, + +BHPNT: FETCH(T,H,FILB) ;OH WELL, THIS IS UNIQUE FOR THE SLICE + PUSHJ P,OCT6 + FETCH(T,H,BID) + PUSHJ P,OCT6 ;BODY ID + FETCH(B,H,FILB) + FETCH(B,B,FILN) + HLRZ T,B + PUSHJ P,OCT6 ;LH FILENAME + HRRZ T,B + PUSHJ P,OCT6 ;RH FILENAME + FETCH(T,H,DIPT) + FETCH(T,T,DTMP) + PUSHJ P,DEC5 ;DIP # + TRNN FLAG ;PASSING LOCS? + POPJ P, ;NO, QUIT + FETCH(A,H,BLOC) +; This is really only right for DEC nomenclature.... **BUG** + LDB T,[POINT 12,A,35] + PUSHJ P,DEC5 ;THIS IS X + LDB T,[POINT 6,A,23] + JRST DEC5 ;THIS IS Y + +NXTSEC: MOVEI T,100 ;PICK ULTRA GROSS SEC # (.GE. 18) + FETCH(TT,H,BPIN) +NXTSC2: HRLM TT,(P) + FETCH(TTT,TT,PTYP) ;TYPE POINTER + JUMPE TTT,NXTSC1 ;UGH! + FETCH(TT,TTT,DPBIT) + TRNN TT,INLD!OUTLD!TERM + JRST NXTSC1 + FETCH(TT,TTT,SCTB) + MOVS TT,TT + JFFO TT,.+2 ;CALC SECT # + JRST NXTSC1 + CAMLE T,TTT ;SMALLER THAN SMALLEST? + CAMG TTT,FACTR1 ;YES, LARGER THAN LAST? + JRST NXTSC1 ;NO + MOVE T,TTT ;YES, SAVE IT +NXTSC1: HLRZ TT,(P) + FETCH(TT,TT,NXBP) + JUMPN TT,NXTSC2 + CAIE T,100 ;THIS TELLS US IF WE FOUND ANOTHER + AOS (P) ;FOUND ANOTHER, SKIP + POPJ P, + +MAXSET: FETCH(T,H,DIPT) ;DIP POINTER + SETZM FACTR2 ;MAX PIN # + MOVEI T,RADDR(T,DPIN,DPNXT) + JRST MAXPN2 + +MAXPN1: FETCH(TT,T,DPBIT) + TRNN TT,INLD!OUTLD!TERM + JRST MAXPN2 + FETCH(TTT,T,SCTP) + CAMLE TTT,FACTR2 ;BIGGER THAN MAX SO FAR? + MOVEM TTT,FACTR2 ;YES, STORE +MAXPN2: FETCH(T,T,DPNXT) + JUMPN T,MAXPN1 + MOVN T,FACTR2 + HRLZM T,FACTR2 + AOS FACTR2 ;THIS IS NOW A STARTING POINTER + POPJ P, + +PNFND: MOVEI A,RADDR(H,BPIN,NXBP);START HERE + JRST PNFND1 + +PNFND2: FETCH(TT,A,PTYP) + JUMPE TT,PNFND1 ;ANY TYPE POINTER? + FETCH(T,TT,DPBIT) + TRNN T,INLD!OUTLD!TERM + JRST PNFND1 + FETCH(T,TT,SCTP) + CAIE T,(D) ;SAME SECT PIN #? + JRST PNFND1 ;NO + FETCH(T,TT,SCTB) + MOVS T,T + JFFO T,.+1 ;CALC SECT # + CAMN TT,FACTR1 ;SAME? + JRST CPOPJ1 ;YES, RETURN +PNFND1: FETCH(A,A,NXBP) ;NO, LOOK FORWARD + JUMPN A,PNFND2 + POPJ P, + +OCT6: MOVEI TTT,6 +OCT6A: IDIVI T,10 + HRLM TT,(P) + SOJLE TTT,.+2 + PUSHJ P,OCT6A + HLRZ TTT,(P) + ADDI TTT,60 + XCT PUTCHR + POPJ P, + ; PARTITION DIP DEFINITION OUTPUT +PARDEF: SETZM FACTR1 ;INITIALIZE DIP #'S + PUSHJ P,DCLEAR + MOVEI H,RADDR(W,WBDY,NXTB) + JRST DBPRT1 + +DBPRT2: PUSH P,H + MOVE A,H ;SAVE BODY POINTER FOR ERROR PRINTOUT + FETCH(H,H,DIPT) + JUMPE H,[FETCH(T,A,BBIT) + TRNE T,CBODY ;CONNECTOR BODY? + JRST .+2 ;YES, PROCEED + OUTSTR[ASCIZ/NO DIP TYPE FOR /] + PUSHJ P,DEFLOS + JRST .+2] + PUSHJ P,DIPDEF + POP P,H +DBPRT1: FETCH(H,H,NXTB) + JUMPN H,DBPRT2 +NPARDP: PUTSTR[ASCIZ/ 0/] + JRST F4CRLF + +DEFLOS: SKIPN ADDR(A,BNAM) + JRST [ OUTSTR[ASCIZ/UNNAMED BODY/] + JRST UNNDEF] + OUTSTR ADDR(A,BNAM) +UNNDEF: HRLM A,(P) + FETCH(A,A,DIPT) + JUMPE A,DEFLSD + OUTSTR[ASCIZ/, DIP TYPE IS /] + FETCH(A,A,DNAM) + PUSHJ P,STRTTY +DEFLSD: HLRZ A,(P) + OUTSTR[ASCIZ/, YOU ARE LOSING! +/] + POPJ P, + + +;POOT OUT 1 DIP DEF +DIPDEF: FETCH(T,H,DPNN) ;# OF PINS + CAIE T,=14 + CAIN T,=16 + CAIA + JRST [ OUTSTR[ASCIZ/DIP TYPE NOT 14 OR 16 PINS FOR /] + JRST DEFLOS] + FETCH(T,H,DTMP) + JUMPN T,CPOPJ ;ALREADY OUT! + AOS T,FACTR1 + STORE(T,H,DTMP) + PUSHJ P,SECCAL ;CALC DIP DIVISION + FETCH(T,H,DTMP) + PUSHJ P,DEC5 ;THEN PRINT DIP # + MOVE T,G ;PINS/UNIT + PUSHJ P,DEC5 + MOVEI T,1(F) ;UNITS/PKG + PUSHJ P,DEC5 + FETCH(T,H,DPNN) ;PINS/PKG + PUSHJ P,DEC5 + MOVEI TTT,PWR + PUSHJ P,PG5 ;FIND AND PRINT PWR PIN + MOVEI TTT,GND + PUSHJ P,PG5 ;FIND AND PRINT GND PIN + FETCH(A,H,DNAM) + PUSHJ P,STROUT ;PRINT DIP NAME + PUSHJ P,F4CRLF +DPART7: HRLZ G,G ;G HAS # OF PINS/SEC + TLC G,-1 + AOBJN G,.+1 ;NOW HAS -COUNT,,PIN # + MOVNI F,1(F) ;INC BY 1 FOR COUNT + HRLZ F,F ;NOW HAS -COUNT,,SEC # +DPRT7A: MOVE E,G ;INIT E FROM G + HRRZ D,F ;INTI RH OF D TO SEC # +DPRT7B: HRL D,E ;SET LEFT HALF TO PIN # + PUSHJ P,PPNT5 ;FIND AND PRINT PIN + AOBJN E,DPRT7B ;LOOP FOR ALL PINS + AOBJN F,DPRT7A ;LOOP FOR ALL SECTIONS + JRST F4CRLF ;END WITH A CRLF + +;FIND A PWR OR GND PIN AND PRINT IT +PG5: MOVEI T,1 + MOVEM TTT,1(P) + MOVEI TT,RADDR(H,DPIN,DPNXT) + JRST PG5B + +PG5A: FETCH(TTT,TT,DPBIT) + TDNE TTT,1(P) + JRST DEC5 + ADDI T,1 +PG5B: FETCH(TT,TT,DPNXT) + JUMPN TT,PG5A + SETZ T, + OUTSTR[ASCIZ/PWR OR GND NOT FOUND ON DIP /] + FETCH(A,H,DNAM) + PUSHJ P,STRTTY + OUTSTR[ASCIZ/, WILL PASS 0! +/] +DEC5: MOVEI TT,5 + MOVEM TT,NDIG + JRST NDECOUT + +;ENTER WITH H=DIP DEF POINTER D=PIN#,,SEC# +PPNT5: MOVEI T,1 + MOVEI TT,RADDR(H,DPIN,DPNXT) + JRST PPNT5B + +PPNT5A: FETCH(TTT,TT,DPBIT) + TRNN TTT,INLD!OUTLD!TERM + JRST PPNT5B + FETCH(TTT,TT,SCTP) + HRLZ TTT,TTT ;PICK UP PIN # + XOR TTT,D + TLNE TTT,-1 ;SAME? + JRST PPNT5B ;NO + HRLM TT,(P) + FETCH(TT,TT,SCTB) + MOVS TT,TT + JFFO TT,.+2 + JRST PPNT5B + CAIN TTT,(D) ;SAME SEC #? + JRST DEC5 ;YES, PHY PIN # IN T, PRINT IT + HLRZ TT,(P) ;RESTORE TT +PPNT5B: ADDI T,1 + FETCH(TT,TT,DPNXT) + JUMPN TT,PPNT5A + OUTSTR[ASCIZ/PIN /] + HLRZ T,D + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ OF SECTION /] + HRRZ T,D + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ NOT FOUND ON DIP /] + FETCH(A,H,DNAM) + PUSHJ P,STRTTY + OUTSTR[ASCIZ/, WILL PASS 0! +/] + SETZ T, + JRST DEC5 + + ;SECCAL - CALL WITH DIP POINTER IN H, RETURN WITH PINS/SEC IN G, SEC/DIP IN F +SECCAL: SETOB G,F ;START THEM OUT AS 0 + MOVEI TTT,RADDR(H,DPIN,DPNXT) + JRST DPART0 + +DPART3: FETCH(TT,TTT,DPBIT) + TRNN TT,INLD!OUTLD!TERM ;INPUT OR OUTPUT PIN? + JRST DPART0 + FETCH(T,TTT,SCTP) ;SECT PIN # + CAMLE T,G ;LARGER? + MOVE G,T ;NEW LARGEST + FETCH(T,TTT,SCTB) + MOVS T,T + JFFO T,.+2 + JRST DPART0 + CAMLE TT,F ;LARGER SECT #? + MOVE F,TT ;YES +DPART0: FETCH(TTT,TTT,DPNXT) + JUMPN TTT,DPART3 + POPJ P, + +DCLEAR: SKIPN H,DIPLST + POPJ P, +DPART1: CLEAR(H,DTMP) + FETCH(H,H,NXTD) + JUMPN H,DPART1 + POPJ P, + SUBTTL OUTSET +;SETUP DEVICE AND NAME FOR OUTPUT +OUTSET: SETZM ALLNAM +ALLSET: MOVEM T,DEFEXT ;DEFAULT EXTENSION + HRRM TT,OUTMOD ;SET DATA MODE + MOVEM TTT,OUTDEV +NOITS,< + JUMPN TT,OUTMOD ;FOR FULL WORD MODE NO OTHER DEVICE + MOVSI TTT,'LST' + DEVCHR TTT, + JUMPE TTT,OUTMOD + MOVSI TTT,'LST' + MOVEM TTT,OUTDEV +>;NOITS +OUTMOD: INIT LST,10 +OUTDEV: 'DSK ' ;ALWAYS USE DISK! + XWD LSTHD,0 + JRST [ OUTSTR[ASCIZ/INIT FAILED ON OUTPUT DEVICE! +/] + JRST ERRET] + SETZM LCOUNT ;START AT LEFT MARGIN + SETZM LINCNT ;NEED HEADER + TLO NOFF ;BUT ALREADY AT TOP! + MOVEI T,LSTBUF + EXCH T,.JBFF + OUTBUF LST,2 + MOVEM T,.JBFF + MOVE T,[PUSHJ P,BYTOUT] ;SETUP OUTPUT ROUTINE (EVEN FOR BINARY) + MOVEM T,PUTCHR + SETZM TTYFLG ;ASSUME NOT OUT TO TTY + TLZ DEC,<COMLIN!>SIMTAB ;NOT SIMULATING TABS NORMALLY OR COMMENTING + SETZM PNTNAM ;NO NAME TO PRINT YET +NOITS,< + MOVE T,OUTDEV + DEVCHR T, ;CHECK IF HE REASSIGNED THE DISK + TLNE T,10 ;TTY? + SETOM TTYFLG ;YES + TLNN T,4 ;DOES IT STILL HAVE A DIRECTORY? + JRST CPOPJ1 ;NON-DIRECTORY DEVICE, QUIT NOW +>;NOITS + SKIPN T,ALLNAM + JRST NOALLF + MOVEM T,FILNAM + MOVE T,ALLPPN + MOVEM T,FILPPN + MOVE T,DEFEXT + MOVEM T,FILEXT + SETZM FILDAT + PUSH P,A + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + MOVEI A,FILNAM + PUSHJ P,FILPNT + POP P,A + JRST GOTALL + +NOALLF: PUSHJ P,SETFIL + POPJ P, +GOTALL: MOVE T,[PUSHJ P,BYTOUT] ;LOSING SETFIL CLOBBERED THIS + MOVEM T,PUTCHR + MOVE T,FILPPN + LOOKUP LST,FILNAM + SKIPA TT,FILEXT + SETO TT, + MOVEM T,FILPPN + CLOSE LST, ;DON'T GET INTO ALTER MODE!!! + TRNN TT,-1 + JRST NOEXST +IFN 0,< ASK[ASCIZ/ ALREADY EXISTS, REPLACE?/] + POPJ P, + POPJ P, +;> OUTSTR[ASCIZ/, BEING REPLACED/] +NOEXST: HLLZS FILEXT + SETZM FILDAT + ENTER LST,FILNAM + JRST [ OUTSTR[ASCIZ/ ENTER FAILED, CODE= /] + HRRZ T,FILEXT + PUSHJ P,TTYDEC + OUTSTR[ASCIZ/ +/] + POPJ P,] + OUTSTR[ASCIZ/ +/] + MOVE T,FILNAM + MOVEM T,LSTNAM + MOVEM T,PNTNAM + MOVEM T,ALLNAM + HLLZ T,FILEXT + MOVEM T,PNTEXT + SKIPN T,FILPPN + DSKPPN T, + MOVEM T,PNTPPN + MOVEM T,ALLPPN + JRST CPOPJ1 diff --git a/src/wl/wlrout.523 b/src/wl/wlrout.523 new file mode 100644 index 00000000..bf665822 --- /dev/null +++ b/src/wl/wlrout.523 @@ -0,0 +1,1899 @@ +;<WIRELIST>WLROUT.FAI.16, 6-NOV-75 17:35:06, EDIT BY HELLIWELL -*- MODE:MIDAS -*- +SUBTTL DEC ROUTER SUBRS +;ROUTER PINSIN +;PINSIN - PINS READ IN +;READS IN THE PINS FOR ONE RUN AND COMPUTES THE DISTANCES +;BETWEEN EACH PAIR OF PINS. + +ROUTE,< +PINSIN: SETZM SCTR ;SET TO LOOK FOR SOURCE AND CABLE PINS + SETZM HNDOSW ;CLEAR THE HAND ORDERING SWITCH + SKIPLE ORDFLG ;HAND ORDERING BY NUMBER? + SETOM HNDOSW ;YES, FLAG IT + +PINSI2: MOVEI B,1 ;INDEX FOR MAKING DISTANCE TABLE +PINSI3: SETZ C, ;COMPUTE DISTANCES TO PIN C(B) + ;FOR PINS 0 .LE. N .LE. C(B)-1 +PINSI4: MOVE A,B + PUSH P,B + PUSH P,C + MOVSI T,RERPIN ;CHECK FOR PIN IN ERROR + TDNN T,PNTBL(B) + TDNE T,PNTBL(C) + JRST PINSIL ;Route pin at far end of run + MOVE A,PNTBL1(B) + MOVE C,PNTBL1(C) + PUSHJ P,DSTCLC ;CALCULATE DISTANCE (IN WW FILE) +PINSIM: POP P,C + POP P,B + PUSHJ P,MAKDST + CAILE B,1(C) ;DONE THIS ROW? + AOJA C,PINSI4 ;NO, GET NEXT DISTANCE + MOVE C,NUMPIN + CAILE C,(B) ;DONE THIS TABLE? + AOJA B,PINSI3 ;NO, MAKE NEXT ROW LONGER + POPJ P, + +MAKDST: MOVE E,C ;GET S/C COLUMNS FOR BOTH PINS + LDB TTTT,ORDPTR ;SAVE THE ORDER CODE + LDB TTT,SCPTR + MOVE E,B + LDB D,ORDPTR ;GET THE ORDER CODE FOR THE OTHER PIN + SUB TTTT,D ;AND SAVE THE DIFFERENCE + LDB D,SCPTR + CAMN D,TTT ;LETTERS THE SAME? + JRST SCHECK ;YES, CHECK IF LEGAL + ADD D,TTT ;NO, ADD IN FUDGE FACTOR + ADD G,FUDGE(D) +PINSI5: MOVMS TTTT ;GET MAGNITUDE OF ORDER CODE DELTA + SKIPE NOHND + JRST PINSIG + SKIPE HNDOSW ;HAND ORDERING? + HRL G,TTTT ;YES, USE HAND ORDER DELTA +PINSIG: MOVEM G,@PTRTBL-1(B) ;DEPOSIT IN TRIANGULAR TABLE + POPJ P, ;VIA PHANTOM DOUBLE INDEX + +SCHECK: CAIN D,4 ;CHECK FOR MULTIPLE Sources'S + SETOM SCTR ;SET ERROR FLAG + CAIN D,1 ;CHECK FOR MULTIPLE Term'S + ADD G,[XWD 700,0] ;YES, ADD IN T-TO-T FUDGE FACTOR + JRST PINSI5 ;SAVE DISTANCE + +FUDGE_.-1 ;TABLE OF DISTANCE FUDGE FACTORS + ;SO THAT SELECTED PINS GO TO THE ENDS + XWD 400,0 ;T TO ORDINARY + XWD 100,0 ;C TO ORDINARY + XWD 400,0 ;C TO T + XWD 100,0 ;S TO ORDINARY + XWD 400,0 ;S TO T + XWD 300,0 ;S TO C + +PINSIL: MOVSI G,10000 ;KLUDGE A LARGE DISTANCE ON ERROR + JRST PINSIM + ; TOP LEVEL +ROUTER: PUSHJ P,PINSIN ;MAKE DISTANCE TABLE +IFN 0,< MOVE A,BAYNUM + SKIPG B,IBWLNK(A) ;CHECK FOR ANOTHER BAY TO BE ROUTED + JRST ROUTR1 ;NONE, GO ROUTE THIS ONE + PUSH P,SCTR ;SAVE FLAGS + PUSH P,NUMPIN + PUSH P,BAYNUM + PUSHJ P,LINKER ;INITIALIZE THE OTHER BAY + PUSHJ P,PINSIN + POP P,BAYNUM + POP P,A ;MERGE THE 2 PIN COUNTS + POP P,B ;MERGE THE 2 SCTR FLAGS + IORM B,SCTR + JUMPL A,ROUTR1 ;CHECK FOR FIRST BAY EMPTY + SETCMM A + ADDM A,RUNPTR ;RESTORE ORIGINAL RUN POINTER + MOVNS A + ADDM A,NUMPIN + CAMLE A,NUMPIN ;CHECK FOR SECOND BAY EMPTY + JRST ROUTR1 + MOVE B,CBDELT ;ADJUST BOUNDRIES OF SECOND BAY + ASH B,-11 + ADDM B,BNDRY1 + ADDM B,BNDRY3 + ADD A,RUNPTR ;COMPUTE CROSS-BAY DISTANCES + MOVE B,A + +ROUTR2: MOVE C,RUNPTR + HLRZ T,PNTBL(B) ;GET COORD OF PIN IN SECOND BAY + ADD T,CBDELT ;ADJUST RELATIVE TO THE FIRST BAY + +ROUTR3: HLRZ TT,PNTBL(C) ;GET COORD OF PIN IN FIRST BAY + PUSHJ P,CBDST ;GET WIRING DISTANCE + PUSHJ P,MAKDST ;ADJUST AND SAVE + CAILE A,1(C) + AOJA C,ROUTR3 + MOVE C,NUMPIN + ADD C,RUNPTR + CAMLE C,B + AOJA B,ROUTR2 +>;END IFN 0 +ROUTR1: SKIPG A,NUMPIN ;DETECT 0 AND 1 PIN RUNS + POPJ P, ;JRST RUNERR + AOS (P) ;SKIP TO INDICATE WINNING RUN + AOS A + SKIPL ORDFLG ;HAND ORDERING BY ORDER PIN? + JRST PHS1 ;NO,ENTER ROUTING ALGORITHMS. + ; BY ORDER PIN +; THE FOLLOWING ROUTINE ORDERS THE RUN BY ORDER PIN ENTRIES.THE +;WIRING PATH IS DEFINED BY THE POINTER TABLE-RUNLST AND POINTERS +;CORRESPONDING TO THE END PINS OF THE RUN ARE SAVED IN 'ENDS',THUS +;DEFINING THE WIRE PATH IN THE SAME MANNER AS THE ROUTING ALGORITHMS. +;AFTER DEFINING THE PATH,A POPJ IS EXECUTED TO BY PASS THE REST OF THE ROUTER. +; IF THE RUN IS NOT WELL DEFINED BY THE ORDER PINS,HAND ORDERING IS IGNORED +;AND THE RUN IS GIVEN TO THE ROUTING ALGORITHMS FOR PATH DEFINITION. + +IFN 0,< +ILOOP0: SETCM B,NUMPIN ;INIT THE ORDER PIN ROUTING LOOPS. + HRLZS B ;B IS THE OUTER LOOP INDEX. + HRR B,RUNPTR + MOVEM B,INITLP ;SAVE FOR INIT OF INNER LOOPS. + SETOM F ;BLANK ORDER PIN FLAG. +ILOOP1: MOVE D,PNTBL(B) ;GET PINTBL INDEX FOR PIN I. + MOVE T,PINTBL(D) ;SAVE PIN NAME FOR PIN I. + SKIPE D,PINTB1(D) ;IS THERE AN ORDER PIN ENTRY? + JRST JLOOP0 ;YES,MOVE ON TO THE NEXT LOOP. + AOJG F,PHS1 ;NO,THIS CAN HAPPEN ONLY ONCE. + ;HOWEVER THERE MUST BE ONE BLANK. + HRROS RUNLST(B) ;1ST BLANK ORDER PIN,THIS IS AN END. + HRLM B,ENDS ;PLACE POINTER 'I' IN ENDS. + JRST KLOOP0 ;BYPASS J LOOP. +JLOOP0: MOVE E,INITLP ;INIT LOOP TO SEARCH FOR PIN 'J', + ;A PIN NAME MATCHING THE ORDER PIN. +JLOOP1: CAMN E,B ;IS PIN J REALLY PIN I? + JRST JLOOP2 ;YES,BYPASS. + HRRZ C,PNTBL(E) ;GET THE PIN NAME FOR J. + CAMN D,PINTBL(C) ;IS PIN J ORDER PIN I? + JRST JLOOP3 ;YES,TERMINATE SEARCH. +JLOOP2: AOBJN E,JLOOP1 ;NO,SET UP INDEX FOR NEW PIN J. + JRST PHS1 ;NOMATCHES,IGNORE HAND ORDERING. +JLOOP3: HRLM E,RUNLST(B) ;SAVE J AS I'S NEIGHBOR. + HRRM B,RUNLST(E) ;SAVE I AS J'S NEIGHBOR. +KLOOP0: MOVE E,INITLP ;INIT LOOP TO SEARCH FOR ORDER PIN K. +KLOOP1: CAMN E,B ;IS PIN K REALLY PIN I? + JRST KLOOP2 ;YES,BYPASS. + HRRZ C,PNTBL(E) ;NO,GET INDEX FOR PIN K. + CAMN D,PINTB1(C) ;IS ORDER PIN I ORDER PIN K? + JRST PHS1 ;YES,DUPLICATE ORDER PINS,IGNORE HND ORDER. + CAMN T,PINTB1(C) ;IS PIN I THE SAME AS ORDER PIN K? + JRST ILOOP2 ;YES,TERMINATE SEARCH. +KLOOP2: AOBJN E,KLOOP1 ;SET INDEX FOR NEXT ORDER PIN. + MOVE D,RUNLST(B) ;NO MATCHES FOUND,CAN ONLY HAPPEN ONCE. + TRNE D,777777 ;IS THIS THE FIRST TIME? + JRST PHS1 ;NO,TERMINATE HAND ORDERING. + HRRM B,ENDS ;YES,THIS MUST BE AN END PIN. + HLLOS RUNLST(B) ;DESIGNATE AS AND END PIN. +ILOOP2: AOBJN B,ILOOP1 ;TRY NEXT PIN AS THE I PIN. + SKIPGE F ;ALL DONE WITH APPARENT SUCCESS. + JRST PHS1 ;NO END PINS?-FORGET IT! + SETOM HNDOSW ;RUN OK ACCEPT AS HAND ORDERED. + POPJ P, ;EXIT TO BYPASS ROUTING ALGORITHMS. +>;IFN 0 + ; PHS1 +;PHS1 - PHASE ONE OF RUN OPTIMIZING +;PUTS PIN 0 INTO THE RUN, THEN FINDS THE PIN NEAREST PIN 0 AND +;PUTS THAT INTO THE RUN. FROM THEN ON, IT KEEPS TRACK OF THE TWO +;END PINS OF THE RUN. THE PIN NEAREST EITHER OF THE TWO END PINS +;IS ALWAYS THE NEXT PIN PUT INTO THE RUN. THE PROCESS CONTINUES +;UNTIL THE RUN INCLUDES ALL THE PINS. THIS RUN FORMS THE FIRST +;APPROXIMATION FOR PHASE TWO WHICH FOLLOWS. + +;THE RUN TABLE HAS ONE WORD FOR EACH PIN IN THE RUN. THE RIGHT +;AND LEFT HALVES OF THIS WORD HAS THE PIN NUMBERS OF THE TWO +;NEIGHBORING PINS. -1 MEANS THE END OF THE RUN. + +PHS1: SETZM ENDS ;SET BOTH ENDS OF RUN TO FIRST PIN + SETOM RUNLST ;SET BOTH NEIGHBORS OF FIRST PIN TO ENDS + MOVE B,[XWD RUNLST,RUNLST+1] ;WIPE OUT THE WHOLE RUN TABLE + BLT B,RUNLST+MAXP-1 + SETZM TOTDST ;SET CUMULATIVE DISTANCE TO 0 + SETZM LSTLNG ;CLEAR COUNT OF NO. PINS IN RUN + SETOM PHSSW ;SET SWITCH TO EXAMINE 1 END + MOVSI TTT,ROUMRK ;BIT FOR MARKING PINS IN THE RUN + ORM TTT,PNTBL ;MARK FIRST PIN + +PHS10: HRLOI T,377777 ;SET MIN LENGTH TO INFINITY + MOVEM T,LNGMIN + HRRZ T,ENDS ;GET ONE END OF THE RUN + +PHS11: MOVEI TT,-1(A) ;INDEX THROUGH ALL PINS +PHS13: TDNE TTT,PNTBL(TT) ;THIS PIN MARKED YET? + JRST PHS12 ;YES, SKIP TO NEXT PIN + MOVE B,T ;GET THE TWO INDICES + MOVE C,TT + CAMG B,C ;SMALLER INDEX MUST BE IN C + EXCH B,C + MOVE B,@PTRTBL-1(B) ;GET DISTANCE BETWEEN PINS + CAML B,LNGMIN ;IS IT SHORTER? + JRST PHS12 ;NO, TRY ELSEWHERE + SETZM LSTEMP ;FLAG NEW WINNER FOUND + MOVEM B,LNGMIN ;YES, SAVE NEW RECORD + MOVEM TT,LSTCND ;SAVE CANDIDATE FOR INCLUSION + +PHS12: SOJGE TT,PHS13 ;TRY NEXT PIN (DONE?) + SOS B,PHSSW ;PERHAPS, CHECK SWITCH + AOJN B,PHS14 ;DONE THIS PASS? + SETOM LSTEMP ;NO, HALF DONE. FLAG 1ST HALF + HLRZ T,ENDS ;GET OTHER END OF LIST + JRST PHS11 ;REPEAT + +PHS14: MOVE T,LSTCND ;GET THE WINNER + ORM TTT,PNTBL(T) ;MARK IT + SKIPL LSTEMP ;WINNER CONNECTED TO RIGHT END? + MOVSS ENDS ;NO, MAKE IT THE RIGHT END + HRL T,ENDS ;GET OLD END + HRRM T,ENDS ;SAVE NEW END + PUSHJ P,CNEND ;CONNECT POINTERS TO NEIGHBORS + MOVE B,LNGMIN ;ADD LENGTH INTO CUMULATIVE TOT + ADDM B,TOTDST + SETZM PHSSW ;RESET SWITCH + AOS B,LSTLNG ;COUNT PINS IN RUN + CAILE A,1(B) ;DONE PHASE 1? + JRST PHS10 ;NO, REPEAT AD INFINITUM + SKIPN FASRAY ;CHEAT, DON'T DO FULL ROUTING + CAIG A,3 ;FILTER OUT 2 &3 PIN RUNS. + POPJ P, + ; PHS2 +;PHS2 - PHASE TWO +;EACH PIN, STARTING WITH PIN 0, IS IN TURN TAKEN OUT OF +;THE RUN THUS LEAVING TWO DISCONNECTED PIECES IN GENERAL. +; FIRST A NEW SITE FOR THE CHOSEN PIN IS LOOKED FOR BY +;SQUEEZING THE PIN BETWEEN EACH OF THE REMAINING PAIRS +;OF PINS. THEN THE TWELVE WAYS OF RECONNECTING THE PIN +;AND THE TWO PIECES ARE TRIED. OF ALL THESE, THE MINIMUM +;CONFIGURATION IS PRESERVED AND THE PROCESS IS REPEATED +;ON PIN N+1. A PASS TERMINATES WHEN ALL PINS HAVE BEEN +;THUS EXAMINED. IF ANY IMPROVEMENTS WERE DISCOVERED, +;ANOTHER PASS IS MADE. + +PHS2: SETOM IMPRV3 ;SET FLAG TO GO THRU PHASE 3 +PHS2A: MOVE A,NUMPIN ;START THE PASS WITH HIGHEST PIN + SETZM IMPRV ;CLEAR THE IMPROVEMENT FLAG + +PHS29: HRRZ T,ENDS ;START AT ONE END OF THE RUN + CAMN T,A ;ALREADY FOUND THE REMOVED PIN? + HLRZ T,ENDS ;YES, SO START AT THE OTHER END + HRLOI B,77777 ;SET BEST DISTANCE TO INFINITY + MOVEM B,MINLNG + MOVNI TTT,1 ;T HAS THIS PIN - TT HAS + ;NEXT PIN - TTT HAS PREVIOUS PIN + +PHS26: HRRE TT,RUNLST(T) ;FIND NEXT PIN + CAMN TT,TTT ;FOUND PREV. PIN INSTEAD? + HLRE TT,RUNLST(T) ;YES, SO TAKE OTHER PIN + CAMN TT,A ;FOUND THE REMOVED PIN? + JRST PHS20 ;YES, THE ENDS OF THE 2 PIECES + ;ARE NOW IDENTIFIABLE + SKIPGE C,TT ;FOUND THE FAR END OF THE RUN? + JRST PHS21 ;YES, GO CLEAN UP + MOVE B,T ;COMPUTE DISTANCE COST IF PIN + ;SQUEEZED IN HERE + CAMG B,C + EXCH B,C + MOVN D,@PTRTBL-1(B) ;DISTANCE SAVED BY BREAKING + ;CONNECTION BETWEEN NEIGHBORS + PUSHJ P,PHS22 ;ADD IN 2 NEW LEGS GENERATED + CAML D,MINLNG ;MORE BETTERER?? + JRST PHS24 ;NO, GO TO NEXT PAIR + MOVEM D,MINLNG ;YES, SAVE NEW RECORD + HRRM T,BSTSPT ;SAVE THIS PAIR + HRLM TT,BSTSPT + +PHS24: MOVE TTT,T ;THIS PIN BECOMES PREV. PIN + MOVE T,TT ;NEXT PIN BECOMES THIS PIN + JRST PHS26 ;REPEAT + ; PHS22, PHS20 +;PHS22 - SUBROUTINE FOR PHASE 2 +;ADDS UP THE DISTANCES FOR THE TWO LEGS PUT IN WHEN A PIN +;IS SQUEEZED IN BETWEEN TWO NEIGHBORING PINS + +PHS22: MOVE C,T ;ADD IN LEG FROM THIS PIN + PUSHJ P,PHS221 + MOVE C,TT ;ADD IN LEG FROM NEXT PIN +PHS221: MOVE B,A ;GET OTHER INDEX + CAMG B,C + EXCH B,C + ADD D,@PTRTBL-1(B) ;ADD IN APPROPRIATE DISTANCE + POPJ P, ;RETURN + +;PHS20 - A PIECE OF PHASE 2 LOGIC +;COMES HERE WHEN THE FIRST OF THE TWO DISCONNECTED PIECES IS +;SCANNED. AT THIS POINT, BUT NOT BEFORE, THE FOUR ENDS OF THE +;TWO PIECES ARE IDENTIFIABLE. THE MINIMUM WAY TO HOOK +;UP THE TWO PIECES WITHOUT INVOLVING THE REMOVED PIN IS FOUND + +PHS20: MOVE TT,RUNLST(A) ;THE NEIGHBORS OF THE REMOVED PIN + ;ARE THE CUT ENDS OF THE 2 PIECES + CAIN T,(TT) ;MAKE THE END ALREADY FOUND + ;BE IN THE LEFT HALF + MOVSS TT + TRNE TT,400000 ;IS THE SELECTED PIN AN END? + JRST PHS201 ;YES, WE ARE DONE + MOVE TTT,ENDS ;GET THE REAL ENDS + ROTC TT,22 ;PUT APPROPRIATE ENDS TOGETHER + MOVEM TT,SEG1 ;SAVE ENDS OF 1ST SEGMENT + MOVEM TTT,SEG2 ;LIKEWISE THE 2ND SEGMENT + PUSHJ P,PHS25 ;FIND THE MINIMUM LINK TO + ;HOOK UP THE TWO PIECES + MOVEM D,LNKDST ;SAVE THE RESULT + MOVEI D,0 + PUSHJ P,PHS23 ;FIND THE DISTANCE SAVED BY + ;CUTTING THE CHOSEN PIN OUT OF + ;THE RUN + MOVEM D,SUBTOT ;SAVE THIS RESULT + HRRZ T,TT ;CONTINUE TO THE OTHER SEGMENT + MOVE TTT,A + JRST PHS26 + ; PHS201 +;PHS201 - A PIECE OF PHASE 2 LOGIC +;COME HERE WHEN THE SELECTED PIN IS AT AN END + +PHS201: SETZB D,LNKDST ;REMOVING SELECTED PIN FORM 1 PIECE + PUSHJ P,PHS23 ;FIND DISTANCE SAVED BY REMOVAL + MOVEM D,SUBTOT ;SAVE THE GAIN + HRRZ B,ENDS ;TRY THIS PIN AT THE OTHER END + CAMN B,A ;OTHER END FOUND? + MOVSS ENDS ;NO, SO SWAP + HRRZ B,ENDS ;GET THE OTHER END + MOVE C,A ;GET THE LENGTH + CAMG B,C + EXCH B,C + MOVE D,@PTRTBL-1(B) + CAML D,MINLNG ;IS THIS THE LOWEST COST? + JRST PHS202 ;NO, GO FINISH UP + MOVEM D,MINLNG ;YES, SAVE NEW PARAMS + MOVSS D,ENDS ;MAKE IT EASY TO UPDATE ENDS + HLROM D,BSTSPT ;SAVE NEW LOCATION FOR THE PIN + +PHS202: MOVE D,MINLNG ;HAVE WE FOUND A REAL IMPROVEMENT? + CAML D,SUBTOT + JRST PHS28 ;NO, TRY THE NEXT PIN + SUB D,SUBTOT ;COMPUTE NEW RUN LENGTH + ADDM D,TOTDST + PUSHJ P,TKOUT ;RECONNECT THE RUN + MOVE B,BSTSPT + EXCH B,RUNLST(A) + SKIPL B + MOVSS B + HRLM B,ENDS ;UPDATE THE NEW END + JRST PHS212 ;FINISH UP AND TRY THE NEXT PIN + ; PHS25, PHS23 +;PHS25 - SUBROUTINE FOR PHASE 2 +;FINDS THE MINIMUM PATH FOR CONNECTING THE TWO +;DISCONNECTED PIECES OF THE RUN + +PHS25: HRLOI D,377777 ;SET MIN DISTANCE TO INFINITY + PUSHJ P,PHS252 ;TRY TWO OF THE WAYS TO HOOK UP + MOVSS TT ;TRY THE OTHER TWO WAYS +PHS252: PUSHJ P,PHS251 ;HOOK UP ENDS AS THEY STAND + MOVSS TTT ;TURN SEGMENT 2 AND TRY AGAIN + +PHS251: HLRZ B,TT ;GET ONE END + HLRZ C,TTT ;AND THE OTHER + CAMG B,C + EXCH B,C + CAMG D,@PTRTBL-1(B) ;IS THIS LEG SHORTER? + POPJ P, ;NO, SO RETURN + MOVE D,@PTRTBL-1(B) ;SAVE THIS DISTANCE + HRRM B,ENDCON ;SAVE WHICH LINK TO MAKE + HRLM C,ENDCON + POPJ P, ;RETURN + +;PHS23 - SUBROUTINE FOR PHASE 2 +;FINDS THE DISTANCE SAVED BY CUTTING THE SELECTED PIN OUT +;OF THE RUN + +PHS23: HLRE C,RUNLST(A) ;GET ONE NEIGHBOR + SKIPL C ;IGNORE IF IT IS AN END + PUSHJ P,PHS221 ;GET THAT DISTANCE + HRRE C,RUNLST(A) ;GET THE OTHER + JUMPGE C,PHS221 ;GET THAT DISTANCE AND RETURN + POPJ P, ;UNLESS IT IS AN END + ; PHS21 +;PHS21 - A PIECE OF PHASE 2 LOGIC +;COME HERE WHEN ALL WAYS TO SQUEEZE BACK THE SELECTED PIN +;HAVE BEEN TRIED. PHS21 TRIES THE 12 WAYS TO RECONNECT THE +;TWO PIECES AND THE SELECTED PIN WITHOUT SQUEEZING BETWEEN +;ALREADY CONNECTED PINS. + +PHS21: MOVE D,LNKDST ;COMPUTE REAL DISTANCE TO BEAT + ADDM D,MINLNG + PUSHJ P,PHS27 ;TRY THE 12 REMAINING PATTERNS + MOVE D,MINLNG ;GET THE MINIMUM COST + CAML D,SUBTOT ;COMPARE WITH THE SAVINGS + JRST PHS28 ;NOT GOOD ENOUGH, TRY AGAIN + SUB D,SUBTOT ;COMPUTE THE NEW TOTAL LENGTH + ADDM D,TOTDST + PUSHJ P,TKOUT ;TAKE OUT THE SELECTED PIN + MOVE T,ENDCON ;MAKE THE SELECTED BRIDGE + PUSHJ P,CNEND + MOVE B,BSTSPT ;SQUEEZE THE PIN BACK IN + EXCH B,RUNLST(A) + PUSHJ P,UPDEND ;UPDATE THE NEW ENDS + SKIPL E,RUNLST(A) ;IS THE NEW CANDIDATE AN END? + JRST PHS212 ;N0. + HRRZ D,ENDS ;YES,ADJUST ENDS. + CAIE D,(E) + HRLM A,ENDS + CAIN D,(E) + HRRM A,ENDS +PHS212: PUSHJ P,PUTIN + SETOM IMPRV ;FLAG AN IMPROVEMENT + ; PHS28, UPDEND +PHS28: SOJGE A,PHS29 ;STEP TO NEXT PIN (DONE?) + SKIPGE IMPRV ;YES, ANY IMPROVEMENTS? + JRST PHS2 ;YES, REPEAT THIS PHASE + SKIPGE IMPRV3 ;SKIP PHASE 3 FOR 2 FAILURES + PUSHJ P,PHS3 ;NOW SEE WHAT PHASE 3 CAN DO + AOSN IMPRV3 ;DID PHASE 3 DO ANY GOOD? + JRST PHS2A ;YES, REDO PHASE 2 + POPJ P, ;DONE, RETURN FOR FINAL OUTPUT + +;UPDEND - UPDATE ENDS +;CHECKS THAT THE OLD ENDS OF THE RUN ARE STILL ENDS. IF NOT, +;IT LOOKS FOR NEWLY GENERATED ENDS IN THE 2 HALVES OF B. + +UPDEND: MOVE C,[XWD 400000,400000] ;CODE FOR TESTING SIGN + ;BITS OF BOTH HALVES + PUSHJ P,.+2 ;CHECK ONE OLD END + MOVSS ENDS ;SWAP ENDS + HRRZ D,ENDS ;GET ONE END + TDNE C,RUNLST(D) ;EITHER SIGN BIT ON? IE. IS=END? + POPJ P, ;YES, RETURN +UPDEN1: MOVSS B ;NO, CHECK ONE HALF OF B, SWAP + ;TO CHECK OTHER HALF NEXT TIME + HLRZ E,ENDS ;DONT LET BOTH ENDS BE EQUAL + CAIE E,(B) + TDNN C,RUNLST(B) ;IS THIS THE REAL NEW END? + JRST UPDEN1 ;NO, IT MUST BE THE OTHER HALF + HRRM B,ENDS ;REPLACE WITH THE NEW END + POPJ P, ;RETURN + ; PHS27 +;PHS27 - SUBROUTINE FOR PHASE 2 +;IN EFFECT, PHS27 TAKES THE TWO SEGMENTS IN SOME PARTICULAR +;ORIENTATION, CONNECTS THE TWO PIECES AND THE SINGLE PIN +;INTO A LOOP, AND THROWS OUT THE LONGEST LINK IN THE LOOP. THEN +;THE ORIENTATION OF ONE OF THE PIECES IS SWITCHED AND THE PROCESS +;REPEATED. THE SMALLEST RESULT IS KEPT. + +PHS27: PUSHJ P,PHS274 ;TRY 2 OF THE 4 ORIENTATIONS + MOVSS SEG2 ;TRY THE OTHER 2 +PHS274: PUSHJ P,PHS271 ;TRY THIS ORIENTATION + MOVSS SEG1 ;THEN TRY ANOTHER + +PHS271: SETZB D,T ;CLR TOT DISTANCE AND MAX + HLR TT,SEG1 ;CALCULATE FINAL RESULTS IN + ;CASE THIS LINK IS LONGEST + HLL TT,SEG2 + HRRO TTT,SEG2 + HRRZ C,SEG1 ;CONNECT PIN TO THIS END + PUSHJ P,PHS272 ;GET DISTANCE AND COMPARE + HRRZ C,SEG2 ;CONNECT PIN TO OTHER END + HRRO TTT,SEG1 ;FINAL RESULT IF ... + PUSHJ P,PHS272 ;GET DISTANCE AND COMPARE + HLRZ B,SEG1 ;CONNECT 2 ENDS TOGETHER + HLRZ C,SEG2 + HRR TT,SEG1 ;FINAL RESULTS IF ... + HRL TT,SEG2 + MOVE TTT,TT + PUSHJ P,PHS273 ;GET DISTANCE AND COMPARE + SUB D,T ;SUBTRACT OFF BIGGEST LINK + CAML D,MINLNG ;IS THIS THE BEST SO FAR? + POPJ P, ;NO, RETURN + MOVEM D,MINLNG ;YES, SO SAVE RESULTS + MOVEM TTTT,ENDCON + MOVEM G,BSTSPT + POPJ P, ;RETURN + +PHS272: MOVE B,A ;PICK UP OTHER INDEX +PHS273: CAMG B,C ;GET DISTANCE + EXCH B,C + ADD D,@PTRTBL-1(B) ;ADD INTO TOTAL + CAML T,@PTRTBL-1(B) ;BIGGEST SO FAR? + POPJ P, ;NO SO RETURN + MOVE T,@PTRTBL-1(B) ;YES, SO SAVE THIS DISTANCE + MOVEM TT,TTTT ;SAVE RESULT + MOVEM TTT,G + POPJ P, ;RETURN + ; TKOUT, PUTIN, CNEND +;TKOUT - TAKE OUT +;SUBROUTINE TO CUT A PIN OUT OF THE RUN + +TKOUT: HLRE B,RUNLST(A) ;PICK UP ONE NEIGHBOR TO CUT OUT + PUSHJ P,.+2 ;DO IT + HRRE B,RUNLST(A) ;PICK UP THE OTHER + JUMPL B,CPOPJ ;DO NOTHING AT AN END + HRRZ C,RUNLST(B) ;CLOBBER RIGHT HALF? + CAMN C,A + HLLOS RUNLST(B) ;YES + CAME C,A ;CLOBBER LEFT HALF? + HRROS RUNLST(B) ;YES + POPJ P, ;RETURN + +;PUTIN - PUT A PIN BACK IN + +PUTIN: HLRE B,RUNLST(A) ;GET THE COMPONENTS OF THE + ;BRIDGE TO BREAK + HRRE C,RUNLST(A) + PUSHJ P,.+2 ;RECONNECT ONE NEIGHBOR + EXCH B,C ;DO SAME FOR OTHER NEIGHBOR + JUMPL B,CPOPJ ;DO NOTHING IF NEIGHBOR IS END + HRRE D,RUNLST(B) ;CLOBBER RIGHT HALF? + CAMN C,D + HRRM A,RUNLST(B) ;YES, SO DO IT + CAME C,D ;CLOBBER LEFT HALF? + HRLM A,RUNLST(B) ;YES, SO DO IT + POPJ P, ;RETURN + +;CNEND - CONNECT ENDS + +CNEND: PUSHJ P,CNEND1 ;CONNECT ONE LINK + MOVSS T ;CONNECT THE OTHER WAY +CNEND1: SKIPL RUNLST(T) ;END MARKED IN LEFT HALF? + HLRM T,RUNLST(T) ;NO, SO CLOBBER RIGHT HALF + SKIPGE RUNLST(T) ;END MARKED IN LEFT HALF? + HLLM T,RUNLST(T) ;YES, SO CLOBBER IT + POPJ P, ;RETURN + ; PHS3 +;PHS3 - PHASE 3 +;THE RUN IS BROKEN IN TWO PLACES TO FORM THREE PIECES. THE +;THREE PIECES ARE THEN RECONNECTED IN ALL 24 POSSIBLE WAYS. +;ANY WAY THAT PROVIDES A REDUCTION IN RUN LENGTH IS KEPT. +;THE PROGRAM KEEPS TRACK OF THE ENDS OF THE THREE PIECES +;AND ONLY CLOBBERS POINTERS WHEN AN IMPROVEMENT IS FOUND. + +PHS3: SETZM IMPRV3 ;CLEAR THE IMPROVEMENT FLAG +PHS300: MOVE A,ENDS ;SET UP THE INITIAL 3 SEGMENTS + HRLM A,SEG1 ;SEG1 IS THE "LEFTMOST" PIN + HLLM A,SEG3 ;SEG3 CONTAINS THE "RIGHTMOST" PINS + SETOM C ;DUMMY UP A POINTER FOR THE + ;FIRST ADVANCE + SETZM MINLNG ;SET NET IMPROVEMENT TO 0 + PUSHJ P,PHS30 ;GO DO ALL THE WORK + SKIPL A,MINLNG ;WAS AN IMPROVEMENT FOUND? + POPJ P, ;NO, SO QUIT + ADDM A,TOTDST ;UPDATE THE TOTAL DISTANCE + HRRZ B,SEG1 ;REALLY BREAK THE RUN INTO 3 + HLRZ C,SEG2 ;MAKE THE FIRST CUT + PUSHJ P,DCON + HRRZ B,SEG2 ;MAKE THE OTHER CUT + HRRZ C,SEG3 + PUSHJ P,DCON + MOVE T,LSEG1 ;RECONNECT THE PIECES INTO A LOOP + HLL T,LSEG2 + PUSHJ P,CNEND + MOVE T,LSEG2 + HLL T,LSEG3 + PUSHJ P,CNEND ;MAKE THE SECOND LINK + MOVE T,LSEG3 + HLL T,LSEG1 + PUSHJ P,CNEND ;CLOSE THE LOOP + MOVE B,DCNECT ;NOW BREAK THE APPROPRIATE LINK + HRRZ C,ENDS ;START AT A DIFFERENT END NEXT TIME + CAIN C,(B) + MOVSS B + MOVEM B,ENDS ;THIS BREAK FORMS THE NEW ENDS + HLRZ C,B + HRRZS B + PUSHJ P,DCON + SETOM IMPRV3 ;TELL THE WORLD THE GOOD NEWS + JRST PHS300 + ; PHS32, PHS30 +;PHS32 - A WRAPPED LOOP FOR PHS30 +;PHS30 - A SUBROUTINE FOR PHASE 3 +;PHS30 CYCLES THROUGH A POSSIBLE PAIRS OF PLACES TO BREAK THE +;RUN. PHS31 IS CALLED TO TRY THE WAYS TO RECONNECT THE PIECES. +;AS SOON AS PHS31 FINDS AN IMPROVEMENT, PHS30 RETURNS +;TO THE TOP LEVEL. + +PHS32: HRRM B,SEG2 ;UPDATE THE END OF SEGMENT 2 + HRRM C,SEG3 ;LIKEWISE SEG3 + CAMG B,C ;FIND THE DISTANCE SAVED BY + EXCH B,C ;MAKING THE TWO CUTS + MOVE D,@PTRTBL-1(B) + HRRZ B,SEG1 + HLRZ C,SEG2 + CAMG B,C + EXCH B,C + ADD D,@PTRTBL-1(B) + MOVEM D,SUBTOT ;SAVE THE SAVINGS + PUSHJ P,PHS31 ;TRY RECONNECTING + SKIPGE MINLNG ;IMPROVEMENTS? + POPJ P, ;YES! + MOVE A,SEG2 ;SHRINK SEG3, EXPAND SEG2 + HRRZ B,SEG3 +PHS33: HRRE C,RUNLST(B) ;GET THE NEW END FOR SEG3 + CAIN C,(A) ;GOT THE WRONG LINK? + HLRE C,RUNLST(B) ;YES, GET THE OTHER + JUMPGE C,PHS32 ;SEG3 SQUEEZED OFF THE END? + MOVE C,SEG1 ;YES, SO EXPAND SEG1, MAKE SEG2 + MOVS A,SEG2 ;BE EXACTLY 1 PIN, SEG3 BE THE + ;REST +PHS30: HRRZ B,RUNLST(A) ;GET THE NEW END FOR SEG2 + CAIN B,(C) ;GOT THE WRONG LINK? + HLRZ B,RUNLST(A) ;YES, GET THE OTHER + MOVS C,ENDS ;IS SEG2 SHOVED ONTO THE END PIN? + CAIN B,(C) + POPJ P, ;YES, SO WE ARE DONE + HRRM A,SEG1 ;UPDATE THE NEW END OF SEG1 + HRLM B,SEG2 ;LIKEWISE SEG2 + JRST PHS33 ;TIE DOWN THE LOOSE ENDS + ; PHS31 +;PHS31 - SUBROUTINE FOR PHASE 3 +;PHS31 CYCLES THROUGH THE 8 PERMUTATIONS OF THE THREE +;SEGMENTS BY FLIPPING EACH SEGMENT IN TURN IN A BINARY +;SEQUENCE. IF A SEGMENT CONTAINS ONLY 1 PIN, THE SEQUENCE +;IS SHORTENED BY NOT FLIPPING THAT SEGMENT. +;PHS313 CONNECTS THE RESULTING PERMUTATION INTO A LOOP ANDS +;FINDS AND THROWS AWAY THE LONGEST LINK. + +PHS31: MOVE T,SEG1 ;TRY SEG1 UNFLIPPED + PUSHJ P,PHS311 + MOVSS T ;FLIP SEG1 AND TRY AGAIN + CAMN T,SEG1 ;BUT NOT IF SEG1 HAS 1 PIN + POPJ P, +PHS311: MOVE TT,SEG2 ;TRY SEG2 UNFLIPPED + PUSHJ P,PHS312 + MOVSS TT ;FLIP SEG2 AND TRY AGAIN + CAMN TT,SEG2 ;BUT NOT IF SEG2 HAS 1 PIN + POPJ P, +PHS312: MOVE TTT,SEG3 ;TRY SEG3 UNFLIPPED + PUSHJ P,PHS313 + MOVSS TTT ;FLIP SEG3 AND TRY AGAIN + CAMN TTT,SEG3 ;BUT NOT IF SEG3 HAS 1 PIN + POPJ P, + +PHS313: MOVNI E,1 ;SET LONGEST LINK NEGATIVE + MOVN A,SUBTOT ;START COMPUTING NET GAIN + MOVEI B,(T) ;GET LENGTH OF 1ST LINK + HLRZ C,TT + PUSHJ P,PHS34 + MOVEI B,(TT) ;REPEAT FOR SECOND LINK + HLRZ C,TTT + PUSHJ P,PHS34 + MOVEI B,(TTT) ;REPEAT FOR THIRD LINK + HLRZ C,T + PUSHJ P,PHS34 + SUB A,E ;THROW AWAY THE LONGEST LINK + CAML A,MINLNG ;IS THE IMPROVEMENT REALLY? + POPJ P, ;NO, TRY AGAIN + MOVEM A,MINLNG ;SAVE THE SAVING + MOVE A,[XWD T,LSEG1] ;SAVE POINTERS FOR RECONSTRUCTING + BLT A,DCNECT ;THIS SOLUTION + POPJ P, ;TRY AGAIN + ; PHS34, DCON +;PHS34 - SUBROUTINE FOR PHASE 3 +;PHS34 FINDS THE MAXIMUM LINK FOR PHS31 AND ADDS UP THE +;LINKS AS IT GOES ALONG. + +PHS34: CAMG B,C ;GET LENGTH OF THE SELECTED LINK + EXCH B,C + MOVE D,@PTRTBL-1(B) + ADD A,D ;CUMULATE THE DISTANCES + CAMG D,E ;IS THIS THE LONGEST? + POPJ P, ;NO, DO NOTHING + MOVE E,D ;YES, SAVE THIS LENGTH + HRL C,B ;SAVE POINTERS FOR THROWING + MOVE TTTT,C ;THIS LINK AWAY + POPJ P, + +;DCON - DISCONNECT +;BREAKS THE CONNECTION BETWEEN TWO PINS BY CHANGING THE LINKS +;TO END POINTERS + +DCON: PUSHJ P,DCON1 ;BREAK ONE POINTER + EXCH B,C ;BREAK THE OTHER +DCON1: HRRZ A,RUNLST(B) ;IS THE LEFT HALF THE VICTIM? + CAMN A,C + HLLOS RUNLST(B) ;NO, CLOBBER THE RIGHT HALF + CAME A,C + HRROS RUNLST(B) ;YES, CLOBBER THE LEFT HALF + POPJ P, ;RETURN + ; STORAGE +;TEMPORARY STORAGE + +NUMPIN: 0 ;THE HIGHEST PIN NUMBER READ IN +ENDS: 0 ;LEFT AND RIGHT HALVES CONTAIN + ;THE TWO ENDS OF THE RUN +TOTDST: 0 ;THE CURRENT LENGTH OF THE RUN +LSTLNG: 0 ;THE NUMBER OF PINS INCLUDED +PHSSW: 0 ;A FLAG FOR PHASE 1 +LNGMIN: 0 ;SHORTEST LINK FOUND IN PHASE 1 +LSTCND: 0 ;CURRENT CANDIDATE TO GO NEXT + ;INTO THE RUN +LSTEMP: 0 ;TEMPORARY FOR LSTCND DURING + ;THE SECOND HALF OF PHASE 1 +IMPRV_PHSSW ;A FLAG FOR PHASE 2 +MINLNG_LNGMIN ;SHORTEST ADDITION TO THE LENGTH + ;OF THE RUN FOUND IN PHASE 2 +BSTSPT_LSTCND ;BEST PLACE TO SQUEEZE IN THE + ;SELECTED PIN +LNKDST_LSTLNG ;LENGTH ADDED BY BRIDGING + ;ACROSS CUT ENDS +ENDCON_LSTEMP ;THE TWO ENDS TO BRIDGE ACROSS +SUBTOT: 0 ;DISTANCE SAVED BY CUTTING THE + ;SELECTED PIN OUT OF THE RUN +SEG1: 0 ;THE TWO ENDS OF ONE OF THE CUT + ;PIECES +SEG2: 0 ;THE TWO ENDS OF THE OTHER PIECE +SEG3_BSTSPT ;THE 3RD SEGMENT FOR PHASE 3 +LSEG1: 0 ;THE RECOMMENDED PERMUTATION +LSEG2: 0 ;FOR PHASE 3 +LSEG3: 0 ;... +DCNECT: 0 ;THE UNRECOMMENDED CONNECTION +IMPRV3: 0 ;IMPROVEMENT FLAG FOR PHASE 3 +INITLP_SUBTOT ;TEMP LOC USED FOR LOOP INIT. + +SCTR: 0 ;COUNTER FOR NUMBER OF S-PINS +HNDOSW: 0 ;FLAG FOR HAND ORDERED RUNS +SCPTR: POINT 3,PNTBL(E),17 ;BYTE PTR TO S/C NUMBER +ORDPTR: POINT 10,PNTBL(E),14 ;POINTER TO ORDER CODE + ; TABLES + +;PTRTBL - POINTER TABLE +;TABLE OF POINTERS FOR PHANTOM DOUBLE INDEXING ON THE +;TRIANGULAR DISTANCE MATRIX. ACCUMULATOR C MUST HAVE THE +;SMALLER PIN NUMBER. IF AC HAS THE OTHER PIN NUMBER, REFER +;TO THE DISTANCE TABLE BY - MOVE X,@PTRTBL-1(AC). + +PTRTBL: FOR I_0,MAXP-1 + <C,,DISTBL+I*(I+1)/2 +> +PTRTB1_PTRTBL-1 + +;DISTBL - DISTANCE TABLE +;A TRIANGULAR MATRIX OF THE LENGTH OF WIRE REQUIRED +;TO CONNECT ALL POSSIBLE PAIRS OF PINS. ROW 1 HAS DISTANCE +;BETWEEN PINS 1-0, ROW 2 HAS DISTANCE BETWEEN PINS 2-0, 2-1, +;ROW 3 HAS 3-0, 3-1, 3-2, ETC. +;DISTBL SPACE IS TAKEN FROM THE FREE SPACE AT JOBFF. + +DISTBL: BLOCK MAXP*(MAXP+1)/2 ;ASSEMBLE IN FOR NOW + +;PNTBL - PIN TABLE +;CONTAINS PIN POINTERS, "SCT" INFO, ORDER #, AND MARK BIT +;BITS IN PNTBL WORD USED BY ROUTER +;RPGPIN__400000 ;THIS IS A POWER OR GROUND PIN, IT IS NOT IN WIRE LIST +;RERPIN__200000 ;THIS PIN IS IN ERROR IN SOME WAY, DON'T WIRE IT! +;ROUMRK__100000 ;MARK BIT FOR ROUTER +;BITS 5-14 ORDER # +;BITS 15-17 "SCT" CHARS +;BITS 18-35 PIN POINTER + +;SCT "CHARS" USED TO FORCE A PIN TO END OF RUN +; 1 - TERMINATOR PIN +; 2 - CONNECTOR +; 4 - SOURCE + +PNTBL: BLOCK MAXP ;PIN POINTER +PNTBL1: BLOCK MAXP ;PIN-SPEC (FLAGS+PIN#,,SLOT#) + +COMMENT  +;BITS USED IN PNTBL1 FOR PIN IDENTIFICATION +MAPCON__400000 ;THIS IS A CON (MUST BE SIGN BIT) +MAPSOC__40000 ;THIS IS NOW A POST-LOC, HAS BEEN MAPPED ONTO BOARD +;777 ;PIN # FOR BODIES IN LEFT HALF +%%PINN__221100 +$$PINN__777 +;( In some board types, the format for V or G pins is pin# 0, with MAPPWR or MAPGND set.) + + +;RUNLST - RUN LIST +;A table of pointers representing the order in which to wire +;a run. The n'th entry has the two neighbors of pin n (as indices into PNTBL) in +;the right and left halves. -1 means the end of run. + +RUNLST: BLOCK MAXP+1 + SUBTTL ROUTER INTERFACE SUBRS +;SUBROUTINES TO INTERFACE WL WITH ROUTER + +;WIRSET - ROUTINE TO FILL PNTBL WITH PROPER ENTRIES FOR ROUTING +;CALL WITH POINTER TO WIRE IN W, FIRST PIN IN H +;RETURNS +; ILLEGAL (1 PIN RUN) +; TOO MANY PINS IN RUN (H IS CURRENT POINT IN PIN LIST) + +WIRSET: MOVEI G,PNTBL-1 ;PUSHDOWN POINTER FOR PINS + MOVEI F,MAXP +WIRST1: FETCH(TTT,H,PBIT) + TRNE TTT,DUP + JRST WIRSTD + PUSHJ P,WIRSTP ;GRONK ONE PIN + JRST CPOPJ1 ;TABLE FULL +WIRSTD: FETCH(H,H,NXTP) + JUMPN H,WIRST1 +WIRSTE: HLRZ G,G + SOJLE G,CPOPJ ;SKIP TRIVIAL RUNS + MOVEM G,NUMPIN + AOS (P) + JRST CPOPJ1 + +WIRSTP: SOJL F,CPOPJ ;LOSE IF RUN OUT OF SPACE + PUSHJ P,NAMMAP ;FLAG AND MAP PIN! + JRST [ TLO TTT,RERPIN ;MARK AS ERROR + MOVEI T,RFBAD + MOVEM T,LOSFLG + JRST .+1] + PUSH G,TTT ;STORE FLAGS AND PIN POINTER IN SECONDARY TABLE + MOVEM A,PNTBL1-PNTBL(G) + JRST CPOPJ1 + + +;NAMMAP - CONVERT A PIN# AND DIP LOCN INTO ACTUAL SOCKET POST +;NAMMAP - H = PIN +;PNAMEP - B = BODY, TT = PINN +;SKIPS IF GOOD PIN +;A = PIN SPEC (MBIT+PINN,,LOC) OF SOCKET PIN +;TTT(LH) = ROUTER FLAGS (NONE FOR NOW) +;TTT(RH) = PTR TO PIN BLOCK + +NAMMAP: HRRZ TTT,H +IFN 0,< ;DISABLE FEATURE FOR PUTTING CONNECTORS + ; OR OUTPUTS AT END OF RUN + FETCH(T,H,PTYP) + JUMPE T,[FETCH(T,H,PBDY) + FETCH(T,T,BBIT) + TRNE T,CBODY + TLO TTT,2 ;YES + JRST PNAME] + FETCH(T,T,DPBIT) + TRNE T,OUTLD + TLO TTT,4 ;YES, MARK AS SOURCE +PNAME: +>;IFN 0 + FETCH(B,H,PBDY) ;BODY POINTER + FETCH(TT,H,PINN) +PNAMEP: FETCH(A,B,BLOC) + FETCH(T,B,BBIT) + JUMPE A,CPOPJ ;ANY LOC? + TRNE T,BWILD ;WILD CONNECTOR? + POPJ P, ;YES, CAN'T ROUTE + HRL A,TT + TRNE T,CBODY ;CON? + TLO A,MAPCON + FETCH(B,B,BPAK) ;GET PACKAGE CODE + PUSH P,TTT ;REMEMBER ROUTER FLAGS, IF ANY + PUSHJ P,MAPOST ;SKIPS IF SUCCESSFUL + CAIA + AOS -1(P) + POP P,TTT + POPJ P, + +RUNFIX: MOVEI A,-1 + HRRZ B,ENDS +RUNFX1: HLRZ C,RUNLST(B) + CAME C,A ;DOES LEFT HALF POINT TO LAST? + MOVSS RUNLST(B) ;NO, SWAP + MOVE A,B + HRRE B,RUNLST(B) + JUMPGE B,RUNFX1 ;CONTINUE TO OTHER END OF RUN + POPJ P, + +NOHND: 0 +ORDFLG: 0 ;< 0 BY ORDER PIN + ;= 0 ROUTE + ;> 0 BY ORDER # + +ZLEVN: 0 ;Z LEVEL FOR RUN +RAYLVL: 0 ;Z LEVEL USED BY RATHEON ROUTINES +INCHES: 0 ;TOTAL WIRE LENGTH ACCUMULATED HERE +WIRELN: 0 ;LENGTH OF WIRE FROM THIS PIN TO NEXT +NWIRES: 0 ;NUMBER OF WIRES +NRUNS: 0 ;NUMBER OF WIRES +TINCHS: 0 ;TOTAL NUMBER OF INCHES OF WIRE + +WINDSP: 0 ;PLACE TO GO FROM ROUWIR ON WIN +LOSDSP: 0 ; " LOSE +FASRAY: 0 ;-1, don't actually run the router +AUGFORM: 0 ;Print AUGAT card format +ISRAY: 0 ;INHIBIT PRINTING FOR RAY FILE OUTPUT +FDSP: 0 ;PLACE TO GO TO FIND PWR OR GND +FBIT: 0 ;BIT TO TEST IN PIN TYPE BITS OF DIP DEF FOR PWR OR GND +SOURCE: 0 ;THE CARD PIN FOR THIS ELEM ON CPGLST + +NOTDON: 0 ; NOT DONE WITH RUN, RUN TOO LONG +ROUSVH: 0 ;TEMP PLACE IN RUN, IF RUN TOO LONG +SAVH: 0 +SAVW: 0 + +PGDSP: 0 ;PLACE TO DISPATCH TO FROM PGSPEC +PGBIT: 0 ;BIT WE ARE TESTING IN PGSPEC + +CPGLST: 0 ;LIST OF CARD POWER OR GROUNDS WE WILL USE +LOSFLG: 0 ;THIS RUN IS LOSING, KEEP COLLECTING BUT PRINT AS LOSER + ; ROUTER SETUP, NORMAL RUN +;ROUWIR - ROUTE AND LIST A WIRE +;W = WIRE LIST HEADER +;H = WIRE +;T = Success-printer +;TT = Failure-printer +; T has code for failure +; 0 Success +; 1 Run was too long +; 2 Run was single pin +;If the run is too long, it is broken into separately routed pieces, +; and several call to the failure printer are made. +RFTOOL__1 +RFSING__2 +RFBAD__3 +RFMAX__3 +RFUCK__<1RFSING>+1 ;INTERNAL ERRORS + +RFERR: [ASCIZ /WIRELISTER BUG/] + [ASCIZ /RUN TOO LONG/] + [ASCIZ /SINGLE PIN RUN/] + [ASCIZ /BAD PINS ON RUN/] +CHECK RFERR,RFMAX + +PGZY: +ROUWR2: MOVEI T,ZLEVPW ;FOR 'WLZ' + MOVEI TT,ROUNPN ;ERROR MESSAGE + SETZM FASRAY + JRST ROUWIR + +RPGY: +ROUWR1: MOVEI T,ROUPNT ;FOR 'WLR' + MOVEI TT,ROUNPN ; ERROR "CAN'T ROUTE RUN" + SETZM FASRAY +ROUWIR: MOVEM T,WINDSP + MOVEM TT,LOSDSP + MOVEM W,SAVW ;W= "WIRE LIST HEADER" + MOVEM H,SAVH ;H=WIRE + FETCH(T,H,WBIT) ;GET WIRE BITS + TRNE T,SPWR!SGND ;PWR OR GND RUN? + JRST ROUPG ;YES, ROUTE DIFFERENTLY + SETZM FBIT ;CLEAR THIS FOR PRINT ROUTINE + FETCH(H,H,WPIN) ;SET H TO FIRST PIN OF RUN FOR WIRSET + SETZM LOSFLG +ROUWR3: SETZM NOTDON + PUSHJ P,WIRSET + JRST ROUWR4 ;1 PIN RUN + JRST [ SETOM NOTDON ;TOO MANY PINS IN RUN + MOVEI T,RFTOOL + MOVEM T,LOSFLG + JRST .+1] + MOVEM H,ROUSVH ;TAIL OF PIN LIST, IF OVERLEW TABLE SIZE + PUSHJ P,ROUTER + JRST [ OUTSTR[ASCIZ/BARF, SOMEONE CALLED ROUWIR WITH SINGLE PIN RUN! +/] + JRST ROUWR4] ;IGNORE 1 PIN RUNS + AOS NRUNS ;COUNT A RUN ROUTED + PUSHJ P,RUNFIX ;NOW FIX RUNLST POINTERS + SKIPN T,LOSFLG + JRST ROUWIN + PUSHJ P,ROULEV ;GIVE IT TO APPROPRIATE OUTPUT + MOVE H,ROUSVH + SKIPE NOTDON + JRST ROUWR3 + POPJ P, + +ROUWIN: MOVE H,SAVH + MOVE W,SAVW + JRST @WINDSP + +ROUWR4: MOVEI T,RFSING ;SINGLE WIRE RUN +ROULEV: MOVE H,SAVH + MOVE W,SAVW + JRST @LOSDSP + ; ROUTER SETUP, POWER OR GROUND RUN +;DO PWR, GND ON DIPS ONLY, NO RUN EXISTS +;PGBIT = SPWR or SGND + +ROUPG: TRNN T,SPWR ;WHICH? + JRST [ MOVE T,[GND,,FGND] ;DPBIT,,ROUTINE TO FIND CLOSEST G PIN ON BOARD + SKIPN WIRGND + TLZ T,GND ;NO BITS IF NOT WIRING + JRST ROUPGF] + MOVE T,[PWR,,FPWR] +ROUPGF: HRRZM T,FDSP + HLRZM T,FBIT + SKIPE B,CPGLST ;Reclaim old list of GND sources + PUSHJ P,PUTFS + SETZM CPGLST + HRRZ A,H + PUSHJ P,CLEARA ;CLEAR PIN MARK BITS IN RUN + +;First, find set of card PWR/GND pins that this run will be split up on. + PUSHJ P,FNDONE ;FIND A CARD PWR OR GND WE WILL NEED + JRST FNDALL ;FOUND ALL + MOVEI T,CPGLST + JRST FPGLP1 + +FPGLP2: CAMN A,ADDR(T,PNAM) ;DO WE HAVE THIS ONE ALREADY? + POPJ P, ;YES, CO-ROUTINE RETURN TO FNDONE +FPGLP1: MOVE TT,T + FETCH(T,T,NWRD) + JUMPN T,FPGLP2 + GETFS(T,WBLK) + STORE(A,T,PNAM) ;STORE PIN NAME + CLEAR(T,NWRD) ;CLEAR OUR LINK OUT + STORE(T,TT,NWRD) ;STORE US AS LAST LINK OUT + POPJ P, ;CO-ROUTINE RETURN TO FNDONE + + +;Next, map down card P/G pins, finding all pins on run that are connected on that P/G pin +FNDALL: SKIPN T,CPGLST ;ANY CARD PINS LEFT? + JRST ROUSOM ;NO, NOW CATCH ALL THE UNROUTED PINS IN RUN + FETCH(TT,T,NWRD) + MOVEM TT,CPGLST ;TAKE US OFF LIST + FETCH(TT,T,PNAM) + FSTRET(T,WBLK) ;RETURN FREE BLOCK + MOVSI T,RPGPIN ;MARK AS GENERATED PIN + MOVEM T,PNTBL ;PUT CARD PIN IN TABLE FIRST + MOVEM TT,PNTBL1 + MOVEM TT,SOURCE + MOVE G,[1,,PNTBL] ;ALREADY STORED FIRST ENTRY + MOVEI F,MAXP-1 ;COUNT DOWN NUMBER OF PINS (DON'T COUNT CARD PIN) + SETZM LOSFLG ;LOSFLG IF WE OVERFLOW ROUTER TABLE + PUSHJ P,FNDONE ;NOW FIND THEM AGAIN + JRST RUNEND ;DONE, NOW ROUTE IT + CAME A,SOURCE ;This pin connects to the card-pin were wiring now? + POPJ P, ;NO + FETCH(T,H,PBIT) + TRO T,PTMP1 ;MARK SO WON'T BE DONE LATER + STORE(T,H,PBIT) ;MARK AS DONE + CAMN A,C ;IS THE PIN DEDICATED ON THE BOARD? + POPJ P, ;YES, DOESN'T NEED WIRING THEN + PUSHJ P,ADDPIN ;ADD TO PNTBL, CHECK FOR OVERFLOW + POPJ P, ;CO-RETURN + +ADDPIN: PUSH G,TTT ;STORE FLAGS,,POINTER TO PIN BLOCK + MOVEM C,PNTBL1-PNTBL(G) ;STORE PIN NAME + SOSLE F ;FILLED TABLE? + POPJ P, ;CO-ROUTINE RETURN, FIND ANOTHER + MOVEI T,RFTOOL + MOVEM T,LOSFLG ;RUN TOO LONG + PUSHJ P,DUMPIT + POPJ P, ;CO-ROUTINE RETURN, FIND ANOTHER + +DUMPIT: HLRZ T,G + SKIPN LOSFLG ;Second chunk of one run? + CAILE T,1 + CAIA + POPJ P, ;FLUSH NULL OR SINGLE RUNS + JUMPE T,CPOPJ ;NO PINS + SOJLE T,[SETZM NUMPIN ;ONE PIN RUN + PUSHJ P,ROUEST ;FIXUP RUNLST POINTERS + MOVEI T,RFSING + JRST ROUPG1] + MOVEM T,NUMPIN + PUSHJ P,ROUTER ;NOW ROUTE IT + PUSHJ P,FUCKUP ;LOSE (ONE PIN RUN, CAN'T HAPPEN) + PUSHJ P,RUNFIX + SKIPN T,LOSFLG + JRST ROUWIN ;SUCCESS CALL FOR OUTPUT +ROUPG1: PUSH P,H + PUSH P,W + PUSHJ P,ROULEV ;RETURN THESE PINS IN ERROR + POP P,W + POP P,H + MOVEI G,PNTBL-1 ;MORE PINS ON THIS RUN, BUT BROKEN OFF + MOVEI F,MAXP + POPJ P, ;CO-ROUTINE RETURN + +RUNEND: PUSHJ P,DUMPIT + JRST FNDALL ;GET RUN FOR NEXT CARD PIN + ;ROUSOM - catch all pins that we couldn't find a P/G pin for. +; (Only if we were trying to route a signal SPWR or SGND) +ROUSOM: SETOM NUMPIN + SKIPN H,SAVH ;WAS THIS A NAMED RUN + PUSHJ P,FUCKUP ;BETTER BE + SETZM LOSFLG + MOVEI G,PNTBL-1 + MOVEI F,MAXP + FETCH(H,H,WPIN) + JUMPE H,ROUPGW +ROUPG5: FETCH(T,H,PBIT) + TRNN T,DUP + TROE T,PTMP1 + JRST ROUPG6 + STORE(T,H,PBIT) + PUSHJ P,NAMMAP ;MAP INTO SOCKET PIN + JRST [ TLO TTT,RERPIN + MOVEI T,RFBAD + MOVEM T,LOSFLG + JRST .+1] + MOVE C,A + PUSHJ P,ADDPIN +ROUPG6: FETCH(H,H,NXTP) + JUMPN H,ROUPG5 + PUSHJ P,DUMPIT +ROUPGW: MOVE H,SAVH + MOVE W,SAVW + POPJ P, + +ROUEST: MOVEI T,-PNTBL(G) + HRLZM T,ENDS +ROUES1: HRLI TT,-1(T) + HRRI TT,1(T) + MOVEM TT,RUNLST(T) + MOVSI TT,RERPIN + IORM TT,PNTBL(T) ;FLAG ALL PINS AS ERRORS + SOJGE T,ROUES1 + HLLOS RUNLST-PNTBL(G) + POPJ P, + +ROUPGE: OUTSTR[ASCIZ/ERROR RETURN FROM WIRSTP OR WIRSTE AT ROUPG! +/] + POPJ P, + + ;FNDONE - coroutine to generate all pins connecting to pwr or gnd +; IFN 0,<first searches all DIP definitions for P/G pins > +; then searches the wire (H) which should be GND, +5.0V, etc. +; returns: +; A= card pin-spec to wire pin to (flags+pin#,,slot#) +; TTT= Router flags (RPGPIN,...) +; C= pin-spec that needs to be wired to PWR/GND +; H = Pin that got this PWR,GND pin (Dip pin if RPGPIN) + +FNDONE: AOS (P) +IFN 0,< ;SINCE THE ADVENT OF INVENTED SIGNAL NAMES FOR PWR,GND + ;WE SHOULDN'T NEED THIS FIRST PART + SKIPN FBIT + JRST FNDRUN ;NO DIP PINS, JUST DO RUN + MOVE W,SAVW ;GET WIRE LIST HEADER POINTER + FETCH(W,W,WBDY) ;BODY POINTER - search occupied DIP slots + JUMPE W,FNDRUN ;ANY? + SETZM LSLOT ;NO LAST SLOT YET +ROUP12: FETCH(T,W,BLOC) ;BODY LOCATION + JUMPE T,ROUPG9 ;ANY? + CAMN T,LSLOT + JRST ROUPG9 + FETCH(H,W,DIPT) ;GET DIP TYPE + JUMPE H,ROUPG9 + MOVEM T,LSLOT ;NEW LOCATION + MOVEI H,RADDR(H,DPIN,DPNXT) + JRST ROUP11 + +ROUP10: FETCH(T,H,DPBIT) ;GET TYPE BITS + TDNN T,FBIT ;IS IT ONE WE WANT? + JRST ROUP11 + FETCH(TT,H,DPNM) + MOVE B,W ;BODY POINTER + PUSHJ P,PNAMEP + JRST ROUP11 ;NEXT PIN + MOVE C,A + FETCH(B,H,LLOW) ;IN CASE THIS IS PWR PIN, WE NEED VOLTAGE + PUSHJ P,@FDSP ;FIND THE CARD PIN + JUMPE A,ROUP11 ; NONE!! + MOVSI TTT,RPGPIN ;MARK AS GENERATED PIN + PUSHJ P,@(P) ;CALL AS CO-ROUTINE +ROUP11: FETCH(H,H,DPNXT) ;CHECK ALL PINS + JUMPN H,ROUP10 +ROUPG9: FETCH(W,W,NXTB) ;CHECK ALL BODIES + JUMPN W,ROUP12 +>;IFN 0 + +FNDRUN: SKIPN H,SAVH ;GET RUN POINTER + JRST FNDNRN ;NONE + FETCH(H,H,WPIN) + JUMPE H,FNDNRN +FNDRN2: FETCH(TTT,H,PBIT) + TRNE TTT,DUP + JRST FNDRN1 + PUSHJ P,NAMMAP ;TRY NAMING IT + JRST FNDRN1 ;NO + MOVE E,TTT ;SAVE ROUTE FLAGS + MOVE C,A + MOVE B,SAVH ;GET SIGNAL NAME + FETCH(B,B,WVOL) ;GET VOLTS IN CASE WE'RE LOOKING FOR PWR PIN + PUSHJ P,@FDSP ;FIND ITS CARD PIN + JUMPE A,FNDRN1 ;DIDN'T GET ONE + MOVE TTT,E + PUSHJ P,@(P) +FNDRN1: FETCH(H,H,NXTP) + JUMPN H,FNDRN2 +FNDNRN: SOS (P) ;TAKE OFF SKIP RETURN + POPJ P, ;NO MORE + + ; SUBR TO DO PWR AND GND RUNS FIRST +;Looks for all signals that are SPWR or SGND. +PGSPEC: MOVEM T,PGDSP + MOVEI T,SGND + PUSHJ P,PGSPC1 + MOVEI T,SPWR +PGSPC1: MOVEM T,PGBIT + MOVEI H,RADDR(W,WIRES,ALPH) + JRST PGSPC2 + +PGSPC3: FETCH(T,H,WBIT) + TRNN T,NAM2ND ;ONLY HEADER BLOCK PLEASE + TDNN T,PGBIT ;FOUND ONE? + JRST PGSPC2 + SKIPN ISRAY + JRST [ SKIPL LINCNT + PUSHJ P,PUTHDR + MOVE A,H + PUSHJ P,GCANON + PUTSIG ADDR(A,SPNT) + JRST .+1] + PUSH P,H + HLRZ T,PGDSP + PUSHJ P,(T) ;ROUTE ALL THESE + POP P,H +PGSPC2: FETCH(H,H,ALPH) + JUMPN H,PGSPC3 +IFN 0,< ;ALL DIP PWR REQUIREMENTS SHOULD BE ON SIGNAL NAMES + HRRZ T,PGDSP + JRST (T) ;DISPATCH TO NOT FOUND ROUTINE +>;IFN 0 + POPJ P, + +IFN 0,< +PGSIG: SKIPL LINCNT + PUSHJ P,PUTHDR +PGSIG0: MOVE T,PGBIT + TRNN T,SPWR + JRST [ PUTSTR[ASCIZ/GND/] + POPJ P,] + PUTSTR[ASCIZ/PWR/] + POPJ P, +>;IFN 0 + SUBTTL 'WLR' ROUTING SUBR FOR WIRE LIST OUTPUT + +;HERE TO PRINT ERROR MESSAGE ON TTY IF RUN NOT ROUTED FOR SOME REASON + +ROUNPN: PUSHJ P,RAYRNR + ERRSTR 0,@RFERR(T) + POPJ P, + +RAYRNR: OUTSTR ADDR(H,SPNT) + OUTSTR [ASCIZ / RUN NOT ROUTED! - /] + OUTSTR @RFERR(T) + OUTSTR [ASCIZ / +/] + MOVEI TT,1 + LSH TT,(T) + TDNE TT,[RFUCK] ;INTERNAL ROUTER ERROR? + PUSHJ P,FUCKUP + PUSH P,T ;ERROR CODE + PUSHJ P,@WINDSP ;PRINT RUN + POP P,T + POPJ P, + +ROUPNT: MOVE G,H + PUSHJ P,LOPSET ;SETUP FOR WIRE PRINT + MOVE T,FBIT + TRNE T,PWR + AOS NPWR ;MAKE THIS RUN PRINT + TRNE T,GND + AOS NGND ;ALSO THIS ONE + SETZM INCHES ;CLEAR TOTAL WIRE LENGTH + MOVE T,NUMPIN ;GET NUMBER OF PINS IN RUN + TRNE T,1 ;ODD OR EVEN? (0 IS ODD!) + SKIPA T,[3] ;EVEN, START AT 3 (Z 1) + MOVEI T,2 ;ODD, START AT 2 (Z 2) + MOVEM T,ZLEVN + HRRZ G,ENDS ;START AT THIS END +ROUTIO: HRLM G,(P) ;SAVE INDEX INTO PNTBL + MOVEI T,4 + SOSGE NUMPIN ;LAST PIN? + MOVEM T,ZLEVN ;SET END Z LEVEL CODE + HLRZ T,(P) + HLRE B,RUNLST(T) ;GET LAST PIN + JUMPL B,[SETZM WIRELN ;NO WIRE LENGTH ON FIRST PIN + JRST ROUTDO] ;AND PRINT LAST PIN + HRRZ C,G + PUSHJ P,DSTSTR ;CALC AND STORE DIST IN WIRELN +ROUTDO: MOVSI T,RPGPIN + TDNE T,PNTBL(G) ;CHECK IF PIN HAS PIN BLOCK + JRST RPGPNT ;NO, GENERATED FROM DIP DEF + HRRZ G,PNTBL(G) + PUSHJ P,WIRLP0 +ROUTDN: HLRZ G,(P) + HRRE G,RUNLST(G) + JUMPGE G,ROUTIO + SKIPE G,SAVH + JRST FINWIR + SKIPE LCOUNT + CRLF + SKIPE T,INCHES + CAMN T,WIRELN + JRST NONWLN + MOVEM T,WIRELN + MOVEI A,=48 + PUSHJ P,FILL + PUSHJ P,DOWLEN +NONWLN: CRLF + POPJ P, + +; Print pin, but it is without signal name, a PWR pin on DIP +RPGPNT: MOVE T,LCOUNT + CAIL T,8 + CRLF + PUTBYT 11 + MOVE A,PNTBL1(G) + PUSHJ P,PINBIT + TLNE A,PWR ;IS THIS A PWR PIN? + AOS NPWR + TLNE A,GND ;HOW ABOUT GROUND? + AOS NGND + SETZM TCOUNT + PUSHJ P,LOCPIN ;CALL CARD SUBR TO PRINT + SETZ T, ;AVOID STAR + PUSHJ P,PTAB + SKIPN WIRELN + JRST ROUTDN + MOVEI A,=48 + PUSHJ P,FILL + PUSHJ P,DOWLEN + JRST ROUTDN + + +DSTSTR: CAMG B,C + EXCH B,C + HRRZ T,@PTRTB1(B) ;GET DISTANCE FROM THIS PIN TO NEXT + MOVEM T,WIRELN ;AND STORE HERE FOR PRINT + JUMPE T,CPOPJ + MOVSI TT,RERPIN ;ERROR BIT + TDNN TT,PNTBL(B) + TDNE TT,PNTBL(C) + JRST [ SETZM WIRELN ;IF ONE IN ERROR, FLUSH THIS WIRE + POPJ P,] + ADDM T,INCHES + ADDM T,TINCHS + AOS NWIRES ;COUNT ANOTHER WIRE + POPJ P, + +NOITS,< +DOWLEN: MOVE T,WIRELN ;YES, ANY WIRE? + IDIV T,FRACTN ;MAKE IT INCHES + PUSH P,TT ;SAVE THE FRACTION + PUSHJ P,DECOUT ;AND PRINT + POP P,T + MOVE TT,FRACTN + CAIN TT,=10 + JRST [ PUTBYT "." + PUTBYT "0"(T) + POPJ P,] + CAIN TT,=100 + JRST [ PUTBYT "." + IDIVI T,=10 + PUTBYT "0"(T) + PUTBYT "0"(TT) + POPJ P,] + JUMPE T,CPOPJ + PUTBYT "+" + PUSHJ P,DECOUT + PUTBYT "/" + MOVE T,FRACTN + JRST DECOUT +>;NOITS +ITS,< +DOWLEN: MOVEI T,=1000 + IDIV T,FRACTN + MOVE TTT,T ;YES, I KNOW ITS A CONSTANT + IMUL T,WIRELN ;DO THE FIGURING IN THOUSANDTHS OF INCHES + SUB T,POSTMG ;SUBTRACT OFF POST MARGIN + MOVE TT,T + SUB TT,WRAPMG ;THE REAL DISTANCE BETWEEN PINS + CAMG TT,TTT ;ARE PINS NEXT TO EACH OTHER? + JRST [ PUTSTR [ASCIZ /BARE/] + POPJ P,] + IDIVI T,=1000 ;LENGTH IN INCHES + PUSH P,TT + SKIPE T + PUSHJ P,DECOUT ;PRINT INCHES + PUTBYT "." + POP P,T + IDIVI T,=100 ;PRINT TENTH + PUTBYT "0"(T) + POPJ P, +>;ITS + SUBTTL 'WLZ' ROUTER Z LEVEL OUTPUT SETUP +ZLEVP: SKIPN ISWW + JRST NXWW + MOVE L,DEFLST + PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD! + POPJ P, + FETCH(T,W,WIRES) + JUMPE T,[OUTSTR[ASCIZ/NO WIRES! +/] + POPJ P,] + MOVSI T,'WLZ' ;WIRE LIST Z LEVEL FILE EXTENSION + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + PUSHJ P,FILLST + PUTHDR + SETZM NWIRES + SETZM TINCHS + SETZM ISRAY + MOVEI T,WLZMAR + MOVEM T,MARGIN + MOVEI T,[ASCIZ/ WRAP LIST -- PWR AND GND -- Z LEVEL 1 +FROM........TO..........WIRE...CHECK...LENGTH....SIGNAL NAME/] + MOVEM T,HEADER + SETZM LINCNT + TLZ TFLG + MOVE T,[PGZY,,FUCKUP] + PUSHJ P,PGSPEC + MOVEI T,[ASCIZ/ WRAP LIST -- PWR AND GND -- Z LEVEL 2 +FROM........TO..........WIRE...CHECK...LENGTH....SIGNAL NAME/] + MOVEM T,HEADER + SETZM LINCNT + TLO TFLG + MOVE T,[PGZY,,FUCKUP] + PUSHJ P,PGSPEC + MOVEI T,[ASCIZ/ WRAP LIST -- Z LEVEL 1 +FROM........TO..........WIRE...CHECK...LENGTH....SIGNAL NAME/] + MOVEM T,HEADER + SETZM PGBIT + SETZM LINCNT + TLZ TFLG ;FLAG TO DO Z LEVEL 1 +ZLEVPN: FETCH(H,W,WIRES) +ZLEVP0: FETCH(T,H,WBIT) + TRNE T,NAM2ND!WNULL!WSINGL!SNC!SPWR!SGND + JRST ZLEVP1 + FETCH(G,H,WPIN) + PUSHJ P,ROUWR2 ;Route, but don't print router errors +ZLEVP1: FETCH(H,H,ALPH) + JUMPN H,ZLEVP0 + TLOE TFLG + JRST ZLEVPE + MOVEI T,[ASCIZ/ WRAP LIST -- Z LEVEL 2 +FROM........TO..........WIRE...CHECK...LENGTH....SIGNAL NAME/] + MOVEM T,HEADER + SETZM LINCNT + SETZM NRUNS ;COUNT RUNS ONLY ON Z 2 + JRST ZLEVPN + +ZLEVPE: RELEAS LST, + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUSHJ P,PTOTS ;PRINT TOTALS ON TTY + POPJ P, + ; Z LEVEL PRINT ROUTINE +ZLEVPW: SETZM INCHES + HRRZ G,ENDS ;GET AN END + MOVE T,NUMPIN ;GET NUMBER OF PINS -1 + TRNN T,1 ;SKIP IF EVEN NUMBER OF PINS + TLOA SEMFLG ;FIRST IS 1-2 + TLZ SEMFLG ;FIRST IS NOT 1-2 + TLNE TFLG ;LEVEL 1 OR 2? (OFF FOR 1) + TRCA T,1 ;LEVEL 2, INVERT SENSE OF TEST + TLZ SEMFLG ;LEVEL 1, CAN'T BE 1-2 + TRNN T,1 ;EVEN OR ODD (0 IS ODD) + HRRE G,RUNLST(G) ;ODD, START WITH NEXT PIN IN RUN + TRZ FLAG ;NOTE FIRST PIN OF RUN +ZLEVPA: HRRE F,RUNLST(G) ;GET ONE FOLLOWING US + JUMPL F,CPOPJ ;QUIT IF NO NEXT + MOVE B,G + MOVE C,F + PUSHJ P,DSTSTR + SKIPN WIRELN ;ANY WIRE HERE? + JRST ZLEVPD + TROE FLAG ;ANY PINS OF THIS WIRE OUT YET? + JRST ZLEVPB + SKIPL LINCNT + PUSHJ P,PUTHDR +ZLEVPB: CRLF ;KEEP THEM SEPERATED + MOVE E,G + PUSHJ P,PLCPNT + MOVE E,F + PUSHJ P,PLCPNT + PUTSTR[ASCIZ/( )....( ) /] + SETZM TCOUNT + PUSHJ P,DOWLEN + MOVEI A,=12 + SUB A,TCOUNT + PUTBYT "." + SOJG A,.-1 + PUTSIG ADDR(H,SPNT) + CRLF +ZLEVPD: HRRE G,RUNLST(F) + JUMPGE G,ZLEVPA + POPJ P, + + ;PLCPNT - PRINT PIN LOCATION +PLCPNT: SETZM TCOUNT + MOVSI T,RPGPIN + TDNE T,PNTBL(E) + JRST [ MOVE A,PNTBL1(E) ;A SOCKET PIN GENERATED TO WIRE TO + PUSHJ P,LOCPIN + JRST PLCPN3] + HRRZ E,PNTBL(E) + FETCH(D,E,PBDY) ;D GETS BODY POINTER + FETCH(A,D,BLOC) + FETCH(T,E,PINN) + HRLI A,(T) + FETCH(T,D,BBIT) + TRNN T,CBODY + JRST PLCPN1 + AOS NCONS + PUSHJ P,LOCPNW + JRST PLCPN3 + +PLCPN1: PUSH P,B + FETCH(B,D,BPAK) + PUSHJ P,LOCPNM + POP P,B +PLCPN3: TLZE SEMFLG +STAN,< PUTBYT "" > +NOSTAN,<PUTBYT "\" > + MOVEI A,=12 + SUB A,TCOUNT + PUTBYT "." + SOJG A,.-1 + POPJ P, + + ;SUBTTL RAYTHEON OUTPUT STUFF + +SUBTTL 'RAY' ROUTER RAYTHEON WIRE WRAP OUTPUT "TO-TO" FORMAT +RAYTT: SETZM AUGFORM ;Not AUGAT format file + MOVE L,DEFLST + PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD! + POPJ P, + FETCH(T,W,WIRES) + JUMPE T,[OUTSTR[ASCIZ/NO WIRES! +/] + POPJ P,] + MOVSI T,'WTT' ;RAYTHEON WIRE WRAP EXTENSION + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + MOVE T,[PUSHJ P,F4OUT] ;FLUSH TABS, SPECIAL CHARS + MOVEM T,PUTCHR + SETZM NRUNS + SETZM NWIRES + SETZM TINCHS + SETZM MARGIN ;NO MARGIN + SETZM LINCNT + SETOM ISRAY + MOVE T,[PGRAYY,,FUCKUP] ;ROUTE AND PRINT POWER AND GROUND + PUSHJ P,PGSPEC + SETZM PGBIT ;PRINT SIGNAL NAMES WHERE POSSIBLE + FETCH(H,W,WIRES) +RAYP0: FETCH(T,H,WBIT) + TRNE T,NAM2ND!WNULL!WSINGL!SNC!SPWR!SGND + JRST RAYP1 + FETCH(G,H,WPIN) + PUSHJ P,PGRAYY ;ROUTE AND PRINT NORMAL RUN +RAYP1: FETCH(H,H,ALPH) + JUMPN H,RAYP0 + RELEAS LST, ;THAT'S ALL FOLKS! + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUSHJ P,PTOTS ;PRINT TOTALS ON TTY + POPJ P, + +;RAYTHEON NORMAL ROUTER SETUP + +PGRAYY: MOVEI T,RAYPW + MOVEI TT,RAYRNR ;PRINT RUN NOT ROUTED ON TTY + SETZM FASRAY + JRST ROUWIR + + ;SUBTTL RAYTHEON OUTPUT STUFF + +SUBTTL 'RAY' ROUTER RAYTHEON WIRE WRAP OUTPUT "FROM-TO" FORMAT + +AUGP: SETOM AUGFORM + JRST RAYP10 + +RAYP: SETZM AUGFORM +RAYP10: MOVE L,DEFLST + PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD! + POPJ P, + FETCH(T,W,WIRES) + JUMPE T,[OUTSTR[ASCIZ/NO WIRES! +/] + POPJ P,] + MOVSI T,'RAY' ;RAYTHEON WIRE WRAP EXTENSION + SKIPE AUGFORM + MOVSI T,'AUG' + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + MOVE T,[PUSHJ P,F4OUT] ;FLUSH TABS, SPECIAL CHARS + MOVEM T,PUTCHR + SETZM NRUNS + SETZM NWIRES + SETZM TINCHS + SETZM MARGIN ;NO MARGIN + SETZM LINCNT + SETOM ISRAY + MOVE T,[PGWFTY,,FUCKUP] ;ROUTE AND PRINT POWER AND GROUND + PUSHJ P,PGSPEC + SETZM PGBIT ;PRINT SIGNAL NAMES WHERE POSSIBLE + FETCH(H,W,WIRES) +RAYFT0: FETCH(T,H,WBIT) + TRNE T,NAM2ND!WNULL!WSINGL!SNC!SPWR!SGND + JRST RAYFT1 + FETCH(G,H,WPIN) + PUSHJ P,PGWFTY ;ROUTE AND PRINT NORMAL RUN +RAYFT1: FETCH(H,H,ALPH) + JUMPN H,RAYFT0 + RELEAS LST, ;THAT'S ALL FOLKS! + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUSHJ P,PTOTS ;PRINT TOTALS ON TTY + POPJ P, + +;RAYTHEON NORMAL ROUTER SETUP + +PGWFTY: MOVEI T,RAYFW + MOVEI TT,RAYRNR + SETZM FASRAY + JRST ROUWIR + + ;PRINT RUN IN CARD IMAGE FORMAT + +LVLCOL__=68 ;THE COLUMN USED TO INDICATE LEVEL OF WRAP +LVLAUG__=55 ; " FOR AUGAT FORMAT + +RAYMAX__=17 ;LONGEST WIRE RAYTHEON MACHINE CAN WRAP IS 24" (CITY BLOCK DISTANCE) + ;16.97=24*(SQRT(2)/2) +RAYNCH__=12 ;MAX OF 12. CHARS IN SIGNAL NAME + +;TABS TO CARD COLUMN + +DEFINE RAYTAB (COLUM) +< MOVEI A,COLUM-1 + CAMG A,LCOUNT + JRST .+3 + PUTBYT " " + JRST .-3 +> + +RAYFW: SETZM LCOUNT + SETZM INCHES + SETZM RAYLVL ;KEEP TRACK OF LEVEL OF WIRE + AOS RAYLVL ; AND START WIRING ON LEVEL 1 + HRRZ G,ENDS ;THE BEGINING OF THE RUN + MOVE T,NUMPIN ;GET NUMBER OF PINS -1 + TRNN T,1 ;IS NUMBER OF PINS EVEN OR ODD (ODD IS 0) + JRST [ HRRE G,RUNLST(G) ;ODD, START WITH NEXT PIN IN RUN + PUSHJ P,RAYPA + HRRE G,ENDS ;END OF WIRE + HRRE F,RUNLST(G) ;OTHER END OF WIRE + MOVEI B,2 ;THIS WIRE IS ON LEVEL 2 + MOVEM B,RAYLVL + JRST RAYFRM] +RAYPA: HRRE F,RUNLST(G) ;GET ONE FOLLOWING US + JUMPL F,CPOPJ ;QUIT IF NO NEXT + PUSHJ P,RAYFRM ;PRINT LINE FOR THIS WIRE +RAYPB: HRRE G,RUNLST(F) ;Two pins later, the first pin of next level 1 wire + JUMPL G,CPOPJ ;JUMP IF NONE THERE + HRRE F,RUNLST(G) ;OTHER END OF NEXT LEVEL 1 WIRE + JUMPL F,[JRST 4,.] ;ERROR, LAST WIRE ON RUN SHOULD ALWAYS BE LEVEL 1 + PUSHJ P,RAYFRM + HLRE F,RUNLST(G) ;Back one pin, the level two wire + AOS RAYLVL + PUSHJ P,RAYFRM + SOS RAYLVL ;THE NEXT WIRE IS PROBABLY LEVEL 1 + HRRE F,RUNLST(G) ;GET F BACK + JRST RAYPB + +;RAYFRM - from,to pins +;G = RUNLST index for first pin of wire +;F = RUNLST index for second pin of wire + +RAYFRM: PUSHJ P,RAYDST ;KEEP TRACK OF RUN LENGTHS + SKIPE AUGFORM + JRST AUGFRM + RAYTAB (=15) + MOVE E,G ;ONE END OF THE WIRE + PUSHJ P,RAYPNT + MOVE E,F ;THE OTHER END OF THE WIRE + PUSHJ P,RAYPNT ;PRINT PIN SPECIFICATION + RAYTAB (=31) + PUSHJ P,RAYSIG ;PRINT SIGNAL NAME AND RETURN + RAYTAB (LVLCOL) ;PRINT LEVEL OF WIRE + MOVE T,RAYLVL + PUSHJ P,DECOUT + RAYTAB (=72) + JRST RAYSEQ ;PRINT CARD SEQUENCE # AND RETURN + +AUGFRM: RAYTAB(=2) + PUSHJ P,RAYSIG + RAYTAB(=20) + MOVE E,G + PUSHJ P,RAYPNT + RAYTAB(=40) + MOVE E,F + PUSHJ P,RAYPNT + RAYTAB(LVLAUG) + MOVE T,RAYLVL + PUSHJ P,DECOUT + RAYTAB(=72) + JRST RAYSEQ + +RAYPNT: MOVE A,PNTBL1(E) ;SOCKET POST LOC + MOVSI T,RPGPIN ;Count # conn pins, + TDNE T,PNTBL(E) + JRST RAYPN1 ; can't be if was a generated pin + HRRZ E,PNTBL(E) + FETCH(D,E,PBDY) + FETCH(T,D,BBIT) + TRNE T,CBODY ;CONNECTOR PIN? + AOS NCONS ;COUNT CONNECTOR PINS ON RUN +RAYPN1: SKIPE AUGFORM + JRST AUGDIP + JRST RAYDIP ;PRINT PIN IN FORTRAN FORMAT + +;Print signal name, truncating to 12 characters if necessary +RAYSIG: MOVEI TTT,ADDR(H,SPNT) ;PRINT THIS SIGNAL NAME + HRLI TTT,440700 ;MAKE IT A BYTE POINTER + SETZ T, +RAYS2: ILDB TT,TTT + SKIPE TT + AOJA T,RAYS2 + CAILE T,RAYNCH + JRST [ +; OUTSTR ADDR(H,SPNT) +; OUTSTR [ASCIZ / LONGER THAN 12 CHARACTERS +;/] + PUTBYT GENCHR ;PRINT "SERIAL NUMBER" INSTEAD OF NAME + PUTBYT GENCHR ;UNIQUE FROM ANY UNAMED RUNS + MOVE A,PNTBL1 ;USE PIN NAME AS GENERATED SIGNAL NAME + PUSHJ P,LOCPIN + JRST RAYFR2] + SKIPN PGBIT ;IS IT A SIGNAL THAT IS SPLIT UP? + JRST RAYFR3 +;Print signal as GND1A01 - unique version of GND name + MOVE A,H + PUSHJ P,GCANON ;get canonical version of name + PUTSTR ADDR(A,SPNT) + MOVE A,PNTBL1 ;YES, THEN ADD SOMETHING TO MAKE EACH UNIQUE + PUSHJ P,LOCPIN + JRST RAYFR2 + +RAYFR3: PUTSTR ADDR(H,SPNT) +RAYFR2: SKIPN WIRELN ;WIRE IN ERROR? + PUTSTR [ASCIZ / **** WIRE IN ERROR/] + POPJ P, + +;GCANON - Get canonical name of wire +;A = wire + +GCANON: FETCH(TT,A,WBIT) + TRNE TT,NAM2ND + FETCH(A,A,WPIN) ;GET REAL HEADER + MOVE T,A +GCANO1: FETCH(TT,T,WBIT) + TRNE TT,SCANON ;Is this the canonical name? + JRST [ MOVE A,T + POPJ P,] + FETCH(T,T,NNAM) + JUMPN T,GCANO1 + POPJ P, + +;PRINT THE SEQUENCE # OF THE CARD +RAYSEQ: +ITS,< PUTSTR [ASCIZ /MIT/] > +CMU,< PUTSTR [ASCIZ /CMU/] > + MOVEI A,5 + MOVEM A,NDIG + MOVE T,LINCNT + AOJ T, + PUSHJ P,NDECOUT + RAYTAB(=80) + CRLF + SETZM TCOUNT ;COUNT CHARACTERS ON LINE + SETZM LCOUNT + POPJ P, + + ; RAYTHEON WIRE WRAP TO-TO FORMAT PRINTER + +RAYPW: SETZM INCHES + SETZM LCOUNT ;YOU CAN'T BE TOO CAREFUL + HRRZ G,ENDS ;GET AN END +RAYPT1: RAYTAB (=15) + MOVE E,G + PUSHJ P,RAYPNT ;PRINT THIS PIN + PUSHJ P,RAYSIG ;PRINT THE SIGNAL NAME + PUSHJ P,RAYSEQ ;PRINT THE CARD SEQUENCE # + HRRE F,RUNLST(G) + JUMPL F,CPOPJ ;END OF RUN + PUSHJ P,RAYDST ;LOG THIS WIRE AND TOTAL UP WIRE LENGTH + MOVE G,F ;ADVANCE TO NEXT PIN + JRST RAYPT1 ;GET NEXT PIN ON RUN + +RAYDST: MOVE B,G ;COMPUTE LENGTH OF WIRE + MOVE C,F + PUSHJ P,DSTSTR + MOVE T,WIRELN + IDIV T,FRACTN + SKIPE T ;ANY WIRE HERE? + CAILE T,RAYMAX ;INSURE THAT WIRE DOES NOT EXCEED MAXIMUM LENGTH + CAIA + POPJ P, + ;;Run too long, or failed somehow. + OUTSTR [ASCIZ /LINE #/] + PUSH P,T + PUSH P,PUTCHR + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + MOVE T,LINCNT + SUBI T,1 + PUSHJ P,DECOUT + POP P,PUTCHR + POP P,T + OUTCHR [40] ;THROW IN A SPACE + OUTSTR ADDR(H,SPNT) ;PRINT SIGNAL NAME + SKIPN T + OUTSTR [ASCIZ / WIRE IN ERROR +/] + SKIPE T + OUTSTR [ASCIZ / POINT TO POINT DISTANCE EXCEEDS 17" +/] + POPJ P, + +SUBTTL 'ANADU' ROUTER TEXT OUTPUT + +ANANO: SETOM FASRAY ;Quickie, don't actually route the wires + JRST ANADU9 +ANADU: SETZM FASRAY +ANADU9: MOVE L,DEFLST + PUSHJ P,LSTGET ;NOW ASK FOR PARTICULAR CARD! + POPJ P, + FETCH(T,W,WIRES) + JUMPE T,[OUTSTR[ASCIZ/NO WIRES! +/] + POPJ P,] + MOVSI T,'XAN' ;RAYTHEON WIRE WRAP EXTENSION + MOVEI TT,0 ;DATA MODE + MOVSI TTT,'DSK' + PUSHJ P,OUTSET + POPJ P, + MOVE T,[PUSHJ P,F4OUT] ;FLUSH TABS, SPECIAL CHARS + MOVEM T,PUTCHR + SETZM NRUNS + SETZM NWIRES + SETZM TINCHS + SETZM MARGIN ;NO MARGIN + SETZM LINCNT + SETOM ISRAY + MOVE T,[ANAFTY,,FUCKUP] ;ROUTE AND PRINT POWER AND GROUND + PUSHJ P,PGSPEC + SETZM PGBIT ;PRINT SIGNAL NAMES WHERE POSSIBLE + FETCH(H,W,WIRES) +ANAFT0: FETCH(T,H,WBIT) + TRNE T,NAM2ND!WNULL!WSINGL!SNC!SPWR!SGND + JRST ANAFT1 + FETCH(G,H,WPIN) + PUSHJ P,ANAFTY ;ROUTE AND PRINT NORMAL RUN +ANAFT1: FETCH(H,H,ALPH) + JUMPN H,ANAFT0 + RELEAS LST, ;THAT'S ALL FOLKS! + MOVE T,[OUTCHR TTT] + MOVEM T,PUTCHR + PUSHJ P,PTOTS ;PRINT TOTALS ON TTY + POPJ P, + +;RAYTHEON NORMAL ROUTER SETUP + +ANAFTY: MOVEI T,ANAPNT + MOVEI TT,RAYRNR + JRST ROUWIR + +ANAPNT: SETZM INCHES + HRRZ G,ENDS ;GET AN END + PUTSTR ADDR(H,SPNT) ;PRINT SIGNAL NAME + SKIPN PGBIT ;IS IT GND OR VCC? + JRST ANAPT3 + PUTBYT "-" + MOVE A,PNTBL1 + PUSHJ P,LOCPIN ;ADD SOMETHING TO MAKE IT UNIQUE +ANAPT3: PUTSTR [ASCIZ / \ /] ;SEPARATE SIGNAL FROM PINS +ANAPT1: MOVE A,PNTBL1(G) + PUSHJ P,LOCPIN ;PRINT PIN NAME + HRRE F,RUNLST(G) + JUMPL F,ANAPT2 ;END OF RUN + PUTBYT "," + PUSHJ P,RAYDST ;LOG THIS WIRE AND TOTAL UP WIRE LENGTH + MOVE G,F ;ADVANCE TO NEXT PIN + JRST ANAPT1 ;GET NEXT PIN ON RUN + +ANAPT2: CRLF + POPJ P, + +>;ROUTE