Mercurial > public > hwos_code
diff src/convert.asm @ 604:ca4556fb60b9
bump to 2.99beta, work on 3.00 stable
author | heinrichsweikamp |
---|---|
date | Thu, 22 Nov 2018 19:47:26 +0100 |
parents | b455b31ce022 |
children | c40025d8e750 |
line wrap: on
line diff
--- a/src/convert.asm Thu Oct 11 21:06:29 2018 +0200 +++ b/src/convert.asm Thu Nov 22 19:47:26 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File convert.asm ## V2.98 +; File convert.asm ## V2.98c ; ; Converts register values to string ; @@ -13,7 +13,7 @@ #include "hwos.inc" ; Mandatory header -basic CODE +convert CODE ;============================================================================= @@ -28,7 +28,7 @@ output99: movlw d'99' cpfslt lo - movwf lo ; Limit to 99 + movwf lo ; limit to 99 movff lo,lo_temp clrf hi_temp bcf pre_zero_flag ; do not display leading zeros @@ -54,7 +54,7 @@ movlw d'99' cpfslt lo - movwf lo ; Limit to 99 + movwf lo ; limit to 99 movff lo, lo_temp clrf hi_temp bsf pre_zero_flag ; display leading zeros @@ -84,18 +84,18 @@ ; 9999 = 27 0F = [39][15] movlw .40 cpfslt hi ; hi < 40 ? - bra output16_4_call_2 ; No, hi >= 40, do limit + 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 + 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. + 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 + bra output16_4_call_3 ; done +output16_4_call_2: ; set to 9999 movlw LOW .9999 movwf lo movlw HIGH .9999 @@ -113,13 +113,13 @@ 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...) + 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 + bra output16_3_call_3 ; done +output16_3_call_2: ; set to .999 movlw LOW .999 movwf lo movlw HIGH .999 @@ -130,10 +130,10 @@ incf ignore_digits,F clrf WREG output16: - movwf cvt_temp4 ; Passed from output16dp macro, cleared by others. + 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? + tstfsz cvt_temp4 ; display leading zeros at all? bcf leading_zeros bsf DP_done2 tstfsz cvt_temp4 @@ -149,7 +149,7 @@ bra output16_sk5 btfsc show_last4 ; display only last four figures? bra output16_sk5 - rcall DEC2ASCII ; No, show all. Here: 5th order digit + rcall DEC2ASCII ; NO - show all, here: 5th order digit output16_sk5: bcf show_last4 @@ -157,41 +157,41 @@ 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 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 + bcf pre_zero_flag ; NO output16_1: - btfsc DP_done ; Decimal point set already? - bsf pre_zero_flag ; Yes, so display the rest + 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 + 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 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 + 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 + 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 @@ -211,28 +211,28 @@ btfsc DP_done2 bsf pre_zero_flag output16_4: - btfsc ignore_digit4 ; Ignore 4-5th digit? - bra output16_5 ; Yes, skip the rest + 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? + btfss ignore_digit5 ; ignore 5th digit? rcall DEC2ASCII ; 1st order digit - bcf ignore_digit5 ; yes, and clear flag + bcf ignore_digit5 ; YES - clear flag output16_5: - bcf ignore_digit4 ; Clear flag - bcf ignore_digit3 ; Clear flag + 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... + return ; done with convert.asm... DEC2ASCII: - clrf cvt_temp1 ; converts into ASCII code + clrf cvt_temp1 ; converts into ASCII code DEC2ASCII_2: movf cvt_temp3,W subwf hi_temp,W @@ -257,10 +257,10 @@ decfsz ignore_digits,F return incf ignore_digits,F ; so ignore_digits stays zero for the test above - movlw '0' ; Offset for ASCII-value + movlw '0' ; offset for ASCII-value addwf cvt_temp1,W btfsc pre_zero_flag ; is this a leading zero? - bra DEC2ASCII_4_1 ; no + bra DEC2ASCII_4_1 ; NO btfsc leftbind bra DEC2ASCII_6 movlw ' ' ; instead of leading zeros a space! @@ -270,11 +270,34 @@ DEC2ASCII_5: movwf POSTINC2 DEC2ASCII_6: - decfsz cvt_temp4,F ; Set decimal point? - RETURN ; No - movlw "." ; Yes + decfsz cvt_temp4,F ; set decimal point? + RETURN ; NO + movlw "." ; YES movwf POSTINC2 bsf DP_done return + + global outputHEX_call +outputHEX_call: ; coverts 8 Bit integer into two hex digits + movwf cvt_temp1 ; copy byte to process from WREG to local temp + swapf cvt_temp1,F ; swap nibbles to process upper nibble first + rcall outputHEX_nibble ; print nibble as ASCII + swapf cvt_temp1,F ; swap back to process lower nibble +outputHEX_nibble: + movff cvt_temp1,cvt_temp2 ; create a working copy + movlw 0x0F ; mask for lower nibble + andwf cvt_temp2,F ; isolate lower nibble + movlw 0x30 ; offset from binary 0 to ASCII code for "0" + addwf cvt_temp2,F ; add offset + movlw 0x39 ; ASCII code for "9" + cpfsgt cvt_temp2 ; character code in cvt_temp2 pointing to something after "9"? + bra outputHEX_1 ; NO - character code represents "0"..."9", can be printed + movlw 0x07 ; YES - offset from ASCII code for character after "9" to character "A" + addwf cvt_temp2,F ; - add offset, character code now represents "A"..."F", can be printed now +outputHEX_1: + movff cvt_temp2,POSTINC2 ; copy character code to output buffer + return + + END