SBCZ8002_reference

ザイログのZ8002を採用したコンピュータSBCZ8002が完成し、プリント基板の頒布をピコショップ(新店舗)にお願いした。SBCZ8002は簡易モニタを備え、単体でメモリの読み書き、HEXファイルのロード、サブルーチンの呼び出しができる。一方、製作には28C16とPIC12F1822とGAL16V8の書き込みが必要で、ごめんね、誰にでも簡単とは言い難い。

SBCZ8002_top

●製作と運用に必要なファイル
部品表-sbcz8002_partslist.pdf
回路図-sbcz8002_sch.pdf
データパック-sbcz8002_datapack.zip

●SBCZ8002の製作

1.部品表にしたがって部品を揃える。

2.データパックのファームウェア等を書き込む。
IC1のGAL16V8にSBCZ8002.jedを書き込む
IC3の28C16にmonz8k_odd.binを書き込む
IC7の28C16にmonz8k_even.binを書き込む
IC10のPIC12F1822にz8002crgen.hexを書き込む
※TL866II Plusがすべてに対応しているという情報をいただきました。

3.部品番号で照合し、プリント基板の所定の位置に取り付ける。

●SBCZ8002の運用

1.部品表にしたがって運用に必要な製品を揃える。

2.セットアップする。
ピンヘッダにUSB-シリアル変換ケーブルを挿し、パソコンと接続
パソコンで端末ソフトを起動(9600bps、8ビット、1ストップビット、パリティなし)
DCジャックにACアダプタを接続
電源スイッチを入れる

3.簡易モニタで遊ぶ。
簡易モニタの使いかたはこちらの投稿を参照

●独自のアプリの開発
SBCZ8002のアプリおよび簡易モニタのアプリはgcc(2.9だけど)で開発できる。
開発環境を構築する方法はこちらの投稿を参照
開発の手順と実例はこちらの投稿を参照

SBCZ8002は世界でいちばん貧弱なZ8002マシンを目指しており、メモリが小さいし、インタフェースがさびしい。それでは満足できない人がいると思うから、Z8002の両側にピンソケットを立てておいた。さあ、ドータボードでも作って好きなように拡張しやがれ。

広告
カテゴリー: Z8000 | コメントをどうぞ

SBCZ8002のアプリ開発手順

SBCZ8002のアプリはFedoraCore9とz8kgccのクロス開発環境で能率的に開発することができる。実際、簡易モニタmonz8kが比較的短時間で完成した。その開発工程が頭から消えてしまわないうちに、クロス開発環境の要点をまとめておこうと思う。

1.クロス開発環境の構築
Z8000のクロス開発環境にしたがいクロス開発環境を構築。

2.開発用のディレクトリを作り開発に必要なファイルを保存
データパックのsbcz8002.tar.gzをホームディレクトリに置く。
以降のコマンドを「端末」から入力。

tar zxvf sbcz8002.tar.gz

開発用のディレクトリへ入ってファイルを確認。

cd sbcz8002
ls

●標準アプリと簡易モニタ用アプリ
SBCZ8002のROMに書き込んで実行するアプリを標準アプリと呼ぶ。
簡易モニタでRAMにロードして実行するアプリを簡易モニタ用アプリと呼ぶ。

標準アプリに関係するファイルは次のとおり。
sbcz8002.x-標準アプリのROMイメージを作るリンカースクリプト
splitとsplit.c-ROMイメージを偶数/奇数に振り分けるプログラムとソース
monz8k.*-簡易モニタのソースと開発の過程で生成されたファイル
monz8k_even.binとmonz8k_odd.bin-偶数ROMと奇数ROMのイメージ

簡易モニタ用アプリに関係するファイルは次のとおり。
monapp.x-簡易モニタ用アプリのHEXファイルを作るリンカースクリプト
hello.*-簡易モニタ用アプリのサンプル

標準アプリと簡易モニタ用アプリは開発の手順が少し違う。まず標準アプリの開発手順を述べ、次に簡易モニタ用アプリの開発手順を述べる。

●標準アプリの開発手順
標準アプリはZ8002のリセットによって実行されるためスタートアップルーチン(リセットベクタとスタックポインタの設定)が必要。

3.C言語のソースを記述する
先頭にこんな感じでスタートアップルーチンを記述。

// Start up routine
__asm__ ("sect .text");
__asm__ ("wval 0");
__asm__ ("wval 16384");
__asm__ ("wval 6");
__asm__ ("ld r15,#0");
__asm__ ("jp _main");

ポートの入出力はこんな感じで記述。

// In value from port
unsigned char inb(unsigned int port){
	unsigned char value;

	__asm__ volatile (
	"inb %Q0,@%H1 \n\t"
	: "=r"((unsigned char)value)
	: "r"((unsigned int) port)
	);
	return value;
}

// Out value to port
void outb(unsigned int port, unsigned char value){

	__asm__ volatile (
	"outb @%H0,%Q1 \n\t"
	:
	: "r" ((unsigned int)port), "r"((unsigned char)value)
	);
}

一連の操作をできるだけ簡単に済ませるため、ソースはひとつのファイルにまとめ、標準ライブラリを使わず、参照はすべてこのファイルの中で解決する。

4.ROMイメージの生成
C言語のソースから偶数/奇数ROMのイメージを作る工程は次のとおり。ソースが正しく記述されていれば機械的な操作で済むが、実際は各段階でエラーが発生しがち。

z8k-coff-gcc -Os -nostartfiles -T sbcz8002.x -o monz8k.o monz8k.c
z8k-coff-objcopy -O binary monz8k.o monz8k.b
./split monz8k.b

●簡易モニタ用アプリの開発手順
簡易モニタ用アプリはスタートアップルーチンやポートの入出力などハードウェア寄りの処理がいらない。コードは%8000から配置され、実行開始アドレスも%8000となる。

3.C言語のソースを記述する
簡易モニタ用アプリは簡易モニタの内部関数を呼び出すことができる。内部関数のアドレスは次の操作で表示される。

z8k-coff-nm monz8k.o

内部関数putstrを呼び出してhello, worldを表示する記述例hello.cは次のとおり。

/*	hello world
	SBCZ8002 Rush Monitor application
	Most simple example
*/

// Set address into function pointer
void (*putstr)(unsigned char *) = (void *) 0x0202;

main(){
	// Call function with argument
	putstr("hello, world\15\12");
}

4.HEXファイルの生成
hello.cからhello.hexを作る操作は次のとおり。

z8k-coff-gcc -Os -nostartfiles -T monapp.x -o hello.o hello.c
z8k-coff-objcopy -O ihex hello.o hello.hex

率直なところ、以上の説明があらゆる場合に十分かどうかはわからないし、達人が見たらだっせーことやってるなと感じるかもしれない。だとしても、この手順で今のところ問題が生じていないのは事実。少なくとも簡易モニタを拡張して普通のモニタへ発展させることはできると思う。

カテゴリー: アプリケーション, コンパイラ, Z8000 | 1件のコメント

SBCZ8002の簡易モニタ

SBCZ8002の簡易モニタは単独でプログラムの入力、実行、メモリの表示ができて、必要ならクロス開発環境で作ったHEXファイルを読みこめる。それ自体が素晴らしいプログラムだとは言い難いが、いつか素晴らしいプログラムを作るための第一歩にはなると思う。

●共通事項
英字の入力は大文字でも小文字でもいい。
数値の入力は16進数、桁数が多すぎる場合は下位桁を採用。
プロンプトの数値はカレントアドレス。
度を越した操作ミス(引数が71字を超えるとか)はフォローしきれない。

●HELP
コマンドの概略を表示する。あまり親切ではないのでド忘れ思い出し用。monz8k_comhelp

●xxxx(16進数4桁以内)
カレントアドレスを変更。
monz8k_comxxxx

●SET
引数で指定した数値や文字をカレントアドレスから並べる。数値は1バイト単位。文字はシングルクォート(‘)で囲む。数値や文字はコンマ(,)で区切って入力制限(78字/行)まで羅列可能。シングルクォートそのものは27、コンマそのものは2Cで指定する。
monz8k_comset

●DUMP
引数で指定した範囲を含む前後のメモリ内容を表示する。引数は開始アドレスと終了アドレス。開始ア ドレスを省略するとカレントアドレスが使われる。終了アドレスを省略すると開始アドレス+16バイトが使われる。このコマンドを実行した直後、全部を省略する(改行のみ入力する)とカレントアドレスから16バイトを表示する。
monz8k_comdump

●CALL
引数で指定したアドレスのサブルーチンを呼び出す。
monz8k_comcall

●LOAD
HEXファイルを読み込んでRAMに並べる。以降、データパックに含まれるHEXファイルのサンプルhello.hexで操作例を示す。エディタはメモ帳、端末ソフトはTeraTermと仮定。

エディタでhello.hexを開いて内容をコピー。できれば末尾の改行だけはコピーしない。
monz8k_hexcopy

LOADを実行、アップロード待ちになるからウィンドウを右クリックしてペースト。このあとHEXファイル1行につきピリオド(.)をひとつ表示しながら読み込む。monz8k_hexup

簡易モニタ用アプリはカレントアドレスに関係なく8000から配置される。開始アドレスも8000と決まっている。だから実行方法はつねにCALL 8000。monz8k_hexcall

簡易モニタの機能はマジで簡易、というか安直。しかし何もないよりはずっとまし。もともとはhello, worldだけ付けて済まそうと思っていたのだから。

カテゴリー: アプリケーション, Z8000 | 1件のコメント

Z8000のクロス開発環境

SBCZ8002のプログラムを開発するとき最高の環境は、途中の説明を省略して結論だけいえば、VirtualBoxで動かすFedoraCore9のz8kgccだと思う。実際、SBCZ8002の簡易モニタとサンプルプログラムをその環境で開発した。以降、構築の手順を述べる。

●あらかじめダウンロードしておく配布ファイル
VirtualBox-こちらのサイトのパソコンに適合するパッケージ。
FedoraCore9-こちらのサイトのFedora-9-i386-DVD.iso。
z8kgcc-こちらのサイトのz8kgcc-jan-19-2009-linux-fc9.tar.bz2。

1.パソコンにVirtualBoxをインストール
一般的なアプリケーションのインストールだから説明を省略。

2.VirtualBoxにFedoraCore9をインストール
VirtualBoxでタイプがLinux、バージョンがFedora(32-bit)の仮想マシンを作成。
仮想マシンのフォルダ(パソコン側)へFedora-9-i386-DVD.isoを移動。
仮想マシンを起動し、仮想光学ドライブでFedora-9-i386-DVD.isoを選択。
インストーラの指示に従いFedoraCore9をインストール。最初の質問には[Skip]と答える。途中で追加ソフトウェアの選択があるが、[Fedora]のみ必要、それ以外は不要。

●パソコンと仮想マシンでファイルをやり取りする方法
通常は共有フォルダを介してやり取りするが、FedoraCore9が古すぎてその方法が使えない。かわりにUSBメモリを使う。

仮想マシンにUSBメモリをマウントする方法。
パソコンにUSBメモリを挿し、VirtualBoxで[デバイス]-[USB]-[<USBメモリ>]を選択。
z8kgcc_photo1

仮想マシンにマウントしたUSBメモリをアンマウントする方法。
仮想マシンでUSBメモリを右クリックし、[アンマウント]を選択。
VirtualBoxで[デバイス]-[USB]-[<USBメモリ>]の選択を外す。

3.FedoraCore9にz8kgccをインストール
USBメモリ経由でホームディレクトリにz8kgcc-jan-19-2009-linux-fc9.tar.bz2を置く。
以降のコマンドは「端末」から入力。
管理者の権限でz8kgcc-jan-19-2009-linux-fc9.tar.bz2を/へ展開し、権限を戻す。

su
<管理者パスワード>
tar jxvf z8kgcc-jan-19-2009-linux-fc9.tar.bz2 -C /
exit

.bash_profileを編集して環境変数にz8kgccのパスを追加。
エディタの起動方法は次のとおり。

gedit .bash_profile

赤字部分を書き加える。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/opt/z8kgcc-jan-19-2009/bin

export PATH

再起動またはログアウト/ログインで完了。

カテゴリー: Z8000 | 1件のコメント

SBCZ8002でhello,worldに成功

Z8002でhello, worldをやるぞって目標を立てたのが約2箇月前。案の定、間抜けな失敗を繰り返しながらも何とかゴールに辿り着いたので経緯を報告する。ハードウェアの現状を下に示す。Z8002の発熱が予想を超えたが、45℃以下にはとどまる模様。なお、このプリント基板には間違いがあり、現在、修正したものが工場を出て我が家へ向かっている。

sbcz8002_photo1

Z8002はアドレス信号がワード指定のバイト選択。すなわち、A1~A15でワードを指定し、A0で上位バイト/下位バイトを区別する。そのくらいは先刻ご承知だぜってことでメモリはうまく接続したが、体が慣れていなかったのかESCC(Z85230)の接続を間違えた。

sbcz8002_photo2

プリント基板のパターンの2箇所を切断し、電線で正しい接続に修正。結果として回路の間違いはここだけなのだが、間違いが1箇所だろうが100箇所だろうがプリント基板を作り直さなければならないことは同じ。そう考えると、これはむしろ痛恨のミスといえる。

sbcz8002_photo3

最初に実行してみたプログラムはリセットしてすぐ永久ループに入るやつ。Z8002のメモリアドレスは先頭ワードが無効、次のワードがフラグの初期値、次のワードが開始アドレス。で、偶数アドレスのコードを奇数ROMに持っておくヘンタイな構造。開発ツールを使うとこの構造をどう処理するかわからないから、ハンドアセンブルして書き込みソフトへ手入力。何度か暴走させたのちハンドアセンブルのミスを発見、修正して成功。

sbcz8002_photo4

ここからはESCCと格闘。コマンドチェインで初期化するやりかたはZ80 SIOと同じ、コマンドの働きもZ80 SIOとそっくりなんだけど、設定と同時に設定を有効にしてはいけないなど微妙に違うし、マニュアルのところどころに誤植がある。こうした罠に足をとられ、こけつまろびつしながらSCC初期化ワークシートを埋めた。これ、ザイログのアプリケーションズリファレンスに付いてるやつ。1970年代のみんなも悩んだんだろうね。

sbcz8002_photo5

hello, worldを表示するプログラムは、さすがにハンドアセンブルというわけにはいかなくてLinuxのクロスアセンブラを使った。ただし、この時点ではHEXファイルを作る方法がわからなかったし、もし作れても偶数/奇数コードの振り分けができないから、リスティングを見て書き込みソフトへ手入力。動かなかったらこのひどい力仕事をやり直し。

sbcz8002_photo6

数回のやり直しを経てhello, worldが表示され、続いてエコーバックテストにも成功。このプログラム、出来上がったものを見ると何てことはなくて、頑張れば誰にでも書けそうな感じ。問題は、正しいプログラムが正しく動くとは限らない状況で、頑張れるかどうかだよね。徒労に終わるかもしれない作業をちゃんとやれるのも才能だと思う。

sbcz8002_photo7

その後、Linuxのクロス開発ツールを徹底的に調べ上げ、現在はC言語のソースから直接ROMイメージを作る方法までわかっている。そのへんとハードウェアの詳細は、のちほど改めて紹介する。この投稿は、とりあえず、こんなに頑張ったんだぜって言うのが目的。hello, worldを成し遂げたんだから、そのくらいは認めてもらいたい。そして、修正したプリント基板が届き、最終確認ができたら、予告どおりお祭り騒ぎだぜ。

カテゴリー: Z8000 | コメントをどうぞ

SBCZ8002のGALがほぼ完成

SBCZ8002の周辺回路はTTLで組むとプリント基板がサービスサイズ(10cm四方)に収まらないからGALに押し込んだ。GALは未経験なので幾多の困難が予想されたが意外とうまくいってしまった。WinCUPLで論理を書き、WinSimでシミュレーション。下の例はメモリセレクトの動作。ほかにSCCのセレクトや割り込み応答、RD、WRなどの動作もOK。

z8002_sim_cs

PLDファイルの記述はこんな感じ。GALはシンプルモード、論理はAND、OR、NOTだけ。この上なくシンプルだから未経験でも何とかなった。もしかしたら記述のスタイルに野暮ったいところがあるかもしれないが、こういうのは動かしたもん勝ちってことで。

Name            SBCZ8002;
Partno          Z8K2CTRL;
Revision        01;
Date            20/3/19;
Designer        Tetsuya Suzuki;
Company         Office TETSU;
Device          g16v8as;

/* Inputs */
Pin 1 = a15;
Pin 2 = bw;
Pin 3 = rw;
Pin 4 = !mreq;
Pin 5 = !ds;
Pin [6..9] = [st3..0];
Pin 11 = a0;

/* Outputs */
Pin 12 = !intack;
Pin 13 = !scc;
Pin 14 = !wr;
Pin 15 = !ram_evn;
Pin 16 = !rom_evn;
Pin 17 = !rd;
Pin 18 = !rom_odd;
Pin 19 = !ram_odd;

$DEFINE IOREQ (!st0 & st1 & !st2 & !st3)

/* Logic */
intack = st0 & st1 & st2 & !st3; /* VI acknowledge */
scc = IOREQ & a0 & !a15; /* SCC select */
rd =  rw & ds; /* Read pulse */
wr = !rw & ds; /* Write pulse */
rom_odd = mreq & !a15 & ((!a0 & bw) # !bw); /* odd  ROM select */
rom_evn = mreq & !a15 & (( a0 & bw) # !bw); /* even ROM select */
ram_odd = mreq &  a15 & ((!a0 & bw) # !bw); /* odd  RAM select */
ram_evn = mreq &  a15 & (( a0 & bw) # !bw); /* even RAM select */

[2019/3/16]論理の誤りを修正しました。動作はシミュレーションの画像と一致しません。

シミュレーションでOKだから実物もOKとまでは思えないのが未経験の率直な気持ち。実物をテストするためにArduinoでGALテスターを作った。これでLEDがうまいこと光ってくれたらようやくGALが完成したといえる。だっせーだろ、でも、動かしたもん勝ちだ。

z8002_galtester

はい注目、回路図のGALがATF16V8BなのにGALテスターに乗っているのはATF16V8CZ。似たようなもんだろと思ったら書き込み方法が違うみたいで、うちのTL866CSだと書き込めない。TL866 II Plusなら大丈夫という情報があるが、5600円の書き込み装置を買い直すよりは145円のGALを買い直す。現在、マルツに注文したATF16V8Bの到着待ち。

z8002_atf16v8cz

というわけで、厳密にいうとGALはまだ完成していないが、あらかた完成の見込みが立った。この段階で経過を報告しておけば、万が一、大間違いをしていたときにご指摘をいただけるものと期待している。

カテゴリー: Z8000, 書き込み装置 | コメントをどうぞ

SBCZ8002のクロック生成まで確認

SBCZ8002のプリント基板が届いた。Seeed Fusionの5枚$7.9+OCS$2で、注文日から数えてざっと2週間。シリアル端子付近のシルクがカスレているが実用性に影響がないから良品。CADの画面で飽きるほど見たやつだけど実物を手にするとやっぱり燃えるよね。

sbcz8002_pcb

組み立て完了、電源まわりを確認、PICだけ挿して通電。所定のピンにクロックが供給されている。周波数が4MHzを微妙に超えているのは必要に応じあとで調整。この周波数から通信クロックを作るので1段階下げたほうがいいかもしれないが下がりすぎると困る。

sbcz8002_clk

PICのファームウェアを下に示す。PWMでクロックを生成し、ポートでリセットする。最低限のことしかやっていなくてフラッシュ使用率が2.1%。最後、永久ループに入るところはスリープさせたほうがいいと思うが、それやこれやはSBCZ8002が動いてからの話。

 /*
 File: main.c
 Author: Tetsuya Suzuki
 Created on 3/10/2019 1:48:46 AM UTC
 Created in MPLAB Xpress
 Device: PIC12F1822
 Compiler: XC8
*/

#include

#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config MCLRE = ON
#pragma config CLKOUTEN = OFF
#pragma config PLLEN = ON

#define _XTAL_FREQ 32000000

void main(void) {
  // initialize
  OSCCON = 0b11110000; // Configure clock to 32MHz
  ANSELA = 0;          // Set all pins as digital
  TRISA = 0b11111010;  // Set RA0(RES) and RA2(CLK) as output
  nWPUEN = 0;          // Pullup all input pins

  // clock generate
  CCP1CON = 0b00001100; // Set RA2 as PWM out
  PR2 = 1;              // Period 2 clock (32MHz/4/2=4MHz)
  CCPR1L = 1;           // Duty 1 clock (50%)
  T2CON = 0;            // Desable pre-scaler
  TMR2ON = 1;           // Start

  // Reset
  LATA0 = 0;       // Reset
  __delay_ms(200); // Wait 200ms
  LATA0 = 1;       // Release

  // permanent loop
  while(1);
}

PICがうまく動いてくれて小さな課題がひとつ解決した。この先、最大の課題はGAL。何しろまだ1回も動かしたことがなくてCUPLの書き方をおぼろげに理解したところ。動作確認は、シミュレータの使いかたを覚えるより冶具を作ったほうが早いかなと思っている。

カテゴリー: Z8000 | コメントをどうぞ