As Jon said, but it still isn't quite right,
You need to make the following changes. Firstly your not starting at $3000 (you know you have to) but you've accidentally done a typo by putting in
Code:
LDA #$40 ;the high byte of the initial address
should be #$30
That will get it starting at the beginning of the screen. The the other issue is that it doesn't fill the screen. You've written
Code:
CMP #$7F
But by compring with this value means the last 256 bytes of screen memory won't get written to, just change to
Code:
CMP #$80
in fact these lines;
Code:
LDA $71
CMP #$7F
BEQ reset ;move back to top left if we've moved the high byte to &80
can be replaced with
Code:
BMI reset
several cycles saved. This works because You want to test when you get to $80, just luckily anything below this value does not have the top bit set (bit 7). When it hits $80 (via your inc $71) then bit 7 becomes set and therefore sets the negative flag.
also, not an error as such but the lines;
Code:
movehi:
LDA #0
STA $70
Need not be there at all, you can remove them and the code does the same. This is because the $70 value starts at 0 and you add 8 each time, therefore when the carry gets set the value in $70 will actually be 0 anyway, so you can save yourself some machine cycles

. i.e. you'll get to value 248 with no carry, add 8 to this creates 256 exactly, which will leave 0 in $70 and a carry.
So to put it together all these lines;
Code:
LDA #0
STA $70
INC $71 ;Add 1 to the hi byte
LDA $71
CMP #$7F
BEQ reset ;move back to top left if we've moved the high byte to &80
can be replaced by;
Code:
INC $71 ;Add 1 to the hi byte
BMI reset ;move back to top left if we've moved the high byte to &80
and that will save you quite a few cycles.
P.S. I look forward to your suggestions for Swift
