| | Norrland
Registered: Aug 2011 Posts: 14 |
problems w. opening sidebordes+sprites
Hi there! First post here, but bare with me, I'm gonna spam you with some questions on semi-newbie level for a while..
I'll start with my problems with opening the sideborder. I'm showing a bitmap picture and the plan is to have 4 sprites in the sideborder, in the middle of the screen, all on the same y-pos. I have managed to make a stable irqroutine and have set $d015 to #$f0 to enable sprites 4-7 (sprites in order, the ones with lowest prio). I've also made sure that sprites 0-3 have totally different y-pos than sprites 4-7.
Later down the screen, at the same position as the sprites, I open the border with dec/inc $d016 (cycle 56), and everything goes well for the normal lines, but on bad lines I'll be 3 cycles late (if I've understood everything right) even though I do dec/inc $d016 right after the last lines dec/inc.
I've tried to follow Christian Bauers (+codebase, c-hacking, posts here and others) texts about the vic, rastertiming and opening borders, but I don't understand what I do wrong. In my code I'll do 20 nops between the dec/inc, which in my head equals to 52 cycles including dec/inc, and if that is right, suggests that the vic uses 11 cycles (63-52=11) (2/sprite and 3 for BA signal??) for fetching spritedata for 4 sprites on non-badlines.
If my calculations are right, I don't understand why I have problems on badlines, were I should have 23 cycles(?). Even if I skip one sprite, I'm still one cycle late, and I've read that 4 sprites should be possible..
The code inside irq, and screenshot showing my timing:
dec $d021 ;row1
inc $d021
.byte $ea, $ea, $ea, $ea, $ea, $ea, $ea ;20 st (40 cycles)
.byte $ea, $ea, $ea, $ea, $ea, $ea, $ea
.byte $ea, $ea, $ea, $ea, $ea, $ea
dec $d021 ;row2 6 cycles
inc $d021 ; 6 cycles,tot 52
.byte $ea, $ea, $ea, $ea, $ea, $ea, $ea ;20 st (40 cycles)
.byte $ea, $ea, $ea, $ea, $ea, $ea, $ea
.byte $ea, $ea, $ea, $ea, $ea, $ea
dec $d021 ;row3 6 cycles
inc $d021 ; 6 cycles,tot 52
dec $d020 ;row 4 BADLINE hell breaks loose... (nåja)
inc $d020
http://i1120.photobucket.com/albums/l491/lordborak/kastabort.png
Is my understanding right? Do I need to consider/setup anything else than described above? |
|
... 30 posts hidden. Click here to view all posts.... |
| | TWW
Registered: Jul 2009 Posts: 545 |
Quote: yeah, thats why you destroy A, plus $10 doesnt needs to be set each time, so in the long run it uses less mem anyway :)
A was 8 upon entry and is 8 upon exit.
lda #$08 <----- see, 8!
ldy #$00
OPEN DA BOOORDEEEERRZZZZZZZ!!!!!
Still 8 here!
You however, destroy X and add bytes ;-)
Come to think of it, one could probably use X as a counter to shorten this even further...
<-entrypoint (X set with badline offset $02 set with quantities of linesX8)
!: jsr delayXX
sta $d016
sty $d016
dex
bne !-
jsr delayXX-1
sta $d016
sty $d016
sta $d016,x
sty $d016
ldx #$07
jsr delayZZ
dec $02
bne !-+3
rts
Then again this is straig out of my ass^^ |
| | Oswald
Registered: Apr 2002 Posts: 5094 |
cool, then I win by simply modifying my code to:
$10=6
delay44
3 ldx $10
2 dex ;
3 bne *-3 ;x5=25 cycles +when exits 4 cycles -> 29
6 rts
x needs to be 0, and my x wil be 0 :)
edit: you also need to be on a pagebreak, which is not a nice thing either :) |
| | Frantic
Registered: Mar 2003 Posts: 1648 |
Quote: cool, then I win by simply modifying my code to:
$10=6
delay44
3 ldx $10
2 dex ;
3 bne *-3 ;x5=25 cycles +when exits 4 cycles -> 29
6 rts
x needs to be 0, and my x wil be 0 :)
edit: you also need to be on a pagebreak, which is not a nice thing either :)
...but is it stylish? |
| | Oswald
Registered: Apr 2002 Posts: 5094 |
it does achive what it was intended to: do it in less bytes. changing the goal later, isn't that unfair ? :) |
| | TWW
Registered: Jul 2009 Posts: 545 |
Quote: cool, then I win by simply modifying my code to:
$10=6
delay44
3 ldx $10
2 dex ;
3 bne *-3 ;x5=25 cycles +when exits 4 cycles -> 29
6 rts
x needs to be 0, and my x wil be 0 :)
edit: you also need to be on a pagebreak, which is not a nice thing either :)
Fair enough. Pagebreak isn't cool, but a still somewhat if someone rips your code and don't think about it (hehe).
You still need to do: sta/y/x $10 "somewhere" to ensure $10 = 6. Thus adding 2 bytes (maybee 2 more unless you have a state of 6 in one of your regs) and yielding a total consumption of 8 bytes vs. my 7 bytes.
I guess you would use 3 cycles more overall due to the sta/sty/stx $10 aswell ;-D |
Previous - 1 | 2 | 3 | 4 - Next | |