Example #1
0
void supervision_exec(unsigned short *backbuffer, unsigned char bRender)
{
	uint32 supervision_scanline, scan1=0;
	int i;

	for (supervision_scanline = 0; supervision_scanline < 160; supervision_scanline++)
	{
		m6502_registers.ICount = 512; 
		//Default is 512 
		timer_exec((m6502_registers.ICount));
			
#ifdef GP2X
		if(currentConfig.enable_sound) sound_exec(11025/160);
#else
		sound_exec(22050/160);
#endif
		Run6502(&m6502_registers);
			
#ifdef NDS
		gpu_render_scanline(supervision_scanline, backbuffer);
		backbuffer += 160+96;
#else
		gpu_render_scanline_fast(scan1, backbuffer);
		backbuffer += 160;
		scan1 += 0x30;
#endif
	}

	if (Rd6502(0x2026)&0x01)
		Int6502(supervision_get6502regs(), INT_NMI);
}
Example #2
0
void cpu_run(void)
{
    int totalcpu,usres;
    unsigned char *ROM0;	/* opcode decryption is currently supported only for the first memory region */


    ROM0 = ROM;

    /* count how many CPUs we have to emulate */
    totalcpu = 0;
    while (totalcpu < MAX_CPU)
    {
        const struct MemoryReadAddress *mra;
        const struct MemoryWriteAddress *mwa;


        if (Machine->drv->cpu[totalcpu].cpu_type == 0) break;

        /* if sound is disabled, don't emulate the audio CPU */
        if (play_sound == 0 && (Machine->drv->cpu[totalcpu].cpu_type & CPU_AUDIO_CPU))
            cpurunning[totalcpu] = 0;
        else
            cpurunning[totalcpu] = 1;

        /* initialize the memory base pointers for memory hooks */
        RAM = Machine->memory_region[Machine->drv->cpu[totalcpu].memory_region];
        mra = Machine->drv->cpu[totalcpu].memory_read;
        while (mra->start != -1)
        {
            if (mra->base) *mra->base = &RAM[mra->start];
            mra++;
        }
        mwa = Machine->drv->cpu[totalcpu].memory_write;
        while (mwa->start != -1)
        {
            if (mwa->base) *mwa->base = &RAM[mwa->start];
            mwa++;
        }


        totalcpu++;
    }

#ifdef BUGS
    extern void g_exec(void);
    g_exec();
#else // BUGS

reset:
    for (activecpu = 0; activecpu < totalcpu; activecpu++)
    {
        int cycles;


        cycles = Machine->drv->cpu[activecpu].cpu_clock /
                 (Machine->drv->frames_per_second * Machine->drv->cpu[activecpu].interrupts_per_frame);

        switch(Machine->drv->cpu[activecpu].cpu_type & ~CPU_FLAGS_MASK)
        {
        case CPU_Z80:
        {
            struct z80context *ctxt;


            ctxt = (struct z80context *)cpucontext[activecpu];
            Z80_Reset();
            Z80_GetRegs(&ctxt->regs);
            ctxt->icount = cycles;
            ctxt->iperiod = cycles;
            ctxt->irq = Z80_IGNORE_INT;
        }
        break;

#if 0
        case CPU_M6502:
        {
            M6502 *ctxt;


            ctxt = (M6502 *)cpucontext[activecpu];
            /* Reset6502() needs to read memory to get the PC start address */
            RAM = Machine->memory_region[Machine->drv->cpu[activecpu].memory_region];
            memoryread = Machine->drv->cpu[activecpu].memory_read;
            ctxt->IPeriod = cycles;	/* must be done before Reset6502() */
            Reset6502(ctxt);
        }
        break;
        case CPU_I86:
            RAM = Machine->memory_region[Machine->drv->cpu[activecpu].memory_region];
            I86_Reset(RAM,cycles);
            break;
        /* DS... */
        case CPU_M6809:
        {
            struct m6809context *ctxt;

            ctxt = (struct m6809context *)cpucontext[activecpu];
            /* m6809_reset() needs to read memory to get the PC start address */
            RAM = Machine->memory_region[Machine->drv->cpu[activecpu].memory_region];
            memoryread = Machine->drv->cpu[activecpu].memory_read;
            m6809_IPeriod = cycles;
            m6809_reset();
            m6809_GetRegs(&ctxt->regs);
            ctxt->icount = cycles;
            ctxt->iperiod = cycles;
            ctxt->irq = INT_NONE;
        }
        break;
#endif
            /* ...DS */
        }
    }


    do
    {
        for (activecpu = 0; activecpu < totalcpu; activecpu++)
        {
            if (cpurunning[activecpu])
            {
                int loops;


                memoryread = Machine->drv->cpu[activecpu].memory_read;
                memorywrite = Machine->drv->cpu[activecpu].memory_write;

                RAM = Machine->memory_region[Machine->drv->cpu[activecpu].memory_region];
                /* opcode decryption is currently supported only for the first memory region */
                if (activecpu == 0) ROM = ROM0;
                else ROM = RAM;


                switch(Machine->drv->cpu[activecpu].cpu_type & ~CPU_FLAGS_MASK)
                {
                case CPU_Z80:
                {
                    struct z80context *ctxt;


                    ctxt = (struct z80context *)cpucontext[activecpu];

                    Z80_SetRegs(&ctxt->regs);
                    Z80_ICount = ctxt->icount;
                    Z80_IPeriod = ctxt->iperiod;
                    Z80_IRQ = ctxt->irq;

                    for (loops = 0; loops < Machine->drv->cpu[activecpu].interrupts_per_frame; loops++)
                        Z80_Execute();

                    Z80_GetRegs(&ctxt->regs);
                    ctxt->icount = Z80_ICount;
                    ctxt->iperiod = Z80_IPeriod;
                    ctxt->irq = Z80_IRQ;
                }
                break;

#if 0
                case CPU_M6502:
                    for (loops = 0; loops < Machine->drv->cpu[activecpu].interrupts_per_frame; loops++)
                        Run6502((M6502 *)cpucontext[activecpu]);
                    break;

                case CPU_I86:
                    for (loops = 0; loops < Machine->drv->cpu[activecpu].interrupts_per_frame; loops++)
                        I86_Execute();
                    break;
                /* DS... */
                case CPU_M6809:
                {
                    struct m6809context *ctxt;

                    ctxt = (struct m6809context *)cpucontext[activecpu];

                    m6809_SetRegs(&ctxt->regs);
                    m6809_ICount = ctxt->icount;
                    m6809_IPeriod = ctxt->iperiod;
                    m6809_IRequest = ctxt->irq;

                    for (loops = 0; loops < Machine->drv->cpu[activecpu].interrupts_per_frame; loops++)
                        m6809_execute();

                    m6809_GetRegs(&ctxt->regs);
                    ctxt->icount = m6809_ICount;
                    ctxt->iperiod = m6809_IPeriod;
                    ctxt->irq = m6809_IRequest;
                }
                break;
#endif
                    /* ...DS */
                }
            }
        }

        usres = updatescreen();
        if (usres == 2)	/* user asked to reset the machine */
            goto reset;
    } while (usres == 0);
#endif // BUGS
}