Turbo Pascal (MSX) に関する情報

# はじめに

『Turbo Pascal (MSX) 』関連の情報を集めてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7f20c4bc-1675-d856-2be4-3c7d28df11e1.png)

 
# Turbo Pascal

『Turbo Pascal』は Borland 社が発売した製品です。誇張抜きに **爆速の Pascal コンパイラ** です。

ver3.0 までは CP/M-80 版、CP/M-86 版、MS-DOS 版、PC DOS 版がありました。ver4.0 以降は MS-DOS / PC DOS 版となりました [^2]。

『Turbo Pascal for Windows』を経て、現在の『Delphi』までその流れは続いています。

- [Turbo Pascal (Wikipedia)](https://ja.wikipedia.org/wiki/Turbo_Pascal)
- [Delphi のご先祖を辿る (Qiita)](https://qiita.com/ht_deko/items/b41b0cd45181aec522d4)

## Turbo Pascal (MSX)

**『Turbo Pascal』** の MSX 版が Borland 社から発売される事はありませんでしたが、書籍『Turbo Pascal Compleet』と一緒になったものが Philips 社から発売されていたようです (日本未発売)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7c2260f3-3006-31c0-0925-4bf6f4caf98e.png)

| 会社 | 国 | 型番 | 製品 |
|:---|:--:|:--:|:--:|
| Philips | 蘭 | NMS 8901 | Turbo Pascal |
| Philips Italy | 伊 | VG 8105 | Turbo Pascal |

 - [Turbo Pascal (Generation MSX)](https://www.generation-msx.nl/software/borland/turbo-pascal/2574/)
 - [TURBO PASCAL ON CP/M, MSX-DOS AND MS-DOS (Pascal for small machines)](http://pascal.hansotten.com/delphi/turbo-pascal-on-cpm-msx-dos-and-ms-dos/)
 - [Pascal and MSX - MSX Info Pages (file-hunter.com)](https://hansotten.file-hunter.com/software/pascal-and-msx/)

## MSX で動作する Turbo Pascal

MSX-DOS がほぼ CP/M-80 なので、CP/M-80 版の『Turbo Pascal』が MSX 上で動作します。MSX 版は CP/M-80 用 ver3.0 をカスタマイズしたもののようです。

:::note
CP/M-80 版 Turbo Pascal の最終バージョンは 3.01A です。
:::

『Turbo Pascal』には **インライン機械語** (≠ インラインアセンブラ) があるので、MSX 固有の機能を利用可能です。

 - [MSX-DOS (Wikipedia)](https://ja.wikipedia.org/wiki/MSX-DOS) 
 - [CP/M (Wikipedia)](https://ja.wikipedia.org/wiki/CP/M)

## Turbo Pascal のインストール
MSX-DOS 版はそのままディスクから起動するだけです。

CP/M-80 版『Turbo Pascal 3.0』を MSX で使うのなら、MSX-DOS が起動するディスクに以下のファイルをコピーします。

| ファイル名 | 説明 |
|:---|:---|
| TURBO.COM | Turbo Pascal 本体 |
| TURBO.MSG | エラーメッセージファイル |
| TURBO.OVR | オーバーレイファイル|
| TINST.COM | 環境設定プログラム |
| TINST.MSG | 環境設定プログラム用テキストファイル |
| TINST.DTA | 環境設定用データファイル |

起動は 80 文字モードで `TURBO.COM` を実行するだけです。

```
A> MODE 80
A> TURBO
```

:::note
PC DOS 版の『Turbo Pascal 3.0』は [Embarcadero 社がアンティークソフトウェアとして公開しています](https://qiita.com/ht_deko/items/ae7605c6b1f426ae234a)が、CP/M-80 版や MSX 版は公開されていません。

Web 上にあるアーカイブの使用は自己責任となります。この件に関して Embarcadero 社に問い合わせたりする事は控えてください。
:::

 - [MSX-2 version of Turbo Pascal 3 (MSX-DOS 版: tpmsx2.zip) (Pascal for small machines)](http://pascal.hansotten.com/delphi/turbo-pascal-on-cpm-msx-dos-and-ms-dos/)
 - [Turbo Pascal v3.01A (CP/M-80 版: TP_301A.ZIP) (retroarchive.org)](http://www.retroarchive.org/cpm/lang/lang.htm)


## スクリーン設定 (TINST)
スクリーン設定を `TINST.COM` で行う事ができます。

```
A> MODE 80
A> TINST
```

別記事に詳細がありますが、80 文字 (`MODE 80`) で動作させるなら、`Teleray series 10` を選べばいいです。

| 項目 | 説明 |
|:---|:---|
| 25) Teleray series 10 | VT-52 互換 (ハイライトなし) |

MSX は 3.58MHz なので、クロックはとりあえず `4` に設定しておきます。

| 項目 | 設定値 |
|:---|:---:|
| Operating frequency of your microprocessor in MHz (for delays): | 4 |

 - [MSX-DOS 用の設定 - Turbo Pascal 3.0 のスクリーン設定 (Qiita)](https://qiita.com/ht_deko/items/0d8976801c02ec685bd6#-msx-dos-用の設定)

:::note
Turbo Pascal は MSX1 でも動作するのですが、80 文字モードにできないため `MODE 40` 用のスクリーン設定を作成する必要があります。40 文字モードでは `TINST.COM` の設定画面が見にくいので、一旦 MSX2 等の 80 文字モードや CP/M-80 エミュレータで `MODE 40` 用のスクリーン設定を作成する事をオススメします。
:::


## コマンド設定 (TINST)
コマンド設定を `TINST.COM` で行う事ができます。

```
A> MODE 80
A> TINST
```

**CURSOR MOVEMENTS:**

| NO | 機能 | ショートカット | 表示|
|:---:|:---|:---|:---|
|  1 | Character left| カーソル左 (←) | Ctrl-] |
|  2 |   Alternative|  | |
|  3 | Character right| カーソル左 (→) | Ctrl-\\ |
|  4 | Word left|  | |
|  5 | Word right|  | |
|  6 | Line up| カーソル上 (↑) | Ctrl-^ | 
|  7 | Line down| カーソル下 (↓) | Ctrl-_ |
|  8 | Scroll down|  | |
|  9 | Scroll up|  | |
| 10 | Page up| | |
| 11 | Page down|  | |
| 13 | To right on line |  | |
| 14 | To top of page |  | |
| 15 | To bottom of page |  | |
| 16 | To top of file |  | |
| 17 | To end of file |  | |
| 18 | To beginning of block |  | |
| 19 | To end of block |  | |
| 20 | To last cursor position |  | |

**INSERT & DELETE:**

| NO | 機能 | ショートカット | 表示|
|:---:|:---|:---|:---|
| 21 | Insert mode on/off |  |  |
| 22 | Insert line |  |  |
| 23 | Delete line |  |  |
| 24 | Delete to end of line |  |  |
| 25 | Delete right word |  |  |
| 26 | Delete character under cursor | 〔Delete〕 | \<DEL\> |
| 27 | Delete left character | 〔BS〕 | Ctrl-H |
| 28 |   Alternative |  |  |

**BLOCK COMMANDS:**

| NO | 機能 | ショートカット | 表示|
|:---:|:---|:---|:---|
| 29 | Mark block begin |  |  |
| 30 | Mark block end |  |  |
| 31 | Mark single word |  |  |
| 32 | Hide/display block |  |  |
| 33 | Copy block |  |  |
| 34 | Move block |  |  |
| 35 | Delete block |  |  |
| 36 | Read block from disk |  |  |
| 37 | Write block to disk |  |  |


**MISC. EDITING COMMANDS:**

| NO | 機能 | ショートカット | 表示|
|:---:|:---|:---|:---|
| 38 | End edit | <font color="Crimson">〔ESC〕〔0〕</font> | <font color="Crimson">\<ESC\> 0</font>|
| 39 | Tab |  |  |
| 40 | Auto tab on/off |  |  |
| 41 | Restore line |  |  |
| 42 | Find |  |  |
| 43 | Find & replace |  |  |
| 44 | Repeat last find |  |  |
| 45 | Control character prefix |  |  |

:::note
[MSX0 Stack](https://qiita.com/ht_deko/items/b284cb93ac34e2b77d9a) のキーボードフェイスでは`〔Ctrl〕`キーが押せないため、そのままではコードエディタを終了させる事ができません。`38: End edit` に別のショートカットを割り当てる必要があります。例では`〔ESC〕〔0〕`を割り当てています。キーボードフェイスで設定するのは危険を伴うので、リモートコントロールパネルからの設定をオススメします。
:::
 
 - [MSX-DOS 用の設定 - Turbo Pascal 3.0 のキーボードショートカット (Qiita)](https://qiita.com/ht_deko/items/86ddf71d0c509125b7ba#msx-dos-%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A
)


## 8 bit パッチ

CP/M 80 版の Turbo Pascal は 8bit 文字が通りません (MSX 版は大丈夫)。このため、自前でパッチをあてる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e908e386-271a-1ccc-cf98-65cb2fd15572.png)

任意のバイナリエディタで `TURBO.COM` から `7F` `FE` を検索し、`FF` `FE` に書き換えれば 8bit 文字が通るようになります。これは Turbo Pascal 1.0 / 2.0 も同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8811501a-e7c6-1c7c-4c54-0ef69330de95.png)

 - [8bit 文字 (CP/M 80 版) - Turbo Pascal 3.0 の使い方 (Qiita)](https://qiita.com/ht_deko/items/ec212f5cc17cbe5f718b#8bit-%E6%96%87%E5%AD%97-cpm-80-%E7%89%88)

## TPA とエンドアドレス

実行形式ファイル (`*.COM`) をメモリ搭載量の異なる機種で動作させるためには、その機種の TPA [^1] に合わせてコンパイラオプションでエンドアドレスを変更する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f15c5468-47ce-fdee-6089-02a697421b07.png)

| Mem | Start<br>(Min) | End | End<br>(Max) |
|:---|:---:|:---:|:---:|
| 64K | 20E3 | **F942** | FC06 |
| MSX-DOS Player | 20E3 | **EC42** | EF06 |
| MSX0 Stack<br>MSX-DOS (57.25K) | 20E3 | **DE42** | E106 |
| MSX0 Stack<br>MSX-DOS (漢字) | 20E3 | **DA42** | DD06 |
| 56K | 20E3 | **D942** | DC06 |
| MSX0 Stack<br>Nextor (54.75K) | 20E3 | **D442** | D706 |
| MSX0 Stack<br>MSX-DOS2 (54.5K) | 20E3 | **D342** | D606 |
| 54K | 20E3 | **D142** | D406 |
| MSX0 Stack<br>MSX-DOS2 (漢字) | 20E3 | **CF42** | D206 |
| 48K | 20E3 | **B942** | BC06 |
| PC-G850V<br>EborsyEEP (43K) | 20E3 | **A542** | A806 |	   
| 40K | 20E3 | **9942** | 9C06 |
| 32K | 20E3 | **7942** | 7C06 |

48K の設定にしておけば、殆どの MSX で動作すると思います。

:::note
エンドアドレスはターゲットの MSX の TPA に合わせる必要があります。

例えば、ANK モードで『Turbo Pascal』を起動して実行形式ファイルを生成し、漢字モードで実行形式ファイルを実行するとメモリ不足で動作しない事があります。
:::

## クロスコンパイル

PC で CP/M-80 エミュレータを動作させ、そこで『Turbo Pascal』を走らせて MSX 用にクロスコンパイルする事もできます。

例えば **『RunCPM』** は TPA を 64KB に設定できるので、MSX ではコンパイルできないサイズのソースコードをコンパイルする事が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2e967fd5-fca9-8db2-36a1-2ccaaebcc0bb.png)

MSX 固有の機能を使っていなければ、CP/M-80 で動作するアプリケーションを MSX で作る事も可能です。

:::note
クロスコンパイル環境でも MSX 用のスクリーン設定を追加し、TINST で MSX 用に切り替えた状態でコンパイルする必要があります。テキスト画面制御用の関数 (`GotoXY()` 等) は TINST でのスクリーン設定 (エスケープシーケンス) を参照しているからです。
:::


 - [RunCPM (Github: @MockbaTheBorg)](https://github.com/MockbaTheBorg/RunCPM)
 - [RunCPM コンパイル済バイナリ - MSX0_TP3 (Github: @ht_deko)](https://github.com/ht-deko/MSX0_TP3/tree/main/RunCPM)

## クロスコンパイル (その2)

『MSXPad』という Windows で動作するクロスコンパイル環境もあります。

こちらには **『Turbo Pascal 3.3f』** という MSX computer club Enschede (Frits Hilderink 氏) 製の MS-DOS 用コマンドラインコンパイラが使われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/c393ceb6-3b00-8de4-a962-4c32007d5084.png)

なお、『Turbo Pascal 3.3f』には (クロスじゃない) MSX で動作するコマンドラインコンパイラもあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/cd9d81e7-cba7-76b6-0639-77de2f3dfb79.png)

 - [MSXPad を 64bit Windows で使えるようにする (Qiita)](https://qiita.com/ht_deko/items/0689cae7daf8582e8492)
 - [MCCE Turbo Pascal (MSX Resource Center)](https://www.msx.org/wiki/MCCE_Turbo_Pascal)
 - [Hinotori Library (Github: \@popolony2k)](https://github.com/popolony2k/hinotori)

## 再帰
再帰を含むコードを記述する場合にはコンパイラ指令 `{$A-}` を指定する必要があります。

| 指令 | 指令 | 説明 |
|:---|:---|:---|
| 絶対コード | **{$A+}** または {$A-} | 絶対コードの生成。再帰的呼び出し (リカーシブコール) が不可能なコードを生成するか、可能なコードを生成するか？再帰を含むコードでは {$A-} を指定しなくてはならない。 |

```pascal
program TEST(Input, Output);
{$A-}
...
```

:::note
`{$A+}`は C 言語の `#pragma nonrec` に相当します。
:::

## コード入力支援
『MSX-DOS TOOLS』や『MSX-DOS2 TOOLS』に含まれる **KEY.COM** を使ったキーボードテンプレートです。大したものではありませんが、Turbo Pascal 起動前に実行しておくとコードの記述が幾分楽になります。

```batch:TP3KEYS.BAT
KEY OFF
KEY 1,"begin\0Dend\3B"
KEY 2,"if\20\20then"
KEY 3,"for\20\20to\20\20do"
KEY 4,"while\20\20do"
KEY 5,"repeat\0Duntil\20\3B"
KEY 6,"program\20\3B"
KEY 7,"else"
KEY 8,"goto\20\3B"
KEY 9,"case\20\20of\0Dend\3B"
KEY 10,"with\20\20do"
KEY ON
```

こちらの方が速いです。

```batch:TP3KEYS.BAT
KEY ON 1,"begin\0Dend\3B" 2,"if\20\20then" 3,"for\20\20to\20\20do" 4,"while\20\20do" 5,"repeat\0Duntil\20\3B"
KEY 6,"program\20\3B" 7,"else" 8,"goto\20\3B" 9,"case\20\20of\0Dend\3B" 10,"with\20\20do"
```

| ファンクションキー | キーボードテンプレート |
|:---:|:---|
| \[F1\]  | **begin<br>end**; |
| \[F2\]  | **if&nbsp;&nbsp;then** |
| \[F3\]  | **for&nbsp;&nbsp;to&nbsp;&nbsp;do**  |
| \[F4\]  | **while&nbsp;&nbsp;do** |
| \[F5\]  | **repeat<br>until&nbsp;**;  |
| \[F6\]  | **program** ;  |
| \[F7\]  | **else**  |
| \[F8\]  | **goto** ;  |
| \[F9\]  | **case&nbsp;&nbsp;of<br>end**; |
| \[F10\]  | **with&nbsp;&nbsp;do** |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b28b1126-ba41-11d2-07a3-e351444ecbcc.png)

:::note
`KEY.COM` を使ってキーボードテンプレートを最下行に表示する場合は `TINST.COM` を使ってスクリーンの行数を **23** にする必要があります。また、キーボードテンプレートは最下行に表示されていなくても利用可能です。
:::

### TPKEYS.COM

トランジェントコマンド [TPKEYS.COM](https://qiita.com/ht_deko/items/6f15aee0bd25b550e4df#-tpkeys) を作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/90b66156-0cd7-ef5f-8705-1838eae50c95.png)

 - [MDL-LIB version 2.2 の使い方 (Qiita)](https://qiita.com/ht_deko/items/6f15aee0bd25b550e4df)
 - [MSX0 用トランジェントコマンド (外部コマンド) (GitHub)](https://github.com/ht-deko/MSX0_TP3/tree/main/TRANSIENT)

# ドキュメント
公式の日本語マニュアルは書籍として販売されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/38d25937-23c3-62b0-9c43-3da5712fd62c.png)

| タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:---|:---|:---:|:---:|
| Turbo Pascal プログラミング・マニュアル | ボーランドインターナショナル(編)<br>マイクロソフトウエアアソシエイツ(訳) | [4880631205](https://www.amazon.co.jp/dp/4880631205)  | 1984/6/25 |

この書籍は国立国会図書館デジタルコレクションで読む事ができます。

 - [Turbo Pascal プログラミング・マニュアル (国立国会図書館デジタルコレクション)](https://dl.ndl.go.jp/pid/12632227)

:::note
書籍の閲覧には国立国会図書館の利用者登録 ([本登録](https://www.ndl.go.jp/jp/registration/individuals_official.html)) が必要です。
:::

### 書籍

Turbo Pascal 関連書籍に関する別記事があります。

 - [イロイロな出版社から出ている Turbo Pascal 関連書籍を読んでみる (Qiita)](https://qiita.com/ht_deko/items/29d9167bf288f303eb93)


# 広告

『Turbo Pascal 3.0』の広告です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/a2b1ff2d-0ca6-63f1-8055-0f0f2b0bc05f.png)

# おわりに
『Turbo Pascal 3.0』の使い方に関しては別記事があり、本記事は MSX 用に抜粋して加筆したものになります。

 - [Turbo Pascal 3.0.x の使い方](https://qiita.com/ht_deko/items/ec212f5cc17cbe5f718b)
   - [Turbo Pascal 3.0.x の Pascal](https://qiita.com/ht_deko/items/f9f394dc2342afd2ea7b)
   - [Turbo Pascal 3.0.x のスクリーン設定](https://qiita.com/items/0d8976801c02ec685bd6)
   - [Turbo Pascal 3.0.x のキーボードショートカット](https://qiita.com/ht_deko/items/86ddf71d0c509125b7ba)

MSX 固有の機能を Turbo Pascal から使う方法や、MSX そのものの書籍については以下のリンクが参考になるかと思います。

 - [MDL-LIB version 2.2 の使い方 (Qiita)](https://qiita.com/ht_deko/items/6f15aee0bd25b550e4df)
 - [【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c)
 - [【MSX0】LCD.LIB (Qiita)](https://qiita.com/ht_deko/items/084bdf1abaeb12753b38)
 - [【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】 (Qiita)]()
 - [MSX0_TP3 (Github: @ht_deko)](https://github.com/ht-deko/MSX0_TP3/)
 - [MSX-C に関する情報 (Qiita)](https://qiita.com/ht_deko/items/2a822c2edb85e1d54a11)

[^1]: Transient Program Area。MS-DOS で言う所のコンベンショナルメモリに相当。
[^2]: 別系統で Macintosh 版がありました。ver3.0 と ver4.0 の中間 +α。