Yes, @ is an immediate load into the A register. Dealing with the limited number of actual registers in the physical hardware is part of the challenge.
Some techniques that may be useful to you:
The ability to store into multiple destinations (as you do in AM=M-1) can be particularly handy; I think you missed the chance to fold M=A,D=A into MD=A.
When adding 2 to D, D=D+1,D=D+1 is as fast as @2,D=D+A but preserves A. (Side note: in your code, you're doing A=D+A and then immediately overwriting it with @13; is this correct?). Depending on the situation, it can be worth using longer D=D+1 sequences to avoid having to reload A. Same thing goes for A=A+1 sequences; they preserve D.
Reordering operations can sometimes save you instructions, particularly if you can stash something in D and compute an address entirely in A.
If I am not mistaken (and I may well be, it's the middle of the night and I have insomnia), you can implement POP Local 2 in 8 instructions.