インターネット&PC120%活用:PC活用編

PL/Iの入手その2(CP/M用コンパイラ)

1  CP/MのPL/Iコンパイラ
PL/Iフリークに朗報!!!(古参のIBMer以外には日本にはあまりいないか)
海外のサイトにCP/M用のPL/IコンパイラがFree(フリー)で落ちているのを発見!!
CP/M-80、CP/M-86用の他に、MS-DOS上でも使えるものがあるみたいです。

Free Compiler(フリーコンパイラのリンク集)のCP/Mコンパイラ関連のサイト、PL/I関連の
サイトを探してみて下さい。
おじさんが探して見たところ以下のものが見つかりました。

Pli80_13.zip CP/M-80用のPL/Iコンパイラ。動作確認しました。
Pli-b.zip これも、CP/M-80など8080用のPL/Iと思われる。中身はほぼPli80_13.zipと同じだが、
Plilib.ilrが不良?のためかLinkが正常にできない。
pli86.zip CP/M-86用のPL/Iコンパイラ。実行ファイルまで生成できるが、(CP/Mエミュレーター上
で)実行するとエラーの発生するプログラムがある。
pli86-x.zip MS-DOS上で使えるPL/Iコンパイラ。
pli_dos.zip これもMS-DOS上で使えるPL/Iコンパイラと思われるが、Linkの仕方が不明。(Linkerがない?)



2 Pli80_13
1) 準備
CP/M-80用のPL/Iコンパイラです。
MS-DOS上で使うCP/Mエミュレーターをかませて使えば、動作します。

CP/Mエミュレーターも何種類かあります。
Vector や Free Compiler にあるサイトから探して下さい。
今回ここでは、村上敬司氏のCPMエミュレーターを使います(Vectorにあります。)

2) コンパイル手順

では、以下のsample.pliのコンパイルをしてみます。

sample.pli
sample:
   proc options(main);
   put list('hello');

    end;          /* of main program */


(1) FCBの設定
ファイルのオープンにFCB(ファイルコントロールブロック)を使っているらしく、まずFCBの設定をします。
FCBの値は5から8位にしておけばいいのではないかと思います。
DOSプロンプト(DOS窓)の標準設定のままでは、「FCBが使えません」というエラーが出るので、
(A)純粋なMS-DOSでConfig.sysに fcbs = 8 と設定するか
(B) 以下の設定をしてMS-DOSモードで使用します。
   MS-DOSプロンプトのプロパティの「プログラム」タブの詳細設定で、以下の通り
   MS-DOSモードを選択し、「MS-DOSモード用のConfig.sysファイル」に fcbs=8 と記述します。
   (これは、Windows9xかMeでないとつかえませんえね)

   
(C) DOSプロンプトのままで使えるようにしたいなら、config.sys自体に fcbsの記述をすれば
   いいが、あまりおすすめではない。


(2) コンパイラ、リンカーの拡張子変更
これ以降、必要なファイルは全てフロッピーディスクに入れて作業をしますので
全ての作業は A> で行います。(必要に応じて読み替えてください)
村上氏のCP/Mエミュレーターは、エミュレートされる実行ファイルの拡張子は .cpm でなくては
なりません。(備考参照)
従って、まずPli80_13の実行ファイル(.com)の拡張子を変更します。
A> copy *.com *.cpm

これで、 pli.cpm(コンパイラ) link.cpm(リンカー)ができます。

(補足) 村上氏のCP/Mエミュレーターについて。同梱のドキュメントからの抜粋です。

  使い方

 まず、CP/MのプログラムをMS−DOSに持ってきます。このとき、拡張子".com" を
".cpm" にしておく必要があります。
 CP/Mのプログラムを実行するには、第一引数をCP/Mのプログラム名とし、
その後にCP/Mのプログラムに与えるパラメータを書きます
cpm プログラム名 パラメータ...
つまり、CP/Mのコマンドラインの前に"cpm" を付けたようなかっこうになります。
 例えば、カレントディレクトリにある zsid.cpm を使って test.com デバッグする
には、次の様にします。(test.com を実行するときには拡張子を.cpm にします)
cpm zsid test.com
 また、他のディレクトリにあるCP/Mプログラムも実行することができます。
cpm b:\cpm\turbo

作者の連絡先 村上敬司


(3) コンパイルとリンク
コンパイルします。
A>cpm pli sample
これで sample.rel ができます。

ライブラリ等とリンクします。
A>cpm link sample,plilib.irl
これで、 sample.com ができます。
これは、CP/M-80用の実行ファイルなので、そのままではDOS上では実行できません。
CPMエミュレーターで実行できるように拡張子を.cpmに変更します。
A>ren sample.com sample.cpm として名前を変更するか、copyコマンドで以下のようにしてもO.K.です。
A>copy sample.com sample.cpm

3) 実行
では、実行してみます。
今回のsample.cpm は、特にファイルのオープンなどをしない単純なプログラムなので、
DOSプロンプト(DOS窓)でFCBの設定をしなくても実行できます。
以下実行の様子です。


A:>cpm sample     
hello
End of Execution
A:>


3 PLI86
1) 準備
CP/M-86用のPL/Iコンパイラです。
CP/M-86用のエミュレーターで動かします。CP/M-86のエミュレーターは上記のFree Compilerサイトを
探せば、簡単にみつかります。

今回は、cpmemu.zipに含まれているエミュレーターを使います。CP/M-86用のエミュレーター
はcpm.exe というファイルです。
cpmの後に、CP/M-86の実行ファイルの拡張子を省いて、記述します。 
(CP/M-86の実行ファイル(コマンドファイル)の拡張子は .cmd です。)
例えば,sample.cmd を実行したい場合は、cpm sample のように記述します。

2) コンパイル、リンク、実行
では、dfact.pli というプログラムをコンパイルして実行してみます。nの階乗を求めるプログラムです。

ソースファイルdfact.pli です

dfact.pli
/******************************************************/
/* This program evaluates the Factorial function (n!) */
/* using recursion and FIXED DECIMAL data.            */
/******************************************************/
dfact:
     procedure options(main);
     declare 
        i fixed;
     do i = 0 repeat(i+1);
        put skip list('Factorial(',i,')=',factorial(i));
     end;
     stop;

     factorial:
          procedure(i) returns(fixed decimal(15,0)) 
                       recursive;
          declare 
             i fixed;

          if i = 0 then return (1);
          return (decimal(i,15) * factorial(i-1));
     end factorial;

end dfact;

コンパイル、リンク、実行の様子です。
C:\dload\pli86\pli86-1 というフォルダで作業をしています。
コンパイルにより、.obj という拡張子を持つオブジェクトファイルができます。
リンクすると(リンカーは link86.cmd)、.cmd という拡張子を持つ実行ファイルができます。

C:\dload2\pli86\PLI86-1>cpm pli dfact
CP/M-86 emulator for DOS vers 1.3 - 11/30/97
Copyright (c) 1985, 1997 Jim Lopushinsky
--------------------------------------------------    
PL/I-86 Compiler                       Version 1.0
Serial No. 3034-0000-000944    All Rights Reserved
Copyright (c) 1982,1983     Digital Research, Inc.
--------------------------------------------------
Compilation of: DFACT


   No Error(s) in Pass 1

   No Error(s) in Pass 2

Code Size: 00BD
Data Size: 0022

End of Compilation


C:\dload2\pli86\PLI86-1>cpm link86 dfact,plilib.l86
CP/M-86 emulator for DOS vers 1.3 - 11/30/97
Copyright (c) 1985, 1997 Jim Lopushinsky
--------------------------------------------------
LINK-86 Linkage Editor                Version 1.01
Serial No. 3034-0000-000944    All Rights Reserved
Copyright (C) 1982,1983     Digital Research, Inc.
--------------------------------------------------

CODE    05437
DATA    00C21

USE FACTOR:  11%


C:\dload2\pli86\PLI86-1>cpm dfact

Copyright (c) 1985, 1997 Jim Lopushinsky

Factorial(         0 )=                  1
Factorial(         1 )=                  1
Factorial(         2 )=                  2
Factorial(         3 )=                  6
Factorial(         4 )=                 24
Factorial(         5 )=                120
Factorial(         6 )=                720
Factorial(         7 )=               5040
Factorial(         8 )=              40320
Factorial(         9 )=             362880
Factorial(        10 )=            3628800
Factorial(        11 )=           39916800
Factorial(        12 )=          479001600
Factorial(        13 )=         6227020800
Factorial(        14 )=        87178291200
Factorial(        15 )=      1307674368000
Factorial(        16 )=     20922789888000
Factorial(        17 )=    355687428096000
Factorial(        18 )=
FIXED OVERFLOW (1)
Traceback: 3206 00AF 8000 0572 # 3737 6402 0047 0BDE
End of Execution

C:\dload2\pli86\PLI86-1>


4 PLI86-x
DOS上で動くPL/Iコンパイラです。
DOSプロンプト上で動作しますので、これは便利でしょう。
では、最大公約数を求めるプログラム gcm.pli のコンパイルをしてみます。

ソースプログラムは以下の通りです。

gcm:
proc options(main);
declare a,b,x bin fixed;
put list('**gcm**');
put skip list('input 2 integer: ');
get list(a,b);
label1:
x=mod(a,b);
a=b;
b=x;
put skip list (a,b);
if x = 0 then go to label2; else go to label1;
label2:
put skip list ('gcm: ',a);
end gcm;

では、コンパイルとリンクそして、実行までの手順をみてみましょう。
今回も、必要なファイルをフロッピーディスクに全て入れて、 A>で作業をしています。
コンパイルすると、gcm.obj というオブジェクトファイルができます。これをリンカーlink86.exe
でリンクすると(ランタイムライブラリーはplilib.l86)、gcm.exe という実行ファイルができます。

A:\>pli gcm
--------------------------------------------------    
PL/I-86 Compiler                       Version 1.0
Serial No. 3091-0000-002381    All Rights Reserved
Copyright (c) 1982,1983     Digital Research, Inc.
--------------------------------------------------
PL/I-86 V1.0 Compilation of GCM


   No Error(s) in Pass 1

   No Error(s) in Pass 2

Code Size: 00D7
Data Size: 0023

End of Compilation


A:\>link86 gcm,plilib.l86
--------------------------------------------------
LINK-86 Linkage Editor                 Version 1.3
Serial No. 3091-0000-002381    All Rights Reserved
Copyright (C) 1982-1984     Digital Research, Inc.
--------------------------------------------------

CODE    054F2
DATA    00CBB

USE FACTOR:  12%

A:\>gcm
**gcm**
input 2 integer: 268,144

      144       124
      124        20
       20         4
        4         0
gcm:          4
End of Execution

なお、このPLI86-x にはlinkcmd.exeという、CP/M-86のコマンドファイル(実行ファイル)を生成する
(と推測される)リンカーも含まれています。しかし、これによって作られた、実行ファイル(拡張子 .cmd)
は、CP/M-86用のエミュレーターをかまして実行しても正常に動作しません。(おじさんの環境では)


5 補足
今回ここでとりあげたコンパイラは、もう15年以上前のものですが本格的なPL/Iコンパイラです。
ちょっとプログラムの勉強に使うのであれば十分でしょう。
ただし、いずれもマニュアル類がほとんどついていないので、昔CP/Mで使った経験がないと
使えるようになるまでけっこう大変かもしれません。おじさんも結構試行錯誤しました。

 


TopPage


inserted by FC2 system