;// 割り込み処理先頭 org 0x0004

INT_ENT:

;//  退避する(PUSH処理)

         movwf   WregBuf     ;Wregをユーザーメモリ、WregBuf へ退避

                                 ;コレ以降Wレジスタは使いたい放題…。

         swapf   STSreg,to_W     ;STSレジスタを変化させないようにWレジスタへ

                                 ;swapして退避させる。復帰時もswapするので、

                                 ;結局元に戻る。

         clrf    STSreg     ;割り込み進入時はbankが不定なので、bank-0

                 ;設定した退避メモリ、STSregBufが正しくアクセス

                  ;できるようにbank0に設定する。

         movwf   STSregBuf       ;WレジスタにいれたSTSregの内容を退避

         movf    PCLATH,to_W

         movwf   PC_Buf          ;PCLATHを退避

         movf    MVC1,to_W       ;MVC1という汎用のユーザーメモリを退避

         movwf   MVC1BUF         ;退避先へ格納

         clrf    PCLATH          ;割り込み処理はPage-0で行うように指定

         movf    FSreg,to_W

         movwf   FSregBuf        ;FSregを退避

;/////////////////////////////////////////////////////////////////////////////

;//

;//     ここから割り込み処理を書く・・・。

;//

;/////////////////////////////////////////////////////////////////////////////

;// もとに戻す(POP処理)

         clrf    STSreg          ;割り込み処理内でバンクが変更されているかも

                                 ;知れないのでBank-0

         movf    MVC1BUF,to_W    ;退避していたMVC1を復帰

         movwf   MVC1

         movf    FSregBuf,to_W

         movwf   FSreg           ;FSreg復帰

         movf    PC_Buf,to_W

         movwf   PCLATH          ;PCLATH復帰

         swapf   STSregBuf,to_W  ;swapして退避していた内容をswapして

         movwf   STSreg          ;STSregに復帰する

         swapf   WregBuf,to_F    ;一度Wregバッファー内の上下ニブルを入れ替え

         swapf   WregBuf,to_W    ;さらに上下ニブルを入れ替えてWregに入れる。

                                 ;理由はmovfWregに入れると

                                 ;STSregZesroフラグが変化するから。

         retfie                  ;割り込み許可にして終了。