| |
Richard
Registered: Dec 2001 Posts: 621 |
Charset animation problem
Hi there.
I known how to animate a charset that contains 8 charsets. Which is something like this:
CHARANIM INC ANIMPOINTER
LDA ANIMPOINTER
CMP #$08
BNE ENDANIM
LDA #$00
STA ANIMPOINTER
JSR ANIMATE
ENDANIM RTS
ANIMATE LDX #$00
WRAPCHR LDA $0A00,X
STA $0A40,X
INX
CPX #$08
BNE WRAPCHR
LDX #$00
WRAPCHR2 LDA $0A08,X
STA $0A00,X
INX
CPX #$40
BNE WRAPCHR2
RTS
Easy eh? Unfortunately, I'm trying to animate a charset which somehow has a bigger animation. The animated chars are from $0910-$0a40. Please can you help me get an accurate animation for chars $0910-$0a40 (Putting $0a40 to $0910 and wrapping the frames for all the chars from that range :( ? |
|
... 4 posts hidden. Click here to view all posts.... |
| |
Richard
Registered: Dec 2001 Posts: 621 |
I want to animate all 39 characters in the character buffer, not 8 :( |
| |
Conrad
Registered: Nov 2006 Posts: 849 |
Richard: when you mean "character buffer", do mean just one char? If so, then the code above with do just that! |
| |
Richard
Registered: Dec 2001 Posts: 621 |
All 39 chars :)
Place $0910 to $0a40 and then keep pulling it through to $0910 again. This is so that the 39 chars I am using will animate.
Just like the way I do a colour washing routine that moves from the right of the screen, right over to the first byte.
eg. lda table1
sta table1+39
ldx #0
wrap lda table1+1,x
sta table1+0,x
inx
cpx #39
bne wrap
It is hard for me to explain, but I'm using chars $22 - $48. So char $22 gets copied to $48 and the chars $23 - $27 go back one char, and then repeat inside a loop. So that way I can get a visible char animation.
|
| |
iAN CooG
Registered: May 2002 Posts: 3197 |
The fastest way I can think of doing it is by using an unrolled loop, still takes lots of rastertime.
;---------------------------------------
; Animate some chars, unrolled loop
; ~6*8 lines of rastertime taken
; dasm used
; iAN CooG/HokutoForce
;---------------------------------------
charset = $0800
scr = $0400
charstart = charset+[$22*8]
N_of_chars = 39
; 8 zp temp bytes
ztemp = $49
;d018 value
ns = >scr<<2
nc = [>charset&$3f]>>2
v18 = [ns|nc]&$ff
debug = 0
;---------------------------------------
*=$1000
sei
jsr setmode
jsr setirq
cli
jmp *
;---------------------------------------
animloop
sta rsA+1
stx rsX+1
sty rsY+1
inc $d019
bit $2c2c
bit $2c2c
bit $2c2c
bit $2c2c
bit $2c2c
bit $2c2c
bit $2c2c
nop
inc $d020
;copy 1st element to ztemp
R SET 0
REPEAT 8
lda [charstart+R]
sta [ztemp +R]
R SET R+1
REPEND
inc $d020
;copy 2nd to 1st ... last to last-1
C SET 0
REPEAT [N_of_chars-1]
R SET 0
REPEAT 8
lda [charstart+R+[[C+1]*8]]
sta [charstart+R+[ C *8]]
R SET R+1
REPEND
C SET C+1
REPEND
inc $d020
;copy back ztemp to last
R SET 0
REPEAT 8
lda [ztemp +R]
sta [charstart+R+[[N_of_chars-1]*8]]
R SET R+1
REPEND
lda #0
sta $d020
.if debug == 1
ldx #5
delay
bit $d011
bmi *-3
bit $d011
bpl *-3
dex
bne delay
.endif
rsA lda #$ff
rsX ldx #$ff
rsY ldy #$ff
rti
;---------------------------------------
setirq
lda #>animloop
sta $ffff
lda #<animloop
sta $fffe
lda #$33
sta $d012
lda #$1b
sta $d011
lda #1
sta $d019
sta $d01a
lda #$7f
sta $dc0d
lda $dc0d
rts
;---------------------------------------
setmode
lda #v18
sta $d018
lda #$32
sta $01
lda #$d0
sta trc+2
lda #>charset
sta trc+5
ldx #$00
ldy #$08
trc
lda $d000,x
sta charset,x
txa
sta $0400,x
inx
bne trc
inc trc+2
inc trc+5
dey
bne trc
lda #$35
sta $01
rts
;eof
|
| |
Richard
Registered: Dec 2001 Posts: 621 |
Correction:
It is hard for me to explain, but I'm using chars $22 - $48. So char $22 gets copied to $48 and the chars $23 - $47 go back one char, and then repeat inside a loop. So that way I can get a visible char animation. |
| |
Conrad
Registered: Nov 2006 Posts: 849 |
I kind of understand what you're trying to accomplish here, which is to actually wrap char memory right around itself (like a sprite side-border scoller for example but instead rotates by 8 pixels (a char) at each frame) ... therefore it's not that hard to code - but i warn you, the bigger animation buffer you have, the more raster time is gonna be eaten up. |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
Do you really need to display all animation phases at the same time? In other words, can't you just copy the current phase to one character once every frame? |
| |
Conrad
Registered: Nov 2006 Posts: 849 |
Quote: Do you really need to display all animation phases at the same time? In other words, can't you just copy the current phase to one character once every frame?
That's what I thought he was trying to ask, which is why I wasted some time writing that routine I posted a few hours ago.
I think Richard is saying that he wants to view more than one char on the screen which use the same animation data.
But again!- that routine i posted could be used MULTIPLE times to write animation to different individual chars of any set/bank if you think about it. Modifications need to be applied of course. |
| |
Richard
Registered: Dec 2001 Posts: 621 |
Thanks for your help :)
I'm probably better off using less than 39 chars because of too much rastertime being used :( |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
39 chars * 8 bytes * 8 cycles / 63 cycles = about 40 rasterlines. Does not sound much to me. |
Previous - 1 | 2 - Next |