You could try loading your "data" array with the address where each pattern starts, so then when you access the pattern you can grab the address and dereference it.
You still need to keep track of the length, though. So:
drop_pattern_addr[] = {addresses,of,stuff}
drop_pattern_len[] = {length of each pattern}
then you'd just grab each (in assembly), and be ready to barf through it.
To setup the addresses, you could either:
1) Define each pattern in its own const array, and then const int* drop_pattern_addr[] = {first, second, third, etc};
2) leave it as is, and use the length array at run time to plow through the table and build the address array when the game loads up. It's not like that's going to be hard, or impactful to performance since it'd happen once.
You'd just be like... (its 6am, this might make no sense)
int offset = 0;
for(i = 0; i < drop_pattern_len's length; i++)
{
drop_pattern_addr[i] = &drop_pattern_x[offset];
offset += drop_pattern_len[i];
}
now you have where they all start at, so you can do all the things and the stuffs.