Ну с памятью - я имел в виду у вас встречается в подпрограмме AT %* - почему не ругается компилятор не знаю.
С маркерной особо не работал - не в курсе. А с ретэйнами работал.

Если у Вас по какому то событию надо сохранять значения всех переменных - не издевайтесь так над собой и над программой.
Создайте отдельную подпрограмму, которая по результатам переменной mem (простой выход одного из блоков - не глобальная переменная) будет присваивать отдельным переменным для хранения значений в Retain значение простых выходных переменных из других подпрограмм.
Ну или даже не подпрограмму - а прям операторами типа move с блоками EN...

Ну и последнее - данное присвоение стоит делать (вызывать подпрограмму записи переменных) в самом конце программы. Чтобы флаг mem или любые другие были взведены. При переходе в начало программы (на примере Вашей программы) mem сбрасывается.