merge more pic patches

This commit is contained in:
Stanislav Shwartsman 2011-10-23 21:53:56 +00:00
parent f73cdfaeac
commit 360900d7bd

View File

@ -699,6 +699,7 @@ void bx_pic_c::service_master_pic(void)
return;
}
isr = BX_PIC_THIS s.master_pic.isr;
if (BX_PIC_THIS s.master_pic.special_mask) {
/* all priorities may be enabled. check all IRR bits except ones
* which have corresponding ISR bits set
@ -707,9 +708,8 @@ void bx_pic_c::service_master_pic(void)
}
else { /* normal mode */
/* Find the highest priority IRQ that is enabled due to current ISR */
isr = BX_PIC_THIS s.master_pic.isr;
max_irq = highest_priority;
if (isr) {
max_irq = highest_priority;
while ((isr & (1 << max_irq)) == 0) {
max_irq++;
if(max_irq > 7)
@ -719,8 +719,6 @@ void bx_pic_c::service_master_pic(void)
* no other priorities allowed */
if (max_irq > 7) BX_PANIC(("error in service_master_pic()"));
}
else
max_irq = highest_priority; /* 0..7 bits in ISR are cleared */
}
/* now, see if there are any higher priority requests */
@ -730,7 +728,7 @@ void bx_pic_c::service_master_pic(void)
/* for special mode, since we're looking at all IRQ's, skip if
* current IRQ is already in-service
*/
if (! (BX_PIC_THIS s.master_pic.special_mask && ((BX_PIC_THIS s.master_pic.isr >> irq) & 0x01))) {
if (! (BX_PIC_THIS s.master_pic.special_mask && ((isr >> irq) & 0x01))) {
if (unmasked_requests & (1 << irq)) {
BX_DEBUG(("signalling IRQ(%u)", (unsigned) irq));
BX_PIC_THIS s.master_pic.INT = 1;
@ -760,6 +758,7 @@ void bx_pic_c::service_slave_pic(void)
return;
}
isr = BX_PIC_THIS s.slave_pic.isr;
if (BX_PIC_THIS s.slave_pic.special_mask) {
/* all priorities may be enabled. check all IRR bits except ones
* which have corresponding ISR bits set
@ -768,9 +767,8 @@ void bx_pic_c::service_slave_pic(void)
}
else { /* normal mode */
/* Find the highest priority IRQ that is enabled due to current ISR */
isr = BX_PIC_THIS s.slave_pic.isr;
max_irq = highest_priority;
if (isr) {
max_irq = highest_priority;
while ((isr & (1 << max_irq)) == 0) {
max_irq++;
if(max_irq > 7)
@ -778,10 +776,8 @@ void bx_pic_c::service_slave_pic(void)
}
if (max_irq == highest_priority) return; /* Highest priority interrupt in-service,
* no other priorities allowed */
if (max_irq > 7) BX_PANIC(("error in service_master_pic()"));
if (max_irq > 7) BX_PANIC(("error in service_slave_pic()"));
}
else
max_irq = highest_priority; /* 0..7 bits in ISR are cleared */
}
/* now, see if there are any higher priority requests */
@ -791,7 +787,7 @@ void bx_pic_c::service_slave_pic(void)
/* for special mode, since we're looking at all IRQ's, skip if
* current IRQ is already in-service
*/
if (! (BX_PIC_THIS s.slave_pic.special_mask && ((BX_PIC_THIS s.slave_pic.isr >> irq) & 0x01))) {
if (! (BX_PIC_THIS s.slave_pic.special_mask && ((isr >> irq) & 0x01))) {
if (unmasked_requests & (1 << irq)) {
BX_DEBUG(("slave: signalling IRQ(%u)", (unsigned) 8 + irq));