I use cc65 http://www.cc65.org/
, but I've also worked with many other assembler programs. cc65 has a C compiler, but I never use that part. I have seen a few good programs use the nbasic compiler.
Really the best way to update VRAM, is to use the NMI interrupt. But since that's in assembly I don't know how (or if) nbasic handles it.
tepples had mentioned NESticle, it sounds like the emulator in the MP4 device may be similar. Best described as permissive, you can get away with a lot of things the hardware won't allow. I wrote many programs that worked on NESticle but not other emulators or the real system when I first started out (since NESticle was the only emulator to test it on).
I would advise using an emulator like Nestopia http://nestopia.sourceforge.net/
for testing. Often I'll add it into the .bat file just for convenience. And for the program, try to keep all updates to VRAM as short as possible and only do it immediately after vblank is detected. It should work then. By VRAM accesses I mean anything to the $2006 and $2007 registers (which is 8198 and 8199 in nbasic).
As the program gets more complex, it helps to write VRAM updates into a buffer in RAM first, then copy it all during vblank.
You've done good at learning this stuff, and your english is pretty good, by the way. It's pretty cool to create a program from nothing.
Oh, yes, you're right. My idae is same with you.
But I'm lazy,,,,so have no time to reseach the interrupt.
I know that the VRAM accesses must be end , at the end of vblank.
So I use a lot of codes to wait the end of vblank.
The tools is too lack to development. I just have Nbasic and a few of emulator.
My codes often give me some wrong message what I do not understand.
I busy modifing my codes.