> Och om man kör relokerbar kod så skall man ha flera typ CODE segment/block ?
Ja, man kan ha i princip hur många som helst. Varje CODE segment hanteras
av länkaren (MPLINK) som en enhet när den ska allokera koden till programminnet.
Ett CODE segment måste alltid får rum inom samma page, men för övrigt så kan
det hamna i vilken tillgänglig page som helst (men normalt fylls allt på "nerifrån").
> Dessutom minnas att LCALL LGOTO etc är multibytesfunktioner och således inte funkar så bra med decfzs etc.
LCALL, LGOTO och ett antal andra liknande beskrivs i MPASM manueln under
"A.6 12-BIT/14-BIT INSTRUCTION WIDTH PSEUDO-INSTRUCTIONS".
Och visst, precis som med egen definierade "vanliga" macron, så kan det
bli lite konstigt direkt efter en skip-instruktion...
De är inte multibyteinstruktioner, utan mer som macron som via inbyggda funktioner
i MPASM genererar ett antal vanliga instruktiner (t.ex en eller två BCF/BSF för att
sätta rätt page i PCLATH och sedan en GOTO eller CALL). D.v.s att *processorn*
i sig inte har en aning om vad LCALL/LGOTO är för något.
MAIN_PROG code 0x00001c program 0x000f92
Alltså börjar din MAIN_PROG på adres 1C och är F92 stor, med andra ord
slutar den på FAE. Alltså FFF-FAE = 51 (81 decimalt) kvar av page0 efter
att länkaren har placerat in MAIN_PROG.
Och eftersom ingen annat CODE-segment är mindre än x'58' (DLY_CODE) så
kommer alla andra segment att hamna i page1 istället.
Alla CALL/GOTO mellan MAIN_CODE och någon av de andra segmenten kommer
att krascha om man inte hanterar PCLATH korrekt (via PAGESEL eller LCALL/LGOTO).
Exakt vad man ska göra kan inte besvaras generellt. Antingen är inget tidskritiskt
och då kan man köra med PAGESEL (eller LGOTO/LCALL). Eller låt oss säga att t.ex
DLY_CODE anropas väldigt mycket, då skulle man kunna fixa så att de rutinerna
t.ex ligger i MAIN_CODE eller något liknande.
Är det enbart "ren" kod i MAIN_CODE ? Inga lookup-tabeller eller liknande ?
Dessa bryts lämpligen upp och tvingas upp i page1 för att frigöra utrymme
för vanlig exekverbar kod i page0. Normalt behöver man i alla fall ha kod vid
anrop av lookup-tabeller (d.v.s RETLW-tabeller) för att hantera PCLATH, så
det blir inget extra overhead. Samma sak om man läser tabeller via EExxx registren,
det blir ingen extra overhead för att kod i page0 läser en tabell i page1, EEADR/EEADRH
adresserar direkt hela minnet.
Ett helt annan "lösning" är att köra med PIC18 när man får kod > 2Kord...
