Hi Henrik,
I didn't have anything already made, but using N-Bit_Math it only took an hour or so to write and test.
The Main program just sets 4 different values and calls Signed32: to display them
You can use the MOVE? macros to put your value in the Value32 variable.
Code:
PRECISION CON 4 SYSTEM ' 4 bytes = 32-bit
INCLUDE "N-Bit_MATH.pbp"
Value32 VAR BYTE[PRECISION]
Divisor VAR BYTE[PRECISION]
Temp32 VAR BYTE[PRECISION]
B32 VAR BYTE[PRECISION]
W1 VAR WORD
Sign VAR BIT
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]
STOP
;----[Send signed 32-bit value via USART]---------------------------------------------------
Signed32:
@ MATH_CLR _Temp32 ; clear Temp32 in case we need ABS
Sign = Value32.0(31) ; If the value is negative
IF Sign THEN
HSEROUT ["-"] ; display a negative sign
@ MATH_SUB _Temp32, _Value32, _Temp32 ; get the absolute value (0-value)
ELSE
@ MOVE?PP _Value32, _Temp32
ENDIF
@ MOVE?CP 1000000, _Divisor
@ MATH_DIV _Temp32, _Divisor, _B32 ; divide by 1,000,000 gets top 4 digits
@ MOVE?PW _B32, _W1 ; copy digits to PBP word var
; @ MATH_MUL _B32, _Divisor, _B32 ; multiply those digits by 1,000,000
; @ MATH_SUB _Temp32, _B32, _Temp32 ; subtract from original value
@ MOVE?CP 1000, _Divisor ; divide remainder by 1,000
@ MATH_DIV REG_Z, _Divisor, _B32 ; 3 digits are in B32, 3 digits in REG_Z
IF W1 > 0 THEN ; W1 still has top 4 digits
HSEROUT [DEC W1] ; if top 4 are > 0, display them
@ MOVE?PW _B32, _W1 ; display next 3 digits (with 0's)
HSEROUT [DEC3 W1]
@ MOVE?PW REG_Z, _W1 ; display lowest 3 digits (with 0's)
HSEROUT [DEC3 W1]
ELSE ; else - top 4 digits are 0
@ MOVE?PW _B32, _W1 ; check next 3 digits
IF W1 > 0 THEN ; if > 0 then display (without 0's)
HSEROUT [DEC W1]
@ MOVE?PW REG_Z, _W1 ; display lowest 3 digits (with 0's)
HSEROUT [DEC3 W1]
ELSE ; else - Top 7 digits are 0
@ MOVE?PW REG_Z, _W1 ; display lowest 3 (without 0's)
HSEROUT [DEC W1]
ENDIF
ENDIF
RETURN
This is the output from the test program.

It could probably benefit from a little optimization, but it works.
HTH,
Bookmarks