// MAIN EMULATION LOOP (MAME CORE) -------------------------------------------- void CPU_Loop (void) { for (;;) { z80_execute (opt.Cur_IPeriod); switch (LoopZ80 ()) { case INT_IRQ: break; case INT_NMI: z80_set_nmi_line (ASSERT_LINE); z80_set_nmi_line (CLEAR_LINE); break; case INT_QUIT: return; } } /* z80_stop_emulating(); */ }
/* 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; } } }