| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
*newbie* Raster Bars ....
Hi all, i am wondering how to implement as nice
raster bar algorithm, i started with:
http://www.ffd2.com/fridge/vic/stableraster.txt
for a stable entry point, how do i now change raster bar color in each subsequent line ? i was fiddling around with after the irq3 exits, it calls irq1 with a subsequent line, and then start it over, the problem is, when initiating the interrupt routine more than once in a it shifts abit to the right so the starting position of the change of color is visible on screen ... any hints to fill subsequent lines at allways the same x-position ?! |
|
| |
WVL
Registered: Mar 2002 Posts: 902 |
you have to count the number of cpu cycles in your loop, and match this to the number of cycles the cpu has available each rasterline. If there are too many cycles each loop, the position where you change will slowly drift 'to the right', if there are too few cycles in your loop, it will 'drift to the left'. On normal rasterlines, there are 63 cycles available for the cpu. However, there are also lines called 'bad lines', which have less. Also using sprites on a certain rasterline means less cycles available for the cpu.
For further reference, I suggest you pick up the 'Vic Article' :) google for it. |
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
puh, ok, i have implemented a bunch of this ... ;)
here are some results, if you like watch'em:
http://www.digitalgott.de/c64/sines-raster.asm
and
http://www.digitalgott.de/c64/sines-raster.prg
|
| |
Wanderer Account closed
Registered: Apr 2003 Posts: 478 |
It works great in PAL. I see that you're using $d020 only.
See the other thread for a way to do it using $d020/$d021 which allows you to have text on the screen.
Looks nice though.
|
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
at the moment i am just playing around with the copper-like effects ... ;) next time i watch how to display a sprite logo or some scrolltext, or a sprite scrolltext,
if you like you can watch another raster bar example,
this time more like a 1d dotflag .. ;)
http://www.digitalgott.de/c64/sinus_raster_flag.prg
and the source
http://www.digitalgott.de/c64/sinus_raster_flag.asm |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
btw you dont need any flicker fix for a rasterbar routine, you _dont_ need to be cycle exact at all. Max is about 8 cycle jitter, which can be placed on a screen area (right and left border of the screen) that will be never visible.
cycle exact timings were invented for hi tech stuff, like opening the side borders.
simpleirqsetup:
sei
lda #$7f ;disable default cia #1 timer interrupts
sta $dc0d ;which is used by kernal to flash cursor, etc.
lda #$01
sta $d01a ;ask for raster interrupts from vic
lda #$40
sta $d012 ;at rasterline $40
lda $d011
and #%01111111
sta $d011 ;0 into 9th bit of requested rasterline
lda $dc0d ;acknowledge any pending cia #1
lda $dd0d ;cia #2
lsr $d019 ;or raster irq
lda #<irq ;set up interrupt vector
sta $fffe
lda #>irq
sta $ffff
lda #$35
sta $01
cli
jmp *
irq
sta tempa+1
stx tempx+1
sty tempy+1
;do your stuff
lsr $d019 ;acknowledge irq (if you dont do this your irq routine will be reentered right after the rti again and again.., resulting in a mess)
tempa lda #$00
tempx ldx #$00
tempy ldy #$00
rti
even if you wont use this I think this helps in understanding whats going on more, than the messy tricky double irq example.
|
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
har har, but this way i have full screen bars .... but i can not do anything else then displaying those bars... |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
both methods allows you to have fullscreen bars. |
| |
Graham Account closed
Registered: Dec 2002 Posts: 990 |
Quote: har har, but this way i have full screen bars .... but i can not do anything else then displaying those bars...
You want to do an IRQ every rasterline so you can use some "remaining time"? Forget about this, even if you do almost nothing there are not enough clock cycles to have an IRQ each rasterline. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
graham, if ninja can do every 2nd line fli with separated irqs, how much impossible is this ? :) |
| |
Graham Account closed
Registered: Dec 2002 Posts: 990 |
Yes, every 2nd line FLI is ofcourse the perfect beginner example :P
Anyway, you might be able to do every line IRQ, but it wont help you. Your rasterbars will be buggy because you change colors in the middle of the screen, and you wont have much cycles free. |
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
hmm, but i do not get it exactly, to repeat what i know :
Q: How to Make C64 Raster Bars ( Changing Color of subsequent Raster lines without jitter ( like on the good old amiga with help of copper ))
A: 1. Catch a certain rasterline
- via Double Interrupt, so it is stable
- via single interrupt, but it jitters
- via loop and check for $d012
2. Delay exactly 63 clock cycles between colors
- problems: Bad Lines
- how to handle bad lines ?
- use a delay table so that each 8th line waits less
- query for bad line status
- switch off display
what you say, what is the best method now ??! i managed rasterbars only with a stable interrupt and switching of the display .. :/ |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
trifox, its really not that complicated, just invest some time into it.
I suggest to you to try my irq setup with the color change routine from the other topic.
then debug debug debug.
a non double irq will jitter, but there's enough wide invisible area on the sides to hide that with correct timing.
#1 make sure the 1st line that set by the routine is a bad line, and the first color change is on the left, invisible, side of the screen.
#2 check the routine with 1 color change, 2, 3, 4, 5,6.. 8, and adjust the timing / delay, its not that hard to see whats going on, and wether the delay is too short or not.
#3 you may count every cycle and design a loop on paper so it does 63 cycles 7 times and 23 cycle one time. (more likely the (63*7)+(23*1) time for one char height will be constant, than cycle times for each raster line)
#4
keep in mind that the delay routine adds 5 cycles at each loop, except the last which is 4. I'm not sure but maybe the outside loop needs an extra nop. when I posted that routine my calculations told me its incorrect, but I clearly remember it worked this way.
(I have done my part of (flickerfree) rasterbars, and I never needed a stable irq..., secondly there was noone there to tell me how, I had to work out everything, even setting up the damn raster irq, I've copyed some code from a booklet, and used it for years without having the slightest idea what it really does... so be happy with all the help here;) |
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
yes, iam and it is really funny that there are so many people who still know what is going on in the c64 |
| |
moz Account closed
Registered: May 2006 Posts: 7 |
I'm messing around with raster bars at the moment too. That ASM was a nice example, although I don't understand it all yet (I need to spend more time reading).
I was also trying to set sprite multi-colour 2 for each line but found that it really slowed everything down, should this be expected? I thought it would simply be a case of changing a memory address, but the more sprites I have on the specified line the greater the delay seems to be.
I'd love to be able to change border+screen+MC2 per line. Am I asking for too much?
|
| |
Honesty
Registered: Jan 2003 Posts: 121 |
Read the posts...
Problem is that vic needs more time to fetch sprite data and put it to the screen...
So u have less time each line for lda/sta stuff.
So far i know also the sprites have different values for how long the data fetch take.
|