Tja jag håller på med ett projekt. Det är cirka 1000 rader kod och ett 30 tal subrutiner . Så nu unbrar jag hur jag delar upp huvud asm filen i flera små filer. Jag använder en pic 18f452 från microchip
Först, du kör väll relocatable ? Om inte rekomenderar jag att man gör det.
Sedan är det bara att dela upp subrutinerna i lämpligt antal ASM filer.
Lägga till GLOBAL för symboler som skall synas utanför resp fil.
Lägga till EXTERN för symboler som definieras i *andra* filer.
Lägg även till ett "linker script" i MPLAB.
Använd RES (istället för EQU och CBLOCK) för att allokera variabler i RAM. (EQU och CBLOCK allokerar ingenting, de bara definierar symboler...)
Allt detta finns beskrivet i MPASM manualen, så klart...
relocatable vad är det?
Kanske därför det inte funkar
och det där med RES fatta jag inte
Jag har bara använt
cblock h'00'
variabel
endc
Ska jag bara byta ut cblock mot RES? Funka nämligen inte
Sen var det där med GLOBAL ska man bara skriva det innan subrutinen
Och EXTERN ska man bara skriva " EXTERN subrutin" antar jag och lägga efter cblocket i huvudfilen
Relokerbar kode är när man inte själv anger *var* i minnet olika programmoduler skall placeras, utan överlåter till länkaren (MPLINK) att reda ut det. På samma sätt bryr man sig inte själv om var ens olika variabler hamnar (d.v.s på vilken adress), utan länkaren sköter om det också. Ganska ointressant vilken adress det blir, men om måste veta så framgår det av MAP filen. De enda adresseser so mna kan bahöva ange "hårt" är resetpunkten h'0000' och interrupt vektorn h'0004' (om det är en PIC16...).
RES directivet allokerar en del (vanligtsvis en byte) av RAM minne för en variabel :
antal1 RES 1 ; allokera 1 byte för variabeln "antal1".
GLOBAL anger man i en modul (= fil) för att ange att en viss symbol skall vara "synlig" även i andra moduler. Se exempel i manualen sidan 54.
GLOBAL antal1 ; antal1 kan nu användas från andra moduler (= filer)
EXTERN anger man i en modul (= fil) för att ange att en viss symbol definieras i en annan modul. Symbolen kan t.ex vara en variabel som man kunna använda eller namnet på en label som anger entry-point för en subrutin. Se exempel på sidan 53 i manualen.
EXTERN antal1 ; Anger att antal1 definieras i en annan modul (= fil) än just denna.
Personligen brukar jag rekomendera att man alltid kör med "relocatable" med MPLINK. Bl.a blir subrutiner mer generella och enklare att återanvända.
Om man t.ex har flera subrutiner som anväder CBLOCK där man har angivit en fast adress (som i ditt exempel), så blir det problem om man har två moduler (=filer) där CLOCK använder samma adress. Med RES är detta aldrig något problem, eftersom länkaren (MPLINK) allokerar de faktiska adresserna *efter* assembleringen när alla filer är genomlästa. Och då kan länkaren naturligtsvis lägga ut alla variabler snyggt och prydligt efter varandra.
För övrigt skulle jag vilja rekomendera kap 6 i manualen, "Uning MPASM to create relocatable objects".