2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 3 of the
7 ;;; License, or (at your option) any later version.
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ;;; General Public License for more details.
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 subttl ddt conditional assembly
40 setf [CPU (0 KA, 1 KI, 2 KL, 3 KS, 4 TS)]cpusw ;KI not supported
54 ife <cpusw-3>*<cpusw-4>!termin
57 setf 340?,dpysw ;0 no display
64 TKS, ndsk==:0 ? dsksw==:0 ; No disk code for TS or KS version
66 setf Number of disks? (0 no swapping and file system goodies),ndsk
71 swap,lowlen==2200 ;disk routines take a little extra room
73 setf [Type of disk? (0 none, 1 Systems Concepts, 2 RP-10, 3 RH-10)]dsksw
83 ifndef moby, moby==740000 ;256k ddt (memsiz-40000)
84 ifndef lowlen, lowlen==1000 ;size of low code
87 setf Old Type Data Products Line Printer?,lptp
90 setf [Assemble for MACDMP? (If no, DSKDMP)]mcdmpf
92 TKS, SETF New One Proceed? (Using 1-proceed microcode),KS1PR
93 IFNDEF KS1PR, KS1PR==:0
95 IFN KS1PR, 1PRSW==:0 ; Only one kind of one proceed please
96 1PRSW==:0 ; DOESN'T WORK!
97 setf Old One Proceed?,1PRSW
99 subttl assignments and definitions
107 MEMSIZ=40000+MOBY ;INITIAL $I-2
108 NLEVS==7 ;LENGTH OF RING BUFFER OF .
112 R=2 ;POINTERS TO TABLES, CORE, ETC.
114 W=4 ;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER
118 I=10 ;SWAP TYPEOUT VARIABLES BETWEEN DISPLAY AND TTY
124 NBP==10 ;NUMBER OF BREAK POINTS
126 LPDL==50 ;MAX LENGTH PUSH DOWN LIST
128 TS, CHTTYI==:1 ? CHTTYO==:2
130 TKS, .INSRT DSK:SYSTEM;KSDEFS >
132 ;GET DEFINITIONS OF DTE20 LOCATIONS IN LOW CORE
133 KL, .INSRT SYSTEM; EPT >
134 KL, SWPUA=701540,, ;SWEEP-CACHE INSTRUCTION
138 SQUOZE 0,DDT ;initial symbols are for program name "DDT"
142 IRP A,,[CLEAR,CLEARI,CLEARM
143 CLEARB,CONSZ,CONSO,DATAI,DATAO,BLKI,BLKO,CONI,CONO]
149 MTC==340 ;magtape control
150 MTS==344 ;magtape status
154 DC0==610 ;THIS STUFF REALLY WANTS TO CONDITONALIZED ON DISK CONTROL
159 PTP==100 ;paper tape punch
160 PTR==104 ;paper tape reader
161 TTY==120 ;console terminal
162 LPT==124 ;line printer
163 DIS==130 ;340 display
164 DC==200 ;deselection device?
165 UTC==210 ;dectape control
166 UTS==214 ;dectape status
168 IRP A,,[PI,PTP,PTR,TTY,LPT,DIS,DC,UTC,UTS,DC0,DC1,DPK,MTC,MTS,DPC]
177 CCA==14 ;"CACHE SWEEPER"
182 IRP A,,[PI,PAG,CCA,TIM,MTR,MTC,MTS,DSK]
191 .RD.==20 ; Read various kludges
192 .WR.==24 ; Write various kludges
194 IRP A,,[PI,PAG,.RD.,.WR.]
201 SWAP,[ SQUOZE 4,$QACT ;DDT'S DISK-ACTIVE FLAG WORDS
224 REPEAT NBP+1,BUST \.RPCNT
232 INFORM [INITIAL SYMS]\NUMSYM*2
234 LOWCOD: INFORM [LOWCODE]\.
240 subttl display routines
246 ;INITIALIZE DISPLAY (CALLED UNCONDITIONALLY WHEN DDT FIRST STARTED UP)
249 SKIPN DISON ;SKIP IF DISPLAY ON
250 SKIPA R,CJLP1 ;JRST LLUP1
253 JUMPGE R,DISIN1 ;JUMP IF <JRST LLUP1> JUST MUNGED INTO LLUPI1
254 ;FOLLOWING CIDING SKIPPED IF DISPLAY OFF
256 SUBI T,NUMREG*<NREGS*2+1>+3
258 MOVE R,[REPEAT 6,[35]]
262 BLT R,NUMREG*<2*NREGS+1>-1+1(T)
274 DISPTR: 0 ;BLKO POINTER FOR DISPLAY
277 DISON: -1 ;DISPLAY FEATURE INITIALLY ON
278 DISWD: -NUMREG*<2*NREGS+1>,,
279 DTOC: IDIVI T,8 ;CANT CALL TOC OR TOUT. SCREWS DISPLAY.
291 DISAD0: IDPB T,DISPNR
315 DISAD7: PUSHJ P,DISAD3
331 DISAD5: PUSHJ P,DIS69
337 DIS69: IRP X,,[36,50,35]
342 \fDISLP: AOS T,DISCNT
344 DISBEG: MOVNI T,NREGS
369 DISL2: PUSHJ P,DISAD6
402 CHECK1: XCT LLUPI1 ;JRST LLUP1 (IF OFF) OR TRNA (ALWAYS SKIP, VALUE OF WORD NEGATIVE)
405 RECYC: MOVEM T,DISPTR
409 DATAO DIS,[20157,,261777]
425 TSPC: MOVEI T,40 ;SPACE
457 JRST @INSW ;ANOTHER IO ROUTINE PROVIDED, USE IT. (IT SHOULD POPJ 1,)
522 SKIPE DISON ;IF DISPLAY ON,
525 TOUT2: SKIPE OUTSW(I)
530 TYO2: CAIL T," ;SPACE
556 dpy340, PUSHJ P,DISCFT
568 TRO T,400 ;Set CTY-char-pending
569 MOVEM T,8CTYOT ;Store in comm area
571 TRO T,80INT ;Hey you! Get this!
572 CONO (T) ;Interrupt 8080
573 SKIPE 8CTYOT ;Wait for completion
588 MOVEI T,3400 ;DDT MODE INPUT REQ
590 JUMPE T,CPOPJ ;NOTHING AVAILABLE
592 KS,[ SKIPN T,8CTYIN ;Chars stored here by 8080.
594 SETZM 8CTYIN ;Remember to clear it.
600 SUBI T,40 ;UPPERCASIFY
604 IFN LPTP, CONO LPT,10
615 XDTCM: SETZM DTEFLG ;SEND ARG IN T TO 11, GET RESPONSE IN T
631 ANDI T,177 ;CHANNELS THAT WERE ON
632 IORI T,2000 ;TURN ON CHANNELS
642 LF: MOVEI T,12 ;LINE FEED
645 ;FLOATING POINT OUTPUT
656 XCT "#,CRF ;NOT NORMALIZED
730 dpy340,DISPDL: BLOCK LPDL
732 INFORM [END OF LOWCODE]\.-1
734 subttl communication with DSKDMP and ITS
736 IF1, IFG .-LOWCOD+6-LOWLEN,.ERR LOW CODE DOESN'T FIT, MAKE LOWLEN BIGGER
739 ALTPC ;-6 PLACE WHERE PC TO PROCEED THROUGH IS STORED
740 -20,,AC0 ;-5 PNTR TO SAVED LOW CORE (ESPECIALLY ACS)
741 STARTA: 0 ;-4 START ADDRESS
742 KILC: -NSYMS,,LOW ;-3 INITIAL SYMBOLS PNTR
743 -NSYMS,,LOW ;-2 ALL SYMBOLS PNTR
744 JOBSYM: .-1 ;-1 BIT 4.9=1 => SYMBOL TABLE CLOBBERED
750 IFN MCDMPF, MACDMP=37400+MOBY
752 noswap, MACDMP=37700+MOBY ;FOR DSKDMP
753 swap, IF2 MACDMP==ERR ;if neither dskdmp nor magdmp
758 subttl flag register assignments
761 TIF==100000 ;TRUNCATE TO 18 BITS - SET BY SPACE OR COMMA
762 PTF==100 ; +, -, OR * HAS BEEN TYPED
763 COMF==200000 ;COMMA FLAG
766 QF==1 ;QUANTITY TYPED IN TO WORD ASSEMBLER
768 CF==40 ;ALTMODE TYPED
769 CCF==400000 ;2 ALTMODES TYPED
770 MF==2 ;MINUS SIGN TYPED IN
771 LTF==20 ;LETTER TYPED IN TO CURRENT SYLLABLE
772 ROF==10 ;REGISTER OPEN FLAG
777 FPF==20000 ; . TYPED IN
781 DVF==40000 ;DIVIDE FLAG
785 OUTPUT==4 ;OPDECODER FLAGS
787 CF1==400 ;OUTPUT 1 REGISTER AS CONSTANT
788 LF1==2000 ;OUTPUT 1 REGISTER AS FORCED SYMBOLIC OR CONSTANT
789 Q2F==1 ;NUMBER TYPED AFTER
\e
791 NAF==200 ;NEGATIVE ADDRESSES PERMISSABLE
792 POWF==4000 ;ARGUMENT FOR EXPONENT COMING
793 SLL==10000 ;STOP LOOKING FOR LOCALS
795 GLOBAL==040000 ;GLOBAL SYMBOL
797 PNAME==740000 ;PROGRAM NAME
798 DELI==200000 ;DELETE INPUT
799 DELO==400000 ;DELETE OUTPUT
801 subttl ddt starts here
806 DDT: CLEARM INSW ;IF C(INSW) .NE. 0 THEN INPUT ROUTINE JRST'S @INSW
809 .OPEN CHTTYO,[.UAO,,'TTY ? SETZ ? SETZ]
811 .OPEN CHTTYI,[.UII,,'TTY ? SETZ ? SETZ]
814 JSR SAVE ;SAVE PROCESSOR CONDITION
815 PUSHJ P,BRKRET ;DIDN'T SKIP, PI STATUS AND AC'S WERE SAVED
816 SKIPGE JOBSYM ;IF SYMTAB MUNGED,
817 JRST IFIX ;THEN GO FIX IT
820 PUSHJ P,DISINI ;INITIALIZE DISPLAY
822 DD1: TLZ F,ROF ;INDICATE NO REGISTER OPEN
823 PUSHJ P,CRF ;TYPE CRLF (AND RUN SCOPE IF ON)
827 CLEARM PRNC ;PARENTHESES COUNT
830 LISA: TDZ F,[(,-1-ROF-STF)LF1+CF1+SBF+2] ;LEAVE REGISTER OPENED,TYPEOUT SUPPRESSED
831 LISB: TDZ F,[(,-1-ROF-STF-FAF-SAF)NAF]
837 L1: TLZ F,CF+CCF+SF+FPF ;TURN OFF CONTROL, SYL, PERIOD FLAG
840 MOVSI T,(50*50*50*50*50*50)
841 MOVEM T,TEM(I) ;INIT SYMBOL COUNTER
845 L2: PUSHJ P,IN ;PICK UP CHARACTER
846 TLNE F,CF ;CONTROL FLAG
859 CAIGE W,MULT-DDT ;LOCATIONS BEFORE MULT DON'T HAVE ARG EVALUATED
880 JRST DDT(W) ;MULTIPLY OR DIVIDE
883 JRST DDT(W) ; + - @ ,
886 TLNE F,TIF ;TRUNCATE INDICATOR FLAG
910 PUSHJ P,LCT ;COMMON RETURN FOR TAB;,JRST,LIS
913 UND1: MOVE R,ESTUT ;UNDEFINED SYM ASSEMBLER
924 dpy340, PUSHJ P,DISINI
935 QUESTN: PUSHJ P,CRF ;LIST UNDEFINED SYMBOLS
941 QUEST2: ADD W1,[(2)2]
960 OPEVAL: MOVEM P,SAVPDL
1016 MOVSI T,DELO ;LOOK FOR HALF-KILLED AND DIFFERENT PROGRAMS' LOCALS
1017 IORM T,SYM ;NOTE SETTING DELO HACKS EVAL3+2 TO IGNORE PROGRAM NAMES
1019 JRST UNDEF ;NOT DEFINED AT ALL
1021 PUSHJ P,EVAL1 ;LOOK FOR DUPLICATE INSTANCES
1022 XCT "',CRF ;DIFFERENT PROGRAM SELECTED
1024 XCT "",CRF ;MULTIPLY DEFINED
1026 LOSE2: MOVEM R,PRGM ;BACK UP TO PRECEDING PROGRAM NAME+2
1031 JRST L4A ;SELECT APPROPRIATE PROGRAM
1035 DC6AA: CAMN P,SAVPDL
1062 REPEAT 3,[(FOO_12.+1400)TBL
1080 IF1 IFE Z-"/, BARF 1
1081 IF2 IFE Z-"/, BARF Y!B+73
1082 IFE Z-"^,BARF <B&70>_-1+B&7-1
1093 subttl opcode dispatch table
1101 HACK [63^. FLO/ HAK/ ACCP/ BOOLE/ H HWT/ T ACBM/ . ]
1103 ;BYTE AND FLOATING INST
1104 HACK [FLO> 33^ ... BYTE/ FAD A/ FSB A/ FMP A/ FDV A>
1105 21^ LMB/ R IMB/ LMB> 02^ . L>L. M>M. B>B. BYTE> 03^ ..
1106 FS C/ IB P> P. I LD/ LD> LD B/ I DP/ DP> DP B/]
1111 HACK [63^. FLO/ HAK/ ACCP/ BOOLE/ H HWT/ T ACBM/ . ]
1113 ;BYTE AND FLOATING INST
1114 HACK [FLO> 33^ ADJ/ D DBL/ KI/ BYTE/ FAD A/ FSB A/ FMP A/ FDV A>
1115 21^ LMB/ R IMB/ LMB> 02^ . L>L. M>M. B>B. BYTE> 03^ UFA. DFN.
1116 FS C/ IB P> P. I LD/ LD> LD B/ I DP/ DP> DP B/
1117 ADJ> 03^ . . . . . ADJSP. . .]
1120 HACK [DBL> 03^ FAD . FSB . FMP . FDV . ADD . SUB . MUL . DIV .]
1123 HACK [KI> 12^ DMV/ FIXEX/ DMV/ F 01^ IX R/ LT R> R .
1124 DMV> DMOV 01^ E DMV2/ N DMV2> 21^ . M/
1125 FIXEX> 01^ FIX . EXTEND .]
1130 HACK [63^ . FLO/ HAK/ ACCP/ BOOLE/ H HWT/ T ACBM/ IO/ ]
1132 ;BYTE AND FLOATING INST
1133 HACK [FLO> 33^ XCAD/ D DBL/ KI/ BYTE/ FAD A/ FSB A/ FMP A/ FDV A>
1134 21^ LMB/ R IMB/ LMB> 02^ . L>L. M>M. B>B. BYTE> 03^ UFA. DFN.
1135 FS C/ IB P> P. I LD/ LD> LD B/ I DP/ DP> DP B/
1136 XCAD> 03^ . . XCTR/ XCTR/ . ADJSP. . .
1137 XCTR> XCTR 01^ I. .]
1140 HACK [DBL> 03^ FAD . FSB . FMP . FDV . ADD . SUB . MUL . DIV .]
1143 HACK [KI> 12^ DMV/ FIXEX/ DMV/ F 01^ IX R/ LT R> R .
1144 DMV> DMOV 01^ E DMV2/ N DMV2> 21^ . M/
1145 FIXEX> 01^ FIX . EXTEND .]
1147 ;ITS KS IO INSTRUCTIONS
1148 HACK [IO> 33^ IO0/ IO1/ IO2/ . . . . .
1151 IO1> IO2> 12^ IORD/ IOXX/ IOWR/ BLTX/
1152 IOXX> 01^ IORD/ IOWR> IOWR IOBY/
1153 IORD> IORD IOBY> 41^ IOIQ/ B IOIQ> 02^ I/ Q. . .
1154 BLTX> 41^ BLTXX/ . BLTXX> BLT 01^ BU. UB.]
1156 ;DEC KS IO INSTRUCTIONS
1157 ; HACK [IO> 33^ IO0/ IO1/ IO2/ . . . . .
1158 ; IO0> 12^ . . UMV/ .
1159 ; UMV> UMOVE 01^ . M/
1160 ; IO1> IO2> 03^ TIO/ TIO/ RD IOB/ WR IOB/ BS IOB/ BC IOB/ . .
1161 ; TIO> TIO 01^ E IOBP/ N IOBP/
1162 ; IOB> IO IOBP> 41^ . B/ ]
1166 ;FWT, FIXED POINT ARITH, MISC.
1167 HACK [HAK> 33^ MV/ MV> MOV MO/ ML/ DV/ SH/ H1/ JP/
1168 21^ ADD IMB/ SU BIMB> B IMB> 02^ . I>I. M/ B/ MO> 22^
1169 EIMS> E IMS/ S IMS/ N IMS/ M IMS> 02^ . I/ M/ S> S.
1170 ML> 21^ I ML1/ ML1> MUL IMB/ DV> 21^ I DV1/ DV1>
1171 DI DV2> V IMB/ H1> 03^ EXC S3/ BL T> T. AO/ AO> AOBJ
1172 AOB/ JRS T/ JFC L/ XC T/ . AOB> 01^ P/ N/
1173 JP> 03^ PU/ PU> PUSH PUS/ PO/ PO> POP POP/ JSR.
1174 JS P/ JS PA> A. JR PA/ PUS> 01^ J> J.. POP>
1175 01^ . J/ SH> 02^ A S2/ ROT S1/ L S2> S S3> H S1/ 21^ JFFO. CIR C/
1178 ;ARITH COMP, SKIP, JUMP
1179 HACK [ACCP> 42^ CA CA1/ SJ/ A JS/ S JS> O 31^
1180 J COMP/ S COMP/ CA1> 31^ I COMP/ M COMP/
1181 SJ> 31^ JUM PSJ/ SKI PSJ> P COMP>
1182 03^ . L/ E> E. L E/ PA/ G E/ N> N. G. ]
1185 HACK [BOOLE> 24^ ST/ AN> AND B2/ AN/ ST/ AN/ ST/
1186 X OR> OR B2/ I OR/ AN/ EQ DV2/ ST/ OR/ ST/ OR/ OR/
1187 ST> SET B2> 24^ Z IMB/ IMB/ CA> C TA/ TM> M IMB/
1188 CM> C TM/ TA> A IMB/ IMB/ IMB/ CB> C BIMB/ IMB/ CA/
1189 CA/ CM/ CM/ CB/ O IMB/ ]
1192 HACK [HWT> 51^ HW1/ 21^ R HW2/ L HW2> R HW3/ HW1>
1193 21^ L HW4/ R HW4> L HW3> 32^ IMS/ Z IMS/ O IMS/
1197 HACK [ACBM> 31^ AC1/ 01^ D AC2/ S AC2/ AC1> 01^ R AC2/ L
1198 AC2> 42^ N EAN/ Z EAN/ C EAN/ O EAN> 12^ . E/ PA/ N/ ]
1202 subttl command action routines
1204 NUM: ANDI T,17 ;T HOLDS CHARACTER
1210 MOVEI W,10. ;ALSO MAINTAIN DECIMAL WORD
1213 LE1: AOJA T,LE1A ;FOR SQUOZE SYM
1216 PERC: MOVEI T,47+101-13-45(T) ;PERCENT SIGN
1217 LET: TLC F,SF+FPF ;EXPONENT IFF LTF'*FEF'*(T=105)*SF*FPF=1
1218 TLZN F,LTF+FEF+SF+FPF
1228 LET1: SUBI T,101-13 ;FORM RADIX 50 SYMBOL
1237 NUM1: EXCH T,WRD2 ;FORM NUMBER AFTER DOLLAR SIGN
1245 MOVEI W1,6 ;FORM FLOATING POINT NUMBER
1254 NM1B: MOVSI W1,211000(T)
1255 FMPR R,W1 ;COMPUTE VALUE OF NEW DIGIT
1256 FADRB R,FH ;ADD VALUE INTO FLOATING NO.
1257 REPEAT 0,[ ;I THINK THIS HAIRY ROUNDING IS UNNEC. ALSO KL HAS NO "FMPL".
1281 TLO R,400 ; NORMALIZE
1288 JRST L4 ;NO EXPONENT
1307 TLNE F,SF ;SYLLABLE STARTED
1319 REPEAT 0,[ ;I THINK THIS DOUBLE PRECISION IS UNNEC. ALSO KL HAS NO "FADL"
1325 MOVEI T,45 ;RADIX 50 PERIOD
1328 QUAN: SKIPA T,LWT(I) ;LAST QUANTITY TYPED
1329 PILOC: MOVEI T, SAVPI
1331 QUAN2: TLO F,SF+QF ;WRD,SYL STARTED
1339 EVAL: MOVE R,PRGM ;LOOK UP SYMBOL
1340 EVAL0: HRLOI W1,37777+DELI ;W1 BITS MUST BE OFF
1343 EVAL1: ADD R,[(2)2] ;NEXT SYMBOL
1345 MOVE R,@JOBSYM ;WRAP AROUND
1346 CAMN R,PRGM ;SKIP UNLESS SCANNED ENTIRE SYMBOL TABLE
1347 POPJ P, ;NO SYMBOL FOUND
1350 TLNN T,PNAME ;SKIP UNLESS SYMBOL IS PROGRAM NAME
1351 TLOA W1,LOCAL ;PROGRAM NAME, FROM NOW ON IGNORE LOCALS
1353 JRST EVAL1 ;PROGRAM NAME OR NO MATCH, TRY NEXT
1355 JRST EVAL1 ;PROGRAM NAME, SKIP IT (CAN HAPPEN IF GOT HERE FROM LOSE1)
1356 MOVE T,1(R) ;GOT IT, RETURN VALUE IN T, SYMBOL TABLE PNTR IN R.
1358 CPOPJ1: AOS (P) ;FOUND SYMBOL, SKIP
1362 ;BIT 40 - DELETE OUTPUT
1366 ; NO BITS - PROGRAM NAME
1368 KILL: TLNN F,LTF ;DELETE SYMBOLS
1372 MOVEI T,DELO_-16. ;DELETE OUTPUT
1374 MOVEI T,DELI_-16. ;NO INPUT OR OUTPUT
1382 MOVEM R,@JOBSYM ;RESTORE INIT SYMS
1386 ANDCAM T,(R) ;GET RID OF DELETE BITS IN INITIAL TABLE
1391 KILL1: MOVE R,ESTU ;REMOVE UNDEFINED SYMS
1393 KILL2: PUSHJ P,EVAL0
1398 REMUN: MOVE S,[(2)2] ;REMOVE ONE UNDEFINED SYM
1414 TAG: TLNE F,CF ;DEFINE SYMBOL AS OPEN REGISTER
1423 ADEFIN: PUSHJ P,EVAL
1437 dpy340, PUSHJ P,DISINI
1445 DEF3: JUMPGE R,RET ;PATCH IN UNDEFINED SYM
1464 ;DISK COMMANDS HERE SO NO EVAL ARG
1480 SETNAM: MOVE R,@JOBSYM
1481 SET2: JUMPGE R,UNDEF
1489 MULT: TLOA F,PTF+MLF ;*
1490 DIVD: TLO F,DVF+PTF ;SINGLE QUOTE
1498 LPRN: CAML P,[(LPDL-32)]
1500 PUSH P,F ;RECURSE FOR OPEN PAREN
1507 INDIRECT: MOVSI W,(@)
1517 LDB W1,[(331100)WRD] ; Get top 9 bits of opcode
1518 LSH R,27 ; Shift into AC field
1519 CAIN W1,700 ; Old-style IO instruction?
1520 LSH R,1 ; Yes: Shift into device field
1523 ; LDB W1,[(410300)WRD]
1559 LINEF: PUSHJ P,DEPRA ;NEXT REGISTER
1562 LI1A: MOVE R,PLCR ;MOVE BACK IN RING BUFFER
1576 MOVEI T,"! ;EXCLAMATION MARK
1595 OCON: TROA F,LF1+CF1 ;OPEN AS CONSTANT
1596 OSYM: TRZ F,CF1 ;OPEN SYMBOLICALLY
1598 SLASH: TLZ F,STF ;TYPE OUT REGISTER
1599 TLZE F,CF ;ALTMODE SLASH SUPPRESSES TYPEOUT
1602 PUSHJ P,PLOC ;QUANTITY TYPED
1603 SLAS1: HRRZM T,LLOCO
1613 AOS R,PLCR ;ADVANCE RING POINTER
1630 IKON: MOVEM T,LWT(I)
1638 DEPRA: TLNE F,ROF ;IF REGISTER IS BEING CHANGED
1639 TLNN F,QF ;REMOVE ALL PREVIOUS UNDEFINED
1640 JRST DEPRS ;SYMBOL REFERENCES TO IT
1643 DEPRA2: JUMPGE R,DEPRS
1650 EQUAL: TROA F,LF1+CF1 ;=
1655 R50PNT: MOVEM T,LWT(I) ;AMPERSANT
1663 HWRDS: MOVEI R,HLFW-TFLOT ;H
1664 SFLOT: ADDI R,TFLOT-SATP ;F
1665 RATP: ADDI R,SATP-IASCO ;T
1666 ASCSET: ADDI R,IASCO-ISIXO ;"
1667 SIXSET: ADDI R,ISIXO-PIN ;'
1668 SYMBOL: ADDI R,PIN-FTOC ;S
1678 BASECH: SOJLE T,ERR ;CHANGE RADIX
1684 SET: MOVEI W,-RELA(W)
1706 TKS,[ ;Compensate for DEC brain death: XCT of JRST 2, gets wrong flags
1718 XEC1: JRST DDT ;USED BY BCOM
1724 DQUOTE: TLNE F,CF ;IF ALTMODE TYPED,
1725 JRST DQOT2 ;THEN SET TYPEOUT MODE
1726 MOVEM T,LWT(I) ;DOUBLE QUOTE
1727 ;DISPATCH ENTRY FOR IN DOUBLEQUOTE MODE
1730 TDNE W1,[-200] ;SKIP IF ONLY ONE CHARACTER IN WORD
1732 LSH W1,1 ;THEN ASSUME IT'S RIGHT JUSTIFIED
1734 TEXO10: JUMPE W1,CPOPJ
1742 SQUOTE: TLNE F,CF ;IF ALTMODE TYPED
1743 JRST SQOT2 ;THEN SET TYPEOUT MODE
1744 MOVEM T,LWT(I) ;SINGLE QUOTE
1745 ;DISPATCH ENTRY FOR IN SINGLEQUOTE MODE
1755 ;ENTRY FROM ALTMODE DOUBLEQUOTE
1756 DQOT2: TRZN F,Q2F ;IF NUMBER NOT TYPED AFTER ALTMODE,
1757 JRST ASCSET ;THEN SET TYPEOUT MODE
1758 MOVSI W1,440700 ;OTHERWISE, DO ASCII TYPEIN
1762 ;ENTRY FROM ALTMODE SINGLEQUOTE
1763 SQOT2: TRZN F,Q2F ;IF NUMBER NOT TYPED AFTER ALTMODE
1764 JRST SIXSET ;THEN SET TYPEOUT MODE
1765 MOVEI W1,40 ;OTHERWISE, DO ASCII TYPEIN
1770 MOVE T,WRD2 ;SO
\e1" DOES RIGHT THING
1784 SASEM: SUBI T,0 ;CLOBBERED TO 0 OR 40
1793 SETCMM DISON ;COMPLEMENT STATUS FLAG
1794 JRST DISINI ;INITIALIZE DISPLAY AND RETURN
1804 TBP1: 0 ? JSA T,BCOM ? 0 ;TEMPORARY BREAK 1
1805 TBP2: 0 ? JSA T,BCOM ? 0 ;TEMPORARY BREAK 2
1812 ;BREAKPOINT 0 LIKE OTHERS EXCEPT DOESN'T GET CHECKED ON LOC$B OR CLEARED BY $B
1816 MOVEI T,B1SKP-B1INS(T)
1817 HRRM T,BCOM3 ;CONDITIONAL BREAK SETUP
1818 MOVEI T,B1CNT-B1SKP(T)
1819 HRRM T,BCOM2 ;PROCEDE COUNTER SETUP
1821 HLLM T,LEAV1 ;SAVE FLAGS FOR RESTORING
1822 EXCH T,BCOM ;RESTORE FORMER CONTENTS OF ACCUMULATOR
1824 BCOM3: SKIPE B1SKP ;ADDRESS MODIFIED, POINTS TO CONDITIONAL BPT INSTRUCTION
1826 BCOM2: SOSG B1CNT ;ADDRESS MODIFIED, POINTS TO COUNT OF CURRENT BPT
1830 LDB T,[(331100)@LEAV]
1832 CAILE T,266 ;JSA,JSP
1839 JRST 2,@LEAV1 ;RESTORE FLAGS AND JUMP TO .+1
1841 LEAV: XCT B1INS ;ADDRESS MODIFIED
1852 IFN 1PRSW, CAIGE T,TB1ADR
1857 PUSHJ P,TOUT ;TYPE OUT SECOND ">" IF COUNT EXHAUSTED
1870 BREAK1: HRRZ R,BCOM3
1882 SKIPN R,ALTPC ;TURN INTO <ALT>G?
1885 MOVE T,[JRST 2,@ALTPC1]
1889 MOVEI T,1 ;NO COUNT SPECIFIED, USE 1
1890 MOVEM T,@BCOM2 ;MOVE TO COUNT OF SPECIFIED BPT
1895 PROC0: HRRZI R,XEC1 ;ADDRESS MODIFIED
1900 MOVE T,WRD ;BREAKPOINTED INSTRUCTION TO XCT
1924 LDB W1,[(270400)TEM]
1937 KL, CAIGE T,74 ;LPMR,SPM,XCTR,XCTRI
1948 BPLUP: PUSHJ P,BRKRET
1949 JSR SAVE ;ALWAYS SKIPS
1950 INC1: JSR BP0 ;USED AS "CONSTANT" IN SETTING UP FOR INSERTING BREAKPOINTS
1953 IPUSHJ: DPB W1,[(270400)CPUSHP]
1979 INSRT1: SKIPE R,B1ADR-BP1(S) ;GET C(B<N>ADR) IN R
1980 PUSHJ P,FETCH ;GET CONTENTS OF LOC ADDRESSED BY R INTO T
1981 JRST INSRT3 ;LOCATION OUTSIDE OF MEMORY OR BREAKPOINT EMPTY
1982 MOVEM T,B1INS-BP1(S) ;PUT CONTENTS IN B<N>INS
1984 PUSHJ P,DEP ;DEPOSIT T IN LOCATION SPECIFIED BY R
1990 SKIPE R,1POADR ; If one-proceeding going on,
1991 EXCH T,UPT1PN-UPT1PO(R) ; then usurp UPT1PN.
1998 REMOVB: MOVEI S,BNADR ;POINTER TO B<N>ADR
1999 REMOV1: MOVE T,B1INS-B1ADR(S) ;INSTRUCTION AT BREAKPOINT <N>
2000 SKIPE R,(S) ;IF THERE'S REALLY A BREAKPOINT THERE,
2001 PUSHJ P,DEP ;THEN DEPOSIT INSTRUCTION IN USER'S CORE (SPECIFIED BY R)
2006 SETZM TB1ADR ;FLUSH TEMPORARY BREAKS
2011 SKIPE R,1POADR ; If UPT1PN usurped,
2012 MOVEM T,UPT1PN-UPT1PO(R) ; then put it back now.
2019 JRST BPS1 ;LOCATION SPECIFIED
2021 JRST BPS2 ;REMOVE SPECIFIED BREAKPOINT
2022 MOVE T,[(B1ADR)B1ADR+1] ;REMOVE ALL BREAKPOINTS
2030 JRST,BPS3 ;NUMBER NOT TYPED AFTER ALTMODE
2034 ;GET HERE WHEN NUMBER TYPED AFTER ALTMODE
2036 BPS2: SKIPL T,WRD2 ;BPT # NOT LEGAL...
2037 CAILE T,10 ;IF NOT BETWEEN 0 AND 8 INCLUSIVE
2039 IMULI T,3 ;AMOUNT OF STG PER BREAKPOINT
2040 ADDI T,B1ADR-3 ;MAKE T POINT TO STG AREA OF SPECIFIED BREAKPOINT
2042 JRST MASK2 ;LOCATION NOT SPECIFIED, TREAT AS SYM
2043 EXCH R,T ;R NOW IS POINTER TO BP STG AREA, T SPECIFIED LOCATION
2049 BPS4: HRRZ W,(R) ;GET BPN LOCATION
2050 CAIE W,(T) ;IF SPECIFIED LOCATION,
2051 SKIPN (R) ;OR IF ZERO,
2052 JRST,BPS5 ;THEN USE IT,
2053 ADDI R,3 ;OTHERWISE INCREMENT R TO POINT TO STG OF NEXT BPT
2054 CAIG R,BNADR ;SKIP IF TOO MANY
2055 JRST,BPS4 ;GO LOOK AT NEXT ONE
2058 BPS5: MOVEM T,(R) ;SET BP TO SPECIFIED LOCATION (0 MEANS NOT IN USE)
2061 AUTOP: SUBI R,B1ADR ;NOW MUNG R,
2062 IDIVI R,3 ;INTO BP NUMBER
2064 LSH S,1(R) ;C(S):=1_<1+BP#>
2067 IORM S,AUTOPI ;ALTMODE ALTMODE TYPED MEANS BPT ENCOUNTER => TYPE MESSAGE
2068 ;BUT CONTINUE (UNTIL CHARACTER TYPED AT TTY)
2075 1PRCNT: 0 ; If > 0, one-proceeding is going on
2076 1POADR: 0 ; 0 or address of usurped UPT1PO
2077 1PNSV: 0 ; Saved contents of usurped UPT1PN
2080 JRST ERR ; No
\e\ e or
\e\e\ e support
2082 MOVEI T,1 ; Argument defaults to 1
2089 TS, MOVEI R,44 ; Just a kludge for debugging under TS
2090 MOVEM R,1POADR ; Commence usurpation
2098 PUSHJ P,INSRTB ; First, insert all breakpoints
2100 PUSHJ P,FETCH ; Then take a look at the next instruction
2101 JRST CTLN1 ; (oh well, just punt)
2102 CAML T,[JSR BP0] ; Is it a breakpoint of some sort?
2104 JRST CTLN1 ; Nope, get going
2105 MOVE T,B1INS-BP1(T) ; Yeah, clobber it back again
2107 CTLN1: JSP T,RESTORE
2108 1PRTR1: MOVE T,AC0+T ; (redundant if you fall in)
2117 MOVE T,AC0+T ; In case executing in ACs!
2118 MOVE T,@ALTPC1 ; Peek at the next instruction
2119 CAML T,[JSR BP0] ; Is it a breakpoint of some sort?
2121 JRST 1PRTR1 ; Nope, get going
2122 MOVE T,AC0+T ; Yup, abandon stepping
2126 SETZM 1POADR ; Cease usurpation
2129 SKIPLE 1PRCNT ; Abandoned because of breakpoint?
2130 JRST PROCED ; Yes, proceed into breakpoint
2131 MOVEI T,"> ; No, go tell user where we stopped
2134 .ERR Shouldn't leave location open after 1-proceed
2151 MOVE T,WRD ;T HAS TB2ADR,,TB1ADR
2156 ONEPRO: JRST ERR ;NOT HACKED YET
2159 IFNDEF CTLN, CTLN==:ERR
2161 DEPRS: MOVEM T,LWT(I)
2162 DEPR: MOVE R,LLOCO ;QUAN TYPED IN REGIS EXAM
2167 JRST DEP1 ;BPT LOCATION IS AN ACCUMULATOR
2171 DEP1: MOVEM T,AC0(R)
2182 FIRARG: MOVEM T,DEFV
2200 MOVE W,[444400,,ENDT]
2202 LEND1A: ILDB W,TEM(I)
2212 LLUPI1: JRST LLUP1 ;OR TRNA
2234 LLUPD: BLKO DIS,DISPTR
2242 LOOK1: MOVEM T,TEM(I)
2247 CONSYM: MOVEM T,LWT(I)
2255 PUSHJ P,OPTYPE ; Look it up in the opcode table first
2256 TRNE F,1RF ; Anything typed?
2257 JRST PI3.1 ; Yes: proceed
2259 TLNN T,777000 ; Opcode 0?
2260 JRST PI3+1 ; Yes: skip this stuff
2262 TLCN T,700000 ; Traditional IO instruction?
2263 JRST INOUT ; Yes: Go do it that way
2264 PUSHJ P,LOOK ; No: look it up
2280 LDB T,[(270400)LWT(I)] ;AC
2286 TLNE W1,20 ;CHECK FOR INDIRECT BIT
2289 LDB W1,[(331100)LWT(I)]
2295 LDB R,[(220400)LWT(I)] ;INDEX REGISTER CHECK
2310 PAD: ANDI T,777777 ;PRINT ADDRESS
2311 JRST @AR ;PADSO OR PAD1
2312 PADSO: JUMPE T,TOC2+1
2323 PADS2: HRRZ T,TEM(I)
2324 PAD1: JRST,TOC ;EXIT
2326 PADS3: MOVE T,TEM(I)
2330 PADS3B: MOVNM T,TEM(I)
2334 INOUT: TDC T,[(,-1)400000]
2335 TDCN T,[(,-1)400000]
2338 CAILE R,(CONO 774,@)
2347 INOUT1: JUMPE T,PI4 ;USED BY "WORD"
2348 PUSHJ P,LOOK ;LOOK FOR DEVICE NUMBER
2358 ;$NB ENTRY (WHERE N SPECIFIED, LOCATION NOT)
2366 OVRD1: MOVE R,MSKTB(B)
2384 AWORD: SKIPA W,INOUT1 ;JUMPE T,
2385 NWORD: MOVSI W,(JUMPN T,)
2393 MOVE T,[JRST SEAR2B]
2396 SETCMM FRASE(T) ;PREVENT TYPEOUT
2403 SEAR1: TRNN R,777760 ; Looking at ACs?
2404 JRST SEAR1A ; Yes: Be slow
2405 MOVE T,(R) ; No: Be fast
2409 SEAR2: JUMPE T,SEAR3 ;OR JUMPN T
2410 SEAR2A: TRNN R,77 ; LISTEN every 100 times
2412 SEAR2E: AOBJN R,SEAR1 ; Loop until LH positive...
2413 TLNE R,-1 ; And just how did that happen?
2414 JRST SEAR1 ; It was already positive
2415 SEAR2C: SETCMM LWT(I) ; Counted up to 0: Done
2418 SEAR2D: PUSHJ P,LISTEN
2422 SEAR1A: PUSHJ P,FETCH
2425 SEAR2B: PUSHJ P,EFFEC0
2431 SEAR3: PUSHJ P,FETCH
2449 EFFEC0: MOVEM R,TEM2 ;CALLED BY SEARCH AND $\
2458 TLNN W,20 ;INDIRECT BIT CHECK
2468 SETUP: TLO F,LTF ;ZERO
2469 SETUP1: MOVEI T,1(T)
2486 ZERO1: TRNE R,777740 ;R AOBJN PNTR TO CORE TO CLEAR
2487 JRST,ZERO2 ;T UPPER LIMIT (LAST LOC TO CLEAR+1)
2488 TRNN R,20 ;DONT Z 20-37
2494 ZERO2: HRRZ S,@JOBSYM ;ONLY CLEAR CORE BELOW SYMBOL TABLE
2495 CAILE T,(S) ;(JUST ASSUME IT'S A MOBY DDT)
2534 CJTOUT: JRST,TOUT ;DOES POPJ TO TOC2 OR EXIT
2546 MOVE T,0(W1) ;SYMBOL PRINT
2549 SPT1: IDIV T,[50*50*50*50*50]
2566 BRKRET: PUSHJ P,REMOVB
2579 dpy340, MOVSM T,DISDON
2584 dpy340, PUSHJ P,DISINI
2588 MOVEI W2,40000 ;WAIT FOR LAST CHR TO BE TYPED (SO LOSERS PRGM DOESNT
2589 CONSZ TTY,120 ;GET AN INTERRUPT..
2593 ANDI W2,10 ;ATTEMPT TO RESTORE STATE OF OUTPUT DONE FLAG
2598 ; CONO TTY,400000(T) ;MORE PDP6 TK KLUDGE WINNAGE
2607 DRESET: CONO DIS,100
2622 subttl variable area
2646 LLOC: 112 ;CURRENT LOCATION
2657 PRGM: -NSYMS+2,,LOW+2
2661 ALTPC: 0 ;NON-ZERO MEANS ALT-P JUMPS THERE
2665 DISSW: MOVE T,@-1(P)
2673 DISACS: BLOCK DIS2-DIS1-6
2677 MOVSI T,(TRNA#CONSZ#CONSO)
2688 MSK: -1 ;INITIAL MASK FOR WORD SEARCHES
2689 B0ADR: REPEAT 3,0 ;FOR $0B, MUST BE SPECIFIED TO BE USED (NOT SET BY
2690 ; LOC$B, NOT CLEARED BY $B)
2693 B1CNT: 0 ;ONE MORE THEN # TIMES TO IGNORE ENCOUNTER OF THIS BPT
2702 AUTOPI: 0 ;1_N ON IF LOC$$B TYPED, ON MEANS PRECEED AFTER
2703 ; TYPING BPT MSG, UNTIL CHAR. TYPED AT TTY
2705 INFORM SAVED ACS AREA,\. ;FOR CRASH XFILE
2708 SWAP,TWENTY: BLOCK LOWFIX-20 ;DON'T MOVE FROM HERE
2713 SCHM: PIN ;THESE 3 LOCATIONS BLT'D INTO PRECEDING 3 LOCATIONS DURING SAVE
2716 SARS: 0 ;NON-ZERO IF STUFF SAVED (USED BY SAVE)
2729 SKIPN SARS ;IF CRUD NOT ALREADY SAVED,
2730 JRST SAV1 ;THEN GO SAVE IT,
2731 AOS SAVE ;OTHERWISE AOS RETURN POINT,
2732 JRST SAV5 ;AND SAVE MINIMALLY
2744 SAV5: SETOM SARS ;INDICATE CRUD SAVED
2745 MOVEI P,PS ;INITIALIZE PDL POINTER
2748 CLEARB F,I ;CLEAR FLAGS AND I
2752 ;SEE LOW CODE FOR RESTORE
2758 DPB T,[300600,,SATPP]
2759 dpy340, DPB T,[300600,,SATPP+DIS2-DIS1]
2765 DPB W,[360600,,SATPP(I)]
2768 SATPL: ILDB T,SATPP(I)
2776 subttl command dispatch table
2778 BDISP: (301400+R)DISP
2789 ZD ERR,ERR,L2 ;
\0\ 1\ 2
2790 ZD DS,ERR,L2 ;^C,
\ 4,
\ 5
2791 ZD LISTF0,ERR,ERR ;
\ 6,
\a,
\b
2792 ZD TAB,LINEF,ERR ;TAB,LF,
\v
2793 ZD ERR,CARR,CTLN ;FORMF,CR,
\ e
2794 ZD ERR,ERR,ERR ;
\ f,
\10,
\11
2795 ZD ERR,ERR,ERR ;
\12,
\13,
\14
2796 ZD ERR,L2,L2 ;
\15,
\16,
\17
2797 ZD ERR,ERR,ERR ;
\18,
\19,
\1a
2798 ZD CONTROL,ERR,ERR ;
\e,^\,^]
2799 ZD ERR,ERR,SPACE ;^^,^_,SP
2800 ZD DIVD,DQUOTE,ASSEM ;!,",#
2801 ZD DOLLAR,PERC,R50PNT ;$,%,&
2802 ZD SQUOTE,LPRN,RPRN ;',(,)
2803 ZD MULT,PLUS,ACCF ;*,+,,
2804 ZD MINUS,PERIOD,SLASH ;-,.,/
2805 ZD NUM,NUM,NUM ;0,1,2
2806 ZD NUM,NUM,NUM ;3,4,5
2807 ZD NUM,NUM,NUM ;6,7,8
2808 ZD NUM,TAG,DEFIN ;9,:,;
2809 ZD FIRARG,EQUAL,ULIM ;<,=,>
2810 ZD ASLASH,INDIRECT,ABSA ;?,@,A
2811 ZD BPS,CON,SDEC ;B,C,D
2812 ZD EFFEC,SFLOT,GO ;E,F,G
2813 ZD HWRDS,PILOC,ERR ;H,I,J
2814 ZD KILL,LOAD0,MASK ;K,L,M
2815 ZD NWORD,SOCT,PROCEDE ;N,O,P
2816 ZD QUAN,RELA,SYMBOL ;Q,R,S
2817 ZD TATP,DECDMP,DISF ;T,U,V
2818 ZD AWORD,XEC,DUMP0 ;W,X,Y
2819 ZD ZERO,OCON,ICON ;Z,[,\
2820 ZD OSYM,VARRW,PSYM ;],^,_
2826 CONSZ TTY,20 ;ALLOW LAST CHAR TYPED TO APPEAR ON PAPER SO CANT BE CLOBBERED
2827 dpy340, PUSHJ P,DISCFT ;BY IO RESET
2830 KL,[ CONSO PAG,600000 ;FLUSH CACHE IF NECC.
2839 IFIX: SKIPLE T,JOBSYM ;IF JOBSYM POSITIVE,
2840 JRST DDT ;THEN CONTROL SHOULDN'T HAVE COME TO HERE TO BEGIN WITH
2841 MOVE R,(T) ;GET POINTER TO SYMS
2842 JUMPN T,IFIX1 ;JUMP IF SYMS ADDED
2843 MOVE R,KILC ;INITIAL SYMS POINTER
2844 MOVEM R,DDT-2 ;SET UP SYM POINTER
2846 IFIX1: HRRZM T,JOBSYM ;INDICATE LOCATION OF SYMS POINTER
2853 ; CONI TTY,T ;THIS HACK IS FOR THE KNIGHT MULTIPLE TTY KLUDGE ON THE PDP6!!
2854 ; ANDI T,170000 ;MAY IT REST IN PEACE
2856 ; HRRM T,TTYRT ;CONO TO TTY
2862 INFORM [HIGHEST USED]\.-1