8bit,16bit割り算、2進,10進,16進数値変換等のライブラリ

icon 項目のみ表示/展開表示の切り替え

概要

8bit/8bit,16bit/8bit割り算、2進,10進,16進数値変換等をサポートしたライブラリです。
使用する場合はstdlib.incをインクルードしstdlib.asmをプロジェクトに追加してください

プログラムの説明

ソースファイル

以下のファイルで構成されている
stdlib.asm ・・・ 8bit,16bit割り算、2進,10進,16進数値変換等のライブラリ Version 1.00
stdlib.inc ・・・ 8bit,16bit割り算、2進,10進,16進数値変換等のインクルートファイル Version 1.00

サブルーチン

以下のサブルーチンをサポート

div8_8

8bit/8bitの商と余りを計算します。計算方法は筆算同様です。0除算および非除数<�除数時のエラー処理はしていないので本サブルーチンコール前に必要であればエラー処理を実施してください。
非除数をDIV_A、除数をDIV_Bに格納して本サブルーチンをコールすると商がDIV_A、余りはDIV_MODに格納されます。

div16_8

16bit/8bitの商と余りを計算します。計算方法は筆算同様です。0除算および非除数<�除数時のエラー処理はしていないので本サブルーチンコール前に必要であればエラー処理を実施してください。
非除数をDIV_AH:DIV_AL、除数をDIV_Bに格納して本サブルーチンをコールすると商がDIV_AH:DIV_AL、余りはDIV_MODH:DIV_MODLに格納されます。

word2deg

2バイト符号なし整数を10進文字列5桁に変換します。ゼロサプレスはサポートしていません。
FSR1に文字列格納アドレス、ARGH:ARGLに整数を格納してから本サブルーチンをコール
FSR1は5を加算されます

word2sdeg

2バイト符号有り整数(2の補数形式)を10進文字列5桁に変換します。ゼロサプレスはサポートしていません。
FSR1に文字列格納アドレス、ARGH:ARGLに整数を格納してから本サブルーチンをコール
FSR1は6を加算されます

word2hex

2バイト整数を16進文字列4桁に変換します。ゼロサプレスはサポートしていません。
FSR1に文字列格納アドレス、ARGH:ARGLに整数を格納してから本サブルーチンをコール
FSR1は4を加算されます

word2bin

2バイト整数を2進文字列16桁に変換します。ゼロサプレスはサポートしていません。
FSR1に文字列格納アドレス、ARGH:ARGLに整数を格納してから本サブルーチンをコール
FSR1は16を加算されます

byte2deg

1バイト符号なし整数を10進文字列3桁に変換します。ゼロサプレスはサポートしていません。
FSR1に文字列格納アドレス、ARG1に整数を格納してから本サブルーチンをコール
FSR1はrを加算されます

byte2sdeg

1バイト符号有り整数(2の補数形式)を10進文字列3桁に変換します。ゼロサプレスはサポートしていません。
FSR1に文字列格納アドレス、ARG1に整数を格納してから本サブルーチンをコール
FSR1は4を加算されます

byte2hex

1バイト整数を16進文字列2桁に変換します。ゼロサプレスはサポートしていません。
FSR1に文字列格納アドレス、ARG1に整数を格納してから本サブルーチンをコール
FSR1は2を加算されます

byte2bin

1バイト整数を2進文字列8桁に変換します。ゼロサプレスはサポートしていません。
FSR1に文字列格納アドレス、ARG1に整数を格納してから本サブルーチンをコール
FSR1は8を加算されます

hex2word

16進文字列を2バイト整数に変換します。
FSR1に文字列アドレスを設定して本サブルーチンをコールすると、ARGH:ARGLに整数が格納されます

ソースコード

stdlib.inc

; 数値を文字列に変換、除算ライブラリー  Version 1.00
; File:        lcd.asm
; Target:      PIC18F14K50 48Mhz
; アセンブラ:   Microchip MPASM(v5.51)
; 書き込み:     PICKit 3
; リリース:     2013/10/01 21:00

       EXTERN div8_8
       EXTERN div16_8
       EXTERN word2hex,word2deg,word2sdeg,word2bin
       EXTERN byte2hex,byte2bin,byte2deg,byte2bin
       EXTERN hex2word

stdlib.asm

; 数値を文字列に変換、除算ライブラリー  Version 1.00
; File:        lcd.asm
; Target:      PIC18F14K50 48Mhz
; アセンブラ:   Microchip MPASM(v5.51)
; 書き込み:     PICKit 3
; リリース:     2013/10/01 21:00

        #INCLUDE <p18f14k50.inc>

        EXTERN  DIV_MOD,DIV_A,DIV_B,Temp1,DIV_MODL,DIV_MODH,DIV_AL,DIV_AH
        EXTERN  ARGH,ARGL,ARG1,BYTE2HEX_TEMP
        GLOBAL  div8_8,div16_8
        GLOBAL  word2hex,word2deg,word2sdeg
        GLOBAL  byte2hex,byte2bin,byte2deg
        GLOBAL  byte2bin,word2bin
        GLOBAL  hex2word

        CODE

;       除算    DIV_A / DIV_B  商はDIV_A   余りはDIV_MODに返される
div8_8      ;   8bit/8bit=8bit
        clrf    DIV_MOD
        movlw   8
        movwf   Temp1
div8_8_loop
        bcf     STATUS,C            ;   キャリーフラグクリア
        rlcf    DIV_A
        rlcf    DIV_MOD

        movf    DIV_B,W
        subwf   DIV_MOD   ;   f-W->f
        bnc     div8_8_non_sub     ;   引き算結果が負の場合
        bsf     DIV_A,0
        bra     div8_8_shift
div8_8_non_sub
        movf    DIV_B,W
        addwf   DIV_MOD            ;   引き算の結果を足して戻す
div8_8_shift
        decfsz  Temp1
        bra     div8_8_loop
        return

;       除算    DIV_AH:DIV_AL / DIV_B  商はDIV_AH:DIV_AL   余りはDIV_MODL:DIV_MODLに返される
div16_8      ;   16bit/8bit=16bit
        clrf    DIV_MODL
        clrf    DIV_MODH
        movlw   d'16'
        movwf   Temp1
div16_8_loop
        bcf     STATUS,C
        rlcf    DIV_AL
        rlcf    DIV_AH
        rlcf    DIV_MODL
        rlcf    DIV_MODH

        movf    DIV_B,W
        subwf   DIV_MODL
        movlw   0
        subwfb  DIV_MODH
        bnc     div16_8_non_sub
        bsf     DIV_AL,0
        bra     div16_8_shift
div16_8_non_sub
        movf    DIV_B,W
        addwf   DIV_MODL
        movlw   0
        addwfc  DIV_MODH
div16_8_shift
        decfsz  Temp1
        bra     div16_8_loop
        return


word2sdeg   ; 2の補数形式のwordを10進数に変換
        movf    ARGH,W
        bn      word2sdeg_neg
        movlw   '+'
        movwf   POSTINC1
        rcall   word2deg
        return

word2sdeg_neg   ;   負
;   wordの2の補数形式で符号反転
        comf    ARGH
        comf    ARGL
        incf    ARGL
        movlw   0
        addwfc  ARGH
        movlw   '-'
        movwf   POSTINC1
        rcall   word2deg
        return

word2deg    ;   2byteの整数を10進数文字列に変換する
        movlw   d'4'
        addwf   FSR1L
        movlw   0
        addwfc  FSR1H

        movf    ARGL,W
        movwf   DIV_AL
        movf    ARGH,W
        movwf   DIV_AH
        movlw   d'10'
        movwf   DIV_B

        rcall   div16_8
        movf    DIV_MODL,W
        addlw   '0'
        movwf   POSTDEC1
        rcall   div16_8
        movf    DIV_MODL,W
        addlw   '0'
        movwf   POSTDEC1
        rcall   div16_8
        movf    DIV_MODL,W
        addlw   '0'
        movwf   POSTDEC1
        rcall   div16_8
        movf    DIV_MODL,W
        addlw   '0'
        movwf   POSTDEC1
        movf    DIV_AL,W
        addlw   '0'
        movwf   POSTDEC1

        return

byte2deg    ;   1byeの整数を10進文字列に変換する
        movf    ARG1,W

        movwf   POSTINC1
        movwf   POSTINC1

        movwf   DIV_A
        movlw   d'10'
        movwf   DIV_B
        call    div8_8
        movf    DIV_MOD,W
        movwf   POSTDEC1
        call    div8_8
        movf    DIV_MOD,W

        movwf   POSTDEC1
        movf    DIV_A,W
        movwf   INDF1
        movlw   '0'
        addwf   POSTINC1
        addwf   POSTINC1
        addwf   POSTINC1
        return

word2hex          ;  2byte整数を16進数変換する
        movf    ARGH,W
        movwf   ARG1
        rcall   byte2hex

        movf    ARGL,W
        movwf   ARG1
        rcall   byte2hex

        return

byte2hex           ;  1byte整数を16進数変換する
        movlw   d'10'
        movwf   BYTE2HEX_TEMP
        iorwf   POSTINC1

        movf    ARG1,W   ;   下位
        andlw   0fh
        movwf   POSTDEC1

        swapf   ARG1,W   ;   上位
        andlw   0fh
        movwf   POSTINC1

        movf    INDF1,W     ;   下位
        cpfsgt  BYTE2HEX_TEMP
        addlw   d'7'
        addlw   '0'
        movwf   POSTDEC1

        movf    INDF1,W     ;   上位
        cpfsgt  BYTE2HEX_TEMP
        addlw   d'7'
        addlw   '0'
        movwf   INDF1

        movf    POSTINC1,F
        movf    POSTINC1,F
        return

byte2bin           ;  1byte整数を2進数変換する
        movlw   8
        movwf   Temp1
byte2bin_loop
        movlw   '0'
        btfss   ARG1,7
        goto    byte2bin_loop2
        addlw   1
byte2bin_loop2
        movwf   POSTINC1
        rlncf   ARG1
        decfsz  Temp1
        goto    byte2bin_loop
        return

word2bin
        movff   ARGH,ARG1
        rcall   byte2bin
        movff   ARGL,ARG1
        rcall   byte2bin
        return


hex2word    ; 16進数文字列をword数値に変換 FSR1:文字列アドレス
        clrf    ARGL
        clrf    ARGH

        movlw   d'9'
        movwf   Temp1

hex2word_l2
        movlw   029h ; 0未満の文字コードの場合終了する
        cpfsgt  INDF1 ; F>WREGのときスキップ
        bra     hex2word_l1
        movf    INDF1,W
        bz      hex2word_l1

        ; 4bit左シフト

        rlcf    ARGL,F
        rlcf    ARGH,F
        rlcf    ARGL,F
        rlcf    ARGH,F
        rlcf    ARGL,F
        rlcf    ARGH,F
        rlcf    ARGL,F
        rlcf    ARGH,F
        movf    ARGL,W
        andlw   0f0h
        movwf   ARGL

        movf    INDF1,W
        movff   POSTINC1,ARG1
        movlw   '0'
        subwf   ARG1,W

        cpfslt  Temp1 ; WREG>F(9) のときスキップ
        bra     hex2word_l3
        movwf   ARG1
        movlw   'a'-'0'-d'10'
        subwf   ARG1,W
hex2word_l3

        iorwf   ARGL,F
        bra     hex2word_l2
hex2word_l1
        return

        END