| version 1.4, 2003/11/12 20:02:54 | version 1.11, 2004/01/22 01:10:04 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
| #include        "i286.h" | #include        "cpucore.h" | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "iocore.h" | #include        "iocore.h" | 
 |  |  | 
| Line 63  void extirq_pop(void) { | Line 63  void extirq_pop(void) { | 
 | *(UINT32 *)(p->pi[1].level+0) = *(UINT32 *)(p->pi[1].levelbak+0); | *(UINT32 *)(p->pi[1].level+0) = *(UINT32 *)(p->pi[1].levelbak+0); | 
 | *(UINT32 *)(p->pi[1].level+4) = *(UINT32 *)(p->pi[1].levelbak+4); | *(UINT32 *)(p->pi[1].level+4) = *(UINT32 *)(p->pi[1].levelbak+4); | 
 | p->pi[1].isr = p->pi[1].isrbak; | p->pi[1].isr = p->pi[1].isrbak; | 
 |  | //              TRACEOUT(("iret: extirq_pop")); | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 79  static void pic_rolpry(PICITEM pi) { | Line 80  static void pic_rolpry(PICITEM pi) { | 
 | } | } | 
 |  |  | 
 |  |  | 
| static void pic_downbylevel(PICITEM picp, BYTE level) { | static void pic_downbylevel(PICITEM picp, UINT level) { | 
 |  |  | 
 | int             i; | int             i; | 
 |  |  | 
| Line 93  static void pic_downbylevel(PICITEM picp | Line 94  static void pic_downbylevel(PICITEM picp | 
 |  |  | 
 |  |  | 
 | // eoi処理 | // eoi処理 | 
| static void pic_forceeoibylevel(PICITEM picp, BYTE level) { | static void pic_forceeoibylevel(PICITEM picp, UINT level) { | 
 |  |  | 
 | int             i; | int             i; | 
 |  |  | 
 | if (picp->isr & (1 << level)) { | if (picp->isr & (1 << level)) { | 
 | picp->isr &= ~(1 << level); | picp->isr &= ~(1 << level); | 
| (picp->levels)--; | picp->levels--; | 
 | for (i=0; (i<picp->levels) && (picp->level[i] != level); i++) { } | for (i=0; (i<picp->levels) && (picp->level[i] != level); i++) { } | 
 | for (; i<picp->levels; i++) { | for (; i<picp->levels; i++) { | 
 | picp->level[i] = picp->level[i+1]; | picp->level[i] = picp->level[i+1]; | 
| Line 112  void pic_irq(void) { | Line 113  void pic_irq(void) { | 
 |  |  | 
 | int             i; | int             i; | 
 | BYTE    bit; | BYTE    bit; | 
| char    pry; | SINT8   pry; | 
 | BYTE    irq; | BYTE    irq; | 
 | BYTE    sirq; | BYTE    sirq; | 
 | BYTE    targetbit; | BYTE    targetbit; | 
| Line 121  void pic_irq(void) { | Line 122  void pic_irq(void) { | 
 | p = &pic; | p = &pic; | 
 |  |  | 
 | // 割込み許可で 要求あり? | // 割込み許可で 要求あり? | 
| if ((isI286EI) && (!p->ext_irq) && | if ((CPU_isEI) && (!p->ext_irq) && | 
 | ((p->pi[0].irr & (~p->pi[0].imr)) || | ((p->pi[0].irr & (~p->pi[0].imr)) || | 
 | (p->pi[1].irr & (~p->pi[1].imr)))) { | (p->pi[1].irr & (~p->pi[1].imr)))) { | 
 |  |  | 
| Line 130  void pic_irq(void) { | Line 131  void pic_irq(void) { | 
 | pry = -1; | pry = -1; | 
 | } | } | 
 | else { | else { | 
| pry = (char)p->pi[0].pry[p->pi[0].level[p->pi[0].levels - 1]]; | pry = (SINT8)p->pi[0].pry[p->pi[0].level[p->pi[0].levels - 1]]; | 
 | } | } | 
 | irq = 0xff; | irq = 0xff; | 
 | targetbit = 0; | targetbit = 0; | 
| for (bit=1, i=0; bit; bit<<=1, i++) { | for (bit=1, i=0; i<8; bit<<=1, i++) { | 
 | if ((p->pi[0].irr & bit) && | if ((p->pi[0].irr & bit) && | 
 | (!((p->pi[0].imr | p->pi[0].isr) & bit))) { | (!((p->pi[0].imr | p->pi[0].isr) & bit))) { | 
| if ((char)p->pi[0].pry[i] > pry) { | if ((SINT8)p->pi[0].pry[i] > pry) { | 
 | pry = p->pi[0].pry[i]; | pry = p->pi[0].pry[i]; | 
 | irq = (BYTE)i; | irq = (BYTE)i; | 
 | targetbit = bit; | targetbit = bit; | 
| Line 152  void pic_irq(void) { | Line 153  void pic_irq(void) { | 
 | sirq = p->pi[1].icw[2] & 7; | sirq = p->pi[1].icw[2] & 7; | 
 | bit = 1 << sirq; | bit = 1 << sirq; | 
 | if (!((p->pi[0].imr | p->pi[0].isr) & bit)) { | if (!((p->pi[0].imr | p->pi[0].isr) & bit)) { | 
| if ((char)p->pi[0].pry[sirq] > pry) { | if ((SINT8)p->pi[0].pry[sirq] > pry) { | 
 | irq = sirq; | irq = sirq; | 
 | targetbit = bit; | targetbit = bit; | 
 | } | } | 
| Line 170  void pic_irq(void) { | Line 171  void pic_irq(void) { | 
 | if (irq == 0) {                                                                 // ver0.28 | if (irq == 0) {                                                                 // ver0.28 | 
 | nevent_reset(NEVENT_PICMASK); | nevent_reset(NEVENT_PICMASK); | 
 | } | } | 
| i286_interrupt((BYTE)((p->pi[0].icw[1] & 0xf8) | irq)); | // TRACEOUT(("hardware-int %.2x", (p->pi[0].icw[1] & 0xf8) | irq)); | 
|  | CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | irq)); | 
 | return; | return; | 
 | } | } | 
 | if ((!p->pi[0].levels) || | if ((!p->pi[0].levels) || | 
| Line 183  void pic_irq(void) { | Line 185  void pic_irq(void) { | 
 | pry = -1; | pry = -1; | 
 | } | } | 
 | else { | else { | 
| pry = (char)p->pi[1].pry[p->pi[1].level[p->pi[1].levels - 1]]; | pry = (SINT8)p->pi[1].pry[p->pi[1].level[p->pi[1].levels - 1]]; | 
 | } | } | 
 | targetbit = 0; | targetbit = 0; | 
| for (bit=1, i=0; bit; bit<<=1, i++) { | for (bit=1, i=0; i<8; bit<<=1, i++) { | 
 | if ((p->pi[1].irr & bit) && | if ((p->pi[1].irr & bit) && | 
 | (!((p->pi[1].imr | p->pi[1].isr) & bit))) { | (!((p->pi[1].imr | p->pi[1].isr) & bit))) { | 
| if ((char)p->pi[1].pry[i] > pry) { | if ((SINT8)p->pi[1].pry[i] > pry) { | 
 | pry = p->pi[1].pry[i]; | pry = p->pi[1].pry[i]; | 
 | irq = (BYTE)i; | irq = (BYTE)i; | 
 | targetbit = bit; | targetbit = bit; | 
| Line 211  void pic_irq(void) { | Line 213  void pic_irq(void) { | 
 | p->pi[0].irr &= ~(1 << sirq); | p->pi[0].irr &= ~(1 << sirq); | 
 | p->pi[0].level[p->pi[0].levels++] = sirq; | p->pi[0].level[p->pi[0].levels++] = sirq; | 
 | } | } | 
| // TRACEOUT(("hardware int %.2x", (p->pi[1].icw[1] & 0xf8) | irq)); | // TRACEOUT(("hardware-int %.2x", (p->pi[1].icw[1] & 0xf8) | irq)); | 
| i286_interrupt((BYTE)((p->pi[1].icw[1] & 0xf8) | irq)); | CPU_INTERRUPT((REG8)((p->pi[1].icw[1] & 0xf8) | irq)); | 
 | } | } | 
 | } | } | 
 | } | } | 
| Line 230  void picmask(NEVENTITEM item) { | Line 232  void picmask(NEVENTITEM item) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| void pic_setirq(BYTE irq) { | void pic_setirq(REG8 irq) { | 
 |  |  | 
 | PICITEM pi; | PICITEM pi; | 
| BYTE    bit; | REG8    bit; | 
 |  |  | 
 | pi = pic.pi; | pi = pic.pi; | 
 | bit = 1 << (irq & 7); | bit = 1 << (irq & 7); | 
| Line 244  void pic_setirq(BYTE irq) { | Line 246  void pic_setirq(BYTE irq) { | 
 | if ((pit.mode[0] & 0x0c) == 0x04) { | if ((pit.mode[0] & 0x0c) == 0x04) { | 
 | SINT32 cnt;                                                                             // ver0.29 | SINT32 cnt;                                                                             // ver0.29 | 
 | if (pit.value[0] > 8) { | if (pit.value[0] > 8) { | 
| cnt = pc.multiple * pit.value[0]; | cnt = pccore.multiple * pit.value[0]; | 
 | cnt >>= 2; | cnt >>= 2; | 
 | } | } | 
 | else { | else { | 
| cnt = pc.multiple << (16 - 2); | cnt = pccore.multiple << (16 - 2); | 
 | } | } | 
 | nevent_set(NEVENT_PICMASK, cnt, picmask, NEVENT_ABSOLUTE); | nevent_set(NEVENT_PICMASK, cnt, picmask, NEVENT_ABSOLUTE); | 
 | } | } | 
| Line 266  void pic_setirq(BYTE irq) { | Line 268  void pic_setirq(BYTE irq) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| void pic_resetirq(BYTE irq) { | void pic_resetirq(REG8 irq) { | 
 |  |  | 
 | PICITEM         pi; | PICITEM         pi; | 
 |  |  | 
| Line 274  void pic_resetirq(BYTE irq) { | Line 276  void pic_resetirq(BYTE irq) { | 
 | pi->irr &= ~(1 << (irq & 7)); | pi->irr &= ~(1 << (irq & 7)); | 
 | } | } | 
 |  |  | 
|  | void pic_registext(REG8 irq) { | 
| void pic_registext(BYTE irq) { |  | 
 |  |  | 
 | PICITEM         pi; | PICITEM         pi; | 
 |  |  | 
| Line 286  void pic_registext(BYTE irq) { | Line 287  void pic_registext(BYTE irq) { | 
 |  |  | 
 | // ---- I/O | // ---- I/O | 
 |  |  | 
| static void IOOUTCALL pic_o00(UINT port, BYTE dat) { | static void IOOUTCALL pic_o00(UINT port, REG8 dat) { | 
 |  |  | 
 | PICITEM         picp; | PICITEM         picp; | 
| BYTE            level; | UINT            level; | 
 |  |  | 
 | //      TRACEOUT(("pic %x %x", port, dat)); | //      TRACEOUT(("pic %x %x", port, dat)); | 
 | picp = &pic.pi[(port >> 3) & 1]; | picp = &pic.pi[(port >> 3) & 1]; | 
| Line 337  static void IOOUTCALL pic_o00(UINT port, | Line 338  static void IOOUTCALL pic_o00(UINT port, | 
 | } | } | 
 | } | } | 
 |  |  | 
| static void IOOUTCALL pic_o02(UINT port, BYTE dat) { | #if defined(TRACE) | 
|  | extern int piccnt; | 
|  | #endif | 
|  |  | 
|  | static void IOOUTCALL pic_o02(UINT port, REG8 dat) { | 
 |  |  | 
 | PICITEM         picp; | PICITEM         picp; | 
 |  |  | 
 | //      TRACEOUT(("pic %x %x", port, dat)); | //      TRACEOUT(("pic %x %x", port, dat)); | 
 | picp = &pic.pi[(port >> 3) & 1]; | picp = &pic.pi[(port >> 3) & 1]; | 
 | if (!picp->writeicw) { | if (!picp->writeicw) { | 
 |  | #if 1   // マスクのセットだけなら nevent_forceexit()をコールしない | 
 |  | if ((CPU_isDI) || (pic.ext_irq) || | 
 |  | ((picp->imr & dat) == picp->imr)) { | 
 |  | picp->imr = dat; | 
 |  | return; | 
 |  | } | 
 |  | // リセットされたビットは割り込みある? | 
 |  | if (!(picp->irr & (picp->imr & (~dat)))) { | 
 |  | picp->imr = dat; | 
 |  | return; | 
 |  | } | 
 |  | #endif | 
 | picp->imr = dat; | picp->imr = dat; | 
 |  | #if defined(TRACE) | 
 |  | piccnt++; | 
 |  | #endif | 
 | } | } | 
 | else { | else { | 
 | picp->icw[picp->writeicw] = dat; | picp->icw[picp->writeicw] = dat; | 
| Line 356  static void IOOUTCALL pic_o02(UINT port, | Line 376  static void IOOUTCALL pic_o02(UINT port, | 
 | nevent_forceexit(); | nevent_forceexit(); | 
 | } | } | 
 |  |  | 
| static BYTE IOINPCALL pic_i00(UINT port) { | static REG8 IOINPCALL pic_i00(UINT port) { | 
 |  |  | 
 | PICITEM         picp; | PICITEM         picp; | 
 |  |  | 
| Line 373  static BYTE IOINPCALL pic_i00(UINT port) | Line 393  static BYTE IOINPCALL pic_i00(UINT port) | 
 | } | } | 
 | } | } | 
 |  |  | 
| static BYTE IOINPCALL pic_i02(UINT port) { | static REG8 IOINPCALL pic_i02(UINT port) { | 
 |  |  | 
 | PICITEM         picp; | PICITEM         picp; | 
 |  |  | 
| Line 394  void pic_reset(void) { | Line 414  void pic_reset(void) { | 
 |  |  | 
 | pic.pi[0] = def_master; | pic.pi[0] = def_master; | 
 | pic.pi[1] = def_slave; | pic.pi[1] = def_slave; | 
 |  | pic.ext_irq = 0; | 
 | } | } | 
 |  |  | 
 | void pic_bind(void) { | void pic_bind(void) { |