Det skulle vara fint om bara anropad kod kommer med i slutresultatet.
Om man t.ex har ett matematik-bibliotek med många rutiner i, add sub
mult div abs neg... osv. Det är onödigt att allt det kommer med bara
för att man vid ett tillfälle bara behöver "add" ex.vis. Minnesutrymmet
kan ju behövas till annat än bara fyllas upp med kod som aldrig används.
Att ha separata filer för varje rutin verkar jobbigt...
---
Har kunnat bygga denna kod för reloc-mod utan felmeddelande nu.
Dock, i makrot fick jag kommentera bort valet
om anropsätt (med eller utan ändring av PCHLAT).
Och sen ändrade jag parametrarna vid anropen av sub1 o sub2 till:
Sen lade jag även in att subbarna ska assembleras villkorligt.
Med detta går det att bygga koden och se resultatet i "program-memory"
Jag testade att ta bort anropet av sub1,
och då försvinner koden för sub1, som önskat.
Kod för reloc-mod:
Kod: Markera allt
list p=16f886
#include <p16f886.inc>
;*********************************************
VACall MACRO SubrutinAdress, SubrutinFinns
ifndef SubrutinFinns
#define SubrutinFinns x
endif
; if ($ & 1800h) == ( SubrutinAdress & 1800h )
; nop ; vill ej ha
; nop ; vill ej ha
; call SubrutinAdress
; else
pagesel SubrutinAdress
call SubrutinAdress
pagesel $
; endif
endm
;*********************************************
RESET_VECTOR CODE 0x0000
goto Main ;go to start of main code
HI_INT_VECTOR CODE 0x0004
retfie
MAIN CODE
main
VACall sub1, sub1_
VACall sub2, sub2_
SUBS1 CODE h'0800'
ifdef sub1_
sub1
nop
nop
return
endif
SUBS2 CODE h'1000'
ifdef sub2_
sub2
nop
nop
return
endif
end
I abs-mod så går det att få valet av anropsätt att funka också, nästan..
Men när man anropar sub2 från samma page (adress över 1000h) så blir det fel.
Här är koden för abs-mod:
Kod: Markera allt
list p=16f886
#include <p16f886.inc>
;*********************************************
VACall MACRO SubrutinAdress, SubrutinFinns
ifndef SubrutinFinns
#define SubrutinFinns x
endif
if ($ & 1800h) == ( SubrutinAdress & 1800h )
; nop ; vill ej ha
; nop ; vill ej ha
call SubrutinAdress
else
pagesel SubrutinAdress
call SubrutinAdress
pagesel $
endif
endm
;*********************************************
RESET_VECTOR org 0x0000
goto Main ;go to start of main code
HI_INT_VECTOR org 0x0004
retfie
MAIN org 0x0020
main
VACall sub1, sub1_
VACall sub2, sub2_
SUBS1 org h'0040'
ifdef sub1_
sub1
nop
nop
return
endif
SUBS2 org h'1000'
VACall sub2, sub2_ ; här blir det fel
; de 2 extra NOP i makrot behövs för detta ska bli rätt.
ifdef sub2_
sub2
nop
nop
return
endif
end