8080A動いた

8080Aのボードで苦心していましたが、動きました。

8251のシリアル通信で、ロジアナで見る限り、初期化がしっかりなされているのにも関わらず、8251のステータスがずっと0、って困っていました。回路図を何度見ても間違いはなく、でも思ったような動きをしていないことも事実、という時には、やっぱり現物の配線を確認すべし、ってことで、8251周りの配線をテスターで確認していきました。まず、GNDは4番につながっているので、OK、じゃあ26番のVCCは?ってことで調べると、導通がありません。あれー?ということで、その時、はたと、EEPROMのVPPに配線していたVCCを、EEPROM対応をするためにVPPとA14とを入れ替え、VCCからの配線をパターンカットしていることに気が付きました。8251のVCCをここのVPPのところから引っ張っていたために、配線修正した瞬間8251に正しく電源電圧がかからなくなっていたということが判明。

配線なおしたら、シリアルの入力文字をエコーバックするプログラム動きました。OK!

 

上にCPUボード、NEC のuPD8080A, uPB8238, uPB8224と電源周りが乗っています。intel の8080A も入手してあるので、uPD8080Aとの違いもチェックできるぞ!(興奮)

消費電流は5V 0.476A クロックジェネレーターがCPUとバスコントローラー以上に熱い!

RESETを8251に接続するために、白いジャンパ線を這わしてるのがいまいち。ロジアナを繋いでCPUボードの動作チェックしていたのでピンヘッダを無理やり上にはんだ付けしました。

下側は、8251とEEPROM関係、アドレスデコーダ、裏側にSRAMが張り付いています。I2C bus controller のPCF8584Pはまだ実装してません。

あーでもよかった。

早く、I2C関係の配線をしてCP/Mが動くようにしたいなあ。

Z80-MBCでCP/Mは動いているけど、ATmega32Aでブートローダーや周辺インターフェースをやらせているというのが私の美意識といまいち合わないので、普通のEPROMとSRAMで構成したシステムでCP/Mを動かしてみたいのです。

でもその前にボードを作り直したいな。まさかこれ程パッチ当てする羽目になるとは思ってなかった。

それよかパラレルI/FでSDメモリを読み書きできる方が良かったかな?なんて妄想が膨らみます… 結局またパッチだらけの基板を作っていつまでたっても完成しなさそう。

(4/26 追記)

vintagechipsさんの ところのマイクロソフトBASIC も動きました。

アークピットのアセンブラを持っていなかったので、こちらのオンラインアセンブラを利用して8251のアドレスだけ変更(00C0-00C1H)して、アセンブル。8080の命令範囲でアセンブルするとエラーが出ましたが、8080命令で動くように変更してあるので、z80命令を許可するオプションでアセンブルしてROMに焼きました。

PRINT INP(&HC0)

とかして、I/O ポート入力もできてそうなことを確かめたので、I2Cインターフェース関係はとりあえずこれでテストする予定(モニターを一緒に焼こうと思ったけど時間がないのでとりあえず)。

(4/26 追記おわり)

(4/28 追記)

I2Cのテストをしたら、動かなかったが、I2Cバスインターフェースがselect されていないことがわかったので、はんだ付けを疑い、LS138のところのはんだ付け不良を修正して、basic でI2Cバスに接続したRTCの読み込みができました。OK

機械語でI2Cを読み書きするプログラムは6809については作ってみたけど、8080は全くど素人なので、まだまだこれから。

(4/28 追記終わり)

8080A まだ動かないけど。

8080Aまだ動いてないけど、少しずつ前進しているのでその記録。

1) フリーランを試す。

CPUボードが悪いのかメモリボードが悪いのかさっぱりわからなかったので、まず、メモリーボードを外して、CPUボードをブレッドボードを使ってデータバスを全部pulldownし、NOPを実行するように配線して電源ON.

⇒ アドレスがインクリメントしていることを確認。ということで、メモリーボードがおかしいということがわかった。

2) メモリーボードのチェック。

arduino mega2560 を持っていたので、これで、メモリーチェックをする冶具を作成。

メモリーの読み書きをしてみるとEEPROM 28C256の配線がまちがえている(27256と全く同じ結線ではない)ことに気が付いた。パッチワークをして修正したが、まだおかしい。 EEPROMを外して読み書きをしてみると、SRAMが選択されないアドレスでも読み書きができた。⇒SRAMのCS-が常に0になっていることに気が付いた。フラットパッケージのSRAMのはんだ付けが十分でなかったためと分かり、修正。ROMとRAMが冶具で正しく読み書きできることを確かめた。

3) まだ8251でのシリアル通信ができてない。

IO周りの回路が正しくアドレスデコードできてないかな?割り込みを使わない送信で送れていないから。

ロジアナをつないで、読み書きの様子を調べた(4/23)

アドレスのデコードは問題なし。RESETのタイミングがCPUより後になっていることが分かったので、CPUのRESET信号をBUSの空きピン(12)に持ってきて、8251につないだところ、リセットのタイミングがCPUと同じになった。次のボードは、CPUボードでリセットを制御して、RESET信号をほかのボードに分配するように変更したい。

しかし、相変わらず8251のstatusで TXRDYのビットが0のままだ。端子をチェックしたがCTSも0だしなぜだかわからない。。。(4/23ここまで)

 

8080Aを動かしてみたい

マイコン病が続いています。たぶん、娘の中学受験の間、相当我慢をしていて、娘が中学に何とか合格したので、安心して重い病気が発病したのだと思います。

オレンジピコでuPD8080Aを1個買ったのをトリガに、6809をいじくるプロジェクトが途中ですが、8080Aを動かそうプロジェクトを始めてしまいました。

eBayで、uPB8224(クロックジェネレーター)、uPB8238(バスコントローラー)を入手できることを確認した瞬間、intelの8080Aも購入、eagleでボードのアートワークを開始、fusionPCBに発注したのが4/1でした。中国は、4月頭はお休みでしたので少し基板の完成が遅くなり、昨日ようやく我が家で受け取り。はんだ付けを楽しみました。

基板は、2枚組、1枚が8080Aと8224, 8238 、12V, -5V電源を搭載しました。

もう1枚は、256kbit SRAMと,EPROM, それから、I2Cコントローラーと8251(シリアル通信)、DC入力とそのスイッチを備えるようにしました。

2枚は、ヘッダーで積み重ねる感じで接続します。最初、メモリと通信のボードを上に持ってこようと思ったけど、クロックの18MHzクリスタルが昔の背の高いHC-49Uのを調達した関係と、やっぱりご本尊が見えるところにないのは気持ちが悪いので、上下を入れ替えました。

こんな感じでとりあえず、電源周りが正しく動作していることだけ確かめました。5V 310mA程度。

案の定いくつか問題発覚。なんでアートワークを眺めたときに気が付かないかなあ!

・上下を入れ替えたから電源スイッチ動かすのが超辛い。DCジャックともどもCPUの方に移動させます。I2Cのコネクターもアクセスしづらいので、DCジャックを移動した跡地に移設するつもり。ヘッダーコネクターの付近には親切に信号名を苦労して書いたんだけど、入れ替えた関係で見えないし。

・12V電源の回路定数を何も考えずにvintagechipsさんのこちらを横着してそのままパクったのですが、そしたら12Vが出ず焦った(100kΩであるべきところを10kΩを実装)。チップのマニュアルを自分で読むようにしないといけないですね。

・アドレスバスバッファのeagle ライブラリを何も考えずに選んだら、ICの幅がワイドサイズのチップを選んでたのに気が付かずそのままボードにしてしまった→無理やり付けた。

・コネクターやヘッダーと部品が干渉しているところもちらほら。。。

これはやっぱりrev2を作れってことか!まあ、今回はまだましな方で、電源が繋がってないとか、発注前にちょっとチェックをすれば気が付くことに気が付かないことの多い私です。

早くメモリとシリアル実装してモニタ動かしたい!でも眠いからもう寝ます。

 

SBC6809開発環境

ゆったりとしたペースで、SBC6809とその拡張版で遊んでいますが、これまでは、人の仕立ててくれたBASICを動かしたり、モニターがただただ動くのを確認して楽しんでいました。

I2Cのインターフェースをつけたりしたんで、実際に自分のプログラムを組んでみようと思いましたので、ちょっと真面目に開発環境を整理することに。

1. 実行環境

ハードウェアはSBC6809を拡張してRAM32k, ROM16kにしたのを使ってますが、ちょっとしたハードウェアの動作の確認をするには、BASICでPOKE, PEEK()することで一応できますので、そうしてます(かなり低速ですが、そもそも現代において6809は超低速なのでいいのだ)。

ただ、今後、アセンブラを超昔を思い出して書いてみようと思うのと、Cでプログラムを書いたりしようとすると、クロスアセンブラ、クロスコンパイラでアセンブル、コンパイルして作ったMotrola S-record をモニターで送り込んで実行。というのがいいと思いますので、それはこちらのモニタープログラムを使っていますが、他の方がされているようにモニターやその他便利プログラム、それから、私はBASICが好きなので、それを一緒に焼いたのを作ろうかなと思っているところです。BASICには、I2Cインターフェースをいじくるコマンドも実装していきたいと思っています。

2. アセンブラ

私は、Windowsを使っているんですが、DOS関係はどうもなじめないので、linux のコマンドラインツールで開発するのが好きです。というわけで、アセンブラは、こちらのas09を使うのですが、BASICのアセンブルをしようとしたところ、改行コードがCRLFだと文句を言われるのと、’A’のような定数の書き方がすんなりアセンブルを通りませんでしたので、小改造してそのままアセンブルできるようにしました。

(追補 18/4/12)

上のように書いたんですが、as09 は私のところでは、インデックスモードのアドレシング処理がおかしいという深刻なバグがあり、現在のところちゃんと使えていません。とりあえず、as9は大丈夫そうなので、下のas63か、as9を使うようにしようと思います。

(追補おわり)

これはS-recordを直接吐きますが、binaryファイルに変換する必要があるかも、ということで、こちらの変換ツールを入れていますが、まだ使ってません。

それと、HD6309も型番と動作が一致しない怪しい代物ですが、入手してあるので、6309のインストラクションのアセンブルができるものが欲しいな、ということで、こちらのアセンブラ(as63 v1.20T)をas09と同様に改行コードその他の文句を言われないよう改造してみました。それで、また、BASICをアセンブルしようとしたんですが、なんかオペランドが1byteに収まってないとか多量に文句を言われたので調べてみたら、BASICのソースの

TOK_USR     EQU     *-FUNC_TAB/2+$7F

のようなところのアドレスの計算がas09などはちょっと変な扱いをしているということがわかりました。本来は、*-FUNC_TAB/2+$7Fは、(*-FUNC_TAB)/2+$7Fをやりたいんだけど、*-FUNC_TAB/2+$7Fと書くと、as09では狙い通りの計算をしてくれちゃうんだけど、真面目な(?)アセンブラ(as63のような)では真面目に計算して、全然狙いと違った計算結果になっちゃうという。。。

ちょっと悩んだけど、ここは、BASICのソースをカッコを入れた計算式に修正することにしました。ひょっとすると、標準アセンブラの正しい所作がカッコなしの計算順序が「まちがった」ものである可能性もあるので、アセンブラ処理系の方はいじらないようにしようと思いました。

(追補 18/4/12)

as9のもとになった

http://eecs.vanderbilt.edu/Courses/ee218/Asman.html#2.2.3.7%20Operators

のマニュアルを見ると、

Expressions are evaluated left to right and there is no provision for parenthesized expressions. Arithmetic is carried out in signed two-complement integer precision (that’s 16 bits on the IBM PC).

と書いてあった。うわー、演算子の優先順位なしですか。。。

ラベルの計算でカッコはas9では正しく処理できないようです。というか、アセンブラのexpressionって完全処理系依存なのね。悲しい。

演算子の順番が謎なルールに従うのが抵抗ある。。。

(追補終わり)

多分、じきに悩んだことすら忘れちゃうと思うので、備忘録として。。。

SBC6809 拡張版をつくる

前回はSBC6809に無理やり256kbit SRAMをつけたところまででした。あとで、I2CインターフェースICをつけようとしてたんですが、手配線がめんどくさいので、基板を起こしてみました。

表から見たところ。もともとのSBC6809にリスペクトを表し、極力変更無いようにしてみました。ただ、PCF8584P (I2C インターフェース)とNANDゲートを追加し、256kbit SRAMに交換しようとすると場所が不足で、仕方なく、追加の部品については、表面実装部品を使っています。

なんか半端な感じ。

裏、

256kbit SRAMが変なところに張り付いていますが、場所が足りない!

また、PCF8584PのRD- を配線するのを忘れていたことにFusion PCBに基板を発注した後に気が付いたので、いきなりジャンパーを飛ばす羽目に。

それから、CPUの制御信号(FIRQ-, NMI-, MRDY, HALT-, DMA-)には、配線を後からできるように、直接Vccにつながっていたのを裏面の抵抗でプルアップするように変更。6809E対応が簡単になるのと、Assist 09 対応もあとからやりやすい。

とりあえず、BASICでプログラムを書いて、I2Cの信号出力がなされるところまで動作確認で、力尽きました。BASICの文法をほとんど忘れているので、プログラミングが一向に進まない。

I2C接続のRTCや、EEPROMの読み書きしたりしたいけど、いつになることやら。

あと、PCF8584Pは、すでに廃番品種なので、ebayで調達してます。というわけで、I2Cインターフェースはもっと入手性の良いチップで作った方が良いんだけど。。。よく考えずにとりあえず突っ走る癖が相変わらず抜けないです。

補遺 18/4/8)

I2CのRTCモジュールを接続して、時刻を繰り返し読みだすプログラムをBASICで書いて動いたけど、PCF8584Pのチップのデータシートに書かれている通りの手順だとどうもうまくいかない。一体どこを勘違いしているのか?それともデータシートが間違えているのか?

問題なく動かせるようになったら、MicrosoftBASICにI2Cと通信する関数を追加したいと思っているところ。

BASICはサブルーチン内でローカル変数が使えないところがツライなあ。