Я использую UDATA_ACS для объявления переменных, которые я хочу получить в доступе, поэтому в modem.asm у меня есть
; Variables for the interrupt handler - Access RAM
VarsModemISR UDATA_ACS
wave_index res 1 ; Index into the wave table for current sample
sample_period res 1 ; Sample period in use, TMR0 ticks
sample_count res 1 ; Amount of samples output since last bit boundary
fsrtmpl res 1 ; Temporary store for FSR
fsrtmph res 1 ; Temporary store for FSR
; Variables for the modem code - GPR0, non-Access
VarsModem UDATA
flag res 1 ; Counter for transmitting AX25 flags
bit res 1 ; Bit counter when transmitting a character
ch res 1 ; Current character being transmitted
...
Мой текущий скрипт компоновщика использует предоставленный скрипт, но определяет мои сегменты. Я отмечаю, что в скрипте определена только одна программная страница, в отличие от PIC16. Нет больше PAGESEL?
INCLUDE 18f14K50_g.lkr
SECTION NAME=CodeModemISR ROM=page
SECTION NAME=CodeModem ROM=page
SECTION NAME=CodeWaveTable ROM=page
SECTION NAME=CodeEepromUtil ROM=page
SECTION NAME=VarsModem RAM=gpr0
SECTION NAME=VarsGPSState RAM=gpr0
SECTION NAME=CodeConfigEEPROM ROM=eedata
Полученная карта содержит ожидаемые отображения:
Жестко закодированные местоположения, как и ожидалось:
HighInterruptVector code 0x000008 program 0x000004
LowInterruptVector code 0x000018 program 0x000002
Подвижные места, упакованные в:
CodeModemISR code 0x00001a program 0x000028
CodeModem code 0x000042 program 0x0000fe
CodeWaveTable code 0x000140 program 0x000040
CodeMain code 0x000180 program 0x000054
EEPROM в нужном месте
CodeConfigEEPROM code 0xf00000 program 0x000044
И переменные в ACCESSRAM и GP0
VarsModemISR udata 0x000000 data 0x000005
VarsModem udata 0x000060 data 0x000027
VarsGPSState udata 0x000087 data 0x00000e
Есть еще проблемы, которые нужно решить, но они могут быть в других сообщениях. Я отмечаю, что CodeWaveTable занимает 64 байта, поэтому он не упакован. Решение - используйте CODE_PACK и теперь оно 32 байта.