当ソフトウェアはオープンソースとなっておりますが、掲載につきましてはご一報ください。
当ソースコードをご利用になられるときには、これもまたご一報ください。
アドバイスなども出来るかもしれません。
News:FTDI社USB接続IOポート(FT245RL)に対応しました。



  1. 何が出来るのか

    “.”点ボタン(またはF7キー)で一行実行ができます。普通のテキストエディタに見えますが、スクリプトを実行できるのです!!!
    連続実行にはのボタンを押すか、F5キーを押してください。
    もちろん実行できるスクリプトも、I/Oポートを直接操作できるという特殊な操作が可能となっています。I/Oポートを直接操作したかったけれど、そのための処理方法が無かった・・・そんな方には“もってこい“だと思います。


    ・・・handleIOの背景・・・そんなことよりも使ってみたい

    WINDOWS95以降、WINDOWS上でI/Oポートを直接たたくのは、元来タブーとされてきました。しかし、I/Oポートを直接たたけると、プリンタポートを最大限に生かすことが出来るのです  w(゜o゜)w オオー!。

    わざわざPIO買ったりDIO買ったりしなくても、簡単な通信はPCだけあれば出来るのです!φ(..)メモメモ
    他にもISAバスを直接操作して、プログラムを書きたい場合に、当ソフトがあると通信しやすいかもしれません。
              _〆(。。)メモメモ・・
    しかぁし・・・DMAに関する機能が非対応 (・・,)グスン  (・_・)/~ ゜ポイ

    ・ハードウェアを直接操作するのに、わざわざDOS上でI/O操作するのは 面倒だけれど、RT-Linux入れるのは挫折したし・・・もっと簡単にICを使って通信したい!
        (ノ°ο°)ノ オオオォォォ-
    という欲求を改善してくれるかもしれません。キット チョットだけカイケツしてくれるYOウン(--)(__)・・・

    ・外部ボタンの反応を得て何らかの処理をさせたい場合に、使えるかも知れません。

    ・今回USB上のパラレルI/Oに対応しました。FTDI社FT245チップを介して、色々な外部機器を作ってます。

     最近のパソコンではプリンタポートが廃止されているパソコンもあり、計測制御用に開いているポートが無いという実情があります。この問題を解決するには、空いているUSBポートを使用してしまおうという発想の転換が必要です。USBポートで外部機器を接続するメリットは、5V電圧3.3V電圧がUSBポートから供給されるという点です。大抵の単純なものなら別途ACアダプタなどを取り付けずに済むため、便利に利用できます。

    どんな使い方があるのかはその人次第ですが、ソースコードをオープンにしておきました。

    自分でニーモニックを追加して、再コンパイルすれば、応用範囲は極めて増えると思います。

    次の方に利用していただけると、理解は容易だと思います(順不同)
     注意:下に行くほど難易度が上がります。(謎)
     ・大学でハードウェアがやりたいよ〜
     ・高校でハードウェアがやりたいよ〜
     ・中学でハードウェアがやりたいよ〜
     ・ハードウェアがやりたいよ〜

     なんでCSV形式なのか・・・それと、もう1つの開発背景


    1. 簡易スクリプト処理について

      簡易スクリプト処理とは、たとえばバッチファイル(.BAT)ファイルに代表するように、簡易言語としての機能を持ち合わせているということです。コンソール画面をNotePadエディター上に実現したと思ってください!!!

      BASICを例にとりますと、
      @PRINT “文字の表示”
      ABEEP 1
      BA = A + 1
      のそれぞれは、上から実行されていきます。一行一行が意味を持っており、これが一般的な言語としての意味を持っているわけです。
      “簡易“   ”スクリプト“    ”処理“
      簡単な
      コンピュータが解釈できる言語としての
      機能を持っています。で、その言語を処理して、何かをさせられます。

      つまり、あんまり大きな声でいえないけれど、“言語”なんです。
      ほとんどのことができないけれど、アル処理に関しては有力な処理能力を持っている!
      というわけです。

      して、アル処理とは何か・・・


    2. I/Oポートを直接操作できます!

      データの入出力(I/Oポートを直接操作)をコンソール画面に見立てたエディタ上でトレース実行していくことが可能です。

      コンソール画面についての解説を行います。コンソールの例を挙げると、MS-DOSや旧BASIC言語などが挙げられます。操作方法は一行書いて Return(Enter)キーを押すと、次の行に実行結果が表示されます。実行して、どんな状態に変化したかをリアルタイムに取得して、次にどんなこと をしていくのかを対話していくことが可能だというのです。

      そんな処理をできる例を挙げると、MS-DOSに標準でついてくる”Debug”コマンドが、近い処理をしてくれます。しかし、何度も同じ行を実行するの は大変です。何度も入力しなくてすむような画面があれば、比較的簡単に色々なテストを行っていくことが可能となります。

        さらにはErrorレベルという処理がエディタ内部に組み込まれており、エラー発生時に途中で停止をかけてくれたりもします。このエラーレベル(つまみ)を調整することにより、次の行に表示される出力を省略したり、その逆に詳細表示をしたりすることが可能となります。
      (注:つまみ処理を実装中・エラーレベル処理そのものは組み込まれています)


    3. 動画の簡易再生機能を持っています!

       どういうことかというと、MCIを操作して、HandleIOの画面内に(.mpg)の拡張子をもった動画ファイルを再生させることが出来ます。


      図:サンプルとして、動画を再生させている

       この動画を再生させて、ダイアログを出して結果を選択。
      つぎに結果に応じて動画の流れを制御して、インタラクティブ性を持たせたまま動画を再生させていくことが出来ます。

       作業の手順を説明するときに、動画で解説しながら説明したい場合があると思います。そんなときには、動画を再生させて、エラーを見てそのエラーに基づいて、つぎにどんな風に作業していけばよいのかを記しておき、解説していくことが出来ます。

       エラーが発生したときに、HandleIO自身がI/Oポートを通じてエラー内容を検地できるようにプログラムを書いておけば、外部のハードウェアを制御して、動画を再生させてくれるでしょう。

       外部のボタンと連動して、LEDを制御しつつ.mpgファイルを再生させる。こんなことをすれば、ハードウェアの仕様を学習させながらソフトウェアを組んでいくことも可能です。(教育目的の使用もできます!!!)
       後に述べます“再コンパイル”を行えば、独自ニーモニックを追加して、メール送信機能や、受信機能なども追加できると思います。

       ただ、現時点で簡易にくっつけただけなので、あんまり多くの機能を持っているわけではありませんし、若干重いというのがボトルネックとなっています。


  2. 使い方
    HandleIOの画面に解説文字をつけた画像があります
    1. Beep音を鳴らしてみます

      1. コントロールパネルからシステムを開いて、コンピュータをダブルクリックします。続いて、ラジオボタンI/Oポートアドレスをチェックしてください。61hがスピーカに関してのI/Oアドレスであることがわかります。

        XPの場合にはコントロールパネル->システム->ハードウェアタブ->デバイスマネージャ->表示メニュー->リソース(種類別)->入出力(I/O)をダブルクリックです。

      2. 次のように入力してみてください
        out h'61 b'11111111
        out h'61 b'00000000

        上の“out h'61 b'11111111“のところにカーソルを持っていって、”.“(テンキーの点ボタンを押してください。またはF7キーを押してください。
        効かない場合は、NumLockを押してからもう一度点ボタンを押してみてください)
        ピーという音がしてるでしょう?音が鳴らずにDLLファイルが見つかりませんと出てきた場合はこちらへどうぞ
        OKをクリックして、もう一度点ボタンをクリックしてください。
        音が止まったと思います。
        点ボタンを押すと、その行を一行実行させることが出来ます

      3. 解説
        out h'61 b'11111111
        out h'61 b'00000000

        1. 1バイトの情報を出力します。内容は16進数では“FF”2進数では“11111111”

        2. 出力先のアドレス(61h)

        3. 出力命令 OUT
          必ずスペースが入っているのが特徴です

      4. 他のポートはまだ、“絶対”にいじらないでください!!!
        マシンが破壊される可能性が高いから〜・・・(^^; ヒヤアセ


    2. WAVファイルを再生させてみます

      1. 次のように入力してみてください・・・
        その前に、”.”を入力する方法が無いので、添付のioフォルダの中のファイル”waves.io”を開いてみてください。
        ♪ C:\WINDOWS\MEDIA\Logoff.wav
        wait 3000
        ♪ C:\WINDOWS\MEDIA\Chimes.wav
        wait 1000
        ♪ C:\WINDOWS\MEDIA\Notify.wav
        wait 1000
        ♪ C:\WINDOWS\MEDIA\Chord.wav
        これをまとめて上から
        実行してみます。

              このボタン(連続実行ボタン)をクリックしてください。まとめて実行することが出来ます。



        “♪”ニーモニックは、音を鳴らすことができます。
         入力方法は・・・“きごう”と入力して変換しまくると出てくるのですが、最近では“おんぷ”と入力して変換すると出てくるようです。

         もし、音がならなかった場合には、“C:\WINDOWS\MEDIA\Logoff.wav”というファイルが存在しなかったと思われます。他にお持 ちのファイルと置き換えて、再度実行してみてください。現時点では、絶対アドレス指定(c:\〜\〜.wav)という形のファイル名しか受け付けません。

        “wait”ニーモニックは、その名のとおり、特定msだけ処理待ちを行います。その間、handleIOそのものはフリーズします。現在、新たなニーモ ニックを書いておりますが、当面の間はこちらをお使いください。Wait時間が過ぎると、フリーズ状態から復帰して、次の処理を再開します。



    3. 動画を再生させて見ます

      動画再生時に気をつけなければならないのは、ファイル名が間違っているのに連続実行ボタンをクリックしてしまうと、その後にある”wait”命令の影響に より、wait処理を終えるまで、処理が戻ってこないということです。”Wait”命令をはずしてしまうと、動画は正しく再生されません。つまり、今のと ころwait命令をはずすわけには行かないのです。
      \(・_\)ソノハナシハ (/_・)/コッチニオイトイテ
      とにかく、再生させて見ましょう!
      次のように入力してみました。
      1. 動画の再生

        次のように入力してみました



        (図ではh:\IDvol3Act8.mpgというmpgファイルを用意してあります。)
        このファイルを読み込んで、実行させてみます。
        入力を終えたらば、連続実行をクリックしてみます。
        すると、
        下のように実行できたと思います。



          (再生中・・・はめ込み画像ですが、正しく再生されています)

          この場合、wait 10000が入っているため、10秒だけ.mpgファイルを再生してくれます。もし、ファイルが見つからない場合は、次のwait命令のせいで、10秒間 だけフリーズします。間違ったファイルを指定してしまった場合は、ゆっくりと待ちましょう。必ず復帰するはずです。(wait 10000000とかを指定した場合は、速やかにリセットしましょう(^。^;))
        動画再生応用編・・・WAIT命令の代わりにWAITPUMP命令で置き換えると、実行中に停止できます。



    4. パラレルポートを操作します


      パラレルポートを操作する場合には、パラレルポートがどこに割り振られているのかを特定しなければなりません。コントロールパネルからシステムを開いて、 コンピュータをダブルクリックします。続いて、ラジオボタンI/Oポートアドレスをチェックしてください。378hがLPT1(プリンタポート)に関して のI/Oアドレスであることがわかります。(このI/Oアドレスは、マシンによって異なっている可能性があります。各自で必ず使うマシン一台一台の確認を 行ってください。)

      サンプルとして、利用中のマシンは378-37Fとなっていました。




      図:パラレルポートのポートのアドレスを確認している<アドレスを確認するには>


      OUT h'378 b'11111111
      OUT h'378 b'00000000

      と、2行にわたって実行した場合、パラレルポートの出力には何らかの変化が起きます。一瞬だけLOWになるのかHIGHになるのかは、つなぎ方しだいで す。プルアップしてシンク電流を中心に組んでいるのならば、不論理に働き、一瞬だけ8つの出力がLOWになり、またHIGHに戻ったかもしれません。で も、プリンタポートに直接テスターをあてても、出力電流は低くて電圧も2[V]前後しか出力されていないと思います。そこで、外部に74F245や、 74F244等の外づけICを必要とするわけですが、つなぎ方には独特のつなぎ方があります。

    5. LEDを点灯させてみます


      1. 74F245を繋いで見たと思います。


        74F245か244などが無いと、波形が正しく出力されなかったり、電流が低くてLEDも光らせられない。それではほとんど何もできないじゃないか!!!と嘆かれていることと思います。そういった流れから、下に回路図をのせておきます。VCC(5V)とGNDを別途ACアダプタで供給する必要がありますが、回路図上 省略されています。

        bmpファイルなのが原因か、漢字ファイル名が原因で表示できませんでした。ダウンロードしたところのindex.htmlのほうをご覧になってください@スマセン
        下記の行を入力してください(コピーペーストでも可です)
        OUT h'378 b'11111111
        OUT h'378 b'00000000
        OUT h'378 b'11111111
        OUT h'378 b'00000000
        OUT h'378 b'11111111
        OUT h'378 b'00000000


        と入力して、カーソルを一番上に戻し、点ボタンを押してください。LEDが消えましたか?点きましたか?ダイアログが出てくるかもしれません。DLLとSYSファイルを別途準備ができているのなら、さらに点ボタンを押してください。LEDが消えましたか?点きましたか?。この時点で正しくLEDが消灯か点灯した場合には、すばらしいことに、正しく動いた証です。
        (つかない場合には、別途電源5Vを用意してないためだと思います。74245を動作させるためには別途DC5V電源を74245に接続する必要性があります。)

        ダメなときにはまず、
        ソフトをしんじなさ〜い。
        ハードを疑いなさ〜い。(BIOSのパラレルポート設定かもしれないし、出力しているポートが間違っていたのかもしれません。もう一度よーくコンパネのコンピュータ・I/Oポートを確認してみてください)

        他にいえることは、以外にもパラレルポートのピン配置がわかりにくいことです。もし左右が逆につながってしまった場合には、LEDの上位3Bitぐらいが点かないかもしれません。そのときは、間違いなくDSUB25PINを左右逆につないでしまったと思います。(ガンバッテ繋ぎなおそう!!!)


      2. LEDがつくのならば、LEDで遊んでみましょう!!!


        l'start
        OUT h'378 b'11111110
        wait 100
        OUT h'378 b'11111101
        wait 100
        OUT h'378 b'11111011
        wait 100
        OUT h'378 b'11110111
        wait 100
        OUT h'378 b'11101111
        wait 100
        OUT h'378 b'11011111
        wait 100
        OUT h'378 b'10111111
        wait 100
        OUT h'378 b'01111111
        wait 100
        pump
        jmp l'start


        LEDが右から左に流れていきましたか??・・・この設定だと、無限ループになってしまいます。停止ボタンが用意されているので、handleIOの停止ボタン停止ボタンのイメージファイル(jpgファイルです)をクリックしてください

    6. LCDを操作してみます
      SD1602というLCDモジュールとパラレルポートを接続した回路図を下記に示します。パラレルポートを一列に展開してあるのは、見やすくもみずらくもあるようですね。別途ピンの解説が必要になりそうです。この辺のページの下のほうを参考にすると勉強になります

      bmpファイルなのが原因か、漢字ファイル名が原因で表示できませんでした。ダウンロードしたところのindex.htmlのほうをご覧になってください@スマセン

      急ぎの方は、“lcd_HelloWorld.io”などのサンプルが役に立つと思います。“lcd_HelloWorld.io”は4 ビット接続用に組んであるので、そのままで動作するはずですが、検証していません。
      (゜゜;)\(--;)ォィォィ回路図とプログラム、違っているのかもしれないのかい
      (152行あるので、別添付にしてあります。)

      LCDそのものは、秋月電子などで\900(SD1602)ぐらいで売っているものです。VCCとGNDの場所には別途ACアダプタを接続して5Vを供給してください。

      LCDによっては同じ店で買うにしても、繋ぎ方でVCC-GNDが逆だったりして、普通に繋いだつもりなのに煙が出てくることがあります。(筆者はひとつ 焦がしてる〜σ(^◇^;))ちょっとだけ違うの買ってきた場合には電源の配線にはサイゼンの注意を払われたし。説明書読めば簡単さ・・・(^。 ^;)・・・焦がしてる人の言うことか??



  3. スクリプトニーモニックについて

    1. ニーモニックつまり、命令についての解説を行います。

       まず、漢字が実行できます。 (ノ°ο°)ノ オオオォォォ-ィィ感じぃ〜

      ♪というニーモニックが音を鳴らしてくれるのは、WAVファイルを再生させてみよう!の ところで解説いたしました。漢字が認識できる言語はあんまり(結構あるけれど、あんまり無いことにしといてね) 見当たらないと思います。漢字でニーモニックを作っておける言語って、日本人らしさが味わえるかもしれません。(だからって翻る(ヒルガエル)とか諭す (サトス)といったややこしい漢字をわざわざニーモニックになさらなくても結構ですよ。きごう系統の言語は個人的に面白いと思います。顔文字関係のニーモ ニックなんてのはどうでしょうか!!!そこのお兄さん、おねえさん・・・(謎))



    2. コメント文

      / (半角スラッシュ半角スペースで構成されている文字列はすべてコメントとして無視されます。)

      連続実行を終えたときにまとめて何行実行したかを次のような形で表示してくれます。

      / 実行したニーモニック数は26行です
      / DISPB…REGL:: 00000000000000000000000000000000@b
      / DISPB…REGL:: 00000000000000000000000000000000@b
      / DISPB…REGL:: 00000000000000000000000000000000@b
      / DISPB…REGL:: 00000000000000000000000000000000@b

      この出力そのものは、次にそのまま連続実行しても害はありません。但し、実行したニーモニック数が若干増えることになります。他にもここでは “DISPB“というニーモニックを実行した後なので、2進Binaryイメージでレジスタの状態を表示してくれます。もし、出力結果を10進数で表示さ せたいのならば、”DISPD“という命令を使ってください。10進数で途中経過の値が表示されると思います。



    3. messagebox関数

      実行中に画面を止めて、確認処理を行いたい場合には、messagebox関数を使います。

      messagebox OKを押すと開始します 待ってます

      と一行書いておくと、次のようなダイアログを表示してくれます。


      注意しておきたいのは、半角スペースで区切るということです。
      messageboxとOKを押すとの間には半角でスペースを入れて下さい。



    4. 画面表示に関して

      実行中にデータの状態(レジスタの状態)を表示する必要があると思います。そんなときには、


      DISPB (regnum) << 実行中にある変数の内容を蓄えておく。
      一通りの実行処理を終えてから、まとめて2進数で結果を表示する
      DISPD (regnum) << 実行中にある変数の内容を蓄えておく。
      一通りの実行処理を終えてから、まとめて10進数で結果を表示する
      DSIPH (regnum) << 実行中にある変数の内容を蓄えておく。
      一通りの実行処理を終えてから、まとめて16進数で結果を表示する


       このまとめてっていうのは、連続実行の最中に途中で処理を止めるわけに行かないから、処理そのものは続けた状態で一区切りが付いたら、どんな風に実行されていったのかを一括して表示してくれる仕組みになっているということです。


       あとでまとめて表示できると、温度センサなんかをくっつけておいても、どんな経緯をたどってきたのかがわかりやすくなるでしょ!!!(棒グラフとか折れ線グラフになってくれたほうがもっとうれしいけれどね・・・)

      DISPM ダイアログボックスにて、最後に実行した処理結果(多くは演算処理)をその場で表示する(REGLに残っている値を表示する・・・連続実行中に、処理を一旦停止します。OKが押されるのをまって、押されたらばそこから再開します)


      を用いてください。


    5. レジスタに関しての説明
      このREGというのはレジスタで、REGLとLが最後につくのは、命令を実行直後に結果が格納されるレジスタです。REG1〜REG1000までは、ユーザが自分で決めて用いる レジスタです。(#defineをかえればたくさん増やせるけれど)REG1にデータを格納しておきたい場合には、格納命令を用います。

       間接アドレス参照を行うことができるため、たとえばREG10の内容が100の場合、REG100を参照したいとしましょう。
      そのときには(regnum)の ところにreg:10と入力します。コロンを入れて10と入力した場合、レジスタ10の中身をみて、100だったらREG100を参照します。10だった らREG10を参照します(このときは10が返るね!)。ちなみに、REG0はREGLを指しているので、reg10の内容が正しくセットされていない と、REGLの中身を返す可能性があります。

       (regnum)とは、レジスタを示しています(REG1〜REG1000までの32bit格納領域)
       (portnum)とは、ポート番号を指しています。ポート番号はポート配置の調べ方で調べることができます。REG1〜REG1000までを入力するか、b'0101 d'123 h'378等という指定ができます
       (Value)とは、入出力する値を示しています。REG1〜REG1000や、b'0111 d'0125 h'ff等を指定することができます。

       B'で始まるの時にはb'00110011の様に”0”or”1”で指定します。8bit出力系の場合には8回0か1が連続して並びます。
       D'で始まるの場合にはd'0〜9の数字が入ります。8bit出力系の場合にはh'0〜h'255までの数字を与えることができます。
       H'の場合にはh'0〜Fの数字が入ります。8bit出力系の場合にはh'0〜h'FFまでの数字を与えることができます。

       注意:16ビット系の場合にはb'のあとにそれぞれ16個 0 or 1 が並ぶかd'のあとに-32,768 〜 32,767が入るか、h'のあとに0 〜 FFFFが入ることになります。
      32ビット系の場合にはb'のあとにそれぞれ32個 0 or 1 が並ぶかd'のあとに-2,147,483,648 〜 2,147,483,647が入るか、h'のあとに0 〜 FFFFFFFFが入ることになります。


    6. DISP系列の引き数
      DISPD
      のみで一行を実行してみると、10進数でREGLを表示してくれます。
      もしREG1の内容を10進数で表示したい場合には、
      DISPD reg1
      とします。




      ここより下はチョット理解しにくくなっております。もし使いこなしたいのならば先に組み方教室へいかれるべきだと思います。(オススメ!)

    7. 格納命令
      特定の数字を格納するときには、定数格納命令を用います。ここでは、レジスタ間のコピーについて触れます。

      MOV REG10 REGL    REGLから10番レジスタに格納される
      MOV REGL REG10    10番レジスタからREGLに格納される



    8. 定数格納命令
      定数をあるレジスタに格納します。
      MOV (regnum) b'00110011
      MOV (regnum) d'00000123
      MOV (regnum) h'00abcdef



    9. 画面出力の表記方法
      DISPD REGL や
      DISPD REG10などを行うと、次のようなフォーマットで出力されます。
      / DISPD…00000000000000000000000000000001@d
      コメント DISPDです・・・値は1 @d(10進数です)
      となって表示されます。
      ご察しの様に・・・ @hは16進数 ・ @bは2進数です



    10. 入出力命令(I/O入出力ポートを介しての入出力)



            hex指定
      IN (portNum) ・・8bitデータを入力してきて、入力してきたデータをreglに書き込む

      OUT (portNum) (Value)・・8bitデータを出力 ポートに出力する

      【使用例】
      IN h'378
      REGLを経由して、入出力ポート378hからデータをやりとりする。格納のされ方は、REGLの最下位8Bit分のみが使用される。
      OUT h'378 b'01001111
      入出力ポート378hへデータを出力する。出力内容はレジスタに格納されている内容となっている。
      レジスタ番号を指定すると、そのレジスタ(最下位8Bit)を出力する。

      IN Reg100
      レジスタ100番に書いてあるポートからデータを入力してくる。格納先はReglである。
      OUT h'378 reg10 reg10の内容が出力される。
      OUT h'378 reg:10 注意:Reg(コロン)10
      この機能を用いると、reg10を書き換えていく(reg10カウントアップなど)ことにより、出力する値を変化させていくことができる。



      W…Word(16Bit)入出力
      WIN h'378 等にすると379hと378hから計2バイト
      WOUT h'378 h'0123 等にすると379hに01h 378hに23hを出力します。

      D…Double Word(32Bit)入出力
      DIN h'378 等にすると37bhポートと37ahポートと379hポートと378hポートから計4バイト
      DOUT h'378 h'12345678 等にすると37bhポートに12h と 37ahポートに34h と 379hポートに56h と 378hポートに78hの計4バイトを出力します


    11. 2進10進16進の変換実験
      10進数"256"を2進数10進数16進数で表示します。
      mov regl d'256
      dispb
      dispd
      disph
      
      / 実行したニーモニック数は4行です
      / DISPB…00000000000000000000000100000000@b
      / DISPD…00000000000000000000000000000256@d
      / DISPH…00000000000000000000000000000100@h
      

    12. 分岐処理
      IFJ 比較対照レジスタ・定数 等号など 被比較対照レジスタ・定数
      mov reg100 d'120
      IFJ reg100 > 0 l'初期化
      
      messagebox ここに処理は回ってきません 実験
      l'初期化
      mov reg100 d'0
      mov reg101 d'0
      
      / 実行したニーモニック数は4行です
      

    13. ループ処理
      ラベルl'を定義して、カウンタとするレジスタを定義 ifjで条件ジャンプ。
      mov reg13 d'10
      mov reg12 d'1
      mov reg11 d'1
      / 
      l'loop
      ifj reg13 == 0 l'終了
      dec reg13
      dispb reg12
      calc reg12 << reg11
      jmp l'loop
      l'終了
      
      / 実行したニーモニック数は56行です
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000001@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000010@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000100@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000001000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000010000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000100000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000001000000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000010000000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000100000000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000001000000000@b
      

    14. JMP処理
      ラベルを別行に定義しておいてjmp文でそのラベルめがけて飛びます。
      jmp l'終了
      / ここは実行されない
      / ここは実行されない
      l'終了
      

    15. 加減算処理
      INC (regnum) <<レジスタ番号を指定して、インクリメント(+1)する
      DEC (regnum) <<レジスタ番号を指定して、デクリメント(−1)する

       この処理においても、int型でインクリメントしているとしたのならば、最上位ビットが立っている場合には逆向きにインクリメント・デクリメント される可能性があります。これは、UINTに統一しなかったためで、ちょっとまずいのですが、−以下の温度を表示したいため、unsigned intにできませんでした。 (さらにいうと小数点以下を使いたかったりして(汗))

       とにかく最上位ビットが立った状態で加減算を行うと、逆向きに処理されるときがあります。INC命令なのに1下がったりDEC命令なのに1上がった り・・・挙動不審な命令ではありますが、そんなに大きな数字を扱わなければだいじょうぶ。・・・(?2進数の場合にINC命令が使えない・・・ことになり うる)

       inc/dec命令でもレジスタを間接参照してカウントアップ・ダウンを行うことができます。
       プログラム例:
      mov reg10 d'100
      mov reg100 d'0
      inc reg:10
      dispd reg100
      dispd reg10
      

      / 実行したニーモニック数は5行です
      / DISPD…00100@d 00000000000000000000000000000001@d
      / DISPD…00010@d 00000000000000000000000000000100@d

      上記の場合には、REG10の内容が100だったのでREG100に対してインクリメント操作を行いました。その結果としてREG100が0から1に変わりました。



    16. WAIT処理
      'ここまで読んでくれたあなたには、一言いいたい!!!
      お疲れ様〜

      筆者もう疲れたから、コーヒーでも飲むネ・・・(^。^;)フウ・・・・ぁぁぁあああ、コーヒーをこぼした・・・
      チョットたんま・・・WAITTTTTTTTTT・・・
      いやぁ、待ってくれないね。待ってくれたらどんなにうれしかったか・・・
      なんで待ってくれないんだ。(・_・、)グスン
      ・・・
      ○-○へ・・・・・へ(εoεへ))))ドラエモンーン←のび太

      そんなときにもこのWAIT命令があればだいじょうび・・・((ミ゜o゜ミ))・・・その声は(?)
         ぺぴしまん。(謎)

      ・・・(´ヘ`;)ハァ・・・読んでくれてありがとう。でももう疲れてしまったから、説明する気にならないんだな。・・・< ダッタラ早く書き上げなさい・・・ < あと少しだけ時間をください・・・そうすればキットキット・・・いろんなことができるから・・・

       そう、いろんなことができるのです。このWAIT関数。一分おきにデータを計測する・・・そんな用途にはこのWAIT関数が使えます。ただどういうわけ かオーバーヘッドがあるので、WAIT 60000で、一分になるかというと、1分3秒ぐらい待ってくれたりします。時と場合と場所とWAITの仕方によって、この値は若干変わってきます。基本 的にはwait 1は1msですが、1msだと思って組んでいくと、全体的にみてどっかで大幅に遅れていきます。
       一命令が何nsec(ナノセック)なのかはっきりしない。だから、分岐処理と組み合わせたりすると、どんどんずれてきます。まず無理です。正確に時間を 測るのは。どうしても計りたいのならば、フリーランカウンターなどを外付けで用意してください。パラレルポートにつないでもいいです。とにかく、もっと ず〜っと正確で、なおかつ処理をしている最中にも他で間違いなくカウントし続けてくれるカウンタをくっつけてください。
      そんなに正確でなくていいような、ムービーの再生などにはもってこいなのです。待ってて欲しいときに待っててくれる。そんな関数です。(待ちすぎて・・・ヤヴァイ…)



    17. WAITPUMP処理
      WAIT命令は1秒以下の場合に正確にWAITしてくれます。(若干遅いときもある)
      でも、ムービーの再生のように大雑把でもよい場合には、こちらのWAITPUMP命令を用います。

      このWAITPUMP命令は途中で停止すること停止ボタンができるので、長時間(1秒から数時間ぐらい)待たせる場合にはこちらを使うべきだと思います。

      引き数は10進数の整数で、やっぱりms(ミリセカンド)単位で指定します。(チョットオーバーヘッドがあるけど・・・)


    18. デバックコメントを表示する

      dispb reg10
      コメント この文字が実行後に入ります
      dispb reg10
      
      / 実行したニーモニック数は3行です
      / DISPB…0000000000000000000000000000010@d 00000000000000000000000000000000@b
      / この文字が実行後に入ります
      / DISPB…0000000000000000000000000000010@d 00000000000000000000000000000000@b
      

       このように、連続実行後にどこまで実行が進んだのか、どんな流れで進んだのかを後から見ることができます。

    19. その他の未公開処理(Undocumented)
      ありません。あっても、あるんです・・・(;>_<;)ビェェン
      あるのだけれど、説明しきれない・・・
      またHELPがバージョンアップするに伴って、追加していきます。
      詳しくは・・・BBSに書いてね(⌒―⌒) ニヤリ・・・(謎)
      探してみたい方は、ソースを読んでください。
      ソースの中でも“handler.cpp” Executionメソッドをよく読んでください。
      いっぱいあるでしょ・・・(汗(涙(血・・・それは無いか・・・
             (Y)o\o(Y)フォッフォッフォ

      IOディレクトリにあるファイルもよく読んでみてくださいね。




  4. ♪組み方教室♪


      ♪組み方教室♪


    1. その@・・・5から0にカウントダウンしてみます

      messagebox OKを押すと開始します 待ってます
      MOV regl d'5
      l'loop
      
      dispd regl
      dec regl
      IFJ regl != d'-1 l'loop
      dispb regl
      dispm reg1
      
      
      / 実行したニーモニック数は29行です
      / DISPD…REGL::  00000000000000000000000000000005@d
      / DISPD…REGL::  00000000000000000000000000000004@d
      / DISPD…REGL::  00000000000000000000000000000003@d
      / DISPD…REGL::  00000000000000000000000000000002@d
      / DISPD…REGL::  00000000000000000000000000000001@d
      / DISPD…REGL::  00000000000000000000000000000000@d
      / DISPB…REGL::  11111111111111111111111111111111@b
      
      
      


      このような形で、10進数カウントダウンできたと思います。(handleIOを立ち上げて、”新規作成”します。上のmessageboxからdispbまでの9行をコピー・ペーストして実行実行ボタンしてみてください!!!)


    2. そのAチョット改造・・・2進数でカウントダウン・・・

      3行目の  "dispd regl" を "dispb regl"にして見ます。
      すると、
      
      messagebox OKを押すと開始します 待ってます MOV regl d'5 l'loop dispb regl dec regl IFJ regl != d'-1 l'loop dispb regl / 実行したニーモニック数は29行です / DISPB…REGL:: 00000000000000000000000000000101@b / DISPB…REGL:: 00000000000000000000000000000100@b / DISPB…REGL:: 00000000000000000000000000000011@b / DISPB…REGL:: 00000000000000000000000000000010@b / DISPB…REGL:: 00000000000000000000000000000001@b / DISPB…REGL:: 00000000000000000000000000000000@b / DISPB…REGL:: 11111111111111111111111111111111@b と2進数で出力されます!!!
      (handleIOの”新規作成”をおして初期化します。上のmessageboxからdispbまでの8行をコピー・ペーストして実行してみてください!!!)


    3. そのB・・・REGLでカウントダウンしてると応用できないので適当なレジスタでカウントダウンしてみます

      reg13でカウントダウンしてみます(REGLをすべてREG13に置換しただけです)
      messagebox OKを押すと開始します 待ってます
      MOV reg13 d'5
      l'loop
      
      dispd reg13
      dec reg13
      IFJ reg13 != d'-1 l'loop
      dispb reg13
      
      / 実行したニーモニック数は29行です
      / DISPD…00013@d 00000000000000000000000000000005@d
      / DISPD…00013@d 00000000000000000000000000000004@d
      / DISPD…00013@d 00000000000000000000000000000003@d
      / DISPD…00013@d 00000000000000000000000000000002@d
      / DISPD…00013@d 00000000000000000000000000000001@d
      / DISPD…00013@d 00000000000000000000000000000000@d
      / DISPB…0000000000000000000000000000013@d 11111111111111111111111111111111@b
      
      (handleIOの”新規作成”をおして初期化します。上のmessageboxからdispbまでの6行をコピー・ペーストして実行してみてください!!!)

    4. そのC・・・ほかの変数を用意します(演算用レジスタを12・シフト数レジスタに11を用いています)

      5回カウントダウンすることがわかっているから、5回 REG12の値をそのまま表示してみます!!!
      reg11とreg12に”1”をいれて、reg12が表示されるように改造しました。
      条件ジャンプのジャンプ先も-2だったのを-4(4行上)までジャンプさせて、コメントを増やしました。

      messagebox OKを押すと開始します 待ってます
      mov reg11 d'1
      mov reg12 d'1
      mov reg13 d'5
      l'loop
      
      dispd reg12
      dec reg13
      IFJ reg13 != d'-1 l'loop
      dispb regl
      
      / 実行したニーモニック数は30行です
      / DISPD…00012@d 00000000000000000000000000000001@d
      / DISPD…00012@d 00000000000000000000000000000001@d
      / DISPD…00012@d 00000000000000000000000000000001@d
      / DISPD…00012@d 00000000000000000000000000000001@d
      / DISPD…00012@d 00000000000000000000000000000001@d
      / DISPD…00012@d 00000000000000000000000000000001@d
      / DISPB…REGL::  11111111111111111111111111111111@b
      
      

      5回、reg12が表示されました!!!
      (handleIOの”新規作成”をおして初期化します。上のmessageboxからdispbまでの10行をコピー・ペーストして実行してみてください!!!)


    5. そのD・・・シフトしてみます

      先ほどのコメントにしていた部分に、計算(演算)処理をいれて、5回左シフトしてみませう!!!

      messagebox OKを押すと開始します 待ってます
      mov reg11 d'1
      mov reg12 d'1
      mov reg13 d'5
      l'loop
      
      calc reg12 << reg11
      dispd reg12
      dec reg13
      IFJ reg13 != d'-1 l'loop
      dispb regl
      
      / 実行したニーモニック数は36行です
      / DISPD…00012@d 00000000000000000000000000000002@d
      / DISPD…00012@d 00000000000000000000000000000004@d
      / DISPD…00012@d 00000000000000000000000000000008@d
      / DISPD…00012@d 00000000000000000000000000000016@d
      / DISPD…00012@d 00000000000000000000000000000032@d
      / DISPD…00012@d 00000000000000000000000000000064@d
      / DISPB…REGL::  00000000000000000000000001000000@b
      

      (handleIOの”新規作成”をおして初期化します。上のmessageboxからdispbまでの10行をコピー・ペーストして実行してみてください!!!)



    6. そのE・・・レジスタ内の変数をシフトできたら、次はパラレルポートで出力してみよう!!!
      messagebox OKを押すと開始します 待ってます
      mov reg11 d'1
      mov reg12 d'1
      mov reg13 d'5
      l'loop
      dispb reg12
      calc reg12 << reg11
      dec reg13
      IFJ reg13 != d'-1 l'loop
      dispb regl
      
      / 実行したニーモニック数は36行です
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000001@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000010@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000100@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000001000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000010000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000100000@b
      / DISPB…REGL::  00000000000000000000000001000000@b
       
      上記で1の場所が左にずれていっているのがわかります。ずれていく場所をLEDで表示してみるのがこの下の回路図とプログラムです。
      out命令を追加して、レジスタの内容を出力します。

      今回下記のような回路図を先に作って、パラレルポートへ接続していることを前提にしております。

      bmpファイルなのが原因か、漢字ファイル名が原因で表示できませんでした。ダウンロードしたところのindex.htmlのほうをご覧になってください@スマセン
      messagebox OKを押すと開始します 待ってます
      mov reg11 d'1
      mov reg12 d'1
      mov reg13 d'5
      l'loop
      out h'378 reg12
      waitpump 1000
      dispb reg12
      calc reg12 << reg11
      dec reg13
      IFJ reg13 != d'-1 l'loop
      dispb regl
      
      / 実行したニーモニック数は36行です
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000001@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000010@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000000100@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000001000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000010000@b
      / DISPB…0000000000000000000000000000012@d 00000000000000000000000000100000@b
      / DISPB…REGL::  00000000000000000000000001000000@b
       
      '消灯するLEDが一秒おきに移動したと思います。(実験していませんが・・・汗)


        
    7. FTDI社FT245RL(USB接続パラレルI/Oを接続した場合の専用関数一覧です)を接続してみよう

      パラレルポートが無いマシンでも、ポートを操作して外部機器を操作してみたい場合には、FT245RLがお勧めです。理由はUSB接続でIn/Outするポートと5V、3.3V供給を持っているからです。
      FT245RLをどこから調達してよいのかわからない場合はこちらへどうぞ
      ftopen
       FTDI社FT245RLの初期化をします。複数台接続されている場合には、まとめて初期化します。内部ではFT_Openを呼び出しています。
       0番目デバイスという用語が多数出てきますが、FT245RLを一個しか接続していない場合はその一個目のFT245RLを0番目のデバイスと呼んでおります。同様に、2個接続している場合には、2個目を1番目のデバイスと呼びますので、ご注意ください。

      ftclose
       FTDI社FT245RLの終了処理を行います。複数台接続している場合には、全部まとめて終了処理をします。内部ではFT_Closeを呼び出しています。
      ftsetbitmode
       FTDI社FT245RLの入出力モードを設定します。内部ではFT_SetBitModeを呼び出しています。
       ftsetbitmode d'0 h'ff
       0番目のデバイスを全部出力モードに設定します。
       ftsetbitmode d'0 h'00
       0番目のデバイスを全部入力モードに設定します。

      ftreset d'0
      0番目のデバイスをリセットします。内部ではFT_ResetDeviceを呼び出しています。

      ftsetbaudrate d'0 d'300
      0番目のデバイスを300bpsにセットします。
      921600bps/460800/230400/115200/57600/38400/19200/14400/9600/4800/2400/1200/600/300を指定出来ます。内部ではFT_SetBaudRateを呼び出しています。


      ftout
       ftout d'0 b'00001111
       回路図
       
       'FTDI社FT245RLの0番目のデバイスに 二進数00001111と出力します。もし、LEDが8個接続されている場合には、4個のLEDが消えて、残りの四個が点灯します。FT_Writeを内部では呼び出しています。

      ftin
       ftin d'0
       FTDI社FT245RLの0番目のデバイスから信号を8Bit入力してきます。入力結果はREGLレジスタに格納されますので、ftinした後、データを保管したい場合にはREGLを別のレジスタにコピーしておきます。内部ではFT_GetBitMode関数を呼び出しています。
       例:
       ftin d'0
       mov reg100 regl
       
      ftread
       FT_Readを内部で呼び出しています。結果はreglに格納されます。
       
      ftgetserialnumber d'0
      接続されている内の0番目のデバイスが所持するシリアルコードを取得して、画面に表示する。レジスタには書き込まれない
       応用例:
      ftgetserialnumber reg100
      reg100が0の場合には0番目のデバイスのシリアルナンバーを表示する
      1の場合には1番目のデバイスのシリアルナンバーを表示する


      ftserialnumberjmp 0 A4001VQJ l'start
      0番目のデバイスのシリアルナンバーが"A4001VQJ"の場合l'startにジャンプ



    8. 関数を作る。

      HandleIOの関数を作る場合には少しだけ素直でない仕様が有りますので、そのあたりについて解説します。

      関数はcall文とラベル文,RET文で作成できます。ですが、CALLした後、プログラムを正常に終えさせるためには、関数の後にジャンプ〔最後の行へのジャンプを〕できるように書かなければなりません。そのため、関数を作成した場合には、必ずl'endラベルを定義することになります。
      @
      l'start


      / 最後尾の行にl'endを書いておく
      l'end




      A関数は本体と別の場所に処理を記入しておく必要があります。
      前の方に関数を記述してしまうと、流れがおかしくなってしまうため、本体よりも後、最後尾よりも前の場所に記入するようにします。このような場所に記述すると、〔HandleIOでは〕すっきりとした関数になるのと、一行実行時に実行場所が変化(数行後に変化)しても、RET(場所の行数が何行目なのか)は変化しないので戻ってこれる構造になります。

      l'start
      call l'初期化

      関数をここに記入していきます
      l'end




      BCALL命令とRET命令、ラベルを定義します。
      call l'初期化

      jmp l'end

      l'初期化
       ここではREGLを保存しておき、retするときに戻せるようにします
      mov reg900 regl
      mov regl reg900
      ret

      l'end


      C関数に何らかの値を渡したい場合にはcallの前にmov命令で引き渡す値を転送しておきます。下記の場合にはmov reg100 d'43の行で渡す値を10進数(43)にしております。
      mov reg100 d'43
      call l'初期化

      jmp l'end

      l'初期化
      mov reg900 regl
       ここに関数の処理、LCDの初期化などを記入します。(LCDの接続回路図は少し下にあります)
       REG100を参照して、パラメータとします。
      mov regl reg900
      ret

      l'end


      D別途、LCDの初期化方法を実験しながらポートをたたいていってみます。
      LCDの初期化実験
      'LCDの回路図
      FT245とSD1602LCD
      FT245RLが認識されている状態で、下記の順番に信号を発したところLCDを4ビットモードで初期化出来ることが確認できました。
      LCD SD1602はここで調達できます。
      ユニバーサル基板はこちらです
      / 7654ER00
      ftout d'0 b'00000000 1
      ftout d'0 b'00111000 2
      ftout d'0 b'00110000 3
      ftout d'0 b'00111000 4
      ftout d'0 b'00110000 5
      ftout d'0 b'00111000 6
      ftout d'0 b'00100000 7
      ftout d'0 b'00101000 8
      ftout d'0 b'00100000 9
      ftout d'0 b'00101000 10
      ftout d'0 b'10000000 11
      ftout d'0 b'10001000 12
      ftout d'0 b'10000000 13

      ftout d'0 b'00001000 14
      ftout d'0 b'00000000 15
      ftout d'0 b'10001000 16
      ftout d'0 b'10000000 17
      ftout d'0 b'00001000 18
      ftout d'0 b'00000000 19
      ftout d'0 b'11111000 20
      ftout d'0 b'11110000 21
      / 7654ER00 Display on cursol on All clear
      ftout d'0 b'00001000
      ftout d'0 b'00000000
      ftout d'0 b'00011000
      ftout d'0 b'00010000

      E初期化部分を組み込んだ関数にしてみます
      mov reg100 d'43
      call l'初期化

      jmp l'end

      l'初期化
      / 必要な場合REG100を参照して、パラメータとします。
      mov reg900 regl
      / 7654ER00
      ftout d'0 b'00000000 1
      ftout d'0 b'00111000 2
      ftout d'0 b'00110000 3
      ftout d'0 b'00111000 4
      ftout d'0 b'00110000 5
      ftout d'0 b'00111000 6
      ftout d'0 b'00100000 7
      ftout d'0 b'00101000 8
      ftout d'0 b'00100000 9
      ftout d'0 b'00101000 10
      ftout d'0 b'10000000 11
      ftout d'0 b'10001000 12
      ftout d'0 b'10000000 13

      ftout d'0 b'00001000 14
      ftout d'0 b'00000000 15
      ftout d'0 b'10001000 16
      ftout d'0 b'10000000 17
      ftout d'0 b'00001000 18
      ftout d'0 b'00000000 19
      ftout d'0 b'11111000 20
      ftout d'0 b'11110000 21
      / 7654ER00 Display on cursol on All clear
      ftout d'0 b'00001000
      ftout d'0 b'00000000
      ftout d'0 b'00011000
      ftout d'0 b'00010000
      mov regl reg900
      ret

      l'end


      F関数を追加して、所定の文字を表示させられるようにしてみます。
       Dの次に下記のような要領でポートに出力してあげると、文字をLCDに出力できることを突き止めました。

      〔下記4行で¥記号(5Ch)をLCD上に表示します〕
      ftout d'0 b'01011100 (5c 5c"\"と出力 上位4ビット5を出力)
      ftout d'0 b'01010100 (54)
      ftout d'0 b'11001100 (cc 5c"\"と出力 下位4ビットcを出力)
      ftout d'0 b'11000100 (c4)


      G Fの処理を関数化してしまいます。5c(\)を表示できるようにします。上位4ビットと下位4ビットに分けて、RSとEnable信号をHigh->Lowします。
      関数は下記のようになりました。reg110に所定の数字を入れてcall l'4bitoutputを呼び出してあげます。

      l'4bitoutput
      /           上位4ビットのみを取得する
      and reg110 b'11110000 reg111
      /           Enableピン と RSピン を Highにする
      or reg111 h'0c reg112
      /           EnableピンをLow RSピン を Highにする
      or reg111 h'04 reg113
      /           下位4ビットのみを取得する
      and reg110 b'00001111 reg114
      /           下位4ビットを 左に4つ シフトする
      calc reg114 * d'16 reg115
      /           Enableピン と RSピン を Highにする
      or reg115 h'0c reg116
      /           EnableピンをLow RSピン を Highにする
      or reg115 h'04 reg117
      ftout d'0 reg112
      ftout d'0 reg113
      ftout d'0 reg116
      ftout d'0 reg117
      ret


      H では、GとEを合成してしまいましょう。
      call l'初期化
      mov reg110 h'5c "\"を表示する文字にします。
      call l'4bitoutput

      jmp l'end

      l'初期化
      / 必要な場合REG100を参照して、パラメータとします。
      mov reg900 regl
      / 7654ER00
      ftout d'0 b'00000000 1
      ftout d'0 b'00111000 2
      ftout d'0 b'00110000 3
      ftout d'0 b'00111000 4
      ftout d'0 b'00110000 5
      ftout d'0 b'00111000 6
      ftout d'0 b'00100000 7
      ftout d'0 b'00101000 8
      ftout d'0 b'00100000 9
      ftout d'0 b'00101000 10
      ftout d'0 b'10000000 11
      ftout d'0 b'10001000 12
      ftout d'0 b'10000000 13

      ftout d'0 b'00001000 14
      ftout d'0 b'00000000 15
      ftout d'0 b'10001000 16
      ftout d'0 b'10000000 17
      ftout d'0 b'00001000 18
      ftout d'0 b'00000000 19
      ftout d'0 b'11111000 20
      ftout d'0 b'11110000 21
      / 7654ER00 Display on cursol on All clear
      ftout d'0 b'00001000
      ftout d'0 b'00000000
      ftout d'0 b'00011000
      ftout d'0 b'00010000
      mov regl reg900
      ret

      l'4bitoutput
      and reg110 b'11110000 reg111
      / Enableピン と RSピン を Highにする
      or reg111 h'0c reg112
      / EnableピンをLow RSピン を Highにする
      or reg111 h'04 reg113
      and reg110 b'00001111 reg114
      / 下位4ビットを 左に4つ シフトする
      calc reg114 * d'16 reg115
      / Enableピン と RSピン を Highにする
      or reg115 h'0c reg116
      / EnableピンをLow RSピン を Highにする
      or reg115 h'04 reg117
      ftout d'0 reg112
      ftout d'0 reg113
      ftout d'0 reg116
      ftout d'0 reg117
      ret
      l'end


       ¥記号をLCDに表示してくれたでしょうか。
      もし正常に表示されない場合には、USBケーブルの接続を一旦切り離して、繋ぎなおしてみてください。何度かやり直してみてください。それでもだめな場合には"."キーで、一行実行しながら進めていってください。WAITを入れないと早すぎてLCD側が認識できない恐れがあります。

      Iついでに、カーソルを二行目に持ってくる関数を作ってみます。
      LCD初期化後に下記のようなパターンを実行してあげると、カーソルを二行目に持って来れます。
      ftout d'0 b'11000000
      ftout d'0 b'11001000
      ftout d'0 b'00000000
      ftout d'0 b'00001000
      ftout d'0 b'00000000
      そのため、2行目一文字に移動する関数を作って、追加したものが下記のプログラムです。
      / 0番デバイスを全ビット出力モードにセットする
      ftsetbitmode 0 h'ff
      / DB2 RS
      / DB3 E
      / DB4 4
      / DB5 5
      / DB6 6
      / DB7 7
      / 7 6 5 4 E RS 0 0
      /
      /
      /
      call l'lcdinit

      / 0x31 '1' を出力してみる
      mov reg110 h'31
      call l'4bitoutput
      / 0x32 '2' を出力してみる
      mov reg110 h'32
      call l'4bitoutput
      / 0x33 '3' を出力してみる
      mov reg110 h'33
      call l'4bitoutput
      / 0x34 '4' を出力してみる
      mov reg110 h'34
      call l'4bitoutput

      mov reg110 h'28
      call l'4bitoutput
      mov reg110 h'27
      call l'4bitoutput
      mov reg110 h'6f
      call l'4bitoutput
      mov reg110 h'27
      call l'4bitoutput
      mov reg110 h'29
      call l'4bitoutput

      call l'Cursol2rows

      mov reg110 h'28
      call l'4bitoutput
      mov reg110 h'27
      call l'4bitoutput
      mov reg110 h'6f
      call l'4bitoutput
      mov reg110 h'27
      call l'4bitoutput
      mov reg110 h'29
      call l'4bitoutput

      jmp l'end

      l'4bitoutput
      and reg110 b'11110000 reg111
      / Enableピン と RSピン を Highにする
      or reg111 h'0c reg112
      / EnableピンをLow RSピン を Highにする
      or reg111 h'04 reg113
      and reg110 b'00001111 reg114
      / 下位4ビットを 左に4つ シフトする
      calc reg114 * 16 reg115
      / Enableピン と RSピン を Highにする
      or reg115 h'0c reg116
      / EnableピンをLow RSピン を Highにする
      or reg115 h'04 reg117
      ftout d'0 reg112
      ftout d'0 reg113
      ftout d'0 reg116
      ftout d'0 reg117
      ret

      l'lcdinit
      / 7654ER00
      ftout d'0 b'00000000 1
      ftout d'0 b'00111000 2
      ftout d'0 b'00110000 3
      ftout d'0 b'00111000 4
      ftout d'0 b'00110000 5
      ftout d'0 b'00111000 6
      ftout d'0 b'00100000 7
      ftout d'0 b'00101000 8
      ftout d'0 b'00100000 9
      ftout d'0 b'00101000 10
      ftout d'0 b'10000000 11
      ftout d'0 b'10001000 12
      ftout d'0 b'10000000 13

      ftout d'0 b'00001000 14
      ftout d'0 b'00000000 15
      ftout d'0 b'10001000 16
      ftout d'0 b'10000000 17
      ftout d'0 b'00001000 18
      ftout d'0 b'00000000 19
      ftout d'0 b'11111000 20
      ftout d'0 b'11110000 21
      / 7654ER00 Display on cursol on All clear
      ftout d'0 b'00001000
      ftout d'0 b'00000000
      ftout d'0 b'00011000
      ftout d'0 b'00010000
      ret

      l'Cursol2rows
      / 7 6 5 4 E RS 0 0
      / 7654ER00 Set DDRAM address 2行目にカーソルを移動する
      ftout d'0 b'11000000
      ftout d'0 b'11001000
      ftout d'0 b'00000000
      ftout d'0 b'00001000
      ftout d'0 b'00000000
      ret

      l'end


      上記のプログラムを実行してあげると下記のような写真になります。
      SD1602(LCD)とFT245RLを接続した写真です


    9. 温度センサを接続して外気温を計測
      温度センサを接続してみました。外気温を計測してみます。
      FT245とMCP3204と温度センサLM35の回路図です
      LM35DZ温度センサとFT245RLを接続した写真です
      MCP3204はこちらで調達できます
      上記の回路図を作動させるプログラムは、下記です。
      / lm35用温度センサ入力 
      / 温度を計測するプログラム。
      
      l'start
      / 温度計デバイスを0番に設定する
      mov reg200 d'0
      / 通信速度を最上の921600bit/secに設定する
      ftsetbaudrate reg200 d'921600
      / reg300 〜 reg311 の各ビットに計測した信号の入力が入ってくる
      mov reg300 d'0
      mov reg301 d'0
      mov reg302 d'0
      mov reg303 d'0
      mov reg304 d'0
      mov reg305 d'0
      mov reg306 d'0
      mov reg307 d'0
      mov reg308 d'0
      mov reg309 d'0
      mov reg310 d'0
      mov reg311 d'0
      
      / 0番デバイスを出力モードにセットする
      ftsetbitmode reg200 h'7f
      / DB0 CSへの出力端子(MCP3204のCS端子への出力)
      / DB1 DINへの出力端子(MCP3204のDIN端子への出力)
      / DB2 CLKへの出力端子(MCP3204のCLK端子への出力)
      / DB7 DOUTからの入力端子(MCP3204のDOUT端子からの入力)
      / DO 6 5 4 3 CLK DIN CS
      ftout reg200 b'00000101  
      ftout reg200 b'00000000 csをLowに設定して通信開始
      ftout reg200 b'00000100 clock:1
      ftout reg200 b'00000000 
      ftout reg200 b'00000100 clock:2
      ftout reg200 b'00000000 
      ftout reg200 b'00000100 clock:3
      ftout reg200 b'00000000 
      ftout reg200 b'00000100 clock:4
      ftout reg200 b'00000010 スタートビットとしてDINをHighに設定
      ftout reg200 b'00000110 clock:5
      ftout reg200 b'00000010 シングルエンドモードなのでDINをHighに設定
      ftout reg200 b'00000110 clock:6
      ftout reg200 b'00000000 制御ビット選択のためDINのD2をLowに設定
      ftout reg200 b'00000100 clock:7
      ftout reg200 b'00000000 制御ビット選択のためDINのD1をLowに設定
      ftout reg200 b'00000100 clock:8
      ftout reg200 b'00000000 制御ビット選択のためDINのD0をLowに設定
      ftout reg200 b'00000100 clock:9
      ftout reg200 b'00000000 
      l'wait
      ftout reg200 b'00000100 clock:10
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / d'128 regl
      ifj regl == 1 l'wait
      ftout reg200 b'00000100 clock:11
      ftout reg200 b'00000000 
      ftin reg200
      / 最上位ビットの取り出し D11bit
      calc regl / 128 regl
      mov reg311 regl
      ftout reg200 b'00000100 clock:12
      ftout reg200 b'00000000 
      ftin reg200
      / 最上位ビットの取り出し D11bit
      calc regl / 128 regl
      mov reg310 regl
      ftout reg200 b'00000100 clock:13
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg309 regl
      ftout reg200 b'00000100 clock:14
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg308 regl
      ftout reg200 b'00000100 clock:15
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg307 regl
      ftout reg200 b'00000100 clock:16
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg306 regl
      ftout reg200 b'00000100 clock:17
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg305 regl
      ftout reg200 b'00000100 clock:18
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg304 regl
      ftout reg200 b'00000100 clock:19
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg303 regl
      ftout reg200 b'00000100 clock:20
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg302 regl
      ftout reg200 b'00000100 clock:21
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg301 regl
      ftout reg200 b'00000100 clock:22
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg300 regl
      ftout reg200 b'00000100 clock:23
      ftout reg200 b'00000000 
      ftout reg200 b'00000100 clock:24
      ftout reg200 b'00000001 通信終了
      ftout reg200 b'00000101 
      ftout reg200 b'00000001 
      ftout reg200 b'00000101 
      
      mov reg400 reg311
      calc reg400 * d'2 reg400
      calc reg400 + reg310 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg309 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg308 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg307 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg306 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg305 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg304 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg303 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg302 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg301 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg300 reg400
      / DISPD…00400@d 00000000000000000000000000000303@d
      / 4096:3180=2091:x
      / x = 3180*543/4096 = 1588
      / ℃=1750-1588/8=
      calc REG400 * d'3300 REG900
      calc reg900 * d'100 reg901
      calc REG901 / d'4096 REG902
      dispd reg902
      
      dec reg800
      ftreset 0
      / DISPD…00400@d 00000000000000000000000000001708@d
      / 実測値1590mV
      
      / 実行したニーモニック数は1671行です
      / DISPD…00400@d 00000000000000000000000000002095@d
      / DISPD…00902@d 00000000000000000000000000168786@d
      / reg400が1変化したときに、REG902は80変化する
      / reg902に出力されてきた値が電位となっている。168786の場合には16.8786℃が現在の外気温
      



    10. 温度センサS-8100を接続します
      別な温度センサを接続してみます。
      S-8100温度センサとFT245RLを接続した写真です
      S-8100温度センサとFT245RLを接続した回路図です
      注意:S-8100は試験的に接続したものです。
      回路図の参考文献は
      qwerty987さんのBLOGです。

      HandleIO説明書執筆時点ではまだ正確な温度を(この文を書いている筆者は)割り出せていないので、仮の公開となっております。
      l'start
      / 温度計デバイスを0番に設定する
      mov reg200 0
      / 通信速度を最上の921600bit/secに設定する
      ftsetbaudrate reg200 921600
      / reg300 〜 reg311 の各ビットに計測した信号の入力が入ってくる
      mov reg300 0
      mov reg301 0
      mov reg302 0
      mov reg303 0
      mov reg304 0
      mov reg305 0
      mov reg306 0
      mov reg307 0
      mov reg308 0
      mov reg309 0
      mov reg310 0
      mov reg311 0
      
      / 0番デバイスを出力モードにセットする
      ftsetbitmode reg200 h'7f
      / DB0 CSへの出力端子(MCP3204のCS端子への出力)
      / DB1 DINへの出力端子(MCP3204のDIN端子への出力)
      / DB2 CLKへの出力端子(MCP3204のCLK端子への出力)
      / DB7 DOUTからの入力端子(MCP3204のDOUT端子からの入力)
      / DO 6 5 4 3 CLK DIN CS
      ftout reg200 b'00000101  
      ftout reg200 b'00000000 csをLowに設定して通信開始
      ftout reg200 b'00000100 clock:1
      ftout reg200 b'00000000 
      ftout reg200 b'00000100 clock:2
      ftout reg200 b'00000000 
      ftout reg200 b'00000100 clock:3
      ftout reg200 b'00000000 
      ftout reg200 b'00000100 clock:4
      ftout reg200 b'00000010 スタートビットとしてDINをHighに設定
      ftout reg200 b'00000110 clock:5
      ftout reg200 b'00000010 シングルエンドモードなのでDINをHighに設定
      ftout reg200 b'00000110 clock:6
      ftout reg200 b'00000000 制御ビット選択のためDINのD2をLowに設定
      ftout reg200 b'00000100 clock:7
      ftout reg200 b'00000000 制御ビット選択のためDINのD1をLowに設定
      ftout reg200 b'00000100 clock:8
      ftout reg200 b'00000000 制御ビット選択のためDINのD0をLowに設定
      ftout reg200 b'00000100 clock:9
      ftout reg200 b'00000000 
      l'wait
      ftout reg200 b'00000100 clock:10
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / d'128 regl
      ifj regl == 1 l'wait
      ftout reg200 b'00000100 clock:11
      ftout reg200 b'00000000 
      ftin reg200
      / 最上位ビットの取り出し D11bit
      calc regl / 128 regl
      mov reg311 regl
      ftout reg200 b'00000100 clock:12
      ftout reg200 b'00000000 
      ftin reg200
      / 最上位ビットの取り出し D11bit
      calc regl / 128 regl
      mov reg310 regl
      ftout reg200 b'00000100 clock:13
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg309 regl
      ftout reg200 b'00000100 clock:14
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg308 regl
      ftout reg200 b'00000100 clock:15
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg307 regl
      ftout reg200 b'00000100 clock:16
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg306 regl
      ftout reg200 b'00000100 clock:17
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg305 regl
      ftout reg200 b'00000100 clock:18
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg304 regl
      ftout reg200 b'00000100 clock:19
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg303 regl
      ftout reg200 b'00000100 clock:20
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg302 regl
      ftout reg200 b'00000100 clock:21
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg301 regl
      ftout reg200 b'00000100 clock:22
      ftout reg200 b'00000000 
      ftin reg200
      calc regl / 128 regl
      mov reg300 regl
      ftout reg200 b'00000100 clock:23
      ftout reg200 b'00000000 
      ftout reg200 b'00000100 clock:24
      ftout reg200 b'00000001 通信終了
      ftout reg200 b'00000101 
      ftout reg200 b'00000001 
      ftout reg200 b'00000101 
      
      mov reg400 reg311
      calc reg400 * d'2 reg400
      calc reg400 + reg310 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg309 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg308 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg307 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg306 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg305 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg304 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg303 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg302 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg301 reg400
      calc reg400 * d'2 reg400
      calc reg400 + reg300 reg400
      / DISPD…00400@d 00000000000000000000000000002091@d
      / 4096:3180=2091:x
      / x = 3300*543/4096 = 1588
      / ℃=1748-1588/8=
      calc REG400 * d'3300 REG900
      calc reg900 * d'100 reg901
      calc REG901 / d'4096 REG902
      / dispd reg902
      calc d'174800 - reg902 reg910
      calc reg910 / d'8 reg911
      dispd reg911
      / DISPD…00911@d 00000000000000000000000000020215@d 単位はm℃
      / 計算結果 4桁表示 下二桁は小数点以下の温度〔のはずです〕
      

    11. そのJ

      書いてます・・・バグ検査中
      もチョットお待ちください



  5. 応用編


    応用して色々な使い方をして見ます。

    1. 動画の再生方法を変えてみます・・・MCIpumpwait.ioファイルを開いてみます
      (io\ムービーを再生\のディレクトリにあります)

      / 20secの間MPEGTEST.MPGというmpegファイルを再生させます
      / ただ、パスの設定がうまくいっていないのではないかと考えられるので、
      / 同じディレクトリ内に存在しないとまずい
      / 試験したPCはWindowsMEが入っていたため、
      / サンプルのMPGとしてMPEGTEST.MPGが入っています
      mci C:\TOOLS\PSSUTIL\MEDIATST\MPEGTEST.MPG
      waitpump 20000
      MessageBox ウエイトしました 確認
      mciclose

      waitpump命令のおかげで、一秒おきにウインドウを操作することが可能になっています。

      さらに、停止ボタンでWAITしている最中に停止をすることができます。
    2. サンプルファイルを多数つけて置きました。

      全画面再生機能なども持ち合わせていますが・・・まだまだ改良中の身です。。。

      役不足なのを承知でアップロードしておりますゆえ、バシバシこーしてみよう!!!の提案をよろしくお願いします^^/提案先はBBSにお願いします。


      でも正直申し上げますと、色んな機能を追加できる分だけ、追加してしまうと次のバージョンのVC.NETを買うのが怖くなる次第です。

      その理由は・・・たとえば、画像表示機能を実装したとします・・・色々な形式に対応して書かなければなりません。でもVC.NETのパッケージでは簡単に色々なフォーマットの画像を”標準で”表示する機能をもっています。とカカレテル・・・
      そ〜考えていくと・・・次に足すべき機能は・・・何にすべきなのか迷います。(本当は画像表示が目的ではないのですから・・・)

      早いところVC.NETとNEWPCを手に入れなければならないということですね・・・もしくはハードウェア開発用に特化させていくしか考えられない・・・







  6. 方向性
     メモリを直に読み書きできないかと悪戦苦闘しています。直に読み書きができるニーモニックがあれば〜いろんなことができる!!!
     それで実際にhandleIOプロセス内部のみでのメモリ領域はアクセスができている。しかぁし、肝心のほかのプロセスのメモリが正しく読み取れない (ノ_・。)。他のプロセスが読み書きできる手法が間違いなくあるらしい。一説によるとCPUのFSレジスタを使うとか使わないとか・・・インラインアセ ンブラのみで何とかなら無いものかねぇ・・・RING3からアクセスしたいのよ〜・・・DLLでもいいけれど〜・・・情報提供望む・・・

    メモリアクセス関数一覧・・・この中にないかな・・・


  7. 危険性
    はい。大変危険です。
    危険すぎて危険すぎて、書ききれません。どんなことしちゃいけないのか・・・。壊れたときには全額保障しま〜す・・・といいたいけれど、それは無いから、安心して次の言葉を復唱して欲しい。

    ”Your own risk”
    もっと大きな声で・・・

    ”Your own risk”
    まだちいさいかな

    ”Your own risk”
    よろしい・・・でいみは、“責任は自分で取るよ〜に”ぶち壊れても知らんとよ。その代わり色々できるよ〜っていうお決まりのせりふですね!!!

       ・・・ひゃ〜かっちょぃぃぃぃぃ・・・

       ・・・ささ、人柱・人柱・・・(^^ゞ



  8. バグと仕様
    1. 当ソフトは大変不可解な仕様を持っております。たとえば、
    2. WAIT処理を行っている最中は、他の処理に進めません。
      これは、スレッド処理を行わせることにより迂回する予定ですが、WAIT中に他の処理を行わせて、次の命令を実行してしまうと、これも問題があるわけでし て、メッセージポンプには処理が廻るように迂回することは出来るとは思いますが、今のところ他の処理を受け付けないレベルでWAITしてくれます。 ``r(^^;)ポリポリ

      WAITニーモニックで大きな時間をWAITさせたい場合には、応用編を参照してください



    3. “点”をメモ帳感覚で入力できません。
        つまりファイル名を入力するときに大変困ります。
        この機能は解決しました。エディター上の任意の場所でShift+Mボタンを押してください。

        次に一回だけ.「ピリオド」が入力できるようになります。

        当ソフトではテンキーから、てんボタンを一回押すだけでカーソルの存在する行を一行実行してくれる使用となっております。
        BASICでは、Enterキーを押すと実行されてしまいますが、あえてEnterキーはメモ帳としての機能を優先させて、他に使いやすいキーとして“てん”ボタンを1ステップ実行ボタンとして定義しました。
        (そこが使いやすい!!!からやめられないロ-ロ^)

        またSHIFT+SPACEを押すと、全角入力中に半角スペースを入力することが出来るようにしておきました(半角スペースはセパレーションに必要である)

        注意:本来SHIFT+Mキーを入力すると、小文字入力時にはM(大文字へ)または大文字入力中なら小文字でmと入力されますが、この機能を特別にピリオド入力用に割り当てました!!!



    4. 苦手分野があります。
      いちおう・・・(イチオウってなんだ)・・・カウンタ機能を実現できます。しかぁし、カウントアップやカウントダウンには色々と大変なのでございま す。(変数があやしいかなぁ (◎o◎)ドキッ) 変数に関して考えると、プログラム上はVariant型を持っておりません。型については、特に制約が無いため、2進・10進・16進の変換は比較的容易 に実行できます。10進数のマイナス値が特にまずいけれど、そのへんはバグだと思って、掲示板に書き込んでください。何とか処理する方法を提案できると思 います。VOIDポインタを駆使すればきっと何とかなるのかもしれないけれど・・・(^^;; ヒヤアセ



    5. ドラッグ&ドロップに対応しております。
      普通のメモ帳は、ファイルを他からドラッグしてきて、開けるのですが、当ソフトにもそのすばらしい機能をつけております。設計段階から考慮していなかったのですが、ドラッグ&ドロップ機能がつくことになりました。


    6. デフォルトでは2進数入力になっております。
      HandleIOは一般的に"2進数"で指示を与える言語です。十進数や十六進数で定数を入力する場合には、d'123 〔10進数〕 h'12abc 〔16進数〕など指定が必要になります。十回ループする予定の場合に、たとえば
       mov reg100 10
       l'loop
        〜〜〜な処理
       dec reg100
       ifj reg100 != d'0 l'loop


       とした場合、十回ループしてくれません(悲しいことに2回しかループしません)。一行目 
      mov reg100 10
       の10は二進数の10だと認識されてしまいます。10回ループさせるには10進数で10と与える必要があるので、d'10とします。

       mov reg100 d'10
       l'loop

        〜〜〜な処理
       dec reg100
       ifj reg100 != d'0 l'loop


       とすると10回ループになります。

  9. 添付ファイル一覧
    1. index.html(HandleIOの説明書です。フレーム対応の方はこちらから!!!)
      HandleIO20030307.zip
      ├─HandleIO Index_files
      │  ├─HandleIO_kaisetu_data
      │  ├─HandleIO_setumei_data
      │  ├─bmp
      │  ├─jpg
      │  └─png
      ├─io
      │  ├─外部機器を工作して
      │  │  ├─パラレルポート接続型
      │  │  └─FT245RL接続型
      │  ├─時間を取得
      │  ├─カウンタ
      │  ├─キーボード入力
      │  ├─デバック用
      │  ├─とにかく実行してみよう
      │  ├─応用編
      │  └─音を出してみる
      └─HandleIO20090303_00
          ├─Debug
          ├─hlp
          ├─Release
          ├─res
          │  └─.xvpics
          └─メソッド追加実験中
      
      HandleIO_kaisetu.html(当ファイルです)
      HandleIO_setumei.html(当ファイルのINDEXフレームです)

      HandleIO_graph(ディレクトリ)
        |-各画像ファイル
        |-回路図など(.bmpファイル)

      handleIO.exe
      handleIO(ディレクトリ) 
        |-IO(ディレクトリ) 各種サンプルプログラムを収録(拡張子.ioが当ソフトで用いる形式のファイル)
        | |-各種サンプルプログラムを収録(拡張子.ioが当ソフトで用いる形式のファイル)
        |
        |-*.cpp
        |-*.h
        |-*.dsw
        |-*.dsp
        |-Release(ディレクトリ)
        | |-サイズを削減してコンパイルしたexeファイルおよび、それに関連するリソースなどが入っている
        |
        |-res(ディレクトリ)
        | |-リソース(コンパイル時に必要なもの)が入っている
        |



  10. 連絡先

    ファンレターからスパムメールまで何でも送ってくださいね。
    (スパムメールは(*_*)ダメ・・・ヤメテね〜)
    メールアドレス:ibara@ki.mi.to・・・茨城水戸・・・
    大橋 隆洋

    最新版はVectorにアップロードしていきます。
    HPアドレスは今のところ不定ですが、次のアドレスがあります。

    開発者の館(VECTORです)
    開発者の館(おもにhandleIOについて)
    http://www.geocities.co.jp/Bookend-Ango/4029/
    http://fruit.gaiax.com/home/scarly



    HandleIO専用のBBSとして、
    http://tohashi.mydns.jp/wf/wforum.cgi
    を設けました。出来る限りの相談を受け付けております。

    現在Vectorに新たなHPアドレスをいただく予定ですので、そちらが追加される予定です。


  11. (^_^)/~~サヨナラ・・・・オヤスミナサイ・・・


    IOポートに正常にアクセスできない場合
    この説明書で書かれている通りに進めていっても、正常にポートを読み書きできない場合があります。その大きな理由はdllファイルやsysファイルがないからだと思われます。
    http://www.internals.com/utilities/winio.zipからzipファイルをもらってきてください。zipファイルを展開すると下記のようなディレクトリ構造になっています
    ├─Examples
    │ ├─C
    │ │ └─WinIoTest
    │ │    └─Release
    │ └─VB
    │   ├─VBDumpPhys32
    │   └─VBDumpPort32
    ├─Help
    ├─Release(重要)
    │  ├─WinIo.dll
    │  ├─WinIo.sys
    │  └─WINIO.VXD
    └─Source
      ├─Dll
      │ └─Release
      └─Drv
        ├─9x
        └─NT
          ├─I386
          │ ├─Checked
          │ └─Free
          └─OBJ
            └─I386

    このなかで今回重要なのはReleaseフォルダのWinIo.dllWinIo.sysWINIO.VXDファイルです。HandleIO.exeと同じフォルダに、先のWinIo.dllWinIo.sysWINIO.VXDファイルを持ってきて、置いてください。この3つのファイルがあると正常にアクセスできるようになります。
     FT245RLをどこから調達してよいのかわからない
    http://akizukidenshi.com/catalog/g/gK-01799/(秋月電子通商)
    から購入できます(2009/03/04時点で980円でした)。私の場合狭ピッチ半田付けを苦手としているので、ピンが出ているものを使用しました。もし自分で基板を作れるのなら、¥500のものを検討してみるのもいいかもしれません。
    USB接続ケーブルも必要になります。
    HandleIOは複数のFT245RLを同時に操作する場合にも対応しております。複数台を制御する場合にはケーブルも複数必要ですし、FT245RLユニットも複数必要になります。もしUSBポートの空きが無い場合には、別パワー方式のUSBハブなども必要になるかも知れません。
     FTDI社USB接続FT245RLが動かない
     FTDI245RL用のドライバとDLL/SYSファイルが無ければ取り揃えてください。
     ドライバは下記のアドレスでダウンロードできます。
    http://www.ftdichip.com/Drivers/D2XX.htm
     この記事を書いている時点(2009/03/03)での最新版は下記のアドレスでしたのでリンクを張っておきます。
    http://www.ftdichip.com/Drivers/CDM/CDM%202.04.16%20WHQL%20Certified.zip
    ZIPファイルを展開して、下記のdll/sysファイルをHandleIO.exeと同じフォルダに入れておいてください。
    ├─amd64
    └─i386(重要)
      ├ ftbusui.dll
      ├ ftcserco.dll
      ├ ftd2xx.dll
      ├ ftd2xx.lib(これは特に必要としません)
      ├ ftdibus.sys
      ├ ftlang.dll
      ├ ftser2k.sys
      └ ftserui2.dll

     もし、パラレルポートなどのPC上のI/Oをたたくプログラムも使用する場合には、HandleIO.EXEフォルダWinIo.dllWinIo.sysWINIO.VXDファイルも一緒に入れておくことになります。

     上記のファイルを入れても動かないよ!という方のために解説しておきますと、ZIPファイルを展開したときに出てきたファイル、infファイルを使用して、FT245RL用のデバイスドライバを入れておかなければなりません。最初、FT245RLをパソコンに接続したとき、新たにデバイスドライバを要求してきます(新しいハードウェアが見つかりました)。

     このデバイスドライバを要求してくるときに、先のZIPを展開して出てきたinfファイルを選択して、デバイスドライバをインストールして置いてください。デバイスドライバのインストールは2回行うことになります。このデバイスドライバのインストールが済んでいないとFT245RLを正常に制御できません。
     なんでCSV形式なのか・・・それは、日経LINUX創刊号にてLINUXサーバのパラレルポート(I/Oポート)を操作する簡易シェルを発見し、それがCSV形式(に近い)で命令を与えていたためです。

     他にも記事を読んで、こんな風に接続していけばLCDへの表示は可能なのか〜PIOもDIOもいらない〜 (ノ°ο°)ノ オオオォォォ-と感動したことを覚えております。

     その後、双方向通信の方法を色々とあさって、
    プリンタポートでの8Bit入力の方法を発見しました。(日 経LINUXにはかかれていないので)ホントにお金が無い中でもある程度の実験が行えるのならばと、シェルよりも使いやすくしたものをVC6を使って作り 出しました。(だからコンソールのような一行実行機能が付いていて、次の行に結果が出てくるように設定することができます)

     そんな経緯で造られた言語なので、2・10・16進数の変換を気にしないで特定のポートに出力する機能が優れています。おまけとしてジャンプ命令とか条 件分岐をくっつけてみたところ、欲が出て色々応用できることを確信しました(漢字ニーモニックが処理できるけど処理速度は遅い)

     漢字ニーモニックに対応しているので、顔文字ニーモニックを定義することが可能です (ノ°ο°)ノ オオオォォォ- ・・・チャットに慣れてくると、こんな”コイツゥゥρ(^O^)ノm(+。+;)m”顔文字を見かけるかもしれません(エラー時の処理 ニーモニックとかにしてみると、視覚的にも何かがわかりやすいカモ・・・)。そんな顔文字で動く言語を簡単に定義できる基礎を提供しときます!!!


     そんなこんなで学生時代にハードウェアを作ってみたかったけれど、PIOやDIOなどのハードウェアが手に入らなくて、作れませんでした(買って失敗し たでは遅いし研究室がsoftlabだったので♪)。最近になってPIOやDIOを買わなくても、ある程度はハードウェアが作れる事がわかってまいりまし た。そんなにお金はかけられないけれど、ハードウェアを勉強して作って見たい方向けに当ソフトを開発し、提供いたします。下手なプログラムですがソース コードも付けておきました。

     中学生でもハードウェアを勉強して、コンピュータに詳しい有能な技術者が輩出されてくれれば幸いです。(中学校の”技術”の授業時間に当ソフトを使うと、いろんな勉強になると思います。)


     handleIOを見切って、RT-LINUXもインストールしてました・・・リモコン波形の赤外線読み取りはパラレルポートで充分にできました。でもhandleIOではむりかな・・・ハードウェア(フリーランカウンタ付きで)をうまく組まないと・・・

     でも、handleIOそのものにも色々なメリットがあるので、ソースコードつきでオープンにします!!!だから文句付けられて当たり前です >>BBSへ文句たれます   >>最初に戻る



    旧PC98の場合は入力できるのかな・・・)

     PC98シリーズではストローブ信号を活かして入力している(1Bit入力)が主流のようで、8Bit同時に入力する方法が載ってませんでした。(4bitぐらいまでなら入力できたような・・・記憶があります・・・定かでない)

    プリンタポートでの8Bit入力の方法を発見しました。 DOS/V機においてはSPP/EPP/ECPモードではD0〜D7ビットを利用して一括8bit入力できる仕様になっています
    / パラレルポートを入力モードに設定するには、37ahにechを出力してやる必要があります。
    out h'37a h'ec
    in h'378
    / reglに入力してきたデータが入ります
    / パラレルポートを出力モードにするには37ahポートにcchを出力してやる必要があります。
    out h'37a h'cc
    out h'378 h'ff
    / ポート378hにffを出力します。
    


    EPP/ECPにおいては1MB/sec〜8MB/secの通信速度(ISAバス並み)の速度を出すことができるようです。(キャッシュ用のチップが乗っ ている・・・詳しくはRead系やWrite系の専用関数で通信しなければなりません/デバイスドライバでDeviceIO系を使う手もあるようです)


    m(。−_−。)mス・スイマセーン

    その他参考文献です:
    参考文献 FTDI社FTD245に関する参考文献は下記の通りです。
    *
    http://www.siio.jp/index.php?FT245RL_MacOSX
    * 秋月電子VBプログラム
       ビットバングモードサンプル
    * http://ore-kb.net/hard/BitBang/