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月26日日曜日

Z280MB 考え直して高速化

 前回、Z280MBのこれ以上の高速化はやめておくと心に決めていたのですが、なにか釈然としないのと、ASCIIARTの実行速度を収集?しているはせりんさんからのリクエストもあり、外部クロックの12MHz化を試してみることにしました。

難しいというか面倒なのは、外部クロックを変更できるのが、リセット時にハードウェア的にのみできるということです。実際には、

  • /RESETの立ち上がりエッジで、/WAITをLowにしておく
  • AD0-AD7に初期化データを乗せておく
  • 2クロックサイクル以上、/WAITと初期化データを保持
最初はCPLDにまだ余裕があるので、/WAITをLowに保持するロジックを組み込もうと考えていたのですが、よく考えたら/RESETから適当にCRディレイ回路で/WAITを作れば良いと思いつきました。

問題は、2クロックサイクルが何のクロックサイクルかだったのですが、結局CLKピンからの出力2クロックサイクルのようです。データシートからは、外部入力クロックのXTALIのように読み取れるのですが、これに合わせると初期化できませんでした。長さは検証していないのですが、2クロックサイクル以上ならどうでも良いようです。

リセット回路にCRディレイ回路を付け足したのと、写真の赤線で囲んだところに、AD0-AD7に初期化データが乗せられるようにDIPスイッチとバッファが付け足してあります。

実行結果は、外部クロック6MHzから30秒ほど縮めて、1分33秒まで高速化できました。まあこれなら納得できます。



2021年9月5日日曜日

Z280MB ASCIIART(マンデルブロ集合)を実行してみて思うこと

 Z280MBにCP/Mを移植できたので、この界隈で試す人の多いASCIIARTを試してみました。


実行環境は、内部クロック12MHz / 外部クロック6MHz / MBASIC rev.5.21です。

結果は、キャッシュONで2分38秒、キャッシュOFFで5分11秒でした。結果をTwitterにあげたところ、Electrelicさんからリフレッシュを止めるともうちょっと速くなるとアドバイスをもらい試したところ、2分8秒まで改善しました。Z280MBはDRAMを使っていないので、リフレッシュは不要なのですが、こんなにリフレッシュサイクルが負荷になるとは思ってもいませんでした。

参考にさせてもらったElectrelicさんの記事はこちらです。Z280固有の初期化(その1)

結果は、はせりんさん 番外編:ASCIIART(マンデルブロ集合)ベンチマーク に掲載されたのですが、他のZ80系CPUに比べてお世辞にも速いとは言えません。同じクロックだと、確実に高速版Z80やHD64180に負けるでしょうし、キャッシュOFFの結果は悲惨です。

これ以上の高速化は、外部バスクロックの12MHz化とバーストモードを使うことが必要ですが、ハードウェアの改造や新規設計が必要になるのでやめておきます。

Z280には、ユーザ/システムの分離とか仮想メモリが可能なMMUとかI/D分離とか、他にも面白い機能があるので、浪漫あふれた古の石ということで良いのではないでしょうか。

CP/Mの次はFUZIXを移植してみたいと思っています。

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とディスクイメージを作るシェルスクリプトを入れておきました。

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