;-*-MIDAS-*- TITLE Carpet and Hali Ifndef Halip, Halip==0 ;Hali is Carpet over a TTY line. Define Haly ifn Halip,termin Define Haln ife Halip,termin IFNDEF 45P,45P==0 ;1 FOR 11-45 MAP SIMULATION. DEFINE 45Y IFN 45P,TERMIN DEFINE 45N IFE 45P,TERMIN ;DEFINE ACCUMULATORS A=1 B=2 C=3 D=4 SF=5 DO=6 ;IF POSITIVE, VIRT. ADDRESS OF OPEN LOC. DL=7 ;HOLDS %Q OR ARG. T0=10 ;HOLDS LAST CHAR, EXCEPT IN INSN PRINTING. T1=11 ;TEMP FOR INST HANDLERS T2=12 ;USED BY ADDRESS COMPUTATION RTNS. T3=13 DLEN=14 ;HOLDS LENGTH OF %Q OR ARG IN WORDS. T5=15 ;EXTREMELY TEMPORARY. T6=16 ; " " " " . P=17 .XCREF A,B,C,P ;While hacking Hali, want full cref. 45Y 45STTM==144000 ;MASK OF MODE AND REG SET. 45Y 45CMOD==160200 ;BP TO CURRENT MODE 45Y 45MODM==140000 ;MASK OF CURRENT MODE 45Y 45PMOD==140200 ;BP TO PREVIOUS MODE. 45Y 45REGB==4000 ;REGISTER SET SPECIFIER BIT PRI==50300 ;PRIORITY (BYTE POINTER) TF==20 NF==10 ZF==4 VF==2 CF==1 ;I/O CHANNELS TYIC==1 TYOC==2 LOADCH==3 LPTC==4 UTIC==5 DMPCH==6 Haly Httyoc==7 ;Channels for communicating with Hali 11 Haly Httyic==10 ERRC==11 IF1 EXPUNGE %GO ;BIT TYPEOUT MASK FOR GRAPHICS OPS! WE DON'T NEED IT. ;MISCELLANEOUS CONSTANTS MAPMSK==574377776000 ;$T; IN DDT TYPES OUT 10-11 INTERFACE MAP ENTRY Haln DFLT11==1 ;DEFAULT PDP-11 NBPTS==7 ;NUMBER OF BREAK POINTS SNB==400000 ;SIGN BIT Haly Haltty==44 ;Default Hali TTY if1 .kill %pc ;I hate to do this... ? suffers. if1 .bind %pc ;Will this work? ;UUO DEFINITIONS SYMTYP=1000,, ADRTYP=2000,, OPENL=3000,, 6TYPE=4000,, BLKFLS=5000,, TTOI=6000,, TTOA=7000,, ;ASCIZ STRING TYPEOUT ERROR=10000,, 11PUT=11000,,0 11GET=12000,,0 11send=13000,, 11receive=14000,, UUOMAX==14 ;SOME DEFINITIONS TO MAKE THE CODE OBSCURE ARGERR=ERROR [ASCIZ/ARG/] CALL=PUSHJ P, RETURN==POPJ P, RET=RETURN SAVE=PUSH P, REST=POP P, CRF=TTOA [ASCIZ / /] .XCREF CALL,RET,RETURN TRPPTL==100 ;-1)*4=MAX TRAP FOR TRAP PRINT VECTOR PDLSIZ==200 ;PDL SIZE 45Y SEGBP==140300 ;BP TO SEGMENT # FIELD IN WORD #. IF1 EXPUNGE APR ;MEMORY ALLOCATION ;0 START OF SIMULATOR, ENDS WITH SYM TAB THAT EXPANDS UPWARD Haln PDP11=300000 ;SIMULATED PDP11 MEMORY 1 WORD/WORD 45N MAXK==28. 45N MAXCOR==100000 45N MAXBYT==200000 45Y MAXK==124. 45Y MAXCOR==400000 45Y MAXBYT==1,, ;SYMBOL CONVENTIONS ;C!COM: ROUTINE FOR : COMMAND COM ;CS!COM: ROUTINE FOR ; COMMAND COM ;5/29/73 PROGRAMMING THE PDP-10 TO PDP-11 INTERFACE COMMENT $ THE INTERFACE LETS THE PDP-10 PROGRAMMER DIRECTLY ACCESS THE MEMORIES OF UP TO EIGHT PDP-11'S. PDP-10 PAGES ARE MAPPED INTO SEGMENTS OF VARIABLE SIZE IN THE PDP-11'S MEMORY. THE PDP-10 PAGE MAP IS ALSO DIRECTLY ADDRESSABLE IN MEMORY (IT CURRENTLY LIVES IN LOCATIONS 776000-776377)**. THERE IS ONE ENTRY IN THE MAP FOR EACH PDP-10 PAGE. ** SEE ALSO BELOW PAGE TABLE ENTRY: 4.9 VALID 4.8 WRITE ENABLE 4.3-4.7 (5 BITS) NOT USED (0) 3.9-4.2 (3 BITS) PDP-11 NUMBER 2.2-3.8 (16 BITS) RELOCATION ORIGIN OF SEGMENT OF IN PDP-11 ADDRESS SPACE PDP-11 ADDRESS=4*RELOCATION 1.1-2.1 (10 BITS) PROTECTION (PDP-11 PROTECTION=4*PROTECTION IF PROTECTION=0 THEN ONLY ONE 16 BIT WORD IS ACCESSIBLE) | |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| 0 1 2 7 10 26 | |1|1| 5 | 3 | 16 | 10 | |_|_|_________|_____|_______________________________|___________________| | | | | | | | | | | | |----------->protection | | | | | | | | | |------------------------------------->relocation | | | | | | | |-------------------------------------------------------->PDP-11 # | | | | | |---------------------------------------------------------------->not used | | | |---------------------------------------------------------------------->write enable | |------------------------------------------------------------------------>entry valid ; PDP-10/PDP-11 INTERFACE CONTINUED WRITE REFERENCE FORMAT: 3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD 1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD 1.4 DON'T WRITE WORD 0 1.3 DON'T WRITE WORD 1 1.1-1.2 (2 BITS) NOT USED | |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| 0 16 323334 | | 16 | 16 |1|1| 2 | |_______________________________|_______________________________|_|_|___| | | | | | | | | | |--->not used | | | | | | | |------>inhibit odd | | | | | |-------->inhibit even | | | |------------------------->odd word | |--------------------------------------------------------->even word READ REFERENCE FORMAT: 3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD 1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD 1.1-1.4 (4 BITS) 0 | |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| 0 16 32 | | 16 | 16 | 4 | |_______________________________|_______________________________|_______| | | | | | |----->0 | | | |------------------------->odd word | |--------------------------------------------------------->even word NOTE -- SPLIT CYCLES WILL DO THE RIGHT THING; HENCE, ILDB AND IDPB WORK. CAUTION -- WHEN USING BYTE INSTRUCTIONS, A 16 BIT BYTE SIZE IS RECCOMMENDED. SUCCESSIVE INCREMENTS OF BYTE POINTERS WITH AN 8 BIT BYTE SIZE DO NOT ADDRESS CONSECUTIVE BYTES IN THE PDP-11! ITS SYSTEM CALL TO PUT 11 MAP ENTRY IN YOUR 10 MAP: .CALL [SETZ SIXBIT /T11MP/ 10PGNO ;PTR TO 10 PG NO SETZ PGENT] ;PTR TO ENTRY (FORMAT ABOVE) 10PGNO: PDP-10 PAGE # PGENT: <_34.>+<_26.>+<_10.>+</4> FOR ABOVE 10 ADDRESSES 6000-7777 ARE MAPPED INTO 11 ADDRESSES 10000-17776. BOTH READ AND WRITE ARE ENABLED. $ COMMENT $ How Hali works. The PDP-11 is connected to the PDP-10 by a TTY line. On this TTY line, Hali reads and writes using the formats described below. The TTY line is assumed dedicated to operating Hali: in Building 38, we have a multiplexed TTY arrangement, so this does not mean running many lines to the 11. Since the TTY is dedicated, no escape sequence is defined. If it is desired to run Hali on a non-dedicated TTY line, insert code (conditionalized) at ????. A full word on the 11 is 16 bits. The 10 can send 8-bit chunks, but can only receive 7 bits at a time. This is a pain. In any case, words are send as two 8-bit bytes, low byte first, but must be received as three bytes, the first five bits, the second five bits, and the last six bits (is this random enough?). Commands to 11: (* means not implemented on 11 or Hali end) Read Send: 1 address Reply: c(address) Write Send: 2 address Reply: Ifset* ;Useful? Send: 3 address Reply: <0 if not executed; 1 if executed> Stop* Send: 4 Reply: Effect: listens only to this line; turns off interrupts Continue* Send: 5 Effect: undoes Stop Single step* Send: 6 Effect: ^N Dump registers (i.e. get from 11)* Send: 7 Reply: Load registers (i.e. send to 11)* Send: 10 then c(reg) for each register, as above. PC, SP, and PS are saved. Effect: Tells 11 what registers should be when it continues or one-proceeds. $ define Byteo .iot Httyoc,[%tdqot] ;Quote possible 200-characters .iot Httyoc,termin define Bytei .iot Httyic,termin hl.read==201 hl.write==202 hl.ifset==203 hl.stop==204 hl.continue==205 hl.sstep==206 hl.dmpreg==207 hl.ldreg==210 Comment $ 11 to Hali The 11 may say to Hali: I hit a breakpoint Some sort of error happened $ ABEG: LOC 41 JSR UUOH JSR TSINT DEFINE CONC A,B A!B!TERMIN DEFINE TSOPEN A,B .OPEN A,B OPENL B TERMIN DEFINE SYSCAL A,B .CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))] .VALUE TERMIN DEFINE SYSCL A,B .CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))] TERMIN DEFINE INSIRP A,B IRPS INSIR1,,[B] A,INSIR1 TERMIN TERMIN IOCNUM==0 ;GET CONTROL ON IOC ERRORS DEFINE IOCGET X IF2 [IOCLOC==. LOC IOCTAB+IOCNUM IOCLOC X LOC IOCLOC] IOCNUM==IOCNUM+2 TERMIN DEFINE CSLWRD A JSP D, CSLR!A TERMIN ;LOAD 1 WORD FROM LOADCH INTO A (T2, T3, T5). Define Upper x cain x,177 ;Don't want to affect rubout jrst .+3 trne x,100 ;Change character to upper case trz x,40 termin LOC ABEG BEG: SETZM DDTPDP ;DDTPDP=0 MEANS NORMAL NOT IN DDT ;DDTPDP>0 NOT IN DDT BUT FAKE OUT MTRAP ETC. ;DDTPDP<0 IN DDT (SAVE PDL PNT HAS NEG COUNT IN LH) SETOM DINITF ;WILL BE 1ST CALL TO DDT SOON. MOVE P,[-PDLSIZ,,PDL] SKIPN XUNAME .SUSET [.Rxuname,,XUNAME] SETZM LPTFLG PUSHJ P,MERRV .OPEN TYOC,TYOF .VALUE ;IF NO TYPEOUT. MOVE A, [-BSUSL,,BSUST] .SUSET A ;SET UP INTERRUPTS .OPEN TYIC,TYIF TTOA [ASCIZ / TYPE IN FAILS/] .STATUS TYIC,A ANDI A,77 CAIN A,2 SETOM GETTY ;SET GETTY TO -1 IF GRAPHICS TTY. .CALL TTYGT .VALUE TLZ A,2000 MOVEM A,TTYM1A ;SET UP ORDINARY TTYSET, TLO A,2000 MOVEM A,TTYMAA ;ACTIVATE-ON-NEXT-CHAR TTYSET. Haln 6TYPE [.FNAM1/] Haly 6type [sixbit /hali/] TTOA [ASCIZ / /] 6TYPE [.FNAM2] Haln MOVEI A,DFLT11 ;# OF DEFAULT PDP11 Haln PUSHJ P,GET11P ;GET 11 PAGES INTO MAP Haly movei a,Haltty Haly pushj p,Httyopen ;Open Hali TTY 45Y CALL AI45 CRF .OPEN UTIC,INITFI ;Init file on default directory? CAIA JRST DOINIT .CALL [ SETZ ;How about on Xuname directory? SIXBIT /OPEN/ 1000,,UTIC [SIXBIT /DSK/] XUNAME Haln [SIXBIT /.CARP./] Haly [sixbit /.HALI./] ;Who knows? Maybe someone wants both. SETZ [SIXBIT /(INIT)/]] JRST BEG2 DOINIT: TTOA [ASCIZ /INIT !/] SETOM FILINF JRST DDT BEG2: TTOI "! JRST DDT INITFI: Haln SIXBIT / DSK.CARP.(INIT)/ Haly Sixbit / dsk.hali.(init)/ FILINF: 0 Haln[ ;non-Hali only. ;GETS 11 PAGES INTO MAP ;CALL WITH # OF PDP11 IN A GET11P: MOVEM A,CUR11 ;SAVE 11# LSH A,26. ;MOVE # TO CORRECT FIELD MOVE C,A PUSH P,A MOVEI A, ;PAGE # OF ORIGIN OF PDP-11 MEMORY MOVEI B,16 ;# PAGES TO 28K PDP-11 WORDS MOVEM B,KCOUNT ADD C,[<3_34.>\1777] PUSHJ P,G11P1 MOVEI A,<<760000_-2>+PDP11>_-10. MOVEI B,2 ;GET 4K PDP-11 WORDS FOR IO REGISTERS POP P,C ;111 # ADD C,[<3_34.>\<<760000_-2>_10.>\1777] G11P1: .CALL [ SETZ SIXBIT /T11MP/ A SETZ C] .VALUE ADD C,[2000_10.] ADDI A,1 SOJG B,G11P1 POPJ P, ] ;end Haln CUR11: 0 ;# OF CURRENT PDP11 Haly[ ;for Hali ;; Opens Hali TTY Httyopen: movem a,cur11 ;Which TTY? skipe debugp jrst dbgtty idivi a,8. ;Convert to Sixbit addi a,'0 lsh a,6 addi a,(b)'0 ;Now have Sixbit in A addi a,<'T>_12. ;Txx hrli a,.uii ;image input .open Httyic,a .value [asciz /:Can't open Hali TTY for input./] hrli a,%tjsio+.uio ;Now for output TTY, also superimage .open Httyoc,a .value [asciz /:Can't open Hali TTY for output./] popj p, dbgtty: .open Httyic,[ .uii,,'clo ? 'debugg ? 'haliii] .value .open Httyoc,[ .uio,,'clo ? 'debugg ? 'halioo] .value popj p, ] ;end of Haly CPPRI: TLNN SF,NUMFND ;SELECT PROCESSOR LEVEL USED BY BPT S, ETC JRST CPPRI1 ;TYPE CURRENT MOVEM T5,BPTLVL POPJ P, CPPRI1: MOVE B,BPTLVL PUSHJ P,OCTP JRST CPPRI2 ;DDT ROUTINE TO SELECT 11 # or TTY # for Hali ; arg:SELECT selects 11 #arg CSELEC: TLNN SF,NUMFND JRST CSELE1 ;NO ARGUMENT MOVE A,T5 ;ARGUMENT Haln PUSHJ P,GET11P Haly pushj p,Httyopen RETURN ;if no arg, type currently selected 11 CSELE1: Haln TTOA [ASCIZ /Using 11 #/] Haly ttoa [asciz /Using as Hali TTY T/] MOVE T5,CUR11 ;PICK UP 11 # TLO SF,DNUMM ;MAKE SURE TO PRINT AS # SYMTYP T5 CPPRI2: CRF RETURN ;HERE TO SET SIZE OF PDP-11 MEMORY, TAKES # 1K BLOCKS IN DECIMAL CCORE: TLNN SF,NUMFND ;ARGUMENT? JRST CCORE1 ;NOPE MOVE D,T5 ;# PDP-11 WORDS IN K CAILE D,124. ;MAKE SURE ITS LEGAL ERROR [ASCIZ /CORE -- ILLEGAL ARGUMENT/] LSH D,10. ;FUDGE, FUDGE PUSH P,T1 JRST SETSZ3 CCORE1: HRRZ T5,%CORE LSH T5,-11. TLO SF,DNUMM+DDECM SYMTYP T5 TTOA [ASCIZ /K CORE/] CRF POPJ P, ;ROUTINE TO FIND SIZE OF PDP-11 MEMORY SETSIZ: PUSH P,D PUSH P,T1 HRRZ D,%CORE ;HAS CORE SIZE BEEN SPECIFIED BEFORE? JUMPN D,[ LSH D,-1 ;YES JRST SETSZ3] Haln[ MOVEI T5,177777 PUSH P,NOMINS MOVSI T1,(JFCL) MOVEM T1,NOMINS ADDI D,1 ;TEST 2ND WORD OF PAGE, NOT 1ST, SETSZ1: 11GET T1,(D) ;BECAUSE PEOPLE LIKE TO PUT 11 IN LOOP IN LOCATION 0. 11PUT T5,(D) 11GET T6,(D) 11PUT T1,(D) CAIGE D,<160000>_-1 CAME T5,T6 JRST SETSZ2 ;THAT'S THE SIZE ADDI D,10000 ;PDP-11 MEMORY COMES IN 4K WORD CHUNKS JRST SETSZ1 SETSZ2: POP P,NOMINS TRZ D,7777 ] Haly Error [asciz /I can't guess the core size. Please specify it./] SETSZ3: MOVEM D,MEMSIZ LSH D,1 HRRM D,%CORE ;# BYTES IN CORE LSH D,-12. ;PDP-10 CORE BLOCKS MOVEM D,KCOUNT POP P,T1 POP P,D POPJ P, ;INTERRUPT HANDLER TSINT: 0 0 PUSH P,A PUSH P,B PUSH P,C PUSH P,40 PUSH P,UUOH SETZM INTINS SKIPGE DEBUGP .SUSET [.RJPC,,INTJPC] SKIPL A,TSINT JRST OTHERI ;FIRST WORD INT Haly[ trnn a,1_Httyic jrst tsint1 .value ;11 wants to signal some condition. ;;; ????? ] tsint1: TRNN A,1_TYIC JRST BADINT ;SECOND WORD BUT NOT VALID CHANNEL MOVEI A,TYIC .ITYIC A, JRST TSINTX AOSN ICTLQF JRST TSINT2 CAIN A,^Q JRST TSINTQ CAIE A,^W CAIN A,^S JRST TSILNT CAIN A,^V SETOM TYOFLG CAIN A,^B JRST TSINTB CAIN A,^E JRST TSINTE CAIN A,^G JRST TSQUIT TSINT2: SKIPGE DDTPDP JRST TSINTX CALL TSINNS ;STOP SLEEPING, PC INTO A. JRST TSINTX TSINNS: HRRZ A,TSINT+1 .VALUE; CAIN A,IWAITS ;DON'T RETURN TO .SLEEP . AOS TSINT+1 RETURN TSQUIT: SKIPGE DDTPDP ;IF INSIDE DDT, .DISMI [DERR] ;RETURN TO MAIN LOOP RIGHT AWAY. AOS A,QUITF CAIL A,2 .DISMI [QUIT] ;3 ^G'S - STOP IMMEDIATELY. TTOA [ASCIZ/ ^G /] CAIE A,1 JRST TSINTX TSILNT: SETZM TYOFLG PUSHJ P,TRESET JRST TSINTX TSINTQ: SETOM ICTLQF JRST TSINTX TRESET: .RESET TYOC, SKIPE LPTFLG .RESET LPTC, RETURN QUIT: SAVE TSINT+1 ;DDT WILL RETURN TO INTERRUPTED SIMULATION. SAVE [DDT] ;RSTALL WILL RETURN TO DDT. PUSHJ P,MERRV TTOA [ASCIZ/ ^GSUPER-QUIT! /] POPJ P, QUITF: -1 ICTLQF: 0 OTHERI: TRNE A,200000 TTOA [ASCIZ / PDL OVERFLOW/] TRNE A,400 JRST OTHIOC ;IOC INT TRNN A,20000 JRST BADINT MOVSI A,600000 ;NON-EX MEM MOVEM A,NXMCLB HRRZ A,TSINT+1 CAIL A,SYMTAB TTOA [ASCIZ/ NXM OUTSIDE PROGRAM AREA/] SKIPA A,-1(A) NXMX2: MOVE A,(A) HRRI A,@A ; TRNN A,400000 ;THIS TEST FOULS UP ON BYTE INSNS. ; TRNN A,300000 ; TTOA [ASCIZ/ ;NXM OUTSIDE VIRT. MEM/] AND A,[777740,,-1] TLC A,(XCT) TLNN A,777000 JRST NXMX2 ;XCT, GO DOWN CHAIN TLC A,(XCT) HRRI A,NXMCLB JRST NXMXIT OTHIO4: MOVE A,1(A) NXMXIT: MOVEM A,INTINS TSINTX: POP P,UUOH POP P,40 POP P,C POP P,B POP P,A SKIPN INTINS .DISMI TSINT+1 AOS TSINT+1 ;TAKE CARE OF SKIPPING INSNS. XCT INTINS SOS TSINT+1 .DISMI TSINT+1 OTHIOC: HRRZ C,TSINT+1 MOVEI A,IOCTAB OTHIO2: CAMN C,(A) JRST OTHIO4 ADDI A,2 CAIE A,IOCEND JRST OTHIO2 TTOA [ASCIZ / IOC ERROR IN /] SOS TSINT+1 ;RETURN TO THE .IOT . JRST BADINU NXMCLB: 0 ;MAY BE CLOBBERED INTJPC: 0 INTINS: 0 BSUST: .SMASK,,[220400] .SPICL,,[-1] .SMSK2,,[1_TYIC] BSUSL==3 TYIF: 4,,SIXBIT / TTY/ TYOF: 21,,SIXBIT / TTY/ XUNAME: 0 BADINT: PUSHJ P,MERRV TTOA [ASCIZ / BAD INTERRUPT IN  INT: /] MOVE B,TSINT PUSHJ P,FOCTP BADINU: REST UUOH ;RESTORE EVERYTHING SAVED. REST 40 REST C REST B REST A .VALUE [ASCIZ*INTJPC/ *] .DISMI TSINT+1 ;STOP BEFORE NEXT INSN. LPTFIL: 1,,SIXBIT / LPT/ SIXBIT /WALL PAPER/ ;UUO HANDLER UUOH: 0 PUSH P,A PUSH P,B PUSH P,C PUSH P,40 ;4O MUST BE NEXT TO LAST PUSHED PUSH P,UUOH ;UUOH MUST BE LAST PUSHED HRRZ A,40 LDB C,[331100,,40] SKIPE C ;JUMP WILL CLOBBER JPC CAILE C,UUOMAX SKIPA JRST @UUODIS-1(C) .SUSET [.RJPC,,20] ;What the hell? 20?? .suset [.rjpc,,uuojpc'] PUSHJ P,MERRV TTOA [ASCIZ / ILLEGAL UUO IN  .JPC/] REST UUOH REST 40 REST C REST B REST A SOS UUOH ;POINT TO UUO. .VALUE [ASCIZ*20/*] JRST @UUOH ;STOP BEFORE THE UUO. UUODIS: XSYMTY XADRTY UOPENL U6TYPE UBLKFL UTTOI UTTOA UERROR U11PUT U11GET haly u11send haly u11receive ;11 MEMORY ACCESS ROUTINES Haln[ ;RESTORES REGISTERS FOR EXIT ROUTINE PUTREG: PUSH P,A 11GET T5,BPTVEC/2 JUMPE T5,POPAJ LSH T5,-1 11GET T6,-3(T5) JUMPE T6,POPAJ LSH T6,-1 MOVEI A,10 ADD T6,A PUTR1: MOVE T5,R0(A) 11PUT T5,(T6) SUBI T6,1 SOJGE A,PUTR1 JRST POPAJ ;GETS REGISTERS INTO PDP-10 MEMORY GETREG: PUSH P,A SETOM R0 MOVE A,[R0,,R1] BLT A,R7 11GET T5,BPTVEC/2 ;PDP11 BPT VECTOR JUMPE T5,POPAJ LSH T5,-1 ;WORD ADDRESS 11GET T6,-3(T5) ;POINTS TO ACS JUMPE T6,POPAJ LSH T6,-1 MOVEM T6,11REGS ;LEAVE AN EASY HANDLE MOVEI A,10 ;GET ALL REGISTERS AND PS ADD T6,A GETR1: 11GET T5,(T6) MOVEM T5,R0(A) SUBI T6,1 SOJGE A,GETR1 POPAJ: POP P,A POPJ P, ] ;end Haln Haly[ Putreg: push p,a push p,b Byteo [hl.dmpreg] move t5,[-10,,r0] ;Note that PS follows regs. putrg1: move a,(t5) pushj p,send aobjn t5,putrg1 popabj: pop p,b popaj: pop p,a popj p, getreg: push p,a push p,b byteo [hl.ldreg] move t5,[-10,,r0] getrg1: pushj p,receive movem a,(t5) aobjn t5,getrg1 jrst popabj ] ;end Haly Haln[ ;; Specific to Carpet ;UUO ACTION ROUTINES U11PGC: MOVE A,NOMINS ;SETUP ROUTINE FOR U11GET AND U11PUT MOVEM A,NOMAT ;ASSUME CHECK READ WILL REVEAL SAME DATA AS WRITE MOVEI A,50. MOVEM A,NOMTRY ;TRIES ON THIS DEPOSIT LDB A,[270400,,40] ;AC FIELD OF UUO MOVEI B,@40 ;EFFECTIVE ADDRESS CAIG A,C ;DOESNT WORK FOR AC S A B AND C .VALUE LDB C,[000100,,B] ;BYTE TO PICK IN WORD LSH B,-1 ;TEN WORD ADDRESS TRC B,160000_-2 ;LOOK FOR DEVICE REGISTERS TRCN B,160000_-2 PUSHJ P,[ TRO B,760000_-2 ;ADDRESS IS IN IO AREA PUSH P,[JFCL] POP P,NOMAT ;READ AFTER WRITE NOT NECESSARILY YIELD SAME POPJ P,] MOVEM B,11ADR' MOVEI B,PDP11(B) EXCH B,11ADR POPJ P, U11GET: PUSHJ P,U11PGC LDB C,U11PGB(C) MOVEM C,(A) JRST UUOXIT U11PUT: PUSHJ P,U11PGC MOVE A,(A) NOMAT2: PUSH P,A LSH A,4 ;LOW 4 BITS NOT USED SKIPN C LSH A,16. TRO A,10 ;SELECT 11 WORD TO NOT WRITE SKIPN C TRC A,14 MOVEM A,PDP11(B) ;DONT USE DPB SINCE THAT DOES READ PAUSE WRITE POP P,A ;WHICH MIGHT AFFECT OTHER WORD IF ITS AN IO REG PUSH P,B LDB B,U11PGB(C) ANDI A,177777 CAIE B,(A) XCT NOMAT POP P,B JRST UUOXIT NOMAT: .VALUE ;XCT THIS INSTRUCTION WHEN 11 INTERFACE LOSES NOMINS: JRST NOMAT1 ; OR .VALUE OR JFCL NOMAT1: SOSGE NOMTRY .VALUE ;50 TRIES DIDNT WIN EITHER POP P,B PUSH P,A MOVEI A,2 .SLEEP A, ;LET 10-11 INTERFACE "REST" POP P,A AOS NOMATC JRST NOMAT2 NOMTRY: 0 ;COUNT OF TRIES REMAINING ON THIS DEPOSIT NOMATC: 0 ;COUNT OF TIMES 10-11 INTERFACE LOST U11PGB: 242000,,PDP11(B) 042000,,PDP11(B) ] ;End of non-Hali Haly[ ;; Hali-only stuff byte0==001000 ;11 byte1==101000 ;11 part1==130500 ;The three bytes received from the 11. part2==060500 ; See the description of the Hali format. part3==000600 acfield==270400 ;on 10 Define 11go byteo [hl.continue] termin adrsnd: movei a,@40 ;Get address wanted ;drop through to-- send: ldb b,[byte0,,a] Byteo b ldb b,[byte1,,a] Byteo b popj p, receive: setz a, Bytei b dpb b,[part1,,a] Bytei b dpb b,[part2,,a] Bytei b dpb b,[part3,,a] popj p, u11get: Byteo [hl.read] ;Go through read sequence pushj p,adrsnd pushj p,receive ldb b,[acfield,,40] ;Where to put result caig b,3 ;Can't be a, b, or c. .value [asciz /:U11get loses on ac a, b, or c. /] movem a,(b) ;Store jrst uuoxit u11put: Byteo [hl.write] pushj p,adrsnd ;Address to write to ldb b,[acfield,,40] move a,(b) ;What to write pushj p,send pushj p,receive ;ignore result jrst uuoxit ] ;end Haly UTTOA: LDB B,[270400,,40] ;SKIP BY C(AC FIELD) ADDM B,(P) HRLI A,440700 SAVE MCTLVF MES2: ILDB B,A CAIG B,^F XCT MESTAB(B) CAIN B,^K JRST MCTLK ;DECP CAIN B,^V JRST MCTLV TTOI (B) JRST MES2 MCTLV: SETOM MCTLVF JRST MES2 MESTAB: JRST MESXIT ;^@ JRST MFOCTP ;^A JRST OPPNT ;^B JFCL ;^C JRST MCTLD ;SYMTYP JRST MCTLE JRST MCTLF ;ADRTYP MERRV: SETOM TYOFLG RETURN MCTLVF: 0 ;FORCE TTY OUTPUT FOR ERROR MESSAGES MESXIT: REST MCTLVF JRST UUOXIT MFOCTP: PUSHJ P,UGQUAN PUSHJ P,FOCTP JRST MES2 FOCTP: LSHC B,-43 ;FULL WORD OCTAL PRINT LSH C,-1 DIVI B,8 HRLM C,(P) SKIPE B PUSHJ P,FOCTP HLRZ C,(P) TTOI "0(C) RETURN UGQUAN: ILDB B,A ;GET QUANTITY CAIL B,"8 JRST UGQUA2 HRRZ B,R0-"0(B) RETURN UGQUA2: CAIE B,"A SKIPA B,QT MOVE B,QA RETURN OPPNT: PUSH P,[MES2] SKIPL DDTPDP AOS DDTPDP SKIPL DDTPDP HRLZ SF,%TMODE SKIPGE DL,OPC JRST OPPNT1 LSH DL,1 PUSHJ P,DPINSN SKIPA OPPNT1: TTOA [ASCIZ/--DDT--/] SKIPL DDTPDP SOS DDTPDP POPJ P, MCTLF: SKIPA C,[ADRTYP QD] MCTLD: MOVE C,[SYMTYP QD] PUSHJ P,UGQUAN MOVEM B,QD PUSH P,[MES2] SKIPL DDTPDP HRLZ SF,%TMODE XCT C POPJ P, MCTLE: .VALUE ;FATAL ERROR SKIPGE DDTPDP .DISMI [DERR] .DISMI [BEG] MCTLK: PUSHJ P,UGQUAN PUSHJ P,DECP JRST MES2 OCTP: SKIPA C,[8] DECP: MOVEI C,10. HRRM C,ANYP ANYP: IDIVI B,. HRLM C,(P) SKIPE B PUSHJ P,ANYP HLRZ B,(P) TTOI "0(B) CPOPJ: RETURN UBLKFL: HRRZ B,(P) ;FLUSH QUEUE BLOCKS ADD B,[<222200,,>-1] UBLKF2: ILDB A,B TLNE B,770000 AOS (P) JUMPE A,UUOXIT JRST UBLKF2 UTTOI: SKIPE MCTLVF JRST UTTOI1 SKIPE TYOFLG UTTOI1: .IOT TYOC,A ;THE ONLY TYPE OUT IOT SKIPE LPTFLG .IOT LPTC,A UUOXIT: POP P,UUOH POP P,40 POP P,C POP P,B POP P,A JRST 2,@UUOH U6TYPE: MOVE B,@40 MOVE A,[440600,,B] U6TYP2: ILDB C,A JUMPE C,UUOXIT TTOI 40(C) JRST U6TYP2 UOPENL: .SUSET [.RBCHN,,C] ;OPENL UUO, GET # OF CHANNEL. CAIE C,LPTC JRST UOPNL1 SETZM LPTCNT SETZM LPTFLG UOPNL1: DPB C,[270400,,OPNLX1] DPB C,[270400,,OPNLX2] OPNLX1: .STATUS .,OPLERR HLR C,(A) CAIE C,4^5 ;NEW SYSTEM CALL OPEN, DON'T GET DEV NAME. TRNE C,1 JRST UOPNL3 ;OUTPUT LOST .SUSET [.RSNAME,,LSNAME] .SUSET [.SSNAME,,[SIXBIT /PDP11/]] OPNLX2: .OPEN .,(A) JRST UOPNL2 .SUSET [.SSNAME,,LSNAME] JRST UUOXIT UOPNL2: .SUSET [.SSNAME,,LSNAME] UOPNL3: .OPEN ERRC,ERRFIL JRST .-1 PUSHJ P,MERRV UOPNL4: .IOT ERRC,B CAIE B,14 CAIN B,3 JRST UOPNL6 TTOI (B) JRST UOPNL4 UOPNL6: CAIN C,4^5 JRST DERR HRLZ B,(A) 6TYPE B JRST DERR ERRFIL: (SIXBIT /ERR/) 3 OPLERR: . LSNAME: 0 ;LAST SYSTEM NAME ;IN DDT, PRINTS MESSAGE & CAUSES ERROR, DOESN'T RETURN. ;OUTSIDE DDT, PRINTS MESSAGE, CAUSES DDT TO BE CALLED, RETURNS. UERROR: PUSHJ P,MERRV ;TURN ON TTY FOR ERROR MSG. SKIPN DEBUGP JRST UERRO1 TTOA [ASCIZ/ 10PC: /] MOVE B,(P) ;IF DEBUGGING, PUSHJ P,FOCTP ;PRINT ADDR AFTER ERROR UUO. CRF UERRO1: SKIPGE DDTPDP TTOA [ASCIZ/ /] TTOA (A) SKIPL DDTPDP .VALUE JRST DERR IFN 0,[ LDB B,[270400+P,,-1] JUMPE B,UUOXIT ;AC FIELD 0 - NO POPJS. MOVNI B,-POP14J(B) HRRM B,(P) ;EXIT TO RTN TO POPJ SEVERAL TIMES. JRST UUOXIT REPEAT 14.,REST POP14J RETURN POP14J: 0 ;EXCESS WDS ON PDL THROWN AWAY HERE. ] TYI1: .IOT TYIC,T0 Upper t0 CAIN T0,^Q JRST TYI4 CAIE T0,177 CAIGE T0,140 SKIPA SUBI T0,40 CAIE T0,^E CAIN T0,^V JRST TYI1 CAIE T0,^B CAIN T0,^W JRST TYI1 CAIE T0,^S RETURN SETOM TYOFLG JRST TYI1 TYI4: .IOT TYIC,T0 Upper t0 RETURN TSINTB: SAVE [TSINTX] DGLNCB: SKIPN LPTFLG PUSHJ P,OPNLPT SETOM LPTFLG RETURN TSINTE: SAVE [TSINTX] DGLNCE: SKIPN LPTFLG RETURN SETZM LPTFLG SOSGE LPTCNT .CLOSE LPTC, RETURN CWALLP: MOVEI A,LPTFIL ;^B TO FILE PUSHJ P,DGFIL PUSHJ P,OPNLPU SKIPE LPTFLG RETURN SETOM LPTFLG AOS LPTCNT RETURN OPNLPT: AOS C,LPTCNT SOJN C,CPOPJ OPNLPU: .OPEN LPTC,LPTFIL JRST .+2 RETURN TSOPEN LPTC,TPLFIL TTOA [ASCIZ /USING TPL/] RETURN TPLFIL: SIXBIT / !TPLWALL PAPER/ BLKGET: PUSH P,T1 ;GET CORE BLOCK PUSH P,T0 MOVE T1,@-2(P) MOVEI T1,@T1 LSH T1,-1 TRZ T1,777 IOR T1,[4000,,400000] MOVEM T1,QA .CBLK T1, TTOA [ASCIZ / BLKGET CBLK FAILED A/] HLLZ T0,@-2(P) JUMPGE T0,POT0A1 ;ALLOW NEG FROBS TO SET TO NXM LSH T1,1 MOVEM T0,(T1) HRLS T1 AOS T1 HLRZ T0,T1 BLT T1,1777(T0) POT0A1: POP P,T0 POT1J1: POP P,T1 AOS (P) RETURN BLKZAP: PUSH P,T1 ;FLUSH CORE BLOCK MOVE T1,@-1(P) MOVEI T1,@T1 LSH T1,-1 ANDI T1,377000 MOVEM T1,QA .CBLK T1, TTOA [ASCIZ / BLKZAP CBLK FAILED A/] JRST POT1J1 ;FLAGS IN SFLAGS, LEFT HAND SIDE DBYTM==200000 ;REGISTER OPEN IN BYTE MODE. DEXCM==100000 ;IN DON'T PRINT CONTENTS MODE. DINSM==40000 ;PRINT AS INSTRUCTION. DSYMM==20000 ;PRINT NUMBERS, ADDRESSES SYMBOLICALLY. DASCM==10000 ;PRINT NUMBERS AS ASCII. DNUMM==4000 ;PRINT NUMBERS NUMERICALLY. ABOVE DSYMM. DDECM==2000 ;WHEN PRINTING NUMERICALLY, USE BASE 10. . DREGM==1000 ;PRINT REGISTER NUMS NUMERICALLY. DDSKM==400 ;OPEN NEXT LOC AS DISK ADDR. NUMFND==200 ;SET AT ENTRY TO COMMAND IF HAS ARG. DSEMFL==100 ;IF SET, RUBBING-OUT SHOULD BE STOPPED BY NON-DIGITS. CSSFLG==40 ;SET DURING ;S -- CAUSES INPUT FROM LOADCH. D1CHAR==20 ;RE-READ THE CHAR IN T0, IN NEXT GETCHR. BYTOPN==10 ;CURRENTLY OPEN LOC. IS BYTE. DSKOPN==4 ;CURRENTLY OPEN LOC. IS IN DISK. DMODES==DBYTM+DEXCM+DINSM+DSYMM+DASCM+DNUMM+DDECM+DREGM+DDSKM JRSTF==JRST 2,0 IF2 CDDT==CALL DDT ;USED FROM HACTRN WITH $X. IF2 GETCHR==CALL DGCHR ;NEXT INPUT CHAR, IN DDT. ;FLAG IN AC CONTAINING ADDRESS (IN DDT) REGBIT==1 ;INDICATES ADDR. IS REGISTER NUM. .5KBIT==400000 ;INDICATES .5KILLED SYMBOL . XREGTY: TLNE SF,DREGM JRST XREGT1 SKIPN XSYMTA TLNN SF,DNUMM TLNN SF,DSYMM JRST XREGT1 ;IF SHOULDN'T PRINT SYMBOL. HRLI B,1 ;TYPE-CODE FOR REG. SYM. HRRZ A,SYMEND XREGT0: CAME B,1(A) ;IF THIS STE'S VALUE IS REG. TO TYPE, JRST XREGT5 6TYPE (A) ;PRINT NAME OF SYMBOL. JRST UUOXIT XREGT5: SUBI A,2 CAIE A,SYMDRG ;NO NEED TO CHECK INSNS AND %1...%7 . JRST XREGT0 XREGT1: SKIPN XREGTF ;NO SYMBOL, PRINT NUMERICALLY. TTOI "% ;INDICATE IS REG. UNLESS TOLD NO NEED TO. XNUMTY: ANDI B,-1 MOVEI C,DECP TLNN SF,DDECM ;IF DECIMAL, CALL DECP, MOVEI C,OCTP PUSHJ P,(C) ;CALL PRINT RTN. TLNE SF,DDECM ;IN DECIMAL MODE, PRINT ".". TTOI ". JRST UUOXIT XASCTY: CAILE B,377 ;1 CHAR? JRST XASCT1 ;NO, 2. TTOI "' ;1. TTOI (B) ;PRINT IT. JRST UUOXIT XASCT1: TTOI "" ;2 CHARS. TTOI (B) ;PRINT 1ST (LOW) CHAR. LSH B,-10 JRST XASCT1-2 XREGTF: 0 ;IF #0, OK TO OMIT % WHEN PRINTING REG. VAL. XSYMTA: 0 ;PRINT AN ADDRESS SYMBOLICALLY: XADRTY: SETOM XSYMTA ;INDICATE ADRTYP. JRST .+2 ;PRINT NUMBER IN CURRENT MODE. XSYMTY: SETZM XSYMTA MOVE B,(A) ;WORD TO PRINT. 45N TRZ B,600000 TLNE B,REGBIT ;IF REGISTER NUM, SPECIAL HANDLING JRST XREGTY SKIPE XSYMTA ;IF NOT PRINTING ADDRESS TO OPEN, JRST XSYMT3 TLNE SF,DNUMM ;CHECK FOR NUMERIC AND ASCII MODES. JRST XNUMTY TLNE SF,DASCM JRST XASCTY XSYMT3: TLNN SF,DSYMM ;IF NOT IN SYMBOLIC MODE, JRST XNUMTY ;PRINT NUMERICALLY. ANDI B,-1 PUSH P,DO PUSH P,D ;NAME OF BEST SYMBOL SO FAR. PUSH P,SF ;VALUE OF BEST SYMBOL SO FAR. SETZ D, ;NO SYMBOL FOUND. SETO SF, ;BEST SYMBOL'S VALUE IS -1. HRRZ C,SYMEND XSYMT0: SKIPL DO,1(C) ;ONLY NON-.5KILLED NORMAL SYMBOLS O.K. TLNE DO,-1 JRST XSYMT1 CAIG DO,(B) ;ACCEPTABLE ONLY IF <= NUM. TO BE PRINTED. CAIL SF,(DO) ;CLOSER THAN BEST SO FAR? JRST XSYMT1 MOVE D,(C) ;YES, REPLACE BEST SO FAR'S NAME, VALUE. MOVEI SF,(DO) XSYMT1: SUBI C,2 ;SEARCH TABLE BACKWARDS TO GET USER CAIL C,SYMDRG ;SYMBOLS BEFORE PREDEFINED ONES. JRST XSYMT0 JUMPE D,XSYMT2 ;IF NO SUITABLE SYMBOL, PRINT NUMERICALLY. SUBM B,SF ;SF HAS OFFSET OF VALUE FROM SYMBOL. CAIL SF,200 ;TOO FAR AWAY => PRINT NUMERICALLY. JRST XSYMT2 MOVEI B,(SF) ;ELSE THE # TO PRINT IS THE OFFSET. 6TYPE D JUMPE B,XSYMT4 ;IFF OFFSET, -- TTOI "+ XSYMT2: TLO B,200000 ;NO SYMBOL- MAKE SURE TYPE ADDR. EVEN IF 0. XSYMT4: POP P,SF POP P,D POP P,DO JUMPE B,UUOXIT JRST XNUMTY ;PRINT OFFSET IF ANY. ;GET NEXT INPUT CHAR. OUT OF LINE BUFER. ;IF BUFFER EMPTY, READ+ECHO UNTIL BREAK CHAR. DGCHR1: PUSHJ P,DGLIN ;READ & ECHO LINE. DGCHR: TLZE SF,D1CHAR ;IF SET, REREAD CHAR. IN T0. RETURN SETZM DGLCQF DGCHR0: SKIPE FILINF ;IF :XFILING, JRST DGCHRF ;READ FROM UTIC. SOSGE DGLCNT ;COUNT CHARS. IN BUFFER. JRST DGCHR1 ;IF NONE LEFT, GET NEW LINE. ILDB T0,DGLPTR ;GET NEXT CHAR. DGCHR2: CAIN T0,^Q ;IF CHAR IS ^Q, SKIPE DGLCQF ;NOTQQUOTED BY PREV. ^Q, RETURN SETOM DGLCQF ;INDICATE NEXT CHAR IS QUOTED, JRST DGCHR0 ;READ IT. DGCHCS: DGCHRF: .IOT UTIC,T0 MOVEI T0,(T0) CAIN T0,^L JRST DGCHRF ;IGNORE FORM FEEDS CAIN T0,^C ;IF EOF, GO BACK TO TTY. JRST DGCHCC TTOI (T0) ;ECHO. CAIE T0,^J JRST .+3 SKIPE DGCHRC ;FLUSH LF'S AFTER CR'S IN FILES. JRST DGCHRF SETZM DGCHRC CAIN T0,^M SETOM DGCHRC ;INDICATE HAD CR AS LAST CHAR. SKIPE DGLCQF ;IF CHAR NOT ^Q-QUOTED, JRST DGCHR2 IRPC CHAR,,BEWVS CAIN T0,^CHAR ;CHECK FOR IO CTL CHARS JRST DGCHC!CHAR TERMIN JRST DGCHR2 DGCHCB: CALL DGLNCB ;OPEN LPT. JRST DGCHCS DGCHCE: CALL DGLNCE ;END OUTPUT TO LPT. JRST DGCHCS DGCHCV: SETOM TYOFLG ;TURN ON TTY OUTPUT. JRST DGCHCS DGCHCW: SETZM TYOFLG ;TURN IT OFF. CALL TRESET JRST DGCHCS DGCHCC: .CLOSE UTIC, ;ON EOF, CLOSE FILE, SETZM FILINF JRST DGCHR ;AND GO BACK TO TTY. ETODON: POP1J: SUB P,[1,,1] RETURN ;READ FROM TTY UP TILL ACTIVATION NECESSARY, ;PROCESSING RUBOUTS UNTIL THEN. ;WHEN DONE, RETURN WITH DGLCNT=NUM CHARS, ;DGLPTR=B.P. TO CHARS. DGLIN: PUSH P,T1 SETZM DGLRCT MOVE T1,[440700,,DGLBUF] ;INITIAL B.P. MOVEM T1,DGLPTR ;USED TO STORE CHARS. MOVE T1,DGLINF MOVEM T1,DGLINS DGLRB0: SETZM DGLCNT ;RE-INIT. AFTER RUBOUT, THEN RE-READ. SETZM DGLNQC SETZM DGLCQF ;1ST CHAR NOT ^Q'D. TLZ SF,DSEMFL SETZM DGLALF .CALL TTYM1 .VALUE DGLIN1: SETZM DGLCQF ;NORMALLY, CHAR NOT ^Q-QUOTED. DGLIN0: SKIPN DGLRCT ;IF CHARS LEFT BEFORE RUBOUT, JRST DGLIN2 ILDB T0,DGLRBP ;RE-READ THEM. SOSG DGLRCT ;IF THE LAST CHAR LEFT SKIPE DGLCQF ;IS AN UN-^Q-QUOTED ^Q, JRST DGLIN3 CAIE T0,^Q ;IT HAD QUOTED THE CHAR RUBBED OUT, JRST DGLIN3 TTOI ^Q ;SO RUB OUT THE ^Q, TOO. DGLIN2: TLNE SF,DSEMFL ;IF AFTER A ';', .CALL TTYMA ;ACTIVATE ON EACH CHARACTER. JFCL .IOT TYIC,T0 ;ELSE, READ NEW CHAR. Upper t0 ;NOW DECIDE WHAT TO DO WITH THE CHAR. JUST READ. DGLIN3: SKIPE DGLCQF ;UNLESS CHAR WAS ^Q-QUOTED, JRST DGLIT5 CAIN T0,^Q ;PROCESS ^Q, JRST DGLCTQ CAIN T0,177 ;RUBOUT SPECIALLY. JRST DGLRUB DGLIT5: SKIPE DGLNQC ;NEXT THREE TESTED EVEN IF ^Q-QUOTED: JRST DGLQTD ;IF QUOTED BY ' OR ". SKIPE DGLALF JRST DGLAL1 ;IF AFFECTED BY PREV. ALTMODE. TLNE SF,DSEMFL JRST DGLSM1 ;IF AFTER UNQUOTED ";". CAILE T0,"Z JRST DGLIT6 SKIPN DGLCQF CAIL T0,"A ;ELSE DON'T BOTHER TESTING JRST DGLREG ;ALPHABETIC CHARS, ^Q-QUOTED CHARS. DGLIT6: SKIPE DGLINF JRST DGLIT2 ;IN LINE MODE ^M IS ONLY BREAK CHAR. ;NORMAL BREAK CHARS: CAIE T0,"[ CAIN T0,"] JRST DGLBK CAIN T0,^] JRST DGLBK IRP C1,,[^L,^N,"/,"=,"_]C2,,[^\,^P,^I,^J,"^] CAIE T0,C1 CAIN T0,C2 JRST DGLBK TERMIN CAIN T0,"' JRST DGLQUO ;QUOTES NEXT CHAR. CAIN T0,"" JRST DGL2Q ;QUOTES 2 CHARS. CAIN T0,": JRST DGLCOL ;ENTERS LINE MODE TO READ COMMAND. CAMN T0,SEMICL JRST DGLSEM ;READS NUMBER, THEN LETTER. CAMN T0,ALTMOD JRST DGLALT ;QUOTES ALL CHARS EXCEPT ALTMODE. DGLIT2: CAIN T0,^M JRST DGLBK ;THESE CHARS ARE TESTED FOR IN ALL STATES ;EXCEPT WHEN ^Q-QUOTED. DGLIT3: SKIPN DGLCQF JRST DGLIT4 ;IGNORE IF ^Q QUOTED. CAIN T0,^S JRST DGLCTS ;^S TURNS OUTPUT BACK ON WHEN READ. CAIE T0,^B CAIN T0,^E JRST DGLIN1 ;^B, ^E, ^W, ^V SIGNIF. ONLY AT CAIE T0,^V ;INTERRUPT LEVEL, CAIN T0,^W ;IGNORED HERE. JRST DGLIN1 DGLIT4: TLNE SF,DSEMFL ;AFTER A ";", ALL NORMAL CHARS JRST DGLBK ;ARE BREAK CHARS. SETZM DGLALF JRST DGLREG ;ROUTINES TO HANDLE VARIOUS TYPES OF CHARS. DGL2Q: AOS DGLNQC ;INSERT, QUOTE NEXT 2 CHARS. DGLQUO: AOSA DGLNQC ;QUOTE ONLY 1 CHAR. DGLQTD: SOS DGLNQC ;THIS CHAR IS QUOTED. DGLREG: SETZM DGLCQF ;TURN OFF AFTER OTHER THAN ^Q. SKIPA DGLCTQ: SETOM DGLCQF ;^Q - INDICATE NEXT CHAR ^Q-QUOTED. AOS DGLCNT IDPB T0,DGLPTR JRST DGLIN0 ; ^S - TURN ON TYPOUT, PASS IT BY. DGLCTS: SETOM TYOFLG JRST DGLIN1 ;BREAK CHAR - INSERT AND EXIT. DGLBK: AOS DGLCNT IDPB T0,DGLPTR MOVE T1,[440700,,DGLBUF] MOVEM T1,DGLPTR ;SET UP PTR FOR UNPACKING. SETZM DGLINF DGLINX: POP P,T1 RETURN ; ";" - ALL EXCEPT DIGITS, " ", "." ARE BREAK CHARS. DGLSEM: TLO SF,DSEMFL JRST DGLREG ;INSERT THE ";". DGLSM1: CAIN T0,"- JRST DGLREG CAIE T0," CAIN T0,". JRST DGLREG CAIL T0,"0 CAILE T0,"9 JRST DGLIT3 ;NON-DIGIT, IGNORE OR BREAK. JRST DGLREG DGLCOL: SETOM DGLINF ;":" - READ UNTIL CR. JRST DGLREG ;COME HERE IF CHAR AFFECTED BY PREVIOUS ALTMODE. DGLAL1: CAIN T0,"- JRST DGLALT ;- SIGN DOESN'T END TYPEOUT MODE CMD. CAME T0,ALTMOD JRST DGLIT3 DGLALT: SETOM DGLALF JRST DGLREG ;COME HERE TO HANDLE RUBOUT. DGLRUB: SOSGE T1,DGLCNT ;NUM. CHARS NOT RUBBED. JRST DERR ;IF NO CHAR TO RUB. MOVEM T1,DGLRCT ;RE-READ THOSE CHARS. LDB T0,DGLPTR ; TTOI (T0) ;ECHO RUBBED CHAR. ;? Works without. MOVE T1,[440700,,DGLBUF] MOVEM T1,DGLRBP ;PTR FOR RE-READING. MOVEM T1,DGLPTR MOVE T1,DGLINS ;RESTORE INITIAL DGLINF. MOVEM T1,DGLINF JRST DGLRB0 DGLNQC: 0 ;NUM. OF NEXT CHARS TO QUOTE. DGLRBP: 0 ;B.P. FOR RE-READING AFTER RUBOUT. DGLRCT: 0 ;NUM. CHARS TO RE-READ. DGLCNT: 0 ;NUM. CHARS READ. DGLPTR: 0 ;B.P. FOR STORING CHARS READ. DGLINF: 0 ;IF SET, READ UNTIL CR. DGLINS: 0 ;SAVES INITIAL VALUE OF DGLINF. DGLALF: 0 ;SET AFTER ALTMODE. DGCHRC: 0 ;NONZERO IF FILINF AND LAST CHAR WAS CR. DGLCQF: 0 ;CONTROL Q FLAG DGLBUF: BLOCK 60 ;RUBOUT PROCESSING AND I-O BUFFER. ;DDT ENTRY DEFINE $NB N SIXBIT /$!N!B>>/ TERMIN DDT: SETZM DDONXT ; ;N STOPS AFTER THIS INSN. PUSHJ P,MERRV ;TURN ON TTY OUTPUT. MOVEM P,DDTPDP ;SAVE P FOR RESTORATION ON ERROR. PUSHJ P,GETREG MOVE DL,R7 HRRM DL,%PC HRRZ DL,OPC LSH DL,1 SKIPL DL HRRM DL,%OPC ;SET UNLESS HAVE JUST LEFT DDT. HRLZ SF,%TMODE SKIPE DINITF JRST DDT3 ;DON'T PRINT INSN ON STARTING PDP11. HRRZ DL,R7 MOVEI T5,TF ;CHECK FOR TRACE TRAP TDNE T5,PS JRST [ ttoa [asciz /Trace>> /] ANDCAM T5,PS ;CLEAR TRACE FLAG JRST DDT1A] MOVEI T1,-2(DL) ;TYPE OUT BREAK POINT NAME MOVE DL,T1 ;BACKUP, POINTS TO BREAK POINT MOVEM DL,R7 HRRM DL,%PC LSH T1,-1 JSP D,SRCBPT ;SEARCH FOR THAT BREAK POINT 6TYPE [ SIXBIT /BPT>>/ REPEAT NBPTS,$NB \.RPCNT+1 ](T3) DDT1A: TLO SF,NUMFND ;CAUSE . TO BE SET BY DARG. CALL DPINSN ;PRINT DL AND INSN THERE. HRRM DLEN,%IL ;SAVE LENGTH, FOR ;N'S SAKE. HRROI DO,(DO) ;DON'T ALLOW ACCIDENTAL CHANGES. TTOA SPACES DDT2: SETZM FILINF .CLOSE UTIC, DDT3: SETZM DINITF ;THAT FLAG SET 1ST TIME ONLY. .RESET TYIC, SETOM DGVLVL SETOM QUITF JRST DLOOP ;PASS SPACES. GPASST: GETCHR PASSPS: CAIN T0," JRST GPASST RETURN SPACES: ASCIZ/ / ;COME HERE FOR NEXT COMMAND. DLOOP: Haln[ SKIPE NOMATC JRST [ TTOA [ASCIZ /10-11 LOSSES /] MOVE B,NOMATC PUSHJ P,FOCTP CLEARM NOMATC JRST .+1] ] ;end Haln TLZ SF,DMODES ;RESTORE TEMPORARY MODES. TLO SF,@%TMODE DLOOP1: MOVE T6,DL TLO T6,.5KBIT MOVEM T6,%Q ;SET %Q FROM DL, .5KILLED. HRRM DLEN,%L ;SAVE LENGTH IN CASE ERROR. DLOOP2: CALL DGVAL ;TRY TO GET A NUMERIC VALUE. SKIPN DGVALP ;IF HAD ARG, JRST DLOOP3 SETZM S%OLFL ;STOP UPDATING LENGTH OF WHAT'S OPEN TLO SF,NUMFND ;TELL COMMAND ABOUT ARG SKIPA DL,T2 ;SET %Q TO ARG. DLOOP3: HRRZ DLEN,%L ;ELSE RESTORE LENGTH. JSP T1,DDECOD ;JUMP ACCORDING TO FIRST CHAR. AFTER NUM. "/,,CSLASH "[,,CLB "],,CRB ^I,,CTAB ^J,,CLF ^K,,CCTLK ^M,,CCR "^,,CUPAR "=,,CEQ ";,,CSEM ",,CALT "_,,CBACK ">,,CGT ":,,CCOL ^N,,CCN ^P,,CSP ^L,,CFORMF " ,,DLOOP1 DERR ;IF NOT FOUND. ;LOOK IN TABLE AT (T1) FOR ENTRY WITH LH=(T0), ;THEN JRST TO @RH OF ENTRY. DDECOD: HLRZ T5,(T1) ;LH, FOR COMPARISON. HRRZ T6,(T1) ;RH FOR JUMP. CAIN T0,(T5) ;FOUND ENTRY? JRST (T6) ;YES, GO THERE. JUMPE T5,(T6) ;IF LH IS 0, GO THERE ANYWAY(END OF TABLE). AOJA T1,DDECOD ;TRY NEXT ENTRY. ;READ A CHAR, PASS SPACES, READ A VALUE. DGVGCH: GETCHR ;PASS SPACES AND READ IN A VALUE. DGVPSP: PUSHJ P,PASSPS ;READ IN A VALUE WHOSE 1ST CHAR HAS BEEN READ ALREADY. DGV1CH: TLO SF,D1CHAR ;GET A VALUE, AND PUT IT IN T2. SET NUMFND IF VALUE AVAILABLE. ;T0 CONTAINS CHAR. FOLLOWING VALUE, OR 1ST CHAR, AT EXIT. ;SETS T1 . DGVAL: SETZ T1, ;START ON LEVEL 0. AOSE DGVLVL ;IF OUTERMOST CALL TO DGVAL, JRST .+4 MOVE T5,[004400,,DRNEXT] MOVEM T5,DRNEXT ;SET UP B.P. FOR EXTRA WDS, MOVEI DLEN,2 ;INITIALIZE LENGTH. PUSH P,DGVRGP SETZM DGVRGP ;AS YET, THIS VALUE ISN'T A REGISTER NUM. PUSH P,[DGVXIT] DGVAL0: HLRZ T1,T1 ;PUT LEVEL IN RH. SETZM DGVALP PUSHJ P,DGVCAL ;TRY TO GET VALUE ON NEXT LEVEL. SKIPN DGVALP ;IF CAN'T, RETURN NO VALUE. RETURN DGVAL1: HRRZ T5,DGVT2(T1) ;ADDR. OF OP TABLE FOR THIS LEVEL. HRRZ T6,(T5) ;SEARCH FOR ENTRY WITH RH=NEXT CHAR. CAIN T0,(T6) JRST DGVAL2 ;FOUND. SKIPE (T5) ;0 MARKS END OF TABLE. AOJA T5,.-4 ;TRY NEXT ENTRY. RETURN DGVAL2: HLL T2,(T5) ;SAVE OPERATION TYPE NO. PUSH P,T2 ;AND LAST VALUE. PUSHJ P,DGVCAL ;TRY TO GET VALUE ON NEXT LEVEL. REST T5 ;GET 1ST ARG, OP. NUM. HLRZ T6,T5 ;GET OP. NUM. SKIPE DGVALP ;IF NO 2ND ARG, JRST DGVAL3 JUMPG T6,DERR ;ERROR UNLESS OP. IS " ", HRRZ T2,T5 ;IN WHICH CASE RETURN 1ST ARG. RETURN DGVAL3: HRREI T2,(T2) ;GOT 2ND ARG - EXTEND SIGNS OF ARGS, HRREI T5,(T5) XCT DGVT3(T6) ;PERFORM OPERATION. JRST DGVAL1 ;LOOK FOR ANOTHER OP. DGVCAL: PUSH P,T1 ;SAVE LEVEL NO. MOVE T1,DGVT1(T1) ;GET NEXT LEVEL NO., ADDR. TO CALL. PUSHJ P,(T1) ;GET VALUE ON NEXT LEVEL. POP P,T1 ;RESTORE LEVEL NO. RETURN DGVT1: 1,,DGVAL0 ;FROM LEVEL 0, CALL SELF ON LEVEL 1. 2,,DGVAL0 3,,DGVAL0 4,,DGTRM DGVAL ;DGTRM CALLS BACK ON LEVEL 3. DGVT2: DGVL0T ;LEVEL 0 OP. TABLE. DGVL1T ;LEVEL 1 OP. TABLE. DGVL2T DGVL3T DGVL4T DGVL0T: 0,," ;SPACE - LOW PRIOR. ADDITION. 0 DGVL1T: 5,,"& ;LOGICAL OPS. LOWEST IN PRIOR. 6,,"\ 8,,"# 0 DGVL2T: 3,,"+ 4,,"- 0 DGVL3T: 1,,"* ;MULT., DIV. SEPARATE TERMS. 2,,"! 0 DGVL4T: 7,,", ;ANGLE-BRACKETS CONTAIN ORDINARY EXPRESSIONS 0 ;SEPARATED BY COMMAS. DGVT3: ADDM T5,T2 ;SPACE - MUST HAVE CODE 0. IMULI T2,(T5) ;1ST INSNS OF OPERATIONS. IDIVM T5,T2 ADD T2,T5 SUBM T5,T2 ANDM T5,T2 IORM T5,T2 PUSHJ P,DGVCOM XORM T5,T2 DGVCOM: SKIPE DGVLVL ;IF WITHIN INNER BRACKETS, JRST DGVCO2 ;THROW AWAY EXTRA WORD. CAILE DLEN,10. ;CAN'T HAVE MORE THAN 5 EXTRA WDS. ERROR [ASCIZ/> 6 WORDS/] IDPB T2,DRNEXT ;2ND VALUE IS EXTRA WORD. MOVE T2,T5 AOJ DLEN, AOJA DLEN,CPOPJ DGVCO2: MOVE T2,T5 RETURN DGVXIT: SOS DGVLVL HRLI T2,.5KBIT ;SINCE MUST .5KILL %P. SKIPE DGVRGP ;IF THIS IS TO BE A REGISTER NUM., TLO T2,REGBIT ;SAY SO IN THE VALUE. MOVEM T2,%P POP P,DGVRGP POPJ P, ;NOT AN OP. FOR THIS LEVEL, RETURN. ;GET A TERM, INTO T2. CLEAR NUMFND IF CAN'T GET ONE, SET IF CAN. DGTRM: PUSHJ P,DGNUM ;TRY TO GET NUMBER. SKIPE DGVALP ;IF FOUND, RETURN IT. RETURN PUSHJ P,DGSYM ;OTHERWISE, TRY TO GET SYMBOL. JUMPE T2,DGTRM1 ;IF NO SYMBOL, TRY OTHER THINGS. PUSHJ P,DLKSYM ;LOOK UP SYMBOL. JUMPE T5,[ERROR [ASCIZ/U/]] ;UNDEFINED. LDB T2,[220400+T5,,1] JRST @.+1(T2) ;INDEX ON SYMBOL TYPE. DGTRM2 ;ORDINARY SYMBOL. DGVREG ;REGISTER SYMBOL. DR2AR ;2-OP INSN. DR2AR ;1-OP INSN. DRJSR ;JSR. DRJSR ;RTS. DRDBR ;BRANCH INSN. DREMT DRSFL DGTSER [ERROR [ASCIZ/U/]] DRSPEC ;SOB, MARK, SPL. DRASH ;MUL, DIV, ASH, ASHC. REPEAT 3,DGTSER ;JRST THRU STE TO HERE TO GET VALUE OF REGISTER SYMBOL. DGVREG: SETOM DGVRGP ;JRST HERE FOR NORMMAL SYMBOL. DGTRM2: AOS DGVALP HRRE T2,1(T5) RETURN DGTSER: CRF 6TYPE (T5) MOVE T5,1(T5) MOVEM T5,QA ERROR [ASCIZ/ HAS IMPOSSIBLE STE! - A/] ;COME HERE TO CHECK FOR UNARY +,-. DGTRM1: CAIE T0,"- ;FOR MINUS SIGN, JRST DGTRM3 PUSHJ P,DGTRM ;GET A TERM AND NEGATE IT. MOVN T2,T2 RETURN DGTRM3: CAIN T0,"+ ;FOR + SIGN, START OVER. JRST DGTRM CAIE T0,"' ;'''' MEANS ASCII CHAR INPUT. JRST DGTRM4 GETCHR MOVEI T2,(T0) DGTRM6: GETCHR ;GET CHAR AFTER TERM. DGVRET: AOS DGVALP RETURN DGTRM4: CAIE T0,"" ;2 ASCII CHARS INPUT. JRST DGTRM5 GETCHR MOVEI T2,(T0) GETCHR LSH T0,10 ;2ND CCHAR INTO HIGH BYTE ADD T2,T0 JRST DGTRM6 DGTRM5: CAIE T0,"< ;OPEN BRACKET? POPJ P, ;NO, RETURN NO TERM. PUSHJ P,DGVAL0 ;TRY TO GET VALUE. CAIE T0,"> ;IF NOT CLOSED BY >, ERROR. ERROR [ASCIZ/UNBAL/] GETCHR ;PASS BY >. RETURN ;CONVERT ARG TO RANGE OF ADDRS AND NUMBER. ;DEFAULTS ARE RANGE (AOBJN PTR IN T0): 0 - %CORE, NUMBER (IN T2): 0. ;IF 1 WD. IN ARG, IT SPECIFIES NUMBER. ;IF 2, THEY ARE RANGE, ;IF 3, 1ST 2 ARE RANGE, 3RD IS NUMBER. DGRAN: SETZB T0,T2 ;PUT IN DEFAULTS. PUSHJ P,SETSIZ HRRZ T1,%CORE MOVEI T1,-2*(T1) ;DON'T CLOBBER BREAK POINT AREA TLNN SF,NUMFND JRST DGRAN1 ;USE THEM IF NO ARG. CAIN DLEN,2 JRST DGRAN2 ;1 ARG ==> SET LOCATIONS TO IT. MOVEI T0,(DL) ;>= 2 ARGS ==> FIRST 2 ARE RANGE. HRRZ T1,DRNEXT+1 CAIN DLEN,6 ;3RD ARG IS NUMBER TO STORE, IF PRESENT. HRRZ T2,DRNEXT+2 JRST DGRAN1 DGRAN2: MOVEI T2,(DL) DGRAN1: ANDI T0,MAXBYT-1 LSH T0,-1 ;CHANGE ADDRS TO WORD NOS. LSH T1,-1 SUBM T0,T1 HRLI T0,-1(T1) ;AOBJN PTR -> BLOCK TO STORE IN. TLO T0,-MAXCOR ANDI T2,177777 RETURN ;READ A NUMBER INTO T2, PUT NEXT CHAR INTO T0. ;AT EXIT, NUMFND INDICATES NUMBER WAS THERE. DGNUM: SETZB T2,DGVALP SETZ T3, ;T2 ACCUMULATES OCTAL; T3, DECIMAL. DGNUM1: GETCHR SKIPN DGLCQF ;^Q-QTD CHARS NOT DIGITS. CAIGE T0,"0 ;A DIGIT? JRST DGNUM2 ;IF NOT, CHECK FOR ".". CAILE T0,"9 JRST DGNUM2 AOS DGVALP ;FOUND A NUMBER. LSH T2,3 ;PUT THIS DIGIT IN. ADDI T2,-"0(T0) IMULI T3,10. ;PUT IT IN DECIMAL NUM, TOO. ADDI T3,-"0(T0) JRST DGNUM1 ;TRY FOR ANOTHER DIGIT. DGNUM2: SKIPE DGVALP ;IF HAD A NUMBER, CAIE T0,". ;FOLLOWED BY ".", JRST DGNUM3 MOVEI T2,(T3) ;USE DEC NUM, NOT OCT NUM. GETCHR DGNUM3: HRREI T2,(T2) RETURN ;OPEN REGISTER WHOSE ADDR. IS IN DL. DARG: MOVE DO,DL TLZ DO,.5KBIT ;INSURE DO POSITIVE SINCE HAVE OPEN LOC. MOVE T6,DO TLO T6,.5KBIT MOVEM T6,DOPEN ;SET SYMBOL %. . TLZE SF,NUMFND ;IF ADDR WAS ARG, MOVEM T6,DPNT ;ALSO SET SYMBOL . . IFN 0,[ TLNE SF,DDSKM JRST DARGD ;LOCATION IS IN DISK ] PUSHJ P,DCLOS0 ;T3 _ CORE ADDR OF LOC., -PDP11. MOVEI DLEN,2 ;LENGTH OF OBJECT TENTATIVELY 2. TLNE DO,REGBIT JRST [ MOVEI T5,(T3) CAILE T5,10 ;CHECK BOUND ERROR [ASCIZ /???/] MOVE DL,R0(T3) POPJ P,] 11GET DL,(T3) ;GET WORD FROM OPEN REG TLZ SF,BYTOPN+DSKOPN TRNN DO,1 ;IF ADDR ODD, TLNE SF,DBYTM ;OR IN BYTE MODE, TLOA SF,BYTOPN ;OPEN AS A BYTE, RETURN TRNE DO,1 LSH DL,-10 ANDI DL,377 ;RETURN ONLY THE DESIRED BYTE. RETURN ;COME HERE ON ERROR. DERR: CALL OSNAMR ;RESTORE OLD SNAME IF DESIRED. SETOM DGVLVL ;IN CASE ERRED WITHIN DGVAL. CALL MERRV ;TURN ON TTY OUTPUT. .CLOSE UTIC, SETZM FILINF .CLOSE LOADCH, TTOA [ASCIZ/ ? /] MOVE P,DDTPDP ;RESET STACK. .RESET TYIC, SETZM XREGTF SETZM DGLINF SETZM DGLCNT HRRZ DL,%Q ;DON'T CLOBBER DL WITH ERROR. HRRZ DLEN,%L TLZ SF,D1CHAR+NUMFND+CSSFLG+DSEMFL JRST DLOOP1 ;READ A FILESPEC, PUT NAMES IN OPEN BLOCK <- A. DGFIL: SETZM FILFLG SETZ T3, SETOM DGLINF ;INDICATE READING FILENAME. DGFIL0: SETZ T2, MOVE D,[440600,,T2] DGFIL1: GETCHR SKIPE DGLCQF ;^Q-QUOTED CHARS TREATED AS ORDINARY. JRST DGFIL2 JSP T1,DDECOD ";,,DGFILS ":,,DGFILC " ,,DGFILN ^M,,DGFILN ",,,DGFILN ,,DGFIL2 ;ORDINARY CHAR. DGFIL2: MOVEI T0,-40(T0) ;CONV. TO SIXBIT. TRNN D,1 ;UNLESS HAVE OVERFLOWED INTO T3, IDPB T0,D ;STORE NEXT CHAR. JRST DGFIL1 ;COME HERE WHEN SPACE OR CR TERMINATES NAME. DGFILN: JUMPE T2,DGFILM ;DO NOTHING IF NO NAME. XCT DGFILT(T3) ;STORE NAME PROPERLY. AOJ T3, ;SUCCESSIVE NAMES ARE FN1, FN2, DEV, SNAME. DGFILX: SETOM FILFLG DGFILM: CAIE T0,^M CAIN T0,", ;^M AND ", TERMINATE FILSPC. SKIPA JRST DGFIL0 ;AFTER SPACE, TRY AGAIN. SETZM DGLINF OSNAMR: .SUSET [.RSNAM,,NSNAM] ;SAVE DEFAULT SNAME OR SPEC'D. .SUSET [.SSNAM,,OSNAM] ;IF NOT SPEC'D, RESTORE CURRENT. SETZM OSNAM ;NO LONGER NEED TO RESTORE. RET DGFILT: MOVEM T2,1(A) ;STORE FN1. MOVEM T2,2(A) ;FN2. HLRM T2,(A) ;STORE DEV. DGFILS: CALL [ .SUSET [.SSNAM,,T2] ;STORE SNAME.(DOES NOTHING IF T2 ZERO) SETZM OSNAM ;DON'T RESTORE SNAME LATER. RET] JRST DGFILX DGFILC: JUMPE T2,DGFILX HLRM T2,(A) ;COLON: ALWAYS STORE AS DEVICE. JRST DGFILX FILFLG: 0 ;SETOM'ED IF A "FILSPEC" ACTUALLY TYPED ;(DESIGNED SO CAN BE FAKED OUT BY : OR ; WITHOUT NAME) OSNAM: 0 ;NONZERO => RESTORE SNAME ON ERROR OR RETURN FROM DGFIL. NSNAM: 0 ;SNAME BEFORE RETURN FROM DGFIL AND RESTORE OSNAM. ;READ IN A SYMBOL, IF POSSIBLE. ;T2 GETS NAME IN SIXBIT IF SYMBOL, 0 OTHERWISE. ;ASSUMES 1ST CHAR IN T0. LEAVES FOLLOWING CHAR THERE. DGSYM: TDZA T2,T2 ;NO CHARS YET. DON'T READ 1ST CHAR. GETCHR SKIPE DGLCQF ;IF ^Q-QUOTED, MOVEI T5,-40(T0) ;ALWAYS USE IT. SKIPN DGLCQF ;ELSE USE ONLY SQUOZE CHARS. CALL D7TO6 DGSYM1: TLNE T2,770000 ;IF NOT FULL, JRST DGSYM2 LSH T2,6 ;PUT IN THIS CHAR(OR BLANK). ADDI T2,(T5) JUMPE T2,CPOPJ ;IF NO SYMBOL, RETURN. JUMPE T5,DGSYM1 ;IF NOT SYMBOL CHAR, LEFT-JUSTIFY. DGSYM2: JUMPN T5,DGSYM+1 ;KEEP READING CHARS PAST END OF SYMBOL. RETURN ;LOOK UP THE SYMBOL WHOSE SIXBIT IS IN T2. ;RETURNS IN T5 PTR TO STE (0 IF NONE). DLKSYM: MOVE T6,SYMEND MOVNI T5,2-SYMTAB(T6) ;2*NUMBER OF SYMBOLS. DLKSY0: LSH T5,17. ;LH_ - NUM.SYMS. HRRI T5,3(T6) ;RH _ LAST SYM + 3. MOVNI C,1 AOBJN C,.+1 JUMPE C,DLKSKL ;JUMP IF THIS IS A KL-10. MOVSI C,DLKSY1 BLT C,C ;PUT LOOP IN ACS 0-3. JRST 0 ;NOW GO CALL THE LOOP IN THE ACS. IT EXITS TO DLKSY2. DLKSY1: SUBI T5,3 ;MOVE TO PREV. STE. CAME T2,(T5) ;IF NOT FOUND & MORE STE'S AOBJN T5, ;GO LOOK AT THEM. JRST DLKSY2 DLKSKL: subi t5,3 ;On the KL, it is significantly faster (> 20%) came t2,(t5) ; -not- to do the search in the accumulators. aobjn t5,dlkskl DLKSY2: CAME T2,(T5) ;IF NOT FOUND, RETURN 0. SETZ T5, RETURN ;CONVERT AN ASCII CHAR TO SIXBIT, IF IT CAN GO IN A SYMBOL. ;IF IT CAN'T GO IN ONE, RETURN 0 (IN T5). ARG IN T0. D7TO6: SETZ T5, CAILE T0,"Z RETURN CAIL T0,"A JRST D7TO6X ;ALPHABETIC CHARS O.K. CAILE T0,"9 RETURN CAIGE T0,"0 CAIN T0,". ;DIGITS AND ".", TOO. JRST D7TO6X CAIL T0,"& RETURN CAIL T0,"$ ;ALSO "%", "$". D7TO6X: MOVEI T5,-40(T0) RETURN ;DEFINE THE FOLLOWING SYMBOL CGT: TLZ SF,NUMFND CALL GPASST PUSHJ P,DGSYM ;TRY GETTING SYMBOL, ERROR IF NONE. JUMPE T2,DERR MOVEI T6,SYMDMP MOVNI T5,2-SYMTAB(T6) ;SEARCH UNSETTABLES, SYMTAB THRU SYMDMP-2 . CALL DLKSY0 SKIPE T5 ERROR [ASCIZ/UNSETTABLE SYMBOL/] ;IF FOUND THERE. CALL DEFSYM ;GET OLD STE OR MAKE NEW ONE. CALL PASSPS ;GET 1ST NONBLANK CHAR. TLZ DL,.5KBIT CAIE T0,^K TLOA SF,D1CHAR ;IF NOT ^K, REREAD IT. TLO DL,.5KBIT ;IF ^K, .5KILL THE SYMBOL. MOVEM DL,1(T5) ;STORE VALUE, FLAGS. JRST DLOOP ; ^K COMMAND - COMPLEMENT .5KILL BIT FOR FOLLOWING SYMBOL. CCTLK: PUSHJ P,GPASST PUSHJ P,DGSYM JUMPE T2,DNOARG PUSHJ P,DLKSYM JUMPE T5,DLOOP ;IF UNDEFINED, NO-OP. MOVSI T6,400000 ;COMPLEMENT HALF-KILL FLAG. XORM T6,1(T5) TLZ SF,NUMFND TLO SF,D1CHAR JRST DLOOP ;COME HERE TO LOOK FOR OLD STE, MAKE NEW ONE & STORE NAME IF NOT FOUND. ;NAME TAKEN IN T2, STE ADDR RET. IN T5. DEFSYM: MOVE T6,SYMEND ;SEARCH SETTABLE SYMBOLS, MOVNI T5,2-SYMDMP(T6) ;SYMDMP AND UPWARD. CALL DLKSY0 JUMPN T5,CPOPJ ;IF DEFINED, RETURN OLD STE. ;COME HERE IF UNDEFINED. DEFSY0: HRRZ T5,SYMEND MOVEI T5,2(T5) ;ADDR OF NEXT STE, TRNE T5,1777 ;IF OVERFLOW TO NEW PAGE JRST DEFSY1 PUSHJ P,BLKGET ;ADD A PAGE (T5) DEFSY1: HRRZM T5,SYMEND ;IT'S NOW LAST STE. MOVEM T2,(T5) ;PUT IN NAME. RETURN SYMNSP==6 ;# PREDEF SETTABLE SYMS. ;DEFINE SYMBOL DURING LOADING. DEFSY2: SKIPN CSLFLG ;IF NOT DOING ;L, JRST DEFSYM ;MAYBE WAS DEFINED BEFORE THIS CMD. REPEAT SYMNSP,[ CAMN T2,SYMDMP+2*.RPCNT JSP T5,DEFSY3 ;TEST FOR PREDEFINED SETTABLE SYM. ] JRST DEFSY0 ;NOT PREDEF, MUST BE UNDEF. DEFSY3: MOVEI T5,SYMDMP-DEFSY2-4(T5) RETURN ;T5 HAS ADDR OF PREDEF STE. ;READ IN A GENERALIZED OPERAND ADDRESS. ;PUT 6-BIT ADDRESS MODE IN T2. ;RETURN NEW VALUE OF %S OR %D IN T3 . ;IF INDEXED, RELATIVE OR IMMEDIATE, UPDATE DLEN, STORE EXTRA WORD. DRADDR: PUSHJ P,PASSPS PUSH P,DRINDP SETZM DRINDP CAIE T0,"@ ;INDIRECT MODE? JRST .+3 AOS DRINDP ;YES, REMEMBER IT AND PASS @ SIGN. GETCHR JSP T1,DDECOD ;DECODE 1ST CHAR. "#,,DRIMM ;IMMEDIATE MODE. "-,,DRDEC ;AUTODECREMENT OR UNARY -. "(,,DRPAR ;REGISTER INDIRECT OR AUTOINCREMENT. DRADD ;REGISTER, RELATIVE OR INDEXED. DRADD: PUSHJ P,DGV1CH ;GET ADDRESS, 1ST CHAR READ ALREADY. SKIPN DGVALP ;IF NONE, BAD FORMAT JRST DERR DRADD0: MOVE T3,T2 CAIN T0,"( ;INDEXED? JRST DRNDX ;YES. TLZE T2,REGBIT ;ADDR. IS A REGISTER? JRST DRREG ;YES. SUBI T2,(DO) ;CALCULATE DISPLACEMENT. SUBI T2,2(DLEN) PUSHJ P,DGVCOM ;STORE EXTRA WORD. MOVEI T2,67 ;RELATIVE ADDRESS, MODE 67. DRXIT: SKIPE DRINDP ;IF READ "@", IORI T2,10 ;CHANGE MODE TO INDIRECT. TLO T3,.5KBIT ;%S, %D SHOULD ALWAYS BE .5KILLED. POP P,DRINDP RETURN DRNDX: PUSHJ P,DGVCOM ;STORE EXTRA WORD. PUSH P,T3 ;SET %D TO DISPL., NOT REG. PUSHJ P,DRPAR1 ;GET REGISTER NO. POP P,T3 ADDI T2,60 ;MODE 6N, N=REGISTER NUM. JRST DRXIT DRREG: ANDI T2,7 ;REGISTER ADDRESS, MODE 0N, N=REGISTER NO. JRST DRXIT ;IMMEDIATE MODE - COME HERE IF FIND #. DRIMM: PUSHJ P,DGVGCH ;GET IMMED. OPERAND. SKIPN DGVALP ;MUST BE ONE. JRST DERR MOVEI T3,(T2) PUSHJ P,DGVCOM ;STORE EXTRA WORD. MOVEI T2,27 ;RETURN (PC)+ MODE. JRST DRXIT ;COME HERE IF READ ( - MUST BE (REG) OR (REG)+. DRPAR: PUSHJ P,DRPAR1 ;GET REG. NO. CAIE T0,"+ ;CLOSE-PAR. FOLLOWED BY +? JRST DRPAR2 ;NO, (R) OR @(R) . GETCHR ;YES, SKIP PAST +. ADDI T2,20 ;AUTOINCREMENT IS MODE 2. JRST DRXIT ;COME HERE IF (R) OR @(R), AFTER READING ALL. DRPAR2: ADDI T2,10 ;SET UP IN CASE MODE 1. SKIPN DRINDP JRST DRXIT ;IF MODE 1. MOVEI T5,60(T2) ;ELSE MODE 7, SETZ T2, PUSHJ P,DGVCOM ;STORE ZERO AS EXTRA WD. JRST DRXIT ;DGVCOM DID T2_T5. ;AFTER READING A (, READ IN REGISTER NO., CHECK VALIDITY, ;CHECK FOR ), AND SKIP OVER IT. DRPAR1: PUSHJ P,DGVGCH ;READ THE NO. CAIN T0,") ;IF NOT FOLLOWED BY ), ERROR. SKIPN DGVALP ;IF NO NUMBER, ERROR. JRST DERR MOVEI T3,(T2) TLO T3,REGBIT MOVEI T2,(T2) ;REMOVE REGISTER VS. CORE INDICATOR. CAILE T2,7 ;IF NOT <= 7, JRST DERR ;NOT REGISTER NUMBER, ERROR. GETCHR ;READ PAST ). RETURN ;COME HERE AFTER READING - SIGN -- MIGHT BE AUTODECREMENT, ;MIGHT BE UNARY MINUS ON ADDRESS. DRDEC: TLO SF,D1CHAR ;TELL DGVAL 1ST CHAR ALREADY READ. PUSHJ P,DGVAL ;IT WILL USE THE - AS A UNARY, IF IT CAN. SKIPE DGVALP ;IF IT CAN'T, JRST DRADD0 ;TREAT AS IF GOT ADDR RIGHT AWAY. CAIE T0,"( ;OTHERWISE, SEE IF VALID AUTODECREMENT. JRST DERR ;IF NO (. PUSHJ P,DRPAR1 ;GET REGISTER NO. ADDI T2,40 ;MODE 4. JRST DRXIT DRNEXT: 0?0?0?0?0?0 DRINDP: 0 ;IF NONZERO, THIS ADDR WAS PRECEDED BY "@". ;READ IN A STANDARD 1 OR 2 OPERAND INSN. ;COME HERE WITH T5-> STE, WHOSE 2ND WORD HAS OP CODE. ;BIT 17 OF 1(T5) IS ZERO IF 2-OPERAND INSN, 1 IF 1 OPERAND. DR2AR: PUSHJ P,DRINSP PUSHJ P,DRADDR ;GET 1ST ADDRESS. DR2AR0: LSH D,6 ;PUT IN WITH OP CODE. DR2AR2: JUMPL D,DR2AR1 ;IF 1 OPERAND INSN. MOVEM T3,%S ;SINCE MUST BE 2-OP, SET %S. ADDI D,(T2) CAIN T0,", ;SKIP OVER A COMMA. GETCHR PUSHJ P,DRADDR ;GET DESTINATION ADDRESS. LSH D,6 ;PUT IN INSN. DR2AR1: MOVEM T3,%D ADDI T2,(D) POP P,D AOS DGVALP JRST DGNUM3 ;EXTEND SIGN. ;READ IN THE ADDR OF A BRANCH, MAKE THE INSN. DRDBR: PUSHJ P,DRINSP ;SAVE REGS, ETC. SETOM DRDBRF ;INDICATE BRANCH INSN. RATHER THAN SOB . DRDBR1: PUSHJ P,DGVPSP ;PASS SPACES, READ IN NUMBER. MOVEI T3,(T2) ;PREPARE TO SET %D . SKIPN DGVALP ERROR [ASCIZ/WHITHER/] ;IF NO ADDR. TLNE T2,REGBIT ;CAN'T BRANCH INTO REGISTER. ERROR [ASCIZ/TO ACCUM./] TRNE T2,1 ;ERROR IF ODD ADDR. ERROR [ASCIZ/ODD ADDR/] SUBI T2,2(DO) ;COMPUTE OFFSET. LSH T2,-1 ;AS NUMBER OF WORDS. SKIPN DRDBRF ;ONLY 6 BITS FOR SOB. JRST DRSOB1 TRCN T2,377600 ;SEE IF IN RANGE. JRST DRDBR9 TRNE T2,377600 DRSOB2: ERROR [ASCIZ/ADDR. OUT OF RANGE/] DRDBR9: XORI T2,377600 ;SET TOP BITS TO WHAT THEY WERE. DRDBR2: ANDI T2,377 ;GET LOW BYTE. DREMT2: TLO T3,.5KBIT JRST DR2AR1 DRSOB1: MOVNS T2 ;IN SOB, OFFSET IS SUBTRACTED (ADDED FOR BRANCHES) TRNE T2,777700 JRST DRSOB2 ;TOO LARGE OR FORWARD. JRST DREMT2 ;HANDLE JSR, RTS. DRJSR: PUSHJ P,DRINSP PUSHJ P,DRJSR1 ;READ REG. NUM. JRST DR2AR2 DRJSR1: PUSHJ P,DGVPSP ;GET REGISTER NO. MOVEI T2,(T2) SKIPE DGVALP ;IF NO NUMBER, CAILE T2,7 ;OR OUT OF RANGE, JRST DERR ;(>7), ERROR. LSH D,3 ;MAKE ROOM FOR REG. NUM. MOVEI T3,(T2) ;PREPARE TO SET %S OR %D TLO T3,REGBIT+.5KBIT ;TO A REG. NUM. RETURN DRASH: CALL DRINSP CALL DRADDR ;READ SRC (GOES IN LOW 6 BITS) MOVEM T3,%S LSH D,11 ;MAKE ROOM FOR LOW 6 BITS. ADDI D,(T2) CAIN T0,", GETCHR ;PASS COMMA. CALL DRJSR1 ;READ DEST (REGISTER #) LSH D,-3 ;UNDO SHIFT DONE BY DRJSR. LSH T2,6 ;REG # READ GOES BEFORE SRC. JRST DR2AR1 DRSPEC: PUSHJ P,DRINSP JRST @.+1(D) ;OP-CODE SAYS TYPE OF INSN. DRSOB DRMARK DRSPL DRSOB: PUSHJ P,DRJSR1 ;READ REG. NUM. MOVEI D,770(T2) ;SET UP OP-CODE FOR FUNNY BRANCH. LSH D,6 CAIN T0,", GETCHR SETZM DRDBRF ;INDICATE ONLY 6 BITS FOR OFFSET. JRST DRDBR1 DRMARK: MOVEI D,6400 PUSHJ P,DGVPSP CAIL T2,100 JRST DERR ;WON'T FIT IN 6 BITS. JRST DREMT1 DRSPL: PUSHJ P,DGVPSP MOVEI D,230 ;OP-CODE. CAILE T2,7 JRST DERR ;IF NOT NUM. OF REG. TLZ T2,REGBIT JRST DREMT1 ;READ IN THE CODE FOR EMT OR TRAP, MAKE INSN. DREMT: PUSHJ P,DRINSP PUSHJ P,DGVPSP ;GET EMT OR TRAP CODE. DREMT1: TLNN T2,REGBIT ;IF REGISTER NO., SKIPN DGVALP ;OR NO NO., JRST DERR ;ERROR. CAILE T2,400 ;MUST FIT IN BYTE. JRST DERR JRST DREMT2 ;READ IN A CFL OR SFL INSN. DRSFL: PUSHJ P,DRINSP PUSHJ P,DGVPSP ;TRY TO GET NUMBER. SKIPN DGVALP JRST DRSFL1 ;IF CAN'T, MIGHT BE SPECIAL FMT. TLNN T2,REGBIT ;IF REGISTER NO., CAILE T2,17 ;OR OUT OF RANGE, ERROR. JRST DERR JRST DR2AR1 ;COMBINE NO. AND OP-CODE. DRSFL1: CAIE T0,"@ ;SPECIAL FMT. STARTED BY @. JRST DERR SETZ T2, ;INITIALLY, NO FLAGS TO BE SET OR CLEARED. DRSFL0: GETCHR SETZ T6, IRPC X,,ZNVC CAIN T0,"X MOVEI T6,X!F TERMIN JUMPE T6,DR2AR1 ;IF NOT PART OF INSN, FINISH. IORI T2,(T6) ;INSN WILL SET SPECIFIED FLAG. JRST DRSFL0 ;INITIALIZATION FOR INSN READIN RTNS. DRINSP: EXCH D,(P) PUSH P,D MOVE D,1(T5) TLO D,777776 ;MAKE LH. SAME AS BIT 17. TLNN D,1 TLZ D,-1 RETURN ;CLOSE THE OPEN REGISTER, IF ANY, STORING CHANGES, IF ANY. DCLOSE: JUMPL DO,CPOPJ ;NOTHING OPEN. TLZN SF,NUMFND ;CHANGES MADE? RETURN HRRM DLEN,%OL ;LENGTH OF OPENED STUFF_LENGTH OF NEW STUFF. SETZM S%OLFL IFN 0,[ TLNE SF,DSKOPN JRST DCLOD ] PUSHJ P,DCLOS0 ;T3_CORE ADDR. OF LOC., -PDP11 . TLNE DO,REGBIT JRST [ MOVEI T5,(T3) CAILE T5,10 ERROR [ASCIZ /???/] MOVEM DL,R0(T3) POPJ P,] TLNE SF,BYTOPN ;IF WAS OPENED AS BYTE, JRST DCLOS1 ;STORE A BYTE. 11PUT DL,(T3) ;OTHERWISE STORE WORD. HRRZ T6,DLEN LSH T6,-1 MOVE T1,[004400,,DRNEXT] ;BP TO EXTRA WORDS. DCLOSA: SOJLE T6,DCLOST ;IF NO MORE. ILDB T5,T1 ;GET NEXT WORD. AOJ T3, CAIN T3,MAXCOR ;WRAP AROUND IN MEMORY. SETZ T3, ;(NOT IN ACCUMS). ANDI T5,177777 11PUT T5,(T3) JRST DCLOSA ;COME HERE TO STORE CHANGES IN A BYTE. DCLOS1: 11GET D,(T3) TRNN DO,1 DPB DL,[001000,,D] ;IF EVEN BYTE. TRNE DO,1 DPB DL,[101000,,D] ;IF ODD BYTE. 11PUT D,(T3) DCLOST: RETURN DCLOS0: LDB T3,[12100,,DO] ;GET ADDR, SHIFT RIGHT 1. 45N ANDI T3,MAXCOR-1 TLNE DO,REGBIT ;BUT IF ACCUM, SPECIAL. MOVEI T3,(DO) ;REGISTER # RETURN ;LEFT BRACKET - PRINT AS NUMBER (POSSIBLY SYMBOLIC, ETC.) CLB: TLZ SF,DEXCM+DINSM ;PRINT AS SYMBOL. JRST CSLASH ;BACKARROW - REOPEN IN CURRENT MODE. CBACK: TLZ SF,NUMFND MOVE DL,DO ;SLASH CSLASH: CALL DPRINT JRST DLOOPT ;SUBROUTINE TO PRINT AS INSN. DPINSN: ADRTYP DL ;PRINT ADDR BEING OPENED, TTOI "/ TLO SF,DINSM TLZ SF,DEXCM+DBYTM+DDSKM ;SUBROUTINE, OPEN DL AND PRINT IN CURRENT MODE. DPRINT: CALL DARG ;OPEN LOC ADDRESSED BY DL. SET UP NEW DL, T3. HRRM DLEN,%OL ;INIT LENGTH OF OPENED STUFF. SETOM S%OLFL TLNE SF,DEXCM RETURN ;DON'T PRINT IF ! MODE. TTOA [ASCIZ/ /] TLNN DO,REGBIT ;CONTENTS OF REGISTER NOT AN INSN. TLNE SF,BYTOPN+DSKOPN ;CAN'T CONSIDER A BYTE AN INSN. JRST DLB1 DLB0: TLNE SF,DINSM JRST DRB ;IF I MODE, PRINT AS INSN. DLB1: SYMTYP DL ;ELSE PRINT CONTENTS AS QTY. RETURN DRB: 11GET T1,(T3) ;1ST WORD OF INSN. SETZ T2, LSHC T1,-14 ;PREPARE TO DECODE. SKIPL DRB2T(T1) ;IF >0, JRST TO THAT ADDR. (NOT 2-OP. INSN) JRST @DRB2T(T1) TTOA DRB2T(T1) ;IF 2-OP, TYPE ITS NAME. TTOI " PUSHJ P,DPADDR ;DECODE AND PRINT SOURCE ADDR. DPDEST: MOVE T6,%D ;WE SHOULD HAVE DEFINED %S FOR SOURCE. MOVEM T6,%S TTOI ", JRST DPADDR ; " " " DEST. ADDR. DRB2T: DRB00 ASCIZ/MOV/ ASCIZ/CMP/ ASCIZ/BIT/ ASCIZ/BIC/ ASCIZ/BIS/ ASCIZ/ADD/ DRB07 DRB10 ASCIZ/MOVB/ ASCIZ/CMPB/ ASCIZ/BITB/ ASCIZ/BICB/ ASCIZ/BISB/ ASCIZ/SUB/ DLB1 ;INSNS STARTING WITH 0000. DRB00: JUMPL T2,DRB1 ;1-OPER. WORD INSN. LSHC T1,4 JUMPE T1,DRBS ;NOT A BRANCH. TTOA DRB00T-1(T1) DRBBR: TTOI " DRBBR1: HLRE T6,T2 ;GET OFFSET. ASH T6,-9 ;AS NO. OF WORDS. ANDCMI T6,1 ADDI T6,2(DO) ;DESTINATION ADDR OF BRANCH. ADRTYP T6 HRLI T6,.5KBIT MOVEM T6,%D RETURN DRB00T: ASCIZ/BR/ ASCIZ/BNE/ ASCIZ/BEQ/ ASCIZ/BGE/ ASCIZ/BLT/ ASCIZ/BGT/ ASCIZ/BLE/ DRB10: JUMPL T2,DRB1B LSHC T1,4 TTOA DRB10T-200(T1) ;PRINT NAME OF BRANCH. JRST DRBBR DRB10T: ASCIZ/BPL/ ASCIZ/BMI/ ASCIZ/BHI/ ASCIZ/BLOS/ ASCIZ/BVC/ ASCIZ/BVS/ ASCIZ/BHIS/ ASCIZ/BLO/ DRB07: SKIPN WI45 ;DON'T PRINT 11-45 INSNS JRST DLB1 ;UNLESS THEY'RE ATTACHED. LSHC T1,3 SKIPN DRB07T-70(T1) JRST DLB1 ;CHECK FOR UNUSED OPCODES. TTOA DRB07T-70(T1) ;AN INSN, TYPE ITS NAME. TTOI 40 LDB T5,[410300,,T2] ;REG. NUM. FROM INSN. LSH T2,3 CAIGE T1,74 JRST DRB07A ;MUL, DIV, ETC. PUSHJ P,REGTYP ;PRINT REGISTER NUMBER, % NOT NEEDED. TTOI ", MOVE T5,%D ;WE SHOULD HAVE DEFINED %S FOR SOURCE. MOVEM T5,%S CAIE T1,77 JRST DPADDR ;PRINT DEST ADDR FOR ALL BUT SOB. LSH T2,-2 ;PRETEND SOB'S 6-BIT OFFSET WAS 8-BITS. MOVNS T2 ;FOR SOB, OFFSET IS SUBTRACTED. JRST DRBBR1 DRB07A: SAVE T5 ;REG IS DEST IN THESE INSNS (MUL, ETC) CALL DPADDR ;PRINT ADDR IN DEST-POSITION (REALLY SRC) TTOI ", MOVE T6,%D ;DPADDR ALWAYS SETS %D. MOVEM T6,%S REST T5 JRST REGTYP ;NOW TYPE THE REGISTER #. DRB07T: ASCIZ/MUL/ ASCIZ/DIV/ ASCIZ/ASH/ ASCIZ/ASHC/ ASCIZ/XOR/ 0 0 ASCIZ/SOB/ ;77. DRB1: LSHC T1,6 CAIGE T1,50 ;JSR? JRST DRBJSR ;YES. SKIPN WI45 ;DON'T PRINT 11-45 INSNS CAIGE T1,64 ;UNLESS THEY'RE ENABLED. CAIL T1,70 JRST DLB1 ;NOT INSN. SKIPN DRB1T-50(T1) ;NO OPCODE IN TABLE => NOT INSN. JRST DLB1 TTOA DRB1T-50(T1) ;PRINT OP-CODE. CAIN T1,64 JRST DRBMRK ;MARK INSN SPECIAL. DRB1X: TTOI " JRST DPADDR ;DEST. ADDRESS. DRB1T: ASCIZ/CLR/ ASCIZ/COM/ ASCIZ/INC/ ASCIZ/DEC/ ASCIZ/NEG/ ASCIZ/ADC/ ASCIZ/SBC/ ASCIZ/TST/ ASCIZ/ROR/ ASCIZ/ROL/ ASCIZ/ASR/ ASCIZ/ASL/ ASCIZ/MARK/ ASCIZ/MFPI/ ASCIZ/MTPI/ ASCIZ/SXT/ DRB1B: LSHC T1,6 CAIGE T1,1050 ;TRAP? EMT? JRST DRBTE ;YES. CAIL T1,1064 JRST DRB1C ;NOT INSN. TTOA DRB1T-1050(T1) TTOI "B JRST DRB1X DRB1C: CAIE T1,1065 ;CHECK FOR MFPD, MTPD CAIN T1,1066 TTOA 1,[ASCIZ/MFPD/ ? ASCII/MTPD/]-1065(T1) JRST DLB1 JRST DRB1X ;INSNS WITH 1ST 10 BITS =0. DRBS: LSHC T1,2 ;DECODE NEXT 2 BITS. JUMPG T1,DRBS1 LSHC T1,6 ;ALL BUT LAST 2 OCTITS =0. DECODE THEM. SKIPN WI45 CAIE T1,6 ;RTT IS AN 11-45 INSN. CAILE T1,6 JRST DLB1 ;NOT INSN. 6TYPE DRBST1(T1) ;PRINT OP-CODE RETURN DRBST1: SIXBIT /HALT/ SIXBIT /WAIT/ SIXBIT /RTI/ SIXBIT /BPT/ SIXBIT /IOT/ SIXBIT /RESET/ SIXBIT /RTT/ DRBS1: CAIN T1,2 JRST DCORTS ;CONDITION CODE OP OR RTS. LSH T1,-1 ;WAS 1 OR 3, NOW IS 0 OR 1. TTOA DRBS1T(T1) ;OP CODE. JRST DRB1X DRBS1T: ASCIZ/JMP/ ASCIZ/SWAB/ DCORTS: LSHC T1,6 ;LAST 2 OCTITS. CAIL T1,240 ;RTS? JRST DCCOP CAIL T1,230 JRST DRBSPL CAIL T1,210 JRST DLB1 TTOA [ASCIZ/RTS /] ;YES. MOVEI T5,-200(T1) ;REG. NUM. JRST REGTYP ;PRINT WITHOUT "%". DRBSPL: SKIPN WI45 JRST DLB1 TTOA [ASCIZ/SPL /] TTOI 60-230(T1) ;PRIORITY VALUE. RETURN DCCOP: TRNE T1,20 ;SET OR CLEAR? TTOI "S ;SET. TRNN T1,20 TTOI "C ;CLEAR TTOA [ASCIZ/FL @/] IRPC X,,NZVC TRNE T1,X!F TTOI "X TERMIN RETURN DRBJSR: TTOA [ASCIZ/JSR /] MOVEI T5,-40(T1) ;NUMBER OF REGISTER. PUSHJ P,REGTYP JRST DPDEST ;PRINT DEST. ADDR. DRBTE: TRNE T1,4 ;EMT OR TRAP? TTOA [ASCIZ/TRAP /] TRZN T1,4 TTOA [ASCIZ/EMT /] DRBTE1: LSHC T1,6 LDB T5,[1000,,T1] ;GET 8 LOW BITS. JRST DPADX2 ;GO SYMTYP, SET %D. DRBMRK: TTOI 40 SETZ T1, ;CODE IS ONLY 6 BITS. JRST DRBTE1 ;DECODE AND PRINT ADDRESS. DPADDR: SETZ T1, LSHC T1,2 LDB T5,[400300,,T2] ;GET REGISTER NUMBER. ROT T2,4 ;SHIFT NEXT ADDR TO TOP. TRNN T2,10 ;IF THIS ONE'S INDIRECT, PRINT @. JRST @DPATAB(T1) JUMPE T1,DPADD1 ;REGISTER INDIRECT MODE IS SPECIAL. TTOI "@ ;OTHER INDIRECT MODE. JRST @DPATAB(T1) ;BRANCH ON MODE. DPATAB: DPAREG DPADIM DPADDM DPADXM DPADIM: CAIN T5,7 ;IMMEDIATE? JRST DPADI1 ;YES. PUSHJ P,DPADD1 ;PRINT "("!!REGNO!!")". TTOI "+ RETURN DPADI1: PUSHJ P,DPADT0 ;INCR. FETCHING LOC. TTOI "# DPADI2: 11GET T5,(T3) JRST DPADX2 DPADDM: CAIN T5,7 ;DECREMENT ON PC??? MOVEI T3,-1(T3) CAIN T5,7 MOVEI DLEN,-2(DLEN) ;INSN 1 WORD SHORTER. TTOI "- ;NO, '-(R)'. ANDI T3,77777 DPADD1: TTOI "( PUSHJ P,REGTYP ;PRINT REG SYM, OR NUM. WITHOUT "%". TTOI ") RETURN DPADXM: PUSHJ P,DPADT0 CAIN T5,7 ;RELATIVE ADDRESSING? JRST DPADX1 ;YES. PUSH P,T5 PUSHJ P,DPADI2 ;TYPE DISPLACEMENT. POP P,T5 JRST DPADD1 ;PRINT '(R)'. DPADX1: MOVEI T5,1(T3) ;TURN T3 BACK INTO PDP11 WORD. ROT T5,1 11GET D,(T3) ADD T5,D ;COMBINE WITH DISPLACEMENT. DPADX2: ANDI T5,177777 SYMTYP T5 HRLI T5,.5KBIT MOVEM T5,%D RETURN DPADT0: MOVEI T3,1(T3) ;SET UP TO GET NEXT WD OF INSN. MOVEI DLEN,2(DLEN) HRRM DLEN,%OL ANDI T3,MAXCOR-1 RETURN ;PRINT THE REGISTER NUMBER IN T5, EITHER SYMBOLICALLY OR NUMERICALLY, ;ACCORDING TO CURRENT MODE. ;IF NUMERICALLY, DON'T PRINT "%". ;SAVE REGISTER NUM. AS VALUE OF %D . REGTYP: SETOM XREGTF ;INDICATE "%" NOT NEEDED. ;COME HERE INSTEAD IF "%" IS NEEDED. DPAREG: HRLI T5,REGBIT ADRTYP T5 SETZM XREGTF TLO T5,.5KBIT MOVEM T5,%D ;STORE REG. NUM. AS DEST ADDR, .5KILLED. RETURN CTAB: PUSHJ P,DCLOSE ;STORE CHANGES. CTAB1: TLO SF,NUMFND ;CHANGE . . TTOA [ASCIZ/ /] TLNE SF,DDSKM ;IF WILL OPEN DISK, PRINT "$Q " TTOI @ALTMOD TLNE SF,DDSKM TTOA [ASCIZ /Q /] ADRTYP DL ;PRINT LOCATION OPENED. TTOI "/ JRST CSLASH CUPAR: PUSHJ P,DCLOSE MOVE DL,DPNT ;DL _ VAL(.). HRRI DL,-1(DL) TLNE SF,BYTOPN ;IF BYTE, OPEN NEXT AS BYTE. JRST CLF2 TLNE SF,DSKOPN JRST CLF3 TLNN DL,REGBIT ;UNLESS REGISTER NUM, HRRI DL,-1(DL) ;MOVE BACK 1 WORD. JRST CTAB1 CCRLF: CRF CCR: PUSHJ P,DCLOSE ;MAKE CHANGES. MOVE T5,%PMODE ;RESET TEMPORARY MODES. MOVEM T5,%TMODE ;TO PERMANENT ONES. SETO DO, ;NO LOCATION OPEN. TTOI "! JRST DLOOP CLF: PUSHJ P,DCLOSE MOVE DL,DPNT ;DL _ VAL(.). HRRI DL,1(DL) TLNN DL,REGBIT ;IF NOT REGISTER OR BYTE, TLNE SF,BYTOPN JRST CLF2 TLNE SF,DSKOPN JRST CLF3 ADDI DL,@%OL ;MOVE DOWN BY LENGTH OF QTY. MOVEI DL,-1(DL) JRST CTAB1 CLF2: TLO SF,DBYTM ;OPEN NEXT LOC. AS BYTE, TOO. JRST CTAB1 CLF3: TLO SF,DDSKM JRST CTAB1 ; = - RETYPE AS NUMBER. CEQ: TLO SF,DNUMM ; ] - TYPE IN CURRENT MODE. CRB: TLZ SF,NUMFND ;ELIMINATE ARG. SYMTYP DL MOVEI DLEN,2 ;NOW A 1-WORD OBJECT, IF NOT BYTE. SKIPE S%OLFL ;IF RETYPING WHAT WAS OPENED, HRRM DLEN,%OL ;UPDATE LENGTH OF WHAT'S OPENED. DLOOPT: TTOA [ASCIZ/ /] JRST DLOOP ;ACTUAL CHARACTER ALTMODE. CALT: SKIPE CALTSF ;IF $ AND ; WERE SWITCHED, JRST CSEM0 ;TREAT $ AS ; . CALT0: SETZB T2,T3 CALT1: GETCHR ;DECODE NEXT CHAR. CAMN T0,ALTMOD AOJA T2,CALT1 ;COUNT ALTMODES. CAIN T0,"- JRST CALTM ;INDICATE GOT '-'. CAIN T0,"I MOVEI T3,DINSM CAIN T0,"S MOVEI T3,DSYMM CAIN T0,"D MOVEI T3,DDECM CAIN T0,"! MOVEI T3,DEXCM CAIN T0,"B MOVEI T3,DBYTM CAIN T0,"' MOVEI T3,DBYTM+DASCM CAIN T0,"" MOVEI T3,DASCM CAIN T0,"N MOVEI T3,DNUMM IFN 0,[ CAIN T0,"Q MOVEI T3,DDSKM] CAIN T0,"R MOVEI T3,DREGM JUMPE T3,[ERROR [ASCIZ/MODE/]] CALTX: TLZ SF,(T3) ;CLEAR FLAG FOR 1 TIME. JUMPL T2,.+2 ;IF NO - SIGN, TLO SF,(T3) ;SET AGAIN. MOVEI T1,%TMODE ;IF >1 ALTMODE, CHANGE TEMP. MODE SAME WAY. PUSHJ P,CALTX2 MOVEI T1,%PMODE ;IF >2 ALTMODES, CHANGE PERM. MODE. PUSHJ P,CALTX2 JRST DLOOP1 ;EXIT WITHOUT CLOBBERING TEMPORARY MODES. CALTX2: TRNE T2,-1 ;IF ENOUGH ALTMODES, CONTINUE. JRST CALTX3 POP P,T5 ;SCRATCH RETURN ADDR. JRST DLOOP1 ;FINISH. CALTX3: MOVE T5,(T1) ;GET WORD TO BE CHANGED. ANDCMI T5,(T3) ;INITIALLY TURN OFF. JUMPL T2,.+2 ;IF SETTING, TURN BACK ON. IORI T5,(T3) MOVEM T5,(T1) ;STORE BACK. SOJA T2,CPOPJ ;1 ALTMODE HANDLED. CALTM: TLC T2,-1 ;COMPLEMENT MINUS INDICATOR. JRST CALT1 ; COLON - DECODE FOLLOWING SYMBOL AS SPECIAL COMMAND. CCOL: MOVE T1,[-NUMCOM,,COMTAB] JSP T3,CCOL1 ;SEARCH COMTAB JRST (T2) ;CCOL1 PUSHJ'S BACK COMTAB: IRP CMD,,[LCOMS,ADUMP,ALTSEM,BOOT,CDMP,CORE,DEBUG,DMP,DMPCOR DMPSYM,DMPTPV,FLSYMS,LOAD,LODCOR,LODPTR,LOOKUP,LBRKS,LSYMS ODMP,PPRI,SELECT,WALLP,XFILE] SIXBIT/CMD/ C!CMD TERMIN NUMCOM==<.-COMTAB>/2 ASCIZ/CMD/ ;MESSAGE IF NOT FOUND. ; :LSYMS - LIST DEFINITIONS OF ALL NON-SPECIAL SYMBOLS. CLSYMS: MOVEI T5,SYMLST PUSH P,SF TLO SF,DNUMM ;DON'T WANT "XXXY=XXXY" TO PRINT. CLSYM0: 6TYPE (T5) ;PRINT SYMBOL NAME. SKIPGE T6,1(T5) TTOI "= ;INDICATE IF .5KILLED. TTOI "= SYMTYP T6 ;PRINT VALUE. CRF CLSYM1: ADDI T5,2 CAMG T5,SYMEND JRST CLSYM0 POP P,SF RETURN ; :FLSYMS -- FLUSH USER SYMBOLS. CFLSYM: SETZM LASTST+2 MOVE T5,[LASTST+2,,LASTST+3] MOVE T6,SYMEND ;ZERO ALL USER SYMBOLS' STES. BLT T5,1(T6) MOVEI T5,LASTST MOVEM T5,SYMEND RETURN ;SEMICOLON - READ IN NUMBER (NOT EXPRESSION), AND LETTER. CSEM: SKIPE CALTSF ;IF $ AND ; WERE SWITCHED, JRST CALT0 ;TREAT ; AS $. CSEM0: PUSHJ P,GPASST ;SKIP SPACES, TLO SF,D1CHAR ;RE-READ 1ST NON-SPACE. PUSHJ P,DGNUM PUSHJ P,PASSPS CSEM2: JSP T1,DDECOD IRPC CMD,,BFGLNPRSUWYZX "CMD,,CS!CMD TERMIN "-,,CSEM1 [ERROR [ASCIZ/COMMAND/]] CSEM1: HRROS T2 ;INDICATE GOT - . PUSHJ P,GPASST ;SKIP TO NEXT NONBLANK. JRST CSEM2 ;DECODE IT AS COMMAND. ;PROCEED ARG (OR 1) INSNS. CCN: MOVEI T0,1 ;ASSUME ONLY SINGLE PROCEED TLNE SF,NUMFND MOVEI T0,(DL) ;MULTIPLE PROCEED MOVEI T5,TF IORM T5,PS ;TURN ONE TRACE FLAG SO THAT MAIN LOOP KNOWS PUSHJ P,ONEPRO ;SIGH PUSHJ P,ONEPRO SOJG T0,.-1 CRF JRST DDT ; ;Z -- READS STANDARD RANGE & NUMBER, SETS EACH WORD IN RANGE TO NUMBER. CSZ: PUSHJ P,DGRAN 11PUT T2,(T0) AOBJN T0,.-1 JRST CCRLF ;PDP-11 BREAK POINT TRAP VECTOR BPTVEC==14 JMPINS==137 ;PDP-11 JMP @# BPTINS==3 BPTASZ==100 ;BREAK POINT AREA SIZE IN WORDS ;ASSUMED FORMAT OF PDP-11 BREAK ROUTINE ;BPTVEC HAS POINTER TO BREAK POINT ROUTINE (BPTBRK) BPTRTN: ;SOURCE OF BREAK POINT ROUTINE 000000 ;BPTFLG:0 ;0=>PDP-11 NOT IN BREAK POINT ; ;NON-ZERO=>POINTER TO AC'S 000000 ; 0 ;SO THAT PDP-10 CAN TEST WHOLE WORD AS FLAG 000036 ; BPTBR1 ;PDP-10 HACKS IN JMP INSTRUCTION 010646 ;BPTBRK:MOV %6,-(%6) 010546 ; MOV %5,-(%6) 010446 ; MOV %4,-(%6) 010346 ; MOV %3,-(%6) 010246 ; MOV %2,-(%6) 010146 ; MOV %1,-(%6) 010046 ; MOV %0,-(%6) 010667 177750 ; MOV %6,BPTFLG 005767 177744 ; TST BPTFLG ;THE PDP-10 MUST CLEAR THIS FLAG 001375 ; BNE .-4 012600 ;BPTBR1:MOV (%6)+,%0 ;NEXT TWO WORDS HACKED BY PDP-10 FOR $G 012601 ; MOV (%6)+,%1 012602 ; MOV (%6)+,%2 012603 ; MOV (%6)+,%3 012604 ; MOV (%6)+,%4 012605 ; MOV (%6)+,%5 005726 ; TST (%6)+ 000002 ; RTI BPTRSZ==.-BPTRTN ;BREAK INTIALIZATION ROUTINE GOES AT VERY TOP OF PDP-11 CORE ;THIS IS PC INSENSITIVE BPINIT: 010706 ; MOV %7,%6 005746 ; TST -(%6) 012737 BPTADR: 000000 ;CLOBBERED BY CARPET TO POINT TO BPTBRK 000014 ; MOV #BPTBRK,@#14 012737 BPTLVL: 000340 ;SELECT BPT LEVEL BY CHANGING THIS 000016 ; MOV #340,@#16 000003 ; BPT 000766 ; BR BPINIT BPTISZ==.-BPINIT ; ;B -- SET BREAK POINT ;B AS IN ITS DDT ; SETS BREAK POINT AT LOCATION ; IF IS 0 THEN BREAK POINT IS REMOVED CSB: TLZN SF,NUMFND ERROR [ASCIZ /ARG???/] SKIPN DGVALP JSP D,FNDBPT ;IF NO SECOND ARG, FIND FREE BREAK POINT SLOT MOVEI T2,(T2) SKIPE T2 CAILE T2,NBPTS ERROR [ASCIZ /???/] SUBI T2,1 IMULI T2,BPTLEN ;SIZE OF BREAK POINT INFO BLOCK SKIPGE $1B(T2) JSP D,CLRBPT ;CLEAR OUT THAT BREAK POINT SLOT MOVEI T1,(DL) ;ADDTRESS TO SET BREAK POINT JUMPE T1,DLOOPT ;HE JUST WANTED TO CLEAR BREAK POINT TLNE DL,REGBIT ERROR [ASCIZ /BKPT ON ACCUM./] LSH T1,-1 ;WORD ADDRESS CAML T1,MEMSIZ ERROR [ASCIZ /NXM/] PUSH P,T2 JSP D,SRCBPT ;MAKE SURE THIS A UNIQUE BREAK POINT SKIPE T3 JSP D,CLRBPT POP P,T2 TLO T1,SNB ;MARKS BREAK POINT MOVEM T1,$1B(T2) ;ADDRESS OF BERAK POINT SETZM $1B+1(T2) ;INSTRUCTION SETZM $1B+2(T2) ;PROCEED COUNT JRST DLOOPT ;FNDBPT FINDS FREE BREAK POINT SLOT FNDBPT: MOVEI T2,1 MOVEI T5,0 FNDBP1: SKIPL $1B(T5) JRST (D) ;FREE SLOT CAIL T2,NBPTS AOJA T2,(D) ;NO FREE SLOTS (RETURN) ILLEGAL SLOT # ADDI T5,BPTLEN AOJA T2,FNDBP1 ;SRCBPT SEARCHS BREAK FOR BREAK POINT AT ADDR IN T1 SRCBPT: MOVEI T2,BPTLEN* MOVEI T3,NBPTS SRCBP1: SKIPL T5,$1B(T2) JRST SRCBP2 HRRZS T5 CAIN T5,(T1) JRST (D) ;FOUND ONE SRCBP2: SUBI T2,BPTLEN SOJG T3,SRCBP1 JRST (D) ;NOT FOUND ;CLRBPT CLEARS BREAK POINT CLRBPT: SETZM $1B(T2) ;ADDRESS OF BREAK POINT SETZM $1B+1(T2) ;INSTRUCTION SETZM $1B+2(T2) ;PROCEED COUNT JRST (D) ;SETBPT SET BREAK POINTS IN PDP-11 SETBPT: PUSH P,T1 PUSH P,T2 MOVEI T2,0 MOVEI T5,NBPTS SETBP1: SKIPL T1,$1B(T2) JRST SETBP2 ;BREAK POINT NOT USED 11GET T6,(T1) MOVEM T6,$1B+1(T2) MOVEI T6,BPTINS 11PUT T6,(T1) SETBP2: ADDI T2,BPTLEN SOJG T5,SETBP1 ;JUMP IF ALL DONE SETBP3: POP P,T2 POP P,T1 POPJ P, ;HERE TO REMOVE PBREAK POINTS FROM PDP-11 REMBPT: PUSH P,T1 PUSH P,T2 MOVEI T2,0 MOVEI T5,NBPTS REMBP1: SKIPL T1,$1B(T2) JRST REMBP2 11GET T6,(T1) CAIE T6,BPTINS TTOA [ASCIZ /BKPT CLOBBERED/] MOVE T6,$1B+1(T2) 11PUT T6,(T1) REMBP2: ADDI T2,BPTLEN SOJG T5,REMBP1 POP P,T2 POP P,T1 POPJ P, ;LODBPT LOAD BREAK POINT ROUTINE INTO PDP-11 CBOOT: SKIPN MEMSIZ PUSHJ P,SETSIZ ;DETERMINE MEMSIZE PUSHJ P,LODBPT TTOA [ASCIZ /BOOT LOADED, HIT START AT /] MOVE B,MEMSIZ ;MEMORY SIZE IN PDP11 WDS SUBI B,BPTASZ-3 ;START AFTER SWITCH LOCN MOVE T5,B LSH T5,-1 ;CONVERT TO PDP-10 WD ADR Haln CLEARM PDP11-1(T5) ;CLEAR OUT 11 RUNNING FLAG LSH B,1 ;CONVERT TO BYTE ADR PUSHJ P,OCTP .IOT TYIC,A ;WAIT FOR CHAR TO BE TYPED Haln SKIPE PDP11-1(T5) JRST CBOOTX TTOA [ASCIZ /?/] POPJ P, LODBPT: MOVE T5,BPTLVL ;MAKE SURE BPT RUNS ON CORRECT LEVEL 11PUT T5,/2 ; 11GET T5,BPTVEC/2 ; JUMPN T5,CPOPJ ;DON'T CLOBBER SKIPN T5,MEMSIZ POPJ P, ;MEMORY SIZE NOT KNOWN PUSH P,T1 SUBI T5,BPTASZ ;100 WORDS - 200 BYTES MOVEI T1,1(T5) ;DON'T CLOBBER FLAG LSH T5,1 ;BYTE ADDRESS ADDI T5,6 ;ADDRESS OF ROUTINE MOVEM T5,BPTADR 11PUT T5,BPTVEC/2 ;MAKES ;G HAPPY MOVE T5,[-BPTRSZ+1,,BPTRTN+1] ;DON'T CLOBBER FLAG PDP-11 IS TESTING PUSHJ P,LBPBLK ;LOAD BREAK POINT SERVICE ROUTINE MOVE T1,MEMSIZ SUBI T1,BPTISZ MOVE T5,[-BPTISZ,,BPINIT] PUSHJ P,LBPBLK ;LOAD INITIALIZATION ROUTINE (GOES AT VERY TOP) MOVEI T1,JMPINS ;PLANT JMP TO INITILIZATION IN 0 11PUT T1,0 MOVE T1,MEMSIZ SUBI T1,1 LSH T1,1 11PUT T1,1 POP P,T1 POPJ P, LBPBLK: MOVE T6,(T5) 11PUT T6,(T1) ADDI T1,1 AOBJN T5,LBPBLK POPJ P, ;BREAK POINT INFO TABLE DEFINE $NB N $!N!B: BLOCK BPTLEN TERMIN ;FORMAT OF BREAK TABLE ENTRY ;SNB,,ADDR ;SNB ON IF BREAK POINT ON ;INS ;HOLDS WORD CLOBERED BY BPTINS ;COUNT ;PROCEED COUNT BPTLEN==3 REPEAT NBPTS,$NB \.RPCNT+1 CSF: CSX: CSW: CSR: ERROR [ASCIZ /NOT IMPLEMENTED/] ; :LBRKS - PRINT A SEQUENCE OF ;B COMMANDS THAT WOULD CREATE THE ;BREAKPOINTS THAT NOW EXIST. CLBRKS: MOVEI T2,0 MOVE T3,[DDECM,,1] ;CAUSE BREAK POINT # TO PRINTED IN OCTAL CLBRK1: SKIPL T1,$1B(T2) JRST CLBRK2 LSH T1,1 ;BYTE ADDRESS ADRTYP T1 TTOI "; ADRTYP T3 TTOA [ASCIZ /B /] CLBRK2: CAML T3,[DDECM,,NBPTS] RETURN ADDI T2,BPTLEN AOJA T3,CLBRK1 ; ;U DELETE ALL BREAK POINTS CSU: TTOA SPACES MOVEI T1,NBPTS MOVEI T2,0 CSU1: JSP D,CLRBPT ADDI T2,BPTLEN SOJG T1,CSU1 JRST DLOOPT CDEBUG: SETCMB A,DEBUGP SKIPL A TTOA 1,[ASCIZ/OFF /] TTOA [ASCIZ/ON /] RETURN CCOL1: PUSH P,[CCR] CCOL2: PUSHJ P,GPASST PUSHJ P,DGSYM ;GET DEV. NAME. SETZM DGLINF TLNN SF,NUMFND TDZA T5,T5 MOVEI T5,(DL) ;T5_ARG OR 0 IF NONE. JUMPE T2,CSA2 CSA0: CAME T2,(T1) AOJA T1,CSA1 MOVE T2,1(T1) ;FOUND - GET DISPATCH WORD TLO SF,D1CHAR ;RE-READ CHAR FOLLOWING DEV. NAME. PUSHJ P,(T3) ;CALL OUR CALLER BACK CSA4: TLZ SF,NUMFND+D1CHAR ;SO CCR WON'T STORE CHANGES. SETZM DGLCNT POPJ P, CSA1: AOBJN T1,CSA0 ERROR (T1) ;PRINT MESSAGE AFTER PARTICULAR TABLE CSA2: PUSH P,[CSA4] ADD T1,[1,,2] CLCOMS: 6TYPE (T1) CRF AOBJP T1,CPOPJ AOJA T1,CLCOMS CSAF: 0 ; ;L COMMAND - LOAD FROM FILE, ZEROING CORE AND SYMBOLS. CSL: SETOM CSLFLG ;INDICATE ;L VERSUS :LOAD. PUSH P,[CCR] TTOI " MOVEI T0," ;DON'T REREAD THE "L". MOVEI T5,CSLTAB JRST CLOAD1 ; :LOAD COMMAND. CLOAD: SETZM CSLFLG MOVEI T5,CSLTAB ;NORMAL LOAD-TABLE. CLOAD1: HRRM T5,CLOADT PUSHJ P,LODFL. SETOM CSLBFL ;USING BLOCK-MODE. SETZM CSLBCT ;NO WORDS IN BUFFER YET. TLZ SF,NUMFND TSOPEN LOADCH,DSLDEV PUSHJ P,SETSIZ SKIPN CSLFLG ;IF WAS ;L (OR ;S), ZERO (CORE AND) SYMBOLS. JRST CSL1 PUSHJ P,CFLSYM ;FLUSH SYMBOLS HRRZ T5,CLOADT CAIN T5,CLODST JRST CSL1 MOVE T5,[.5KBIT,,1] MOVEM T5,%PATCH ;ELIMINATE PATCH AREA ADDR. Haln[ HRRZ T5,KCOUNT LSH T5,10. ;NUM. WDS. CORE. MOVE T6,[PDP11,,PDP11+1] SETZM PDP11 SKIPE KCOUNT BLT T6,PDP11-42(T5) ;ZERO ALL BUT BREAK POINT ROUTINE ] ;end Haln CSL1: CSLWRD T3 ;READ 1 WD. =BLOCK TYPE. JUMPL T3,DSLDEE CAIL T3,CSLMAX ;IF BAD FORMAT, ERROR [ASCIZ/BINARY FILE/] PUSHJ P,@CLOADT JRST CSL1 CSL2: .CLOSE LOADCH, RETURN CSLTAB: OFFSET -. CPOPJ ;0 DOESN'T START A BLOCK. LDABS:: DSLABS ;ABSOLUTE LOADER BLOCK. LDSYMS::DSLASY ;ENTIRE SYMBOL-TABLE. LDCOR:: DSLCOR ;LOAD BLOCK OF CORE. LDDSK:: CSKIPC ;USED TO LOAD BLOCK OF DISK (OBSOLETE) LDSTE:: DSLSYM ;DEFINE SYMBOL. LDEND:: POPJ1 ;NO MORE BLOCKS. LDCORZ::DSLZER ;BLOCK OF ZEROS. LDTRK:: DSLABB ;USED TO MAKE SURE DISK BLOCK EXISTS (OBSOLETE) LDAK:: DSLABB ;INSURE MINIMUM AMOUNT OF CORE. (N.A. IN CARPET). LDTPV:: CSKIPT ;LOAD TRAP-ACTION-TABLE. LDDSKZ::DSLABB ;USED TO ZERO SOME DSK (OBSOLETE) OFFSET 0 CSLMAX==.-CSLTAB ; :LODPTR - READ FROM PTR IN 8-BIT MODE. CLODPT: SETZM CSLBFL ;USE UNIT MODE. MOVEI T5,CSLTAB HRRM T5,CLOADT TLZ SF,NUMFND TSOPEN LOADCH,[[10,,(SIXBIT/PTR/)]] JRST CSL1 ; :LODCOR -- LOAD, BUT IGNORE NON-CORE ITEMS. CLODCO: SETZM CSLFLG JSP T5,CLOAD1 ;SPECIAL TABLE TO LOAD CORE ONLY. CPOPJ?DSLABS?DSLASY?DSLCOR?CSKIPC?DSLABW?POPJ1 DSLZER?DSLABB?DSLABB?CSKIPT?DSLABB ; ;S COMMAND - LOAD SYMBOLS FROM FILE, FLUSHING EXISTING ONES. CSS: SETOM CSLFLG ;INDICATE ;S VERSUS :LODSYM. PUSH P,[CCR] TTOI " MOVEI T0," ;DON'T REREAD THE "L". MOVEI T5,CLODST JRST CLOAD1 ;:LODSYM COMMAND - LOAD SYMBOLS ONLY. CLODSY: SETZM CSLFLG ;DON'T CLEAR CORE. JSP T5,CLOAD1 CLODST: CPOPJ?CLODS1?DSLASY?CSKIPC?CSKIPC?DSLSYM?POPJ1 DSLABB?DSLABB?DSLABB?CSKIPT?DSLABB CLODS1: CSLWRD T5 ;SKIP AN ABS LDR BLOCK. CALL DSLABW ;READ BLOCK LENGTH MOVNI T3,-3(T1) ;PREPARE TO SKIP THE REST. HRLZI T3,(T3) ;T3 HAS -<# WDS LEFT, INCL CKSUM>,, CAIE T1,6 ;IF NOT A JUMP BLOCK, SKIP IT. JRST CLODS2 JRST CLODS3 ;A JUMP-BLOCK: PROCESS IT AND FOLLOWING SYMTAB. IRPS X,,CSLRT2:CSLRT3:CSLRT5:,Y,,T2 T3 T5 X: SOSGE CSLBCT CALL CSLRBF ILDB Y,CSLBBP JRST (D) TERMIN ;REFILL THE :LOAD BUFFER FROM THE FILE. CSLRBF: SKIPN CSLBFL JRST CSLRD1 MOVE T5,[-100,,CSLBUF] ;AOBJN PTR->BUFFER. .IOT LOADCH,T5 CAMN T5,[-100,,CSLBUF] ;ERROR IF EOF. ERROR [ASCIZ/BINARY FILE/] HLRZ T5,T5 MOVEI T5,77(T5) ;NUM. WDS. READ. MOVEM T5,CSLBCT CSLRD2: MOVE T5,[444400,,CSLBUF] MOVEM T5,CSLBBP RETURN ;HERE IF USING UNIT MODE - JUST READ THIS WORD ;AND RETURN IT. CSLRD1: SETZM CSLBCT .IOT LOADCH,CSLBUF IOCGET SKIPA JRST CSLRD2 ERROR [ASCIZ/BINARY FILE/] CADMPB: 1?0?0?0?0?0 CSLBUF: BLOCK 100 CSLBCT: 0 CSLBBP: 0 CSLBFL: 0 ;NONZERO IF BLOCK MODE. CLOADT: @(T3) ;R.H. WILL HAVE ADDR. OF CMD TABLE. CSKIPT: SKIPA T3,[-TRPPTL,,] ;SKIP TPV BLOCK. CSKIPC: CSLWRD T3 ;SKIP CORE-BLOCK. CLODS2: CSLWRD T2 AOBJN T3,.-1 RETURN DSLDEE: CSLWRD T2 ;EACH WD FILLS 2 PDP11 WDS. HLRZ T5,T2 HALY .VALUE ;NOT WRITTEN YET. 11PUT T5,(T3) AOBJP T3,.+3 11PUT T2,(T3) AOBJN T3,DSLDEE CSLWRD T3 ;NEXT BLOCK. JUMPL T3,DSLDEE JRST CSL2 ;POSITIVE MEANS DONE. DSLABS: CSLWRD T5 ;FLUSH 1 WD. PUSHJ P,DSLABW ;READ BLOCK LENGTH. CLODS3: MOVEI T6,-6(T1) ;GET DATA LENGTH. PUSHJ P,DSLABW ;READ ORIGIN. MOVEI T5,(T1) ADDI T5,3777(T6) ;LAST ADDR TO LOAD INTO +1K. ROT T1,-1 ;INDEXING POSITION. JUMPE T6,DSLABJ ;IF JUMP-BLOCK (NO DATA). LSH T5,-11. ;MIN. K NEEDED. DSLAB1: CSLWRD T2 ;NEXT WORD (=NEXT DATA BYTE). 11GET D,(T1) JUMPGE T1,.+3 ;IF STORING INTO LOW BYTE. DPB T2,[101000,,D] ;STORE INTO HIGH BYTE, CAIA ;GO TO NEXT WORD. DPB T2,[001000,,D] ;STORE INTO LOW BYTE. 11PUT D,(T1) TLCE T1,400000 ;COMPLEMENT ADDRESS LOW BIT. ADDI T1,1 DSLAB2: SOJG T6,DSLAB1 ;LOOP COUNTER FOR DATA WORDS. CSLWRD T5 ;READ & THROW AWAY CHECKSUM. RETURN DSLABJ: JUMPL T1,.+3 ;IF ADDRESS EVEN, ROT T1,1 ;PUT IN 11-WORD FMT, HRRM T1,%GO ;SET STARTING ADDRESS. CSLWRD T5 ;THROW AWAY CHECKSUM. CSLWRD T5 ;GET SYM. TAB. TYPE CAIE T5,2 JRST POPJ1 ;2 IS ONLY TYPE NOW. AOS (P) ;EXIT AFTER READING SYMBOLS. DSLASY: CSLWRD T2 ;GET NEXT SYMBOL'S NAME. JUMPE T2,CPOPJ ;BLOCK TERMINATED BY 0. CSLWRD T3 ;VALUE, FLAGS. TLNE T3,10000 JRST DSLASY ;SKIP SYMBOL IF UNDEF. TLZ T3,353760 ;CONVERT PALX11 TYPE BITS TO 11SIM'S. TLZE T3,4000 TLOA T3,1 ;MOVE REGISTER FLAG. ELSE, TRNE T3,-1 ;IF VALUE IS 0, .5KILL . TLZE T3,20000 TLO T3,400000 ;MOVE .5KILL FLAG. PUSHJ P,DEFSY2 MOVEM T3,1(T5) JRST DSLASY DSLABW: CSLWRD T2 ;READ 2 BYTES, MOVE T1,T2 DSLABB: CSLWRD T2 LSH T2,10 ;COMBINE INTO WORD. ADDI T1,(T2) RETURN DSLCOR: CSLWRD T3 ;AOBJN PTR->BLOCK. HRRI T3,1(T3) ;VIRT. ADDR. TO LOAD 1ST WORD. CSLWRD T5 11PUT T5,(T3) ;READ IN NEXT WD. AOBJN T3,.-2 RETURN DSLZER: CSLWRD T3 ;AOBJN PTR ->BLOCK TO BE ZEROED. HRRI T3,1(T3) ;VIRT. ADDR. OF 1ST WD. TO ZERO. SETZ T2, 11PUT T2,(T3) AOBJN T3,.-1 RETURN DSLSYM: CSLWRD T2 ;READ SYMBOL NAME. PUSHJ P,DEFSY2 ;DEFINE IT, GET STE. MOVEI T3,(T5) CSLWRD T2 MOVEM T2,1(T3) ;READ SYMBOL TYPE, VALUE INTO STE. RETURN ; :XFILE COMMAND -- EXECUTE COMMAND FILE. CXFILE: MOVEI A,CXFILN TLO SF,D1CHAR ;IN CASE CMD WAS FOLLOWED BY CR. PUSHJ P,DGFIL TSOPEN UTIC,CXFILN SETOM FILINF RETURN CXFILN: SIXBIT/ DSK XCT/ ; ^L ROUTINE. CFORMF: SKIPE GETTY TTOA [ASCIZ/C/] ;CLEAR SCREEN. JRST DLOOP1 ; :LOOKUP -- FIND ADDR OF STE OF FOLLOWING SYMBOL. CLOOKU: PUSHJ P,GPASST PUSHJ P,DGSYM JUMPE T2,DERR PUSHJ P,DLKSYM ;SEARCH FOR STE. MOVEI DL,(T5) .VALUE [ASCIZ \T5/ ' \] RETURN DCKSUM: 0 CADUMP: PUSHJ P,DMPFL. ;GET THE DUMP FILE NAME TSOPEN DMPCH,DSLDEV PUSHJ P,DGRAN ;GET ARG TO COMMAND MOVN A,T1 ;LAST ADDRESS TO DUMP ANDI T0,77777 MOVE T1,T0 ;FIRST ADDRESS TO DUMP ADD A,T0 LSH T1,1 ;T0 IS A POINTER INTO CORE, T1 IS THE ASSOCIATED PDP11 ADDRESS LSH A,1 ;MAKE INTO PDP11 ADDRESS MOVEI T2,177777 ;16 BITS CADMP1: SETZM DCKSUM MOVNI T3,2 ;RELATIVE ADDRESS OF START ADDRESS IN BUFFER 11GET D,(T0) TDNE T2,D ;SEARCH FOR A NON-ZERO WORD JRST CADMP2 ;FOUND ONE ADDI T1,2 ;NEXT PDP11 ADDRESS CAMGE T1,A ;ARE WE OVER THE TOP OF WHAT WE SHOULD DUMP? AOJA T0,CADMP1 ;NO, INCREMENT PDP10 ADDRESS AND CONTINUE LOOKING JRST CADMP3 ;CORE IS ALL ZERO, GO DUMP SYMBOLS CADMP2: MOVE T6,T1 ;OUTPUT START ADDRESS PUSHJ P,CADOUT CADMP4: 11GET T6,(T0) ;GET A WORD TO DUMP PUSHJ P,CADOUT ;DUMP THE WORD ADDI T1,2 ;NEXT PDP11 ADDRESS CAIGE T3,70 ;IS THE BUFFER FULL? CAML T1,A ;OR ARE WE AT THE TOP OF THE SPACE TO BE DUMPED? JRST CADMP5 ;YES, DUMP THE BLOCK MOVEI T6,10(T1) CAML T6,A ;ARE WE NEAR THE TOP OF THE SPACE TO BE DUMPED? AOJA T0,CADMP4 ;YES, INC PDP10 ADDRESS AND DUMP RIGHT UP TO THE TOP 11GET D,1(T0) TDNE T2,D ;IF THERE ARE NOT 3 CONSECUTIVE ZEROS AOJA T0,CADMP4 ;INC THE PDP10 ADDRESS AND KEEP DUMPING 11GET D,2(T0) TDNE T2,D AOJA T0,CADMP4 11GET D,3(T0) TDNE T2,D AOJA T0,CADMP4 CADMP5: MOVEI T6,6(T3) ;DUMP THE CURRENT BLOCK MOVNI T3,4 ;PLACE TO PUT THE BYTE COUNT PUSHJ P,CADOUT ;OUTPUT THE COUNT MOVN T3,DCKSUM ;GET CHECKSUM SUBI T3,1 ;THE 1 AT THE BEGINING OF THE BLOCK WAS NOT ADDED BEFORE ANDI T3,377 ;MASK TO 8 BITS MOVEM T3,CADMPB(T6) ;STORE CHECKSUM MOVNI T6,1(T6) ;NEGATIVE COUNT OF BYTES (1 ADDED TO COUNT CHECKSUM) HRLZS T6 ;MAKE AOBJN POINTER HRRI T6,CADMPB .IOT DMPCH,T6 ;OUTPUT BLOCK TO DISK AOJA T0,CADMP1 ;INC PDP10 ADDRESS AND SEARCH FOR NON-ZERO CORE CADMP3: MOVEI T0,6 ;GET READY TO OUTPUT START (JUMP) BLOCK MOVEM T0,DCKSUM ;INIT CHECKSUM MOVEM T0,CADMPB+2 ;SET BYTE COUNT MOVNI T3,2 ;PLACE FOR ADDRESS MOVE T6,%GO ;STARTING ADDRESS PUSHJ P,CADOUT ;OUTPUT TO BUFFER MOVN T0,DCKSUM ;GET CHECKSUM SUBI T0,1 ;CORRECT IT ANDI T0,377 ;MASK TO 8 BITS MOVEM T0,CSLBUF ;THIS IS WHERE IT BLONGS MOVE T0,[-7,,CADMPB] ;JUMP BLOCK IS ALWAYS THIS LONG .IOT DMPCH,T0 HRROI T0,[LDSYMS] ;START OF SYMBOLS .IOT DMPCH,T0 ;THE FOLLOWING CHANGES 11SIM TYPE FLAGS TO PALX11 TYPE FLAGS MOVEI T0,SYMDMP+1 MOVSI T1,1 MOVSI T2,4000 MOVSI T3,20000 MOVSI T5,24000 CADMP6: TDZ T5,(T0) TDNE T1,(T0) TDO T2,(T0) SKIPGE (T0) TDO T3,(T0) ADDI T0,2 CAMG T0,SYMEND JRST CADMP6 MOVEI T0,SYMDMP ;NOW MAKE UP AN AOBJN POINTER SUB T0,SYMEND ;WHICH WE CAN USE HRLZS T0 ;TO OUTPUT THE SYMBOL TABLE HRRI T0,SYMDMP .IOT DMPCH,T0 ;ALL AT ONCE MOVE T0,[-1,,[0]] .IOT DMPCH,T0 ;OUTPUT A ZERO FOR THE END TEST .CLOSE DMPCH, RETURN CADOUT: PUSH P,T6 ;BREAK A PDP11 WORD INTO BYTES AND OUTPUT IT TO THE BUFFER ANDI T6,377 MOVEM T6,CSLBUF(T3) ADDM T6,DCKSUM AOS T3 MOVE T6,(P) LSH T6,-10 ANDI T6,377 MOVEM T6,CSLBUF(T3) ADDM T6,DCKSUM AOS T3 POP P,T6 RETURN DEFINE DMPOW A HRROI T6,A .IOT DMPCH,T6 TERMIN ;OPEN A TEMPORARY DUMP FILE FOR CURRENT COMMAND ONLY. CODMP1: SKIPE DDUMPF POPJ P, ;IF PERMANENT DUMP FILE, USE IT. JRST CODMP2 ;ELSE, OPEN A FILE. ; :ODMP -- OPEN A FILE FOR SEVERAL DUMP COMMANDS. CODMP: SKIPE DDUMPF ERROR [ASCIZ/WITHOUT CLOSING THE OTHER ONE/] PUSHJ P,CODMP2 ;OPEN PERM. FILE. SETOM DDUMPF ;IF SUCCEED, INDICATE ONE IS OPEN. RETURN CODMP2: PUSHJ P,DMPFL. TSOPEN DMPCH,DSLDEV RETURN ; ;Y -- ALMOST SAME AS :DMP CSY: PUSH P,[CCR] SKIPE DDUMPF CRF ;IF PERM FILE, NEED NO ARG. SKIPN DDUMPF TTOI " MOVEI T0," ;DON'T REREAD "Y". ; :DMP -- DUMP RANGE OF CORE, AND SYMBOLS. CDMP: PUSHJ P,CODMP1 ;OPEN TEMP. FILE IF NECESSARY. PUSHJ P,CSD0 ;DUMP RANGE OF CORE. CDMP2: PUSHJ P,DMPSYM ;DUMP SYMBOLS. JRST CDUMPX ;CLOSE FILE IF TEMPORARY. ; :DMPCOR -- DUMP SPECIFIED RANGE OF CORE, ONLY. CDMPCO: PUSHJ P,CODMP1 PUSHJ P,CSD0 CDUMPX: SKIPE DDUMPF ;IF DUMP FILE TEMPORARY, CLOSE IT. RETURN DMPOW [[LDEND]] ;OUTPUT AN END BLOCK, .CLOSE DMPCH, RETURN ; :DMPSYM -- DUMP SYMBOLS ONLY. CDMPSY: PUSHJ P,CODMP1 JRST CDMP2 ;READ A FILENAME INTO DSLDEV FOR LOADING, DUMPING RESP. LODFL.: SKIPA A,[6,,] DMPFL.: MOVSI A,7 HLLM A,DSLDEV MOVEI A,DSLDEV TLO SF,D1CHAR JRST DGFIL ; :DMPTPV - DUMP TRAP-ACTION-CODES. CDMPTP: PUSHJ P,CODMP1 JRST CDUMPX ; :CDMP -- CLOSE PERMANENT DUMP FILE. CCDMP: SETZM DDUMPF JRST CDUMPX DMPSYM: DMPOW [[LDSYMS]] MOVN T6,SYMEND HRLZI T6,SYMDMP-2(T6) HRRI T6,SYMDMP .IOT DMPCH,T6 DMPOW [[0]] RETURN DSLDEV: SIXBIT/ DSK BIN/ ;INTERPRET ARG AS RANGE OF CORE TO DUMP. CSD0: PUSHJ P,DGRAN MOVE T5,T0 ;DUMP OUT ALL CORE, AS BLOCK TYPES COR AND ZER. DSD1: DMPOW [[LDAK]] ;BLOCK TO INSURE ENOUGH CORE HLRO T2,T5 MOVN T2,T2 ;NUM. WDS. BEING DUMPED. ADDI T2,1777(T5) LSH T2,-10. ;NUM. OF THE K CONTAINING LAST WD DUMPED. DMPOW T2 11GET D,(T5) SKIPE D ;WHICH TYPE BLOCK FIRST? JRST CSDCOR ;IF NONZERO, COR BLOCK FIRST. CSDZER: MOVEI T2,-1(T5) ;WD BEFORE 1ST IN BLOCK. CSDZE0: 11GET D,(T5) SKIPN D AOBJN T5,CSDZE0 ;MOVE TILL NONZERO WD OR END OF RANGE. MOVEI T1,1(T2) SUBI T1,(T5) HRLI T2,(T1) ;IOWD LENGTH, ADDR . MOVEI T1,LDCORZ MOVE T6,[-2,,T1] .IOT DMPCH,T6 JUMPGE T5,CPOPJ ;IF EXHAUSTED RANGE TO DUMP. CSDCOR: MOVEI T2,-1(T5) ;WD BEFORE 1ST IN BLOCK. CSDCO1: 11GET D,(T5) 11GET T1,1(T5) SKIPN D SKIPE T1 AOBJN T5,CSDCO1 ;ADVANCE TILL END, OR 2 ZEROS. MOVEI T1,1(T2) SUBI T1,(T5) HRLI T2,(T1) ;IOWD LENGTH, ADDR . MOVEI T1,LDCOR MOVE T6,[-2,,T1] .IOT DMPCH,T6 HALN[ HRREI T1,1(T2) ;SET UP B.P. TO ILDB 1ST 11-WORD TO BE DUMPED, LSH T1,-1 ;WHICH IS TO LDB THE WORD T1 INDEXES. HRLI T1,442000 TRNN T2,1 IBP T1 ADDI T1,PDP11 HLRES T2 MOVNS T2 ;NUMBER OF 11-WORDS TO DUMP. PUSH P,T5 CSDCO4: MOVE T6,[-100,,CSLBUF] ;COPY 11-WORDS INTO CSLBUF, CSDCO2: ILDB T5,T1 ;ONE 11-WORD PER 10-WORD. MOVEM T5,(T6) SOJE T2,CSDCO3 AOBJN T6,CSDCO2 MOVE T6,[-100,,CSLBUF] .IOT DMPCH,T6 ;WHEN BUFFER IS FULL, WRITE IT AND START AGAIN. JRST CSDCO4 CSDCO3: MOVSI T6,1-CSLBUF(T6) ;LH(T6) GETS # WORDS FILLED IN BUFFER. MOVNS T6 HRRI T6,CSLBUF ;OUTPUT THE LAST FEW WORDS. .IOT DMPCH,T6 POP P,T5 ];HALN Haly[ hrri t2,1(t2) csdco2: movei t1,(t2) ;Probably not the best way. 11get t1,t1 ;If it matters, it can be fixed. .iot dmpch,[-1,,t1] aobjn t2,csdco2 ] JUMPL T5,CSDZER ;IF NOT AT END. RETURN IFN 0,[ ; ;X - EXECUTE THE FOLLOWING INSN. CSX: TTOI " SETOM CSXR1 MOVE T5,R1 ANDI DL,177777 TLNE SF,NUMFND ;IF HAD ARG, HRRZM T5,CSXR1 ;SAVE R1, TLZE SF,NUMFND HRRM DL,R1 ;PUT ARG II IT. ANDCMI DO,1 SETOM DGVLVL TLZ SF,DBYTM PUSHJ P,DGVAL ;READ THE INSN. TLO SF,NUMFND MOVEI DL,(T2) SKIPE DGVALP ;IF GOT ONE, STORE IT. PUSHJ P,DCLOSE HRRO T5,R7 MOVEM T5,CSXPC ;SAVE PC WHILE SIMULATING INSN. MOVE T5,PC-SAVLNG(P) ;GET SAVED OLD PC. MOVEM T5,CSXSPC ;REMEMBER IT. ANDI DO,177777 HRRM DO,R7 MOVE T5,DDONXT MOVEM T5,CSXDNX MOVE T5,%IL MOVEM T5,CSXIL ;SAVE LENGTH OF NEXT INSN. MOVE T5,%CSN MOVEM T5,CSXCSN ;SAVE ;N MODE, LEAVE IT. HLLOS %CSN MOVE T5,-17(P) ;SAVE DDT'S CURRENT RETADDR. MOVEM T5,CSXRET JRST CSP CSXPC: 0 CSXR1: 0 CSXDNX: 0 CSXRET: 0 CSXSPC: 0 CSXIL: 0 CSXCSN: 0 ] ; :ALTSEM -- EXCHANGE FUNCTIONS OF ; AND $ IN COMMANDS. CALTSE: SETCMM CALTSF MOVEI T5," MOVEI T6,"; SKIPN CALTSF ;IF NOW SWITCHED STATE, JRST CALTS0 MOVEM T5,SEMICL ;$ TREATED AS ;, MOVEM T6,ALTMOD ;; TREATED AS $. TTOA [ASCIZ/SWITCHED /] RETURN CALTS0: MOVEM T5,ALTMOD ;NORMAL STATE, $ TREATED AS $, MOVEM T6,SEMICL ;; TREATED AS ;. TTOA [ASCIZ/NORMAL /] RETURN ; ;N - LIKE $$^N IN 10-DDT. CSN: TLNE SF,NUMFND ;IF NO ARG, JRST CSN1 HRRZ DL,%PC ;USE ADDR AFTER END OF NEXT INSN. ADDI DL,@%IL CSN1: MOVEI T5,TF IORM T5,PS CSN2: PUSHJ P,ONEPRO HRRZ T5,R7 CAME T5,DL JRST CSN2 CRF JRST DDT ;ONE PROCEED WITHOUT FRILLS Haln[ ONEPRO: SKIPGE T5,PS SETZB T5,PS ANDI T5,TF ;SAVE STATE OF TRACE FLAG PUSH P,T5 MOVEI T5,TF ;SET THE TRACE FLAG FOR ONE PROCEED IORM T5,PS PUSHJ P,PUTREG ;SET REGISTERS IN PDP-11 MOVEI T5,0 11PUT T5,-3(T1) ;SET THE PDP-11 RUNNING SKIPN @11ADR .HANG PUSHJ P,GETBPT ERROR [ASCIZ /PDP-11 STOPPED?/] PUSHJ P,GETREG MOVEI T5,TF ANDCAM T5,PS ;RESTORE STATE OF TRACE FLAG POP P,T5 IORB T5,PS MOVE T6,11REGS 11PUT T5,10(T6) 11GET T5,7(T6) ;GET THE PC MOVEM T5,R7 POPJ P, ] ;end Haln Haly[ Onepro: pushj p,putreg Byteo [hl.sstep] jrst getreg ] ;GO TO ADDRESS ARG. REALLY CLOBBERS THE WORLD CSG: CRF TLNN SF,NUMFND HRRZ DL,%GO ;IF NO ARG, USE STARTING ADDR. ANDI DL,177777 HRRM DL,R7 ;IF HAD ARG, GO TO THAT ADDR. MOVE T1,BPTLVL ;FORCE PROCESSOR TO RUN ON CORRECT LEVEL MOVEM T1,PS PUSHJ P,GETBPT ERROR NOPROG PUSHJ P,PUTREG PUSHJ P,SETBPT Haln[ MOVEI T3,0 11PUT T3,-2(T1) 11PUT T3,-3(T1) ;LET HER RIP ] Haly Byteo [hl.continue] JRST DDTHNG ;DDTXIT LEAVE DDT GRACEFULLY CSP: DDTXIT: CRF PUSHJ P,GETBPT ERROR NOPROG PUSHJ P,ONEPRO ;ONE PROCEED PAST BREAK POINT PUSHJ P,SETBPT ;PUT BREAK POINTS IN PDP-11 MOVEI T5,0 Haly Byteo [hl.continue] Haln 11PUT T5,-3(T1) ;LET THE PDP-11 GO DDTHNG: Haln[ MOVE T5,11ADR MOVEM T5,HNGLOC' SKIPN @HNGLOC HNGINS: .HANG ] Haly[ jfcl .hang ] CBOOTX: MOVE P,[-PDLSIZ,,PDL] ;EXIT FROM BOOT COMMAND PUSHJ P,REMBPT JRST DDT NOPROG: ASCIZ /PROGRAM LOADED?/ GETBPT: 11GET T1,BPTVEC/2 JUMPE T1,CPOPJ LSH T1,-1 11GET T2,-1(T1) LSH T2,-1 POPJ1: AOS (P) POPJ P, DDTXTP: 0 -1 SETZM DDONXT TTYGT: SETZ SIXBIT/TTYGET/ [TYIC] 2000,,T0 2000,,T0 402000,,A ;NORMAL DDT TTYSET. TTYM1: SETZ SIXBIT/TTYSET/ [TYIC] [232420,,222222] [230222,,222222] 400000,,TTYM1A ;NORMAL SIMULATOR TTYSET. TTYM2: SETZ SIXBIT/TTYSET/ [TYIC] [131313,,131313] [131313,,131313] 400000,,TTYM1A ;DDT TTYSET TO ACTIVATE ON NEXT CHAR. TTYMA: SETZ SIXBIT/TTYSET/ [TYIC] [232420,,222222] [230222,,222222] 400000,,TTYMAA TTYM1A: 0 ;SET UP AFTER TTYGT AFTER $G'D. TTYMAA: 0 IOCTAB: BLOCK IOCNUM IOCEND: ALTMOD: " ;CHAR TREATED AS $ (EITHER $ OR ;). SEMICL: "; ;CHAR TREATED AS ; (EITHER $ OR ;, NOT=ALTMOD). CALTSF: 0 ;NOT 0 IFF $ AND ; ARE SWITCHED. OPC: 0 ;ADDR OF CURRENT OR PREVIOUS INSN. GETTY: 0 ;SET IFF GRAPHICS TTY. INSCNT: 0 ;NUM. INSNS TO EXECUTE IN SNGL-STEP MD. CPATTY: 0 ;LOCAL TO CPAT, CCRB, CCBSL. RSTPC: 0 DDTPDP: 0 DDONXT: 0 CSLFLG: 0 DRDBRF: 0 DINITF: 0 DGVLVL: -1 ;LEVEL OF RECURSION AT DGVAL. DGVRGP: 0 ;NONZERO IF THIS VALUE IS REGISTER NUM. DGVALP: 0 ;NONZERO IF DGVAL, DGNUM ETC. FINDS A VALUE. S%OLFL: 0 ;SET WHILE %Q REMAINS WHAT WAS OPENED. DDUMPF: 0 ;SET IF PERMANENT DUMP FILE OPEN. LPTFLG: 0 TYOFLG: -1 KCOUNT: 0 ;# PDP-10 BLOCKS CORE USED FOR PDP-11 MEMORY MEMSIZ: 0 ;NUMBER OF LIVE PDP-11 WORDS DEBUGP: 0 QA: 0 QD: 0 QT: 0 LPTCNT: 0 WI45: 0 ;Nonzero => OK to read and print 11/45 insns. DNOARG: ERROR [ASCIZ/ARG/] 11REGS: 0 ;POINTS TO REGISTERS IN PDP-11 IRP REGNUM,,[R0,R1,R2,R3,R4,R5,R6,R7,PS] ;LEAVE CONTIGOUS AND IN THIS ORDER REGNUM: 0 TERMIN ;PDP11 REGISTERS HERE. PDL: BLOCK PDLSIZ PATCH: BLOCK 40 PATCHE: -1 VARIABLES CONSTANTS ;DON'T WANT CONSTANTS AT END SO SYM TAB CAN VARY IN LENGTH SYMEND: LASTST ;ALWAYS -> LAST STE IN USE. ;INITIAL SYMBOL TABLE ;FORMAT OF STE: ; WORD 1: NAME OF SYMBOL, IN SIXBIT. ; WORD 2: SIGN BIT: IF SET, SYMBOL IS HALF-KILLED. ; REST OF LH: SYMBOL TYPE. ; RH: VALUE. DEFINE .5KILL A,B,C SIXBIT/A/ IFSN C,,C: IFSE C,,A: .5KBIT,,IFSN B,,B TERMIN .=.+<.&1> ;GO TO EVEN ADDR. SYMTAB: REPEAT 10,[ <'%_36>+<<'0+.RPCNT>_30> 1,,.RPCNT ] ;DEFINE %0 ... %7 . ;INSN. SPECIAL SYMBOLS. INSNUM==0 IRP INSN,,[MOV,CMP,BIT,BIC,BIS] INSNUM==INSNUM+1 SIXBIT/INSN/ 2,,INSNUM SIXBIT/INSN!B/ ;BYTE INSN DEF. 2,,10+INSNUM TERMIN SIXBIT/ADD/ ;2 EXCEPTIONS. 2,,6 SIXBIT/SUB/ 2,,16 ;SINGLE OPERAND INSN SYMBOLS. INSNUM==0 IRP INSN,,[CLR,COM,INC,DEC,NEG,ADC,SBC,TST,ROR,ROL,ASR,ASL] SIXBIT/INSN/ 3,,INSNUM+50 ;WORD INSN. SIXBIT/INSN!B/ 3,,INSNUM+1050 ;BYTE INSN. INSNUM==INSNUM+1 TERMIN IRPS INSN,,[JMP 1,SWAB 3,SXT 67,MFPI 65,MTPI 66,MFPD 1065,MTPD 1066] IFE 1&.IRPCN,SIXBIT/INSN/ .ELSE 3,,INSN TERMIN ;BRANCH INSN SYMBOLS: INSNUM==0 IRP INSN,,[BR,BNE,BEQ,BGE,BLT,BGT,BLE] INSNUM==INSNUM+1 SIXBIT/INSN/ 6,,INSNUM*400 TERMIN INSNUM==100000 IRP INSN,,[BPL,BMI,BHI,BLOS,BVC,BVS,BCC,BCS] SIXBIT/INSN/ 6,,INSNUM INSNUM==INSNUM+400 TERMIN SIXBIT/BHIS/ 6,,103000 SIXBIT/BLO/ 6,,103400 SIXBIT/JSR/ 4,,4 SIXBIT/XOR/ 4,,74 SIXBIT/RTS/ 5,,20 SIXBIT/TRAP/ 7,,104400 SIXBIT/EMT/ 7,,104000 SIXBIT/SFL/ 10,,260 SIXBIT/CFL/ 10,,240 SIXBIT/SOB/ 13,,0 SIXBIT/MARK/ 13,,1 SIXBIT/SPL/ 13,,2 INSNUM==70 IRP INSN,,[MUL,DIV,ASH,ASHC] SIXBIT/INSN/ 14,,INSNUM INSNUM==INSNUM+1 TERMIN INSNUM==0 IRP INSN,,[HALT,WAIT,RTI,BPT,IOT,RESET,RTT] SIXBIT/INSN/ INSNUM INSNUM==INSNUM+1 TERMIN SYMDRG: IRPS AA,,[ %TKS 177560,%TKB 177562,%TKV 60 %TPS 177564,%TPB 177566,%TPV 64 %PKC 172544,%PKCSB 172542,%PKCSR 172540,%PKV 104 %PPS 177554,%PPB 177556,%PPV 74 %PRS 177550,%PRB 177552,%PRV 70 %RKDS 177400,%RKER 177402,%RKCS 177404,%RKWC 177406 %RKBA 177410,%RKDA 177412,%RKV 220 %LKS 177546,%LKV 100 %LPS 177514,%LPB 177516,%LPV 200 %NGCSR 164040,%NGREL 164042 %ERRV 4,%BPTV 14,%IOTV 20,%PWRV 24,%EMTV 30,%TRPV 34 %DIV 177300,%AC 177302,%MQ 177304,%MUL 177306 %SR 177310,%SC 177311,%NOR 177312,%LGS 177314,%ARS 177316 %PS 177776,%SWR 177570,%PIR 177772,%PIRV 240 %CSR 175000,%BAR 175002,%BCR 175004,%TBR 175006 %RCSR 174000,%RBUF 174002,%TSCR 174004,%TBUF 174006,%DCRV 300,%DCTV 304 %DCS 177460,%DWC 177462,%DCA 177464,%DAR 177466 %DAE 177470,%DBR 177472,%DSA 177476,%DV 204 %WC 177462,%CMA 177464,%ADS 177476 %TCST 177340,%TCCM 177342,%TCWC 177344,%TCBA 177346 %TCDT 177350,%TCV 214 %SLR 177774,%PAGV 250,%SSR0 177572,%SSR1 177574,%SSR2 177576,%SSR3 172516 %SARU0 177640,%SDRU0 177600,%SARS0 172240,%SDRS0 172200,%SARK0 172340,%SDRK0 172300 ] IFE 1&.IRPCN, SIXBIT/AA/ .ELSE IFL AA-400,[SETZ] AA+.ELSE 45Y 600000 TERMIN SYMLST: .5KILL .,0,DPNT, ;SYMBOL . . .5KILL %Q,0 ;LAST QTY IN OR OUT. .5KILL %P,0 ;LAST PART OF MULTI-WORD EXP. .5KILL %D,0 ;LAST DEST. ADDR. .5KILL %S,0 ;LAST SRC. ADDR. .5KILL %L,0 ;LENGTH OF LAST QTY IN OR OUT. .5KILL %OL,0 ;LENGTH OF WHAT WAS LAST OPENED. .5KILL %IL,0 ;LENGTH OF INSN %PC POINTS TO. .5KILL %CSN,-1 ;RH IS -1 OR HALF PC TO STOP AT (;N). .5KILL %.,0,DOPEN, ;LOCATION OPEN. .5KILL %OPC,0 ;PC OF CURRENT OR LAST INS. .5KILL %B,0 ;ADDR OF LAST BREAKPOINT. .5KILL %CORE,0 ;NUM. BYTES CORE. .5KILL %,0,%PC, ;PC AT ENTRY TO DDT. .5KILL %PATR,0 ;ADDR AFTER PLACE PATCH WAS PUT. OMODE==DINSM+DSYMM SYMDMP: .5KILL PATCH,1,%PATCH, ;PATCH AREA FOR ^\, ^]. .5KILL %PMODE,OMODE ;PERMANENT MODE. .5KILL %TMODE,OMODE ;TEMPORARY MODE. .5KILL %GO,0 ;STARTING ADDRESS FOR ;G. .5KILL %DMRV,310 ;DM DEVICE RECEIVE TRAP VECTOR .5KILL %DMTV,314 ;DM TRANSMIT TRAP VECTOR. IFN .-SYMDMP-SYMNSP*2,.ERR EDIT AT DEFSY2 LASTST=.-2 END BEG