PLM 1800 review

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.

A review of PLM 1800 by Mark Ogden

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






8080 v4.0

address of variable



forward label ref


DECLARE alabel LABEL or can often be omitted in later intel compilers (but see notes above)

procedure label reference


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



interrupt proc


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)


not supported


at attibute

not supported


external linkage

does not appear to be supported


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


fill the high byte with 00

indirect calls e.g. call variable(param...)

not supported







not supported

rotate instruction

not supported



not supported


size of variable in bytes

not supported


last index of array

not supported


cpu flags

CARRY, EF1, EF2, EF3, EF4, Q


decimal adjust, convert byte to address

does not appear to be supported








inline assembler

$A assembler line

not supported

include files

does not appear to be supported


input control

not supported


source & code listing

$I & $C


additional listing controls

not supported


code optimisation

not supported



not supported


interrupt related

not supported


object file controls

not supported


cross file xref

not supported


Contact information:

Herb Johnson
New Jersey, USA
To email @ me, see see my ordering Web page

Copyright © 2018 Herb Johnson