COMMENT  VALID 00061 PAGES C REC PAGE DESCRIPTION C00001 00001 C00006 00002 SWITCHES: C00012 00003 LEFT HALF FLAGS C00015 00004 DEVICES, DEVICE CODE DEFINITIONS C00017 00005 SUBTTL DDT - SOME STORAGE STUFF C00021 00006 SUBTTL DDT - BREAKPOINT LOGIC C00022 00007 BCOM, XEC0 - BREAKPOINT AND EXECUTE LOGIC C00027 00008 SUBTTL SAVE AND RESTORE ACS AND PI SYSTEM C00035 00009 SUBTTL EXEC DDT - SWAPPING DDT CODE C00039 00010 DDTINI INITIALIZE SWAPPING DDT!!! C00044 00011 GETDDT CALLED FROM SAVE TO GET DDT INTO CORE! DDTMES C00047 00012 GETBAK CALLED FROM RESTORE TO UPDATE SYMBOL TABLE AND GET USER CORE BACK! C00051 00013 EXAMINE & DEPOSIT ROUTINES FOR SWAPPING DDT! C00054 00014 DCHECK - DEVICE PIA CHECKER - DTEXX, DTOCA, OTOCA, XTKL C00062 00015 SUBTTL DDT - INITIALIZATION, MAIN LOOP - DDTA C00069 00016 NUM: ANDI T,17 T HOLDS CHARACTER C00072 00017 PERIOD: MOVE T,LLOC PERIOD ( . ) SEEN. USUALLY THIS IS CURRENT LOCATION C00074 00018 BEGIN UNDEF  SUBTTL DDT - ASSEMBLY OF UNDEFINED SYMBOLS C00079 00019 SUBTTL DDT - SYMBOL MANIPULATION ROUTINE C00089 00020 LOOK - VALUE TO SYMBOL C00100 00021 EVAL - SYMBOL TO VALUE C00104 00022 BEGIN SYMSRT  SUBTTL DDT - SORTED SYMBOL TABLE MANIPULATIONS C00113 00023 SKILL SSYMD SYMDEL SYMINS C00121 00024 SEVAL CONVERT SYMBOLIC NAME TO VALUE C00127 00025 SLOOK CONVERT VALUE TO SYMBOLIC C00139 00026 SUBTTL DDT - TEXT INPUT (ASCII AND SIXBIT) C00143 00027 SUBTTL DDT - BYTE INPUT C00147 00028 SUBTTL DDT - MORE OF THE WORD ASSEMBLER C00150 00029 SUBTTL DDT - REGISTER EXAMINATION LOGIC C00154 00030 LTAB, TAB, DEPRA, EQUAL, PSYM C00156 00031 SUBTTL DDT - OUTPUT MODE CONTROL SWITCHES, UEDDT - JOBSET C00159 00032 SUBTTL DDT - GO, EXECUTE, AND BREAKPOINT LOGIC C00164 00033 SINGLE STEP CODE FROM DEC C00171 00034 MUUOs C00184 00035 INTERPRETATION C00188 00036 IPUSHJ: DPB W1,[POINT 4,CPUSHP,12] STORE AC FIELD INTO A PUSH C00190 00037 SUBTTL DDT - PROCESS BREAKPOINT COMMANDS C00192 00038 SUBTTL DDT - FETCH AND DEPOSIT INTO MEMORY C00201 00039 SUBTTL DDT - PRINT INSTRUCTION. PIN,LFPIN,RFPIN,CONSYM C00204 00040 PRINT HALFWORDS, PRINT ADDRESS C00207 00041 SUBTTL DDT - $M, $N, $W, $E COMMANDS C00211 00042 SUBTTL DDT - $$Z C00214 00043 SUBTTL DDT - OUTPUT ROUTINES TOCC, FTOC, TOC, TOCA C00216 00044 FLOATING POINT OUTPUT C00218 00045 FP7: JUMPE A,FP7A2 C00220 00046 SUBTTL EXEC DDT - PAPER TAPE MANIPULATIONS C00223 00047 PAPER TAPE LOADERS C00225 00048 VERIFY AND CORE (LOAD TAPE INTO CORE) C00228 00049 SUBTTL DDT - TTY I/O EXEC MODE - TOUT C00236 00050 SUBTTL DDT - TTY I/O USER MODE C00239 00051 SUBTTL DDT - FLAG MODE OUTPUT C00243 00052 SUBTTL DDT - BYTE OUTPUT $nO C00246 00053 SUBTTL DDT - CHARACTER DISPATCH TABLE C00249 00054 SUBTTL DDT - OP DECODER C00255 00055 BEGIN OPDEFS C00262 00056 PNTR: INST POINTER TO BITS IN INST C00265 00057 DECT: TRNE F,OUTF C00268 00058 PATCH: BLOCK 10 C00269 00059 SUBTTL UEDDT ROUTINES - COPSYM C00276 00060 MORE UEDDT C00283 00061 SUBTTL DDT User's Guide C00299 ENDMK C; ;SWITCHES: ; EDDT_0 FOR NORMAL, USER DDT (DEFAULT) ; UEDDTS__1 FOR USER EXEC DDT ; EXEC DDT SETTINGS: ; EDDT&1=0 ASSUME UDDT ; EDDT&2=2 ASSUME EDDT WITH PAPER TAPE ; EDDT&10=10 ASSUME PDP-10 PAPER TAPE INSTEAD OF PDP-6 ; EDDT&20=20 ASSUME SYSTEM EXEC DDT AND COMPILE SPECIAL CODE! ; EDDT&40=40 MAKE RELOCATABLE EXEC DDT ; EDDT&100=100 USE 10/6 INTERFACE INSTEAD OF TTY ; IF LEFT HALF OF EDDT IS NOT=0, DO A LOC IFNDEF FTDDT, IFN FTDDT,< ;THIS ENTIRE ASSEMBLY IS CONDITIONAL IFNDEF FTDSWP,<FTDSWP__0> IFNDEF EDDT,<EDDT__0> IFE EDDT&20,<FTDSWP__FTXCOR__0> IFE EDDT&21-21, ;IF SYSTEM EXEC DDT IFNDEF SAVESW, ;SET UP A STARTING ADRESS IFNDEF UEDDTS, ;SET UP UEDDT DEFINE XP' (X.,Y.),< X.__Y. > IFE EDDT&21-1,> IFN EDDT,<SUBTTL DDT - EXEC MODE VERSION JOBREL__37 JOBSYM__36 ZLOW__40 IFNDEF KLEPT,<KLEPT__0> ;DEFAULT LOCATION OF KL10 EXEC PROCESS TABLE >;IFN EDDT IFE EDDT!UEDDTS,<TITLE UDDT - USER MODE DDT NOLIT XALL XTITLE__<RADIX50 0,UDDT>> IFN UEDDTS,<TITLE UEDDT - USER MODE EXEC DDT NOLIT XALL XTITLE__<RADIX50 0,UEDDT>> IFNDEF XTITLE,<XTITLE__0> IFN EDDT,< F__0 ;FLAGS IFE EDDT&20,<P__3> ;SETUP PUSHDOWN POINTER IF NOT SYSTEM T__5 ;TRANSFER DATA W1__6 W2__7 SCH__10 ;MODE CONTROL SWITCH FOR OUTPUT AR__11 ;MODE CONTROL SWITCH FOR OUTPUT ODF__12 ;MODE CONTROL SWITCH FOR OUTPUT - CURRENT RADIX TT__13 ;TEMPORARY SMB__14 ;SYMBOL TABLE POINTER FOR SORTED SYMBOLS R__A__15 ;POINTERS TO TABLES, CORE, ETC. ABC MUST BE CONSECUTIVE. S__B__R+1 W__C__R+2 ;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER >;IFN EDDT IFE EDDT,< ;DEFINITIONS FOR NON-EXEC MODE DDT EXTERN JOBREL,JOBSYM,JOBSA,JOBHRL,JOBFF ZLOW__140 F_0 ;FLAGS P_3 ;PUSH DOWN T_5 ;TRANSFER DATA W1_6 W2_7 SCH_10 ;MODE CONTROL SWITCH FOR OUTPUT AR_11 ;MODE CONTROL SWITCH FOR OUTPUT ODF_12 ;MODE CONTROL SWITCH FOR OUTPUT - CURRENT RADIX TT_13 ;TEMPORARY SMB_14 ;SYMBOL TABLE POINTER FOR SORTED SYMBOLS R_15 ;POINTERS TO TABLES, CORE, ETC. S_R+1 W_R+2 ;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER A__R ;ABC MUST BE CONSECUTIVE. B__R+1 C__R+2 >;IFE EDDT ;DEVICE CODES FOR EXEC MODE VERSION ^APR__0 ^PI__4 ;PI SYSTEM ^KLPAG__10 ^CCA__14 TTYY__120 ;CONSOLE TTY PTRR__104 ;PTR PTPP__100 ;PTP LPDL__50 ;MAX LENGTH PUSH DOWN LIST IFN EDDT,< IFNDEF SWEEPB,<SWEEPB__200000> ;EXEC PROCESS TABLE (EPT) LOCATIONS IFNDEF DTE0,<DTE0__200> IFNDEF DONG11,<DONG11__20000> ;RING 11'S DOORBELL IFNDEF $DDT,<$DDT__441+KLEPT> ;DDT START ADDRESS IFNDEF DTFLG,<DTFLG__444> ;DTE20 OP COMPLETE FLAG (RELATIVE TO EPT) IFNDEF DTF11,<DTF11__450> ; 10 FROM 11 ARGUMENT IFNDEF DTCMD,<DTCMD__451> ; TO 11 COMMAND WORD >;IFN EDDT IFN EDDT&<-1,,0>,< LOC $DDT JRST DDT > ;LEFT HALF FLAGS COMF__200000 ;COMMA TYPED FLAG TIF__100000 ;TRUNCATE TO 18 BITS - SET BY SPACE OR COMMA PTF__100 ;+, -, OR * HAS BEEN TYPED CTF__400 SF__4 ;SYLLABLE FLAG QF__1 ;QUANTITY TYPED IN TO WORD ASSEMBLER CF__40 ;$ TYPED CCF__10000 ;$$ TYPED MF__2 ;MINUS SIGN TYPED IN LTF__20 ;LETTER TYPED IN TO CURRENT SYLLABLE ROF__10 ;REGISTER OPEN FLAG STF__4000 FAF__1000 ; < TYPED SAF__2000 ; > TYPED FPF__20000 ;FLOATING POINT - . TYPED IN FEF__400000 ;FLOATING EXPONENT - E FLAG MLF__200 ;*FLAG DVF__40000 ;DIVIDE FLAG ;RIGHT HALF FLAGS ITF__2 ;INSTRUCTION TYPED IF ITF=1 OUTF__4 ;OUTPUT IF OUTF=1 CF1__400 ;OUTPUT 1 REGISTER AS CONSTANT LF1__2000 ;OUTPUT 1 REGISTER AS FORCED SYMBOLIC OR CONSTANT Q2F__1 ;NUMBER TYPED AFTER ALT MODE R20F__10 ;TEMP FLAG USED IN SETUP SBF__20 NAF__200 ;NEGATIVE ADDRESSES PERMISSABLE POWF__4000 ;ARGUMENT FOR EXPONENT COMING EQF__20000 ;WANTS REAL NUMERIC MODE GLOBAL__040000 ;GLOBAL SYMBOL LOCAL__100000 PNAME__740000 ;PROGRAM NAME DELI__200000 ;DELETE INPUT DELO__400000 ;DELETE OUTPUT PPID__0 ;=0 IF SYMBOL TABLE POINTER IS IN JOBSYM ;USED AS INDEX FIELD IN SYMP IFE EDDT&1,< LOC 74 ;JOB DDT (USER MODE DDT) DDT ;DDT'S STARTING ADDRESS IFN UEDDTS,< LOC 124 DDTREN > ;REENTER ADDRESS FOR UEDDT RELOC 0 > ;END IFE EDDT&1 IFN EDDT&<XWD -1,0>,<LOC <EDDT>-=18> INTERN DDT,$M,DDTEND ;THE MAXIMUM NUMBER OF BREAKPOINTS IS =36 (SEE AUTOPI) NBP__=8 ;NUMBER OF BREAKPOINTS IFN EDDT,<NBP__=30> IFE UEDDTS,<DEFINE SYMTST<>> IFN UEDDTS,<DEFINE SYMTST < SKIPE SYMLUZ PUSHJ P,SYMPR> MAXPR__400000 ;MAX SIZE OF UPPER> ;DEVICES, DEVICE CODE DEFINITIONS DEFINE DEVICES < XQ APR,0 XQ PI,4 XQ KLPAG,10 ;KL10 PAGER DEVICE XQ CCA,14 ;KL10 CACHE CLEARER XQ TIM,20 ;KL10 TIMER XQ MTR,24 ;KL10 METER XQ PAG,24 XQ PTP,100 XQ PTR,104 XQ IOP,110 XQ CTY,120 XQ LPT,124 XQ C1A,140 XQ C1B,144 XQ DTE0,200 ;KL10'S 10/11 INTERFACE XQ DC,204 ;DATA CONTROL (136) NOTE THIS IS NOT THE NORMAL DEVICE CODE! XQ DTC,210 XQ DTS,214 XQ MTC,220 XQ MTS,224 XQ MTM,230 XQ ADC,240 XQ DAC,244 XQ DCSA,300 XQ DCSB,304 XQ DKB,310 XQ DCA,320 XQ VDS,340 ;EARNEST VIDEO SWITCH XQ FRM,340 ;MOORE DIGITAL SYNTHESIZER XQ PLT,344 ;PLOTTER (P2) XQ SIX,344 ;10/6 INTERFACE XQ HOT,350 ;THERMOMETER XQ CAR,354 ;XQ VOD,360 XQ KIM,360 ;PARALYZER (KIM SERIAL INTERFACE) XQ VMI,364 XQ PK,370 XQ DIL,374 XQ IMP,400 XQ TV,404 XQ ARM,420 XQ AD,424 XQ DPY,430 XQ KBD,434 XQ XGP,440 XQ DSK,444 XQ ELF,470 XQ PMP,500 XQ IBM,504 XQ DDD,510 XQ MPX,530 XQ SAMA,540 XQ SAMB,544 XQ SAMC,550 XQ SAMD,554 XQ PCLK,730 XQ AS,774 >;END DEVICES IFE EDDT&21-1,< ;COMPILE DEVICE DEFINITION FOR NON-SYSTEM EXEC DDT DEFINE XQ(A,B) <A__B > DEVICES >;IFE EDDT&21-1 SUBTTL DDT - SOME STORAGE STUFF DDTBEG: ;FIRST ADDRESS IN DDT IFN EDDT,<STARTA: 0> ;START ADDRESS FROM PAPER TAPE IOTLG__0 ;ASSUME NO DEVICES IFN EDDT!UEDDTS,< ;COMPILE DEVICE TABLE FOR EXEC AND UEDDT IOTBL: ;TABLE OF DEVICE NUMBERS KNOWN TO DDT DEFINE XQ(A,B)<B> DEVICES IOTLG_.-IOTBL ;LENGTH OF DEVICE NUMBERS TABLE IOTB2: ;TABLE OF RADIX50 DEVICE NAMES DEFINE XQ (A,B)<RADIX50 0,A> DEVICES >;IFN EDDT!UEDDTS SAVPI: 0 XP $I,SAVPI 1077 ;TURN OFF CHANNELS 2-7 SAVTTY: 0 IFN EDDT&1,<OUTLPT: 0 SAVAPR: 0 > OUTRTN:0 STRING: 0 MSK: XWD -1,-1 XP $M,MSK MXINC: 100 BMASK: 0 FLGPTR: 0 B1ADR: 0 ;CELL TO EXAMINE,,ADDRESS OF BREAK B1SKP: 0 ;CONDITIONAL INSTRUCTION - SEE BCOM3 B1CNT: 0 ;PROCEDE COUNTER - SEE BCOM2, ALSO $P COMMAND B1STR: 0 ;STRING ADDRESS - SEE RETB DEFINE DBPNT ! (Z.) <XP $!Z.!B,B1ADR+4*Z.-4> RADIX =10 FOR QZ_1,NBP <DBPNT (QZ) > RADIX =8 BLOCK NBP*4-4 ;ROOM FOR THE REST OF THE BREAKPOINTS BNADR__.-4 AUTOPI: 0 AC0: BLOCK 17 AC17: 0 SCHM: PIN ;DO NOT CHANGE ORDER PADSO ODFM: 10 SARS: 0 TEM1: 0 PS: BLOCK LPDL PRGM: 0 ;IOWD POINTER TO SYMBOL TABLE - PROGRAM NAME $: BLOCK: 0 ; - BLOCK NAME $& TBLK: 0 ; - TEMPORARY BLOCK BN&S TEMDDT: 0 SVF: 0 SW1: 0 SVFB: 0 SVTB: 0 BLVL: 0 WRD: 0 WRD2: 0 PRNC: 0 FRASE: 0 ;DONT CHANGE ORDER, SEE SEARC+3 SYL: 0 LWT: 0 TEM2: 0 FRASE1: TEM3: 0 DENDDT: 0 INSXCT: XCT I.NST ;SOME STORAGE FOR $X SINGLE STEP FEATURE. I.NST: 0 I.NSTAC:0 I.NSTEA:0 I.NSTPC:0 SAV0: 0 XCTS: 0 XTEM: 0 FLAGS: 0 LOCSAV: 0 GETFLG: 0 ;non zero once we've tried to auto-open a program FSV: 0 FHTTMP: 0 ;TEMP CELL FOR FLOATING POINT VALUE ACCUMULATION FHDTMP: 0 ;TEMP CELL FOR FLOATING POINT VALUE ACCUMULATION SYM: 0 SPSAV: 0 ;POINTER TO LAST SYMBOL TYPED DEFV: 0 ULIMIT: 0 LLOC: 0 LLOCO: 0 SAVLOC: 0 IOTFLG: 0 KLFLG: 0 ;SET TO -1 IF EXECUTING DDT ON A KL10 KEPTAD: 0 ;SET TO THE CORE ADDRESS OF THE KL10 EPT KLTMON: 0 ;STATE OF TTY MONITOR MODE (RESTORED WHEN LEAVING DDT) SVKLP: 0 ;SAVE CONI KLPAG HERE SYMP:IFN UEDDTS,<EXCSYM; SO WE CAN DEBUG IT> XWD PPID,JOBSYM SUBTTL DDT - BREAKPOINT LOGIC COMMENT % THE LISTING OF THE FOLLOWING SOURCE CODE IS OMITTED FOR YOUR READING PLEASURE: BP1: REPEAT NBP,< 0 ;JSR TO HERE FOR BREAKPOINT JSA T, BCOM 0 ;HOLDS INSTRUCTION WHILE BREAKPOINT IS IN PLACE 0 > % XLIST BP1: REPEAT NBP,< 0 ;JSR TO HERE FOR BREAKPOINT JSA T, BCOM 0 ;HOLDS INSTRUCTION WHILE BREAKPOINT IS IN PLACE 0 > LIST B1INS__BP1+2 BPN__.-4 ;ADDRESS OF THE LAST BREAKPOINT ;BCOM, XEC0 - BREAKPOINT AND EXECUTE LOGIC BCOM: 0 ;BREAKPOINT LOGIC POP T,LEAV ;MOVE INSTRUCTION TO LEAV MOVEI T,B1SKP-B1INS+1(T) HRRM T,BCOM3 ;CONDITIONAL BREAK SETUP MOVEI T,B1CNT-B1SKP(T) HRRM T,BCOM2 ;PROCEDE COUNTER SETUP MOVE T,BP1-B1CNT(T) ;GET PC OF TRAP IFN EDDT&1,< TLZ T,010000 ;TURN OFF USER MODE BIT> HLLM T,LEAV1 ;SAVE FLAGS FOR RESTORING EXCH T,BCOM ;RESTORE T IFN FTDSWP,< SKIPP2 ;DON'T LET P2 TAKE BREAKS IF NO DDT! JRST BCOM3 SKIPE INDDT SKIPN KEEPIN HALT NOBREAK > BCOM3: SKIPN B1SKP ;ADDR MOD TO LOOK AT COND. INST. JRST BCOM2 ;THERE IS NO CONDITIONAL INSTRUCTION XCT @BCOM3 ;EXECUTE THE COND. INSTR. ALL ACS ARE USER'S JRST NOBREAK ;DON'T BREAK IF NO SKIP. BCOM2: SOSG B1CNT ;ADDR MOD TO LOOK AT PROCEED COUNTER JRST BREAK ;PROCEDE COUNTER NON POSITIVE - TAKE A BREAK! NOBREAK: MOVEM T,AC0+T LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION CAIL T,264 ;JSR CAILE T,266 ;JSA,JSP TRNN T,700 ;UUO JRST PROC1 ;MUST BE INTERPRETED CAIE T,260 ;PUSHJ CAIN T,256 ;XCT JRST PROC1 ;MUST BE INTERPRETED MOVE T,AC0+T JRST 2,@LEAV1 ;RESTORE FLAGS, GO TO LEAV LEAV1: XWD 0,LEAV ;FLAGS STORED IN LH. PROC1: MOVE T,AC0+T ;HERE TO INTERPRET INSTR. JSR SAVE JFCL JRST PROC2 LEAV: 0 ;INSTRUCTION MODIFIED JRST @BCOM ;DIRECT RETURN AOS BCOM ;INSTRUCTION SKIPPED. JRST @BCOM BREAK: JSR SAVE ;HERE TO TAKE A BREAK JRST BREAKA JRST BREAKB ;THIS CODE GETS US OUT OF DDT AND BACK IN FOR $X AND FOR $G XEC0: MOVEM T,TEMDDT ;SAVE INSTRUCTION TO XCT PUSHJ P,CRF ;TYPE CRLF PUSHJ P,TTYLEV ;RESTORE STATE OF TTY PUSHJ P,INSRTB ;REINSERT BREAKPOINTS MOVE W,TEMDDT ;IN CASE OF INTERUPTS (JS STUFF) JSP T,RESTORE ;RESTORE WILL XCT W XEC1: JRST XEC2 ;USED AT PROC0 (NON-SKIP) JSR SAVE ;(SKIP) PUSHJ P,REMOVB PUSHJ P,CHKSYM ;REINITIALIZE SYMBOL TABLE STUFF PUSHJ P,CRF ;OUTPUT AN EXTRA CRLF TO SIGNIFY SKIP. JRST DD1 XEC2: JSR SAVE ;NON-SKIP RETURN FROM XCT'ED INSTR. OMIT EXTRA CRLF PUSHJ P,REMOVB PUSHJ P,CHKSYM JRST DD1 ; This code for single step logic (pg. 35-6) ; Enter with I.NST containing instruction to be executed, ; INSXCT containing an XCT (either EXEC or normal) which will ; be stored in the appropriate XCTBUF. ?This scheme hopefully ; takes care of the EXEC XCT problem. DOITA: MOVEM F,SAV0 PUSHJ P,TTYLEV PUSHJ P,INSRTB MOVE W,INSXCT JSP T,RESTOR JRST DOITB ;INSTRUCTION DIDN'T SKIP DOITC: JSR SAVE ;Skipped PUSHJ P,REMOVB PUSHJ P,CHKSYM JRST SKIP% DOITB: JSR SAVE PUSHJ P,REMOVB PUSHJ P,CHKSYM JRST NOSKIP ; Control is transferred to JMP whenever a conditional jump jumps. ; It returns to the $X code to simulate the jump. JMP: JSR SAVE PUSHJ P,REMOVB PUSHJ P,CHKSYM JRST JMP1 SUBTTL SAVE AND RESTORE ACS AND PI SYSTEM SAVE: 0 ;SAVE THE ACS AND PI SYSTEM SKIPN SARS ;SKIP IF ACS ARE ALREADY SAVED JRST SAV1 ;NOPE AOS SAVE ;SKIP RETURN INDICATES WE DON'T REMOVE BREAKPOINTS JRST SAV5 ;CONTINUE IN SAVE SAV1: IFN EDDT&1,< CONI APR,SAVAPR ;SAVE APR CONI CONI PI,SAVPI ;SAVE OF PI SYSTEM CONO PI,@SAVPI+1 ;SET STATE OF PI SYSTEM (CH 3-7 OFF) IFE EDDT&40,< SETOM DDTFLG > ;PREVENT P2 FROM DOING CHECKSUM >;IFN EDDT&1 MOVEM 17,AC17 ;STUFF THE ACS HRRZI 17,AC0 BLT 17,AC0+16 IFN EDDT,< SETZM KLFLG ;ASSUME NOT A KL10 MOVE T,[T,,T] BLT T,T CAMN T,[T,,T] JRST SAV1A SETOM KLFLG ;THIS IS A KL10 CONI KLPAG,T ;GET EBR. MOVEM T,SVKLP ;SAVE STATE OF KL10 PAGER CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL JRST .-1 CONSO KLPAG,600000 ;IS THE CACHE ON ALREADY? JRST SAVX ;NO. BLKO CCA, ;VALIDATE CORE CONSZ APR,SWEEPB JRST .-1 SAVX: TRZ T,600000 ;CLEAR CACHE LOOK AND LOAD CONO KLPAG,(T) ;TURN OFF CACHE. DATAI CCA,0 ;SWEEP CACHE. INVALIDATE ALL. CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL JRST .-1 ANDI T,17777 ;MASK EBR ONLY LSH T,9 ;SHIFT TO MAKE A CORE ADDRESS MOVEM T,KEPTAD ;SAVE EPT ADDRESS. >;IFN EDDT SAV1A: MOVE T,SAVE ;GET THE PC FLAGS HLLM T,SAVPI ;STUFF IN LH OF PI CONI WORD SAV5: SETOM SARS ;FLAG THAT THE ACS HAVE BEEN SAVED MOVEI P,PS ;STACK IFN FTDSWP&EDDT&1,< PUSHJ P,GETDDT ;DO THE SWAPPABLE DDT THING! >;FTDSWP&... IFE EDDT,< PUSHJ P,TTYRET ;USER MODE. TTY TO DDT MODE >;IFE EDDT MOVEI F,0 MOVE T,[SCHM,,SCH] BLT T,ODF ;LOAD THE ACS WITH MODE SWITCHES JRST @SAVE ;RETURN ;THE XCTBUF IS 8 COPIES OF THE PROCEDE FROM BREAKPOINT (AND EXECUTE) ;CODE. 8 COPIES CORRESPOND TO THE 7 PI LEVELS PLUS NO PIS IN PROGRESS ;LEVEL. ;ONCE THE PI SYSTEM IS RESTORED, AN INTERRUPT MAY HAPPEN THAT STARTS DDT ;AT SOME HIGHER PRIORITY PI CHANNEL. IF THIS OCCURS, EXITING THAT HIGHER ;CHANNEL WILL USE A DIFFERENT XCTBUF AND THUS ENSURE THAT ALL INSTRUCTIONS ;HAPPEN CORRECTLY, IN THEIR CORRECT PI CHANNELS. XCTBUF: REPEAT <EDDT&1*7>+1,< CONO PI,@SAVPI ;RESTORE STATE OF PI SYSTEM 0 ;INSTRUCTION TO EXECUTE SKIPA ;DIDN'T SKIP AOS .+1 ;INSTR. DID SKIP JRST . ;SET ADDRESS TO RETURN TO. 0 ;USED TO SIMULATE PUSHJ > XCTQ__6 ;SIZE OF EACH ENTRY IN XCTBUF ;RESTORE - ENTER WITH T CONTAINING THE RETURN ADDRESS AND W AN INSTRUCTION TO XCT RESTORE:SETOM TEM3 ;RESTORE ACS AND PI SYSTEM (EXIT DDT) RESTR1: HRRM T,SAVE ;HERE TO DO $P TO PROCEDE AT A PUSHJ. TEM3 IS ZERO IFN 0&EDDT&1,< ;SYS WRITE REF KLUDGE HAS BEEN REMOVED. MOVE T,SAVAPR ANDI T,SYSCLB!7 TRNN T,SYSCLB CONO APR,CLRCLB(T) ;IF THE SYSTEM WASN'T CLOBBERED WHEN WE CAME ;IN, THEN IT ISN'T CLOBBERED NOW. > MOVE T,SAVPI ;PC FLAGS,,PI STATE HLLM T,SAVE ;STORE PC FLAGS MOVEM W,TEMDDT ;STORE INSTRUCTION TO XCT MOVEI W,XCTBUF ;ASSUME NOT PI IN PROGRESS. IFN EDDT,< AND T,SAVPI+1 ;TURN ON ONLY THOSE CHANNELS WE TURNED OFF ANDI T,177 IORI T,2000 ;TURN ON CHANNELS EXCH T,SAVPI ;STORE PI CONO BITS. GET IN PROGRESS BITS. ;WHICH XCTBUF USED DEPENDS ON HIGHEST CHANNEL IN PROGRESS WHEN WE STARTED. ZZ__7 REPEAT 7,< TRNE T,1<17-ZZ> MOVEI W,XCTBUF+<XCTQ*ZZ> ZZ__ZZ-1>;REPEAT 7 >;IFN EDDT HLL W,SAVE ;GET THE PC FLAGS MOVEM W,RES2 ;STORE FLAGS,,ADDRESS OF XCTBUF IFE EDDT,<AOS RES2> ;IN USER MODE, SKIP THE CONO PI MOVE T,TEMDDT ;GET THE INSTR. TO XCT MOVEM T,1(W) ;STORE IT WHERE WE'LL RUN OVER IT HRRZ T,SAVE ;GET THE RETURN ADDRESS HRRM T,4(W) ;STUFF IT IN THE JRST SKIPGE TEM3 ;IS THIS $P AT A PUSHJ? JRST RES3 ;NOPE. MOVE T,BCOM ;GET THE ADDRESS AND FLAGS FROM BREAKPOINT MOVEM T,5(W) ;STUFF IN XCTBUF MOVEI T,5(W) ;CHANGE THE ADDRESS OF THE PUSH TO POINT HRRM T,1(W) ; AT THE PC AND FLAGS. ;PUSHJ BECOMES A PUSH AND A JRST RES3: IFN EDDT&20,< MOVE TAC,MONPTR ;RECOMPUTE MONITOR CHECKSUM PUSHJ P,CHECK SKIPN STRING ;ONLY IF COMMANDS COMING FROM KEYBOARD! MOVEM TAC1,MONSUM IFN FTHSYS,< MOVE TAC,HMNPTR ;RECOMPUTE CHECKSUM OF HIGH PART. PUSHJ P,CHECK SKIPN STRING MOVEM TAC1,HMNSUM >;FTHSYS IFE EDDT&40,< SETZM DDTFLG > ;TELL P2 IT'S OK TO CHECKSUM IFN FTDSWP,< PUSHJ P,GETBAK ;DO THE SWAPPABLE DDT THING > > MOVSI 17,AC0 ;RESTORE USER ACS BLT 17,17 SETZM SARS IFE EDDT&1,< JRST 2,@RES2 ;EXIT IF USER DDT.>;IFE EDDT IFN EDDT&1,< SKIPN KLFLG ;YET MORE WORK TO DO IF THIS IS A KL10. JRST 2,@RES2 ;RESTORE FLAGS AND JUMP TO XCTBUF MOVEM 1,TEM3 CONO APR,027760 ;CLEAR ALL FLAGS LDB 1,[POINT 12,SAVAPR,17] ;GET ORIGINAL APR ENABLES CONO APR,100000(1) ;SET ORIGINAL ENABLES LDB 1,[POINT 12,SAVAPR,35] ;GET ORIGINAL FLAGS AND PIA IORI 1,20 ;SET SWEEP DONE. CACHE IS CLEAN. CONO APR,10000(1) ;SET ORIGINAL FLAGS AND PIA MOVE 1,TEM3 CONO KLPAG,@SVKLP ;RESTORE PAGER TO ORIGINAL STATE JRST 2,@RES2 >;IFN EDDT&1 RES2: 0 SUBTTL EXEC DDT - SWAPPING DDT CODE IFE EDDT&21-21,< COMMENT  INITIALIZATION ROUTINES FOR SWAPPING DDT SWAPPING DDT CONTROL CELLS AND THEIR MEANINGS: NOTDDT: -1 FLUSH DDT ENTIRELY KEEPIN: -1 DDT STAYS IN CORE ALWAYS 0 DDT IS SWAPPABLE INDDT: -1 DDT IS IN CORE 0 DDT IS ON DISK EXMMAP: 0 EXAMINE & DEPOSIT ACTUAL ADDRESS -1 EXAMINE & DEPOSIT VIA EXEC MAP DDTXCOR: -1 DDT IS SWAPPED OUT IN EXTRA CORE RATHER THAN DISK XDDPTR: AOBJN POINTER TO PAGE TABLE FOR DDT DDTFLG: 0 THIS IS -1 WHEN DDT IS ACTIVE (KEEPS P2 FROM MONITOR CHECKSUMMING)  ^^NOTDDT: 0 ;START WITH DDT ^^DDTFLG: 0 ;SET TO -1 WHEN DDT IS ACTIVE (FOR P2) ^^KEEPIN: -1 ;DDT STAYS IN AT LEAST UNTIL THE FIRST START-UP ^^INDDT: -1 ;DDT STARTS OUT IN CORE! ^^SYMLOC: 0 ;SET BY BEGIN TO CONTENTS OF DDTSYM BEFORE ONCE ONLY CODE ^^EXMMAP: -1 ;REFERENCE CORE AT FIRST ^^DDTXCOR: 0 ;INITIALIZED IN SYSINI, JUST LIKE DDTSWP ^^XDDPTR: 0 ;AOBJN POINTER TO EXEC PAGE TABLE FOR DDT + SYMBOLS DDSPFW: 0 ;SAVED PAGE FAIL WORD DDSFPC: 0 ;SAVE PAGE FAULT PC WORD DDSNPC: 0 ;SAVE PAGE FAULT NEW PC WORD ^^DDTSUM: 0 ;CHECKSUM OF DDT SWPWRD: 0 ;PLACE TO KEEP WORD WE ARE DEPOSITING! ^^USROFF: 0 ;FIRST WORD ON DISK=ADDRESS DDTA&37=SEC 0 ON 2ND BAND ^^USREND: 0 ;WORD AFTER LAST ON DISK=USROFF+SYM LENGTH+DDTEND-DDTA+100 ;DDTINI INITIALIZE SWAPPING DDT!!! ^DDTINI: IFN FTXCOR,< SKIPE DDTXCOR JRST SETXC ;SWAP DDT OUT TO EXTRA CORE >;IFN FTXCOR DDTIN1: SETOM KEEPIN SETOM INDDT ;DDT IS IN NOW HLRE TAC,DDTSYM MOVMS TAC ADD TAC,DDTSYM SKIPN TAC MOVEI TAC,DDTEND HRRZM TAC,SYSSIZ MOVE TAC,DDTSYM MOVEM TAC,SYMLOC ;SYMLOC WILL ALWAYS POINT TO SYMBOLS SETOM EXMMAP ;EXAMINE MAPPED POPJ P, IFN FTXCOR,< SETXC: PUSH P,KLUPT+KLPFNP MOVE TAC,[PCU,,SETXCT] MOVEM TAC,KLUPT+KLPFNP MOVE TAC,[160040,,1000] ;PAGE TABLE POINTER TO 1000000 MOVE TAC1,[DDTA,,DDTEXP9] ;INITIAL BLT POINTER HLRE AC2,DDTSYM MOVN AC2,AC2 ADD AC2,DDTSYM ;ONE PAST LAST SYMBOL MOVEI AC2,-DDTA+777(AC2) ;SIZE OF DDT+SYMBOLS+777 LDB AC2,[POINT 9,AC2,26] ;NUMBER OF PAGES IN DDT+SYMBOLS PUSH P,AC2 BLKI KLPAG,[EXPGT-9  -1] ;SET EXPGT AND USPGT POINTERS IN AC BLOCK 6 SETXC2: CONO KLPAG,@KLPCON MOVEM TAC,EXPGT+DDTEXP ;CLOBBER MAP FOR PAGE DDTEXP TO HIGH CORE MOVE AC1,TAC1 ;GET BLT POINTER BLT AC1,DDTEXP9+777 ;MOVE PAGE OF LOW CORE INTO PAGE DDTEXP ADD TAC1,[1000,,] ;UPDATE SOURCE OF BLT (DEST. IS DDTEXP9+777) ADDI TAC,1 ;UPDATE PAGE TABLE POINTER TO HIGH CORE SOJG AC2,SETXC2 ;LOOP, COUNTING DOWN PAGES MOVED. ;AS A RESULT OF THE ABOVE, DDTA IS COPIED TO 1,,0 AND SYMBOLS ARE AT ;1000000+RH(DDTSYM)-DDTA (FOR UEDDT, USE SYMLOC, NOT DDTSYM) MOVEI AC2,DDTA MOVEM AC2,USROFF ;FIRST LOCATION FOR SWPEXM MOVE AC2,(P) LSH AC2,9 ADDI AC2,DDTA MOVEM AC2,USREND ;1 PAST LAST LOCATION FOR SWPEXM POP P,AC2 ;GET BACK NUMBER OF DDT+SYMBOLS PAGES MOVN AC2,AC2 HRLZ AC2,AC2 HRRI AC2,EXPGT+(DDTA-9) ;AOBJN POINTER TO EXEC PAGE TABLE MOVEM AC2,XDDPTR MOVE AC2,DDTSYM MOVEM AC2,SYMLOC POP P,KLUPT+KLPFNP CONO KLPAG,KLEPT-9 ;TURN MAPPING BACK OFF SETOM EXMMAP ;DEFAULT IS EXAMINE MAPPED SETZM KEEPIN SETZM INDDT SETZM DDTSYM ;NO SYMBOLS, NOW MOVEI TAC,DDGVUS MOVEM TAC,SYSSIZ ;GIVE LOSERS ALL THIS CORE! POPJ P, SETXCT: SETZM DDTXCOR CONO KLPAG,KLEPT-9 ;TURN MAPPING BACK OFF SUB P,[1,,1] POP P,KLUPT+KLPFNP JRST DDTIN1 >;FTXCOR ;GETDDT CALLED FROM SAVE TO GET DDT INTO CORE! DDTMES GETDDT: SKIPP1 POPJ P, ;CAN'T DO THIS ON P2 MOVE TAC,KLUPT+KLPFW MOVEM TAC,DDSPFW ;SAVE PAGE FAIL WORD MOVE TAC,KLUPT+KLPFPC MOVEM TAC,DDSFPC ;SAVE PAGE FAIL PC MOVE TAC,KLUPT+KLPFNP MOVEM TAC,DDSNPC ;SAVE PAGE FAIL NEW PC WORD MOVE TAC,[PCU,,DDTTRP] MOVEM TAC,KLUPT+KLPFNP ;SET UP NEW PC WORD FOR PAGE FAULTS DURING DDT REPEAT 0,< MOVEI TAC,. ;LET'S SEE WHERE WE ARE. CAMGE TAC,37 ;HAS 37 BEEN CLOBBERED? JRST GETDD2 ;I SUPPOSE WE'LL LET IT ALONE. CAMGE TAC,RMEMSIZE ;I HOPE THIS ISNT MOVE TAC,RMEMSIZE SUBI TAC,1 MOVEM TAC,37 GETDD2: >;REPEAT 0 SKIPE INDDT ;IF DDT ALREADY IN ... POPJ P, ;...THEN NOTHING ELSE TO DO IFN FTXCOR,< SKIPE DDTXCOR JRST GTDDMP ;DDT IS IN HIGH CORE >;FTXCOR JSP TAC,DDTMES ASCIZ /CAN'T FIND DDT ANYWHERE / HALT . IFN FTXCOR,< GTDDMP: MOVE TAC,XDDPTR ;AOBJN POINTER TO EXEC PAGE TABLE MOVE TAC1,[160040,,1000] GTDDM1: MOVEM TAC1,(TAC) ADDI TAC1,1 AOBJN TAC,GTDDM1 CONO KLPAG,60000+KLEPT-9 ;CLEAR PAGER MOVE TAC,SYMLOC MOVEM TAC,DDTSYM SETOM INDDT POPJ P, ;SET DDT IN AND CHECK CHECKSUM >;FTXCOR ;DDTMES TYPES MESSAGE ON CTY ;CALLING SEQUENCE: ; JSP TAC,DDTMES ; ASCIZ/MESSAGE/ ; <RETURNS HERE> DDTMES: HRLI TAC,(<POINT 7,0>) JSR DDTTYPE JRST 1(TAC) ;SEE HOW CLEVER WE ARE!!!! ;GETBAK CALLED FROM RESTORE TO UPDATE SYMBOL TABLE AND GET USER CORE BACK! GETBAK: SKIPP1 POPJ P, ;P2 DOESN'T DO ANYTHING MOVE TAC,DDSPFW MOVEM TAC,KLUPT+KLPFW ;RESTORE TRAP STATUS WORD MOVE TAC,DDSFPC MOVEM TAC,KLUPT+KLPFPC ;AND PAGE FAULT PC WORD MOVE TAC,DDSNPC MOVEM TAC,KLUPT+KLPFNP ;AND PAGE FAULT NEW PC WORD SKIPN KEEPIN ;DDT GOING OUT? SKIPN INDDT ;AND IN NOW POPJ P, ;NO SETZM DDTSYM ;NO DDT, NO SYMBOLS. SETZM INDDT ;DDT NO LONGER IN CORE IFN FTXCOR,< SKIPE DDTXCOR JRST BKDDMP >;FTXCOR HALT . ;CANT GET HERE IFN FTXCOR,< BKDDMP: MOVE TAC,XDDPTR ;AOBJN POINTER TO PAGE TABLE BKDDM1: SETZM (TAC) ;EXEC HAS NO ACCESS THERE! AOBJN TAC,BKDDM1 CONO KLPAG,60000+KLEPT-9 ;RESET PAGER POPJ P, >;FTXCOR ;EXAMINE & DEPOSIT ROUTINES FOR SWAPPING DDT! SWPEXM: CAIG R,17 JRST CPOPJ2 ;LET SOMEONE ELSE FIGURE OUT HOW TO EXAMINE ACS SKIPN EXMMAP ;SKIP IF EXAMINING USING EXISTING MAP SKIPP1 JRST CPOPJ2 ;P2 GETS CORE! JRST XCREXM SWPDEP: MOVEM T,SWPWRD PUSHJ P,SWPEXM JRST XCRDEP ;GOT IT IN! POPJ P, ;MAKE BELIEVE IT WON!! CAIG R,17 JRST CPOPJ1 ;LET SOMEONE ELSE FIGURE OUT HOW TO EXAMINE ACS. SKIPP2 ;SKIP IF THIS IS P2 SKIPN EXMMAP ;SKIP IF EXAMINING USING EXISTING MAP JRST CPOPJ1 ;NOT USING MAP. LET SOMEONE ELSE THINK ABOUT IT. CONSO KLPAG,1B22 ;YES. SKIP IF KL10 PAGER IS TURNED ON JRST CPOPJ1 ;DON'T USE MAP PUSH P,W PUSH P,S LDB S,[POINT 13,R,26] ;PAGE NUMBER OF REFERENCE MOVEI T,EXPGT(S) ;ADDRESS OF THE EXPGT ENTRY FOR THIS PAGE. SKIPN T,(T) ;GET THE EXISTING MAP ENTRY JRST DDTTRP ;PAGE FAULT HRLI T,160040 ;ALLOW US TO WRITE THERE. MOVEM T,EXPGT+DDTEXP CONI KLPAG,T CONO KLPAG,(T) ;CLEAR ARS LDB S,[POINT 9,R,35] ;KEEP OFFSET IN PAGE MOVE T,SWPWRD ;SETUP T WITH THE DATUM MOVEM T,<DDTEXP9>(S) ;STORE DATUM POP P,S SETZM EXPGT+DDTEXP CONI KLPAG,W CONO KLPAG,(W) ;CLEAR ARS POP P,W POPJ P, XCREXM: PUSH P,W MOVE W,[MOVE T,<DDTEXP9>(S)] XCRRTN: PUSH P,S LDB S,[POINT 13,R,26] ;PAGE NUMBER OF REFERENCE HRLI S,160040 MOVEM S,EXPGT+DDTEXP CONI KLPAG,S CONO KLPAG,(S) ;CLEAR ARS LDB S,[POINT 9,R,35] ;KEEP OFFSET IN PAGE XCT W XCRFIN: POP P,S CONI KLPAG,W CONO KLPAG,(W) ;CLEAR ARS POP P,W POPJ P, XCRDEP: PUSH P,W MOVE T,SWPWRD MOVE W,[MOVEM T,<DDTEXP9>(S)] JRST XCRRTN DDTTRP: MOVEI S,[ASCIZ / ?PAGE FAULT /] PUSHJ P,ASCOUT JRST XCRFIN ;DCHECK - DEVICE PIA CHECKER - DTEXX, DTOCA, OTOCA, XTKL ;CALL WITH JSR DCHECK$X DCHKPD: BLOCK 40 DCHKAC: BLOCK 20 DCHECK: 0 MOVEM 17,DCHKAC+17 MOVEI 17,DCHKAC BLT 17,DCHKAC+16 MOVEI P,DCHKPD-1 ;GET A PDL MOVSI TAC,-NDCHK DCHEK1: MOVE TAC1,DCHKTB(TAC) ;GET BYTE POINTER MOVE AC2,TAC1 ;SAVE ALLOWABLE DEVICE CODES LDB J,[POINT 7,TAC1,24] ;GET DEVICE CODE HRRI TAC1,AC1 ;CONI WILL BE IN AC1 MOVE DAT,J LSH DAT,=26 ;SHIFT TO DEVICE CODE FIELD IOR DAT,[CONI AC1] XCT DAT ;DO THE CONI INTO AC1 LDB TAC1,TAC1 ;GET THE PIA MOVEI TEM,3 DCHEK2: IDIVI AC2,10 ;GET NEXT ALLOWABLE PIA IN AC3 CAIN AC3,(TAC1) ;DOES THE PIA MATCH? JRST DCHEK3 ;YES, GO ON TO NEXT ENTRY SOJG TEM,DCHEK2 ;TRY ALL THREE POSSIBLE PIAS MOVEI S,[ASCIZ /DEVICE /] ;S=AC2 AND T=DAT GET CLOBBERED PUSHJ P,ASCOUT ;BY TYPEOUT MOVE W1,DCHKNM(TAC) ;GET DEVICE NAME PUSHJ P,SIXOUT MOVEI S,[ASCIZ / (/] PUSHJ P,ASCOUT MOVEI T,(J) ;GET DEVICE CODE BACK LSH T,2 ;MAKE IT A MULTIPLE OF 4 PUSHJ P,OTOCA ;TYPE IT, CLOBBERS W1=DDB MOVEI S,[ASCIZ /) CONI BITS /] PUSHJ P,ASCOUT LDB T,[POINT 6,DCHKTB(TAC),11] ;SIZE FIELD OF BYTE POINTER LDB AC3,[POINT 6,DCHKTB(TAC),5] ;POSITION FIELD ADDI T,(AC3) MOVN T,T ADDI T,=36 PUSHJ P,DTOCA ;TYPE IT IN DECIMAL MOVEI T,"-" PUSHJ P,DTOUT MOVEI T,=35 SUBI T,(AC3) PUSHJ P,DTOCA MOVEI S,[ASCIZ / ARE /] PUSHJ P,ASCOUT MOVEI T,(TAC1) ;GET PIA PUSHJ P,OTOCA ;AND TYPE IT OUT MOVEI S,[ASCIZ / SHOULD BE /] PUSHJ P,ASCOUT MOVE TEM,[POINT 3,DCHKTB(TAC),26] MOVEI AC1,0 ;REMEMBER VALUES SEEN DCHEK4: ILDB AC3,TEM ;GET AN ALLOWABLE PIA VALUE MOVEI AC2,1 LSH AC2,(AC3) TROE AC1,(AC2) JRST DCHEK5 ;ALREADY TYPED THIS VALUE MOVEI S,[ASCIZ / OR /] TLOE AC1,400000 ;SKIP COMMA FIRST TIME PUSHJ P,ASCOUT MOVEI T,(AC3) PUSHJ P,OTOCA ;TYPE OUT PIA DCHEK5: TLNE TEM,770000 JRST DCHEK4 MOVEI S,[ASCIZ / /] PUSHJ P,ASCOUT DCHEK3: AOBJN TAC,DCHEK1 MOVEI S,[ASCIZ /DONE CHECKING /] PUSHJ P,ASCOUT MOVSI 17,DCHKAC BLT 17,17 JRST 2,@DCHECK OTOCA: SKIPA W1,[10] DTOCA: MOVEI W1,12 MOVEM W1,DCKRAD DKTOCA: LSHC T,-43 LSH W1,-1 ;W1=T+1 DIV T,DCKRAD HRLM W1,0(P) JUMPE T,DTOC2 PUSHJ P,DKTOCA DTOC2: HLRZ T,0(P) ADDI T,"0" JRST DTOUT DCKRAD: 10 ;ENTRIES IN THE DCHKTB TABLE HAVE THE FOLLOWING FORMAT: ;LH: LH OF BYTE POINTER TO A FIELD IN THE CONI THAT HAS A PIA ;RH: BITS 18-24 CONTAIN THE 7 BIT DEVICE CODE ; BITS 27-29, 30-32 AND 33-35 CONTAIN LEGAL PIA VALUES DEFINE DCKLST < DCHKMC (APR,3,35,APRCHN,APRCHN,APRCHN) DCHKMC (MTR,3,35,APRCHN,APRCHN,APRCHN) DCHKMC (IOP,3,35,IOPCHN,IOPCHN,0) DCHKMC (LPT,3,35,LPTCHN,LPTCHN,0) DCHKMC (DTE0,3,35,DTECHN,DTECHN,DTECHN) DCHKMC (DC,3,35,DCTCHN,DCTCHN,0) DCHKMC (DTC,3,35,DTCCHN,DTCCHN,0) DCHKMC (MTC,3,35,MTCCHN,MTCCHN,0) DCHKMC (DCSA,3,35,SCNCHN,SCNCHN,SCNCHN) DCHKMC (DKB,3,35,SCNCHN,SCNCHN,SCNCHN) DCHKMC (DCA,3,35,SCNCHN,SCNCHN,SCNCHN) DCHKMC (VMI,3,35,0,0,0) DCHKMC (PK,3,35,PKCHN,PKCHN,PKCHN) DCHKMC (DIL,3,35,DILCHN,DILCHN,DILCHN) DCHKMC (IMP,3,35,IMPCHN,IMPCHN,0) ;OUTPUT DCHKMC (IMP,3,32,IMPCHN,IMPCHN,0) ;INPUT DCHKMC (IMP,3,29,IMPCHN,IMPCHN,0) ;INPUT END DCHKMC (DPY,3,35,DPYCHN,DPYCHN,0) DCHKMC (KBD,3,35,0,0,0) ;III KEYBOARD SCANNER DCHKMC (DSK,3,35,0,0,0) ;LIBRASCOPE DISK DCHKMC (ELF,3,32,ELFCHN,ELFCHN,0) ;ELF ERRORS DCHKMC (ELF,3,35,0,0,0) ;ELF DATA DCHKMC (PMP,3,35,D2CHN,DSKCHN,0) DCHKMC (DDD,3,35,DPYCHN,DPYCHN,0) DCHKMC (MPX,3,35,MPXCHN,MPXCHN,MPXCHN) DCHKMC (KIM,3,35,KIMCHN,KIMCHN,KIMCHN) DCHKMC (SIX,3,35,SIXCHN,SIXCHN,0) DCHKMC (SIX,3,29,SIXCHN,SIXCHN,SIXCHN) >;END DEFINITION OF DCKLST DEFINE DCHKMC (DEVICE,SIZE,BITPOS,PIA1,PIA2,PIA3) < POINT SIZE,<<DEVICE9>!(PIA1*100+PIA2*10+PIA3)>,BITPOS > DCHKTB: DCKLST NDCHK__.-DCHKTB DEFINE DCHKMC (DEVICE,SIZE,BITPOS,PIA1,PIA2,PIA3) < SIXBIT /DEVICE/ > DCHKNM: DCKLST ;ASSEMBLE NAMES OF DEVICES >;END IFE EDDT&21-21 CONDITIONAL (SEE TOP OF PAGE 9) IFN EDDT&1,< ASCOUT: HRLI S,440700 ASCOU1: ILDB T,S JUMPE T,CPOPJ PUSHJ P,DTOUT JRST ASCOU1 SIXOUT: MOVEI T,0 LSHC T,6 JUMPE T,CPOPJ ADDI T,40 PUSHJ P,DTOUT JRST SIXOUT DTOUT: CAIG T,4 POPJ P, XTKL: PUSH P,0 ;TRANSMIT CHARACTER IN T TO CTY MOVE 0,T PUSHJ P,DTEXX POP P,0 POPJ P, DTEXX: PUSH P,T MOVE T,KEPTAD SETZM DTFLG(T) ;CLEAR COMMAND DONE FLAG MOVEM 0,DTCMD(T) ;STORE COMMAND WORD FOR 11 CONO DTE0,DONG11 ;RING 11'S DOORBELL SKIPN DTFLG(T) ;WAIT FOR RESPONSE JRST .-1 MOVE 0,DTF11(T) ;RETURN 11'S REPONSE WORD SETZM DTFLG(T) POP P,T POPJ P, >;END IFN EDDT&1 SUBTTL DDT - INITIALIZATION, MAIN LOOP - DDTA CPOPJ2: AOS (P) CPOPJ1: AOS (P) CPOPJ: POPJ P, IFN FTDSWP,< TMPTAC: 0 DDTP2: MOVEM TAC,TMPTAC MOVE TAC,[POINT 7,[ASCIZ/SORRY, CAN'T GET DDT! /]] JSR DDTTYPE MOVE TAC,TMPTAC HALT DDT DDT: SKIPP2 ;ENTER HERE FOR SWAPPING VERSION OF DDT JRST DDTP1 SKIPE INDDT SKIPN KEEPIN HALT DDT ;IF IT'S NOT IN CORE, P2 CAN'T GET IT. DDTP1: SKIPE NOTDDT JRST DDTP2 JSR SAVE JRST DDTA ;NORMAL ENTRY JRST DDTB ;DDT RESTARTING WITHOUT NORMAL EXIT ;MAKE SURE EVERYTHING WE NEED STAYS IN - LIT AND VAR XLISTED XLIST ;OMIT UNSIGHTLY HEAP. LIT VAR LIST >;FTDSWP ;DDTA IS THE FIRST LOCATION THAT MAY BE SWAPPED OUT!!!! IFE FTDSWP,< DDT: JSR SAVE ;SAVE ACS - NON SWAPPING VERSION OF DDT >;FTDSWP IFN EDDT&1,< DDGVUS: ;GIVE FROM HERE ON TO USERS IFN FTXCOR,< LOC <<.-1>&777000>+1000 ;NEXT PAGE BOUNDARY >;FTXCOR >;EDDT&1 ^^DDTA: PUSHJ P,REMOVB ;REMOVE BREAKPOINTS DDTB: PUSHJ P,CHKSYM ;SEE IF SYMBOL TABLE HAS MOVED IFE EDDT,< MOVE T,JOBOPC^ ;CONTINUE THRU JOBOPC TLNE T,10000 ;USER MODE PC? JRST DDTC ;NO. ICK! HRRZ T,T ;PC ONLY CAIL T,DDTBEG CAILE T,DDTEND JRST DDTD ;JOBOPC POINTS OUTSIDE OF DDT> DDTC: MOVEI T,XEC1 ;MAKE $P CALL DDT DDTD: HRRM T,PROC0 ;STUFF IT. DD1: TLZ F,ROF ;CLOSE ANY OPEN REGISTER PUSHJ P,CRF ;ANNOUNCE BY CRLF THAT WE ARE HERE. DD1.5: MOVE T,[XWD SCHM,SCH] BLT T,ODF ;LOAD ACS SKIPL GETFLG ;OPEN A PROGRAM THE FIRST TIME AROUND. JRST GETPGM ;RETURN TO RET OR DD2 DD2: SETZM PRNC ;PARENTHESES COUNT MOVEI P,PS ;STACK POINTER LIS: MOVE T,ESTU ;UNDEFINED SYMBOL POINTER MOVEM T,ESTUT ;INIT UNDEFINED SYM ASSEM TDZ F,[XWD 777777-ROF-STF,LF1+CF1+SBF+ITF+EQF+Q2F] SETZM IOTFLG ;NOT AN IOT YET LIS0: TDZ F,[XWD 777777-ROF-STF-FAF-SAF,NAF] SETZM WRD LIS1: SETZM FRASE LIS2: MOVEI T,1 MOVEM T,FRASE1 TLZ F,MLF+DVF L1: TLZ F,CF+CCF+SF+FPF ;TURN OFF CONTROL, SYL, PERIOD FLAG SETZM SYL L1RPR: SETZM SYM MOVEI T,6 MOVEM T,TEMDDT ;INIT SYMBOL COUNTER MOVE T,[POINT 7,TXT] ;SET UP POINTER FOR OPEVAL MOVEM T,CHP SETZM DENDDT SETZM WRD2 L2: PUSHJ P,TIN ;PICK UP CHARACTER CAIL T,"A"+40 CAILE T,"Z"+40 SKIPA TRC T,40 ;CONVERT LOWER CASE TO UPPER CASE TLNE F,CF ;SKIP UNLESS THIS CHARACTER FOLLOWS ALTMODE. JRST L21 ;ALTMODE PRECEDES THIS CHARACTER CAIG T,"Z" ;Z CAIGE T,"A" ;A JRST .+2 JRST LET L21: MOVE R,T CAILE T,137 ;CHARACTERS ABOVE LOWER CASE "Z" ARE ILLEGAL JRST ERR IDIVI R,3 LDB W,BDISP(R+1) ;EEK, GASP! I THINK THE PRECEDENCE IS BUILT IN TO THE ADDRESSES OF THE THINGS CAIGE W,MULT-DDT ;FIRST EVAL ROUTINE JRST DDT(W) MOVE T,SYL TLZN F,LTF JRST POWER MOVE T,[XWD OPEVAL,EVAL] ;LOOKUP ROUTINES IN CORRECT ORDER SKIPN WRD ;USE SYMBOL TABLE FIRST IF SOMETHING THERE MOVSS T MOVEM T,SAVE JRST L213 L212: HLRZS T,SAVE ;TRY NEXT EVALUATION ROUTINE JUMPE T,UND1 ;NEITHER ONE L213: PUSHJ P,(T) JRST L212 ;TRY NEXT ONE L4: TLZE F,MF MOVN T,T ;MINUS FLAG WAS SEEN TLNN F,SF CAIE W,LPRN-DDT JRST .+2 JRST LPRN ;LEFT PAREN SEEN EXCH T,FRASE1 TLNN F,DVF IMULB T,FRASE1 TLZE F,DVF IDIVB T,FRASE1 CAIGE W,ASSEM-DDT JRST DDT(W) ;MULTIPLY OR DIVIDE ADDB T,FRASE CAIGE W,SPACE-DDT JRST DDT(W) ; + - @ , ADD T,WRD TLNE F,TIF ;TRUNCATE INDICATOR FLAG HLL T,WRD ;TRUNCATE MOVEM T,WRD TLNN F,QF MOVE T,LWT SETZM R MOVE W1,ESTUT CAMN W1,ESTU ;IF THERE ARE ANY UNDEFINED SYMBOLS IN JRST L5 ;THE CURRENT EXPRESSION, ANYTHING EXCEPT CAILE W,CARR-DDT ;FURTHER EXPRESSION INPUT, OR DEPOSITING JRST ERR ; INTO MEMORY IS ILLEGAL L5: CAIG W,RPRN-DDT JRST DDT(W) SKIPE PRNC JRST ERR PUSHJ P,DDT(W) RET: MOVEI P,PS PUSHJ P,LCT ;TYPE A TAB JRST DD2 ERR: MOVEI W1,"?" JRST WRONG1 UNDEF: MOVEI W1,"U" JRST WRONG1 WRONG: MOVE W1,[ASCII /XXX/] WRONG1: MOVEI P,PS PUSHJ P,TEXT PUSHJ P,LCT ;TYPE TAB IFN EDDT&1,< PUSHJ P,LISTEN JFCL> JRST DD2 NUM: ANDI T,17 ;T HOLDS CHARACTER TLNE F,CF+FPF JRST NM1 ;$ OR . SEEN MOVE W,SYL LSH W,3 ADD W,T MOVEM W,SYL ;ACCUMULATE OCTAL VALUE MOVE W,DENDDT IMULI W,12 ;CONVERT TO DECIMAL ADD W,T MOVEM W,DENDDT ;ACCUMULATE DECIMAL VALUE LE1: AOJA T,LE1A ;FLUSH NEXT LINE, INSERT LABEL "DOLLAR" NEAR "CONTRO", IF YOU WANT $ TO BE ALTMODE DOLLAR: SKIPA T,[46+101-13] ;RADIX 50 $. PERC: MOVEI T,47+101-13 ;PERCENT SIGN LET: TLC F,SF+FPF ;EXPONENT IFF LTF'*FEF'*(T=105)*SF*FPF=1 TLZN F,LTF+FEF+SF+FPF CAIE T,105 ;E TLOA F,LTF TLOA F,FEF ;E SEEN AS EXPONENT JRST LET1 TLZN F,MF ;MINUS FLAG? SKIPA W1,SYL ;NOT MINUS MOVN W1,SYL ;GOBBLE NEGATIVE VALUE MOVEM W1,FSV ;SAVE FLOATING POINT VALUE. SETZM DENDDT LET1: SUBI T,101-13 ;FORM RADIX 50 SYMBOL LE1A: TLO F,SF+QF LE2: MOVE W,SYM MOVEI R,101-13(T) ;SET UP IN SIXBIT FOR OPEVAL IMULI W,50 ;CONVERT TO RADIX 50 ADD W,T SOSGE TEMDDT ;IGNORE CHARACS AFTER 6 JRST L2 ;GO IGNORE IDPB R,CHP ;SAVE FOR OPEVAL MOVEM W,SYM JRST L2 NUM1: EXCH T,WRD2 ;FORM NUMBER AFTER $ IMULI T,12 ADDM T,WRD2 TRO F,Q2F ;FLAG NUMBER SEEN AFTER ALTMODE JRST L2 NM1: TLNE F,CF ;$ SEEN? JRST NUM1 ;YES. NOW NUMBER. MOVSI R,204500 ;FORM FLOATING POINT NUMBER. R_10.0 FMPRM R,FHDTMP ;MULTIPLY THE DIVISOR BY 10.0 FMPRM R,FHTTMP ;MULTIPLY TOTAL ACCUMULATED NUMBER BY 10.0 MOVSI R,211000(T) ;UNNORMALIZED VALUE OF THIS DIGIT FADRB R,FHTTMP ;ADD DIGIT TO TOTAL THUS FAR FDVR R,FHDTMP ;DIVIDE BY APPROPRIATE POWER OF 10.0 MOVEM R,SYL ;STORE FLOATING VALUE AOJA T,LE1A POWER: TLNN F,FEF JRST L4 ;NO EXPONENT CAIE W,PLUS CAIN W,MINUS TROE F,POWF TRZA F,POWF JRST (W) ; E+- MOVE W2,DENDDT SETZM FRASE MOVEI W1,FT-1 TLZE F,MF MOVEI W1,FT01 SKIPA T,FSV POW2: LSH W2,-1 TRZE W2,1 FMPR T,(W1) JUMPE W2,L4 SOJA W1,POW2 PERIOD: MOVE T,LLOC ;PERIOD ( . ) SEEN. USUALLY THIS IS CURRENT LOCATION TLNE F,SF ;BUT IF A SYLLABLE HAD BEEN STARTED IT MEANS MOVE T,DENDDT ;DECIMAL OR FLOATING POINT MOVEM T,SYL TLNE F,FPF ;FLOATING POINT ON ALREADY? I.E., ARE THERE 2 PERIODS? TLO F,LTF ;TWO PERIODS. THIS ONE IS A LETTER! TLON F,FPF+SF+QF ;SET FLOATING POINT. SKIP IF IN THE MIDDLE OF SYL MOVEI T,0 ;AT FRONT OF SYL. DO THE RIGHT THING FOR .69 IDIVI T,400 ;FLOAT THE VALUE OF T (HOW?) SKIPE T TLC T,243000 TLC W1,233000 FAD T,[0] FAD W1,[0] FADR T,W1 MOVEM T,FHTTMP ;STORE FLOATING VALUE MOVSI T,201400 MOVEM T,FHDTMP ;VALUE OF DIVISOR (10.0^<NUMBER OF DIGITS AFTER POINT>) MOVEI T,45 ;RADIX 50 PERIOD JRST LE2 QUAN: SKIPA T,LWT ;LAST QUANTITY TYPED PILOC: MOVEI T,SAVPI ;$I - PI STATUS QUAN1: MOVEM T,SYL QUAN2: TLO F,SF+QF ;WRD,SYL STARTED TLZ F,CF+CCF JRST L2 CONTRO: ;ALTMODE SEEN IFN EDDT&1, < MOVEI T,"$" PUSHJ P,TOUT ;ECHO $ SINCE REAL ALTMODE DOESN'T ECHO> ;DOLLAR: ;INSERT LABEL TO TREAT $ AS ALTMODE. TLOE F,CF TLO F,CCF ;SET $$ FLAG IF CF WAS SET BEFORE JRST L2 BEGIN UNDEF  SUBTTL DDT - ASSEMBLY OF UNDEFINED SYMBOLS GLOBAL F,P,R,S,T,W,W1,W2 ;THESE ARE HERE BECAUSE SWAPPING DDT DOESN'T SAVE THE UNDEFINED SYMBOL TABLE ^ESTU: 0 ^ESTUT: 0 ^UND1: MOVE R,ESTUT ;UNDEFINED SYM ASSEMBLER HLRE S,ESTUT ASH S,-1 ;SETUP EVAL END TEST HRLOI W1,37777+DELI+LOCAL PUSHJ P,EVAL2 CAIN W,ASSEM-DDT TLNN F,ROF JRST UNDEF SKIPE PRNC JRST UNDEF MOVEI T,"#" CAIE W,ASSEM-DDT PUSHJ P,TOUT MOVN R,[XWD 2,2] ADDB R,ESTUT MOVE T,SYM TLO T,GLOBAL MOVEM T,(R) HRRZ T,LLOCO TLNE F,MF TLO T,400000 MOVEM T,1(R) MOVEI T,0 JRST L4 ; ? COMMAND - LIST UNDEFINED SYMBOLS ^QUESTN:PUSHJ P,CRF ;START WITH CRLF MOVE R,ESTU ;GET POINTER TO UNDEF SYMS QUEST1: JUMPGE R,DD1 ;JUMP IF ALL DONE. MOVE T,(R) ;GET NEXT SYMBOL SKIPA W1,ESTU ; QUEST2: ADD W1,[XWD 2,2] ;ADVANCE CAME T,(W1) ;ARE TWO SYMBOLS THE SAME? JRST QUEST2 ;NOPE. CAME R,W1 ;ARE WE UP TO OURSELVES YET? JRST QUEST4 ;NO. THEN WE'VE OUTPUT THIS SYMBOL ALREADY PUSHJ P,SPT ;OUTPUT SYMBOL PUSHJ P,CRF ;AND A CRLF QUEST4: ADD R,[XWD 2,2] ;ADVANCE TO NEXT SYMBOL JRST QUEST1 ;KILL AN UNDEFINED SYMBOL ^UKILL: MOVE R,ESTU ;REMOVE UNDEFINED SYMS JUMPGE R,UNDEF ;IF NO UNDEFINED SYMS THEN ARG IS UNDEF. KILL2: PUSHJ P,EVAL0 JRST RET ;NONE LEFT. PUSHJ P,REMUN ;REMOVE ONE UNDEFINED SYMBOL JRST KILL2 REMUN: MOVE S,[XWD 2,2] ;REMOVE ONE UNDEFINED SYMBOL ADDB S,ESTU MOVE W,-2(S) ;MOVE LAST SYMBOL IN TABLE TO MOVEM W,(R) ;CLOBBER THE SYMBOL THAT'S DELETED. MOVE W,-1(S) MOVEM W,1(R) POPJ P, ^DUNDEF: ;DEFINE AN UNDEFINED SYMBOL MOVE R,ESTU DEF3: JUMPGE R,CPOPJ ;PATCH IN VALUE FOR UNDEF SYM ENTRY MOVE T,SYM CAME T,(R) JRST DEF4 MOVE S,DEFV SKIPGE 1(R) MOVN S,S PUSH P,R MOVE R,1(R) PUSHJ P,FETCH JRST ERR ADD S,T HRRM S,T PUSHJ P,DEP POP P,R PUSHJ P,REMUN ;REMOVE THE NOW DEFINED SYMBOL DEF4: ADD R,[XWD 2,2] ;ADVANCE TO NEXT SYMBOL JRST DEF3 ;REMOVED UNDEFINED SYMBOLS THAT WERE REFERENCED AT THIS ADDRESS ^REMAUN:MOVE R,ESTU MOVEM W1,ESTU REMAU1: JUMPGE R,CPOPJ HRRZ W,1(R) CAMN R,LLOCO PUSHJ P,REMUN ADD R,[2,,2] JRST REMAU1 ;EVAL0 - CALLED FROM UNDEFINED SYMBOL KILL ;EVAL2 - CALLED FROM UNDEFINED SYMBOL ASSEMBLER EVAL0: HRLOI W1,37777+DELI HLRE S,@SYMP ASH S,-1 ;SETUP END TEST JRST EVAL3 EVAL1: ADD R,[XWD 2,2] EVAL2: SKIPL R MOVE R,@SYMP AOJG S,CPOPJ ;TRANSFER IF NO SYMBOL FOUND EVAL3: MOVE T,(R) XOR T,SYM TLNN T,PNAME TLOA W1,LOCAL TDNE T,W1 JRST EVAL1 TLNN T,340000 JRST EVAL1 MOVE T,1(R) JRST CPOPJ1 ;FOUND SYMBOL, SKIP BEND UNDEF SUBTTL DDT - SYMBOL MANIPULATION ROUTINE ;THIS SEQUENCE INITS SYM TABLE LOGIC CHKSYM: HLRZ T,ESTU ;0,,-NUMBER OF UNDEFINED SYMBOLS SUB T,ESTU ;T_ NUMBER OF UNDEFINED,,-LAST ADDRESS OF UNDEFINEDS MOVE W,@SYMP ADD T,W ;IF THE TOP OF THE UNDEFINED SYM TAB DOES TRNE T,-1 ;NOT POINT TO BOTTOM OF REGULAR SYM TAB,THEN HRRZM W,ESTU ;RE-INIT UNDEFINED SYM TABLE POINTER, ESTU. SKIPL @SYMP ;SKIP IF THERE ARE REALLY SYMBOLS SOMEWHERE JRST CHKSY1 HRRZ SMB,@SYMP ;BASE OF SYMBOLS (IF SORTED) HLLO T,(SMB) ;GET FIRST WORD OF THE SYMBOL TABLE AOJE T,SSCHK ;JUMP IF THIS IS NEW FORMAT. CHKSY1: MOVEI SMB,0 ;FLAG OLD MODE MOVE T,PRGM SUB T,W ;IF THE SYM TABLE PNTR AND THE PROGRAM TSC T,T ;NAME (PRGM) PNTR DO NOT END UP IN THE MOVE W1,PRGM ;SAME PLACE, OR THEY DO NOT BOTH START ON XOR W1,W ;AN EVEN (OR BOTH ON ODD) LOCATION, OR TRNN W1,1 ;PRGM .GE. 0, THEN RE-INIT PRGM. JUMPE T,CPOPJ ;RETURN NOW IF HAPPY SETZM PRGM ;NEED NEW PROGRAM AND BLOCK NAME SETZM BLOCK POPJ P, KILL: TLNN F,LTF ;$K - DELETE SYMBOLS JRST ERR PUSHJ P,EVAL JRST UKILL ;SYMBOL WASN'T DEFINED. KILL UNDEF SYMS. MOVEI T,DELO/200000 ;DELETE OUTPUT TLNE F,CCF ;$$K TYPED? IORI T,DELI/200000 ;YES. DELETE BOTH INPUT AND OUTPUT JUMPG SMB,SKILL ;JUMP IF SORTED SYMBOL TABLE. DPB T,[POINT 2,(R),1] ;LEFT 2 BITS IN SYMBOL JRST RET TAG: JUMPG SMB,SRTAG ;HANDLE TAGS IN SORTED SYMBOL TABLE TLNN F,LTF ;NO LETTERS IS ERROR JRST PNAMES ;GO SAY ERROR (EXCEPT $: COMMAND) TLNE F,FAF ;DEFINE SYMBOLS JRST DEFIN ;A<B: TLNE F,CF ;DEFINE SYMBOL AS OPEN REGISTER JRST SETNAM MOVE W,LLOCO HRRZM W,DEFV DEFIN: PUSHJ P,EVAL ;NEW SYMBOL? JRST DEF1 ;YES. ENTER IT. JRST DEF2 ;NO, REDEFINE DEF1: MOVN R,[XWD 2,2] ;ADD NEW SYMBOL ADDB R,@SYMP ;MOVE UNDEFINED TABLE 2 REGISTERS HRRZ T,ESTU SUBI T,2 HRL T,ESTU HRRM T,ESTU SKIPGE ESTU BLT T,-1(R) DEF2: MOVE T,DEFV MOVEM T,1(R) ;PUT IN NEW VALUE MOVSI T,GLOBAL IORB T,SYM MOVEM T,(R) ;PUT IN NEW SYM AS GLOBAL PUSHJ P,DUNDEF ;DEFINE AN UNDEFINED SYMBOL JRST RET ;$: - LIST NAMES OF PROGRAMS PNAMES: TLNN F,CF ;$: COMMAND? JRST ERR ;NO. NO LETTERS AND : IS ERROR SYMTST PUSHJ P,CRF ;START WITH CRLF MOVE R,@SYMP ;GET POINTER TO SYMS PPNAM1: JUMPGE R,DD1 ;JUMP IF ALL DONE. SKIPE T,(R) ;GET NEXT SYMBOL TLNE T,740000 ;TYPE BITS ARE ALL ZERO? JRST PPNAM2 ;NO PUSHJ P,SPT1 ;PRINT NAME PUSHJ P,CRF PPNAM2: ADD R,[XWD 2,2] ;ADVANCE TO NEXT SYMBOL JRST PPNAM1 ;FIND A PROGRAM NAME TO OPEN AUTOMATICALLY THE FIRST TIME DDT IS ENTERED. GETPGM: SETOM GETFLG ;prevent coming back here. SYMTST JUMPG SMB,SRGPGM ;DIFFERENT IF SORTED TABLE SKIPA R,@SYMP GETPG1: ADD R,[2,,2] ;ADVANCE TO NEXT SYMBOL NAME JUMPGE R,DD2 ;JUMP IF FAILURE. SKIPE T,(R) TLNE T,740000 ;PROGRAM NAME? JRST GETPG1 CAME T,[XTITLE] ;IGNORE OUR OWN PROGRAM NAME. CAMN T,[RADIX50 0,JOBDAT] JRST GETPG1 ;IGNORE THE ONES THAT ARE ALWAYS THERE. PUSHJ P,GETPG2 ;SUBR TO PRINT THE PROGRAM NAME $ : JRST SET2 GETPG2: MOVEM T,SYM PUSHJ P,SPT1 ; TYPE WHICH PROGRAM WE`VE OPENED. MOVEI T,"$" PUSHJ P,TOUT MOVEI T,":" JRST TOUT ;SET PROGRAM NAME NAME$: SETNAM: SYMTST MOVE R,@SYMP SET1: JUMPGE R,UNDEF ;JUMP IF WE'VE RUN OUT. MOVE T,(R) CAMN T,SYM JRST SET2 ;FOUND ONE! ADD R,[XWD 2,2] JRST SET1 ;ADVANCE AND LOOP SET2: MOVEM R,PRGM ;STORE IOWD POINTER TO PROGRAM NAME. SETZM BLOCK ;CLEAR BLOCK NAME SET3: CAMN R,@SYMP ;OFF THE END YET? JRST RET ;YES. SUB R,[XWD 2,2] ;NO. GET NEXT SYMBOL LDB T,[POINT 4,(R),3] JUMPE T,RET ;RETURN WHEN ANOTHER PROGRAM IS SEEN. CAIE T,3 JRST SET3 ;LOOP ON SYMBOLS. MOVE T,(R) ;HERE'S A BLOCK NAME. XOR T,SYM ;SEE IF THE BLOCK NAME MATCHES THE PROGRAM TLZ T,740000 ;TURN OFF MODE BITS JUMPN T,SET3 ;LOOP IF NO MATCH JRST SBPRM ;BLOCK NAME = PROGRAM NAME. ;STORE R AS CURRENT BLOCK POINTER. ;HERE WE HAVE BNAME$& OPEN A BLOCK INSIDE CURRENT PROGRAM ;OR WE MAY HAVE BNAME&SNAME - OPEN BLOCK TEMPORARILY. SETBLK: JUMPG SMB,SBLOCK ;JUMP IF NEW FORMAT SYMBOLS TLNN F,LTF JRST PBLKNS ;NO LETTERS. $& COMMAND PRINTS BLOCK NAMES SKIPL R,PRGM ;PROGRAM OPEN YET? JRST ERR ;NO. ERROR. SYMTST SB1: CAMN R,@SYMP ;DONE LOOKING? JRST UNDEF ;YES. CAN'T FIND ONE. SUB R,[XWD 2,2] ;ADVANCE TO NEXT ONE LDB T,[POINT 4,(R),3] JUMPE T,UNDEF ;IF WE REACH ANOTHER PROGRAM, WE'VE LOST CAIE T,3 JRST SB1 ;IGNORE SYMBOLS OTHER THAN BLOCK NAMES MOVE T,(R) XOR T,SYM TLZ T,740000 JUMPN T,SB1 ;DOESN'T MATCH. TLNE F,CF ;WE HAVE ONE. ALTMODE SEEN? JRST SBPRM ;ALTMODE MOVEM R,TBLK ;SET TEMPORARY BLOCK NAME JRST L1RPR SBPRM: MOVEM R,BLOCK ;SET IOWD POINTER TO BLOCK. JRST RET PBLKNS: TLNN F,CF ;$& JRST ERR ;ERROR SYMTST PUSHJ P,CRF ;START WITH CRLF SKIPGE R,PRGM ;IS THERE A PROGRAM OPEN? CAMN R,@SYMP JRST DD1 ;NO. NOTHING TO TYPE. PBLKN1: SUB R,[2,,2] SKIPN (R) JRST PBLKN2 ;IGNORE ZERO SYMBOL NAMES LDB T,[POINT 4,(R),3] ;GET TYPE BITS JUMPE T,DD1 ;EXIT IF WE SEE ANOTHER PROGRAM NAME CAIE T,3 ;BLOCK NAME SEEN? JRST PBLKN2 ;NO LDB T,[POINT 32,(R),35] ;GET RADIX50 OF BLOCK NAME PUSHJ P,SPT1 ;PRINT NAME PUSHJ P,CRF PBLKN2: CAMN R,@SYMP ;AT END OF SYMBOL TABLE YET? JRST DD1 ;YES. THEN DONE. JRST PBLKN1 ;NO SYMD: MOVEI T,DELO/200000 ;$D - DELETE LAST SYM & PRINT NEW JUMPE SMB,.+2 ;JUMP UNLESS SORTED SYMBOLS PUSHJ P,SSYMD ;SETUP R AND ALWAYS SKIP ONCE HRRZ R,SPSAV ;PICK UP POINTER TO LAST SYM JUMPE R,ERR ;NO LAST SYMBOL DPB T,[POINT 2,(R),1] ;STORE SEMI-DELETE BITS IN SYMBOL MOVEI T,11 PUSHJ P,TOUT MOVE T,LWT ;GET VALUE PART PUSHJ P,CONSYM ;PRINT OUT NEXT BEST SYMBOL JRST RET ; LOOK - VALUE TO SYMBOL ; SYMBOL TYPE BITS ; 40 - DELETE OUTPUT ; 20 - DELETE INPUT ; 14 - BLOCK TYPE ; 10 - LOCAL ; 04 - GLOBAL ; 00 - PROGRAM NAME REPEAT 0,< LOOK: SKIPL R,PRGM ;LOOK UP SYMBOL MOVE R,@SYMP HLRE S,@SYMP ASH S,-1 ;SETUP COUNT FOR LENGTH OF SYM TABLE TLZ F,400000 HRLZI W2,DELO+DELI MOVEM T,TEMDDT LOOK1: TDNE W2,(R) JRST LOOK3 MOVE T,(R) TLNN T,PNAME ;NAME TLOA W2,LOCAL SKIPA T,TEMDDT JRST LOOK3 MOVE W,1(R) XOR W,T JUMPL W,LOOK3 SUB T,1(R) JUMPL T,LOOK3 JUMPGE F,LOOK2 MOVE W,1(R) SUB W,1(W1) JUMPLE W,LOOK3 LOOK2: HRR W1,R ;POINTER BEST VALUE SO FAR TLO F,400000 JUMPE T,SPT0 LOOK3: ADD R,[XWD 2,2] SKIPL R MOVE R, @SYMP AOJLE S,LOOK1 ;TERMINATING CONDITION MOVE T,TEMDDT TLNE F,400000 SUB T,1(W1) JRST CPOPJ1 > ;ENTER HERE WITH T CONTAINING A VALUE FOR WHICH A SYMBOL IS SOUGHT. ;IF A SYMBOL THAT MATCHES THE VALUE T EXACTLY IS FOUND, IT'S NAME WILL ;BE PRINTED AND THE DIRECT RETURN TAKEN. IF NO EXACT MATCH IS FOUND, ;THE CLOSEST SYMBOL WHOSE VALUE HAS THE SAME SIGN AS C(T) AND IS SMALLER ;THAN C(T) WILL BE POINTED TO BY W1 AND THE SKIP RETURN TAKEN. ;IF NO MATCH AT ALL IS FOUND, DOUBLE SKIP RETURN. LOOK: SETZM SVFB ;POINTER TO BLOCK WHERE MATCH WAS FOUND SETZM SVTB ;POINTER TO CURRENT BLOCK. SETZM BLVL ;BLOCK LEVEL SYMTST JUMPG SMB,SLOOK ;JUMP IF USING SORTED SYMBOL TABLE HLRE S,@SYMP ;-WC OF SYMBOL TABLE ASH S,-1 ;-NUMBER OF SYMBOLS TLZ F,600000 MOVEM F,SVF ;INITIALZE SVF (USED FOR AVAILABLE SYMBOLS) MOVSI W2,DELO+DELI ;IGNORE SYMBOLS WITH THESE BITS SET MOVEM T,TEMDDT ;SAVE ARGUMENT SKIPL R,PRGM ;IS THERE SOME PROGRAM OPEN? JRST TOPDWD ;NO - SEARCH ENTIRE TABLE. LOOK1: SUB R,[XWD 2,2] ;BACKUP TO NEXT SYMBOL (SKIPS PROGRAM NAME) TDNE W2,(R) ;IS SYMBOL SUPPRESSED? JRST LOOK3 ;YES. LOOK FOR ANOTHER SYMBOL. LDB T,[POINT 4,(R),3] ;GET TYPE BITS CAIN T,3 ;TYPE 14 IS A BLOCK NAME JRST BLNME JUMPE T,PNAM ;TYPE 0 IS A PROGRAM NAME MOVE T,TEMDDT ;GET ARGUMENT (VALUE SOUGHT) MOVE W,1(R) ;GET VALUE PART OF THIS SYMBOL XOR W,T JUMPL W,LOOK3 ;SIGN BITS DIFFER - THIS MATCH IS NO GOOD SUB T,1(R) ;COMPUTE THE DIFFERENCE JUMPL T,LOOK3 ;JUMP IF SYMBOL IS TOO BIG JUMPGE F,LOOK2 ;JUMP IF NO PREVIOUS "GOOD" MATCH MOVE W,1(R) ;GET VALUE AGAIN SUB W,1(W1) ;COMPARE WITH PREVIOUS GOOD MATCH JUMPLE W,LOOK3 ;JUMP IF PREVIOUS GOOD MATCH WAS BETTER THAN THIS LOOK2: HRR W1,R ;A "BETTER" MATCH HAS BEEN FOUND. TLO F,400000 ;FLAG THAT A MATCH EXISTS TLNE F,200000 ;IN THE CURRENTLY OPEN BLOCK OR IN A SUPERIOR? JRST LOOK2A ;YES. DON'T BOTHER REMEMBERING A BLOCK NAME MOVE W,SVTB MOVEM W,SVFB ;POINTER TO BLOCK WHERE WE FOUND THIS SYMBOL LOOK2A: TLNE W2,LOCAL ;ARE WE SEEKING GLOBALS ONLY? SETZM SVFB ;YES. THEN WHAT WE FOUND HAS NO BLOCK NAME JUMPE T,LOOK4 ;JUMP IF EXACT MATCH LOOK3: CAMN R,@SYMP ;AT END OF TABLE YET? JRST TOPDWN ;YES. - SEARCH UNOPENED PROGRAMS NOW. LOOK3A: AOJLE S,LOOK1 ;WHILE WORDS ARE LEFT IN SYMTAB, LOOP. MOVE T,TEMDDT ;GET ARGUMENT JUMPGE F,CPOPJ2 ;JUMP IF NO MATCH SUB T,1(W1) ;CALCULATE THE DIFFERENCE JUMPE T,SPT0 ;IT WAS EXACT MATCH. PRINT IT AND RETURN. JRST CPOPJ1 ;SINGLE SKIP RETURN - INEXACT MATCH TOPDWD: TLO W2,LOCAL ;NO PROGRAM OPEN. MATCH ONLY GLOBALS TOPDWN: HLRE R,@SYMP ;- WC OF SYMBOL TABLE. MOVNS R ;+WC ADD R,@SYMP ;FOR -WC,,LAST ADDRESS+1 JRST LOOK3A ;NOTE THAT THE COUNT S, PREVENTS US FROM RESCANNING AREAS WE'VE SEEN BEFORE ;HERE WHEN A BLOCK NAME IS SEEN. BLNME: MOVEM R,SVTB ;SAVE ADDRESS OF THE BLOCK NAME WE'VE SEEN MOVE T,1(R) ;BLOCK LEVEL CAMN R,BLOCK ;IS THIS THE CURRENTLY OPEN BLOCK? JRST BLNM1 ;YES. SET BLVL OF OPEN BLOCK CAML T,BLVL ;IS THIS A SUPERIOR OF CURRENT BLOCK? JRST BLNM2 ;NO. NOT A SUPERIOR OF CURRENT BLOCK BLNM1: MOVEM T,BLVL ;STORE CURRENT BLOCK LEVEL TLOE F,200000 ;WE ARE COMING INTO AN AVAILABLE BLOCK. SET FLAG JRST LOOK3 ;WE WERE ALREADY IN AN AVAILABLE BLOCK. EXCH F,SVF ;USE ALTERNATE VERSIONS OF F,W1 EXCH W1,SW1 JRST LOOK3 ;ENTERING A BLOCK NOT AVAILABLE TO CURRENTLY OPEN BLOCK BLNM2: TLZN F,200000 ;WERE WE IN AN AVAILABLE BLOCK? JRST LOOK3 ;NO. EXCH F,SVF ;YES, PUT F AND W1 BACK WHERE WE CAN FIND THEM EXCH W1,SW1 ; WHEN WE ENTER ANOTHER AVAILABLE BLOCK. JRST LOOK3 ;HERE IF WE SEE A PROGRAM NAME. THIS MEANS THAT WE HAVEN'T FOUND AN EXACT ;MATCH IN THE CURRENTLY OPENED PROGRAM. ANY FURTHER MATCHES CAN ONLY BE ;GLOBALS. PNAM: TLO W2,LOCAL ;SET MASK TO SELECT GLOBALS ONLY. TLNN F,200000 ;WERE WE INSIDE AN AVAILABLE BLOCK? JRST LOOK3 ;NO. JUMPGE F,LOOK5 ;JUMP IF NO "GOOD" MATCHS FROM AVAILABLE BLOCKS MOVE F,SVF ;GET FLAGS FROM UNAVAILABLE BLOCKS JUMPGE F,PNAM2 ;JUMP IF NO "GOOD" MATCHES FROM UNAVAILABLE BLOCKS MOVE T,1(W1) ;GET VALUE OF MATCH FROM AVAILABLE BLOCKS. EXCH W1,SW1 ;GET POINTER FROM UNAVAILABLE BLOCK CAMGE T,1(W1) ;WHICH IS BETTER? (LARGEST IS BEST) JRST LOOK5A ;SYMBOL FROM UNAVAILABLE BLOCK IS BETTER MOVE W1,SW1 ;RE EXCHANGE, W1_POINTER TO BEST VALUE PNAM2: SETZM SVFB ;NOT IN ANY BLOCK NOW TLO F,400000 ;FLAG WE HAVE A GOOD VALUE TLZ F,200000 ;WE ARE NOT IN AN AVAILABLE BLOCK JRST LOOK3 LOOK4: TLZN F,200000 ;EXACT MATCH. ARE WE IN AN AVAILABLE BLOCK? JRST LOOK3 ;NO. KEEP LOOKING SETZM SVFB ;CLEAR SAVED BLOCK NAME. JRST SPT0 ;GO PRINT SOMETHING ;NO GOOD MATCHES FROM AVAILABLE BLOCKS LOOK5: EXCH F,SVF ;RESTORE F, W1 EXCH W1,SW1 LOOK5A: MOVE T,1(W1) ;SYMBOL FROM UNAVAILABLE BLOCK IS BETTER CAMN T,TEMDDT JRST SPT0 ;EXACT MATCH - PRINT IT. TLZ F,200000 ;NO LONGER INSIDE AN AVAILABLE BLOCK JRST LOOK3 ;RADIX 50 SYMBOL PRINT SPT0: HRRZM W1,SPSAV ;SAVE POINTER TO TYPED SYM SPT: MOVE T,SVFB ;GET BLOCK NUMBER JUMPE T,SPT1W ;NONE THERE CAMN T,BLOCK ;SAME BLOCK AS THE ONE THAT'S OPEN? JRST SPT1W ;YES. DON'T TYPE BLOCK NAME PUSH P,W1 ;SAVE.. JUMPE SMB,SPT1X ;JUMP IF OLD FORMAT SYMBOLS ADD T,1(SMB) ;POINTER TO BLOCK NAMES ADDI T,(SMB) SPT1X: LDB T,[POINT 32,(T),35] ;GET BLOCK NAME (AND NO TYPE BITS) PUSHJ P,SPT1 ;TYPE IT. MOVEI T,"&" PUSHJ P,TOUT ;TYPE AMPERSAND POP P,W1 SPT1W: LDB T,[POINT 32,(W1),35] ;GET SYMBOL (NO TYPE BITS) SPT1: IDIVI T,50 HRLM W1,0(P) JUMPE T,SPT2 PUSHJ P,SPT1 SPT2: HLRZ T,0(P) JUMPE T,CPOPJ ;FLUSH NULL CHARACTERS ADDI T,260-1 CAILE T,271 ADDI T,301-272 CAILE T,332 SUBI T,334-244 CAIN T,243 SPT3: MOVEI T,256 JRST TOUT ; EVAL - SYMBOL TO VALUE ;GIVEN A SYMBOL NAME IN SYM, RETURN ITS VALUE IN T AND ITS POINTER IN R AND SKIP. ;DIRECT RETURN IF SYMBOL UNDEFINED (IN CURRENT BLOCK AND ITS SUPERIORS) ;THIS IS THE WFW BLOCK STRUCTURE PATCH EVAL: SYMTST MOVSI W1,DELI ;DON'T MATCH KILLED SYMBOLS JUMPG SMB,SEVAL ;USE SPECIAL EVAL IF SORTED. HLRE S,@SYMP ASH S,-1 ;- NUMBER OF SYMBOLS IN TABLE SKIPL R,TBLK ;TBLK IS SET BY FOO& (I.E., TEMPORARY BLOCK NAME) JRST EVL1 ;NO TEMP. BLOCK NAME SET SETZM TBLK ;USE TEMP BLOCK NAME ONLY ONCE EVL2: MOVE T,1(R) MOVEM T,BLVL JRST EV1 EVL1: SKIPGE R,BLOCK ;IS THERE AN OPEN BLOCK? JRST EVL2 ;YES. USE IT. MOVEI T,1 ;NO BLOCK OPEN. MOVEM T,BLVL ;SET BLOCK LEVEL TO 1 SKIPGE R,PRGM ;IS THERE A PROGRAM OPEN? JRST EV1 ;YES. USE IT EV4: HLRE R,@SYMP MOVNS R ADD R,@SYMP ;R _ -WC,,LAST ADDRESS+2 - USE ENTIRE SYMBOL TABLE JRST EV1 ;(BUT ONLY MATCH GLOBALS SINCE FIRST THING WE'LL ; SEE IS A PROGRAM NAME) EV3: CAMN R,@SYMP ;AT THE END OF PASS1? AOJL S,EV4 ;YES. INITIATE PASS2 (SCAN REMAINDER) AOJGE S,CPOPJ EV1: SUB R,[XWD 2,2] ;ADVANCE MOVE T,(R) ;GET SYMBOL NAME TDNE T,W1 ;FLUSHABLE? JRST EV3 ;YES. GET NEXT LDB T,[POINT 4,(R),3] ;GET TYPE BITS CAIN T,3 ;BLOCK? SOJA S,EV2 ;YES. (BUGGER S, WILL BE UNBUGGERED LATER) SKIPN T ;PROGRAM NAME TLOA W1,LOCAL ;YES. SET TO MATCH ONLY GLOBALS NOW SKIPA T,(R) ;ORDINARY SYMBOL. GET ITS VALUE JRST EV3 ;(FOR PROGRAMS, LOOP TO NEXT SYMBOL) XOR T,SYM ;MATCH RADIX50 STUFF TLZ T,740000 ;FLUSH TYPE BITS JUMPN T,EV3 ;JUMP IF NO MATCH MOVE T,1(R) ;RETURN VALUE IN T JRST CPOPJ1 EV2B: SUB R,[2,,2] ;ADVANCE UNTIL WE GET ANOTHER BLOCK NAME LDB T,[POINT 4,(R),3] CAIE T,3 AOJA S,EV2B ;LOOP UNTIL A BLOCK NAME IS SEEN EV2: MOVE T,1(R) ;HERE FOR A BLOCK NAME. GET ITS LEVEL CAML T,BLVL ;DOES IT SURROUND THE BLOCK WE'RE IN? AOJA S,EV2B ;NO. THIS IS NOT AN AVAILABLE BLOCK! MOVEM T,BLVL ;STORE BLOCK LEVEL OF SURROUNDING BLOCK AOJA S,EV3 ;SCAN MORE. BEGIN SYMSRT  SUBTTL DDT - SORTED SYMBOL TABLE MANIPULATIONS GLOBAL F,P,R,S,T,W,W1,W2,SMB LASSYM: 0 S.SYM: BLOCK 3 X.SYM: BLOCK 3 UNIQ: 0 UNIQP: 0 SYMRNG: 0 TXCT: 0 FFETCH: 0 FNDHI: 0 FNDLO: 0 C3FLG: 0 ;SET FOR CLASS3 SYMBOLS IN FNDSYM. ;INITIALIZE PRGM AND BLOCK IF NEEDED. ^SSCHK: SETOM TBLK SKIPGE T,PRGM ;IS PRGM SET NON-NEGATIVE? JRST SSCHK1 ;NO. INITIALIZE BOTH SKIPL BLOCK ;BLOCK NEGATIVE? CAMGE T,BLOCK ;NO. THEN BLOCK MUST BE LARGER THAN PRGM SKIPA R,T ;SO FAR, OK. JRST SSCHK1 ;SOMETHINGS SCREWED UP. ADD T,1(SMB) ADDI T,(SMB) MOVE T,(T) TLNE T,740000 ;SKIP IF THIS IS A PROGRAM NAME. JRST SSCHK1 ;LOSE. SKIPGE T,BLOCK ;IS THERE A BLOCK NAME? JRST SSCHK2 ;NO. THEN WE'RE DONE ADD T,2(SMB) ADDI T,(SMB) HLRZ T,(T) ;GET POINTER TO THIS BLOCK'S PROGRAM CAME T,PRGM ;BLOCK SHOULD POINT TO PROGRAM PUSHJ P,SPRG3 ;AND IT DOESN'T. REFRESH IT. JRST SSCHK2 SSCHK1: SETOM PRGM ;INITIALIZE PRGM AND BLOCK POINTER SETOM BLOCK ;(ZEROS ARE LEGAL VALUES) SSCHK2: HRRZ R,5(SMB) ;POINTER TO CLASS1 HRRZ S,11(SMB) ;POINTER TO END OF CLASS4 SUBM R,S ;-NUMBER OF WORDS OF SYMBOL-VALUE PAIRS HRL R,S ADDI R,(SMB) ;-COUNT,,ABSOLUTE ADDRESS OF FIRST MOVEM R,SYMRNG ;SAVE IT FOR SEVAL POPJ P, ;HERE WHEN : SEEN. ^SRTAG: TLNN F,LTF ;NO LETTERS IS ERROR JRST SPNAME ;GO SAY ERROR (EXCEPT $: COMMAND) TLNE F,FAF ;DEFINE SYMBOLS JRST SRDEF ;A<B: TLNE F,CF ;ALTMODE? JRST SPROG ;YES. OPEN PROGRAM'S SYMBOLS MOVE W,LLOCO ;DEFINE SYMBOL AS OPEN REGISTER HRRZM W,DEFV SRDEF: PUSHJ P,EVAL ;EVALUATE THE SYMBOL THAT WAS NAMED. JRST SRDEF1 ;NEW SYMBOL PUSHJ P,SYMDEL ;REDEFINITION. DELETE OLD. SRDEF1: PUSHJ P,SYMINS ;NOW, INSERT THE NEW DEININTION. MOVSI T,GLOBAL IORM T,SYM ;FIXUP SYM TO BE GLOBAL FOR DUNDEF. PUSHJ P,DUNDEF ;USE NEW DEFINITION TO FIX UNDEFINED SYMS JRST RET ;PRINT PROGRAM NAMES. SPNAME: TLNN F,CF ;$: COMMAND? JRST ERR ;NO. NO LETTERS AND : IS ERROR SPROG: SYMTST ;ENTER HERE WITH LTF SET. HRRZ W1,1(SMB) ;POINTER TO BLOCK NAMES AREA ADDI W1,(SMB) ;DIRECT POINTER TO BN HRRZ W2,2(SMB) ;POINTER TO BLOCK STRUCTURE AREA ADDI W2,(SMB) ;DIRECT POINTER TO BS MOVSI R,W1 ;POINTER TO BN MOVSI S,W2 ;POINTER TO BS TLNE F,LTF ;ARGUMENT GIVEN TO $: COMMAND? JRST SPRG0 ;YES. (NAME$: SEEN) PUSHJ P,CRF ;START WITH CRLF CAMG W2,W1 JRST DD1 ;NO BLOCK ? SPNAM1: MOVE T,@R ;GET A BLOCK NAME PUSH P,W1 PUSHJ P,SPT1 PUSHJ P,CRF POP P,W1 SKIPN T,@S ;GET LINK FORWARD TO NEXT BLOCK JRST DD1 ;DONE. HLR R,T HLR S,T JRST SPNAM1 ;LOOP ;SET PROGRAM NAME SPRG0: CAMG W2,W1 JRST UNDEF ;NO BLOCK NAMES? SPRG1: MOVE T,@R ;GET A BLOCK NAME CAMN T,SYM ;MATCHES? JRST SPRG2 ;YES! SKIPN T,@S ;GET LINK FORWARD TO NEXT BLOCK JRST UNDEF ;UNDEFINED HLR R,T HLR S,T JRST SPRG1 ;LOOP SPRG2: HRRZM R,PRGM ;SAVE PROGRAM NAME. (A NUMBER) PUSHJ P,SPRG3 ;SETUP INITIAL BLOCK NAME JRST RET ;ROUTINE TO SETUP INITIAL BLOCK FROM OPEN PROGRAM. CALLED FROM SPRG2 AND SSCHK SPRG3: HRL R,R ;PROGRAM NUMBER IN BOTH HALVES SETOM BLOCK ;INITIALLY NO BLOCK NAME SKIPN T,@S ;GET LINK TO NEXT PROGRAM NAME JRST SPRG4 ;THERE IS NO NEXT (GET THE LAST!) HLR S,T SUBI S,1 CAMN R,@S ;IS THIS THE WORD WE WANT? HRRZM S,BLOCK ;YES. POPJ P, SPRG4: SUBM W2,W1 ;CALCULATE LAST ADDRESS HRRI S,-1(W1) CAME R,@S POPJ P, HRRZ S,S CAMLE S,PRGM MOVEM S,BLOCK POPJ P, ;AUTOMATICALLY OPEN SYMBOL TABLE FOR SOME PROGRAM WHEN DDT IS FIRST STARTED ^SRGPGM:HRRZ W1,1(SMB) ;POINTER TO BLOCK NAMES AREA ADDI W1,(SMB) ;DIRECT POINTER TO BN HRRZ W2,2(SMB) ;POINTER TO BLOCK STRUCTURE AREA ADDI W2,(SMB) ;DIRECT POINTER TO BS MOVSI R,W1 ;POINTER TO BN MOVSI S,W2 ;POINTER TO BS CAMG W2,W1 JRST DD1 ;NO BLOCK NAMES? SRGPG1: MOVE T,@R ;GET A BLOCK NAME CAME T,[XTITLE] ;IGNORE OUR OWN PROGRAM NAME. CAMN T,[RADIX50 0,JOBDAT] JRST .+2 JRST SRGPG2 ;GOT A GOOD ONE. SKIPN T,@S ;GET LINK FORWARD TO NEXT BLOCK JRST DD1 ;DONE. DIDN'T GET ANY WE LIKED. HLR R,T HLR S,T JRST SRGPG1 ;LOOP SRGPG2: PUSHJ P,GETPG2 ;STORE T IN SYM. PRINT NAME$: TLO F,LTF ;SET FLAG FOR SPROG JRST SPROG ;SIMULATE NAME$: ;SET BLOCK NAME & SEEN (EITHER BNAME$&, BNAME&SNAME, OR $& COMMANDS) ^SBLOCK:SKIPGE PRGM JRST ERR ;ERROR IF NO PROGRAM OPEN SYMTST HRRZ W1,1(SMB) ;POINTER TO BLOCK NAMES AREA ADDI W1,1(SMB) ;POINTER TO BN+1 ADD W1,PRGM ;POINTER TO THE PROGRAM NAME +1 HRRZ W2,2(SMB) ;POINTER TO BS AREA ADDI W2,(SMB) ;DIRECT POINTER TO IT. TLNN F,LTF ;LETTER SEEN? JRST SPBNS ;NO. $& COMMAND PRINTS BLOCK NAMES SBLK1: CAMG W2,W1 ;WHEN WE GET TO THE END JRST UNDEF ;IT'S TIME TO QUIT MOVE T,(W1) ;GET RADIX50 TLZN T,740000 ;SHOULD HAVE SOME TYPE BITS ON FOR A BNAME JRST UNDEF ;THIS MUST BE THE NEXT PROGRAM NAME XOR T,SYM ;COMPARE WITH SYMBOL GIVEN JUMPE T,SBLK2 ;JUMP IF WE'VE GOT ONE! AOJA W1,SBLK1 SBLK2: SUBI W1,(SMB) SUB W1,1(SMB) TLNN F,CF ;WAS ALTMODE SEEN? JRST SBLK3 ;NO. SET TEMPORARY BLOCK NAME HRRZM W1,BLOCK JRST RET SBLK3: HRRZM W1,TBLK ;SET TEMPORARY BLOCK NAME JRST L1RPR ;PRINT BLOCK NAMES SPBNS: TLNN F,CF ;$& JRST ERR ;ERROR PUSHJ P,CRF ;START WITH CRLF SPBNS1: CAMG W2,W1 ;WHEN WE GET TO THE END JRST DD1 ;IT'S TIME TO QUIT MOVE T,(W1) ;GET RADIX50 TLZN T,740000 ;SHOULD HAVE SOME TYPE BITS ON FOR A BNAME JRST DD1 ;THIS MUST BE THE NEXT PROGRAM NAME PUSH P,W1 PUSHJ P,SPT1 PUSHJ P,CRF POP P,W1 AOJA W1,SPBNS1 ; SKILL SSYMD SYMDEL SYMINS ^SKILL: MOVE R,LASSYM ;$K AND $$K COMMANDS. DPB T,[POINT 2,(R),1] ;LEFT 2 BITS IN SYMBOL TLNE F,CCF ;WAS IT $$K ? PUSHJ P,SYMDEL ;YES. EXPUNGE THE DEFINITION. JRST RET ;SUBROUTINE FOR $D COMMAND ^SSYMD: HRRZ R,S.SYM+2 ;HERE'S WHERE SEVAL PUT IT. JRST CPOPJ1 ;DELETE A SYMBOL. ENTER HERE WITH R=POINTER TO SYMBOL. SYMDEL: PUSHJ P,GCLASS ;T_CLASS NUMBER (1 TO 4) CAIE T,4 ;CLASS 4 IS HARDER. JRST SYMDL2 ;NOT CLASS 4. MOVEI W,@1(R) ;GET POINTER TO FULLV SPACE. HRLI W,1(W) ;SOURCE,,DEST. OF DOWNWARDS BLT. SOS S,4(SMB) ;DECREMENT FIRST FREE POINTER. ADDI S,(SMB) ;ABSOLUTE POINTER TO FIRST FREE. CAILE S,(W) ;SKIP BLT IF UNNECESSARY. (LAST C4 SYM) BLT W,-1(S) ;MOVE SOME FULLVS DOWN. SETZM (S) ;ZERO A NEW WORD OF FREE SPACE. MOVE S,11(SMB) ADDI S,-2(SMB) ;POINTER TO LAST CLASS4 SYMBOL SYMDL1: CAML R,S ;ABOVE THE DELETED SYMBOL? JRST SYMDL2 ;NO. EVERYTHING'S BEEN FIXED. SOS 1(S) ;ADJUST A POINTER TO FULLV SPACE. SUBI S,2 JRST SYMDL1 ;LOOP THRU C4 SYMBOLS ABOVE DELETED SYM. SYMDL2: MOVE S,5(SMB) ;POINTER TO FIRST C1 SYMBOL. ADDI S,(SMB) ;ABS. POINTER TO FIRST C1 SYMBOL. MOVEI W,(R) SUBI W,(S) ;CALCULATE NUMBER OF WORDS TO MOVE. MOVSI S,377777(W) ;CONTROL COUNT IN LH. HRRI S,-1(R) ;LAST SOURCE WORD IN RH. JUMPLE W,SYMDL3 ;JUMP IF THERE'S NOTHING TO MOVE. POP S,2(S) ;MOVE STUFF UPWARDS JUMPL S,.-1 ;LOOP SYMDL3: SETZM 2(S) ;CLEAR TWO WORDS THAT WERE VACATED. SETZM 1(S) MOVEI S,2 ;ADJUST CLASS POINTERS. MOVEI R,5(SMB) ;C1 POINTER. SYMDL4: ADDM S,(R) ;ADJUST CLASS POINTER. ADDI R,1 ;ADVANCE TO NEXT CLASS. SOJG T,SYMDL4 ;DECREMENT COUNT. LOOP UNTIL DONE. MOVE S,[2,,2] ADDM S,SYMRNG ;ADJUST SYMRNG TO ACCOUNT FOR FEWER SYMS. POPJ P, ;INSERT SYMBOL. THE SYMBOL NAME IS IN SYM, VALUE IN DEFV. SYMINS: MOVE T,DEFV ;GET THE VALUE PUSHJ P,CCLASS ;GET THE CORRESPONDING CLASS NUMBER. MOVEI T,2 ;ASSUME WE NEED TWO WORDS FOR STORAGE. CAIN R,4 ;CLASS4? MOVEI T,3 ;FOR CLASS4 WE NEED THREE WORDS. MOVE S,5(SMB) ;FIRST CLASS1 ADDRESS. SUB S,4(SMB) ;FIRST FREE SPACE ADDRESS. CAIGE S,(T) ;ENOUGH SPACE LEFT FOR DEFINITION? JRST ERR ;NO ROOM. JRST @.(R) ;SET UP FOR DIFFERENT CLASSES. SYMI1 SYMI2 SYMI3 SYMI4 SYMI3: MOVE R,7(SMB) MOVE S,10(SMB) MOVE T,DEFV HLRZM T,TEMDDT JRST SYMI1B SYMI2: MOVE R,6(SMB) MOVE S,7(SMB) JRST SYMI1A SYMI1: MOVE R,5(SMB) MOVE S,6(SMB) SYMI1A: MOVE T,DEFV MOVEM T,TEMDDT SYMI1B: ADDI R,(SMB) ADDI S,(SMB) SYMI1C: CAIG S,(R) ;STILL ROOM LEFT? JRST SYMI1D ;R POINTS TO FIRST LARGER SYMBOL HRRZ W1,1(R) ;FETCH DATA CAML W1,TEMDDT ;FOUND THE RIGHT PLACE YET? JRST SYMI1D ;YES. R POINTS TO LARGER SYMBOL ADDI R,2 JRST SYMI1C SYMI1D: MOVE S,5(SMB) ;ALL SYMBOLS BELOW R MUST MOVE DOWN. ADDI S,(SMB) CAIL S,(R) JRST SYMI1E ;JUMP IF NO BLT NEEDED. HRLI S,-2(S) MOVS S,S BLT S,-3(R) SYMI1E: MOVE S,SYM TLO S,GLOBAL MOVEM S,-2(R) MOVE S,TEMDDT HRRZM S,-1(R) SKIPG S,BLOCK ;IS BLOCK SET? SKIPL S,PRGM ;NO. USE PRGM IF SET. DPB S,[POINT 13,-1(R),12] ;STUFF BLOCK CODE INTO SYMBOL. MOVE T,DEFV ;GET THE VALUE PUSHJ P,CCLASS ;GET THE CORRESPONDING CLASS NUMBER. SYMI5F: MOVNI S,2 MOVEI T,5(SMB) SYMI1F: ADDM S,(T) ADDI T,1 SOJG R,SYMI1F ;LOOP ADJUSTING CLASS ORIGINS MOVN S,[2,,2] ADDM S,SYMRNG ;UPDATE AOBJN POINTER FOR SEVAL. POPJ P, SYMI4: MOVE R,10(SMB) ;CLASS4 MOVE S,11(SMB) MOVE T,DEFV MOVEM T,TEMDDT ADDI R,(SMB) ADDI S,(SMB) SYMI4C: CAIG S,(R) ;STILL ROOM LEFT? JRST SYMI4D ;R POINTS TO FIRST LARGER SYMBOL MOVE W1,@1(R) ;FETCH DATA CAML W1,TEMDDT ;FOUND THE RIGHT PLACE YET? JRST SYMI4D ;YES. R POINTS TO LARGER SYMBOL ADDI R,2 JRST SYMI4C SYMI4D: MOVE S,5(SMB) ;ALL SYMBOLS BELOW R MUST MOVE DOWN. ADDI S,(SMB) CAIL S,(R) JRST SYMI4E ;JUMP IF NO BLT NEEDED. HRLI S,-2(S) MOVS S,S BLT S,-3(R) SYMI4E: MOVE S,SYM TLO S,GLOBAL MOVEM S,-2(R) AOS S,4(SMB) ;INCREMENT FREE POINTER ADDI S,(SMB) ;GOBBLE A FREE LOCATION. MOVE T,11(SMB) ;POINTER TO END OF EVERYTHING ADDI T,-2(SMB) ;POINTER TO VERY LAST SYMBOL. SYMI5A: CAIGE T,(R) ;IS THIS A BIG SYMBOL? JRST SYMI5B ;NO. AOS 1(T) ;INCREMENT POINTER TO FREE SPACE MOVE W1,-1(S) ;MOVE A FULLWORD VALUE UP. MOVEM W1,(S) SUBI T,2 ;DECREMENT SYMBOL POINTERS SOJA S,SYMI5A ; SYMI5B: MOVE T,TEMDDT ;GET DATA MOVEM T,(S) ;STUFF IT. SUBI S,(SMB) ;CONVERT TO RELATIVE. HRLI S,SMB ;SETUP INDEX FIELD SKIPG T,BLOCK ;IS BLOCK SET? SKIPL T,PRGM ;NO. USE PRGM IF SET. DPB T,[POINT 13,S,12] ;STUFF BLOCK CODE INTO SYMBOL. MOVEM S,-1(R) ;STUFF IN TABLE MOVEI R,4 ;CLASS 4 JRST SYMI5F ;FINISH IT. ; SEVAL CONVERT SYMBOLIC NAME TO VALUE ;GIVEN SYMBOL NAME IN SYM. ;DIRECT RETURN IF UNKNOWN, PRINTING "M" IF AMBIGUOUS (MULTIPLE). ;SKIP RETURN WITH R=DIRECT POINTER TO RADIX50, T= VALUE. ^SEVAL: PUSH P,BLOCK SKIPLE T,TBLK ;ANY TEMP BLOCK SET? MOVEM T,BLOCK ;YES. USE IT. SETOM TBLK ;BUT ONLY ONCE SKIPGE R,SYMRNG PUSHJ P,SEVAL0 CAIA AOS -1(P) POP P,BLOCK POPJ P, ;ENTER HERE WITH R SETUP TO BE AOBJN POINTER TO SYMBOL PAIRS SEVAL0: SETZM UNIQ ;POINTER TO A GLOBAL OR UNAVAILABLE LOCAL. SETZM UNIQP ;POINTER TO BEST THING IN THE NEST SO FAR TLZ F,600000 ;INITIALIZE SOME FLAGS SEVAL1: MOVE W2,(R) ;GET RADIX50 OF A SYMBOL TDNE W2,W1 ;SKIP UNLESS A REJECTED TYPE JRST SEVAL2 ;GET NEXT XOR W2,SYM TLZ W2,740000 ;MASK OFF TYPE BITS JUMPN W2,SEVAL2 ;REJECT IF DIFFERENT MOVE W2,(R) ;GET SYMBOL AGAIN. TLNE W2,040000 ;GLOBAL? JRST SEVL1A ;YES. IT'S GLOBAL. SAVE POINTER TO IT. LDB W2,[POINT 13,1(R),12] ;GET THE BLOCK NUMBER CAME W2,PRGM ;SAME AS CURRENT PROGRAM? CAMN W2,BLOCK ;OR SAME AS CURRENT BLOCK? JRST SEVAL4 ;YES. THIS IS THE VERY BEST. PUSHJ P,WCHBLK ;SEE IF W2 IS IN PRESENT BLOCK NEST. JRST SEVL1B ;NO. WRONG NEST OR WRONG PROGRAM! SKIPG T,UNIQP ;WAS ANYTHING YET FOUND IN THE OPEN NEST? JRST SEVL1C ;NO. WE NOW HAVE SOMETHING. LDB T,[POINT 13,1(T),12] ;YES. GET BLOCK NUMBER OF PREVIOUS THING LDB W2,[POINT 13,1(R),12] ;AND BN OF THIS ONE CAML T,W2 ;SKIP IF PREVIOUS B. CONATAINED IN THIS B. SEVL1C: HRRZM R,UNIQP ;NEW ONE IS BETTER. W2 .LT. T JRST SEVAL2 SEVL1B: SKIPGE UNIQ ;IS THIS SET WITH A GLOBAL ALREADY? JRST SEVAL2 ;YES. A GLOBAL IS A BETTER MATCH. SKIPE UNIQ ;IS THIS SET WITH SOME UNAVAILABLE LOCAL TLOA F,400000 ;YES. THAT MEANS WE HAVE AT LEAST TWO HRRZM R,UNIQ ;SAVE FIRST UNAVAILABLE LOCAL. JRST SEVAL2 SEVL1A: HRROM R,UNIQ ;SAVE GLOBAL AS GLOBAL. SEVAL2: ADD R,[2,,2] JUMPL R,SEVAL1 SKIPG R,UNIQP ;SKIP IF SYMBOL FOUND IN CURRENT NEST. SKIPGE R,UNIQ ;NOT IN CURRENT NEST. SKIP IF NOT GLOBAL JRST SEVAL4 ;GOOD MATCH! JUMPL F,SEVAL3 ;JUMP IF AMBIGUOUS OUTSIDE OF NEST JUMPN R,SEVAL4 ;JUMP IF UNAMBIGOUS MATCH OUTSIDE NEST. POPJ P, ;NOBODY HOME. SEVAL3: MOVEI T,"M" ;MULTIPLY DEFINED OUTSIDE OF NEST. JRST TOUT ;"M" FOR MULTIPLE. CALLER MAY TYPE "U" ? SEVAL4: HRRZ R,R HRRZM R,LASSYM ;SAVE ABSOLUTE POINTER TO SYMBOL PUSHJ P,REVAL ;T_ VALUE FROM POINTER IN R. JRST CPOPJ1 ;WCHBLK - CALL WITH W2 CONTAINING A BLOCK NUMBER. SKIP RETURN IF ;W2 BELONGS TO CURRENTLY OPEN BLOCK NEST. DIRECT RETURN OTHERWISE. ;CLOBBERS T. WCHBLK: SKIPGE PRGM ;IS THERE A PROGRAM OPEN? POPJ P, ;NO. THERE'S NOTHING IN CURRENT NEST! SKIPL T,BLOCK ;IS THERE A BLOCK OPEN? JRST WCHBL1 ;YES. FOLLOW IT UP THE TREE. CAMN W2,PRGM ;NO BLOCK = NON-BS PRGM. AOS (P) ;W2 MATCHES OPEN PRGM. POPJ P, WCHBL1: CAMN T,W2 ;BLOCK INDICES MATCH? JRST CPOPJ1 ;YES. CAMN T,PRGM ;BLOCK INDEX MATCHES PRGM? POPJ P, ;YES, MEANING W2 ISN'T IN THE NEST. ADD T,2(SMB) ADDI T,(SMB) HRRZ T,(T) ;GET LINK TO PARENT BLOCK JRST WCHBL1 ;AND LOOP. ;ABSOLUTE ADDRESS IN R, SMB SETUP. RETURN CLASS NUMBER IN T GCLASS: MOVEI T,4 ;ASSUME CLASS 4 SUBI R,(SMB) ;MAKE RELATIVE. CAMGE R,10(SMB) ;SKIP IF CLASS 4 SUBI T,1 ;CLASS 3, 2 OR 1 CAMGE R,7(SMB) ;SKIP IF CLASS 3 OR 4 SUBI T,1 ;CLASS 2 OR 1 CAMGE R,6(SMB) ;SKIP IF CLASS 2, 3, OR 4 SUBI T,1 ;CLASS 1 ADDI R,(SMB) ;RESTORE TO ABSOLUTE POPJ P, ;ABSOLUTE ADDRESS IN R. RETURNS ABSOLUTE IN R, VALUE IN T. REVAL: PUSHJ P,GCLASS ;CALCUALTE THE CLASS NUMBER XCT REVAL0-1(T) ;DISPATCH TO THE CLASS EVALUATOR POPJ P, REVAL0: HRRZ T,1(R) HRRZ T,1(R) HRLZ T,1(R) MOVE T,@1(R) ; SLOOK CONVERT VALUE TO SYMBOLIC CCLASS: JUMPL T,CCLAS1 ;VALUE IN T TO CLASS NUMBER IN R. MOVEI R,1 CAIG T,377777 POPJ P, ;CLASS 1 CAIG T,777777 AOJA R,CPOPJ ;CLASS 2 CCLAS1: MOVEI R,3 TRNE T,777777 MOVEI R,4 ;CLASS 4 POPJ P, ;ENTER HERE WITH T CONTAINING A VALUE FOR WHICH A SYMBOL IS SOUGHT. ;IF A SYMBOL THAT MATCHES THE VALUE T EXACTLY IS FOUND, IT'S NAME WILL ;BE PRINTED AND THE DIRECT RETURN TAKEN. IF NO EXACT MATCH IS FOUND, ;THE CLOSEST SYMBOL WHOSE VALUE HAS THE SAME SIGN AS C(T) AND IS SMALLER ;THAN C(T) WILL BE POINTED TO BY W1 AND THE SKIP RETURN TAKEN (T WILL CONTAIN ;THE NUMERIC DIFFERENCE). IF NO MATCH AT ALL IS FOUND, DOUBLE SKIP RETURN. ;W1 WILL POINT TO 3 WORDS AT S.SYM, BEING THE NAME, THE VALUE, AND THE SYMBOL ;TABLE (ABSOLUTE) ADDRESS OF THE SYMBOL ENTRY. ^SLOOK: MOVEM T,TEMDDT ;STORE VALUE SOUGHT. PUSHJ P,CCLASS ;CALCULATE CLASS NUMBER JRST @.(R) ;DISPATCH AS APPROPRIATE SLC1 SLC2 SLC34 ;TRY CLASS 3 THEN, CLASS 4 SLC43 ;TRY CLASS 4, THEN CLASS 3 SLC2: HRRZ R,6(SMB) ;LOWER BOUND HRRZ S,7(SMB) ;UPPER BOUND JRST SLC1A SLC1: HRRZ R,5(SMB) ;LOWER BOUND HRRZ S,6(SMB) ;UPPER BOUND SLC1A: MOVE T,[HRRZ W1,1(T)] MOVEM T,FFETCH SETZM C3FLG JRST FNDSYM SLC34: PUSHJ P,SLC3 ;TRY 3 FIRST POPJ P, ;WIN JRST SLC34A ;STACK RESULT AND CALL SLC4. JRST SLC4 ;NOBODY HOME. JUST TRY CLASS 4 SLC34A: MOVE T,[S.SYM,,X.SYM] BLT T,X.SYM+2 ;SAVE RESULT. PUSHJ P,SLC4 ;TRY CLASS 4 POPJ P, ;THIS SHOULDN'T HAPPEN JRST SLC34C ;COMPARE WITH PREVIOUS RESULT SLC34B: MOVE T,[X.SYM,,S.SYM] BLT T,S.SYM+2 ;USE PREVIOUS RESULT. SLC34D: MOVE T,TEMDDT SUB T,S.SYM+1 JRST CPOPJ1 SLC34C: MOVE T,S.SYM+1 CAMGE T,X.SYM+1 JRST SLC34B ;USE OLD RESULT. JRST SLC34D ;USE CURRENT RESULT. SLC43: PUSHJ P,SLC4 ;SEEK. POPJ P, ;WIN. JRST SLC43A ;STACK RESULT. JRST SLC3 ;LOSE. TRY CLASS 3 SLC43A: MOVE T,[S.SYM,,X.SYM] BLT T,X.SYM+2 ;SAVE RESULT. PUSHJ P,SLC3 POPJ P, ;SHOULDN'T HAPPEN JRST SLC34C ;GO COMPARE WITH SAVED RESULT. JRST SLC34B ;USE SAVED RESULT. SLC3: HRRZ R,7(SMB) ;LOWER BOUND HRRZ S,10(SMB) ;UPPER BOUND MOVSS TEMDDT SETOM C3FLG MOVE T,[HRRZ W1,1(T)] MOVEM T,FFETCH PUSHJ P,FNDSYM POPJ P, ;SUCCESS. SWAP TEMDDT AND RETURN. JRST CPOPJ1 JRST CPOPJ2 ;FAILURE. SLC4: HRRZ R,10(SMB) ;LOWER BOUND HRRZ S,11(SMB) ;UPPER BOUND MOVE T,[MOVE W1,@1(T)] MOVEM T,FFETCH SETZM C3FLG PUSHJ P,FNDSYM POPJ P, JRST CPOPJ1 JRST CPOPJ2 ;ENTER HERE WITH R=LOWER BOUND, S=BEYOND UPPER BOUND, ;TEMDDT=VALUE SOUGHT (EXCEPT FOR CLASS3, WHERE IT IS SWAPPED) ;FFETCH=INSTRUCTION TO XCT TO GET DATA INTO W1, USING T AS DIRECT INDEX. ;DIRECT RETURN = WE PRINTED A NAME. ;1 SKIP = CLOSEST MATCH IS POINTED TO BY W1, T CONTAINS DIFFERENCE. ;2 SKIP = THERE IS NO CLOSEST MATCH. FNDSYM: SUBI S,2 ;ADJUST S TO POINT WITHIN RANGE. CAMLE R,S ;COMPARE. JRST FNDXT2 ;HOPELESS. RANGE IS EMPTY. ADDI S,(SMB) ADDI R,(SMB) MOVEI T,(R) XCT FFETCH ;FETCH DATA (LOWEST VALUE IN RANGE) CAMLE W1,TEMDDT ;SKIP IF THERE'S SOME HOPE. JRST FNDXT2 ;NO WAY. SMALLEST VALUE IS TOO LARGE. MOVEM S,FNDHI ;SAVE ORIGINAL BOUNDS FOR LATER. MOVEM R,FNDLO MOVEI T,(S) XCT FFETCH ;FETCH LARGEST VALUE CAMGE W1,TEMDDT ;SKIP IF LARGEST VALUE INCLUDES SOUGHT VALUE. JRST FNDSY3 ;NO. T POINTS TO LARGEST VAL. .LT. SOUGHT VALUE TRNN R,1 ;ODD OR EVEN? SKIPA W1,[TRZA T,2] ;EVEN. MOVE W1,[TRNN T,2] MOVEM W1,TXCT ;INSTRUCTION TO ADJUST AVERAGE FNDSY1: MOVEI T,(R) ADDI T,(S) XCT TXCT ;TEST RESULT SUBI T,2 ; ADJUST IF NECESSARY. LSH T,-1 ;AVERAGE. (POINTS AT OR BELOW THE MIDDLE.) XCT FFETCH ;FETCH DATA CAMN W1,TEMDDT ;EXACT MATCH? JRST FNDSY3 ;YES! CAML W1,TEMDDT ;MIDPOINT SMALL OR LARGE? JRST FNDSY2 ;LARGE - USE MIDPOINT AS HIGH BOUND. MOVEI R,2(T) ;SMALL - USE MIDPOINT AS LOW BOUND. JRST .+2 FNDSY2: MOVEI S,-2(T) ;USE MIDPOINT AS HIGH BOUND. CAMG R,S JRST FNDSY1 ;UNTIL OVERLAP, LOOP. MOVEI T,(S) ;MOVE POINTER TO T. FNDSY3: XCT FFETCH ;T IS BEST POINTER. EXPAND THE RANGE! MOVE W2,W1 ;SAVE BEST VALUE. MOVEI S,(T) FNDSY4: MOVEI R,(T) CAMG R,FNDLO JRST FNDSY5 ;CAN'T MOVE DOWN ANYMORE. MOVEI T,-2(R) XCT FFETCH CAMN W2,W1 JRST FNDSY4 ;EXPAND NUMBER OF MATCHING SYMBOLS. FNDSY5: MOVEI T,(S) FNDSY6: MOVEI S,(T) CAML S,FNDHI JRST FNDSY7 ;CAN'T MOVE UP ANY HIGHER. MOVEI T,2(S) XCT FFETCH CAMN W2,W1 JRST FNDSY6 FNDSY7: SETZM UNIQ ;R AND S POINT TO GROUP OF EQUAL-VALUED SYMBOLS SETZM UNIQP FNDSY8: CAMGE S,R ;LOOK THRU ALL SYMBOLS OF SAME VALUE. JRST FNDSYE ;DONE. MOVE W2,(S) TLNE W2,DELO+DELI ;IGNORE SYMBOLS WITH THESE BITS SET JRST FNDSY9 ;SYMBOL WAS SUPPRESSED. IGNORE IT. TLNE W2,040000 JRST FNDSYA ;SYMBOL IS GLOBAL LDB W2,[POINT 13,1(S),12] ;GET THE BLOCK NUMBER CAME W2,PRGM ;SAME AS CURRENT PROGRAM? CAMN W2,BLOCK ;OR SAME AS CURRENT BLOCK? JRST FNDSYD ;YES. THIS IS THE VERY BEST. PUSHJ P,WCHBLK ;SEE IF W2 IS IN PRESENT BLOCK NEST. JRST FNDSYB ;NO. WRONG NEST OR WRONG PROGRAM! SKIPG T,UNIQP ;WAS ANYTHING YET FOUND IN THE OPEN NEST? JRST FNDSYC ;NO. WE NOW HAVE SOMETHING. LDB T,[POINT 13,1(T),12] ;YES. GET BLOCK NUMBER OF PREVIOUS THING LDB W2,[POINT 13,1(S),12] ;AND BN OF THIS ONE CAML T,W2 ;SKIP IF PREVIOUS B. CONATAINED IN THIS B. FNDSYC: HRRZM S,UNIQP ;NEW ONE IS BETTER. W2 .LT. T JRST FNDSY9 FNDSYB: SKIPN UNIQ ;IS THIS SET ALREADY? FNDSYA: HRRZM S,UNIQ ;SAVE FIRST UNAVAILABLE LOCAL, ANY GLOBAL FNDSY9: SUBI S,2 JRST FNDSY8 FNDSYD: HRRZM S,UNIQP FNDSYE: SKIPN T,UNIQP ;IS THERE ANYTHING IN CURRENT BLOCK NEST? SKIPE T,UNIQ ;ANYWHERE ELSE? JRST FNDSYF ;GOT ONE. MOVEI T,(S) ;NO SYMBOLS OF BEST VALUE WERE PRINTABLE! CAML T,FNDLO ;OFF THE END YET? JRST FNDSY3 ;NO. EXPAND NEW RANGE. ;SHIT! ALL SYMBOLS WERE SUPPRESSED. FNDXT2: SKIPE C3FLG MOVSS TEMDDT ;UNSWAP. JRST CPOPJ2 FNDSYF: SETZM SVFB ;ASSUME NO BLOCK NAME NEEDED. SKIPE UNIQP ;WAS SYMBOL FOUND IN CURRENT NEST? JRST FNDSYG ;YES. NO BLOCK NAME NEEDED. MOVE W1,(T) TLNE W1,040000 ;GLOBAL? JRST FNDSYG ;YES. WE NEED NO BLOCK NAME. LDB W1,[POINT 13,1(T),12] ;GET BLOCK NUMBER MOVEM W1,SVFB ;SAVE IT WHERE IT WILL BE PRINTED. ADD W1,1(SMB) ;GET THE BLOCK NAME ADDI W1,(SMB) MOVE W1,(W1) TLNN W1,740000 ;BLOCK OR PROGRAM NAME? JRST FNDSYG ;PROGRAM NAME. MOVE W1,SVFB ;GET BLOCK INDEX AGAIN. ADD W1,2(SMB) ADDI W1,(SMB) HLRZ W1,(W1) ;GET POINTER BACK TO PROGRAM NAME. CAME W1,PRGM ;SAME AS OPEN PROGRAM? MOVEM W1,SVFB ;NO. OUTPUT PROGRAM NAME & SYMBOL NAME. FNDSYG: MOVEM T,S.SYM+2 ;SAVE DIRECT POINTER TO SYMBOL. XCT FFETCH MOVEM W1,S.SYM+1 ;SAVE VALUE. SKIPN C3FLG JRST FNDSYH MOVSS TEMDDT MOVSS S.SYM+1 FNDSYH: MOVE W1,(T) MOVEM W1,S.SYM ;SAVE SYMBOL NAME. MOVEI W1,S.SYM ;POINTER TO NAME. MOVE T,TEMDDT ;GET THE SOUGHT VALUE SUB T,S.SYM+1 ;MINUS THE SYMBOL WE FOUND. JUMPE T,SPT0 ;JUMP IF WE HAVE EXACT MATCH TLO F,400000 ;ANNOUNCE WE FOUND ONE. JRST CPOPJ1 BEND SYMSRT SUBTTL DDT - TEXT INPUT (ASCII AND SIXBIT) ;INPUT TEXT " SEEN. ;RECOGNIZED FORMS: ; "<DELIM>TEXT<DELIM> "/TEXT/ LEFT ADJUSTED ASCII INPUT ; $"<DELIM>TEXT<DELIM> $"/TEXT/ LEFT ADJUSTED SIXBIT INPUT ; "CHR$ "A$ ONE RIGHT ADJUSTED ASCII CHR. ; $"CHR$ $"A$ ONE RIGHT ADJUSTED SIXBIT CHR. ; $$7"<DELIM>TEXT<DELIM> $$7"/ABCDEFG/ LEFT ADJUSTED DELIMITED ASCIZ ; IN MULTIPLE WORDS ; $$n"<DELIM>TEXT<DELIM> $$6"/ABCDEFG/ LEFT ADJUSTED DELIMITED SIXBIT ; IN MULTIPLE WORDS - ENDS WITH ; A ZERO BYTE OR WORD. TEXI: PUSHJ P,TEXIN ;GET FIRST CHARACTER TO T. MOVEM T,SYL ;SAVE IT. MOVEI W1,5 ;ASSUME ASCII MOVEI T-1,0 ;ACCUMULATE IT HERE PUSHJ P,TEXIN ;GET SECOND CHARACTER. TLNE F,CCF ;WAS IT $$" WE SAW? JRST TEXI4 ;YES - PERMIT ALTMODE AS FIRST CHR CAIE T,33 ;NOW, HAVE WE AN ALTMODE FOR THE SECOND CHR? JRST TEXI5 ;ASSEMBLE NORMALLY. TEXI1A: TLNN F,CF ;ONE RIGHT ADJUSTED CHR. SIXBIT REQUESTED? JRST QUAN1 ;NO. SYL HAS RIGHT ADJUSTED ASCII MOVE T,SYL TRZN T,100 ;TURN OFF 100 BIT TRZA T,40 ;100 BIT WAS OFF. MAKE 40 BIT GO OFF. TRO T,40 ;100 BIT WAS ON. COPY 100 BIT TO 40 BIT. ANDI T,77 MOVEM T,SYL JRST QUAN1 TEXI4: MOVE R,WRD2 ;$$ TYPED. GET NUMERIC ARG IF ANY. CAIE R,7 JRST SIXBIN ;NOT $$7 - DO SIXBIT JRST TEXI6 TEXI5: TLNE F,CF ;"<DELIM - NOW IN SYL><CHR NOW IN T> JRST SIXBIN ;$" WAS TYPED. DO IT FOR SIXBIT. SKIPA ;FIRST CHARACTER ALREADY IN T. TEXI2: PUSHJ P,TEXIN TEXI6: CAMN T,SYL SOJA W1,TEXI3 ;DELIMITER SEEN ROT T,-7 LSHC T-1,7 SOJG W1,TEXI2 ;LOOP ACCUMULATING TEXT TLNN F,CCF ;END OF WORD. $$ SEEN? JRST TEXI2 ;NO. LOOP UNTIL WE GET A DELIMITER. LSHC T-1,-43 ;MOVE VALUE INTO T. PUSH P,F TLZ F,CF TLO F,QF PUSHJ P,DEPRA ;DEPOSIT POP P,F AOS LLOCO MOVEI T-1,0 ;AND PREPARE TO ASSEMBLE THE NEXT. MOVEI W1,5 JRST TEXI2 TEXI3: LSHC T-1,-43 JUMPL W1,QUAN1 ;DEPOSIT AFTER IT'S BEEN SHIFTED ENOUGH LSH T,7 SOJA W1,.-2 ; SIXBIT TEXT INPUT SIXBI1: PUSHJ P,TEXIN ;INPUT SIXBIT SIXBIN: CAMN T,SYL JRST SIXBI2 ;DELIMITER SEEN CAIL T,"A"+40 CAILE T,"Z"+40 JRST .+2 SUBI T,40 ;LOWER CASE TO UPPER CASE. ANDI T,77 TRC T,40 ROT T,-6 LSHC T-1,6 SOJGE W1,SIXBI1 ;LOOP UNTIL FULL TLNN F,CCF ;$$6" MODE? JRST SIXBI1 ;NO. LOOP UNTIL DELIMITER SEEN MOVE T,T-1 PUSH P,F TLZ F,CF TLO F,QF PUSHJ P,DEPRA POP P,F AOS LLOCO MOVEI T-1,0 MOVEI W1,5 JRST SIXBI1 SIXBI2: MOVE T,T-1 JUMPL W1,QUAN1 LSH T,6 SOJA W1,.-2 SUBTTL DDT - BYTE INPUT ;BYTE INPUT $n%b1,b2,...,bn$ ;IF n=0 THEN THE BYTE MASK, BMASK = $M+2, DEFINES THE BYTE SIZES. BYTI: TRZN F,Q2F ;ALTMODE NUMBER TYPED? JRST PERC ;NO. TREAT THIS AS A LETTER (PERCENT IN RADIX50) SETZM SVBTI1 ;ASSEMBLED WORD MOVEI T,=36 ;TOTAL NUMBER OF BITS MOVEM T,SVBTI2 MOVE T+2,BMASK ;IN CASE OF "BYTE SIZE ZERO" - USING MASK MOVEI T+1,BYTI1A ;ASSUME FIXED SIZE BYTES. - BYTE ASSEMBLY ROUTINE SKIPN T,WRD2 ;GET NUMBER OF BITS/BYTE SKIPA T+1,[BYTIM4] ;USE BYTE MASK ASSEMBLY MOVEM T,SVBTI ;SAVE BYTE SIZE MOVEM T+1,SVBTID ;SET DISPATCH ADDRESS USED BY BYTI3 BYTI4: PUSHJ P,BYTI3 ;INPUT A BYTE. STORE BYTE. SKIP IF TERMINATED JRST BYTI4 ;LOOP UNTIL A BYTE FOLLOWED BY ALTMODE IS SEEN MOVE T,SVBTI1 ;TERMINATES - GET WORD LSH T,@SVBTI2 ;SHIFT REST OF WAY JRST QUAN1 ;GO PUT IT AWAY ;BYTE DEPOSIT USING MASK. BYTIM4: SKIPG SVBTI2 ;ROOM FOR MORE? POPJ P, ;NO, QUIT SETZM SVBTI ;COUNT NUMBER OF BITS THIS POSITION SKIPL T+2 ;START WITH 1 BITS IN LEFT SETCA T+2,0 ;COMPLIMENT TO MAKE FIELD OF 1'S IN LEFT BYTIM5: LSH T+2,1 ;GET NEXT BIT ROT T+1,-1 ;MOVE ANOTHER BIT OF NUMBER TO LEFT END AOS SVBTI ;SAVE COUNT SOSLE SVBTI2 ;CHECK TO SEE IF WORD FULL JUMPL T+2,BYTIM5 ;IS NEXT BIT PART OF SAME FIELD? MOVE T,SVBTI1 ;NO, GET WORD LSHC T,@SVBTI ;SHIFT CORRECT NUMBER OF BITS MOVEM T,SVBTI1 ;AND SAVE AGAIN POPJ P, ;RETURN ;BYTE DEPOSIT FOR FIXED SIZE BYTES. BYTI1A: MOVN T+2,SVBTI ;GET SIZE ROT T+1,(T+2) ;GET THAT MANY BITS INTO LEFT END MOVE T,SVBTI1 ;NOW THE PARTIALLY ASSEMBLED WORD MOVE T+2,SVBTI ;SIZE CAMLE T+2,SVBTI2 ;MORE THAN WE NEED? MOVE T+2,SVBTI2 ;YES, TAKE SMALLER LSHC T,(T+2) ;SHIFT BITS IN MOVEM T,SVBTI1 ;SAVE WORD MOVN T+2,T+2 ;UPDATE NUMBER OF BITS STILL NEEDED ADDM T+2,SVBTI2 POPJ P, ;READ IN NUMBER. CALL @SVBTID TO DEPOSIT. SKIP RETURN WHEN TERMINATOR SEEN BYTI3: MOVEI T+1,0 BYTI3A: PUSHJ P,TEXIN ;NEXT CHR CAIN T,33 ;TERMINATOR? AOSA (P) ;YES - SET SKIP RETURN FROM DEPOSIT ROUTINE CAIN T,"," ;SEPARATOR? JRST @SVBTID ;CALL BYTE DEPOSIT ROUTINE. CAIL T,"0" ;CHECK FOR DIGIT CAILE T,"7" JRST ERR IMULI T+1,10 ADDI T+1,-"0"(T) JRST BYTI3A SVBTI: 0 SVBTI1: 0 ;ASSEMBLED WORD SVBTI2: 0 SVBTID: 0 SUBTTL DDT - MORE OF THE WORD ASSEMBLER ;CAUTION!!! THIS CODE MUST APPEAR AFTER THE SYMBOL TABLE STUFF! MULT: TLOA F,PTF+MLF ;* DIVD: TLO F,DVF+PTF ;SINGLE QUOTE JRST L1 ASSEM: JRST PLUS ;# MINUS: TLO F,MF PLUS: TLO F,PTF JRST LIS2 LPRN: CAML P,[XWD LPDL-4,0] ;LEFT PARENTHESIS JRST ERR PUSH P,F ;RECURSE FOR OPEN PAREN PUSH P,WRD PUSH P,FRASE PUSH P,FRASE1 AOS PRNC JRST LIS INDIRECT: HRLZI W,20 ;@ IORB W,WRD TLO F,QF JRST LIS2 ACCF: MOVE R,T ;COMMA TLOE F,COMF ;A COMMA SEEN, WAS IT SECOND? JRST ACCCF ;YES, GO PROCESS ADD T,WRD ;GET TOTAL HRRM T,ACCCF ;AND SAVE HLLZ T,R ;GET LEFT HALF BACK LSH R,27 SKIPE IOTFLG ;IS THIS AN IOT? LSH R,1 ;THEN SHIFT ONE MORE ADD T,R ADDB T,WRD JRST SPACE+1 ACCCF: MOVSI T,0 ;MODIFIED TO BE LEFT HALF ON ,, MOVEM T,WRD JRST SPACE+1 ;AND GO SPACE: TLNE F,QF TLO F,TIF SPAC1: TLZ F,MF+PTF JRST LIS1 RPRN: TLNN F,QF ;) MOVEI T,0 MOVS T,T SOSGE PRNC JRST ERR POP P,FRASE1 POP P,FRASE POP P,WRD POP P,F TLNE F,PTF TLNE F,SF JRST RPRN1 MOVEM T,SYL TLO F,QF+SF JRST L1RPR RPRN1: ADDB T,WRD TLO F,QF JRST L1RPR-1 CRN: MOVEI T,15 ;CARRIAGE RETURN JRST TOUT IFE EDDT&1,< CRNRB: PUSHJ P,CRN MOVEI T,177 JRST TOUT > CRF: PUSHJ P,CRN MOVEI T,12 ;LINE FEED JRST TOUT LCT: IFN EDDT&1,< PUSHJ P,TSPC ;EXEC DDT TYPES THREE SPACES INSTEAD OF TAB PUSHJ P,TSPC> ;FALL INTO TSPC IFE EDDT&1,< MOVEI T,11 JRST TOUT> TSPC: MOVEI T,40 ;SPACE JRST TOUT SUBTTL DDT - REGISTER EXAMINATION LOGIC LINEF: PUSHJ P,DEPRA ;NEXT REGISTER IFE EDDT&1,< PUSHJ P,CRNRB JRST .+2 > LI0: PUSHJ P,CRF AOS T,LLOC LI1: HRRZS T HRRZM T,LLOC HRRZM T,LLOCO PUSHJ P,PAD MOVEI T,"/" TLNE F,STF MOVEI T,"!" PUSHJ P,TOUT LI2: TLZ F,ROF PUSHJ P,LCT MOVE R,LLOCO PUSHJ P,FETCH JRST ERR TLO F,ROF TLNE F,STF JRST DD2 JRST CONSYM ;RETURN IS A POPJ VARRW: PUSHJ P,DEPRA ;^ PUSHJ P,CRF SOS T,LLOC JRST LI1 IFN UEDDTS,< ;IN UEDDT, DOWN ARROW (CNTL A) MEANS ;CARRIAGE RETURN, PLUS WRITE ON L'SCOPE DARRW: MOVE R,LLOCO ;PICK UP ADDRESS TO DEPOSIT PUSHJ P,DEPRA ;CLOSE REGISTER, ETC. JRST DD1 ;RETURN TO MAIN LOOP >;IFN UEDDTS CARR: PUSHJ P,DEPRA ;CLOSE REGISTER IFN EDDT&1,<JRST DD1> IFE EDDT&1,<JRST DD1.5> OCON: TROA F,LF1+CF1 ;OPEN AS CONSTANT OSYM: TRZ F,CF1 ;OPEN SYMBOLICALLY TROA F,LF1 SUPTYO: TLOA F,STF ;SUPPRESS TYPEOUT SLASH: TLZ F,STF ;TYPE OUT REGISTER TLNN F,CF ;WAS $ USED? JRST SLAS2 ;NO PUSHJ P,EFFECA ;TRY EFFECTIVE ADR JRST ERR ;WE LOST SLAS2: TLNN F,QF JRST SLAS1 MOVE R,LLOC MOVEM R,SAVLOC ;SAVE FOR $CR ETC. HRRZM T,LLOC ;QUANTITY TYPED SLAS1: HRRZM T,LLOCO JRST LI2 ICON: TLNN F,ROF ;REGISTER OPENED OR ERR JRST ERR PUSHJ P,DEPRS TLNN F,CF ;CHECK FOR ALTMODE JRST SLAS1 PUSHJ P,EFFECA JRST ERR ;LOSE JRST SLAS1 ; LTAB, TAB, DEPRA, EQUAL, PSYM LTAB: MOVSS T ;SWAP HALVES FIRST CAIA ;DON'T DEPOSIT WITH SWAPPED HALVES TAB: PUSHJ P,DEPRS ;OPEN REGISTER OF Q TLNN F,CF JRST TAB1 PUSHJ P,EFFECA JRST ERR TAB1: MOVEI T,-1(T) EXCH T,LLOC MOVEM T,SAVLOC ;AGAIN, SAVE IT HRROI T,700000 PUSHJ P,TEXTT JRST LI0 DEPRA: MOVE R,SAVLOC TLNE F,CF ;WAS THERE AN ALTMODE? EXCH R,LLOC ;RESTORE OLD LOC MOVEM R,SAVLOC ;AND SAVE THIS TLNE F,ROF ;REGISTER OPEN? TLNN F,QF ;YES. BEING CHANGED? JRST DEPRS ;NO. PUSHJ P,REMAUN ;REMOVE UNDEF SYMBOLS THAT WERE REFERENCED AT JRST DEPRS ; THIS ADDRESS EQUAL: TLNE F,CF ;IF $= TRO F,EQF ;THEN REAL NUMERIC MODE TROA F,CF1 ;= OUTPUT 1 REGISTER AS CONSTANT PSYM: TRZ F,CF1 ;_ OUTPUT SYMBOLIC TRO F,LF1 ;OUTPUT 1 REGISTER AS FORCED SYMBOLIC OR CONSTANT PUSHJ P,CONSYM JRST RET R50PNT: LSH T,-36 ;RADIX 50 SYMBOL PRINTER TRZ T,3 PUSHJ P,TOC PUSHJ P,TSPC SETZM SVFB ;NO BLOCK NAME MOVEI W1,LWT ;SETUP FOR SPT JRST SPT SIXBP: MOVNI W2,6 ;SIXBIT PRINTER MOVE W1,LWT SIXBP1: MOVEI T,0 ROTC T,6 ADDI T,40 PUSHJ P,TOUT AOJL W2,SIXBP1 POPJ P, SUBTTL DDT - OUTPUT MODE CONTROL SWITCHES, UEDDT - JOBSET ;SET JOB NUMBER TO EXAMINE IFN UEDDTS,< JOBSET: TLZE F,QF ;QUANTITY TYPED BEFORE THE $? JRST JOBST2 ;YES. SKIPL T,WRD2 CAMLE T,400222 ;LEGAL JOB NUMBER? JRST UNDEF ;NO JUMPG T,JOBST0 SETOM EXMMAP ;EXAMINE EXEC VIA EXPGT JOBST1: SKIPA R,[37] ;THIS IS EXEC JOBREL JOBST0: MOVEI R,44 ;THIS IS LOSER JOBREL MOVEM T,EXJOBN PUSHJ P,FETCH SETZ T, ;NOT FOUND MOVEM T,MEMSIZ ;THIS IS MAX LOC WE ARE LOOKING AT SKIPE EXJOBN ;FORCE SYSTEM SYMS IF LOOKING AT SYSTEM TLNN F,CCF ;DOES HE WANT USER'S SYMS? TDZA T,T ;NO SETO T, ;YES EXCH T,EXSYMS CAMN T,EXSYMS ;CHANGING MODE? JUMPE T,RET ;NO, IF STAYING WITH EXEC SYMS, NO RE-INIT PUSHJ P,COPSYM ;SETUP SYMBOLS!!! JRST DDTB ;FIXUP SYMS! JOBST2: MOVE T,SYL ;GET THE ARGUMENT - N$^E TYPED. MOVEM T,EXMMAP ;SAVE IT (POSITIVE DENOTES PAGE NUMBER TO EXAMINE) MOVEI T,0 JRST JOBST1 >;IFN UEDDTS TEXO: MOVEI R,TEXTT-HLFW ;$T ASSUME 7 BIT ASCII MOVE T,WRD2 CAIN T,6 ;CHECK FOR $6T MOVEI R,SIXBP-HLFW ;SET MODE SWITCH FOR SIXBIT CAIN T,5 ;CHECK FOR $5T MOVEI R,R50PNT-HLFW ;SET MODE SWITCH FOR RADIX 50 CAIN T,11 ;CHECK FOR $9T MOVEI R,TEXTT9-HLFW ;SET MODE SWITCH FOR 9 BIT ASCII HWRDS: ADDI R,HLFW-TFLOT ;H SFLOT: ADDI R,TFLOT-PIN ;F SYMBOL: ADDI R,PIN-TOCC ;S CON: ADDI R,TOCC-FTOC ;C UCON: ADDI R,FTOC ;U HRRZ SCH,R JRST BASE1 RELA: TRZE F,Q2F ;CHANGE ADDRESS MODE TO RELATIE JRST BASECH MOVEI R,PADSO-TOC ABSA: ADDI R,TOC ;A HRRZ AR,R JRST BASE1 BASECH: MOVE T,WRD2 ;$NR CHANGE OUTPUT RADIX TO N, N>1 CAIGE T,2 JRST ERR HRRZ ODF,T BASE1: MOVS S,[XWD SCHM,SCH] TLNN F,CCF JRST LIS1 BLT S,ODFM ;WITH $$, MAKE MODES PERMANENT JRST RET SEMIC: MOVEM T,LWT ;SEMICOLON TYPES IN CURRENT MODE JRST (SCH) SUBTTL DDT - GO, EXECUTE, AND BREAKPOINT LOGIC STR: HRLI T,254000 ;$G. LOAD JRST INSTRUCTION TLOE F,QF ;WAS THERE AN ARGUMENT? JRST STR1 ;YES. USE IT. IFN EDDT&1,< HRR T,STARTA> ;LOAD TAPE START ADDRESS IFE EDDT&1,< HRR T,JOBSA> ;GET STARTING ADDRESS TRNN T,-1 ;WAS THERE ANY REASONABLE ARGUMENT FOUND? JRST ERR ;NO. DO NOTHING. JRST XEC0 ;EXECUTE THE JRST STR1: TLNE F,CCF ;<ARG>$$G? IFN EDDT&1,< HRRM T,STARTA> ;YES. STORE START ADDRESS IFE EDDT&1,< HRRM T,JOBSA> ;YES. STORE START ADDRESS JRST XEC0 XEC: TLNE F,QF ;NO ARG TLNN T,777000 ;OR ARG NOT INSTRUCTION JRST $X ; =>SINGLE STEP JRST XEC0 BREAKA: PUSHJ P,REMOVB ;REMOVE BREAKPOINTS BREAKB: PUSHJ P,CHKSYM ;RESET PRGM AND BLOCK IF SYMBOLS MOVED SOS T,BCOM3 HRRZS T ;GET ADDR OF BREAKPOINT JUST HIT SUBI T,B1ADR-4 IDIVI T,4 HRRM T,BREAK2 ;WE WANT IT LATER MOVE W1,BRKNAM-1(T) ;GET THE RIGHT JUNK PUSHJ P,TEXT2 ;AND PRINT ;<<<<<<< THESE BALANCE THE >'S IN THE NEXT FEW LINES MOVSI W1,(<ASCIZ />/>) ;TYPE > FOR COND BREAK SKIPG @BCOM2 ;TEST PROCEED COUNTER MOVSI W1,(<ASCIZ />>/>) ;TYPE >> FOR PROCEED COUNTER BREAK PUSHJ P,TEXT2 MOVE T,BCOM HLLM T,SAVPI ;SAVE PROCESSOR FLAGS MOVEI T,-1(T) PUSHJ P,PAD ;TYPE PC AT BREAK HRRZ T,@BCOM3 HRRM T,PROC0 ;SETUP ADDRESS OF BREAK HLRZ T,@BCOM3 JUMPE T,BREAK1 ;TEST FOR REGISTER TO EXAMINE PUSHJ P,LCT ;PRINT TAB HLRZ T,@BCOM3 PUSHJ P,LI1 ;EXAMINE REGISTER C($NB)LEFT BREAK1: MOVSI S,400000 BREAK2: ROT S,0 ;WILL BE MODIFIED WITH BREAK NUM PUSHJ P,LISTEN ;DONT PROCEED IF TTY KEY HIT TDNN S,AUTOPI ;DONT PROCEED IF NOT AUTOMATIC JRST RETB ;TAKE A BREAK MOVEI T,2 ;COMPENSATE FOR SOS INSTRUCTION ADDB T,@BCOM2 JUMPL T,PROCD1 ;GO IF STILL LESS THAN ANDCAM S,AUTOPI ;TURN OFF AUTOPI RETB: HRRZ T,BCOM2 ;BREAK. SET UP TEXT STRING FROM BNSTR SKIPE T,1(T) ;IS THERE A POINTER TO A STRING? HRLI T,(<POINT 7,0>) ;YES. MAKE IT A BYTE POINTER MOVEM T,STRING ;STUFF IT WHERE THE TTY READER WILL SEE IT JRST RET RADIX =10 BRKNAM: FOR @% I_1,NBP < ASCII /$%I%B/ > RADIX =8 PROCEDE:TLNE F,QF ;N$P ;PROCEED AT A BREAKPOINT JRST PROC3 ;QUANTITY TYPED MOVEI T,1 ;IF NO QUANTITY TYPED, USE 1 TLNE F,CCF ;IF $$P MOVSI T,200000 ;THEN VERY LARGE COUNT PROC3: TLNE F,CCF ;AUTO PROCEDE? MOVNS T ;NEGATE MOVEM T,@BCOM2 ;STORE PROCEDE COUNTER HRRZ R,BCOM3 PUSHJ P,AUTOP PROCD1: PUSHJ P,CRF PUSHJ P,TTYLEV PROC0: HRRZI R,XEC1 ;* MODIFIED TO ADDR OF BREAKPOINT PUSHJ P,FETCH JRST BPLUP1 ;ONLY GET HERE IF MEMORY SHRANK MOVEM T,LEAV PUSHJ P,INSRTB JRST PROC2 PROC2: MOVEI W,100 MOVEM W,TEM1 ;SETUP MAX LOOP COUNT JRST IXCT5 SUBTTL SINGLE STEP CODE FROM DEC COMMENT \ The following code is nearly identical with that distributed by DEC $X works as follows: $X executes a single instruction then increments the PC. Operands of the instruction are printed out as they exist after the instructions execution. An extra linfeed indicates a skip or jump. Finally, the instruction now pointed at is printed in symbolic form. n$X does $X n times. $$X does $X until PC reaches its original state +1 or +2 without printing anything. n$$X does n$X but only prints for the nth instruction \ ; Flags indicating things to print: FAC__1 ; 1 AC DFAC__2 ; 2 ACs FLG__4 ; Flags. IMM__10 ; Instruction is immediate mode. EA__20 ; Memory referencing. DEA__40 ; References 2 memory locs. FLA__100 ; Floating AC used FLE__200 ; Floating memory used. PFLG__400 ; on  PUSHx or POPx $X: TLNN F,QF ; Any arg from the user ? JRST .+3 ; No. MOVEM T,XTEM ; XTEM holds repetition count or ;is negative for $$x without an arg. JUMPG T,$X00 HRRZ T,PROC0 MOVEM T,LOCSAV SETOM XTEM TLNN F,CCF ; CCF on  $$ typed MOVNS XTEM $X00: PUSHJ P,CRF ; Give 'em a CRLF to start $X01: SOSN XTEM ; Decrement & test counter TLZ F,CCF ; Zap $$ flag to signal last iteration. TLZ F,QF!CF!STF MOVEM F,FLAGS ; Save flags since we wipe them out MOVEI T,100 ; Set max XCT depth MOVEM T,XCTS HRRZ R,PROC0 ; RH(PROC0)=Adr of current instruction CAIN R,XEC1 ; Cant trace ourselves! JRST ERR SKIPL XTEM MOVEM R,LOCSAV ; Save loc unless $$X $X02: PUSHJ P,FETCH ; Get the instruction JRST ERR $X03: MOVEM T,I.NST JSR SWAP ; EXCH our ACs with the user's ACs MOVEM T,SAV0 MOVEI T,@I.NST DPB T,[POINT 23,I.NST,35] ; Store effective address HRRZM T,I.NSTEA MOVE T,SAV0 JSR SWAP ; Make us ourselves again. LDB W1,[POINT 4,I.NST,12]; AC field. MOVEM W1,I.NSTAC MOVSI T,777000 AND T,I.NST HLRZ F,T CAMLE T,$XTBL(T) AOJA T,.-1 JRST @$XTBL(T) comment * Opcode dispatch table: LH of entry contains largest opcode covered by that entry. RH of entry contains address of routine to dispatch to. * OPDEF KAFIX [247B8] ;STANFORD KA10 (AND 166) FIX INSTRUCTION $XTBL: SETZB SET ; 400-403 SETZx ORCBB CHECKI ; 404-473 All logical except SETx SETOB SET ; 474-477 SETOx HLRES CHEKIS ; 500-577 Hxxxx TSON TESTS ; 600-677 Txxx 777000,,IOTS ; 700-777 I/O 0,,ERR ; 000 037000,,USRUUO ; 001-037 LUUOS CALL MONUAE ; 040 CALL INIT MONINI ; 041 INIT CALLI MONUAI ; 042-047 CALLI, SPCWAR, undefined TTCALL MONUE ; 050-051 OPEN,TTCALL 054000,,MONUAI ; 052-054 Undefined OUT MONUE ; 055-057 RENAME,IN,OUT STATO MONUI ; 060-061 SETSTS,STATO GETSTS MONUE ; 062 GETSTS OUTBUF MONUI ; 063-065 STATZ,INBUF,OUTBUF OUTPUT MONUE ; 066-067 INPUT,OUTPUT USETO MONUI ; 070-075 CLOSE,RELEAS,MTAPE,UGETF,USETI,USETO ENTER MONUE ; 076-077 LOOKUP,ENTER 104000,,SETI ; 100-104 Undefined ADJSP SETEA ; 105 ADJSP (KL-10) 107000,,SETI ; 106-107 Undefined DFDV DFLT ; 110-113 DFAB,DFSB,DFMP,DFDV (KL-10) DDIV DINT ; 114-117 DADD,DSUB,DMUL,DDIV (KL-10) DMOVN DINT ; 120-121 DMOVE,DMOVN KIFIX SETEA ; 122 FIX EXTEND IEXTND ; 123 EXTEND (KL-10) DMOVNM DINT ; 124-125 DMOVEM,DMOVNM FLTR SETEA ; 126-127 FIXR,FLTR UFA IUFA ; 130 UFA DFN IDFN ; 131 DFN FSC IFSC ; 132 FSC IBP SKP ; 133 IBP [or ADJBP (KL-10)] DPB SETEA ; 134-137 xLDB,xDPB FDVRB FLOAT ; 140-177 FADxx,FSBxx,FMPxx,FDVxx MOVMS CHEKIS ; 200-217 MOVxx IMULB CHECKI ; 220-223 IMULx DIVB MULDIV ; 224-237 MULx,xDIVx LSH SETI ; 240-242 ASH,ROT,LSH JFFO IJFFO ; 243 JFFO LSHC DBLI ; 244-246 ASHC,ROTC,LSHC KAFIX SETI ; 247 FIX EXCH SETEA ; 250 EXCH BLT SETI ; 251 BLT AOBJN IAOBJ ; 252-253 AOBJx JRST IJRST ; 254 JRST JFCL IJFCL ; 255 JFCL XCT I.XCT ; 256 XCT MAP SETEA ; 257 MAP (KL-10) PUSHJ IIPUSHJ ; 260 PUSHJ POP IPUPO ; 261-262 PUSH,POP POPJ IPOPJ ; 263 POPJ JSR I.JSR ; 264 JSR JSP I.JSP ; 265 JSP JSA I.JSA ; 266 JSA JRA IAOBJ ; 267 JRA SUBB CHECKI ; 270-277 ADDx,SUBx CAIG SETI ; 300-307 CAIxx CAMG SETEA ; 310-317 CAMxx SOSG JMPSKP ; 320-377 JUMPxx,SKIPxx,AOJxx,AOSxx,SOJxx,SOSxx ; MUUOs DEFINE SKPEXC {PUSHJ P,XECDET~ ; Assume that EDDT users are in EXEC mode. IFN EDDT&1,< MONUAI: TLO F,FAC ; Print AC MONUI: SKPEXC JRST JUSTI JRST USRUUO ; Trace MUUOs in EXEC mode. MONUAE: TLO F,FAC MONUE: SKPEXC JRST JUSTE JRST USRUUO MONINI: SKPEXC JRST MONIN1 JRST USRUUO XECDET: MOVSI T,010000 ; Test for user mode ******* TDNN T,SAVPI AOS (P) POPJ P, >; IFN EDDT&1 MONIN1: MOVE T,I.NST ; Here to interpret INITs MOVEM T,INLINI AOS R,PROC0 ; Get first inline arg to INIT PUSHJ P,FETCH JRST ERR MOVEM T,INLINI+1 AOS R,PROC0 PUSHJ P,FETCH JRST ERR MOVEM T,INLINI+2 EXCH F,FLAGS TLNN F,CCF MOVEM R,LOCSAV ; Only update original PC if not $$X MOVE T,[JRST INLINI] MOVEM T,I.NST JRST DOITA INLINI: 0 0 0 JRST DOITB JRST DOITC ; LUUOs USRUUO: MOVEI R,40 EXCH F,FLAGS MOVE T,I.NST PUSHJ P,DEP JRST ERR EXCH F,FLAGS MOVE T,[XCT 41] JRST $X03 ; Simulate the trap IUFA: TLOA F,FLA!FLE!DFAC ; Floating point; uses 2 ACs IDFN: TLO F,FLA!FLE ; Floating point + 1 AC JRST SETEA DFLT: TLO F,FLA!DEA!DFAC!FLE ;Dbl floating memory + double ac JRST SETEA ; Here for floating point instructions. FLOAT: ANDI F,7000 CAIN F,1000 ; long mode ? TLOA F,DFAC ; Yes; 2 ACs CAIN F,5000 ; Immediate mode ? TLOA F,FLA!FLE!FAC!EA ; No; AC, E floating FLOATI: TLO F,FLA!FLE!FAC!IMM ; Yes; AC, E immediate floating JRST DOIT IJRST: TLO F,IMM ; Print E TRNE W1,2 TLO F,FLG ; Print flags if JRSTF IJRST0: PUSHJ P,FETCH ; It's so f-----g hard to get at the flags!!! JRST ERR MOVE W1,T LDB R,[POINT 4,T,17] ; Index AC JUMPE R,IJRST1 MOVE T,AC0(R) TLZ T,37 ; Clear I,X fields ADDI T,(W1) TLZ F,37 IJRST1: MOVEI R,(T) TLNE W1,20 JRST IJRST0 ; LH T has the flags to restore. IFN EDDT&1,< SKPEXC JRST IJRST3 MOVE W1,I.NSTAC TRNE W1,1 ; Jump to USER mode ? JRST JRSPRC ; Yes, lose TRNE W1,2 ; JRSTF to USER ? TLNN T,(1B5) JRST IJRST3 JRSPRC: EXCH F,FLAGS ; Lose. TLZ F,QF!CCF JRST PROCD1 ; Treat like $P > IJRST3: HRRI T,DOITB MOVEM T,BCOM ; Store new PC word SOS T,I.NST HRRM T,PROC0 HRRI T,BCOM TLO T,20 MOVEM T,I.NST ; JRST @BCOM now JRST DOIT I.XCT: IFN EDDT&1,<DPB W1,[POINT 4,INSXCT,12]>; Make sure EXEC XCTs work right MOVE F,FLAGS SOSG XCTS JRST ERR ; Too many XCTs. TLNE F,CCF ; $$X ? JRST IIXCT1 HRRZ T,I.NSTEA PUSHJ P,PINST ; Print instruction PUSHJ P,CRF IIXCT1: HRRZ R,I.NSTEA JRST $X02 IIPUSHJ:AOS T,PROC0 HLL T,SAVPI ; PC word a normal PUSHJ would store MOVEM T,I.NSTPC MOVSI T,(1B4) ANDCAM T,SAVPI ; Clear funny flag in PC wd. SOS T,I.NST ; DOIT insists on incrementing the PC HRRM T,PROC0 HRLZI T,(<PUSH>-<PUSHJ>) DPB T,[POINT 5,I.NST,17] ; Clear AC,I fields JRST IPOPJ2 IPOPJ: EXCH F,FLAGS HRRZ R,AC0(W1) PUSHJ P,FETCH JRST ERR EXCH F,FLAGS HRRI T,-1(T) ; DOIT increments the PC HRRM T,PROC0 HRLZI T,(<POP>-<POPJ>) IPOPJ2: ADDM T,I.NST ; PUSHJPUSH, POPJPOP HRRZI T,I.NSTPC ; PC word to PUSH if PUSHJ HRRM T,I.NST IPUPO: TLOA F,FAC!PFLG IFSC: TLO F,FAC!FLA!IMM ; Floating AC, fixed immediate E JRST DOIT I.JSA: AOS T,PROC0 HRL T,I.NSTEA EXCH T,AC0(W1) JRST I.JSR2 ; Use JSR code to store old AC I.JSR: AOS T,PROC0 HLL T,SAVPI ; Make the PC word TLO F,FAC MOVSI W1,(1B4) ANDCAM W1,SAVPI ; Clear funny bit in flags I.JSR2: TLO F,EA EXCH F,FLAGS HRRZ R,I.NSTEA PUSHJ P,DEP JRST ERR EXCH F,FLAGS HRRZ T,I.NSTEA AOJA T,I.JSR4 I.JSP: AOS T,PROC0 HLL T,SAVPI MOVEM T,AC0(W1) MOVSI T,(1B4) ANDCAM T,SAVPI ; Clear funny bit HRRZ T,I.NSTEA I.JSR4: HRRM T,PROC0 TLC F,FAC EXCH F,FLAGS JRST TELL ; Simulation complete; do printout IJFFO: TLO F,DFAC ; 2 ACs JMPSKP: TRNE F,10000 JRST SKP ; Skip class; no trouble IAOBJ: TLOA F,FAC!IMM IJFCL: TLO F,FLG MOVEI T,JMP HRRM T,I.NST ; Make jump to us if they jump JRST DOIT JMP1: EXCH T,I.NSTEA ; They jumped; now we've got to simulate HRRM T,PROC0 ;STORE EFFECTIVE ADDRESS OF JUMP EXCH T,I.NSTEA JRST TELL ;DO PRINTOUT (DON'T INCREMENT PROC0) SKP: JUMPN W1,DOIT JUSTE: TLOA F,EA DBLI: TLO F,FAC!DFAC!IMM ; 2 ACs, immediate mode JRST DOIT DINT: TLO F,DFAC!DEA ;Dbl integer ins. (KL-10) JRST DOIT IEXTND: JRST SETEA ;KL-10 EXTEND instruction--nothing ; special until somebody uses it. TESTS: TRNN F,10000 TLOA F,FAC!IMM ; TRxx or TLxx TLO F,FAC ; TDxx or TSxx JRST DOIT ; I/O instructions IFN EDDT&1,< IOTS: TRNE W1,4 ; Skip if BLKx or DATAx CAIN W1,5 ; Skip if not CONI TLOA F,EA> JUSTI: TLO F,IMM JRST DOIT CHEKIS: TRC F,3000 TRCE F,3000 JRST CHECKI ; Check for immediate mode JRST SKP ; Self mode SET: ANDI F,3000 ; SETZx or SETOx come here CAIE F,2000 ; Skip if SETZM or SETOM TLO F,FAC TRNE F,2000 ; Skip if not SETZM,SETZB,SETOM,SETOB TLO F,EA JRST DOIT MULDIV: ANDI F,3000 CAIE F,2000 ; Skip if to memory only TLO F,DFAC CHECKI: TRNE F,1000 TRNE F,2000 SETEA: TLOA F,FAC!EA ; Memory reference instruction SETI: TLO F,FAC!IMM ; Immediate mode instruction DOIT: EXCH F,FLAGS JRST DOITA IFE EDDT&1,< MONUI__JUSTI MONUE__JUSTE MONUAI__SETI MONUAE__SETEA MONINI__MONIN1 IOTS__MONUI > SKIP%: AOS PROC0 NOSKIP: AOS PROC0 TELL: IFN EDDT&1,< MOVEI T, DPB T,[POINT 4,INSXCT,12] ; Zap AC field so EXEC XCTs only affect 1 instruction. > MOVE F,SAV0 TLNE F,CCF ; Don't print if $$X JRST NXTIT EXCH F,FLAGS PUSH P,SCH ; Save current output mode TLNE F,FLA ; Floating AC to print ? MOVEI SCH,TFLOT TLNE F,FAC PUSHJ P,FAC0 ; Print AC TLNE F,DFAC PUSHJ P,DBL0 ; Print 2nd AC TLNE F,FLG PUSHJ P,FLG0 ; Print the flags MOVE SCH,(P) ; Restore old output mode. TLNE F,FLE MOVEI SCH,TFLOT ; Floating memory to print ; TLNE F,IMM ; PUSHJ P,IMM0 ; Just print E in immediate mode TLNE F,EA PUSHJ P,EA0 ; Print (E) if memory referencing instruction TLNE F,DEA PUSHJ P,DEA0 ; Print 2nd memory word TLNE F,PFLG PUSHJ P,PFLG0 ; Print stack word if PUSHx or POPx POP P,SCH EXCH F,FLAGS PUSHJ P,CRF ; Test whether to continue; print next instruction if required. NXTIT: HRRZ T,PROC0 MOVEI W1,1(T) HRRZM W1,BCOM ; Store for $P HRRZ W1,LOCSAV ; Old PC SKIPL XTEM ; $$X with no argument ? JRST NXT0 ; No CAIE T,1(W1) CAIN T,2(W1) JRST $XQUIT NXT0: PUSHJ P,LISTEN ; Did he type anything ? JRST NXT1 ; Nope $XQUIT: SETZM XTEM TLZ F,CCF NXT1: TLNE F,CCF ; $$X ? JRST NXT2 ; Yes HRRZ T,PROC0 CAIE T,1(W1) PUSHJ P,CRF ; Extra CRLF  instruction skipped HRRZ T,PROC0 PUSHJ P,PINST ; Print next instruction SKIPE XTEM PUSHJ P,CRF NXT2: SKIPE XTEM JRST $X01 IFE EDDT&1,< CLRBFI ; *** Done *** >;IFE EDDT&1 JRST DD2 ; The sundry output routines PFLG0: MOVE T,I.NSTAC HRRZ T,AC0(T) ; Get adr of stack JRST EA2 DBL0: AOS T,I.NSTAC TRZA T,777760 ; Modulo 20 FAC0: MOVE T,I.NSTAC JRST EA2 FLG0: PUSHJ P,LCT ; Print TAB HLRZ T,SAVPI REPEAT 0,< JRST IMM1 IMM0: PUSHJ P,LCT ; Print TAB HRRZ T,I.NSTEA TLNE F,FLE ; Floating memory operand ? MOVS T,T ; Yes; immediate swaps halves >; REPEAT 0 IMM1: EXCH F,FLAGS PUSHJ P,CONSYM ; Type (T) JRST EA6 DEA0: AOSA T,I.NSTEA EA0: MOVE T,I.NSTEA ; Address of memory operand EA2: EXCH F,FLAGS PUSH P,T PUSHJ P,LCT ; Print a TAB POP P,T PUSHJ P,LI1 ; Print ADR/ CONTENTS EA6: EXCH F,FLAGS POPJ P, PINST: PUSH P,SCH ; Save current output mode MOVEI SCH,PIN ; Force symbolic output PUSHJ P,LI1 PUSHJ P,LCT POP P,SCH POPJ P, ; SWAP swaps user's and DDT's ACs or vice-versa SWAP: 0 EXCH 0,AC0 MOVEM 0,SAV0 MOVE 0,[EXCH 1,AC0+1] SWAPL: XCT 0 ADD 0,[XWD 40,1] TLNN 0,1000 JRST SWAPL MOVE 0,SAV0 JRST @SWAP ;INTERPRETATION IXCT4: ;INTERPRET UUO IFE EDDT&1,< SUBI T,041 JUMPE T,IINIT ;INIT UUO HAS TO BE DONE SPECIAL AOJGE T,IXCT6 ;JUMP IF SYSTEM UUO. (DON'T INTERPRET) > MOVEM R,40 ;INTERPRET FOR NON-SYSTEM UUOS MOVEI R,41 JRST IXCT ;(INTERPRETAION OF EXECUTIVE XCT OF A PC-STORING JUMP WILL STORE WRONG PC) IIXCT: ;HERE TO INTERPRET XCT. IFN EDDT&1,< JUMPN W1,IXCT6 ;JUMP IF EXECUTIVE XCT> IXCT: SOSL TEM1 ;COUNT LOOPS THRU INTERPRETER PUSHJ P,FETCH JRST BPLUP ;BREAKPOINT LOOPING OR FETCH FAILED MOVEM T,LEAV ;STORE INSTR. TO EXECUTE. IXCT5: LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION CAIN T,254 ;JRST IS NORMAL JRST IXCT6 HRLZI 17,AC0 ;SETUP ACS TO ALLOW EFFECT ADDRESS CALC. BLT 17,17 MOVEI T,@LEAV ;CALCULATE EFFECTIVE ADDRESS. DPB T,[POINT 23,LEAV,35] ;STORE EFFECTIVE ADDRESS, CLEAR X AND @ LDB W1,[POINT 4,LEAV,12] ;PICK UP AC FIELD LDB T,[POINT 9,LEAV,8] ;PICK UP INSTRUCTION FIELD MOVEI P,PS ;AND GET A STACK CAIN T,260 JRST IPUSHJ ;INTERPRET PUSHJ CAIN T,264 JRST IJSR ;INTERPRET JSR CAIN T,265 JRST IJSP ;INTERPRET JSP CAIN T,266 JRST IJSA ;INTERPRET JSA MOVE R,LEAV ;GET ENTIRE INSTR. (INCASE OF UUO OR XCT) TRNN T,700 JRST IXCT4 ;INTERPRET UUO CAIN T,256 JRST IIXCT ;INTERPRET XCT (MAY BE EXEC EXECUTE) IXCT6: MOVE W,LEAV ;FOR RESTORE TO XCT MOVEI T,@BCOM ;GET RETURN ADR JRST RESTORE BPLUP: PUSHJ P,REMOVB ;BREAKPOINT PROCEED ERROR BPLUP1: JSR SAVE JFCL JRST ERR IFE EDDT&1,< ;INTERPRET INIT UUO IINIT: MOVE T,LEAV MOVEM T,INITL ;SET UP TO DO THE INIT HERE MOVEI R,@BCOM ;THE LOC OF INIT+1 PUSHJ P,FETCH JRST BPLUP MOVEM T,INITL+1 ADDI R,1 PUSHJ P,FETCH JRST BPLUP MOVEM T,INITL+2 MOVEI T,2 ADDM T,BCOM ;INCREMENT RETURN ADR INITL: 0 ;INIT 0 ;DEVICE 0 ;BUFFERS SKIPA ;FAILURE RETURN AOS BCOM ;SUCCESS - SKIP RETURN MOVEI T,@BCOM ;GET RETURN ADR JRST IJSR4 ;AND MAKE LIKE A JSR >;IFE EDDT&1 IPUSHJ: DPB W1,[POINT 4,CPUSHP,12] ;STORE AC FIELD INTO A PUSH SETZM TEM3 MOVE W,CPUSHP ;GET A PUSH INSTR MOVE T,LEAV JRST RESTR1 CPUSHP: PUSH IJSA: MOVE T,BCOM ;INTERPRET JSA HRL T,LEAV EXCH T,AC0(W1) JRST IJSR2 IJSR: MOVE T,BCOM ;INTERPRET JSR HLL T,SAVPI IJSR2: MOVE R,LEAV PUSHJ P,DEP AOSA T,LEAV IJSR3: MOVE T,LEAV IJSR4: MOVSI W,(<JFCL>) JRST RESTORE IJSP: MOVE W,BCOM ;INTERPRET JSP HLL T,SAVPI MOVEM W,AC0(W1) JRST IJSR3 ;INSERT BREAKPOINTS INSRTB: MOVE S,[JSR BP1] INSRT1: SKIPE R,B1ADR-BP1(S) PUSHJ P,FETCH JRST INSRT3 MOVEM T,B1INS-BP1(S) MOVE T,S PUSHJ P,DEP INSRT3: ADDI S,4 CAMG S,[JSR BPN] JRST INSRT1 POPJ P, ;REMOVE BREAKPOINTS REMOVB: MOVEI S,BNADR REMOV1: MOVE T,B1INS-B1ADR(S) SKIPE R,(S) PUSHJ P,DEP SUBI S,4 CAIL S,B1ADR JRST REMOV1 IFN EDDT&1,<JRST TTYRET> IFE EDDT&1,<POPJ P,> ;IN EXEC MODE, SAVE UP TTY STATUS ;IN USER MODE, DONE BY SAVE SUBTTL DDT - PROCESS BREAKPOINT COMMANDS ;ALL $B COMMANDS OF FORM <A>$<N>B BPS: TLZE F,QF JRST BPS1 TRZE F,Q2F JRST BPS2 MOVE T,[XWD B1ADR,B1ADR+1] SETZM B1ADR BLT T,AUTOPI ;CLEAR OUT ALL BREAKPOINTS AND AUTO PROCEDE REGESTER JRST RET BPS1: TRZN F,Q2F JRST BPS3 MOVE R,T TRO F,2 BPS2: MOVE T,WRD2 CAIL T,1 CAILE T,NBP JRST ERR IMULI T,4 ADDI T,B1ADR-4 TRZN F,ITF JRST MASK2 EXCH R,T JRST BPS5 BPS3: MOVEI R,B1ADR ;PROCESS THE A$B BPS4: HRRZ W,(R) CAIE W,(T) SKIPN (R) JRST BPS5 ADDI R,4 CAIG R,BNADR JRST BPS4 JRST ERR BPS5: MOVEM T,(R) SETZM 1(R) SETZM 2(R) SETZM 3(R) IFN EDDT&20,< SKIPP1 ;BREAKPOINTS CONDITIONAL ON WHO PLANTED THEM SKIPA S,[SKIPP2] MOVE S,[SKIPP1] MOVEM S,B1SKP-B1ADR(R) ;MAKE BREAK POINTS CONDITIONAL! > AUTOP: SUBI R,B1ADR ;AUTO PROCEED SETUP IDIVI R,4 MOVEI S,1 LSH S,(R) ANDCAM S,AUTOPI TLNE F,CCF IORM S,AUTOPI POPJ P, SUBTTL DDT - FETCH AND DEPOSIT INTO MEMORY DEPRS: MOVEM T,LWT ;DEPOSIT REGISTER AND SAVE AS LWT MOVE R,LLOCO ;QUAN TYPED IN REGIS EXAM TLZE F,ROF ;WAS A REGISTER OPEN (SKIP IF NOT) TLNN F,QF ;AND A QUANTITY TYPED? POPJ P, ;NO REGISTER OPEN, OR NO QUANTITY TYPED. DEP: IFE UEDDTS,< TRNN R,777760 ;IS ADDRESS ABOVE ACS? JRST DEP1 ;CHANGE THE ACS WE HAVE SAVED. >;NOT UEDDT PUSH P,R PUSH P,T HRRZ R,R AOS -2(P) PUSHJ P,XDEP SOS -2(P) POP P,T POP P,R POPJ P, XDEP: IFE UEDDTS,< ;NOT UEDDT IFE EDDT&1,< ;USER DDT HRRZ W,JOBREL ;CHECK FOR LOWER SEGMENT ADDRESS CAIL W,(R) JRST DEP0 ;ADDRESS OK. ADDI W,1 ;FIRST ADDRESS ABOVE LOWER MAY BE IN UPPER CAIGE W,400000 ;COMPUTE FIRST ADDRESS IN UPPER. MOVEI W,400000 ; CAILE W,(R) ;IS DESIRED ADDRESS ABOVE START OF UPPER? POPJ P, ;ILLEGAL ADDRESS ABOVE LOWER, NOT IN UPPER HRRZ W,JOBHRL ;GET LAST ADDRESS IN UPPER CAIL W,(R) ;DEPOSIT IN BOUNDS? DEP0: MOVEM T,0(R) ;STUFF IT. POPJ P,> ;RETURN. ;IFE EDDT&1 IFN EDDT&1,< ;EXEC DDT IFN FTDSWP,< ;SWAPPING EXEC DDT PUSHJ P,SWPDEP ;SPECIAL SWAPPING DEPOSIT ROUTINE. POPJ P, > ;DEPOSIT DONE, OR LOST! HRRZ W,JOBREL ;USE SYSTEM JOBREL FOR EXEC DDT CAILE W,(R) ;DEPOSIT IN BOUNDS? MOVEM T,0(R) ;STUFF IT. POPJ P,> ;RETURN. ;IFN EDDT&1 >;IFE UEDDTS IFN UEDDTS,< SKIPE EXJOBN ;EX-DEP IN JOB?? POPJ P, ;YES, LOSE CAMG R,MEMSIZ ;ADDRESS IN BOUNDS? SKIPN SPCFLG ;YES. HAS PROGRAM BEEN REENTERED? JRST UDEPLZ ;NO. LOSE. MOVEM T,SPCWRD# ;SAVE DATA FOR SPACEWAR MOVEM R,SPCADR# ;SAVE ADDRESS FOR SPACEWAR SKIPN MAINTM ;DON'T LOG CHANGES IF THE SYSTEM IS DOWN PUSHJ P,LOGIT ;LOG INTO UEDDT.LOG GETPR2 T, ;GET OLD VALUE OF SECOND PROT/RELOC REGISTER PUSH P,T ;SAVE IT MOVE R,SPCADR ;GET ADDRESS WE'RE STORING INTO SKIPN EXMMAP ;SKIP IF EXAMINE/DEPOSIT VIA EXPGT. JRST UDTDP1 ;EX/DEP IN PHYSICAL CORE LDB T,[POINT 9,R,26] ;GET THE PAGE NUMBER OF REQUEST SKIPL EXMMAP JRST DPTHIC ;DEPOSIT IN HIGH PHYSICAL CORE. SKIPN T,EXPGT(T) ;IS THERE AN EXPGT ENTRY FOR IT? JRST UDTDP1 ;NO. EXAMINE PHYSICAL CORE INSTEAD. DPTHIX: HRRZ T,T LSH T,5 ;MOVE PAGE NUMBER OVER FOR GETHI IOR T,[1,,20] ;1 PAGE, WRITEABLE. GETHI T, ;ATTACH ONE PAGE AS HIGH-SEG JRST DPTEXL ;LOSE? ANDI R,777 ;LEAVE LOW BITS MOVE T,SPCWRD ;GET THE WORD. MOVEM T,400000(R) ;STUFF. JRST UDTDP2 ;AND EXIT DPTHIC: ADD T,EXMMAP ;HERE IF EXMMAP IS POSITIVE. ADD AS OFFSET JRST DPTHIX DPTEXL: OUTSTR [ASCIZ/GETHI failed for deposit /] JRST UDTDP2 UDTDP0: HRRZ T,R CAMLE T,MEMSIZ POPJ P, PUSHJ P,PRSET UDTDP1: MOVEI T,@PROFF CAMLE T,PRMAX JRST UDTDP0 GETPR2 R, TLZ R,1 ;SET WRITEABLE SETPR2 R, JFCL MOVE R,SPCWRD ;GET THE DATA TO STORE. MOVEM R,400000(T) UDTDP2: POP P,T ;RESTORE OLD SETPR2 SETPR2 T, JFCL POPJ P, UDEPLZ: OUTSTR [ASCIZ/DEPOSIT NOT ENABLED! /] POPJ P, > DEP1: MOVEM T,AC0(R) POPJ P, FETCH: PUSH P,R ;SOME CALLERS WANT COUNTS IN THE LEFT AOS -1(P) ;AND SOME ROUTINES BELOW WANT ONLY 18 BITS HRRZ R,R PUSHJ P,XFETCH SOS -1(P) POP P,R POPJ P, XFETCH: IFE UEDDTS,< IFE EDDT&1,< HRRZ T,JOBREL ;CHECK FOR LOWER SEGMENT ADDRESS CAIL T,(R) JRST FETCH0 ;ADDRESS OK. ADDI T,1 ;FIRST ADDRESS ABOVE LOWER MAY BE IN UPPER CAIGE T,400000 ;COMPUTE FIRST ADDRESS IN UPPER. MOVEI T,400000 ; CAILE T,(R) ;IS DESIRED ADDRESS ABOVE START OF UPPER? POPJ P, ;ILLEGAL ADDRESS ABOVE LOWER, NOT IN UPPER HRRZ T,JOBHRL ;GET LAST ADDRESS IN UPPER CAIGE T,(R) ;DEPOSIT IN BOUNDS? POPJ P, FETCH0: TRNN R,777760 ;AC REF? SKIPA T,AC0(R) MOVE T,0(R) ;GET IT. JRST CPOPJ1> ;RETURN. ;IFE EDDT&1 IFN EDDT&1,< IFN FTDSWP,< PUSHJ P,SWPEXM JRST CPOPJ1 ;EXAMINE DONE, OR LOST JRST CPOPJ1 ;DISK REF FAILED! >;IFN FTDSWP HRRZ T,JOBREL CAIGE T,(R) POPJ P, ;OUT OF BOUNDS TRNN R,777760 SKIPA T,AC0(R) ;MAKE AC REFERENCE MOVE T,(R) ;REFERENCE REAL CORE JRST CPOPJ1 >;IFN EDDT&1 >;IFE UEDDTS IFN UEDDTS,< SKIPE EXJOBN ;EXAMINING JOB? JRST JEXM ;YES, DO IT! SKIPE EXMMAP ;EXAMINE USING EXPGT? JRST EXPEXM ;YES. NOEXPE: MOVEI T,@PROFF CAMLE T,PRMAX JRST [HRRZ T,R CAMLE T,MEMSIZ POPJ P, PUSHJ P,PRSET JRST XFETCH] MOVE T,400000(T) JRST CPOPJ1 EXPEXM: LDB T,[POINT 9,R,26] ;GET THE PAGE NUMBER OF REQUEST SKIPL EXMMAP ;SKIP IF EXAMINE VIA EXPGT. JRST EXMHIC ;NO - EXAMINE HIGH PHYSICAL CORE. SKIPN T,EXPGT(T) ;IS THERE AN EXPGT ENTRY FOR IT? JRST NOEXPE ;NO. EXAMINE PHYSICAL CORE INSTEAD. EXMHIX: PUSH P,T GETPR2 T, EXCH T,(P) ;OLD PR ON STACK. HRRZ T,T LSH T,5 ;MOVE PAGE NUMBER OVER FOR GETHI HRLI T,1 ;NUMBER OF PAGES GETHI T, ;ATTACH ONE PAGE AS HIGH-SEG JRST EXPEXL ;LOSE? ANDI R,777 ;LEAVE LOW BITS MOVE T,400000(R) ;FETCH DATA EXPXIT: EXCH T,(P) SETPR2 T, HALT . POP P,T JRST CPOPJ1 EXMHIC: ADD T,EXMMAP ;HERE FOR EXAMINE HIGH PHYSICAL CORE. JRST EXMHIX EXPEXL: OUTSTR [ASCIZ/GETHI failed? /] MOVEI T,0 JRST EXPXIT JEXM: TRNE R,777760 ;AC? JRST JEXM1 MOVE T,[-1,,JOBPC^] ;GET PC WORD MOVEM T,EXJOBN+1 MOVEI T,EXJOBN JOBRD T, POPJ P, ;LOSE MOVE T,EXJWRD ;GET LOSERS PC TLNE T,10000 ;USRMOD? ADDI R,20 ;YES, AC'S ARE REALLY HERE JEXM1: HRROM R,EXJOBN+1 ;SET ADDRESS AND WORDCOUNT OF 1 MOVEI T,EXJOBN JOBRD T, ;EXAMINE LOSER CORE POPJ P, ;LOSE MOVE T,EXJWRD JRST CPOPJ1 >;IFN UEDDTS FIRARG: MOVEM T,DEFV TLO F,FAF JRST ULIM1 ULIM: TLO F,SAF HRRZM T,ULIMIT ULIM1: TLNN F,QF JRST ERR JRST LIS0 SUBTTL DDT - PRINT INSTRUCTION. PIN,LFPIN,RFPIN,CONSYM CONSYM: MOVEM T,LWT TRNN F,LF1 JRST (SCH) ;PIN OR FTOC TRNE F,CF1 JRST FTOC LFPIN: JFCL RFPIN: JFCL ;FOR L AND V MODES (JUST SO THEY ARE NOT PIN) PIN: TLC T,700000 ;PRINT INSTRUCTION TLCN T,700000 JRST INOUT ;IN-OUT INSTRUCTION OR NEG NUM AND T,[XWD 777000,0] JUMPE T,HLFW PUSHJ P,OPTYPE PIN1: MOVSI T,777000 AND T,LWT TRNN F,ITF ;HAS INSTRUCTION BEEN TYPED? PUSHJ P,LOOK ;NO, LOOK IN SYMBOL TABLE JRST PIN1A ;WIN. JRST HLFW ;INEXACT MATCH, OUTPUT AS HALFWORDS JRST HLFW ;NO MATCH AT ALL PIN1A: TRO F,NAF ;INSTRUCTION TYPED, ALLOW NEG ADDRESSES PUSHJ P,TSPC LDB T,[XWD 270400,LWT] ;GET AC FIELD JUMPE T,PI4 PUSHJ P,PAD PI3A: MOVEI W1,"," PUSHJ P,TEXT IFE EDDT&1!UEDDTS,<INOU1:> PI4: MOVE W1,LWT MOVEI T,"@" TLNE W1,20 ;CHECK FOR INDIRECT BIT PUSHJ P,TOUT HRRZ T,LWT LDB W,[XWD 331100,LWT] ;INSTRUCTION BITS CAIL W,240 CAILE W,247 JRST PI8 TLNN W1,20 ;INDIRECT CAIN W,<JFFO>-33 JRST PI8 ;AND JFFO GET SYMBOLIC PUSHJ P,PADS3A PI7: TRZ F,NAF LDB R,[XWD 220400,LWT] ;INDEX REGISTER CHECK JUMPE R,CPOPJ ;EXIT MOVEI T,"(" PUSHJ P,TOUT MOVE T,R PUSHJ P,PAD MOVEI T,")" JRST TOUT ;EXIT PI8: CAIE SCH,LFPIN ;IN ONE OF THE FLAG MODES? CAIN SCH,RFPIN ;? JRST RLFFLG ;YES. PI8A: PUSHJ P,PAD JRST PI7 ; PRINT HALFWORDS, PRINT ADDRESS HLFW: HLRZ T,LWT ;PRINT AS HALF WORDS JUMPE T,HLFW1 TRO F,NAF ;ALLOW NEGATIVE PUSHJ P,PAD MOVSI W1,(<ASCII /,,/>) PUSHJ P,TEXT2 HLFW1: HRRZ T,LWT ;PRINT ADDRESS PAD: JRST (AR) ;PADSO OR PAD1 PADSO: JUMPE T,TOC2+1 PUSHJ P,LOOK POPJ P, ;WIN. SKIPA W2,1(W1) ;INEXACT MATCH JRST PADS3 ;NO MATCH AT ALL CAMGE T,MXINC CAIGE W2,60 JRST PADS3 MOVEM T,TEMDDT JUMPGE F,TOC ;EXIT PUSHJ P,SPT0 MOVEI T,"+" PADS1A: PUSHJ P,TOUT HRRZ T,TEMDDT JRST TOC ;EXIT PADS3: MOVE T,TEMDDT PADS3A: TRNE F,NAF CAIGE T,776000 JRST TOC PADS3B: CAMN T,[-1,,0] JRST PADS3C ;SPECIAL CASE THAT PRINTS WRONG MOVNM T,TEMDDT MOVEI T,"-" JRST PADS1A PADS3C: MOVEI T,"-" PUSHJ P,TOUT MOVSI T,1 JRST TOC INOUT: TLC T,-1 ;IS IT PERHAPS NEGATIVE TLCN T,-1 JRST PADS3B ;LEFT HALF IS -1 TLC T,777000 TLCN T,777000 ;THIS IS ALMOST AS GOOD JRST HLFW ;PRINT AS A HALF WORD IFE IOTLG,< JRST PIN1> ;PRINT AS INSTRUCTION IFG IOTLG,< ;COMPILE ONLY IF THERE ARE DEVICES KNOWN MOVSI R,-IOTLG ;GET LENGTH OF IOT DEVICE TABLE LDB W2,[POINT 7,T,9] ;GET DEVICE NUMBER LSH W2,2 ;TIMES 4 CKIOT: CAME W2,IOTBL(R) ;THERE? AOBJN R,CKIOT JUMPGE R,PIN1 ;PRINT AS AN INSTRUCTION PUSH P,R ;SAVE INDEX TO IOTBL LDB R,[POINT 3,T,12] DPB R,[POINT 6,T,8] ;MOVE IO BITS OVER FOR OP DECODER PUSHJ P,OPTYPE ;TYPE OPCODE PUSHJ P,TSPC ;TYPE SPACE POP P,R ;GET INDEX TO IOTB2 MOVEI W1,IOTB2(R) ;GET POINTER TO RADIX50 OF THE DEVICE NAME PUSHJ P,SPT1W ;PRINT RADIX50 OF 0(W1) WITHOUT TYPE BITS JRST PI3A >;IFG IOTLG SUBTTL DDT - $M, $N, $W, $E COMMANDS MASK: TLNE F,QF JRST MASK1 MOVEI T,MSK MASK2: MOVEI W,1 MOVEM W,FRASE1 JRST QUAN1 MASK1: MOVEM T,MSK JRST RET EFFEC: TLO F,LTF HRRZ T,T WORD: MOVEI R,322000-326000 ;JUMPE-JUMPN NWORD: ADDI R,326000+40*T ;JUMPN T, HRLM R,SEAR2 TLZN F,QF JRST ERR SETCAM T,WRD MOVSI T,FRASE-DENDDT-1 ;PREVENT TYPE OUT OF DDT PARTS SETCMM FRASE(T) AOBJN T,.-1 MOVE T,ULIMIT TLNE F,SAF TLO F,QF PUSHJ P,SETUP1 ;RETURNS R=-WC,,MA FOR SEARCH PUSHJ P,CRF SEAR1A: MOVEI T,1000 ;LOOP COUNT MOVEM T,SERLPC SEAR1: PUSHJ P,FETCH JRST SEAR2A TLNE F,LTF ;CHECK FOR EFFECTIVE ADDRESS SEARCH JRST EFFEC0 EQV T,WRD AND T,MSK SEAR2: JUMPE T,SEAR3 ;OR JUMPN T, (INSTR IS CLOBBERED ABOVE) SEAR2A: SOSLE SERLPC ;ONLY LISTEN TO TTY EVERY 1000 TIMES JRST SEAR2C PUSHJ P,LISTEN ;QUIT ON TELETYPE CAIA JRST SEAR2B ;A KEY WAS STRUCK. QUIT NOW. MOVEI T,2000 MOVEM T,SERLPC ;RESET LOOP COUNT. SEAR2C: CAMN R,[-1] ;LOSING AOBJN WILL SCREW THIS UP!!!! JRST SEAR2B ;END AOBJN R,SEAR1 TLNE R,777777 ;DID IT JUST GET TO 0 OR IS IT LARGER THAN 128K? JRST SEAR1 ;BIG SEARCH SEAR2B: SETCMM LWT JRST DD1 SERLPC: 0 SEAR3: PUSHJ P,FETCH JRST ERR TLZ F,STF ;TURN OFF SUPRESS OUTPUT MOVEM R,TEM2 MOVEM R,T PUSHJ P,LI1 PUSHJ P,CRF SETCMM LWT SETCMM TEMDDT SETZM SERLPC ;CLEAR LOOP COUNT. LISTEN TO TTY AGAIN. SEAR4: MOVE R,TEM2 JRST SEAR2A EFFEC0: TLNE F,CCF ;DOUBLE ALTMODE? JRST EFFECR ;YES, NO @() CHECK -- RPH 5-12-73 MOVEM R,TEM2 PUSHJ P,EFFECA JRST SEAR4 ;LOST ON EFF ADR CALC MOVE R,TEM2 EFFECR: EQV T,WRD ANDI T,777777 JRST SEAR2 EFFECA: MOVEI W,100 MOVEM W,TEMDDT EFFEC1: MOVE W,T LDB R,[POINT 4,T,17] ;GET IR FIELD JUMPE R,EFFEC2 HRRZ T,AC0(R) ADD T,W EFFEC2: HRR R,T TLNN W,20 ;INDIRECT BIT CHECK JRST EFFEC3 SOSE TEMDDT PUSHJ P,FETCH POPJ P, ;ERROR RETURN JRST EFFEC1 EFFEC3: HRRZS T ;HALFWORD ONLY JRST CPOPJ1 ;SKIP RETURN SUBTTL DDT - $$Z SETUP: TROA F,R20F ;HERE FOR $Z ONLY SETUP1: TRZ F,R20F TLNN F,SAF IFE UEDDTS,< MOVE T,JOBREL> IFN UEDDTS,< MOVE T,MEMSIZ> ;SYSTEM JOBREL PTR. HRRZ T,T MOVEM T,ULIMIT ;UPPER LIMIT IFE UEDDTS,< CAMLE T,JOBREL> IFN UEDDTS,< CAMLE T,MEMSIZ> JRST ERR HRRZ R,DEFV ;R_LOWER LIMIT IF ONE WAS SUPPLIED TLNN F,FAF MOVEI R,0 ;NO EXPLICIT LOWER LIMIT. USE ZERO CAML R,ULIMIT JRST ERR MOVEM R,DEFV MOVEI W,-1(R) ;RPH 3-17-72 SUB W,ULIMIT HRLM W,R ;R_-WC,,FIRST ADDRESS. POPJ P, ZERO: TLNN F,CCF ;$$Z ? JRST ERR ;NO ONE ALTMODE ISN'T ENOUGH. MOVE W2,T ;VALUE TO SPREAD. TLNN F,QF MOVEI W2,0 ;IF NONE, SPREAD ZERO HRRZ T,ULIMIT PUSHJ P,SETUP ;RETURNS R=-WC,,MA ZERO1: TRNE R,777760 ;STORE IN AC? JRST ZERO2 ;NO. MOVEM W2,AC0(R) ;STORE IN OUR VERSION OF USER'S ACS. AOBJN R,ZERO1 ;LOOP WHILE IN AC JRST DD1 ZERO2: HRRZ R,R ;ADDRESS OF NEXT WORD TO STORE INTO CAIGE R,ZLOW MOVEI R,ZLOW ;DON'T ZERO 20-ZLOW HRRZ S,T ;UPPER LIMIT CAILE S,DDTBEG-1 MOVEI S,DDTBEG-1 CAML S,R ;DON'T DO ANYTHING IF UPPER LESS THAN LOWER JSP W,ZEROR ;S=HIGH, R=LOW. HRRZ R,R CAIGE R,DDTEND ;DON'T ZERO OUT MOVEI R,DDTEND ;DDT HRRZ S,T CAML S,R JSP W,ZEROR JRST DD1 ZEROR: HRL R,R MOVEM W2,(R) ADDI R,1 BLT R,(S) JRST (W) SUBTTL DDT - OUTPUT ROUTINES TOCC, FTOC, TOC, TOCA TOCC: TRO F,EQF ;SET TO REAL NUMERIC MODE FTOC: TOC: HRRZ W1,ODF CAIN W1,12 JRST TOC4 TRZE F,EQF ;REAL NUMERIC MODE? JRST TOCA ;YES. CAIN W1,10 TLNN T,-1 ;IF RADIX NOT 10, OR LEFT HALF EMPTY JRST TOCA ;PRINT HRRM T,TOCS ;SAVE RIGHT HALF HLRZS T PUSHJ P,TOCA ;PRINT LEFT HALF MOVSI W1,(<ASCII /,,/>) PUSHJ P,TEXT2 TOCS: MOVEI T,0 ;** RIGHT HALF MODIFIED TOCA: LSHC T,-43 LSH W1,-1 ;W1=T+1 TOC1: DIVI T,(ODF) HRLM W1,0(P) TOC3: JUMPE T,TOC2 PUSHJ P,TOCA TOC2: HLRZ T,0(P) ADDI T,"0" JRST TOUT ;DOES POPJ TO TOC2 OR EXIT TOC4: MOVM W1,T JUMPGE T,TOC5 MOVEI T,"-" PUSHJ P,TOUT TOC5: MOVEI T,0 PUSHJ P,TOC1 TOC6: MOVEI T,"." JRST TOUT ;FLOATING POINT OUTPUT TFLOT: MOVE A,T JUMPG A, TFLOT1 JUMPE A,FP1A MOVNS A MOVEI T,"-" PUSHJ P,TOUT TLZE A,400000 JRST FP1A TFLOT1: TLNN A, 400 JRST FP7A ;UNNORMALIZED FLOATING PRINT AS DECIMAL FP1: MOVEI B,0 CAMGE A,FT01 JRST FP4 CAML A,FT8 AOJA B,FP4 FP1A: MOVEI C,0 FP3: MULI A,400 ASHC B,-243(A) MOVE A,B SETZM TEM1 PUSHJ P,FP7 PUSHJ P,TOC6 ;PRINT DECIMAL POINT MOVNI A,10 ADD A,TEM1 MOVE W1,C FP3A: MOVE T,W1 MULI T,12 PUSHJ P,FP7B SKIPE W1 AOJL A,FP3A POPJ P, FP4: MOVNI C,6 MOVEI W2,0 FP4A: ASH W2,1 XCT FCP(B) JRST FP4B FMPR A,@FCP+1(B) IORI W2,1 FP4B: AOJN C,FP4A PUSH P,FSGN(B) PUSHJ P,FP3 POP P,W1 MOVE A,W2 PUSHJ P,TEXT FP7: JUMPE A,FP7A2 IDIVI A,12 AOS TEM1 HRLM B,(P) JUMPE A,FP7A1 PUSHJ P,FP7 FP7A1: HLRZ T,(P) FP7B: ADDI T,260 JRST TOUT FP7A: PUSHJ P,FP7 MOVEI T,"." JRST TOUT ;PRINT WITH A . FP7A2: MOVEI T,"0" JRST TOUT 353473426555 ;1.0E32 266434157116 ;1.0E16 FT8: 233575360400 ;1.0E8 216470400000 ;1.0E4 207620000000 ;1.0E2 204500000000 ;1.0E1 FT: 201400000000 ;1.0E0 026637304365 ;1.0E-32 113715126246 ;1.0E-16 146527461671 ;1.0E-8 163643334273 ;1.0E-4 172507534122 ;1.0E-2 FT01: 175631463146 ;1.0E-1 FT0__FT01+1 FCP: CAMLE A, FT0(C) CAMGE A, FT(C) XWD C,FT0 FSGN: ASCII .E-. ASCII .E+. TEXTT: MOVE W1,T TEXT: TLNN W1,774000 ;LEFT JUSTIFIED UNLESS LEFT CHAR IS NULL LSH W1,35 ;OUTPUT ONE RIGHT JUST. CHR. TEXT2: MOVEI T,0 LSHC T,7 CAILE T,04 ;EOT PUSHJ P,TOUT JUMPN W1,TEXT2 POPJ P, ;RPH 7-29-72 TYPE OUT TTY INPUT BUFFERS TEXTT9: MOVE W1,T TEXTT0: MOVEI T,0 LSHC T,11 PUSH P,T LSH T,-7 PUSH P,T SKIPA T,["^"] PUSHJ P,TOUT SOSL (P) JRST .-2 POP P,(P) POP P,T ANDI T,177 SKIPE T PUSHJ P,TOUT JUMPN W1,TEXTT0 POPJ P, SUBTTL EXEC DDT - PAPER TAPE MANIPULATIONS IFE EDDT&3-3,< ;PUNCH SINGLE REGISTER - CALLED BY $<CONTROL T> PSR: TLNN F,ROF ;(NO REFS TO PSR???) JRST ERR MOVEM T,LWT PUSHJ P,DEPRS HRRZM R,DEFV ;R CONTAINS LLOCO MOVE T,R JRST PUN2 ;PUNCH TAPE. CALLED BY FIRST<LAST><CONTROL R> PUNCH: TLC F,FAF+QF ;PUNCH CORE TO TAPE IN RANGE GIVEN TLCE F,FAF+QF JRST ERR ;ONE ARGUMENT MISSING PUN2: ADDI T,1 HRRZM T,TEM1 SUB T,DEFV JUMPLE T,ERR ;RANGE IS EMPTY PUN1: MOVEI T,10 PUSHJ P,FEED HRRZ R,DEFV IORI R,37 ADDI R,1 CAMLE R,TEM1 MOVE R,TEM1 EXCH R,DEFV MOVE T,R SUB T,DEFV HRL R,T JUMPGE R,RET ;EXIT OF PUNCH PBLK: MOVE T,R ;PUNCH ONE BLOCK SOS W,T ;ADDRESS? PUSHJ P,PWRD PBLK1: PUSHJ P,FETCH JRST ERR ADD W,T PUSHJ P,PWRD AOBJN R,PBLK1 MOVE T,W PUSHJ P,PWRD ;CHECKSUM JRST PUN1 ;PUNCH A LOADER - CALLED BY $<CONTROL Q> LOADER: TLNE F,QF ;THIS PUNCHES A LOADER ONTO THE TAPE JRST ERR MOVEI T,400 PUSHJ P,FEED MOVE R,LOADE ;AOBJN POINTER TO LOADER LOAD1: MOVE T,0(R) PUSHJ P,PWRD AOBJN R,LOAD1 MOVEI T,100 LOAD2: PUSHJ P,FEED JRST RET ;PUNCH END BLOCK - CALLED BY ADDR$<CONTROL S> BLKEND: TLNN F,QF ;PUNCH A BLOCK END ONTO TAPE MOVE T,[JRST 4,DDT] ;NO ARGUMENT GIVEN TLO T,254000 ;SET JRST IN LEFT HALF OF ARGUMENT PUSH P,T MOVEI T,100 PUSHJ P,FEED POP P,T PUSHJ P,PWRD PUSHJ P,PWRD ;EXTRA WORD FOR READER TO STOP ON MOVEI T,500 ;FEED SOME MORE JRST LOAD2 PWRD: MOVEI W1,6 ;PUNCH A WORD FROM T. CHARACTER COUNT PWRD2: ROT T,6 CONSZ PTPP,20 JRST .-1 ;WAIT FOR NOT BUSY CONO PTPP,50 ;SET DONE AND BINARY MODE DATAO PTPP,T ;SHIP A CHARACTER SOJG W1,PWRD2 ;LOOP THRU WORD POPJ P, FEED: CONSZ PTPP,20 JRST .-1 ;WAIT FOR NOT BUSY CONO PTPP,10 ;SET DONE DATAO PTPP,FEED1 ;SEND A ZERO (ONLY 8 BITS COUNT) SOJN T,FEED FEED1: POPJ P,0 ; PAPER TAPE LOADERS LOADB: IFE EDDT&10,< ;PDP-6/20-LOADER VERSION DATAI PTRR,1 XWD -1,-22 DATAI PTRR,2 CONSO PTRR,10 DATAI PTRR,3 JRST 2 MOVE 4,37 HRLI 4,710441 ;DATAI PTRR,0(1) DATAI PTRR,5 AOJN 1,2 DATAI PTRR,6 JRST -6(4) JRST 2 MOVE 0,1 CONSO PTRR,10 JRST -21(4) DATAI PTRR,0(1) ROT 0,1 ADD 0,(1) AOBJN 1,-21(4) CONSO PTRR,10 JRST -13(4) DATAI PTRR,1 CAME 1,0 JRST 4,-6(4) CONSO PTRR,10 JRST -6(4) DATAI PTRR,1 JUMPL 1,-22(4) CONO PTRR,0 JRST 1 > IFN EDDT&10,< PHASE 0 ;RIM10B CHECKSUM LOADER XWD -16,0 BEG: CONO PTRR,60 HRRI AA,10 RD: CONSO PTRR,10 JRST .-1 DATAI PTRR,@TBL1-RD+1(AA) XCT TBL1-RD+1(AA) XCT TBL2-RD+1(AA) AA: SOJA AA, TBL1: CAME CKSM,ADR ADD CKSM,1(ADR) SKIPL CKSM,ADR TBL2: JRST 4,BEG AOBJN ADR,RD ADR: JRST BEG+1 CKSM__ADR+1 DEPHASE > LOADE: XWD LOADB-.,LOADB ;VERIFY AND CORE (LOAD TAPE INTO CORE) ;VERIFY TAPE - CALLED BY $<CONTROL V> ;LOAD TAPE INTO CORE - CALLED BY $Y VERIFY: TLO F,LTF CORE: PUSHJ P,SETUP1 ;LOAD TAPES INTO CORE CONO PTRR,60 CORE1: CONSO PTRR,10 JRST .-1 DATAI PTRR,T CAME T,LOADE-1 ;WAIT TO SEE JRST 1 JRST CORE1 PUSHJ P,CRF PUSHJ P,BLOCKQ CORE2: PUSHJ P,GETW CAML R,DEFV CAML R,ULIMIT JRST VER3 ;OUTSIDE OF LIMITS TLNE F,LTF ;VERIFY OR YANK? JRST VER2 ;VERIFY PUSHJ P,DEP ;STUFF IN CORE JRST VER3 VER2: MOVEM T,TEM2 ;STORE TAPE WORD IN TEMP CELL PUSHJ P,FETCH ;GET WORD FROM CORE JRST ERR MOVEM T,TEM3 XOR T,TEM2 AND T,MSK JUMPE T,VER3 ;VERIFY OK. PUSH P,S PUSH P,R HRRZ T,R PUSHJ P,PAD ;PRINT ADDRESS MOVEI T,257 ;SLASH PUSHJ P,TOUT PUSHJ P,LCT MOVE T,TEM3 ;CORE CONTENTS PUSHJ P,CONSYM PUSHJ P,LCT MOVE T,TEM2 ;TAPE CONTENTS PUSHJ P,CONSYM PUSHJ P,CRF POP P,R POP P,S VER3: PUSHJ P,LISTEN ;SEE IF HE WANTS TO STOP YET AOJA R,CORE2 RUNEND: PUSHJ P,BLOCKQ ;STOP. JRST .-1 GETW: JUMPL S,GETW1 PUSHJ P,BLOCKQ GETW1: MOVE T,1(S) AOBJP S,.+1 POPJ P,0 BLOCKS: CONO PTRR,60 ;READ DATA BLOCKS BLOCKQ: CONSO PTRR,10 JRST .-1 DATAI PTRR,W JUMPL W,BLK1 MOVEM W,STARTA CONO PTRR,0 ;TURN OFF READER JRST DD1 BLK1: MOVEM W,W1 TLC W,777740 TLCE W,777740 JRST ERR ;BLOCK TOO BIG ADDI W,1 HRRZM W,R HRRI W,BUFF-1 MOVEM W,S BLK2: CONSO PTRR,10 JRST .-1 BLKI PTRR,W JRST BLK3 ADD W1,0(W) JRST BLK2 BLK3: ADD W1,0(W) CONSO PTRR,10 JRST .-1 DATAI PTRR,W CAMN W,W1 POPJ P,0 CONO PTRR,0 ;CHECKSUM ERROR JRST 4,BLOCKS ;R CONTAINS RIGHT HALF OF FIRST LINE ;S CONTAINS (-WC,BUFF-1) >;END OF PAPER TAPE DDT STUFF SUBTTL DDT - TTY I/O EXEC MODE - TOUT IFN EDDT&1,< IFN EDDT&100,< ; CONO/CONI BITS FOR 10/6 INTERFACE ; TRANSMITTER SIDE, CONO BITS TPIASH__0 ; SHIFT PIA ZERO POSITIONS (BITS 33-35) TENA__20 ; ENABLE TRANSMITTER INTERRUPTS TCHNG__40 ; TRANSMITTER ANY CHANGE (MUST BE ON IN CONO WORD) TBIT37__10000 ; 37TH OUTPUT BIT (MUST BE ON FOR FIRST WD OF HEADER) ; TRANSMITTER SIDE, CONI BITS ; PIA IS IN LOW ORDER BITS (BITS 33-35) TREQ__10 ; INTERRUPT IS BEING REQUESTED ;TENA__20 ; ENABLE TRANSMITTER INTERRUPTS ; RECEIVER SIDE, CONO BITS RPIASH__6 ; SHIFT PIA 6 POSITIONS (BITS 27-29) RCLEAR__1000 ; CLEARS "DATA MISSED" FLAG RENA__2000 ; ENABLE RECEIVER INTERRUPTS RCHNG__4000 ; ENABLE ANY CHANGE (MUST BE ON TO DO ANYTHING BUT RCLEAR) ; RECEIVER SIDE, CONI BITS ; PIA COMES IN ON BITS 27-29 RREQ__1000 ; INTERRUPT IS BEING REQUESTED ;RENA__2000 ; ENABLE RECEIVER INTERRUPTS RMISSED__4000 ; DATA MISSED FLAG (CLEARED BY RCLEAR) RBIT37__10000 ; 37TH INPUT BIT (SHOULD BE ON IN FIRST WD OF HEADER) >;IFN EDDT&100 TINSTR: ILDB T,STRING JUMPE T,TIN3 ;THERE IS NO CHR IFE EDDT&100,< CONSZ TTYY,40 ;IS THERE TTY INPUT? >; IFE EDDT&100 IFN EDDT&100,< CONSZ SIX,RREQ ; ANY RECEIVER REQUEST? >; IFN EDDT&100 JRST TIN3 ;YES. THAT MEANS FLUSH STRING PROCESSING. CAIE T,15 ;CR? JRST TIN2 ;NO. ILDB T,STRING ;GET NEXT BYTE CAIN T,12 JRST TIN4 ;LF FOLLOWS CR. THROW LF AWAY MOVSI T,70000 ;OOPS. NO LF THERE. BACK UP THAT BYTE POINTER. ADDM T,STRING TIN4: MOVEI T,15 ;REINVENT CR JRST TIN2 ;WE HAVE A CHARACTER. TIN3: SETZM STRING ;SET STRING BYTE POINTER TO ZERO AND READ TTY TIN: SKIPE STRING JRST TINSTR ;USE STRING BYTE POINTER IF SET. PUSHJ P,LISTEN ;WAIT FOR SOMETHING. JRST .-1 TIN2: CAIE T,175 CAIN T,176 MOVEI T,33 ;CHANGE ALL ALT MODES TO NEW CAIN T,177 JRST WRONG TRNE T,140 ;SKIP IF THIS IS A NON-PRINTING CHR. TOUT: CAIG T,4 ;DON'T TYPE CHARACTERS NULL, CTRL A,B,C OR D. POPJ P, SKIPE OUTRTN JRST @OUTRTN ;IF OUTRTN IS SET, USE IT. (RETURN VIA POPJ P,) SKIPE OUTLPT JRST LPOUT ;DO LPT OUTPUT THING INSTEAD ANDI T,177 ;CHARACTER ONLY SKIPE KLFLG ;KL10? JRST XTKL ;YES. OUTPUT VIA DTE20/PDP-11 HRLM T,(P) IMULI T,200401 AND T,[11111111] IMUL T,[11111111] HLR T,(P) TLNE T,10 TRC T,200 IFE EDDT&100,< CONSZ TTYY,20 JRST .-1 DATAO TTYY,T >; IFE EDDT&100 IFN EDDT&100,< CONO SIX,TCHNG!TBIT37 ; TURN ON CONTROL BIT HRLI T,600015 ; PUT IN DDT CHR CODE DATAO SIX,T CONSO SIX,TREQ ; WAIT FOR IT TO GO OUT JRST .-1 >; IFN EDDT&100 ANDI T,177 ;FLUSH PARITY BIT AND RETURN. POPJ P, LPOUT: IDPB T,LPPTR ;EXEC MODE LPT OUTPUT FEATURE SOSLE LPCNT POPJ P, PUSH P,T MOVEI T,5 MOVEM T,LPCNT DATAO LPT,LPWRD MOVE T,[POINT 7,LPWRD] MOVEM T,LPPTR CONSO LPT,100 JRST .-1 POP P,T POPJ P, LPPTR: POINT 7,LPWRD LPWRD: 0 LPCNT: 5 LISTEN: SKIPE KLFLG ;KL10? JRST XTKL2 IFE EDDT&100,< CONSO TTYY,40 ;LISTEN FOR TTY >; IFE EDDT&100 IFN EDDT&100,< CONSO SIX,RREQ >; IFN EDDT&100 POPJ P, IFE EDDT&100,< DATAI TTYY,T >; IFE EDDT&100 IFN EDDT&100,< DATAI SIX,T >; IFN EDDT&100 ANDI T,177 JRST CPOPJ1 XTKL2: PUSH P,0 MOVEI 0,3400 ;DDT MODE INPUT REQUEST TO DTE20/PDP-11 PUSHJ P,DTEXX MOVE T,0 POP P,0 ANDI T,177 JUMPE T,CPOPJ JRST CPOPJ1 TTYRET: SKIPE KLFLG ;KL10? JRST KLSRT ;SETUP DTE20 IFE EDDT&100,< MOVEI T,3410 TTY1: MOVEI W2,40000 CONSZ TTYY,120 SOJG W2,.-1 CONI TTYY,SAVTTY DATAI TTYY,W2 HRLM W2,SAVTTY CONO TTYY,(T) >; IFE EDDT&100 IFN EDDT&100,< CONI SIX,SAVTTY CONO SIX,TCHNG!RCHNG!RCLEAR >; IFN EDDT&100 POPJ P, TTYLEV: SKIPE KLFLG JRST KLLEV MOVE T,SAVTTY IFE EDDT&100,< TRZ T,160 TRO T,3600 TRNE T,10 TRZ T,200 JRST TTY1 >; IFE EDDT&100 IFN EDDT&100,< ANDI T,TENA!<7TPIASH>!RENA!<7RPIASH> CONO SIX,TCHNG!RCHNG(T) POPJ P, >; IFN EDDT&100 TEXIN: PUSHJ P,TIN ;GET CHARACTER TRNN T,140 ;SKIP IF CHARACTER HAS ALREADY BEEN ECHOED JRST TOUT ;GO ECHO CHARACTER. POPJ P, ;KL10/DTE20 ROUTINES KLLEV: PUSH P,0 MOVEI 0,4400 ;PREPARE TO SET TTY MONITOR MODE. SKIPE KLTMON ;SKIP IF WE WEREN'T IN MONITOR MODE BEFORE. PUSHJ P,DTEXX ;RESTORE STATE OF MONITOR MODE. MOVEI 0,3000 ;PRINT NORMAL. PUSHJ P,DTEXX POP P,0 POPJ P, KLSRT: PUSH P,T PUSH P,0 MOVE T,KEPTAD SETZM DTCMD(T) ;NO COMMAND TO THE 11 SETZM DTF11(T) MOVEI 0,5400 PUSHJ P,DTEXX ;GET STATE OF MONITOR TTY MODE MOVEM 0,KLTMON ;KL10 TTY MONITOR STATE MOVEI 0,5000 PUSHJ P,DTEXX ;CLEAR MONITOR STATE MOVEI 0,3001 ;FORCE TTY OUTPUT PUSHJ P,DTEXX POP P,0 POP P,T POPJ P, > SUBTTL DDT - TTY I/O USER MODE IFE EDDT&1,< TIN: MOVE T,POUTBF ;GET NEXT CHARACTER ROUTINE CAME T,[POINT 7,INBFF] PUSHJ P,FINOUT SKIPE STRING JRST TINSTR ;INPUT FROM STRING BYTE POINTER ; ILDB T,PINBFF INCHRW T ;RPH 5-22-71 ANDI T,177 ;FLUSH CONTROL AND META BITS CAIN T,15 INCHRW 1(P) ;THROW AWAY THE LF THAT FOLLOWS TIN3: CAIE T,176 CAIN T,175 MOVEI T,33 ;CHANGE TO NEW ALT MODE CAIN T,177 JRST WRONG JUMPN T,CPOPJ ;RETURN NON-NULL CHARACTER ; MOVE T,[POINT 7,INBFF] ; MOVEM T,PINBFF ; CALL T,[SIXBIT /DDTIN/] TIN2: SETZM STRING JRST TIN TINSTR: ILDB T,STRING ;READ FROM STRING JUMPE T,TIN2 ;ALL DONE CAIN T,33 ;NOT THIS ONE STUPID MOVEI T,"$" ;DO IS AS $ SKIPN OUTRTN ;ARE WE ECHOING SPECIAL? JRST TIN4 ;NO. ECHO NORMALLY PUSHJ P,@OUTRTN JRST TIN3 TIN4: IDPB T,POUTBF ;DUPLEX JRST TIN3 ;AND EAT TOUT: JUMPE T,CPOPJ ;TEXT OUTPUT SKIPE OUTRTN JRST @OUTRTN ;USE OUTRTN IF SET CAIE T,177 ;IS IT THIS GODDAMN CHAR? JRST NOTDEL ;NO SETO T, TTYUUO 6,T TLNE T,526000 ;WILL HE IGNORE A 177? POPJ P, ;NO, SKIP IT MOVEI T,177 ;CHANGE BACK TO 177 NOTDEL: IDPB T,POUTBF CAIE T,12 POPJ P, TTYLEV: FINOUT: MOVEI T,0 IDPB T,POUTBF MOVE T,[POINT 7,INBFF] ; MOVEM T,PINBFF MOVEM T,POUTBF ; CALL T,[SIXBIT /DDTOUT/] OUTSTR INBFF SETZM INBFF POPJ P, ;PINBFF: POINT 7,INBFF POUTBF: POINT 7,INBFF IFE UEDDTS,< LISTEN: INCHRS T POPJ P, CLRBFI JRST CPOPJ1 >;UEDDTS IFN UEDDTS,< LISTEN: POPJ P, ;DON'T WASTE TIME CHECKING TTY >;UEDDTS RPH 7-30-72 INBFF: BLOCK 31 TTYRET: MOVE T,[POINT 7,INBFF] MOVEM T,POUTBF ; MOVEM T,PINBFF SETZM INBFF POPJ P, TEXIN__TIN > SUBTTL DDT - FLAG MODE OUTPUT ;PRINT IN FLAG MODE PRFLAG: HRLI R,-=18 ;SET FOR HALF WORD SETZM FLGNUM# SETZM EXFLAG# ;NO ! AND NO NUMERIC PART YET PRFLG1: TDNN T,W1 ;IS THE BIT SET? JRST PRFLG3 ;NO. SKIPN (R) ;DOES IT HAVE A NAME? JRST PRFLG2 ;NOPE. SET BIT IN FLGNUM TO PRINT AS NUMBER PUSH P,T PUSH P,W1 MOVEI T,"!" SKIPE EXFLAG ;SKIP IF NOTHING'S BEEN TYPED YET PUSHJ P,TOUT MOVE T,(R) PUSHJ P,SPT1 ;TYPE RADIX50 SETOM EXFLAG ;WE'LL NEED AN ! BEFORE NEXT PART POP P,W1 POP P,T JRST PRFLG3 PRFLG2: IORM W1,FLGNUM ;SAVE BIT AS PART OF THE NUMBER PRFLG3: LSH W1,-1 AOBJN R,PRFLG1 SKIPN FLGNUM ;ANY NUMERIC PART LEFT OVER? POPJ P, PUSH P,T PUSH P,W1 MOVEI T,"!" SKIPE EXFLAG PUSHJ P,TOUT MOVE T,FLGNUM TRNN T,-1 ;CHECK TO SEE IF LEFT HALF MOVSS T PUSHJ P,TOCC POP P,W1 POP P,T SETOM EXFLAG ;FLAG THAT SOMETHING'S BEEN TYPED POPJ P, ;SETUP SCH AND FLGPNT FOR $J, $L AND $V COMMANDS GETPTR: SKIPN R,FLGPTR POPJ P, FLGSLP: HRRZM R,FLGPNT# ;STORE ADDRESS OF RADIX50 TABLE OF 36 WORDS TRNE F,Q2F ;NUMBER TYPED? SOSGE WRD2 ;YES. DECREMENT COUNT (ZERO INDEXING) JRST CPOPJ1 HLRZS R ;GET POINTER TO NEXT JUMPE R,CPOPJ ;RETURN UNHAPPY IF NO NEXT SKIPE R,(R) ;ADVANCE TO NEXT JRST FLGSLP ;LOOP POPJ P, ;THERE WAS NO NEXT. LFTT: SKIPA SCH,[LFPIN] RFTT: MOVEI SCH,RFPIN JRST .+2 FLGMOD: MOVEI SCH,FLGOUT PUSHJ P,GETPTR SETZM FLGPNT JRST BASE1 ;OUTPUT ROUTINE FOR $J MODE FLGOUT: SKIPN R,FLGPNT JRST HLFW ;IF NO POINTER USE HALFWORD MOVSI W1,400000 ;SET FOR HIGH ORDER BIT FLGOU1: PUSHJ P,PRFLAG JUMPE W1,FLGOU2 ;JUMP IF WE'VE DONE BOTH HALVES SKIPN EXFLAG ;ANYTHING DONE IN LH? JRST FLGOU1 ;NOPE. DO RH. PUSH P,T MOVEI T,"," PUSHJ P,TOUT PUSHJ P,TOUT ;TYPE ,, POP P,T JRST FLGOU1 FLGOU2: SKIPE EXFLAG ;WAS THERE SOMETHING PRINTED POPJ P, ;YES, EXIT MOVEI T,"0" ;NO, PRINT A 0 JRST TOUT ;OUTPUT ROUTINE FOR $L AND $V MODES RLFFLG: SKIPN R,FLGPNT ;SCH HAS LFPIN OR RFPIN. CALLED FROM PI8 JRST PI8A ;NONE THERE CAIN SCH,RFPIN ADDI R,=18 ;START WITH RIGHT SIDE FLAGS MOVEI W1,400000 PUSHJ P,PRFLAG PUSHJ P,FLGOU2 ;PRINT ZERO IF NOTHING WAS OUTPUT JRST PI7 SUBTTL DDT - BYTE OUTPUT $nO BITO: MOVEI R,BITT ;PATCH FOR BYTE OUTPUT WW 12-9-66 HRRZI AR,TOC TRZN F,Q2F JRST ERR ;NEEDED TO ALT-NUMBER-O MOVE T,WRD2 MOVEM T,SVBTS ;SAVE BYTE SIZE MOVEI T,=36 IDIV T,WRD2 SKIPE T+1 ADDI T,1 MOVEM T,SVBTS2 ;NUMBER OF BYTES IN WORD HRRZ SCH,R JRST BASE1 BITT: MOVE T+1,T SKIPN SVBTS ;0 IS MASK CONDITION JRST BITTM MOVE T,SVBTS2 MOVEM T,SVBT2 MOVEM T+1,SVBT3 BITT2: MOVEI T,0 MOVE T+2,SVBTS LSHC T,(T+2) MOVEM T+1,SVBT3 CAIE AR,PADSO PUSHJ P,FTOC CAIE AR,TOC PUSHJ P,PIN SOSG SVBT2 POPJ P, MOVEI T,"," PUSHJ P,TOUT MOVE T+1,SVBT3 JRST BITT2 BITTM: MOVEI T,=36 ;SET OUTPUT COUNT MOVEM T,SVBT3 MOVE T+2,BMASK ;GET MASK BITS BITTM1: MOVEI T,0 ;SET TO SHIFT WORD SKIPL T+2 ;START WITH 1 BITS SETCA T+2, BITTM2: LSHC T,1 ;NEXT BIT LSH T+2,1 ;SHIFT MASK SOSLE SVBT3 ;ALL BITS GONE? JUMPL T+2,BITTM2 ;PART OF SAME FIELD MOVEM T+2,SVBT2 ;SAVE MASK MOVEM T+1,SVBT4 ;AND PARTIAL MASK CAIE AR,PADSO ;DO PROPER OUTPUT PUSHJ P,FTOC CAIE AR,TOC PUSHJ P,PIN SKIPG SVBT3 ;ANY MORE? POPJ P, ;NO, RETURN MOVEI T,"," ;COMMA PUSHJ P,TOUT MOVE T+1,SVBT4 ;GET WORD BACK MOVE T+2,SVBT2 ;AND MASK JRST BITTM1 ;PRINT NEXT FIELD SVBT4: 0 SVBTS: 0 SVBTS2: 0 SVBT3: 0 SVBT2: 0 ;END OF PATCH WW 12-9-66 SUBTTL DDT - CHARACTER DISPATCH TABLE BDISP: POINT 12,DISP(R),11 POINT 12,DISP(R),23 POINT 12,DISP(R),35 DEFINE D(Z1,Z2,Z3)<((Z1-DDT)=24)!((Z2-DDT)=12)!(Z3-DDT)> IFN EDDT&3-3,< ;ASSEMBLE IF NOT PAPER TAPE EXEC DDT PUNCH__ERR PSR__ERR BLKEND__ERR LOADER__ERR VERIFY__ERR CORE__ERR> IFE UEDDTS,< JOBSET__ERR DARRW__ERR> DISP: D ERR,DARRW,ERR ;NL   D ERR,ERR,JOBSET ;    D ERR,ERR,VARRW ;    D TAB,LINEF,ERR ;HT LF VT D ERR,CARR,ERR ;FF CR  D ERR,ERR,LOADER ;    CONTROL O,P,Q D PUNCH,BLKEND,PSR ;    CONTROL R,S,T D ERR,VERIFY,ERR ;    CONTROL U,V,W D ERR,ERR,ERR ;    D CONTROL,ERR,LTAB ;    D ERR,ERR,SPACE ;   SP D SUPTYO,TEXI,ASSEM ; ! " # D DOLLAR,BYTI,SETBLK ; $ % & D DIVD,LPRN,RPRN ; ' ( ) D MULT,PLUS,ACCF ; * + , D MINUS,PERIOD,SLASH ; - . / D NUM,NUM,NUM ; 0 1 2 D NUM,NUM,NUM ; 3 4 5 D NUM,NUM,NUM ; 6 7 8 D NUM,TAG,SEMIC ; 9 : ; D FIRARG,EQUAL,ULIM ; < = > D QUESTN,INDIRECT,ABSA ; ? @ A D BPS,CON,SYMD ; B C D D EFFEC,SFLOT,STR ; E F G D HWRDS,PILOC,FLGMOD ; H I J D KILL,LFTT,MASK ; K L M D NWORD,BITO,PROCEDE ; N O P D QUAN,RELA,SYMBOL ; Q R S D TEXO,UCON,RFTT ; T U V D WORD,XEC,CORE ; W X Y D ZERO,OCON,ICON ; Z [ \ D OSYM,VARRW,PSYM ; ] ^ _ ;LOWERCASE LETTERS ARE NEVER USED BY THE TIME WE GET HERE. SUBTTL DDT - OP DECODER ;REG 1/14/75 It seems like 10 bit bytes are actually used below. ; Added FxxRI and TTYUUO. ;DESCRIPTION OF OP DECODER FOR DDT: ; ; THE ENTIRE INSTRUCTION SET FOR THE PDP-6 CAN BE COMPACTED INTO ;A SPACE MUCH SMALLER THAN ONE REGISTER FOR EVERY SYMBOL. THIS OCCURS ;BECAUSE OF THE MACHINE ORGANIZATION AND INSTRUCTION MNEMONICS CHOSEN ;FOR THE PDP-6. FOR EXAMPLE, IF BITS (0-2) OF AN INSTRUCTION EQUAL ;101(2) THE INSTRUCTION IS A HALF WORD INSTRUCTION AND AN "H" MAY ;BE ASSUMED. "T" MAY BE ASSUMED FOR ALL TEST INSTRUCTIONS (WHICH ;BEGIN WITH 110(2). ; ; THE TABLE TBL IN DDT CONSISTS OF 9 BIT BYTES, 4 TO A WORD. ;THE NUMBERS IN THE BYTES HAVE THE FOLLOWING SIGNIFICANCE: ;0-37(8): THIS IS A DISPATCH COMMAND FOR THE OP-DECODER INTERPRETER. ; LET THE RIGHT MOST TWO BITS EQUAL N; LET THE NEXT 3 BITS ; EQUAL P. ; ; THE CONTENTS OF INST (INSTRUCTION) CONTAIN IN THE RIGHT ; MOST NINE BITS THE BINARY FOR THE MACHINE INSTRUCTION. ; P AND N REFER TO THE CONTENTS OF INST, AND THE OP DECODER ; WILL PRODUCE AN ANSWER D GIVEN P, N, AND THE CONTENTS ; OF INSTX N+1 GIVES THE NUMBER OF BITS IN INST; P GIVES THE ; POSITION (FROM THE RIGHT EDGE) OF THE N+1 BITS. ; ; EXAMPLE: P = 6 ; N = 2 ; ;; C(INST) = .010 101 100(2) ; ; THE RESULT- D = 010(2) = 2(8) ; ; D IS USED AS A DISPATCH ON THE NEXT BYTES IN THE TABLE. ; IF D = 5, 5 BYTES IN THE TABLE (DON'T COUNT THE BYTES WHICH ; PRINT TEXT, 41-72(8)) ARE SKIPPED OVER AND THE 6TH BYTE RESUMES ; THE INTERPRETATION. ; ;40(8) THIS IS A STOP CODE; WHEN THIS IS REACHED INTERPRETATION ; IS FINISHED. ;41(8)-72(8) THE ALPHABET IS ENCODED INTO THIS RANGE. ; 41- A ; 42- B ; 72- Z ; WHEN A BYTE IN THIS RANGE IS REACHED, ITS CORRESPONDING ; LETTER IS TYPED. ; ;73(8)-777(8) THIS IS A TRANSFER BYTE. IF THE BYTE IN THIS RANGE IS ; CONSIDERED TO BE A, TRANSFER INTERPRETATION TO THE A-73(8)RD ; BYTE IN THE TABLE. ; ;Macros used to assemble the table TBL: ; 1. "P" followed by a number assembles a dispatch byte. The first ; digit is the position; the second digit is the size. ; 2. "S" assembles a stop code. ; 3. "G" followed by a symbolic name assembles a transfer to that ; symbolically named byte. ; 4. "T" followed by a string of letters (terminated by a comma) ; assembles a string of bytes, each byte being one letter. ; 5. "L" followed by a symbolic name labels the next byte with that ; symbolic name. ; ;EXAMPLE OF BINARY TO SYMBOLIC DECODING: ; THE MACHINE CODE FOR JRST IS 254 ; INST 0 1 0 1 0 1 1 0 0 ; THE INTERPRETER STARTS WITH THE FIRST BYTE IN THE TABLE (63^). ; THE RESULT OF APPLYING THIS TO C(INST) GIVES 2. SKIPPING OVER ; 2 BYTES IN THE TABLE AND INTERPRETING THE THIRD RESULTS IN ; HAK/ BEING INTERPRETED. AT HAK:, THERE IS A 33^. APPLYING ; THIS TO C(INST) RESULTS IN 5 NON PRINTING BYTES BEING SKIPPED ; OVER: ; 1. MV/ ; MOV PRINTING TEXT ; 2. MO/ ; 3. ML/ ; 4. DV/ ; 5. SH/ ; ; H1/ IS THE NEXT BYTE INTERPRETER. AT H1: 03^ IS FOUND SO ; 4 BYTES ARE SKIPPED OVER: ; EXC PRINTING TEXT ; 1. S3/ ; BL PRINTING TEXT ; T PRINTING TEXT ; 2. . ; 3. AO/ ; 4. AOB/ ; NEXT, THE LETTERS JRS ARE TYPED OUT. THEN T/ IS FOUND. AT ; T: A T IS TYPED OUT; THEN A "." IS FOUND AND EVERYTHING STOPS. ; ; THE TABLE IS ALSO USED GOING FROM SYMBOLIC TO BINARY BUT A ; TREE SEARCH METHOD IS USED. BEGIN OPDEFS DEFINE P (A) <OUTP A&70/2+A&7-1 > DEFINE G (A) <OUTP A+73 > DEFINE T (A) <FOR B<A> <OUTP "B"-40 >> DEFINE S (Q) <OUTP 40 > DEFINE L (A) <IFGE CLOC+73-2000,<PRINTX OPTABLE TOO LONG> A__CLOC > ;TO GET THE EFFECT OF TWO PASSES, "TABLE" IS EXPANDED ONCE TO GET THE LABEL ;DEFINITIONS WITHOUT DATA GENERATION, THEN "OUTP" IS REDEFINED AND "TABLE" ;EXPANDED ONCE MORE. DEFINE OUTP (A) <CLOC__CLOC+1 > DEFINE BYT9 (A) <FOR B(A) <B >> DEFINE TABLE < BYT9 <P 63,G %UUO,G %FLO,G %HAK,G %ACCP,G %BOOLE,T H,G %HWT,T T,G %ACBM> BYT9 <P 21,G %BD,T CON,P 11,G %OI,T S,P 01,G %Z,G %O> BYT9 <L %BD,P 01,T BLK,G %IO,T DATA,L %IO,P 11,G %I,G %O,L %OI,P 1,G %O,G %I> BYT9 <L %UUO,P 51,S,P 32,G %U40,G %U50,G %U60,P 21,G %U703,P 11,G %USET> BYT9 <P 1,T LOOKU,G %P,T ENTE,G %R,L %USET,T USET,P 1,G %I,G %O> BYT9 <L %U40,P 3,G %U47,T INI,G %T,S,T SPCWA,G %R,S,S,S,L %U47,T CALL> BYT9 <P 1,S,G %I,L %U60,P 21,G %U603,P 1,T IN,G %BPUT,T OUT,L %BPUT> BYT9 <P 11,T BU,L %F,T F,S,T PU,G %T,L %U50,P 3,T OPE,G %N,T TTYUU,G %O,S,S,S> BYT9 <T RENAM,G %E,T I,G %N,T OU,G %T,L %U603,P 1,G %U6062,T STAT> BYT9 <P 11,L %O,T O,S,L %Z,T Z,S,L %U6062,P 11,T S,G %U62,T G,L %U62> BYT9 <T ETST,G %S,L %U703,P 2,T CLOS,G %E,T RELEA,G %S,T MTAP,G %E> BYT9 <T UGET,G %F> BYT9 <L %FLO,P 51,G %BYTE,T F,P 32,T AD,G %A,T SB,G %A,T MP,G %A,T DV> BYT9 <L %A,P 21,G %LMB,T R,G %IMB,L %LMB,P 2,S,L %L,T L,S,L %M,T M,S,L %B> BYT9 <L %B,T B,S,L %BYTE,P 32,G %100,G %110,G %120> BYT9 <P 3,T UF,G %PA,T DF,G %N,T FS,G %C,T IB,L %P,T P,S> BYT9 <T I,G %LD,L %LD,T LD,G %B,T I,G %DP,L %DP,T DP,G %B> BYT9 <L %110,T D,P 3,T FA,L %D,T D,S,T FS,G %B,T FM,G %P,T FDV,S> BYT9 <T AD,G %D,T SU,G %B,T MUL,S,T DIV,S> BYT9 <L %100,P 21,S,P 2,T JSY,G %S,T ADJS,G %P,S,S> BYT9 <L %120,P 3,T DMOV,G %E,T DMOV,G %N,T FIX,S,T EXTEND,S> BYT9 <T DMOVE,G %M,T DMOVN,G %M,T FIXR,S,T FLTR,S> BYT9 <L %HAK,P 33,G %MV,L %MV,T MOV,G %MO,G %ML,G %DV,G %SH,G %H1> BYT9 <G %JP,P 21,T ADD,G %IMB,T SU,L %BIMB,T B,L %IMB,P 2> BYT9 <S,L %I,T I,S,G %M,G %B,L %MO,P 22,L %EIMS,T E,G %IMS,T S> BYT9 <G %IMS,T N,G %IMS,T M,L %IMS,P 2,S,G %I,G %M,L %S,T S,S> BYT9 <L %ML,P 21,T I,G %ML1,L %ML1,T MUL,G %IMB,L %DV,P 21,T I,G %DV1> BYT9 <L %DV1,T DI,L %DV2,T V,G %IMB,L %H1,P 3,T EXC,G %S3,T BL,L %T> BYT9 <T T,S,G %AO,L %AO,T AOBJ,G %AOB,T JRS,G %T,T JFC,G %L,T XC,G %T> BYT9 <T MA,G %P,L %AOB,P 1,G %P,G %N,L %JP,P 3,G %PU,L %PU,T PUSH> BYT9 <G %PUS,G %PO,L %PO,T POP,G %POP,T JS,L %R,T R,S,T JS,G %P> BYT9 <T JS,L %PA,T A,S,T JR,G %PA,L %PUS,P 1,L %J,T J,S,S,L %POP> BYT9 <P 1,S,G %J,L %SH,P 2,T A,G %S2,T ROT,G %S1,T L,L %S2,T S,L %S3> BYT9 <T H,G %S1,P 21,T JFF,G %O,T KAFIX,S,L %S1,P 21,S,L %C,T C,S> BYT9 <L %ACCP,P 42,T CA,G %CA1,G %SJ,T A,G %JS,T S,L %JS,T O,P 31> BYT9 <T J,G %COMP,T S,G %COMP,L %CA1,P 31,T I,G %COMP,T M,G %COMP> BYT9 <L %SJ,P 31,T JUM,G %PSJ,T SKI,L %PSJ,T P,L %COMP> BYT9 <P 3,S,G %L,L %E,T E,S,T L,G %E,G %PA,T G,G %E,L %N,T N,S,T G,S> BYT9 <L %HWT,P 51,G %HW1,P 21,T R,G %HW2,T L,L %HW2,T R,G %HW3,L %HW1> BYT9 <P 21,T L,G %HW4,T R,L %HW4,T L,L %HW3,P 32,G %IMS,T Z,G %IMS,T O> BYT9 <G %IMS,G %EIMS> BYT9 <L %ACBM,P 31,G %AC1,P 1,T D,G %AC2,T S,G %AC2,L %AC1,P 1,T R> BYT9 <G %AC2,T L,L %AC2,P 42,T N,G %EAN,T Z,G %EAN,T C,G %EAN,T O> BYT9 <L %EAN,P 12,S,G %E,G %PA,G %N> BYT9 <L %CB,T C,G %BIMB,L %BOOLE,P 24,G %ST,L %AN,T AND,G %B2,G %AN> BYT9 <G %ST,G %AN,G %ST,T X,L %OR,T OR,G %B2,T I,G %OR,G %AN,T EQ> BYT9 <G %DV2,G %ST,G %OR,G %ST,G %OR,G %OR,L %ST,T SET,L %B2> BYT9 <P 24,T Z,G %IMB,G %IMB,L %CA,T C,G %TA,L %TM,T M,G %IMB,L %CM> BYT9 <T C,G %TM,L %TA,T A,G %IMB,G %IMB,G %IMB,T C,G %BIMB,G %IMB,G %CA> BYT9 <G %CA,G %CM,G %CM,G %CB,T O,G %IMB>> ;END OF THE DEFINITION OF "TABLE" ;EXPAND "TABLE" ONCE TO GET THE LABELS DEFINED. CLOC__0 ;INITIALIZE LOCATION COUNTER. XLIST TABLE LIST ;NOW REDEFINE "OUTP" TO CAUSE NEXT EXPANSION OF "TABLE" TO GENERATE DATA DEFINE OUTP (A) <BINRY__BINRY=10+A BINC__BINC-1 IFE BINC,< BINRY6 BINRY__0 BINC__3 > CLOC__CLOC+1 > BINRY__0 BINC__3 CLOC__0 ^TBL: ;CAUSE ACTUAL EXPANSION OF THE TABLE TO OCCUR HERE. XLIST TABLE REPEAT BINC,<BINRY__BINRY=10> IFN BINRY,<BINRY6> LIST BEND OPDEFS PNTR: INST ;POINTER TO BITS IN INST INST: 0 ;BINARY FOR INSTRUCTION CHP: 0 ;CHAR POINTER INTO TXT, TXT+1 TXT: BLOCK 2 ;STORE INPUT TEXT FOR OPEVAL SAVPDL: 0 ;SAVE PUSH DOWN LIST POINTER ;TABLE USED TO GET NEXT BYTE POINTER FOR TRANSFER BYTE BTAB: POINT 10,TBL POINT 10,TBL,9 POINT 10,TBL,19 OPEVAL: MOVEI T,0 ;EVALUATE FOR AN OP CODE IDPB T,CHP MOVEM P,SAVPDL TRZA F,OUTF OPTYPE: TRO F,OUTF ;TYPE AN OPCODE SYMBOLICALLY LSH T,-33 MOVEM T,INST ;GET OPCODE INTO RIGHT 9 BITS MOVE T,[XWD 440700,TXT] MOVEM T,CHP ;FOR OPEVAL,SETUP POINTER TO INPUT TEXT TRZ F,ITF ;CLEAR INSTRUCTION TYPED FLAG SETZB R,W1 MOVE W2,BTAB DC1: ILDB T,W2 ;GET NEXT BYTE IN TBL CAILE T,40 CAIL T,73 SOJGE R,DC1 ;SKIP OVER # BYTES = C(R) JUMPG R,DC1 ;SKIP OVER ALPHA TEXT WITHOUT COUNTING SUBI T,40 JUMPE T,DECX ;TRANSFER ON ASTOP CODE JUMPG T,DC2 DPB T,[XWD 340500,PNTR] ;SETUP R ON A DISPATCH BYTE TRZ T,-4 AOS T DPB T,[XWD 300600,PNTR] TRNN F,OUTF JRST DC6 ;FOR OPEVAL ONLY LDB R,PNTR ;GET # BYTES TO SKIP OVER JRST DC1 DC2: HRREI T,-33(T) JUMPL T,DECT ;TYPE OUT A LETTER MOVE W1,T ;BYTE IS A TRANSFER IDIVI W1,3 ;NUMBER OF BYTES/WORD IN TABLE. MOVE W2,BTAB(W2) ;CALCULATE POINTER TO NEXT BYTE ADDI W2,(W1) JRST DC1 DECT: TRNE F,OUTF JRST DC8 ;TYPE OUT A LETTER ILDB W1,CHP ;GET NEXT INPUT LETTER CAIE W1,133(T) ;COMPARE WITH ASSUMED NEXT LETTER JRST NOMAT ;DOESNT MATCH JRST DC1 ;MATCHES, TRY NEXT DECX: TRNE F,OUTF ;STOP (CODE 40) HAS BEEN SEEN POPJ P, ;IF FOR OUTPUT, RETURN ILDB W1,CHP ;GET NEXT INPUT CHAR IF ANY JUMPE W1,DC7 ;DOES # OF CHARS MATCH NOMAT: POP P,R ;NO, BACK UP AND TRY SOME MORE POP P,W2 POP P,PNTR POP P,CHP NOMAT1: AOS R ;ASSUME NEXT NUMBER FOR BIN VALUE DPB R,PNTR ;STUFF INTO ANSWER LDB R,PNTR JUMPN R,DC6AA ;IF =0, BYTE WAS TOO BIG CAME P,SAVPDL JRST NOMAT ;NOT AT TOP LEVEL POPJ P, ;UNDEFINED, FINALLY DC6: MOVEI R,0 ;ASSUME 0 FOR INITIAL BINARY VALUE DPB R,PNTR DC6AA: CAMN P,SAVPDL JRST DC6BB LDB T,-2(P) ;OLD VALUE OF PNTR CAME T,(P) JRST NOMAT1 DC6BB: PUSH P,CHP PUSH P,PNTR PUSH P,W2 PUSH P,R JRST DC1 DC7: MOVE P,SAVPDL ;RESTORE PUSH DOWN POINTER MOVE T,INST LSH T,33 ;PUSH BINARY INTO POSITION FOR OPEVAL TLC T,700000 TLCE T,700000 JRST CPOPJ1 SETOM IOTFLG ;IT IS AN IOT LDB R,[POINT 3,T,8] DPB R,[POINT 10,T,12] ;ONLY DONE FOR IO INSTRUCTIONS JRST CPOPJ1 DC8: TRO F,ITF ;SET INSTRUCTION TYPED FLAG MOVEI T,133(T) PUSHJ P,TOUT ;OUTPUT A LETTER SETZM SPSAV ;SO $D WONT TRY TO DELETE OP CODES JRST DC1 PATCH: BLOCK 10 IFE EDDT&3-3,< BUFF: BLOCK 40> SUBTTL UEDDT ROUTINES - COPSYM IFN UEDDTS,< UESTRT: SETZM EXJOBN ;JOB WE ARE EXAMINING! SETZM EXSYMS SETOM EXMMAP MOVEI S,37 PEEK S, MOVEM S,MEMSIZ# MOVE T,S ANDI S,MAXPR-1 HRLZM S,PRSIZ# ANDI T,<MAXPR-1> MOVEM T,PRTOP# SETZM SYMSYS# SETZM SYMLUZ# MOVEI S,265 PEEK S, ;PEEK ADDRESS OF SYSTOP PEEK S, ;PEEK SYSTOP ITSELF MOVEM S,SYSTOP# MOVEI S,254 PEEK S, ;ADDRESS OF MAINTMODE PEEK S, ;MAINTMODE MOVEM S,MAINTM# MOVEI T,0 MOVEI P,PS PUSHJ P,PRSET MOVEI S,DDTEND HRRZ T,74 CAIN T,DDT ;ARE WE "THE" DEBUGGER? MOVEM S,JOBFF ;FLUSH SYMS IF NOT BEING DEBUGGED PUSHJ P,COPSYM ;GET SOME SYMBOLS SETZM SPCFLG# JRST DDT COPSYM: SKIPE EXSYMS ;WHOSE SYMBOLS ARE WE LOOKING AT? JRST USYMS ;COPY USER'S SYMBOLS ESYMS: SETZM EXSYMS ;IN CASE WE JUMPED HERE SKIPE R,400036 ;EXEC SYMBOL POINTER JRST CSYMS ;COPY THEM IN SETZM EXCSYM ;NO SYMBOLS YET! SKIPN 400163 ;DDTXCOR - SKIP IF DDT IS IN XTRA CORE HALT . MOVE R,400164 ;COPY SYMBOLS FROM XTRA CORE MOVEM R,EXPGT ;STORE ADDRESS OF KL'S EXPGT MOVE R,400162 ;POINTER TO SYMLOC MOVE R,400000(R) ;FETCH SYMLOC - AOBJN POINTER TO SYMBOLS. SUB R,400165 ;-DDTA = OFFSET ABOVE 1,,000000 ADDI R,400000 ;+400000 = OUR UPPER SEGMENT ADDRESS FOR FIRST SYM. HLRO T,R ;-WC OF SYMBOLS MOVN T,T ;+WC ADD T,JOBFF ;NEW JOBFF. IORI T,1777 CORE T, JRST NOCORE HLRO W1,R ;-WC AGAIN. ADD W1,JOBREL ;STARTING ADDRESS FOR SYMBOLS - 1 ADDI W1,1 HLL W1,R ;AOBJN POINTER IN OUR CORE FOR NEW SYMS. MOVEM W1,EXCSYM MOVE 0,[400,,1000*40] ;400 PAGES STARTING AT PHYSICAL 1000000 GETHI 0, ;ATTACH HIGH CORE. HALT . ;LOSE SOMEHOW. SUB W1,[1,,1] ;FORM STACK. XSCOP1: PUSH W1,(R) ;FETCH HIGH CORE, STORE LOW CORE. INCREMENT LOWCOR AOBJN R,XSCOP1 ; POINTER, INCREMENT HIGH CORE POINTER. ;THE FOLLOWING COPIES THE EXPGT INTO OUR CORE-IMAGE. LDB R,[POINT 14,EXPGT,31] ;GET EXPGT PAGE NUMBER LSH 5 HRLI R,1 ;1 PAGE GETHI R, ;GET EXPGT AS PAGE 400 HALT . MOVSI R,-1000 XSCOP2: MOVE W1,400000(R) MOVEM W1,EXPGT(R) ;COPY SYSTEM'S EXPGT AOBJN R,XSCOP2 JRST PRSET ;RESET SETPR2. RETURN VIA POPJ USYMS: MOVEI R,JOBSYM ;FROM $$ PUSHJ P,FETCH ;FETCH LOSER JOBSYM SETZ T, ;COULDN'T GET IT JUMPE T,ESYMS ;IF NO SYMBOLS, TRY SYSTEM SYMS MOVE R,T CSYMS: HLRO T,R ;HERE WITH AOBJN POINTER TO SYMS IN R (FROM ESYMS) MOVNS T ADD T,JOBFF IORI T,1777 CORE T, JRST NOCORE HLRO W1,R ADD W1,JOBREL HLL W1,R ADDI W1,1 HRRM W1,EXCSYM HLLM R,EXCSYM UELP1: PUSHJ P,FETCH SETZ T, ;STORE A 0 MOVEM T,(W1) ADDI R,1 AOBJN W1,UELP1 POPJ P, NOCORE: OUTSTR [ASCIZ /CAN'T GET CORE/] POPJ P, NOSYM1: OUTSTR [ASCIZ /NO SYMBOLS ANYWHERE???/] POPJ P, EXCSYM: 0 EXMMAP: -1 EXSYMS: 0 EXJOBN: 0 ;THIS IS A TABLE FOR JOBRD UUO. -1,,0 ;CLOBBER RH TO USER'S ADDR. BEING EXAMINED EXJWRD ;POINTER TO WHERE TO STORE THE DATA THAT'S READ. EXJWRD: 0 EXPGT: BLOCK 1000 ;HERE'S OUR COPY OF THE EXPGT. ; MORE UEDDT ACWPRV__40 DDTREN: MOVEI T,0 ;REENTER COMMAND GETPRV T, TLO T,ACWPRV SETPRV T, TLNN T,ACWPRV ;DOES HE HAVE ACW PRV? JRST NOREN SETOM SPCFLG SETZM SPCADR JRST DDT NOREN: OUTSTR[ASCIZ/SORRY, YOU CAN'T DO THAT! /] JRST DDT SYMPR: HRRZ T,EXCSYM TRZ T,400000 PRSET: ANDI T,<MAXPR-1> CAME T,PRTOP TLOA T,<MAXPR-1>&376001 HLL T,PRSIZ SETPR2 T, JRST PRLUZ TLO T,1777 HLRZM T,PRMAX# MOVNS T HRRM T,PROFF SKIPN SYMSYS POPJ P, ADD T,EXCSYM SETZM SYMLUZ MOVEI T,-400000(T) CAMLE T,PRMAX SETOM SYMLUZ POPJ P, PRLUZ: OUTSTR [ASCIZ /SETPR2 FAILED! /] JRST 4,. PROFF: (R) ;LOG CHANGES MADE TO THE SYSTEM BY UEDDT LOGIT: INIT 17 'DSK ' 0 POPJ P, ;BARF MOVE T,[' SSSYS'] MOVEM T,LOGPPN LOOKUP LOGNAM JRST LOGIT0 EXCH T,LOGPPN MOVS T,T MOVN T,T SOJL T,LOGZ0 ;JUMP IF FILE EMPTY LSH T,-7 ADDI T,1 ;CALCULATE RECORD NUMBER MOVEM T,LOGPTR USETI @LOGPTR IN [IOWD 200,LOGBUF0] JRST LOGOUT STATO 20000 ;EOF IS OK. JRST LOGLOS JRST LOGOUT LOGIT0: HRRZ T,LOGEXT JUMPN T,LOGLOS ;BARF (WASN'T FILE NOT FOUND) LOGZ0: SETZM LOGBUF SETZM LOGPTR AOS LOGPTR ;SET POINTER TO RECORD 1 LOGOUT: HLLZS LOGEXT SETZM LOGDAT ENTER LOGNAM JRST LOGLOS ;CAN'T READ/ALTER THE FILE MOVE R,[POINT 7,LOGBUF] ;LOOK FOR NULL BYTE AT END LOGZ: ILDB T,R JUMPN T,LOGZ ADD R,[70000,,0] ;BACKUP WHEN WE SEE ONE PUSH P,W1 PUSH P,W2 GETPPN W2, PUSHJ P,LOGSIX ;PPN PUSHJ P,INLMES ASCIZ / (/ PJOB W1, PUSHJ P,LOGDEC ;JOB NUMBER PUSHJ P,INLMES ASCIZ /.) TTY/ SETO W1, GETLIN W1 HRRZ W1,W1 PUSHJ P,LOGOCT ;TTY LINE NUMBER MOVEI W1,11 PUSHJ P,LOGCHR DATE W1, IDIVI W1,=31 PUSH P,W2 IDIVI W1,=12 EXCH W1,(P) PUSH P,W1 MOVEI W1,1(W2) PUSHJ P,LOGDC2 ;DAY OF MONTH MOVEI W1,"-" PUSHJ P,LOGCHR POP P,W1 ADDI W1,1 PUSHJ P,LOGDC2 ;MONTH MOVEI W1,"-" PUSHJ P,LOGCHR POP P,W1 ADDI W1,=64 PUSHJ P,LOGDEC ;YEAR MOVEI W1," " PUSHJ P,LOGCHR MSTIME W1, IDIVI W1,=1000*=60 IDIVI W1,=60 PUSH P,W2 PUSHJ P,LOGDC2 ;HOURS POP P,W1 PUSHJ P,LOGDC2 ;MINUTES MOVEI W1,11 PUSHJ P,LOGCHR HRRZ W1,SPCADR PUSHJ P,LOGOCT ;ADDRESS PUSHJ P,INLMES ASCIZ ?/ ? MOVE W1,SPCADR PEEK W1, ;GET OLD CONTENTS SETZM LOGCNT PUSHJ P,LOGWRD ; MOVEI W1,11 MOVE W2,LOGCNT CAIGE W2,8 PUSHJ P,LOGCHR PUSHJ P,LOGCHR MOVE W1,SPCWRD ;GET NEW CONTENTS PUSHJ P,LOGWRD PUSHJ P,INLMES ASCIZ/ / SETZ W1, ;NULL BYTES TO FINISH WORD LOGZ1: PUSHJ P,LOGCHR TLNE R,760000 ;FILL OUT WORD JRST LOGZ1 HRRZ R,R SUBI R,LOGBUF-1 ;GET # OF WORDS MOVN R,R MOVS R,R HRRI R,LOGBUF-1 MOVEM R,LOGADR USETO @LOGPTR OUTPUT LOGADR POP P,W2 POP P,W1 MOVE T,SPCWRD MOVE R,SPCADR LOGLOS: RELEASE POPJ P, LOGDC2: CAIL W1,=10 JRST LOGDEC PUSH P,W1 MOVEI W1,"0" PUSHJ P,LOGCHR POP P,W1 JRST LOGDEC LOGWRD: HRLM W1,(P) HLRZ W1,W1 PUSHJ P,LOGOCT PUSHJ P,INLMES ASCIZ /,,/ HLRZ W1,(P) LOGOCT: SKIPA T,[10] LOGDEC: MOVEI T,=10 LOGNUM: IDIV W1,T HRLM W2,(P) JUMPE W1,.+2 PUSHJ P,LOGNUM HLRZ W1,(P) ADDI W1,60 LOGCHR: CAME R,[POINT 7,LOGBUF+177,34] ;END OF BUFFER? JRST LOGOK ;NO USETO @LOGPTR OUTPUT [IOWD 200,LOGBUF0] MOVE R,[POINT 7,LOGBUF] AOS LOGPTR LOGOK: IDPB W1,R AOS LOGCNT POPJ P, LOGSIX: JUMPE W2,CPOPJ SETZ W1, LSHC W1,6 ADDI W1,40 PUSHJ P,LOGCHR JRST LOGSIX INLMES: POP P,W2 HRLI W2,(<POINT 7,0>) INLMS1: ILDB W1,W2 JUMPE W1,1(W2) PUSHJ P,LOGCHR JRST INLMS1 LOGCNT: 0 LOGPTR: 0 LOGADR: 0 0 LOGBUF: BLOCK 201 LOGNAM: 'UEDDT ' LOGEXT: 'LOG ' LOGDAT: 0 LOGPPN: ' SSSYS' > ;KEEP IT ALL TOGETHER FOR SWAPPING DDT. ;LIT AND VAR XLISTED FOR YOUR READING PLEASURE XLIST LIT VAR LIST XP DDTEND,. ^^DDTEND_DDTEND SUBTTL DDT User's Guide COMMENT  DDT User's Information DDT is a program debugging aid that is loaded into the same core image as the program being debugged. DDT can be entered via the monitor DDT command or by a program transfer to the external label DDT or by a program transfer to the address contained in the right half of JOBDDT. DDT can also be entered as a result of executing an instruction on which a breakpoint has been set. Once DDT has been entered the user may examine and modify the contents of his accumulators and other memory locations. To return to the execution of the program an $P command (proced from a breakpoint) or adr$G (start execution at adr) may be used. When DDT is entered via the DDT command, the PC of the interrupted program is stored in JOBOPC. The following is a quick summary of DDT for people who already know how to work DDT in general. For further information, consult DEC documentation General - $ = Altmode n = a number $n = a decimal number always! Input modes $n% Input a list of n-bit octal bytes, separated by commas, terminated by $. If n=0 use the byte mask ($M+2) to define arbitrary byte boundaries "<delimiter>text<delimiter> Left justified ascii text (up to five characters) Note: to get CRLF entered you must type both CR and LF. If more than five characters are typed, only the last five are used. "<character>$ Right justified ascii character. $"<delimiter>text<delimiter> Left justified sixbit text (lower case typin converted to upper case). The last six (or fewer) characters are used. $"<character>$ right justified ascii character $$7"<delimiter>text<delimiter> Left adjuseted ASCIZ string, five characters per word. $$"<delimiter>text<delimiter> or $$n"<delimiter>text<delimiter> (n not 7) Left adjuseted sixbit string, six characters per word. Ends with a zero byte or zero word. Output modes $A Absolute $C Full word constant in current radix $F Floating point $H Halfword format $nJ Output in flag mode using the n-th flag table. Each flag table contains =36 radix50 flag names (flag name for bit 0 is first). The first word in the list of flag tables is found by looking in $M+3 (FLGPTR). Each word in the list of flag tables is a right-half pointer to a flag table and a left-half pointer to the next word in the list (a zero left half terminates). $nL Output right half of cell as left half flags using n-th flag table. This is suitable for looking at MOVSI or TLxx instructions. $nO Output cell in n-bit bytes If n=0 use the byte mask ($M+2) to define arbitrary byte boundaries $R Relocatable $nR Set typeout radix to n. $S Symbolic $nT n-bit text bytes. If n is omitted output 7-bit ascii, left adjusted, except if the first byte is null, output one right adjusted character. If n is present it should be one of 5, 6, or 9: 6=sixbit, 5=radix50, 9=Stanford ascii with bucky bits. Other values of n presently print in 7-bit ascii. $U each halfword as numeric in the current radix, unless $10R in which case output full word in radix 10 $nV Output right half of cell as right half flags using n-th flag table. This is suitable for looking at MOVEI or TRxx instructions. Special Characters addr/ open cell in current mode addr[ open cell as a number in the current radix addr] open cell as symbolic addr! open cell and suppress typeout addr\ open cell in current mode and don't change "." CR Closes and changes (if user typed a new value) the current cell. LF Like CR and opens .+1. ^ Like CR and opens .-1. TAB Like CR then opens the cell pointed to by right side of current cell.  (control ] on ttys) Closes and does NOT change the current cell then opens the cell pointed to by left side of current cell. ; retype in current mode (usually following a temporary mode change) = retype like $U format (half word numeric in current radix) $= retype like $C format (full word numeric in current radix) _ retype in symbolic mode. ? typeout all undefined symbols Searches $M Contains the search mask. Put 1 bits in it where you want to look. first<last>arg$E Effective address search for intructions pointing to arg in the range first to last first<last>arg$N Search for words NOT containing arg in the range first to last. first<last>arg$W Search for words containing arg in the range first to last. first<last>arg$$Z Write the value arg into all words in the range first to last. Special values . (period) has the value of the current address $I (exec ddt) has the state of the PI system (CONI PI,) $Q Has the last value typed by ddt. $nB Address of the four words associated with breakpoint n. The first word contains the address of the breakpoint in the right half, and the address of the cell to open in the left half. The second word is the conditional instruction. If this is zero, or if when exected it causes one skip, then the procede counter is decremented and if it becomes non-positive, the breakpoint occurs. If the conditional instruction does not skip, no break is taken. If the conditional instructions skips twice, the break is taken regardless of the procede counter. The third word is the procede counter. If the fourth word is non-zero it is assumed to be the address of an ASCIZ string which will be used to set $M-1 (see below) to cause this string to be used for input instead of TTY input. $M-4 (EXEC DDT) If non-zero, DDT output goes to the LPT $M-3 (EXEC DDT) Stores APR CONI bits here when DDT is entered $M-2 If non zero, this points to a routine to be called to output each character. The character to be output is in T (ac 5) and the routine should return via POPJ 3, without having clobbered any acs. $M-1 If non zero is taken as a byte pointer to an ASCIZ string which is used instead of the TTY for input. $M Search mask $M+1 Parameter for symbolic disassembly. If the value disassembed minus the best symbol is less than this number (MXINC) then the dissambler will print the symbol name plus the difference, if the difference is larger than this value, then the value being disassembled will be printed as a number. $M+2 Byte input/output mask for $0% and $0O commands. $M+3 First word in the list of flag tables. (See $F.) Symbol manipulations $D Suppress the last symbol typed. Retype the same value. sym$K Suppress output of the named symbol sym$$K Suppress input and output of this symbol sym$: Open the symbol table of the program named sym. $: Type a list of all program names. sym: Define sym to be the currently open location. val<sym: Define sym to have value val. sym$& Open the symbol table of the block named sym in the currently open program. Also accessible will be all symbols in blocks that contain the opened block. $& Type a list of all block names in the currently open program. Program control adr1(adr2)$nB Set breakpoint n at adr1. When breakpoint is hit it will type the contents of adr2. The n and (adr2) are optional. adr1(adr2)$$nB Same as above except DDT will procede from the breakpoint automatically. Auto procede continues until typin is present when the breakpoint is hit (see $$P). $B remove all breakpoints 0$nB remove breakpoint n. adr$G Start execution at adr. If adr is omitted, execution starts at the location pointed to by the right half of JOBSA (in exec DDT the right half of STARTA is used instead of JOBSA). If JOBSA (STARTA) contains a zero starting address, $G with no argument is illegal. Incidently STARTA is located at DDTBEG+0. adr$$G Same as adr$G except the argument is stored in the right half of JOBSA (or STARTA) for subsequent $G commands. $P Procede from breakpoint. n$P Procede n times from this breakpoint $$P Procede automatically until the typein is present at the breakpoint. instr$X Executes the instruction that was typed. If no argument is given then the one instruction at the current breakpoint location is single-stepped. Repetitions of $X cause subsequent instructions to be single stepped. After single stepping, a $P command will return to the normal execution of the program. Assembly operations +-*' are arithmetic operators , is a separator denoting ac or device field ,, separates half-words numeric typin is octal except digits followed by a decimal point are radix 10, except if further digits following the point are typed, input is floating point. Floating point number may be followed by E, an optional plus or minus, and an exponent. () swap the argument and add it into the assembled word. @ Set bit 13 in the word being assembled. blank is a separator and adding operator in the word assembler. sym& sets block name to sym for the next symbol that's input. Commands for UEDDT  Like CR except it deposits changes on the Librascope $n Examine core image of Timesharing job n. $$n Examine core image of Timesharing job n using its symbols. If n is zero or omitted in either of the above, UEDDT will examine the timesharing system, using the EXPGT (where set, or physical pages where the EXPGT has no entry) to accomplish mapping. n$ Examine physical core, with page n being page 0 in the space being examined. If n is negative, examination will be via the EXPGT. Paper tape control (Special EXEC DDT version only) $^Q (That's control-Q) Punch loader. first<last$^R Punch data from core range to tape. addr$^S Punch addr as the starting address. ^T Punch currently open location as one tape data block first<last$Y Read tape into core first<last^V Read tape and verify by comparing it with core.  IFE EDDT&1,<IFE UEDDTS!SAVESW,<END> IFN UEDDTS,<END UESTRT> IFN SAVESW,<END DDT>> IFE EDDT&41-1,<BEND DDT> IFN EDDT&40,<END> >