Socz80でuzi

## はじめに
　Fuzixの情報を調べていると、Z80マシンで動作するuzi、MSXで動作するuZixを参考に、Fuzixが作成されたことがわかります。
　uziの動作環境の情報は失われ、ハードとソフトに強い自作勢が、自身の作成したZ80ボード上にuziを移植して動作させています。
　本稿では、市販のボードに移植されたuziを紹介します。なお、本稿の内容には、「OSC2024名古屋」で行われた「Fuzixユーザーグループ」の展示内容を含みます。

 https://event.ospn.jp/osc2024-nagoya/
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/b7b7554d-e648-954f-a9aa-00016459bb0c.png)
## 2024年のuziの動作環境
　UZIは"Unix: Z80 Implementation"の略号で、RAMサイズが64 KBののZ80を搭載したコンピュータ用びUNIXカーネルを搭載したOSです。1980年代中ごろ、Douglas Braunさんにより作製されました。バージョン7のUNIXカーネルのほとんどの機能が移植されています。
　Z80用のDOSである、CP/Mのコマンドとして起動します。その後、Z280に移植されました。

https://www.dougbraun.com/uzi.html

　2024年現在、お手軽に構築できそうなuziの動作環境には、主に、以下の2件があります。
　1つは、FPGAでZ80コンピュータの環境を構築した「socz80」です。ここで使用するFPGAボードは、Papilio Proボードです。

https://sowerbutts.com/socz80/

ハードウェアのスペックは以下の通りです。
・128 MHzで動作するT80CPUコンパチのZ80
・4 KBのページングMMU（64 KBが仮想で、64 MBの物理アドレス空間）
・16 KBのダイレクトマップ方式の8 MBのSDRAM（128 MHz駆動）
・モニタープログラム搭載の4 KBのROM
・4KBのSRAM
・FIFOを受信可能なUART
・2つ目のUARTも利用可能
・1 MHzのタイマー
・SPIのマスターはSPI接続されたフラッシュROMに接続
・SPIのマスターはオプションで取り付けるSDカードソケットにも接続
・GPIO
　2つ目は、自作ボードのsmariboardに搭載されるuzicsです。

https://github.com/chettrick/uzics

https://github.com/chettrick/smariboard

　ここでは、入手容易なボードのPapilio Proボードを使ったsocz80上のuziを取り上げます。

## Socz80の環境構築
　Socz80のサイトに掲載のREADME.txtに環境構築法が掲載されています。このテキストには、ボードの構造も記載されていますので、自作プログラムを作成する際に参考になります。

 
https://sowerbutts.com/socz80/README.txt

　ここで必要な情報は、UARTの端子、必要ならば、SDカードスロットで利用するSPI端子です。
  P131 -- 3.3 Vを入力するとリセット
  P126 -- LED1 (出力)
  P124 -- LED2 (出力)
  P127 -- LED3 (出力)
  P123 -- LED4 (出力)
  P118 -- UART1 TX (出力)
  P119 -- UART1 RTS (出力)
  P120 -- UART1 RX (入力)
  P121 -- UART1 CTS (入力)
  P134 -- コンソール選択用ジャンパ (GNDに接続すると UART1がシステムコンソール)
  P116 -- SDカードソケット card socket SPI CLK (出力)
  P114 -- SDカードソケット SPI CS (出力)
  P115 -- SDカードソケット SPI MOSI (出力)
  P117 -- SDカードソケット SPI MISO (入力)

　以降は、Linuxマシンを使った操作となります。
　まず、最新の「socz80-2014-04-30.tar.gz」をダウンロードします。


https://sowerbutts.com/socz80/socz80-2014-04-30.tar.gz

　2番目に、Papilio ProのFPGAへbitstrem「papilio_pro_spartan6.bit"」を書き込む際に必要なコマンド「papilio-prog」をリポジトリからgitcloneします。

https://github.com/GadgetFactory/Papilio-Loader

　3番目にFPGAのビットストリーム「papilio_pro_spartan6.bit」を「papilio-prog -f」を使ってアップロードします。
　4番目にRAMディスクのイメージをアップロードします。
```
./software/tools/write_phys_mem ./disk-images/disk-200000.img 200000 /dev/ttyUSB1
./software/tools/write_phys_mem ./disk-images/disk-400000.img 400000 /dev/ttyUSB1
./software/tools/write_phys_mem ./disk-images/disk-600000.img 600000 /dev/ttyUSB1
```
最後に、アップロードしたRAMディスクのイメージをROMに保存します。
```
 rwrite 200 200
 rwrite 400 400
 rwrite 600 600
```
ROMに保存したイメージは、以下のコマンドでRAMディスクに再読み込み可能です。
```
 rread 200 200
 rread 400 400
 rread 600 600
```

## UZIの起動
　Socz80の電源を入れると、「Z80 ROM Monitor」が起動します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/e9b202d5-acad-20aa-e3e8-35f64af646ff.png)

　ROMディスクからRAMディスクにファイルを転送して、200ページからrbootすると、CP/Mが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/9948e9f6-e60a-dd84-2c52-3afc7351cde2.png)

　Socz80では、uziのディスクは1番に保存されています。CP/Mが起動した後、Aドライブのコマンドプロンプトで「uzi 1」と入力します。
```
A>uzi 1
```
カーネルが起動し、コマンド入力時に指定したドライブ上のルートファイルシステムをマウントします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/7eac6db9-b19d-9ca7-badc-6c60b8f29549.png)
　シリアル端末には、Wio terminalを使用しています。

## おわりに
　
Socz80の環境は、様々なFPGAボードに移植されています。
DE0-nano, DE2 と DE2-70用では、

https://github.com/slp/socz80-altera

Alan Coxの移植、Lattice EC5ボード用では、

https://github.com/emard/socz80

これらの情報を参考にすると、最近販売されているFPGAでも、socz80の環境を実現することが可能でしょう。