HandleIO にふれる
Copyright, 2010 © Scarly Hardware
ヒント
プログラムは別途配布しています。
HandleIO にできること
• HandleIO はパソコンからの信号入出力 (I/O) を簡易に行うことができます。
• FT245 という USB デバイスを制御できます
– パソコンからの信号出力を FT245 に向けて行う と、 FT245 は信号を8 bit 単位で出力してくれ ます。
– 同様に、 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 等 一個のレジスタに は32 bit のデータを格納できる
• 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 レジスタとできる はず