| |
FillmoreC Account closed
Registered: Dec 2008 Posts: 7 |
how to delay a routine from starting?
Lets say I turned the screen black then started music, but i have scroller that I want to delay starting until a certain part of the music. how can I do that.
sort of like
lda #$00
sta $d020
sta $d021
jsr $1000
sei
then set the interupt up and all that
then
irq asl $d019
jsr $1003
jsr scroll
jmp $ea82
scroll
wait until into of the music is done
then scroll
rts
|
|
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
use enough spaces at the beginning of the scrolltext?
or you could count frames... |
| |
Conrad
Registered: Nov 2006 Posts: 849 |
One way would be to read various memory locations of the music player, particularly the memory dump of where temporary track + sequence data is stored. Though you'll need to look at the music player specifications and code first.
Say for example the track read position indexes are temporarily stored from $1400-$1402. At each frame you could read the contents of $1400 to check what pattern list position track 1 is currently at. If the value meets a specific value to compare, trigger the start of scroller from there.
example code:
lda #$00
sta $d020
sta $d021
jsr $1000
; Init scroller trigger check to 0
lda #0
sta triggerscroll+1
sei
; set up irq, blablabla
... ...
irq
asl $d019
jsr $1003
lda $1400 ; Track 1 pattern list position buffer
cmp #$04 ; Track 1 pattern list position to check for.
bne *+7
lda #1
sta triggerscroll+1
triggerscroll
lda #0
beq *+5
jsr scroll
jmp $ea82
... or what Burglar said if you want to make life easier. |
| |
Honesty
Registered: Jan 2003 Posts: 121 |
Just make a plain counter... decreasse some byte until its zeros and then enabble the scrolla...
|
| |
Radiant
Registered: Sep 2004 Posts: 639 |
Frame counting is the best way of doing normal music sync. If you need to do more advanced stuff (like time some action to a particular instrument during a longer period) you can dive into the music player, but for most tasks it is overkill. |
| |
SIDWAVE Account closed
Registered: Apr 2002 Posts: 2238 |
delay .byte 7
init
lda #7 (delay)
sta delay
rts
interrupt routine
jsr not-every-frame-routine
rts
not-every-frame-routine
dec delay
beq go-on
rts
go-on
lda #7
sta delay
(routine to run at x frames, go here)
rts
|
| |
SIDWAVE Account closed
Registered: Apr 2002 Posts: 2238 |
using the CLOCK, you can make a counter that counts to exactly 1 minute and 40 seconds, then set a bit/byte to 0, which means your routine will start.
irq:
lda execute
beq doit
(do rest of stuff in irq)
doit
...
...
...
rts
|
| |
Stainless Steel
Registered: Mar 2003 Posts: 966 |
Or what i like to do is to make the jsr $scrollroutine be a bit $scrollroutine initially.
When the delay routine hits its value it sets the bit to jsr on the scroller and a bit to the delay routine.
|
| |
Hate Bush
Registered: Jul 2002 Posts: 465 |
use timingmarks if your musicplayer supports them. if not, let's have one more |
| |
FillmoreC Account closed
Registered: Dec 2008 Posts: 7 |
Quote: delay .byte 7
init
lda #7 (delay)
sta delay
rts
interrupt routine
jsr not-every-frame-routine
rts
not-every-frame-routine
dec delay
beq go-on
rts
go-on
lda #7
sta delay
(routine to run at x frames, go here)
rts
This only slows the scroll down in speed. I need the scroll not to go for like maybe 5 -10 seconds then start scrolling for the rest of the demo. |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
frameCount: .word 0
startScroller: .byte 0
frameTrigger = 7*50 ; 7 seconds
frameCountLo = frameCount+0
frameCountHi = frameCount+1
irq_handler:
jsr doMusic
; Update frameCount
inc frameCountLo
bne :+
inc frameCountHi
:
; If frameCount == frameTrigger then startScroller=1
lda frameCountHi
cmp #>frameTrigger
bne :+
lda frameCountLo
cmp #<frameTrigger
bne :+
inc startScroller
:
; If startScroller !=0 then doScroller
lda startScroller
beq :+
jsr doScroll
:
; exit IRQ
|
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
oh no what have you done.. looked like c at first glance.. I have to stab my eyes... ;) |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Quote: oh no what have you done.. looked like c at first glance.. I have to stab my eyes... ;)
Sorry for that Ozzie but that's how I write c64 assembly. :) |
| |
iopop
Registered: Dec 2001 Posts: 317 |
JackAssers code will stall the scroller 7 sec every 21.845 minute. Based on the previous code I would prevent it by using JSR/BIT as on/off markers in the code.
frameCount: .word 0
startScroller: .byte 0
frameTrigger = 7*50 ; 7 seconds
frameCountLo = frameCount+0
frameCountHi = frameCount+1
irq_handler:
jsr doMusic
dly: jsr doDelay
dsc: bit doScroll
; exit IRQ
doDelay:
; Update frameCount
inc frameCountLo
bne :+
inc frameCountHi
:
; If frameCount == frameTrigger then startScroller=1
lda frameCountHi
cmp #>frameTrigger
bne :+
lda frameCountLo
cmp #<frameTrigger
bne :+
lda #$20 ;$20 is JSR ie. turn on the scroller.
sta dsc
lda #$2c ;$2c is BIT $abcd ie. disable the delay routine.
sta dly
:
rts
|
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
:) |
| |
FillmoreC Account closed
Registered: Dec 2008 Posts: 7 |
Quote: JackAssers code will stall the scroller 7 sec every 21.845 minute. Based on the previous code I would prevent it by using JSR/BIT as on/off markers in the code.
frameCount: .word 0
startScroller: .byte 0
frameTrigger = 7*50 ; 7 seconds
frameCountLo = frameCount+0
frameCountHi = frameCount+1
irq_handler:
jsr doMusic
dly: jsr doDelay
dsc: bit doScroll
; exit IRQ
doDelay:
; Update frameCount
inc frameCountLo
bne :+
inc frameCountHi
:
; If frameCount == frameTrigger then startScroller=1
lda frameCountHi
cmp #>frameTrigger
bne :+
lda frameCountLo
cmp #<frameTrigger
bne :+
lda #$20 ;$20 is JSR ie. turn on the scroller.
sta dsc
lda #$2c ;$2c is BIT $abcd ie. disable the delay routine.
sta dly
:
rts
i understand this but I have bit of a syntax question. I don't understand
bne :+
i understand say
bne *-2
or
bne lable
but I've never seen bne :+ where is that branching too? Is it branching to the : right before the rts? |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
:+ refers to the next colon.
:- refers to the previous colon.
They're called anonymous labels iirc.
You can also use many + or minus to jump several colons back or forward (just to make stuff more unreadable :) ) |