MOVLW D'100'
MOVF VAR, F
MOVF VAR2, W
MOVWF VAR1
INCF VAR, F
MOVLW D'100'
ADDWF VAR, F
MOVF VAR2, W
ADDWF VAR1, F
MOVLW D'100' ;100 回ループ
MOVWF i
LOOP
...
DECFSZ i, F
GOTO LOOP
SUBLW 100 ; 100 - w -> w
BTFSC STATUS, Z ; w == 100 でなかったらスキップ
GOTO W_IS_100
GOTO W_IS_NOT_100
W_IS_100
...
goto ...
W_IS_NOT_100
...
MOVLW 100 ;VAR - 100 → W
SUBWF VAR, W ;
BTFSC STATUS, Z ;VAR == 100 でなかったらスキップ
GOTO VAR_IS_100
GOTO VAR_IS_NOT_100
VAR_IS_100
...
VAR_IS_NOT_100
...
MOVF B, W ; B → W
SUBWF A, W ; A - W → W
BTFSC STATUS, C ; A >= B なら負でない
GOTO A_LARGER_EQUAL
GOTO B_LARGER
==== C ====
switch (FLAG) {
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
default:
...
break;
}
==== ASSEMBLER ===
DECF FLAG, F
BTFSC STATUS, Z
GOTO CASE_1
DECF FLAG, F
BTFSC STATUS, Z
GOTO CASE_2
DECF FLAG, F
BTFSC STATUS, Z
GOTO CASE_3
DEFAULT
...
GOTO xxx
CASE_1
...
GOTO xxx
CASE_2
...
GOTO xxx
CASE_3
...
GOTO xxx
(FLAG の値を壊さないようにする場合は次のように TEMP_FLAG を用意する)
MOVF FLAG, W
MOVWF TEMP_FLAG ; FLAG の値を代入
DECF TEMP_FLAG, F
BTFSC STATUS, Z
GOTO CASE_1
DECF TEMP_FLAG, F
BTFSC STATUS, Z
GOTO CASE_2
DECF TEMP_FLAG, F
BTFSC STATUS, Z
GOTO CASE_3
DEFAULT
...
GOTO xxx
CASE_1
...
GOTO xxx
CASE_2
...
GOTO xxx
CASE_3
...
GOTO xxx
==== C ====
switch (FLAG) {
case 2:
...
break;
case 4:
...
break;
case 6:
...
break;
default:
...
break;
}
==== ASSEMBLER ====
MOVLW 2 ; 2 の場合の分岐処理
SUBWF FLAG, W ;
BTFSC STATUS, Z ;
GOTO CASE_2 ;
MOVLW 4 ; 4 の場合の分岐処理
SUBWF FLAG, W ;
BTFSC STATUS, Z ;
GOTO CASE_4 ;
MOVLW 6 ; 6 の場合の分岐処理
SUBWF FLAG, W ;
BTFSC STATUS, Z ;
GOTO CASE_6 ;
DEFAULT
...
GOTO xxx
CASE_2
...
GOTO xxx
CASE_4
...
GOTO xxx
CASE_6
...
GOTO xxx
A_LOW EQU ...
B_LOW EQU ...
A_HIGH EQU ...
B_HIGH EQU ...
MOVF B_LOW, W
ADDWF A_LOW, F ; 下位が A_LOW へ
BTFSC STATUS, C ; あふれたら上位へ +1
INCF B_HIGH, F
MOVF B_HIGH, W
ADDWF A_HIGH, F ; 上位が A_HEGH へ
BCF STATUS, C
RLF VAR, F
キャリーフラグをクリアしてからシフトするのがポイントです。
BCF STATUS, C
RRF VAR, F
キャリーフラグをクリアしてからシフトするのがポイントです。