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はサブルーチン内でローカル変数が使えないところがツライなあ。

 

 

 

 

SBC6809 メモリ増設とIO増設準備

SBC6809ですが、メモリが8kBなのはちょっと物足りないので、RAMを増やしたいな、それから、I2Cインターフェースもつけたいな、と思いましたので、なるべく少ない改造でそれらを実現したいなと考えました。

問題となるのは、アドレスデコーダーです。SBC6809では、LS138によって8kBバンク分割されていますが、IOをつけようとすると、自前のアドレスデコーダーを実装しない限りは、1つのIOをつけると8kB無駄になります。結構悩んだけど、いい解決法を思いつかなかったので、これは我慢することにしました。

6809のメモリマップトIOは、FMを使っているときはどうとも思いませんでしたが、こうやって自分でマイコンいじりをすると、悩ましいですね。ハッキリ言ってZ80のようにIOが分離している方がハードウェアが組みやすいのではないでしょうか。

メモリマップを

0000-7FFF  SRAM

8000-9FFF  シリアルI/F (LS138 pin11をCS-)

A000-BFFF  I2CインターフェースIC(PCF8584) (LS138 pin 10をCS-)

C000-FFFF  ROM

とすることにしました。このアドレスデコーダーは、A15が0の時SRAMを選択、A15, LS138 pin 10,11がいずれも1の時に(つまりROM以外のどれも選択されていない時)ROMを選択するというようにすれば良いことになります。

最初、追加ハードウェアを最小にしようと思ってすでに搭載されているPIC12F1822のソフトウェアで上記のアドレスデコーダーを実現しようとしたんですが、さすがに無謀でした。意外に1MHz CPUクロックは速い。

というわけで、仕方なく手持ちの74HC00 でアドレスデコーダー(3入力NAND)を実装。SRAMは256kbit SRAMを秋月から調達(めちゃ安!)。

下記の通り、やっつけ配線を基盤の裏面にしました。SBC6809の美しいお姿が台無し。追加部品は両面テープで貼ってます。

メモリの動作確認は、こちらのモニターで行いました。もちろん、SRAMを増設したので、もともとの64kbit SRAMはソケットから取り外してます。

ちゃんとメモリが見えています!

I2Cインターフェースチップは、これもまた、裏面に貼りつけようと思っていますが、メモリが32kB使えることを確認して力尽きました。

 

偽装CPU…とSBC6800の話。

(最初にこれを書いたときに不十分なところがあったので、加筆修正してます)。

SBC6809を作る際に、ebay などで6809系CPUを計4つ調達したんですが、CPUのラベルと中身が一致していない例が複数ありました。

上から、Hitachi HD63C09P と称するもの。謎ブランドのMC6809EPと称するもの。STmicro のMC68B09P(これは動作確認済み)。

真ん中の、MC6809EPは6809Eシリーズということで、クロックジェネレーターが内蔵されていませんので、6809とは非互換です。そのままSBC6809に刺しても動かないはずですが、なんと普通に動いた(驚)。

どうやら、型番テキトーらしい。

一番上のHD63C09P(と称するもの)はそのまま、SBC6809に刺せば動くべきですが、こっちは、動きません。

こちらで6809EをSBC6809で動作させることについて書かれていました(外付けでPIC12F1822で500kHzのクロックジェネレーターを実装)ので、tomi9jpさんを真似してアダプターを作成。HD63C09Pを6809Eアダプターに刺して、SBC6809に装着して動かすと、見事にBASICなど動きました。。。。

こちらも偽装CPUだ。とはいえ、気になったので、こちらの6809/6309チェックプログラムで確認してみました。

チェックしてみたら、6309の命令セットが使えるらしい。また、消費電力を見たら、SBC6809全体で、25mA消費ということで、CMOSっぽい。したがって、謎なマーク書き換え品ということになります。

Motorola MC68B09Pを刺したときは、消費電流 131mAでした。

STmicro MC68B09Pでは、消費電流 155mAでした。

謎ブランド MC6809EP (Eだけどクロックジェネレーター付き)では、消費電流129mAでした。

上記どれもHD63C09P以外は、6809相当の命令セットの判定でした。

それなりに消費電流は違いますね。(HD63C09Pと称するCPUを動かしているときはクロックが他の半分なので、そのまま比較はできませんが、CMOSと思っても良いと思います)。

CPUを刺さないときのSBC6809の消費電流は20mA程度です。

というわけで、CPUは出所のハッキリしたところから注意して買いましょう。

マーキングが信用できないので、最高動作クロックも謎。

これとは別に、シングルボードコンピューター収集癖が治らず、SBC6800も作りました(下)。こちらはMIKBUGを入れてあります。特に何かをする、という目的はありませんが、それはSBC6809も同じかも。6800の方は、私が10代の時には、特に目に入るところではありませんでしたので、どうも思い入れが湧かないです。

SBC6809の方は、Cコンパイラーをスタンドアローンで動かしたいと思うんですが、メモリーが足りないんで、Z80-MBC用に買った「超絶大容量」128KBytesメモリーをこちらにつけたいんですが、外部I/Fも含めたボードをSBC6809をもとに起こすか、CPUソケットにボードを積み重ねて乗っ取る方式にするか悩み中。

Z80-CP/M ボードをつくる

SBC6809を作って遊ぶ過程でWebを見ていたら、いろいろなものがあることがわかりました。

4IC Z80 コンピューター を作りたくなって、オレンジピコからまたポチリ(病気がこじれた)。土日には配達されるまいと思っていたら、日曜の午後に郵便が届いていたので、我慢ができず作業開始。

1) ハードウェアの製作

まず、Z80のペリフェラルを引き受けているATmega32aにプログラム(Arduinoのスケッチ)を書き込むことが必要。

Atmega32a へ書き込みは下記の通り実行。

Arduino as ISP を使ってAtmega32a にブートローダーなどを書き込む方針に決めた。TL866CSライタを使っても良いみたいだけど、ヒューズの設定の仕方など不明点があったので、とりあえずみんながやっているやり方で!(あとで、こちらのDiscussions をよく読んだら書いてあったけど)。

1a) まず、arduino as ISP を作成する。

手持ちのFreeduinoを引っ張り出してきて、でも、いろいろの実験でどうなっているか不明だったので、Atmel ICE を使ってArduino のbootloader を書き込んでArduino化する。

次にArduino IDEのExamples からArduinoISPスケッチを開いて、Freeduinoの方に、ArduinoIDEを書き込もうとしたら、シリアル経由ではうまくいかなかった。しょうがないので、ブートローダー付きのArduinoIDEスケッチの.hexファイルを生成し、AtmelICEをICSP端子につないでAtmelICEから直接書き込んだ(2度手間をやっちゃった)。

そして、ArduinoISPとなった、Freeduinoを使っての書き込みを実行。

ブレッドボードにATmega32a を刺し、適当にググって下記の配線をジャンパーワイヤーでArduinoISPとなったFreeduinoと行った。

– Connect pins 10 and 30 on IC to 5V on Arduino

– Connect pins 11 and 31 to Ground on Arduino

– Connect pin 6 on IC to pin 11 on Arduino (MOSI)

– Connect pin 7 on IC to pin 12 on Arduino (MISO)

-Connect pin 8 on IC to pin 13 on Arduino (SCK)

-Connect pin 9 on IC to pin 10 on Arduino

そのうえで、まず、ArduinoISPを使って、ATmega32のブートローダーを書き込む。そして、Arduino IDEでATmega32Aで動かすスケッチ(S221116_R100218_Z80.ino)を開いて、アップロード実行。

不安なので、ATmega32aをブレッドボードから外して、TL866CSにつないでメモリの内容を読みだしたところ、ちゃんと書き込みできてそう。ちょっと不安だけど、この先はボードを完成させてからチェックすることにする。

1b) ボードの実装。

実装するLEDは、状態を見るだけなので、全部手持ちの赤でもいいのだけど、まあ、作った人の例に色も合わせてみようといろいろな色のLEDを秋月から購入。

ついでに、EEPROM (24LC1025)を2つ使ってi2c につなぐvirtual disk もCP/Mを走らせるのには必要なので、これもまた、人の実装例を見ながらおんなじように作った。さらに、I2CバスにつけるRTCモジュールもAmazonでポチり、これもまた、こちらのLogsにある通りのことをやって、接続した。Parallel I/O の例も載っていたが、こちらの方はi2c pio expander のICを買っておいた(未実装)。

1c) 火入れ。

電源は、PCのUSBから取る。あっさり、basic が起動できることを確かめた。

2) ソフト

2a) CP/M を動かす。

CP/M は8080で動く、MS-DOSの前からあるDOSです(自分の世代より前のことなのでわかりません。。。) MS-DOSがすでに理解してもらえないような気が。

中略。

ブートさせると、basic, forth, iLoad, 等を選べるようになっているが、iLoadを選び、iDiskという、i2cのvirtual diskにディスクイメージを書き込むためのユティリティをアップロードして動かすと、プロンプトがでるので、QPM271_DiskPack.zipを解凍したところに入っている4つの.hexファイルをteratermを使ってアップロード。ついでにCPMのディスクパックに含まれているdisk1 用のTurbo Pascal のイメージも書き込む。

Turbo Pascalなんて、学部1年の情報実習以来?懐かしい!というかPascalの文法も、TruboPascalの統合環境の使い方ももう忘れてる。

リブートして、QP/Mをロードしたところ。

QP/Mのディスクにはmicrosoft basic が入っていたのでそれでi2c RTCの動作確認(QP/Mで使っているけど)

OK!

ここでCコンパイラを動かしたりしたいけど、メモリとかディスクとかちょっと不足気味?

とりあえず、mbasic で遊ぶ。

Conway’s game of Life

いろんなbasicのゲームがwebで見つかるので、いろいろ遊んでみる。

game of life は、昔F-BASIC でも作って動かしていたように思います。

動かしてみたけど、有名なグライダーを入れると、グライダーが飛んでかないでいきなり消滅。。。?

3) 今後

特に目的もなく、作ってみましたが、basic でi2cポートも叩けるみたいなので、手持ちの24bit AD変換器などのセンサーを動かして高精度データをとりつつ、でも、データの表示はASCIIキャラクターのグラフで表示。みたいなのをやって遊びたいな、なんて思っています。