山本ワールド
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