LoginSignup
1
0

More than 1 year has passed since last update.

Delphi で Pascal-S をコンパイルする (16bit 版 Delphi)

Last updated at Posted at 2020-02-12

はじめに

Pascal-S という Pascal インタプリタを最新の Delphi / ANSI 版 Delphi でコンパイルできるように改変する記事を書きました。

本記事はその Pascal-S を 16bit 版 Delphi でコンパイルしてみようという趣旨です。Delphi の 16bit 版というのは一つしかありません。初代 Delphi の事です。

16bit 版 Delphi を動かす環境は 16bit Windows である Windows 3.1 です。
image.png
この Windows 3.1 は Windows 7 の VirtualPC の上で動作させています。

Delphi 1 は XP (32bit) 等にもインストール可能です。XP なら Windows 10 以降の Hyper-V で動作させる事もできますし、Windows 7 の XP Mode も使えます。
image.png
動作確認するだけでしたら Windows 3.1 環境を用意する必要はありません。今回は 25 年前の環境を再現すべく、Windows 3.1 を使っています。
image.png

修正

以降で修正を行います。ベースとするのは ANSI 版 Delphi 用のコードです。大文字/小文字を区別しない Pascal-S を以前作りましたので、それを流用します。

アーカイブ (PASCAL-S_20190826.zip) は適当な場所に解凍し、VM の Windows 3.1 へ転送しておきます。

コードの修正 (コンパイルエラーの除去)

Delphi で ANSI 版の方の PASCALS.DPR を開きます。まずはコンパイルエラーになる箇所をすべて潰します。

疑似コンソールアプリケーションの指定

Windows 3.1 には Win32 コンソールなんてものはありませんし、Delphi 1 では MS-DOS アプリケーションは作れません。当然、コンソールアプリケーションなんていうものは作れないため、{$APPTYPE CONSOLE} の記述を削除します。

コンソールアプリケーションは作れませんが、古い MacOS にあった SIOW アプリケーションのような疑似コンソールアプリケーションを作ることはできます。疑似コンソールアプリケーションを作るには WinCRTuses に加えます。

...

program Pascals(input { + [sam] } , output, srcfil { [sam] } ); (* 1.6.75 *)
(* N. Wirth, E.T.H CH-8092 Zurich *)

uses
  SysUtils, WinCRT;
...

See also:

行コメント

// Loop1// Loop2 のように行コメントを使っている所がありますので、これをブロックコメント ({ } または (* *)) で置き換えるかコメントを消します。Delphi 1 では行コメントが使えません。

パラメータの変更

パラメータをオリジナルの PASCAL-P4 に近づけます。16bit アプリなので、そんなに多くのメモリは使えないからです。

const
  nkw   =     27;                 (* no. of key words *)
  alng  =     10;                 (* no. of significant chars in identifiers *)
  llng  =    250 {120 [sam]};             (* input line length *)
  emax  =    308 {322 [sam]};             (* max exponent of real numbers *)
  emin  =   -308 {-292 [sam]};            (* min exponent *)
  kmax  =     15;                         (* max no. of significant digits *)
  tmax  =    200 {100 [sam]};             (* size of table *)
  bmax  =     40 {20 [sam]};              (* size of block-table *)
  amax  =     60 {30 [sam]};              (* size of array-table *)
  c2max =     40 {20 [sam]};              (* size of real constant table *)
  csmax =     60 {30 [sam]};              (* max no. of cases *)
  cmax  =   1700 {850 [sam]};             (* size of code *)
  lmax  =     14 {7 [sam]};               (* maximum level *)
  smax  =   1200 {600 [sam]};             (* size of string table *)
  ermax =     58;                         (* max error no. *)
  omax  =     63;                         (* highest order code *)
  xmax  = 131071;                         (* 2**17 - 1 *)
  nmax  = maxint {281474976710655 [sam]}; (* 2**48 - 1 *)
  lineleng =   250 {136 [sam] };            (* output line length *)
  linelimit =  400 {200 [sam]};
  stacksize = 1500 {1500 [sam]};

モジュールヘッダのエラー

IDE を閉じてまたプロジェクトを開こうとしたり、プロジェクトに名前をつけて保存しようとすると モジュールヘッダーが無いか間違っています。 と怒られます。
image.png
実害はないのですが、これを回避するにはプログラムヘッダーをシンプルになるよう書き換えます。

program Pascals; (* 1.6.75 *)

実行

修正が終わったら、
image.png
〔Ctrl〕+〔F9〕または [コンパイル | コンパイル] で一旦コンパイルします。コンパイルエラーが出るようなら修正が不完全です。
image.png
無事 PASCA-S がコンパイルできたら、PASCALS.EXE と同じ場所に FIZZBUZZ.PAS を用意します。

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.

image.png
[実行 | 引数] で FIZZBUZZ.PAS を指定します。
image.png
〔F9〕または [実行 | 実行] すると...
image.png
FizzBuzz が疑似コンソールで実行されます。わかりにくいかもしれませんが、次のような処理を行っています。

  1. Delphi で PASCAL-S という Pascal インタプリタをコンパイルして実行ファイル PASCALS.EXE を生成
  2. PASCALS.EXE (Pascal インタプリタ) に FIZZBUZZ.PAS を読み込ませて実行

FIZZBUZZ.PAS を Delphi 1 でコンパイルして FIZZBUZZ.EXE を作り、それを実行している訳ではありません。Delphi 1 で直接 FizzBuzz を実行 (ファイルに) するには次のような 'FIZZBUZZ.DPR' をコンパイルします。

FIZZBUZZ.DPR
program FizzBuzz;

uses
  WinCRT;

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.

おわりに

生成されたバイナリ単体で動作させるにはファイルマネージャ (WINFILE.EXE) の [ファイル | 名前を指定して実行] から実行するのが簡単だと思います。疑似コンソールアプリケーションは MS-DOS プロンプトから実行する事はできません。
image.png
2020/02/14 で Delphi は 25 周年となります。
image.png

追記: 2020/02/15
Delphi 1.0 Client/Server (英語版) がアンティークソフトウェアとして無償公開されました。
image.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0