MC6802でオリジナルモニタ [6802]
本業で多忙になってしまったとはいえ、1年近く放置してしまった(苦笑)
何をやっていたのか、どこまでやったのかもわからなくなっていたので
放置期間も長くなってしまったが、とりあえず復活です。
さて
Z80でオリジナルモニタを作成しましたが、そのMC6800版です。
一応動作画面です。
そのうちソフト、ハード共ソース等をGitHubにあげようかと思ってます。
いつになるかはわかりませんが。
コマンドが共通というだけなんですが、MC6802基板も新しくなっています。
放置前に既に更新していたんですがね(苦笑)
MC68B00、HD63B50とともにBバージョン。日立のはCMOS版。
3MHzクロックを与えているので0.75MHz動作です。
メモリ基板も追加でもう1枚実装しました。
テストを繰り返すとROMを何度も抜き差ししてピンを曲げてしまうので
ROM用はZIFソケットにしました。
スペースの関係もあって小型のものですが、レバーが少し堅いです。
色々動作確認をしていて、日立のHD46802だけは動作しませんでした。
本家モトローラのもの、AMIのもの、富士通のMB8870,8871は問題ないのですが、
HD46802はロット違い2種、4個ほど試しましたがどれもNG。
AC特性かDC特性でも違うのかな?
市場上が本家モトローラ
その下が日立のものですが動きませんでした。
その下が独自の拡張がされている富士通のもの
一番下がAMI製。わりと珍しいかな?
とりあえず軽く復活ということで。
ネタは色々あるのですが
何をやっていたのか、どこまでやったのかもわからなくなっていたので
放置期間も長くなってしまったが、とりあえず復活です。
さて
Z80でオリジナルモニタを作成しましたが、そのMC6800版です。
一応動作画面です。
そのうちソフト、ハード共ソース等をGitHubにあげようかと思ってます。
いつになるかはわかりませんが。
コマンドが共通というだけなんですが、MC6802基板も新しくなっています。
放置前に既に更新していたんですがね(苦笑)
MC68B00、HD63B50とともにBバージョン。日立のはCMOS版。
3MHzクロックを与えているので0.75MHz動作です。
メモリ基板も追加でもう1枚実装しました。
テストを繰り返すとROMを何度も抜き差ししてピンを曲げてしまうので
ROM用はZIFソケットにしました。
スペースの関係もあって小型のものですが、レバーが少し堅いです。
色々動作確認をしていて、日立のHD46802だけは動作しませんでした。
本家モトローラのもの、AMIのもの、富士通のMB8870,8871は問題ないのですが、
HD46802はロット違い2種、4個ほど試しましたがどれもNG。
AC特性かDC特性でも違うのかな?
市場上が本家モトローラ
その下が日立のものですが動きませんでした。
その下が独自の拡張がされている富士通のもの
一番下がAMI製。わりと珍しいかな?
とりあえず軽く復活ということで。
ネタは色々あるのですが
MC6802CPUボード [6802]
またちょっと間が空いて、今回は元に戻って68系の話。
MC6802のCPUボードを起こしました。
MC6802とACIA(MC6850)のボード。
例によってPICでシリアル-USB変換、CPUクロック、ボーレート供給、リセットを任せているが、これはZ80のものと全く同じもの。
CPU用のクロックは6MHz。MC6802は4分周されるので1.5MHz動作。シリアルボーレートは9600bpsで、クロック供給はACIA側で16分周するものとして9600×16=153.6K。
一応今までのものと同じように電源はCPUボードからも通信用USBと電源用のUSBと選択できるようにしたが、ベースのボードからスマフォ充電用のACアダプタで電源供給。
ベースボードにCPUボードとメモリボードをさして動かしている状態がこちら。
メモリボードはZ80で使用したものと同じもの。ただしZ80と違って下位アドレスがRAM、上位アドレスがROM。
メモリボードのバス7番ピンは80系のMREQと68系のEを切り替えるようにしてたのだが、メモリマップドI/Oの68系では結局の所I/Oアドレスの時にメモリアクセスを禁止しなければいけないので、CPUボード側でMREQとIORQを生成するようにした。
回路図はこちら。
動作確認用として68系定番モニタMIKBUGと電大版TinyBASICを用意。
この電大版TinyBASICを動作させるのに手間取ったのが間が空いた理由。
そのままでは動かないので修正を施す。
・MIKBUG修正点
(1)いわゆるコンソール入出力をACIAに変更。
MIKBUGはパラレルI/OであるPIA(MC6820/21)を使ってシリアル通信を行っているのを、ACIAでのシリアル通信変更。
ついでに送受信とも割込で行う事にする。
(2)コンソールは当時のテレタイプライターが前提になっているのでその部分を修正。
テレタイプライタの制御部分、最後に$FFを連続して送ったり、文字列終端がEOTだったりといった部分を削除。
(3)アドレス配置を変更
これは普通にこちらのメモリマップにあわせるだけ。
MKIBUGの動作はわりとすんなりOK。
リセット後にブートメッセージを表示させるようにしてみたら、最初の4~5文字が化けるのはご愛敬(笑)
・TinyBASIC修正点
次に電大版TinyBASIC。ネットにあったソースをベースにさせてもらった。
一応、昔「マイコン手づくり塾」という本に掲載されたソースを打ち込んだものもあるが、あれはメモリ配置も含めけっこう手が入っているのでオリジナルに近いものからの方がいいかな?という判断。
(!)MIKBUG前提部分の修正
MIKBUGも同時に移植しているのでそのままでいいはずだけれども、ACIAでしかも送受信割込を使った独自の入出力に変更したこともあり変更。
(2)テレタイプライタ制御部分の修正
これもMIKBUGを使う事が前提になっていることもあって、テレタイプライタ用の制御コードが色々入っている。LOADとSAVE代わりでもあるLISTはSTXで始まり、ETXで終了であるとか。
LIST出力時は別段問題ないと思われるが(TeraTermの場合)、LOADでSTX待たれても困るので。
ただしLOADの動作確認はしていないので、ちゃんと動くかは未確認。
(3)アドレス配置の変更
これもこちらのメモリマップにあわせて変更。
ただし、変数A~Zのメモリ配置はゼロページの特定領域決め打ちになっていたりするので、影響少ない範囲で最小限に。
ちなみに「マイコン手づくり塾」のTinyBASICは、その変数領域もゼロページ外に変更してたりする。
そうやって変更を加えたのだが、起動はするがうまく動作しない。
で、変更部分のチェックからはじめて、ベースにさせてもらったソースと自分で打ち込んだソース、打ち込み元の本のソースリストを見比べて修正していったがやはりダメ。
ただ、動作現象的にTinyBASICのワークアリアを侵食してしまっているか、スタックが崩れているかかな?と思いながらソースを順に追っていたところ、スタックポインタをインデックスレジスタ代わりに使っているのを所々発見。
あぁなるほど、送受信に割込を使っているからスタックにワークエリアを設定している時に割込がかかるとアウトになる模様。
スタックポインタ操作前に割込禁止。一連の処理終了後に割込許可を入れたら無事動作しました。
MC6802のCPUボードを起こしました。
MC6802とACIA(MC6850)のボード。
例によってPICでシリアル-USB変換、CPUクロック、ボーレート供給、リセットを任せているが、これはZ80のものと全く同じもの。
CPU用のクロックは6MHz。MC6802は4分周されるので1.5MHz動作。シリアルボーレートは9600bpsで、クロック供給はACIA側で16分周するものとして9600×16=153.6K。
一応今までのものと同じように電源はCPUボードからも通信用USBと電源用のUSBと選択できるようにしたが、ベースのボードからスマフォ充電用のACアダプタで電源供給。
ベースボードにCPUボードとメモリボードをさして動かしている状態がこちら。
メモリボードはZ80で使用したものと同じもの。ただしZ80と違って下位アドレスがRAM、上位アドレスがROM。
メモリボードのバス7番ピンは80系のMREQと68系のEを切り替えるようにしてたのだが、メモリマップドI/Oの68系では結局の所I/Oアドレスの時にメモリアクセスを禁止しなければいけないので、CPUボード側でMREQとIORQを生成するようにした。
回路図はこちら。
動作確認用として68系定番モニタMIKBUGと電大版TinyBASICを用意。
この電大版TinyBASICを動作させるのに手間取ったのが間が空いた理由。
そのままでは動かないので修正を施す。
・MIKBUG修正点
(1)いわゆるコンソール入出力をACIAに変更。
MIKBUGはパラレルI/OであるPIA(MC6820/21)を使ってシリアル通信を行っているのを、ACIAでのシリアル通信変更。
ついでに送受信とも割込で行う事にする。
(2)コンソールは当時のテレタイプライターが前提になっているのでその部分を修正。
テレタイプライタの制御部分、最後に$FFを連続して送ったり、文字列終端がEOTだったりといった部分を削除。
(3)アドレス配置を変更
これは普通にこちらのメモリマップにあわせるだけ。
MKIBUGの動作はわりとすんなりOK。
リセット後にブートメッセージを表示させるようにしてみたら、最初の4~5文字が化けるのはご愛敬(笑)
・TinyBASIC修正点
次に電大版TinyBASIC。ネットにあったソースをベースにさせてもらった。
一応、昔「マイコン手づくり塾」という本に掲載されたソースを打ち込んだものもあるが、あれはメモリ配置も含めけっこう手が入っているのでオリジナルに近いものからの方がいいかな?という判断。
(!)MIKBUG前提部分の修正
MIKBUGも同時に移植しているのでそのままでいいはずだけれども、ACIAでしかも送受信割込を使った独自の入出力に変更したこともあり変更。
(2)テレタイプライタ制御部分の修正
これもMIKBUGを使う事が前提になっていることもあって、テレタイプライタ用の制御コードが色々入っている。LOADとSAVE代わりでもあるLISTはSTXで始まり、ETXで終了であるとか。
LIST出力時は別段問題ないと思われるが(TeraTermの場合)、LOADでSTX待たれても困るので。
ただしLOADの動作確認はしていないので、ちゃんと動くかは未確認。
(3)アドレス配置の変更
これもこちらのメモリマップにあわせて変更。
ただし、変数A~Zのメモリ配置はゼロページの特定領域決め打ちになっていたりするので、影響少ない範囲で最小限に。
ちなみに「マイコン手づくり塾」のTinyBASICは、その変数領域もゼロページ外に変更してたりする。
そうやって変更を加えたのだが、起動はするがうまく動作しない。
で、変更部分のチェックからはじめて、ベースにさせてもらったソースと自分で打ち込んだソース、打ち込み元の本のソースリストを見比べて修正していったがやはりダメ。
ただ、動作現象的にTinyBASICのワークアリアを侵食してしまっているか、スタックが崩れているかかな?と思いながらソースを順に追っていたところ、スタックポインタをインデックスレジスタ代わりに使っているのを所々発見。
あぁなるほど、送受信に割込を使っているからスタックにワークエリアを設定している時に割込がかかるとアウトになる模様。
スタックポインタ操作前に割込禁止。一連の処理終了後に割込許可を入れたら無事動作しました。