はじめに
Digital Research 社の Pascal/MT+ の使い方についての備忘録です。
CP/M エミュレータとして RunCPM の Win32 バイナリを使います。
Pascal/MT+ は次のリンクから入手できます。
See also:
- RunCPM (Z80 CP/M 2.2 エミュレータ) (ht-deko.com)
- 付録 (標準 Pascal 範囲内での Delphi 入門) (Qiita)
- 用語集 (標準 Pascal 範囲内での Delphi 入門) (Qiita)
Pascal/MT+ の使い方
とりあえず FIZZBUZZ.PAS
を用意しておきます。
program FizzBuzz(Output);
var
i: Integer;
begin
for i:=1 to 100 do
begin
if ((i mod 3) + (i mod 5)) = 0 then
Writeln('Fizz Buzz')
else if (i mod 3) = 0 then
Writeln('Fizz')
else if (i mod 5) = 0 then
Writeln('Buzz')
else
Writeln(i);
end;
end.
■ コンパイル
コンパイラは MTPLUS.COM
です。ソースファイルの拡張子は省略できます。
MTPLUS <ファイル> {<オプション>}
MTPLUS FIZZBUZZ
■ リンク
リンカは LINKMT.COM
です。
LINKMT <メインモジュール>{,<モジュール>}{,<ライブラリ>} {<オプション>}
または
LINKMT <実行ファイル名>=<メインモジュール>{,<モジュール>}{,<ライブラリ>} {<オプション>}
LINKMT FIZZBUZZ,PASLIB /S
正しくリンクされると FIZZBUZZ.COM
が生成されています。
■ コンパイル&リンク
A
オプションをコンパイラに渡す事により、自動的にリンカを呼び出せます。
MTPLUS FIZZBUZZ $A
しかしながら、自動でリンクするためには リンカ入力コマンドファイル
が別途必要です (拡張子 .CMD
)。
FIZZBUZZ,PASLIB /S
この仕様だとあまり有用だとは思えませんね。
おわりに
Pascal/MT+ と 標準 Pascal との (標準 Pascal の範囲での) 違いは次の通りです:
- 識別子は最初の 8 文字のみが有効。
- 変数はビットレベルでは PACK されていない。
- 宣言の順番が異なる場合がある。
- ヌル文字列を許容する。
- 可変長文字列 (String) をサポートしているため、CHAR は ISO Pascal 文字列 (PACKED ARRAY [1...n] OF CHAR) として実装されていない。
他にも、追加の機能として I/O 操作があったり、モジュール構造が取り入れられたりしています。
モジュール
実際のモジュールの使い方についてですが、モジュールファイルはこのようになります。
module FBMOD;
procedure FB;
var
i: Integer;
begin
for i:=1 to 100 do
begin
if ((i mod 3) + (i mod 5)) = 0 then
Writeln('Fizz Buzz')
else if (i mod 3) = 0 then
Writeln('Fizz')
else if (i mod 5) = 0 then
Writeln('Buzz')
else
Writeln(i);
end;
end;
modend.
モジュールのルーチンを呼び出す側のメインプログラムはこうなります。
program FizzBuzz(Output);
EXTERNAL PROCEDURE FB;
begin
FB;
end.
まずはそれぞれのモジュールをコンパイルし、
MTPLUS FBMOD
MTPLUS FIZZBUZZ
リンカで結合します。
LINKMT FIZZBUZZ,FBMOD,PASLIB /S