« Apple IIc その4 | メイン | 写真日記240 »

2017年11月24日

Apple IIc その5 (Aztec C)

カテゴリー: レトロPC

17日の日記のその後です。Apple IIにはAztec CというC言語の処理系があって、現在はフリーになっているそうなので(用途は研究、教育目的に限る?)試してみました。

Aztec C (ラベルはソレっぽく自作)動作条件はProDOSが動くこと、フロッピーディスクドライブが少なくとも2台あること、アルファベットの小文字が使えること(初期のApple IIは大文字しか使えない)、フルセットのASCII文字が使えること(これも同様)という内容です。また、私が試した限り、モニタは80桁表示が必須のようです。(80桁表示できない機種では変わる?)

私のIIcは2つ目の条件を満たしていませんが、一方でRAMディスクが使えるので、なんとかなるだろうと思って試してみました。

せっかくなので、ファイルの入手からプログラム開発までの流れを、ちょっとマニュアル風にまとめてみたいと思います。私にしては珍しいHOWTOモノですが、たぶんしばらくたつと忘れるので(^^;)

以下、対象読者はCUI環境でC言語のプログラムをビルドした経験のある人です。


■はじめに

Aztec Cはいくつかのバージョンがありますが、私は公式サイトのApple II Native Mode CompilersにあるAztec C65 for the Apple II ProDOS Disks 1 to 8(←直リンク)をダウンロードしました。ドキュメント類もダウンロードしておくと良いでしょう。

ディスク(イメージファイル)は全部で8枚ありますが、ADTProなどで実機に転送し、ディスクに書き込んでおいてください。エミュレータの場合は、そのまま実行できます。

とりあえず以下の3枚があれば簡単なものは作れます。

ManxSYSTEM.dsk 起動ディスク、シェル、エディタ
ManxCC.dsk インクルードファイル、コンパイラ
ManxLN.dsk ライブラリ、リンカ

更に、作業用ディスクが1枚必要です。私はここをRAMディスクで代用しましたが、最終的な保存用に、やはり1枚は必要だと思います。(RAMディスクは電源を切ったりリセットすると消えてしまうので)

なお、ディスクの容量140KBに対してRAMディスクは64KBくらいしかないので、半分以下です。その分、大きなプログラムが作れなくなります。ソースファイル、オブジェクトファイル、実行ファイルをあわせた容量が必要なので、作れるのはだいたい2〜30KBくらいまでのプログラムですかね。まあ、8bit機としては決して小さくはないと思うので、これでも色々なことができるはずです。


■ブート

まず、ManxSYSTEM.dskをドライブ1に挿入して起動します。ProDOSベースなので、ディスク名があります。このディスクは/Systemです。

起動するとAztec C ShellというCUIのシェルが立ち上がります。UNIXのシェルとそっくりなので、使い方は説明しません。ファイル一覧(ls)、カレントディレクトリの移動(cd)、コピー(cp)、削除(rm)、プログラムの実行(ファイル名)などが使えて、あとはパスの記述などができればOKです。

起動したらドライブ2に作業ディスクを挿入し、必要ならフォーマットします。フォーマットはシェルからfilerを実行するとProDOSのユーティリティが起動するので、そこから可能です。ディスクの名前は何でもいいのですが、頻繁に入力するので短いほうが良いと思います。マニュアルでは/workになっていました。RAMディスクの場合は最初から/ramという名前で作られています。以下、/ramで説明しますが、適宜読み替えてください。

作業ディスクの準備ができたら、まずシェルのプログラム自身(shell.system)をコピーします。これは、ドライブ2(またはRAMディスク)に作業ディスクを固定し、ドライブ1のディスクを抜き差ししながら作業できるようにするためだと思われます。(Apple IIはシングルタスクなので、シェルから何かプログラムを起動するとメモリからシェルが破棄されるためと推測)

cp shell.system /ram

コピーができたら今後の作業のためにカレントディレクトリを作業ディスクに移動し、そこからシェルを実行します。

cd /ram
shell.system

これで準備は完了です。RAMディスクの場合は、これを起動毎にやる必要があります。


■コーディング

次はソースファイルの編集です。ドライブ1にある/systemにはvedというフルスクリーンエディタが入っています。これはUNIXのviとそっくりなエディタで、使い方も同様のようなので、説明しません。(ネットにたくさんあります)

例えばhello.cというソースファイルを編集する場合は以下のように起動します。hello.cというファイルが存在しない場合は新しい文書として実行されます。

ved hello.c

編集が済んだら、保存して終了します。例えばソースはこんな感じですね(^^;)

main()
{
    printf( "hello, world\n" );
}

ちなみにAztec CはANSI規格準拠以前のC言語のようで、関数の定義などに若干の違いがあります。引数は引数名のみで型などは記述しない、voidもない、プロトタイプ宣言もない、という感じでしょうか。さすがに私も経験はないので、詳しくは分かりません。


■コンパイル

編集が済んだらコンパイルです。ドライブ1をManxCC.dskに入れ替えてください。ディスク名は/ccですが、パスが通っているのでプログラムはディスク名がなくても実行できます。

cc hello.c

このあたりは一般的な手順ですね。でも、たったこれだけのプログラムですが、コンパイルには数十秒かかります。無事コンパイルが終了するとhello.oというオブジェクトファイルができているはずです。

なお、Aztec Cはインラインアセンブラにも対応しており、Cのソースコード中にアセンブラのプログラムを記述できるようです。


■リンク

次はリンクです。ドライブ1をManxLN.dskに入れ替えてください。ディスク名は/lnです。

リンクには先程のhello.oと、c.libというライブラリを指定します。

ln hello.o /ln/c.lib

リンクには数分かかると思います。無事終了すると、helloという実行ファイルができます。シェルからhelloと入力すれば、無事hello, worldと表示されるはずです。

RAMディスクを作業ディスクとした場合は、実行前にソースのバックアップを取るのが懸命です。開発したプログラムにバグがあって暴走したりしたら、その時点でRAMディスクの内容は消えてしまう可能性が高いからです!(^^;)

なお、このプログラムは、このシェルで実行することしかできません。ProDOSの(BASICの)プロンプトから実行できるようにするには、以下のように+bオプションを付け、またsamain.oというライブラリも追加します。

ln +b hello.o /ln/samain.o /ln/c.lib

実際には毎回この形でリンクするのではなく、プログラムが完成してから最後だけ行ったほうが効率が良いのではないかと思います。

なお、ProDOSではなく(古い)DOS 3.3で実行するプログラムにするには、c.libのかわりにd.libというライブラリを使用する必要があるようです。これはManxDOS33.dskというディスクに入っています。samain.oは必要ないようですが、はっきり説明がなくて分かりません。

また、ManxLIB.dskというディスクにはc.lib以外のライブラリが入っています。グラフィック処理や浮動小数点演算など有用なライブラリですが、こうやって複数のディスクに入っているライブラリを同時にリンクする方法は、まだよく分かりません。マニュアルをざっと読んだ限りでは分からなかったので、私は1枚のディスクに必要なライブラリをコピーして(不要なものは消して)まとめてしまいました。上の写真がそれです。


■インタプリタ版

Aztec Cはコンパイラだけでなくインタプリタでの開発も可能になっています。とはいえ、BASICのようにソースを書いてすぐに実行できるわけではなく、やはりコンパイル、リンクという作業が必要です。実行にはccの代わりにcci、ライブラリも同様にci.libなど、iの文字がついたものを使うようです。(リンカはコンパイル版と同じln)

インタプリタ版のメリットは、遅いけど小さいということらしいです。他にもデバッグができる等の記述もあった気がしますが、まだよく分かりません。


■シェルスクリプト

Aztec C Shellでは、テキストファイルに書かれたコマンドはスクリプトとして実行できるようです。コンパイルやリンクの書式はいつも同じなので、スクリプトを用意しておくと便利ですね。makeのような仕組みはないようですが、似たようなことができると思います。

また、作業ディスクとRAMディスクの間のファイルのコピーなどもスクリプト化しておくと便利です。というか事実上、これを作らないとやってられないと思います(^^;)

ただ、このAztec C Shellは、テキストファイルならなんでもスクリプトとして実行してしまうようなので、注意が必要です。一度、間違ってソースファイルを実行してしまったのですが、1行目から順々に、処理を実行しようとしてはエラーが出るという繰り返しになってしまい、しばらく作業ができませんでした(笑)


■おわりに

以上、ざっとですがAztec Cの使い方を書いてみました。コーディング、コンパイル、リンク、それぞれの作業のたびにディスクの差し替えをしなければならないというのは、ある意味カルチャーショックなくらい不便ですが、ディスク容量が十分でない環境では、こうするしかありませんね。昔の人は大変だったんだなと思う反面、じっくり時間をかけて仕事に打ち込めて、それはそれで古き良き時代なのかな、とも思いました。


関連リンク
Apple IIc その6 (2017年12月07日)



コメント

よろしければコメントしてください。

※メールアドレス以外の項目はこのページ上に公開されます。個人情報などの入力にはご注意ください。




保存しますか?


「投稿」ボタンを押してから書き込み完了までに多少時間がかかる場合があります。ご了承ください。