# PurePASCAL ## はじめに [Oh!X](http://www.softbank.co.jp/publishing/ohx/) 1990/06 号に付属した "創刊 8 周年記念 PRO-68K" に収録された X680x0 用 (Human68K) PASCAL コンパイラ "PurePASCAL" を扱うページです。 ※ 開発者である 藤井義巳 / 藤木健士 両氏から掲載許可を頂いています。 ## 特徴 - Human68K 上で動作する伝統的な PASCAL コンパイラ *1。 - P-Code や実行時ランタイムを使用しない。 - コンパイルで AS.X 用のアセンブラソースを吐く*2。 - コンパイル, アセンブル, リンク *3 を自動で行う。 - 環境設定 (インストール) が容易。 - インラインアセンブラを使用できる。 *1 ISO 7185:83 の水準 0 に準拠している。 *2 [C Compiler PRO-68K](http://retropc.net/x68000/software/sharp/xc21/) 付属の AS.X、または [HAS.X](x68k.html#HAS) を AS.X にリネームしたものが使える。 *3 [C Compiler PRO-68K](http://retropc.net/x68000/software/sharp/xc21/) 付属の LK.X、または [HLK.X](x68k.html#HLK) を LK.X にリネームしたものが使える。 ## ダウンロード |ファイル|説明| |:---|:---| |[PASCAL.LZH](/software/pascal.lzh)|PurePASCAL コンパイラ Ver1.0 本体 (Oh!X 版)| |[PUREPASCAL101.LZH](/software/purepascal101.lzh)|PurePASCAL コンパイラ Ver1.01 本体| |[IOCSCALL.LZH](/software/iocscall.lzh)|PurePASCAL で IOCS コールを行うための型定義ファイル (DOSCALL.DEF) とインクルードファイル (DOSCALL.INC)| |[IOCSCALL2.LZH](/software/iocscall2.lzh)|IOCS コール用の定数定義ファイル (DOSCALL.CST)| |[PUREPASCAL_IMG.LZH](/software/purepascal_img.lzh)|エミュレータ等で使える FD イメージ (XDF)。| |[PUREPASCAL_101.ZIP](/software/purepascal_101.zip)|X68000Z 等で使える FD イメージ 2 枚組 (XDF)。| - AS.X と LK.X は付属していません (ZIP 版には付属)。FD イメージには HAS.X / HLK.X が付属しています。AS.X と LK.X が使いたい場合には、別途 [C Compiler PRO-68K](http://retropc.net/x68000/software/sharp/xc21/) から抽出してください。 - [C Compiler PRO-68K](http://retropc.net/x68000/software/sharp/xc21/) に付属のライブラリや [libc](http://www.vector.co.jp/vpack/filearea/x68/prog/lib/index.html) も使えます。IOCS コールや DOS コールはこれらのライブラリから呼び出すのがいいでしょう。 ## インストール 基本的には以下の手順となります。 1. アーカイブを解凍。 2. PASCAL.X と同じ場所に AS.X と LK.X を置く。 3. 環境変数を定義 ### 環境変数 |環境変数|説明| |:---|:---| |PATH|PATH に PurePASCAL インストールフォルダを追記するか、PASCAL.X をパスの通っているフォルダにコピーする| |PASCAL|PurePASCAL インストールフォルダを設定| |TEMP|コンパイル時のテンポラリファイル作成場所を指定| ### AUTOEXEC.BAT の例 ``` ECHO OFF PROMPT $P$G PATH A:\;A:\SYS;A:\BIN;A:\BASIC2;A:\ETC;B:\PASCAL; SET PASCAL=B:\PASCAL SET temp=B:\TEMP SET ecc=FUSys.Cnf FuKey.Cnf FuExt.Cnf SET FASTIO=DONE IF %FASTIO% == DONE GOTO SKIP FASTIO 384 -S32 -D -F -E FASTSEEK 128 FASTOPEN 100 SET FASTIO=DONE :SKIP ``` ## コンパイル コマンドラインから `PASCAL.X ソースファイル名[.pas]` とします。AS.X と LK.X が PASCAL.X と同じディレクトリにある場合には自動でコンパイル、アセンブル、リンクを行います。 [libc](http://www.vector.co.jp/vpack/filearea/x68/prog/lib/index.html) 等の外部ライブラリを使用する場合にはアセンブルまでしか行いませんので、リンクは別途行う必要があります。 [例] `LK test1.o paslib.a libiocs.a` ## コンパイラ指令 |コンパイラ指令|書式|機能| |:---|:---|:---| |ファイルインクルード|{$I ファイル名}| 指定されたファイルを挿入します。| |インラインアセンブラ|{$asm}~{$endasm}|アセンブリ言語のプログラムを埋め込みます。| |スタック領域指定|{$S スタックサイズ}|スタック領域を 1KB 単位で指定します。デフォルトは 64KB です。| |ヒープ領域指定|{$H ヒープサイズ}|ヒープ領域を 1KB 単位で指定します。デフォルトは64KB です。| |実行時チェックのコード生成|{$check} または
{$nocheck}|実行時チェックのコード生成を行うかどうか指定します。デフォルトは{$check}です。| ## IOCS 関連インクルードファイルの使い方 定数定義部で `IOCSCALL.CST` を、型定義部で `IOCSCALL.DEF` を、手続き・関数宣言部で `IOCSCALL.INC` をそれぞれインクルードします。 ``` program IOCSTest(Input, Output); (* Label declaration part *) (* Constant definition part *) const {$I IOCSCALL.CST} (* Type definition part *) type {$I IOCSCALL.DEF} (* Variable declaration part *) var REG: REGS; Result: Integer; (* Procedure and function declaration part *) {$I IOCSCALL.INC} begin REG.d0 := IOCS_SKEY_MOD; { ソフトウェアキーボードの制御 } REG.d1 := 1; { 表示 } Result := iocscall(REG); end. { main } ``` ## C 言語ライブラリの使用方法 ソースで **extern** 指令を使い、外部関数の使用を宣言します。 ``` function ABC(arg1: Integer): Integer; extern; procedure DEF(arg1: Integer); extern; ``` といった具合です。但し、C とは**引数の順序が逆になっている** ことに注意して下さい。 例えば C で ``` int ABC(int arg1, int arg2, int arg3); ``` となっていたら、PASCAL では ``` function ABC(arg3: Integer; arg2: Integer; arg1: Integer): Integer; extern; ``` と宣言する必要があります。 ## インラインアセンブラの使用方法 {$asm} {$endasm} の間にアセンブリコードを記述できます。 ``` {$asm} アセンブリ言語のコード {$endasm} ``` d0, d1, a0 以外のレジスタを使う際には、事前にレジスタを退避させる必要があります。 ``` {$asm} movem.l d0-d7/a0-a6,-(sp) * レジスタの退避 アセンブリ言語のコード movem.l (sp)+,d0-d7/a0-a6 * レジスタの復帰 {$endasm} ``` ## 既知の問題 (ver 1.00) - FLOAT2+/3+ では正常に動作しない。 - レコード型変数を実引数として積む事ができない。 - エラーメッセージの一部に不備がある。 - 定数宣言に負の数が使えない。 これらの問題について、Oh!X 90 年 11 月号に以下のような記述があります。 > 我々の手元では、これらのバグはすでに取れているのですが、 > いまのところ皆さんにお届けする方法がありません。 恐らく ver1.01 では修正されているのだろうと思われます。 ## 既知の問題 (ver 1.01) ### ・case 文の end の前に ; は許されない case 文の end の前にセミコロンを書くと(最終セレクタの後にセミコロンを書くと) `Error: CASE 名札は xxxx でなければならない` が発生します。 ``` var num, v: Integer; begin num := 0; case num of 0: v := 10; 1: v := 20; 2: v := 30; { NG: end の前にセミコロンがある (空のセレクタがある) } end; end. ``` 次のような記述にしなくてはならないようです。つまり、PurePASCAL では空のセレクタが許されません。 ``` var num, v: Integer; begin num := 0; case num of 0: v := 10; 1: v := 20; 2: v := 30 { OK: end の前にセミコロンを付けない } end; end. ``` 複文の場合も同様です。 ``` var num, v: Integer; begin num := 0; case num of 0: begin v := 10; end; 1: begin v := 20; end; 2: begin v := 30; end { OK: end の前にセミコロンを付けない } end; end. ``` PASCAL の規格では最終セレクタの後に空セレクタが許されています。 ### ・文字列型の値パラメータに文字列リテラルを渡すとアドレスエラーが出る事がある 現象が再現する最小限のコードは以下の通りです。DmyStr() を 2 度実行するとアドレスエラーが発生します。 ``` program STRTEST(Input, Output); type STR = packed array [1..8] of Char; procedure DmyStr(s: STR); begin { 何もしない } end; begin DmyStr('ABCDEFG '); DmyStr('HIJKLMN '); end. ``` 値パラメータに変数を渡した場合や、パラメータが変数パラメータ (**var**) だった場合にはこの問題は発生しません。 ``` program STRTEST(Input, Output); type STR = packed array [1..8] of Char; var Buf: STR; procedure DmyStr(s: STR); begin { 何もしない } end; begin Buf := 'ABCDEFG '; DmyStr(Buf); Buf := 'HIJKLMN '; DmyStr(Buf); end. ``` 文字列の要素数が 4 の倍数でない場合にもこの問題は発生しません。 ``` program STRTEST(Input, Output); type STR = packed array [1..9] of Char; (* 要素数が 4 の倍数ではない *) procedure DmyStr(s: STR); begin { 何もしない } end; begin DmyStr('ABCDEFGH '); (* 9 文字の文字列リテラル *) DmyStr('IJKLMNOP '); (* 9 文字の文字列リテラル *) end. ``` 忘れそうな制約なので、できれば文字列リテラルは代入時にのみ使うようにしましょう。 ## おわりに Oh!X の連載『PASCAL プログラミングへの招待』には、PurePASCAL の詳しい説明が載っていますので、興味のある方はバックナンバーを探してみてください。以下、掲載号です。 | 掲載号 |タイトル|ページ| |:----------------:|:------------------|:----------------| | 1990/06 | <1> X68000 に PASCAL コンパイラを| pp.94-97 | | 1990/07 | <2> PASCAL の特徴的な性格について| pp.114-116 | | 1990/08 | <3> PASCAL のデータ型を見る| pp.121-125 | | 1990/09 | <4> PASCAL の制御構造, 関数および手続き| pp.71-75 | | 1990/11 | <5> 演算子・式, インラインアセンブラ| pp.78-82 | | 1991/01 | <6> 実行時チェック・C とのリンク| pp.144-147 | | 1991/03 | <7> Gabage Collection in Pure PASCAL| pp.62-64 | **参考文献:** - "Oh!X", SoftBank, 90 年 6, 7, 8, 9, 11 月号及び 91 年 1, 3 月号 - ["PASCAL 原書第 4 版"](https://amzn.to/3nWUUcS), 培風館(1993) - ["Pascal の標準化 - ISO 規格全訳とその解説 -"](https://amzn.to/42AghQc), 共立出版(1984)