-
Notifications
You must be signed in to change notification settings - Fork 83
/
ddtord.1462
executable file
·4261 lines (3648 loc) · 170 KB
/
ddtord.1462
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Documentation for DDT version 1491 - Table of contents:
(For users searching for command names with EMACS,
each heading is the second line of its own page.
The first line of each page is blank.
There are no actual altmodes in this file; dollar signs are
used instead. There are no non-formatting control characters;
uparrow and a non-control character are used instead)
(The DDTDOC program also searches this file, and knows that it
uses dollar signs and uparrows rather than altmodes and control
characters. So don't change this unless you fix DDTDOC first!)
List of DDT commands
Colon commands
Built-in colon commands
Reading of filenames
Defaulting of filenames
DDT's UNAMEs and SNAMEs
Specially used symbols
Unsolicited typeouts
Unsolicited offers
Returning to DDT
Symbol table format
List of DDT commands.
Note that angle brackets are used to delimit meta-variables.
Each of the following commands that takes a prefix arg
does so in one of two ways:
If the arg is called <name>, <dev>, <user>, <prgm>, <flags>, <fn1>,
it is the syllable immediately preceding the operator.
If it is a symbol, the symbol's name is used;
otherwise it is considered to be SIXBIT for the desired name.
eg. FOO$J and $1'FOO$$J are equivalent.
All other commands evaluate all the preceding syls and ops
to get 1 to 3 arguments (separate them with $,).
^@ will terminate an execute file or valret string.
^A prints the default user's sends file.
<user>^A
prints <user>'s sends file, and sets the default for ^A and
friends.
0^A print your own sends file, and set the default to you.
$^A like ^A but for MAIL files. (but see :DDTSYM PMLFLG)
$$^A like $^A but for RMAIL, BABYL or OMAIL files. (tries both).
^B is a special interrupt-level character, which turns
on output to the wallpaper file if there is one, by zeroing
..LPTFLG. In files and valret strings, one ^B merely
counteracts one ^E, by decrementinging ..LPTFLG unless it is
zero. When a wallpaper file is open and output to it is on,
every character DDT outputs goes to it, as does every
character that DDT reads and echoes. ^B, ^E, ^V and ^W are
interpreted at interrupt level when typed on the TTY; when
present in execute files and valret strings, they are
interpreted when read. They will not be seen at any higher
level (eg. ASCII type-in); in files and valrets, they will
be ignored within :IF conditionals that fail.
^C types a CRLF but doesn't close the open location,
terminate an expression, reset the temporary mode, etc. The
CRLF will be typed even if ^W has turned off TTY output.
^C being the ITS end-of-file character, it terminates
execute files.
$$^C half-kills the last symbol typed out (not counting index
fields of instructions), then retypes $Q in the current mode
(after DDT types JRST FOO(A) , $$^C will half-kill FOO).
^D is a special character which types "XXX?" and flushes any
incompletely typed in command. If typed while a $E, $N or $W
search is in progress, the search is stopped.
^E is a special interrupt-level character which turns off output
to the wallpaper file (if any) but does not close it.
Specifically, it increments ..LPTFLG. See ^B.
^F lists the last directory referenced.
<dev>^F lists directory of device <dev>, using the :PRINT default
sname, and sets default :PRINT device (by special
dispensation, that isn't done if <dev> is TTY !). Doesn't
work if <dev> is also the name of a directory on DSK:.
In that case, you get ...
<user>^F
lists user <user>'s directory on device DSK:, and makes <user>
the default sname for :PRINT, etc. If <user> isn't a
directory, and isn't a device name either, the default sname
for :PRINT, ^F, etc. is still set. Thus, <user>^F <dev>^F
will show the directory of <dev>:<user>; even if <user> isn't
a disk directory.
0^F is the same as <msname>^F.
$^F:
<dev>$^F
is like <dev>^F but doesn't set :PRINT defaults;
just the default for ^F without argument.
<user>$^F
is like <user>^F but doesn't set the :PRINT default.
$$^F:
<arg>$$<n>^F
this is a hairy command which uses the DIR: device to print the
current default directory. The display is controlled by the table
of two-word sixbit entries beginning at DIRFN1 (and DIRFN2) inside
your DDT. For numeric argument n, the nth FN1 and FN2 are used as
DIR: arguments. If the numeric arg is omitted it is assumed to be
zero (and DDT uses the arguments at DIRFN1+0 and DIRFN2+0).
If a DIRFN2 slot is zero: if there is no argument, we use the
default :PRINT FN1; else if there is an argument we use it and
set the default :PRINT FN1. If the DIRFN2 slot has something
in it: if there is an argument, we use that argument instead.
Here follow the DIR: arguments provided in DIRFN1.
You can patch them with :SELF if you have another preference.
DIRFN1: SIXBIT /NAME1/ ;Table of $$^F DIR: search options.
DIRFN2: SIXBIT /UP/
SIXBIT /FIRST/ ;$$1^F finds FN1
0
SIXBIT /SECOND/ ;$$2^F finds FN2
SIXBIT /BIN/
SIXBIT /CDATE/ ;$$3^F ascending in creation age
SIXBIT /DOWN/
SIXBIT /SIZE/ ;$$4^F descending in size
SIXBIT /DOWN/
SIXBIT /NOT/ ;$$5^F not backed up
SIXBIT /DUMPED/
SIXBIT /ONLY/ ;$$6^F just link pointers
SIXBIT /LINKS/
Examples of use:
FOO$$1 Shows DIR:FIRST FOO and sets FN1 to FOO
LISP$$2 Shows DIR:SECOND LISP
$$2 Shows DIR:SECOND BIN
$$3 Shows DIR:CDATE DOWN
UP$$3 Shows DIR:CDATE UP
PACK13$$6 Shows DIR:ONLY PACK13
As an additional feature, if you set the DDT variable DIRDIR
to -1, $$^F (without a numeric argument) sets your default
:PRINT SNAME and otherwise ignores the argument. This lets
you look at other directories.
Examples:
$$0^F Does DIR:NAME1 UP
$$^F Still does DIR:NAME1 UP
FOOBAR$$^F Changes default dir to FOOBAR and does DIR:NAME1 UP
DOWN$$0^F Changes no defaults (now FOOBAR), does DIR:NAME1 DOWN
^G is a special interrupt level character that aborts any DDT
command. It is so powerful that it can leave DDT's data bases
in inconsistent states if typed at the wrong instant, so it
should be used only when DDT appears to be hung.
^H (back-space)
is equivalent to $J $P
<prgm>^H
continues <prgm>, creating one if necessary. If a job named
<prgm> exists, it will be $P'd (or $G'd if it was loaded but
never started). Otherwise, <prgm>^K is done: a job <prgm> is
created, and <prgm> is loaded in and started. Since ^H only
loads <prgm> if no job <prgm> already exists, ^H never
clobbers anything useful. If the existing job is disowned, it
will be reowned before being continued, of course.
$^H:
<prgm>$^H
like <prgm>^H but loads symbols if a new job is made.
^I (tab)
goes to the next line, and then "types and opens the RH of
$Q", which involves typing the RH of $Q as an address, typing
a slash, and then printing the contents of the address typed
(in the current type-out mode), just as if the "/" command had
been used.
<arg>^I deposits <arg> in the open location if any,
then types out and opens the RH of <arg>.
$^I and <arg>$^I
are like ^I, <arg>^I but use the LH rather than the RH.
$$^I and <arg>$$^I
are like ^I, <arg>^I but do an effective address calculation
on $Q or <arg> to determine the address to type and open.
^J (line-feed)
Types out and opens location .+1 (remember that "." is always
the last location opened). Unlike ".+1/", ^J does NOT push
the old value of "." onto the 'ring buffer of "."'.
<arg>^J
stores <arg> in the open location, if any, then does ^J.
$^J pops the ring buffer of point, then does ^J.
After " 100/ 200/ ", $^J would open 101 . See $^M.
<arg>$^J
stores <arg> in the open location, if any, then does $^J.
$<n>^J
pops the ring buffer of "." <n> times, then does ^J.
<arg>$<n>^J
stores <arg> in the open location, if any, then does $<n>^J.
^K:
<prgm>^K
creates a job named <prgm>, loads TS <prgm> into it without
symbols (looking for the file on your directory, the SYS
directory, the SYS1, SYS2, and SYS3 directories, the
dirs. in the sname search list), and the connected
directory, and starts it, giving it
the TTY. The program is given a null :JCL command
string. If a job named <prgm> already existed, the newly
loaded copy of <prgm> overwrites it. Since that can be a
screw, if the job was disowned, or if ..CLOBRF is
nonzero, DDT will ask the user "--Clobber Existing Job--".
After such a query, type a space to tell DDT to go ahead
and clobber the job; type anything else to abort. DDT
will query "--Reload Protected Job--" if the job is "pro-
-tected" (its ..SAFE variable has been set nonzero).
$^K loads the current job's symbols from the
file which was loaded (eg by ^K)
<prgm>$^K
is like <prgm>^K but loads the symbols.
$$^K disowns the current job. The job becomes a "disowned job"
and is no longer DDT's inferior. Anyone who wishes to
can "reown" it with $J, making it his inferior. In the
mean time, since it is no longer DDT's inferior, it will
not be harmed if DDT is logged out or killed.
An infix argument is used as the control-bits for the
DISOWN system call. Each bit controls a separate option.
The meaningful bits are these:
$$10^K
disowns the job and arranges that if it ever remains stopped
or blocked for an hour without being reowned or attached,
the system will kill it.
$$4^K disowns the current job and starts it, simultaneously
(as far as it can tell).
$$2^K makes the current job be a disowned job scheduled as part of
the system (ie sharing the system job's resource word). It is
antisocial to use the "1" and "2" bits for private purposes.
$$1^K makes the current job into a non-disowned, top level job (but
not console-controlled). Useful for resurrecting dead system
demons.
$$3^K makes the current job be a non-disowned top level job with the
system job's resource word.
^L is a special character that tells DDT to type out any input
characters that if been read but not yet fully processed,
after first typing a CRLF or clearing the screen. ^L is
ignored entirely in execute files and valret strings.
^M (carriage-return)
closes the open location if any, without changing it. Resets
the temporary (or "current") typeout mode to the permanent
mode.
<arg>^M
deposits <arg> in the open location if any, and closes it.
Resets the current typeout mode.
$^M pops the ring buffer of ".", then types and opens the new ".",
tab-style, on a new line. Does not reset the current typeout
mode to the permanent mode. After "30/ 100/ 200/", $^M would
pop the ring buffer once, opening location 100 and leaving 30
on the top of the ring buffer. A second $^M would open 30 .
<arg>$^M
stores <arg> in the open location if any, then does $^M.
$<n>^M like "$^M", but pops the ring buffer of "." <n> times instead
of once.
<arg>$<n>^M
stores <arg> in the open location, then does $<n>^M.
$$^M does nothing if no location is open. Otherwise, it unpurifies
the page containing the open location (by replacing it with an
impure copy). $$^M is superfluous unless ..UNPURF has been
zeroed.
<arg>$$^M
like $$^M but deposits <arg> in the location after unpurifying
the page.
^N proceeds one instruction, then returns to DDT.
<n>^N proceeds <n> instructions, then returns to DDT.
In "care" mode, UUOs will be treated specially - the whole
UUO handler will be executed. See $^^ command, Y flag.
$^N steps the current job one instruction, using breakpoints.
If the next instruction is a subroutine call, the whole
subroutine is executed. $^N works by putting temporary
breakpoints in the two words following the next instruction to
be executed, and then restarting the job. The temporary
breakpoints go away when either one of them is hit. If the
instruction to be executed next is a PUSHJ, the AC used and
its contents are remembered and the breakpoints will be
conditional on the AC's having the same contents. Thus, if
the PUSHJ is a recursive call all the inner recursions will
execute and return without stopping on the breakpoint.
Actually, the breakpoints don't always go immediately after
the instruction to be executed next; they start on the first
"reasonable" instruction after it ("reasonable" here means
"nonzero op-code field"). This makes it possible sometimes to
step over calls taking following arguments without taking any
special care.
$<n>^N
similar but puts the breakpoints <n> words after the insn: at
$.+<n>+1 and $.+<n>+2 . Good for calls followed by <n> args.
This form of $^N overrides DDT's search for the next
"reasonable" instruction by telling it explicitly how many
args there are.
<pc>$^N
like $^N but puts the breakpoints at <pc> and <pc>+1 and does
no special hacking for PUSHJ instructions. Also, DDT will not
be insubordinate by looking for reasonable instructions, since
it has been told explicitly what to do.
<p>,$^N
puts the breakpoints at the address in the word pointed to by
the RH of accumulator <p>. If you accidentally ^N through a
PUSHJ, <p>,$^N will proceed until after the subroutine POPJ's.
This is not considered to be an explicit specification of
where to break, so DDT looks for a reasonable instruction.
<p>,$<n>^N
is similar, but puts the breakpoints <n> words later,
overriding DDT's search for a reasonable instruction. Good
for exiting a subroutine with <n> args after the call.
-<n>(<p>)$^N
uses @-<n> ( <p> ) as the location of the first of the two
breakpoints. Like <p>,$^N except that the return address is
assumed to be <n> words down in the stack instead of at the
top.
$$^N executes one instruction at a time until the PC gets to be 1
or 2 larger than it was when the command was given. $^N is
usually equivalent, and much faster; $$^N's only advantage is
that it does not have to put breakpoints in the program.
<pc>$$^N
is like $$^N but continues till the PC is <pc> or <pc>+1.
In general, $$^N takes the same sorts of arguments as $^N.
^O <file>
deletes the specified file. It warns you what it will do,
with "(Delete File)" (but see ..DELWARN).
$^O <file1>,<file2>
link <file1> to <file2>. Whether or not this will delete the
file if it exists is controled by ..LINKP (q.v.)
if ..DELWARN is 3, or ..LINKP is 0, it is disabled.
$$^O <file1>,<file2>
renames <file1> to the name <file2>, just like :RENAME.
^P proceeds the job without giving it the TTY. If it's running,
does nothing. If it's waiting, lets it return and doesn't
start it. Normally, clears the job's %TBWAT bit, so if it
tries to use the TTY, it will interrupt and say "Job <jname>
wants the TTY". However, this feature can be overridden - see
..TWAITF
$^P is like ^P except that %TBWAT is set instead of cleared, so
that if the job tries to use the TTY it will hang dumbly until
it is $P'd. You can interchange the meaning of ^P and $^P -
see ..TWAITF
$$^P is like ^P except that the job's %TBOUT is set, giving it
permission to type out even though it can't use the TTY for
input.
^Q This is the same as ^ and is somewhat easier to type on some
terminals.
^R <file>
is equivalent to ":PRINT <file>" - the specified file is typed
on the terminal.
$^R <file1>,<file2>
is equivilent to ":COPY <file1>,<file2>" - the contents of the
first file are copied into the second file, writing over it if
it already exists.
^S is the "shut up" character. It turns off typeout at interrupt
level, but turns it on again when read. Thus it turns off
typeout for the remainder of the command currently being
processed, not permanently.
<user>^S
sets the current job's sname to <user>
$^S like <xuname>$^S; it undoes the effect of <user>$^S.
<user>$^S
causes the next ^K, ^H or :-command, if it runs a program, to
run it "as if <user> were running it". Precisely, its .XUNAME
variable will be <user> instead of you and its .HSNAME will be set to
<user>'s HSNAME. If the program follows the current convention, it
will use <user>'s init file, etc. $^S works by setting the ..TUNAME
and ..THSNAME variables.
$$^S:
<user>$$^S
sets the master system name (the "msname"), the :PRINT default
sname, and the sname for ^F, to <user>.
The master system name is used:
To initialize the snames of newly created jobs.
To initialize their $L-default snames.
Is searched last for ^K and : commands
^T makes filename-translations:
<flags>^T <file1>,<file2>
creates a translation entry for the current job, translating
<file1> to <file2>. The effect will be that if the job tries
to open <file1>, it will actually get <file2>. Any of the
names in the two files may be *, meaning "translation applies
to any name" in <file1>, "translation doesn't alter this name"
in <file2>. A translation that specifies only an SNAME in
<file1> (aside from *'s) is likely to confuse DDT and screw
you. <flags> should contain any subset of "A", "I", "O".
"A" means don't retranslate the result of applying this
translation. "I" means translate on input, "O" output. If
neither I nor O is specified, both are assumed.
Example: I^T FOO:*;* * , DSK:FOO;* *
will make any attempt by the current job to read a file from
device FOO: to read it from the disk directory named FOO;
instead. Since all four names default to *,
I^T FOO:,DSK:FOO; is a valid abbreviation.
$^T:
<flags>$^T <file1>,<file2>
creates a translation that applies to DDT
and all of its inferiors to all levels.
$$^T:
<flags>$$^T <file1>,<file2>
creates a translation for the current job and
all of its inferiors to all levels.
^U removes filename translations:
<flags>^U <file>
deletes any translation the current job may have which says
the <file> should be translated. I^U will only remove a
translation for input, and won't affect translations for
output. It will change a bidirectional translation into an
output-only translation. Note that ^U *:FOO;* * removes any
translation made on *:FOO;* *. It does NOT remove all
translations made on names containing FOO;. It would NOT undo
the effect of a ^T *:FOO;A B,C D. If you are not sure what
translations you made, do :PEEK T<cr> to see them all.
$^U:
<flags>$^U <file>
removes a translation created by $^T (one which applies to
DDT and all its inferiors).
$$^U:
<flags>$$^U <file>
removes a translation created by $$^T (one which applies to
the current job and all its inferiors).
^V is a special interrupt-level (see ^B) character that turns on
output to the TTY by zeroing ..TTYFLG . In valrets and
execute files, merely decrements ..TTYFLG by 1 (unless it is
already 0). Thus, one ^V in a valret or file cancels one ^W.
^W special interrupt-level character that turns off
typeout on the TTY by AOSing ..TTYFLG . See ^B.
^X is used to stop a job running without the TTY (after being
^P'd). ^X normally does what ^Z would do if the job had the
TTY. If the job is waiting to return, it is allowed to do so,
but if it is waiting for a chance to commit suicide it will be
stopped instead. ^X does nothing to a stopped job,
except print out the instruction where it is stopped (and
tell you it's stopped).
$^X or $^X.
(the point is required unless ..CONFRM is zero) deletes
("kills") the current job. All the data in it is lost. The $J
command is then used to select another job to be current (if
there are any); that job's name is typed out, followed by
"$J". If the job to be killed is "protected" (its ..SAFE
variable has been set nonzero), DDT will ask for confirmation
before killing it.
$<n>^X
is like $^X., except that after killing the current
job, $<n>J rather than $J is used to select another.
<job>$^X
kills the job named <job>. It asks for confirmation by typing
"--Kill--"; a space tells it to go ahead. Whether you
confirm the killing or not, the current job afterward is the
same as it was before (unless it was the one you killed).
$$^X or $$^X.
kills all jobs. The "." is required, unless ..CONFRM is zero.
Since this command is easily typed by accident instead of $^X.,
it is normally disabled, but may be turned on by ..MASSCP/-1
^Y uses $Q as an AOBJN pointer to a symbol table in the current
job's core, which should be appended to DDT's symbol table.
Make sure that every symbol has either the local bit or the
global bit (4.8 or 4.7) set; otherwise, a "DDT bug" message
may result (exceptions are allowed if the symbol table being
set up contains valid DDT-style block structure, but don't be
surprised to find that you made a mistake). See Symbol table
format.
<arg>^Y is similar but uses <arg> instead of $Q.
$^Y is like ^Y but flushes the symbols DDT already has.
<arg>$^Y
similar to ^Y.
$$^Y:
<addr>$$^Y
puts a copy of the job's symbol table into the job's core. It
assumes that <addr> is the location of an AOBJN pointer to an
old symbol table, which is to be replaced by DDT's current
one. The new symbol table is stored in core so that it ends
at the same place as the old one; expansion or contraction
occurs at the low end in core. The AOBJN pointer is updated
to record the new size. These actions are such that DDT-2$$^Y
will give the symbols to a non-timesharing DDT in the job.
^Z is not a DDT command. If given as a command to DDT, it is an
error. ^Z IS a command to ITS to give the job that owns the
TTY a fatal interrupt, if it is not a top-level job. If the
interrupted job's superior is a DDT, it will take control of
the TTY and begin reading commands as a response, but the ^Z
itself is never seen by the DDT.
^[ is altmode, which is a prefix-modifier for DDT commands.
^\ begins a patch at the location open (the location "being
patched"). It is a convenient way to replace one instruction
(at the open location) by several (the patch). The
instructions in the patch are stored in the job's "patch
area", a spare area allocated specifically to such use. Every
program should allocate one. The beginning of the patch area
is the value of PATCH if it is defined, or the value of PAT if
it is defined, or 50 . As patches are made, PATCH will be
redefined to point to the next free location in the patch
area.
A patch started with ^\ must be terminated with some variety
of ^] command, which will store first the JUMPAs back from the
patch to the patched routine (two of them, in case the patch
skips), and then a JUMPA from the location being patched to
the patch itself. This order of actions guarantees that the
patch will never appear to be "half made" in any way that that
might cause trouble in a running program.
^\ begins by typing and opening the first location of the
patch area. Then the contents of the location being patched
are typed out and left as the argument to the next command.
If you wish to include that instruction as the first
instruction of the patch, type ^J. If you wish to get rid of
it, type <rubout>. Then deposit the other instructions of the
patch, and finish with a ^] (which see).
While patching, the pseudo-location ..PATCH contains
<location being patched>,,<start of patch>.
NOTE to users of relocatable programs, and MIDAS or FAIL block
structure: PATCH is redefined in the same symbol block that
it was found in. This permits some obscure hackery, but
normally the whole program will have only one patch area, and
it must be visible to ^\ no matter which symbol block is
currently selected for type in. That can be guaranteed by
defining PATCH as a global symbol (eg, using PATCH": in
MIDAS).
<arg>^\
deposits <arg> in the open location, then does ^\. Equivalent
to ^\<rubout><arg>, except that with <arg>^\, <arg> will be
present in the location being patched while the patch is being
made.
$$^\ unmakes the patch previously made to the open location. $$^\
uses the JUMPA to the patch to find the instruction that the
patch replaced. This works only for patches made by ^\, which
were either closed by $^], or closed by ^] and having the old
instruction as the first instruction of the patch.
^] ends a patch started by ^\. Two JUMPAs back to the locations
following the one being patched are stored in the two words
starting with the open location (or in location .+1 if no
location is open). Then in the location being patched is
stored a JUMPA to the beginning of the patch. Finally, PATCH
is redefined to point at the word after the second JUMPA back
(the first free location of the patch area).
<arg>^]
stores <arg> in the open location, opens the next location,
then does ^].
$^] is like ^] but first stores the contents of the place the
patch was made from in the open location and linefeeds. It is
useful for putting a patch "before" an existing instruction.
<arg>$^]
stores <arg> in the open location, opens the next location,
then does $^].
$$^] is like $^] but omits the JUMPAs back to the place that the
patch was made from. It is useful when a patch is put on top
of a JRST or POPJ - it will store an identical JRST or POPJ,
and nothing else. $$^\ (unpatch) can't work after $$^]
because necessary information isn't there; it can however
figure out that it can't win and will complain. If this is
important, use $^] instead of $$^].
<arg>$$^]
stores <arg> in the open location, if any, then moves down
one word and does $$^].
^^ begins multi-stepping according to the job's stepping flags,
and continues indefinitely. Multi-stepping involves printing
the next instruction and executing it, repeatedly. Each step
is done with a ^N or an $^N depending on the type of
instruction and the settings of the stepping flags. Other
flags cause stepping to stop before certain kinds of
instructions. Errors, breakpoints, and .VALUE 0's will stop
stepping. So will typing any character while DDT is typing
the next instruction to step over. ..DOZTIM holds the number
of seconds that ^^ will insist must elapse between steps, to
give the user a chance to decide whether to type a character
and stop things. While multi-stepping, the SETAI instruction
(a no-op) invokes a special kludge for making specific
subroutines appear to be single instructions during
multi-stepping. If the first instruction of a subroutine is
an appropriately coded SETAI instruction (rules follow below),
then after multi-stepping steps through the call to the
subroutine, it will see the SETAI and immediately proceed
(with $^N) to the subroutine's return address. Note that
there is a stepping flag (see $^^ below) that causes ALL
subroutine calls to be treated as single instructions; the
purpose of the SETAI crock is to make only some subroutines
act that way. One might assemble a program with a SETAI at
every entry point and patch the SETAI's of some subroutines
into JFCL's, when they are themselves being debugged. The
SETAI instruction should address a word which contains the
subroutine's return address. For subroutines called by PUSHJ
P, use SETAI (P). For subroutines called by JSP T, use SETAI
T. For subroutines called by JSR use SETAI .-1. Note that
SETAI is not special with ^N - only with ^^.
<n>^^ like ^^ but will stop after the <n>'th step
if nothing stops it earlier.
$^^:
<flags>$^^
like ^^ but first changes the job's stepping flags according
to the letters in <flags> (which must be 6 chars or less).
The letters that mean something are:
B step over a subroutine call in one step with $^N.
C stop before a subroutine call.
(subroutine calls are PUSHJ, JSP, JSR, JSA)
D step over subroutine calls with ^N and
then step through the subroutine.
J stop before jump instructions.
K ^N over jumps.
M stop before monitor calls.
N ^N over monitor calls, but $^N over a .VALUE
P print each insn before stepping over it (normal state)
Q print insn only when stepping stops before it.
R stop before subroutine returns (POPJ and JRA).
S ^N over subroutine returns.
U treat user UUOs as subroutine calls.
V $^N over user UUOs.
W stop before user UUOs.
X ^N thru user UUOs (and step thru UUO handler).
Y enter "care" mode in which ^N'ing thru a UUO whether
or not as a result of a ^^, will cause the saved PC in
the UUO handler to have its 1-proceed flag set, and
the whole UUO handler to be executed as if it were one
instruction, returning whenever the UUO handler
restores the flags (with JRST 2,).
Z leaves "care" mode.
Each job has its flags, which are updated by $^^ and used by
^^. The flags are initialized when the job is created, from
the new-job-default flags, which are initially 'BPUZ' but may
be changed with $$^^ (which might well go in an INIT file).
<n> <flags>$^^
combines <flags>$^^ and <n>^^
<flags>$$^^
sets the new-job-default stepping flags according to the
letters in <flags>. Does not actually do any stepping.
<flags>$$0^^
sets the current job's stepping flags according to
the new-job-default and the letters in <flags>.
$ (altmode-space)
separates prefix command arguments, like altmode-comma.
^_ Incluseive or.
! divides. Priority 2.
$! floating divides. Priority 2. If unary, reciprocates.
$$! or <arg>$$!
opens a location as / or <arg>/ would, but doesn't type the
contents. $Q is set, however. Future ^J, ^, and ^I commands
will also not type the contents of the locations they open,
until a /, [ or ] command is used.
" retypes $Q in the " typeout mode, initially ASCII mode.
<arg>" retypes <arg> in " typeout mode.
$" selects the " typeout mode temporarily. The " mode is
controlled by the per-job variable ..TDQUOT. Unless
explicitly changed, it is full-word ASCII typeout:
ASCII/<foo>/ is printed as $0"<foo>$ . ASCII/<foo>/+1 appears
as $1"<foo>$ (the digit is the word's low bit). ^Q and ^ are
typed out with an extra ^Q in front. Other control characters
are typed out as an uparrow followed by the un-controlified
character. Rubout is typed out as "^?". See the section on
typeout modes.
$<n>"<foo>$
is an ASCII syllable whose value is ASCII/<foo>/+1&<n> (that
is, <n> specifies the word's low bit). To put a control
character in <foo>, use uparrow (eg. uparrow and A for
control-A), or preceded the control character with a ^Q. To
put in an uparrow or altmode, precede it by ^Q. A rubout
typed in immediately after a ^Q will be quoted, but a ^Q will
be rubbed out if other characters were typed in and rubbed out
in between. Rubout may be typed in as uparrow-questionmark.
$$" specifies " typeout mode as the current mode permanently, so
that ^M will not undo it.
$$<n>"
is used for multi-word ASCII type-in. It acts just like $<n>"
if 5 or fewer characters are typed. When the sixth character
is typed, the first five are deposited in the open location
and the location after it is opened. This is repeated for as
many words as it takes to store the whole string of
characters.
# if there is anything before the #, it means exclusive-or;
otherwise, it retypes $Q in # mode.
$# temporarily selects the # typeout mode, This mode is
controlled by the per-job variable ..TNMSGN. Unless it has
been explicitly changed, it is single-character ASCII typeout
mode. A value types out as $1# followed by the ASCII
character in the low 7 bits. Thus MIDAS's "A is typed as $1#A.
MIDAS's ^A (uparrow-a) is typed out as $1#^A . Rubout
comes out as uparrow-questionmark. If the number to be typed
out goes over the bottom 7 bits, the bottom 7 bits are typed
as a character and the rest as an instruction; MOVEI B,101
comes out as "MOVEI B, $1#A".
$1# used for single character type-in. Follow it by the character
(uparrow and ^Q quote as with $1"). The result is a syllable
whose value is the ASCII for that character. Thus, "$1#A"
means 101 .
$$# specifies # typeout mode as the current mode
permanently, so that ^M will not undo it.
$ (dollarsign)
is not a DDT command in itself, since it is a symbol constituent
(just like letters).
$$ (altmode dollarsign)
temporarily selects $ typeout mode.
That mode, held in ..TDOLLA, is initially symbolic mode (same
as $S). This command is useful only if the $ mode is changed
to a user defined typeout mode.
$$$ (altmode altmode dollarsign)
specifies $ typeout mode as the current mode permanently,
so that ^M will not undo it.
% is not a DDT command in itself, since it is a symbol
constituent (just like letters).
$% temporarily selects the % typeout mode. That mode is kept in
the current job's ..TPERCE variable and is initially symbolic
mode (same as $S). This command is useful only if the % mode
is changed to a user defined typeout mode.
$$% specifies % typeout mode as the current mode permanently, so
that ^M will not undo it.
& if not first thing typed, does logical-and, Priority 3.
If not preceded by args, retypes $Q in & mode.
$& temporarily selects & typeout mode. This mode, held in the
current job's ..TAMPER, is initialized to SQUOZE mode in each
new job. In SQUOZE mode, SQUOZE <n>,<sym> types out as
$<n>&<sym>
$<n>&<sym>
a syllable whose value is the SQUOZE for <sym>, with <n> in
the flags. <n> should be from 0 to 74; the two lowest bits
of <n> are ignored.
$$& specifies & typeout mode as the current mode permanently, so
that ^M will not undo it.
' retypes $Q in ' mode (normally SIXBIT mode).
<arg>' retypes <arg> in ' mode.
$' temporarily selects ' typeout mode. This mode, held in
..TPRIME, is initially SIXBIT mode, in which SIXBIT/<foo>/
types out as $1'<foo>$ .
$1'<foo>$
is a SIXBIT syllable whose value is SIXBIT/<foo>/ .
Only the first 6 characters of <foo> are significant.
$$' specifies ' typeout mode as the current mode permanently, so
that ^M will not undo it.
$$1' is used for multi-word SIXBIT type-in. A cross between $1'
and $$1". Uparrow is not special.
( and )
are used for putting a value in an instruction's index field,
or, more generally, for swapping the halves of a word-long
value. DDT treats the value inside the parentheses just as
MIDAS does: if the ( is preceded by an arithmetic operator,
the parentheses and all between them act like one syllable
whose value is the value of that word with its right and left
halves interchanged. Otherwise, the two halves of that word
are added into the opposite halves of the word within which
the parentheses occur, in an otherwise invisible manner. That
is, the argument evaluator's state is the same after the ) as
it was before the (.
$( and $)
these are ignored completely (they can't even be rubbed out).
useful with conditionals (see :IF)
$$( starts a literal. Use this when typing in an expression to
stand for the address of a literal whose data you will specify
later. DDT will type out a symbol name and a closeparen;
the expression you are typing will contain a forward reference
to that symbol, which will become the address of the literal.
As soon as it is safe (no location is open, and no literal or
patch is being defined), DDT will assign that symbol the
address of the patch area and open it, so you can fill in the
data of the literal. Deposit the last word of the literal
with a $$), which will update PATCH and set "." to what it
was before DDT opened the literal. This scheme causes
recursive literals to work fine - the inner literal will
not be opened until you close the outer one, since DDT
can't tell where to start a literal while another literal
is being typed in. When you have a delay between the $$(
and the opening of the literal, the symbol assigned by DDT
will allow you to match the definitions up with the uses.
$$) Closes a literal. Defines PATCH to be the open location,
or, if none is open, to .+1.
Says that no literal is in progress, which may cause DDT
to ask for the definition of some other literal.
<arg>$$)
is equivalent to <arg> <linefeed> $$). It deposits <arg>,
then sets PATCH to .+1.
* multiplies. Priority 2.
$* floating multiplies. Priority 2.
+ adds. Priority 1.
$+ floating adds. Priority 1.
, (comma)
is used to separate fields in a word. Space also does so.
The significance of the fields in a word depend on the pattern
of spaces and commas. Usually the value of the word is that
of the first field, with all the other fields added into the
RH. However, if the first field is followed by two commas, it
is put in the left half, and otherwise if followed by one
comma, it is put in the AC field. If a space separates the
first two fields and a comma ends the second the second is
added into the AC field rather than the RH. Examples:
<lh>,, truncates <lh> to 18. bits and puts it in the left half.
<lh>,,<rh>
halfword type-in format. <lh> is put in the left half, and
<rh> in the right half. Each is truncated to 18. bits first.
<insn> <ac>,
a format which adds <ac> into the AC field of <insn>.
<insn> <ac>,<addr>
a format like <insn> <ac>, but adds <addr> to the right half.
<ac>, a format which results in <ac> in the AC field.
<ac>,<addr>
puts <ac> in the AC field and <addr> in the address field.
$, separates multiple args to one operator.
- subtracts. Priority 1. If unary, negates.
$- floating subtracts. Priority 1. Or, floating negates.
. is a symbol whose value is usually the last location opened
(except that \, etc., open but don't set ). Whenever "." is
randomly changed, the old value is saved in a ring buffer with
8 slots. $^M, $^J and $^ reopen the previous value of .,
(plus or minus one for $^J or $^) ^J and ^ increment and
decrement the current value of ., rather than pushing the old
value.
$. has as its value the current job's user mode PC.
/ opens the location addressed by the RH of $Q. This means that
various commands including ^M will store into that location.
More immediately, it means that the location's contents will
be typed out in the current mode and will be the new value of
$Q. Also, the location itself will be "pushed onto the ring
buffer of ." meaning that .'s value is now that location, but
$^M, etc. can reopen the previous value of ".". (This will
not be done if the location just opened is the same as the
previous value of .)
<arg>/ opens the location addressed by the RH of <arg>.
$/ or <arg>$/
opens the location addressed by the LH of $Q or <arg>.
$$/ or <arg>$$/
does a PDP-10-style address calculation on $Q or <arg>
to determine what location to open.
: defines symbols:
<sym>: defines <sym> to have the same value "." currently has. If
the symbol is already defined in the current block or any
containing block, it will be redefined in the same block.
Otherwise it will be defined in the current block.
<arg> <sym>:
defines <sym> to have the value <arg>.
$: selects symbol table blocks:
<block>$:
selects the symbols in block or program <block>.
$$:
<block>$$:
like <block>$: but insists on finding a block directly
inferior to the currently selected one. Useful for resolving
the ambiguity, when several blocks or programs have the same
name.
; retypes $Q in the "semicolon mode", temporarily decrementing
..TTYFLG by 1, so it takes two ^W's to suppress the printout.
(Useful in execute files that shouldn't echo their contents,
but want to type stuff). The semicolon mode is the most
recently specified temporary or permanent typeout mode, even
if it was only a temporary mode which was later reset to the
permanent mode, e.g., $S sets the temporary mode and the
semicolon mode to symbolic. A carriage return will reset the
temporary mode to the permanent mode but the semicolon mode
will remain symbolic.
<arg>; is similar but retypes <arg>, not $Q.
$; and <arg>$;
are like ; and <arg>; but also reset the temporary mode from
the semicolon mode, and don't temporarily SOS ..TTYFLG.
$$; and <arg>$$;
are similar but also set the permanent mode.
> and < (angle brackets)
are like algebra's parentheses. > can be used to terminate
an expression read in by a colon command (as can a carriage
return).
$< and >
surround an expression to be used as an infix argument in an
operator. For example, $<1+1>R is equivalent to $2R
$$< and >
are similar, for operators with two altmodes.
= retypes $Q as a number in the current radix.
<arg>= retypes <arg> instead.
$<r>= retypes $Q as a number in radix <r>.
<arg>$<r>=
retypes <arg> instead.
$= retypes $Q as a floating point number.
<arg>$= retypes <arg> instead.
$$= retypes up to three arguments in the modes used to input them.
$> when changing part of an instruction, saves typing
the unchanged parts:
<arg>$>
takes those parts of <arg> that are nonzero, or which are
known to have been explicitly specified; takes the other
parts of a word from $Q, and returns the sum. The parts of a
word used are:
op code 777000,,
ac-field 740,,
indirect bit 20,,
index-field 17,,
address right half.
The $> may actually appear anywhere within the argument,
because it does nothing but set a flag when the evaluation
happens. If an undefined symbol is used (with "?") in either