Вы справедливо сказали, что счетчик команд PC 13 битный.
Счетчик состоит из двух частей PCH+PCL (старшая и младшая части).
Младшая часть 8ми битная, к ней можно обращаться напрямую.
К старшей PCH обращаемся через PCLATH. Это введение.
Рассмотрим связку команд call и retlw k.
По retlw данные из стека помещаются в счетчик команд
и происходит переход (переход рабочей точки программы).
Вы ошибочно полагаете, что по retlw "загружается" 13 бит стека.
Именно по call в стек "прописывается" 11 бит возврата, а не 13.
Старшие два бита "прописываются" из PCLATH, при этом из
PCLATH берутся биты <три и четыре>.
Ваша проблема в том, что при вызове call вам нужно определить
PCLATH. Это не сложно, т.к. вы в программе на ассме всегда
можете определенно подсчитать место вызова-возврата.
Т.е. перед саll тра-та-та сделайте типа
bcf PCLATH,3
bcf PCLATH,4
Для лучшего понимания - посмотрите вложенные картинки.
Для вас не станет откровением наличие официальной русскоязычной
документации по ссылке http://www.microchip.ru/lit/articles/
На странице в секции "PIC - полные переводы даташитов на
некоторые серии микроконтроллеров" взят документ
PIC16F627_628.pdf , где на стр 25 можно прочитать "художественный"
перевод вашего фрагмента, согласно которому "Чтение из стека и
запись в счетчик команд PC происхходит при выполнении инструкций
возвращения из подпрограммы или обработке прерываний (RETURN,
RETLW, RETFIE), при этом значение PCLATH не изменяется"
Что рисует пошаговый симулятор в MPLABe?
Не поленитесь - вместо org 0x0E00
вставьте несколько тысяч нопов. Приколитесь.
Смысл нопов в том, чтобы было видно куда по retlw
вы вернетесь и проанализировать зависимость
(разумеется в процессе симуляции в MPLAB).
Разбираем дальше ваше
"чистых ячеек" = команд с кодом 3FF ="decf 0x7F, f" .
Согласно вашему даташиту на стр 234
опкод команды nop 00 0000 0xx00 0000 , в 2ичной системе
будем считать что это ноль, а не команда с опкодом 3FF.
Опкоду 3FF (11 1111 1111 1111) соответствует команда ADDLW.
Ваше "decf 0x7F, f" вообще лишено смысла, что по-человечески
звучит как "декрементировать содержимое ячейки ОЗУ с адресом
0x7F и результат сохранить в этой же ячейке".
(под ОЗУ понимается область памяти общего назначения)
(чистыми ячейки станут только тогда, когда вы явно их очистите)