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,