예제 #1
0
void S9xMSU1PostLoadState(void)
{
	if (DataOpen())
	{
        REVERT_STREAM(dataStream, MSU1.MSU1_DATA_POS, 0);
	}

	if (MSU1.MSU1_STATUS & AudioPlaying)
	{
		if (AudioOpen())
		{
            REVERT_STREAM(audioStream, 4, 0);
            READ_STREAM((char *)&audioLoopPos, 4, audioStream);
			audioLoopPos = GET_LE32(&audioLoopPos);
			audioLoopPos <<= 2;
			audioLoopPos += 8;

            REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0);
		}
		else
		{
			MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
			MSU1.MSU1_STATUS |= AudioError;
		}
	}

	bufPos = 0;
	bufBegin = 0;
	bufEnd = 0;

	partial_frames = 0;
}
예제 #2
0
static bool AudioOpen()
{
	MSU1.MSU1_STATUS |= AudioError;

	AudioClose();

	char ext[_MAX_EXT];
	snprintf(ext, _MAX_EXT, "-%d.pcm", MSU1.MSU1_CURRENT_TRACK);

    audioStream = S9xMSU1OpenFile(ext);
	if (audioStream)
	{
		if (GETC_STREAM(audioStream) != 'M')
			return false;
		if (GETC_STREAM(audioStream) != 'S')
			return false;
		if (GETC_STREAM(audioStream) != 'U')
			return false;
		if (GETC_STREAM(audioStream) != '1')
			return false;

        READ_STREAM((char *)&audioLoopPos, 4, audioStream);
		audioLoopPos = GET_LE32(&audioLoopPos);
		audioLoopPos <<= 2;
		audioLoopPos += 8;

        MSU1.MSU1_AUDIO_POS = 8;

		MSU1.MSU1_STATUS &= ~AudioError;
		return true;
	}

	return false;
}
예제 #3
0
파일: msu1.cpp 프로젝트: libretro/snes9x
void S9xMSU1PostLoadState(void)
{
	if (DataOpen())
	{
        REVERT_STREAM(dataStream, MSU1.MSU1_DATA_POS, 0);
	}

	if (MSU1.MSU1_STATUS & AudioPlaying)
	{
		uint32 savedPosition = MSU1.MSU1_AUDIO_POS;

		if (AudioOpen())
		{
            REVERT_STREAM(audioStream, 4, 0);
            READ_STREAM((char *)&audioLoopPos, 4, audioStream);
			audioLoopPos = GET_LE32(&audioLoopPos);
			audioLoopPos <<= 2;
			audioLoopPos += 8;

			MSU1.MSU1_AUDIO_POS = savedPosition;
            REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0);
		}
		else
		{
			MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
			MSU1.MSU1_STATUS |= AudioError;
		}
	}

	if (msu_resampler)
		msu_resampler->clear();

	partial_frames = 0;
}
예제 #4
0
void GameClient::HandleRequestAccountData (CMSG_REQUEST_ACCOUNT_DATA_t &inpkt)
{
    if (!Character)
        return;

    uint8 *data;
    if (inpkt.FileIndex <= 2)
        data = AccountData [inpkt.FileIndex];
    else if (inpkt.FileIndex <= 4)
        data = Character->AccountData [inpkt.FileIndex - 3];
    else
        return;

    if (!data)
        return;

    SMSG_UPDATE_ACCOUNT_DATA_t *outpkt = SMSG_UPDATE_ACCOUNT_DATA_t::Create ();
    outpkt->FileIndex = inpkt.FileIndex;
    outpkt->UncompressedSize = GET_LE32 (data);
    outpkt->CompressedData_Size = GET_LE32 (data + 4);
    outpkt->CompressedData = data + 24;
    Send (outpkt);
}
예제 #5
0
static void nwsign(char *r_data1, char *r_data2, char *outdata) {
 int i;
 unsigned int w0,w1,w2,w3;
 static int rbit[4]={0, 2, 1, 3};
#ifdef __i386__
 unsigned int *data2=(int *)r_data2;
#else
 unsigned int data2[16];
 for (i=0;i<16;i++)
  data2[i]=GET_LE32(r_data2+(i<<2));
#endif 
 w0=GET_LE32(r_data1);
 w1=GET_LE32(r_data1+4);
 w2=GET_LE32(r_data1+8);
 w3=GET_LE32(r_data1+12);
 for (i=0;i<16;i+=4) {
  w0=rol32(w0 + ((w1 & w2) | ((~w1) & w3)) + data2[i+0],3);
  w3=rol32(w3 + ((w0 & w1) | ((~w0) & w2)) + data2[i+1],7);
  w2=rol32(w2 + ((w3 & w0) | ((~w3) & w1)) + data2[i+2],11);
  w1=rol32(w1 + ((w2 & w3) | ((~w2) & w0)) + data2[i+3],19);
 }
 for (i=0;i<4;i++) {
  w0=rol32(w0 + (((w2 | w3) & w1) | (w2 & w3)) + 0x5a827999 + data2[i+0],3);
  w3=rol32(w3 + (((w1 | w2) & w0) | (w1 & w2)) + 0x5a827999 + data2[i+4],5);
  w2=rol32(w2 + (((w0 | w1) & w3) | (w0 & w1)) + 0x5a827999 + data2[i+8],9);
  w1=rol32(w1 + (((w3 | w0) & w2) | (w3 & w0)) + 0x5a827999 + data2[i+12],13);
 }
 for (i=0;i<4;i++) {
  w0=rol32(w0 + ((w1 ^ w2) ^ w3) + 0x6ed9eba1 + data2[rbit[i]+0],3);
  w3=rol32(w3 + ((w0 ^ w1) ^ w2) + 0x6ed9eba1 + data2[rbit[i]+8],9);
  w2=rol32(w2 + ((w3 ^ w0) ^ w1) + 0x6ed9eba1 + data2[rbit[i]+4],11);
  w1=rol32(w1 + ((w2 ^ w3) ^ w0) + 0x6ed9eba1 + data2[rbit[i]+12],15);
 }
 PUT_LE32(outdata,(w0+GET_LE32(r_data1)) & 0xffffffff);
 PUT_LE32(outdata+4,(w1+GET_LE32(r_data1+4)) & 0xffffffff);
 PUT_LE32(outdata+8,(w2+GET_LE32(r_data1+8)) & 0xffffffff);
 PUT_LE32(outdata+12,(w3+GET_LE32(r_data1+12)) & 0xffffffff);
}
예제 #6
0
static int
pack_printf(
        void (*putc)(char **pbs, char *be, char c),
        char **pbuf_start,
        char *buf_end,
        const char *fmt,
        const char *pack,
        uint8_t *msg,
        uint32_t msg_len)
{
    char buf[sizeof(long long)*8];
    char c, sign, *cp=buf;
    int32_t left_prec, right_prec, zero_fill, pad, pad_on_right,
        i, islong, islonglong;
    long long val = 0;
    int32_t res = 0, length = 0;

    while ((c = fmt_next_char(&fmt)) != '\0') {
        if (c == '%') {
            c = fmt_next_char(&fmt);
            left_prec = right_prec = pad_on_right = islong = islonglong = 0;
            if (c == '-') {
                c = fmt_next_char(&fmt);
                pad_on_right++;
            }
            if (c == '0') {
                zero_fill = 1;
                c = fmt_next_char(&fmt);
            } else {
                zero_fill = 0;
            }
            while (is_digit(c)) {
                left_prec = (left_prec * 10) + (c - '0');
                c = fmt_next_char(&fmt);
            }
            if (c == '.') {
                c = fmt_next_char(&fmt);
                zero_fill++;
                while (is_digit(c)) {
                    right_prec = (right_prec * 10) + (c - '0');
                    c = fmt_next_char(&fmt);
                }
            } else {
                right_prec = left_prec;
            }
            sign = '\0';
            if (c == 'l') {
                /* 'long' qualifier */
                c = fmt_next_char(&fmt);
                islong = 1;
                if (c == 'l') {
                    /* long long qualifier */
                    c = fmt_next_char(&fmt);
                    islonglong = 1;
                }
            }
            /* Fetch value [numeric descriptors only] */
            switch (c) {
            case 'p':
                islong = 1;
            case 'd':
            case 'D':
            case 'x':
            case 'X':
            case 'u':
            case 'U':
            case 'b':
            case 'B':
                switch (fmt_next_char(&pack)) {
                case 'b':
                    GET_8(val, msg, msg_len);
                    break;
                case 'h':
                    GET_LE16(val, msg, msg_len);
                    break;
                case 'i':
                case 'I':
                    GET_LE32(val, msg, msg_len);
                    break;
                case 'q':
                    GET_LE64(val, msg, msg_len);
                    break;
                default:
                    c = 0;
                    break;
                }
                if ((c == 'd') || (c == 'D')) {
                    if (val < 0) {
                        sign = '-';
                        val = -val;
                    }
                } else {
                    /* Mask to unsigned, sized quantity */
                    if (!islonglong) {
                        if (islong) {
                            val &= ((long long)1 << (sizeof(long) * 8)) - 1;
                        } else{
                            val &= ((long long)1 << (sizeof(int) * 8)) - 1;
                        }
                    }
                }
                break;
            default:
                break;
            }
            /* Process output */
            switch (c) {
            case 'p':  /* Pointer */
                (*putc)(pbuf_start, buf_end,'0');
                (*putc)(pbuf_start, buf_end,'x');
                zero_fill = 1;
                left_prec = sizeof(unsigned long)*2;
            case 'd':
            case 'D':
            case 'u':
            case 'U':
            case 'x':
            case 'X':
                switch (c) {
                case 'd':
                case 'D':
                case 'u':
                case 'U':
                    length = _cvt(val, buf, 10, "0123456789");
                    break;
                case 'p':
                case 'x':
                    length = _cvt(val, buf, 16, "0123456789abcdef");
                    break;
                case 'X':
                    length = _cvt(val, buf, 16, "0123456789ABCDEF");
                    break;
                }
                cp = buf;
                break;
            case 's':
            case 'S':
                cp = NULL; /* TODO string literals not supported yet */
                if (cp == NULL)  {
                    cp = "<null>";
                }
                length = 0;
                while (cp[length] != '\0') length++;
                break;
            case 'c':
            case 'C':
                switch (fmt_next_char(&pack)) {
                case 'b':
                    GET_8(c, msg, msg_len);
                    break;
                case 'h':
                    GET_LE16(c, msg, msg_len);
                    break;
                case 'i':
                case 'I':
                    GET_LE32(c, msg, msg_len);
                    break;
                case 'q':
                    GET_LE64(c, msg, msg_len);
                    break;
                default:
                    c = 0;
                    break;
                }
                (*putc)(pbuf_start, buf_end,c);
                res++;
                continue;
            case 'b':
            case 'B':
                length = left_prec;
                if (left_prec == 0) {
                    if (islonglong)
                        length = sizeof(long long)*8;
                    else if (islong)
                        length = sizeof(long)*8;
                    else
                        length = sizeof(uint32_t)*8;
                }
                for (i = 0;  i < length-1;  i++) {
                    buf[i] = ((val & ((long long)1<<i)) ? '1' : '.');
                }
                cp = buf;
                break;
            case '%':
                (*putc)(pbuf_start, buf_end,'%');
                break;
            default:
                (*putc)(pbuf_start, buf_end,'%');
                (*putc)(pbuf_start, buf_end,c);
                res += 2;
            }
            pad = left_prec - length;
            if (sign != '\0') {
                pad--;
            }
            if (zero_fill) {
                c = '0';
                if (sign != '\0') {
                    (*putc)(pbuf_start, buf_end,sign);
                    res++;
                    sign = '\0';
                }
            } else {
                c = ' ';
            }
            if (!pad_on_right) {
                while (pad-- > 0) {
                    (*putc)(pbuf_start, buf_end,c);
                    res++;
                }
            }
            if (sign != '\0') {
                (*putc)(pbuf_start, buf_end,sign);
                res++;
            }
            while (length-- > 0) {
                c = *cp++;
                (*putc)(pbuf_start, buf_end,c);
                res++;
            }
            if (pad_on_right) {
                while (pad-- > 0) {
                    (*putc)(pbuf_start, buf_end,' ');
                    res++;
                }
            }
        } else {
            (*putc)(pbuf_start, buf_end,c);
            res++;
        }
    }
    (*putc)(pbuf_start, buf_end, '\0');
msg_error:
    return (res);
}