Implemented the poll mode of the PIC, 386BSD no longer hangs (but now resets the machine after a while).
This commit is contained in:
31
src/pic.c
31
src/pic.c
@@ -240,11 +240,37 @@ pic_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
pic.ocw3 = val;
|
pic.ocw3 = val;
|
||||||
if (val & 2)
|
if (val & 2)
|
||||||
pic.read=(val & 1);
|
pic.read=(val & 1);
|
||||||
|
pic.read |= (val & 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
pic_highest_req(PIC* target_pic, int pic2)
|
||||||
|
{
|
||||||
|
uint8_t pending = target_pic->pend & ~target_pic->mask;
|
||||||
|
int i, highest = 0;
|
||||||
|
int min = 0, max = 8;
|
||||||
|
|
||||||
|
if (AT && pic2) {
|
||||||
|
min = 8;
|
||||||
|
max = 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = min; i < max; i++) {
|
||||||
|
if ((!AT || (i != 2)) && (pending & (1 << (i & 7)))) {
|
||||||
|
highest = (i & 7) | 0x80;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
target_pic->read &= ~4;
|
||||||
|
|
||||||
|
return highest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t
|
uint8_t
|
||||||
pic_read(uint16_t addr, void *priv)
|
pic_read(uint16_t addr, void *priv)
|
||||||
{
|
{
|
||||||
@@ -260,6 +286,8 @@ pic_read(uint16_t addr, void *priv)
|
|||||||
ret = ((pic.vector & 0xf8) >> 3) << 0;
|
ret = ((pic.vector & 0xf8) >> 3) << 0;
|
||||||
else if (addr & 1)
|
else if (addr & 1)
|
||||||
ret = pic.mask;
|
ret = pic.mask;
|
||||||
|
else if (pic.read & 5)
|
||||||
|
ret = pic_highest_req(&pic, 0);
|
||||||
else if (pic.read) {
|
else if (pic.read) {
|
||||||
if (AT)
|
if (AT)
|
||||||
ret = pic.ins | (pic2.ins ? 4 : 0);
|
ret = pic.ins | (pic2.ins ? 4 : 0);
|
||||||
@@ -394,6 +422,7 @@ pic2_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
pic2.ocw3 = val;
|
pic2.ocw3 = val;
|
||||||
if (val & 2)
|
if (val & 2)
|
||||||
pic2.read=(val & 1);
|
pic2.read=(val & 1);
|
||||||
|
pic2.read |= (val & 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -414,6 +443,8 @@ pic2_read(uint16_t addr, void *priv)
|
|||||||
ret = ((pic2.vector & 0xf8) >> 3) << 0;
|
ret = ((pic2.vector & 0xf8) >> 3) << 0;
|
||||||
else if (addr & 1)
|
else if (addr & 1)
|
||||||
ret = pic2.mask;
|
ret = pic2.mask;
|
||||||
|
else if (pic2.read & 5)
|
||||||
|
ret = pic_highest_req(&pic2, 1);
|
||||||
else if (pic2.read)
|
else if (pic2.read)
|
||||||
ret = pic2.ins;
|
ret = pic2.ins;
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user