Renesas Synergy™

FAQ 1006735 : 78K0Sで 10進の計算をしたいのですが補正命令がありません。プログラム例はありませんか?

(1) 以下のプログラムで 10進補正を行う事ができます。
78K0の 10進補正命令 (ADJBA命令及び ADJBS命令) を ADJBAS (加算補正)、
または ADJBSS (減算補正 )へのサブルーチン・コールに置き換えてください。

(2) プログラムの書き換えが大変な場合には以下のようにマクロを定義することでサブルーチン・
コールに置き換わります。

ADJBA   MACRO
        CALL    ADJBAS
        ENDM
ADJBS   MACRO
        CALL    ADJBBS
        ENDM


(3) 何回も使うのでコール命令ではプログラムが大きくなりすぎるとお考えの場合には
CALLT命令を使うことで短くできます。
マクロの定義を以下のように変更して、CALLTテーブルを定義してください。

;
;       マクロの定義
;
ADJBA   MACRO
        CALLT   [ADJBAT]
        ENDM
ADJBS   MACRO
        CALLT   [ADJBST]
        ENDM
;
;       CALLTテーブルの定義
;
CALTTBL CSEG    AT      40H
ADJBAT: DW      ADJBAS
ADJBST: DW      ADJBSS

;
;       10進補正(加算)
;
ADJBAS: PUSH    BC
        MOV     C, #0
        BNC     $NEXT0          ; IF C=1 ADJUST 60H
        MOV     C, #0B0H
NEXT0:  BT      PSW.4, $NEXT1   ; JUMP IF AC=1
        MOV     B,A             ; SAVE DATA
        AND     A, #0FH         ; MASK UPPER NIBBLE
        CMP     A, #0AH
        MOV     A, B            ; RESTORE DATA
        BC      $NEXT3          ; JUMP IF NOT ADJUST
NEXT1:  ADD     A, #6           ; ADJUST
        MOV     B, A            ; SAVE DATA
NEXT2:  BNC     $NEXT3
        MOV     C, #0B0H
NEXT3:  CMP     A, #0A0H
        BC      $NEXT4
        MOV     C, #0B0H
NEXT4:  ADD     A, C
        ADD     A, C
        POP     BC
        RET
;
;       10進補正(減算)
;
ADJBSS: PUSH    BC
        MOV     C, #0
        BNC     $NEXT5
        MOV     C, #0D0H
NEXT5:  BF      PSW.4, $NEXT6
        SUB     A, #6
NEXT6:  BNC     $NEXT7
        MOV     C, #0D0H
NEXT7:  ADD     A, C
        ADD     A, C
        POP     BC
        RET


(4) 以上の補正ルーチンを使って、78K0のアプリケーション・ノートの 10進加算 (符号付き)
を使う事ができます。
ただし、1ビットの転送 命令がないので、

        MOV1    CY, SFLAG
        NOT1    CY
        MOV1    SFLAG, CY


を以下のように変更します。

        MOV     A, FLAG
        XOR     A, #1
        MOV     FLAG, A


その上で、このサブルーチンを呼び出す側で以下のように定義してください。

FLAGS   DSEG    SADDR
FLAG:   DS      (1)
SFLAG   EQU     FLAG.0

 

 

適用製品

78K0S/Kx1+
他にご質問がございましたら、リクエストを送信してください