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
|
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
|
+
+
+
+
+
+
|
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.
## <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
MACRO-8 was another paper tape assembler for the PDP-8. Its main advantage over PAL-III is that it added [macros](https://en.wikipedia.org/wiki/Macro_instruction), a very useful feature in assembly language programming as it reduces a lot of the tedium of writing such programs.
**INCOMPLETE**
## <a id="pal-d"></a>PAL-D
| **Introduced** | 1967
| **Manual** | ??
| **Delivery** | paper tape
PAL-D is basically PAL-III for the [PDP-8 Disk Monitor System](https://en.wikipedia.org/wiki/4K_Disk_Monitor_System), one of OS/8's predecessors.
**INCOMPLETE**
## <a id="os8"></a>The OS/8 Assemblers
| **Introduced** | 1971
| **Manual** | most any OS/8 manual, such as [this 1974 edition][os8m]
| **Delivery** | part of OS/8
|
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
-
+
+
+
|
* relocatable output code
* easy access to the optional [floating-point processor](http://dustyoldcomputers.com/pdp12/fpp12.html)
The RALF assembler has a mode switch that causes it to generate absolute-addressed code, as PAL8 does. In this mode, it is called FLAP.
The FPP modes are the key advantage of RALF/FLAP. Vincent Slygnstad [suggests](http://so-much-stuff.com/pdp8/C/Assembler.php) that you think of these as assemblers for the FPP rather than for the PDP-8.
The FPP modes are the key advantage of RALF/FLAP. Vincent Slygnstad [suggests][smal8] that you think of these as assemblers for the FPP rather than for the PDP-8.
**INCOMPLETE**
### <a id="sabr"></a>SABR
As RALF is to OS/8's FORTRAN IV compiler, so [SABR](http://homepage.cs.uiowa.edu/~jones/pdp8/faqs/#langs) is to OS/8's FORTRAN II compiler.
SABR is a relative assembler, unlike PAL8 or FLAP, meaning that the OS/8 linking loader (`LOADER.SV`) adjusts all of the addresses in the assembled `*.RL` output to their final values.
|
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
|
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
|
-
+
+
+
-
+
|
[cc8]: /doc/trunk/src/cc8/README.md
[mm8]: https://tangentsoft.com/pidp8i/wiki?name=PDP-8+Memory+Addressing
## <a id="macrel" name="macrel-2"></a>MACREL
| Introduced | 1980
| Introduced | 1977 (v1), 1979 (v2)
| Manual | [text, 384 kB](http://vandermark.ch/pdp8/uploads/PDP8/PDP8.Manuals/AA-J073A-TA.txt)
| Delivery | DECtape for OS/8
Although this is technically another OS/8 assembler, its late introduction, separate documentation, and separate distribution from OS/8 proper require that we consider it separately.
Aside from MACRO-8, none of the assemblers above support macros, a very helpful feature in assembly language programming. MACREL was intended to be DEC's offered solution to the want of a macro assembler for the PDP-8 in the disk-based operating system era.
Unfortunately, it never achieved widespread use outside of DEC.
**INCOMPLETE**
## <a id="smal" name="smal8"></a>SMAL8
| **Introduced** | 1980, 2012
| **Manual** | [SMAL32][smal32], [SMAL8][smal8]
| **Delivery** | Internet, same links as above
SMAL is a series of cross-assemblers initially created by [Douglas W. Jones][dwj]. He wrote the initial versions in Pascal but later ported it to C. Some versions of SMAL — such as the SMAL32 version linked above for its wonderful manual — are machine-independent, meaning that it provides only the skeleton of the assembler, which is not able to generate code for any particular machine. Other versions of SMAL were targeted at specific machines, mostly 8-bit microcontrollers. Oddly enough, Dr. Jones did not base his `pal.c` PDP-8 cross-assembler upon SMAL. (See [palbart](#palbart) below for more on that thread of history.)
Vincent Slyngstad took up the challenge of targeting SMAL at the PDP-8, producing [SMAL8][smal8], offering it as part of his [C compiler system for the PDP-8](http://so-much-stuff.com/pdp8/C/C.php).
Some of the differences listed below mean that although the basic syntax of SMAL8 is solidly in the [PAL-III](#pal-iii) family, SMAL8 is likely to assemble only relatively simple PAL programs as-is. The most critical differences are the loss of inline literals and the difference in conditional assembly. New code would simply be written to avoid these problems.
If you read through the SMAL32 manual and see differences relative to PAL syntax but don't see the difference documented below, chances are that Vincent Slyngstad fixed these differences in SMAL8. For example, like PAL8 but unlike SMAL32, SMAL8 uses `/` to introduce comments, defaults to octal, allows `*` to set the output origin, and uses the `EJECT` pseudo-op rather than `PAGE` to put a page break into the output listing.
SMAL8 has many feature additions relative to PAL8:
* relocatable output
* `MACRO` and `ENDM`: MACREL-like macro feature
* `MACRO` and `ENDMAC`: MACREL-like macro feature
* `COMMON`, `EXTERNAL`, `GLOBAL`: module and linkage support
* `<` and `>` comparison operators in expressions
* `<<`, `>>`, and `>>>` bit shifting operators in expressions
* double and single quoted strings; PAL8 supports only double-quoted single-character constants
* labels separated from the code by either comma (PAL8 style) or colon (SMAL32 style)
* arbitrary radices in numeric constants using `r#n` syntax, which gives `n` base `r`
* the ¦ operator is allowed as an alias for PAL8's `!` form of Boolean OR
|
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
|
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
|
-
+
|
* powerful expressions in SMAL allow modern `IF`, `ELSE`, `ELSEIF` and `ENDIF` for conditional assembly
* `PAGE` takes no argument, as in [SABR](#sabr)
There are a few features removed relative to PAL8:
* multiplication is not allowed in expressions; `*` was given the PAL8 meaning, and `^` is not implemented
* division is not allowed in expressions; `/` was given the PAL8 meaning, and `%` is not implemented
* no inline literals, either the `(N)` or `[N]` syntaxes; parens used for groups and lists instead
* neither the `(N)` nor `[N]` syntaxes for inline literals work; parens used for groups and lists instead
* some IOT instructions PAL8 knows do not have predefined symbols: `KIE`, `RPE`, etc.
The data storage specifier feature of SMAL32 was removed in SMAL8, since it doesn't make much sense in the 12-bit world of the PDP-8. (That is, the byte (`B`), halfword (`H`), threeword (`T`), and fullword (`W`) pseudo-ops.) Use `DATA` instead.
[dwj]: http://homepage.divms.uiowa.edu/~jones/
[smal8]: http://so-much-stuff.com/pdp8/C/Assembler.php
[smal32]: http://homepage.divms.uiowa.edu/~jones/cross/smal32/
|
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
|
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
|
+
+
+
+
|
* **<code>bin/*.pt</code>** — the machine code output in RIM paper tape format, suitable for loading into SIMH's PDP-8 simulator
* **<code>boot/*.script</code>** — a SIMH init script that deposits the machine code into the PDP-8 simulator's core memory and starts it running; pass the file name to `bin/pidp8i-sim`
This makes for a very smooth code-build-run-debug cycle!
At this time, we do not yet have a comprehensive list of differences relative to PAL-III or PAL8.
**INCOMPLETE**
## <a id="pdpnasm"></a>pdpnasm
| **Introduced** | 2006
| **Manual** | see its [home page][pdpnasm]
| **Delivery** | [Internet][pdpnasm]
This is a PDP-8 assembler accepting the PAL-III syntax for Unix type systems.
I am listing it here along with `palbart` because there are [known weaknesses in `palbart`](/rptview?rn=4). If you know of more, please [file them](/tktnew). `palbart` currently has no central development home, so it is possible that the PiDP-8/I project will end up hosting an improved version.
Meanwhile, it seems like a good idea to me to have a second option at hand when cross-compiling code on a POSIX type platform for a PDP-8.
[pdpnasm]: http://people.csail.mit.edu/ebakke/pdp8/
**INCOMPLETE**
## License
Copyright © 2017 by Warren Young. This document is licensed under the terms of [the SIMH license][sl].
[sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md
|