LCDを68系CPU直結で動かした

パラレルのLCD(液晶表示器)は現在だともっぱらマイコンの汎用ポートで制御されるから、どうかすると「訳のわからん独自インタフェース」なんて説明される。なに言ってくれちゃってんだろうね。本当のところあれは68系バスで、実際、68系CPUだと直結して動かすことができる。はい、やって見せましょうってことで作った拡張基板を下に示す。

LCDにはCS(チップセレクト)がなくてEで兼用することになっている。そのためCSとEのANDをとってLCDのEへ入れる。その部分にちょっとしたロジックが必要で、うるさくいえばEが直結でない。あとは疑いようのない直結。LCDまわりの回路を下に示す。CSとEのANDをとるロジックは、拡張基板だと7400のNANDを3個使って構成している。

68系CPUの代表格はMC6800で、それを載せたSBC6800が手もとに売るほどあるが、困ったことにバスが外部へ出ていない。接続しやすいのはSBC6303で、こちらはHD6303が載っている。似たようなもんだし、まあいいか、ということでHD6303でやったら、LCDが四角しか表示しない。とうとうロジアナをつないで原因を調べる騒動に発展。

ロジアナの表示を追うと、ところどころデータが揺れたりヒゲが出たりしている。しかたなく(おいっ)マニュアルを読み返したら、HD6303はデータがアドレスと同一のピンを使うせいで確定が遅いのだった。一方のヒゲはまだ原因が掴めていない。しかし根は同じだと思う。早い話、HD6303のバスは68系バスではないということ。いかんいかん。

あらためてSBC6800でテスト。バスが外部へ出ていないからACIAを取り外してそのICソケットからLCDへ配線。とうていスマートではないが、LCDがMC6800のバスに直結されていることは一目瞭然となり、これはこれで意味がある。結果、LDA命令とSTA命令で普通に表示できた。MC6800は周辺ICやメモリなどと同様にLCDを最速で制御している。

パラレルのLCDが68系CPU直結で動くことは当然の事実として機会あるごとに述べてきた。今にして思えば、偉そうなことをいう前にちゃんと確認しておくべきだった。HD6303で動かなかったときは焦ったぞ。最終的にはMC6800との直結が動き、内心、ホッとしている。今後は、もう確認したのだから、偉そうにいおうと思う。

カテゴリー: 6800, 6809 | 4件のコメント

最少部品オシロ公開版

最少部品オシロは最少限の平凡な部品だけで構成したオシロスコープ。測定器の王者オシロスコープもボクが作ればこんな感じだぜって見せびらかすことが目的で、当初、プリント基板の頒布までは検討していなかった。しかし、オレンジピコショップさんが電子工作の入門キットを企画してくれたので、ありがたく乗っかって、ここに発表する次第。

最少部品オシロは信号の波形を表示することに全力を注いでいて機能や使い勝手は二の次。信号は0V~5Vの範囲で振れる必要があるし、各種入出力端子がファームウェアの書き込みを兼用しており、凄く不便。電子工作の入門キットとしてはいかがなものかと考え、もうひとつ、これらの問題をまとめて解決する開発・調整用発振器を作った。

開発・調整用発振器は最少部品オシロに対して電源を供給するとともに0V~5Vの範囲で振れる三角波または方形波を出力する。だから、純正の書き込み装置Snapを直結してファームウェアを書き込み、そのまま動作確認まで進める。さらに、その状態でファームウェアを更新できるため、表示の調整や機能の拡張などカスタマイズにも便利。

最少部品オシロと開発・調整用発振器の関連ファイルはGithubに置いた。取扱説明書もそちらにあって、このブログで述べていることを含め、すべてがわかる。じゃあ最初からそっちを紹介しろよって話だが、公開はここと決めているので、いやあすみません。

最少部品オシロ関連ファイル-https://github.com/vintagechips/mp_oscillo
最少部品オシロ組み立てキット-商品ページはこちら
最少部品オシロ専用プリント基板セット-商品ページはこちら
※組み立てキットは最少部品オシロと開発・調整用発振器の基板およびファーム書き込み済みマイコンほか部品一式、プリント基板セットはプリント基板2枚のみ

最少部品オシロは比較的簡単に作れるという点では確かに入門向き。一方、腕のたつ人はRAMが256バイトしかないマイコンで曲がりなりにも波形を表示するファームウェアに関心を持ってもらえると思う。つまり、入門者を誘っておいて深みにハメる作戦。つねづね言っているとおり、ボクは電子工作の仲間をいっぱい増やしたいのだ。

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

EMU68k8の成果

往年のCPUをPICひとつで動かす試みは、Z80のEMUZ80が思いのほかうまくいったから、引き続きMC68008のEMU68k8に着手。データシートを見る限り制御はMC68008のほうが簡単。タイミングの制約が緩く、PICをマイペースで動かせる。試作機は、EMUZ80からZ80を取り外し、ジャンパー線でブレボのMC68008へつないで、たちまち完成。

この種の制御は、PICが面倒な処理をする間、CPUをうまく待たせられるかどうかが成否のカギを握る。Z80を始めとするほとんどのCPUは限られた時間のうちに待ち信号を送らなければならない。そこへいくとMC68008は、何もしなければ待ちに入り、抜けていいときDTACKを送る仕組み。こういっちゃあナンだけど、楽勝だわ。

試作機でHELLO, WORLDが動き、やや不安定だったんだけど、えいやっとプリント基板を作った。いやちゃんと確認しなきゃダメでしょ。あとからわかった不安定の原因はBERRをプルアップし忘れていたこと。また、BRは普段プルアップしておいて、PICにファームを書き込むときGNDへ落とせると便利。そこらへんはジャンパー線で応急処置。

正しい回路はこんな感じ。HELLO, WORLDが安定して動いたからハードは完成。PICによる制御もたぶん大丈夫。あとはEhBASICあたりを移植してアセンブルし、バイナリを配列rom[]に置けば完成。なんだけど、ボクはMC68000の機械語が苦手で、HELLO, WORLDが精いっぱい。EhBASICときたらぜんぜん動かせないのだった。

別窓でPDFの回路図を開く

諦めかけたとき救世主が現れた。EMUZ80に追加基板(メザニンボード)を乗せる方法で各種CPUを動かしている奥江聡さんが、MC68008に対応したMEZ68008でEhBASICを動かしたのだ。そのうちEhBASICのソースがこちらのGithubリポジトリで公開されている。ありがたく頂戴し、RAMサイズを調整し、EMU68k8の配列rom[]に組み込んで、はい完成。

ファームのMPLAB X IDEプロジェクトとPIC18F47Q43のHEXファイルを下のGithubリポジトリに置いておく。ファームの大筋はボクが書いたが、そのうち配列rom[]の中身は奥江聡さんのEhBASICをごにょごにょやって作ったバイナリとなっている。

EMU68k8関連ファイル-https://github.com/vintagechips/emu68k8

EMU68k8はMC68008を6MHzで動かしている。最高7.5MHzまで安定して動くが、速度が微増にとどまるため、6MHzが最適と判断した。ASCIIART.BASの実行時間は12分18秒。

ボクのEMU68k8はさまざまな観点から奥江聡さんのMEZ68008に後れを取っている。どこがどう後れているか丁寧に説明することはあまりに自虐的だから控えるとして、端的な事実をひとつ言えば実行速度が30%ほど遅い。ここにEMU68k8の成果をまとめた上で、今後のことは奥江聡さんのMEZ68008にお任せしようと思っている。

カテゴリー: 68000 | 3件のコメント

最少部品オシロの雑な説明

アナログのオシロは高級な部品と高度な技術を詰め込んだ芸術作品だよね。デジタルはもっと凄いんだろうなと思ったら逆にシンプル、仕組みがぜんぜん違って、いわば手抜きのし放題。そういうの得意なんだよね。てことで、なるべく少数の安価な部品で作ったオシロがこれ。曲がりなりにも信号の波形を表示したから、取り急ぎ雑な説明で公開する。

回路はこんな感じ。概略、マイコン(PIC16F18313)にOLED(製品名不詳)をつないただけ。マイコンにファームを書き込む端子が完成後は電源と信号の入力端子になる。信号はマイコンがAD変換器でスイープする。こんな仕組みなので信号はGND~5Vの範囲で振れなければならない。そうでない信号は、外部に差動増幅とかが必要になる。

回路図のピン配置はたいがい実物と違うもんだが、シンボルを妙に生々しく描いちゃったので、間違える人がいるかもしれない。念のために実体配線図を追加しておこうかな。これは底面図、ハンダ面から見た配線。実物どおり電線と錫メッキ線を描いている。まあそこらへんのわかりにくいところは見る側の努力で補ってほしい。なんちて。

部品を減らすためとはいえファームの書き込み端子を電源と兼用したのはちょっとやりすぎたかもしれない。よく使われる書き込み装置Snapは装置の電源が入っていないと書き込まない仕組みになっているが、電源がつなげない。てことでちょっと改造。PICkit2かPICkit3を持っている人はこちらのPICkitminusと組み合わせて使えば大丈夫。

最少部品オシロの使いかたはこう。電源5Vと信号をつなぐ、以上。電圧軸(Y軸)はDC5V固定。電源3.3Vでも動くがファームで電圧の表示や補助線を変更する必要があって、それはまだやっていない。時間軸(X軸)は自動。その動作は100Hz、1kHz、5kHzで確認した。測定可能な周波数の上限は見る人の寛容さに依存するが10kHzくらいかな。

ファームはGithubのmp_oscilloリポジトリに置いた。あとはよしなに。ちなみにボクはGithubをよく知らないので何かしらのリクエストをいただいてもたぶんお応えできない。バグを修正したり機能を拡張された人は、誠に申し訳ないけれど、ご自身で発表してね。

最少部品オシロ関連ファイル-https://github.com/vintagechips/mp_oscillo

main関数はこんな感じ。機能の追加や変更は、たいがいここをいじれば何とかなると思う。現状、1kHzまでの周波数はサンプリング間隔を自動調整して1波を表示する。それ以上は、成り行きで表示される波の数が増える。

// Minimal parts Oscilloscope
// Author: Tetsuya Suzuki

#include "system.h"

uint8_t us;  // サンプリング間隔(単位u秒)を代入する変数
uint8_t pod; // 1周期のサンプリング数が代入される変数

#define TOL 16 // 時間軸自動調整のアソビ(許容誤差)

void main() {
   adc_init();  // AD変換器を起動
   i2c_init();  // I2Cを起動
   oled_init(); // OLEDを起動
   us = 48;     // サンプリング間隔の初期値を代入

   while(1){
        adc_sweep();   // 信号の波形をスイープ
        adc_analyze(); // 信号の情報を各変数に代入
        
        // サンプリング間隔を自動調整する手順
        if(pod == 0){  // 信号の1波を捉えられなかった場合
            if(us < 239) us += 16; // サンプリング間隔を大胆に広げる
        } else
        if(pod > SCREEN){ // 信号の1波を表示し切れない場合
            if(us < 255) us++; // サンプリング間隔を伸ばす
        } else
        if(pod < SCREEN - TOL) { // 信号の1波が狭すぎる場合
            if(us > 2) us--; // サンプリング間隔を縮める
        }

        // Draw screen
        oled_label(); // 情報領域を表示
        oled_draw();  // 波形領域を表示
    }
}

製作物が完成したらプリント基板を頒布してお祭り騒ぎをするのが恒例だが、これはそういうやつじゃない。いいかげんなボクの設計だからとりあえず再現してテストすることになるだろうが、最終的には何かほかの製作物に組み込んで意味がある。アナログシンセに波形モニタとして組み込みたいと言ってくれた人がいて、なるほどなと思っている。

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

EMUZ80が完成

Z80とPIC18F47Q43で動く挑戦的なコンピュータEMUZ80が完成した。設計の目標は、できるだけ少数の安価な部品と簡素なソフトウェアで動かすこと。CPU以外のICが1個だけなので部品はもう減らない。Z80はジャンクが格安だしPIC18F47Q43も40ピンで最低の価格帯。ソフトウェアはあとでどうにかする、ってことで目標は完全に達成された。

納得のいく設計ができて試作機がうまく動いたらプリント基板を頒布してお祭り騒ぎをするのが恒例だ。その先に起きるかもしれない、ふたつの出来事に、いま期待を膨らませている。第1に、噂話でZ80を知っている人が実物を動かす面白さも知ってくれること。第2に、どこからか凄腕の週末プログラマが現れてソフトウェアを改善してくれること。

EMUZ80技術資料-emuz80_techdata.pdf(3.7Mバイト)
関連ファイル-https://github.com/vintagechips/emuz80
プリント基板頒布元-EMUZ80専用プリント基板
雑誌投稿(ボツ)記事PDF-EMUZ80の設計と製作(3.8Mバイト)

EMUZ80は虫のいい目標を達成するためにソフトウェアで多くの働きを実現している。そのソフトウェアは、ボクの力量不足で、速度に対する配慮がない。往年のCPUを現在のマイコンで動かす試みは界隈に素晴らしい先例が多数あり、精通した人も多いと思う。ボクのソフトウェアにあきれて、つい手本を示してくれちゃったりしたら嬉しい。

[2022/3/17追記]
入れ替え可能なソフトウェアが発表されましたら、順次、関連ファイルの配布元に追加いたします。emuz80_pic_~.hexは入れ替え可能なソフトウェアです。お好みでご利用いただくとともに、ソースをご覧になってアプローチの違いをお楽しみください。

カテゴリー: PIC, Z80 | 5件のコメント

CP/Mega88 on Picoを動かした

Norihiro Kumagaiさんが開発したCP/Mega88 on Picoは超シンプルなCP/Mマシン。どのくらいシンプルかっていうのが下の写真。まんまRaspberry pi Pico(以下Pico)だから、もはや電子工作ですらない。ボクは過去に何回かCP/Mマシンを作ろうとして挫折しているが、さすがにこれは失敗しない。簡単に動いてくれたので、ここに過程をまとめておく。

CP/Mega88 on Picoを作る流れは、概略、GithubのプロジェクトをクローニングしてPicoの開発環境でビルドする。公式な説明は開発環境をUbuntu20に構築しているが、ボクは初代Raspberry Piに構築した。Raspberry Pi OSであればシェルスクリプト1発で開発環境が出来上がる(Getting started with Raspberry Pi Pico参照)。まあ4時間ほどかかるけどね。

クローニングとビルドの手順を下に示す。必要な操作が濃い文字、それに対する反応が薄い文字。Picoの実行ファイルはcpmega88.uf2の名前で作成される。Raspberry Pi OSの場合、それを/bootへコピーしておくとSDカードをパソコンへ差し替えて取り出せる。パソコンでcpmega88.uf2をPicoへ入れ、とりあえずフロッピーなしのCP/Mマシンが完成。

pi@raspberrypi:~ $ git clone https://github.com/tendai22/cp-mega88-pico.git
Cloning into 'cp-mega88-pico'…
remote: Enumerating objects: 288, done.
remote: Counting objects: 100% (288/288), done.
remote: Compressing objects: 100% (132/132), done.
remote: Total 288 (delta 205), reused 232 (delta 153), pack-reused 0
Receiving objects: 100% (288/288), 128.67 KiB | 460.00 KiB/s, done.
Resolving deltas: 100% (205/205), done.
pi@raspberrypi:~ $ cd cp-mega88-pico
pi@raspberrypi:~/cp-mega88-pico $ git checkout develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
pi@raspberrypi:~/cp-mega88-pico $ cmake .
Using PICO_SDK_PATH from environment ('/home/pi/pico/pico-sdk')
PICO_SDK_PATH is /home/pi/pico/pico-sdk
Defaulting PICO_PLATFORM to rp2040 since not specified.
Defaulting PICO platform compiler to pico_arm_gcc since not specified.
-- Defaulting build type to 'Release' since not specified.
PICO compiler is pico_arm_gcc
-- The C compiler identification is GNU 8.3.1
-- The CXX compiler identification is GNU 8.3.1
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/arm-none-eabi-gcc
Defaulting PICO target board to pico since not specified.
Using board configuration from /home/pi/pico/pico-sdk/src/boards/include/boards/pico.h
-- Found Python3: /usr/bin/python3.9 (found version "3.9.2") found components: Interpreter
TinyUSB available at /home/pi/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040; enabling build support for USB.
Using PICO_EXAMPLES_PATH from environment ('/home/pi/pico/pico-examples')
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/cp-mega88-pico
pi@raspberrypi:~/cp-mega88-pico $ make
Scanning dependencies of target ELF2UF2Build
[ 1%] Creating directories for 'ELF2UF2Build'
[ 2%] No download step for 'ELF2UF2Build'

《途中省略》

[ 96%] Building C object CMakeFiles/cpmega88.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.obj
[ 98%] Building C object CMakeFiles/cpmega88.dir/home/pi/pico/pico-sdk/src/rp2_common/hardware_spi/spi.c.obj
[100%] Linking CXX executable cpmega88.elf
[100%] Built target cpmega88
pi@raspberrypi:~/cp-mega88-pico $ sudo cp cpmega88.uf2 /boot
pi@raspberrypi:~/cp-mega88-pico $

フロッピーに相当するのはディスクイメージ。これはz80packのGithubのプロジェクトからもらう。ボクは、公式の説明とは違うが、パソコンでプロジェクトごとDownload Zipし、展開し、z80pack-master > cpmsim > disks > libraryで見繕った。ディスクイメージはたくさんあり、もし選択に迷ったらcpm2-1.dskが無難だと思う。

Picoをパソコンに接続し、端末ソフトを開く。この時点でもうCP/Mega88 on Picoが動いているが、念のためPicoを抜き差しして再起動させるとあらためて一連のメッセージが読めるからわかりやすい。これが、フロッピーなしのCP/Mマシンに相当。そこへフロッピーを装着する。まず、プロンプトにxrを入力し、PicoでXMODEMの受信を開始する。

続いて端末でXMODEMの送信をやる。端末がTeraTermの場合、ファイル > 転送 > XMODEM > 送信と選択、ファイルチューザーでディスクイメージを選択。

これでディスクイメージがPicoのフラッシュメモリに書き込まれる。いわば、フロッピーの装着が完了した状態。プロンプトにbを入力するとブートしてCP/Mが起動する。

ボクが過去にCP/Mマシンを作ろうとして挫折したことは冒頭で述べたとおり。もうひとつ、Picoを動かすことにも挫折していて、買ってすぐLチカをやったきりになっていた。その両方をCP/Mega88 on Picoが実現してくれた。いやまだ独自のプログラムは書けないが、動く実例が与えられたのだからソースを見て研究しようと思う。

カテゴリー: 8080, Linux, RaspBerryPi, Z80 | 6件のコメント

PIC18F47Q43のUARTで悩む

PIC18F47Q43をZ80につないでIC2個のみのコンピュータを作ろうと考えている。PICはZ80に対し、NCOでクロックを生成、ポートでリセットして起動、Z80からアクセスが来たらCLCでウェイトを出しておいてベクタ割り込みでメモリやUARTの働きをする。UARTを除くモジュールの雑なテストはすでに成功。ところが、ちょろいと思ったUARTがダメ。PICで普通に動かしてみるだけの試みがいまだ成功していない。

UARTのテストは慣例にしたがい端末にハローワールドを表示したあと入力のエコーバックをやってみるやつ。ハローワールドは成功。しかし入力のエコーバックができない。見てもしかたがないと思うが、いちおうスクショを貼っておく。受信ピンは製造元推奨のRA7、初期設定から受信までマニュアルどおりの手順。不幸中の幸いで送信はできるからあちこちのフラグを表示してみたら入力をしても受信可フラグが立たない模様。

ソフトウェアに間違いが見付からないのでハードウェアをテスト。RA7にLEDをつなぎ、ビデオカメラで撮影しながら端末のキーを押し、コマ送りして見るとLEDが一瞬点灯している。すなわち、入力した信号はRA7に届いており、ハンダ不良などハードウェアに起因する誤りもなさそう。結局、思いつく限りの怪しいところを全部調べて何ひとつ間違いがないのに受信をやらないという、たいへん困った状況に直面している。

デバッグが難航するとついシリコンエラータを疑ってしまう。これはまずい。自分以外の何かが悪いと考える癖がついたら今後ほかの問題も解決できない。そろそろ決着を付けようと思い、最後にもう1回、余ったプリント基板で最初から組み立てた。部品は必要最小限にとどめてミスの紛れ込む余地を減らす。RA7には信号が電源へ回り込むのを防ぐ回路があり、これも確実に迂回したいので、安直な方法として受信ピンをRA5に切り替えた。

結果がこちら。あら不思議、RA5がちゃんと受信をやっている。信号が電源へ回り込むのを防ぐ回路が悪さをしていたのかと思い、RA5にもそれをつないでみたが、やはり正しく動く。その後あれこれ確認したら、RA7で受信したときだけがNGで、ほかはすべてOK。とにかく動いたのだから、それに沿ってプリント基板を作り直せばいい。現状のプリント基板は書き込み端子が裏返しになっていて、いずれにしろ作り直しが確定なのだ。

RA7で受信するとNGで、ほかがOKな理由は、まったくわからない。誰かが指摘してくれたら嬉しいから情報をまとめておく。ハードウェアは送受信とも信号をピンに直結したので間違えようがない。ソフトウェアは全体をGistに貼り抜粋を下に示す。抜粋はブログの調子がいいと行番号を表示する。その行番号で30~32のコメントアウトしてあるところがRA7による受信、34~36がRA5による受信。さあRA7とRA5の違いはどこだ。

#include <xc.h>
#include <stdio.h>

// UART3 Transmit
void putch(char c) {
    while(!U3TXIF); // Tx interrupt flag not set
    U3TXB = c;
}

// UART3 Recive
char getch(void) {
    while(!U3RXIF); // Rx interrupt flag not set
    return U3RXB;
}

void main(void) {
    // System initialize
    OSCFRQ = 0x08; // 64MHz internal OSC

    // UART3 initialize
    U3BRG = 416; // 9600bps @ 64MHz
    
    U3TXEN = 1; // Transmitter enable
    U3RXEN = 1; // Receiver enable
    
    RA6PPS = 0x26;  // RA6->UART3TX
    TRISA6 = 0; // TX set as output
    ANSELA6 = 0; // Disable analog function

//    U3RXPPS = 0x07; // UART3RX->RA7
//    TRISA7 = 1; // RX set as input
//    ANSELA7 = 0; // Disable analog function

    U3RXPPS = 0x05; // UART3RX->RA5
    TRISA5 = 1; // RX set as input
    ANSELA5 = 0; // Disable analog function
    
    U3ON = 1; // Serial port enable
    
    printf("hello, world\r\n");
    while(1) putch(getch()); 
}

ボクが間違っているという指摘がないか、間違っていないと言ってもらえたら、そのときはシリコンエラータを疑ってもいいと思う。今そういう報告をどこで受け付けているのか調査中。にしてもさ、世界中で無数に使われているであろう製品の、こんなにあからさまな問題をボクが最初に報告するなんて、ちょっと考えられないよね。ボクが間違っていたときごめんなさいをいう心の準備のほうが優先かもね。

[2022/1/14追記]
ツイッターのほうにskyriverさんからご指摘があり、ボクの間違いが判明しました。コンフィグのFEXTOSCをOFFにしたらRA7で受信しました。ありがとうございます。Gistに貼った全ソースの1行目(行番号5)でやらかしています。お騒がせ致しました。

カテゴリー: PIC, Z80, 世間話 | コメントをどうぞ

SBC6809Eが完成

[2022/2/2追記]
MC6883は高速モードだとDRAMのリフレッシュをしないようなのでEPROMには標準モードまたはマップタイプ#0アドレス依存モードのBASICを書き込んでください。その際EPROMにはBASICの先頭アドレスが$E000となるように書き込みます(SBC6809と同じ)。

レトロCPUがまだレトロではなかったころMC6809EとMC6883を入手した知人が自作のコンピュータを見せびらかしに来て以来ボクはずっとそれらに憧れがあった。MC6809Eは比較的入手しやすい。MC6883は少なくとも国内だと入手困難。何かの機会にそんな話をしたところRetro PC Galleryを運営するはせりんさんが手持ちのMC6883をプレゼントしてくださった。おかげで下のようなコンピュータを完成できたから情報をまとめておく。

SBC6809E全回路図(PDF)-SBC6809E_sch.pdf
SBC6809E部品表(PDF)-SBC6809E_bom.pdf
SBC6809Eデータパック(OneDriveからダウンロード)-sbc6809e_datapack.zip
プリント基板頒布元-オレンジピコショップのSBC6809E専用プリント基板

MC6883はくだんの知人からDRAMコントローラと聞かされていた。しかし、そういう観点で見るといろいろ親切すぎるし一部に役割不明なピンがある。改めて調べたら、これはCoCoの愛称で知られるタンディー・カラー・コンピュータのカスタムICらしい。役割不明なピンはビデオ表示用。ビデオ表示までやると10cm四方のプリント基板にはとうてい収まらないので、いつもどおり端末をつないで操作する形式をとった。

MC6883が要求する原発振周波数(クロックの16倍)とリフレッシュ頻度、MC6850が要求する通信クロック、MC6809Eが要求するリセット信号はPIC12F1822で作ることにした。ビデオ表示をやらないことはむしろ設計上のメリットになる。NTSCのタイミングに合わせる必要がないため、原発振周波数を上げてMC6809Eを最高速(1MHzまたは2MHz)で動かせるし、リフレッシュ頻度を下げて過剰なリフレッシュを避けられる。

MC6883はソフトウェアでマップタイプの#0と#1を切り替えられる。#0は簡単にいうとCoCo互換でRAMが32Kバイト×2バンク。#1はRAMがほぼ64Kバイトだが普通サイズのROMを取り付ける余地がなくてBASICは外部から読み込む想定。どっちもいまいち。ボクの理想はRAMが約56Kバイト、ROMが8Kバイト、IOが256バイトの、いわば普通の構成、しいて言えば変形#1。以上のどれでも実現できるようにアドレスデコーダをGALで作った。

MC6883はさらにMC6809Eへ出すクロックも標準モード1MHzと高速モード2MHzをソフトウェアで切り替えられる。試作機は高速モードに対応したMC68B09EとMC68B50を取り付けてあるが、情けない話、アクセスタイムの速いDRAMを買う経済的余裕がなくて高速モードを試していない。したがって推奨は標準モード。データパックには4種のBASICを用意してあり、そのうちBASIC9E_map1_slow.hexを使っていただくのが無難。

以上のとおり製作するとマップタイプは変形#1、RAMが約56Kバイトになる。BASICはリセット後にRAMの容量を調べるから起動まで少々(約1秒ほど)待たされる。実はこのBASICもCoCo由来で、RAMが32Kバイト以上あると空き容量を負の数字で表示する。正の数字に直せば約56Kバイトとなって実態と一致する。それ以外は今のところ問題なく動作している。今後もし新たな問題が発覚したらマップタイプ#0を推奨に変更しようと思う。

通信速度は9600bps、通信形式は8ビット、パリティーなし、ストップビット1です。

SBC6809Eのプリント基板は、当初、プリント基板CADの自動配線がネを上げたのを手配線で何とかまとめた労作。頑張った証として頒布することにしたが、みんなも作ってねと気楽に言うことはできない。MC6883が入手困難だし、DRAMを8個揃えると結構な出費になる。だから、すでにそれらを持っている人に言いたい。凄いだろ、DRAMが64Kバイトあるんだぜ、PIC12F1822でリフレッシュを最適化しているんだぜ、動かすと面白いぞ。

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

SD8031のハードだけ完成

日本電気が1979年に発売したパソコンPC-8001をいまだ後生大事に持っている。使う面白さはもう十分に味わって、ここ数年は電子工作の対象。その一環として製作した拡張基板のひとつが下に示すSD8031。フロッピーディスクドライブPC-8031のエミュレータでフロッピーディスクのかわりにSDカードを使う。見た目はまあまあカッコいいでしょ。

ファームウェアの開発効率を考慮してマイコンはATmega32A、回路の要所はMightyCore互換。したがってこちらの説明にしたがいArduino IDEが対応するし同ライブラリが使える。マイコンにブートローダを書き込むところが難関かと思うが、みんな持ってるTL866で書き込めた。これでSDカードの取り扱いもポートの振り方も自由自在(のはず)。

※画像の回路図をクリックするとPDFの回路図が開きます。

USB-シリアル変換アダプタとGroveがつながるようになっていて電源をこれらまたはACアダプタからとる。複数からとると炎上するのでUSB-シリアル変換アダプタの電源はソルダパットで切断できるようになっている。ちなみにUSB-シリアル変換アダプタのコネクタ取付穴は径を間違えている(配線のゆがみもある)が力任せに押し込めば挿さる。

ハードウェアに誤りがないことを確認するため豊四季タイニーBASICのArduino版をアップロードして起動に成功。このときのソースは紛失してしまったので配布できないがUnoのソースがあらかた通ったように記憶しているから必要になったらまた作ろうと思う。

さあファームウェアを作るぞというところでふと気付いたのだが、PC-8001にはこれが直接つながるコネクタが見当たらない。調べてみると中間に拡張ユニットか専用インタフェースを挟むらしい。そんなものは持っていないので開発にあたり動作確認ができない。ということで続きはまたいつか。はい、いつもどおり行き当たりばったりでやってます。

カテゴリー: Arduino, 世間話 | コメントをどうぞ

Z8試作基板が8年ぶりに完成

ザイログZ8はなかなかの難物で過去に試作基板を3台も製作している。初代は手作りの力作だったが電源が燃えて失敗、感光基板の2代目はプログラムが起動せず、プリント基板の3代目で無事に動作した。何はともあれ動いたのだから動かしかたは理解した。過去の間違いを振り返りながら、この8年ほど放置してあった初代をあらためて完成させた。

初代は2013年の設計で芸風が今とだいぶ違う。電源は今なら5VセンタープラスのACアダプタ直結だけど、これは整流と安定化をやっていて8V以上のACアダプタが全部OK。ただし、消費電流のデカいNMOSのZ8だと三端子レギュレータが燃える。だからCMOSのZ8を使い、燃えた三端子レギュレータを交換して、回路はそのまま。

Z8を外部ROMから起動させるにはP0/A8~P3/A11をプルダウンする必要がある。2代目でプログラムが起動しなかった理由はプルダウンの抵抗値が大きすぎたから。マニュアルに最適値が示されていなくて困ったが、3代目を製作する過程で試行錯誤により6.8kΩと判断。その結果を初代に反映し、取り付けてあった100kΩを6.8kΩに交換した。

修正した初代の回路図を下に示す。端末がつながるようにUSB-シリアル変換アダプタの端子を追加。3代目で74573に変更したアドレスラッチはまだ74374のままでアドレスの確定が微妙に遅れるが読み書きには間に合うから問題がない。あとは3代目と同じ。

修正した初代の回路図(PDF)─sbcz8v5_sch.pdf

この絶対に動くはずの回路でも最初の電源オンでは動作しないというジンクスが健在。配線を見直して間違いをひとつ発見、修正してようやくBASIC/DEBUGが起動した。下の画面はテストプログラムで400以下の素数を全部表示したところ。

久しぶりに手配線をやって独特の味わいに酔っている。といっても大部分は8年前にやったやつで今回はUSB-シリアル変換アダプタの接続と間違いの修正だけ。その数本で達成感が得られて誠に効率がいい。ほかにもやりかけの基板がないか探してみようと思う。

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