SSブログ

モトローラフリーアセンブラをWIndowsで [8bitマイコン]

68系の開発にモトローラのフリーアセンブラを使用しているが、これはMS-DOS時代のソフト(いや元々はunix系だったのかな?)で今のWindowsでは直接は動かない。ただこのアセンブラはソースも公開されているのでリコンパイルしてWindowsで動くようにしてみる。
さて、ソースは確かAMIGA版のやつがソース付だったと思ったが、今現在AMIGAは動作出来る状態にない。ネットであさるとGithubで難なく見つかった。

https://github.com/JimInCA/motorola-6800-assembler

ただし、公開者が色々手を入れてるみたいで完全なオリジナルではない。
Linuxでmakeできるようになっているが、このソースを利用してWindowsで動くようにしてみる。

(1)Windows Subsystem for Linux
これはLinuxだからそのまんま。
すっぴんのWindows Subsystem for Linuxはgccもmakeも入ってないのでインストールする必要があるが、makeするだけ。
当然だがWindowsのコマンドプロンプトから実行できるわけではない。

(2)コマンドプロンプトからmake
コマンドプロンプト、あるいはPowerShellからmakeできるか?
まずはVisual C++。
makefileをVisualC向けに書き直してみたがでエラー。
gnu系のmakeとnmakeでは書式が違ったかな?
bcc32(C++Builder)でmakeしてもだめ。Borlandのmakeはnmakeと同じだったような気もする。
もう何年(十何年)?もmakefileなんか書いてないし、すっかり忘れているのでこれ以上追求するのはやめ。

(3)C++ Builder
次に(Vsual Studioでもできるが)C++Builderの統合開発環境。
C++Builderを起動し、新規作成→その他→コンソールアプリケーションでプロジェクトを作る。
ターゲットフレームワークなし。
ソースの種類はC、マルチスレッドとプロジェクトソースの指定のチェックをはずす。
プロジェクトグループとグループ所属の空のプロジェクトが作成される。

cb_proj_console.jpg
cb_proj_console2.jpg

プロジェクトグループ名はオリジナルのあわせてmotoasmとでもし、プロジェクトはas0(6800用アセンブラ)と変更しておく。

cb_namechange.jpg

プロジェクトも一つ同時に作られるがプロジェクト名を
プロジェクトのあるフォルダにアセンブラソースを全部コピー。
プロジェクトas0に対して「プロジェクトに追加」でソースを追加。

cb_proj_add.jpg

ソースはdo*.c、table*.cが各CPUの個別ソースでそれ以外は共通。
なのでプロジェクトas0(6800向アセンブラ)ならdo0.c、table0.cとそれ以外を全部追加。
念のためヘッダファイルもプロジェクトに追加。
プロジェクト新規作成時にできたデフォルトのソースとヘッダは削除。

cb_proj_del.jpg

同様にプロジェクトグループに対してプロジェクト(as1,as4,as5,as9,as11)を新規追加していく。
そしてそれぞれのプロジェクトにソース(do*.c,table*.cだけ各個でそれ以外は全部同じものを指定)を追加していく。

cb_proj_add_end.jpg

それが終了したら全てのプロジェクトをビルド。as0,as1,as4,as5,as9,as11が一気にビルドされる。

cb_proj_build.jpg

ビルドするとヘッダファイル"unistd.h"がないとエラーがでる。

cb_include_err.jpg

"unistd.h"はunix系依存のヘッダファイル
エラーがでるinclude行をコメントアウトしてリビルドをかけると警告はでるがエラーもなく成功する。
警告はopen,close,read,write,create,lseek。
今は使わない古い関数ですね。
fopen等に変更すればいいはずだが、ソースを色々いじる必要があるので"io.h"で代用。これで警告もなくなる。
今までのソース等いくつかアセンブルさせてみたが問題なくアセンブルできているもよう。
まぁ全てのCPU版を試したわけではないが、とりあえず問題なさそう。
あとは今使ってるROMライタにあわせて、IntelHexをはけるようにできれば…



nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

マイコン制御PIC [8bitマイコン]

今回はPICの話。
ちょっと長いし文章だけなんですみません。

今までのCPUボードには全てPICを載せている。
主にクロック、RESET生成とUSB-シリアル変換に使っている。
元々の動機はUSB-シリアル変換。
今時のPCにはCOMポートがついていない。
この手の遊びをしている人の多くは、市販のUSB-シリアル変換基板と使っているが個人的にはどうもスマートではない。
変換チップをボードに搭載してしまうのも手だが、最近の変換チップは多機能多ピンのものばかりで、ピンのピッチも細かくて手半田はかなり厳しい。以前はフロー制御線を省略した少ピンでピンピッチも比較的広いチップも手に入ったんだけどね。
で、目を付けたのがPIC16F1454。DIP14Pinだから個人でも扱いやすく、小さくあまりスペースを取らない。5V動作というところも古いマイコンの周辺として使うのに都合が良い。なにより安い。
あと、外付けの水晶発振子を必要としない。USBは通信クロックにそれなりの精度を要求するので、ほとんどのUSBマイコンはUSBを使う場合は外部に水晶発振子を必要とするが、これは内部発振でUSBを可能としている珍しいチップ。
ただし、USBが使えるだけあって安定はしているのだろうけど、発信周波数は12MHzぴったりというわけでもなさそうだ。
少ピンとはいえピンはあまるので、7×10cmの小さな基板上のパーツ点数を減らすべく他にも機能を割り当てた。
ファームウェアはUSBのCDCクラスとなるように組む必要があるが、統合開発環境MPLABのプラグインMCC(MPLAB Code Configurator)を使えば自動生成してくる。多少システムにあわせてカスタマイズする必要もあるが。

ではこのマイコン制御チップであるPICの機能であるが

(1)USB-シリアル変換
一番メインとなる部分。
USBのファームは一から作るとなるとかなり面倒だがMCCのおかげでかなり楽ちん。
シリアル側もMCCで生成。これらに限らず内蔵ペリフェラルは全てMCCで。
ドライバと呼ばれる部分を生成するだけなので、もちろん一方で受信したら他方へ送信というメイン処理は自分で書かなくてはいけない。

(2)CPUクロック生成
CPUにクロックを供給。
このPICはシステムクロックを出力する機能があり、システムクロックを1/2**n分周を出力してくれる。
USB機能を使うとシステムクロックは48MHzになるので、生成クロックは
48,24,12,6,3MHz
となる。
Z80だとBバージョンで6MHz。Aだと3MHzにするしかない。
8085だと6MHz入力で3MHz動作。
68系は4分周されるので、6MHz入力で1.5MHzとなりAバージョン。
6809や6303ならCバージョンを使うと12MHz入力で3MHz動作が可能となる。
ただ先にも書いたが発信周波数は正確ではないようで、6MHz生成しているつもりが6.4MHzでていたりする。一方でほぼ6MHzでる場合もあり、これは個体差なのかロット差なのかまだ何ともいえない。
周波数的にいまいち使いにくいが水晶発振子(器)の節約になる。

(3)ボーレートクロック生成
マイコン側8251、6850等のシリアルチップ向けにボーレートクロックを出力。
通常9600bps想定で、その16倍となる153.6Kbpsを出力。6801の場合は8倍の76.8Kbps。
ボーレートの許容誤差は一般的に5%と言われているが、16倍クロック入力の場合だいたい1/16で6.25%。
このボーレートもPICのシステムクロックから生成しているわけで、CPUクロック生成6MHzのつもりが6.4MHzになっているとすると、6.67%のずれで許容範囲外なのだが、PIC内部のシリアルボーレートも、同じPICシステムクロックから生成しているので、ぴったしあって問題なし。あくまで9600からずれているというだけ。

(4)リセット信号生成
パワーオン時とリセット入力ピンがLowになった時に、リセット出力ピンをLowに。
リセット入力ピンがHighになってから約120msリセットを持続。
自分が知る限り一番長いRESETを要求しているのは68000で100ms。
少し余裕を見て120msにしている。
リセットは単純でありながら奥が深く昔からトラブルが多い。
アナログ的要素が強いからでもあるが、マイコンでON-OFFしてやるのが単純で簡単。
マイコンのファームウェアで制御しているわけだからある意味複雑とも言えるが。
リセット入力は使用しているポートがプルアップ付なのでスイッチをつなげるだけ。

(5)タイマ出力
10msでワンショットパルスを出すようにしている。定周期タイマとして使えるように。
10ms経過で単純にソフトでONしてOFFしているだけなので、ひょっとしたらパルスが短すぎて認識できないCPUがあるかもしれないが。
8085ボードではRST7.5に入れて定周期タイマとして使えるようにしている。今のところ問題なく動作している。
8085にあわせて通常LowでHiアクティブ。
その他CPU用では論理を逆にしているが、使っているボードは今のところない。

(6)オプション選択
余ったピンを使って動作選択できるようにしていて、今のところボーレート切替。
リセット中にチェックしてHiで9600、Lowで19200に切り替えるようにしているが、現状使っていないので動作確認はできていない。

とまぁこんな感じに機能を盛り込んだので、Z80ボードなんかはICはこれとZ80CPU,SIOの3チップ構成で済んでいる。

問題点
まだ残っている問題点として、
例えばPCでteratermを端末に利用するとしよう。マイコンボード側のボーレートが9600だからCOMポートの設定も9600にしたとしても、USBの通信速度が9600bpsになるわけではない。USB機器がCDCクラスだからCOMポートの振りをしているだけで、ハードはUSBであり12Mbpsで通信されてしまう。たぶんデータ長とかはソフト的なプロトコルだから意味があるだろうし、ハードフロー制御を使ったらそのようにエミュレーションするからこれも意味があるが、通信速度は無視される。ちなみにPIC側のファームでUSB CDCクラスの通信速度を設定する項目はない。
これはどうなるかというと、たとえばマイコン側のモニタでHEXファイルをロードしようとした時、teratermなんかでファイル転送するとPCからUSB経由でPICへは12Mbpsで転送されてしまい、PIC内部でバッファオーバフローを起こす。
この辺、市販のUSB-シリアル変換基板、あるいはチップはよくできている。
しかたがないのでteratermの設定でファイル転送時、文字間に1msのwaitを入れるようにしている。


タグ:pic マイコン
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

Z80ボードにオリジナルモニタ [Z80]

8085用に作ったモニタをZ80に移植。
まずは8080 -> Z80のニーモニックコンバータを捜す。
いくつかあるが意外とない。
一つ試してみたがまともに変換しない。
古いソフトは1行80桁までしか認識しないとか、日本語コメントを使っているがするがそれが悪さするとかためにあるけどその辺かな?
と思いつついちいち検証していくのも時間がかかるので、エディタで検索置換を駆使して力技で変換していく。
あとはシリアルが8251なのをZ80SIOのものに置き換え。
8085ボードは8085のRST7.5,6.5,5.5割込を使っているので、ブート時に設定しているのをZ80のモード2設定に変更。
ぐらいだろうか?
Z80に変更だからといって、Z80固有の命令を使って書き直すなどということまではしない。

PICのファームは基本同じだが、10msインターバルタイマ出力は8085ボードはRST7.5に入れている関係でH出力にしていたのをL出力に変更。もっともZ80ボードでは使用していないが。

Z80基板も新しく作り直した。

syc8-z80-rev_b_p.jpg

コネクタからの配線を、1.27mmピッチ1列のパターンにいったん並べ直して…、というのをやめている。これはメモリボードも同様に修正している。
あとは4隅のホールパターンを変更ぐらいかな?

このボード、Z80SIOの2chのうち片方を10Pヘッダにだしていて一応PCのCOMポート配列にあわせているが、RS232レベル変換しているわけではないのでPC用COMポートケーブル使って直接COMポート接続ができるわけではない。
スペースに余裕があるのでMAX232でも載せれば良かったかな?

nice!(2)  コメント(0) 
共通テーマ:趣味・カルチャー

8085CPUボード [8085]

ずいぶんと間があいてしまったが今回は8085。
基板自体は初期のうちに作っていたのだが、8251のフットプリント選択ミスで作り直して後回しだったのをようやくお披露目。
それ以外にも色々変更を加えていたので、何から何まで基板を起こし直した。

まず8085ボードがこれ

syc8-8085-rev_b.jpg

いつものようにPICでUSB-シリアル変換とクロックとリセット。
部品実装したのがこれ

syc8-8085-rev_b_p.jpg

パターン引き回しの都合でICの向きが揃ってない(笑)
PICでCPUクロックとボーレートを生成している。CPUクロックとして6MHzをだしているので8085は3MHz動作。
あと、PICで10ms間隔でワンショット出すようにしていて、8085のRST7.5に入れている。

マザーボードというか4連のバスボード
こちらは部品実装済みの写真

syc8-base-rev_c_p.jpg

USBコネクタは給電専用。プルアップ抵抗はリセットや割込系はCPU、あるいはシステムによって要求されるものが違うので個別に抵抗を設定。アドレスとデータのバスのみ集合抵抗。データバスが4素子2個になっているのはパターンの都合。

コネクタの間隔を修正して20mmスペーサが使えるようにした。
そしてメモリボード。こちらも部品実装済みの写真

syc8-64k-rev_b_p.jpg

バスの規格はGUPPYバスに合わせていると言ったが、*MREQ信号を68系ではEとしていたのを68系でも*MREQに変更。それにともなって68系のCPUボードも作り直している。それらもまたいずれ。
その変更に伴って最初のものと比べてMREQとEの切替スイッチがなくなっている。

ベースボードにCPUボードとメモリボードを挿すとこうなる。

syc8-8085-mem64.jpg

ベースボード側のUSBコネクタから給電。CPUボード側のUSBコネクタでPCと接続。
最初のやつは基板の厚みを考慮せずにコネクタピッチをきっちり20mmしていたのを1.6mm拡大。
おかげさまで20mmスペーサが使えるようになった。基板の厚みは1.6mm限定だが。
ソフト製作中でもあって頻繁にROMの抜き差しをするのでメモリボードを前面に出しているが、こうするとリセットスイッチが押しにくい(笑)。パーツの配置は色々考慮してしっかり考えないとダメですね。


今回、モニタを自分で作ってみた。今まで使ってきたものもオープンソースなんだろうけど、自分で作ってしまうとその辺全く気にしなくてよくなるので。
必要最小限の簡単なモニタのつもりがそれなりのサイズになってしまった(笑)。昔と違ってメモリリソースを全く気にする必要がないので、省メモリ化を全く意識せずに作った。
モニタ実行の様子

mon_run.jpg

まだ細かいところで「?」となるのがだいたいできてるのでこれでよしとしておく(笑)

特に著作権を主張するつもりもなくオープンソースのつもりなので、回路図、基板のガーバデータ、モニタのソース等、そのうち公開するつもり。需要があるかどうかは知らないが。
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。