| |
Ben Account closed
Registered: Feb 2003 Posts: 163 |
Free cycles in raster line..
Is there some sort of stable, line dense raster leaving some cycles per line free which can then be filled with instructions executed outside the IRQ?
|
|
... 15 posts hidden. Click here to view all posts.... |
| |
yago
Registered: May 2002 Posts: 333 |
Marko Makela described this Technique in C=Hacking #10.
http://www.ffd2.com/fridge/chacking/
@WVL: OK, I'll give you a Karlsquell.
|
| |
Ben Account closed
Registered: Feb 2003 Posts: 163 |
Quote: We did this in 6566+. There is an interrupt on each raster line, even though we decided on colors that doesn't change at every line.
It won't be more stable than within roughly 7 cycles depending on what code you run in the background, but it will always stay around the desired point.
If you want it on the exact same cycle every time you will have to waste cycles to take up the jitter every interrupt.
I see you are using:
thing pha
lda $dd0d
inc foo+1
foo lda $0800
sta $d021
sta $d020
pla
rti
You however seem to destroy the initialization of the interrupts on purpose :)
I reckon you do something like
lda #<thing
ldx #>thing
sta $0316
stx $0317
to launch the NMI
7 cycles jitter is quite a blow.. is there any mechanism allowing one to stabilize the raster in any fashion, e.g. to appropriate the routine for open sideborder? |
| |
Ben Account closed
Registered: Feb 2003 Posts: 163 |
Quote: Marko Makela described this Technique in C=Hacking #10.
http://www.ffd2.com/fridge/chacking/
@WVL: OK, I'll give you a Karlsquell.
Nice magazine :) Thanks for the link! |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: I see you are using:
thing pha
lda $dd0d
inc foo+1
foo lda $0800
sta $d021
sta $d020
pla
rti
You however seem to destroy the initialization of the interrupts on purpose :)
I reckon you do something like
lda #<thing
ldx #>thing
sta $0316
stx $0317
to launch the NMI
7 cycles jitter is quite a blow.. is there any mechanism allowing one to stabilize the raster in any fashion, e.g. to appropriate the routine for open sideborder?
We thought we were the first doing full screen rasters with sprites over them + music running, so we wanted to set the competition back a bit. ;) (also I was 14 years old)
The over writing is done when starting the code, but ironically I forgot the packed version at $8000. :P
Note that Rob Hubbards Zoolook was manually relocated to
$090d to get a contiguous block just for show off. :)
BTW: I still haven't found anyone doing this before us, does anyone here know an earlier example of this technique?
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: I see you are using:
thing pha
lda $dd0d
inc foo+1
foo lda $0800
sta $d021
sta $d020
pla
rti
You however seem to destroy the initialization of the interrupts on purpose :)
I reckon you do something like
lda #<thing
ldx #>thing
sta $0316
stx $0317
to launch the NMI
7 cycles jitter is quite a blow.. is there any mechanism allowing one to stabilize the raster in any fashion, e.g. to appropriate the routine for open sideborder?
That should be $0318/$0319, but it would be much better to use $fffa/$fffb.
Also the 7 cycles (or is it 6?) depend on the fact that the longest 6510 instruction is 7 cycles (eg "inc abs,x"). If you restrict which instructions you run, you will get less jitter. If you want it really stable you'll have to use the timer value to compensate, which won't leave many cycles at all for stuff to run in the background.
|
| |
Ben Account closed
Registered: Feb 2003 Posts: 163 |
Quote: That should be $0318/$0319, but it would be much better to use $fffa/$fffb.
Also the 7 cycles (or is it 6?) depend on the fact that the longest 6510 instruction is 7 cycles (eg "inc abs,x"). If you restrict which instructions you run, you will get less jitter. If you want it really stable you'll have to use the timer value to compensate, which won't leave many cycles at all for stuff to run in the background.
Damn.. I meant $0318/19 of course :: blush :: Where have I been with my mind!
Sure, I understand the source of the jitter.. Relying on $dc04/$dc05 would indeed get costly.. |
| |
WVL
Registered: Mar 2002 Posts: 902 |
also check out Ninja's routine from Real/The dreams+Resource. He wrote an article about it in some magazine. it's for a every-other-line-fli routine though, but you can use the basic ideas for your advantage! |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: Damn.. I meant $0318/19 of course :: blush :: Where have I been with my mind!
Sure, I understand the source of the jitter.. Relying on $dc04/$dc05 would indeed get costly..
Consider this: jmp ($dc04)
Set up one timer in cycle mode (presumably $3e cycles) to execute the jump. You might even be able to put $4c into $dc03 to run it from there.
Set up a separate timer that counts up. This will make the jump go to an address which will be one larger for every cycle you are late into the interrupt. You will have to restart this timer from each interrupt.
You could even try to start the up counting timer in the first raster line, and then layout one routine for each rasterline at addresses spaced $3e bytes appart. That way you wont have to restart the timer.
The penalty will be the jump + the 7-8 cycles of code to take up the jitter.
|
| |
Ben Account closed
Registered: Feb 2003 Posts: 163 |
Quote: Consider this: jmp ($dc04)
Set up one timer in cycle mode (presumably $3e cycles) to execute the jump. You might even be able to put $4c into $dc03 to run it from there.
Set up a separate timer that counts up. This will make the jump go to an address which will be one larger for every cycle you are late into the interrupt. You will have to restart this timer from each interrupt.
You could even try to start the up counting timer in the first raster line, and then layout one routine for each rasterline at addresses spaced $3e bytes appart. That way you wont have to restart the timer.
The penalty will be the jump + the 7-8 cycles of code to take up the jitter.
Sounds like a clever piece of code. I really have to give this some thought :) |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: Sounds like a clever piece of code. I really have to give this some thought :)
I can't seem to find how to make the timer count upwards though, so maybe I mixed something up here. :P I'm pretty sure I saw someone do this using a jmp ($dc04) though.
|
Previous - 1 | 2 | 3 - Next |