예제 #1
0
void interrupts_process(interrupts *ir, state *st, memory* mem) {
	if (st->irq_master && ir->reg.enable && ir->reg.flags) {
		uint8_t cur_irq = ir->reg.enable & ir->reg.flags;

		uint8_t handled_exception = (cur_irq & IRQ_VBLANK) ||
			(cur_irq & IRQ_TIMER) ||
			(cur_irq & IRQ_JOYPAD);

		if (handled_exception) {

			// Save pc on stack, disable interrupts
			st->irq_master = 0;
			st->reg.SP -= 2;
			memory_write_word(mem, st->reg.SP, st->reg.PC);
			st->clk += 3;


			// Ack IRQ & jump to handler
			if (cur_irq & IRQ_VBLANK) {
				ir->reg.flags &= ~IRQ_VBLANK;
				st->reg.PC = OFFSET_VBLANK;
			} else if (cur_irq & IRQ_LCD) {
				ir->reg.flags &= ~IRQ_LCD;
				st->reg.PC = OFFSET_LCD;
			} else if (cur_irq & IRQ_TIMER) {
				ir->reg.flags &= ~IRQ_TIMER;
				st->reg.PC = OFFSET_TIMER;
			} else if (cur_irq & IRQ_JOYPAD) {
				ir->reg.flags &= ~IRQ_JOYPAD;
				st->reg.PC = OFFSET_JOYPAD;
			}
		}
	}
}
예제 #2
0
파일: cpu.c 프로젝트: vikt0r0/gbemu
void ld_addr_hl_a(memory_t *mem, registers_t *regs) {
	// Write contents of a to (HL)
	memory_write_word(mem, regs->HL, regs->A);
	// Decrement HL
	regs->HL--;
	regs->PC++;
}
예제 #3
0
static WRITE16_HANDLER( protection_w )
{
	asterix_state *state = (asterix_state *)space->machine->driver_data;
	COMBINE_DATA(state->prot + offset);

	if (offset == 1)
	{
		UINT32 cmd = (state->prot[0] << 16) | state->prot[1];
		switch (cmd >> 24)
		{
		case 0x64:
			{
			UINT32 param1 = (memory_read_word(space, cmd & 0xffffff) << 16) | memory_read_word(space, (cmd & 0xffffff) + 2);
			UINT32 param2 = (memory_read_word(space, (cmd & 0xffffff) + 4) << 16) | memory_read_word(space, (cmd & 0xffffff) + 6);

			switch (param1 >> 24)
			{
				case 0x22:
				{
					int size = param2 >> 24;
					param1 &= 0xffffff;
					param2 &= 0xffffff;
					while(size >= 0)
					{
						memory_write_word(space, param2, memory_read_word(space, param1));
						param1 += 2;
						param2 += 2;
						size--;
					}
				break;
				}
			}
			break;
			}
		}
	}
예제 #4
0
파일: segaic16.c 프로젝트: Dipri/imame4all
static void memory_mapper_w(const address_space *space, struct memory_mapper_chip *chip, offs_t offset, UINT8 data)
{
	UINT8 oldval;

	/* wraps every 32 bytes */
	offset &= 0x1f;

	/* remember the previous value and swap in the new one */
	oldval = chip->regs[offset];
	chip->regs[offset] = data;

	/* switch off the offset */
	switch (offset)
	{
		case 0x02:
			/* misc commands */
			/*   00 - resume execution after 03 */
			/*   03 - maybe controls halt and reset lines together? */
			if ((oldval ^ chip->regs[offset]) & 3)
			{
				if ((chip->regs[offset] & 3) == 3)
					fd1094_machine_init(chip->cpu);

				/* fd1094_machine_init calls device_reset on the CPU, so we must do this afterwards */
				cpu_set_input_line(chip->cpu, INPUT_LINE_RESET, (chip->regs[offset] & 3) == 3 ? ASSERT_LINE : CLEAR_LINE);
			}
			break;

		case 0x03:
			if (chip->sound_w)
				(*chip->sound_w)(space->machine, data);
			break;

		case 0x04:
			/* controls IRQ lines to 68000, negative logic -- write $B to signal IRQ4 */
			if ((chip->regs[offset] & 7) != 7)
			{
				int irqnum;
				for (irqnum = 0; irqnum < 8; irqnum++)
					cpu_set_input_line(chip->cpu, irqnum, (irqnum == (~chip->regs[offset] & 7)) ? HOLD_LINE : CLEAR_LINE);
			}
			break;

		case 0x05:
			/* read/write control */
			/*   01 - write data latched in 00,01 to 2 * (address in 0A,0B,0C) */
			/*   02 - read data into latches 00,01 from 2 * (address in 07,08,09) */
			if (data == 0x01)
			{
				const address_space *targetspace = cpu_get_address_space(chip->cpu, ADDRESS_SPACE_PROGRAM);
				offs_t addr = (chip->regs[0x0a] << 17) | (chip->regs[0x0b] << 9) | (chip->regs[0x0c] << 1);
				memory_write_word(targetspace, addr, (chip->regs[0x00] << 8) | chip->regs[0x01]);
			}
			else if (data == 0x02)
			{
				const address_space *targetspace = cpu_get_address_space(chip->cpu, ADDRESS_SPACE_PROGRAM);
				offs_t addr = (chip->regs[0x07] << 17) | (chip->regs[0x08] << 9) | (chip->regs[0x09] << 1);
				UINT16 result;
				result = memory_read_word(targetspace, addr);
				chip->regs[0x00] = result >> 8;
				chip->regs[0x01] = result;
			}
			break;

		case 0x07:	case 0x08:	case 0x09:
			/* writes here latch a 68000 address for writing */
			break;

		case 0x0a:	case 0x0b:	case 0x0c:
			/* writes here latch a 68000 address for reading */
			break;

		case 0x10:	case 0x11:
		case 0x12:	case 0x13:
		case 0x14:	case 0x15:
		case 0x16:	case 0x17:
		case 0x18:	case 0x19:
		case 0x1a:	case 0x1b:
		case 0x1c:	case 0x1d:
		case 0x1e:	case 0x1f:
			if (oldval != data)
				update_memory_mapping(space->machine, chip, 1);
			break;

		default:
			logerror("Unknown memory_mapper_w to address %02X = %02X\n", offset, data);
			break;
	}
}