Все процедуры типа XBP_SET_ - передают 8-битные данные, поскольку шина 8-битная, аналогично для XBP_GET_.
Вот пример функции _xbplug_MainDevice:
cdrom_Device isodrive;
void* _xbplug_MainDevice(int proc, void* data)
{
uint32 tmp;
void* xfisonew;
switch(proc)
{
case XBP_INIT:
isodrive.Init();
return (void*)true;
case XBP_RESET:
if(!data)
{
isodrive.Destroy();
isodrive.Init();
}
else if(((char*)data)[0])isodrive.InitISO((char*)data);
else isodrive.InitCD();
break;
case XBP_SET_COMMAND:
isodrive.SendCommand((unsigned char)data);
break;
case XBP_FIQ:
return (void*)isodrive.TestFIQ(); //фактически - возвращается булева переменная: 0 - нет прерывания, 1 - есть
case XBP_GET_DATA:
return (void*)isodrive.GetDataFifo();
case XBP_GET_STATUS:
return (void*)isodrive.GetStatusFifo();
case XBP_SET_POLL:
isodrive.SetPoll((unsigned int)data);
break;
case XBP_GET_POLL:
return (void*)isodrive.GetPoll();
case XBP_DESTROY:
isodrive.Destroy();
break;
case XBP_GET_SAVESIZE:
tmp=sizeof(cdrom_Device)+12;
return (void*)tmp;
case XBP_GET_SAVEDATA:
tmp=12;
((uint32*)data)[0]=0xfefefe01;
((uint32*)data)[1]=fs3do_SecPosition(isodrive.fisonew);
((uint32*)data)[2]=fs3do_SubPosition(isodrive.fisonew);
memcpy(&(((uint8*)data)[tmp]),&isodrive,sizeof(cdrom_Device));
break;
case XBP_SET_SAVEDATA:
if(((uint32*)data)[0]!=0xfefefe01)return NULL;
xfisonew=isodrive.fisonew;
memcpy(&isodrive,&(((uint8*)data)[12]),sizeof(cdrom_Device));
isodrive.fisonew=xfisonew;
fs3do_DirectSeek(xfisonew, ((uint32*)data)[1], ((uint32*)data)[2]);
return (void*)1;
};
return NULL;
}