SBCZ80ルーズキットの製作(8MHz動作編)
2020.09.25
10MHz高速版のSIOが届きました。


まず8MHzで動作させましたが、問題なく動きました。ただ、DRAMのアクセスタイムが100nS必要で、オーバークロックになっています。ASCIIART.BASの速度は、速いのは速いのですが、それほど体感速度が出ませんでした。Z80は、結構クロック数を必要としますので、仕方がない気もします。

10MHz版のSIOには、オーバークロックになりますが、16MHzを試してみました。残念ながら動作しませんでした。スペックを確認すると、16MHzの場合、DRAMとEEPROMのアクセスタイムが70~80nSが必要なようで、今回は共に150nSでしたので、当たり前みたいです。
2020.09.25 21:49 | 固定リンク | SBCZ80
SBCZ80ルーズキットの製作(シリアルハンドシェーク編)
2020.09.24
GRANTBASで、ASCIIART.BASを走らそうとしましたが、TeraTermでプログラムをペーストすると、シリアルポート入力の取りこぼしが発生しました。

TeraTermのフロー制御を"hardware"にしましたが、改善しませんでした。GRANTBAS.ASMの確認を行うと、RTSのハンドシェークがされていませんでした。下記のような、修正を行ったところ、問題なくペーストできるようになりました。大きなプログラムでは、必須な機能ですので、必要な方は、修正をお勧めします。

修正内容は、入力バッファの残りが4文字より少ない場合、RTSをINACTIVEに、入力バッファ中の文字数が4文字以下の場合。RTSをACTIVEにしています。

【修正前①】
; CHECK BUFFER FULL
LD A,(RBFCNT)

【修正後①】
; CHECK BUFFER HIGH
LD A,(RBFCNT)
CP RBFSIZ-4
JP M,CHKFUL
LD A,005H ; WR5
OUT (PSIOAC),A
LD A,0E8H ; RTS INACTIVE
OUT (PSIOAC),A
; CHECK BUFFER FULL
CHKFUL: LD A,(RBFCNT)

【修正前②】
; READ DATA
LD A,(RBFCNT)

【修正後②】
; CHECK BUFFER LOW
CP 4
JP P,RDDAT
LD A,005H ; WR5
OUT (PSIOAC),A
LD A,0EAH ; RTS ACTIVE
OUT (PSIOAC),A
LD A,(RBFCNT)
; READ DATA
RDDAT: LD A,(RBFCNT)

なお、ZTB.ASMも同様です。

2020.09.24 21:27 | 固定リンク | SBCZ80
SBCZ80ルーズキットの製作(ファームウェア編)
2020.09.22
SBCZ80の改造で使用したPIC12F1822のファームウェアの紹介です。

今回は盛りだくさんになったため、全部ピン使用することになりました。
①シリアルインタフェース用クロック信号
②CPUクロック信号
③CPUリセット信号
④DRAMリフレッシュ用NMI信号

このPIC12F1822は、低価格で入手できます。秋月電子通商では、現在1個 ¥110(税抜き)で販売されています。ファームウェアを開発したり、書き込みしたり手間はかかりますが、その柔軟性に魅力があります。

今回、参照クロック、PWM、Timer0、Timer1各モジュールを使用しましたが、利用パターンに慣れると、結構簡単に利用できます。ただ、各モジュールで利用可能なピンの制約がある点に注意する必要があります。
PIC12F1822のファームウェアのソースコードを公開しますので、自己責任で自由に利用ください。なお、2MHz/4MHz/8MHz各CPUクロックのHEXファイルも同梱していますので、必要に応じ活用ください。

ちなみに、CPUクロック4MHz版は、Z80Aの4MHzに最適で、シリアルインタフェース用クロックと合わせて使用をお勧めします。シリアル速度自動設定が不要な場合は、5ピン(RXD)は、未配線にしておいてください。

DRAMリフレッシュ用NMI信号は、48KBにDRAM拡張する場合に使用したら良いかと思います。CPUリセット信号は、CPUリセット不良が発生するCPUとSIOの相性が悪い場合に利用ください。4ピン(PWR)に入れる直列抵抗は、ICSP(インサーキットプログラミング)しないのであれば、不要です。

この機会にICSP経由のソケットアダプタを製作しPICkit3との組み合わせて使いました。


下記は、電源投入時のPWR、~RST、~NMI、SIOのRTSの波形です。


次は、リセットボタン使用時のPWR、~RST、~NMI、SIOのRTSの波形です。
2020.09.22 10:05 | 固定リンク | SBCZ80
SBCZ80ルーズキットの製作(改造編)
2020.09.21
以下の改造には、組立前に基板の箔カットが必要になりますので、ご注意ください。

①DRAM容量アップ(48KB)

uPD41464(64kx4bit)を使用しました。M5M4416とピン互換ですが、4倍の容量があります。
改造ポイントは、

・CPUメモリアドレスデコーダの拡張


・アドレスマルチプレクサの拡張


・NMI信号の生成とZ80のNMIへの接続

Z80は、通常2mS/128リフレッシュしかサポートしていませんが、A7は、出力されますので、NMIで補完すると、4mS/256が実現できます。NMI信号の生成は、後述のPIC12F1822で行い、Z80のNMIに接続します。



・GRANTBAS、ZPTB、Universal Monitor Z80のRAM領域の変更および、NMIハンドラの追加
diff結果

②クロック高速化(8MHz)

Z80クロック信号の生成は、PIC12F822で行います。

③シリアル速度自動設定(9.6kbps~115kbps)

シリアル速度自動設定は、PIC12F822で行います。

下記は、PIC12F822周りの改造回路です。IC11に実装しましたので、回路図は、IC11のピン番号になっています。


以下は、PIC12F822の仕様です。

12F1822 Pin Connection
     +---v---+
Vcc |1 8| GND
SCLK|2 7|~NMI
CLK |3 6|~RST
PWR |4 5| RXD
+-------+

①SCLK: SIOクロック(2PIN)

電源投入後2後~30秒までの間に、SIOのRXD端子からCRコードを検出して自動速度設定を行います。57.6kbpsと115.2kbpsでは、偏差が大きいので、使用できない場合があります。

検出速度   実測周波数
9.6kbps 153.6kHz
19.2bps 307.2kHz
38.4kbps 614.5kHz
57.6kbps 914.5kHz
115.2kbps 1937kHz

②CLK: Z80のクロック(3PIN)

デフォルトは、4MHzにしていますが、PIC12F1822のプログラム切替で、2/4/8MHzの選択が可能です。

③PWR: 抵抗を介して、リセット用のCR回路に接続します。(4PIN)

④~NMI:DRAM 4mS/256リフレッシュ用割り込み(7PIN)

Z80のNMIに接続します。下記は、NMI割り込み処理で、Z80のRレジスタ更新を2mS毎に行います。ROMに埋め込む必要があります。

;	NMI HANDLER
; TARGET: SBCZ80
; ASSEMBLER: ARCPIT XZ80.EXE
;
NMI EQU 0066H ;NMI HANDLER ADDRESS
;
; NMI HANDLER
ORG NMI
PUSH AF
LD A,R
XOR 80H
LD R,A
POP AF
RETN

⑤~RST: Z80のリセット信号です。PWRのリセット用CR回路の電圧を監視しています。(6PIN)

~NMIは、このリセット信号解除に同期し、1mS後から出力されます。

⑥RXD: SIOのRXDA端子に接続します。シリアル自動速度設定に使用します。(5PIN)

最後に、以前の改造と同じように、ROMアドレス切替も行い、32KBのEEPROMを16KB+8KB+8KBに区切り、GRANTBAS、ZPTB、Universal Monitor Z80を切り替えて使用できるようにしました。同じくリセットCR回路のダイオードを電圧検出器に交換しています。追って、PIC12F822のソースコードを公開します。

下記は、改造後の基板の様子です。ジャンパが多くなってしましました。次は、8MHzも試してみる予定です。




立ち上げ画面です。"48766 Bytes free"となっています。


2020.09.21 11:21 | 固定リンク | SBCZ80
SBCZ80ルーズキットの製作(リセット不良対策編)
2020.09.20
以前にZ80高速版を手に入れておいたので、SBCZ80を製作してみました。せっかく製作するので、ついでに下記の改造をしてみました。

①DRAM容量アップ(48KB)
②クロック高速化(8MHz)
③シリアル速度自動設定(9.6kbps~115kbps)

それぞれの内容については、順次紹介していく予定ですが、例のごとく必要な基板の箔カットを行った後、配布されているROMイメージを使って基本動作確認を行ったところ、立ち上げメッセージが出てきませんでした。

CPU周りの波形解析すると、CPUリセット後、SIOの初期設定が行われていましたが、RTSがアクティブになりませんでした。プログラムとしては、正常な動作をしているため、回路図、CPU・SIOデーターシートを確認しましたが、特に問題は発見できませんでした。

各部の波形を確認するとCPUのRESET信号が徐々に電圧が上がっていくのが気になり、再度データシートを確認すると、RESET入力は、基本的なTTLレベルの入力信号となっていました。リセット回路は、CPUリとSIOに接続されているので、徐々に立ち上がる入力信号の場合、動作が閾値電圧に左右されることが予想されます。

SBCZ80のリセット回路は、時定数470mSのCRで構成されているので、仮に10mVの閾値電圧の差があると、簡易計算で0.01V/5V*470mS=0.94mS程度の遅延差が発生します。このことは、SIOの閾値電圧が、CPUの閾値電圧に比べ10mV高いと、CPUがSIOを約1mS以内にSIOの初期設定をすると、SIOはリセット中で、初期設定ができないことになります。

確認のため、C15を0.01uFに交換すると、正常にSIOが動き始めました。CPUとSIOはZilog製ですが、たまたま相性が悪かったようです。

相性が悪いCPUとSIOの対策案:

①相性が良いCPUとSIOに交換する(SIOのリセット閾値電圧が、CPUのそれに比べ低い)
②C15を小容量に変更する(0.01uF程度、但し電源SWでのリセットに問題が残ることがある)
③モステックの資料のようにCR回路の後にシュミットトリガー回路を使用する
④CPUリセット後、十分待ってからSIOの初期設定を行う

もし、SBCZ80が動かない場合、②でリセットボタンを押して切り分けをしてはいかがでしょうか。恒久的には、③が良いかもしれません。

下記は、モステックの資料からの転載です。


今回の改造では、PIC12F822で、CPUクロック、CPUリセット、NMI信号、SIOクロックを発生させることにしました。
2020.09.20 12:48 | 固定リンク | SBCZ80

- CafeNote -