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 ...
The output is identical to the previous post. (+10)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
HTH,




Bookmarks