UCSD Pascal を触るためだけの UCSD p-System 操作ガイド

# はじめに
UCSD p-System の使い方をよく忘れるので備忘録を兼ねて。

# UCSD p-System とは
ざっくり言うと Pascal で書かれた OS で、Pascal を実行するための OS です。

**See also:**

 - [UCSD p-System (Wikipedia)](https://ja.wikipedia.org/wiki/UCSD_p-System)
 - [UCSD Pascal (Wikipedia)](https://ja.wikipedia.org/wiki/UCSD_Pascal)

## UCSD p-System のダウンロード
MS-DOS で動作する UCSD p-System が pascal.hansotten.com から DL 可能です。

 - [UCSD p-System (Pascal for small machines)](http://pascal.hansotten.com/ucsd-p-system/)
 - [UCSD p-System IV 2.2 への直接リンク](http://pascal.hansotten.com/uploads/ucsd/files/psys22.zip)

## UCSD p-System の動作環境
UCSD p-System IV 2.2 は DOSBox(-X) で動作させる事ができます。

 - [DOSBox](https://www.dosbox.com/)
 - [DOSBox-X (GitHub)](https://github.com/joncampbell123/dosbox-x/releases)

## 起動
DOSBox(-X) から、

```
C:\>CD PSYS22
C:\PSYS22>PSYSTEM PSYSTEM.VOL PUTIL.VOL
```

## p-System の操作
起動時にこのようなエラーが出ますので、〔SPACE〕キーを押して無視します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/bc8adb2b-83a2-f2e5-05c7-07f23d6b498f.png)

### [コマンドメニュー (Command:)]
コマンドメニューです。このメニューに限りませんが、メニューの最後に `?` が表示されている場合には〔？〕キーを押すことで表示されていないコマンドを表示する事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/71c7d23f-9c42-47d7-7389-203364ee702d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/4fd30b83-5c50-12d1-74d1-28acfc952e62.png)


| キー | 説明 |
|:---:|:---|
| **E**(dit | [編集メニュー] へ移動 |
| **R**(un  | [実行] |
| **F**(ile  | [ファイルメニュー] へ移動 |
| **C**(omp  | [コンパイル] |
| **H**(alt  | MS-DOS へ戻る |
| **?**  | 他のコマンドを表示 |

〔E〕キーを押して [編集メニュー] へ移動します。

### [編集メニュー (Edit:)]
初期状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b25d456d-25da-2221-8434-30d75a369264.png)

| キー | 説明 |
|:---:|:---|
| 〔Enter〕 | 新規ファイル作成 |
| 〔？〕〔Enter〕 | ファイル選択画面へ |

〔Enter〕キーを押してファイルを新規作成します。

#### ファイル編集 (コマンドモード)
エディタのコマンドモード画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/c99b8f2a-a7a1-b859-a221-f2c3977aa8c0.png)

| キー | 説明 |
|:---:|:---|
| **I**(nsert  | 挿入モードへ |
| **Q**(uit  | [コンパイルメニュー] へ移動 |
| **?**  | 他のコマンドを表示 |

〔I〕キーを押して挿入モードにします。

#### ファイル編集 (挿入モード)
エディタの挿入モード画面です。自由に入力する事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/bf71eb0f-8aaa-efda-f228-1caef6b80527.png)

| キー | 説明 |
|:---:|:---|
| 〔Esc〕 | 編集を適用せずにコマンドモードへ |
| 〔Ctrl〕+〔C〕 | 編集を適用してコマンドモードへ |

とりあえず FizzBuzz を入力してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/916813c7-c36c-8273-79a5-5f311ec841f4.png)

〔Ctrl〕+〔C〕でセーブし、コマンドモードに戻ります。上部のプロンプトが `>Edit` になっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2d1db882-5e59-f95a-19da-ab290013fec0.png)

#### 編集終了
初期状態だとファイルはテンポラリの名前 `CREATED.0.TEXT` になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8b95683f-bc79-0406-1668-48503341ee71.png)

| キー | 説明 |
|:---:|:---|
| **C** | ファイル名の変更 |
| **E** | ファイルを保存せずに終了 |
| **R** | 編集に戻る |
| **U** | ファイルを保存して終了 |

ファイルの名前を `FIZZBUZZ.TEXT` にしてみます。〔C〕キーを押し、`FIZZBUZZ` とタイプします (拡張子不要)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2488028a-a541-7ebc-3a16-7b70fda2732e.png)

ファイル名が変更されたので、今度は〔U〕キーを押し更新して [コマンドメニュー] に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ffdd3e5f-6262-fbfd-33d5-7d5f4721debe.png)

 [コマンドメニュー] に戻りました。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b5e6e22b-8bed-7248-8085-e6424e96f2bd.png)

[編集メニュー] で〔？〕〔Enter〕を押すとアルファベットでファイルを選択する事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6d9447af-7e28-0ba8-4a36-0248e5ac4508.png)

[編集メニュー] で直接 `FIZZBUZZ` と入力してファイルを指定する事も可能です。

### [コンパイル]
コンパイルするファイルを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e9ce9572-7e99-e8fd-0868-dfeff58e485c.png)

`to what codefile?` と `Output file for compiled listing?` は〔Enter〕キーで飛ばします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6175b91e-9fe8-0c6c-c721-9d191c54c42f.png)

正常にコンパイルが終わり、[コマンドメニュー] に戻りました。

### [実行 (Run)]
現在のファイルが FIZZBUZZ なので、[コマンドメニュー] で〔R〕キーを押すと FIZZBUZZ が実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/4d0b6cc5-b2d5-663c-54cc-3a5383d83a64.png)

コンパイルせずに実行しようとすると 「FIZZBUZZ.CODE がみつからない」と怒られます。FIZZBUZZ.CODE はコンパイルすると作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/9db3782c-efdb-401c-958b-3df1b5082c31.png)

### [実行 (Execute)]
既にコンパイルされているプログラムをファイル名を指定して実行するには〔X〕キーを押してファイル名を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/22f93df4-8b7d-87c2-6017-97483d21020d.png)

### [ファイラーメニュー (Filer)]
ファイラーの初期画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/774cf20e-c925-3f52-6f51-70dfb03ec13b.png)

| キー | 説明 |
|:---:|:---|
| **L**(dir  | ファイル一覧 |
| **R**(em  | ファイル削除 |
| **V**(olume  | ボリューム一覧 |
| **Q**(uit  | [コマンドメニュー] へ移動 |
| **?**  | 他のコマンドを表示 |

#### ファイル一覧
ファイル一覧を取得するボリュームを尋ねられますので `PSYS:` とタイプします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/3814a012-0e17-7357-a9c3-07aa1d63a5bd.png)

ファイル一覧が表示され、[コマンドメニュー] へ戻りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/786e2513-d657-fe07-609b-8164c07c511e.png)

#### ファイル削除
削除するファイルを尋ねられますので拡張子付きでファイル名をタイプします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/715773c2-1a90-61b6-c71e-ba66e609deb5.png)

#### ボリューム一覧
ボリューム一覧を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a0464054-33d6-f3b1-f5c9-ed8a39bf0fd7.png)

### 終了
[コマンドメニュー] で〔H〕キーを押すと MS-DOS に戻る事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7af12eee-7752-d57f-d743-408e4eb52f64.png)

### ファイルの再編集
一旦書いたファイルを編集するのはちょっとコツが要ります。

#### 削除モード
コマンドモードで編集位置へ移動し〔D〕キーを押して削除モードに入ります。カーソルキーで移動すると範囲選択になりますので削除範囲を指定したら〔Ctrl〕+〔C〕で反映させます。削除範囲の破棄は〔ESC〕キーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/5f92039e-6d3e-8176-7c9a-586ebfbbcb78.png)

画像は矩形の部分を範囲選択している状態です。実際には矩形は表示されず、文字だけが消えます。

#### 挿入
コマンドモードで編集位置へ移動し〔I〕キーを押して挿入モードに入ります。入力が完了したら〔Ctrl〕+〔C〕で反映させます。入力の破棄は〔ESC〕キーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/3f2ce002-8510-e7f0-5e4a-98bbc0f406b7.png)

画像はカーソル位置で〔I〕キーを押したところです。既存の行が右に移動していますが、実際に移動している訳ではありません。この位置に `abc` とタイプして確定させると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/80375fc2-7294-0661-2ccc-e26c06b1ee57.png)

ちゃんと `abcif` となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/4b004847-71f1-91ed-d31d-fff4d54a3e22.png)

### LOADFILES.TEXT のエラーを消す
冒頭の LOADFILES.TEXT のエラーはダミーの LOADFILES.TEXT を作ってやる事で消すことができます。

#### 手順
 1. p-System を起動し、〔SPACE〕キーを押してエラーをスキップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/de7f8801-5dd1-7146-c103-0c294bff3029.png)
 2. 上部に [コマンドメニュー] が表示されますので、〔E〕キーを押しエディタを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ca5d333b-a74c-3c2f-1854-87a85eb5c6e8.png)
 3. 〔ENTER〕キーを押しファイルを新規作成します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/0ad1bbe9-6a24-56ae-c968-3462405d8c70.png)
 4. そのまま〔Q〕キーを押してエディタを抜けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f79ed1a3-a011-fefc-fbea-1a1a0683e208.png)
 5. 〔C〕キーを押し、ファイル名を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ff3da1dc-5cb5-da6f-103f-551911355ccd.png)
 6. `LOADFILES` とタイプし、〔ENTER〕キーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/3db29afc-9a6d-ee71-bb32-54630b16e557.png)
 7. 〔U〕キーを押しファイルを更新して [コマンドメニュー] に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ad715680-bb37-c644-ecaa-e921b545b703.png)
 8. [コマンドメニュー] で〔H〕キーを押し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f2b3ae19-75ca-5f40-25d6-5f6fa83dbc61.png)
 9. 〔Y〕キーを押して MS-DOS に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/18048fa0-980c-7566-24f2-80bd41d44092.png)
 10. 再度 p-System を起動するとエラーは出なくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/dcbb2021-4e25-fe6a-ea60-da2d5581c90e.png)

## UCSD Pascal と標準 Pascal の違い

UCSD Pascal と標準 Pascal には幾つかの相違点があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/9d6156ac-9f97-85c7-7de4-cf72467024e1.png)

 - 標準 Pascal では **case** 文の評価式に一致するセレクタ (選択肢定数) がない場合にはエラーになりますが、UCSD Pascal では何も起こりません
 - 標準 Pascal に存在する `Dispose()` は存在しません。代わりに `Mark()` と `Release()` を使います
- UCSD Pascal には `{$` で始まるコンパイラ指令が存在しますが、標準 Pascal にはコンパイラ指令がないため `{$` はコメントの始まりとみなされます
- INTERACTIVE 型により`〔Enter〕`キーを伴わない一文字入出力が可能です
- ランダムアクセスファイルのために `Seek()` が用意されています
- **goto** は手続き内 goto (intraprocedural gotos) です
- ルーチンを `Exit` で抜ける事ができます
- `Pack()` 及び `Unpack()` をサポートしていません
- 手続きパラメータ及び関数パラメータをサポートしていません
- プログラムヘッダのパラメータに意味はないため省略する事が可能です
- **segment** による外部ルーチンの使用が可能です (他処理系の **external** に相当)
- ユニットによる分割コンパイルが可能です
- 集合型の要素数は 4080 です
- 文字列型 **String** があります。いわゆる **Pascal 文字列** は UCSD Pascal 由来です
- UCSD Pascal の Integer は倍長整数です

# おわりに
p-System そのものではなく、UCSD Pascal を触りたいだけならばこの程度の知識で充分かと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/fb656d41-289a-0431-cace-086a932587b3.png)

Apple ][ の Pascal も UCSD Pascal ver II ベースですね。

**See also:**

 - [標準 Pascal 範囲内での Delphi 入門 (Qiita)](https://qiita.com/ht_deko/items/e2796788c65c2cda1de5)
 - [Apple Pascal System についてのツイート](https://twitter.com/ht_deko/status/1106444651764965376)

## 参考資料: UCSDpシステム入門
UCSD Pascal を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e587470c-a2fb-b2fe-c06c-0670045d89d9.png)

| タイトル | 著者 |出版社 |出版年| Amazon |
|:---|:---|:---|:---:|:--:|
| UCSDpシステム入門<br>―Pascalで書かれた汎用OSのすべて | チャールズ・W.グラン (著)<br>ジョン・バター (著)<br>小池 慎一 (訳) |CQ 出版社| 1983/12/25 | [B000J78J5W](https://www.amazon.co.jp/dp/B000J78J5W/)  | 

p-System の使い方が日本語で読める書籍です。タイトルのせいでググラビリティが低いです...素直に『UCSD p-System 入門』でよかったのに。

原書は『INTRODUCTION TO THE UCSD p-SYSTEM』...なのだけれど、普通に Amazon で検索すると引っかからない。

| タイトル | 著者 |出版社 |出版年| Amazon |
|:---|:---|:---|:---:|:---:|
| INTRODUCTION TO THE UCSD p-SYSTEM | Charles W. Grant (著)<br>Jon Butah (著) |SYBEX Inc.| 1982/9 | [089588061X](https://www.amazon.co.jp/dp/089588061X)  | 

:::note
[『UCSD p システム入門 ― Pascal で書かれた汎用 OS のすべて 』](https://dl.ndl.go.jp/pid/12632155)は国立国会図書館デジタルコレクションで読む事ができます。書籍の閲覧には国立国会図書館の利用者登録 ([本登録](https://www.ndl.go.jp/jp/registration/individuals_official.html)) が必要です。
:::

## 参考資料: UCSD Pascal システム入門 / UCSD Pascal ユーザーズマニュアル
一般には入手できない書籍もあります。

| タイトル | 著者 |出版社 |出版年|
|:---|:---|:---|:---:|
| UCSD Pascal システム入門 | Kenneth L.Bowles (著),<br>越智 洋之, 小島 惇 (訳) | 日本ビジネスオートメーション | 1980/5 |
| UCSD Pascal ユーザーズマニュアル :<br>バージョンⅣ.0,Ⅱ.0 上下 | SofTech Microsystems (編) | 日本ビジネスオートメーション | 1981/10 |

原書の情報です。

| タイトル | 著者 |出版社 |出版年| Amazon |
|:---|:---|:---|:---:|:---:|
| Beginner's Guide for the Ucsd Pascal System | Kenneth L.Bowles (著) | Byte Books | 1980 | [0070067457](https://www.amazon.co.jp/dp/0070067457/) |
| UCSD Pascal user's manual,version Ⅳ.0 | SofTech Microsystems (編) | SofTech Microsystems | 1981/01 |  |

:::note
[『UCSD Pascal システム入門』](https://dl.ndl.go.jp/pid/12631552)及び[『UCSD Pascalユーザーズマニュアル : バージョンⅣ.0,Ⅱ.0 上』](https://dl.ndl.go.jp/pid/12631745)、[『UCSD Pascalユーザーズマニュアル : バージョンⅣ.0,Ⅱ.0 下』](https://dl.ndl.go.jp/pid/12631742)は国立国会図書館デジタルコレクションで読む事ができます。書籍の閲覧には国立国会図書館の利用者登録 ([本登録](https://www.ndl.go.jp/jp/registration/individuals_official.html)) が必要です。
:::