FM-7のZ80スロットを使う拡張カードII

Z80スロット(インターフェース)でMPU(CPU)の切替の仕組みに興味を持ちましたので
12月9日に紹介しました、桜井様から頂いた基板に手を加えてみようと思いました。
より確実に動作させるためにはバッファを追加すると良いとのアドバイスを受けて
ましたので稚拙ながら、74LS245、74LS244 を ATmega2560 と Z80スロットの間に
入れる試みです。下に回路図と配線図をアップロードしましたので御覧下さい。
「 ATmega2560 → 6809」の仕組みは$FD05の0ビットに「LOW」を設定するとZ80W信号が
「1」になりますが、そのタイミングに合わせハード的にATmega2560の出力を遮断します。

$FD05の0ビットに「LOW」を設定できる機能を持つICは「6809」が停止してる条件下では
「ATmega2560」以外にありませんがZ80W信号が「1」になった瞬間に「6809」は動作を
始めるので「ATmega2560」の出力を瞬時に停止しなくてはなりません。(バスが衝突します)

基板に対応したコードを用意して動作確認したいと考えてます。なお基板の発注は年明けです。

https://onedrive.live.com/?authkey=%21Aln7kHlkHDL28EE&id=6357DCB7DCA88133%21108&cid=6357DCB7DCA88133

因みに「6809 → 他のMPU(CPU)」の操作は$FD05の0ビットに「HI」を設定します。
それにしても最近のICをMPUとして使えるとは発売から40年近く経つのに色褪せない粋な仕様ではないかなと。

今年も残り4時間ほどになりましたが、それではまた来年も宜しくお願いします。

<訂正:2020年1月12日>
「onedrive」のリンクが間違っていたので修正しました。
スポンサーサイト



FM-7用FT245RLユニット専用BOOTROM

FT245RL基板を作った目的はFDDがなくても、現在メインで使ってるPCと
FM-7間でデーター転送することでした。しかし最初にアクセスルーチンは
データーレコーダーからロードする必要がありました。そこでBOOTROMに
読み込みルーチンを埋め込めばFT245RL基板だけでデーターレコーダーも
必要なくなるのでは考えBOOTROMの改変をしました。ただし起動時から
標準の補助記憶装置のようにアクセスルーチンを組込む訳ではありせん。
一旦ROM-BASICが起動した後に、ROM内のローダーをコールすることで
読み書き用のアクセスルーチンをFM-7のメモリに展開します。尚ROMから
FDD起動コードを削除しましたので起動時にFDDは使えません。FDD起動
コードを削除してアクセスルーチンに使用したと言うことです。
また説明してる内容が判る方のみ自己責任で行って下さい。

・<ROMライターと消去されてEPROM(2716)が必要です>
はせりん氏のサイトを参考にすればFM-7のbank3が空いてます。
http://haserin09.la.coocan.jp/fm7rom.html

MB8516(2716、2Kバイト)で$0000-$17FFはオリジナルファームの
まま $1800-$1FFF には改変した下のコードを置いて印加して下さい。
ファーム用のイメージはBOOTROM20191215.dat(512バイト)です。
https://onedrive.live.com/?authkey=%21Aln7kHlkHDL28EE&id=6357DCB7DCA88133%21108&cid=6357DCB7DCA88133

なお2732でも代用可能ですが、前半と後半を2Kバイトに分けるとして
$0000-$1FFF と $2000-$3FFF は同じ内容にして下さい。2732の後半が
2716のイメージになります。

・<改変したBOOTROM使い方>
1)ディップスイッチの1、2とも「off」にして改変したブートが使えます。
因みにディップスイッチの1、2とも「on」であれば 通常のBASICの起動に
なります。

2)ROM-BASIC が起動したら常用PCから「FMDRV37_20190719.dat」を
FM-7に送って下さい。(WindowsならFM7_DATA_TRNS.EXEを使って下さい)
この後、FM-7 で EXEC $FE12 <リターン>とすればアクセスルーチンが
FM-7 の $7812 - $7878 に展開されます。この後、アクセスルーチンの
使い方はブログの先頭に書いた内容とエントリアドレスでオフセット値が違う
だけです。例えば「受信ルーチン」は先頭アドレス、末尾アドレス +1 を
それぞれ $7802-7803 $7804-7805 に設定し EXEC $7812 <リターン>
とします。その前に常用PCからデーターなりマシン語コードを転送する必要が
ありますけど。

3)改変した範囲をディスアセンブルした結果は「BOOTROM20191217.TXT」
として BOOTROM20191215.dat と同じ所に置いてます。通常のBASIC起動で
$FE00 - $FE60 に手を加え、FDDの起動を削除して、簡易的な起動コードと
拙作の「FMDRV37_20190719.dat」用のローダーに置き換えました。因みに
FT245RL のローダーは $FE0C - $FE3F です。256バイトまで受信可能です。
コールドスタートとホットスタートだけ場合分けしてます。なお確かめては
いませんが FDD の BIOS は残して(いると思い)ます。

・Windows用の FM7_DATA_TRNS.EXE を多少使い易くしました。
COMポートで FTDI製のUSB製品(例えばFT232RL等)も使ってる場合は
同じドライバを使ってることが原因なのか、取得したCOMポートでオープンに
失敗が発生することがあります。この時はデバイスマネージャーで空いてる
ポートを調べて、FT245RLが使うポートを再設定できるようにしました。
設定する際は単に「6」や「11」等で、数値のみ入力して下さい。

2020/02/08(土) ポートの再設定の説明を修正しました。

・桜井様製作の拡張カードに関して
同じ FM-7 でも新品で買った FM-7 は改造したくない思いがあります。
ですのでデーターレコーダーが使えなくなった時の予備として桜井様製作の
拡張カードの考え方は使わせて頂く予定です。更にブートローダーとしての
使い方以外にも Arduino を苦労も伴わず入門できて、大きな収穫でした。

FM-7用のBOOTROMであれば専用ですので便利ではありますが発展性に乏しく
Arduino では早くもをスーパーファミコン等のROMの取得に使えるのではと
いつもの如く妄想が膨らんでいます。

それではまた。

FM-7用データ転送ハードのI/O

今年の8月末まで利用していた「Yahoo!ブログ」のURLに終了の知らせが貼ってました。
2019年12月15日に終了となっていましたが午前中は削除されておらず、残ってました。
一抹の寂しさはありますが心機一転(?)ここで相変わらずノンビリ書き足して行こう
と考えてます。正当な理由があり「FC2ブログ」にしましたが他のブログと同じ内容は
規約違反なので、FT245RLを使う拙作の「FM-7用データ転送ハード」のI/Oについては
補足を控えてましたが「I/O」を追記します。なおソフトはブログの先頭にあります。
また、受信バッファ、送信バッファ とはFM-7側から見たFT245RLのバッファです。

・FM-7用のFT245ハード(基板)のI/O
$FDFD = コマンドレジスタ (Bit0=RD, Bit1=WR)
$FDFE = ステータスレジスタ
(Bit7 を受信時に使用する Bit7=0 なら受信データあり )
$FDFE = データレジスタ
( 送受信共通、受信時は下位 7 ビットのみ有効 )

・FM-7側の1バイト受信のシーケンス(手順)
<概要>
FT245RLの受信バッファにあるデータをFM-7に取得する
<シーケンス>
$FDFEをリードしBit7=0なら$FDFDのBit0を1にする。
$FDFDにデコードされてる74LS74を介して$FDFEにデコードされてる74LS244に
FT245RLの受信バッファの内容が複写されるので指定の格納領域に転送する。

・FM-7側の1バイト送信のシーケンス(手順)
<概要>
データを74LS374に設定後、送信バッファに転送する
<シーケンス>
74LS374にデータを転送後に無条件に$FDFDのBit1を1にする。
既に昔のMPUとなってる6809の速度であれば送信バッファの状況を確認するまでもなく
指定領域に格納されてるデータを$FDFEにデコードされてる74LS374に転送後
$FDFD にデコードされてる74LS74を介して FT245RL の送信バッファに転送する。

・KiCAD で作成した回路図は下にあります。
https://onedrive.live.com/?authkey=%21Aln7kHlkHDL28EE&id=6357DCB7DCA88133%21108&cid=6357DCB7DCA88133

それではまた。

Z80I/F(非Z80)用基板でソフト的に 6809 に制御を戻す試み

桜井様が公開したコードは判りやすいので全体の把握は容易です。
自分が追加したコードは「writeCPUSw」だけですが、この関数は
桜井様が実装した「writeByte」の機能・構造を真似てます。
(自分が日本人だなと思う瞬間です)全体を把握した後はコードの
流用で機能の実現を試みました。以上の背景をもって説明しますが
現状では 6809 の復帰に失敗することもあります。

1)アドレス「0xFD05」に「0」を書き込み、バスの支配権を
6809 に戻す試みをしてます。setAddress(address);
digitalWrite(32, LOW); // set (0bit) LOW

2)その際に、フリップフロップには RWB=WRITE の状態で
「EB=0 → EB=1」のパルスを与えます。

3)一定時間「EB=1」にすれば「z80w==HIGH」になりますが
この直後に6809は動き出し、ATmega2560 も出力してるので
バスで衝突が発生してると考えます。ですのでこの衝突する
時間は長くできません。と言って短くても「z80w==HIGH」に
なりません。何回か試行した結果で下記辺り?になりました。
digitalWrite(40, HIGH); // EB=1
delay(0.09);

delay() が長いと衝突が長くなり、影響が大きくなる感じで
短いと、そもそも「z80w==HIGH」になりません。

4)「z80w==HIGH」になった後は、なるべく短時間で
ATmega2560 の出力だったピンを入力に変えるコードを
入れてます。(ただ願いとは裏腹に空回りの可能性もあり)

5)なお ATmega2560 のピンとポートの対応表は
下記のサイトを参考にさせて頂きました。
https://ht-deko.com/arduino/portregisters.html

<以下、writeCPUSw のコードです>
void writeCPUSw(unsigned address) { //20191207
boolean z80w;

if ((z80w = digitalRead(41))==LOW) {

d_pin_input();
a_pin_output();

setAddress(address);
pinMode(42,INPUT); // QB input
pinMode(32,OUTPUT); // data D32(0bit) outputmode
digitalWrite(32, LOW); // set (0bit) LOW
digitalWrite(43, LOW); // RWB=WRITE

// クロックの立ち上がりでラッチ
// http://www.coins.tsukuba.ac.jp/logic-system-jikken/PDF/HD74HC74.pdf
pinMode(40,OUTPUT);
digitalWrite(40, LOW); // EB=0
delay(0.4);
digitalWrite(40, HIGH); // EB=1
delay(0.09);

#if 0
for (int i = 0; i < 16; i++) { // address
pinMode(apb+i,INPUT);
}
#endif

// 20191206 ピンモードの高速変換(出力 → 入力)
DDRG = DDRG | B00000000; // data D40 EB port inputmode
DDRF = DDRF | B00000000; // address(0-7) port inputmode
DDRK = DDRK | B00000000; // address(8-15) port inputmode
DDRL = DDRL | B00000000; // data D43 RWB=WRITE port inputmode
DDRC = DDRC | B00000000; // data(30-37) port inputmode


}

}

<補足> 2019/12/10(火)
1)即日の投稿の内容に経緯・動機を、より詳しく述べてるため加筆してます。
2)「z80w==HIGH」と書くべき所で「z80w==LOW」だった部分を修正しました。

交換して頂いた基板の試用報告、第三弾

前回の「Z80インタフェース用基板」と拙作の「FT245RL用基板」とのコラボです。

「FT245RL用基板」を製作した目的は早晩使えなくなるFDDの対策であるとは、既に
言及してますが、現在FM-7で最初のプログラムを動作させるためにデータレコードを
使ってます。しかしこれも早晩使えなくなる可能性があります。前回紹介させて頂いた
桜井様はそもそもFM-7に補助記憶装置がなくてもFM-7のメモリへの読み書きを目的と
して製作したそうです。そうならFM-7の起動コードを桜井様製作の基板でFM-7の
メモリに書き込み、その後、制御がFM-7に戻れば既製品の補助記憶装置がなくても
FM-7のユーティリティやアプリが動くのではないかと考え、その機能を目指しました。

それができたら拙作の「FT245RL用基板」は必要なくなるかと言うと、そうではなく
ユーティリティやアプリが16進数の生データであれば自在に送受信できる、拙作の
「FT245RL用基板」も有用と考えてます。なお、Arduinoを自在に操作できる方は
ArduinoだけでFM-7と自在に送受信できる可能性を否定する訳ではありません。

例によって前置きが長くなりましたけど使い方を説明し、Arduinoの「sketch」を
公開します。なお「sketch」とはArduinoで動作するプログラムのことです。
C/C++がベースだそうですけどアセンブラも使えます。今回の機能の実現のために
自分も使ったかも知れません。(先月末から使い始めたので詳しくは知りません)
そう言う状況なので、間違いがある時は優しく御指摘して頂けば嬉しいです。

<使い方>
1)「sketch」を書く(前回、説明してます)時は基板をFM-7に装着しても
FM-7の電源は入れないでください。「sketch」を書いた後は自分はGTKtermで
「Hello world-5」「Hello world-6」等が不規則に出力することを確認
してます。(FM-7の電源はオフ)なお「sketch」は下にあります。
「sketch_FM7FT245RL20191202arduino.info.ino」
https://onedrive.live.com/?authkey=%21Aln7kHlkHDL28EE&id=6357DCB7DCA88133%21113&cid=6357DCB7DCA88133

また同じサイトの「ReLease」の下に拙作のFT245RLで使うFM-7用のコードと
対応するWindowsの実行形式があります。その他 KiCAD で書いた回路図もあります。
eagle で作成した回路図と仕様が変わった訳ではありません。ご指摘を受けて
見易く修正しました。

2)USBケーブル(ATmega2560はマイクロBのスマホ用です)を一旦抜いた後に
FM-7の電源を入れ、再度USBケーブルを接続すると6809が動作してますので
「Hello world-2」の次に「Hello world-6」が連続して出力します。
(自分はGTKtermで確認)

3)AUTO コマンドでFM-7上で下のBASICコードを作成して下さい。
10 POKE &HFD05,1 (6809が停止します。Z80搭載時にはZ80が動作します。)
20 AUTO LIST (←ここはシンタックスエラーで構わないです)

4)上記のBASICコードを「RUN」して下さい。
6809が停止しFM-7のバスを明け渡しますのでATmega2560が自由にFM-7の
メモリにアクセスできます。この後「sketch」に書いてる[loop]内の
「Z80w == LOW」のコードを実行し、最後にFM-7の「&HFD05」に「0」を
書き込み所定の処理を終えた、約1.7μ秒後にATmega2560はFM-7のバスを
明け渡します。(この間2秒以内)40ピンのインターフェース&Z80に詳しい人の
見解があればと考えますけど、FM-7の「&HFD05」に「0」を書き込んだ直後から
6809は動き出し、この時はまだATmega2560はバスを明け渡しておらずバスの衝突は
発生してると考えます。しかしバスの衝突時間が極めて短ければ、その後の6809の
動作に大きくは影響しないと期待しました。結果は期待した通りになりました。

GTKtermで確認すると「Hello world-2」の次に「Hello world-6」が連続
して出力し、「POKE &HFD05,1」を実行した時は「Hello world-3」の次に
「Hello world-4」が現れ、その後「Hello world-6」が連続します。

5)このままの状態ではFM-7は停止したままですが、ホットスタートにより
FM-7 に制御が戻ります。ホットスタートをするには先ずは「BREAK」を押し続け
リセットボタンを短時間押し、ゆっくりとリセットボタンを離し、その後
ゆっくりと「BREAK」を離してください。

6)このFM-7に書き込まれたコードを直ぐ実行したい所ですけど支障なく
動くコマンドとリセットがかかるコマンドがあります。直後の EXEC は
リセットがかかるコマンドでした。モニタの「D」コマンドはOKですが
「G」コマンドはNGでした。モニタの D 7800 でメモリをダンプします。
それで FM-7 に制御が戻った時は慌てず「LIST」コマンドをして下さい。
そうすると(3)で作成したリストが出ます。(普通の使い方をしてる訳で
ないので当然と思わないで下さい)この後、実は「sketch」にある
exec_data[] ですが、拙作基板のコードが使える状況になります。
exec &H7812 <リターン> として改めて、どこか他のアドレスに
「読み書き」コードを展開するとか。因みに exec_data[] にある
コードはローダ部分(読み)だけです。

その他、自作のちょっとしたユーティリティをロードする時に使えるのでは
と考えます。

7)補足
桜井様より基板を譲り受ける際に本来はバッファを入れると良いと説明を
受けてます。これが、すんなり制御が戻らないことと関係してるのではと
考えます。「FM-7のシステム仕様書1-66」で動作してるCPU(MPU)は
左下にあるフリップフロップ(恐らく74LS74)で管理・保持してると
考えますが、Z80カードであればZ80が停止した直後にバスの出力を停止
させる仕様と考えますけど、今回の基板は簡略化のために省いています。
ですので 6809 が再動作した後も1.7μ秒(アセンブラ5命令分)間は
ATmega2560 もFM-7のバスにいて衝突するのではと考えてます。

何かありました御意見お待ちしてます、御質問は判る範囲で応えます。
ただし勘違いで間違う時があることを御了承して下さい。

それではまた。

<訂正・追加>2019/12/09(月) 12:40
1)「POKE &HFD05,1」を実行した後に「Hello world-6」が連続して
出力するまでの時間を「5秒以内」 → 「2秒以内」と訂正しました。

2)アセンブラ5命令の実行時間「75ナノ秒」 → 「1.7μ秒」と訂正しました。
また、その根拠は「Arduino処理速度とメモリー使用改善の策」とします。
http://cammy.co.jp/technical/2016/01/17/arduino_003/

digitalWriteは1行で44サイクル、約4~5μ秒かかりますが、
ポート直接制御では1行で3サイクルしかかかりません。
上を根拠に (5/44)*3 = 1.7(μ秒)

プロフィール

vehwk3yxv7hw

Author:vehwk3yxv7hw
今から40年近く前に発売されたFM-7
と言う8ビット機のデータ管理を
現行PCでできるようにしましたが、
この程度の作業でも1年以上かかり
ました。とは言え現行PCでデータが
管理できれば昔のPCでも間接的とは
言えインターネットに接続してると
考えました。昔からFM-7用基板を
製作したい思いもありました。
FM-7の機能追加としてソフト的に
あと一つ残ってます。某ブログを
利用し公開してましたけど閉鎖に
伴いココを新発信基地とします。
思いはFM-7のハードに止まらず
昔のゲーム機の機能も拡張も考えて
います。尚写真は30年以上前です。

検索フォーム

ブロとも申請フォーム

QRコード

QR