PIC port explanation

rtel wrote on Tuesday, February 01, 2005:

I have moved this message from the bug tracker list.  Please do not submit bug trackers until it has been shown that a bug exists.  Original message follows:

I’m not very much into pic-assembler (yet), but I believe
there is an error in the pic-port.

From port.c:

<snippet from PortSAVECONTEXT macro>
/* Save the new top of the software stack in
the TCB. */
_asm
MOVFF pxCurrentTCB, FSR0L
MOVFF pxCurrentTCB + 1, FSR0H
MOVFF FSR1L, POSTINC0
MOVFF FSR1H, POSTINC0
_endasm
}
</snippet from PortSAVECONTEXT macro>

<snippet from PortRESTORECONTEXT macro>
/* Set FSR0 to point to pxCurrentTCB-
>pxTopOfStack. */
MOVFF pxCurrentTCB, FSR0L
MOVFF pxCurrentTCB + 1, FSR0H
</snippet from PortRESTORECONTEXT macro>

I cannot believe that the code in the PortSAVECONTEXT-
macro saves something in the TCB…

rtel wrote on Tuesday, February 01, 2005:

Here is the save context snippet with an explanation:

; Obtain the low byte of the pointer to the current
; TCB and place it in the low byte of the FSR0
; register.
MOVFF pxCurrentTCB, FSR0L

; Obtain the high byte of the pointer to the current
; TCB and place it in the high byte of the FSR0
; register.
MOVFF pxCurrentTCB + 1, FSR0H

; The FSR1 register is being used as the stack
; pointer.  FSR0 now points to the current TCB
; structure - the first member of which is the top
; of stack.  Store the top of stack being used into
; the TCB top of stack member.

; Move the low byte of the stack pointer into the
; TCB, then increment the pointer to the high
; byte.
MOVFF FSR1L, POSTINC0

; Move the high byte of the stack pointer into the
; TCB.  The FSR0 register is pointing to the high
; byte already due to the post increment in
; the statement above.
MOVFF FSR1H, POSTINC0

hermarcel wrote on Thursday, February 03, 2005:

Thanks, it starts making sense now I’m getting more and more into pic asm…