オレ仕様のゲーム機を作ろう(その6)
前回から年が明けてしまいましたね…。
結局,昨年はこのブログの記事も6回しか更新することができませんでした…。
どうしても制作している工作物をネタにすると,更新頻度が低くなってしまうので,今年は,他のネタも含めつつ,なるべく更新していきたいなぁ…と思っています。
さて,その「オレ仕様のゲーム機」。2ヶ月くらい前になりますが,前回は,画面タイミング信号回路の部品配置までやりました。
オレ仕様のゲーム機を作ろう(その5)
今回は,基本システムとなる,CPU,メモリ,ホストインターフェース周りを基板に実装し,ワイヤラッピングで配線します。
ワイヤラッピング配線
ワイヤラッピングによる配線は,Z80 ゲーム機を作ろう(その11) や,ペンゴをワイヤラッピングで作ってみた などで既に紹介していますが,今回もそれらと同じ手法で配線していきます。
まずは,配線材です。ジュンフロン線(ETFE線)という,フッ素樹脂コートされた導線を使用します。
ちなみに「ジュンフロン」は株式会社潤工社の登録商標らしいです。学生の頃,「バッ活」の記事なんかで,なんかカッコイイ名前だな〜と思っていたら,社名に基づいていたんですね。
このジュンフロン線,いろんな色が発売されています。私は青色を好んで使用していますが,配線箇所ごとに色を分けると,後でデバッグがやりやすく,カラフルでカッコイイと思います。
…で,このワイヤラッピングと言われる配線方法,導線をラッピングポストと呼ばれるピンに巻きつけて配線しますが,前回紹介したように,このラッピングポストはピンヘッダを使用しています。
ピンヘッダに対してジュンフロン線を巻きつけるわけですが,素手でくるくる巻きつけるわけにも行かないですよね。そのための工具が必要です。
これは,手動ではあるのですが,セミオートというか握ると先端がドリルのように回転してポストに導線を巻き付けます。
密集していない箇所はこれを使うと比較的楽に巻きつけることができます。電動で巻きつけるものもあるのですが,高価で手が出ませんでした…(笑)。
もう一つは,完全手動のツールです。
先端に被覆を剥いた導線を差し込み,その状態でピンヘッダにこのツールを差し込んでくるくると巻き付けます。
力加減を調整できるので,細かい部分などはこちらを主に使っています。
そして実際に巻きつけるとこんな感じになります。
失敗しても簡単に取り外すことができるし,意外とガッチリ巻き付けられるので,個人的には,はんだ付けするよりも信頼性が高いと思っています(もっとも,ピンヘッダは,はんだ付けしているので,なんとも言えないですが…)。
必ず間違って配線してしまう自分にはお誂え向きなんですよね。
システム基板完成
全ての配線をし,線を束ねて,部品をソケットに刺しました。
比較的大きい基板なので,IC がズラッと並んでいるとなんかカッコよくないですか?(笑)
右下の 40 ピンのチップが,Z80 です(言わなくてもわかりますよね)。本家ザイログの CMOS 品です。ロゴがカッコイイですよね。
中央にある,32 ピンのチップが SRAM です。
1Mbit の容量を,ROM 領域に80KB,RAM 領域に 16KB 使用します。
ROM 領域は,いつものように ROM エミュレータとしてホストからデータを転送できるようにしています。
そして,これまたいつも通り,デバッグ用で,入力用にディップスイッチ,出力用に LED を実装しました。
それぞれ,I/O 領域にメモリマッピングし,CPUからそれぞれリード・ライトできます。
ホストコンピュータとは USB シリアルで接続し,ROM へのコードやデータ転送の他,デバッガとの通信にも使用します。
電源は,5V のスイッチング電源を使用します。
メモリマップは以下のようになりました。
$4000〜$7FFF の ROM 領域は,バンクレジスタによりバンク切替可能です。
VRAM 領域は,2 枚目以降の基板で実装される予定です。
動作確認
以下のようなテストプログラムをアセンブルし,デバッガ経由で読み込ませて実行してみました。
; -*- coding: utf-8-unix -*- .psize 0 LED = $A003 .text ;=============================================================================== ; INT 割り込みハンドラ ;=============================================================================== .org $0038 di push af push hl ld hl,intCount inc (hl) ld a,1 ld (intFlag),a pop hl pop af ei ret ;=============================================================================== ; NMI 割り込みハンドラ ;=============================================================================== .org $0066 retn ;=============================================================================== ; エントリポイント ;=============================================================================== .org $0100 .global start start: di im 1 ld sp,$3F80 xor a ld (intFlag),a ld (intCount),a ei 1: ld b,ledPattern1-ledPattern ld hl,ledPattern 2: ld a,(hl) inc hl ld (LED),a call wait call wait djnz 2b jr 1b ledPattern: .byte %00000011 .byte %00000110 .byte %00001100 .byte %00011000 .byte %00110000 .byte %01100000 .byte %11000000 .byte %10000000 .byte %11000000 .byte %01100000 .byte %00110000 .byte %00011000 .byte %00001100 .byte %00000110 .byte %00000011 .byte %00000001 ledPattern1: ;=============================================================================== ; 割り込み待ち ;=============================================================================== wait: push hl ld hl,intFlag ld (hl),0 1: ld a,(hl) or a jr z,1b pop hl ret ;=============================================================================== ; ワークエリア ;=============================================================================== intFlag: .space 1 intCount: .space 1 .end
リセットエントリがないのは,デバッガに読み込ませて実行させているからです。
また,デバッガ上で動かすときには,ROM 領域は CPU から書き込み可能になります。なので,ワークエリアやスタックエリアも ROM 領域に置かれています(単に面倒なだけだったり…)。
LED のタイミングは,割り込みモード 1 にして,VBLANK(1/60 秒)で割り込み信号を入れています。
次にデバッガから,バンク変更レジスタへの書き込みを行ってみます。
$A000 がバンクレジスタで,$4000〜$7FFF の 16KB が切り替えられます。問題なく切り替えと書き込みができているようです。
さて,今回はここまでです。
次回は,BG 画面と音源を実装した基板の作成に取り掛かる予定です。