void S9xMSU1Generate(size_t sample_count) { partial_frames += 4410 * (sample_count / 2); while ((bufPos < (bufEnd - 2)) && partial_frames >= 3204) { if (MSU1.MSU1_STATUS & AudioPlaying && audioStream) { int32 sample; int16* left = (int16*)&sample; int16* right = left + 1; int bytes_read = READ_STREAM((char *)&sample, 4, audioStream); if (bytes_read == 4) { *left = ((int32)(int16)GET_LE16(left) * MSU1.MSU1_VOLUME / 255); *right = ((int32)(int16)GET_LE16(right) * MSU1.MSU1_VOLUME / 255); *(bufPos++) = *left; *(bufPos++) = *right; MSU1.MSU1_AUDIO_POS += 4; partial_frames -= 3204; } else if (bytes_read >= 0) { if (MSU1.MSU1_STATUS & AudioRepeating) { MSU1.MSU1_AUDIO_POS = audioLoopPos; REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); REVERT_STREAM(audioStream, 8, 0); } } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); } } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); partial_frames -= 3204; *(bufPos++) = 0; *(bufPos++) = 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); }
int LZMAT_CALLCONV lzmat_decode(MP_U8 *pbOut, MP_U32 *pcbOut, MP_U8 *pbIn, MP_U32 cbIn) { MP_U32 inPos, outPos; MP_U32 cbOutBuf = *pcbOut; MP_U8 cur_nib; *pbOut = *pbIn; for(inPos=1, outPos=1, cur_nib=0; inPos<(cbIn-cur_nib);) { int bc; MP_U8 tag; tag = LZMAT_GET_U8(pbIn+inPos,cur_nib); inPos++; for(bc=0; bc<8 && inPos<(cbIn-cur_nib) && outPos<cbOutBuf; bc++, tag<<=1) { if(tag&0x80) // gamma { MP_U32 r_pos, r_cnt, dist; #define cflag r_cnt cflag = LZMAT_GET_LE16(pbIn+inPos,cur_nib); inPos++; if(outPos>MAX_LZMAT_SHORT_DIST1) { dist = cflag>>2; switch(cflag&3) { case 0: dist=(dist&LZMAT_DIST_MSK0)+1; break; case 1: inPos+=cur_nib; dist = (dist&LZMAT_DIST_MSK1)+0x41; cur_nib^=1; break; case 2: inPos++; dist += 0x441; break; case 3: if((inPos+2+cur_nib)>cbIn) return LZMAT_STATUS_INTEGRITY_FAILURE+1; inPos++; dist = (dist + ((MP_U32)LZMAT_GET_U4(pbIn,inPos,cur_nib)<<14)) +0x4441; break; } } else { dist = cflag>>1; if(cflag&1) { inPos+=cur_nib; dist = (dist&0x7FF)+0x81; cur_nib^=1; } else dist = (dist&0x7F)+1; } #undef cflag r_cnt = LZMAT_GET_U4(pbIn,inPos,cur_nib); if(r_cnt!=0xF) { r_cnt += 3; } else { if((inPos+1+cur_nib)>cbIn) return LZMAT_STATUS_INTEGRITY_FAILURE+2; r_cnt = LZMAT_GET_U8(pbIn+inPos,cur_nib); inPos++; if(r_cnt!=0xFF) { r_cnt += LZMAT_DEFAULT_CNT; } else { if((inPos+2+cur_nib)>cbIn) return LZMAT_STATUS_INTEGRITY_FAILURE+3; r_cnt = LZMAT_GET_LE16(pbIn+inPos,cur_nib)+LZMAT_1BYTE_CNT; inPos+=2; if(r_cnt==LZMAT_2BYTE_CNT) { // copy chunk if(cur_nib) { r_cnt = ((MP_U32)pbIn[inPos-4]&0xFC)<<5; inPos++; cur_nib = 0; } else { r_cnt = (GET_LE16(pbIn+inPos-5)&0xFC0)<<1; } r_cnt+=(tag&0x7F)+4; r_cnt<<=1; if((outPos+(r_cnt<<2))>cbOutBuf) return LZMAT_STATUS_BUFFER_TOO_SMALL; while(r_cnt-- && outPos<cbOutBuf) { *(MP_U32 *)(pbOut+outPos)=*(MP_U32 *)(pbIn+inPos); inPos+=4; outPos+=4; } break; } } } if(outPos<dist) return LZMAT_STATUS_INTEGRITY_FAILURE+4; if((outPos+r_cnt)>cbOutBuf) return LZMAT_STATUS_BUFFER_TOO_SMALL+1; r_pos = outPos-dist; while(r_cnt-- && outPos<cbOutBuf) pbOut[outPos++]=pbOut[r_pos++]; }