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
|
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
|
+
+
-
+
-
+
|
* `E` and `F`: define floating-point constants
* `IFPOS`, `IFNEG`, `IFSW`, `IFNSW`, `IFFLAP`, and `IFRALF` conditional assembly pseudo-ops
* `IFREF`: replaces `IFDEF` pseudo-op, having a superset of its functionality
* `LISTOF`/`LISTON`: stop and start listing output rather than the PAL family's `XLIST` pseudo-op
* `REPEAT`: assemble the following line multiple times
* `COMMON`, `COMMZ`, `ENTRY`, `EXTERN`, `FIELD1`, `SECT`, and `SECT8` pseudo-ops to support FORTRAN IV code
Some may argue about my grouping of the expression changes here rather than under the [Arbitrary Differences](#ralf-ad) section below. I made this choice because the change was necessary to allow an improvement.
[fpp8a]: https://archive.org/details/bitsavers_decpdp8pdpUsersManDec76_996770
[fpp12]: https://archive.org/details/bitsavers_decpdp12DE_2606247
#### Justifiable Restrictions
#### <a id="ralf-jr"></a>Justifiable Restrictions
There are restrictions in RALF relative to late-generation PAL family assemblers that are justifiable on the grounds that they follow from the requirement that the output code be relocatable:
* It does not understand the `PAGE` pseudo-op: the PAL form of this feature — where the page number is given as an argument to the pseudo-op — inherently goes against the nature of relocatable output. The inability to accept the argument-less version understood by [SABR](#sabr) is harder to justify.
* It does not support current-page literals — `(42)` — since allowing it would complicate relocation.
#### Arbitrary Differences
#### <a id="ralf-ad"></a>Arbitrary Differences
There are additional differences in RALF relative to the PAL family assemblers that seem entirely arbitrary to me:
* Indirect addressing is done differently:
TAD I A / PAL syntax
TAD% A / RALF syntax
|