NuDCLその5 [Mac用USBデバイス工作]
DCLはLanguageと言っているぐらいなのでプログラミングができる、一応。
ループは作れる。コールバックにCで記述することで条件判断もできる。そして分岐はコールバックからジャンプ先を書き換えることで実現している。一種の自己変更コードと言えなくもない。
古いDCLでは
これはプールの関数ではなくlocal isoch port(OFireWireLibLocalIsochPortRef)が持っている関数である。従ってコールバックの中ではlocal isoch portの参照が手に入らないといけない。
NuDCLでは
これはlocal isoch portではなくプール(IOFireWireLibNuDCLPoolRef)の関数である。古いDCLでは実行時にはプールを参照することはないが、NuDCLでは必要になる。逆に古いDCLはその変更に関する関数はlocal isoch portに所属していた(実態はuser空間側ののI/O Kitクラスのメンバ関数)が、NuDCLではすべてプールに集約されている。
また、古いDCLではModifyJumpDCLで変更をすると、すぐポインタが付け替えられるらしくて変更が反映されるが、NuDCLでは実行時にSetDCLBranchを呼んでも反映されない。ちゃんと付け替えるためには
NuDCLがただポインタを書き換えるだけではないらしい。中身を見ていないのでよくわからない。
ループは作れる。コールバックにCで記述することで条件判断もできる。そして分岐はコールバックからジャンプ先を書き換えることで実現している。一種の自己変更コードと言えなくもない。
2.9 ジャンプ先の変更
コールバックの中でジャンプ先を変更することで条件分岐を行うが、その変更方法が古いDCLとNuDCLとでちょっと違う。古いDCLでは
IOReturn (*ModifyJumpDCL)(OFireWireLibLocalIsochPortRef self, DCLJump* inJump, DCLLabel* inLabel);と言う関数を使う。inJumpのDCLコマンドの次をinLabelに書き換える。inJumpはジャンプDCLでかつinLabelはラベルDCLでないとエラーが返ってジャンプ先を変更できない。
これはプールの関数ではなくlocal isoch port(OFireWireLibLocalIsochPortRef)が持っている関数である。従ってコールバックの中ではlocal isoch portの参照が手に入らないといけない。
NuDCLでは
IOReturn (*SetDCLBranch)(NuDCLRef dcl, NuDCLRef branchDCL);と言う関数を使う。これも同じことを行うが、引数のdclとbranchDCLはなんでもかまわない。
これはlocal isoch portではなくプール(IOFireWireLibNuDCLPoolRef)の関数である。古いDCLでは実行時にはプールを参照することはないが、NuDCLでは必要になる。逆に古いDCLはその変更に関する関数はlocal isoch portに所属していた(実態はuser空間側ののI/O Kitクラスのメンバ関数)が、NuDCLではすべてプールに集約されている。
また、古いDCLではModifyJumpDCLで変更をすると、すぐポインタが付け替えられるらしくて変更が反映されるが、NuDCLでは実行時にSetDCLBranchを呼んでも反映されない。ちゃんと付け替えるためには
IOReturn (*Notify)(IOFireWireLibLocalIsochPortRef self, IOFWDCLNotificationType notificationType, void ** inDCLList, UInt32 numDCLs);を呼んでlocal isoch portに明示的に教えなければならない。notificationTypeにはkFWNuDCLModifyJumpNotification定数を指定する。また、inDCLListにはジャンプ先を変更したNuDCLコマンドの配列を渡す。numDCLsはその配列の長さである。このNotify関数は、実行時ではなく(コールバック関数の中ではなく)コマンド列を作るときでは呼ぶ必要はない、となっている。
NuDCLがただポインタを書き換えるだけではないらしい。中身を見ていないのでよくわからない。
2010-07-02 21:20
nice!(0)
コメント(0)
トラックバック(0)
コメント 0