ラベル CP/M の投稿を表示しています。 すべての投稿を表示
ラベル CP/M の投稿を表示しています。 すべての投稿を表示

2022年8月11日木曜日

ZCCの注意点

YouTube に ZCCで "Hello, world" する動画を上げました。

"Hello, world" under CP/M-8000

 ZCCを使ってみて気づいた注意点を上げておきます。なにせK&R時代の古いCコンパイラなので、今の感覚でコードを書くと、思わぬところでエラーの嵐に遭遇します。

・=- に注意

 「x=-1」 は、「x = -1」ではなく「x -= 1」に解釈されます。コンパイル時にwarningがでますが、オブジェクトファイルが出力されリンクも正常にできるので注意が必要です。実行してみて意図した動作をしないことで気づきましたが、理由がわからずしばらく悩みました。 かなり古い(K&R以前?)の書き方のようです。

・関数のプロトタイプ宣言に引数の型を含めない & 戻り値がなくても int で宣言

 これもかなりハマりました。次のように宣言します。

         int foo(a, b);

         foo(a, b) int a, b;
         {
            /* 戻り値なしの処理 */
         }

・unsigned char が使えない?

 unsigned int は使えるのですが、unsigned char はサポートしていないようです。

・関数名、ラベル名、変数名は8文字まで 

 Cコンパイラは名前の前に "_" をつけるので、実質使えるのは7文字です。それ以上の文字は無視されるので、気を付けないと違う名前を付けたのに同じと判別されてしまいます。アセンブラとリンカが8文字までしかとらない仕様なので、これは仕方ありません。

・コンパイラの -D オプションが働かない

 これは、The Unofficial CP/M Web Siteに書かれていました。試したところ本当に働きません。ヘッダファイルに、#define で定義しておく必要があります。

・コンパイラのオプションがわからない

 ZCCのドキュメントが失われているようで、コンパイラーに指定できるオプションがわかりません。今のところわかっているのは、上の働かない-Dぐらいです。CP/M-68KのCコンパイラにはドキュメントが残っているようなので、参考になるかもしれません。

・改行コードと終端コードに注意

 改行コードがCR+LFで、テキストがEOFで終端されていないとエラーに悩まされます。これはZCCというよりCP/Mの仕様なのですが、意味のわからないエラーメッセージがでるので悩まされます。CP/M上でコードを編集する場合は大丈夫ですが、LinuxやWindows上で編集している場合に問題になります。改行コードは指定しておけば問題ないのですが、末尾にEOFをいれてくれるエディターはないようなので、意図的に入れる必要があります。VimだとCtrl+Zで入れられます。EOFのあとにテキストが入っていても無視されます。

癖がわかってくると、ZCCは結構使える気がします。アセンブリ言語で書くよりは格段に楽ですから、多少の制約は我慢できます。

2021年9月30日木曜日

FUZIXをビルドしてみる

 Z280MBにFUZIXを移植する試みの第一歩です。

FUZIXの情報を求めてネットをさまよってたどり着いたのが、Oh!石さんの FUZIXをビルドしてみよう です。最近のバージョン 0.4pre1 のビルドに成功されていて参考になります。

FUZIXにはターゲットとしてZ280もあるのですが、まだ動作していないようなので、まずはz80packでFUZIXを動かし、その構造や動作を確認したいと思います。

FUZIXの実行環境構築

Ubuntu 20.04.3と WSLで確認しています。

SDCCのインストール

バージョンは4.1.0で、インストールはOh!石さんの記事に従って行っています。

z80packのインストール

バージョンは1.37です。こちらは、make installの前に、ホームディレクトリにbin/を作っておきます。make後はメッセージに従い $HOME/binをPATHに加えます。こうしないと、z80packの実行時にエラーが出ます。いちいちexportするのは面倒なので、.bashrcにでも書き加えておきます。
$ tar xvzf z80pack-1.37.tgz
$ cd z80pack-1.37/cpmsim/srcsim
$ make 
$ cd ../srctools
$ make
$ mkdir ~/bin
$ make install
$ export PATH=$PATH:$HOME/bin
cpmsim/cpm2で、CP/M 2.2 が起動するか確認しておきます。 Ctrl+\ で終了します。

FUZIXのビルド

GitHubからソースをクローンします。最新のコミットではkernelのコンパイルで失敗します。コンパイルが確認できているハッシュは、3d26de6eb800af0b1a5672b53ccbc0da6c1a3d1bです。
$ git clone https://github.com/EtchedPixels/FUZIX.git
$ cd FUZIX
$ git checkout 3d26de6e
Makefileを修正します。56行目あたりにビルドターゲットの指定があるので、z80packを指定します。90行目あたりのapps, kernel, diskimageターゲットから依存ターゲットのltoolsを削除します。
TARGET=z80pack
	...

apps:
	+(cd Applications: ...

kernel:
	mkdir -p Images ...
    
diskimage:
	mkdir -p Images ...

ユーティリティとクロス開発環境をコンパイルします。make install した後、/opt/fcc/binをPATHに加えておきます。

$ make stand
$ cd Library
$ make
$ sudo make USERCPU=z80 install
$ export PATH=$PATH:/opt/fcc/bin
クロス開発環境用のライブラリをコンパイルします。
$ cd libs
$ make -f Makefile.z80 USERCPU=z80
$ sudo make -f Makefile.z80 USERCPU=z80 install
FUZIXアプリケーションをコンパイルします。fcc(SDCC)でのコンパイルはかなり時間がかかるので、テレビでも見ながら気長に待ちます。
$ cd ../../
$ make apps
カーネルをコンパイルし、ルートファイルシステムとブートディスクのイメージを作成します。
$ make kernel
$ make diskimage

FUZIXの起動

ディスクイメージは、FUZIX/Images/z80pack/に作られています。これらをz80packにコピーしエミュレータを起動します。

$ cp FUZIX/Images/z80pack/boot.dsk z80pack-1.37/cpmsim/disks/drivea.dsk
$ cp FUZIX/Images/z80pack/hd_fuzix.dsk z80pack-1.37/cpmsim/disks/drivei.dsk
$ cd z80pack-1.37/cpmsim/
$ ./cpmsim

bootdev: には 0 を入力し、rootでログインすれば、プロンプトが出ます。

終了する場合はshutdownコマンドを実行後、Ctrl-\ を入力します。

 

 

2021年9月5日日曜日

Z280MB CP/Mを移植

ここしばらく、Z280MB に CP/M を移植していました。移植したバージョンは 2.2 です。EDでコードを書きASMでアセンブルできることを確認しています。

CP/M-8000 の移植は経験済みだったので、大して難しくないのかなと思っていたのですが、ディスクアクセス周りで苦戦して結構時間がかかってしまいました。かなり悩んだすえ、結局使っていたコンパクトフラッシュカードの問題だったようなのですが、おかげで、8-bit から16-bit PIOモードにコードを書き換えたりできたので良しとします。ディスクアクセスのブロッキング・デブロッキングは思いっきり手抜きです。気が向いたら書き換えることにします。

CP/M-8000と違って、CCPがコマンドで上書きされたり、メモリーの配置が全然違ったりで最初とまどったのですが、ネット上に情報が豊富にあり助けられました。今回の移植作業で、参考にしたサイトを上げておきます。

pineconeの電子工作 

 BIOSの作成過程が楽しく詳しく語られています。非常に参考になりました。

nekoJavaさんのCP/Mコーナー

 CP/M-8000のときも参考にさせてもらいました。CP/Mど素人の私にはありがたいサイトです。

Grant's homebuilt electronics

 コンパクトフラッシュをつなぐのに参考にさせてもらっています。

移植の成果は、Github にあげておきました。CP/Mのライセンスの関係でBIOSのソースコードのみを上げることにしました。BIOSをアセンブルし、できたバイナリをCPM.SYSと結合するMakefileとディスクイメージを作るシェルスクリプトを入れておきました。

まあ、試す人はいないと思いますが。