Posts Tagged with "Arduino"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.

FM-7 ROM吸出し器の製作(5)

posted by sakurai on August 29, 2019 #160

サブシステムのROM吸出しの際に、サブシステムの動作確認をするために、Arduinoからランダムなボックスフィルを実行してみました。いかにもFBASICで描画しているように見えますが、Z80カードのエミュレーションをArduinoがやっています。その様子を図160.1に示します。

図%%.1
図160.1 サブシステムの動作

以下の動作を実行するスケッチを作成しました。

  • \$FD05のMSBが0になるのを待つ
  • \$FD05のMSBを1に(サブシステムをHALT)、LSBを1に(メインシステムをHALTしZ80側に)するーつまり\$FD05に\$81をwrite
  • 共有メモリにLineコマンド及びランダムな座標パラメータを書き込む
  • \$FD05のMSBを0に(サブシステムHALTの解除)、LSBを1に(メインシステムをZ80側のまま)するーつまり\$FD05に\$01をwrite
  • 最初に戻りループ

左矢前のブログ 次のブログ右矢

FM-7 ROM吸出し器の製作(4)

posted by sakurai on August 28, 2019 #159

メインシステムROMの吸出しは非常に単純で、アドレスをセットして、データをリードするだけでしたが、サブシステムのROMはサブシステム側に依頼しないと読み出せません。従って、前に述べたように、メンテナンスコマンド(いわゆるYAMAUCHIコマンド$\dagger$)を用いてブロックコピーし、分割読み出しすることになります。これは、サブシステムのROMが10,240バイトもあるのに比べて、窓である共有メモリがわずか128バイトしかなく、コマンドにいくらか使用するため、データ転送用の窓を64バイトとしているためです。そのため、この転送を160回繰り返します。64バイト毎に16進ダンプを行います。

FM-7/8 Subシステムメンテナンスコマンドのページ(魚拓)を参考にスケッチを作成します。作成したスケッチをここに置きました。

図%%.1
図159.1 サブROMコピーの動作図

いちいちサブシステムを止めてコマンドを(2度)発行してダンプを行うので、かなり面倒でしたが、このスケッチにより得られたダンプ画面の最初と最後を示します。

d800 00 00 00 00 00 00 00 00 70 40 70 1a 7a 0e 0a 0a
d810 70 40 70 12 74 08 14 22 70 40 70 42 74 08 14 22
d820 70 40 70 40 7e 04 04 04 e0 80 e0 8c f2 12 12 0d
d830 20 50 70 52 54 18 14 12 70 48 70 4c 74 04 04 07
:
ffc0 02 10 ae a4 10 9f 47 bd b5 9c bd 9b 35 be 01 82
ffd0 20 d3 be 01 84 ae 02 20 a9 bd 02 69 34 ff 86 00
ffe0 1f 8b 10 ff 03 16 10 fe 03 16 bd 9b 35 86 2a 8d
fff0 e0 00 e0 00 e0 00 fd ac e0 6e e0 00 fe bf e0 00

同じくネットで入手したSubrom_c.romと比較したところ、全てのバイトが一致しました。若干疑問なのは、スクラッチから作成したと言われているROMデータが実ROMデータを全て一致するということがあるのだろうかということです。とりあえず、実機から抜き出したROMデータを使用している分には問題が無いので、気にしないことにします。

$\dagger$山内さんは入社した時の課内ソフトウェアグループのサブシステムチームのリーダでした。


左矢前のブログ 次のブログ右矢

FM-7 ROM吸出し器の製作(3)

posted by sakurai on August 27, 2019 #158

Arduino Mega 2560 Proの端子図を図158.1及び図158.2に示します。

図%%.1
図158.1 Arduino Mega 2560 Proの端子図

図%%.2
図158.2 Arduino Mega 2560 Proの端子図(右側の端子)

アドレス、データ、制御信号を全てソフトコントロールしています。スケッチはここに置きました。ただし、初版からデータピンの位置を変更しているため、ボードの版数に合わせて適宜修正する必要があります。

これにより吸い出したfbasic30 ROM(\$8000~\$FBFF)生データの一部を示します。

8000 8e 80 13 ce 01 f9 c6 0a bd 85 97 8e 80 26 c6 0a
8010 7e 85 97 06 80 1d 80 5a 09 80 1d 80 77 a0 a0 a0
8020 a0 a0 a0 a0 a0 a0 06 80 30 80 5a 01 80 71 80 77
8030 43 48 41 49 ce 45 52 41 53 c5 4c 4c 49 53 d4 4c
:
:
fbc0 e1 7e 9b 50 7e 8d d1 7e af 1a 7e 96 63 7e b2 34
fbd0 7e b0 ee 7e af 11 7e cc 37 7e af 97 7e ce dc 7e
fbe0 ce df 7e b0 44 7e e3 4d 7e da f9 7e da ef 7e d4
fbf0 df 7e c2 8c 7e c6 7a 7e da f6 f1 7d 86 84 84 8b

このままCOEファイルに変換するか、あるいはバイナリにすれば、前稿のスクリプトが使えますが、簡単なのでこのままawkによりCOE化することにします。

ネットで入手したFM-7エミュレータ用のROMデータと実機から吸い上げた生データを比較したところ、fbasic30.coeは全てのバイトが一致しました。 一方boot.coeは末尾の2 lineが不一致となりました。エミュレータ用のROMでは0xffとなっていますが、実機のROMは割込みベクタが置かれているためにデータが入っています。

エミュレータ用ROMの末尾32バイト:

ffe0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
fff0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

実機ROMの末尾32バイト:

ffe0 ff ff ff ff ff ff 01 04 ff ff ff ff ff ff ff ff
fff0 ff ff 01 d1 01 d4 01 e0 01 dd 01 d7 01 da fe 00

ところが、「FM-7ユーザーズマニュアルシステム仕様」を見ると、\$FFE0~\$FFFFはベクトル領域となっており、boot ROMではないため、これで全てのバイトが一致しました。

末尾32バイトはベクトル領域というRAM領域でジャンプテーブルとなっています。飛び先のRAMの内容を含めて表にまとめます。

図%%.3
図158.3 割込みベクタまとめ表

FIRQ割込みハンドラは\$C953から、IRQ割込みハンドラは\$D2FCからのようです。本カードにより(メインCPUを停止し)\$AAを書き込んだところ、以下のようになったため、\$FFE0~\$FFFDはRAM、\$FFFE~$\$FFFFはROMのようです。

ffe0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
fff0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa fe 00


左矢前のブログ 次のブログ右矢

FM-7 ROM吸出し器の製作(2)

posted by sakurai on August 26, 2019 #157

ArduinoとPCはUSBケーブルで接続し、それを通じてプログラムするのですが、そのケーブルを通じて通信することができます。具体的にはArduino側でprintln()関数を実行すると、PC側でArduino IDEの機能であるシリアルモニターを立ち上げておけば、データを表示することができるので、これを利用します。ちなみに、Arduino IDEの機能であるシリアルプロッターという便利なものがあり、Arduino側でデータを出力すれば、IDE側でグラフをリアルタイムで書いてくれ、オートスケールまでしてくれます。

面倒なのはArduino側で並列データの概念が無く、bitの入出力しかないため、アドレスのライトはbitに分解し、データのリードはbitを統合してやる必要があることです。以下にパラシリ、シリパラ変換を示します。

16ビットアドレスの分解(パラ⇒シリ)

int apb = 54;
boolean b;
unsigned address = 0x8000;
unsigned ad;
 :
ad = address;
for (int i = 0; i < 16; i++) {
 b = ad & 1;
 digitalWrite(apb+i, b);
 ad = ad >> 1;
}

このコードの動作図を図157.1に示します。

図%%.1
図157.1 パラシリ動作図解

8ビットデータの組み上げ(シリ⇒パラ)

int dpb = 39;
boolean b;
unsigned data;
 :
data = 0;
for (int i = 0; i < 8; i++) {
 data = data << 1;
 b = digitalRead(dpb-i);
 data = data | b;
}

このコードの動作図を図157.2に示します。

図%%.2
図157.2 シリパラ動作図解


左矢前のブログ 次のブログ右矢

FM-7 ROM吸出し器の製作

posted by sakurai on August 24, 2019 #156

設計編はこちらです。

FusionPCBからベースボードが届きました。今回はベンダによる部品実装は無しで、2層ボードのみの製造なので4.9 USD+配送料と、格安です。 今回は製造に6.85日、DHLによる配送に3.34日かかりました。

図%%.1
図156.1 FM-7ROM吸出しベースボード

ベースボードとArduino Mega 2560 Proボード及び40pinコネクタの写真です。この他に動作確認用のLED及びそのドライバTr、抵抗があります。

費用は配送料別で、Arduino Mega 2650 Proが975円、基板が上記のように522円、コネクタが(写真のコネクタではなく、純正のFCN-365P040-AU)が743円、合計2,240円でした。この他に配送料が若干かかっていますが、2つの目的である、

  • FM-7側にソフトウェアを置かないこと(FM-7側にはファイルシステムが無いため管理できない)
  • 価格が安いこと

が達成できました。

図%%.2
図156.2 部品一式

組み立てました。動作確認をするため、基本動作に無関係なLED等は未実装としています。

図%%.3
図156.3 FM-7 ROM吸出し器


左矢前のブログ 次のブログ右矢

FM-7 ROM吸出し器の設計

posted by sakurai on August 13, 2019 #147

最近はPCB作成が安いので、手配線をすることなく、PCBを試作します。今回もFusionPCBに依頼しました。 基本的にGPIOにアドレスバスと制御信号の出力を行わせ、データバスをリードすることにより1バイトのデータを取得します。メインシステムはこれでOKですが、サブシステムは直接見えないため、サブCPUのプログラムをサブシステム側に送り込み、読み出すことにします。

図147.1にZ80カード端子表を示します。これは、FM-7ユーザーズマニュアルから頂きました。

図%%.1
図147.1 Z80カード端子表

全てArduinoのソフトウェアによりROMを吸い出すため、回路はArduinoボードとコネクタを配線するだけです。トライステートバッファを入れたほうが動作は確実になるかもしれません。初期状態でArduinoが勝手にポートに出力すると、FM-7内部バス競合が起きるためです。それを防ぐために、Arduinoの電源を後から入れています。

図%%.2
図147.2 論理回路図

図147.3に基板図を示します。上側の長方形にArduino Mega 2560 Proを搭載します。2.54mmピッチスルーホールに基板接続用コネクタを実装し、メザニンボードとして接続します。

下側の長方形にはZ80カード用40Pコネクタを搭載します。本来はFCN-365P040/AUというコネクタを取り付けるのですが高価なので、汎用2.54mmピッチの40Pのコネクタで代用します。代用品の2.54mmピッチ40Pコネクタではコネクション不良となるため、純正の富士通 基板接続用ピンヘッダ FCN-360シリーズ 40極 2.54mm 2列 ストレート、メーカー型番 FCN-365P040-AUをオーダーしました。合わせて富士通コネクタ メタルフィット FCN-360シリーズ、メーカー型番 FCN-360A2及びネジ(M2.6x10)が必要です。これはハンダ付け箇所にカード挿抜力がかかり、ハンダクラック等によるコネクション不良を防止するためのものです。

図%%.3
図147.3 コネクタ及びメタルフィット

図%%.4
図147.4 レイアウト図

FM-7 ROM吸出し器のガーバーデータです。

図%%.5
図147.5 FM-7ROM吸出しベースボード表面

図%%.6
図147.6 FM-7ROM吸出しベースボード裏面


左矢前のブログ 次のブログ右矢

Arduino Megaスケッチの作成

posted by sakurai on August 12, 2019 #146

USBによる通信の確認として、Blinkスケッチを実行してみます。

aruduinoのページからSoftware Downloadsを選び、IDEをダウンロードして解凍します。次にarduino.exeをクリックしてIDEを立ち上げます。

図%%.1
図146.1 解凍フォルダの内容

図146.2を参考に、以下のように設定します。

  • ツール⇒ボード⇒Arduino/Genuino Mega or Mega 2560
  • ツール⇒プロセッサ⇒ATmega2560 (Mega 2560)
  • ツール⇒シリアルポートでCOM ?(場合により変わる)

図%%.2
図146.2 ボード、プロセッサ、シリアルポートの設定

シリアルポートを確認する場合は、デバイスマネジャーを立ち上げて、ポート(COMとLPT)の下の階層にて、USB-SERIAL CH340 (COM ?)の番号を選択します。

  • ファイル⇒スケッチブック⇒Blink

スケッチブックからポートD13をON/OFFするBlinkというスケッチを選択します。オシロスコープで見やすいように、以下の赤字のように修正しました。

// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1); // wait for a millisecond
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1); // wait for a millisecond
}

これをコンパイルして、以下のステップでボードにプログラムを書き込んだところ、正しく実行できました。

  • スケッチ⇒検証・コンパイル
  • スケッチ⇒マイコンボードに書き込む

図%%.3
図146.3 D13の波形

ポート13の波形は、5.28Vp-p、496Hzの方形波となりました。Arduinoから5V出力ができるということで、レベル変換バッファは不要となります。IOLの計算が必要ですが、FM-7バス直結可能と思われます。通常ならユニバーサル基板で試作するところですが、配線が多くて面倒なので、最初からボードを起こすことにします。

前稿のシーケンスの通りにI/Oポートを設定します。


左矢前のブログ 次のブログ右矢

Arduino Mega 2560 Proの入手

posted by sakurai on August 10, 2019 #145

FM-7のROMデータ抜き出し法は各種ありますが、RS232Cやフロッピードライブ、カセットテープ等、いずれもFM-7のI/Oを用いています。例えばRS232Cの場合は、FM-7上にプログラムを配置し、シリアルデータとして抜き出す方法。この場合はそのプログラム配置ができないため、手で入力するしかありません。別の方法としてはフロッピーディスクを接続し、そこからプログラムをロードし、それを実行してフロッピーに書きこむ方式。

フロッピーディスクドライブは高価で場所も取るため、別の手段を考えます。条件はFM-7側に一切プログラムを置かない方法です。カセットテープというわけにもいかず、FM-7のメディアが無い以上、FM-7側のプログラムを一切使わない方法として、Z80インタフェースを使用することを考えます。

Z80カードは、FM-7の内部バスに対して、別のバスマスタを使用可能にするものであり、メインCPUである6809から\$FD05のLSBを1にすれば、メインCPUにHALTがかかり、外部バスマスタであるZ80による内部バスアクセスが可能になるものです。

手持ちのBeagleBoneでROM抜きボードを作成しようと思っていました。これだと外形的に厚みが出てしまい、それを避けるためにはZ80コネクタとBeagleBoneをイクステンションボードで接続する等、ボードが無駄に大きくなりそうでした。別の方法を検討したところ、Arduino Mega 2560 Proという薄型のボードを見つけました。原理としては同じで、シリアル通信でボード上のCPUと通信し、そこからZ80インタフェースを通してFM-7のバスマスタとして内部をアクセスする方式です。

図%%.1
図145.1 Arduino Mega 2560 Proボード

図145.2にボード接続図を示します。Arduino MegaはI/Oが非常に多いため、このような30本近くあるI/Oも楽に制御可能です。

図%%.2
図145.2 ボード接続図

アクセス法は図145.3にあるように、アドレスをセットし、制御信号(RWB/EB/QB)を制御して、1バイトずつ読み出しを行います。EB、QBの順番は6809と逆なことに注意。リードに関してはQB、EBの順でも動作しますが、ライト時にQBの立ち上がりでデータ確定していることが必要です。これを繰り返すことで全ROMの読み出しを行います。サブシステムのROMは直接読み出せないため、メンテナンスコマンドによりサブCPUにプログラムを実行させ、読み出します。

図%%.3
図145.3 アクセス方法


左矢前のブログ 次のブログ右矢


ページ: