パチパチ1号、完成
2011年12月25日
パチパチマイコンが、完成品になった。

ハードウェア上は、予定通りの動きをすることが確認できたので、とりあえず完成としたい。性能は、次の通り。
CPU: Z80
clock: 2 MHz
RAM: 32K bytes
BIOS: 256 bytes
human interface: 8 bits LED & 8 bits toggle switches for data + 10 bits toggle switches for address
mass storage: tape-recorder interface. average 1600 bps.
BIOSは、PIC16F690内蔵のEEPROMに書かれている。本来、トグルスイッチで手入力する類のものであるが、256 bytesと比較的大きなプログラムのため、手入力の代わりをPIC16F690が行う形になっている。
回路図は、次の通り。



BIOS入力用のPIC16F690のプログラムは、先に書いた記事を参照のこと。
BIOSは、現在製作中であるが、暫定的には次のようなソースコード。リセットスイッチを押すと、カセットテープインターフェースからの入力待ちになり、プログラムが入力できれば実行するようになっている。
256バイトに収めるために、必要最小限の仕様。本当は、保存を行った後に確認の動作を組み込みたかったが、容量が足りなかった。
次のマイコンでは、キャラクターディスプレイとキーボードを使えるようにしたい。

ハードウェア上は、予定通りの動きをすることが確認できたので、とりあえず完成としたい。性能は、次の通り。
CPU: Z80
clock: 2 MHz
RAM: 32K bytes
BIOS: 256 bytes
human interface: 8 bits LED & 8 bits toggle switches for data + 10 bits toggle switches for address
mass storage: tape-recorder interface. average 1600 bps.
BIOSは、PIC16F690内蔵のEEPROMに書かれている。本来、トグルスイッチで手入力する類のものであるが、256 bytesと比較的大きなプログラムのため、手入力の代わりをPIC16F690が行う形になっている。
回路図は、次の通り。



BIOS入力用のPIC16F690のプログラムは、先に書いた記事を参照のこと。
BIOSは、現在製作中であるが、暫定的には次のようなソースコード。リセットスイッチを押すと、カセットテープインターフェースからの入力待ちになり、プログラムが入力できれば実行するようになっている。
org 0000 ld sp,8000 call init: ld hl,(00f8) call read8bytes: pop hl push hl ld bc,(00fa) inc b loop1: call read8bytes: dec c jr nz,loop1: dec b jr nz,loop1: in a,80 pop hl jp (hl) end: org 0020 save: call beginsignal: ld hl,00f8 call write8bytes: ld hl,(00f8) ld bc,(00fa) inc b s_loop1: call write8bytes: dec c jr nz,s_loop1: dec b jr nz,s_loop1: ret check: ld b,00 c_loop1: in a,ff rra jr c,c_loop1: c_loop2: inc b in a,ff rra jr nc,c_loop2: ld a,b ret read8bytes: push bc push de xor a ld e,08 r8_loop1: call read1byte: ld (hl),d inc hl xor d dec e jr nz,r8_loop: call read1byte: cp d pop de pop bc ret z show_error: in a,40 call e_wait: in a,80 call e_wait: jr show_error: e_wait: djnz e_wait: dec c jr nz,e_wait: ret get1bit: call check: cp 08 jr c,show_error: cp 31 jr nc,show_error: cp 20 ret read1byte: ld c,08 r1_loop1: call get1bit: rr d dec c jr nz, r1_loop1: ret init: ld hl,0000 in a,80 i_loop1: call check: cp 08 jr c,init: cp 20 jr nc,i_begin: inc hl dec h inc h jr z,i_loop1: in a,40 jr i_loop1: i_begin: dec h inc h jr z,init: ret writeabit: jr nc,writebit0: writebit1: ld b,1c djnz fe in a,80 ld b,1f djnz fe in a,40 ret beginsignal: ld bc,06dc bs_loop1: ld d,ff call write1byte: dec c jr nz,bs_loop1: dec b jr nz,bs_loop1: writebit0: ld b,3c djnz fe in a,80 ld b,3f djnz fe in a,40 ret write8bytes: ld e,08 xor a w8_loop1: ld d,(hl) xor d inc hl call write1byte: dec e jr nz,w8_loop1: ld d,a write1byte: push bc push af ld c,08 w1_loop1: rr d call writeabit: dec c jr nz,w1_loop1: pop af pop bc ret
256バイトに収めるために、必要最小限の仕様。本当は、保存を行った後に確認の動作を組み込みたかったが、容量が足りなかった。
次のマイコンでは、キャラクターディスプレイとキーボードを使えるようにしたい。
コメント
てつや (2023年9月22日 15:12:51)
最近、昔のマイコンを自作することに興味があって、こちらの記事に辿り着きました。
YouTubeで3つのCMOS ICのうちクロック作成用以外の2つは省略できると思うとおっしゃっていたと思いますが、その場合回路をどのように変更したら良いのでしょうか。
リセットスイッチ周りの回路がよりシンプルになっているものはいくつか例が見つかりますが、
データ読み出し用の発光ダイオードについてはnot回路を入れている例と入れてない例があり、その辺りが特によくわからず困っています。
また、スイッチの部分について、分岐している先にそれぞれ抵抗が入っていますが、分岐している元の方に1つの抵抗を入れるようにしたら問題がありますでしょうか。
だいぶ前の記事に対して全くの素人の質問で恐縮ですが、お答えいただいたら幸いです。
YouTubeで3つのCMOS ICのうちクロック作成用以外の2つは省略できると思うとおっしゃっていたと思いますが、その場合回路をどのように変更したら良いのでしょうか。
リセットスイッチ周りの回路がよりシンプルになっているものはいくつか例が見つかりますが、
データ読み出し用の発光ダイオードについてはnot回路を入れている例と入れてない例があり、その辺りが特によくわからず困っています。
また、スイッチの部分について、分岐している先にそれぞれ抵抗が入っていますが、分岐している元の方に1つの抵抗を入れるようにしたら問題がありますでしょうか。
だいぶ前の記事に対して全くの素人の質問で恐縮ですが、お答えいただいたら幸いです。
Katsumi (2023年9月23日 18:55:18)
こんにちは。
幾つか質問いただきました。順にお答えします。
1.クロック以外のCMOS ICが省略できるかどうか。
私がそれを言ったのか、どこで言ったのか思い出せないので、見当違いの答えになるかもしれませんが…。このプロジェクトでは、トグルスイッチによるプログラミングとデーターの読み出しが必要なので、ICを減らすのはなかなか難しいと思います。
2.リセットスイッチ周りの回路
リセットスイッチ周りに2つのNANDゲートを使っているのは、チャタリング対策です。場合によっては、リセットスイッチを何回押したかが重要になるケースがあるので、そういった場合に「1回押せば1回のリセット」となるようにNANDゲートを使ってチャタリング対策をしています。リセットボタンを押したときに複数回のリセットイベントが許容されるようなケース(チャタリング対策が必要ないようなケース)では、よりシンプルな回路で良いと思います。
3.データー読み出し用の発光ダイオード周りの回路
最近のZ80はCMOS製なので出力が大きくとれるため(昔のTTL製のものではダメ)、抵抗を繋いだLEDの直接駆動が可能です。ただ、その方法をここに採用すると、常にプルダウンされているような状況になります。このプロジェクトでは、トグルスイッチによりデーターバスをプルアップしたりプルダウンしたりする必要があるため、そういった直接駆動方式は取れません。ですので、間にNOT回路を入れています。
4.トグルスイッチ周りの抵抗の接続位置
おっしゃるような方法でもおそらく動作しますが、スイッチのロットによってはH側とL側と同時に接続するような瞬間があるかもしれません。この回路では、そういった予期しない時間帯があっても誤作動しないように設計しています。
幾つか質問いただきました。順にお答えします。
1.クロック以外のCMOS ICが省略できるかどうか。
私がそれを言ったのか、どこで言ったのか思い出せないので、見当違いの答えになるかもしれませんが…。このプロジェクトでは、トグルスイッチによるプログラミングとデーターの読み出しが必要なので、ICを減らすのはなかなか難しいと思います。
2.リセットスイッチ周りの回路
リセットスイッチ周りに2つのNANDゲートを使っているのは、チャタリング対策です。場合によっては、リセットスイッチを何回押したかが重要になるケースがあるので、そういった場合に「1回押せば1回のリセット」となるようにNANDゲートを使ってチャタリング対策をしています。リセットボタンを押したときに複数回のリセットイベントが許容されるようなケース(チャタリング対策が必要ないようなケース)では、よりシンプルな回路で良いと思います。
3.データー読み出し用の発光ダイオード周りの回路
最近のZ80はCMOS製なので出力が大きくとれるため(昔のTTL製のものではダメ)、抵抗を繋いだLEDの直接駆動が可能です。ただ、その方法をここに採用すると、常にプルダウンされているような状況になります。このプロジェクトでは、トグルスイッチによりデーターバスをプルアップしたりプルダウンしたりする必要があるため、そういった直接駆動方式は取れません。ですので、間にNOT回路を入れています。
4.トグルスイッチ周りの抵抗の接続位置
おっしゃるような方法でもおそらく動作しますが、スイッチのロットによってはH側とL側と同時に接続するような瞬間があるかもしれません。この回路では、そういった予期しない時間帯があっても誤作動しないように設計しています。
てつや (2023年9月23日 23:59:33)
こんにちは。
ご丁寧にお答えいただきありがとうございます。
私も黎明期のマイコンのようなものの自作にチャレンジしてみたいと思っているのですが、まともにはんだごてを握ったこともなく右も左もわからないため、いきなり複雑なものを作ろうとしても頓挫する可能性が高いように思いましたので、
Katsumiさんの必要最小限構成の作例を参考に作ってみようと思ったのでした。
必要最小限であるということにハードルの低さと同時に美しさも感じていたため、もっと省略できる可能性があるのならと、思い切って質問させていただいた次第です。
ICを減らすのはなかなか難しいとのことですので、まずはほぼ回路図の通りに作らせていただいて、動作させてみて、電子回路やマシン語の理解を深めつつ、あれこれ応用ができたらいいなと思いました。
ちなみにICの省略の可能性についてはYouTube上でこちらのパチパチマイコンを解説されている動画の中でお話されていました(2011年10月26日の記事の最後に触れられている動画かと思います)。
もしかしたら今回お答えいただいたチャタリング対策が必要ないケースについてのお話だったのかも知れません。
P.S. 6502を使った必要最小限構成のパチパチ2号も楽しみにしています(笑)
ご丁寧にお答えいただきありがとうございます。
私も黎明期のマイコンのようなものの自作にチャレンジしてみたいと思っているのですが、まともにはんだごてを握ったこともなく右も左もわからないため、いきなり複雑なものを作ろうとしても頓挫する可能性が高いように思いましたので、
Katsumiさんの必要最小限構成の作例を参考に作ってみようと思ったのでした。
必要最小限であるということにハードルの低さと同時に美しさも感じていたため、もっと省略できる可能性があるのならと、思い切って質問させていただいた次第です。
ICを減らすのはなかなか難しいとのことですので、まずはほぼ回路図の通りに作らせていただいて、動作させてみて、電子回路やマシン語の理解を深めつつ、あれこれ応用ができたらいいなと思いました。
ちなみにICの省略の可能性についてはYouTube上でこちらのパチパチマイコンを解説されている動画の中でお話されていました(2011年10月26日の記事の最後に触れられている動画かと思います)。
もしかしたら今回お答えいただいたチャタリング対策が必要ないケースについてのお話だったのかも知れません。
P.S. 6502を使った必要最小限構成のパチパチ2号も楽しみにしています(笑)
Katsumi (2023年9月25日 19:01:31)
このプロジェクトに関するブログ記事、さらにいろいろ発展させるようなことを書いているのですが、実際はこのページの内容でストップしています。つまり、これで完成という事ですね。カセットテープインタフェースも使っていないし、BIOSも使っていません。回路は、一番上の基本形で完成です。
コンピューターの基本原理を知るには、このパチパチ一号は最適だと思います。トグルスイッチでバイナリーの入出力が出来るので、必要最小限のコンピューターの動作を確認することができます。ただ、発展性がないのが残念ですが、興味がおありならぜひ作ってみて下さい。
もし、マイクロコントローラーの知識があるなら、EMUZ80というのがあります。BASICが走ったりするはずです。
https://vintagechips.wordpress.com/2022/03/05/emuz80_reference/
キットも販売されています。
https://store.shopping.yahoo.co.jp/orangepicoshop/pico-a-052.html
コンピューターの基本原理を知るには、このパチパチ一号は最適だと思います。トグルスイッチでバイナリーの入出力が出来るので、必要最小限のコンピューターの動作を確認することができます。ただ、発展性がないのが残念ですが、興味がおありならぜひ作ってみて下さい。
もし、マイクロコントローラーの知識があるなら、EMUZ80というのがあります。BASICが走ったりするはずです。
https://vintagechips.wordpress.com/2022/03/05/emuz80_reference/
キットも販売されています。
https://store.shopping.yahoo.co.jp/orangepicoshop/pico-a-052.html
Katsumi (2023年9月25日 19:16:10)
あと、Z80のアセンブラーは、これを使ってください。パチパチ1号用に作ってあって、2進数表示もされるので、便利だと思います。
https://www.recfor.net/blog/mycom/index.php?itemid=826
https://www.recfor.net/blog/mycom/index.php?itemid=826
てつや (2023年9月25日 22:21:05)
パチパチマイコンを作って、完成したらアセンブラーも利用させていただきたいと思います。
有益な情報を公開してくださり、また、ご丁寧に教えてくださり、本当にありがとうございます。
パチパチマイコンの先の目標としては、入出力のあるバージョンを作り、その後手動のROMライターを作り、TK80みたいなものを作り、Tiny BASICを動かしたり、LEDドットマトリクスでゲームを作ってみたりしたいです。
部品は現代の技術を反映したものになるかと思いますが、コンピューターを所有するには自分で作るしかなかった時代の真似事をしてみたい想いがあります。
ただ、これらは今の私には夢物語に近いので、とにかくまずはパチパチマイコンです!
EMUZ80もミニマルな構成ですごいですね。
マイクロコントローラーの知識はないのですが、色々調べてみたいと思います。
教えてくださりありがとうございます。
有益な情報を公開してくださり、また、ご丁寧に教えてくださり、本当にありがとうございます。
パチパチマイコンの先の目標としては、入出力のあるバージョンを作り、その後手動のROMライターを作り、TK80みたいなものを作り、Tiny BASICを動かしたり、LEDドットマトリクスでゲームを作ってみたりしたいです。
部品は現代の技術を反映したものになるかと思いますが、コンピューターを所有するには自分で作るしかなかった時代の真似事をしてみたい想いがあります。
ただ、これらは今の私には夢物語に近いので、とにかくまずはパチパチマイコンです!
EMUZ80もミニマルな構成ですごいですね。
マイクロコントローラーの知識はないのですが、色々調べてみたいと思います。
教えてくださりありがとうございます。
Katsumi (2023年9月27日 13:34:25)
色々と楽しみですね。私も、パチパチマイコンに戻って、新規格を始めたくなりました。2号の設計を、考えてみます。
てつや (2023年9月27日 18:32:54)
パチパチ2号!
とても楽しみです!
とても楽しみです!