Добрый день. Не знаю как во всех СиЛабсах, но в Ф33х и Ф12х в регистре RSTSRC есть бит SWRSF. Если в него поставить 1, то произойдет немедленный сброс системы. И после запуска эту единицу в этом регистре можно будет обнаружить. Т.е. задетектить программный сброс.
Я выполняю программный сброс именно так.
В других контроллерах (без такой возможности), не используя внешних схем, произвожу программный сброс переходом в специальную процедуру (которая все порты и память приводит в состояние = аппаратному сбросу) и выхожу из нее на вектор 0x0000. Чтобы определить такой сброс, можно переходить не на 0 вектор. Пример:
Код
org 0
LJMP Start
Org 100h
Start:
SETB Start_HW_Reset ; Указываем, что произошел аппаратный сброс
SJMP HW_Reset
SW_Reset:
CLR Start_HW_Reset ; Указываем, что произошел программный сброс
HW_Reset:
[...]
SoftWare_Reset:
[.. запрещаем все прерывания,приводим порты, и внтуреннюю память (очищаем стек) в состояние по аппаратному сбросу или просто порты в FF, память в 0 ..]
MOV DPTR,#SW_Reset
PUSH DPL
PUSH DPH
RET