It'd go a little something like this (untested):
Code:
hero_frame1:
.db aY, $80, $00, aX, aY, $81, $00, aX+8
.db aY+8, $90, $00, aX, aY+8, $91, $00, aX+8
.db aY+16, $a0, $00, aX, aY+16, $a1, $00, aX+8
.db aY+24, $b0, $00, aX, aY+24, $b1, $00, aX+8
hero_frame2:
.db aY, $82, $00, aX, aY, $83, $00, aX+8
.db aY+8, $92, $00, aX, aY+8, $93, $00, aX+8
.db aY+16, $a2, $00, aX, aY+16, $a3, $00, aX+8
.db aY+24, $b2, $00, aX, aY+24, $b3, $00, aX+8
hero_frame3:
.db aY, $84, $00, aX, aY, $85, $00, aX+8
.db aY+8, $94, $00, aX, aY+8, $95, $00, aX+8
.db aY+16, $a4, $00, aX, aY+16, $a5, $00, aX+8
.db aY+24, $b4, $00, aX, aY+24, $b5, $00, aX+8
hero_frame4:
.db aY, $86, $00, aX, aY, $87, $00, aX+8
.db aY+8, $96, $00, aX, aY+8, $97, $00, aX+8
.db aY+16, $a6, $00, aX, aY+16, $a7, $00, aX+8
.db aY+24, $b6, $00, aX, aY+24, $b7, $00, aX+8
; Operator < produces the low byte of an address
sprite_layouts_lo:
.db <hero_frame1, <hero_frame2, <hero_frame3, <hero_frame4
; Operator > produces the high byte of an address
sprite_layouts_hi:
.db >hero_frame1, >hero_frame2, >hero_frame3, >hero_frame4
; Number of hardware sprites in each layout
sprite_layouts_count:
.db 8, 8, 8, 8
draw_sprite:
; t0-t2 are temporary zero page locations holding
; the address of a particular sprite layout and the
; number of sprites left to draw
lda sprite_layouts_lo,x
sta t0
lda sprite_layouts_hi,x
sta t0+1
lda sprite_layouts_count,x
sta t2
ldy #0
; oamIndex is a variable tracking how far you've written
; into shadow OAM (customarily at $0200-$02FF)
ldx oamIndex
@loop:
; If you have the address of an array in a zero page pointer,
; you use the (d),y addressing mode and increase Y to go
; to the next byte.
lda (t0),y
iny
; etc.
dec t2
bne @loop
stx oamIndex
rts
some_other_method:
ldx #2
jsr draw_sprite
EDIT: Fixed a typo.