ラベル PS/2キーコード変換 の投稿を表示しています。 すべての投稿を表示
ラベル PS/2キーコード変換 の投稿を表示しています。 すべての投稿を表示

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年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年7月31日水曜日

FM77AVにPS/2キーボードを接続する変換器の基板化

FM77AVにPS/2キーボードを接続するためのキーコード変換器のプリント基板化が完了


6月12日のブログで紹介しましたキーコード変換器をプリント基板化しました。
ドジをして作り直したものですから時間がかかってしまいました。。。

右:製作した基板, 左:完成した基板

画像左が完成した基板です。現用のものではリセットスイッチを使用することがなかったので、回路図にはありますが実装していません。



ケースに収めた様子

TAKACHIのケースSW-50に収めた様子。予定通りピッタリです。
左のMini DINコネクタにPS/2キーボードのコネクタを、右の4ピンヘッダにFM77へのケーブルを接続します。(機種交換の予定がなければ、4ピンヘッダを用いずにFM77へのケーブルを直接ハンダ付けする方が良いでしょう。)


本来は自分のための製作物で、公開する予定はありませんでしたが、ご希望がありましたので公開することにしました。
前回のブログのコメント欄にも書きましたが、ごく普通の用途で使うことを想定しており、ゲーム等での早打ちには対応しておりませんので、そのつもりで使っていただければと思います。キーコードとキーコードの間に若干のウエイトを入れないとキーコードを正しく認識できなかったためですが、ソースも公開しますので、必要なら修正することも可能かと。。。
(そもそも、実用になるものが必要な方は商品として販売されているものがありますので、そちらを使用される方が良いと思います。)


回路図


回路図
注意! 回路図中のコメントのうち、FM77の機種ごとのピン配置は全てが正しいとは限りません。(実機を所有しているのはSXのみですので、他はネットの情報です。)

部品表    

  
    基板     専用プリント基板あり
    IC1      ATtiny85-20PU
    J1        ピンヘッダ 4pin(ケーブルを基板に直結する場合は不要)
    J2        MiniDIN-6 メスコネクタ
    SW1    タクトスイッチ(特にリセットが必要な場合もないので不要かも)
    C1       47uF 16V
    C2       0.1uF
    C3       0.1uF
    R1      10kΩ
    R2      4.7kΩ
    R3      4.7kΩ
    ICソケット  8pin
    ケース タカチ SW-50(必要なら)
    ケーブル S端子付き(FM77AV40SX)
    ケーブル モジュラー付き(4芯:FM77AV, 6芯:FM77AV20/40, EX)


製作上の注意点


回路は簡単ですので、専用プリント基板でなくユニバーサル基板に手配線してもそれほどの手間ではありません。私も手配線でまずATtiny2313で作り、小型化するためにATtiny85で作り直し、それを常用して3年以上になります。

注意すべき点は、本体に接続するコネクタです。
注意点は2つあります。
一つ目は機種によるコネクタの違いがあることです。
私のようにFM77AV40SXを使用している方はオーディオ用のSケーブルが使えるのですが、SXよりもFM77AVやAV20/40(EXも)を使用しておられる方が多いと思います。その場合はモジュラージャックの4極4芯(4P4C)か6極4芯(6P4C)となります。型番が不明ですがRJ-9,-12,-22などと呼ばれているようです。

二つ目はコネクタのオス・メスの違いに留意することです。ネットの情報は注意して見ないと本体側かケーブル側かがあいまいなものがあります。
特にSケーブルの場合は、間違えるとVCCとGNDが逆になりますので、最悪PS/2キーボードを破損します。(私が経験者です...)


特殊キーの割り当て


特殊キーについては次のように割り当ててありますが、ソースがありますので自由に変更できます。
 FM77 <--->PS/2 Key     
    DUP          F11
    HOME       F12
    BREAK      Kanji
    GRAPH      L_ALT, R_ALT
    EL            L_Win, R_Win
    CLS          ScrLk


ソフトの使用上の条件


本ソフトは上記のようにアマチュアが自分で使用するために制作したものであり、機能・性能上の不備がありますが、それを承知していただければ自由に使っていただいて結構です。
使用にあたっては、以下を守っていただくことを条件とします。
(1)このソフトを使用した結果、いかなる損害が生じても私は責任を負わないこととします。
(2)本ソフトはですくまさんが解析し、ブログ「ですくま備忘録」で公開してくださった貴重なデータがあって初めて制作できたものですので、ソフトのソースからですくまさんの名前を消さないこと。
(3)同様に、本ソフトはapplication note AVR313を使用させてもらっていますが、私が独自に作成した箇所もありますのでソフトのソースから私の名前も消さないこと。
(4)商用になるほど完成度の高いソフトではないので杞憂とは思いますが、本ソフトあるいは改変したソフトを商用利用しないこと。

さらに、これは条件ではありませんが、バグの修正を含めてソースの改変は自由ですが、その際には、そのソースを公開するとともに、私にもフィードバックしていただけるとありがたいです。(メールでも、このブログでも結構です。)

ソフトの公開


制作したソフトと回路図をMicrosoftのOneDriveに公開します。
cnvps2fm_tiny85.hexが実行ファイルですので、これをそのままATtiny85に書き込んでもらえば動作します。ただし、ソースファイルの先頭に書いてありますが、Config bitの変更を忘れないでください。


プリント基板を配布します


プリント基板の余分がありますので希望される方がおられましたらお譲りします。
(1)プリント基板のみ(118円 送料82円 計200円)
(2)プリント基板とプログラムを書き込んだATtiny85のセット(330円 送料120円 計450円)
[8月16日訂正]厚さが1cm以内で収まりますので送料は82円で合計412円です。
(3)多分おられないとは思いますが、完成品を希望の方はご相談ください。(お持ちのFM77の機種によってケーブルが変わりますので。但し、ケースの穴あけはご自分でお願いします。) (1500円 送料140円 計1640円)
という形を考えています。

ご希望の方は、自己紹介のページにOld68funのメールがありますので、そこから希望の番号(1~3)を記してご連絡ください。折り返し、振り込んでいただくゆうちょ銀行の口座をお知らせします。枚数に限りがありますので、希望の方が多い場合は先着順とさせていただきます。ご容赦ください。

2019年7月15日月曜日

ようやくプリント基板ができたと思ったら

FM77AVにPS/2キーボードを接続する変換器のプリント基板が...失敗!


本日ようやくプリント基板が届きましたので、早速組み立てようとしたら...
何と、PS/2キーボード用のコネクタが逆向きでした。。。ドジ!


なんとPS/2コネクタが内向きだった


さらに、PS/2コネクタとしてMiniDIN-6pinのフットプリントを使用したのですが、ピン間隔が現物(秋月電子で購入)と微妙にずれているようで、すんなりと入りません。
フットプリントの修正も必要なようです。

現在使用中のものは手配線でしたが、これぐらいの回路はプリント基板化するのも簡単だろうとナメていたようで、反省しています。もっと慎重に進めなければ。。。

これでは何ともなりません。作り直しということで、完成はさらに一ヶ月後ということになりそうです。

2019年6月12日水曜日

FM77用の拡張IOボード、ROM/RAMディスクボード

FM77用の拡張ボードを紹介します


最近はソフトの手直しばかりで、とりたてて紹介するものがありません。そこで、以前製作して今でも使用しているFM77用の拡張ボードを紹介します。
このボードのために制作した、Windows上で仮想ドライブを実現するソフトFlexDrvWin.exeがこのブログのシングルボードマイコンを製作するベースとなったと言えるものです。

製作したのは、FM77AV40SX用のIO拡張ボードとROM/RAMディスクボードです。
私はFM77AV40SXでFLEX09とOS-9Level2を使用しているのですが、2DDフロッピーはかなり遅く、また、ドライブもメディアもいつまで使えるのかも分かりませんので、何とかFDDと縁を切りたいと思っていました。

色々と考慮した結果、手持ちのFM-7とFM77AV40SXに共通して装備されている50ピンのIO拡張コネクタを利用して、まずIO拡張ボードを作り、それに接続する形のROM/RAMディスクを製作することとしました。

製作したIOボードとROM/RAMボードを下に示します。

下がIO拡張ボード、上がROM/RAMボード

上部の空ソケットには512KBのSRAMを装着してRAMディスクとして利用していましたが、後述のようにWindows上の仮想ドライブに切り替えたので不要となりました。

左がIO拡張ボード、右がROM/RAMボード

今では、こんな配線をする気力はもうないかも...

それぞれの裏面配線の様子



ROM/RAMボードの構成を下に示します。
RAM/ROMボードの構成


6821によるROM/RAMディスクのアクセス方法を下に示します。
6821によるTrk,Sct番号のセット方法


IO拡張ボードには、6821PIA、6850ACIA、6840PTMが搭載してあり、6850にはRS-232Cシリアルインターフェースが、6821にはFT-245パラレルインタフェースが接続してあります。どちらも38400baudです。
ROM/RAMボードには、512KBのROMとRAMのペアが2組あり、それらを6821PIAが制御しています。RAMはバッテリバックアップしてあります。
ROM/RAMディスクの容量は
 4Mbit(512KB)では Trk 64、Sct 32 で(64-1)*32=2016セクタ
 2Mbit(256KB)では Trk 32、Sct 32 で(32-1)*32=  992セクタ
 1Mbit(128KB)では Trk 16、Sct 32 で(16-1)*32=  480セクタ
となります。

2組あるのは、FLEX09用とOS-9用で、それぞれをスイッチで切り替えて使用します。
(端にあるソケットはROMライターですが、未完成です。)

記録を見ると、2014年12月末から作り始めて2015年3月初めにハードは完成していますが、実用になる制御ソフトの完成には年末近くまでかかっています。

最初はROM/RAMディスクとして使用


FLEXでは実質4台までしかドライブが接続できないので、
ドライブ0:内蔵ドライブ0
ドライブ1:内蔵ドライブ1
ドライブ2:ROMディスク
ドライブ3:RAMディスク
として利用することになります。
内蔵ドライブ0のシステムディスクで起動し、その後、システムドライブを2に、ワークドライブを3に切り替えれば、フロッピーを使用せずに済みますので、結構快適になりました。

最初はシリアル/パラレルのインターフェースは実装していなかったのですが、ROM/RAMディスクのみでは結局、データ保存にフロッピーが必要なので、Windows上の仮想ドライブも追加することにしました。
FT-245モジュールを搭載しているのは、Windows上の仮想ドライブとパラレルインターフェースで通信したかったからで、作る前は、シリアルインターフェースでは遅くて実用にならないからパラレルでと思っていたのですが、実際に製作してみると、確かに転送速度は10倍以上違うのですが、DISKの読み書きに時間がかかるのでトータルの時間は少し速い程度であると分かりましたので、現在はシリアルも使用しています。

その時に制作したのが、6809シングルボードコンピュータでWindows上の仮想ドライブを実現しているFlexDrvWin.exeというソフトの原型で、このソフトのドライブ3にDSKファイルをセットすればFM77AV40SX上のFLEX09で読み書きできます。(OS-9の場合は別ソフトのOS9DrvWin.exeを使います。)

ドライブ3をRAMディスクからWindows上の仮想ドライブに変更


動作中の様子を示します。
手前がFM77AV40SXのディスプレイとキーボード、後方がWindows機です。
後方右上のWindows上のFlexWinDrvの画面で分かるように、ドライブ3にセットした仮想ディスクを読んでいます。


動作中の様子

画面表示


この拡張ボードによってデータ等はフロッピーでなくWindows上のファイルとして保存できるようになったのですが、起動時はフロッピーが必要です。これを解決するためにはフロッピーエミュレータが必要ですが、まだ製作できていません。。。

ドライブ2も仮想ドライブに変更


現在は、FLEX09システムのドライバールーチンをさらに書き換えて、ドライブ3だけでなく2もWindows上の仮想ドライブに設定変更をしていますので、FlexWinDrvのドライブ2と3に仮想ディスクをセットして使用しています。(結局、ROMディスクもRAMディスクも使わなくなってしまった。。。)

[蛇足]画像で分かりますように、FM77AV40SXの純正キーボードは使用せず、大切に保管してあります。代わりに、自作のキーコード変換器を接続したPS/2キーボードを使用しています。さらに、内蔵ドライブも取り外して保管し、代わりに一般的なDOS/V機用のFDDを装着しています。
自作のキーコード変換器は下の画像のものです。
ATtiny85を使用したハードは簡単なものです。ソフトには結構苦労しましたが、FM77AVのスキャンコードをですくまさんが調べて公開してくださっていたので、とても助かりました。感謝いたします。

自作のキーコード変換器


資料の整理を兼ねて、手配線のボードをプリント基板化しようと考えています。無事に完成したら公開するつもりです。