Mercurial > public > hwos_code
diff src/convert.asm @ 0:11d4fc797f74
init
author | heinrichsweikamp |
---|---|
date | Wed, 24 Apr 2013 19:22:45 +0200 |
parents | |
children | 31088352ee32 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/convert.asm Wed Apr 24 19:22:45 2013 +0200 @@ -0,0 +1,260 @@ +;============================================================================= +; +; File convert.asm +; +; 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 "ostc3.inc" ; Mandatory header + +;============================================================================= + + CBLOCK tmp+0x08 ; space for aa_wordprocessor + temp3 + temp4 + cvt_flags2 + ; Reserved to tmp+0x10... + ENDC + +#define pre_zero_flag cvt_flags2,0 +#define all_zeros_flag cvt_flags2,1 +#define DP_done cvt_flags2,2 +#define DP_done2 cvt_flags2,3 +#define show_last3 cvt_flags2,4 +#define leading_zeros cvt_flags2,5 + +basic CODE + +;============================================================================= + global output99_call +output99_call: + clrf ignore_digits + incf ignore_digits,F + clrf 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 b'00001010' ; 10 + movwf temp2 + clrf temp3 + rcall DEC2ASCII + + movlw b'00000001' ; 1 + movwf temp2 + clrf 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 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 temp4 + +output8: + movff lo, lo_temp + clrf hi_temp + bcf pre_zero_flag ; do not display leading zeros + + movlw b'01100100' ; 100 + movwf temp2 + clrf temp3 + rcall DEC2ASCII + bra LCD_val99_2 + + global output16_3_call + global output16_call + global output16 +output16_3_call: + bsf show_last3 +output16_call: + clrf ignore_digits + incf ignore_digits,F + clrf WREG +output16: + movwf 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 temp4 ; Display leading zeros at all? + bcf leading_zeros + + bsf DP_done2 + tstfsz 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 temp2 + movlw b'00100111' + movwf temp3 + btfss show_last3 ; display only last three figures? + rcall DEC2ASCII ; No, show all. Here: 5th order digit + + movlw b'11101000' ; 1000s + movwf temp2 + movlw b'00000011' + movwf 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 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 temp2 + clrf 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 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 temp2 + clrf 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 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 temp2 + clrf 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 temp1 ; converts into ASCII code +DEC2ASCII_2 movf temp3,W + subwf hi_temp,W + btfss STATUS,C + bra DEC2ASCII_4 + bnz DEC2ASCII_3 + + movf temp2,W + subwf lo_temp,W + btfss STATUS,C + bra DEC2ASCII_4 + +DEC2ASCII_3 movf temp3,W + subwf hi_temp,F + movf temp2,W + subwf lo_temp,F + btfss STATUS,C + decf hi_temp,F + incf 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 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 temp4,F ; Set decimal point? + RETURN ; No + movlw "." ; Yes + movwf POSTINC2 + bsf DP_done + RETURN + + END \ No newline at end of file