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 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レジスタとできるはず