Transcript 技術情報の提示
HandleIOにふれる ヒント プログラムは別途配布しています。 Copyright, 2010 © Scarly Hardware HandleIOにできること • HandleIOはパソコンからの信号入出力 (I/O)を簡易に行うことができます。 • FT245というUSBデバイスを制御できま す – パソコンからの信号出力をFT245に向けて行 うと、FT245は信号を8bit単位で出力してく れます。 – 同様に、FT245からの入力もパソコンに向け て(8bit単位で)送ってくれて、パソコンは信 号を取り込めます。 LEDをつないでみる LCDをつないでみよう LEDにつなぎ変えて信号の送 信パターンを見てもらおう 温度計を接続して温度を計測 Handleに関して ウインドウハンドルという番 号 • ウインドウズでは一つ一つのウインド ウに16進数で番号を振っている • 各ウインドウの番号がわかると、ウイ ンドウを操作することが可能となる。 HANDLELIST関数 • ウインドウハンドル一覧を表示する ほかのウインドウにいたずら してみよう • ウインドウを半透明にしてみる(layer関 数) • ウインドウのタイトルを書き換えてみ る(sendtext関数) • ウインドウの内容を書き換えてみる (REPLACESEL関数) HANDLEFIND関数 • ウインドウタイトル一覧からウインド ウ名が一致するものをリストアップす る GETWINDOWHANDLE関数 • ウインドウハンドル(16進8桁)の番 号から、親子関係のウインドウ(ハン ドル番号)などを取得する SendText関数 • ほかのウインドウのタイトルテキスト を書き換えるのに使用する REPLACESEL関数 • エディタなどの文字列追記に使用する BNCLICK関数 • ボタンを押したことにしてくれる関数 で、引数にボタンのハンドルを入力し てあげる。 WhatTheTimeNow関数 • 現在時刻を取得、表示してくれる関数 時刻連動 • 何時になると何かをする • 一時間おきに温度を計測する • 14時00分の温度を(一日おきに)計測す る WAITTIME関数 • 特定の時刻までWAITしてくれる関数 • パラメータは秒 分 時の順に与える。 (分や時は書かなくてもよい) • オルゴールの定時再生 (下記の場合には12:00分に鳴る) WAVファイルでオルゴールを取り込ん でおく必要性あり – WAITTIME d’0 d’0 d‘12 – ♪ loop_5.wav WAITPUMP関数 • 数ms~数分待ちたい場合に使用する • 何らかの作業を順番に行うときに、一 旦停止していてほしいときがある。そ のようなときに用いる関数 • 2000ms(2秒)待つ場合 • waitpump 2000 • お風呂タイマー/カップラーメンタイ マー/キッチンタイマー EXEC関数 • 別のプログラムを呼び出したい場合に 用いる • exec notepad等 ここからは、時間に余裕があ る場合に解説 64bit化とレガシーデバイス化 • パラレルポートはレガシーデバイス • SCSI・ゲームポートはレガシーデバイス • BEEP音を発する(8254経由)スピーカはレ ガシーデバイス 32bit Windows と 64bit Windows • 一度に計算する(処理する)量が違う さらに CPUのレジスタ数が増えた。 関数などを呼び出すときに、(関数の パラメータをスタックに積まず、CPU の レジスタ に書き込んで処理をする場 合がある→CPU有効利用によりプログ ラムが高速実行される) • 64bit Nativeな(64Bitシステム用に作 られた)プログラム 以外の32bitプログ 32bit Windows と 64bit Windows • HandleIOは32bit専用プログラムなの で、正常に動作しない機能もある。 Beepをかけようと、 (HandleIO を用いて)0x61番I/Oポートを操作し てみると、64bit Windows上ではなか なか思い通りに動かない。 • これは64bit windows7 ではセキュリ ティが強化されている事が要因 • out h'61 b'00000011 • out h'61 b'00000000 セキュリティが強化されてい る事による不具合 • 未署名なデバイスドライバは動作して くれない(一時的に動かす方法はある) • 一時的に動作させる場合にはF8キーを 押しながらブートする 64bit Win7では、I/Oの61h をどう割り当てているのか • マザーボード リソース I/Oアクセス実験 • 64bit WINDOWS7から 0x61番ポート を直接たたいてみる – (セキュリティが影響しているらしく、一 瞬しかならない) • 32bit WINDOWS XP(仮想マシン上) から0x61番ポートをたたいてみる BEEP音は64bit環境でも鳴る のか • BEEP関数を呼び出してみる • BEEP関数は kernel32.dllに存在する (さらにはntdll.dllを呼び出している)。 BEEP音は64bit環境でも鳴る のか • 参考文献: http://cpplover.blogspot.com/2010/ 01/windows-7beep.html によると、 8254出力ラインは、サウンドカードの 専用入力につながってる beepはもう、パソコンのスピーカーか ら再生されている レジスタ演算 • HandleIOは変数のない言語… すべてはレジスタに記憶 • REG100/REG10等 一個のレジスタに は32bitのデータを格納できる • mov reg100 d’10 mov reg101 d’5 calc reg100 / reg101 reg102 dispd reg102 decz関数 • レジスタ -1を演算して結果が0の時 にはすぐしたの命令を飛ばして、次の 行に進む • • • • • • • • mov reg100 5 mov reg200 1 l'loopstart calc reg200 * d'10 reg200 decz reg100 jmp l'loopstart l'finish dispd reg200 HandleIOとプログラミング • なぜプログラミングに話を持っていく のか… – プログラムを自分で書くと、発散の方向性 にむかう – 応用性の高さ 色々な応用が利く • 外部の状態を取り込んで何かをさせる – 温度計をつないで、何度以下ならヒーター スイッチOn – CDS(光導電セル)をつないで、暗くなって きたら自動で照明On HandleIOの難しいところ • アセンブラの考え方をベースにしてい るため、使いこなすにはそれなりの知 識が必要。条件分岐などさせると、結 構ややこしくなる クロージング • 64bit化した、Nativeなアプリケーショ ンにする必要性 • Handle一覧を表示するとき、64bitでは 2倍幅の一覧表示ができるはず • レジスタも32ビットで1レジスタではな く、64ビットで1レジスタとできるはず