Mercurial > public > hwos_code
view src/convert.asm @ 340:1c4ff889fcf0
changelog
author | heinrichsweikamp |
---|---|
date | Fri, 03 Jul 2015 15:46:56 +0200 |
parents | 5ad479f2a868 |
children | a5fc007634c5 |
line wrap: on
line source
;============================================================================= ; ; 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 "hwos.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 #define show_last4 cvt_flags2,6 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_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 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 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 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