In my old DOS programs, I tended to just do a:
xor ax, ax
int 016h
to wait for a keypress (you shouldn't need to do a loop with function 0).
No clue if clearing AL matters at all there, but it might be worth a shot.
Also, your listings don't show that you're exiting to DOS, like with
mov ax, 04c00h
int 021h
If that's missing, then who knows what weird things will show up.
Hope that helps!