In my NES port of Chu Chu Rocket, I was doing 192 tile updates in a single vblank (plus a couple of extra scanlines). This was 8 strips of 24 tiles with unrolled code doing each strip.
My code looks something like this:
Code:
DrawNtLoopTop:
lda ntRowHighAddress,Y
sta PPUADDR
lda ntRowLowAddress,Y
sta PPUADDR
iny
DrawNt24:
lda nameTableBuffer+0,X
sta PPUDATA
lda nameTableBuffer+1,X
sta PPUDATA
lda nameTableBuffer+2,X
sta PPUDATA
lda nameTableBuffer+3,X
sta PPUDATA
lda nameTableBuffer+4,X
sta PPUDATA
lda nameTableBuffer+5,X
sta PPUDATA
lda nameTableBuffer+6,X
sta PPUDATA
lda nameTableBuffer+7,X
sta PPUDATA
lda nameTableBuffer+8,X
sta PPUDATA
lda nameTableBuffer+9,X
sta PPUDATA
lda nameTableBuffer+10,X
sta PPUDATA
lda nameTableBuffer+11,X
sta PPUDATA
lda nameTableBuffer+12,X
sta PPUDATA
lda nameTableBuffer+13,X
sta PPUDATA
lda nameTableBuffer+14,X
sta PPUDATA
lda nameTableBuffer+15,X
sta PPUDATA
lda nameTableBuffer+16,X
sta PPUDATA
lda nameTableBuffer+17,X
sta PPUDATA
lda nameTableBuffer+18,X
sta PPUDATA
lda nameTableBuffer+19,X
sta PPUDATA
lda nameTableBuffer+20,X
sta PPUDATA
lda nameTableBuffer+21,X
sta PPUDATA
lda nameTableBuffer+22,X
sta PPUDATA
lda nameTableBuffer+23,X
sta PPUDATA
txa
clc
adc #24
tax
cpx drawLimit
bcs DrawNtTopReturn
jmp DrawNtLoopTop
DrawNtTopReturn:
rts