山本ワールド
8bit,16bit割り算、2進,10進,16進数値変換等のライブラリ
概要
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
