This document Updated June 21 2018, copyright (C) 2018 Herb Johnson, Mark Ogden's text is under his copyright. It's part of a history of Digital Research's (and Intel's) PL/M and PLM 1800.
I have a Web page about Digital Research and CP/M history. To contact me @ email follow this link.
In June 2018, I asked Mark Ogden about the PLM 1800 work. He said he was familiar with the recent recovered software, and found many similarities between PLM 1800 and PL/M 8080. Mark has done considerable work in reconstucting 8-bit and 16-bit operating system and assembly lanugage code. Here's a link to his github site of some of his work. In particular, he's decompiled ISIS (Intel 8080 OS) and its plm80 compiler into C sources. - Herb Johnson
Herb: I have looked at the documentation on PL/M 1802 and most of it is the same as PL/M 80, with some minor deltas. The table below is my initial summary of these.
Several differences relate to 8080 specifics and support for external linkage so are to be expected. Another group relate to formatting of the listing file. Many of the other differences may be down to timing as older versions of PL/M 80 did not support all features and the 1802 version may have been developed in parallel, examples are AT and forward reference of labels. Based variables are declared slightly differently with a more significant difference for arrays. I personally prefer the 1802 location of the array size.
Reading the text, there does appear to be a difference on how expressions are calculated, the 8080 has rather strange rules of keeping to 8 bit expression evaluation until a 16bit value is encountered, hence the need for double, the 1802 manual states all expressions are 16bit.
Another probable difference is support for inline data e.g. the 8080 compiler supports the following:
CALL PRINT(.(‘a sample message’, CR, LF, 0));
From what I can understand the 1802 compiler’s use of ADDR only supports variables.
[Also] it would appear the 1802 does expressions as signed arithmetic, which I can only assume extends to comparison operators e.g. less-than, greater-than, etc. If this is the case then it is a significant semantic difference from the 8080 version that uses unsigned arithmetic.
There may be other minor semantic differences but I cannot tell from a quick scan of the documentation. - Mark
Table updates:
Mark added later: "Having read the table on line I have re-considered the items around FLBL and ENTRY.
Forward label reference. The text is probably ok as is, there is a nuance around the 8080 where global labels do need to be defined with a LABEL. The 1802 needs FLBL for all forward references and global level, as with 8080 does a stack reset.
Procedure label reference [changed].
A couple of other caveats:
1) The 1802 compiler notes that BYTE parameters passed where an ADDRESS
parameter is expected triggers an error. The 8080 compiler fills the high
byte with 0. [added to table]
2) The 1802 compiler does not appear to support indirect calls e.g. call
variable(param...). [added to table] I suspect the developer could use the inline assembler
to achieve this. - Regards, Mark
There was some discussion of this table and of PL/M-80 vs PLM1800, in the Yahoo discussion group cosmac elf for JUne 2018 as "Comparison of PLM 1800 to PL/M 80". Bill Rowe referenced work on reviving the PLM1800, on his Olduino Web site and PLM1800. Lee Hart, an 1802 programmer and an engineer who used PL/M in the era, noted there were not many high-level languages for 8-bit microprocessors in the mid-1970's. And, sometimes hardware engineers were not "allowed" access to (mainframe) programming support, or even allowed to program at all!
Mark Ogden added, "I would not say that [PLM1800] is particularly stripped down, it has basically the features of the original FORTRAN version of pl/m 80 and many applications were written in that e.g. [Lawrence Livermore Lab] basic, ML80 and ISIS 2.2, and presumably earlier versions of ISIS."
Bill Rowe provided a PLM1800 code fragment and explanation:
For example Q=1 translates to: 0421 D4022D; 0181 CALL LOADOP 0424 0451; 0182 DC Z00051 0426 8F; 0183 GLO RF 0427 F6; 0184 SHR 0428 CB042F; 0185 LBNF $+00007 042B 7B; 0186 SEQ 042C C00430; 0187 LBR $+00004 042F 7A; 0188 REQ 0430 ; 0189 ..00005 03 so he's loading a constant 1 then testing to see if it's 1(!) and setting/resetting the Q output. I can imagine having written that but it's 30-ish instructions and 15 bytes instead of 1 and 1. - Bill Rowe
Feature |
1802 |
8080 v4.0 |
address of variable |
ADDR(var) |
.var |
forward label ref |
DECLARE alabel FLBL |
DECLARE alabel LABEL or can often be
omitted in later intel compilers (but see notes above) |
procedure label reference |
DECLARE proc ENTRY |
does not appear to be necessary and for
inter file usage there is PUBLIC and EXTERNAL |
not equal relation operator |
<> or NE |
just <> |
return type |
afnc: PROCEDURE RETURNS(BYTE) |
afnc: PROCEDURE BYTE |
interrupt proc |
INTERRUPT |
INTERRUPT n (n=0-7) |
return a value |
RETURN (expression) |
RETURN expression |
goto absolute location |
GOTO location |
not supported (was in PLM v2.0
fortran edition) |
structures |
not supported |
STRUCTURE |
at attibute |
not supported |
AT |
external linkage |
does not appear to be supported |
PUBLIC, EXTERNAL |
Based variables |
DECLARE var BASED(baseVar) byte DECLARE array(size) BASED(baseVar) byte |
DECLARE var BASED baseVar byte DECLARE array BASED baseVar (size) byte |
BYTE parameter passed to ADDRESS
parameter |
error |
fill the high byte with 00 |
indirect calls e.g. call variable(param...)
|
not supported |
supported |
builtins |
|
|
DMAPTR |
DMAPTR |
not supported |
rotate instruction |
not supported |
ROR, ROL |
move |
not supported |
MOVE |
size of variable in bytes |
not supported |
SIZE |
last index of array |
not supported |
LAST |
cpu flags |
CARRY, EF1, EF2, EF3, EF4, Q |
CARRY, PARITY, SIGN, ZERO |
decimal adjust, convert byte to
address |
does not appear to be supported |
DEC, DOUBLE |
|
|
|
controls |
|
|
inline assembler |
$A assembler line |
not supported |
include files |
does not appear to be supported |
$INCLUDE |
input control |
not supported |
$LEFTMARGIN |
source & code listing |
$I & $C |
$CODE/$NOCODE, $LIST/$NOLIST |
additional listing controls |
not supported |
$PRINT/$NOPRINT, $XREF/$NOXREF,
$TITLE, $EJECT, $PAGEWIDTH,$PAGELENGTH,$DATE |
code optimisation |
not supported |
$OPTIMIZE/$NOOPTIMIZE |
workfiles |
not supported |
$WORKFILES |
interrupt related |
not supported |
$INTVECTOR/$NOINTVECTOR |
object file controls |
not supported |
$OBJECT, $DEBUG/$NODEBUG,
$SYMBOLS/$NOSYMBOLS |
cross file xref |
not supported |
$IXREF/$NOIXREF |
Contact information:
Copyright © 2018 Herb Johnson