110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
-
+
|
* `DEFINE` macro definition system
* automatic off-page link generation
* literals in the current page via `(NN)` syntax or in page zero via `[NN]`; closing paren/bracket optional
* more operators in expressions:
* `!` for Boolean OR (the ASR-33 terminal character set [did not include the ¦ character][cs33])
* `&` for Boolean AND
* single-character ASCII constants: `"A`
* single-character ASCII constants: `"A"`; closing quote optional
* other new pseudo-ops:
* `DUBL`: define double-precision integer constant
* `FLTG`: define double-precision floating-point constant
* `PAGE`: [re]set the location counter to the top of the given page
* `TEXT`: convert a literal string in the program text to 6-bit packed ASCII in the binary output
The `DEFINE` feature is clearly this assembler's marquee feature, but it is the rest of the list that should open your eyes: all of these features except for `DUBL` and `FLTG` were later adopted as-is into the PAL family.
|
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
|
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
|
+
-
-
-
-
+
-
-
+
+
-
+
|
4K PAL-D added only one new feature to the PDP-8 assembler family: the `XLIST` pseudo-op, which lets the programmer stop and then re-start the assembly listing in the optional third pass.
4K PAL-D is more notable for the features it brought into the PAL family from [MACRO-8](#macro-8):
* literals
* off-page link generation
* Boolean operators in expressions
* the `PAGE` and `TEXT` pseudo-ops
* more operators in expressions:
* `!` for Boolean OR (the ASR-33 terminal character set [did not include the ¦ character][cs33])
* `&` for Boolean AND
8K PAL-D added several more features relative to the 4K version:
* ability to run in 8K or 12K of core, allowing assembly of larger programs
* more pseudo-operations:
* `EJECT`: emit a form feed in the listing output
* `IFDEF` and `IFZERO`: conditional assembly tests; affected statements in angle brackets
* `NOPUNCH` and `ENPUNCH`: stop and restart assembled machine code output
* `ZBLOCK`: reserve memory, setting initial values to zero
Note that neither version of PAL-D brought over the `DEFINE`, `DUBL` or `FLTG` pseudo-ops from MACRO-8.
Notice also that the negated forms of the conditional assembly operations did not appear until later. The first reference I've been able to find for `IFNZRO` and `IFNDEF` is in connection with [PAL8](#pal8).
We find evidence for a complicated development history in the `PUNCH` and `XLIST` pseudo-ops. They do much the same thing, only for different passes of the assembler, yet the form of the ops differ. If this assembler was created by a single mind in a single time and place, or if it were created by a standards committee with a mandate to simplify and unify, you would expect these two sets of pseudo-ops to have similar names and forms, either `XPUNCH` taking an argument or a `NOLIST`/`ENLIST` pair. We can infer different minds behind the 4K and 8K versions of PAL-D.
The `PUNCH` op names also suggest that the operation is mainly useful for paper tape output, still an important I/O device when PAL-D was new. We can find it mentioned in the PAL8 section of [the OS/8 Handbook (1974 ed.)][os8m], but it was airbrushed out of history by the [1979 edition for OS/78][os78m], suggesting that the purpose of these pseudo-ops became effectively redundant after the bulk of the market moved to disk-based PDP-8 systems such as the [DECstation 78][ds78], a microcontroller based PDP-8 merged with a VT52 video terminal, which effectively replaced the teletype + paper tape reader/punch most often used with earlier PDP-8 systems. (Thus the renaming of "OS/8" to "OS/78," by the way.)
The `PUNCH` op names also suggest that the operation is mainly useful for paper tape output, still an important I/O device when PAL-D was new. We can find it mentioned in the PAL8 section of [the OS/8 Handbook (1974 ed.)][os8m], but it was airbrushed out of history by the [1979 edition for OS/78][os78m], suggesting that the purpose of these pseudo-ops became effectively redundant after the bulk of the market moved to disk-based PDP-8 systems such as the [DECstation 78][ds78], a microcontroller-based PDP-8 merged with a VT52 video terminal, which effectively replaced the teletype + paper tape reader/punch most often used with earlier PDP-8 systems. (Thus the renaming of "OS/8" to "OS/78," by the way.)
Like MACRO-8, PAL-D does not have the `FIXMRI` pseudo-op.
[cs33]: http://iclces.uk/articles/a_teletype_font.html
[ds78]: https://en.wikipedia.org/wiki/DECstation#DECstation_78
## <a id="os8"></a>The OS/8 Assemblers
| **Introduced** | 1971
| **Manual** | most any OS/8 manual, such as the [OS/8 Handbook][os8m] (1974 ed.) or its [successor for OS/78][os78m] (1979 ed.)
| **Introduced** | 1971, collectively
| **Manual** | most any OS/8 manual, such as the OS/8 Handbook: [1974 ed.][os8m] or [1979 ed. for OS/78][os78m]
| **Delivery** | part of OS/8
[OS/8](https://en.wikipedia.org/wiki/OS/8) was [the primary programming system from DEC][faq10] for the PDP-8 in its later years. It included several different assemblers, all documented in its manual, one edition of which is linked above.
[OS/8](https://en.wikipedia.org/wiki/OS/8) was [the primary programming system from DEC][faq10] for the PDP-8 in its later years. It included several different assemblers, all documented in its handbook; two of its many editions are linked above.
The introduction date is that of OS/8, but OS/8 has a [complicated development history][faq10] that stretches back to 1966 or so. Some of the following assemblers predate OS/8; where the dates for them are known, they are called out. For those with no additional date information, it is possible that it was first introduced after OS/8 but before 1974, the date of the manual linked above, which talks about all of these assemblers.
[faq10]: http://www.faqs.org/faqs/dec-faq/pdp8/section-10.html
[os8m]: https://archive.org/details/bitsavers_decpdp8os8_39414792
[os78m]: https://www.grc.com/pdp-8/docs/OS8_Handbook.pdf
|
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
|
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
|
-
+
|
* `DEVICE` and `FILENAME` alternatives to `TEXT` for passing arguments to OS/8 service routines
* `DTORG`: set DECtape block number in output for the [Typeset-8][ts8m] computerized typesetting system ([photo][ts8p])
* `IFNDEF` and `IFNZRO` negated forms of the conditional assembly tests
* `RELOC`: assemble code for relocation after loading
The restoration of the `FIXMRI` pseudo-op is curious. It is not clear from the manuals whether its use is again required for redefining memory reference instructions (MRI) after an `EXPUNGE` call or if it is merely for compatibility with certain existing PAL-III programs. (**TODO**: Try it and see.)
The existence of the `RELOC` pseudo-op should not be taken as a sign that PAL8 is a relocatable assembler. It simply allows code to be assembled starting at one fixed address which is intended to be run at a different fixed address. A proper relocatable assembler generally tries to hide the fixed addresses it uses when assembling your program; compare [SABR](#sabr), for example. You must give the generated binary code to a relocating loader to fix up the addresses to their final execution values.
The existence of the `RELOC` pseudo-op should not be taken as a sign that PAL8 is a relocatable assembler. It simply allows code to be assembled starting at one fixed address which is intended to be run at a different fixed address. A proper relocatable assembler generally tries to hide the fixed addresses it uses when assembling your program; compare [SABR](#sabr), for example, which produces output that cannot be run directly, but which must be processed by a relocating loader (`LOADER.SV`, in the case of SABR) to fix up the addresses to their final execution values.
PAL-III has one feature not implemented in PAL8: the ability to get a brief listing of the undefined symbols in a program. The information is instead presented inline in the listing output, not grouped together into a single place, which can make refinement of an in-development program tedious as you need to comb information about undefined symbols out from among all the other output.
[ip]: http://bitsavers.org/pdf/dec/pdp8/handbooks/DEC-08-XINPA-A-D_intrPgm_75.pdf
[pl]: http://bitsavers.org/pdf/dec/pdp8/handbooks/programmingLanguages_May70.pdf
[ts8m]: http://bitsavers.org/pdf/dec/pdp8/typeset8/
[ts8p]: http://gordonbell.azurewebsites.net/digital/timeline/1968-3.htm
|