Well, you sort of indirectly answered my question, so thanks!
I want to take it further than what it is. Here is the (now working) program that I am using now:
#include <Wire.h>
int val_0;
int val_1;
int val_2;
int val_3;
byte buf[8];
void setup()
{
Wire.begin(2); // address #2 (NXT address 0x04)
Wire.onRequest(requestEvent); // register event
}
void loop()
{
val_0 = analogRead(0);
val_1 = analogRead(1);
val_2 = analogRead(2);
val_3 = analogRead(3);
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent()
{
buf[0] = val_0;
buf[1] = val_0 >> 8;
buf[2] = val_1;
buf[3] = val_1 >> 8;
buf[4] = val_2;
buf[5] = val_2 >> 8;
buf[6] = val_3;
buf[7] = val_3 >> 8;
Wire.send(buf, 8);
}
Now I want to have a register structure for I2C. I want to be able to read any one (or more in sequence) of the bytes from the registers I want to (according to the NXT which is the master). Using the above as an example, I want to be able to read just "registers" 6 and 7 (ADC 3). If registers aren't really usable, what about being able to sense which register I am requesting, and the length, and then building the buffer accordingly? On the NXT side (with the above Arduino program), it doesn't matter what register I request, the Arduino just starts sending from the beginning.