All Right.
I have one tile line (ie, 8 pixels from a tile) in 2 registers (for example, R1 and R2), and I want to put them in FrameBuffer (the address where I want to put them is, let's say, in R8).
This is needed if I intend to do some scrolling.
Here's how I can do, depending on the addresse modulo :
Modulo 0
Code: Select all
R1 0123
R2 4567
R8 0123
R9 4567
ADD #8,R8
MOV.L R2,@-R8
MOV.L R1,@R8 ; 3 cycles (2 Writes)
Modulo 1
Code: Select all
R1 0123
R2 4567
R8 X012
R9 3456
R10 7XXX
ADD #8,R8
MOV.B R2,@R8 ; R10 = 7XXX
SHLR8 R2 ; R2 = -456
MOV.L R2,@-R8 ; R9 = -456
MOV.B R1,@R8 ; R9 = 3456
SHLR8 R1 ; R1 = -012
MOV.W R1,@-R8 ; R8 = XX12
SHLR16 R1 ; R1 = ---0
MOV.B R1,@-R8 ; R8 = X012 9 cycles (5 Write)
Modulo 2
Code: Select all
R1 0123
R2 4567
R8 XX01
R9 2345
R10 67XX
ADD #8,R8
MOV.W R2,@R8 ; R10 = 67XX
XTRCT R1,R2 ; R2 = 2345
MOV.L R2,@-R8 ; R9 = 2345
SHLR16 R1 ; R1 = --01
MOV.W R1,@-R8 ; R8 = XX01 6 cycles (3 Write)
Modulo 3 (this one is a bitch)
Code: Select all
R1 0123
R2 4567
R8 XXX0
R9 1234
R10 567X
ADD #10,R8
MOV.B R2,@R8 ; R10 = XX7X
SHLR8 R2 ; R2 = -456
MOV.W R2,@-R8 ; R10 = 567X
SHLR16 R2 ; R2 = ---4
MOV.B R2,@-R8 ; R9 = XXX4
MOV.B R1,@-R8 ; R9 = XX34
SHLR8 R1 ; R1 = -012
MOV.W R1,@-R8 ; R9 = 1234
SHLR16 R1 ; R1 = ---0
MOV.B R1,@-R8 ; R8 = XXX0 11 cycles (6 Write)
for modulo between 4 and 7, we just got to change the first offset.
We here have ~70k CPU cycles and ~40k FB access.