PICで関数ポインタもどき
をADDLW PCL,Fで書いてみたのですが,限界がありました.通常のRETLWを使ったテーブルでもこの問題は存在するでしょう.
適当なコードですがメモして置きます.
CLRF Cnt Main_Loop NOP INCF Cnt,F CALL Function_Pointer ;関数ポインタの実験 GOTO Main_Loop org 0x100 ;この関数とテーブルであるGOTO文までは全て256バイト以内に収まっていなくてはならない. ;実際のGOTO先は同一ページ内であれば問題ない. Function_Pointer MOVLW HIGH(Function_Pointer) MOVWF PCLATH MOVF Cnt,W ANDLW ffh ;ffにすることで最大256−5(GOTOテーブルの直前の処理)個の関数へジャンプできるはず. ;なぜならそれ以上の値はPCLで表現できる範囲を越えるので,正しくジャンプできなくなるため. ADDWF PCL,F ;ジャンプ先はRet_Valueに関数名の値をロードしている.実験的にジャンプ先は16個までとする GOTO Load_0 GOTO Load_1 GOTO Load_2 GOTO Load_3 GOTO Load_4 GOTO Load_5 GOTO Load_6 GOTO Load_7 GOTO Load_8 GOTO Load_9 GOTO Load_10 GOTO Load_11 GOTO Load_12 GOTO Load_13 GOTO Load_14 GOTO Load_15 org 0x200 Load_0 MOVLW d'0' MOVWF Ret_Value RETURN Load_1 MOVLW d'1' MOVWF Ret_Value RETURN Load_2 MOVLW d'2' MOVWF Ret_Value RETURN Load_3 MOVLW d'3' MOVWF Ret_Value RETURN Load_4 MOVLW d'4' MOVWF Ret_Value RETURN Load_5 MOVLW d'5' MOVWF Ret_Value RETURN Load_6 MOVLW d'6' MOVWF Ret_Value RETURN Load_7 MOVLW d'7' MOVWF Ret_Value RETURN Load_8 MOVLW d'8' MOVWF Ret_Value RETURN Load_9 MOVLW d'9' MOVWF Ret_Value RETURN Load_10 MOVLW d'10' MOVWF Ret_Value RETURN Load_11 MOVLW d'11' MOVWF Ret_Value RETURN Load_12 MOVLW d'12' MOVWF Ret_Value RETURN Load_13 MOVLW d'13' MOVWF Ret_Value RETURN Load_14 MOVLW d'14' MOVWF Ret_Value RETURN Load_15 MOVLW d'15' MOVWF Ret_Value RETURN
これ以上のテーブルを使う場合はDECFもしくはINCFとBTFSC STATSU,ZとかBTFSC STATUS,Cを使ったべたな分岐処理になると思います.
ん〜 エレガントへの道は遠いなぁ.