Cara, eu vi um erro de escopo de variáveis ali, não sei se o objetivo do exercício é mostrar exatamente isso, mas na procedure mudanca, é declarada uma variável local chamada nome, sendo que já existe um identificador chamado assim que é global. Portanto, na procedure mudança, na verdade tu está setando o valor da variável local e, quando tu executa o writeln(nome) após chamar mudanca, na verdade o que vai ser impresso é o valor da variável global. Não sei se consegui explicar direito, mas qualquer dúvida pergunta aí.