6801/6301でオリジナルモニタ [6801]
オリジナルモニタシリーズ、今度はMC6801系です。
MC6800版はMC6802ボードで確認してだいたい動作しているのでベースにします。
とりあえずCPU依存な部分を除いてそのまま流用。
ただし今後各種I/Oを動作させるために、ユーザ設定の割り込みルーチンを使えるように変更。
今まではROM内固定ルーチンのみだったが、RAM上にユーザ割り込みベクタエリアを確保し、各割り込み毎にユーザベクタをチェックし、設定されていればそのルーチンを呼び出すように変更。
通信部分はACIAから内蔵SCIへ。
モトローラと日立セカンドソースの6801(3)と、その日立のCMOS版であるHD6301(3)R/Sと、さらに強化版のHD6301(3)X/Yとでソースを共有することにする。
HD6301X/Yは内蔵I/Oが増えて、その分ZEROページの占有領域が増えているがHD6301R/Sに単純に追加されているので、共通部分は機能もメモリマップも同じ。追加されたのはタイマがもう1本とポート。モニタがその追加部分を使うことはないので、占有ZRAMが増えても問題なし。
一部変更があるが、設定用のレジスタでアドレスは同じ。ブート直後にそれぞれにあわせて設定するだけなので、これも問題なし。さすがにバイナリ共通とまではいかないが、ちょっと編集してアセンブルし直しでいける。
まずはMC6801で確認。このボードで。
多少リビジョンが上がっているが初期から使っているボードで、以前にも書いたと思うがNMOS版の6801(3)では動かないので、日立のHD6303で確認。
動作OKなのでソースをMC6801向けにカスタマイズ。
基本的には16bi処理をDレジスタ用命令に書き換えるだけ。
インデックスレジスタ退避/復帰もスタックで、と思ったが今回はパス。
これも動作OKなので、次はHD6303X/Y。このボードで。
以前のボードから変更していて、外部I/Oを使用できるようにしている。68系のCPUボードはI/Oの上位8bitを設定できるようにして、80系と同じ256バイトメモリ空間を占有する。
これも初期化部分を少し変更するだけで問題なく動く。
これでタイマが使えるボードで基本となるモニタが動作するようになったので、I/Oボードを色々試すことができそう。
ただし、MC6801ボードはシングルボード化してしまってバスを出すようにしていないので、作成したI/OボードのテストはHD6303ボードメインかな?
MC6800版はMC6802ボードで確認してだいたい動作しているのでベースにします。
とりあえずCPU依存な部分を除いてそのまま流用。
ただし今後各種I/Oを動作させるために、ユーザ設定の割り込みルーチンを使えるように変更。
今まではROM内固定ルーチンのみだったが、RAM上にユーザ割り込みベクタエリアを確保し、各割り込み毎にユーザベクタをチェックし、設定されていればそのルーチンを呼び出すように変更。
通信部分はACIAから内蔵SCIへ。
モトローラと日立セカンドソースの6801(3)と、その日立のCMOS版であるHD6301(3)R/Sと、さらに強化版のHD6301(3)X/Yとでソースを共有することにする。
HD6301X/Yは内蔵I/Oが増えて、その分ZEROページの占有領域が増えているがHD6301R/Sに単純に追加されているので、共通部分は機能もメモリマップも同じ。追加されたのはタイマがもう1本とポート。モニタがその追加部分を使うことはないので、占有ZRAMが増えても問題なし。
一部変更があるが、設定用のレジスタでアドレスは同じ。ブート直後にそれぞれにあわせて設定するだけなので、これも問題なし。さすがにバイナリ共通とまではいかないが、ちょっと編集してアセンブルし直しでいける。
まずはMC6801で確認。このボードで。
多少リビジョンが上がっているが初期から使っているボードで、以前にも書いたと思うがNMOS版の6801(3)では動かないので、日立のHD6303で確認。
動作OKなのでソースをMC6801向けにカスタマイズ。
基本的には16bi処理をDレジスタ用命令に書き換えるだけ。
インデックスレジスタ退避/復帰もスタックで、と思ったが今回はパス。
これも動作OKなので、次はHD6303X/Y。このボードで。
以前のボードから変更していて、外部I/Oを使用できるようにしている。68系のCPUボードはI/Oの上位8bitを設定できるようにして、80系と同じ256バイトメモリ空間を占有する。
これも初期化部分を少し変更するだけで問題なく動く。
これでタイマが使えるボードで基本となるモニタが動作するようになったので、I/Oボードを色々試すことができそう。
ただし、MC6801ボードはシングルボード化してしまってバスを出すようにしていないので、作成したI/OボードのテストはHD6303ボードメインかな?
HD63701でTiny BASIC [6801]
かなり間が空いてしまったが引き続きHD6301関係で、これまたTiny BASIC。
製作したボードはHD6301の動作モードを変更できるようにしているので、外部ROMレスでの動作を試みる。
MC6801系の内部ROMサイズは4Kバイトなので、4Kのサイズに電大版Tiny BASICとモニタを詰め込むことにするが、電大版Tiny BASICは2Kを少しオーバー。使用しているモニタLILBUGは元々は2K内に収まっているようであるが、シリアル入出力に割込を使用したり、タイマやポート等のちょっとしたルーチンを入れたので2Kを超えてしまっている。
そこでモニタの一部機能を削除することにした。
多くの人がMC6801系を使った自分システムにLILBUGを流用しているようだが、決してMC6801系の汎用モニタというわけではなく、モトローラの評価ボード(?)のモニタであるのでそのハード依存部分が多々ある。
(1)トレースはPTM(MC6840)を使用したもので使えないので、トレースコマンドを削除。
(2)NMIもトレースで使用しており、自作ボードはNMIを使用していないので削除。
(3)その他、使用しないであろうコマンド(VERIFY等)を削除。
(4)基本ルーチンは、AccBにファンクション番号をセットするシステムコール形式になっており、当時の小規模な8bitマイコンシステムにしてはしっかりしたつくりになっているが、システムコールの数も少ないし、テレタイプ前提の紙テープパンチャー/リーダ関係を削ると、実質シリアルin/outしか残らないので削除し、単なるサブルーチンコールに変更。
(5)その他、今まで変更してきた箇所は変更したまま使用。
(5-1)改行コードはLF。これはモニタ側も。
(5-2)TinyBASICの演算処理等、可能な限りDレジスタを使用した16bit演算処理に変更。
(5-3)テレタイプライタ前提の制御処理は削除。
以上3つの変更処理は今までで変更済み。
以上色々削った結果、TinyBASICとあわせてぴったりと4Kに収まった。
今回使用するCPUは次の2つ。
HD68P01V07とHD63701V0C。
窓付のHD63701は珍しいかな?なぜかそれなりの数量を所有しているが。
まずはHD68P01V07。
32KbitROM、2732にソフトを焼いてHD68P01の上にセット。
ボードはモード6となるようにジャンパセット。
何の問題なく起動しTinyBASICも動作。
次にHD63701。
今、これを焼けるROMライタはないと思われるのでアダプタ基板を製作。
ユニバール基板に手配線でと考えたが、今この程度の手配戦もおっくうになってきてしまっているので結局基板を起こした。
写真左側が生基板で、右が28pin側に連結ソケット、40pin側にZIFソケットをハンダ付けした完成形。
HD63701は内蔵ROMサイズは4Kバイトだが、27256タイプのROMとして認識されるのでROMライタには27256、あるいは27C256として設定。
使用しているアセンブラはモトローラSレコードしかはかないのでバイナリ変換し、ROMライタにはファイルスタートアドレスを$F000~として読み込ませる。
写真のようにROMライタにセットし書き込ませ、ソフトを書き込んだHD63701をHD68P01に変わってセット。
これも無事動作成功。
入出力関係を削りすぎたせいか、モニタの一部動作がおかしいのはご愛敬(笑)
製作したボードはHD6301の動作モードを変更できるようにしているので、外部ROMレスでの動作を試みる。
MC6801系の内部ROMサイズは4Kバイトなので、4Kのサイズに電大版Tiny BASICとモニタを詰め込むことにするが、電大版Tiny BASICは2Kを少しオーバー。使用しているモニタLILBUGは元々は2K内に収まっているようであるが、シリアル入出力に割込を使用したり、タイマやポート等のちょっとしたルーチンを入れたので2Kを超えてしまっている。
そこでモニタの一部機能を削除することにした。
多くの人がMC6801系を使った自分システムにLILBUGを流用しているようだが、決してMC6801系の汎用モニタというわけではなく、モトローラの評価ボード(?)のモニタであるのでそのハード依存部分が多々ある。
(1)トレースはPTM(MC6840)を使用したもので使えないので、トレースコマンドを削除。
(2)NMIもトレースで使用しており、自作ボードはNMIを使用していないので削除。
(3)その他、使用しないであろうコマンド(VERIFY等)を削除。
(4)基本ルーチンは、AccBにファンクション番号をセットするシステムコール形式になっており、当時の小規模な8bitマイコンシステムにしてはしっかりしたつくりになっているが、システムコールの数も少ないし、テレタイプ前提の紙テープパンチャー/リーダ関係を削ると、実質シリアルin/outしか残らないので削除し、単なるサブルーチンコールに変更。
(5)その他、今まで変更してきた箇所は変更したまま使用。
(5-1)改行コードはLF。これはモニタ側も。
(5-2)TinyBASICの演算処理等、可能な限りDレジスタを使用した16bit演算処理に変更。
(5-3)テレタイプライタ前提の制御処理は削除。
以上3つの変更処理は今までで変更済み。
以上色々削った結果、TinyBASICとあわせてぴったりと4Kに収まった。
今回使用するCPUは次の2つ。
HD68P01V07とHD63701V0C。
窓付のHD63701は珍しいかな?なぜかそれなりの数量を所有しているが。
まずはHD68P01V07。
32KbitROM、2732にソフトを焼いてHD68P01の上にセット。
ボードはモード6となるようにジャンパセット。
何の問題なく起動しTinyBASICも動作。
次にHD63701。
今、これを焼けるROMライタはないと思われるのでアダプタ基板を製作。
ユニバール基板に手配線でと考えたが、今この程度の手配戦もおっくうになってきてしまっているので結局基板を起こした。
写真左側が生基板で、右が28pin側に連結ソケット、40pin側にZIFソケットをハンダ付けした完成形。
HD63701は内蔵ROMサイズは4Kバイトだが、27256タイプのROMとして認識されるのでROMライタには27256、あるいは27C256として設定。
使用しているアセンブラはモトローラSレコードしかはかないのでバイナリ変換し、ROMライタにはファイルスタートアドレスを$F000~として読み込ませる。
写真のようにROMライタにセットし書き込ませ、ソフトを書き込んだHD63701をHD68P01に変わってセット。
これも無事動作成功。
入出力関係を削りすぎたせいか、モニタの一部動作がおかしいのはご愛敬(笑)
SNOWINSPRING TL866CS プログラマUSB EPROMフラッシュBIOSプログラマブルロジック回路6アダプターソケット抽出器 13000 ICの為
- 出版社/メーカー: SNOWINSPRING
- メディア: エレクトロニクス
HD6303で電大版TINY BASIC(3) [6801]
8ビットマイコン基板の時のHD6303基板は色々ミスがあってパターンカット&ジャンパー飛ばしでデバッグしていたのだが、結局新規に起こしなおした。たぶん最初の基板も動くとは思う。最終確認していないけど。
これはHD6301/6303の64pinシュリンクパッケージのXあるいはY用で、今手元にはこれだけ。
種類はもちろん、数的にももう少しあったと思う。
左上からHD6303XP,HD63A03XP,HD63B01X0P,HD63X03X0P
右上からHD63701X0P,HD63B701X0P,HD6301Y0P,HD63C03YP
HD63B01X0Pはマスク品でたぶんなんらかのファームウェアが入っているはず。
その中からHD63C03Yを使って電大版Tiny BASICを動かしたいと思う。
I/Oコネクタはまだ付けていない。
このボード、MREQではなくEをそのまま出しているのでメモリボード側でジャンパ切り替えて対応。
ソースの変更点は
(1)ピン数増えているので内蔵I/Oも増えていて、その分ゼロページのI/Oレジスタ占有量も増えているので、またメモリのマッピングを多少変更する必要がある。
(2)増えた分のI/Oレジスタは継ぎ足しで既存の分の機能はほぼ変わらないので、SCI等のソース変更はなし。
(3)I/O追加に伴う割込増加分と、未定義命令トラップが追加されている分ベクタが増えているが使わなければこれも同じでOK。アドレス下位方向に追加なので、念のため新規割込もダミールーチンへJMP。
(4)XとYではI/Oも多少違うのだが、Yの方が上位互換とみなせるのでYの固有機能を使わなければ同じで構わない。もちろん、Xからの固有機能も使っていない。
USB-シリアル変換、クロック生成を行っているPICも変更。
(5)MC6801および40pinまでのHD6301はSCIを外部クロックで使用する場合、ボーレートの8倍入力だったが、HD6301X(Y)はなぜか16倍に変更されているので16倍クロック出力に変更。
(6)HD63C01を使うので3MHz動作のためにシステムクロックも12MHzに。
実際には12.6MHz程だからCPUクロックは3.15MHzで多少オーバークロック。
それら小変更で難なく動作。
前回と同じベンチマークプログラムを動かしてみた。
タイムは824カウントだから約8.2秒。
前回は約0.8MHz動作で32.9秒だったので、ほぼクロック通り4倍動作となっている。
ちなみに6801向けに演算にDレジスタ使ったバージョンです。
これはHD6301/6303の64pinシュリンクパッケージのXあるいはY用で、今手元にはこれだけ。
種類はもちろん、数的にももう少しあったと思う。
左上からHD6303XP,HD63A03XP,HD63B01X0P,HD63X03X0P
右上からHD63701X0P,HD63B701X0P,HD6301Y0P,HD63C03YP
HD63B01X0Pはマスク品でたぶんなんらかのファームウェアが入っているはず。
その中からHD63C03Yを使って電大版Tiny BASICを動かしたいと思う。
I/Oコネクタはまだ付けていない。
このボード、MREQではなくEをそのまま出しているのでメモリボード側でジャンパ切り替えて対応。
ソースの変更点は
(1)ピン数増えているので内蔵I/Oも増えていて、その分ゼロページのI/Oレジスタ占有量も増えているので、またメモリのマッピングを多少変更する必要がある。
(2)増えた分のI/Oレジスタは継ぎ足しで既存の分の機能はほぼ変わらないので、SCI等のソース変更はなし。
(3)I/O追加に伴う割込増加分と、未定義命令トラップが追加されている分ベクタが増えているが使わなければこれも同じでOK。アドレス下位方向に追加なので、念のため新規割込もダミールーチンへJMP。
(4)XとYではI/Oも多少違うのだが、Yの方が上位互換とみなせるのでYの固有機能を使わなければ同じで構わない。もちろん、Xからの固有機能も使っていない。
USB-シリアル変換、クロック生成を行っているPICも変更。
(5)MC6801および40pinまでのHD6301はSCIを外部クロックで使用する場合、ボーレートの8倍入力だったが、HD6301X(Y)はなぜか16倍に変更されているので16倍クロック出力に変更。
(6)HD63C01を使うので3MHz動作のためにシステムクロックも12MHzに。
実際には12.6MHz程だからCPUクロックは3.15MHzで多少オーバークロック。
それら小変更で難なく動作。
前回と同じベンチマークプログラムを動かしてみた。
タイムは824カウントだから約8.2秒。
前回は約0.8MHz動作で32.9秒だったので、ほぼクロック通り4倍動作となっている。
ちなみに6801向けに演算にDレジスタ使ったバージョンです。
HD6303で電大版TINY BASIC(2) [6801]
HD6303で電大版Tiny BASICの続きです。
MC6801系にちょっとオプティマイズしてみます。
MC6800は8080に比べてきれいなアーキテクチャだと言われ、確かにそうだとは思うが、当時のモトローラは8bitマイコンなんてこの程度で充分と思ったのか、それとも当時の半導体技術ではこれが精一杯なのか、機能が絞り込まれていて使いにくい。
具体的には8bitCPUだからというわけだろうが、8bit単位でしか演算できない。これはまだ個人的には許容できるが、インデックスレジスタをスタックに操作できないというのは結構使いにくいところに感じる。
MC6801になってその辺が解消され、ACCAとACCBを連結して16bitのACCDとして扱えたり、インデックスレジスタXをスタックへPUSH/PULできるようになり、扱いやすさがぐんとあがり、その後6809につながっていく事になる。
そういうわけで電大版Tiny BASICをMC6801向けにカスタマイズしていく。
(1)16bit演算に変更
BASICの扱う数値データは16bitの整数なので、MC6800ではACCAとACCBを下位、上位としてそれぞれ演算しているのはACCDで可能な限りまとめて行うようにする。
(2)16bitデータ転送の変更
これも(1)と基本的に同じで、アキュムレータに対するロード/ストアも可能ならDレジスタとして一括で転送
(3)インデックスレジスタのスタック退避
これも一応変更を考えたが、単純に退避するだけの目的の場合退避先がゼロページの場合はPULで同ステータス数、PUSHで+1となってしまい、パフォーマンス的な効果が薄いのでそのままにする。
参考までに加算命令のダイレクトアドレッシングとインデックスアドレッシングのクロック数を記しておく。
これだけみれば1クロックの差しかないが、16bit計算だと8bit計算を2回することになるので、ある程度のパフォーマンスアップを期待できるのでは?と思う。
さて、(1)(2)の変更で特に(1)に関して問題となることがあり、TinyBasicはACCAを下位バイト、ACCBを上位バイトとしているが、MC6801のDレジスタはACCAが上位バイト、ACCBが下位バイトと逆であること。下位バイトだけ、上位バイトだけというケースや、80系がそうであるようにアキュムレータというばAということで、とりあえずAで処理しそれをそのまま下位バイトにという処理もあり、とにかくDにしてしまえ!というわけにいかず、ソースのいたるところでACCAとACCBを入れ替えて行く必要がある。
さらに、一見Dレジスタは16bitのアキュムレータとしてACCA(B)と同様に扱えそうで、ローテート命令がないなど一部制約があり、そういう場合は処理はそのままだが上位下位の扱いが逆になっているので、それだけは入れ替えとなる。
ちなみに加算処理の場合だと、
これが
こうなる。
加減算は単純に置き換えるだけですむが、乗除算はそうはいかない。
以上を踏まえて変更していき、なんとかそれっぽく動作したので簡単なベンチマークをとってみた。
同じ基板、同じCPU、クロック発生用のPICも同じでROMだけ入れ替え。
前回書いたとおり、このシステムは内蔵タイマを使って10ms間隔で割込を掛け、TinyBASICの変数Tをカウントアップさせている。
ベンチマークソフトは最初にT=0で初期化しておき、主要処理終了後にTの値を表示させる単純なもの。
ベンチマーク用のBASICプログラムソースはこれです。
単純な四則演算を繰り返すだけ。
10msが3301カウントなので、約33秒です。
MC6800版と移植したものの結果がこれです。
MC6801向けにDレジスタを使用したバージョンの結果がこれです。
3292カウントだから約32.9秒。
何回か繰り返し実行してだいたい同じで、その差約0.1秒。
若干速くなっているが、インタープリタはソースを読んで解析していくのがやはりメインなのか、処理中の演算処理の割合が低いのだろうな?という事でしょう。
MC6801系にちょっとオプティマイズしてみます。
MC6800は8080に比べてきれいなアーキテクチャだと言われ、確かにそうだとは思うが、当時のモトローラは8bitマイコンなんてこの程度で充分と思ったのか、それとも当時の半導体技術ではこれが精一杯なのか、機能が絞り込まれていて使いにくい。
具体的には8bitCPUだからというわけだろうが、8bit単位でしか演算できない。これはまだ個人的には許容できるが、インデックスレジスタをスタックに操作できないというのは結構使いにくいところに感じる。
MC6801になってその辺が解消され、ACCAとACCBを連結して16bitのACCDとして扱えたり、インデックスレジスタXをスタックへPUSH/PULできるようになり、扱いやすさがぐんとあがり、その後6809につながっていく事になる。
そういうわけで電大版Tiny BASICをMC6801向けにカスタマイズしていく。
(1)16bit演算に変更
BASICの扱う数値データは16bitの整数なので、MC6800ではACCAとACCBを下位、上位としてそれぞれ演算しているのはACCDで可能な限りまとめて行うようにする。
(2)16bitデータ転送の変更
これも(1)と基本的に同じで、アキュムレータに対するロード/ストアも可能ならDレジスタとして一括で転送
(3)インデックスレジスタのスタック退避
これも一応変更を考えたが、単純に退避するだけの目的の場合退避先がゼロページの場合はPULで同ステータス数、PUSHで+1となってしまい、パフォーマンス的な効果が薄いのでそのままにする。
参考までに加算命令のダイレクトアドレッシングとインデックスアドレッシングのクロック数を記しておく。
DIRECT | INDEX | |
ADDA(B) | ||
ADDD |
これだけみれば1クロックの差しかないが、16bit計算だと8bit計算を2回することになるので、ある程度のパフォーマンスアップを期待できるのでは?と思う。
さて、(1)(2)の変更で特に(1)に関して問題となることがあり、TinyBasicはACCAを下位バイト、ACCBを上位バイトとしているが、MC6801のDレジスタはACCAが上位バイト、ACCBが下位バイトと逆であること。下位バイトだけ、上位バイトだけというケースや、80系がそうであるようにアキュムレータというばAということで、とりあえずAで処理しそれをそのまま下位バイトにという処理もあり、とにかくDにしてしまえ!というわけにいかず、ソースのいたるところでACCAとACCBを入れ替えて行く必要がある。
さらに、一見Dレジスタは16bitのアキュムレータとしてACCA(B)と同様に扱えそうで、ローテート命令がないなど一部制約があり、そういう場合は処理はそのままだが上位下位の扱いが逆になっているので、それだけは入れ替えとなる。
ちなみに加算処理の場合だと、
ADD | JSR | POP |
INX | ||
INX | ||
ADD3 | ADDA | 1,X |
ADCB | 0,X | |
STAX | STAA | 1,X |
STAB | 0,X | |
E7 | RTS |
これが
ADD | JSR | POP |
INX | ||
INX | ||
ADD3 | ADDD | 0,X |
STAX | STD | 0,X |
E7 | RTS |
こうなる。
加減算は単純に置き換えるだけですむが、乗除算はそうはいかない。
以上を踏まえて変更していき、なんとかそれっぽく動作したので簡単なベンチマークをとってみた。
CPU | HD6303 |
動作クロック | 0.8MHz |
同じ基板、同じCPU、クロック発生用のPICも同じでROMだけ入れ替え。
前回書いたとおり、このシステムは内蔵タイマを使って10ms間隔で割込を掛け、TinyBASICの変数Tをカウントアップさせている。
ベンチマークソフトは最初にT=0で初期化しておき、主要処理終了後にTの値を表示させる単純なもの。
ベンチマーク用のBASICプログラムソースはこれです。
単純な四則演算を繰り返すだけ。
10msが3301カウントなので、約33秒です。
MC6800版と移植したものの結果がこれです。
MC6801向けにDレジスタを使用したバージョンの結果がこれです。
3292カウントだから約32.9秒。
何回か繰り返し実行してだいたい同じで、その差約0.1秒。
若干速くなっているが、インタープリタはソースを読んで解析していくのがやはりメインなのか、処理中の演算処理の割合が低いのだろうな?という事でしょう。
HD6303で電大版TINY BASIC [6801]
引き続き68系。
最初に作った基板HD6301/6303ボード。
ワンチップモードでのみ動作確認までだったが、実はその後外部ROM/RAM実装でLILBUGモニタの動作確認までOK。
すっかり間が空いてどこまで書いたかも忘れている。
CPUはHD6303Rに。オーバークロックでも動作するのだが、供給クロックを3MHzに。つまり動作クロックは0.75MHz。
実際は3.2MHzほどでているので0.8MHz動作。
こんな感じです。
このボードに前回MC6802ボードに搭載した電大版TINY BASICを入れる。
オリジナルソースをベースとせず、MC6802ボード用に変更したソースをベースにした。
元々MC6800系のBASICだから、MC6802ボードでは割込使用送受信関係ではまったとはいえ、それ以外は比較的簡単に移植できたがMC6801系は色々と変更部分がでてくる。
8bitの6800系はゼロページエリアが重要で、電大版Tiny BASICもワークエリアはゼロページが前提になっているが、
・ワンチップマイコンであるMC6801系はそのゼロページにペリフェラルI/Oのレジスタ群が存在する。
・せっかく搭載したLILBUGなのでそれベースにTINY BASICを動かすつもりだが、LILBUGはMIKBUGと比較して機能が豊富な分ワークエリアも多くとる。
・実は送受信関係のバッファ操作のためのワークもゼロページにとってしまっている。
・I/OレジスタとLILBUGのワークの除いて、BASIC用の変数A~Zのアドレス($82~52バイト)を固定して確保する必要がある。
I/Oレジスタ($0~固定)とLILBUG、独自ワークエリアとTINY BASICのワーク全てあわせて256バイトに収めること自体は可能だが、TINY BASICは特定のワーク変数からの相対位置をみていたりヘタに動かせない部分がある。
そういった制約の中で色々配置を換えて移植してみた。
ベースは前回のMC6802のものでゼロページ以外のメモリ配置はほぼ同じ。モニタがMIKBUGからLILBUGになったぐらい。
実はFORループ処理用のスタックが$0100になっており、つまりFORスタックはゼロページなのだが、これはMC6802ボードへの移植時にゼロページ外に出している。
今回はソースリストでのラベルBUFFER部分をゼロページ外に出すことにした。
これはキーボードから入力された文字を一時的にためていくところ。領域も比較的大きいので外に出す意味は大きい。
ただし、この部分が一番ワークの相対位置関係が決まってヘタに動かせない部分でもある。
このワーク部分のオリジナルソースを抜粋
ORGからBUFENDまでは色々ワーク変数があり、さらにBUFENDからBUFFERまでは別のワーク変数が4バイト存在するが省略。
ワークエリアが$1Aから始まっているのはA~Zの変数領域が$82からになるようにするため。
BUFENDにはBUFFERに入力された最後尾のアドレスが入る。
EXSPは計算等に使うスタック。変数のアドレスをEXSPが示す領域にプッシュ/ポップして計算処理をする。
実際はスタックに入れてプッシュ/ポップではなくインデクスレジスタに入れて、だが。
EXSPの初期値には自身のアドレスであるEXSTKが入る。
位置関係が固定されている最初のポイントがここで、スタックオーバーの判定にBUFENDと比較される。ようするにEXSPがバッファラスト(BUFEND)まできたらスタックオーバー。
その部分
これが下限チェックで上限チェックはこちら
ちにみに最大入力判定をBUFFER+70としているので、計算スタックの最小は10バイトと想定している模様。
この部分を確保したスタック領域の先頭、末尾か?で行うように変更。
EXSPの次の52バイトが変数A~Zの領域で$0082~の固定領域となっている。
入力行解析時、それが変数なら1bit左シフトし(Aなら$41→$82)変数アドレスを設定しているが、実は上位アドレスとしてBUFENDの中の値を設定している。
その部分の抜粋
アキュムレータAには文字コードが入っていて1bit左シフト下値が変数の下位アドレス。
アキュムレータBにBUFEND、つまりバッファ使用領域最後尾、n文字入力していたらアドレスBUFFER+nの上位を入れている。
これより変数領域はBUFFERと同じ上位アドレスで下位が$82からの52バイト、かつBUFFERの領域が256バイト境界をまたがないなら構わないことになる。
実際、「マイコンてづくり塾」のΛ-1の電大版TINY BASICは、BUFFERからまとめて$E400に配置している。
ただ本のソースリストは
となっていて、
これはリストのタイプミスなのか、それとも本当にそうしてしまっているのか、変数領域は$F482からになっていないし、にもかかわらず変数のアドレス算出はアルファベットの文字コードをASLAとオリジナルのまま。もっとも、$F4xxの領域はそれら以外に使ってないので、プログラムの想定通りではないが問題なく動くだろうとは思う。
話が少しそれたが、変数領域はゼロページのままにしておくので、BUFENDの値を入れずに固定値0を設定するように変更(CLRB)。
大きな変更は以上。
一部ワークエリアをゼロページ外に移したので、相対ジャンプが範囲外になってしまう所等を修正。
結局、一番動かしにくいワーク領域を移動させてしまったが、以上の修正で動作OK。
修正ではないがMC6801のタイマも動かしていて、約10ms周期で割込を掛けているがついでに変数Tをカウントアップするようにしてみた。
何かのベンチマークテスト用。
あと、これはMC6802版からだがBASICだけでなくモニタも含めて、改行をLFに統一。
オリジナルは入力の改行判定はCR。改行出力はCR+LFを送信している。
MC6802ボード用に修正した時点からそうだが、シリアルの送受信キューはともに256バイトと余裕たっぷりにとっているし、スタック領域変更ついでに多めにとったし、限られたリソースでBASICを動かすというTINY BASICの趣旨には反しているけども、今だからできる贅沢かな?
最初に作った基板HD6301/6303ボード。
ワンチップモードでのみ動作確認までだったが、実はその後外部ROM/RAM実装でLILBUGモニタの動作確認までOK。
すっかり間が空いてどこまで書いたかも忘れている。
CPUはHD6303Rに。オーバークロックでも動作するのだが、供給クロックを3MHzに。つまり動作クロックは0.75MHz。
実際は3.2MHzほどでているので0.8MHz動作。
こんな感じです。
このボードに前回MC6802ボードに搭載した電大版TINY BASICを入れる。
オリジナルソースをベースとせず、MC6802ボード用に変更したソースをベースにした。
元々MC6800系のBASICだから、MC6802ボードでは割込使用送受信関係ではまったとはいえ、それ以外は比較的簡単に移植できたがMC6801系は色々と変更部分がでてくる。
8bitの6800系はゼロページエリアが重要で、電大版Tiny BASICもワークエリアはゼロページが前提になっているが、
・ワンチップマイコンであるMC6801系はそのゼロページにペリフェラルI/Oのレジスタ群が存在する。
・せっかく搭載したLILBUGなのでそれベースにTINY BASICを動かすつもりだが、LILBUGはMIKBUGと比較して機能が豊富な分ワークエリアも多くとる。
・実は送受信関係のバッファ操作のためのワークもゼロページにとってしまっている。
・I/OレジスタとLILBUGのワークの除いて、BASIC用の変数A~Zのアドレス($82~52バイト)を固定して確保する必要がある。
I/Oレジスタ($0~固定)とLILBUG、独自ワークエリアとTINY BASICのワーク全てあわせて256バイトに収めること自体は可能だが、TINY BASICは特定のワーク変数からの相対位置をみていたりヘタに動かせない部分がある。
そういった制約の中で色々配置を換えて移植してみた。
ベースは前回のMC6802のものでゼロページ以外のメモリ配置はほぼ同じ。モニタがMIKBUGからLILBUGになったぐらい。
実はFORループ処理用のスタックが$0100になっており、つまりFORスタックはゼロページなのだが、これはMC6802ボードへの移植時にゼロページ外に出している。
今回はソースリストでのラベルBUFFER部分をゼロページ外に出すことにした。
これはキーボードから入力された文字を一時的にためていくところ。領域も比較的大きいので外に出す意味は大きい。
ただし、この部分が一番ワークの相対位置関係が決まってヘタに動かせない部分でもある。
このワーク部分のオリジナルソースを抜粋
ORG | $1A | |
BUFEND | RMB | 2 |
BUFFER | RMB | 80 |
EXSTK | EQU | * |
EXSP | RMB | 2 |
RMB | 52 |
ORGからBUFENDまでは色々ワーク変数があり、さらにBUFENDからBUFFERまでは別のワーク変数が4バイト存在するが省略。
ワークエリアが$1Aから始まっているのはA~Zの変数領域が$82からになるようにするため。
BUFENDにはBUFFERに入力された最後尾のアドレスが入る。
EXSPは計算等に使うスタック。変数のアドレスをEXSPが示す領域にプッシュ/ポップして計算処理をする。
実際はスタックに入れてプッシュ/ポップではなくインデクスレジスタに入れて、だが。
EXSPの初期値には自身のアドレスであるEXSTKが入る。
位置関係が固定されている最初のポイントがここで、スタックオーバーの判定にBUFENDと比較される。ようするにEXSPがバッファラスト(BUFEND)まできたらスタックオーバー。
その部分
LDX | EXSP | |
DEX | ||
DEX | ||
CPX | BUFEND | |
BEQ | ERR180 |
これが下限チェックで上限チェックはこちら
LDX | EXSP | |
CPX | #EXSTK | |
BEQ | ERR180 |
ちにみに最大入力判定をBUFFER+70としているので、計算スタックの最小は10バイトと想定している模様。
この部分を確保したスタック領域の先頭、末尾か?で行うように変更。
EXSPの次の52バイトが変数A~Zの領域で$0082~の固定領域となっている。
入力行解析時、それが変数なら1bit左シフトし(Aなら$41→$82)変数アドレスを設定しているが、実は上位アドレスとしてBUFENDの中の値を設定している。
その部分の抜粋
TSTV | BSR | SKB8 |
CMPA | #$40 | |
BEQ | ARRAY | |
CMPA | #'A | |
BCS | NOTV | |
CMPA | #'Z | |
BHI | NOTV | |
ASLA | ||
LDAB | BUFEND | |
INX | ||
RTS |
アキュムレータAには文字コードが入っていて1bit左シフト下値が変数の下位アドレス。
アキュムレータBにBUFEND、つまりバッファ使用領域最後尾、n文字入力していたらアドレスBUFFER+nの上位を入れている。
これより変数領域はBUFFERと同じ上位アドレスで下位が$82からの52バイト、かつBUFFERの領域が256バイト境界をまたがないなら構わないことになる。
実際、「マイコンてづくり塾」のΛ-1の電大版TINY BASICは、BUFFERからまとめて$E400に配置している。
ただ本のソースリストは
F400 | BUFFER | RMB | 80 |
EXSTK | EQU | * | |
F450 | EXSP | RMB | 2 |
F452 | RMB | 52 |
となっていて、
これはリストのタイプミスなのか、それとも本当にそうしてしまっているのか、変数領域は$F482からになっていないし、にもかかわらず変数のアドレス算出はアルファベットの文字コードをASLAとオリジナルのまま。もっとも、$F4xxの領域はそれら以外に使ってないので、プログラムの想定通りではないが問題なく動くだろうとは思う。
話が少しそれたが、変数領域はゼロページのままにしておくので、BUFENDの値を入れずに固定値0を設定するように変更(CLRB)。
大きな変更は以上。
一部ワークエリアをゼロページ外に移したので、相対ジャンプが範囲外になってしまう所等を修正。
結局、一番動かしにくいワーク領域を移動させてしまったが、以上の修正で動作OK。
修正ではないがMC6801のタイマも動かしていて、約10ms周期で割込を掛けているがついでに変数Tをカウントアップするようにしてみた。
何かのベンチマークテスト用。
あと、これはMC6802版からだがBASICだけでなくモニタも含めて、改行をLFに統一。
オリジナルは入力の改行判定はCR。改行出力はCR+LFを送信している。
MC6802ボード用に修正した時点からそうだが、シリアルの送受信キューはともに256バイトと余裕たっぷりにとっているし、スタック領域変更ついでに多めにとったし、限られたリソースでBASICを動かすというTINY BASICの趣旨には反しているけども、今だからできる贅沢かな?
HD6301/HD6303 シングルボード [6801]
まただいぶ間が空いてしまいましたが、基板を起こしてしまいました。
ちょっと欲張りに回路を詰め込んで、
それでいて7×10cmの大きさに収めるために色々と端折っています。
MCUとROM/RAM、ターミナル接続用のシリアル自体はMCU内ですが
USB変換のPIC。これは前回のものと全く同じです。
電源はシリアル通信用のUSBからの直接給電ですが、
外部給電に対応させています。
USB2.0までのMax500mAでも充分なのですが、これも欲張り部分ですね。
ただこちらもUSBコネクタです(笑)。
今までなら2.1Φのピンジャックを使ったACアダプタなんでしょうが
今時はUSBのACアダプタの方が簡単に手に入ります。
シリアル通信用のUSBと給電専用のUSBとの電源切替はジャンパで。
基板はKiCadで作成しました。配線はほぼ自動です。
自動で配線してどの程度無理があるか確認しては部品配置変えてまた自動で、
を繰り返していき、できなかった配線が2~3本ぐらいになったら
その2~3本を手動で。
ただ、さすがに無理があるのでかなりこねくり廻すはめになります(笑)
できあがった基板がこれです。
ただやっぱり一発目は色々問題あって、
まず外部給電用のmicroUSBコネクタのフットプリントをミスって
ちょっとわかりにくいですが、下写真のようにパターンがずれてしまっています。
これはピンをちょっとまげれば特に問題ないですが
次作以降では修正したフットプリントを使用。
次にMCUの動作モードを変更できるようにしたのはいいのですが
そのジャンパのフットプリントを間違えて2mmピッチの2×3ヘッダにしてしまい
手持ちパーツには2mmのはないのでモード毎に基板作成です(笑)。
あるいは2mmピッチのものをいずれ買ってくるか…
HD6301のデータシート参考に回路書きましたが、MC6801と一部端子が違う事に
できあがってから気付きました。
HD6301は7番ピンがSTBY、21番ピンがVccですが
MC6801(およびHD6801)は7番ピンがVcc、21番ピンがVccStanbyになっています。
それとは直接関係ないのですが、そのSTBYをプルアップでつっていたのですが
Lowに落ちてしまってスタンバイ状態に入り動作しません(笑)。
単なるTTL入力だと思っていましたが違うようです。
確認すると入力"High"レベルのminがVcc-0.5Vになっているのがくせ者のようです。
早速ジャンパ飛ばすはめになって、STBYを直接VCCへ。
前回の子亀載せたピギーバックのHD68P01で動作確認。
スタンバイの関係で最初動きませんでしたが、上記対策施して無事動作。
ブレッドボード上の時はかなり不安定でしたが、安定して動作します。
USBコネクタ挿した直後はモニタ起動メッセージがでないのはご愛敬ですが(笑)。
起動メッセーがでないだけで動作はしてますが、ソフトで対処すべきなんでしょうね。
USB接続が確立するまで待てばいいのかな?
6801側からはわからないので、PIC側で通信OK/NGのステータス出すようにした方がいいかな?
写真ではモード6(内蔵ROM/RAM使用、内蔵以外の全アドレス外部メモリ使用)に設定して
RAMものせてますが、シリアル設定以外はLILbugほぼそのままで、
ポート4に上位アドレスがでてないので外部メモリはアクセスできず、
ワンチップモードと同等です。
LILbugのMコマンドはベリファイしているみたいで、外部アドレス空間の書き換えは全てNGです。
内部RAMはOKなので、一部のポートしか使えないワンチップマイコンとして動作してます。
ちょっと欲張りに回路を詰め込んで、
それでいて7×10cmの大きさに収めるために色々と端折っています。
MCUとROM/RAM、ターミナル接続用のシリアル自体はMCU内ですが
USB変換のPIC。これは前回のものと全く同じです。
電源はシリアル通信用のUSBからの直接給電ですが、
外部給電に対応させています。
USB2.0までのMax500mAでも充分なのですが、これも欲張り部分ですね。
ただこちらもUSBコネクタです(笑)。
今までなら2.1Φのピンジャックを使ったACアダプタなんでしょうが
今時はUSBのACアダプタの方が簡単に手に入ります。
シリアル通信用のUSBと給電専用のUSBとの電源切替はジャンパで。
基板はKiCadで作成しました。配線はほぼ自動です。
自動で配線してどの程度無理があるか確認しては部品配置変えてまた自動で、
を繰り返していき、できなかった配線が2~3本ぐらいになったら
その2~3本を手動で。
ただ、さすがに無理があるのでかなりこねくり廻すはめになります(笑)
できあがった基板がこれです。
ただやっぱり一発目は色々問題あって、
まず外部給電用のmicroUSBコネクタのフットプリントをミスって
ちょっとわかりにくいですが、下写真のようにパターンがずれてしまっています。
これはピンをちょっとまげれば特に問題ないですが
次作以降では修正したフットプリントを使用。
次にMCUの動作モードを変更できるようにしたのはいいのですが
そのジャンパのフットプリントを間違えて2mmピッチの2×3ヘッダにしてしまい
手持ちパーツには2mmのはないのでモード毎に基板作成です(笑)。
あるいは2mmピッチのものをいずれ買ってくるか…
HD6301のデータシート参考に回路書きましたが、MC6801と一部端子が違う事に
できあがってから気付きました。
HD6301は7番ピンがSTBY、21番ピンがVccですが
MC6801(およびHD6801)は7番ピンがVcc、21番ピンがVccStanbyになっています。
それとは直接関係ないのですが、そのSTBYをプルアップでつっていたのですが
Lowに落ちてしまってスタンバイ状態に入り動作しません(笑)。
単なるTTL入力だと思っていましたが違うようです。
確認すると入力"High"レベルのminがVcc-0.5Vになっているのがくせ者のようです。
早速ジャンパ飛ばすはめになって、STBYを直接VCCへ。
前回の子亀載せたピギーバックのHD68P01で動作確認。
スタンバイの関係で最初動きませんでしたが、上記対策施して無事動作。
ブレッドボード上の時はかなり不安定でしたが、安定して動作します。
USBコネクタ挿した直後はモニタ起動メッセージがでないのはご愛敬ですが(笑)。
起動メッセーがでないだけで動作はしてますが、ソフトで対処すべきなんでしょうね。
USB接続が確立するまで待てばいいのかな?
6801側からはわからないので、PIC側で通信OK/NGのステータス出すようにした方がいいかな?
写真ではモード6(内蔵ROM/RAM使用、内蔵以外の全アドレス外部メモリ使用)に設定して
RAMものせてますが、シリアル設定以外はLILbugほぼそのままで、
ポート4に上位アドレスがでてないので外部メモリはアクセスできず、
ワンチップモードと同等です。
LILbugのMコマンドはベリファイしているみたいで、外部アドレス空間の書き換えは全てNGです。
内部RAMはOKなので、一部のポートしか使えないワンチップマイコンとして動作してます。
HD68P01で1チップ構成(3) [6801]
だいぶ間があいてしまいましたが、一応色々やっていたのですが引き続きHD68P01。
昔のCPUで遊ぼうとするとだいたいシリアルでPCとつないでターミナルソフトで、ってなると思いますが、今のPCにCOMポートなるものがつくことはほぼなくなり、必然的にUSB変換してPCとつなぐことになりますが、このUSBシリアル変換チップというのは各種でてはいても表面実装部品ばかり。
ここでも利用したように小さな基板に組み込んだ完成モジュールを利用することになりますが、だいたいそれなりのお値段になってしまいます。
ということで、このUSBシリアル変換を自前で製作してしまうことにしました。
加えて、その他機能ももりこんで部品点数減少も狙ってみました。
・USBマイコン
USB内蔵マイコンは各種ありますが、PIC16F1454を使うことにします。これは
(1)なんといっても安い(秋月さんで130円ほど)
(2)比較的少ピン(14pin)
(3)外部クロックを必要としない
という理由からで、特に3番目は他USBマイコンにはない特徴です。
USBは割とシビアなクロックを要求するので、USBマイコンでUSBを使用するときは水晶発振子使用を推奨していて、最低限セラミック発振子が使われています。
このPIC1454は発信周波数を常に監視して自動的に更正する機能を持っており、外部発振子を必要としませんので部品点数を減らす目的でもうってつけです。
・CPUクロック
せっかくなのでCPUのクロックもPICで生成することにします。
先の例ではシリアルのボーレート(9600bps)をCPUクロックから生成するために4.9152MHzという水晶発振器を使いましたが、PICからこの周波数を生成するのは無理があります。
クロック生成にPWMを使いたいところですが、このPICはPWMが2chありますがピンの割り当ての関係で1chしか使えないのでPWMはボーレート生成に使います。
MC68P01のCPUクロックはPICのシステムクロックから作り出すことにしますが、USBを使う場合、USBが要求する12MHzを作り出すためにPICのシステムクロックは48MHz(あるいは24MHz)にするしかなく、このシステムクロックからは2のn乗分周のクロックしかとりだせません。
しかたないので6MHzを生成してMC68P01を1.5MHzのオーバークロックにすることにします。
いや、動作確認するだけなら半分の0.75MHzでもいいのですが(笑)。
・ボーレートクロック
動作クロックを1.5MHzにした場合9600あるいは、よくあるボーレートクロックを内部でつくりだす事はできないのでPICのPWMでボーレートを生成することにし、MC6801系はシリアルクロックを外部から入力する場合8倍のクロックを要求するので9600の8倍、76800bpsをPWMで生成することにします。
このPIC、自動更正して安定発振させているとはいえ周波数自体はそれなりにいいかげんです。
実測すると6.35MHzほどなので48MHzのところ、実際には50.8MHz。
ボーレート用クロックは80.86KHzだったので、ボーレートは10108bpsになってしまいます。
ただ、PIC側のボーレートもこの50.8MHzから生成しているので、PICとの通信のみで使う限りぴったり一致して問題ありません。
ちなみに周波数測定は、画像のようにテスターで測っただけです。
・その他機能
空いてるピンを使ってその他機能ももりこみます。
まずリセット。リセットは単純な機能ですが意外とはまるのでPICで生成。
外部リセット入力できるようにしますが、ポートのプルアップ機能とソフト処理によるチャタリング対策でスイッチのみ付ければOKに。
リセット出力はリセットスイッチが押されればアサート、リセットスイッチOFF後約100ms後にネゲート。
あと、電源LEDも入れましたが、これはPIC動作確認用でもあるので点灯ではなく点滅にしました。
・MC6801側ソフト
MC68P01側のソフトは引き続きLILBugを使いますが、シリアルボーレートが内部生成ではなく外部入力になったのでその部分を変更してアセンブルし直してROM焼き。
・動作検証
例によってブレッドボードに組み、ジャンパワイヤで空中配線をすると動作が不安点になってしまったので一部配線をブレッドボードにぴったり這わすようにしました。
こんな感じです。
主にUSB関係の配線ですが、本当はクロック系もそうしたかたったのですが配置、引き回しの関係で断念。
一応動作しましたが、それでも不安定な部分もあってソフトなのかハードなのか、切り分けるのも何ですので、この段階で基板を起こすことにしました。
本当は、きっちり動作確認できてからと思っていたのですが。
1チップ構成とタイトル付けながら、PICも使用しているので2チップ構成になっていますね…
昔のCPUで遊ぼうとするとだいたいシリアルでPCとつないでターミナルソフトで、ってなると思いますが、今のPCにCOMポートなるものがつくことはほぼなくなり、必然的にUSB変換してPCとつなぐことになりますが、このUSBシリアル変換チップというのは各種でてはいても表面実装部品ばかり。
ここでも利用したように小さな基板に組み込んだ完成モジュールを利用することになりますが、だいたいそれなりのお値段になってしまいます。
ということで、このUSBシリアル変換を自前で製作してしまうことにしました。
加えて、その他機能ももりこんで部品点数減少も狙ってみました。
・USBマイコン
USB内蔵マイコンは各種ありますが、PIC16F1454を使うことにします。これは
(1)なんといっても安い(秋月さんで130円ほど)
(2)比較的少ピン(14pin)
(3)外部クロックを必要としない
という理由からで、特に3番目は他USBマイコンにはない特徴です。
USBは割とシビアなクロックを要求するので、USBマイコンでUSBを使用するときは水晶発振子使用を推奨していて、最低限セラミック発振子が使われています。
このPIC1454は発信周波数を常に監視して自動的に更正する機能を持っており、外部発振子を必要としませんので部品点数を減らす目的でもうってつけです。
・CPUクロック
せっかくなのでCPUのクロックもPICで生成することにします。
先の例ではシリアルのボーレート(9600bps)をCPUクロックから生成するために4.9152MHzという水晶発振器を使いましたが、PICからこの周波数を生成するのは無理があります。
クロック生成にPWMを使いたいところですが、このPICはPWMが2chありますがピンの割り当ての関係で1chしか使えないのでPWMはボーレート生成に使います。
MC68P01のCPUクロックはPICのシステムクロックから作り出すことにしますが、USBを使う場合、USBが要求する12MHzを作り出すためにPICのシステムクロックは48MHz(あるいは24MHz)にするしかなく、このシステムクロックからは2のn乗分周のクロックしかとりだせません。
しかたないので6MHzを生成してMC68P01を1.5MHzのオーバークロックにすることにします。
いや、動作確認するだけなら半分の0.75MHzでもいいのですが(笑)。
・ボーレートクロック
動作クロックを1.5MHzにした場合9600あるいは、よくあるボーレートクロックを内部でつくりだす事はできないのでPICのPWMでボーレートを生成することにし、MC6801系はシリアルクロックを外部から入力する場合8倍のクロックを要求するので9600の8倍、76800bpsをPWMで生成することにします。
このPIC、自動更正して安定発振させているとはいえ周波数自体はそれなりにいいかげんです。
実測すると6.35MHzほどなので48MHzのところ、実際には50.8MHz。
ボーレート用クロックは80.86KHzだったので、ボーレートは10108bpsになってしまいます。
ただ、PIC側のボーレートもこの50.8MHzから生成しているので、PICとの通信のみで使う限りぴったり一致して問題ありません。
ちなみに周波数測定は、画像のようにテスターで測っただけです。
・その他機能
空いてるピンを使ってその他機能ももりこみます。
まずリセット。リセットは単純な機能ですが意外とはまるのでPICで生成。
外部リセット入力できるようにしますが、ポートのプルアップ機能とソフト処理によるチャタリング対策でスイッチのみ付ければOKに。
リセット出力はリセットスイッチが押されればアサート、リセットスイッチOFF後約100ms後にネゲート。
あと、電源LEDも入れましたが、これはPIC動作確認用でもあるので点灯ではなく点滅にしました。
・MC6801側ソフト
MC68P01側のソフトは引き続きLILBugを使いますが、シリアルボーレートが内部生成ではなく外部入力になったのでその部分を変更してアセンブルし直してROM焼き。
・動作検証
例によってブレッドボードに組み、ジャンパワイヤで空中配線をすると動作が不安点になってしまったので一部配線をブレッドボードにぴったり這わすようにしました。
こんな感じです。
主にUSB関係の配線ですが、本当はクロック系もそうしたかたったのですが配置、引き回しの関係で断念。
一応動作しましたが、それでも不安定な部分もあってソフトなのかハードなのか、切り分けるのも何ですので、この段階で基板を起こすことにしました。
本当は、きっちり動作確認できてからと思っていたのですが。
1チップ構成とタイトル付けながら、PICも使用しているので2チップ構成になっていますね…
HD68P01で1チップ構成(2) [6801]
では実際にブレッドボーにくみ上げます。
主立った部品は以下のもの
・HD68P01V0P
・クリスタルオシレータ(4.9152MHz)
・USB-シリアル変換基板(Sanhayato製)
MC6801系はCPUクロックとなるEクロックからボーレートを設定でき、
なるべく簡単に動かすためにこれを利用するのですが
9600bpsにするために入力クロックを4.9152NHzにしなければいけません。
使用する石は1MHz動作品ですので入力クロックはMax4MHzで
オーバークロックとなりますがこの程度は問題なく動きますし、
業務で使うわけではありませんので気にしない事にします。
ブレッドボードにくみ上げると写真のような感じになりますが、
ジャンパワイヤーは特にプルアップ系は長さ適当です。
結線はシリアルポートと変換基板、クロック。
パワーONリセットはCRで生成して定数はすぐに取り出せた物(10KΩ、47μF)で適当。
割り込み関係とSTBYを+5Vに。
MC6801系はリセット中にP20~P22をチェックしてモードを切り替えるので、
ワンチップモードにするためにそれらを+5Vへ。
電源は変換基板からとります。
動作確認ソフトとして定番となるモニタソフトを使います。
これも定番であるモトローラ純正のLILBUGというものを利用。
MC6800用のモニタMikbugのMC6801版みたいなものです。
ソースはネットにありますがアセンブルする必要があり
アセンブラは、昔ちょくちょく使っていたモトローラ純正のMOTOASMというものを利用。
ネットあされば他にも色々ありますが、昔から持ってて使い慣れていますので。
MOTOASMはCPU別に6800,6801,6804,6805,6809,6811があるのですが、
今ならオプション、あるいは疑似命令でCPU指定でしょうか。
このMOTOASM、Amiga用もあって確かソースもあったような…。
ただ、これはMS-DOS向けのソフトで最近のWindowsでは動作しません。
そこで、MS-DOSのプログラムをWin32-64bit環境で動かすツール
MS-DOS Player for Win32-x64を利用します。
このモニタ、CPUクロックが1.2288MHz、あるいは0.6144MHzが前提となっていて
ボーレートはデフォルトが300、コマンドで2400および9600に
切り替えるようになっていますがデフォルト9600に変更。
くわえてボーレート切替コマンドを削除。
ボーレート関係の修正を加えてアセンブルを実行。
多少エラーでますが修正して無事アセンブル完了。
書き込みはTL866AというROMライター利用。
いざ書き込もうとするとこれに付属する書き込みソフト、
データはインテルHEXかバイナリしか受け付けません。
それに対してMOTOASMはSレコードを生成します。
しょうがないのでMOTOASM付属のバイナリ変換ソフトを使おうと思いましたが、
ROMサイズを指定してバイナリ生成できるのは良いのですが
オフセット指定はできないような感じで、
2732にあわせて4KBを指定してもアドレス0から4KBのバイナリを生成してしまいます。
生成コードはF800からなのでアドレスF000からの4KBにしたいのですができません。
しょうがないので64KB丸ごと生成しようとして65536を指定するとこれまたできません。
MS-DOS時代のソフトなんで16bitサイズなんでしょうね。
そこでサイズとして65535を指定して、
バイナリエディタでラスト1バイト付け足すことも考えましたが
vectorから別のバイナリ変換ソフトをおとし利用することにしました。
これまたMS-DOSソフトなのでMS-DOS Playerから利用します。
色々手間取りましたが、なんとかROMに書き込みHD68P01の上にのせ
PCでターミナルソフト(TeraTermPro)を起動、変換基板経由で
PCとHD68P01を接続。無事teratermにプロンプトが表示されました。
F800からF8FFまでダンプ表示した結果です。
なんか長々だらだらとした文章になってしまいました。
今後は構成を考えていく必要ありますね。
主立った部品は以下のもの
・HD68P01V0P
・クリスタルオシレータ(4.9152MHz)
・USB-シリアル変換基板(Sanhayato製)
MC6801系はCPUクロックとなるEクロックからボーレートを設定でき、
なるべく簡単に動かすためにこれを利用するのですが
9600bpsにするために入力クロックを4.9152NHzにしなければいけません。
使用する石は1MHz動作品ですので入力クロックはMax4MHzで
オーバークロックとなりますがこの程度は問題なく動きますし、
業務で使うわけではありませんので気にしない事にします。
ブレッドボードにくみ上げると写真のような感じになりますが、
ジャンパワイヤーは特にプルアップ系は長さ適当です。
結線はシリアルポートと変換基板、クロック。
パワーONリセットはCRで生成して定数はすぐに取り出せた物(10KΩ、47μF)で適当。
割り込み関係とSTBYを+5Vに。
MC6801系はリセット中にP20~P22をチェックしてモードを切り替えるので、
ワンチップモードにするためにそれらを+5Vへ。
電源は変換基板からとります。
動作確認ソフトとして定番となるモニタソフトを使います。
これも定番であるモトローラ純正のLILBUGというものを利用。
MC6800用のモニタMikbugのMC6801版みたいなものです。
ソースはネットにありますがアセンブルする必要があり
アセンブラは、昔ちょくちょく使っていたモトローラ純正のMOTOASMというものを利用。
ネットあされば他にも色々ありますが、昔から持ってて使い慣れていますので。
MOTOASMはCPU別に6800,6801,6804,6805,6809,6811があるのですが、
今ならオプション、あるいは疑似命令でCPU指定でしょうか。
このMOTOASM、Amiga用もあって確かソースもあったような…。
ただ、これはMS-DOS向けのソフトで最近のWindowsでは動作しません。
そこで、MS-DOSのプログラムをWin32-64bit環境で動かすツール
MS-DOS Player for Win32-x64を利用します。
このモニタ、CPUクロックが1.2288MHz、あるいは0.6144MHzが前提となっていて
ボーレートはデフォルトが300、コマンドで2400および9600に
切り替えるようになっていますがデフォルト9600に変更。
くわえてボーレート切替コマンドを削除。
ボーレート関係の修正を加えてアセンブルを実行。
多少エラーでますが修正して無事アセンブル完了。
書き込みはTL866AというROMライター利用。
いざ書き込もうとするとこれに付属する書き込みソフト、
データはインテルHEXかバイナリしか受け付けません。
それに対してMOTOASMはSレコードを生成します。
しょうがないのでMOTOASM付属のバイナリ変換ソフトを使おうと思いましたが、
ROMサイズを指定してバイナリ生成できるのは良いのですが
オフセット指定はできないような感じで、
2732にあわせて4KBを指定してもアドレス0から4KBのバイナリを生成してしまいます。
生成コードはF800からなのでアドレスF000からの4KBにしたいのですができません。
しょうがないので64KB丸ごと生成しようとして65536を指定するとこれまたできません。
MS-DOS時代のソフトなんで16bitサイズなんでしょうね。
そこでサイズとして65535を指定して、
バイナリエディタでラスト1バイト付け足すことも考えましたが
vectorから別のバイナリ変換ソフトをおとし利用することにしました。
これまたMS-DOSソフトなのでMS-DOS Playerから利用します。
色々手間取りましたが、なんとかROMに書き込みHD68P01の上にのせ
PCでターミナルソフト(TeraTermPro)を起動、変換基板経由で
PCとHD68P01を接続。無事teratermにプロンプトが表示されました。
F800からF8FFまでダンプ表示した結果です。
なんか長々だらだらとした文章になってしまいました。
今後は構成を考えていく必要ありますね。
高速運作TL866CSプログラマ/USBついプログラマ EPROM FLASH AVR TL866シリーズプログラマ
- 出版社/メーカー: Generic
- メディア: エレクトロニクス
HD68P01で1チップ構成(1) [6801]
前々から昔の8bitや16bitCPUを使った製作ブログは色々あったと思いますが、
最近になっていくつか本も出版され、
なんとなく触発されて自分でもやってみたいと思うようになった次第で、
コレクションしていた古いCPUや周辺チップ、メモリを引っ張り出してきました。
最初はとりあえずの実験的なもの。
なのでなるべく部品点数も少なくブレッドボードで。
いやぁ、ブレッドボードって便利ですね。仕事でも試作段階でよく使います。
そのうち基板もおこそうと思っています。
部品点数少なくするためにまずはワンチップ系でやることにして
選択することにしてモトローラのMC6801系。
モトローラといいながら写真は日立の石ばかりですが、左から
HD6803P-1、HD63B01V1P、HD637B01V0C、HD68P01V07
今回使うのはHD68P01V07。
ピギーバックと呼ばれた石で、
チップの上にEP-ROMを載せることができるソフト開発用の石です。
右から2つ目はUVEP-ROM内蔵のもので、
ROMライタで書き込みするためのアダプターを以前作ったことがあるのですが
今はなく、いずれまた作ってこれも活用する予定です。
ROMを載せた状態。こんな感じになります。
4pinあまってますが、HD68P01VはROM容量4KBで
32Kbitの24pinDIPのROMを使うのですが
8KBのHD68P01M0というのがあって、
それは64Kbitの28pinDIPのROMを載せるようになっていて
それとパッケージが共通なのでしょう。
これで、オシレータやCR等、
PC接続用にシリアル-USB変換基板は使いますが
ほぼ1チップで構成できます。
実例は次回に。
最近になっていくつか本も出版され、
なんとなく触発されて自分でもやってみたいと思うようになった次第で、
コレクションしていた古いCPUや周辺チップ、メモリを引っ張り出してきました。
最初はとりあえずの実験的なもの。
なのでなるべく部品点数も少なくブレッドボードで。
いやぁ、ブレッドボードって便利ですね。仕事でも試作段階でよく使います。
そのうち基板もおこそうと思っています。
部品点数少なくするためにまずはワンチップ系でやることにして
選択することにしてモトローラのMC6801系。
モトローラといいながら写真は日立の石ばかりですが、左から
HD6803P-1、HD63B01V1P、HD637B01V0C、HD68P01V07
今回使うのはHD68P01V07。
ピギーバックと呼ばれた石で、
チップの上にEP-ROMを載せることができるソフト開発用の石です。
右から2つ目はUVEP-ROM内蔵のもので、
ROMライタで書き込みするためのアダプターを以前作ったことがあるのですが
今はなく、いずれまた作ってこれも活用する予定です。
ROMを載せた状態。こんな感じになります。
4pinあまってますが、HD68P01VはROM容量4KBで
32Kbitの24pinDIPのROMを使うのですが
8KBのHD68P01M0というのがあって、
それは64Kbitの28pinDIPのROMを載せるようになっていて
それとパッケージが共通なのでしょう。
これで、オシレータやCR等、
PC接続用にシリアル-USB変換基板は使いますが
ほぼ1チップで構成できます。
実例は次回に。
タグ:HD68P01