Hi again Henrik,
Not sure if you've seen the code above yet, but I've done a bit more optimization to it.
By mapping word vars to the low word of the 32-bit vars, there's a lot less moving around of values to do between Pvars and PBP word vars.
Here's how it looks now ...
Code:
PRECISION CON 4 SYSTEM ' 4 bytes = 32-bit
INCLUDE "N-Bit_MATH.pbp"
Value32 VAR BYTE[PRECISION]
Temp32 VAR BYTE[PRECISION]
Divisor VAR BYTE[PRECISION]
;---Map Word variables onto Low Word of 32-bit variables]----------------------------------
Value32_LW VAR WORD EXT : @Value32_LW = _Value32
Temp32_LW VAR WORD EXT : @Temp32_LW = _Temp32
REG_Z_LW VAR WORD EXT : @REG_Z_LW = REG_Z
W1 VAR WORD
HSEROUT ["Ready-Set-Go",13,10]
Main:
@ MOVE?CP -2147483648, _Value32
GOSUB Signed32 : HSEROUT [13,10]
@ MOVE?CP 2147483647, _Value32
GOSUB Signed32 : HSEROUT [13,10]
@ MOVE?CP 1234, _Value32
GOSUB Signed32 : HSEROUT [13,10]
@ MOVE?CP -1234, _Value32
GOSUB Signed32 : HSEROUT [13,10]
@ MOVE?CP 10, _Value32
GOSUB Signed32 : HSEROUT [13,10]
STOP
;----[Send signed 32-bit value via USART]---------------------------------------------------
Signed32:
IF Value32.0(31) THEN ; If the value is negative
HSEROUT ["-"] ; display a negative sign
@ MATH_CLR _Temp32 ; clear Temp32 for ABS
@ MATH_SUB _Temp32, _Value32, _Temp32 ; get the absolute value (0-value)
ELSE ; else - value is already positive
@ MOVE?PP _Value32, _Temp32 ; copy it to Temp var
ENDIF
@ MOVE?CP 1000000, _Divisor
@ MATH_DIV _Temp32, _Divisor, _Temp32 ; divide by 1,000,000 gets top 4 digits
@ MOVE?PW _Temp32, _W1 ; copy digits to PBP word var
@ MOVE?CP 1000, _Divisor ; divide remainder by 1,000
@ MATH_DIV REG_Z, _Divisor, _Temp32 ; 3 digits are in Temp32, 3 digits in REG_Z
IF W1 > 0 THEN ; if top 4 are > 0
HSEROUT [DEC W1, DEC3 Temp32_LW, DEC3 REG_Z_LW] ; display all 7-10 digits
ELSE ; else - top 4 digits are 0
IF Temp32_LW > 0 THEN ; check next 3 digits
HSEROUT [DEC Temp32_LW, DEC3 REG_Z_LW] ; if > 0 then display 4-6 digits
ELSE ; else - Top 7 digits are 0
HSEROUT [DEC REG_Z_LW] ; display lowest 3
ENDIF
ENDIF
RETURN
The output is identical to the previous post. (+10)
HTH,
Bookmarks