Well I gave it a shot but the attributes are still way off and crazy. I update 32 tiles every 8 pixels of movement, so I updated 2 attribute bytes every 32 tiles.
I'm thinking maybe the problem is that my offset added to the location of the attribute table low byte is rolling over at some point to $00 and leaping to an incorrect part of my nametable, then writing that as the last few attribute bytes. Does that sound possible or am I just flailing in the dark here? Here is the attribute code fully commented :-)
;--DRAW 2 BYTES OF ATTRIBUTE TABLE NOW--;
;If using $28, attribute table starts at $2BC0
;If using $20, starts at $23C0
lda whichnam ;will be either $28 or $20
beq attr2 ;if its not $28, it must be $20, so continue from here
sta $2006 ;high byte of first attribute table
lda attroff1 ;low byte offset will go from $C0 to $FF
sta $2006 ;$2006 now knows where to copy nametable data TO.
;Address of correct map location is already in $0010 and $0011 from code before
cpx #2 ;only draw 2 bytes of the next attr table at a time
sty attroff1 ;y increments 2 bytes and gets stored for next time
jmp endattr ;SKIP over the rest of the attribute code
attr2: ;we jumped to here if it was nametable $28xx
lda attroff1 ;can use same variable as before because it still goes from $C0 to $FF
sta $2006 ;and it was reset to $C0 after the last nametable flipped.
sty attroff1 ;we are done updating the attribute table a whole 2 bytes, wow!
;--END OF ATTRIBUTE TABLE UPDATING--;