2020年2月28日金曜日

2DDドライブと2Dドライブの混在の工夫

Step Doubler回路を用いて2DDドライブと2Dドライブを混在させる


中国の業者に発注したFDCカードとZ-80カードの基板が十日もあれば届くと思っていたのに、一か月を過ぎても届かないので、予定していたことが全く進みません。。。
ということで、今回はほんのちょっとした工夫の報告です。

10月26日のブログ(12月31日に追記あり)で、FM-7でPC用の2DDドライブを使用するという報告をしましたが、それは自作のFDCカードの中でMB8877AからのSTEP出力を2倍化するというものでした。
従って、適用できるのは2DDドライブのみということになるわけですが、実際の運用としては、5インチとのメディア変換などで2Dドライブも接続したい場合があります。

そこで、FDCカード中でStep信号を2倍化するのではなく、2DDドライブの直前のフラットケーブルの途中に挿入することにしました。さらに、ドライブのコネクタ部で行っていたドライブセレクト信号の切り替えとReady信号生成も同じ基板に載せました。

この形ですと、市販の2DドライブのFDDシステムをお持ちの方でも、別途2DDドライブを用意して、この回路を通してドライブに接続することで、2DDドライブを使用できることになります。

作成した基板です

Ready信号生成回路を後付けしたので見苦しいですが、基板中央の8ピンICがStepDoubler回路のATtiny85で、その出力を7438を通してFDDに送っています。外付けの8ピンICがReady信号用のPIC12F675です。ドライブ0と1の切り替えジャンパとStepDoubler回路のバイパス用のジャンパがあります。


基板


回路図を示します。

手持ちの7438を用いていますが、3.5インチの2DDドライブは負荷としてはそう大きくはないので、7406でも大丈夫だと思います。

回路図

Ready信号の生成部ですが、以前のブログで紹介した2つの回路のうちのPIC12F675を用いてIndex信号とMotorOn信号からReady信号を生成する回路を用いております。
最初はダイオードによる簡便な回路で製作しましたが、残念ながら正常に動作しませんでした。ドライブがセレクトされたときには常にReady信号が出るのがまずいのでしょうか。PICを用いた回路では、正常に動作しています。


動作風景です。

画像で分かりますようにフラットケーブルの途中に基板を入れ、基板を通さずに2Dドライブを、基板を通して2DDドライブを接続しています。
FM-7に刺さっているカードが自作のFDCカードで、これに載っているStepDoubler回路はスキップしています。


動作風景

ディスプレイは小さいので左の棚の上に置いています。

画面表示


私は、通常は2DDドライブ2台で運用しているのですが、2Dドライブが必要な場合はこの回路を用いてFM77AV1から外した2Dドライブ(YD-625)と2DDドライブ(FD-235HG)とで運用しています。メディア変換が必要な場合にはYD-625の代わりに5インチドライブを使用しています。

改良すべき点として、ATtiny85とPIC12F675を一つのICに置き換えることがあるとは思いますが、当面はこのままで使用するつもりです。

2020年2月1日土曜日

FM-7用のZ80カードを製作してみましたが...


いじって遊べるFM-7用のZ80カードが欲しい


手元に今でも動作するFM-7用のZ80カードとCP/M-80システムがあるのですが、そのカードの6809とZ80の切り替えの仕組みに興味がありました。
でも純正のZ80カードも古いですし、あれこれいじっていて故障させてしまうのは怖いので、いじり倒して遊べるZ80カードが欲しいと思っていました。

まず最初にFM-8用の倍速化した回路で製作してみました


インターフェース誌1983年7月号の村上啓司さんによる「FM-8を高速化する」という記事中に倍速化したFM-8用Z80カードの回路図が載っており、そのコネクタ信号がFM-7と同じようでしたので、もしかしたらFM-7でも動くのではないかと考えました。


FM-8用の倍速化回路を利用したZ80カード


手持ちの富士通製の純正Z80カードは19個ものICを使用していますが、この回路は11個と少ないのでサイズも小さくできて作りやすいので、ものは試しと製作してみることにしました。


左:富士通製 右:製作したカード

製作したカードの回路図を示します。
村上さんのFM-8の高速化の回路と倍速化Z80カードの回路のうちのZ80カードの部分のみにFM-7用の32Pコネクタをつけただけです。


FM-8用倍速化Z80カードの回路を利用しました


プリント基板を作り、試作してみました。
最初は、例によって全く動作しなかったのですが、自作したテストプログラムが悪いのかそれとも回路がダメなのかが分からずお手上げ状態でした。
そんな時に、WebでI/O誌の1985年9月号に掲載されたFM-7用Z80カードの製作記事を見つけ、その中のテストプログラムを利用することができ、ハードの調査に専念することができました。
あれこれと思いつく箇所を変更してみたりしていたのですが、結局、使用した手持ちの古いセラミックコンデンサ(1000pF)がショートしていたため74LS00の出力段を破損していることを見つけて、ICとCを交換して無事にテストプログラムが動作するようになりました。

動作中の様子を示します。
(画像中のディスプレイはWindows用で、FM-7用のディスプレイは左側に配置してあるので写っていません。)

動作中の様子(右基板がZ80カード、左はFDCカード)



次に、動くことは期待していなかったのですが、試しに富士通のFM-7用のCP/M-80を走らせてみました。

CP/M-80の起動画面


最初は画像のようなオープニングメッセージが表示されたところでハングアップするか、あるいは入力を受け付けたところでハングアップしてしまいました。
画面表示ができることや、入力を受け付けるときもあること、そして、2台のFM-7で微妙に動作が異なることから、メモリアクセスのタイミングに問題があるのだろうと考えて、とりあえず1000pFにCを並列に加えて容量を変えてみました。値を増やすと徐々に正常な動作に近づくのですが、それでも時々エラーでハングアップしてしまいます。
結局は、これも1000pFのコンデンサの不良(容量抜け?)が原因で、コンデンサを交換することで無事に動作しました。(1000pF~2000pFの範囲で正常動作しました。)

CP/M-80が動作している画面を示します。




このZ80カードは正常に動作すると思ったのですが...


ところが、何とこのZ80カードはもう一台のFM-7では正常に動作しないのです。
CP/M-80では起動画面でハングアップしますし、上記のテストプログラム(6809とZ80間のチェンジを8回繰り返す)では途中でエラーで終了してしまい、リストを取ってみるとプログラムが書き変わっています。
どうもNew7ではない同じFM-7でもメモリアクセス周りに微妙な違いがあるようです。

ということで、村上さんのFM-8用の倍速化Z80カードの回路は、そのままでは全てのFM-7で動作するというわけではないということになりそうです。

ならば、I/O誌に掲載されたFM-7用のZ80カードでということになるわけですが、実は、もう既にKiCadで回路図を起こして、修正したFM-FDC基板と共にFusionPCBに発注してあります。(春節とコロナウイルスのために未だ製造にも入っていませんが...)
ということで、I/O誌の回路によるZ80カードが完成し、正常に動作したら報告したいと思います。

2020年1月23日木曜日

FM-7用のFDCカードのプリント基板化完了

FM-7用のFDCカードをプリント基板化しました。


2019年8月26日のブログ「FM77用の拡張I/Oボード、ROM/RAMディスクボードのプリント基板化が完了」の末尾で紹介しました、手配線のFM-7用FDCカードですが、プリント基板化し、ようやく動作確認ができました。

いつものようにいくつかのドジをしてしまい、しなくても良い回り道をしましたが、現在は無事に動作しております。

まず回路図を示します。
2019年10月26日のブログ「FM-7でPC用のフロッピードライブを使う」で示した回路には一個所間違いがありましたので訂正してあります。(Q,E,RW信号からWE信号を作るところです。)
また、Step信号の2倍化回路を追加してあります。


回路図(StepDoubler回路付き)


製作した基板を以下に示します。
およそ12cmx8cmのサイズに計21個のICを何とか収めることができました。
中央の40ピンICがFDCのMB8877A、その右上の8ピンICがデータセパレータの9216B、基板右上隅の8ピンICがStepDoubler用のATtiny85で、その右のスイッチはそのStepDoubler回路のバイパススイッチです。
(ミスのある基板ですので、試作ということで34ピンコネクタの代わりにボックスコネクタを使用したり、FDD用の電源として0.1uのパスコン用の穴にピンを立てて取り出したり、修正をICの足を切断して表面で配線したりしていますので見苦しいですが...)


FM-7用FDCカード


回路のミスのみでなく、FDD用の34ピンコネクタを裏側ではなく表側に配置してしまったり、FDD用の電源コネクタを忘れたりしています。(こんな基板を10枚も作ってしまいました...)
全くダメな基板というわけでもなく、多少の修正で動作するのでまあ良しとします。

もう一度、これらを修正し、FDD用の電源コネクタを追加した基板を作成中です。
このカードのみで普通の2Dのドライブ(あるいはDOS用の2HD/2DDドライブ)を4台まで接続できます。(もちろん、各ドライブにはReady信号を生成する回路が必要ですが。)

一度はもうFM-7ではFDDを使うのはやめようと決めましたし、FDを使わない工夫をされている方々がおられますので(「思い付きハードでソフトに七転八倒」さん、「ysflight.com」さん、「日本橋電気街徘徊日誌」さんなど)、その方々のお知恵を拝借すれば、あえてクラシックなFDDを使う必要もないのですが、大昔、手配線で苦労して製作したFDCカードですので、プリント基板化し、資料として残すことができて満足です。


2020年1月21日火曜日

FM77AV用PS/2キーボード変換器の不具合を修正

FM77AV用のPS/2変換器のビープ音が鳴るという不具合を修正しました


2019年7月19日に公開しましたPS/2キーボード変換器ですが、身近の方々や、ご希望の方に基板やプログラム書き込み済みのATtiny85を配布したりして使っていただいておりました。
最近ある方から、キーを押すたびにビープ音が出て困るというお話をいただきました。
私自身も4年以上使用していましたが、常にボリュームをゼロにしていましたので全く気づいていませんでした。何故か常用しているFM77AV40SXではビープ音は出ませんが、最近入手したFM77AV1では出ました。

キーを押すたびにビープ音が出る原因ですが、RS232Cカードの件でお世話になりましたysflight.comさんのブログによりますと、キーを離したときにリリースコードを発行していないからだということでした。
リリースコードをどのように構成すればよいのか分からず、ysflgith.comさんのプログラムを読んでみたりしていたのですが、40ビットコードを30ビットに変換して処理されていることもあってか処理内容が理解できず、思い余って直接ysflight.comさんに助けを求めましたところ、快く教えていただけました。とても丁寧に解説していただいたのでようやく理解することができました。ありがとうございました。

ysflight.comさんによれば40ビットのコード中の、第4ビットからの8ビットのみを変換すれば良いとのことでした。
ということで処理が必要なのは先頭からの2バイトのみということになりますので、コードを確認したところ、第1バイトは常に0xb4で、第2バイトは0xcc,0xcb,0xb4,0xb3の4通りしかありませんでしたので、それらに必要な処理をした結果は以下のようになりました。
  0xb4, 0xcc -> 0xb3, 0x4c
  0xb4, 0xcb -> 0xb3, 0x4b
  0xb4, 0xb4 -> 0xb3, 0x34
  0xb4, 0xb3 -> 0xb3, 0x33
キーを押下したときのコードの第1,2バイトを上のように置き換えたものをリリースコードとして押下コードの直後に発行することで、無事にビープ音を消すことができました。
その部分のプログラムを以下に示します。



// convert from codeno to serial code
// change keycode to serial code for FM77AV
void outserialdata(unsigned char kcode)
{
 ...
 
  flgE0 = 0;
  flgE1 = 0;
  if (pgm_read_byte(&pscode0[i]) == kcode) {
   cnvcode(i);
   cnvreleasecode(i); // !!! Added to mute the beep !!!
  }
 ...
 
  flgSFTCTRL = 0;
  svsftctrl = 0;
  if (pgm_read_byte(&pscode0[i]) == kcode) {
   cnvcode(i);
   cnvreleasecode(i); // !!! Added to mute the beep !!!
  }
 ...
}


int cnvcode(unsigned int codeno)
{
 unsigned char kc;
 int i; 

 serial2port(0xb4);  // 1st byte
    for (i=0; i<4; i++) { // 2nd-5th bytes
  kc = pgm_read_byte(&fmcode0[codeno][i]);
  serial2port(kc);
    }
 PORTB |= _BV(4);  // PORTB = 0x10(KSDATA=H)
// _delay_ms(20);   // important!!! for 2key pressed
 _delay_ms(1);
    return 0;
}

// convert from codeno to serial releasecode
// only the following four release code patterns to be changed
// 1st  2nd byte
// 0xb4,0xcc -> 0xb3,0x4c
// 0xb4,0xcb -> 0xb3,0x4b
// 0xb4,0xb4 -> 0xb3,0x34
// 0xb4,0xb3 -> 0xb3,0x33
int cnvreleasecode(unsigned int codeno)
{
 unsigned char kc;
 int i; 

 serial2port(0xb3);  // 1st byte
 kc = pgm_read_byte(&fmcode0[codeno][0]); // read 2nd byte
 switch (kc) {
  case 0xcc: serial2port(0x4c);
      break;
  case 0xcb: serial2port(0x4b);
      break;
  case 0xb4: serial2port(0x34);
      break;
  case 0xb3: serial2port(0x33);
      break;
 }
    for (i=1; i<4; i++) { // 3rd-5th bytes
  kc = pgm_read_byte(&fmcode0[codeno][i]);
  serial2port(kc);
    }
 PORTB |= _BV(4);  // PORTB = 0x10(KSDATA=H)
// _delay_ms(20);   // important!!! for 2key pressed
 _delay_ms(1);
    return 0;
}

// serial code out to PORTB(bit4)
// In an 8-bit pattern, the 4th bit is always equal to the 3rd bit
// pulse length (8bit->skip the 4th bit)
//  100us,125us,175us,100us,125us,175us
void serial2port(unsigned char kc)
{
 int i;

    for (i=0; i<8; i++) {
     if ((i+1) % 4 != 0) {  // skip bit3,7
      if((kc & 0x80) == 0x80) {
    PORTB &= ~_BV(4); // PORTB = 0x00(KSDATA=L)
   } else {
    PORTB |= _BV(4); // PORTB = 0x10(KSDATA=H)
      }
  }
  // wait100,125,175us();
     switch (i) {
      case 0:
     case 4:
    _delay_us(100);
    break;
      case 1:
      case 5:
    _delay_us(125);   
       break;
      case 2:
     case 6:
    _delay_us(175);
       break;
      case 3:
      case 7:
       break;
     }
     kc = kc << 1;
 }
}



キーコード番号を得て、それを4バイトのキーコードに変換して出力するルーチン中で
関数cnvcode()に続いてcnvreleasecode()を実行しています。
実際にポートに出力する関数serial2port()も手直ししました。
以前は各ビットの出力時間は全て等しく100usでしたが、ysflight.comさんが実機で確認されています長さに合わせて100us,125us,175us(第4ビットはパス)に変更してあります。

また、以前のプログラムではキーが連打されたときにキーコードを正しく認識するためにcnvcode()の末尾に20msのdeleyを入れていましたが、リリースコードでキーが離されたことを認識できますのでそれが不要となりました。(なしにはできず、1msのdelayは必要でしたが。)
結果として、かなりの高速で連打しても正しく入力ができるようになりました。
OneDriveにプログラムを公開してありますので、詳しくはそちらをご覧ください。

貴重なアドバイスをいただいたysflight.comさんに感謝いたします。

【追記】変換器を購入された方で、ご自分でATtiny85に書き込めない方には、新しいプログラムを書き込んだATtiny85をお送りしますので、私からの連絡をお待ちください。


2019年12月31日火曜日

FM-7でPC用のフロッピードライブを使う(その後の訂正・補足)

前回の報告の一部訂正と動作したFDDが増えたという報告です


前回(10月26日)のブログでは動作するFDDはTEAC FD-235HGのみですと書きましたが、その後、報告の内容に間違いがあることに気づきました。

それは、使用したFDCがMB8877AなのでSTEP信号は正論理であるのに、FM77AV40SXのSTEP信号を観測した際に負論理だったので、STEP信号が負論理であると思い込んでしまったことです。
観測したSTEP信号はFDCの出力端子ではなくFDDへの入力端子でしたのに、完全な勘違いでした。
正しいSTEP信号

STEP信号の2倍化回路はFDCの出力直後に入れていますので、正論理のSTEP信号を処理することになります。

ATtiny85のプログラムを信号の立ち上がりで起動するように訂正し、さらに、パルス幅tとパルス間隔をFM77AV40SXのSTEP信号のパルス幅(1.5ms)とパルス間隔(4.5ms)に合わせました。
(割り込みルーチン内でタイマーによるdelay関数を使用しているのは気になるところですが、STEP信号による割り込み以外は生じないということで大丈夫だろうと判断しています。)

また、端子変換やREADY信号生成回路として、前回はK-ichi's memoさんの「MSXでPC用FDDを使う」中のPIC12F675を用いた回路を使用しましたが、FM77AV40SXで常用しているてきとーに。さんの「FM77AV20/40以降のFDD修理というか交換」中のダイオード1個による簡便な変換回路も製作し、両変換回路による違いも確認しました。


実験風景


その結果、手持ちの13台のFDDで確認した結果は以下のようになりました。
(1)両変換回路で動作
 TEAC FD-235HG (7304,7487,8386) 
 SONY MPF920                             
 YE-DATA YD-702D (6637D) 
 MITSUMI D353M3D (3110 2台)
(2)ダイオード1個の変換回路のみで動作
 MITSUMI D353M3 (2552,2553)
(3)PIC12F675の変換回路のみで動作
 MITSUMI D353M3D (4340,6250 2台)
 MITSUMI D359M3D (4372)

何故かMITSUMIのFDDは末尾にDが付いているものは3110のみが動作しましたが、他はどちらかでしか動作しませんでした。設定が異なるのかもしれませんが、MITSUMIのマニュアルが入手できていませんので原因は不明です。
この結果を見る限り、この用途で使う場合にはMITSUMIのFDDは避けた方が良いようです。

運用上の問題ですが、2DDドライブでディスクを初期化しても2Dドライブのヘッド幅の半分しか初期化できないので、2DDドライブで作成したディスクは2Dドライブでは読み書きできない2DDドライブ専用のディスクになるという問題があります。
(全てが2DDドライブのシステムで完結していれば良いのですが、2Dのシステムとの兼用を考えるとこれがネックとなります。)

この問題を解決するために、FM77AV1を入手し、ドライブ2として手持ちの5インチのYD-274(古い!)を接続し、5インチのF-BASICシステムディスクからAV1の3.5インチの2Dドライブで初期化した2Dディスクにシステムをコピーし、元ディスクとしました。
また、上記の実験で使用した2DDドライブで使用するフロッピーもまずAV1の2Dドライブで初期化したものを使用しました。

2019年10月26日土曜日

FM-7でPC用のフロッピードライブを使う

PC用のFDD(2HD,2DD)がFM-7で2Dドライブとして使用できるという報告です


8月26日のブログ「FM77用の拡張I/Oボード、ROM/RAMディスクボードのプリント基板化が完了」の末尾に、プリント基板化を考えているカードとして、MB8877A使用のFDC基板を紹介しました。
そこでは、STEP信号を2倍化すれば、FM-7にPC用のFDD(2DDドライブ)が接続できるのではないかと書きました。

2倍化するための回路をあれこれと考えていたのですが、ディスクリート回路ではどうも無理なようでしたので、マイコンで実現してみることにしました。
考え方としては、MB8877AからSTEP信号が1つ出たら、適当な間隔をあけて2つのSTEP信号を出せば良いので、マイコンなら簡単そうです。

マイコンとしてPS/2キーボード変換器で使ったことのあるATtiny85を用いることにしました。これなら8ピンとコンパクトですので、FDCカードに載りそうですので。
ATtiny85のINT0割り込みはPB2なので、PB2にSTEP信号を入れ、その立ち下がりで割り込みを発生させて、割り込みルーチン内で2つの信号を出すことになります。

回路図です


参考にしたTEAC FD-235HGのマニュアルによると、STEP信号の間隔は最小3ms(方向転換後は4ms?)で、幅は特に規定されていないようですので、下図のように、幅10us、間隔4msで、2つ目の信号の後は4msの待ち時間を入れました。
(FM-7用のドライブのステップレートは6msまたは20msのようですので、本当は、全体を6ms以内に抑えた方が良いのでしょうが、とりあえずの値ということで...)




STEP信号です

ATtiny85のmain.c部のプログラムを以下に示します。

/*
 * StepDoubler.c
 *
 * STEP PULSE for FDD changes to double pulse
 * input pulse
 * -> output first pulse (pulse width is 10us)
 * wait 4ms
 * output second pulse (pulse width is 10us)
 * wait 4ms
 *
 * PORTB bit2:input pulse, bit4:output pulse (double pulse)
 *
 * Original Version '2019.10.25
 * Copyright (C) by Old68fun
 */ 

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 8000000UL

void setup(void)
{
MCUSR = 0x00; /* MCUSRのWDRFを解除(0) */
WDTCR |= (1<<WDCE)|(1<<WDE); /* WDCEとWDEに論理1書き込み */
WDTCR = 0x00; /* ウォッチドッグ禁止 */

DDRB = 0b11111011; /* PORTB bit2:input, bit4:output */
PORTB = 0x00; /* PORTB not pull up */
PORTB |= _BV(2); /* bit 2:pull up */
PORTB |= _BV(4); /* bit 4:pull up */

MCUCR = (1 << ISC01) | (0 << ISC00); /* INT0 interrupt on falling edge */
GIMSK = (1 << INT0); /* Enable INT0 interrupt */
sei();
}

ISR (INT0_vect)
{
// cli();

// first pulse
PORTB &= ~_BV(4); // DATA bit=L
_delay_us(10);
PORTB |= _BV(4); // DATA bit=H
_delay_ms(4);
// second pulse
PORTB &= ~_BV(4); // DATA bit=L
_delay_us(10);
PORTB |= _BV(4); // DATA bit=H
_delay_ms(4);

// sei();

}

int main(void)
{

setup();

while(1) {
}
return 0;
}


FDCの回路図を示します。
【2020年1月21日追記】この回路には一個所間違いがあります。また、動作している実機と同じであることの確認をまだしていないものです。

FM_FDC回路図です(動作確認はまだです)

MB8877AのSTEP出力(ピン15)と7438の入力端子の間に上記のATtiny85を挿入して改造は完了です。

動作中の様子を示します。確かに2Dディスクが読めて、F-BASIC 3.0が起動しています。

                                        
動作中の様子です


FDDの電源も臨時にATtiny85基板から取っています。

基板の右上の小基板がATtiny85です


2DDドライブとしてMITSUMIのD359M3Dを使用しました。
【'2019.10.27追記】末尾に使用可能ドライブについて追記しました。

使用したFDDはMITSUMIのD359M3Dです

なお、FD用ケーブルとFDDとの接続部での端子変換やREADY信号生成には、以前、FM77AV40SX用にと製作したK-ichi's memoさんの「MSXでPC用FDDを使う」中のPIC12F675を用いた回路を使わせていただきました。蛇足ですが、現在はFM77AV40SXにはてきとーに。さんの「FM77AV20/40以降のFDD修理というか交換」中のダイオード1個による簡便な変換回路を用いています。


端子変換、READY信号生成部です


横から見た様子です


手配線の基板なのでIC数はこれで精一杯でしたが、プリント基板化すればATtiny85も収まりそうです。

FDC基板の全景です

これで、大昔に製作したFDCカードをプリント基板化する動機付けができました。
回路図をKiCadで書き上げたところで止まっていましたが、これから基板パターンを仕上げようと思います。

【'2019.10.27追記】ドライブについての情報を追加します。
使用したドライブ
  TEAC FD-235HG, YE-DATA YD-702D, MITSUMI D359M3D, D353M3D
使用可能なドライブ
  TEAC FD-235HG のみFILES,LOAD,SAVEが可能でした。
他のドライブのうち YD-702D, D359M3DはDISK-BASICが起動し、FILES, LOADは可能ですが、SAVEができません。D353M3DはDISK-BASICの起動すらしませんでした。

DATASHEETが入手できたのは FD-235HG, YD-702D のみですが、STEPパルス幅は0.8us, 1.0us(最小値)、パルス間隔は3ms(4ms), 3ms(最小値)でした。
パルス幅を2us~10us、パルス間隔を3ms~5msに変えてみましたが上記の結果は変わりませんでした。
ということで、現在のところ、対応ドライブはTEACのFD-235HGのみということになります。


【'2019.11.01追記】FM77AV40SXのSTEP信号を実測してみました。
ディスクをアクセスしているときのSTEP信号は下図のようでした。

FM77AV40SXのSTEP信号

何とSTEP信号の幅はusのオーダーではなく、1.5msもありました。2つ目のSTEP信号は4.5ms後に出ていますが、FDDの規格では3ms以上ですから余裕があります。次のSTEP信号までの間隔は20msですが、これはFM-7のSTEP間隔20msという規格に合わせてあるのでしょうか。


FM-7/77用RS-232Cカードの改良版

FM-7/77用RS-232Cカードの改良版を作りました


8月16日のブログでYSFLIGHT.COMさんの回路図を使わせてもらったRS-232Cカードの製作記を載せましたが、一個所ミスがあったのと、ストレートとクロス(リバース)接続を選択できるようにしたいと考えて、改良版を製作しました。
回路図を示します。

RS-232 Ver1.1

製作した基板です。

左:初版、右:改良版

ジャンパ―ピンで、ストレートとクロス(リバース)を切り替えることができます。


今回はミスなし


YSFLIGHT.COMさんの名前入りです



38400baudでの動作


YSFLIGHT.COMさんのブログでは、Intelの8251Aでは19200baudまでだが、C-MOSの82C51Aでは38400baudで動作すると記されていました。
私のところでは、IntelのP8251A('77年製)ではOKで、TOSHIBAのチップではダメでした。
YSFLIGHT.COMさんによれば、OKIの互換チップでは38400baud動作を保証しているということでしたのでebayで購入してみました。2業者から購入しましたら、刻印はMSM82C51A-2RSとM82C51A-2と異なっていましたが、どちらも確かに38400baudで動作しました。

私は9月26日のブログに書きましたように、シリアル変換のADM232を外してジャンパー線で82C51Aの端子をコネクタに直結して、TTL-USB変換ケーブルを介してパソコンのUSB端子に接続して使用しています。

改めてYSFLIGHT.COMさんに感謝いたします。


2019年9月26日木曜日

RS232Cカードに関するちょっとした工夫

より使い易いようにRS232Cカードの使い方の工夫をしました


8月16日や9月25日のブログの画像で分かりますように、RS232Cカードの先にはD-Sub 9ピンコネクタがつながり、その先にストレート接続をクロス(リバース?)接続に変換する変換回路があり、最後はシリアルーUSB変換ケーブルでWindows機に接続されています。

もう少しすっきりさせたいということで、次のように考えました。
1.シリアルーUSB変換ケーブルではなく、普通に出回っているTTL-USB変換ケーブルを用いる。
2.RS232Cカードの出力を最初からクロス接続にする。

1.については、そもそもRS232Cに変換するのではなく、8251Aの入出力をそのまま取り出せばよいのですから、基板上のADM232を取り去って、代わりに画像のようなジャンパ基板をソケットに装着します。


ICの代わりにジャンパー


2.については、現在のRS232Cカードにストレート/クロス切替機能を追加した基板を製作中ですが、現在のRS232Cカードの場合にはケーブルで工夫することになります。
ということで、画像のようなケーブルを製作しました。


TTLクロス出力のケーブル



これで、比較的高価なシリアルーUSB変換ケーブルを使うことなく、低価格のTTLーUSB変換ケーブルが使えますので、見た目もすっきりです。


これだけでOK!すっきり



私はヤフオクでの3~400円程度のものを使用していますが不都合はありません。また、5V仕様だけでなく、3.3V仕様のものでも同じように使えています。
(蛇足ですが、3.3V仕様と言いながらVCCに5Vが出ているものもあるようで、私はこれでPICのICを破壊してしまいました。(泣))

2019年9月25日水曜日

FM-7/77のF-BASIC用の仮想ドライブ構築ソフトが完成

F-BASIC(V3.0)のドライブ2,3として仮想ドライブを構築するソフトが完成


[2020年11月3日]仮想ドライブ構築ソフトのバグ修正版Ver1.2に関して追記しました

[2021年1月13日]仮想ドライブ構築ソフトのバグ修正版Ver1.21に関して追記しました

今まで、FM77AV40SX上でFLEX9とOS-9用にWindows機上の仮想ドライブを構築して、内蔵ドライブ0,1に加えて仮想ドライブを2,3として使用していましたが、最近、常用しているSXに加えて、再びFM-7をいじりだしたこともあり、ディスクドライブを持たないFM-7でDISK-BASICを使いたくて、先日製作したRS232Cカードを使用して何とかしたいと考えていました。
そんな時に、日本橋電気街徘徊日誌さんからプリンタポートに接続するシリアルメモリからDISK-BASICを起動するカードを頂きましたので、これをベースにして仮想ドライブを構築することとしました。

RS232Cを内蔵しているFM77AV以降の機種ではそのままで、FM-7(DISK-BASICが動作する環境が必要)等ではRS232Cカードを追加すれば仮想ドライブが実現できます。これによって、ファイルは全てWindows上のファイルとして保存でき、簡単にDISK-BASICとの間でやり取りできます。
さらに、私の製作した拡張I/OボードのFT245RLやFT232RLを用いたパラレル/シリアルポートを使用することもできます。

全体の構成図は以下のようです。


全体の構成


FM-7用のRS232Cカードは8月16日のブログで紹介したもので、拡張I/Oボードは6月12日と8月26日のブログで紹介したものです。


制作したプログラム


(1)仮想ドライブ構築ソフト FBasDrvWin.exe(Windows側)
基本的な考え方は2018年4月16日のブログ「FLEX用Virtual Driveの作り方」で説明した通りですが、DISK-BASICのFMS(ファイルマネージメントシステム)に相当するものを実装する必要がありますので、エミュレータXM7を用いて、ファイルを追加・削除・名称変更などをする毎に変更前と変更後のDSKファイルの全体を比較し、どこが書き変わっているかを調べるという愚直な手法で調査し実装しました。
手間としては、OS-9のような複雑なシステムではなく、比較的単純なFATシステムですので、それ程大変ではありませんでした。

実際に使用してみると、BASICプログラムについては、Windowsで作成して仮想ドライブにDrag/Dropすることで簡単にDISK-BASIC側に持っていけるのですが、機械語プログラムはそのままでは持っていけないので、S-format形式やHex形式のファイルを読み込んでDISK-BASICの機械語ファイル形式に変換して保存する機能を追加しました。

(2)ドライブ拡張ソフト WINDRVxx(FM側)
基本的にはドライブ番号が2,3の場合にBIOSの8,9,10を切り替えて、仮想ドライブにアクセスするようにすれば良いわけですが、それをどこに置くかが問題です。
参考にしたのは、Oh'FM 1984年11月号に掲載された「裏RAMディスク」(轍名聡さん)です。これを見習ってBIOSの変更部のみを$FC30~に置き、その他は裏RAMの$8000~に置くことで表RAMの消費を少なくすることができました。

後はFMとWindows間の通信に関わる部分のみで、3種類の通信経路を実装しました。
RS232Cの8251A、拡張I/Oボード上の6850+FT232RL(または6850+ADM232)と6821+FT245RLの3つです。

8251Aのプログラムに関して


6850と6821を使用した場合のプログラムは、慣れていることもあり、割とすんなりと作成できましたが、8251Aを使用する方には苦労しました。
FM側からの送信はできるのですが受信ができないのです。F-BASICのプログラムでは問題なく送受信ができることからハードに問題がないことは分かりますし、プログラムも単純なもので、それにRTS/CTSによるハードウエア制御を加えただけで、6850では同様な制御がちゃんとできています。
この問題に一ヶ月以上を費やしましたが、ネットにも8251Aを機械語でハードウエア制御した例は見つからず、お手上げ状態でした。そんな時に、ネットのルネサスの質問箱のようなところで、USARTでのRTSは送信・受信の両方を同時には制御できないようだという書き込みを見ましたので、もしかしたらこれかもと思いましたら、ビンゴでした。

つまり、8251AでRTS制御するときには、RxEとTxENを同時にイネーブルにしてはいけないということでした。受信時にはRxEのみをイネーブルにし、送信時にはTxENのみをイネーブルにしなければならないということなのです。その部分のソースリストを示します。

*
MRSTU EQU $40 ;master reset
MODEU EQU $4E ;1stopbit,non pari,8bit,16x
CLRTSU EQU $15 ;RTS=H,ER,RxE,TxEN
SERTSUR EQU $34 ;RTS=L,ER,RxE for receive
SERTSUS EQU $31 ;RTS=L,ER,TxEN for send
TxEMPTY EQU $04
*
*--------------------------------------
* receive from serial port
* (use USART 8251A)
*    A <- port
*
RCVCH EQU *
 LDA #SERTSUR ;RTS=L
 STA SCMD
 NOP
RCV1 LDA SSTS
 ASRA
 ASRA
 BCC RCV1
 LDA SDATA ;get data
 PSHS A
 LDA #CLRTSU ;RTS=H
 STA SCMD
 PULS A,PC
*
*--------------------------------------
* send to serial port
* (use USART 8251A)
*    port <- A
*
SNDCH EQU *
 PSHS A
 LDA #SERTSUS ;RTS=L
 STA SCMD
 NOP
SND1 LDA SSTS
 ASRA
 BCC SND1
 PULS A
 STA SDATA ;send data
 PSHS A
SND2 LDA SSTS
 BITA #TxEMPTY
 BEQ SND2
 LDA #CLRTSU ;RTS=H
 STA SCMD
 PULS A,PC
*

6850では同時にイネーブルにしても何の不都合もありませんので、8251Aのこの制約は何なのだろうかと思います。
知っている方には常識かもしれませんが、どなたかのプログラミングの参考になればと思いますのであえて書き記しておきます。

プログラムですが、メモリ節約のためにすべてに対応するプログラムではなく、別々のプログラムとしました。
 FM-7(8251Aカード)用     :WINDRVU7
 FM77AV40SX(内蔵8251A)用  :WINDRVUX
 FM-7/FM77AV40SX共通(6850+FT232RL用):WINDRVA
            (6821+FT245RL用):WINDRVP (要RTS制御)
の4種類です。


動作中の様子


各部の接続の様子を示します。左上に見えるのがシリアルメモリからDISK-BASICを起動するカードで、プリンタポートに接続されており、電源は拡張ポートから取っています。
左が自作の拡張I/Oボードで、FM77AV40SX用に製作したものですが、インターフェースボードを介して32Pスロットに接続しています。

動作中の様子


Windows機上のFBasDrvWin.exeの画面です。DSKファイルだけでなく、D77ファイルも扱えます。

FBasDrvWin.exeの画面


RS232Cカードと拡張I/Oボードへのケーブルの接続の様子です。

RS232Cカードと拡張I/Oボードへのケーブル


拡張I/Oボードへのインターフェース基板です。単なるピン配置の変換のみです。

拡張I/O ボードへのインターフェース基板


プログラムのインストール方法

インストールするためのF-BASICプログラムを用意しました。インストールの手順書を添付しましたので、そちらをご覧ください。


プログラムの使用方法


(1)FM-7,FM77AV40SX側
起動時にドライブ数として4を指定します。
LOADM "x:WINDRVxx",,R と入力して、必要なプログラムを起動します。

(2)Windows側
FBasDrvWin.exeを起動します。
起動時に同じフォルダ中に.INIファイルがあれば、それを読んでポート番号、ボーレート、ハンドシェークを設定します。
ボーレートはFM77AV40SXで8251A使用の場合のみ19200baud、その他は38400baudです。
処理するディスクファイルをDrive 2や3のボックスにDrag/Dropします。
ディスクファイルの形式はDSK形式とD77(D88)形式のどちらにも対応しています。
ファイルリスト欄でファイルの追加、削除、名称変更ができます。

【制約】2DDディスク対応について
FBasDrvWin.exeは2DDディスクファイルに対応するように制作してありますが、WINDRVxxの方は現在のバージョンではF-BASIC V3.0にのみ対応しています。
F-BASIC V3.3では$FC30からの領域を使っているのか、それとも裏RAMの$8000からの領域を使っているのか不明です。保存領域をずらしてみたりしているのですが、今のところ動作させることができていません。もしかしたらBIOSそのものの場所がV3.0とは違っているのかも。(F-BASICのことは良く分からない。。。)

(FBasDrvWin.exe単独で2DDディスクファイルを処理することはできますので、例えばこれを用いて作成したディスクファイルをエミュレータXM7で使用することもできます。)

(3)F-BASICで扱うファイルの形式(の一部)
(3-1)BASICファイル(アスキーセーブ)
先頭に改行($0D,$0A)があればBASICアスキーファイルと解釈される。
(3-2)BASICファイル(バイナリセーブ)
先頭からプロテクトフラグ($FF,$FE)、UNLIST開始行番号、以降にテキストが続く。
(3-3)機械語ファイル
先頭から$00、データ長(2バイト)、格納開始アドレス(2バイト)、データという形のデータブロックが一つだけ。最後に$FF、ダミー(2バイト)、入り口番地(2バイト)という形の終了ブロックが続く。

WinodwsからファイルをDrag/Dropで追加する場合、先頭の文字を見て、以上の3つを判別してディスクファイルに格納しています。
例えばBASICプログラムをWindows上で作成する場合は、先頭に空行を入れておけば良いということです。また、機械語ファイルの場合はS-format形式あるいはHex-format形式にして放り込めば、機械語ファイル形式に変換されて保存されます。

終わりに


もう使わないだろうと思ってFM-7の5インチ・3.5インチディスクシステムやディスプレイ一式を処分してしまっていたのですが、63C09カードなどがあるので全てを処分するには忍びなく、本体2台とソフトだけは残しておいたのですが、これでフロッピィを使わずにDISK-BASICを使うことができるようになりました。
カードを下さった日本橋電気街徘徊日誌さんに感謝いたします。

制作したプログラム(WINDRVxxはソースとバイナリ、FBasDrvWin.exeはバイナリのみ、インストールに使用するBASICプログラム)をOneDriveに上げておきます。

蛇足というか愚痴というか...
しかし、32Pスロット用のコネクタは入手しにくいですね。1個1,000円近く出せば入手できるようですが高すぎる。ちょっと前には秋葉原の通販で少しは安く買えたのですが、今回注文したら、何と入荷が11月半ばだそうです。(でも待つしかない、トホホ)
手持ちももう切らしているので、工作が進まない。。。

[2020年11月3日追記]
公開したFBasDrvWin.exeにバグが見つかりましたので修正版Ver1.2をOneDriveに上げておきました。

[2021年1月13日追記]
公開したFBasDrvWin.exeにバグが見つかりましたので修正版Ver1.21をOneDriveに上げておきました。(単純なバイナリファイルのドラッグ&ドロップ時の処理の修正)

2019年8月26日月曜日

FM77用の拡張I/Oボード、ROM/RAMディスクボードのプリント基板化が完了

6月12日のブログで紹介しましたFM77用の拡張I/Oボード、ROM/RAMディスクボードのプリント基板が完成しました


拡張I/Oボードの方は比較的単純な回路なのですが、ROM/RAMディスクボードはソフトに合わせて回路をかなり変更したのに、変更記録を完全に取っていなかったこともあり、製作時の記憶をなかなか思い出せず、KiCadの回路図に起こすのにかなり苦労しました。

例によって、勘違いによるミスもあり、修正を余儀なくされましたが、そう大きな修正でもなく何とか修正できました。
今回のミスで最大のものは同じピン数のコネクタで番号配置の異なるものを部品指定してしまったので、配線がでたらめになってしまったことでした。

でも、格安基板の10cmx10cmまでというサイズに収めるためにかなり無理をしましたがなんとか収まったので良しとします。

制作した基板を示します。
右が拡張I/Oボードで、左がROM/RAMボードです。

右:拡張I/Oボード、左:ROM/RAMボード

下画像のように2枚を重ねた状態で使用できます。


重ねた状態

それぞれの基板の回路図を示します。

拡張I/Oボード


ROM/RAMボード


それぞれの基板の部品配置です。
(1)拡張I/Oボード
FM77AVの拡張ポート(アンフェノール50P)に接続します。基板上の68B21にはAE-FT245RL、68B50にはAE-FT232RLとMAX232が接続されており、他に68B40(PTM)があります。(AE-FT232RLとMAX232は排他使用です。)


拡張I/Oボードの部品配置

(2)ROM/RAMボード
68B21を1個のみで4MbitのROMとRAMを制御しています。
ROMとRAMのペアが2組あり、それぞれスイッチで切り替えます。私はFLEX9システムとOS-9システムとで使用しています。RAMはバッテリバックアップされています。


ROM/RAMボードの部品配置

私の使用機器はFM77AV40SXなので、拡張ポートはアンフェノール50P ですので、途中で50Pフラットケーブルに変換して接続しています。
基板の入力を50Pフラットケーブルにしたのは、FM-7でも使用できるようにと考えたからですが、残念ながら、FM-7の拡張ポートには2.5MHzのクロックが出ていませんし、ピン配置等も異なりますので、そのままでは接続できません。
むしろFM-7の場合には、32Pの拡張コネクタの方が必要な信号が揃っていますので、こちらに接続するべきかもしれません。


左がFM77からの50Pケーブル、右がWindows機へのUSBケーブル

これらの基板のみで使用する場合は、本体のドライブが0と1で、ROMがドライブ2、RAMがドライブ3という形で使用することになります。
FLEX9やOS-9のディスクドライブルーチンをフックして、ドライブ番号が2と3の時のみROMやRAMをアクセスするように切り替えるルーチンを追加します。

さらにWindows機上の仮想ドライブを使用する場合には、ドライブ3や2を仮想ドライブに切り替えるルーチンを使用します。使用するFlexDrvWin.exeは以前公開したものがそのまま使えます。

現在は、F-BASICでも使用できるように、FbasDrvWin.exeを作りましたので、F-BASIC側のディスクドライブルーチンをフックするプログラムを作っているところです。



[蛇足]+++++++++++++++++++++++++++++++++++++++++++++
手持ちの過去の製作物でプリント基板化したいものとしては、もう一つ、数十年前に製作したFM-7用のFDD基板があります。


MB8877A使用のFDD基板(表面)

長い間、この基板の先に5インチ2台と3.5インチ2台のフロッピードライブを計4台接続して使用していました。

同(裏面)

今となってはドライブも処分してしまいましたし、特にプリント基板化して製作する必要もないのですが、捨てるのもためらわれるので未だに手元に置いてありますので、プリント基板化して資料として保管しておいた方が良いかなと思うわけですが、迷っている理由が2つあります。
(1)ICが20個もあるので格安基板の10cmx10cmには収まりそうもないのでコストがかかりそう。(恐らく12cmx8cm位になりそう)
(2)昔の製作物なのでデータセパレータとして、アナログでなくデジタルセパレータのFDC9216Bを使用しているので、現在のものよりも性能は落ちる。(特に不都合はないが)
ということで、FDC9216BとMB8877Aは予備も複数保管してあるのですが、KiCadで回路図を書き上げたところで止まっています。
アイディアとしては、現在普通に出回っているパソコン用の3.5インチFDD(2DD,2HD)をFM-7で使用できる基板にすれば使い道があるかなと。STEP信号を2倍にする回路を付加すればできそうな気がするのですが、まだきちんと追及していません。



2019年8月16日金曜日

FM-7/77用のRS232Cカードを作りました

富士通純正のFM-7/77用RS232Cカードの回路図を元にして基板を作りました。


YSFLIGHT.COMさんが富士通純正のRS232Cカードの回路を解析して回路図を公開されていましたので、私もその回路図を元にして作成してみました。

以前、FM-7でZ80カード(とCP/M-80)やOS-9Level1を使用していた頃はRS232Cカードも所有していたのですが、FM77AV40SXがメインになってからは、もう使うことは無いだろうと思ってFM-7一式を処分してしまいました。
ところが最近になって、FDDの代わりにSDカードやWin上の仮想ドライブなどを用いてFM-7を使うという試みをネット上で見ることがあり(shuji_akita2001さん、日本橋電気街俳諧日誌さんなど)、自分もやってみようということで放置してあった残りのFM-7を2台引っ張り出してきました。

まずはWindows機と通信ができなければ話にならないということで、shuji_akita2001さんから頂いたFT-245を用いた基板を使用して始めていました。
そんな中で、YSFLIGHT.COMさんのブログを見て、純正と同じボードを持っているのも悪くないな、FM-7が2台あるのだから2枚作れば良いかなと思って作ることにしました。

YSFLIGHT.COMさんが公開された回路図を見ると75188と75189を使っているので、今どきこれはないだろうということで、この部分をADM232に置き換え、さらに格安基板にするために10cmx10cmに収めることを目標に作成しました。
その結果、ADM232がIN/OUTそれぞれ2セットしかないので8251AのDTRとDSRは未接続となり、純正とは完全互換ではなくなりましたが、この2つを使用したソフトはまずないだろうと考えました。結局、10㎝×8cmのコンパクトな基板が出来上がりました。

回路図を下に示します

回路図(間違いあり)

実はこの回路図には1箇所間違いがあります。ADM232のピン2に接続されているC17はGNDではなくVCCに接続しなければなりません。

間違いを修正して無事に動作したと言いたいところですが、修正中に誤って隣のラインもカットしてしまったことに気づかず、送信はできるのに受信ができないという変な現象に悩まされることになりました。全配線を確認する作業の後、ようやくカットされた箇所を見つけて修理、無事に動作しました。

YSFLIGHT.COMさんは、C-MOSの8251Aなら38400baudで動作したと書かれているのですが、私のところでは、’83年製の8251Aでも38400boudで動作しました。(短いデータの通信しかしていませんが...)

動作している様子を示します。
F-BASICのプログラムでWindows機のTeraTermに送信し、TeraTermからファイル送信されたデータを受信して表示しています。38400baudで動作しています。


動作画面

下画像のようにRS232Cカードから自作のストレート/クロス変換ボードを通してRS232C-USBケーブルでWindows機に接続しています。
また、ディスプレイですが、以前使用していたXRGB-2は処分してしまったので、画像にあるようにFM-7のグリーンディスプレイ端子から自作のケーブルでI-O DATAのTVBOX2のコンポーネント端子に接続し、RGB出力をCENTURYのLCD-10000Vに入れています。
これでも80x25で表示できています。

接続の様子

基板の装着状態です。フラットケーブルで取り出せば、カバーを閉じることができます。

基板のアップ(1)


基板のアップ(2)

基板の表面と裏面を示します。
実は製作で最も時間がかかったのはD-Sub9ピンの工作です。使用したのはD-Sub9ピンのメスコネクタのL字タイプのものです。これの余分な個所をヤスリで削り、ピンをストレート状態に直してハンダ付けしています。(もう少し削って薄くした方が良かったようです...)

完成基板と生基板の表面


同裏面(本来不要な修正線が入っている)

ということで、無事に38400baudで動作するRS232Cカードが出来上がりましたので、FDDもカセットテープもない素のFM-7ですがプログラムを送り込んで動作させることができそうです。

今は、FLEXやOS-9と同様なF-BASIC用の仮想ドライブ構築ソフトFbasDrvWin.exeを作成してありますので、F-BASIC側のDISK BASICのFDDアクセスルーチンをフックして仮想ドライブをアクセスするように切り替えるルーチンを作成中です。
(それにしても、F-BASICをほとんど使用したことがないので良く分からないことが多い...)
素のFM-7なので保存する手段がなく、FM-7側の切り替えルーチンを送り込んで動作を確認という作業を繰り返すのにこのカードを使用しています。
完成すれば、このRS232Cカードではなく、shuji_akita2001さんの基板に置き換えて高速化を図る予定です。

回路図を公開していただいたYSFLIGHT.COMさんに感謝いたします。