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); } } }
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; }
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); }
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); }
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; }