Not quite. So you have to load both bytes of the address then write them.
For instance, to setup the first byte of the first nametable, you'd do
Code:
lda #$20
sta $2006
lda #$00
sta $2006
Because the first byte of the first nametable's address is $2000.
If you do
Code:
lda #$20
sta $2006
sta $2006 ; e.g. first page
like in your example, you're writing to $2020.
The reason you can do
Code:
lda #$00
sta $2006
sta $2006
For the first byte of CHR RAM is just because both bytes of the address happen to be the same.
Code:
index from CHR-RAM ($0-$2000)
No, just the tile number. Each tile in the nametable is one byte, so you can only use values from $00-$FF, not $0000-$1FFF.
CHR RAM doesn't change how you deal with nametables at all. Edit for clarity: It just means you have to write the tiles themselves (which the nametables draw) to $0000-$1FFF. You can sort of think of it like CHR ROM automatically copies the tile data to $0000-$1FFF on boot. CHR RAM doesn't, so you have to do this step. After the copy is done, everything for nametables is the same for both CHR RAM and CHR ROM.
The copy code in your example would also only write exactly one byte to CHR RAM. (Which you may know because you marked it as psuedo code. If so, ignore below)
Code:
lda #$0 ; data;The Zero flag is set, because lda affects the zero flag and zero got loaded.
ldx #$0 ; address;The zero flag is set, because ldx affects the zero flag and zero got loaded.
stx $2006;This does not affect the zero flag so it's still set
stx $2006;This does not affect the zero flag so it's still set
; pseudo code
all_data:
sta $2007 ; save tile/sprite;This does not affect the zero flag, so it's still set
bne all_data ;So this will never branch
bne all_data ;and this will never branch
;So that single write to $2007 is all that happens.