> I ett "code" segment kan du ha flera funktioner åtskiljda med labels, i princip hur många som helst.
Nja, en label används bara som en "target" för en GOTO eller CALL.
Att man som programmerare väljer att kalla en kodsnutt för en funktion
(eller subrutin eller whatever) är inget som MPASM vet något om. Det är
helt upp till hur man "ser" på sin kod som programmerare.
Det är i princip ingen skillnad på en label som används som "entry point"
till din subrutin, och en som används *inom* subrutinen. En subrutin/funktion
kan även (inte ovanligt) ha flera "entry points", d.v.s att man gör CALL till
lite olika ställen och får lite olika "funktion" från funktionen.
> Om man bara har en källkodsfil, alltså en .asm fil, i sitt projekt så
> finns det ingen anledning (vad jag kan se) att köra relocatable kod.
> Någon får gärna rätta mig om jag har fel.
Gärna !
I Absolute Mode finns det en gräns för "path" till sitt projektbibliotek på 62 tecken.
Det finns inte i Relocatable Mode.
Et problem om t.ex vill ha sina filer under "My documents"...
All utveckling från Microchip sker på reloc delen. Abs mode delen kommer sannlikt att försvinna med tiden.
För PIC24/PIC30/PIC33 (16-bitars serierna) finns det ingen Abs Mode alls...
Det är inte *svårare* att skriva kod i Reloc Mode. Bara lite annorlunda...
Det är lättare att "växa" i projektet, när koden behöver delas upp o.s.v.
Det är lättare att dela gemensamma funktioner mellan projekt.
Om man delar upp koden i flera moduler (= filer) så kan man ha samma
label (t.ex "loop" eller liknande) på flera ställen (i varje modul).
Det blir generellt "snyggare" kod (vad nu det är

)
> Du behöver förresten bara labels för code segmenten om du skall ha mer än ett.
(Per kodmodul alltså. (En modul = en ASM fil))
Korrekt, men MAP filen blir jäkligt tråkig att läsa...

Min rekomendation är att man alltid sätter ett *eget* namn på varje segment så att de blir enkla att hitta i MAP filen.
> Det kanske är bättre att du skippar relocatable kod tills det du verkligen
> behöver det, när dina projekt blir så stora att du vill splitta dem i flera
> källkodsfiler.
Det kanske är tydligt att jag inte håller med...
Angående ditt kod exempel så har jag bara ett par mindre kommenterar...
> ; Spara undan register kod här!
> ; Återställ register kod här
Behövs inte på PIC18 när man kör med 1 interrupt prioritet (vilket är normalt).
En av anledningarna att interrupt går snabbare på PIC18 än på PIC16...
> btfsc INTCONX,IRF1 ; Är Interrupt 1 satt?
> call HANDLE_IRQ1 ; Hantera IRQ 1 isåfall
>
> btfsc INTCONX,IRF2 ; Är Interrupt 2 satt?
> call HANDLE_IRQ2 ; Hantera IRQ 2 isåfall
Bör vara något i stil med :
> btfss INTCONX,IRE1 ; Är Interrupt 1 enablat ?
> goto check_int2 ; Nej, kolla INT2
> btfsc INTCONX,IRF1 ; Är Interrupt 1 triggat ?
> call HANDLE_IRQ1 ; Hantera IRQ 1 isåfall
>
>check_int_2
>
> btfss INTCONX,IRE2 ; Är Interrupt 1 enablat ?
> goto check_int3 ; Nej, kolla INT3.
> btfsc INTCONX,IRF2 ; Är Interrupt 1 triggat ?
> call HANDLE_IRQ2 ; Hantera IRQ 1 isåfall
>
o.s.v.
D.v.s att man även måste kolla "E" flaggan, inte bara "F" flaggan.
Ibland vill man t.ex fördröja ett visst interrupt, och då clearar men
resp "E" flagga, säg IRE1. Med din kod kan man få ett "falsk" interrupt,
genom att t.ex INT2 triggar, men koden kommer att "fasta" på INT1,
p.g.a av att "E" flaggan inte kollas. Senare när man vill att INT1 skall
trigga igen, sätter man "E" flaggan igen...
> reti
Bör vara "RETFIE FAST" för att få återladdning av WREG/STATUS/BSR från shadow registren.