line source
;=============================================================================+ −
;+ −
; File convert.asm ## V2.98+ −
;+ −
; Converts register values to string+ −
;+ −
; Copyright (c) 2011, Matthias Heinrichs, HeinrichsWeikamp, all right reserved.+ −
;=============================================================================+ −
; HISTORY+ −
; 2007-10-07 : [MH] Creation for OSTC sources+ −
; 2010-12-10 : [jDG] Optimize macro size+ −
;+ −
+ −
#include "hwos.inc" ; Mandatory header+ −
+ −
basic CODE+ −
+ −
;=============================================================================+ −
+ −
global output99_call+ −
output99_call:+ −
clrf ignore_digits+ −
incf ignore_digits,F+ −
clrf cvt_temp4+ −
+ −
+ −
global output99+ −
output99:+ −
movlw d'99'+ −
cpfslt lo+ −
movwf lo ; Limit to 99+ −
movff lo,lo_temp+ −
clrf hi_temp+ −
bcf pre_zero_flag ; do not display leading zeros+ −
+ −
LCD_val99_2:+ −
movlw .10 ; 10+ −
movwf cvt_temp2+ −
clrf cvt_temp3+ −
rcall DEC2ASCII+ −
+ −
movlw .1 ; 1+ −
movwf cvt_temp2+ −
clrf cvt_temp3+ −
bsf pre_zero_flag ; last figure, display zero (0)+ −
rcall DEC2ASCII+ −
return+ −
+ −
global output99x_call+ −
output99x_call:+ −
clrf ignore_digits+ −
incf ignore_digits,F+ −
clrf cvt_temp4+ −
+ −
movlw d'99'+ −
cpfslt lo+ −
movwf lo ; Limit to 99+ −
movff lo, lo_temp+ −
clrf hi_temp+ −
bsf pre_zero_flag ; display leading zeros+ −
bra LCD_val99_2+ −
+ −
+ −
global output8_call+ −
output8_call:+ −
clrf ignore_digits+ −
incf ignore_digits,F+ −
clrf cvt_temp4+ −
+ −
output8:+ −
movff lo, lo_temp+ −
clrf hi_temp+ −
bcf pre_zero_flag ; do not display leading zeros+ −
movlw .100 ; 100+ −
movwf cvt_temp2+ −
clrf cvt_temp3+ −
rcall DEC2ASCII+ −
bra LCD_val99_2+ −
+ −
+ −
global output16_4_call+ −
output16_4_call: ; limit to 9999+ −
bsf show_last4+ −
; 9999 = 27 0F = [39][15]+ −
movlw .40+ −
cpfslt hi ; hi < 40 ?+ −
bra output16_4_call_2 ; No, hi >= 40, do limit+ −
; Yes, hi <= 39+ −
movlw .39+ −
cpfseq hi ; hi = 39 ?+ −
bra output16_4_call_3 ; No, hi < 39, no limit needed+ −
; Yes, hi = 39+ −
movlw .15+ −
cpfslt lo ; lo < 15+ −
movwf lo ; No, lo >= 15, set lo = 15.+ −
; Yes, lo <= 14 or lo set to =15+ −
bra output16_4_call_3 ; done.+ −
output16_4_call_2: ; Set to 9999+ −
movlw LOW .9999+ −
movwf lo+ −
movlw HIGH .9999+ −
movwf hi+ −
output16_4_call_3:+ −
bra output16_call+ −
+ −
global output16_3_call+ −
global output16_call+ −
global output16+ −
output16_3_call: ; limit to 999+ −
bsf show_last3+ −
; Limit to 3+ −
movlw .4+ −
cpfslt hi+ −
bra output16_3_call_2+ −
movlw .3+ −
cpfseq hi ; =3?+ −
bra output16_3_call_3 ; No, done.+ −
movlw .231 ; Limit to 231(+768=999...)+ −
cpfslt lo+ −
movwf lo+ −
bra output16_3_call_3 ; done.+ −
output16_3_call_2: ; Set to .999+ −
movlw LOW .999+ −
movwf lo+ −
movlw HIGH .999+ −
movwf hi+ −
output16_3_call_3:+ −
output16_call:+ −
clrf ignore_digits+ −
incf ignore_digits,F+ −
clrf WREG+ −
output16:+ −
movwf cvt_temp4 ; Passed from output16dp macro, cleared by others.+ −
bcf all_zeros_flag ; do not display any zero from here unless there was at least one figure /zero+ −
bsf leading_zeros+ −
tstfsz cvt_temp4 ; Display leading zeros at all?+ −
bcf leading_zeros+ −
bsf DP_done2+ −
tstfsz cvt_temp4+ −
bcf DP_done2 ; decimal point not yet set+ −
movff lo, lo_temp+ −
movff hi, hi_temp+ −
bcf pre_zero_flag ; do not display leading zeros+ −
movlw b'00010000' ; 10000s+ −
movwf cvt_temp2+ −
movlw b'00100111'+ −
movwf cvt_temp3+ −
btfsc show_last3 ; display only last three figures?+ −
bra output16_sk5+ −
btfsc show_last4 ; display only last four figures?+ −
bra output16_sk5+ −
rcall DEC2ASCII ; No, show all. Here: 5th order digit+ −
+ −
output16_sk5:+ −
bcf show_last4+ −
movlw b'11101000' ; 1000s+ −
movwf cvt_temp2+ −
movlw b'00000011'+ −
movwf cvt_temp3+ −
btfsc DP_done2 ; Is there a decimal point at all?+ −
bra output16_2 ; no, use normal display mode+ −
+ −
btfsc all_zeros_flag ; display any zero from here+ −
bra output16_1 ; there was a figure /zero already+ −
+ −
bsf pre_zero_flag ; display figure if zero?+ −
decfsz cvt_temp4,W+ −
bcf pre_zero_flag ; No+ −
+ −
output16_1:+ −
btfsc DP_done ; Decimal point set already?+ −
bsf pre_zero_flag ; Yes, so display the rest+ −
output16_2:+ −
btfss show_last3 ; display only last three figures?+ −
rcall DEC2ASCII ; No, show all. Here: 4th order digit+ −
bcf show_last3 ; Yes, so display the rest+ −
movlw b'01100100' ; 100s+ −
movwf cvt_temp2+ −
clrf cvt_temp3+ −
btfsc ignore_digit3 ; Ignore 3rd-5th digit?+ −
bra output16_5 ; Yes, skip the rest+ −
btfsc DP_done2 ; Is there a decimal point at all?+ −
bra output16_3 ; no, use normal display mode+ −
btfsc all_zeros_flag ; display any zero from here+ −
bra output16_2_1 ; there was a figure /zero already+ −
bsf pre_zero_flag ; display figure if zero?+ −
decfsz cvt_temp4,W+ −
bcf pre_zero_flag ; No+ −
+ −
output16_2_1:+ −
btfsc DP_done ; Decimal point set already?+ −
bsf pre_zero_flag ; Yes, so display the rest+ −
btfsc DP_done2 ; Is there a decimal point at all?+ −
bsf pre_zero_flag ; No, so display the rest+ −
output16_3:+ −
rcall DEC2ASCII ; 3th order digit...+ −
movlw b'00001010' ; 10s+ −
movwf cvt_temp2+ −
clrf cvt_temp3+ −
btfsc DP_done2+ −
bra output16_4+ −
btfsc all_zeros_flag ; display any zero from here+ −
bra output16_3_1 ; there was a figure /zero already+ −
bsf pre_zero_flag+ −
decfsz cvt_temp4,W+ −
bcf pre_zero_flag+ −
+ −
output16_3_1:+ −
btfsc DP_done+ −
bsf pre_zero_flag+ −
btfsc DP_done2+ −
bsf pre_zero_flag+ −
output16_4:+ −
btfsc ignore_digit4 ; Ignore 4-5th digit?+ −
bra output16_5 ; Yes, skip the rest+ −
rcall DEC2ASCII ; 2nd order digit+ −
+ −
movlw b'00000001' ; 1s+ −
movwf cvt_temp2+ −
clrf cvt_temp3+ −
bsf pre_zero_flag+ −
btfss ignore_digit5 ; Ignore 5th digit?+ −
rcall DEC2ASCII ; 1st order digit+ −
bcf ignore_digit5 ; yes, and clear flag+ −
output16_5:+ −
bcf ignore_digit4 ; Clear flag+ −
bcf ignore_digit3 ; Clear flag+ −
clrf ignore_digits+ −
incf ignore_digits,F+ −
bcf DP_done+ −
RETURN ; Done with convert.asm...+ −
+ −
+ −
DEC2ASCII:+ −
clrf cvt_temp1 ; converts into ASCII code+ −
DEC2ASCII_2:+ −
movf cvt_temp3,W+ −
subwf hi_temp,W+ −
btfss STATUS,C+ −
bra DEC2ASCII_4+ −
bnz DEC2ASCII_3+ −
movf cvt_temp2,W+ −
subwf lo_temp,W+ −
btfss STATUS,C+ −
bra DEC2ASCII_4+ −
DEC2ASCII_3:+ −
movf cvt_temp3,W+ −
subwf hi_temp,F+ −
movf cvt_temp2,W+ −
subwf lo_temp,F+ −
btfss STATUS,C+ −
decf hi_temp,F+ −
incf cvt_temp1,F+ −
bsf pre_zero_flag+ −
bra DEC2ASCII_2+ −
DEC2ASCII_4:+ −
decfsz ignore_digits,F+ −
return+ −
incf ignore_digits,F ; so ignore_digits stays zero for the test above+ −
movlw '0' ; Offset for ASCII-value+ −
addwf cvt_temp1,W+ −
btfsc pre_zero_flag ; is this a leading zero?+ −
bra DEC2ASCII_4_1 ; no+ −
btfsc leftbind+ −
bra DEC2ASCII_6+ −
movlw ' ' ; instead of leading zeros a space!+ −
bra DEC2ASCII_5+ −
DEC2ASCII_4_1:+ −
bsf all_zeros_flag ; display any zero from here+ −
DEC2ASCII_5:+ −
movwf POSTINC2+ −
DEC2ASCII_6:+ −
decfsz cvt_temp4,F ; Set decimal point?+ −
RETURN ; No+ −
movlw "." ; Yes+ −
movwf POSTINC2+ −
bsf DP_done+ −
return+ −
+ −
END+ −