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
|
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
|
+
+
+
+
+
|
## <a id="pal-iii" name="pal3"></a>PAL-III
| **Introduced** | 1965
| **Manual** | [PDF, 790 kB](http://www.telegraphics.com.au/doc/paliii.pdf)
| **Delivery** | paper tape
We may presume from the name that PAL-III has two predecessors. I was able to find a reference to DEC product number 5-1-S, the Program Assembly Language for the PDP-5, which the PDP-8 directly replaced in DEC's product line, being upward compatible with it. That same [PDP-5 program catalog][pc5] says that its replacement is [an early version of PAL-III][p83s]. I have not been able to find a reference to PAL-II. Perhaps it went the way of Angular 3, Winamp 4, Netscape 5, PHP 6, MySQL 7, QuickTime 8, and Windows 9.
The PAL-III assembler shipped on [punched paper tape](https://en.wikipedia.org/wiki/Punched_tape) as part of the grandiosely-named "PDP-8 Assembly System." This amounted to an assembler, an editor, a debugger, and a loader, each a separate paper tape. The programmer would first toggle the RIM loader into the PDP-8's front panel, then use that to load the BIN loader from yet a fifth paper tape, then run each of these tapes through the paper tape reader repeatedly — reusing the still-in-core BIN loader each time — in order to iterate his way toward a working program!
The assembler tape required at least two passes through the tape reader in order to produce a computer-readable BIN format output tape, plus an optional third pass if you wanted a human-readable listing on the terminal.
If you look at pictures of PDP-8 computers, you can often see a tray with narrow slots in it, each meant to hold one of these key paper tapes, as they were needed near at hand when using the computer. There is a good picture of a blue one on [the cover of the 1974 edition of the OS/8 Handbook](https://archive.org/stream/bitsavers_decpdp8os8_39414792/OS8_Handbook_Apr1974?ui=embed#page/n0/mode/1up).
PAL-III can be considered the baseline assembler for a PDP-8, since almost every PDP-8 at least included some kind of paper tape reader, and most of the other assemblers surveyed here share its basic syntax.
We will not list the feature set of PAL-III here; see its manual for that. The lists of features in the sections below are relative to either PAL-III or one of the other assemblers reviewed below. Within the PAL genealogical line, compatibility with the baseline PAL-III syntax is assumed unless a note is made otherwise.
[pc5]: http://bitsavers.org/pdf/dec/pdp5/PDP-5_pgmLibr_1964.pdf
[p83s]: http://www.ricomputermuseum.org/Home/equipment/pdp-8s/pdp-8-software
## <a id="macro-8"></a>MACRO-8
| **Introduced** | 1965
| **Manual** | [PDF, 1.7 MB](https://www.grc.com/pdp-8/docs/MACRO-8_Programming_Manual.pdf)
| **Delivery** | paper tape
|
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
|
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
|
-
+
+
+
+
+
+
-
+
-
+
-
+
+
+
+
-
+
-
-
-
+
+
-
-
-
+
+
+
+
|
| **Manual** | [PAL-D Disk Assembler Programmer's Reference Manual](https://archive.org/details/bitsavers_decpdp8sofProgRef_1907666)
| **Delivery** | paper tape
PAL-D is a descendant of PAL-III, originally appearing as part of the [PDP-8 Disk Monitor System](https://en.wikipedia.org/wiki/4K_Disk_Monitor_System), one of OS/8's predecessors. It would later reappear under TSS/8.
PAL-D came in two forms, the 4K and 8K versions, referring to the minimum amount of core memory each required. Note that the 4K version could assemble for larger machines; it has the `FIELD` pseudo-op, for example, which is of no use unless your assembled program would run in at least 8K of core.
The 4K version defines only one new feature in the PDP-8 assembler family so far: the `XLIST` pseudo-op, which lets the programmer stop and then re-start the assembly listing in the optional third pass. The 4K version is more notable for the features it brought into the PAL family from [MACRO-8](#macro-8): the`PAGE` and `TEXT` pseudo-ops.
The 4K version defines only one new feature in the PDP-8 assembler family so far: the `XLIST` pseudo-op, which lets the programmer stop and then re-start the assembly listing in the optional third pass. The 4K version is more notable for the features it brought into the PAL family from [MACRO-8](#macro-8): the `PAGE` and `TEXT` pseudo-ops.
8K PAL-D added quite a few new features over the 4K version:
* ability to run in 8K or 12K of core, allowing assembly of larger programs
* automatic link generation for off-page references
* 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`
* more pseudo-operations:
* `EJECT`: emit a form feed in the listing output
* `IFDEF` and `IFZERO`: conditional assembly tests, affected statements in angle brackets
* `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 that the negated forms of the conditional assembly operations did not appear until later. The first reference to them I've been able to find for `IFNZRO` and `IFNDEF` is in connection with [PAL8](#pal8).
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 still find it documented in the [the OS/8 Handbook (1974 ed.)][os8m], but it was airbrushed out of history by the [1979 edition for OS/78][os78m], suggesting that its purpose became effectively redundant after the bulk of the market moved to disk-based PDP-8 systems.
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.)
| **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.
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
### <a id="pal8" name="pal-8"></a>PAL8
The earliest attestation to the PAL8 assembler I've been able to find is in the May 1970 printing of [Programming Languages][pl], the second volume in a set of two books for programming PDP-8 family computers. In the section on 8K PAL-D, it gives a Disk Monitor command for saving the in-core copy of 8K PAL-D as "PAL8". It is therefore unsurprising that the OS/8 version of PAL8 is morphologically more similar to [PAL-D](#pal-d) than to [PAL-III](#pal-iii).
The earliest attestation to the PAL8 assembler I've been able to find is in the May 1970 printing of [Programming Languages][pl], the second in a two-volume set on programming PDP-8 family computers. (The first volume being [Introduction to Programming][ip].) On page 14-7 in the section on 8K PAL-D, it gives a Disk Monitor command for saving the in-core copy of 8K PAL-D as "PAL8". It is therefore unsurprising that the OS/8 version of PAL8 is morphologically more similar to [PAL-D](#pal-d) than to [PAL-III](#pal-iii).
PAL8 understands the same basic language as PAL-D and generally has more features, most especially related to running under OS/8, such as the ability to set options via OS/8's command interpreter (CCL) rather than via the PDP-8's front panel switches.
I consider PAL8 the default assembler for OS/8 users. If none of the information below guides you to one of the other assemblers, you should probably start with PAL8. If you have a piece of assembly code that is meant to be assembled under OS/8, and you have no evidence that is for any other assembler, it's probably meant to be assembled by PAL8.
PAL8 has many features not present in 8K PAL-D:
* automatic link generation for off-page references
* output options for [CREF and DDT][os8m]
* in addition to `+` and `-` in expressions, it allows:
* output option for producing input to [CREF][os8m]
* more operators in expressions:
* `^` for 12-bit unsigned multiplication (`*` was already taken for setting the location counter)
* `%` for 12-bit unsigned division (`/` was already taken as the comment start character)
* `!` for Boolean OR (the ASR-33 terminal character set [did not include the ¦ character](http://iclces.uk/articles/a_teletype_font.html))
* `&` for Boolean AND
* literals in the current page via `(NN` syntax (closing paren optional) or in page zero via `[NN`
* single-character ASCII constants: `"A`
* the `FIXMRI` pseudo-op is back
* `EJECT` pseudo-op extended to allow the page header to be changed for the next and following pages
* new pseudo-operations:
* `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.
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
### <a id="ralf" name="flap"></a>RALF/FLAP
|