void sn764xx_stream_update(void *_info, stream_sample_t **outputs, int samples) { sn764xx_state* info = (sn764xx_state*)_info; switch(info->EMU_CORE) { case EC_MAME: SN76496Update(info->chip, outputs, samples); break; #ifdef ENABLE_ALL_CORES case EC_MAXIM: SN76489_Update((SN76489_Context*)info->chip, outputs, samples); break; #endif } }
void sn764xx_stream_update(UINT8 ChipID, stream_sample_t **outputs, int samples) { sn764xx_state *info = &SN764xxData[ChipID]; switch(EMU_CORE) { case EC_MAME: SN76496Update(info->chip, outputs, samples); break; #ifdef ENABLE_ALL_CORES case EC_MAXIM: SN76489_Update((SN76489_Context*)info->chip, outputs, samples); break; #endif } }
/* Run the virtual console emulation for one frame */ void sms_frame(int skip_render) { /* Take care of hard resets */ if(input.system & INPUT_HARD_RESET) { system_reset(); } /* Debounce pause key */ if(input.system & INPUT_PAUSE) { if(!sms.paused) { sms.paused = 1; z80_set_nmi_line(ASSERT_LINE); z80_set_nmi_line(CLEAR_LINE); } } else { sms.paused = 0; } if(snd.log) snd.callback(0x00); for(vdp.line = 0; vdp.line < 262; vdp.line += 1) { /* Handle VDP line events */ vdp_run(); /* Draw the current frame */ if(!skip_render) render_line(vdp.line); /* Run the Z80 for a line */ z80_execute(227); } /* Update the emulated sound stream */ if(snd.enabled) { int count; SN76496Update(0, snd.psg_buffer, snd.bufsize, sms.psg_mask); if(sms.use_fm) { int i; for(i = 0; i < snd.bufsize; i++) { snd.fm_buffer[i] = OPLL_calc(opll); } } for(count = 0; count < snd.bufsize; count += 1) { signed short left = 0; signed short right = 0; left = right = snd.fm_buffer[count]; left += snd.psg_buffer[0][count]; right += snd.psg_buffer[1][count]; snd.buffer[0][count] = left; snd.buffer[1][count] = right; } } }
/* Run the virtual console emulation for one frame */ void system_frame(int skip_render) { static int iline_table[] = {0xC0, 0xE0, 0xF0}; int lpf = (sms.display == DISPLAY_NTSC) ? 262 : 313; int iline, z80cnt = 0;; INT32 nSoundBufferPos = 0; /* Debounce pause key */ if(input.system & INPUT_PAUSE) { if(!sms.paused) { sms.paused = 1; ZetNmi(); } } else { sms.paused = 0; } ZetNewFrame(); text_counter = 0; /* End of frame, parse sprites for line 0 on line 261 (VCount=$FF) */ if(vdp.mode <= 7) parse_line(0); for(vdp.line = 0; vdp.line < lpf;) { iline = iline_table[vdp.extended]; z80cnt = 0; if(!skip_render) { render_line(vdp.line); } if(vdp.line <= iline) { vdp.left -= 1; if(vdp.left == -1) { vdp.left = vdp.reg[0x0A]; vdp.hint_pending = 1; if(vdp.reg[0x00] & 0x10) { if (!(ZetTotalCycles() % CYCLES_PER_LINE)) { ZetRun(1); z80cnt++; } ZetSetIRQLine(0, CPU_IRQSTATUS_ACK); } } } else { vdp.left = vdp.reg[0x0A]; } ZetRun(228 - z80cnt); if(vdp.line == iline) { vdp.status |= 0x80; vdp.vint_pending = 1; if(vdp.reg[0x01] & 0x20) { ZetSetIRQLine(0, CPU_IRQSTATUS_ACK); } } // Render Sound Segment if (pBurnSoundOut) { INT32 nSegmentLength = nBurnSoundLen / lpf; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); SN76496Update(0, pSoundBuf, nSegmentLength); nSoundBufferPos += nSegmentLength; } ++vdp.line; if(vdp.mode <= 7) parse_line(vdp.line); } // Make sure the buffer is entirely filled. if (pBurnSoundOut) { INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { SN76496Update(0, pSoundBuf, nSegmentLength); } } }