こんな感じのコードが本に乗っていたのだが、

/* 32bit segment func */
void __far func(ushort sel,ulong num);

/* メイン関数は16bit セグメント上にあるものとする */
void main(){
void (__far *pFunc)();

ushort sel = AllocateSel();/*セレクタ値の取得*/

/* これがわからん */
pFunc = (void (__far*)())(((ulong)sel<<16 + (ushort)func);

RealToProto(); // real mode to protect mode
aFunc(a,b); // 32ビットセグメント上の関数を呼ぶ。
ProtoToReal();// protect mode to real mode
}

MSDOSのC言語処理系だと、__far 属性の関数は
従来どおりにセグメントアドレスとオフセットアドレスで指定
するから、それに対応するため、16bit セグメントから
32bit セグメントのコードをcall するための
テクニックなんだそうだが、よくわかんないです。

とくにこの部分。

pFunc = (void (__far*)())(((ulong)sel<<16 + (ushort)func);

関数ポインタに「セレクタ値:オフセットアドレス」
をセットしておくための処理らしいのだが、よくわからんです。

どなたか、ご教授ください。お願いします。