;// 割り込み処理先頭 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に入れる。
;理由はmovfでWregに入れると
;STSregのZesroフラグが変化するから。
retfie ;割り込み許可にして終了。