2 EDDT=1 ;MAKE EXEC DDT
\r
4 ;ALL OTHER REFERENCES TO VERSION # ARE TAKEN CARE OF BY THIS DEFINITION
\r
12 DDT ASSEMBLY INSTRUCTIONS
\r
14 THE SOURCE OF DDT,13 WILL ASSEMBLE INTO SEVERAL DIFFERENT
\r
15 VERSIONS; THE ASSEMBY IS CONTROLED BY THE VALUE ASSIGNED
\r
16 TO THE SYMBOL "EDDT". THE SYMBOL "EDDT" IS DECODED AS FOLLOWSR:
\r
18 BIT 35 =0: ASSEMBLE USER MODE DDT
\r
19 =1: ASSEMBLE AN EXECUTIVE MODE DDT
\r
21 BIT 34 =0: DO NOT ASSEMBLE THE PAPER TAPE FEATURE INTO DDT
\r
22 =1: ASSEMBLE THE PAPER TAPE FEATURES BUT ONLY IF
\r
23 ASSEMBLING AN EXECUTIVE MODE DDT
\r
25 BIT 33 =0; FOR USER MODE DDT ONLY- ASSEMBLE USING THE
\r
26 "TTCALL" UUO FOR TELETYPE IO
\r
27 =1; FOR USER MODE DDT ONLY- ASSEMBLE USING THE
\r
28 "DDTIN" AND "DDTOUT" UUO'S FOR TELETYPE IO
\r
30 BIT 32 =1; ASSEMBLE A FILE DDT
\r
33 =0; ASSEMBLE A RELOCATABLE VERSION OF DDT (RELOC 0)
\r
34 NOT=0; ASSEMBLE AN ABSOLUTE (NON-RELOCATABLE) VERSION
\r
35 OF DDT WITH A STARTING ADDRESS BEING THE
\r
38 (IF THE SYMBOL "EDDT" IS NOT DEFINED AT ALL, DDT WILL BE ASSEMBLED
\r
41 EXAMPLES OF "EDDT" DEFINTIONS:
\r
42 EDDT=0 ASSEMBLE A RELOCATABLE USER MODE DDT WITH TELETYPE
\r
43 I/O DONE BY THE "TTCALL" UUO
\r
45 EDDT=1 ASSEMBLE A RELOCATABLE EXECUTIVE MODE DDT
\r
48 ASSEMBLE AN ABSOLUTE EXECUTIVE MODE DDT
\r
49 WITH PAPER TAPE FEATURES, AND WHOSE STARTING
\r
50 ADDRESS IS LOCATION 4000.
\r
61 EXAMPLE OF A MACRO ASSEMBLY COMMAND:
\r
67 *DSK:UDDT,/C_TTY:,DTA2:DDT.12
\r
71 END OF PASS 1 ;THIS LINE TYPED BY MACRO
\r
75 NO ERRORS DETECTED ;TYPED BY MACRO
\r
77 PROGRAM BREAK IS 003340 ;TYPED BY MACRO
\r
82 OTHER VERSION OF DDT ARE ASSEMBLED IN A SIMILAR MANNER
\r
83 BY DEFINING "EDDT": A DIFFERENT WAY WHERE THE EXAMPLE
\r
88 IFNDEF EDDT,<EDDT=0>
\r
95 IFN EDDT&1,<DEFINE HEADER (VERSION),<
\r
96 TITLE EDDT V0'VERSION -EXEC MODE DDT
\r
102 IFE EDDT&1,<DEFINE HEADER (VERSION),<
\r
104 TITLE UDDT V0'VERSION -USER MODE DDT>
\r
106 TITLE FILDDT V0'VERSION -FILE DDT>
\r
107 EXTERN JOBREL,JOBSYM,JOBSA
\r
110 ;DO NOT SET LOWER CORE IF EXEC DDT(OK USER OR FILDDT)
\r
114 DDTVER ;PUT VERSION # IN JOBVER
\r
121 IFN EDDT&<XWD -1,0>,<LOC <EDDT>B53>
\r
124 ;THE HEADER MACRO CONSTRUCTS THE TITLE AND VERSION #
\r
125 \fIFN EDDT&10,< CM=2 ;DEFINE SOFTWARE CHANS.
\r
128 ;DEFINE ACCUMULATORS
\r
132 R=<A=2> ;POINTERS TO TABLES, CORE, ETC.
\r
134 W=<C=4> ;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER
\r
138 SCH=10 ;MODE CONTROL SWITCH FOR OUTPUT
\r
139 AR=11 ;MODE CONTROL SWITCH FOR OUTPUT
\r
140 ODF=12 ;MODE CONTROL SWITCH FOR OUTPUT - CURRENT RADIX
\r
144 ;DEFINE I/O DEVICE MNEMONICS FOR DDT USE
\r
150 ;DEFINE PUSH DOWN LENGTH
\r
151 LPDL=50 ;MAX LENGTH PUSH DOWN LIST
\r
153 ;DEFINE BITS FOR USE IN LEFT HALF OF ACCUMULATOR F
\r
154 COMF=200000 ;COMMA TYPED FLAG
\r
155 TIF=100000 ;TRUNCATE TO 18 BITS - SET BY SPACE OR COMMA
\r
156 PTF=100 ; +, -, OR * HAS BEEN TYPED
\r
158 SF=4 ;SYLLABLE FLAG
\r
159 QF=1 ;QUANTITY TYPED IN TO WORD ASSEMBLER
\r
162 CCF=10000 ; $$ TYPED
\r
163 MF=2 ;MINUS SIGN TYPED IN
\r
164 LTF=20 ;LETTER TYPED IN TO CURRENT SYLLABLE
\r
165 ROF=10 ;REGISTER OPEN FLAG
\r
170 FPF=20000 ; . TYPED IN
\r
171 FEF=400000 ; E FLAG
\r
174 DVF=40000 ;DIVIDE FLAG
\r
176 ;PID IS 20 IF SYM TAB POINTER IS INDIRECT JOBSYM
\r
177 PID=0 ;=0 IF SYMBOL TABLE POINTER IS IN JOBSYM
\r
179 ;DEFINE BITS FOR USE IN RIGHT HALF OF ACCUMULATOR F
\r
181 ITF=2 ;INSTRUCTION TYPED IF ITF=1
\r
182 OUTF=4 ;OUTPUT IF OUTF=1
\r
183 CF1=400 ;OUTPUT 1 REGISTER AS CONSTANT
\r
184 LF1=2000 ;OUTPUT 1 REGISTER AS FORCED SYMBOLIC OR CONSTANT
\r
185 Q2F=1 ;NUMBER TYPED AFTER ALT MODE
\r
186 R20F=10 ;TEMP FLAG USED IN SETUP
\r
188 NAF=200 ;NEGATIVE ADDRESSES PERMISSABLE
\r
189 POWF=4000 ;ARGUMENT FOR EXPONENT COMING
\r
191 ;DEFINE SYMBOL TABLE SYMBOL TYPES
\r
192 GLOBAL=040000 ;GLOBAL SYMBOL
\r
194 PNAME=740000 ;PROGRAM NAME
\r
195 DELI=200000 ;DELETE INPUT
\r
196 DELO=400000 ;DELETE OUTPUT
\r
198 DDT: INTERN DDTEND ;DECLARE END OF DDT AS INTERNAL, FOR
\r
199 ; USER TO SEE (USER MODE) AND ONCE ONLY CODE
\r
201 IFE EDDT&1,< ENTRY DDT
\r
203 IFN EDDT&1,< INTERNAL DDT
\r
205 ENTRY DDTX ;NEEDED BY MONITOR>
\r
207 ;DEFINE $ SYMBOLS INTERNAL TO DDT
\r
208 OPDEF DDTINT [Z 0,] ;ADDRESS FLAG FOR INTERNAL REGISTERS
\r
211 NBP=8 ;NUMBER OF BREAKPOINTS
\r
212 DEFINE DBPNT (Z.)<XP $'Z.'B,<DDTINT B1ADR+3*Z.-3>>
\r
214 REPEAT NBP,<DBPNT \<ZZ=ZZ+1>>
\r
223 \f;DEFINE I/O DEVICE MNEMONICS
\r
254 ;DEFINE EXTENDED OPERATIONS
\r
263 HLRZ T,ESTU ;THIS SEQUENCE INITS SYM TABLE LOGIC
\r
266 ADD T,W ;IF THE TOP OF THE UNDEFINED SYM TAB DOES
\r
267 TRNE T,-1 ; NOT POINT TO BOTTOM OF REGULAR SYM TABLE,THEN
\r
268 HRRZM W,ESTU ; RE-INIT UNDEFINED SYM TABLE POINTER. ESTU.
\r
270 SUB T,W ;IF THE SYM TABLE PNTR AND THE PROGRAM
\r
271 TSC T,T ; NAME (PRGM) PNTR DO NOT END UP IN THE
\r
272 MOVE W1,PRGM ; SAME PLACE. OR THEY DO NOT BOTH START ON
\r
273 XOR W1,W ; AN EVEN (OR BOTH ON ODD) LOCATION. OR
\r
274 TRNE W1,1 ; PRGM .GE.0, THEN RE-INIT PRGM.
\r
275 JRST DDT0 ;EVEN-ODD PROBLEM
\r
276 SKIPN T ;POINTERS DON'T END TOGETHER
\r
277 SKIPL PRGM ;IF PRGM .GE. 0, THEN RE-INIT
\r
278 DDT0: MOVEM W,PRGM ;PRGM=C(JOBSYM)
\r
283 MOVEM T,JOBREN ;SET REENTER ADDRESS
\r
289 SETZM CRASH+3 ;CLEAR PPN
\r
290 SETZM COMNDS+3 ;CLEARN PPN IN CASE FILDDT SAVED AFTER STARTING
\r
291 SETZM SNAP+3 ;ALSO GOOD PRACTICE TO BE SELF INITIALIZING
\r
292 SETZM CRASHS ;ASSUME NO CRASH.SAV(IE. PEEK AT CURRENT MONITOR)
\r
294 JRST NOCSH ;LET USER PASS. HE MAY WANT TO PEEK AT MON.
\r
295 ; OR JUST WANT TO TYPE OUT VALUE OF SOME SYMBOLS
\r
296 SETOM CRASHS ;FLAG CRASH.SAV EXISTS ON DSK
\r
302 SETOM RSAVE ;FORCE READING OF "CURRENT" BLOCK
\r
308 SETOM COMAND ;ASSUME A COMMAND FILE
\r
310 NOLPT: SETZM COMAND ;NO FILE IF NOT FOUND
\r
312 JRST DD1 ;USE TTY I/O
\r
314 SIXBIT .,LPT. ;PREPARE FOR LPT OUTPUT IN AL MODE
\r
316 JRST NOLPT ;TREAT AS THO NO FILE
\r
318 JRST NOLPT ;TREAT AS NO FILE IF CAN'T ENTER
\r
322 HOW TO COPY MONITOR SYMBOL TABLE INTO FILDDT
\r
323 1) USE FDDD10 TO LOAD AN UNRUN VERSION OF YOUR MONITOR
\r
324 AS SAVED AFTER BUILD OR LOADING.
\r
325 2) RENAME IT AS CRASH.SAV
\r
326 3) LOAD A PRISTINE VERSION OF FILDDT AND START IT TO SET
\r
329 5) FILDDT WILL EXPAND AS NECESSARY AND COPY THE SYMBOL
\r
330 TABLE FROM CRASH.SAV INTO ITSELF
\r
331 6) AFTER CARRIAGE RETURN IS TYPED FILDDT IS DONE.
\r
332 7) SAVE FILDDT WITH A NEW NAME SO AS NOT TO CONFUSE IT WITH THE
\r
333 ORIGINAL FILDDT.SAV
\r
335 THE MONITOR CAN BE LOADED IN ANY OF THREE WAYS(IN ORDER OF PREFERENCE):
\r
336 1. UNDER TIME SHARING WITH REGULAR LOADER AND COMMON
\r
337 2. UNDER REGULAR 10/30 MONITOR WITH REGULAR 10/30 LOADER & COMMON
\r
338 3. UNDER SPECIAL 10/30 MONITOR(SPMON) WITH BUILD
\r
340 THE 3 WAYS LEAVE DDTSYM(36),JOBSYM(116) & T30SYM(131) IN DIFFERENT STATES:
\r
342 DDTSYM JOBSYM T30SYM
\r
344 1. JUNK S.T.PTR JUNK
\r
345 2. JUNK JUNK(NON-NEG) S.T.PTR
\r
346 3. S.T.PTR S.T.PTR JUNK
\r
353 EXTERNAL JOBFF,JOBREN
\r
355 SYMSET: MOVEI R,JOBSYM
\r
358 MOVEM T,JOBSYM ;POSSIBLE SYMBOL POINTER
\r
362 MOVEM T,DDTSTP ;YET ANOTHER CANIDATE
\r
363 MOVEI R,T30SYM ;ASSUME LOADED BY 10/30
\r
366 SKIPL JOBSYM ;OR IS JOBSYM A POINTER (-VE)?
\r
367 JRST REGT30 ;LOADED BY 10/30
\r
368 SKIPL DDTSTP ;DDTSYM A VALID POINTER (-VE)?
\r
369 MOVE T,JOBSYM ;NO TAKE JOBSYM AS THE POINTER
\r
370 REGT30: MOVEM T,JOBSYM ;SAVE IT OVER OLD JOBSYM
\r
372 MOVMS T,T ;LENGTH OF SYMBOL TABLE
\r
374 ADDI W,1300 ;LEAVE SPAVE FOR COMMAND & LPT BUFFERS.
\r
375 ; OR DSK BUFFERS AND EXTRA SYMBOL DEFNS.
\r
376 HRRZ W1,W ;SAVE LOC FOR COPY
\r
377 ADD W,T ;ADD TABLE LENGTH
\r
378 IORI W,1777 ;REQUEST INTEGRAL # OF K.
\r
379 CALLI W,11 ;GET CORE
\r
381 MOVE R,JOBSYM ;WHEREABOUTS OF MONITOR SYMBOLS
\r
382 HRRM W1,JOBSYM ;NOW POINT TO FILDDT SYMBOLS
\r
383 TCOPY: PUSHJ P,FETCH ;GET A WORD
\r
385 MOVEM T,0(W1) ;STASH IT
\r
388 JRST NOLPT ;GO TRY IT
\r
389 DDTSTP: Z ;SAVE POSSIBLE SYMBOL POINTER
\r
394 DD1.5: TLZ F,ROF ;CLOSE ANY OPEN REGISTER
\r
395 MOVE T,[XWD SCHM,SCH]
\r
396 BLT T,ODF ;LOAD ACS
\r
397 DD2: CLEARM PRNC ;PARENTHESES COUNT
\r
400 MOVEM T,ESTUT ;INIT UNDEFINED SYM ASSEM
\r
401 TDZ F,[XWD 777777-ROF-STF,LF1+CF1+SBF+2+Q2F]
\r
402 LIS0: TDZ F,[XWD 777777-ROF-STF-FAF-SAF,NAF]
\r
408 L1: TLZ F,CF+CCF+SF+FPF ;TURN OFF CONTROL, SYL, PERIOD FLAG
\r
412 MOVEM T,TEM ;INIT SYMBOL COUNTER
\r
413 MOVE T,[POINT 7,TXT]
\r
414 MOVEM T,CHP ;SETUP FOR OPEVAL SYMBOL
\r
418 L2: PUSHJ P,TIN ;PICK UP CHARACTER
\r
419 CAIL T,"A"+40 ;LOWER CASE A
\r
420 CAILE T,"Z"+40 ;LOWER CASE Z
\r
422 TRC T,40 ;CHANGE LOWER CASE TO UPPER CASE
\r
423 TLNE F,CF ;CONTROL FLAG
\r
430 CAILE T,137 ;DISPATCH TABLE HAS ENTRIES ONLY .LE. 137
\r
432 IDIVI R,3 ;REMAINDER GIVES COLUMN, QUOTIENT GIVES ROW
\r
433 LDB W,BDISP(R+1) ;GET 12 BIT ADDRESS FROM DISPATCH TABLE
\r
434 CAIGE W,MULT-DDT ;FIRST EVAL ROUTINE
\r
439 MOVE T,[XWD OPEVAL,EVAL] ;GET ADDRESSES OF LOOKUP ROUTINES
\r
440 SKIPN WRD ;IF C(WRD)=0, CALL OPEVAL FIRST, OTHERWISE EVAL FIRST
\r
445 L212: HLRZS T,SAVE ;GET ADDRESS OF THE OTHER LOOKUP ROUTINE
\r
446 JUMPE T,UND1 ;IF ADR=0, THEN SYMBOL UNDEFINED
\r
447 L213: PUSHJ P,(T) ;CALL OPEVAL OR EVAL
\r
448 JRST L212 ;SYMBOL NOT FOUND
\r
462 JRST DDT(W) ;MULTIPLY OR DIVIDE
\r
465 JRST DDT(W) ; + - @ ,
\r
468 TLNE F,TIF ;TRUNCATE INDICATOR FLAG
\r
469 HLL T,WRD ;TRUNCATE
\r
479 L5: CAIG W,RPRN-DDT
\r
487 UNDEF: MOVEI W1,"U"
\r
489 WRONG: MOVE W1,[ASCII /XXX/]
\r
492 PUSHJ P,LCT ;TYPE TAB
\r
493 PUSHJ P,LISTEN ;GOBBLE ANY INPUT CHARACTER
\r
497 PUSHJ P,LCT ;COMMON RETURN FOR TAB;,JRST LIS
\r
500 UND1: MOVE R,ESTUT ;UNDEFINED SYM ASSEMBLER
\r
502 ASH S,-1 ;SETUP EVAL END TEST
\r
526 QUESTN: PUSHJ P,CRF ;LIST UNDEFINED SYMBOLS
\r
528 QUEST1: JUMPGE R,DD1
\r
532 QUEST2: ADD W1,[XWD 2,2]
\r
539 QUEST4: ADD R,[XWD 2,2]
\r
541 \fNUM: ANDI T,17 ;T HOLDS CHARACTER
\r
549 IMULI W,12 ;CONVERT TO DECIMAL
\r
554 DOLLAR: SKIPA T,[46+101-13] ;RADIX 50 $ TO BE
\r
555 PERC: MOVEI T,47+101-13 ;PERCENT SIGN
\r
556 LET: TLC F,SF+FPF ;EXPONENT IFF LTF'*FEF'*(T=105)*SF*FPF=1
\r
557 TLZN F,LTF+FEF+SF+FPF
\r
567 LET1: SUBI T,101-13 ;FORM RADIX 50 SYMBOL
\r
571 IMULI W,50 ;CONVERT TO RADIX 50
\r
573 SOSGE TEM ;IGNORE CHARACS AFTER 6
\r
579 \fNUM1: EXCH T,WRD2 ;FORM NUMBER AFTER $
\r
587 MOVEI W1,6 ;FORM FLOATING POINT NUMBER
\r
596 NM1B: MOVSI W1,211000(T)
\r
597 FMPR R,W1 ;COMPUTE VALUE OF NEW DIGIT
\r
599 FADRB R,FH ;ADD VALUE INTO FLOATING NO.
\r
604 JRST L4 ;NO EXPONENT
\r
622 \fPERIOD: MOVE T,LLOC
\r
623 TLNE F,SF ;SYLLABLE STARTED
\r
626 TLNE F,FPF ;HAS A PERIOD BEEN SEEN BEFORE?
\r
627 TLO F,LTF ;YES, TWO PERIODS MAKES A SYMBOL
\r
634 FAD T,[0] ;NORMALIZE T AND W1
\r
639 MOVEI T,45 ;RADIX 50 PERIOD
\r
642 PILOC: MOVEI T,SAVPI ;ADR SETUP FOR $I
\r
643 QUANIN: TLOA T,(DDTINT) ;MARK FOR ADR INTERNAL TO DDT
\r
644 QUAN: MOVE T, LWT ;PICK UP LAST QUANTITY TYPED
\r
646 QUAN2: TLO F,SF+QF ;WRD,SYL STARTED
\r
650 CONTRO: ;SOME KIND OF ALTMODE
\r
651 IFN EDDT&1,< MOVEI T,"$" ;$
\r
652 PUSHJ P,TOUT ;TYPE OUT $
\r
657 \fEVAL: MOVE R,PRGM ;LOOK UP SYMBOL
\r
658 EVAL0: HRLOI W1,37777+DELI
\r
660 ASH S,-1 ;SETUP END TEST
\r
663 EVAL1: ADD R,[XWD 2,2]
\r
666 AOJG S,CPOPJ ;TRNASFER IF NO SYMBOL FOUND
\r
677 CPOPJ1: AOS (P) ;FOUND SYMBOL, SKIP
\r
680 ;BIT 40 - DELETE OUTPUT
\r
681 ; 20 - DELETE INPUT
\r
684 ; NO BITS - PROGRAM NAME
\r
686 TEXI: PUSHJ P,TEXIN ;INPUT TEXT
\r
691 CAIN T,33 ;NEW ALT MODE, ESCAPE
\r
696 TEXI2: PUSHJ P,TEXIN
\r
703 TEXI3: LSHC T-1,-43
\r
707 \fSIXBI1: PUSHJ P,TEXIN ; INPUT TEXT (SIXBIT)
\r
720 KILL: TLNN F,LTF ;DELETE SYMBOLS
\r
724 MOVEI T,DELO/200000 ;DELETE OUTPUT
\r
726 MOVEI T,DELI/200000 ;NO INPUT OR OUTPUT
\r
727 DPB T,[POINT 2,(R),1] ;LEFT 2 BITS IN SYMBOL
\r
728 KILRET: JRST RET ;USED AS A CONSTANT
\r
731 KILL1: MOVE R,ESTU ;REMOVE UNDEFINED SYMS
\r
733 KILL2: PUSHJ P,EVAL0
\r
738 REMUN: MOVE S,[XWD 2,2] ;REMOVE ONE UNDEFINED SYMBOL
\r
745 \fTAG: TLNN F,LTF ; NO LETTERS IS ERROR
\r
746 JRST ERR ; GO SAY ERROR
\r
747 TLNE F,FAF ; DEFINE SYMBOLS
\r
749 TLNE F,CF ;DEFINE SYMBOL AS OPEN REGISTER
\r
754 DEFIN: PUSHJ P,EVAL ;DEFINED SYMBOL?
\r
755 JRST DEF1 ;NO - DEFINE
\r
756 JRST DEF2 ;YES, REDEFINE
\r
757 DEF1: MOVN R,[XWD 2,2]
\r
758 ADDB R,@SYMP ;MOVE UNDEFINED TABLE 2 REGISTERS
\r
767 MOVEM T,1(R) ;PUT IN NEW VALUE
\r
770 MOVEM T,(R) ;PUT IN NEW SYM AS GLOBAL
\r
773 DEF3: JUMPGE R,RET ;PATCH IN VALUE FOR UNDEF SYM ENTRY
\r
789 DEF4: ADD R,[XWD 2,2] ;REMOVE THE NOW DEFINED SYMBOL
\r
791 \fSETNAM: MOVE R,@SYMP ;SET PROGRAM NAME - DOLLAR COLON
\r
793 SET2: JUMPGE R,UNDEF
\r
803 ;***ROUTINES BEYOND HERE EVALUATE THEIR ARGUMENT***
\r
804 MULT: TLOA F,PTF+MLF ;*
\r
805 DIVD: TLO F,DVF+PTF ;SINGLE QUOTE
\r
808 ASSEM: JRST PLUS ;#
\r
813 LPRN: CAML P,[XWD LPDL-4,0] ;LEFT PARENTHESIS
\r
815 PUSH P,F ;RECURSE FOR OPEN PAREN
\r
822 INDIRECT: HRLZI W,20 ;@
\r
827 ACCF: MOVE R,T ;COMMA PROCESSOR
\r
828 ACCCF: MOVSI T,.-. ;LEFT HALF OF A,,B
\r
829 TLOE F,COMF ;COMMA TYPED BEFORE?
\r
831 HRRM R,ACCCF ;NO, SAVE LEFT HALF OF A,,B
\r
833 LDB W1,[POINT 3,WRD,2] ;CHECK FOR IO INSTRUCTION
\r
840 \fACCF1: MOVEM T,WRD ;SET LEFT HALF OF A,,B
\r
867 \f;REGISTER EXAMINATION LOGIC
\r
869 LINEF: PUSHJ P,DEPRA ;NEXT REGISTER
\r
870 IFE EDDT&1,<PUSHJ P,CRNRB
\r
874 LI1: ;PUSHJ P,LINCHK ;TRUNCATE ADRS (UNLESS INSIDE DDT)
\r
890 JRST CONSYM ;RETURN IS A POPJ
\r
893 LINCHK: CAML T,[DDTINT SAVPI] ;TRUNCATE ADDRESSES
\r
894 CAMLE T,[DDTINT BNADR+2]
\r
901 VARRW: PUSHJ P,DEPRA ;^
\r
906 CARR: PUSHJ P,DEPRA ;CLOSE REGISTER
\r
907 IFN EDDT&1,<JRST DD1>
\r
908 IFE EDDT&1,< PUSHJ P,TIN
\r
912 \fOCON: TROA F,LF1+CF1 ;OPEN AS CONSTANT
\r
913 OSYM: TRZ F,CF1 ;OPEN SYMBOLICALLY
\r
915 SUPTYO: TLOA F,STF ;SUPPRESS TYPEOUT
\r
916 SLASH: TLZ F,STF ;TYPE OUT REGISTER
\r
917 TLNN F,QF ;WAS ANY QUANTITY TYPED?
\r
918 JRST SLAS1 ;NO. DO NOT CHANGE MAIN SEQUENCE
\r
919 MOVE R,LLOC ;YES. SAVE OLD SEQUENCE AND
\r
921 HRRZM T,LLOC ;PUSHJ P,LINCHK ;TRUNCATE ADRS- SET UP NEW SEQUENCE
\r
922 SLAS1: HRRZM T,LLOCO
\r
925 ICON: TLNN F,ROF ;REGISTER OPENED OR ERR
\r
929 \fTAB: PUSHJ P,DEPRS ;OPEN REGISTER OF Q
\r
931 EXCH T,LLOC ;SET UP NEW SEQUENCE AND
\r
932 MOVEM T,SAVLOC ;SAVE OLD SEQUENCE
\r
933 HRROI T,700000 ;3 RUBOUTS
\r
937 DEPRA: MOVE R,SAVLOC
\r
938 TLNE F,CF ;RESTORE OLD SEQUENCE IF $CR,$CF, OR
\r
939 EXCH R,LLOC ;IF $^ OR $BS WAS TYPED
\r
940 MOVEM R,SAVLOC ;SETUP "NEW" OLD SEQUENCE
\r
941 TLNE F,ROF ;IF REGISTER IS BEING CHANGED
\r
942 TLNN F,QF ;REMOVE ALL PREVIOUS UNDEFINED
\r
943 JRST DEPRS ;SYMBOL REFERENCES TO IT
\r
946 DEPRA2: JUMPGE R,DEPRS
\r
953 EQUAL: TROA F,LF1+CF1 ;=
\r
959 R50PNT: LSH T,-36 ;RADIX 50 SYMBOL PRINTER
\r
963 MOVEI W1,LWT ;SETUP FOR SPT
\r
966 SIXBP: MOVNI W2,6 ;SIXBIT PRINTER
\r
974 \f;MODE CONTROL SWITCHES
\r
976 TEXO: MOVEI R,TEXTT-HLFW ;$T ASSUME 7 BIT ASCII
\r
978 CAIN T,6 ;CHECK FOR $6T
\r
979 MOVEI R,SIXBP-HLFW ;SET MODE SWITCH FOR SIXBIT
\r
980 CAIN T,5 ;CHECK FOR $5T
\r
981 MOVEI R,R50PNT-HLFW ;SET MODE SWITCH FOR RADIX 50
\r
982 HWRDS: ADDI R,HLFW-TFLOT ;H
\r
983 SFLOT: ADDI R,TFLOT-PIN ;F
\r
984 SYMBOL: ADDI R,PIN-FTOC ;S
\r
985 CON: ADDI R,FTOC ;C
\r
989 RELA: TRZE F,Q2F ;CHANGE ADDRESS MODE TO RELATIE
\r
992 ABSA: ADDI R,TOC ;A
\r
996 BASECH: MOVE T,WRD2 ;$NR CHANGE OUTPUT RADIX TO N, N>1
\r
1000 BASE1: MOVS S,[XWD SCHM,SCH]
\r
1003 BLT S,ODFM ;WITH $$, MAKE MODES PERMANENT
\r
1006 SEMIC: MOVEM T,LWT ;SEMICOLON TYPES IN CURRENT MODE
\r
1008 \f;GO AND EXECUTE LOGIC
\r
1010 GO: HRLI T,(JRST) ;G
\r
1013 HRR T,JOBSA> ;GET STARTING ADDRESS
\r
1023 XEC1: JRST DDT ;USED AT PROC0
\r
1028 \f;BREAK POINT LOGIC
\r
1029 BP1: REPEAT NBP,< 0 ;JSR TO HERE FOR BREAKPOINT
\r
1031 0 ;HOLDS INSTRUCTION WHILE BREAKPOINT IS IN PLACE
\r
1037 POP T,LEAV ;MOVE INSTRUCTION TO LEAV
\r
1038 MOVEI T,B1SKP-B1INS+1(T)
\r
1039 HRRM T,BCOM3 ;CONDITIONAL BREAK SETUP
\r
1040 MOVEI T,B1CNT-B1SKP(T)
\r
1041 HRRM T,BCOM2 ;PROCEDE COUNTER SETUP
\r
1042 MOVE T,BP1-B1CNT(T)
\r
1043 IFN EDDT&1,< TLZ T,010000 ;TURN OFF USER MODE BIT>
\r
1044 HLLM T,LEAV1 ;SAVE FLAGS FOR RESTORING
\r
1047 BCOM3: SKIPE B1SKP ;ADDR MOD TO LOOK AT COND. INST.
\r
1049 BCOM2: SOSG B1CNT ;ADDR MOD TO LOOK AT PROCEED COUNTER
\r
1053 LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION
\r
1055 CAILE T,266 ;JSA,JSP
\r
1057 JRST PROC1 ;MUST BE INTERPRETED
\r
1060 JRST PROC1 ;MUST BE INTERPRETED
\r
1062 JRST 2,@LEAV1 ;RESTORE FLAGS, GO TO LEAV
\r
1065 \fBREAK: JSR SAVE ;SAVE THE WORLD
\r
1066 PUSHJ P,REMOVB ;REMOVE BREAKPOINTS
\r
1068 HRRZS T ;GET ADDR OF BREAKPOINT JUST HIT
\r
1069 SUBI T,B1ADR-3 ;CHANGE TO ADDRESS OF $0B
\r
1070 IDIVI T,3 ;QUOTIENT IS BREAK POINT NUMBER
\r
1071 HRRM T,BREAK2 ;SAVE BREAK POINT #
\r
1072 MOVE W1,[ASCII /$0B>/] ;PRELIMINARY TYPEOUT MESSAGE
\r
1073 SKIPG @BCOM2 ;TEST PROCEED COUNTER
\r
1074 TRO W1,">"_1 ;CHANGE T TO /$0B>>/
\r
1075 DPB T,[POINT 4,W1,13] ;INSERT BREAK POINT # IN MESSAGE
\r
1078 HLLM T, SAVPI ;SAVE PROCESSOR FLAGS
\r
1080 PUSHJ P,PAD ;TYPE PC AT BREAK
\r
1082 HRRM T,PROC0 ;SETUP ADDRESS OF BREAK
\r
1085 JUMPE T,BREAK1 ;TEST FOR REGISTER TO EXAMINE
\r
1086 PUSHJ P,LCT ;PRINT TAB
\r
1088 PUSHJ P,LI1 ;EXAMINE REGISTER C($NB)LEFT
\r
1089 BREAK1: MOVSI S,400000
\r
1090 BREAK2: ROT S,.-. ;ROT BY # OF BREAK POINT
\r
1091 PUSHJ P,LISTEN ;DONT PROCEED IF TTY KEY HIT
\r
1092 TDNN S,AUTOPI ;DONT PROCEED IF NOT AUTOMATIC
\r
1093 JRST RET ;DONT PROCEED
\r
1096 PROCEDE: TLNN F,QF ;N$P ;PROCEED AT A BREAKPOINT
\r
1101 PROCD1: PUSHJ P,CRF
\r
1103 PROC0: HRRZI R,XEC1 ;MODIFIED TO ADDR OF BREAKPOINT
\r
1105 JRST BPLUP1 ;ONLY GET HERE IF MEMORY SHRANK
\r
1110 PROC1: MOVE T,AC0+T
\r
1113 PROC2: MOVEI W,100
\r
1114 MOVEM W,TEM1 ;SETUP MAX LOOP COUNT
\r
1116 \fIXCT4: IFE EDDT&1,< SUBI T,041
\r
1118 AOJGE T,IXCT6> ;DONT PROCEDE FOR INIT
\r
1119 ;DONT INTERPRET FOR SYSTEM UUOS
\r
1120 MOVEM R,40 ;INTERPRET FOR NON-SYSTEM UUOS
\r
1124 JRST BPLUP ;BREAKPOINT LOOPING OR FETCH FAILED
\r
1126 IXCT5: IFN EDDT&1,<
\r
1127 LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION
\r
1128 CAIN T,254 ;DON'T DO ANYTHING TO JRST IN EXEC MODE
\r
1133 DPB T,[POINT 23,LEAV,35] ;STORE EFFECTIVE ADDRESS
\r
1134 LDB W1,[POINT 4,LEAV,12] ;PICK UP AC FIELD
\r
1135 LDB T,[POINT 9,LEAV,8] ;PICK UP INSTRUCTION FIELD
\r
1138 JRST IPUSHJ ;INTERPRET PUSHJ
\r
1141 JRST IJSR ;INTERPRET JSR
\r
1143 JRST IJSP ;INTERPRET JSP
\r
1145 JRST IJSA ;INTERPRET JSA
\r
1148 JRST IXCT4 ;INTERPRET UUO
\r
1150 JRST IXCT ;INTERPRET XCT
\r
1152 IXCT6: JSP T,RESTORE
\r
1153 LEAV: 0 ;INSTRUCTION MODIFIED
\r
1158 BPLUP: PUSHJ P,REMOVB ;BREAKPOINT PROCEED ERROR
\r
1162 \fIPUSHJ: DPB W1,[POINT 4,CPUSHP,12] ;STORE AC FIELD INTO A PUSH
\r
1167 IJSA: MOVE T,BCOM ;INTERPRET JSA
\r
1172 IJSR: MOVE T,BCOM ;INTERPRET JSR
\r
1174 IJSR2: MOVE R,LEAV
\r
1176 JRST BPLUP ;ERROR, CAN'T STORE
\r
1178 IJSR3: MOVE T,LEAV
\r
1181 IJSP: MOVE W,BCOM ;INTERPRET JSP
\r
1186 ;INSERT BREAKPOINTS
\r
1188 INSRTB: MOVE S,[JSR BP1]
\r
1189 INSRT1: SKIPE R,B1ADR-BP1(S)
\r
1192 MOVEM T,B1INS-BP1(S)
\r
1195 JFCL ;HERE ONLY IF CAN'T WRITE IN HIGH SEG
\r
1201 ;REMOVE BREAKPOINTS
\r
1203 REMOVB: MOVEI S,BNADR
\r
1204 REMOV1: MOVE T,B1INS-B1ADR(S)
\r
1207 JFCL ;HERE ONLY IF NO WRITE IN HIGH SEG
\r
1211 IFN EDDT&1,<JRST TTYRET>
\r
1212 IFE EDDT&1,<POPJ P,>
\r
1214 ;IN EXEC MODE, SAVE UP TTY STATUS ;IN USER MODE, DONE BY SAVE
\r
1215 \f;ALL $B COMMANDS GET HERE IN FORM: <A>$<N>B
\r
1218 BPS: TLZE F,QF ;HAS <A> BEEN TYPED?
\r
1220 TRZE F,Q2F ;NO, HAS <N> BEEN TYPED?
\r
1222 MOVE T,[XWD B1ADR,B1ADR+1] ;NO, COMMAND IS $B - CLEAR ALL BREAKPOINTS
\r
1224 BLT T,AUTOPI ;CLEAR OUT ALL BREAKPOINTS AND AUTO PROCEDE REGESTER
\r
1227 BPS1: TRZN F,Q2F ;HAS <N> BEEN TYPED?
\r
1229 MOVE R,T ;YES, PROCESS THE COMMAND A$NB
\r
1242 BPS3: MOVEI R,B1ADR ;PROCESS THE COMMAND A$B
\r
1255 AUTOP: SUBI R,B1ADR ;AUTO PROCEDE SETUP SUBROUTINE
\r
1263 \f;FETCH AND DEPOSIT INTO MEMORY
\r
1266 DEPRS: MOVEM T,LWT ;DEPOSIT REGISTER AND SAVE AS LWT
\r
1267 MOVE R,LLOCO ;QUAN TYPED IN REGIS EXAM
\r
1273 PUSHJ P,DEP ;STORE AWAY
\r
1274 JRST ERR ;CAN'T STORE (IN DDT OR OUT OF BOUNDS)
\r
1277 ;DEPOSIT INTO MEMORY SUBROUTINE
\r
1281 JSP TT1,CHKADR ;LEGAL ADDRESS?
\r
1283 JRST DEP4 ;YES BUT IN HI SEGMENT>
\r
1285 JRST DEPAC ;DEPOSIT IN AC
\r
1287 IFE EDDT&10,< MOVE T,(R) >
\r
1288 JRST CPOPJ1 ;SKIP RETURN
\r
1290 DEPAC: MOVEM T,AC0(R) ;DEPOSIT IN AC
\r
1291 JRST CPOPJ1 ;SKIP RETURN
\r
1295 CALLI W,SETUWP ;IS HI SEGMENT PROTECTED? TURN OFF
\r
1296 POPJ P, ;PROTECTED, NO SKIP RETURN
\r
1297 MOVEM T,(R) ;STORE WORD IN HI SEGMENT
\r
1298 TRNE W,1 ;WAS WRITE PROTECT ON?
\r
1299 CALLI W,SETUWP ;YES, TURN IT BACK ON
\r
1301 JRST CPOPJ1 ;SKIP RETURN
\r
1303 > ;END NOT-FILDDT COND.
\r
1305 IFN EDDT&10,<DEP=CPOPJ> ;ALWAYS OK NO-OP IF FILE DDT
\r
1306 \f;FETCH FROM MEMORY SUBROUTINE
\r
1308 FETCH: IFE EDDT&10,<IFE EDDT&1,
\r
1309 <JSP TT1,CHKADR ;LEGAL ADDRESS?
\r
1310 JFCL> ;HIGH OR LOW OK FOR FETCH
\r
1311 TRNN R,777760 ;ACCUMULATOR?
\r
1312 SKIPA T,AC0(R) ;YES
\r
1314 JRST CPOPJ1 ;SKIP RETURN FOR LEGAL ADDRESS>
\r
1316 IFN EDDT&10,< SKIPN CRASHS ;CRASH.SAV EXISTS?
\r
1317 JRST MONPEK ;NO - GO PEEK AT RUNNING MONITOR
\r
1318 MOVEM R,TEM4 ;SAVE THE AOBJN POINTER
\r
1319 HRRZ R,R ;STRIP OFF POSSIBLE COUNT
\r
1321 IDIVI R,4000 ;R HAS LOCATION
\r
1322 CAIL R,30 ;R=NO. OF INPTS R+1=LOCATION
\r
1323 POPJ P, ;LARGER THAN 48K
\r
1324 TRNN S,777000 ;S=R+1
\r
1325 JUMPE R,RSDNT ;LOC IS IN RESIDENT BLOCKJ
\r
1326 CAMN R,RSAVE ;IS LOC INCORE ?
\r
1327 JRST INCORE ;S=LOC
\r
1328 MOVEM R,RSAVE ;INPT NO.
\r
1329 IMULI R,20 ;16/INPT
\r
1330 USETI 1,1(R) ;BLOK 0 DOES NOT EXIST
\r
1331 INPUT 1,CURLST ;GET 16 BLKS
\r
1334 INCORE: SKIPA T,CURENT(S)
\r
1335 RSDNT: MOVE T,RSIDNT(S)
\r
1336 MOVE R,TEM4 ;RESTORE AOBJN POINTER
\r
1338 TEM4: 0 ;HOLD AOBJN POINTER
\r
1339 MONPEK: HRRZ T,4 ;REMOVE COUNT
\r
1340 CALLI T,33 ;DO PEEK UUO
\r
1341 JRST CPOPJ1 ;RETURN VALUE IN AC T
\r
1343 IFE EDDT&1,< ;DO ADDRESS CHECKS ONLY IN USER MODE
\r
1344 CHKADR: HRRZ TT,JOBREL ;GET HIGHEST ADDRESS IN LOW SEGMENT
\r
1345 CAIL TT,(R) ;CHECK FOR WITHIN LOW SEGMENT
\r
1346 JRST 1(TT1) ;ADDRESS IS OK IN LOW SEGMENT, SKIP RETURN
\r
1347 HRRZ T,JOBHRL ;GET HIGHEST ADDRESS IN HIGH SEGEMENT
\r
1348 TRNE R,400000 ;IS THE ADDRESS IN HIGH SEGMENT?
\r
1349 CAIGE TT,(R) ;IS THE ADR TO BIG FOR HIGH SEGMENT?
\r
1350 POPJ P, ;NO, YES- ILL. ADR.
\r
1352 > ;END OF IFE EDDT&1
\r
1354 IFN EDDT&1,<CHKADR==CPOPJ> ;NO ADDRESS CHECKS IN EXEC MODE
\r
1355 \fFIRARG: MOVEM T,DEFV
\r
1365 LOOK: SKIPL R,PRGM ;LOOK UP SYMBOL
\r
1368 ASH S,-1 ;SETUP COUNT FOR LENGTH OF SYM TABLE
\r
1370 HRLZI W2,DELO+DELI
\r
1373 LOOK1: TDNE W2,(R)
\r
1377 TLNN T,PNAME ;NAME
\r
1390 LOOK2: HRR W1,R ;POINTER BEST VALUE SO FAR
\r
1393 LOOK3: ADD R,[XWD 2,2]
\r
1396 AOJLE S,LOOK1 ;TERMINATING CONDITION
\r
1401 \fCONSYM: MOVEM T,LWT
\r
1403 JRST @SCH ;PIN OR FTOC
\r
1407 PIN: ;PRINT INSTRUCTION
\r
1410 JRST INOUT ;IN-OUT INSTRUCTION OR NEG NUM
\r
1411 AND T,[XWD 777000,0] ;EXTRACT OPCODE BITS
\r
1412 JUMPE T,HLFW ;TYPE AS HALF WORDS
\r
1416 TRNN F,ITF ;HAS INSTRUCTION BEEN TYPED?
\r
1417 PUSHJ P,LOOK ;NO, LOOK IN SYMBOL TABLE
\r
1418 TROA F,NAF ;INSTRUCTION TYPED, ALLOW NEG ADDRESSES
\r
1419 JRST HLFW ;NOT FOUND, OUTPUT AS HALFWORDS
\r
1421 LDB T,[XWD 270400,LWT] ;GET AC FIELD
\r
1424 PI3A: MOVEI W1,","
\r
1428 TLNE W1,20 ;CHECK FOR INDIRECT BIT
\r
1431 LDB W1,[XWD 331100,LWT] ;INSTRUCTION BITS
\r
1434 JRST PI8 ;ALL (EXECPT ASH,ROT,LSH) HAVE SYMBOLIC ADRS
\r
1437 JRST PI8 ;JFFO AND @ GET SYMBOLIC ADDRESSES
\r
1438 PUSHJ P,PADS3A ;ONLY ABSOLUTE ADDRESSING FOR LSH, ASH, AND ROT
\r
1440 LDB R,[XWD 220400,LWT] ;INDEX REGISTER CHECK
\r
1441 JUMPE R,PADS1 ;EXIT
\r
1451 \fHLFW: REPEAT 0,< MOVE T,LWT
\r
1452 CAML T,[DDTINT SAVPI]
\r
1453 CAMLE T,[DDTINT BNADR+2]
\r
1456 HLRZ T,LWT ;PRINT AS HALF WORDS
\r
1457 JUMPE T,HLFW1 ;TYPE ONLY RIGHT ADR IF LEFT ADR=0
\r
1458 TRO F,NAF ;ALLOW NEGATIVE ADDRESSES
\r
1460 MOVSI W1,(ASCII /,,/)
\r
1461 PUSHJ P,TEXT2 ;TYPE ,,
\r
1464 ;PRINT ADDRESSES (ARG USUALLY 18 BITS BUT CAN BE 36 BITS:
\r
1467 JRST @AR ;PADSO OR PAD1
\r
1468 PADSO: JUMPE T,FP7B ;PRINT A ZERO
\r
1480 PADS1A: PUSHJ P,TOUT
\r
1482 PAD1: JRST TOC ;EXIT
\r
1485 PADS3A: TRNE F,NAF
\r
1488 PADS3B: MOVNM T,TEM
\r
1492 INOUT: TDC T,[XWD -1,400000] ;IO INSTRUCTION OR NEG NUM
\r
1493 TDCN T,[XWD -1,400000]
\r
1494 JRST PADS3B ;TYPE AS NEG NUM
\r
1495 LDB R,[POINT 7,T,9] ;PICK OUT IO DEVICE BITS
\r
1496 CAIL R,774_-2 ;IF DEVICE <774, THEN TYPE
\r
1497 JRST HLFW ;TYPE AS HALF WORDS
\r
1498 LDB R,[POINT 3,T,12]
\r
1499 DPB R,[POINT 6,T,8] ;MOVE IO BITS OVER FOR OP DECODER
\r
1505 PUSHJ P,LOOK ;LOOK FOR DEVICE NUMBER
\r
1517 MASK1: MOVEM T,MSK
\r
1519 \fEFFEC: TLO F,LTF
\r
1521 WORD: MOVEI R,322000-326000 ;JUMPE-JUMPN
\r
1522 NWORD: ADDI R,326000+40*T ;JUMPN T,
\r
1527 MOVSI T,FRASE-DEN-1 ;PREVENT TYPE OUT OF DDT PARTS
\r
1532 TLO F,QF ;SIMULATE A $Q TYPED
\r
1535 SEAR1: PUSHJ P,FETCH
\r
1537 TLNE F,LTF ;CHECK FOR EFFECTIVE ADDRESS SEARCH
\r
1542 SEAR2: JUMPE T,SEAR3 ;OR JUMPN T
\r
1543 SEAR2A: AOS R,DEFV ;GET NEXT LOCATION
\r
1544 PUSHJ P,LISTEN ;ANYTHING TYPED?
\r
1545 CAMLE R,ULIMIT ;OR END OF SEARCH?
\r
1547 JRST SEAR1 ;NO, LOOK SOME MORE
\r
1549 SEAR2B: MOVEI R,400000-1 ;MOVE UP TO HI SEGMENT
\r
1550 IORB R,DEFV ;PUT IN MEMORY TOO
\r
1551 TRNN R,400000 ;ALREAY IN HI SEGMENT?
\r
1553 SEARFN: SETCMM LWT ;COMPLEMENT BITS BACK AND STOP SEARCH
\r
1555 \fSEAR3: MOVE R,DEFV
\r
1558 TLZ F,STF ;GET RID OF SUPPRESS TYPEOUT MODE
\r
1560 PUSHJ P,LI1 ;CALL REGISTER EXAMINATION LOGIC TO TYPE OUT
\r
1564 SEAR4: JRST SEAR2A
\r
1566 EFFEC0: MOVEI W,100
\r
1569 LDB R,[POINT 4,T,17] ;GET IR FIELD
\r
1575 TLNN W,20 ;INDIRECT BIT CHECK
\r
1584 \fSETUP: TLNN F,QF ;QUANTITY TYPED?
\r
1586 IFN EDDT&10,<MOVEI T,137777 ;DON'T SEARCH BEYOND 48K>
\r
1588 IFE EDDT&1,<MOVEI T,777777 ;NO, GET LAST ADR>
\r
1589 IFN EDDT&1,<HRRZ T,@SYMP ;NO, GET 1ST ADR SYM TABLE>
\r
1592 HRRZM T,ULIMIT ;SAVE HIGH LIMIT INCREMENTED BY ONE
\r
1593 HRRZS R,DEFV ;GET 1ST ADDRESS
\r
1594 TLNN F,FAF ;WAS A 1ST ADR SPECIFIED?
\r
1595 SETZB R,DEFV ;NO, MAKE IT ZERO
\r
1596 CAML R,ULIMIT ;LIMITS IN A REASONABLE ORDER?
\r
1604 HRRZ S,@SYMP ;GET 1ST ADR OF SYMBOL TABLE
\r
1605 HLRE W1,@SYMP ;GET LENGTH OF SYM TABLE
\r
1606 SUB W1,S ;GET NEG OF LAST ADR
\r
1607 MOVNS W1 ;GET POS LAST ADR
\r
1608 MOVEI T,0 ;0 TO STORE IN MEMORY
\r
1609 ZERO1: TRNE R,777760
\r
1610 JRST ZEROR ;OK TO ZERO AC'S
\r
1612 MOVEI R,ZLOW ;DON'T ZERO 20 THRU ZLOW
\r
1616 MOVEI R,DDTEND ;DON'T ZERO DDT
\r
1620 HRRZ R,W1 ;DON'T ZERO SYMBOL TABLE
\r
1621 ZEROR: CAMLE R,ULIMIT ;ABOVE LIMITS?
\r
1622 JRST DD1 ;YES, STOP
\r
1623 PUSHJ P,DEP ;DEPOSIT T
\r
1626 TRNN R,400000 ;HI SEGMENT?
\r
1627 AOJA R,ZERO1 ;NO, KEEP GOING
\r
1629 \fFTOC: ;NUMERIC OUTPUT SUBROUTINE
\r
1631 CAIN W1,10 ;IS OUPUT RADIX NOT OCTAL, OR
\r
1632 TLNN T,-1 ;ARE THERE NO LEFT HALF BITS?
\r
1633 JRST TOCA ;YES, DO NOTHING SPECIAL
\r
1634 HRRM T,TOCS ;NO, TYPE AS HALF WORD CONSTANT
\r
1635 HLRZS T ;GET LEFT HALF
\r
1636 PUSHJ P,TOCA ;TYPE LEFT HALF
\r
1637 MOVSI W1,(ASCII /,,/)
\r
1638 PUSHJ P,TEXT2 ;TYPE ,,
\r
1639 TOCS: MOVEI T,.-. ;GET RIGHT HALF BACK
\r
1650 TOC4: MOVM W1,T ;TYPE AS SIGNED DECIMAL INTEGER
\r
1654 TOC5: PUSHJ P,FP7 ;DECIMAL PRINT ROUTINE
\r
1658 ;SYMBOL OUTPUT SUBROUTINE
\r
1660 SPT0: HRRZM W1,SPSAV ;SAVE POINTER TO TYPED SYM
\r
1661 SPT: ;RADIX 50 SYMBOL PRINT
\r
1662 LDB T,[POINT 32,0(W1),35] ;GET SYMBOL
\r
1668 JUMPE T,CPOPJ ;FLUSH NULL CHARACTERS
\r
1677 \fSYMD: MOVEI T,DELO/200000 ;$D ;DELETE LAST SYM & PRINT NEW
\r
1678 HRRZ R,SPSAV ;PICK UP POINTER TO LAST SYM
\r
1680 DPB T,[POINT 2,(R),1] ;STORE SEMI-DELETE BITS IN SYMBOL
\r
1682 JRST CONSYM ;PRINT OUT NEXT BEST SYMBOL
\r
1683 \f;FLOATING POINT OUTPUT
\r
1693 TFLOT1: TLNN A, 400
\r
1694 JRST TOC5 ;IF UNNORMALIZED, TYPE AS DECIMAL INTEGER
\r
1706 SETZM TEM1 ;INIT 8 DIGIT COUNTER
\r
1707 SKIPE A,B ;DON'T TYPE A LEADING 0
\r
1708 PUSHJ P,FP7 ;PRINT INTEGER PART OF 8 DIGITS
\r
1709 PUSHJ P,TOC6 ;PRINT DECIMAL POINT
\r
1728 PUSH P,W2 ;SAVE EXPONENT
\r
1729 PUSH P,FSGN(B) ;SAVE "E+" OR "E-"
\r
1730 PUSHJ P,FP3 ;PRINT OUT FFF.FFF PART OF NUMBER
\r
1731 POP P,W1 ;GET "E+" OR "E-" BACK
\r
1733 POP P,A ;GET EXPONENT BACK
\r
1734 \fFP7: IDIVI A,12 ;DECIMAL OUTPUT SUBROUTINE
\r
1744 353473426555 ;1.0E32
\r
1745 266434157116 ;1.0E16
\r
1746 FT8: 233575360400 ;1.0E8
\r
1747 216470400000 ;1.0E4
\r
1748 207620000000 ;1.0E2
\r
1749 204500000000 ;1.0E1
\r
1750 FT: 201400000000 ;1.0E0
\r
1751 026637304365 ;1.0E-32
\r
1752 113715126246 ;1.0E-16
\r
1753 146527461671 ;1.0E-8
\r
1754 163643334273 ;1.0E-4
\r
1755 172507534122 ;1.0E-2
\r
1756 FT01: 175631463146 ;1.0E-1
\r
1759 FCP: CAMLE A, FT0(C)
\r
1767 TEXT: TLNN W1,774000 ;LEFT JUSTIFIED UNLESS LEFT CHAR IS NULL
\r
1769 TEXT2: MOVEI T,0 ;7 BIT ASCII TEXT OUTPUT SUBROUTINE
\r
1778 FRASE: 0 ;DONT CHANGE ORDER, SEE SEARC+3
\r
1792 SPSAV: 0 ;POINTER TO LAST SYMBOL TYPED
\r
1797 SAVLOC: 0 ;THE ADR OF OLD REGISTER EXAMINATION SEQUENCE
\r
1798 SYMP: XWD PID,JOBSYM
\r
1807 REPEAT NBP*3-3, < 0>
\r
1818 SCHM: EXP PIN ;DO NOT CHANGE ORDER
\r
1825 IFN EDDT&10,< OFFSET: 0 >
\r
1826 \fIFN EDDT&1&<EDDT>B36,<
\r
1828 PUNCH: TLC F,FAF+QF
\r
1830 JRST ERR ;ONE ARGUMENT MISSING
\r
1836 PUN1: MOVEI T,4 ;PUNCH 4 FEED HOLES
\r
1838 TLNE F,CF ;PUNCH NON-ZERO BLOCKS?
\r
1849 JUMPGE R,RET ;EXIT OR PUNCH
\r
1852 SOS W,T ;INIT CHECKSUM
\r
1854 PBLK1: PUSHJ P,FETCH
\r
1863 ;PUNCH NON-ZERO BLOCKS
\r
1865 PUNZ0: AOS DEFV ;LOOK AT NEXT WORD
\r
1866 PUNZ: HRRZ W,DEFV ;ENTER HERE - GET STARTING ADDRESS
\r
1868 SUB W,TEM1 ;CALCULATE NEGATIVE LENGTH
\r
1869 HRL R,W ;SET UP AOBJN POINTER
\r
1870 JUMPGE R,RET ;FINISHED?
\r
1871 CAMG R,[XWD -40,0] ;BLOCK LONGER THAN 40?
\r
1872 HRLI R,-40 ;YES, FIX IT UP
\r
1873 MOVSI W1,400000 ;W1 NEGATIVE MEANS FLUSH 0 WORDS
\r
1874 PUNZ2: PUSHJ P,FETCH ;GET WORD FROM MEMORY
\r
1876 JUMPE T,[AOJA W1,PUNZ4] ;IF WORD IS 0, INDEX 0 WORD COUNTER
\r
1877 MOVEI W1,0 ;CLEAR 0 WORD COUNTER
\r
1878 PUNZ4: JUMPL W1,PUNZ0 ;FLUSH 0 WORD, GET ANOTHER
\r
1879 CAIL W1,3 ; NOSKIP FOR 3RD 0 WORD AFTER NON 0 WORD
\r
1880 AOSA R ;ADVANCE R TO LAST ADR+1
\r
1882 ADD W1,DEFV ;CALCULATE DEFV-R+W1=-WORD COUNT
\r
1884 HRLM W1,DEFV ;PUT -WC IN LEFT HALF OF FA
\r
1885 EXCH R,DEFV ;SAVE ADR FOR NEXT BLOCK, GET POINTER
\r
1897 LOAD1: MOVE T,0(R)
\r
1901 LOAD2: PUSHJ P,FEED
\r
1904 BLKEND: TLNN F,QF ;BLOCK END
\r
1905 MOVE T,[JRST 4,DDT]
\r
1906 TLNN T,777000 ;INSERT JRST IF NO OPCODE
\r
1913 PUSHJ P,PWRD ;EXTRA WORD FOR READER TO STOP ON
\r
1926 FEED: CONSZ PTPP,20
\r
1931 FEED1: POPJ P,0 ;ADDRESS USED AS A CONSTANT
\r
1936 PHASE 0 ;RIM10B CHECKSUM LOADER
\r
1942 DATAI PTRR,@TBL1-RD+1(AA)
\r
1947 TBL1: CAME CKSM,ADR
\r
1958 LOADE: XWD LOADB-.,LOADB
\r
1959 > ;END OF IFN EDDT$1&<EDDT>B36
\r
1960 ;FOR PAPER TAPE IO
\r
1962 \fSAVE: 0 ;SAVE THE ACS AND PI SYSTEM
\r
1967 SAV1: IFN EDDT&1,<
\r
1969 CONO PRS, @SAVPI+1>
\r
1976 ;IFE EDDT&1,<HRRZS SAVUWP ;ASSUME UWP WILL BE ZEROED
\r
1977 ; SETZB T,F ;T=F=0
\r
1978 ; CALLIU T,SETUWP ;REQUEST TO CLEAR UWP
\r
1979 ; HRROS SAVUWP ;FAILED, UWP (BIT 0) STILL 1
\r
1980 ; SKIPN SARS ;USER'S SATE SAVED ALREADY?
\r
1982 ; HRRM T,SAVUWP> ;NO, SAVE STATE OF UWP
\r
1984 SETOM,SARS ;FLAG PROTECTING SAVED REGISTERS
\r
1986 IFE EDDT&1,<PUSHJ P,TTYRET> ;IN USER MODE, GET INTO DDT MODE
\r
1987 MOVE T,[XWD SCHM,SCH]
\r
1988 BLT T,ODF ;LOAD THE ACS WITH MODE SWITCHES
\r
1991 RESTORE: SETOM TEM3 ;RESTORE ACS AND PI SYSTEM
\r
1992 RESTR1: HRRM T,SAVE
\r
1997 IORI T, 2000 ;TURN ON CHANNELS
\r
1999 ;IFE EDDT&1,<HRRZ T,SAVUWP ;GET OLD UWP
\r
2000 ; CALLI T,SETUWP ;CHANGE IT TO OLD
\r
2001 ; JFCL> ;EX MACHT NICHTS
\r
2006 CPUSHP: PUSH BCOM ;PROGRAM MODIFIED AT IPUSHJ
\r
2007 IFN EDDT&1,< CONO PRS,@SAVPI>
\r
2009 \fCRN: MOVEI T,15 ;CARRIAGE RETURN
\r
2013 CRNRB: PUSHJ P,CRN
\r
2018 MOVEI T,12 ;LINE FEED
\r
2021 LCT: IFN EDDT&1,<PUSHJ P,TSPC
\r
2023 IFE EDDT&1,<MOVEI T,11
\r
2024 JRST TOUT> ;TYPE A TAB
\r
2026 TSPC: MOVEI T,40 ;SPACE
\r
2028 \fIFN EDDT&1,< ;EXECUTIVE MODE TELETYPE I/O
\r
2030 TIN: PUSHJ P,LISTEN ;TELETYPE CHARACTER INPUT
\r
2034 MOVEI T,33 ;CHANGE ALL ALT MODES TO NEW
\r
2035 CAIN T,177 ;RUBOUT?
\r
2036 JRST WRONG ;YES, TYPE XXX
\r
2037 TRNE T,140 ;DON'T ECHO CR,LF,ALT,TAB,BACK SPACE,ETC
\r
2038 TOUT: CAIG T,04 ;DON'T TYPE EOT OR LOWER CHARS
\r
2041 IMULI T,200401 ;GENERATE PARITY
\r
2046 TRC T,200 ;MAKE PARITY EVEN
\r
2050 ANDI T,177 ;FLUSH PARITY
\r
2053 LISTEN: CONSO TTYY,40 ;LISTEN FOR TTY
\r
2059 TTYRET: MOVEI T,3410
\r
2060 TTY1: MOVEI W2,40000
\r
2068 TTYLEV: MOVE T,SAVTTY
\r
2076 TEXIN: PUSHJ P,TIN ;INPUT SUBROUTINE FOR TEXT MODES
\r
2078 JRST TOUT ;ECHO CHARACTERS (0-37) NOT ECHOED
\r
2081 \fIFE EDDT&1,< ;USER MODE TELETYPE I/O
\r
2082 IFN EDDT&4,< ;ASSEMBLE WITH OLD DDT MODE IO
\r
2085 TIN: MOVE T,POUTBF ;GET NEXT CHARACTER ROUTINE
\r
2086 CAME T,[POINT 7,INBFF]
\r
2089 IFE EDDT&10,< ILDB T,PINBFF >
\r
2090 IFN EDDT&10,< PUSHJ P,INCHR >
\r
2094 MOVEI T,33 ;CHANGE TO NEW ALT MODE
\r
2095 CAIN T,177 ;RUBOUT?
\r
2096 JRST WRONG ;YES PRINT XXX
\r
2098 MOVE T,[POINT 7,INBFF]
\r
2100 CALL T,[SIXBIT /DDTIN/]
\r
2103 TOUT: JUMPE T,CPOPJ ;OUT PUT A CHARACTER FLUSH NULLS
\r
2105 IFN EDDT&10,< SKIPE COMAND
\r
2114 MOVE T,[POINT 7,INBFF]
\r
2117 CALL T,[SIXBIT /DDTOUT/]
\r
2121 PINBFF: POINT 7,INBFF
\r
2122 POUTBF: POINT 7,INBFF
\r
2127 TTYRET: MOVE T,[POINT 7,INBFF]
\r
2133 TEXIN=TIN ;USE NORMAL INPUT FOR TEXT WHEN IN USER MODE
\r
2135 \f IFE EDDT&4,< ;ASSEMBLE WITH TTCALL TELETYPE IO
\r
2137 OPDEF TTCALL [51B8]
\r
2142 IFE EDDT&10,< TTCALL 0,T ;GET NEXT CHARACTER INTO T >
\r
2143 IFN EDDT&10,< PUSHJ P,INCHR >
\r
2147 MOVEI T,33 ;CHANGE OLD ALT MODES TO NEW
\r
2149 JRST WRONG ;TYPE XXX FOR A RUBOUT
\r
2155 IFN EDDT&10,< SKIPE COMAND ;IS THERE A COMMAND FILE?
\r
2156 JRST PUTCHR ;YES >
\r
2158 TTCALL 1,T ;OUTPUT A CHARACTER
\r
2161 LISTEN: TTCALL 2,T ;GET NEXT CHAR, NO IO WAIT
\r
2162 POPJ P, ;NO CHARACTER EXISTED, RETURN
\r
2163 JRST CPOPJ1 ;CHARACTER WAS THERE, SKIP RETURN
\r
2165 TTYRET: TTCALL 6, ;WHEN RETURNING TO DDT, FLUSH ALL
\r
2166 POPJ P, ;WAITING INPUT CHARACTERS
\r
2168 TTYLEV==CPOPJ ;NOTHING SPECIAL TO DO WHEN LEAVING DDT
\r
2169 > ;END OF IFN DDT&4
\r
2172 INCHR: SKIPE COMAND
\r
2175 IFN EDDT&4,< ILDB T,PINBFF ;NO COMMAND FILE>
\r
2176 IFE EDDT&4,< TTCALL 0,T ;O/P CHAR, >
\r
2180 GETCHR: SOSLE CBUF+2 ;ANY REMAINING
\r
2185 STATZ CM,20000 ;END-OF-FILE?
\r
2188 GETOK: ILDB T,CBUF+1
\r
2189 JUMPE T,GETCHR ;BYPASS ZERO CHARACTERS
\r
2190 PUSHJ P,PUTCHR ;COPY INPUT TO OUTPUT FILE
\r
2193 GETEND: CLOSE DP, ;CLOSE OUTPUT WHEN INPUT EXHAUSTED
\r
2196 JRST NOLPT ;REVERT TO TTY WHEN COMMAND EXHAUSTED
\r
2198 PUTCHR: SOSLE LBUF+2 ;ANY ROOM?
\r
2201 STATZ DP,740000 ;ERRORS?
\r
2205 IDPB T,LBUF+1 ;DEPOSIT CHAR.
\r
2208 > ;END OF IFN EDDT&10
\r
2209 > ;END OF IFE EDDT&1
\r
2210 \fBDISP: POINT 12,DISP(R),11
\r
2211 POINT 12,DISP(R),23
\r
2212 POINT 12,DISP(R),35
\r
2214 DEFINE D (Z1,Z2,Z3)< <Z1-DDT>_30+<Z2-DDT>_14+Z3-DDT>
\r
2215 ;THIS MACRO PACKS 3 ADDRESSES INTO ONE WORD; EACH ADR IS 12 BITS
\r
2217 IFE EDDT&1&<EDDT>B36,< PUNCH=ERR
\r
2233 D SUPTYO,TEXI,ASSEM
\r
2237 D MINUS,PERIOD,SLASH
\r
2242 D FIRARG,EQUAL,ULIM
\r
2243 D QUESTN,INDIRECT,ABSA
\r
2246 D HWRDS,PILOC,BLKEND
\r
2247 D KILL,LOADER,MASK
\r
2248 D NWORD,BITO,PROCEDE
\r
2249 D QUAN,RELA,SYMBOL
\r
2255 ;THIS TABLE DOES NOT HAVE ENTRIES FOR CHARS .GE. 140; THESE
\r
2256 ; ARE DETECTED AS ERRORS NEAR L21:
\r
2257 \fBITO: MOVEI R,BITT ;BYTE OUTPUT SUBROUTINE
\r
2271 BITT: MOVE T,SVBTS2
\r
2300 ;DESCRIPTION OF OP DECODER FOR DDT:
\r
2302 ; THE ENTIRE INSTRUCTION SET FOR THE PDP-6 CAN BE COMPACTED INTO
\r
2303 ;A SPACE MUCH SMALLER THAN ONE REGISTER FOR EVERY SYMBOL. THIS OCCURS
\r
2304 ;BECAUSE OF THE MACHINE ORGANIZATION AND INSTRUCTION MNEMONICS CHOSEN
\r
2305 ;FOR THE PDP-6. FOR EXAMPLE, IF BITS (0-2) OF AN INSTRUCTION EQUAL
\r
2306 ;101(2) THE INSTRUCTION IS A HALF WORD INSTRUCTION AND AN "H" MAY
\r
2307 ;BE ASSUMED. "T" MAY BE ASSUMED FOR ALL TEST INSTRUCTIONS (WHICH
\r
2308 ;BEGIN WITH 110(2).
\r
2310 ; THE TABLE TBL IN DDT CONSISTS OF 9 BIT BYTES, 4 TO A WORD.
\r
2311 ;THE NUMBERS IN THE BYTES HAVE THE FOLLOWING SIGNIFICANCE:
\r
2312 ;0-37(8): THIS IS A DISPATCH COMMAND FOR THE OP-DECODER INTERPRETER.
\r
2313 ; LET THE RIGHT MOST TWO BITS EQUAL N; LET THE NEXT 3 BITS
\r
2316 ; THE CONTENTS OF INST (INSTRUCTION) CONTAIN IN THE RIGHT
\r
2317 ; MOST NINE BITS THE BINARY FOR THE MACHINE INSTRUCTION.
\r
2318 ; P AND N REFER TO THE CONTENTS OF INST, AND THE OP DECODER
\r
2319 ; WILL PRODUCE AN ANSWER D GIVEN P, N, AND THE CONTENTS
\r
2320 ; OF INSTX N+1 GIVES THE NUMBER OF BITS IN INST; P GIVES THE
\r
2321 ; POSITION (FROM THE RIGHT EDGE) OF THE N+1 BITS.
\r
2326 ;; C(INST) = .010 101 100(2)
\r
2328 ; THE RESULT = D = 010(2) = 2(8)
\r
2330 ; D IS USED AS A DISPATCH ON THE NEXT BYTES IN THE TABLE.
\r
2331 ; IF D = 5, 5 BYTES IN THE TABLE (DON'T COUNT THE BYTES WHICH
\r
2332 ; PRINT TEXT, 41-72(8)) ARE SKIPPED OVER AND THE 6TH BYTE RESUMES
\r
2333 ; THE INTERPRETATION.
\r
2335 ;40(8) THIS IS A STOP CODE; WHEN THIS IS REACHED INTERPRETATION
\r
2338 ;41(8)-72(8) THE ALPHABET IS ENCODED INTO THIS RANGE.
\r
2342 ; WHEN A BYTE IN THIS RANGE IS REACHED, ITS CORRESPONDING
\r
2343 ; LETTER IS TYPED.
\r
2345 ;73(8)-777(8) THIS IS A TRANSFER BYTE. IF THE BYTE IN THIS RANGE IS
\r
2346 ; CONSIDERED TO BE A, TRANSFER INTERPRETATION TO THE A-73(8)RD
\r
2347 ; BYTE IN THE TABLE.
\r
2349 ;MACROS ASSEMBLE THE TABLE TBL:
\r
2350 ; 1. A NUMBER FOLLOWED BY ^ ASSEMBLES A DISPATCH BYTE. THE FIRST
\r
2351 ; DIGIT IS THE POSITION; THE SECOND DIGIT IS THE SIZE.
\r
2352 ; 2. A POINT (.) ASSEMBLES A STOP CODE.
\r
2353 ; 3. A NAME FOLLOWED BY A SLASH ASSEMBLES A TRANSFER TO THE
\r
2354 ; SYMBOLICALLY NAMED BYTE.
\r
2355 ; 4. A STRING OF LETTERS TERMINATED BY A SPACE, COMMA, OR POINT,
\r
2356 ; ASSEMBLE INTO A STRING OF BYTES, EACH BYTE BEING ONE LETTER.
\r
2358 ;EXAMPLE OF BINARY TO SYMBOLIC DECODING:
\r
2359 ; THE MACHINE CODE FOR JRST IS 254
\r
2360 ; INST 0 1 0 1 0 1 1 0 0
\r
2361 ; THE INTERPRETER STARTS WITH THE FIRST BYTE IN THE TABLE (63^).
\r
2362 ; THE RESULT OF APPLYING THIS TO C(INST) GIVES 2. SKIPPING OVER
\r
2363 ; 2 BYTES IN THE TABLE AND INTERPRETING THE THIRD RESULTS IN
\r
2364 ; HAK/ BEING INTERPRETED. AT HAK:, THERE IS A 33^. APPLYING
\r
2365 ; THIS TO C(INST) RESULTS IN 5 NON PRINTING BYTES BEING SKIPPED
\r
2368 ; MOV PRINTING TEXT
\r
2374 ;H1/ IS THE NEXT BYTE INTERPRETER. AT H1: 03^ IS FOUND SO
\r
2375 ;4 BYTES ARE SKIPPED OVER:
\r
2376 ; EXC PRINTING TEXT
\r
2378 ; BL PRINTING TEXT
\r
2383 ; THE NEXT LETTERS JRS ARE TYPED OUT. THEN T/ IS FOUND. AT
\r
2384 ;T; A T IS TYPED OUT; THEN A "." IS FOUND AND EVERYTHING STOPS.
\r
2386 ; THE TABLE IS ALSO USED GOING FROM SYMBOLIC TO BINARY BUT A
\r
2387 ; TREE SEARCH METHOD IS USED.
\r
2388 \f\f\f\f\fREPEAT 0,<
\r
2390 DEFINE REDEF (XX)<
\r
2391 DEFINE INFO (AA,BB)<
\r
2404 IFE Z-":",<INFO <>,<==CLOC>
\r
2405 IFNDEF FIR.,<FIR.==CLOC>
\r
2406 IFGE CLOC+73-1000-FIR.,<PRINTX OPTABLE TOO LONG>
\r
2408 IFE Z-"/",<IF1 <OUTP 1>
\r
2409 IF2,<INFO OUTP,+73-FIR.>
\r
2411 IFE Z-"^",<OUTP <ZZ&74/2+ZZ&7-1>
\r
2413 IFE <Z-",">*<Z-".">*<Z-40>,<IFN ZZZ,<
\r
2414 REPEAT 5,<ZZ==ZZZ&77
\r
2417 IFE Z-".",<OUTP 40>
\r
2419 IFN Z,<INFO REDEF,L
\r
2421 ZZZ==ZZZ+<Z-40>*ZZM
\r
2430 BINRY==BINRY*400+BINRY*400+A
\r
2432 IFE BINC,<EXP BINRY
\r
2439 TBL: ;OPDECODER BYTE TABLE
\r
2442 CLOC==0 ;SET BYTE LOCATION COUNTER TO 0
\r
2443 BINC==4 ;INIT BYTES/WORD COUNTER
\r
2445 BYT9 <63^UUO/FLO/HAK/ACCP/BOOLE/H HWT/T ACBM/>
\r
2448 BYT9 <21^BD/CON,11^OI/S,01^Z/O/>
\r
2449 BYT9 <BD:01^BLK,IO/DATA,IO:11^I/O/OI:01^O/I/>
\r
2452 BYT9 <UUO:51^.,32^U40/U50/U60/21^U703/11^USET/01^>
\r
2453 BYT9 <LOOKU,P/ENTE,R/USET:USET,01^I/O/>
\r
2454 BYT9 <U40:03^U47/INI T/.....,U47:CALL,01^.,I/>
\r
2455 BYT9 <U60:21^U603/01^IN,BPUT/OUT,BPUT:11^BU,F:F.,PU,T/>
\r
2456 BYT9 <U603:01^U6062/STAT,11^O:O.,Z:Z.,U6062:11^S,U62/G,U62:ETST,S/>
\r
2457 ;BYTE AND FLOATING INSTRUCTIONS
\r
2459 BYT9 <FLO:51^BYTE/F 32^ AD A/SB A/MP A/DV A:>
\r
2460 BYT9 <21^LMB/R,IMB/LMB:02^.,L:L.,M:M.,B:B.,BYTE:32^...,03^UF,PA/DF,N/>
\r
2461 BYT9 <FS C/IB P:P.,I LD/LD:LD B/I DP/DP:DP B/>
\r
2463 ;FWT,FIXED POINT ARITH,MISC.
\r
2465 BYT9 <HAK:33^MV/MV:MOV MO/ML/DV/SH/H1/JP/>
\r
2466 BYT9 <21^ADD IMB/SU BIMB:B IMB:02^.,I:I.,M/B/MO:22^>
\r
2467 BYT9 <EIMS:E IMS/S IMS/N IMS/M IMS:02^.,I/M/S:S.,>
\r
2468 BYT9 <ML:21^I ML1/ML1:MUL IMB/DV:21^I DV1/DV1:>
\r
2469 BYT9 <DI DV2:V IMB/H1:03^EXC S3/BL T:T.,AO/AO:AOBJ,>
\r
2470 BYT9 <AOB/JRS T/JFC L/XC T/.AOB:01^P/N/>
\r
2471 BYT9 <JP:03^PU/PU:PUSH PUS/PO/PO:POP POP/JS,R:R.,>
\r
2472 BYT9 <JS P/JS PA:A.,JR PA/PUS:01^J:J..,POP:>
\r
2473 BYT9 <01^.,J/SH:02^A S2/ROT S1/L S2:S S3:H S1/JFF O/S1:21^.,C:C.,>
\r
2475 ;ARITH COMP,SKIP,JUMP
\r
2477 BYT9 <ACCP:42^CA CA1/SJ/A JS/S JS:O 31^>
\r
2478 BYT9 <J COMP/S COMP/CA1:31^I COMP/M COMP/>
\r
2479 BYT9 <SJ:31^JUM PSJ/SKI PSJ:P COMP:>
\r
2480 BYT9 <03^.,L/E:E.,L E/PA/G E/N:N.,G.,>
\r
2485 BYT9 <HWT:51^HW1/21^R HW2/L HW2:R HW3/HW1:>
\r
2486 BYT9 <21^L HW4/R HW4:L HW3:32^IMS/Z IMS/O IMS/EIMS/>
\r
2488 ;TEST INSTRUCTIONS
\r
2490 BYT9 <ACBM:31^AC1/01^D AC2/S AC2/AC1:01^R AC2/L,>
\r
2491 BYT9 <AC2:42^N EAN/Z EAN/C EAN/O EAN:12^.,E/PA/N/>
\r
2496 BYT9 <BOOLE:24^ST/AN:AND B2/AN/ST/AN/ST/>
\r
2497 BYT9 <X OR:OR B2/I OR/AN/EQ DV2/ST/OR/ST/OR/OR/>
\r
2498 BYT9 <ST:SET B2:24^Z IMB/IMB/CA:C TA/TM:M IMB/>
\r
2499 BYT9 <CM:C TM/TA:A IMB/IMB/IMB/CB:C BIMB/IMB/CA/>
\r
2500 BYT9 <CA/CM/CM/CB/O IMB/>
\r
2503 BYT9 <U50:03^OPE,N/....,RENAM,E/I,N/OU,T/>
\r
2504 BYT9 <U703:02^CLOS,E/RELEA,S/MTAP,E/UGET,F/>
\r
2506 REPEAT BINC,<BINRY=BINRY*400+BINRY*400>
\r
2507 IFN BINRY,<EXP BINRY>
\r
2508 > ;END OF REPEAT 0
\r
2511 \fIFN EDDT&10,< ;FILDDT STUFF
\r
2512 CRASH: SIXBIT .CRASH. ;CANONICAL NAME FOR CRASH
\r
2516 COMNDS: SIXBIT .FILDDT. ;CANNONICAL NAME FOR COMMAND LIST
\r
2520 SNAP: SIXBIT .SNAP. ;NAME FOR OUTPUT IF TO RETRIEVABLE DEVCE
\r
2524 CBUF: BLOCK 3 ;RING HEADERS
\r
2526 COMAND: Z ;-1 IF COMMAND FILE ,0 IF NOT
\r
2527 CRASHS: Z ;-1 IF CRASH.SAV ON DISK ,0 IF PEEK AT MONITOR
\r
2530 RSIDNT: BLOCK 1000 ;LOCS 0-777 ALWAYS IN CORE
\r
2531 CURENT: BLOCK 4000 ;WINDOW TO THE FILE ON DISK
\r
2532 RSAVE: IOWD 1000,RSIDT ;INDEX OF THE CUFRRENT BLOCK, 0,1,...
\r
2534 CURLST: IOWD 4000,CURENT
\r
2538 \fSUBTTL OP DECODER
\r
2540 DEFINE BYT9 (A) <IRP A,<
\r
2550 IFGE <LASTB==CLOC+73-FIR.>-1000, <PRINTX OPTABLE TO LONG>>>
\r
2558 IFNB <A>, <IRPC A,<CLOC==CLOC+1>>>
\r
2561 IFNB <A>, <IRPC A,<CLOC==CLOC+1>>
\r
2567 DEFINE .ADR (A)<IFN %'A-CLOC,<PRINTX PHASE ERR AT: %'A>>
\r
2573 OUTP A&70/2+A&7-1>
\r
2576 IFNB <A>, <IRPC A,<OUTP "A"-40>>>
\r
2579 IFNB <A>, <IRPC A,<OUTP "A"-40>>
\r
2583 BINRY== BINRY+<A>_<BINC==BINC-9>
\r
2591 \fTBL: ;OPDECODER BYTE TABLE
\r
2594 CLOC== 0 ;SET BYTE LOCATION COUNTER TO 0
\r
2595 BINC== ^D36 ;INIT BYTES/WORD COUNTER
\r
2599 .DIS 63,.TRA UUO,.TRA FLO,.TRA HAK,.TRA ACCP,.TRA BOOLE
\r
2600 .TXT H,.TRA HWT,.TXT T,.TRA ACBM
\r
2604 .DIS 21,.TRA BD,.TXT CON,.DIS 11,.TRA OI,.TXT S,.DIS 01,.TRA Z,.TRA O
\r
2605 .ADR BD,.DIS 01,.TXT BLK,.TRA IO,.TXT DATA,.ADR IO,.DIS 11,.TRA I,.TRA O
\r
2606 .ADR OI,.DIS 01,.TRA O,.TRA I
\r
2609 .ADR UUO,.DIS 51,.END,.TXT,.DIS 32,.TRA U40,.TRA U50,.TRA U60
\r
2610 .DIS 21,.TRA U703,.DIS 11.,.TRA USET,.DIS 01
\r
2611 .TXT LOOKU,.TRA P,.TXT ENTE,.TRA R,.ADR USET,.TXT USET,.DIS 01,.TRA I,.TRA O
\r
2612 .ADR U40,.DIS 03,.TRA CAL,.TXT INI,.TRA T,.END,.END,.END,.END,.END,.TXT CALL,.TRA I
\r
2613 .ADR U60,.DIS 21,.TRA U603,.DIS 01,.TXT IN,.TRA BPUT,.TXT OUT
\r
2614 .ADR BPUT,.DIS 11,.TXT BU,.ADR F,.END F,.TXT,.TXT PU,.TRA T
\r
2615 .ADR U603,.DIS 01,.TRA U6062,.TXT STAT,.DIS 11,.ADR O,.END O,.TXT,.ADR Z,.END Z,.TXT
\r
2616 .ADR U6062,.DIS 11,.TXT S,.TRA U62,.TXT G,.ADR U62,.TXT ETST,.TRA S
\r
2618 ;BYTE AND FLOATING INSTRUCTIONS
\r
2620 .ADR FLO,.DIS 51,.TRA BYTE,.TXT F,.DIS 32,.TXT,.TXT AD,.TRA A,.TXT SB
\r
2621 .TRA A,.TXT MP,.TRA A,.TXT DV,.ADR A
\r
2622 .DIS 21,.TRA LMB,.TXT R,.TRA IMB,.ADR LMB,.DIS 02,.END,.TXT
\r
2623 .ADR L,.END L,.TXT,.ADR M,.END M,.TXT
\r
2624 .ADR B,.END B,.TXT,.ADR BYTE,.DIS 32,.END,.END,.END,.TXT
\r
2625 .DIS 03,.TXT UF,.TRA PA,.TXT DF,.TRA N
\r
2626 .TXT FS,.TRA C,.TXT IB,.ADR P,.END P,.TXT,.TXT I,.TRA LD
\r
2627 .ADR LD,.TXT LD,.TRA B,.TXT I,.TRA DP,.ADR DP,.TXT DP,.TRA B
\r
2629 ;FWT-FIXED POINT ARITH-MISC
\r
2631 .ADR HAK,.DIS 33,.TRA MV,.ADR MV,.TXT MOV,.TRA MO,.TRA ML,.TRA DV
\r
2632 .TRA SH,.TRA H1,.TRA JP
\r
2633 .DIS 21,.TXT ADD,.TRA IMB,.TXT SU,.ADR BIMB,.TXT B,.ADR IMB,.DIS 02,.END,.TXT
\r
2634 .ADR I,.END I,.TXT,.TRA M,.TRA B,.ADR MO,.DIS 22
\r
2635 .ADR EIMS,.TXT E,.TRA IMS,.TXT S,.TRA IMS,.TXT N,.TRA IMS,.TXT M
\r
2636 .ADR IMS,.DIS 02,.END,.TXT,.TRA I,.TRA M,.ADR S,.END S,.TXT
\r
2637 .ADR ML,.DIS 21,.TXT I,.TRA ML1,.ADR ML1,.TXT MUL,.TRA IMB
\r
2638 .ADR DV,.DIS 21,.TXT I,.TRA DV1
\r
2639 .ADR DV1,.TXT DI,.ADR DV2,.TXT V,.TRA IMB,.ADR H1,.DIS 03,.TXT EXC,.TRA S3,.TXT BL
\r
2640 .ADR T,.END T,.TXT,.TRA AO,.ADR AO,.TXT AOBJ
\r
2641 .TRA AOB,.TXT JRS,.TRA T,.TXT JFC,.TRA L,.TXT XC,.TRA T,.END
\r
2642 .ADR AOB,.DIS 01,.TRA P,.TRA N
\r
2643 .ADR JP,.DIS 03,.TRA PU,.ADR PU,.TXT PUSH,.TRA PUS,.TRA PO
\r
2644 .ADR PO,.TXT POP,.TRA POP,.TXT JS,.ADR R,.END R,.TXT
\r
2645 .TXT JS,.TRA P,.TXT JS,.ADR PA,.END A,.TXT,.TXT JR,.TRA PA
\r
2646 .ADR PUS,.DIS 01,.ADR J,.END J,.END,.TXT,.ADR POP
\r
2647 .DIS 01,.END,.TXT,.TRA J,.ADR SH,.DIS 02,.TXT A,.TRA S2,.TXT ROT,.TRA S1,.TXT L
\r
2648 .ADR S2,.TXT S,.ADR S3,.TXT H,.TRA S1,.TXT JFF,.TRA O
\r
2649 .ADR S1,.DIS 21,.END,.TXT,.ADR C,.END C,.TXT
\r
2651 ;ARITH COMP-SKIP-JUMP
\r
2653 .ADR ACCP,.DIS 42,.TXT CA,.TRA CA1,.TRA SJ,.TXT A,.TRA JS,.TXT S
\r
2654 .ADR JS,.TXT O,.DIS 31
\r
2655 .TXT J,.TRA COMP,.TXT S,.TRA COMP,.ADR CA1,.DIS 31,.TXT I,.TRA COMP,.TXT M,.TRA COMP
\r
2656 .ADR SJ,.DIS 31,.TXT JUM,.TRA PSJ,.TXT SKI,.ADR PSJ,.TXT P,.ADR COMP
\r
2657 .DIS 03,.END,.TXT,.TRA L,.ADR E,.END E,.TXT,.TXT L,.TRA E,.TRA PA,.TXT G,.TRA E
\r
2658 .ADR N,.END N,.TXT,.END G,.TXT
\r
2662 .ADR HWT,.DIS 51,.TRA HW1,.DIS 21,.TXT R,.TRA HW2,.TXT L,.ADR HW2,.TXT R,.TRA HW3
\r
2663 .ADR HW1,.DIS 21,.TXT L,.TRA HW4,.TXT R,.ADR HW4,.TXT L
\r
2664 .ADR HW3,.DIS 32,.TRA IMS,.TXT Z,.TRA IMS,.TXT O,.TRA IMS,.TRA EIMS
\r
2666 ;TEST INSTRUCTIONS
\r
2668 .ADR ACBM,.DIS 31,.TRA AC1,.DIS 01,.TXT D,.TRA AC2,.TXT S,.TRA AC2
\r
2669 .ADR AC1,.DIS 01,.TXT R,.TRA AC2,.TXT L
\r
2670 .ADR AC2,.DIS 42,.TXT N,.TRA EAN,.TXT Z,.TRA EAN,.TXT C,.TRA EAN,.TXT O
\r
2671 .ADR EAN,.DIS 12,.END,.TXT,.TRA E,.TRA PA,.TRA N
\r
2675 .ADR BOOLE,.DIS 24,.TRA ST,.ADR AN,.TXT AND,.TRA B2,.TRA AN,.TRA ST,.TRA AN,.TRA ST
\r
2676 .TXT X,.ADR OR,.TXT OR,.TRA B2,.TXT I,.TRA OR,.TRA AN,.TXT EQ
\r
2677 .TRA DV2,.TRA ST,.TRA OR,.TRA ST,.TRA OR,.TRA OR
\r
2678 .ADR ST,.TXT SET,.ADR B2,.DIS 24,.TXT Z,.TRA IMB,.TRA IMB
\r
2679 .ADR CA,.TXT C,.TRA TA,.ADR TM,.TXT M,.TRA IMB
\r
2680 .ADR CM,.TXT C,.TRA TM,.ADR TA,.TXT A,.TRA IMB,.TRA IMB,.TRA IMB
\r
2681 .ADR CB,.TXT C,.TRA BIMB,.TRA IMB,.TRA CA
\r
2682 .TRA CA,.TRA CM,.TRA CM,.TRA CB,.TXT O,.TRA IMB
\r
2686 .ADR U50,.DIS 03,.TXT OPE,.TRA N,.TXT TT,.ADR CAL,.TXT CAL,.TRA L,.END,.END,.END
\r
2687 .TXT,.TXT RENAM,.TRA E,.TXT I,.TRA N,.TXT OU,.TRA T
\r
2688 .ADR U703,.DIS 02,.TXT CLOS,.TRA E,.TXT RELEA,.TRA S
\r
2689 .TXT MTAP,.TRA E,.TXT UGET,.TRA F
\r
2691 ;**********THIS TERMINATES THE "BYT9" MACRO ARGUMENT******
\r
2694 IF1,< BLOCK <CLOC+3>/4>
\r
2696 IF2,< IFN BINC-^D36,< +BINRY>>
\r
2698 IFNDEF CLOC.,<CLOC.==CLOC>
\r
2699 IFN CLOC.-CLOC,<PRINTX PHASE ERROR IN OPTABLE>
\r
2701 PNTR: EXP INST ;POINTER TO BITS IN INST
\r
2702 INST: 0 ;BINARY FOR INSTRUCTION
\r
2703 CHP: 0 ;CHAR POINTER INTO TXT, TXT+1
\r
2704 TXT: BLOCK 2 ;STORE INPUT TEXT FOR OPEVAL
\r
2705 SAVPDL: 0 ;SAVE PUSH DOWN LIST POINTER
\r
2707 BTAB: POINT 9,TBL ;TABLE USED TO GET NEXT BYTE POINTER
\r
2708 POINT 9,TBL,8 ;FOR TRANSFER BYTE
\r
2712 OPEVAL: MOVEI T,0 ;EVALUATE FOR AN OP CODE
\r
2713 IDPB T,CHP ;INSERT NULL IN TEXT FOR SYMBOL
\r
2716 OPTYPE: TRO F,OUTF ;TYPE AN OPCODE SYMBOLICALLY
\r
2718 MOVEM T,INST ;GET OPCODE INTO RIGHT 9 BITS
\r
2720 MOVE T,[XWD 440700,TXT]
\r
2721 MOVEM T,CHP ;FOR OPEVAL,SETUP POINTER TO INPUT TEXT
\r
2722 TRZ F,ITF ;CLEAR INSTRUCTION TYPED FLAG
\r
2725 DC1: ILDB T,W2 ;GET NEXT BYTE IN TBL
\r
2728 SOJGE R,DC1 ;SKIP OVER # BYTES = C(R)
\r
2729 JUMPG R,DC1 ;SKIP OVER ALPHA TEXT WITHOUT COUNTING
\r
2731 JUMPE T,DECX ;TRANSFER ON ASTOP CODE
\r
2733 DPB T,[XWD 340500,PNTR] ;SETUP R ON A DISPATCH BYTE
\r
2736 DPB T,[XWD 300600,PNTR]
\r
2738 JRST DC6 ;FOR OPEVAL ONLY
\r
2739 LDB R,PNTR ;GET # BYTES TO SKIP OVER
\r
2742 DC2: HRREI T,-33(T)
\r
2743 JUMPL T,DECT ;TYPE OUT A LETTER
\r
2744 MOVEI W1,FIR.(T) ;BYTE IS A TRANSFER
\r
2746 MOVE W2,BTAB(W2) ;CALCULATE POINTER TO NEXT BYTE
\r
2752 JRST DC8 ;TYPE OUT A LETTER
\r
2753 ILDB W1,CHP ;GET NEXT INPUT LETTER
\r
2754 CAIE W1,133(T) ;COMPARE WITH ASSUMED NEXT LETTER
\r
2755 JRST NOMAT ;DOESNT MATCH
\r
2756 JRST DC1 ;MATCHES, TRY NEXT
\r
2758 DECX: TRNE F,OUTF ;STOP (CODE 40) HAS BEEN SEEN
\r
2759 POPJ P, ;IF FOR OUTPUT, RETURN
\r
2760 ILDB W1,CHP ;GET NEXT INPUT CHAR IF ANY
\r
2761 JUMPE W1,DC7 ;DOES # OF CHARS MATCH
\r
2762 NOMAT: POP P,R ;NO, BACK UP AND TRY SOME MORE
\r
2766 NOMAT1: AOS R ;ASSUME NEXT NUMBER FOR BIN VALUE
\r
2767 DPB R,PNTR ;STUFF INTO ANSWER
\r
2769 JUMPN R,DC6AA ;IF =0, BYTE WAS TOO BIG
\r
2771 JRST NOMAT ;NOT AT TOP LEVEL
\r
2772 POPJ P, ;UNDEFINED, FINALLY
\r
2774 DC6: MOVEI R,0 ;ASSUME 0 FOR INITIAL BINARY VALUE
\r
2776 DC6AA: CAMN P,SAVPDL
\r
2778 LDB T,-2(P) ;OLD VALUE OF PNTR
\r
2787 DC7: MOVE P,SAVPDL ;RESTORE PUSH DOWN POINTER
\r
2789 LSH T,33 ;PUSH BINARY INTO POSITION FOR OPEVAL
\r
2790 LDB R,[POINT 3,T,8]
\r
2793 DPB R,[POINT 10,T,12] ;ONLY DONE FOR IO INSTRUCTIONS
\r
2794 JRST CPOPJ1 ;SYMBOL FOUND, SKIP RETURN
\r
2796 DC8: TRO F,ITF ;SET INSTRUCTION TYPED FLAG
\r
2798 PUSHJ P,TOUT ;OUTPUT A LETTER
\r
2799 CLEARM SPSAV ;SO $D WONT TRY TO DELETE OP CODES
\r
2807 DDTEND: ;ONLY STARTING ADDRESS FOR FILDDT
\r
2808 ;NO START EDDRESS FOR EXEC OR USER DDT
\r
2809 ;BECUASE MONITOR IS LOADED WITH BOTH EXEC AND USER DDTS
\r
2810 ;BUT STILL WANTS TO BE STARTED AT ITS OWN STARTING ADDRESS
\r
2811 ;USER DDT IS LOADED LAST. - T.H.
\r
2812 IFN EDDT&10,<END DDT>
\r