Example #1
0
void pic8259_set_irq_line(const device_config *device, int irq, int state)
{
	pic8259_t	*pic8259 = get_safe_token(device);

	if (state)
	{
		/* setting IRQ line */
		if (!(pic8259->irq_lines & (1 << irq)))
		{
			if (LOG_GENERAL)
				logerror("pic8259_set_irq_line(): PIC set IRQ line #%d\n", irq);

			pic8259->irq_lines |= 1 << irq;
			pic8259->pending |= 1 << irq;
			pic8259_set_timer(pic8259);
		}
	}
	else
	{
		/* clearing IRQ line */
		if (pic8259->irq_lines & (1 << irq))
		{
			if (LOG_GENERAL)
				logerror("pic8259_set_irq_line(): PIC cleared IRQ line #%d\n", irq);

			pic8259->irq_lines &= ~(1 << irq);
			pic8259_set_timer(pic8259);
		}
	}
}
Example #2
0
int pic8259_acknowledge(device_t *device)
{
	pic8259_t	*pic8259 = get_safe_token(device);
	UINT8 mask;
	int irq;

	for (irq = 0; irq < IRQ_COUNT; irq++)
	{
		mask = 1 << irq;

		/* is this IRQ pending and enabled? */
		if ((pic8259->irr & mask) && !(pic8259->imr & mask))
		{
			if (LOG_GENERAL)
				logerror("pic8259_acknowledge(): PIC acknowledge IRQ #%d\n", irq);
			pic8259->irr &= ~mask;
			pic8259->esr &= ~mask;
			pic8259->irq_lines &= ~mask;

			if (!pic8259->auto_eoi)
				pic8259->isr |= mask;
			pic8259_set_timer(pic8259);
			if (pic8259->is_x86) {
				/* For x86 mode*/
				return irq + pic8259->base;
			} else {
				/* in case of 8080/85) */
				return 0xcd0000 + (pic8259->vector_addr_high << 8) + pic8259->vector_addr_low + (irq << (3-pic8259->vector_size));
			}
		}
	}
	return 0;
}
Example #3
0
static void pic8259_set_irq_line(device_t *device, int irq, int state)
{
	pic8259_t	*pic8259 = get_safe_token(device);
	UINT8		old_irq_lines = pic8259->irq_lines;

	if (state)
	{
		/* setting IRQ line */
		if (LOG_GENERAL)
			logerror("pic8259_set_irq_line(): PIC set IRQ line #%d\n", irq);

		pic8259->irq_lines |= 1 << irq;

		/* Set ESR bit if we see a 0 -> 1 transition */
		if ( ! ( old_irq_lines & ( 1 << irq ) ) )
			pic8259->esr |= ( 1 << irq );
	}
	else
	{
		/* clearing IRQ line */
		if (LOG_GENERAL)
			logerror("pic8259_set_irq_line(): PIC cleared IRQ line #%d\n", irq);

		pic8259->irq_lines &= ~(1 << irq);
	}

	pic8259->irr = ( pic8259->level_trig_mode ) ? pic8259->esr & pic8259->irq_lines : pic8259->irq_lines;
	pic8259_set_timer(pic8259);
}
Example #4
0
static void pic8259_set_irq_line(device_t *device, int irq, int state)
{
	pic8259_t	*pic8259 = get_safe_token(device);
	UINT8 mask = (1 << irq);

	if (state)
	{
		/* setting IRQ line */
		if (LOG_GENERAL)
			logerror("pic8259_set_irq_line(): PIC set IRQ line #%d\n", irq);

		if(pic8259->level_trig_mode || (!pic8259->level_trig_mode && !(pic8259->irq_lines & mask)))
			pic8259->irr |= mask;
		pic8259->irq_lines |= mask;
	}
	else
	{
		/* clearing IRQ line */
		if (LOG_GENERAL)
			logerror("pic8259_set_irq_line(): PIC cleared IRQ line #%d\n", irq);

		pic8259->irq_lines &= ~mask;
		pic8259->irr &= ~mask;
	}

	pic8259_set_timer(pic8259);
}
Example #5
0
int pic8259_acknowledge(device_t *device)
{
	pic8259_t	*pic8259 = get_safe_token(device);
	UINT8 mask;
	int irq;

	for (irq = 0; irq < IRQ_COUNT; irq++)
	{
		mask = 1 << irq;

		/* is this IRQ pending and enabled? */
		if ((pic8259->irr & mask) && !(pic8259->imr & mask))
		{
			if (LOG_GENERAL)
				logerror("pic8259_acknowledge(): PIC acknowledge IRQ #%d\n", irq);
			if (!pic8259->level_trig_mode)
				pic8259->irr &= ~mask;

			if (!pic8259->auto_eoi)
				pic8259->isr |= mask;

			pic8259_set_timer(pic8259);

			if ((pic8259->cascade!=0) && (pic8259->master!=0) && (mask & pic8259->slave)) {
				// it's from slave device
				return pic8259->read_slave_ack_func(irq);
			} else {
				if (pic8259->is_x86) {
					/* For x86 mode*/
					return irq + pic8259->base;
				} else {
					/* in case of 8080/85) */
					return 0xcd0000 + (pic8259->vector_addr_high << 8) + pic8259->vector_addr_low + (irq << (3-pic8259->vector_size));
				}
			}
		}
	}
	return 0;
}