На всякий случай, я это уже победил с помощью конвертации адреса, взятого от разыменованного поинтера.
SYSTEM.VAL(C.PtrChar, SYSTEM.ADR(ptr^))

Меня интересует почему не работает так:
SYSTEM.VAL(C.PtrChar, ptr)

Т.е., грубо говоря, почему SYSTEM.ADR(ptr^) # ptr ?