PIC16 のタイマ

上の話は、アナログフロントエンドですが、それに加えて PIC のテストコードも書かなくてはなりません。
いま、PIC16 を使って、TIMER 1 の asynchronous counter 機能で外部クロックの周波数を測ろうとしています。PIC16 では、タイマカウンタは 16ビットなのですが、上下それぞれ別々に読まないといけません。ここで、よくある問題「上位バイトを読んでいる間に下位バイトが桁あふれを起こしてしまった」に対処しなくてはいけないのですが、HI-TECH C コンパイラの TMR1 定義では、特に何も考えていないようで、ユーザー側で対処が必要です。はっきり言って、こんなのマクロか何か用意してくれ、という感じですが。(ちなみにこの問題ですが、PIC16F87XA のユーザーズガイドではアプリケーションノート DS31012A への参照があるのに、PIC16F887 のユーザーズガイドには、詳しい説明がありません。)
試しに普通に次のようなコードを書いて、アセンブリ出力を見てみたのですが、ダメですね。おまけに、出てくるアセンブリソースが、いくら最適化をしていないとはいえ、何も考えていないコードでガックリきます。

unsigned int tmr_tmp;
tmr_tmp = TMR1;    // ← 問題はここだ
if (tmr_tmp < last_ct16)
    ct_high ++;
last_ct16 = tmr_tmp;

アセンブリで書かなくていけないのか、メンドーだなあ。PIC32 だと GCC が使えるという噂だけど、それも大袈裟だ。Atmel を使うのも腰が重い。
通常の関数ならともかく、割込ルーチンがベタだと、悲しい気分になりますね。