OK, vi tar enbart själva FSR/INDF hanteringen. (Tillkommer resten
i ISR'en som kollar efter <ESC> o.s.v. men det hade ganska bra
koll på, tror jag...

).
Först någonstans i början koden har du en RES som allokerar minne till bufferten :
(4'an kan lika vara en definierat konstant som i Icecap's exempel, det
är att föradra, speciellt om man vill använda "längden" senare i koden,
då är det bara ett ställe att ändra på om länden ska ändras...)
Detta allokerar (reserverer) 4 bytes i sekvens någonstans i minnet (GPR)
och ger symbolen RX_BUFFER ett värde som motsvarar adressen till *första*
positionen i RX_BUFFER.
(PS: Jag rekomenderar varm att du har MAP filen påslagen (MPLINK i
Project Setup-någonstans) så att du även kan se hur olika variabler är
allokerade i minnet. Inte för att man behöver veta adresserna, men det
ger lite mer förståelse för vad RES (tillsammans med MPLINK) gör).
Sen så ska vi låta registret FSR "peka" på första positionen i RX_BUFFER :
Notera, move *literal* to W, d.v.s själva värdet av *symbolen* "RX_BUFFER" !
*Inte* det som RX_BUFFER eventuellt innehåller !
Detta görs alltså någonstans då vi ska börja på ett nytt datablock efter en <ESC>...
Så där, nu "pekar" FSR mot första positionen av RX_BUFFER.
Nu, för varje tecken som du mottar (efter en <ESC>) så gör du i princip :
Kod: Markera allt
movf RCREG, w ; Hämta tecknet från USART'en till WREG
movwf INDF ; Skriv tecknet till aktuell position i RX_BUFFER.
incf FSR ; Öka "pekaren" med ett för nästa tecken...
Notera alltså att då man skriver/läser INDF, så är det igentligen adressen
i FSR som man skriver/läser !
Nu är FSR ökad med ett och förberätt för nästa tecken som kommer in
til USART'en. På så sätt kommer varje tecken att hamna i "nästa"
position i RX_BUFFER.
Icecap har en lite annorlunda hantering där FSR värdet beräknas varje
gång. Det fungerar det också, men i detta fall räcker det med att
bara räkna upp det med 1 vid varje varv genom ISR'en. (Icecap's
metod är dock lite mer generell. Ofta har man antingen flera buffrar eller
har behov att t.ex skriva och läsa från olika positioner i samma buffert,
och då måste man spara undan FSR värdet mellan de olika accesserna...)
Tillkommer lite check av om/när 4 tecken är mottaget, o.s.v.
Men det har diskuterats i tidigare inlägg.