| |
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.... |
| |
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.
|
| |
Ben Account closed
Registered: Feb 2003 Posts: 163 |
Quote: 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.
Will (and if so when) $dc05 be reset?
I reckon that if the code you are executing is dynamic, you'd have to repeat this trick each line (rather than synchronizing it once for the whole raster).
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: Will (and if so when) $dc05 be reset?
I reckon that if the code you are executing is dynamic, you'd have to repeat this trick each line (rather than synchronizing it once for the whole raster).
Or duplicating your code for every rasterline evenly spaced in memory, which I was trying to say above.
But I'm not sure you can make it count upwards.
You could ofcourse do it with just one NMI timer set to cycle mode ($3e), and make a jump to ($dd03). This way you will get to a routine in a separate page depending on how late you are.
$dd03 is the data direction register for the user port, setting it to $00 would be safe because '0' means input.
Putting $4c into $dd02 could work also, but you will mess up stuff with the serial bus. |
| |
Copyfault
Registered: Dec 2001 Posts: 478 |
Like Werner said: check out Ninja's 2x2-FLI-Routine in his and Oswalds Demo "Real". Ninja wrote some details about it in VN issue 43. The basic idea is to put $04/$dc in $fffe/$ffff and set timer A to lo=$4c hi=$xx. Then let Timer B trigger the NMI continously, starting with $3e. When the IRQ is called, the CPU reads some jmp $($3e-jitter)xx; now you just have to put 8 different jitter_correction_routines at the appropriate mem_areas. This way you get around the prob that timers do ALWAYS decrease; counting upwards sounds very new to me;)) And, ofcourse, it's the cheapest you can get concerning the "penalty cycles".
Check out VN#43 for details! |
| |
Ben Account closed
Registered: Feb 2003 Posts: 163 |
Quote: Like Werner said: check out Ninja's 2x2-FLI-Routine in his and Oswalds Demo "Real". Ninja wrote some details about it in VN issue 43. The basic idea is to put $04/$dc in $fffe/$ffff and set timer A to lo=$4c hi=$xx. Then let Timer B trigger the NMI continously, starting with $3e. When the IRQ is called, the CPU reads some jmp $($3e-jitter)xx; now you just have to put 8 different jitter_correction_routines at the appropriate mem_areas. This way you get around the prob that timers do ALWAYS decrease; counting upwards sounds very new to me;)) And, ofcourse, it's the cheapest you can get concerning the "penalty cycles".
Check out VN#43 for details!
Will do! Thanks! |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: Like Werner said: check out Ninja's 2x2-FLI-Routine in his and Oswalds Demo "Real". Ninja wrote some details about it in VN issue 43. The basic idea is to put $04/$dc in $fffe/$ffff and set timer A to lo=$4c hi=$xx. Then let Timer B trigger the NMI continously, starting with $3e. When the IRQ is called, the CPU reads some jmp $($3e-jitter)xx; now you just have to put 8 different jitter_correction_routines at the appropriate mem_areas. This way you get around the prob that timers do ALWAYS decrease; counting upwards sounds very new to me;)) And, ofcourse, it's the cheapest you can get concerning the "penalty cycles".
Check out VN#43 for details!
Putting the jump into $dc04/05 and trigger using timer B was a neat trick. Otherwise basically what I said in my last post.
Timers counting up... sorry for that. :P
It's been a really long time since I messed with this.
|
Previous - 1 | 2 | 3 - Next |