home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / decpro300 / proddt.mac < prev    next >
Text File  |  2020-01-01  |  74KB  |  2,478 lines

  1. ; 28 APR 78
  2.  
  3. VRDDT=3
  4. .IF NDF FT.DDT
  5.  FT.DDT=1
  6.  END$$=1
  7. .ENDC
  8. .IF NDF END$$
  9. END$$=0
  10. .ENDC
  11. .IF NE FT.DDT
  12. ; THIS IS DDT: DYNAMIC DEBUGGING TECHNIQUE FOR A PDP-11.
  13. ; IT RESEMBLES DDT FOR A PDP-10 IN AS MANY WAYS AS POSSIBLE
  14. ; AND FALLS SHORT ONLY SLIGHTLY DUE TO THE VARIETY OF PDP-11
  15. ; CONFIGURATIONS AVAILABLE.
  16. ;
  17. ; AUTHOR: STEVEN M. RUBIN (SR12) AT CARNEGIE-MELLON UNIVERSITY
  18. ;MUNGED BY RIC WERME FOR INHOUSE DEBUGGING OF THE DN87S
  19.  
  20. ;.=1000
  21. .ENABL    AMA,LC
  22.  
  23. ; UN-COMMENT THE NEXT LINE IF DDT IS TO RUN ON AN LSI-11
  24. ;D.LSI    =    1        ; DEFINED IF PROCESSOR IS AN LSI-11
  25.  
  26. ; THE NEXT THREE DEFINES DESCRIBE THE MAIN OUTPUT DEVICE THAT
  27. ; DDT WILL USE.  ONLY 1 MAY BE DEFINED AND THE REST MUST BE
  28. ; COMMENTED OUT.
  29. D.RSX    =    1        ; Terminal is an RSX device (QIOs)
  30. ;D.GDP    =    1         ; TTY IS GRAPHICS DISPLAY PROCESSOR
  31. ;D.KSR    =    1         ; TTY IS KSR-33
  32. ;D.GT40    =    1         ; TTY IS DEC GT40
  33.  
  34.     .IF    DF,D.LSI
  35. .PRINT     ; *****DDT for an LSI-11*****
  36.      .ENABLE NSF
  37.      .OPDEF    MFPS,TST,106700
  38.      .OPDEF    MTPS,TST,106400
  39.     .ENDC
  40.     D.OKTTY=-1
  41.     .IF    DF,D.GDP
  42.      D.OKTTY=D.OKTTY+1
  43.      .TITLE    D.GDP
  44. .PRINT     ; *****DDT for a GDP*****
  45. D.RDB     =    165202        ; READER DATA BUFFER
  46. D.RCSR     =    165200        ; READER STATUS REGISTER
  47. D.PRIO     =    0        ; RUN AT PRIORITY ZERO
  48.     .ENDC
  49.     .IF    DF,D.RSX
  50.     D.OKTTY=D.OKTTY+1
  51.     .TITLE    D.RSX
  52. .PRINT    ; *****DDT for RSX-11 and P/OS*****
  53.     .MCALL    QIOW$S        ;[SH] Used for reads and writes
  54.     .MCALL    SVDB$S        ;[SH] Set traps routine
  55.     .MCALL    EXIT$S        ;[SH] Routine to exit to operation system
  56. TTREFN    =    24.        ; Set the event flags for use on terminal
  57. TTWEFN    =    24.        ;   I/O.  This could cause TROUBLE if these
  58.                 ;   are the same as used in the program to
  59.                 ;   be debugged!
  60. D.PRIO    =    0    ;*****WHAT IS THIS????????
  61. D.RCSR    =    0    ;*****WHAT IS THIS????????
  62.     .ENDC
  63.     .IF    DF,D.GT40
  64.      D.OKTTY=D.OKTTY+1
  65.      .TITLE    D.GT40
  66. .PRINT     ; *****DDT for a GT40*****
  67. D.RCSR     =    177560        ; READER STATUS REGISTER
  68. D.RDB     =    177562        ; READER DATA BUFFER
  69. D.PRIO     =    200        ; RUN AT PRIORITY FOUR
  70.     .ENDC
  71.     .IF    DF,D.KSR
  72.      D.OKTTY=D.OKTTY+1
  73.      .TITLE    D.KSR
  74. ;    .IF EQ <PASS-2>
  75.     .IF    DF,D.RCSR
  76.         .PRINT     ; *****DDT for a TTY*****
  77.     .ENDC
  78. D.RCSR     =    177560        ; READER STATUS REGISTER
  79. D.RDB     =    177562        ; READER DATA BUFFER
  80. D.TCSR     =    177564        ; PRINTER STATUS REGISTER
  81. D.TDB     =    177566        ; PRINTER DATA BUFFER
  82. D.PRIO     =    340        ; RUN AT PRIORITY SEVEN
  83.     .ENDC
  84.  
  85. .IIF NE,D.OKTTY,.ERROR    ; INVALID OUTPUT DEVICE FOR DDT
  86.  
  87. D.BKP    =    8.        ; NUMBER OF BREAKPOINTS
  88. D.SYML    =    10.        ; MAX NUMBER CHARS IN A SYMBOL
  89. .IF NE END$$
  90. R0    =    %0
  91. R1    =    %1
  92. R2    =    %2
  93. R3    =    %3
  94. R4    =    %4
  95. R5    =    %5
  96. SP    =    %6
  97. PC    =    %7
  98. PS    =    177776        ; PROCESSOR STATUS
  99. .ENDC
  100.  
  101. .IF NE,0
  102.  
  103.     DDT/11 - Dynamic Debugging Technique on the PDP-11
  104.  
  105. Each  command in DDT/11  is identical to the  PDP-10 version whenever
  106. possible.   In some cases,  DDT/10 commands have been  omitted in the
  107. interest  of saving core and  making good sense.  The  following is a
  108. list of the DDT/11 commands:
  109.  n/    Open word n.  Type contents in current mode
  110.   /    Open word pointed to by last typed value
  111.  n<CR>    Modify currently open word to be n.  Close word.
  112.  n<LF>    Modify, close, open next word
  113.  n^    Modify, close, open previous word
  114.  n<TAB>    Modify, close, open word pointed to by last typed address
  115.  n\    Modify, close, examine word n
  116.   \    Examine word pointed to by last typed value
  117.   $S    Change current mode to instruction type out ($$S for permanence)
  118.   $A    Addresses will be typed as absolute numbers ($$A for permanence)
  119.   $R    Addresses will be typed relative to symbols ($$R for permanence)
  120.   $C    Change current mode to numeric type out ($$C for permanence)
  121.  $nR    Change current radix for $C to n (n read in decimal, $$nR for permanence)
  122.   $T    Change current mode to ASCII text output ($$T for permanence)
  123.  $5T    Change current mode to Radix-50 text output ($$5T for permanence)
  124.  $nO    Change current mode to n bit byte typeout ($$nO for permanence)
  125.   $H    Change to halfword (byte) mode ($$H for permanence; reset by $5T and $S)
  126.  n[    Open location n, type as a numeric
  127.  n]    Open location n, type as instruction
  128.  n!    Open location n, do not type value
  129.   ;    Retype currently open word
  130.   =    Retype currently open word as number
  131.  n=    Type value of n as a number
  132.   _    Retype currently open word as instruction
  133.   i$X    Execute instruction i (don't execute branches)
  134.   n$G    Start executing program at location n.  Default is to
  135.     start executing at address in JOBSA (start of program)
  136.   v$nB    Set breakpoint n at address v (n from 1 to 8 or can be omitted)
  137. a,v$nB    Same as above but open address a at breakpoint
  138.     If two altmodes are used, automatic proceding is enabled.  The
  139.     breakpoint will cause the message to be typed and the program
  140.     resumed.  If you type a character, the automatic proceding will stop.
  141.   0$nB    Remove breakpoint n
  142.    $B    Remove all breakpoints
  143.    $P    Procede from breakpoint
  144.   n$P    Procede from breakpoint n times (without halting)
  145.     If two altmodes are used, the breakpoint will be proceded from automatically
  146.   n$UW    Set offset limit to n (used when typing addresses)
  147.    $1UT    Turn on single stepping (break at each instruction)
  148.   a$1UT    Turn on single stepping and open location a at each break
  149.     If two altmodes are used, the single stepping will be done automatically
  150.    $UT    Turn off single stepping
  151.   a:    Make current location have symbolic name a
  152. v<a:    Make symbolic name a have value v
  153.   a$$K    Delete symbolic name a
  154.   a$K    Delete symbolic name a from typeout only
  155.    $D    Perform an $K on the last symbol coloned (:)
  156. l<u$$Z    Zero memory from l to u
  157.   n$M    Set mask for searches (below) to n
  158. l<u>s$W    Search core from l to u for word s.
  159. l<u>s$E    Search core from l to u for effective address s.
  160. l<u>s$N    Search core from l to u for word not equal to s.
  161.  <CALL>    Soft restart at address 1004 (Graphics DDT only)
  162.  
  163. Note that numbers can be as any combination of the following:
  164.  
  165.     <Octal number>
  166.     <Decimal number> .
  167.     <Program symbol>
  168.     " <Delimeter> <Two ASCII Characters> <Delimeter>
  169.     "$ <Delimeter> <Three Radix-50 Characters> <Delimeter>
  170.     <Instruction>
  171.  
  172. The operators +  (addition), - (subtraction), * (multiplication), and
  173. ' (division) are evaluated  from left to right unless parenthesis are
  174. included.  The space is treated like a plus except after instructions
  175. when  it is merely a  separator.   All input is  accepted in lower or
  176. upper case and is folded (except for text.)
  177.  
  178. If you  are not  in DDT,  you can  re-enter with  a Meta-BREAK  on  a
  179. graphics or  a restart  at DDT  (location typed  out initially).   In
  180. addition to program symbols, the following are also defined for you:
  181.  
  182.  R0-R5    are the user registers.  R1/ would open register 1.
  183.  SP    is the user's stack pointer
  184.  PC    is the user's program counter
  185.  $I    is the user status
  186.  $2I    is the status of DDT
  187.  $M    is the mask for searches
  188.  $Q    is the value at the current address
  189.  $V    is the value at the current address with the bytes switched
  190.  $nB    is the address of breakpoint n
  191.  JOBSA    is the starting address of your program.
  192.   .    represents the current location.  Thus .$1B puts
  193.     breakpoint 1 at the currently opened location.
  194.  
  195. When  your program is  executing, the following  unexpected traps may
  196. occur:
  197.  
  198.    NXM! is caused when your program requests a non-existant memory or
  199.         does a word operation on an odd address.
  200.    ILG! is caused by an illegal instruction.
  201.    BPT! is  caused  by  an  entry  to DDT  that  is  unexpected (i.e.
  202.         executing the BPT instruction or setting the T-bit).
  203.  
  204. To get DDT, link your  program with SYS:LINK11 and use the /D switch.
  205. In  order for DDT to  know all of your  program symbols, compile your
  206. program  with MACN11 and  use the  .ENABLE ISD switch  to generate an
  207. internal symbol dictionary.
  208.  
  209. .ENDC
  210.  
  211. ; MAIN LOOP OF DDT
  212.  
  213. DDT:
  214.     BR    D.DDT3        ; HARD ENTRY ADDRESS TO DDT
  215. .IIF NDF,D.LSI & D.RSX,MOV @#PS,D.USTA    ; [SH]GET USER'S STATUS
  216. .IIF DF,D.LSI,MFPS D.USTA    ; GET USER'S STATUS
  217. .IF DF,D.RSX
  218.     JSR    PC,D.SVPS    ; Get PS
  219.     MOV    $DSW,D.UDSW    ; [SH]Get user's status
  220. .ENDC ; DF,D.RSX
  221.     MOV    (SP)+,D.UR7    ; SOFT ENTRY ASSUMES STACK HAS RETURN ADDRESS
  222.     JSR    PC,D.SAVE    ; SAVE REGISTERS
  223.     BR    D.DDT2        ; FINISH INITIALIZATION
  224. D.DDT3:
  225. .IF DF,D.RSX
  226.     SVDB$S #SVDTAB,#LENSVD    ;[SH]Specify SST Vector Table (Set 
  227.                 ;   breakpoints and other stuff to us.
  228.     MOV    R0,JOBSA    ;[SH]Move the start address to the correct spot
  229.                 ;   (DDT assumes it was started with a JSR PC)
  230.     MOV    #6,TERLUN    ; This is the logical unit to be used to do 
  231.                 ;   I/O to the terminal.  It has the same
  232.                 ;   problem as the event flags.
  233. .ENDC
  234. .IIF NDF,D.LSI & D.RSX,MOV @#PS,D.USTA    ; [SH]SAVE USER'S STATUS
  235. .IF DF,D.RSX
  236.     JSR    PC,D.SVPS    ; Save PS
  237.     MOV    $DSW,D.UDSW    ; [SH]Save user's status
  238. .ENDC ; DF,D.RSX
  239.     .IF    DF,D.LSI
  240.      HALT            ; HALT TO ALLOW TYPEOUT
  241.      MFPS    D.USTA        ; GET USER'S STATUS
  242.     .ENDC
  243.     CMP    SP,#400        ;IS STACK REASONABLE?
  244.     BHI    10$        ;YES, SEE IF ITS ADDRESSABLE
  245.     MOV    #D.STK,SP    ;NOPE, USE OURS THEN
  246. 10$:
  247. .IF NDF,D.RSX
  248.     MOV    #D.NOSP,@#4    ; SET FOR INVALID STACK INTERRUPT
  249.     MOV    #340,@#6    ; SET HIGH STATUS
  250.     MOV    #D.ILGT,@#10    ; SET FOR ILLEGAL INSTRUCTIONS
  251.     MOV    #340,@#12    ; SET HIGH STATUS
  252. .ENDC ; .IF NDF,D.RSX
  253.     MOV    SP,D.XXX    ; SAVE HIS STACK
  254.     MOV    #D.STK,SP    ; USE OURS TEMPORARILY
  255.     TST    @D.XXX        ; DOES HIS STACK EXIST?
  256.     MOV    D.XXX,SP    ; GIVE HIM BACK HIS STACK
  257. D.FIX:
  258. .IF NDF,D.RSX
  259.     MOV    #D.NXMT,@#4    ; RESTORE FOR EXTERNAL NXMS
  260. .ENDC
  261.     MOV    JOBSA,D.UR7    ; ASSUME HE CAME FROM STARTING ADDRESS
  262.     JSR    PC,D.SAVE    ; SAVE REGISTERS
  263.     .IF    DF,D.GDP
  264.      MOV    #DDT+2,R0    ; ADDRESS OF RESTART FOR MONITOR
  265.      TRAP    133        ; DDTCAL
  266.     .ENDC
  267.     CLRB    D.NOTY        ; ALLOW TYPEOUT
  268.     MOV    #D.GRET,R4    ; TELL YOU ARE HERE
  269.     MOV    #D.GRND,R3    ; END OF MESSAGE
  270.     JSR    PC,D.STYP    ; TYPE MESSAGE
  271.     .IF    NDF,D.GDP
  272.      MOV    #DDT,R0        ; ADDRESS OF RESTART
  273.      JSR    PC,D.TYPN    ; TYPE RESTART ADDRESS
  274.     .ENDC
  275. D.DDT2:    JSR    PC,D.CRLF    ; TYPE CARRIAGE RETURN-LINE FEED
  276.     CLR    D.SD.T        ; NOT IN SINGLE STEP OR TRACE
  277.     MOVB    #-1,D.P        ; DISALLOW PROCEDE
  278.     BR    D.DCD0        ; GET INTO MAIN LOOP
  279. D.ERR:    MOV    #' ,R0        ; TYPE A SPACE
  280.     JSR    PC,D.TYPE
  281.     MOV    #'?,R0        ; ? TO BE TYPED
  282. D.ERRO:    JSR    PC,D.TYPE    ; TYPE CHARACTER
  283. D.DCD:    JSR    PC,D.TTAB    ; TYPE TAB
  284. D.DCD0:    CLR    D.COMA        ; NO , PARAMETER.  RETURN FROM <CR>HCTSAR>
  285.     CLRB    D.FWAF        ; NO < PARAMETER
  286. .IIF NDF,D.LSI & D.RSX,MOV D.DSTA,@#PS    ; [SH]SET DDT STATUS
  287. .IIF DF,D.LSI,MTPS D.DSTA    ; SET DDT STATUS
  288. ; Don't need to change PS for RSX
  289.     MOV    #NOP,D.PARS    ; FILL $X AREA WITH NOPS
  290.     MOV    #NOP,D.PARS+2    ;  IN CASE OF SHORT INSTRUCTIONS
  291.     CLR    D.PARO        ; NO OFFSET
  292.     CLR    D.PARO+2    ; NO OFFSET
  293. D.DCD2:    CLR    D.SVR2        ; RETURN FROM ,<
  294.     CLR    D.SVR4        ; D.SVR4 IS A SAVE REGISTER FOR R4
  295.     CLR    D.OFST        ; TALLY
  296.     CLR    R2        ; NUMBER TYPED FLAG
  297. D.DCD3:    CLRB    D.ALTF        ; RETURN FROM B"MVQI
  298. D.DCD1:    CLRB    D.LEVL        ; RETURN FROM $
  299.     CLRB    D.INPA        ; NOT IN INSTRUCTION TYPE-IN
  300.     MOV    D.CAD,D.CADC    ; KEEP A CURRENT COPY FOR INST TYPE-IN
  301.     MOV    #D.STK,SP    ; RESET STACK POINTER
  302.     JSR    PC,D.EXPR    ; GET EXPRESSION (R2,R4,R1)
  303.     TST    R2        ; NEED OPERANDS FOR INSTRUCTION?
  304.     BPL    D.DCD4        ; BRANCH IF NOT
  305.     JSR    PC,D.GETI    ; GET OPERANDS
  306. D.DCD4:    TST    R2        ; ANY VALUE TYPED?
  307.     BEQ    D.DCD5        ; BRANCH IF NOT
  308.     MOV    R4,D.LASV    ; STORE LAST TYPED VALUE
  309.     MOV    R4,D.LASW    ; STORE LAST TYPED WORD TOO
  310. D.DCD5:    ASL    R1        ; MULTIPLY BY TWO
  311.     JSR    PC,@D.LGDR(R1)    ; GO TO PROPER ROUTINE
  312.     BR    D.DCD        ; GET NEXT COMMAND
  313. D.NOSP:    MOV    #D.STK,SP    ; SET OWN STACK PERMANENTLY FOR USER
  314.     BR    D.FIX        ; RETURN
  315.  
  316. ; ROUTINE TO GET A PRIMARY INTO R1 (COMMAND DECODER)
  317.  
  318. D.PRIM:                ; PRIMARY READING SUBROUTINE
  319.     CLR    R4        ; R4 CONTAINS THE CONVERTED OCTAL
  320.     CLR    D.DECN        ; CLEAR DECIMAL NUMBER
  321.     CLRB    D.USED        ; CLEAR USE-DECIMAL NUMBER INDICATOR
  322.     JSR    PC,D.CLSM    ; CLEAR SYMBOL
  323. D.PRI1:    JSR    PC,D.GET    ; GET A CHAR, RETURN IN R0
  324.     CMP    #'0,R0        ; COMPARE WITH ASCII 0
  325.     BHI    D.PRI3        ; CHECK LEGALITY IF NON-NUMERIC
  326.     CMP    #'9,R0        ; COMPARE WITH ASCII 9
  327.     BLO    D.PRI3        ; CHECK LEGALITY IF NOT OCTAL
  328.     CMP    D.POS,#D.SYM    ; IN THE MIDDLE OF A SYMBOL?
  329.     BNE    D.PRI6        ; YES, PUT DIGIT IN SYMBOL
  330.     SUB    #'0,R0        ; CONVERT TO BCD
  331.     ASL    R4        ; MAKE ROOM
  332.     ASL    R4        ;  IN
  333.     ASL    R4        ;    R4
  334.     ADD    R0,R4        ; PACK THREE BITS IN R4
  335.     MOV    D.DECN,R1    ; GET DECIMAL NUMBER
  336.     ASL    R1        ; MULTIPLY BY 2
  337.     ADD    R1,R0        ; ADD 2X
  338.     ASL    R1        ; MULTIPLY BY 4
  339.     ASL    R1        ; MULTIPLY BY 8
  340.     ADD    R0,R1        ; ADD IN NEW DIGIT
  341.     MOV    R1,D.DECN    ; STORE IN DECIMAL NUMBER
  342.     INC    R2        ; R2 HAS NUMERIC FLAG
  343.     BR    D.PRI1        ;   AND TRY AGAIN
  344. D.PRI2:    MOV    #'U,R0        ; UNDEFINED MESSAGE
  345.     BR    D.ERRO        ; ERROR OUTPUT
  346. D.PRI3:    CMPB    R0,#'.        ; DOT FOUND?
  347.     BEQ    D.PRI7        ; BRANCH IF SO
  348.     CLR    R1        ; BASE OF CHARACTER TABLE
  349. D.PRI4:    CMPB    D.LGCH(R1),R0    ; MATCH?
  350.     BEQ    D.PRI5        ; YES
  351.     INC    R1        ; NEXT CHARACTER
  352.     CMP    R1,#D.CLGT    ; ANY MORE?
  353.     BLT    D.PRI4        ; LOOP IF SO
  354. D.PRI6:    TST    R4        ; NUMBER ALREADY?
  355.     BNE    D.ERR        ; ERROR TO START SYMBOL
  356.     JSR    PC,D.PTSM    ; PUT SYMBOL IN D.SYM
  357.     BR    D.PRI1        ; DECODE MORE CHARACTERS
  358. D.PRI7:    TST    R2        ; NUMBER BEING TYPED?
  359.     BEQ    D.PRI6        ; BRANCH IF NOT
  360.     INCB    D.USED        ; IT IS, MAKE IT DECIMAL
  361.     BR    D.PRI1        ; CONTINUE SCANNING
  362. D.PRI5:    TSTB    D.ALTF        ; ALTMODE FOUND?
  363.     BNE    D.PRI8        ; YES, DO IT
  364.     CMP    R1,#D.LETR    ; IS IT A LETTER?
  365.     BGE    D.PRI6        ; YES
  366. D.PRI8:    CMPB    #' ,D.SYM    ; ANY SYMBOL?
  367.     BEQ    D.PRIB        ; NO, RETURN
  368.     CMP    #". ,D.SYM    ; IS SYMBOL A DOT?
  369.     BNE    D.PRI9        ; BRANCH IF NOT
  370.     MOV    D.DOT,R4    ; USE VALUE OF D.DOT
  371.     INC    R2        ; NOTE THAT IT IS A NUMBER
  372.     BR    D.PRIB        ; DO THE REST
  373. D.PRI9:    MOV    #D.SYM,R0    ; ADDRESS OF SYMBOL
  374.     JSR    PC,D.GTAD    ; GET ADDRESS
  375.     CMP    R1,#D.COLO    ; COLON?
  376.     BEQ    D.PRIC        ; RETURN IF SO
  377.     TST    R0        ; CHECK SYMBOL ADDRESS
  378.     BEQ    D.PRID        ; BRANCH IF NOT AN ADDRESS
  379.     MOV    (R0),R4        ; GET SYMBOL VALUE
  380. D.PRIA:    INC    R2        ; MARK R2 AS A NUMBER
  381. D.PRIB:    TSTB    D.USED        ; USE DECIMAL NUMBER?
  382.     BEQ    D.PRIC        ; BRANCH IF NOT
  383.     MOV    D.DECN,R4    ; USE DECIMAL NUMBER
  384. D.PRIC:    RTS    PC        ; RETURN
  385. D.PRID:    MOV    #D.COUS,R0    ; ADDRESS OF OFFSET TABLE
  386. D.PRIE:    CMP    R0,#D.ECNT    ; END OF LIST?
  387.     BHIS    D.PRI2        ; YES, LOSE
  388.     MOV    #D.SYM,R5    ; SCAN THE SYMBOL
  389.     MOV    (R0)+,R3    ; GET OFFSET OF CHARACTERS
  390.     BIC    #177400,R3    ; TURN OFF EXTRA CRUFT
  391.     CMPB    R3,(R0)        ; NULL STRING?
  392.     BEQ    D.PRIE        ; YES, IGNORE IT
  393. D.PRIF:    CMPB    D.STRS(R3),(R5)+; IS IT A CHARACTER MATCH?
  394.     BNE    D.PRIE        ; BRANCH IF NOT
  395.     INC    R3        ; NEXT CHARACTER
  396.     CMPB    R3,(R0)        ; END OF STRING?
  397.     BNE    D.PRIF        ; BRANCH IF NOT
  398.     MOV    D.TOPS-D.COUS-2(R0),R4    ;GET THE INSTRUCTION-1
  399.     MOVB    -1(R0),R3    ; GET LEGALITY BYTE
  400.     CMPB    R3,#10        ; IS IT A CONDITION CODE SET/CLEAR?
  401.     BEQ    D.PRIK        ; MAY BE
  402.     INC    R4        ; FIX INSTRUCTION
  403. D.PRIG:    CMPB    #' ,(R5)    ; BLANK AT END OF SYMBOL?
  404.     BNE    D.PRII        ; NO, HOW ABOUT "B"?
  405.     BIC    #177774,R3    ; STRIP TO MACHINE TYPE
  406.     CMPB    R3,D.MACH    ; VALID ON THIS MACHINE?
  407.     BGT    D.PRI2        ; UNDEFINED SYMBOL
  408. D.PRIH:    MOVB    -(R0),R3    ; RE-FETCH LEGALITY BYTE
  409.     CMP    R1,#D.SPAC    ; IS INSTRUCTION TERMINATED WITH SPACE?
  410.     BNE    D.PRIA        ; DON'T GET OPERANDS IF NOT
  411.     MOV    #-2,R2        ; MARK INSTRUCTION
  412.     BR    D.PRIA        ; ALL DONE
  413. D.PRII:    CMPB    #'B,(R5)+    ; BYTE INSTRUCTION MUST TERMINATE WITH "B"
  414.     BNE    D.PRIE        ; NOT AN INSTRUCTION
  415.     TSTB    R3        ; TEST LEGALITY BYTE
  416.     BPL    D.PRIE        ; NO
  417.     ADD    #100000,R4    ; ADD IN BYTE OFFSET
  418.     BCC    D.PRIG        ; AND CONTINUE, UNLESS THAT WAS A SECOND "B"
  419.     BR    D.PRIE        ; IN WHICH CASE WE LOSE
  420.  
  421. D.PRIJ:    BITB    (SP),R4        ; BIT ALREADY ON?
  422.     BNE    D.PRIN        ; YES, LOSE
  423.     BISB    (SP),R4        ; SET IT
  424.     CMPB    (SP)+,(R5)+    ; BUMP SP BY 2, R5 BY 1
  425.     CMPB    #' ,(R5)    ; SPACE YET?
  426.     BEQ    D.PRIH        ; YES, ALL DONE.
  427. D.PRIK:    MOVB    #10,-(SP)    ; SET UP MAGIC BIT
  428.     MOV    #D.NZVC+4,R3    ; CHARACTER POINTER
  429. D.PRIL:    CMPB    (R5),-(R3)    ; MATCH?
  430.     BEQ    D.PRIJ        ; BRANCH IF SO
  431.     ASRB    (SP)        ; MOVE BIT
  432.     BNE    D.PRIL        ; AND LOOP
  433. D.PRIN:    TSTB    (SP)+
  434.     BR    D.PRIE        ; ELSE NOT THE RIGHT INSTRUCTION
  435.  
  436. ; ROUTINES TO HANDLE THE SYMBOL TABLE
  437.  
  438. D.GTAD:    MOV    R0,-(SP)    ; SAVE CHARACTER ADDRESS
  439.     JSR    PC,D.RD50    ; CONVERT FIRST 3 TO RAD50
  440.     MOV    R0,D.RAD1    ; SAVE VALUE
  441.     MOV    (SP)+,R0    ; GET CHARACTER ADDRESS
  442.     ADD    #3,R0        ; POINT TO LAST 3 CHARACTERS
  443.     JSR    PC,D.RD50    ; CONVERT TO RAD50
  444.     MOV    R0,D.RAD2    ; STORE IT AWAY
  445. D.GTAC:    MOV    #D.SYMA-2,R0    ; ADDRESS OF SYMBOL TABLE
  446. D.GTA2:    TST    (R0)+        ; BUMP R0 BY 2
  447.     CMP    (R0)+,(R0)    ; BUMP R0 BY 2 MORE, CHECK IF END OF TABLE
  448.     BNE    D.GTA6
  449.     TST    (R0)        ; WERE BOTH SYMBOL HALVES 0?
  450.     BNE    D.GTA6        ; NO, KEEP LOOKING
  451.     CLR    R0        ; NOT FOUND...MARK RETURN REGISTER
  452.     RTS    PC        ; RETURN
  453. D.GTA6:    CMP    D.RAD2,(R0)+    ; DO SECOND THREE CHARACTERS MATCH?
  454.     BNE    D.GTA2        ; NO, GO TO NEXT SYMBOL
  455.     CMP    -4(R0),D.RAD1    ; YES, HOW ABOUT THE FIRST THREE?
  456.     BNE    D.GTA2        ; NO, GO TO NEXT SYMBOL
  457.     RTS    PC        ; RETURN
  458.  
  459. D.GTSM:    CLR    -(SP)        ; SPACE FOR TEMPORARIES
  460.     MOV    D.FENC,R2    ; FIND CLOSEST SYMBOL <= R0
  461.     MOV    D.RFNL,R1    ; WHICH IS ALSO >= R0-D.RFNL
  462. D.GTS1:    CMP    (R2)+,(R2)+    ; SKIP OVER THE NAME
  463.     BEQ    D.GTS3
  464. D.GTS2:    MOV    R0,R3        ; SET A TEMPORARY
  465.     SUB    (R2)+,R3    ; OBTAIN DIFERENCE
  466.     BLO    D.GTS1        ; IF SYMBOL HIGHER THAN R0, NO GO
  467.     SUB    R1,R3        ; ARE WE CLOSER THAN BEFORE?
  468.     BHI    D.GTS1        ; NO, FURTHER
  469.     MOV    R2,(SP)        ; SAVE POINTER TO SYMBOL
  470.     ADD    R3,R1        ; SAVE DIFFERENCE
  471.     BR    D.GTS1        ; AND LOOK FOR ONE CLOSER
  472. D.GTS3:    TST    -2(R2)        ; AT END OF TABLE?
  473.     BNE    D.GTS2        ; NO, KEEP GOING
  474.     MOV    (SP)+,R1    ; GET SYMBOL PTR
  475.     BEQ    D.GTS4        ; BRANCH IF NOT FOUND.
  476.     CMP    -(R1),#400    ; IGNORE SMALL SYMBOLS
  477.     BLO    D.GTS4
  478.     SUB    (R1),R0        ; RECOMPUTE DIFFERENCE
  479.     MOV    R0,-(SP)    ; SAVE DIFFERENCE
  480.     MOV    -(R1),-(SP)    ; GET LAST THREE CHARACTERS
  481.     MOV    -(R1),R0    ; GET FIRST THREE
  482.     MOV    #D.SYM,R1    ; ADDRESS TO PUT CHARACTERS
  483.     JSR    PC,D.CHAR    ; CONVERT TO ASCII
  484.     MOV    (SP)+,R0    ; GET FIRST RAD50 WORD
  485.     JSR    PC,D.CHAR    ; CONVERT TO ASCII
  486.     MOV    (SP)+,R0    ; RESTORE DIFFERENCE
  487.     MOV    #D.SYM,R1    ; POINT TO CHARACTERS
  488.     RTS    PC        ; RETURN
  489. D.GTS4:    CLR    R1        ; NOT FOUND...MARK IT SO
  490.     RTS    PC        ; RETURN
  491.  
  492. ; ROUTINE TO GET AN EXPRESSION (VALUE IN R4, FLAG IN R2, TERMINATOR IN R1)
  493.  
  494. D.CEXP:    INCB    D.INPA        ; NOT IN INSTRUCTION
  495.     CLR    D.OFST        ; START OUT FRESH
  496. D.EXPR:    MOV    #D.ADD,D.OPER    ; INITIAL FUNCTION
  497. D.EXP7:    JSR    PC,D.PRIM    ; GET PRIMARY EXPRESSION
  498.     TST    R2        ; INSTRUCTION?
  499.     BMI    D.EXP1        ; EXIT IF SO
  500.     CMP    R1,#D.OPAR    ; OPEN PARENTHESIS OR OPERATOR?
  501.     BLT    D.EXP1        ; BRANCH IF NEITHER
  502.     BEQ    D.EXP2        ; BRANCH IF OPEN PARENTHESIS
  503.     CMP    R1,#D.CPAR    ; CLOSE PARENTHESIS OR OPERATOR?
  504.     BLT    D.EXP3        ; BRANCH IF OPERATOR
  505.     BEQ    D.EXP4        ; BRANCH IF CLOSE PARENTHESIS
  506. D.EXP1:    TSTB    D.LEVL        ; TERMINATOR FOUND...AT UPPER LEVEL?
  507.     BEQ    D.EXP5        ; BRANCH IF SO
  508.     BR    D.ERRD        ; ERROR
  509. D.EXP2:    TSTB    D.INPA        ; IN AN INSTRUCTION TYPE-IN?
  510.     BNE    D.EXP5        ; BRANCH IF SO (INSTRUCTION FORMAT)
  511.     INCB    D.LEVL        ; GO DOWN TO NEXT PARENTHESIS LEVEL
  512.     MOV    D.OFST,-(SP)    ; SAVE TALLY
  513.     MOV    D.OPER,-(SP)    ; SAVE OPERATION
  514.     CLR    D.OFST        ; CLEAR TALLY
  515.     JSR    PC,D.EXPR    ; RECURSION!
  516.     MOV    (SP)+,D.OPER    ; RESTORE OPERATION
  517.     MOV    (SP)+,D.OFST    ; RESTORE TALLY
  518.     JSR    PC,@D.OPER    ; COMBINE THEM
  519.     BR    D.EXPR        ; LOOP
  520. D.EXP4:    DECB    D.LEVL        ; UP TO HIGHER PARENTHESIS LEVEL
  521.     BMI    D.ERRD        ; ERROR IF NONE HIGHER
  522. D.EXP5:    JSR    PC,@D.OPER    ; DO OPERATION
  523.     MOV    D.OFST,R4    ; GET TALLY AS RETURN PARAMETER
  524.     RTS    PC        ; RETURN (POSSIBLY TO SELF)
  525. D.EXP3:    JSR    PC,@D.OPER    ; DO OPERATION
  526.     ASL    R1        ; AND GET
  527.     MOV    D.LGDR(R1),D.OPER ;   THE NEXT
  528.     BR    D.EXP7        ; LOOP
  529.  
  530. ; ROUTINE TO HANDLE PARAMETERS FOR INSTRUCTION TYPE-IN
  531.  
  532. D.GETI:    ASR    R3        ; PARAMETER CODE
  533.     BIC    #177741,R3    ; MASK OUT OTHER BITS
  534.     MOV    R4,-(SP)    ; SAVE OPERATION MASK
  535.     JSR    PC,@D.PARG(R3)    ; GET PARAMETERS
  536.     BIS    (SP)+,R4    ; PUT OPERATION MASK INTO OPERANDS
  537.     MOV    #1,R2        ; MARK A GOOD NUMBER
  538.     RTS    PC        ; RETURN
  539.  
  540. D.GR:    JSR    PC,D.PRIM    ; GET PRIMARY
  541. D.REDR:    SUB    #D.UR0,R4    ; GET REGISTER ADDRESS
  542.     ASR    R4        ; MAKE INTEGER FROM ADDRESS
  543.     BIT    #177770,R4    ; ANY HIGH BITS ON?
  544.     BNE    D.ERRD        ; ERROR IF NOT A REGISTER
  545. D.NONE:    RTS    PC        ; RETURN
  546.  
  547. D.GGET:    MOV    R0,-(SP)    ; SAVE WHAT MUST BE READ
  548. D.GGE2:    JSR    PC,D.GET    ; GET LETTER
  549.     CMP    R0,(SP)        ; EQUAL?
  550.     BEQ    D.GGE1        ; YES, RETURN
  551. D.ERRD:    JMP    D.ERR        ; ERROR
  552. D.GGE1:    TST    (SP)+        ; FIX STACK
  553.     RTS    PC        ; RETURN
  554.  
  555. D.PSAV:    MOV    (SP),-(SP)    ; PUSH RETURN ADDRESS DOWN
  556.     SWAB    R4        ; MOVE
  557.     ASR    R4        ;  TO
  558.     ASR    R4        ;   HIGH POSITION
  559.     MOV    R4,2(SP)    ; PUT PARAMETERS IN
  560.     CMP    R1,#D.COMM    ; COMMA IN-BETWEEN?
  561.     BNE    D.ERRD        ; ERROR IF NOT
  562.     RTS    PC        ; RETURN
  563.  
  564. D.DISP:    JSR    PC,D.CEXP    ; GET EXPRESSION
  565.     SUB    D.DOT,R4    ; COMPUTE OFFSET
  566.     ASR    R4        ; SHIFT
  567.     DEC    R4        ; POINTS TO PROPER WORD
  568.     BIC    #177400,R4    ; CLEAR HIGH BITS
  569.     RTS    PC        ; RETURN
  570.  
  571. D.GRNN:    JSR    PC,D.GR        ; GET REGISTER
  572.     JSR    PC,D.PSAV    ; SAVE PARAMETERS
  573.     JSR    PC,D.DISP    ; GET ADDRESS
  574.     BIC    #177700,R4    ; REDUCE TO 6-BITS
  575. D.GGE3:    BIS    (SP)+,R4    ; ADD IN REGISTER
  576.     RTS    PC        ; RETURN
  577. D.GSD:    JSR    PC,D.GDD    ; GET 6-BIT OPERAND
  578. D.GGE4:    JSR    PC,D.PSAV    ; SAVE PARAMETER
  579.     JSR    PC,D.GDD    ; GET OTHER PARAMETER
  580.     BR    D.GGE3        ; DO THE REST
  581. D.GRSS:    JSR    PC,D.GR        ; GET REGISTER
  582.     BR    D.GGE4        ; DO THE REST
  583. D.GDDR:    JSR    PC,D.GDD    ; GET 6-BIT-OPERAND
  584.     MOV    R4,-(SP)    ; SAVE OPERAND
  585.     JSR    PC,D.GR        ; GET REGISTER
  586.     SWAB    R4        ; SHIFT
  587.     ASR    R4        ;  INTO
  588.     ASR    R4        ;   HIGH PLACE
  589.     BR    D.GGE3        ; DO THE REST
  590.  
  591. D.NEXP:    MOV    D.CADC,R0    ; GET CAD COPY
  592.     TST    (R0)+        ; BUMP TO NEXT
  593.     MOV    R0,D.CADC    ; RESTORE NEW VALUE
  594.     TST    (R0)+        ; INCREMENT AGAIN
  595.     RTS    PC        ; RETURN
  596.  
  597. D.GDD:    CLR    R2        ; NO PARAMETERS YET
  598.     JSR    PC,D.CEXP    ; GET EXPRESSION
  599.     CMP    R1,#D.OPAR    ; OPEN PARENTHESIS?
  600.     BEQ    D.G02        ; BRANCH IF SO
  601.     CMP    R1,#D.HASH    ; HASH MARK?
  602.     BEQ    D.G05        ; BRANCH IF SO
  603.     BLO    D.G03        ; BRANCH IF AT-SIGN
  604.     CMP    R4,#D.UR0    ; REGISTER?
  605.     BLO    D.NOTR        ; BRANCH IF NOT
  606.     CMP    R4,#D.UR7    ; REGISTER?
  607.     BHI    D.NOTR        ; BRANCH IF NOT
  608.     SUB    #D.UR0,R4    ; NORMALIZE
  609.     ASR    R4
  610.     RTS    PC        ; RETURN
  611. D.NOTR:    JSR    PC,D.NEXP    ; POINT TO NEXT PARAMETER
  612.     MOV    R0,-(SP)    ; SAVE RELOCATION
  613.     SUB    D.CAD,R0    ; GET PARAMETER OFFSET
  614.     MOV    (SP)+,D.PARO-4(R0) ; PUT IN OFFSET
  615.     MOV    R4,D.PARS-4(R0)    ; PUT VALUE IN
  616.     MOV    #67,R4        ; RELATIVE PC ADDRESSING
  617.     RTS    PC        ; DONE
  618. D.G05:    JSR    PC,D.CEXP    ; GET EXPRESSION
  619. D.G014:    JSR    PC,D.NEXP    ; NEXT PARAMETER
  620.     SUB    D.CAD,R0    ; GET PARAMETER OFFSET
  621.     CLR    D.PARO-4(R0)    ; NO RELOCATION
  622.     MOV    R4,D.PARS-4(R0)    ; PUT VALUE IN
  623.     MOV    #27,R4        ; IMMEDIATE ADDRESSING
  624.     RTS    PC        ; RETURN
  625. D.G02:    TST    R2        ; "(" FOUND, ANY OFFSET?
  626.     BNE    D.G013        ; BRANCH IF SO (INDEX ADDRESSING)
  627.     CMP    D.OPER,#D.SUBT    ; "-(R)" ?
  628.     BNE    D.G016        ; BRANCH IF NOT
  629.     JSR    PC,D.GR        ; GET REGISTER
  630.     ADD    #40,R4        ; ADD IN AUTO-DECR OFFSET
  631.     BR    D.G09        ; SKIP TO COMMAND AND RETURN
  632. D.G016:    JSR    PC,D.GR        ; GET REGISTER..."(R)" OR "(R)+"
  633.     JSR    PC,D.G09    ; SKIP TO NEXT PARAMETER
  634.     CMP    R1,#D.ADDS    ; PLUS SIGN?
  635.     BNE    D.G012        ; BRANCH IF NOT
  636.     ADD    #20,R4        ; ADD IN AUTO-INCR OFFSET
  637.     BR    D.G09        ; SKIP TO COMMAND AND RETURN
  638. D.G013:    JSR    PC,D.G014    ; PUT PARAMETER IN
  639.     JSR    PC,D.GR        ; GET REGISTER
  640.     ADD    #60,R4        ; ADD IN INDEX OFFSET
  641.     BR    D.G09        ; SKIP TO COMMAND AND RETURN
  642. D.G03:    CLR    R2        ; "@" FOUND, MARK NO NUMBER FOUND YET
  643.     JSR    PC,D.CEXP    ; AN "@" WAS FOUND, LOOK TO NEXT
  644.     CMP    R1,#D.HASH    ; "@#" MEANS ABSOLUTE ADDRESSING
  645.     BEQ    D.G06        ; BRANCH IF SO
  646.     CMP    R1,#D.OPAR    ; COULD BE "@(" OR "@X("
  647.     BEQ    D.G07        ; BRANCH IF EITHER
  648.     CMP    R4,#D.UR0    ; IS IT @R?
  649.     BLO    D.G08        ; BRANCH IF NOT
  650.     CMP    R4,#D.UR7    ; TEST UPPER RANGE
  651.     BHI    D.G08        ; BRANCH IF NOT
  652.     JSR    PC,D.REDR    ; REDUCE TO REGISTER NUMBER
  653. D.G012:    ADD    #10,R4        ; ADD IN REG-DEFERRED OFFSET
  654.     RTS    PC        ; THATS ALL...RETURN
  655. D.G08:    JSR    PC,D.NOTR    ; PERFORM NORMAL RELOCATION
  656.     MOV    #77,R4        ; MARK RELATIVE DEFERRED ADDRESSING
  657.     RTS    PC        ; RETURN
  658. D.G07:    TST    R2        ; ANY NUMBER THERE?
  659.     BEQ    D.G010        ; BRANCH IF "@("
  660.     JSR    PC,D.G014    ; GET OFFSET INTO PARAMETER
  661.     JSR    PC,D.GR        ; NOW GET REGISTER
  662.     ADD    #70,R4        ; ADD IN INDEX DEFERRED OFFSET
  663. D.G09:    MOV    R4,-(SP)    ; SAVE VALUE
  664.     JSR    PC,D.PRIM    ; SKIP TO NEXT COMMAND
  665.     MOV    (SP)+,R4    ; RESTORE VALUE
  666.     RTS    PC        ; RETURN
  667. D.G010:    CMP    D.OPER,#D.SUBT    ; "@-(" ?
  668.     BNE    D.G015        ; BRANCH IF NOT
  669.     JSR    PC,D.GR        ; GET REGISTER
  670.     ADD    #50,R4        ; ADD IN AUTO-DECR DEFERRED OFFSET
  671.     BR    D.G09        ; SKIP TO COMMAND AND RETURN
  672. D.G015:    JSR    PC,D.GR        ; GET REGISTER
  673.     MOV    #'+,R0        ; FORM IS "@(R)+"
  674.     JSR    PC,D.GGET    ; GET THE PLUS
  675.     ADD    #30,R4        ; ADD IN AUTO-INCR DEFERRED OFFSET
  676.     BR    D.G09        ; SKIP TO COMMAND AND RETURN
  677. D.G06:    JSR    PC,D.G05    ; GET ABSOLUTE ADDRESS
  678.     MOV    #37,R4        ; MARK ABSOLUTE MODE
  679.     RTS    PC        ; DONE
  680. D.GNUM:    JMP    D.PRIM        ; GET NUMBER AND RETURN
  681.  
  682. ; SYMBOL MANIPULATION SUBROUTINES
  683.  
  684. D.PTSM:    MOV    D.POS,R1    ; GET POSITION ADDRESS
  685.     CMP    R1,#D.SYM+D.SYML; NO MORE ROOM?
  686.     BHIS    D.PTS1        ; EXIT IF SO
  687.     MOVB    R0,(R1)+    ; PUT CHARACTER IN
  688.     MOV    R1,D.POS    ; RESTORE POINTER
  689. D.PTS1:    RTS    PC        ; RETURN
  690.  
  691. D.CLSM:    MOV    #D.SYM+D.SYML,R0
  692. D.CLS3:    MOVB    #' ,-(R0)
  693.     CMP    R0,#D.SYM
  694.     BHI    D.CLS3
  695.     MOV    R0,D.POS
  696.     RTS    PC        ; RETURN
  697.  
  698. ; ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION FOR DECODER
  699.  
  700. D.ADD:    ADD    R4,D.OFST    ; ADD OPERANDS
  701.     RTS    PC        ; RETURN
  702. D.SUBT:    SUB    R4,D.OFST    ; SUBTRACT OPERANDS
  703.     RTS    PC        ; RETURN
  704. D.MULT:    CLR    R0        ; MULTIPLY THEM
  705.     MOV    #16.,-(SP)    ; LOOPER
  706. D.MUL1:    ASR    R4        ; GET BOTTOM BIT
  707.     BCC    D.MUL2        ; SKIP IF OFF
  708.     ADD    D.OFST,R0    ; ADD IN OPERAND
  709. D.MUL2:    ASL    D.OFST        ; SHIFT OPERAND
  710.     DEC    (SP)        ; MORE TO LOOP?
  711.     BGT    D.MUL1        ; LOOP IF SO
  712.     MOV    R0,D.OFST    ; RESULT IN D.OFST
  713.     TST    (SP)+        ; FIX STACK
  714.     RTS    PC        ; RETURN
  715. D.DIV:    MOV    R1,-(SP)    ; SAVE R1
  716.     MOV    D.OFST,R0    ; GET OPERAND
  717.     MOV    R4,R2        ; GET OTHER OPERAND
  718.     JSR    PC,D.DIVD    ; DIVIDE THEM
  719.     MOV    R0,D.OFST    ; GET RESULT
  720.     MOV    (SP)+,R1    ; RESTORE R1
  721.     RTS    PC        ; RETURN
  722.  
  723. ; MANIPULATION OF THE SYMBOL TABLE
  724.  
  725. D.SWAP:    MOV    #3,R2        ; COUNTER
  726. D.SWA1:    MOV    -(R1),-(SP)    ; GET WORD
  727.     MOV    (R0),(R1)    ; PUT OTHER WORD IN
  728.     MOV    (SP)+,(R0)    ; AND FINISH SWAP
  729.     TST    -(R0)        ; MOVE WORD
  730.     DEC    R2        ; LOOPER
  731.     BGT    D.SWA1        ; LOOP IF MORE
  732.     RTS    PC        ; RETURN
  733.  
  734. ; PROCESS : - DEFINE SYMBOL
  735.  
  736. D.COLN:    CMPB    D.SYM,#'     ; NULL SYMBOL?
  737.     BEQ    D.ERRB        ; ERROR IF SO
  738.     MOV    D.DOT,R4    ; ASSUME DOT ADDRESS
  739.     TSTB    D.FWAF        ; REAL VALUE GIVEN?
  740.     BEQ    D.COL1        ; BRANCH IF NOT
  741.     MOV    D.FWA,R4    ; GET REAL VALUE
  742. D.COL1:    TST    R0        ; IN SYMBOL TABLE?
  743.     BNE    D.COL2        ; BRANCH IF SO
  744.     MOV    D.RAD1,-(SP)    ; SAVE RAD50 OF NAME
  745.     MOV    D.RAD2,-(SP)    ; BOTH HALVES
  746.     MOV    #-1,D.RAD1    ; ASSUME NULL RAD50 LABEL
  747.     MOV    #-1,D.RAD2    ; IN BOTH HALVES
  748.     JSR    PC,D.GTAC    ; LOOK IT UP
  749.     TST    R0        ; FOUND?
  750.     BEQ    D.ERRB        ; ERROR IF NOT
  751.     MOV    (SP)+,-(R0)    ; FILL LABEL IN
  752.     MOV    (SP)+,-(R0)    ;  BY SETTING BOTH WORDS
  753.     CMP    (R0)+,(R0)+    ; NOW FIX POSITION
  754. D.COL2:    MOV    R4,(R0)        ; AND SET VALUE
  755.     MOV    R0,D.LASC    ; SET LAST COLONED WORD
  756.     MOV    D.FENC,R1    ; GET FENCE
  757.     CMP    R0,R1        ; BEHIND FENCE?
  758.     BHI    D.COL5        ; DONE IF NOT
  759.     JSR    PC,D.SWAP    ; SWAP SYMBOLS
  760.     MOV    R1,D.FENC    ; STORE IN FENCE
  761. D.COL5:    RTS    PC        ; RETURN
  762. D.ERRB:    JMP    D.ERR        ; ERROR
  763.  
  764. ; PROCESS D - DELETE LAST COLONED SYMBOL
  765.  
  766. D.DELE:    MOV    D.LASC,R0    ; GET LAST COLONED SYMBOL
  767.     BEQ    D.ERRB        ; ERROR IF NONE
  768.     CLR    D.LASC        ; LAST TIME TO COLON IT
  769.     BR    D.KIL3        ; NOW KILL IT
  770.  
  771. ; PROCESS K - KILL SYMBOL
  772.  
  773. D.KILL:    JSR    PC,D.GTAC    ; GET ADDRESS OF SYMBOL
  774.     TST    R0        ; ANY SYMBOL?
  775.     BEQ    D.ERRB        ; ERROR IF NOT
  776.     CMPB    D.ALTF,#1    ; HOW MANY ALTMODES?
  777.     BGT    D.KIL1        ; BRANCH IF 2
  778. D.KIL3:    MOV    D.FENC,R1    ; GET FENCE
  779.     CMP    R0,R1        ; SYMBOL BEHIND FENCE?
  780.     BLO    D.KIL4        ; BRANCH IF ALREADY KILLED
  781.     ADD    #6,R1        ; PUSH UP FENCE
  782.     MOV    R1,D.FENC    ; AND STORE IT
  783.     JMP    D.SWAP        ; SWAP SYMBOLS AND RETURN
  784. D.KIL1:    CLR    (R0)        ; CLEAR ADDRESS
  785.     MOV    #-1,-(R0)    ; PUT IN NULL SYMBOL
  786.     MOV    #-1,-(R0)    ; IN BOTH WORDS
  787. D.KIL4:    RTS    PC        ; RETURN
  788.  
  789. ; PROCESS ALTMODE
  790.  
  791. D.ALTM:    TSTB    D.ALTF        ; ALREADY AN ALTMODE TYPED?
  792.     BNE    D.ALT1        ; BRANCH IF SO
  793.     MOV    R2,D.SVR2    ; AN ALTMODE HAS BEEN RECEIVED
  794.     MOV    R4,D.SVR4    ; NUMERIC FLAG TO D.SVR2, CONTENTS TO D.SVR4
  795. D.ALT1:    CLR    R2        ; NO ARGS TYPED YET
  796.     CLR    D.OFST        ; CLEAR OFFSET
  797.     INCB    D.ALTF        ; COUNT NUMBER OF ALTMODES
  798.     JMP    D.DCD1        ; RETURN
  799.  
  800. ; PROCESS / - OPEN WORD
  801.  
  802. D.WRD:    MOV    D.CURM,D.OMOD    ; TEMP COPY OF ROUTINE ADDRESS
  803. D.WRD1:    TST    R2        ; NUMBER THERE?
  804.     BNE    D.WRD3        ; BRANCH IF SO
  805. D.WRD4:    MOV    D.LASV,D.CAD    ; SET LAST ADDRESS
  806.     BR    D.SEMI        ; DO IT
  807. D.WRD3:    MOV    R4,D.DOT    ; SET DOT
  808. D.WRD5:    MOV    D.DOT,D.CAD    ; SET CURRENT ADDRESS
  809.  
  810. ; PROCESS ; - RETYPE WORD
  811.  
  812. D.SEMI:    JMP    @D.OMOD        ; TYPE WORD AND RETURN
  813.  
  814. ; PROCESS <TAB> - OPEN INDIRECT
  815.  
  816. D.ORAB:    JSR    PC,D.CLSE    ; CLOSE WORD
  817.     MOV    D.LASV,D.DOT    ; INDIRECT REFERENCE
  818.     BR    D.OP2        ; OPEN IT AND RETURN
  819.  
  820. ; PROCESS ! - OPEN WORD SILENTLY
  821.  
  822. D.EXCL:    MOV    #D.RTS,D.OMOD    ; NULL ROUTINE FOR TYPING
  823.     BR    D.WRD1        ; OPEN WORD
  824.  
  825. ; PROCESS \ - OPEN LAST REFERENCED WORD
  826.  
  827. D.BKSL:    TST    R2        ; ANY PARAMETER?
  828.     BEQ    D.WRD4        ; BRANCH IF NOT
  829.     JSR    PC,D.CLSE    ; CLOSE WORD
  830.     BR    D.WRD4        ; OPEN INDIRECT
  831.  
  832. ; PROCESS <LF> - OPEN NEXT WORD
  833.  
  834. D.OP1:    JSR    PC,D.CLSE    ; CLOSE WORD
  835.     ADD    D.BW,D.DOT    ; ADD IN BYTE/WORD INCREMENT
  836.     ADD    D.LFIN,D.DOT    ; ADD IN LINE-FEED INCREMENT
  837. D.OP2:    JSR    PC,D.CRLF    ; TYPE CRLF
  838. D.OP3:    MOV    D.DOT,R0    ; GET WORD
  839.     JSR    PC,D.RFND    ; TYPE ADDRESS
  840.     MOV    #'/,R0        ; SLASH
  841.     JSR    PC,D.TYPE    ; TYPE IT
  842.     BR    D.WRD5        ; TYPE CONTENTS
  843.  
  844. ; PROCESS [ - OPEN WORD AS NUMERIC
  845.  
  846. D.OPBR:    MOV    #D.CADV,D.OMOD    ; NUMBER ROUTINE
  847.     BR    D.WRD1        ; DO ROUTINE
  848.  
  849. ; PROCESS ] - OPEN WORD AS INSTRUCTION
  850.  
  851. D.CLBR:    MOV    #D.INST,D.OMOD    ; INSTRUCTION ROUTINE
  852.     BR    D.WRD1        ; DO IT
  853.  
  854. ; PROCESS ^ - OPEN PREVIOUS WORD
  855.  
  856. D.BACK:    JSR    PC,D.CLSE    ; CLOSE WORD
  857.     SUB    D.BW,D.DOT    ; SUBTRACT BYTE/WORD INCREMENT
  858.     BR    D.OP2        ; OPEN WORD
  859.  
  860. ; PROCESS _ - TYPE WORD SYMBOLICALLY
  861.  
  862. D.ORPC:    MOV    D.LASW,R0    ; GET LAST TYPED WORD
  863.     CLR    D.LFIN        ; NO LINE-FEED INCREMENT
  864.     TSTB    D.ALTF        ; IS IT AN $_ ?
  865.     BEQ    D.ORP1        ; BRANCH IF NOT
  866.     JMP    D.RFND        ; TYPE SYMBOLICALLY AND RETURN
  867. D.ORP1:    JMP    D.INST        ; TYPE INSTRUCTION AND RETURN
  868.  
  869. ; PROCESS = - TYPE WORD AS NUMBER
  870.  
  871. D.EQAL:    MOV    D.LASW,R0    ; GET LAST TYPED WORD
  872.     CLR    D.LFIN        ; NO LINE-FEED INCREMENT
  873.     JMP    D.TYPN        ; TYPE AS A NUMBER
  874.  
  875. ; PROCESS , - COMMA PARAMETER
  876.  
  877. D.DCOM:    TST    R2        ; ANY PARAMETER?
  878.     BEQ    D.FWA1        ; BRANCH IF NOT
  879.     MOV    R4,D.COMA    ; PUT IN PARAMETER AREA
  880.     BR    D.FWA1        ; RETURN
  881.  
  882. ; PROCESS < - STORE FIRST WORD ADDRESS FOR SEARCH
  883.  
  884. D.FWAS:    MOV    R4,D.FWA    ; SET FIRST WORD
  885.     INCB    D.FWAF        ; MARK FIRST WORD FOUND
  886. D.FWA1:    JMP    D.DCD2        ; RETURN
  887.  
  888. ; PROCESS Z - ZERO CORE
  889.  
  890. D.ZERO:    MOV    D.FWA,R0    ; FIRST WORD
  891. D.ZER1:    CMP    R0,D.SVR4    ; AT LAST WORD?
  892.     BHI    D.ONE1        ; DONE IF SO
  893.     CLR    (R0)+        ; CLEAR WORD
  894.     BR    D.ZER1        ; LOOP
  895.  
  896. ; PROCESS U - SECOND SET OF INSTRUCTIONS
  897.  
  898. D.SNGL:    CLR    R5        ; OFFSET
  899.     JSR    PC,D.GET    ; GET CHARACTER
  900. D.SNG2:    CMPB    D.UTAB(R5),R0    ; MATCH?
  901.     BNE    D.SNG1        ; NO
  902.     ASL    R5        ; MULTIPLY BY 2
  903.     JMP    @D.UADD(R5)    ; DO THIS ROUTINE
  904. D.SNG1:    INC    R5        ; NEXT CHARACTER
  905.     CMP    R5,#D.ENUT    ; END OF LIST?
  906.     BLT    D.SNG2        ; LOOP IF NOT
  907. D.ERRE:    JMP    D.ERR        ; RETURN
  908.  
  909. ; PROCESS UT - SET SINGLE INSTRUCTION
  910.  
  911. D.ONES:    MOVB    R4,D.S        ; SET INDICATOR
  912.     CLR    D.CT        ; SET FOR AUTOMATIC PROCEDE
  913.     CMPB    D.ALTF,#1    ; TWO ALTMODES?
  914.     BGT    D.ONE2        ; FINISH UP IF SO
  915.     INC    D.CT        ; SET NORMAL PROCEDE
  916. D.ONE2:    MOV    D.SVR4,D.OPEN    ; SET ADDRESS TO OPEN AT BREAK
  917. D.ONE1:    RTS    PC        ; RETURN
  918.  
  919. ; PROCESS UW - SET RFND LIMIT
  920.  
  921. D.WULF:    MOV    D.SVR4,D.RFNL    ; SET LIMIT
  922.     RTS    PC        ; RETURN
  923.  
  924. ; PROCESS UG - RETURN USER DISPLAY
  925.  
  926.     .IF    DF,D.GDP
  927. D.GRAP:     TRAP    144
  928.      MOV    #104544,D.SAV9    ; UG! SELF MODIFYING-CODE
  929.      RTS    PC
  930.     .ENDC
  931.  
  932. ; PROCESS E, N AND W - SEARCHES
  933.  
  934. D.EFF:    MOV    #1,R1        ; SET EFFECTIVE SEARCH
  935.     BR    D.WDS        ; DO SEARCH
  936. D.NSCH:    MOV    #-1,R1        ; SET NON-SEARCH
  937.     BR    D.WDS        ; DO SEARCH
  938. D.WSCH:    CLR    R1        ; SET WORD SEARCH
  939. D.WDS:    TST    D.SVR2        ; NUMBER TO SEARCH FOR?
  940.     BEQ    D.ERRE        ; ERROR IF NOT
  941.     MOV    D.CAD,-(SP)    ; THIS IS "MOST RECENT VALUE" OF D.CAD
  942.     MOV    D.FWA,R2    ; SET ORIGIN
  943. D.WDS2:    .IF    NDF,D.KSR & D.RSX    ;[SH]
  944.      TSTB    @#D.RCSR    ; CHARACTER TYPED?
  945.      BMI    D.WDS6        ; BRANCH IF SO
  946.     .ENDC
  947. ;[SH] PUT SOMETHING IN!!!!!!!!!!!!!
  948.     .IF    DF,D.KSR
  949.      JSR    PC,D.POLL    ; CHECK FOR TYPED CHARACTER
  950.      CMP    D.INPU,D.OUTP    ; ANY CHARACTERS IN BUFFER?
  951.      BNE    D.WDS6
  952.     .ENDC
  953.     CMP    R2,D.LWA    ; IS THE SEARCH ALL DONE?
  954.     BHI    D.WDS6        ;  YES
  955.     MOV    D.SVR4,R5    ; GET NUMBER TO SEARCH FOR
  956.     MOV    D.MASK,R4    ; GET MASK
  957.     COM    R4        ; COMPLEMENT IT
  958.     MOV    (R2),R0        ; GET OBJECT
  959.     MOV    R2,D.CAD    ; THIS IS CURRENT ADDRESS
  960.     BIC    R4,R0        ; TURN OFF BITS NOT BEING SEARCHED FOR
  961.     BIC    R4,R5        ; TURN OFF BITS NOT BEING SEARCHED FOR
  962.     MOV    R1,-(SP)    ; STORE AND TEST
  963.     BMI    D.WDS5        ; BRANCH IF NON-SEARCH
  964.     BGT    D.WDS7        ; BRANCH IF EFFECTIVE SEARCH
  965.     CMP    R0,R5        ; EQUALITY?
  966.     BNE    D.WDS4        ; RE-LOOP IF NO MATCH
  967. D.WDS1:    JSR    PC,D.CRLF    ; TYPE CRLF
  968.     MOV    D.CAD,R0    ; GET READY TO TYPE
  969.     MOV    R0,2(SP)    ; SET MOST RECENT VALUE OF D.CAD
  970.     JSR    PC,D.RFND    ; RELOCATE
  971.     MOV    #'/,R0        ; SLASH TO R0
  972.     JSR    PC,D.TYPE    ; TYPE IT
  973.     JSR    PC,@D.CURM    ; TYPE CONTENTS
  974. D.WDS4:    MOV    (SP)+,R1    ; RESTORE R1
  975.     MOV    D.CAD,R2    ; RESTORE R2
  976.     TST    (R2)+        ; INCREMENT TO NEXT CELL AND
  977.     BR    D.WDS2        ;    RETURN
  978. D.WDS7:    MOV    #1,D.BOTH    ; MARK NOTHING FOUND AND DON'T TYPE INSTRUCTION
  979.     JSR    PC,D.INST    ; "TYPE" THE INSTRUCTION
  980.     DEC    D.BOTH        ; ALLOW TYPEOUT AND TEST FOUND INDICATOR
  981. D.WDS9:    BEQ    D.WDS4        ; BRANCH IF NOT FOUND
  982.     BR    D.WDS1        ; BRANCH IF FOUND
  983. D.WDS5:    CMP    R0,R5        ; EQUALITY?
  984.     BR    D.WDS9        ; BRANCH TO DECIDE
  985. D.WDS6:    MOV    (SP)+,D.CAD    ; RESTORE MOST RECENT VALUE OF D.CAD
  986.     RTS    PC        ; RETURN
  987.  
  988. ; PROCESS H - HALF WORD TYPEOUT
  989.  
  990. D.INHA:    MOV    #1,D.BW        ; SET HALF WORD MODE
  991.  
  992. ; PROCESS C - SET NUMERIC TYPEOUT
  993.  
  994. D.INNM:    MOV    #D.CADV,D.CURM    ; SET NUMERIC MODE
  995. D.INN3:    MOV    D.CURM,D.OMOD    ; SET LF AND ^ TYPEOUT MODE
  996. D.INN2:    CMPB    D.ALTF,#2    ; TWO ALTMODES TYPED?
  997.     BLT    D.CRE1        ; RETURN IF NOT
  998.     MOV    #D.CURM,R0    ; ADDRESS OF TEMPORARY TABLE
  999.     MOV    #D.PERM,R1    ; ADDRESS OF PERMANENT TABLE
  1000.  
  1001. D.SWAM:    MOV    #4,R2        ; SWAP MODES: WORD COUNTER IN R2
  1002. D.SWA2:    MOV    (R0)+,(R1)+    ; MOVE A WORD
  1003.     DEC    R2        ; DECREMENT COUNTER
  1004.     BGT    D.SWA2        ; LOOP TILL DONE
  1005.     RTS    PC        ; RETURN
  1006.  
  1007. ; PROCESS T - TEXT TYPEOUT
  1008.  
  1009. D.INTX:    MOV    #D.ASCI,D.CURM    ; DEFAULT TO ASCII
  1010.     CMP    R4,#5        ; RAD50?
  1011.     BNE    D.INN3        ; RETURN IF NOT
  1012.     MOV    #D.RADC,D.CURM    ; RAD50
  1013.     BR    D.INM1        ; RETURN
  1014.  
  1015. ; PROCESS O - BYTE TYPEOUT
  1016.  
  1017. D.BYTE:    MOV    #D.PART,D.CURM    ; IN BYTE TYPEOUT MODE
  1018.     MOV    D.DECN,D.SIZE    ; SET BYTE SIZE
  1019.     BR    D.INM1        ; RETURN
  1020.  
  1021. ; PROCESS S - INSTRUCTION TYPEOUT
  1022.  
  1023. D.INMD:    MOV    #D.INST,D.CURM    ; IN INSTRUCTION MODE
  1024. D.INM1:    MOV    #2,D.BW        ; MUST BE FULLWORD MODE
  1025.     BR    D.INN3        ; RETURN
  1026.  
  1027. ; PROCESS A - ABSOLUTE ADDRESS TYPEOUT
  1028.  
  1029. D.ABS:    MOV    #1,D.IFMT    ; SET ABSOLUTE ADDRESSING
  1030.     BR    D.INN2        ; RETURN
  1031.  
  1032. ; PROCESS R - SET RADIX
  1033.  
  1034. D.INRD:    TST    R2        ; RADIX SPECIFIED?
  1035.     BEQ    D.INR1        ; BRANCH IF NOT
  1036.     CMP    D.DECN,#2    ; MUST BE GREATER THAN 1
  1037.     BLT    D.ERRC        ; BRANCH IF NOT
  1038.     MOV    D.DECN,D.DVTB    ; ALWAYS DECIMAL RADIX
  1039.     BR    D.INN2        ; RETURN
  1040. D.INR1:    CLR    D.IFMT        ; TURN ON RELATIVE ADDRESSING
  1041.     BR    D.INN2        ; RETURN
  1042.  
  1043. ; PROCESS <CR> - CLOSE WORD AND RESET PERMANENT MODES
  1044.  
  1045. D.CRET:    JSR    PC,D.CLSE    ; CLOSE LOCATION
  1046.     MOV    #D.PERM,R0    ; ADDRESS OF PERMANENT TABLE
  1047.     MOV    #D.CURM,R1    ; ADDRESS OF TEMPORARY TABLE
  1048.     JSR    PC,D.SWAM    ; SWAP MODES
  1049.     MOV    D.CURM,D.OMOD    ; SET LF AND ^ TYPEOUT MODE
  1050. D.CRE1:    JMP    D.DCD0        ; RETURN
  1051.  
  1052. ; PROCESS > - STORE LAST WORD ADDRESS FOR SEARCH
  1053.  
  1054. D.LWAS:    MOV    R4,D.LWA    ; SET LAST WORD
  1055.     TST    R2        ; ANY WORD THERE?
  1056.     BNE    D.CRE1        ; BRANCH IF NOT
  1057.     MOV    #DDT-2,D.LWA    ; SET HIGH LAST WORD
  1058.     BR    D.CRE1        ; RETURN
  1059.  
  1060. ; PROCESS B - SET AND REMOVE BREAKPOINTS
  1061.  
  1062. D.BKPT:    TST    D.SVR2        ; DID HE GIVE A FIRST ARG?
  1063.     BEQ    D.BKP9
  1064.     ASL    R4        ; MULTIPLY NUMBER BY TWO
  1065.     MOV    D.SVR4,R5    ; GET FIRST NUMBER
  1066.     BEQ    D.BKP4        ; REMOVE BREAK IF FIRST ARG 0
  1067.     TST    (R5)        ; VALID ADDRESS? NXM IF NOT
  1068.     TST    R4        ; SPECIFIC CELL REQUESTED?
  1069.     BNE    D.BKP1        ; JUMP IF SO
  1070.     MOV    #2,R4
  1071. D.BKP3:    MOV    D.BKTB-2(R4),R0    ; IS THIS CELL FREE?
  1072.     BEQ    D.BKP2        ; JUMP IF YES
  1073.     CMP    R0,R5        ; IS BREAK ALREADY SET FOR THIS ADDRESS?
  1074.     BEQ    D.BKP2        ; BRANCH IF YES
  1075.     TST    (R4)+        ; INCREMENT BY TWO
  1076.     CMP    R4,#D.BKP*2    ; ARE WE AT THE END OF OUR ROPE?
  1077.     BLOS    D.BKP3        ; NO, KEEP LOOKING
  1078. D.BKP1:    CMP    R4,#D.BKP*2    ; REQUESTED NUMBER TOO LARGE?
  1079.     BHI    D.ERRC        ; ERROR IF TOO LARGE
  1080. D.BKP2:    MOV    R5,D.BKTB-2(R4)    ; SET BREAKPOINT
  1081.     MOV    D.COMA,D.OPEN(R4) ; SET WORD TO OPEN AT BREAKPOINT
  1082.     CLR    D.CT(R4)    ; SET CONTINUE COUNT
  1083.     CMPB    D.ALTF,#1    ; TWO ALTMODES?
  1084.     BGT    D.BKP8        ; BRANCH IF NOT
  1085.     INC    D.CT(R4)    ; DO NOT SET AUTOMATIC PROCEDE
  1086. D.BKP8:    RTS    PC        ; RETURN
  1087. D.BKP4:    TST    R2        ; IF NO NUMBER WAS TYPED...
  1088.     BEQ    D.BKP6        ; GO REMOVE ALL
  1089.     CMP    R4,#D.BKP*2    ; WAS THE TYPED NUMBER VALID?
  1090.     BHI    D.ERRC        ; JUMP IF NOT
  1091.     CLR    D.BKTB-2(R4)    ; CLEAR BREAKPOINT
  1092.     RTS    PC        ; RETURN
  1093. D.BKP5:    ASL    R4
  1094. D.BKP6:    MOV    #D.BKTB+<D.BKP*2>,R4
  1095. D.BKP7:    CLR    -(R4)
  1096.     CMP    R4,#D.BKTB
  1097.     BHI    D.BKP7
  1098.     RTS    PC        ; RETURN
  1099. D.BKP9:    TST    R2
  1100.     BEQ    D.BKP5
  1101.     DEC    R4
  1102.     CMP    R4,#D.BKP    ; WAS THE TYPED NUMBER VALID?
  1103.     BHIS    D.ERRC        ; JUMP IF NOT
  1104.     ADD    #D.BKTB-2+1,R4
  1105.     BR    D.MAS2
  1106. D.ERRC:    JMP    D.ERR        ; INTERMEDIATE HELP
  1107.  
  1108. ; PROCESS M - TYPE AND SET MASK
  1109.  
  1110. D.MAST:    MOV    #D.MASK,-(SP)    ; GET MASK
  1111.     TST    D.SVR2        ; NUMBER THERE?
  1112.     BNE    D.MAS3        ; BRANCH IF SO
  1113. D.MAS1:    MOV    (SP)+,R4    ; ADDRESS TO OPEN
  1114. D.MAS2:    JSR    PC,@D.OPER    ; COMBINE VALUE WITH CURRENT EXPRESSION
  1115.     INC    R2        ; MARK A TYPED NUMBER
  1116.     JMP    D.DCD3        ; CONTINUE SCANNING
  1117. D.MAS3:    MOV    D.SVR4,@(SP)+    ; SET MASK
  1118.     RTS    PC        ; RETURN
  1119.  
  1120. ; PROCESS V - GET CONTENTS OF D.DOT SWABBED
  1121.  
  1122. D.ALTV:    MOV    @D.DOT,R4    ; CONTENTS OF WORD
  1123.     SWAB    R4        ; SWAB IT
  1124.     BR    D.MAS2        ; RETURN
  1125.  
  1126. ; PROCESS Q - GET CONTENTS OF D.DOT
  1127.  
  1128. D.ALTQ:    MOV    @D.DOT,R4    ; CONTENTS OF WORD
  1129.     BR    D.MAS2        ; RETURN
  1130.  
  1131. ; PROCESS I - GET ADDRESS OF USER STATUS
  1132.  
  1133. D.ALTI:    MOV    #D.USTA,R4    ; ADDRESS OF STATUS
  1134.     BR    D.MAS2        ; RETURN
  1135.  
  1136. ; PROCESS " - GET TEXT
  1137.  
  1138. D.TEXT:    JSR    PC,D.GET    ; GET NEXT CHARACTER
  1139.     CLR    R2        ; RAD50/ASCII INDICATOR
  1140.     CMP    R0,#33        ; ALTMODE?
  1141.     BNE    D.TEX1        ; BRANCH IF NOT
  1142.     INC    R2        ; SET INDICATOR
  1143.     JSR    PC,D.GET    ; GET NEXT CHARACTER
  1144. D.TEX1:    MOV    R1,R5        ; DELIMETER (EXACT CHARACTER)
  1145. D.TEX2:    JSR    PC,D.GET    ; GET CHARACTER
  1146.     CMP    R1,R5        ; DELEMETER?
  1147.     BEQ    D.TEX3        ; BRANCH IF SO
  1148.     MOV    R1,R0        ; PUT IN ARGUMENT PLACE
  1149.     JSR    PC,D.PTSM    ; PUT IN SYMBOL
  1150.     BR    D.TEX2        ; LOOP
  1151. D.TEX3:    TST    R2        ; ASCII?
  1152.     BNE    D.TEX4        ; BRANCH IF NOT
  1153.     MOV    D.SYM,R4    ; GET ASCII CHARACTERS
  1154.     BR    D.MAS2        ; RETURN
  1155. D.TEX4:    MOV    #D.SYM,R0    ; ADDRESS OF FIRST THREE CHARACTERS
  1156.     JSR    PC,D.RD50    ; CONVERT TO RAD50
  1157.     MOV    R0,R4        ; NOW CURRENT VALUE
  1158.     BR    D.MAS2        ; RETURN
  1159.  
  1160. ; PROCESS <CALL> - SOFT RESTART
  1161.  
  1162.     .IF    DF,D.GDP
  1163. D.SOFT:     MOV    #1004,R5    ; ADDRESS OF SOFT RESTART
  1164.      BR    D.GO3        ; GO THERE
  1165.     .ENDC
  1166.  
  1167. ; PROCESS G - GO
  1168.  
  1169. D.GO:    MOV    D.SVR4,R5    ; GET STARTING ADDRESS
  1170.     TST    D.SVR2        ; STARTING ADDRESS SPECIFIED?
  1171.     BNE    D.GO3        ; IF NOT, USE USER SA
  1172.     MOV    JOBSA,R5    ; GET STARTING ADDRESS
  1173. D.GO3:    TST    (R5)        ; VALID ADDRESS? NXM IF NOT
  1174.     JSR    PC,D.CRLF
  1175. D.GO5:    TST    D.SD.T        ; SHOULD THE T-BIT BE ON?
  1176.     BEQ    D.GO2        ; BRANCH IF NO
  1177. D.GO4:    BIS    #20,D.USTA    ; SET T-BIT
  1178. D.GO2:    MOV    R5,D.UR7
  1179.     JSR    PC,D.REST    ; RESTORE REGISTERS
  1180. .IIF DF,D.RSX,MOV D.UDSW,$DSW    ; Restore DSW
  1181.     MOV    D.USTA,-(SP)    ;    AND STATUS
  1182.     MOV    D.UR7,-(SP)    ;    AND PC
  1183. D.GO1:
  1184. .IIF DF,D.RSX,RTT        ; Return
  1185. .IIF NDF,D.RSX,RTI            ; THIS IS "RTT" IF 11/40...
  1186.  
  1187. ; PROCESS P - PROCEED 
  1188.  
  1189. D.PROC:    TST    R2        ; CHECK FOR ILLEGAL COUNT
  1190.     BNE    D.ERRA        ; JUMP IF ILLEGAL
  1191.     MOV    D.UR7,R5    ; GET PC
  1192.     TST    (R5)        ; VALID ADDRESS? NXM IF NOT
  1193.     MOVB    D.P,R0        ; DID WE ENTER VIA A BREAK?
  1194.     BLT    D.PRO3        ; NO, RETURN TO CALLER
  1195.     MOV    D.SVR4,R4    ; GET COUNT
  1196.     TST    D.SVR2        ; WAS COUNT SPECIFIED?
  1197.     BNE    D.PRO1        ; NO
  1198.     MOV    #1,R4        ; SET COUNT OF 1
  1199. D.PRO1:    CMPB    D.ALTF,#1    ; AUTOMATIC PROCEDE?
  1200.     BLE    D.PRO6        ; BRANCH IF NOT
  1201.     NEG    R4        ; SET TO AUTOMATIC
  1202. D.PRO6:    MOV    R4,D.CT(R0)    ; PUT AWAY COUNT
  1203. D.PRO7:    JSR    PC,D.CRLF    ; CARRIAGE RETURN LINE FEED
  1204. D.PRO2:    INCB    D.T        ; SET SPECIAL BIT TO 1
  1205.     MOV    R5,D.TPC    ; SAVE PC FOR 11/40 KLUDGE
  1206.     BR    D.GO5
  1207. D.PRO3:    TST    D.SVR2        ; COUNT SPECIFIED?
  1208.     BEQ    D.GO3        ; NO, OK, RETURN TO CALLER OF DDT
  1209. D.ERRA:    JMP    D.ERR        ; ELSE ERROR
  1210. D.PRO4:    TSTB    D.MACH        ; 11/40,45?
  1211.     BEQ    D.PRO5        ; NO, DON'T NEED TO KLUDGE
  1212.     CMP    R5,D.TPC    ; DID WE NOT EXECUTE THE BROKEN INSTRUCTION?
  1213.     BEQ    D.GO4        ; YES, TRY IT AGAIN
  1214. D.PRO5:    CLRB    D.T        ; WE CAN CONTINUE NORMALLY
  1215.     TSTB    D.S        ; UNLESS WE ARE SINGLE STEPPING
  1216.     BEQ    D.GO5
  1217.     BR    D.BRK2        ; IN WHICH CASE WE BREAK IMMEDIATELY
  1218.  
  1219. ; PROCESS X - EXECUTE INSTRUCTION
  1220.  
  1221. D.EXEC:    TST    D.SVR2        ; ANY INSTRUCTION?
  1222.     BEQ    D.ERRA        ; ERROR IF NOT
  1223.     MOV    #D.SVR4,R5    ; INSTRUCTION STARTING ADDRESS
  1224.     TST    D.PARO        ; RELOCATE FIRST WORD?
  1225.     BEQ    D.EXE1        ; BRANCH IF NOT
  1226.     SUB    #D.PARS+2,D.PARS; RELOCATE FIRST WORD
  1227. D.EXE1:    TST    D.PARO+2    ; RELOCATE SECOOND WORD?
  1228.     BEQ    D.EXE3        ; BRANCH IF NOT
  1229.     SUB    #D.PARS+4,D.PARS+2 ; RELOCATE SECOND WORD
  1230. D.EXE3:    MOV    D.UR7,D.SVR7    ; SAVE PC
  1231.     BR    D.GO5        ; EXECUTE INSTRUCTION
  1232.  
  1233. D.EXE2:
  1234. .IIF NDF,D.LSI & D.RSX,MOV @#PS,D.USTA    ; [SH]GET PS
  1235. .IIF DF,D.LSI,MFPS D.USTA    ; GET PS
  1236. .IF DF,D.RSX
  1237.     JSR    PC,D.SVPS
  1238.     MOV    $DSW,D.UDSW    ;[SH]Save DSW
  1239. .ENDC ; DF,D.RSX
  1240.     MOV    D.SVR7,D.UR7    ; RESTORE CORRECT PC
  1241.     JSR    PC,D.SAVE    ; SAVE ALL REGISTERS
  1242.     BR    D.BRK8        ; RETURN
  1243.  
  1244. ; ERROR TRAPS
  1245.  
  1246. D.NXMT:    MOV    #D.NM,D.ERF    ; NXM TRAP SERVICE
  1247.     BR    D.BRK        ; HANDLE BREAKPOINT
  1248. D.ILGT:    MOV    #D.IM,D.ERF    ; ILLEGAL INSTRUCTION
  1249.  
  1250. ; BREAKPOINT HANDLER
  1251.  
  1252. D.BRK:
  1253.     MOV    (SP)+,D.UR7    ; SAVE PC AND STATUS
  1254.     BIC    #20,(SP)    ; TURN OFF T-BIT
  1255.     MOV    (SP)+,D.USTA    ; SAVE PS
  1256.     JSR    PC,D.SAVE    ; SAVE VARIOUS REGISTERS
  1257.     MOV    D.UR7,R5    ; GET PC, IT POINTS TO THE INSTRUCTION
  1258.     TST    D.ERF        ; TEST ADDRESS OF ERROR MESSAGE
  1259.     BNE    D.BRK7        ; BRANCH IF ERROR
  1260.     TSTB    D.T        ; WERE WE PROCEEDING AFTER A BREAK?
  1261.     BGT    D.PRO4        ; YES, FIX IT UP
  1262. D.BRK2:    MOV    #D.BKP*2,R4    ; GET A COUNTER
  1263.     TSTB    D.S        ; DID WE ENTER VIA BPT?
  1264.     BNE    D.BRK3
  1265.     TST    -(R5)        ; YES, BACK UP A WORD
  1266. D.BRK3:    CMP    R5,D.BKTB-2(R4)    ; IS THIS THE BPT?
  1267.     BEQ    D.BRK4        ; BRANCH IF YES
  1268.     SUB    #2,R4
  1269.     BHI    D.BRK3        ; LOOP, UNLESS DONE
  1270.     TSTB    D.S        ; SINGLE STEP MODE?
  1271.     BEQ    D.BRK6        ; NO, WE SHOULDN'T HAVE BEEN CALLED.
  1272. D.BRK4:    MOV    R5,D.UR7    ; UPDATE THE PC, IF WE DECREMENTED IT
  1273.     MOVB    R4,D.P        ; AND SET THE BREAKPOINT FLAG
  1274.     TST    D.CT(R4)    ; AUTOMATIC PROCEDE?
  1275.     BMI    D.BRK9        ; BRANCH IF GETTING THERE
  1276.     BEQ    D.BRKA        ; BRANCH IF AUTOMATIC PROCEDE
  1277.     DEC    D.CT(R4)    ; TEST REPEAT COUNT
  1278.     BLE    D.BRKC        ; BRANCH IF NO REPEAT
  1279. D.BRKD:    BR    D.PRO2        ; PROCEDE
  1280. D.BRKC:    MOV    #1,D.CT(R4)    ; RESET COUNT TO 1
  1281. D.BRKA:    MOV    D.CT(R4),-(SP)    ; SAVE COUNT
  1282.     ASR    R4        ; FIX IT
  1283.     ADD    #'0,R4        ; MAKE IT ASCII
  1284.     MOVB    R4,D.BMES+1    ; PUT IN STRING
  1285.     MOV    #D.BMES,R4    ; REST OF MESSAGE
  1286.     MOV    #D.BMES+6,R3    ; END OF MESSAGE
  1287.     JSR    PC,D.STYP    ; TYPE IT
  1288.     MOV    R5,R0        ; GET ADDRESS OF BREAK
  1289.     MOV    R5,-(SP)    ; AND SAVE IN CASE OF AUTO REPEAT
  1290.     JSR    PC,D.RFND    ; RELOCATE
  1291.     MOVB    D.P,R4        ; PROCEED ALLOWED?
  1292.     BMI    D.BRK8        ; NO
  1293.     MOV    D.OPEN(R4),R0    ; ANY WORD TO OPEN AT BREAKPOINT?
  1294.     BNE    D.BRKB        ; BRANCH IF WE DO
  1295.     MOV    D.UR7,R0    ; Otherwise use breakpoint location
  1296. D.BRKB:    MOV    R0,D.DOT    ; PUT IN CURRENT WORD
  1297.     JSR    PC,D.TTAB    ; TYPE A TAB
  1298.     JSR    PC,D.OP3    ; OPEN IT
  1299.     MOV    (SP)+,R5    ; RESTORE R5
  1300.     TST    (SP)+        ; AUTOMATIC PROCEDE?
  1301.     BNE    D.BRK8        ; RETURN IF NOT
  1302.     TSTB    @#D.RCSR    ; CHARACTER TYPED?
  1303.     BMI    D.BRK8        ; EXIT IF SO
  1304.     JMP    D.PRO7        ; CONTINUE BREAKPOINT
  1305. D.BRK9:    INC    D.CT(R4)    ; COUNT 'EM OFF
  1306.     BMI    D.BRKD        ; PROCEDE IF STILL NEGATIVE
  1307.     BR    D.BRKA        ; DO THE BREAK
  1308. D.BRK6:    MOV    #D.BE,D.ERF    ; ERROR: UNEXPECTED BREAK
  1309. D.BRK7:    MOV    D.UR7,R0    ; GET ADDRESS OF BREAK
  1310.     JSR    PC,D.RFND    ; RELOCATE
  1311.     MOV    D.ERF,R3    ; GET CODE
  1312.     MOV    R3,R4        ; OBTAIN END
  1313.     ADD    #4,R3        ; BY ADDING 4 TO BEGIN
  1314.     JSR    PC,D.STYP    ; TYPE MESSAGE
  1315.     CLR    D.ERF        ; REMOVE TRACES OF THIS ENTRY
  1316.     MOVB    #-1,D.P        ; DISALLOW PROCEED
  1317.     CLRB    D.T        ; TURN OFF BIT
  1318. D.BRK8:    JMP    D.DCD        ; RETURN
  1319.  
  1320. ; CONVERT 3 ASCII CHARACTERS AT (R0) TO RAD50 WORD IN R0
  1321.  
  1322. D.RD50:    MOV    R2,-(SP)    ; SAVE R2
  1323.     MOV    R1,-(SP)    ; SAVE R1 ALSO
  1324.     MOV    #-3,-(SP)    ; CHARACTER LOOPER
  1325.     CLR    R2        ; NOW CLEAR IT
  1326. D.RD51:    CLR    R1        ; OFFSET OF CHARACTERS
  1327. D.RD52:    CMPB    D.RDTB(R1),(R0)    ; CHARACTER MATCH?
  1328.     BEQ    D.RD53        ; BRANCH IF SO
  1329.     INC    R1        ; NEXT CHARACTER
  1330.     CMP    R1,#D.ENTB    ; AT END OF TABLE
  1331.     BLT    D.RD52        ; BRANCH IF NOT
  1332. D.ERRF:    JMP    D.ERR        ; BAD CHARACTERS
  1333. D.RD53:    ASL    R2        ; MULTIPLY BY 2
  1334.     ASL    R2        ; MULTIPLY BY 4
  1335.     ASL    R2        ; MULTIPLY BY 8
  1336.     MOV    R2,-(SP)    ; STORE AWAY
  1337.     ASL    R2        ; MULTIPLY BY 16
  1338.     ASL    R2        ; MULTIPLY BY 32
  1339.     ADD    (SP)+,R2    ; ADD 8X TO MAKE IT 40X
  1340.     ADD    R1,R2        ; PUT IN NEW CHARACTER
  1341.     INC    R0        ; POINT TO NEXT CHARACTER
  1342.     INC    (SP)        ; INCREMENT LOOPER
  1343.     BMI    D.RD51        ; BRANCH IF MORE
  1344.     TST    (SP)+        ; RESET STACK
  1345.     MOV    R2,R0        ; RESULT IN R0
  1346.     MOV    (SP)+,R1    ; RESTORE R1
  1347.     MOV    (SP)+,R2    ; RESTORE R2
  1348.     RTS    PC        ; RETURN
  1349.  
  1350. ; CONVERT RAD50 WORD IN R0 TO THREE ASCII CHARACTERS AT (R1)
  1351.  
  1352. D.CHAR:    MOV    R1,R3        ; INDEX HERE SINCE D.DIVD WILL USE R1
  1353.     MOV    #1600.,R2    ; OTHER OPERAND
  1354.     JSR    PC,D.DIVD    ; DIVIDE THEM
  1355.     MOVB    D.RDTB(R0),(R3)+; MOVE A CHARACTER IN
  1356.     MOV    #40.,R2        ; OPERAND
  1357.     MOV    R1,R0        ; GET NEW NUMERATOR
  1358.     JSR    PC,D.DIVD    ; DIVIDE THEM
  1359.     MOVB    D.RDTB(R0),(R3)+; MOVE ANOTHER CHARACTER IN
  1360.     MOVB    D.RDTB(R1),(R3)+; MOVE LAST CHARACTER IN
  1361.     MOV    R3,R1        ; RESTORE FOR THE USER
  1362.     RTS    PC        ; RETURN
  1363.  
  1364. ; SAVE THE WORLD
  1365.  
  1366. D.SAVE:    MOV    (SP)+,D.XXX    ; PICK UP RETURN ADDRESS FROM STACK
  1367.     MOV    SP,D.UR6    ; SAVE USER STACK ADDRESS
  1368.     MOV    #D.UR6,SP    ; SET TO INTERNAL STACK
  1369.     MOV    R5,-(SP)    ; SAVE
  1370.     MOV    R4,-(SP)    ; REGISTERS
  1371.     MOV    R3,-(SP)    ; 0
  1372.     MOV    R2,-(SP)    ;  THRU
  1373.     MOV    R1,-(SP)    ;      5
  1374.     MOV    R0,-(SP)    ; HERE
  1375.     .IF    DF,D.GDP
  1376.      TRAP    72        ; USECLR
  1377. D.SAV9:     NOP            ; MAY HAVE USERET
  1378.      TRAP    107        ; SCRUNB
  1379.     .ENDC
  1380.     TST    D.SD.T        ; TEST D.S AND D.T
  1381.     BNE    D.SAV3        ; SKIP BREAKPOINTS IF SO
  1382.     CLR    R4        ; REMOVE ALL BREAKPOINTS
  1383. D.SAV1:    MOV    D.BKTB(R4),R5    ; GET ADDRESS OF BREAKPOINT
  1384.     BEQ    D.SAV2        ; BRANCH IF NOT FILLED
  1385.     MOV    D.UIN(R4),(R5)    ; RESTORE USER'S INSTRUCTION
  1386. D.SAV2:    TST    (R4)+        ; LOOP
  1387.     CMP    R4,#D.BKP*2    ; AT END?
  1388.     BLT    D.SAV1        ; RE-LOOP UNTIL DONE
  1389. D.SAV3:
  1390.     .IF DF,D.RSX
  1391.     MOVB    #3,D.MACH    ;[SH] Store machine processor type
  1392.     .ENDC
  1393.       .IF    NDF,D.RSX    ;[SH]
  1394.     MOV    #340,R1        ; PS
  1395.     MOV    #4,R0        ; START FILLING AT WORD 4
  1396.     MOV    (R0),-(SP)    ; 4
  1397.     MOV    #D.SAV5,(R0)+    ; INTERNAL NXMS
  1398.     MOV    (R0),-(SP)    ; 6
  1399.     MOV    R1,(R0)+    ; SET VECTOR PS
  1400.  
  1401.     MOV    (R0),-(SP)    ; 10
  1402.     MOV    #D.SAV5,(R0)+    ; INTERRUPT FOR ILLEGAL INSTRUCTION
  1403.     MOV    (R0),-(SP)    ; 12
  1404.     MOV    R1,(R0)+    ; SET VECTOR PS
  1405.  
  1406.     MOV    #D.BRK,(R0)+    ; BPT VECTOR
  1407.     MOV    R1,(R0)        ; SET VECTOR PS
  1408.     MOV    @#D.RCSR,-(SP)    ; SAVE KEYBOARD STATUS
  1409.     CLR    @#D.RCSR    ; TURN OFF ALL INTERRUPTS
  1410.     .IF    DF,D.KSR
  1411.      MOV    @#D.TCSR,-(SP)    ; SAVE PRINTER STATUS
  1412.      CLR    @#D.TCSR    ; REMOVE ALL ENABLES
  1413.     .ENDC
  1414.     MOVB    #2,D.MACH    ; SET MACHINE TO 11/45
  1415.     SXT    R1        ; 11/40,45 INSTRUCTION
  1416.     CMPB    D.MACH,#1    ; 11/15?
  1417.     BEQ    D.SAV4        ; BRANCH IF NOT
  1418.     MOV    #RTT,D.GO1    ; USE RTT INSTRUCTION
  1419. D.SAV4:    TST    @#177772    ; WORD ONLY EXISTS ON 11/45
  1420.     MOV    #D.ERR,@#4    ; RESET NXM ADDRESS
  1421.     MOV    #D.ILGT,@#10    ; ILLEGAL INSTRUCTION
  1422.       .ENDC            ;[SH]
  1423.     JMP    @D.XXX        ; RETURN
  1424.  
  1425. D.SAV5:    DECB    D.MACH        ; IT FAILED, DIFFERENT MACHINE
  1426.     RTI            ; RETURN
  1427.  
  1428. ; RESTORE THE WORLD AS WE FOUND IT
  1429.  
  1430. D.REST:    MOV    (SP)+,D.XXX    ; GET RETURN ADDRESS FROM STACK
  1431.     TST    D.SD.T        ; TEST D.S AND D.T
  1432.     BNE    D.RES3        ; SKIP BREAKPOINTS IF SO
  1433.     MOV    #<D.BKP*2>-2,R4    ; RESTORE ALL BREAKPOINTS
  1434. D.RES1:    MOV    D.BKTB(R4),R5    ; GET ADDRESS OF BREAKPOINT
  1435.     BEQ    D.RES2        ; BRANCH IF NO BREAKPOINT
  1436.     MOV    (R5),D.UIN(R4)    ; SAVE CONTENTS OF USER LOCATION
  1437.     MOV    #BPT,(R5)    ; PUT BREAKPOINT THERE
  1438. D.RES2:    SUB    #2,R4        ; DECREMENT
  1439.     BGE    D.RES1        ; RE-LOOP UNTIL DONE
  1440. D.RES3:    MOV    #D.STK,SP    ; SET STACK POINTER TO BASE
  1441. .IIF DF,D.KSR,MOV (SP)+,@#D.TCSR; PUT TELETYPE STATUS BACK
  1442.     .IF    NDF,D.RSX    ;[SH]
  1443.     MOV    (SP)+,@#D.RCSR    ; PUT KEYBOARD STATUS BACK
  1444.     MOV    #12,R0        ; RESTORE HIS VECTORS
  1445.     MOV    (SP)+,(R0)    ; 12
  1446.     MOV    (SP)+,-(R0)    ; 10
  1447.     MOV    (SP)+,-(R0)    ; 6
  1448.     MOV    (SP)+,-(R0)    ; 4
  1449.     .ENDC            ;[SH]
  1450. .IIF DF,D.GDP,TRAP 144        ; USERET
  1451.     MOV    (SP)+,R0    ; RESTORE
  1452.     MOV    (SP)+,R1    ; USER
  1453.     MOV    (SP)+,R2    ; REGISTERS
  1454.     MOV    (SP)+,R3    ;  0
  1455.     MOV    (SP)+,R4    ;  THRU
  1456.     MOV    (SP)+,R5    ;    5
  1457.     MOV    (SP),SP        ; RESTORE USER STACK
  1458.     JMP    @D.XXX        ; AND RETURN
  1459.  
  1460. ; Get interesting PS bits (under VMS)
  1461.     PS.N=10
  1462.     PS.Z=4
  1463.     PS.V=2
  1464.     PS.C=1
  1465.  
  1466. D.SVPS:    BNE    50$        ; Z bit set?
  1467. ; Here if Z bit is set
  1468.     BPL    20$        ; N bit set?
  1469. ; Here if both Z and N are set
  1470.     BVC    10$        ; V bit set?
  1471. ; Here if Z&N&V=1
  1472.     BCC    5$        ; C bit set?
  1473. ; Here if Z&N&V&C=1
  1474.     MOV    #PS.N!PS.Z!PS.V!PS.C,D.USTA ; All bits are set, remember them
  1475.     RTS    PC        ; And return
  1476.  
  1477. ; Here if Z&N&V=1 and C=0
  1478.  
  1479. 5$:    MOV    #PS.N!PS.Z!PS.V,D.USTA ; Save the correct bits
  1480.     RTS    PC        ; And return
  1481.  
  1482. ; Here if Z&N=1 and V=0
  1483.  
  1484. 10$:    BCC    15$        ; C bit set?
  1485. ; Here if Z&N&C=1 and V=0
  1486.     MOV    #PS.N!PS.Z!PS.C,D.USTA ; Save the status
  1487.     RTS    PC        ; And return
  1488.  
  1489. ; Here if Z&N=1 and V!C=0
  1490. 15$:    MOV    #PS.N!PS.Z,D.USTA ; Save the status
  1491.     RTS    PC        ; And return
  1492.  
  1493. ; Here if Z=1 and N=0
  1494.  
  1495. 20$:    BVC    30$        ; Is V set?
  1496. ; Here if Z&V=1 and N=0
  1497.     BCC    25$        ; C set?
  1498. ; Here if Z&V&C=1 and N=0
  1499.     MOV    #PS.Z!PS.V!PS.C,D.USTA ; Save the bits
  1500.     RTS    PC
  1501.  
  1502. ; Here if Z&V=1 and N!C=0
  1503. 25$:    MOV    #PS.Z!PS.V,D.USTA ; Save the bits
  1504.     RTS    PC        ; And return
  1505.  
  1506. ; Here if Z=1 and N!V=0
  1507. 30$:    BCC    35$        ; Is C set?
  1508. ; Here if Z&C=1 and N!V=0
  1509.     MOV    #PS.Z!PS.C,D.USTA ; Save the status bits
  1510.     RTS    PC        ; And returN
  1511.  
  1512. ; Here if Z=1 and N!V!C=0
  1513. 35$:    MOV    #PS.Z,D.USTA    ; Save the status
  1514.     RTS    PC        ; And return
  1515.  
  1516. ; Here if Z=0
  1517.  
  1518. 50$:    BPL    70$        ; N bit set?
  1519. ; Here if Z=0 and N=1
  1520.     BVC    60$        ; V bit set?
  1521. ; Here if Z=0 and N&V=1
  1522.     BCC    55$        ; C bit set?
  1523. ; Here if Z=0 and N&V&C=1
  1524.     MOV    #PS.N!PS.V!PS.C,D.USTA ; All bits are set, remember them
  1525.     RTS    PC        ; And return
  1526.  
  1527. ; Here if Z!C=0 and N&V=1
  1528.  
  1529. 55$:    MOV    #PS.N!PS.V,D.USTA ; Save the correct bits
  1530.     RTS    PC        ; And return
  1531.  
  1532. ; Here if Z&N=1 and V=0
  1533.  
  1534. 60$:    BCC    65$        ; C bit set?
  1535. ; Here if Z!V=0 and N&C=1
  1536.     MOV    #PS.N!PS.C,D.USTA ; Save the status
  1537.     RTS    PC        ; And return
  1538.  
  1539. ; Here if Z!V!C=0 and N=1
  1540. 65$:    MOV    #PS.N,D.USTA ; Save the status
  1541.     RTS    PC        ; And return
  1542.  
  1543. ; Here if Z!N=0
  1544.  
  1545. 70$:    BVC    80$        ; Is V set?
  1546. ; Here if Z!N=0 and V=1
  1547.     BCC    75$        ; C set?
  1548. ; Here if Z!N=0 and V&C=1
  1549.     MOV    #PS.V!PS.C,D.USTA ; Save the bits
  1550.     RTS    PC
  1551.  
  1552. ; Here if Z!N!C=0 and V=1
  1553. 75$:    MOV    #PS.V,D.USTA ; Save the bits
  1554.     RTS    PC        ; And return
  1555.  
  1556. ; Here if Z!N!V=0
  1557. 80$:    BCC    85$        ; Is C set?
  1558. ; Here if Z!N!V=0 and C=1
  1559.     MOV    #PS.C,D.USTA ; Save the status bits
  1560.     RTS    PC        ; And returN
  1561.  
  1562. ; Here if Z!N!V!C=0
  1563. 85$:    CLR    D.USTA        ; Save the status
  1564.     RTS    PC        ; And return
  1565.  
  1566.  
  1567. ; TYPE R0 IN ADDRESS FORM
  1568.  
  1569. D.RFND:    MOV    R1,-(SP)    ; SAVE R1
  1570.     MOV    R0,-(SP)    ; SAVE ADDRESS FOR LATER
  1571.     CMP    R0,D.SVR4    ; IS IT THE ADDRESS WE ARE LOOKING FOR?
  1572.     BNE    D.RFN2        ; BRANCH IF NOT
  1573.     INCB    D.FIND        ; MARK IT FOUND
  1574. D.RFN2:    TST    D.IFMT        ; ABSOLUTE ADDRESSING?
  1575.     BNE    D.RFN7        ; BRANCH IF SO
  1576.     JSR    PC,D.GTSM    ; GET SYMBOL (IF ANY)
  1577.     TST    R1        ; ANY SYMBOL?
  1578.     BEQ    D.RFN7        ; BRANCH IF NOT
  1579.     MOV    R0,-(SP)    ; SAVE OFFSET VALUE
  1580.     MOV    #6,-(SP)    ; REPEAT COUNT
  1581. D.RFN5:    MOVB    (R1)+,R0    ; GET CHARACTER
  1582.     CMPB    R0,#40        ; IS IT A BLANK?
  1583.     BEQ    D.RFN6        ; DONE IF SO
  1584.     JSR    PC,D.TYPE    ; TYPE IT
  1585.     DEC    (SP)        ; DECREMENT COUNT
  1586.     BGT    D.RFN5        ; LOOP IF MORE
  1587. D.RFN6:    TST    (SP)+        ; RESET STACK
  1588.     MOV    (SP)+,R1    ; GET OFFSET
  1589.     BEQ    D.RFN1        ; BRANCH IF NONE
  1590.     MOV    #'+,R0        ; MAKE A PLUS
  1591.     JSR    PC,D.TYPE    ; TYPE IT
  1592.     MOV    R1,R0        ; GET OFFSET
  1593. D.RFN7:    JSR    PC,D.TYPN    ; TYPE THE NUMBER
  1594. D.RFN1:    MOV    (SP),D.LASW    ; LAST TYPED WORD
  1595.     MOV    (SP)+,D.LASV    ; LAST TYPED ADDRESS
  1596.     MOV    (SP)+,R1    ; RESTORE R1
  1597.     RTS    PC        ; RETURN
  1598.  
  1599. ; CLOSE WORD OR BYTE
  1600.  
  1601. D.CLSE:    TST    R2        ; IF NO NUMBER WAS TYPED THERE IS
  1602.     BEQ    D.CLS1        ; NOTHING TO CLOSE
  1603.     CMP    D.CAD,#177776    ; ANY OPEN WORD?
  1604.     BEQ    D.CLS1        ; BRANCH IF NOT
  1605.     CLR    D.LFIN        ; NO LINE FEED INCREMENT
  1606.     CMP    #1,D.BW        ; BYTE MODE?
  1607.     BEQ    D.CLS2        ; JUMP IF BYTE MODE
  1608.     MOV    D.CAD,R2    ; WORD ADDRESS
  1609.     MOV    R4,(R2)+    ; STORE VALUE
  1610.     MOV    R2,R4        ; PUT INTO R4 FOR COMPUTATION
  1611.     SUB    D.CADC,R4    ; SUBTRACT COPY
  1612.     BGT    D.CLS1        ; BRANCH IF NO MORE
  1613.     MOV    #2,D.LFIN    ; LINE FEED INCREMENT
  1614.     MOV    D.PARS,(R2)    ; MOVE ANOTHER WORD (2 OR 3 WORD INST)
  1615.     SUB    D.PARO,(R2)+    ; RELOCATE WORD
  1616.     TST    R4        ; THIRD PARAMETER?
  1617.     BEQ    D.CLS1        ; BRANCH IF NOT
  1618.     MOV    #4,D.LFIN    ; LINE FEED INCREMENT
  1619.     MOV    D.PARS+2,(R2)    ; PUT THIRD WORD IN
  1620.     SUB    D.PARO+2,(R2)    ; RELOCATE WORD
  1621.     BR    D.CLS1        ; FINISH UP
  1622. D.CLS2:    MOVB    R4,@D.CAD    ; STORE BYTE
  1623. D.CLS1:    MOV    #177776,D.CAD    ; CLOSE WORD
  1624.     RTS    PC        ; RETURN
  1625.  
  1626. ; SUBROUTINE TO TYPE @D.CAD IN NUMBER FORM
  1627.  
  1628. D.CADV:    CMP    #1,D.BW        ; BYTE MODE?
  1629.     BEQ    D.CAD1        ; BRANCH IF SO
  1630.     MOV    @D.CAD,R0    ; GET OPERAND
  1631.     JSR    PC,D.RFND    ; TYPE NUMBER
  1632.     BR    D.ASC2        ; RETURN
  1633. D.CAD1:    MOVB    @D.CAD,R0    ; GET OPERAND
  1634.     BIC    #177400,R0    ; CLEAR HIGH BITS
  1635.     JSR    PC,D.TYPN    ; TYPE IT
  1636.     BR    D.ASC2        ; RETURN
  1637.  
  1638. ; SUBROUTINE TO TYPE @D.CAD IN ASCII FORM
  1639.  
  1640. D.ASCI:    MOV    D.CAD,R5    ; GET ADDRESS
  1641.     MOVB    (R5)+,R0    ; GET FIRST CHARACTER
  1642.     BIC    #177400,R0    ; CLEAR HIGH BITS
  1643.     MOV    R0,D.LASV    ; LAST TYPED DATA
  1644.     MOV    R0,D.LASW    ; LAST TYPED WORD TOO
  1645.     JSR    PC,D.TYPE    ; TYPE IT
  1646.     MOVB    (R5),R0        ; GET NEXT CHARACTER
  1647.     ROR    R5        ; EXAMINE LOW BIT
  1648.     BCC    D.ASC2        ; BRANCH IF CLEAR
  1649.     JSR    PC,D.TYPE    ; TYPE IT
  1650. D.ASC3:    MOV    @D.CAD,D.LASV    ; LAST TYPED DATA
  1651.     MOV    @D.CAD,D.LASW    ; LAST TYPED WORD TOO
  1652. D.ASC2:    CLR    D.LFIN        ; TURN OFF LINE-FEED SKIPPING
  1653. D.RTS:    RTS    PC        ; RETURN
  1654.  
  1655. ; SUBROUTINE TO TYPE @D.CAD IN MULTI-BYTE FORM
  1656.  
  1657. D.PART:    MOV    @D.CAD,R5    ; GET WORD
  1658.     MOV    #16.,-(SP)    ; BIT COUNT
  1659. D.PAR5:    MOV    R5,R0        ; ACCUMULATOR FOR BYTE
  1660.     MOV    #177777,R3    ; MASK FOR BYTE
  1661.     MOV    D.SIZE,R2    ; BYTE SIZE
  1662. D.PAR1:    ASR    R5        ; REMOVE ONE BIT
  1663.     ASL    R3        ; ONE MORE BIT IN MASK
  1664.     DEC    (SP)        ; ONE LESS BIT IN WORD
  1665.     BLE    D.PAR2        ; EXIT IF DONE
  1666.     DEC    R2        ; ONE LESS BIT IN BYTE
  1667.     BGT    D.PAR1        ; LOOP IF NOT DONE
  1668. D.PAR2:    BIC    R3,R0        ; MASK WORD
  1669.     JSR    PC,D.TYPN    ; TYPE BYTE
  1670.     TST    (SP)        ; ALL DONE?
  1671.     BLE    D.PAR4        ; BRANCH IF SO
  1672.     MOV    #',,R0        ; COMMA
  1673.     JSR    PC,D.TYPE    ; TYPE IT
  1674.     BR    D.PAR5        ; GET NEXT BYTE
  1675. D.PAR4:    TST    (SP)+        ; FIX STACK
  1676.     BR    D.ASC3        ; RETURN
  1677.  
  1678. ; SUBROUTINE TO TYPE @D.CAD IN RAD50 FORM
  1679.  
  1680. D.RADC:    MOV    @D.CAD,R0    ; PUT VALUE IN R0
  1681.     MOV    #D.SYM,R1    ; ADDRESS FOR RESULT
  1682.     JSR    PC,D.CHAR    ; MAKE CHARACTERS OF IT
  1683.     MOV    #D.SYM,R4    ; ADDRESS OF FIRST CHARACTER
  1684.     MOV    #D.SYM+2,R3    ; ADDRESS OF LAST CHARACTER
  1685.     JSR    PC,D.STYP    ; TYPE THEM
  1686.     BR    D.ASC3        ; DONE
  1687.  
  1688. ; SUBROUTINE TO TYPE @D.CAD IN INSTRUCTION FORMAT
  1689.  
  1690. D.INST:    MOV    D.CAD,R5    ; PUT CURRENT ADDRESS INTO DECODE
  1691.     JSR    PC,D.TTAB    ; TYPE TAB
  1692.     JSR    PC,D.DC49    ; DECODE IT
  1693.     SUB    D.CAD,R5    ; GET INSTRUCTION LENGTH
  1694.     TST    -(R5)        ; DECREMENT TO BE OFFSET OF INSTR
  1695.     CMP    D.DOT,D.CAD    ; ARE WE AT THE DOT?
  1696.     BNE    D.INS2        ; DON'T SET INCREMENT IF NOT
  1697.     MOV    R5,D.LFIN    ; PUT IN LINE-FEED INCREMENT
  1698. D.INS2:    ASR    R5        ; DIVIDE BY TWO
  1699.     BEQ    D.INS4        ; BRANCH IF NOT ZERO
  1700.     ADD    #'1,R5        ; ASCIIZE
  1701.     MOVB    R5,D.WAMS+1    ; FILL IN NUMBER OF WORDS
  1702.     MOV    #D.WAMS,R4    ; BEGIN WARNING MESSAGE
  1703.     MOV    #D.WAMS+7,R3    ; END WARNING MESSAGE
  1704.     JSR    PC,D.TTAB    ; TYPE A TAB
  1705.     JSR    PC,D.STYP    ; TYPE IT
  1706. D.INS4:    MOV    @D.CAD,D.LASW    ; LAST TYPED WORD
  1707.     RTS    PC        ; RETURN
  1708.  
  1709. ; GET A CHARACTER INTO R0
  1710.  
  1711. D.GET:    .IF    NDF,D.KSR & D.RSX    ;[SH]
  1712.      TSTB    @#D.RCSR    ; CHARACTER TYPED?
  1713.      BPL    D.GET        ; LOOP UNTIL FOUND
  1714.      MOVB    @#D.RDB,R0    ; GET A CHARACTER
  1715.     .ENDC
  1716.     .IF    DF,D.KSR
  1717.      JSR    PC,D.POLL    ; CHECK FOR CHARACTERS IN I/O BUFFER
  1718.      CMP    D.INPU,D.OUTP    ; ANY CHARACTERS TYPED?
  1719.      BEQ    D.GET        ; LOOP IF BUFFER EMPTY
  1720.      MOVB    @D.OUTP,R0    ; GET CHARACTER FROM BUFFER
  1721.      INC    D.OUTP        ; POINT TO NEXT CHARACTER
  1722.      CMP    D.OUTP,#D.ENDB    ; AT END OF BUFFER?
  1723.      BNE    D.GET9        ; BRANCH IF NOT
  1724.      MOV    #D.BUFR,D.OUTP    ; WRAP-AROUND
  1725. D.GET9:    .ENDC
  1726. .IIF DF,D.GDP,TRAP    64    ; KEYASC
  1727. .IF    DF,D.RSX        ;[SH]
  1728.     qioW$S    #io.ral!tf.rne,terlun,#ttrefn,,#iostat,,<#RSX.CHR,#1.>
  1729.     MOV    RSX.CHR,R0        ; Read from terminal one character
  1730.                     ;   with no echo and pass all chars.
  1731.     CMPB    R0,#03        ; Check for control-C
  1732.     BEQ    D.GETA        ; If it is then branch
  1733.     CMPB    R0,#26.        ; Check for contol-Z
  1734.     BNE    D.GETB        ; If not then branch 
  1735. D.GETA:    EXIT$S            ; Exit to operating system
  1736. D.GETB:                ; Just do normal stuff
  1737.     CMPB    R0,#'`        ; Check to see if we got this character
  1738.     BNE    D.GETC        ; If not the branch
  1739.     MOV    #33,R0        ; Yes so change it to an escape since escape is
  1740. D.GETC:                ;   hard to type on a DEC 350
  1741. .ENDC                ;[SH]
  1742.     BIC    #177600,R0    ; CLEAR META, CNTL AND SHIFT STUFF
  1743.     MOV    R0,R1        ; EXACT (UNFOLDED COPY IN R1)
  1744.     BEQ    D.GET        ; IGNORE NULLS
  1745.     CMPB    R0,#15        ; SEE IF A <CR>
  1746.     BNE    D.GET2        ; BRANCH IF NOT
  1747.     MOV    #12,R0        ; LINE FEED
  1748.     JSR    PC,D.TYPE    ; TYPE IT
  1749.     MOV    #15,R0        ; RESET TO CR
  1750. D.GET2:    CMPB    R0,#177        ; IS IT A BACKSPACE
  1751.     BEQ    D.GET5        ; GUARANTEED TO GET A ?
  1752.     CMPB    R0,#'U-100    ; Control-U?
  1753.     BEQ    D.GET5        ; Yes, same as delete
  1754.     CMP    R0,#12        ; IS IT A LINE FEED?
  1755.     BEQ    D.GET1        ; IF SO, SAVE THE PAPER
  1756.     CMPB    R0,#33        ; IS IT AN ESCAPE?
  1757.     BEQ    D.GET4        ; TYPE DOLLAR SIGN IF SO
  1758.     .IF    DF,D.KSR
  1759.      CMPB    R0,#175        ; IS IT AN ALTMODE?
  1760.      BGE    D.GET4        ; TYPE DOLLAR SIGN IF SO
  1761.     .ENDC
  1762.     JSR    PC,D.TYPE    ; ECHO CHARACTER
  1763.     CMPB    #'a,R0        ; FOLD TO UPPER CASE
  1764.     BGT    D.GET1        ; BRANCH IF NOT A LETTER
  1765.     CMPB    #'z,R0        ; IS IT IN ALPHABET?
  1766.     BLT    D.GET1        ; BRANCH IF STILL NOT
  1767.     SUB    #'a-'A,R0    ; FOLD DOWN
  1768. D.GET1:    RTS    PC        ; RETURN
  1769. D.GET4:    MOV    #'$,R0        ; DOLLAR SIGN
  1770.     JSR    PC,D.TYPE    ; TYPE IT
  1771.     MOV    #33,R0        ; RESTORE R0
  1772.     RTS    PC        ; RETURN
  1773. D.GET5:    MOV    #'X,R0        ; TYPE "XXX"
  1774.     JSR    PC,D.TYPE    ; TYPE FIRST
  1775.     JSR    PC,D.TYPE    ; TYPE SECOND
  1776.     JMP    D.ERRO        ; JUMP TO LAST
  1777.     .IF    DF,D.KSR
  1778. D.POLL:     TSTB    @#D.RCSR    ; ANY CHARACTER TYPED?
  1779.      BPL    D.POL1        ; BRANCH IF NOT
  1780.      MOVB    @#D.RDB,@D.INPU    ; PUT CHARACTER IN BUFFER
  1781.      INC    D.INPU        ; NEXT
  1782.      CMP    D.INPU,#D.ENDB    ; AT END OF BUFFER?
  1783.      BNE    D.POL1        ; BRANCH IF NOT
  1784.      MOV    #D.BUFR,D.INPU    ; WRAP-AROUND
  1785. D.POL1:     RTS    PC        ; RETURN
  1786.     .ENDC
  1787.  
  1788. ; TYPE A TAB
  1789.  
  1790. D.TTAB:
  1791. .IIF    NDF,D.KSR,MOV    #11,R0    ; TAB
  1792.     .IF    DF,D.KSR
  1793.      TSTB    D.NOTY        ; IN NON-TYPEOUT MODE?
  1794.      BNE    D.TYP8        ; EXIT IF SO
  1795.      MOV    #40,R0        ; SPACE
  1796.      JSR    PC,D.TYPE    ; TYPE IT
  1797.      BITB    #7,D.CPOS    ; ON A MULTIPLE OF 8?
  1798.      BNE    D.TTAB        ; LOOP ON SPACES IF NOT
  1799.      RTS    PC        ; RETURN
  1800.     .ENDC
  1801.  
  1802. ; TYPE THE CHARACTER IN R0
  1803.  
  1804. D.TYPE:    TSTB    D.NOTY        ; SHOULD WE TYPE?
  1805.     BNE    D.TYP8        ; BRANCH IF NOT
  1806. .IIF    DF,D.GDP,TRAP    120    ; SCRRTN
  1807. .IIF    DF,D.GT40,EMT    0
  1808.     .IF    DF,D.KSR
  1809.      JSR    PC,D.TYP3    ; TYPE CHARACTER
  1810.      CMPB    R0,#15        ; CARRIAGE RETURN?
  1811.      BEQ    D.TYP2        ; ZERO POSITION COUNTER IF SO
  1812.      BITB    #140,R0        ; CONTROL CHARACTER?
  1813.      BEQ    D.TYP1        ; RETURN IF SO
  1814.      DECB    D.CPOS        ; INCREMENT CHARACTER POSITION
  1815.      BPL    D.TYP1        ; RETURN IF NOT
  1816.      MOV    R0,-(SP)    ; SAVE CHARACTER
  1817.      MOV    #15,R0        ; YES, GENERATE CARRIAGE RETURN
  1818.      JSR    PC,D.TYP3    ; TYPE IT
  1819.      MOV    #12,R0        ; AND A LINE FEED
  1820.      JSR    PC,D.TYP3    ; TYPE IT
  1821.      MOV    (SP)+,R0    ; RESTORE CHARACTER
  1822. D.TYP2:     MOVB    #71.,D.CPOS    ; CLEAR CHARACTER POSITION
  1823. D.TYP1:     RTS    PC        ; RETURN
  1824. D.TYP3:     TSTB    @#D.TCSR    ; PRINTER READY FOR CHARACTER?
  1825.      BPL    D.TYP3        ; LOOP IF NOT
  1826.      MOVB    R0,@#D.TDB    ; PUT OUT CHARACTER
  1827.      JSR    PC,D.POLL    ; CHECK FOR TYPED-IN CHARACTERS
  1828.     .ENDC
  1829.     .IF    DF,D.RSX    ;[SH]
  1830.     MOV    R0,RSX.CHR    ; Save the character for the output routine
  1831.     qiow$s    #io.wvb,terlun,#ttwefn,,#IOSTAT,,<#RSX.CHR,#1.>
  1832.                 ; Write the character to terminal
  1833.                 ;   and wait for it to output
  1834.     .ENDC            ;[SH]
  1835. D.TYP8:    RTS    PC        ; RETURN
  1836.  
  1837. ; TYPE CARRIAGE RETURN LINE FEED
  1838.  
  1839. D.CRLF:    MOV    #D.CR+1,R3    ; LWA <CR,LF>
  1840.     MOV    #D.CR,R4    ; FWA
  1841.  
  1842. ; TYPE A STRING STARTING AT R4 AND ENDING AT R3
  1843.  
  1844. D.STYP:    CMP    R3,R4        ; CHECK FOR COMPLETION
  1845.     BLO    D.GET1        ; EXIT WHEN DONE
  1846.     MOVB    (R4)+,R0    ; GET A CHARACTER
  1847.     JSR    PC,D.TYPE    ; TYPE ONE CHARACTER
  1848.     BR    D.STYP        ; LOOP UNTIL DONE
  1849.  
  1850. ; SUBROUTINE TO TYPE R0 IN CURRENT RADIX
  1851.  
  1852. D.TYPN:    MOV    R0,D.LASV    ; MARK LAST NUMBER TYPED
  1853.     MOV    R0,D.LASW    ; LAST TYPED WORD TOO
  1854.     MOV    D.DVTB,R2    ; GET RADIX
  1855.     CMP    R2,#10.        ; DECIMAL?
  1856.     BEQ    D.TYP4        ; YES
  1857. D.TYP5:    JSR    PC,D.DIVD    ; DIVIDE IT.
  1858.     ADD    #60,R1        ; CONVERT REMAINDER TO ASCII
  1859.     MOV    R1,-(SP)    ; AND SAVE IT.
  1860.     TST    R0        ; DONE?
  1861.     BEQ    D.TYP7        ; YES, TYPE THE DIGIT AND RETURN
  1862. D.TYP6:    JSR    PC,D.TYP5    ; CALL OURSELF RECURSIVELY
  1863. D.TYP7:    MOV    (SP)+,R0    ; RESTORE THE DIGIT
  1864.     BR    D.TYPE        ; PRINT IT, AND RETURN
  1865.  
  1866. D.TYP4:    MOV    #'.,-(SP)    ; PUT A . AT THE END OF THE NUMBER
  1867.     MOV    R0,R3        ; GET THE NUMBER
  1868.     BPL    D.TYP6        ; AND TYPE IF POSITIVE
  1869.     MOV    #'-,R0        ; ELSE PRINT A -
  1870.     JSR    PC,D.TYPE
  1871.     MOV    R3,R0        ; RESTORE NUMBER
  1872.     NEG    R0        ; BUT TAKE ABSOLUTE VALUE
  1873.     BR    D.TYP6
  1874.  
  1875. ; DIVISION ROUTINE - R1 (HIGH) AND R0 (LOW)/R2=R0 REMAINDER R1
  1876.  
  1877. D.DIVD:    MOV    #16.,-(SP)    ; SHIFT COUNT
  1878.     CLR    R1        ; ASSUME NO HIGH PART
  1879. D.DIV1:    ASL    R0        ; DOUBLE PRECISON SHIFT
  1880.     ROL    R1
  1881.     CMP    R2,R1        ; WILL DIVISOR GO IN?
  1882.     BHI    D.DIV2
  1883.     SUB    R2,R1
  1884.     INC    R0
  1885. D.DIV2:    DEC    (SP)
  1886.     BGT    D.DIV1        ; SOB?
  1887.     TST    (SP)+
  1888.     RTS    PC
  1889.  
  1890. ; TYPE WORD(S) AT R5 IN INSTRUCTION FORMAT
  1891.  
  1892. D.DC49:    MOV    (R5)+,R0    ; GET INSTRUCTION INTO R0
  1893.     MOV    #D.TOPS+2,R1    ; POINT TO ARRAY OF INSTRUCTION VALUES
  1894.     MOV    R0,R4        ; SAVE INSTRUCTION
  1895.     CLR    R3        ; DON'T TYPE A "B"
  1896.     BIC    #100000,R0    ; START OUT LOOKING FOR INS. WITHOUT "B"
  1897. D.LOOP:    CMP    R0,(R1)+    ; DOES INSTRUCTION FALL IN HERE?
  1898.     BHI    D.LOOP        ; NO, LOOP
  1899.     CMP    R4,R0        ; DID WE GET REAL INSTRUCTION MATCH?
  1900.     BEQ    D.FOUN        ; YES
  1901.     MOV    R4,R0        ; NO, BUT DO SO NEXT TIME
  1902.     TSTB    D.LEGS-D.TOPS-4(R1)    ; BYTE INSTRUCTION?
  1903.     BPL    D.LOOP        ; NO!
  1904.     DEC    R3        ; PRINT A  "B"
  1905. D.FOUN:    MOVB    D.LEGS-D.TOPS-4(R1),R2    ; GET LEGAL CONSIDERATION BYTE
  1906.     BIC    #177774,R2    ; CLEAR HIGH BITS
  1907.     CMPB    R2,D.MACH    ; MACHINE TYPE RIGHT?
  1908.     BGT    D.N16        ; TYPE NUMBER IF BAD
  1909.     ADD    #D.COUS-D.TOPS-4,R1    ; ADD IN ADDRESS OF STRING
  1910.     MOV    (R1)+,R2    ; GET OFFSET OF CHARACTERS
  1911.     BIC    #177400,R2    ; TURN OFF EXTRA CRUFT
  1912. D.DC6:    CMPB    R2,(R1)        ; AT END?
  1913.     BEQ    D.DC3        ; BRANCH IF SO
  1914.     MOVB    D.STRS(R2),R0    ; GET A CHARACTER
  1915.     JSR    PC,D.TYPE    ; TYPE IT
  1916.     INC    R2        ; NEXT CHARACTER
  1917.     BR    D.DC6        ; LOOP
  1918. D.DC3:    TST    R3        ; BYTE INSTRUCTION?
  1919.     BEQ    D.DONE        ; BRANCH IF NOT
  1920.     MOV    #'B,R0        ; BYTE INSTRUCTION: TYPE "B"
  1921.     JSR    PC,D.TYPE    ; TYPE IT
  1922. D.DONE:    MOVB    -(R1),R3    ; RE-GET LEGALITY BYTE
  1923.     BIC    #177703,R3    ; GET LEGAL CONSIDERATION
  1924.     CMP    R3,#10        ; TYPE A SPACE AFTER OP-CODE?
  1925.     BLE    D.NOBL        ; BRANCH IF NOT
  1926.     MOV    #' ,R0        ; SPACE
  1927.     JSR    PC,D.TYPE    ; TYPE IT
  1928. D.NOBL:    MOV    R4,R0        ; GET INSTRUCTION BACK
  1929.     ASL    R4        ; GET OPERAND THAT STARTS AT BIT 6
  1930.     ASL    R4        ; WITH TWO SHIFTS AND...
  1931.     SWAB    R4        ; A SWAB
  1932.     ASR    R3
  1933.     JMP    @D.PARM(R3)    ; TYPE PARAMETERS
  1934.  
  1935. D.DC7:    MOV    R0,R1        ; GET R1 FOR D.DC5
  1936.     ADD    #D.MOD7,R1    ; DISPLACEMENT OF OPENING CHARACTERS
  1937.     MOVB    (R1),R2        ; GET OFFSET OF CHARACTERS
  1938.     CMPB    D.FIRS(R2),#'?    ; IS IT LEGAL?
  1939.     BEQ    D.DC50        ; BRANCH IF NOT
  1940.     JSR    PC,D.DC5    ; TYPE THEM
  1941.     CMP    R0,#6        ; RELATIVE ADDRESSING?
  1942.     MOV    (R5)+,R0    ; NOTE THAT THIS LEAVES CARRY ALONE
  1943.     BCS    D.N16        ; BRANCH IF IMMEDIATE
  1944. D.N17:    ADD    R5,R0        ; FUDGE FOR RELATIVE.
  1945. D.N16:    JMP    D.RFND        ; TYPE IN CURRENT ADDRESSING MODE
  1946.  
  1947. D.SSDD:    MOV    R0,-(SP)    ; SAVE SECOND PARAMETER
  1948.     MOV    R4,R0        ; GET FIRST ONE
  1949.     JSR    PC,D.DD        ; TYPE IT
  1950.     BR    D.SS        ; DO THE REST
  1951. D.CZVN:    MOV    #D.NZVC,R1    ; LOOP ON BITS OF CODE
  1952.     MOV    R0,R2        ; SAVE OPERATION IN R2
  1953.     JSR    PC,(PC)        ; DO WHAT FOLLOWS TWICE
  1954.     JSR    PC,(PC)        ; NO, I MEAN 4 TIMES
  1955.     MOVB    (R1)+,R0    ; GET CHARACTER
  1956.     ROR    R2        ; TEST A BIT
  1957.     BCC    D.RTS2        ; BRANCH IF NOT ON
  1958.     JMP    D.TYPE        ; TYPE IT AND RETURN
  1959.  
  1960. D.N3:    BIC    #177770,R0    ; MASK OUT ALL BUT LOW 3 BITS
  1961. D.N6:    BIC    #177700,R0    ; MASK OUT ALL BUT LOW 6 BITS
  1962. D.N8:    BIC    #177400,R0    ; MASK OUT ALL BUT LOW 8 BITS
  1963.     JMP    D.TYPN        ; TYPE THE NUMBER
  1964. D.RN6:    MOV    R0,-(SP)    ; SAVE R0
  1965.     MOV    R4,R0        ; GET FIRST PARAMETER
  1966.     JSR    PC,D.R        ; TYPE AS REGISTER
  1967.     MOV    #',,R0        ; INSERT COMMA BETWEEN PARAMETERS
  1968.     JSR    PC,D.TYPE    ; TYPE IT
  1969.     MOV    (SP)+,R0    ; GET SECOND PARAMETER
  1970.     BIS    #300,R0        ; TURN ON HIGH TWO BITS IN LOW BYTE
  1971. D.X8:    MOVB    R0,R0        ; SIGN EXTEND
  1972.     ASL    R0        ; MULTIPLY BY 2
  1973.     BR    D.N17        ; DO THE REST AND RETURN
  1974. D.RDD:    MOV    R0,-(SP)    ; SAVE SECOND PARAMETER
  1975.     MOV    R4,R0        ; GET FIRST ONE
  1976.     JSR    PC,D.R        ; TYPE AS A REGISTER
  1977. D.SS:    MOV    #',,R0        ; PUT COMMA...
  1978.     JSR    PC,D.TYPE    ; ... INBETWEEN PARAMETERS
  1979.     MOV    (SP)+,R0    ; GET SECOND PARAMETER
  1980.  
  1981. D.DD:                ; THIS ROUTINE TYPES A MODE/REGISTER OPERAND IN R0
  1982.     MOV    R0,R3        ; LOW 6 BITS OF R0 HAVE MODE/REG
  1983.     BIC    #177770,R3    ; R3 HAS REGISTER
  1984.     ASR    R0        ; GET MODE
  1985.     ASR    R0        ; BY SHIFTING
  1986.     ASR    R0        ; INTO LOW BITS
  1987.     BIC    #177770,R0    ; R0 HAS MODE
  1988.     CMP    R3,#7        ; PC ADDRESSING?
  1989.     BEQ    D.DC7        ; BRANCH IF SO
  1990. D.DC50:    MOV    R0,-(SP)    ; MAKE THIS SAVED DATA
  1991.     MOV    R0,R1        ; PUT IN R1 FOR D.DC5
  1992.     ADD    #D.OPCH,R1    ; ADD IN DISPLACEMENT OF SPECIAL CHARACTERS
  1993.     JSR    PC,D.DC5    ; TYPE PRECEDING CHARACTERS
  1994.     MOV    R3,-(SP)    ; SAVE R3
  1995.     CMP    R0,#6        ; IS THERE AN INDEX?
  1996.     BLT    D.DC8        ; BRANCH IF NOT
  1997.     MOV    (R5)+,R0    ; PUT ADDRESS IN R0
  1998.     JSR    PC,D.RFND    ; TYPE ADDRESS AND OFFSET
  1999.     MOV    #'(,R0        ; PUT "(" IN OUTPUT
  2000.     JSR    PC,D.TYPE    ; TYPE IT
  2001. D.DC8:    MOV    (SP)+,R0    ; GET REGISTER
  2002.     JSR    PC,D.R        ; TYPE REGISTER NUMBER
  2003.     MOV    (SP)+,R1    ; RESTORE MODE
  2004.     ADD    #D.CLOS,R1    ; ADD IN CLOSING CHARACTERS
  2005.  
  2006. D.DC5:                ; THIS ROUTINE TYPES A STRING INDEXED BY R1
  2007.     MOV    R0,-(SP)    ; SAVE R0
  2008.     MOVB    (R1)+,R2    ; GET OFFSET OF CHARACTERS
  2009. D.DC62:    MOVB    D.FIRS(R2),R0    ; GET CHARACTER
  2010.     BEQ    D.DC4        ; SKIP IF NULL CHARACTER
  2011.     JSR    PC,D.TYPE    ; TYPE IT
  2012. D.DC4:    INC    R2        ; NEXT CHARACTER
  2013.     CMPB    R2,(R1)        ; AT END?
  2014.     BLO    D.DC62        ; BRANCH IF NOT
  2015.     MOV    (SP)+,R0    ; RETURN R0
  2016. D.RTS2:    RTS    PC        ; RETURN
  2017.  
  2018. D.DDR:    MOV    R4,-(SP)    ; SAVE FIRST PARAMETER
  2019.     JSR    PC,D.DD        ; TYPE SECOND PARAMETER
  2020.     MOV    #',,R0        ; COMMA
  2021.     JSR    PC,D.TYPE    ; TYPE IT
  2022.     MOV    (SP)+,R0    ; RESTORE REGISTER
  2023.  
  2024. D.R:                ; THIS ROUTINE TYPES A REGISTER
  2025.     BIC    #177770,R0    ; CLEAR HIGH BITS
  2026.     CMP    R0,#6        ; R5 OR LOWER?
  2027.     BLO    D.DC9        ; BRANCH IF SO
  2028.     BHI    D.DC19        ; BRANCH IF PC
  2029.     MOV    #D.SP,R1    ; "SP"
  2030.     BR    D.DC5        ; TYPE IT AND RETURN
  2031.  
  2032. D.DC19:    MOV    #D.SP+1,R1    ; "PC"
  2033.     BR    D.DC5        ; TYPE IT AND RETURN
  2034. D.DC9:    MOV    R0,-(SP)    ; SAVE R0
  2035.     MOV    #'R,R0        ; "R"
  2036.     JSR    PC,D.TYPE    ; TYPE IT
  2037.     MOV    (SP)+,R0    ; RESTORE R0
  2038.     ADD    #60,R0        ; ASCIIZE IT
  2039.     JMP    D.TYPE        ; TYPE IT AND RETURN
  2040.  
  2041. ; INSTRUCTION DECODE/ENCODE TABLE
  2042.  
  2043.     .MACRO    INSTRS
  2044. ; THE FIVE PARAMETERS TO THE CODE OP-CODE DESCRIBE AN INSTRUCTION:
  2045. ; THE FIRST PARAMETER IS THE LOWER LIMIT OF VALUES THAT WILL FALL
  2046. ;  INTO THAT OP-CODE (THE TABLE MUST BE SCANNED SEQUENTIALLY)
  2047. ; THE SECOND PARAMETER IS THE OP-CODE TEXT
  2048. ; THE THIRD PARAMETER TELLS THE MACHINE SUITABILITY
  2049. ;  0 MEANS ANY MACHINE HAS THIS INSTRUCTION.  1 MEANS
  2050. ;  11/40 AND UP ONLY, 2 MEANS 11/45 ONLY.
  2051. ; THE FOURTH PARAMETER TELLS HOW TO DECODE THE PARAMETERS:
  2052. ;   0 MEANS NO PARAMETERS
  2053. ;   1 MEANS "NNNNNN" (16 BIT NUMBER)
  2054. ;   2 MEANS DECODE CONDITION CODE BITS (NZVC)
  2055. ;   3 MEANS "N" (3 BIT NUMBER)
  2056. ;   4 MEANS "XXX" (8 BIT DISPLACEMENT)
  2057. ;   5 MEANS "R,DD"
  2058. ;   6 MEANS "NN" (6 BIT NUMBER)
  2059. ;   7 MEANS "SS,DD" (OR "DD,SS")
  2060. ;  10 MEANS "R"
  2061. ;  11 MEANS "R,NN" (6 BIT DISPLACEMENT)
  2062. ;  12 MEANS "NNN" (8 BIT NUMBER)
  2063. ;  13 MEANS "DD" (OR "SS")
  2064. ;  14 MEANS "SS,R"
  2065. ; THE FIFTH PARAMETER IS 1 IF THIS INSTRUCTION IS LEGAL IN BYTE MODE
  2066.     CODE    0,HALT,0,0,0
  2067.     CODE    1,WAIT,0,0,0
  2068.     CODE    2,RTI,0,0,0
  2069.     CODE    3,BPT,0,0,0
  2070.     CODE    4,IOT,0,0,0
  2071.     CODE    5,RESET,0,0,0
  2072.     CODE    6,RTT,1,0,0
  2073.     CODE    7,,0,1,0
  2074.     CODE    100,JMP,0,13,0
  2075.     CODE    200,RTS,0,10,0
  2076.     CODE    210,,0,1,0
  2077.     CODE    230,SPL,2,3,0
  2078.     CODE    240,NOP,0,0,0
  2079.     CODE    241,CL,0,2,0
  2080.     CODE    257,CCC,0,0,0
  2081.     CODE    260,,0,1,0
  2082.     CODE    261,SE,0,2,0
  2083.     CODE    277,SCC,0,0,0
  2084.     CODE    300,SWAB,0,13,0
  2085.     CODE    400,BR,0,4,0
  2086.     CODE    1000,BNE,0,4,0
  2087.     CODE    1400,BEQ,0,4,0
  2088.     CODE    2000,BGE,0,4,0
  2089.     CODE    2400,BLT,0,4,0
  2090.     CODE    3000,BGT,0,4,0
  2091.     CODE    3400,BLE,0,4,0
  2092.     CODE    4000,JSR,0,5,0
  2093.     CODE    5000,CLR,0,13,1
  2094.     CODE    5100,COM,0,13,1
  2095.     CODE    5200,INC,0,13,1
  2096.     CODE    5300,DEC,0,13,1
  2097.     CODE    5400,NEG,0,13,1
  2098.     CODE    5500,ADC,0,13,1
  2099.     CODE    5600,SBC,0,13,1
  2100.     CODE    5700,TST,0,13,1
  2101.     CODE    6000,ROR,0,13,1
  2102.     CODE    6100,ROL,0,13,1
  2103.     CODE    6200,ASR,0,13,1
  2104.     CODE    6300,ASL,0,13,1
  2105.     CODE    6400,MARK,1,6,0
  2106.     CODE    6500,MFPI,1,13,0
  2107.     CODE    6600,MTPI,1,13,0
  2108.     CODE    6700,SXT,1,13,0
  2109.     CODE    7000,,0,1,0
  2110.     CODE    10000,MOV,0,7,1
  2111.     CODE    20000,CMP,0,7,1
  2112.     CODE    30000,BIT,0,7,1
  2113.     CODE    40000,BIC,0,7,1
  2114.     CODE    50000,BIS,0,7,1
  2115.     CODE    60000,ADD,0,7,0
  2116.     CODE    70000,MUL,1,14,0
  2117.     CODE    71000,DIV,1,14,0
  2118.     CODE    72000,ASH,1,14,0
  2119.     CODE    73000,ASHC,1,14,0
  2120.     CODE    74000,XOR,1,5,0
  2121.     CODE    75000,FADD,1,10,0
  2122.     CODE    75010,FSUB,1,10,0
  2123.     CODE    75020,FMUL,1,10,0
  2124.     CODE    75030,FDIV,1,10,0
  2125.     CODE    75040,,0,1,0
  2126.     CODE    77000,SOB,1,11,0
  2127.     CODE    100000,BPL,0,4,0
  2128.     CODE    100400,BMI,0,4,0
  2129.     CODE    101000,BHI,0,4,0
  2130.     CODE    101400,BLOS,0,4,0
  2131.     CODE    102000,BVC,0,4,0
  2132.     CODE    102400,BVS,0,4,0
  2133.     CODE    103000,BCC,0,4,0
  2134.     CODE    103000,BHIS,0,4,0
  2135.     CODE    103400,BCS,0,4,0
  2136.     CODE    103400,BLO,0,4,0
  2137.     CODE    104000,EMT,0,12,0
  2138.     CODE    104400,TRAP,0,12,0
  2139.     CODE    105000,,0,1,0
  2140. .IIF DF,D.LSI,CODE    106400,MTPS,1,13,0
  2141.     CODE    106500,MFPD,2,13,0
  2142.     CODE    106600,MTPD,2,13,0
  2143. .IIF NDF,D.LSI,CODE    106700,,0,1,0
  2144.     .IF    DF,D.LSI
  2145.      CODE    106700,MFPS,1,13,0
  2146.      CODE    107000,,0,1,0
  2147.     .ENDC
  2148.     CODE    160000,SUB,0,7,0
  2149.     CODE    170000,,0,1,0
  2150.     CODE    177777,,0,1,0
  2151.     .ENDM
  2152.  
  2153. ; WORD ALIGNED CONSTANTS
  2154.  
  2155. D.UADD:    D.WULF            ;  UW  WULF COMMAND
  2156.     D.ONES            ;  UT  SINGLE STEP MODE
  2157. .IIF DF,D.GDP,D.GRAP        ;  UG  RETURN USER DISPLAY
  2158. D.LGDR:                ; COMMAND DISPATCH TABLE
  2159.     D.ERR            ;  @  ERROR
  2160.     D.ERR            ;  #  ERROR
  2161.     D.ERR            ;  (  ERROR
  2162.     D.ADD            ;  +   
  2163.     D.ADD            ;  <SP>
  2164.     D.MULT            ;  *  MULTIPLICATION
  2165.     D.DIV            ;  '  DIVISION
  2166.     D.SUBT            ;  -  SUBTS SIGN
  2167.     D.ERR            ;  )  ERROR
  2168.     D.TEXT            ;  "  MAKE ASCII
  2169.     D.LWAS            ;  >
  2170.     D.FWAS            ;  <  SET FIRST WORD OF SEARCH
  2171.     D.EQAL            ;  =  
  2172.     D.ALTM            ;  $  ALTMODE
  2173.     D.COLN            ;  :  DEFINES SYMBOL
  2174.     D.SEMI            ;  ;  RE-TYPE WORD
  2175.     D.WRD            ;  /  OPEN WORD
  2176.     D.BKSL            ;  \  STORE AND REFERENCE
  2177.     D.DCOM            ;  ,  COMMA PARAMETER
  2178.     D.CRET            ;  <CR>  CLOSE
  2179.     D.OP1            ;  <LF>  MODIFY, CLOSE, OPEN NEXT
  2180.     D.ORPC            ;  _  TYPE WORD AS INSTRUCTION
  2181.     D.BACK            ;  ^  OPEN PREVIOUS
  2182.     D.BACK            ;  <BS> same as ^
  2183. .IIF DF,D.GDP,D.SOFT        ;  <CALL>  SOFT RESTART AT 1004
  2184.     D.ORAB            ;  <TAB>  OPEN RELATED, ABSOLUTE
  2185.     D.OPBR            ;  [  OPEN WORD AS NUMERIC
  2186.     D.CLBR            ;  ]  OPEN WORD AS INSTRUCTION
  2187.     D.EXCL            ;  !  OPEN WORD SILENTLY
  2188.     D.ERR            ;  <SP> SECOND SPACE (ERROR)
  2189.     D.ABS            ;  A  ABSOLUTE ADDRESSES
  2190.     D.BKPT            ;  B  BREAKPOINTS
  2191.     D.INNM            ;  C  IN NUMERICS
  2192.     D.DELE            ;  D  KILL LAST SYMBOL
  2193.     D.EFF            ;  E  SEARCH EFFECTIVE ADDRESS
  2194.     D.ERR            ;  F  ERROR
  2195.     D.GO            ;  G  GO TO ADDRESS K
  2196.     D.INHA            ;  H  IN HALF WORDS
  2197.     D.ALTI            ;  I  STATUS ADDRESS
  2198.     D.ERR            ;  J  ERROR
  2199.     D.KILL            ;  K  SYMBOL TABLE DELETION
  2200.     D.ERR            ;  L  ERROR
  2201.     D.MAST            ;  M  SET MASK
  2202.     D.NSCH            ;  N  NON-SEARCH
  2203.     D.BYTE            ;  O  TYPEOUT IN BYTES
  2204.     D.PROC            ;  P  PROCEED
  2205.     D.ALTQ            ;  Q  CURRENT WORD
  2206.     D.INRD            ;  R  SET RADIX
  2207.     D.INMD            ;  S  IN INSTRUCTION MODE
  2208.     D.INTX            ;  T  IN TEXT
  2209.     D.SNGL            ;  U  SECOND SET OF ROUTINES
  2210.     D.ALTV            ;  V  SWAB OF CURRENT WORD
  2211.     D.WSCH            ;  W  SEARCH WORD
  2212.     D.EXEC            ;  X  EXECUTE INSTRUCTION
  2213.     D.ERR            ;  Y  ERROR
  2214.     D.ZERO            ;  Z  ZERO CORE
  2215. D.PARM:    D.RTS
  2216.     D.N16
  2217.     D.CZVN
  2218.     D.N3
  2219.     D.X8
  2220.     D.RDD
  2221.     D.N6
  2222.     D.SSDD
  2223.     D.R
  2224.     D.RN6
  2225.     D.N8
  2226.     D.DD
  2227.     D.DDR
  2228. D.PARG:    D.NONE            ; NO PARAMETERS
  2229.     D.NONE            ; 16-BIT NUMBER NOT AN INSTRUCTION
  2230.     D.NONE            ; CONDITION CODE ALREADY DECODED
  2231.     D.NONE            ; 3 BIT OPERAND ADDED IN AUTOMATICALLY
  2232.     D.DISP            ; GET 8-BIT DISPLACEMENT
  2233.     D.GRSS            ; GET "R,SS"
  2234.     D.GNUM            ; GET 6-BIT NUMBER (MARK OPERAND)
  2235.     D.GSD            ; GET "SS,DD"
  2236.     D.GR            ; GET "R"
  2237.     D.GRNN            ; GET "R,NN"
  2238.     D.GNUM            ; GET 8-BIT OPERAND
  2239.     D.GDD            ; GET "DD" (OR "SS")
  2240.     D.GDDR            ; GET "DD,R"
  2241.  
  2242.     .MACRO    CODE    TOP,STR,LEG,PARM,BYT
  2243.     .WORD    TOP-1
  2244.     .ENDM
  2245. D.TOPS:    INSTRS
  2246.     .WORD    -1
  2247.  
  2248.     .MACRO    CODE    TOP,STR,LEG,PARM,BYT
  2249.     .BYTE    <BYT*200>+<PARM*4>+LEG
  2250.     .NCHR    D.LEN,STR
  2251.     D.ADDR=D.ADDR+D.LEN
  2252.     .BYTE    D.ADDR
  2253.     .ENDM
  2254.     D.ADDR=0
  2255. D.COUS:    .BYTE    D.ADDR
  2256. D.LEGS:    INSTRS
  2257. D.ECNT=.-1
  2258.  
  2259.     .MACRO    CODE    TOP,STR,LEG,PARM,BYT
  2260.     .ASCII    "STR"
  2261.     .ENDM
  2262. D.STRS:    INSTRS
  2263.  
  2264. ; BYTE ALIGNED CONSTANTS
  2265.  
  2266. D.FIRS:    .ASCII    <0> "((@(-(@-(" <0> "@" <0> "))+)+))))??#@#??" <0> "@SPPC"
  2267. D.NZVC:    .ASCII    "CVZN"
  2268. D.OPCH:    .BYTE    0,1,2,3,5,7,12,13
  2269. D.CLOS:    .BYTE    14,15,16,20,22,23,24,25
  2270. D.MOD7:    .BYTE    26,27,30,31,33,34,35,36
  2271. D.SP:    .BYTE    37,41,43
  2272. D.GRET:    .ASCII    "DDT EXECUTION"
  2273. .IIF NDF,D.GDP,.ASCII "; MANUAL RESTART = "
  2274. D.GRND    =.-1
  2275. D.BE:    .ASCII    ";BPT!"
  2276. D.NM:    .ASCII    ";NXM!"
  2277. D.IM:    .ASCII    ";ILG!"
  2278. D.UTAB:    .BYTE    'W        ;  W
  2279.     .BYTE    'T        ;  T
  2280. .IIF DF,D.GDP,.BYTE 'G        ;  G
  2281. D.ENUT    =.-D.UTAB
  2282. D.LGCH:                ; FIRST CHARACTERS MUST BE "@#(+ *'-)"
  2283.     .BYTE    '@        ;  @
  2284. D.HASH    =.-D.LGCH
  2285.     .BYTE    '#        ;  #
  2286. D.OPAR    =.-D.LGCH
  2287.     .BYTE    '(        ;  (
  2288. D.ADDS    =.-D.LGCH
  2289.     .BYTE    '+        ;  +
  2290. D.SPAC    =.-D.LGCH
  2291.     .BYTE    '         ;  <SP>
  2292.     .BYTE    '*        ;  *
  2293.     .BYTE    ''        ;  '
  2294. D.DASH    =.-D.LGCH
  2295.     .BYTE    '-        ;  -
  2296. D.CPAR    =.-D.LGCH
  2297.     .BYTE    ')        ;  )
  2298.     .BYTE    '"        ;  "
  2299.     .BYTE    '>        ;  >
  2300.     .BYTE    '<        ;  <
  2301.     .BYTE    '=        ;  =
  2302.     .BYTE    33        ;  <ALT>
  2303. D.COLO    =.-D.LGCH
  2304.     .BYTE    ':        ;  :
  2305.     .BYTE    ';        ;  ;
  2306.     .BYTE    '/        ;  /
  2307.     .BYTE    '\        ;  \
  2308. D.COMM    =.-D.LGCH
  2309.     .BYTE    ',        ;  ,
  2310. D.CR:    .BYTE    15        ;  <CR>
  2311.     .BYTE    12        ;  <LF>
  2312.     .BYTE    '_        ;  _
  2313.     .BYTE    '^        ;  ^
  2314.     .BYTE    10        ; <BS>
  2315. .IIF DF,D.GDP,.BYTE    3    ;  <CALL>
  2316.     .BYTE    11        ;  <TAB>
  2317.     .BYTE    '[        ;  [
  2318.     .BYTE    ']        ;  ]
  2319.     .BYTE    '!        ;  !
  2320. D.LETR    =.-D.LGCH
  2321. D.RDTB:    .ASCII    " ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  2322. D.CLGT    =.-D.LGCH        ; COMMAND TABLE END
  2323.     .ASCII    "$.*0123456789"
  2324. D.ENTB    =.-D.RDTB
  2325.  
  2326. ; BYTE ALIGNED VARIABLES
  2327.  
  2328.     .IF    DF,D.KSR
  2329. D.CPOS:     .BYTE    71.        ; CHARACTER POSITION FOR TTY
  2330. D.BUFR:     .BLKB    25.        ; 25 CHARACTER INPUT BUFFER
  2331. D.ENDB:
  2332.     .ENDC
  2333. D.USED:    .BYTE    0        ; IF ZERO, USE OCTAL NUMBER
  2334. D.MACH:    .BYTE    1        ; 0=11/15  1=11/40  2=11/45
  2335. D.LEVL:    .BYTE    0        ; PARENTHESIS LEVEL
  2336. D.FWAF:    .BYTE    0        ; MARKER OF < PARAMETER
  2337. D.INPA:    .BYTE    0        ; NON-ZERO IF IN AN INSTRUCTION TYPE-IN
  2338. D.P:    .BYTE    -1        ; PROCEED FLAG = <1-8>*2 IF NORMAL BREAK
  2339.                 ;        0 IF SINGLE STEP BREAK
  2340.                 ;        -1 IF NOT ENTERED BY BREAK
  2341. D.ALTF:    .BYTE    0        ; ALTMODE FOUND
  2342. D.WAMS:    .ASCII    ";  WORDS"
  2343. D.BMES:    .ASCII    "$ B >> "
  2344.  
  2345. ; WORD ALIGNED VARIABLES
  2346.     .EVEN
  2347.  
  2348.     .IF    DF,D.KSR
  2349. D.INPU:     D.BUFR            ; INPUT BUFFER POINTER
  2350. D.OUTP:     D.BUFR            ; OUTPUT BUFFER POINTER
  2351.     .ENDC
  2352. D.SYM:    .BLKW    <D.SYML+1>/2    ; HOLDS SYMBOL TYPED
  2353. D.SD.T:                ; WORD ADDRESS OF D.S AND D.T
  2354. D.S:    .BYTE    0        ; SINGLE STEP FLAG
  2355. D.T:    .BYTE    0        ; T-BIT FLAG
  2356. D.BOTH:                ; WORD ADDRESS OF D.NOTY AND D.FIND
  2357. D.NOTY:    .BYTE    0        ; DON'T TYPE OUT IF EQUALS 1
  2358. D.FIND:    .BYTE    0        ; ADDRESS FOUND (EFF SEARCH) IF EQUALS 1
  2359. D.TPC:    0            ; PC OF LAST BPT WE PROCEEDED
  2360. D.LFIN:    0            ; LINE FEED INCREMENT
  2361. ; THE NEXT 4 WORDS FORM THE TEMPORARY MODE TABLE AND MUST BE IN ORDER********
  2362. D.CURM:    D.INST            ; TYPEOUT MODE ADDRESS            *****
  2363. D.DVTB:    8.            ; CURRENT RADIX                *****
  2364. D.BW:    2            ; BYTE-WORD INDICATOR (1=BYTE, 2=WORD)    *****
  2365. D.IFMT:    0            ; (1=ABSOLUTE, 0=RELATIVE)        *****
  2366. ; END OF CRITICAL ORDERING***************************************************
  2367. ; THE NEXT 4 WORDS FORM THE PERMANENT MODE TABLE AND MUST BE IN ORDER********
  2368. D.PERM:    D.INST            ; PERMANENT TYPEOUT MODE        *****
  2369. D.PERN:    8.            ; PERMANENT RADIX            *****
  2370. D.PEBW:    2            ; PERMANENT BYTE-WORD INDICATOR        *****
  2371. D.PEFM:    0            ; PERMANENT ADDRESS TYPEOUT INDICATOR    *****
  2372. ; END OF CRITICAL ORDERING***************************************************
  2373. D.OMOD:    D.INST            ; MODE TO OPEN WORDS IN
  2374. D.OPER:    0            ; OPERATION
  2375. D.DECN:    0            ; DECIMAL NUMBER
  2376. D.SVR2:    0            ; SAVE FOR R2
  2377. ; THE NEXT THREE LINES MUST BE IN THAT ORDER FOR $X INST.********************
  2378. D.SVR4:    0            ; SAVE FOR R4                *****
  2379. D.PARS:    0,0            ; PARAMETERS FOR INSTR. TYPE-IN        *****
  2380.     JMP    D.EXE2        ; RETURN IN CASE INSTRUCTION FINISHES    *****
  2381. ; END OF CRITICAL ORDERING***************************************************
  2382. D.SVR7:    0            ; SAVE FOR PC DURING $X
  2383. D.PARO:    0,0            ; RELOCATIOON FOR D.PARS
  2384. D.OFST:    0            ; OFFSET FROM COMMA
  2385. D.RFNL:    127.            ; RFND OFFSET
  2386. D.LASV:    0            ; LAST TYPED NUMBER
  2387. D.LASW:    0            ; LAST TYPED WORD
  2388. D.DOT:    0            ; CURRENT LOCATION
  2389. D.CADC:    0            ; COPY OF D.CAD FOR TYPE-IN
  2390. D.ERF:    0            ; ADDRESS OF ERROR MESSAGE
  2391. D.CAD:    0            ; CURRENT ADDRESS
  2392. D.XXX:    0            ; TEMPORARY STORAGE
  2393. D.COMA:    0            ; ADDRESS BEFORE COMMA
  2394. D.SIZE:    0            ; BYTE SIZE FOR "O" TYPEOUT
  2395. D.RAD1:    0            ; FIRST WORD OF RAD50 SYMBOL
  2396. D.RAD2:    0            ; SECOND WORD OF RAD50 SYMBOL
  2397. D.LASC:    0            ; LAST COLONED WORD
  2398. D.FENC:    D.SYMA            ; ADDRESS OF FENCE SYMBOL TABLE
  2399. D.POS:    D.SYM            ; ADDRESS OF CHARACTER IN D.SYM
  2400. D.FWA:    0            ; LOW LIMIT
  2401. D.LWA:    DDT-2            ; HIGH LIMIT
  2402. D.MASK:    177777            ; MASK
  2403.  
  2404. D.BKTB:    .REPT    D.BKP
  2405.     0            ; ADDRESS OF BREAKPOINTS
  2406.     .ENDR
  2407. D.CT:    .BLKW    D.BKP+1        ; EXTRA LOCATION FOR SINGLE STEP
  2408. D.UIN:    .BLKW    D.BKP
  2409. D.OPEN:    .BLKW    D.BKP+1        ; EXTRA LOCATION FOR SINGLE STEP
  2410.     .IF    DF,D.RSX    ;[SH]
  2411. TERLUN:    .BLKW    1        ;[SH]Terminal LUN
  2412. IOSTAT:    .BLKW    1        ;[SH] Status locations for QIOs.
  2413. IOSTA1:    .BLKW    1        ;[SH]    (Returned values)
  2414. D.UDSW:    .BLKW    1        ;[SH] Save user DSW
  2415. RSX.CHR: .BLKW    1        ;[SH] Location for tempory storage of a char.
  2416. SVDTAB:    .WORD    D.NXMT        ;[SH] Odd address or nonexistent memory error
  2417.     .WORD    D.NXMT        ;[SH] Memory protect violation
  2418.     .WORD    D.BRK        ;[SH] T-bit trap or Break-point
  2419.     .WORD    D.ILGT        ;[SH] Execution of I/O Trap
  2420.     .WORD    D.ILGT        ;[SH] Reserved instruction
  2421.     .WORD    D.ILGT        ;[SH] Non-RSX EMT instruction
  2422.     .WORD    D.ILGT        ;[SH] Trap instruction
  2423.     .WORD    D.ILGT        ;[SH] Reserved for future use
  2424. LENSVD    =    <.-SVDTAB>/2    ;[SH] Length of the table in words
  2425.     .ENDC            ;[SH]
  2426.  
  2427. ; THE DDT STACK, INCLUDING SOME VARIABLES AT ITS BASE (HIGH ADDRESSES)
  2428. ; WHICH DESCRIBE THE USER'S PROGRAM STATE:
  2429.  
  2430. ; THE FOLLOWING VARIABLES ARE CRITICALLY ORDERED FOR VARIOUS REASONS.********
  2431.     .BLKW    40.        ; ACTIVE STACK AREA            *****
  2432. D.STK:                ; BASE OF ACTIVE DDT STACK        *****
  2433. .IF NDF,D.RSX
  2434. .IIF DF,D.KSR,    0        ; SAVE CELL - R C/SR            *****
  2435.     0            ; SAVE CELL - T C/SR            *****
  2436.     0,0,0,0            ; USER LOCATION 12,10,6,4        *****
  2437. .ENDC ; .IF NDF,D.RSX
  2438. D.UR0:    0            ; USER REGISTER 0            *****
  2439. D.UR1:    0            ; USER REGISTER 1            *****
  2440. D.UR2:    0            ; USER REGISTER 2            *****
  2441. D.UR3:    0            ; USER REGISTER 3            *****
  2442. D.UR4:    0            ; USER REGISTER 4            *****
  2443. D.UR5:    0            ; USER REGISTER 5            *****
  2444. D.UR6:    0            ; USER SP                *****
  2445. D.UR7:    0            ; USER PC                *****
  2446. JOBSA:    0            ; USER START ADDRESS            *****
  2447. ; END OF CRITICALLY ORDERED VARIABLES****************************************
  2448.  
  2449. D.USTA:    0            ; USER STATUS
  2450. D.DSTA:    D.PRIO            ; DDT'S STATUS
  2451.  
  2452. D.SYMA:    .RAD50    /R0    /    ; THIS SYMBOL TABLE MUST APPEAR
  2453.     D.UR0            ; AT THE END OF DDT SINCE IT IS
  2454.     .RAD50    /R1    /    ; EXTENDED MAGICALLY BY THE LINKER
  2455.     D.UR1            ; STARTING AT ADDRESS D.SYMT
  2456.     .RAD50    /R2    /
  2457.     D.UR2
  2458.     .RAD50    /R3    /
  2459.     D.UR3
  2460.     .RAD50    /R4    /
  2461.     D.UR4
  2462.     .RAD50    /R5    /
  2463.     D.UR5
  2464.     .RAD50    /SP    /
  2465.     D.UR6
  2466.     .RAD50    /PC    /
  2467.     D.UR7
  2468.     .RAD50    /PS    /
  2469.     D.USTA
  2470.     .RAD50    /TERLUN/
  2471.     TERLUN
  2472. D.SYMT:    0,0            ; TABLE TERMINATED BY NULL SYMBOL NAME
  2473.  
  2474. .ENDC
  2475. .IIF DF,D.RSX,.END DDT
  2476. .IIF NE END$$,    .END    
  2477.  
  2478.