Exemple #1
0
static void write(u32 addr,u8 data)
{
	switch(addr & 0xF000) {
		case 0x8000:
			prg[0] = data;
			break;
		case 0x9000:
			break;
		case 0xA000:
			break;
		case 0xB000:
			switch(map[addr & 3]) {
				case 0:
				case 1:
				case 2:
					break;
				case 3:
					mirror = data & 0xC;
					break;
			}
			break;
		case 0xC000:
			prg[1] = data;
			break;
		case 0xD000:
			chr[map[addr & 3]] = data;
			break;
		case 0xE000:
			chr[map[addr & 3] + 4] = data;
			break;
		case 0xF000:
			switch(map[addr & 3]) {
				case 0:
					irqlatch = data;
					break;
				case 1:
					irqcontrol = data;
					if(data & 2) {
						irqcounter = irqlatch;
						irqprescaler = 341;
					}
					cpu_clear_irq(IRQ_MAPPER);
					break;
				case 2:
					cpu_clear_irq(IRQ_MAPPER);
					irqcontrol |= (irqcontrol & 1) << 1;
					break;
			}
			break;
	}
	sync();
}
Exemple #2
0
static void write(u32 addr,u8 data)
{
	switch(addr & 0xF000) {
		case 0x8000:	irqlatch = (irqlatch & 0xFFF0) | ((data & 0xF) << 0);		break;
		case 0x9000:	irqlatch = (irqlatch & 0xFF0F) | ((data & 0xF) << 4);		break;
		case 0xA000:	irqlatch = (irqlatch & 0xF0FF) | ((data & 0xF) << 8);		break;
		case 0xB000:	irqlatch = (irqlatch & 0x0FFF) | ((data & 0xF) << 12);	break;
		case 0xC000:
			irqenable = data & 7;
			if(irqenable & 2)
				irqcounter = irqlatch;
			cpu_clear_irq(IRQ_MAPPER);
			break;
		case 0xD000:
			if(irqenable & 1)
				irqenable |= 2;
			else
				irqenable &= ~2;
			cpu_clear_irq(IRQ_MAPPER);
			break;
		case 0xE000:
			control = data & 0xF;
			break;
		case 0xF000:
			switch(control) {
				case 1:
				case 2:
				case 3:
				case 4:
					prg[control - 1] = (prg[control - 1] & 0x10) | (data & 0xF);
					break;
			}
			switch(addr & 0xFC00) {
				case 0xF000:
					prg[addr & 3] &= 0xF;
					prg[addr & 3] |= (data & 0x10);
					break;
				case 0xF400:
					break;
				case 0xF800:
					mirror = data & 1;
					break;
				case 0xFC00:
					chr[addr & 7] = data;
					break;
			}
			sync();
			break;
	}
}
Exemple #3
0
static void sync()
{
    static u8 oldreg1 = 0x10;
    u8 reg1 = mmc1_getlowchr();

    mmc1_syncmirror();
    mmc1_syncsram();
    mem_setvram8(0,0);
    if(reg1 & 0x10) {
        irqenabled = 0;
        irqcounter = 0;
        cpu_clear_irq(IRQ_MAPPER);
    }
    else
        irqenabled = 1;
    if(prglock) {
        mem_setprg32(8,0);
        if((oldreg1 & 0x10) == 0 && (reg1 & 0x10) == 0x10)
            prglock = 0;
    }
    else {
        if(reg1 & 8)
            mmc1_syncprg(7,8);
        else
            mem_setprg32(8,(reg1 >> 1) & 3);
    }
    oldreg1 = reg1;
}