Okay, in the .asm file:
* The pattern table data is CHR-ROM, so PPU RAM $0000 to $1FFF is mapped to the single 8KB CHR bank (this is stored in file
mario.chr; see the end of the .asm file)
* The name table data (screen layout data) is handled in routine
LoadBackground -- it populates PPU RAM $2000 to $207F with data that's defined at location
background* The attribute table data (just described this) is handled in routine
LoadAttribute -- it populates PPU RAM $23C0 to $23C7 with data that's defined at location
attribute* The palette data is handled in routine
LoadPalettes -- it populates PPU RAM $3F00 to $3F1F with data that's defined at location
paletteFor a NES PPU RAM memory map, see:
https://wiki.nesdev.com/w/index.php/PPU_memory_mapThe format of all this data, and how the pattern table + attribute table work together to make a specific pixel's colour, have been described already. There is a Youtube video on the NES attribute table but I find the presenter to be a bit confusing (and some of the assembler syntaxes he uses are questionable, i.e. using spaces in operand values), but it might help you:
https://www.youtube.com/watch?v=RH2TFflORLsThe code in the routines references are all commented. If the 6502 is confusing, why don't you take the time to actually post the code snippets which confuse you and do your best to explain what's confusing you or where you get lost? We need to see what it is that's confusing you.
Possibly what would benefit you more would be not learning the NES, but rather learning 6502 in general? Kasumi posted something a few days ago that covered this already:
viewtopic.php?p=179883#p179883The NES, in my opinion, does not make a good "starter system" for learning 6502; the PPU greatly complicates the learning for new folks, because it's almost like you're learning "two systems" at once (6502 assembly + nuances of the PPU, memory layout, etc.). IMO, the Apple II (which is what I started out on) is a lot more user-friendly when it comes to learning 6502; it has a ROM (think BIOS) with a large number of built-in routines that are documented, and a general interface that lets you do things like print text on screen. I have no experience with the Commodore 64 but possibly it's another option (unsure).
But respectfully, not meant to dishearten: when you started posting here, you admitted you had no assembly experience, and only with C# and Unity. C# does a lot of the "heavy lifting" for you as far as PLs go, and Unity as a framework does **insane** amounts of hand-holding. What you are used to are tools that are doing lots of things for you; the NES is not like this. You are in full 100% control of the console itself, and are expected to do everything yourself. There really isn't a lot of hand-holding involved with NES development (or any other kind of classic console); the learning curve is extremely steep. You've also stated, quote,
"Well I choose the Nes because I WANT the restrictions", so you're going to have to be very precise when it comes to asking for help. :-)