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

Comments

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

Table

Herb

 

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:

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

Copyright © 2018 Herb Johnson