swapU32.s - Swap two U32 values referenced by a pointerΒΆ
.include "xc.inc"
.global __reset ;The label for the first line of code.
.bss ;unitialized data section
au32_x: .space 4*4 ; four element u32 array
.text ;Start of Code section
__reset: ; first instruction located at __reset label
mov #__SP_init, W15 ;Initalize the Stack Pointer
mov #__SPLIM_init, W0
mov W0, SPLIM ;Initialize the stack limit register
rcall init_a
goto main
;__SP_init set by linker to be after allocated data
main:
mov #au32_x, W0
mov.b #1, W1
mov.b #3, W2
rcall swapU32
done:
goto done ;infinite wait loop
u32_baseptr passed in W0 u8_k passed in W1 u8_i passed in W2 W3 used for &bptr[k] W4 used for &bptr[j] W5,W6 used for u32_tmp
swapU32:
ze W1, W1
ze W2, W2
sl W1, #2, W1 ; k=k<<2=k*4
sl W2, #2, W2 ; j=j<<2=j*4
add W0, W1, W3 ; W3 = &bptr[k]
add W0, W2, W4 ; W4 = &bptr[j]
mov [W3++], W5 ; W5 = bptr[k].LSW
mov [W3--], W6 ; W6 = bptr[k].MSW
mov [W4++], [W3++] ; bptr[k].LSW = bptr[j].LSW
mov [W4--], [W3--] ; bptr[k].MSW = bptr[j].MSW
add W0, W2, W4 ; W4 = &bptr[j]
mov W5, [W4++] ; bptr[j].LSW = u32_tmp.LSW;
mov W6, [W4--] ; bptr[j].MSW = u32_tmp.MSW;
return
Initialize au32_x array
init_a:
mov #au32_x, W2
mov #0xA1F9, W0
mov #0x0982, W1
mov.d W0, [W2++]
mov #0x3204, W0
mov #0x88B2, W1
mov.d W0, [W2++]
mov #0x6B10, W0
mov #0xE3D9, W1
mov.d W0, [W2++]
mov #0xFB29, W0
mov #0xC385, W1
mov.d W0, [W2++]
return
.end