SSブログ

NuDCLその5 [Mac用USBデバイス工作]

DCLはLanguageと言っているぐらいなのでプログラミングができる、一応。

ループは作れる。コールバックに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がただポインタを書き換えるだけではないらしい。中身を見ていないのでよくわからない。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立07/02献立07/03 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。