Jeans & Development / Fuzix https://www.rad51.net/jeans/ コンピューターのことなどを綴ったメモ (旧:目から鱗 w/SQLite) / Fuzixに関わる諸々 ja Jeans CMS © Weblog http://backend.userland.com/rss https://www.rad51.net/jeans/skins/jeans/images/jeans2.gif Jeans & Development https://www.rad51.net/jeans/ Cygwinを使ったFuzix v0.3のビルド https://www.rad51.net/jeans/?itemid=963
gcc-core
gcc-g++
make
patch
bison
flex
libboost-devel
git
zlib
zlib-devel

SDCC-3.9.0のビルドとインストール
Fuzix ver 0.3のビルドは、SDCC-3.6.0やそれ以前のものではうまく行かない。2019年現在の最新版の3.9.0を使う必要があった。ただし、以前も書いたように、デフォルトのSDCCではKernelのビルドができないので、パッチを当てなければならない。用意されているパッチは3.5.0用のものなので、3.5.0と3.9.0のソースコードを比較して、パッチを作り直した。パッチファイルのZIPアーカイブ「sdcc-3.9.0.patch.zip」はここからダウンロードできる

SDCC-3.9.0のソースコードを、ここからダウンロードし、展開する。先の通りダウンロードしたパッチファイルも解凍して「sdcc-3.9.0.patch」を同じディレクトリに置いて、適応する。三回ファイル名を聞かれるので、「sdcc-3.9.0/src/z80/gen.c」「sdcc-3.9.0/src/z80/main.c」「sdcc-3.9.0/src/z80/z80.h」を入力する。
tar xjvf sdcc-src-3.9.0.tar.bz2
patch<sdcc-3.9.0.patch

configureし、ビルドする。無事に終われば、インストールする。
cd sdcc-3.9.0
./configure --prefix=/usr --disable-pic14-port --disable-pic16-port --disable-mcs51-port --disable-r2k-port --disable-r3ka-port --disable-tlcs90-port--disable-ds390-port --disable-ds400-port --disable-hc08-port --disable-s08-port --disable-stm8-port --disable-ucsim
make
make install

Fuzix v0.3のビルド
Fuzixソースコードを取得し、ver 0.3のものに巻き戻す。Makefileを編集する。
「TARGET=z80pack」のところ、
「TARGET=tomssbc-rom」とする。
git clone https://github.com/EtchedPixels/FUZIX.git
cd FUZIX
git checkout cacbe5238588d352768ab95951c46d09879ba310
(Makefileを編集)

私の環境では、このままmakeすると、「find.c」のビルドでエラーが出て停止した。よく分からないので、このファイルのビルドをスキップする事にした。「Applications/MWC/cmd/Makefile.z80」の8行目で、「find.c」を削除し、次のように書き換えた。
SRCS  = ac.c almanac.c at.c col.c cron.c deroff.c du.c ed.c make.c \
	moo.c pr.c tar.c ttt.c units.c

全て準備が整ったので、いよいよビルドする。
make

ただし、アプリケーションはビルドできる事を確認するだけでオブジェクトは使わないので、アプリケーションのビルドが始まったらキャンセルし、「make kernel」としてカーネルのビルドを最後に行なうか、Makefileの72行目を「all: stand ltools libs kernel」として(appsを削除)、アプリケーションのビルドをスキップしても良いかも知れない。その場合は、上記の「Makefile.z80」の編集は必要ない。

Hello Worldプログラムをビルドしてみる
以上のプロセスが無事終了すれば、Fuzix ver 0.3用のアプリケーションを作製する環境が整った事になる。Hello Worldプログラムを作製してみた。

hello.c
#include <stdio.h>

int main(/*int argc, char* argv[]*/) {
  printf("Hello World!\n");
  return 0;
}

Makefile
all: hello.c
	/opt/fcc/bin/fcc -O2 -mz80 -c hello.c
	/opt/fcc/bin/fcc -O2 -mz80 hello.rel -o hello
clean:
	rm *.rel
	rm *.map

「make」すれば「hello」というファイルができるので、UCPによりディスクイメージに取り込めば、実行できる。
2019-11-09-hello.png
これで、Fuzixのカーネルを改変したりアプリケーションを開発したりする環境が、全て整った事になる。]]>
Fuzix https://www.rad51.net/jeans/?itemid=963 Sat, 09 Nov 2019 19:10:12 PST ITEM963_20191109
Cygwinを使ったFuzixのビルド https://www.rad51.net/jeans/?itemid=962
gcc-core
gcc-g++
make
patch
bison
flex
libboost-devel
git
gitやSDCCもcygwin上でインストールしないとうまく行かない。gitに付いてはcygwin用のバイナリーが使えるが、SDCCに付いてはビルドが必要である。

SDCCのビルド
SDCC ver 3.6.0 のソースコードをここからダウンロードして、展開し、configureする。
tar xjvf sdcc-src-3.6.0.tar.bz2
cd sdcc-3.6.0
./configure --prefix=/usr --disable-pic14-port --disable-pic16-port --disable-mcs51-port --disable-r2k-port --disable-r3ka-port --disable-tlcs90-port--disable-ds390-port --disable-ds400-port --disable-hc08-port --disable-s08-port --disable-stm8-port --disable-ucsim

このままmakeすると「info-recursive」が見つからないというエラーで停止するので、「support/sdbinutils/bfd/Makefile」を次のように修正する。
151行目「info-recursive 」を削除
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
	html-recursive install-data-recursive \
	install-dvi-recursive install-exec-recursive \
	install-html-recursive install-info-recursive \
	install-pdf-recursive install-ps-recursive install-recursive \
	installcheck-recursive installdirs-recursive pdf-recursive \
	ps-recursive uninstall-recursive

1832行目「info-recursive 」を削除
info:

ビルドし、インストールする。
make
make install

z80packのインストール
先の記事と同じように行える。ただし、「Makefile.linux」ではなく「Makefile.cygwin」を使う。
tar xzvf z80pack-1.24.tgz
cd z80pack-1.24/cpmsim/srcsim
make -f Makefile.cygwin
cd ../srctools
make

Fuzixのビルドと実行
後は、先の記事と同じように行える。ただし、Cygwinでは、「sudo」は必要ない。
2019-11-07-z80pack.png

当面、Fuzix用のアプリケーションの開発はこの環境で行なおうと思っている。

(追記)
この条件でz80pack上でFuzixを実行すると表示が乱れる。ただ、この不具合はCygwin用のz80packの方にあるようだ。CygwinでビルドしたFuzixをLinux上のz80packで実行すると、正常動作する。

なお、Cygwin上でsdcc-3.6.0でビルドした場合と、Ubuntu上ででsdcc-3.6.0でビルドした場合とで、両方とも動作するものの、作製されるオブジェクトが異なる。同じバージョンのコンパイラーを使っていても、何かが微妙に違うらしい。その事が影響するのか、Cygwin上でパッチを当てたsdcc-3.5.0を使ってTom's SBC用のカーネルをビルドしても、動作しなかった。]]>
Fuzix https://www.rad51.net/jeans/?itemid=962 Thu, 07 Nov 2019 16:44:33 PST ITEM962_20191107
FUZIX Kernelのビルドに挑戦 https://www.rad51.net/jeans/?itemid=961 一つ前の記事では、先人の教えにしたがって、Fuzix ver 0.1のビルドを行なった。現在使用しているFuzixは、ver 0.3で、Tom's SBC 用に構築された物である。これのビルドもできるようにしておきたい。色々試したのち、ようやくビルドできるようになったので、メモ。

Fuzix用SDCCのビルド
ここが一番のミソなのだが、Z80用Fuzixのビルドには、SDCCを少し修正して使っているらしい。ソースコード中、次のように書かれている。
https://github.com/EtchedPixels/FUZIX/blob/master/Kernel/patches
SDCC:

	This patch adds 

	1. Helpers to cut down the size of C code for function entry. Right
	   now the __enter and __enter_s must be in common memory.

	2. An option --external-banker that keeps 4 byte stack offsets for
	   arguments so the linker can patch up banked binaries. Unbanked
	   code is called via push af call foo pop af
このパッチを当てて、オプション「--external-banker」を有効にしないと、Tom's SBC用のKernelがちゃんとビルドできない。なので、まずパッチを当てたSDCCのビルドから始める。

SDCCのビルドに必要なツールをまずインストール。
sudo apt install bison
sudo apt install flex
sudo apt install libboost-dev

SDCC ver 3.5.0 のソースコードをここからダウンロードして、展開する。パッチファイル(SDCC)をここの「Raw」ボタンから取ってきて、同じディレクトリーに置き、パッチを当てる。複数回ファイル名を聞かれるので、「sdcc-3.5.0/src/SDCCglue.c」「sdcc-3.5.0/src/z80/gen.c」「sdcc-3.5.0/src/z80/main.c」「sdcc-3.5.0/src/z80/z80.h」と入力する。
tar xjvf sdcc-src-3.5.0.tar.bz2
patch<SDCC

SDCCのビルドとインストールを行なう。なお、別のSDCCを予めインストールしてあった場合は、そちらは削除しておく事。
cd sdcc-3.5.0
./configure --prefix=/usr --disable-pic14-port --disable-pic16-port
make
sudo make install

Kernelのビルド
Fuzixソースコードを取得し、Kernelをビルドする。Makefileはビルド前に編集する。
「TARGET=z80pack」のところ、
「TARGET=tomssbc-rom」とする。
git clone https://github.com/EtchedPixels/FUZIX.git
cd FUZIX
(Makefileを編集)
sudo make kernel

このビルドは、Fuzix ver 0.3においての物なので、それより後のバージョンではうまく行かないかも知れない。その場合は、
git checkout 9d5f38b410a11c31aa9967fa88831d2db76bccaf
として、2019年11月現在のレポジトリーか、
git checkout cacbe5238588d352768ab95951c46d09879ba310
として、ver 0.3のレポジトリーに巻き戻してから、make kernel すればよいだろう。

うまく行けば、pratform-tomssbc-romディレクトリに、「fuzix.com」という、64Kbのファイルが構築される。]]>
Fuzix https://www.rad51.net/jeans/?itemid=961 Sun, 03 Nov 2019 23:28:26 PST ITEM961_20191103
FUZIXのビルドに挑戦 https://www.rad51.net/jeans/?itemid=959 FUZIXをビルドしてみようというwebページで、FUZIXのカーネル・ツール・ディスクイメージのビルドの方法が紹介されており、参考にしてみたので、メモ。

この記事は「2017年4月現在のビルド方法」との事なので、最新のFUZIXソースコードのビルドには適応できない。少し修正をする必要があった。大まかに、以下の順で作業を進めた。

SDCCのインストール
SDCCはビルド済みの物をインストール。32 bit Linux用のものをダウンロード。
>tar xjvf sdcc-3.6.0-i386-unknown-linux2.5.tar.bz2
>cd sdcc-3.6.0
>sudo cp -r * /usr

z80packのインストール
変更無し。
>wget http://www.autometer.de/unix4fun/z80pack/ftp/z80pack-1.24.tgz
>tar xzvf z80pack-1.24.tgz
>cd z80pack-1.24/cpmsim/srcsim
>make -f Makefile.linux
>cd ../srctools
>make

外部ユーティリティのコンパイル
2017年4月現在のFUZIXでビルドする必要があるので、Git cloneを当時の物に巻き戻す必要がある。
>git clone https://github.com/EtchedPixels/FUZIX.git
>cd FUZIX
>git checkout 475c397296e87406420c0ccd54c21fa2e3dd5003
>cd Standalone
>make

カーネルのコンパイル
変更無し。Makefileとdevtty.cは、指示の通り編集。
>cd ../Kernel
>(Makefileとdevtty.cを編集)
>make

クロス開発用ツールのコンパイル
変更無し。
>cd ../Library
>make
>sudo make install

ライブラリのコンパイル
変更無し。Makefileは、指示の通り編集。実行に時間が掛かる。
>cd libs
>(Makefileを編集)
>make
>sudo make install

内部ユーティリティーのコンパイル
変更無し。実行に時間が掛かる。
>cd ../Applications/util
>make

ディスクイメージの作成
変更無し。指示の通りcreatedrivesを編集。
>cd ../../Kernel/platform-z80pack
>(createdrivesを編集)
>./createdrives

FUZIXをz80packで動かす
変更無し。
>cp drivea.cpm drivei.cpm ~/z80pack-1.24/cpmsim/disks
>cd ~/z80pack-1.24/cpmsim
>./cpmsim

2019-11-01-fuzix.png

(以下、追記)
Tom's SBC用FUZIXのビルド
残念ながら、まだTom's SBC用のFuzix(FZ/KM midi, FZ/KM webで使っている物)のビルドには成功していない。ただし、上記の方法で得られたFuzixアプリケーションは、Tom's SBC用のFuzixで走る。なので、上記の操作でとりあえずFuzixアプリケーションをビルドする環境は整った事になる。
(追記)
Tom's SBC用のKernelのビルドに成功したので、次の記事を参照。]]>
Fuzix https://www.rad51.net/jeans/?itemid=959 Thu, 31 Oct 2019 18:09:11 PDT ITEM959_20191031
Fuzix ディスクイメージ編集ツール、UCPの使い方 https://www.rad51.net/jeans/?itemid=957 http://www.fuzix.org/)で配布されていて、そのまま使う事ができます。FZ-KM webやFZ-KM midiでも、ここから取得される「tomssbc-0.3.ide」を使っています。

これらのディスクイメージファイルを用いてFuzixを起動すれば、Fuzix内部でファイルのやりとりをする事ができますが、このままではFuzix外部とのファイルのやりとりができません。例えば、Z80用のアプリケーションは、CソースコードをSDCCを用いてコンパイルして作製しますが、この様にして作られたアプリケーションをディスクイメージファイルの中に取り込む事ができなければ、Fuzixで利用できません。

Fuzixでは、その為のツールとして、UCPを用意しています。ここでは、UCPのWindowsにおける使い方について見てみます。

Fuzix用のUCPは、GitHubのレポジトリーにソースコードがあります。Cygwin等でコンパイルすれば「ucp.exe」が得られますので、それを利用する事ができます。手っ取り早く使いたい人は、予めコンパイルした物を用意しましたので、それを使って下さい。

このucp.exeを用いると、本家サイトから得られる「Filesystem Images」を編集する事ができます。しかし、「Bootable Images」(FZ-KMで利用している、Tom's SBC用のtomssbc-0.3.ideもこちら)を編集するには、少し工夫が必要です。

Tom's SBCは、RC2014ファミリーのPCです。GitHubレポジトリーのRC2014用のKernelのディレクトリーには、次の様な記述があります。

As ucp and fsck.fuzix support offsets in the format path:offset you can access the first file system with ucp foo.cf:1049600 if it starts at block 2048 of the CF card as normal.

ですので、このディスクイメージファイルをucp.exeで編集する際は、「ucp tomssbc-0.3.ide:1049600」と入力して下さい。次のような画面になり、編集が可能になるはずです。
2019-10-28-ucp1.png
(画像は、クリックすれば拡大表示されます)
このオフセット値は、プラットフォームごとに違うようで、例えばMTX用の物は「1048576」なのですが、これに関する記述は見つけられませんでした。「1048576」という値は、Tom's SBC用のイメージとMTX用のイメージのファイルサイズの差から計算された値です。1048576 = 0x100000 なので、むしろこちらの方が普通で、IDE用の「1049600」が特殊なのかも知れません。

無事にUCPが起動できれば、Linuxコンソールと同様に扱う事ができます。「?」とタイプすれば、利用可能な命令の一覧が表示されます。
2019-10-28-ucp2.png
これらの命令の中では、「get」と「put」が特殊な物で、この機能のためにucpが用意されています。「get」は、Fuzixディスクイメージに新規ファイルを取り込む機能、「put」はディスクイメージからファイルを取り出す機能です。

下の例では、「/usr/games」ディレクトリーの一覧を表示後、「put」で「startrek」というファイルを取り出し、「get」で取り出したファイルを「startreka」という名で取り込みました。
2019-10-28-ucp5.png

このままではファイルモードが「666」なので、実行型ファイルの場合は「chmod」を使って「755」に変更します。
2019-10-28-ucp7.png
2019-10-28-ucp8.png

この様にすれば、Fuzixを起動した後に、「/usr/games/startreka」が実行できるようになります。この例では既にあるアプリケーションをコピーしただけですが、「get」を用いて自分で作製したアプリケーションをFuzixに取り込む事ができますし、Fuzix実行後に作製されたファイルを「put」を用いて取り出す事もできます。

さぁ、これでFuzix用のアプリケーションを開発して、Fuzix上で実行する環境が整いました。何を作ろうかな?]]>
Fuzix https://www.rad51.net/jeans/?itemid=957 Mon, 28 Oct 2019 13:40:04 PDT ITEM957_20191028
FZ/KM web の紹介:Fuzixをwebアプリケーションで実行 https://www.rad51.net/jeans/?itemid=955
FZ/KM webは、HTML5による、Fuzixの実行環境です。実行すると、以下のような画面になります。
2019-10-11-fuzix3.png

始めに

Fuzixに関する解説は、2019年10月現在、日本語ではほとんど見あたりません。srad.jpに『著名Linux開発者Alan Cox、Z80向けに新OS「Fuzix」を公開』とある他は、「FUZIXをビルドしてみよう」という記事が見つけられるぐらいです。

Fuzixは、Alan Cox氏により開発が進められている、Z80など小規模のCPUを搭載したコンピューターで使用する事を前提にした、UnixライクなOSです。2019年現在、最新の情報を得るには、GitHubのレポジトリーを見るのが一番良いようです。2019年10月現在、ver 0.3が公開されており、作者曰く「 It is not yet useful although you can build and boot it and run test application code. A lot of work is needed on the utilities and libraries.」という事なので、まだまだ未完成で改善を続けていくという事のようです。作者はこちらのサイトでも情報発信を行なっていて、最新の情報が得られます。

作者が「FUZIX is a fusion of various elements from the assorted UZI forks and branches...」と述べているように、元々はDoug Braun氏のUZI (Unix: Z80 Implementation)から派生しているようで、たぶん Fuzix のネーミングもそこから来ています。対応するCPUはZ80だけでなく、6502, 6809, 8086, 68000など多岐にわたり、今後の開発が楽しみなOSです。

ここでは、CPUとしてZ80を使い比較的簡単な回路を持つPCの中から、RC2014のファミリーに属するTom's SBCを取り上げて、HTML5に依るwebアプリケーションとしてのエミュレーションを試みました。Fuzixの本家ページでは、Tom's SBC用のKernelのバイナリーがROMのイメージとして公開されており、扱いやすいです。Tom's SBCではコンパクトフラッシュカードをハードディスクの代りに用いていますが、webアプリケーション内では単一のディスクイメージを読み書きするようにしました。

使い方

次のURLにアクセスする事で、実行する事ができます。
https://kmorimatsu.github.io/fuzix/fuzix.html

FZ/KM webは、HTML5による、Fuzixの実行環境です。

HTML5の機能のうち使用しているものは、以下の通りです。


 ・Canvas
 ・FileReader

fuzix.htmlにブラウザでアクセスすると、以下のように表示されます。

2019-10-11-fuzix1.png

黒い画面が、80文字×24行の、ディスプレイです。 その下に、CPUの動作速度を示しています。デフォルト設定では、2 MHzで動作します。 その下、「Set File」のボタンは、ディスクイメージファイルをセットする場合に使用します(後ほど説明します)。 「Help」は、現在閲覧中のヘルプファイルを表示させるときに使います。

ディスプレイに「Waiting for loading disk image」と表示されていますが、この状態ではまだFuzixが使用できません。Fuzixの実行には、別途ディスクイメージファイルを準備する必要があります。Tom's SBC用の 128M bytes の物を使用します。表示の通り、「tomssbc-0.3.ide」をhttp://www.fuzix.org/などから取得して、解凍した後に、「Set File」ボタンを用いてアップロードして下さい。このファイルは、解凍した状態でアップロードできますが、ZIPアーカイブにして容量を減らしてからアップロードする事もできます。次のような画面になるはずです。

2019-10-11-fuzix2.png

「bootdev:」には、「hda1」もしくは単に「1」を指定して下さい。続けて、現在の日付と時刻の入力を求められますが、特に必要無い場合は、そのまま改行します。

2019-10-11-fuzix3.png

「login:」には、初期の状態では「root」を指定して下さい。これで、Fuzixが使用可能になりました。

Fuzixを使用した後、ディスクイメージファイルを保存することも出来ます。まずFuzix上で「shutdown」を行い、下のような画面になるまでお待ちください。

2019-10-11-fuzix4.png

続けて、"Save Disks"ボタンを押すと、ZIPアーカイブダウンロードの状態になります。このZIPアーカイブは、起動時にディスクイメージとして、"Set File"して利用することが可能です。

ここで実行されているFuzixは、ver 0.3で、Tom's SBC用にコンパイルされた物です。

エミュレーションしているPCは、Tom's SBC (https://easyeda.com/peabody1929) に準拠しており、以下のような特徴があります。


 ・CPUとしてZ80を搭載
 ・RAMを64 kbytes搭載
 ・ROMを64 kbytes搭載
 ・リセット時に、0000h-3FFFhの領域にROMが使用される
 ・0000h-3FFFhの領域でROMを使用するかRAMを使用するかは、I/Oポート38hへの書き込みで指定する(0でROM、1でRAM)
 ・ROMのどの領域を使用するかは、I/Oポート3Eh及び3Fhへの書き込みで指定する(3Eh: A15; 3Fh: A14)
 ・I/Oポート00h-03hにZ80-SIOが接続されており、画面への出力及びキーボード入力を行なう
 ・I/Oポート10h-17hに128 Mbytesのコンパクトフラッシュカードが接続されており、ディスクとして認識される

起動時にオプションを付加する事ができます。「fuzix.html?debug=1」にアクセスすれば、デバッグ用のツールボタンが表示されます。また、「fuzix.html?speed=8000000」等とすれば、異なるCPU速度で実行する事ができます(例は、8 MHzで実行する場合)。

追記:ディスクイメージの編集

これについては、別記事を書きました。]]>
Fuzix https://www.rad51.net/jeans/?itemid=955 Fri, 11 Oct 2019 17:07:41 PDT ITEM955_20191011