Diff for /np2/i286c/i286c_mn.c between versions 1.17 and 1.24

version 1.17, 2003/11/30 16:17:12 version 1.24, 2003/12/12 01:04:40
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "i286.h"  #include        "cpucore.h"
 #include        "i286c.h"  #include        "i286c.h"
 #include        "memory.h"  
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "bios.h"  #include        "bios.h"
Line 10 Line 9
   
 #define MAX_PREFIX              8  #define MAX_PREFIX              8
   
 #define EXISTINTR               (isI286EI) && (!pic.ext_irq) &&                         \  
                                                 ((pic.pi[0].irr & (~pic.pi[0].imr)) ||          \  
                                                 (pic.pi[1].irr & (~pic.pi[1].imr)))  
   
   
 #define NEXT_OPCODE                                                                                             \  #define NEXT_OPCODE                                                                                             \
                 if (I286_REMCLOCK < 1) {                                                                \                  if (I286_REMCLOCK < 1) {                                                                \
Line 627  I286FN _segprefix_es(void) {     // 26:  Line 622  I286FN _segprefix_es(void) {     // 26: 
   
         SS_FIX = ES_BASE;          SS_FIX = ES_BASE;
         DS_FIX = ES_BASE;          DS_FIX = ES_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op[op]();                  i286op[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 773  I286FN _segprefix_cs(void) {     // 2e:  Line 768  I286FN _segprefix_cs(void) {     // 2e: 
   
         SS_FIX = CS_BASE;          SS_FIX = CS_BASE;
         DS_FIX = CS_BASE;          DS_FIX = CS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op[op]();                  i286op[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 914  I286FN _segprefix_ss(void) {     // 36:  Line 909  I286FN _segprefix_ss(void) {     // 36: 
   
         SS_FIX = SS_BASE;          SS_FIX = SS_BASE;
         DS_FIX = SS_BASE;          DS_FIX = SS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op[op]();                  i286op[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 938  I286FN _aaa(void) {        // 37: aaa Line 933  I286FN _aaa(void) {        // 37: aaa
         else {          else {
                 I286_FLAGL &= ~(A_FLAG | C_FLAG);                  I286_FLAGL &= ~(A_FLAG | C_FLAG);
         }          }
           I286_AL &= 0x0f;
 }  }
   
 I286FN _cmp_ea_r8(void) {                                               // 38: cmp EA, REG8  I286FN _cmp_ea_r8(void) {                                               // 38: cmp EA, REG8
Line 1030  I286FN _segprefix_ds(void) {     // 3e:  Line 1026  I286FN _segprefix_ds(void) {     // 3e: 
   
         SS_FIX = DS_BASE;          SS_FIX = DS_BASE;
         DS_FIX = DS_BASE;          DS_FIX = DS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op[op]();                  i286op[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 1817  I286FN _popf(void) {      // 9D: popf Line 1813  I286FN _popf(void) {      // 9D: popf
   
         UINT    flag;          UINT    flag;
   
         I286_WORKCLOCK(5);  
         REGPOP0(flag)          REGPOP0(flag)
         I286_OV = flag & O_FLAG;          I286_OV = flag & O_FLAG;
         I286_FLAG = flag & (0xfff ^ O_FLAG);          I286_FLAG = flag & (0xfff ^ O_FLAG);
         I286_TRAP = ((flag & 0x300) == 0x300);          I286_TRAP = ((flag & 0x300) == 0x300);
           I286_WORKCLOCK(5);
 #if defined(INTR_FAST)  #if defined(INTR_FAST)
         if (EXISTINTR) {          if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) {
                 I286IRQCHECKTERM                  I286IRQCHECKTERM
         }          }
 #else  #else
Line 2276  I286FN _iret(void) {      // CF: iret Line 2272  I286FN _iret(void) {      // CF: iret
         UINT    flag;          UINT    flag;
   
         extirq_pop();          extirq_pop();
         I286_WORKCLOCK(31);  
         REGPOP0(I286_IP)          REGPOP0(I286_IP)
         REGPOP0(I286_CS)          REGPOP0(I286_CS)
         REGPOP0(flag)          REGPOP0(flag)
Line 2284  I286FN _iret(void) {      // CF: iret Line 2279  I286FN _iret(void) {      // CF: iret
         I286_FLAG = flag & (0xfff ^ O_FLAG);          I286_FLAG = flag & (0xfff ^ O_FLAG);
         I286_TRAP = ((flag & 0x300) == 0x300);          I286_TRAP = ((flag & 0x300) == 0x300);
         CS_BASE = I286_CS << 4;          CS_BASE = I286_CS << 4;
           I286_WORKCLOCK(31);
 #if defined(INTR_FAST)  #if defined(INTR_FAST)
         if (EXISTINTR) {          if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) {
                 I286IRQCHECKTERM                  I286IRQCHECKTERM
         }          }
 #else  #else
Line 2344  I286FN _shift_ea8_cl(void) {   // D2: sh Line 2340  I286FN _shift_ea8_cl(void) {   // D2: sh
         BYTE    *out;          BYTE    *out;
         UINT    op;          UINT    op;
         UINT32  madr;          UINT32  madr;
         BYTE    cl;          REG8    cl;
   
         GET_PCBYTE(op)          GET_PCBYTE(op)
         if (op >= 0xc0) {          if (op >= 0xc0) {
Line 2372  I286FN _shift_ea16_cl(void) {   // D3: s Line 2368  I286FN _shift_ea16_cl(void) {   // D3: s
         UINT16  *out;          UINT16  *out;
         UINT    op;          UINT    op;
         UINT32  madr;          UINT32  madr;
         BYTE    cl;          REG8    cl;
   
         GET_PCBYTE(op)          GET_PCBYTE(op)
         if (op >= 0xc0) {          if (op >= 0xc0) {
Line 2478  I286FN _in_al_data8(void) {     // E4: i Line 2474  I286FN _in_al_data8(void) {     // E4: i
   
         I286_WORKCLOCK(5);          I286_WORKCLOCK(5);
         GET_PCBYTE(port)          GET_PCBYTE(port)
         i286reg.inport = CS_BASE + I286_IP;          I286_INPADRS = CS_BASE + I286_IP;
         I286_AL = iocore_inp8(port);          I286_AL = iocore_inp8(port);
         i286reg.inport = 0;          I286_INPADRS = 0;
 }  }
   
 I286FN _in_ax_data8(void) {                                     // E5:  in              ax, DATA8  I286FN _in_ax_data8(void) {                                     // E5:  in              ax, DATA8
Line 2580  I286FN _lock(void) {      // F0: lock Line 2576  I286FN _lock(void) {      // F0: lock
   
 I286FN _repne(void) {                                           // F2:  repne  I286FN _repne(void) {                                           // F2:  repne
   
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repne[op]();                  i286op_repne[op]();
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 2594  I286FN _repne(void) {      // F2: repne Line 2590  I286FN _repne(void) {      // F2: repne
   
 I286FN _repe(void) {                                            // F3:  repe  I286FN _repe(void) {                                            // F3:  repe
   
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repe[op]();                  i286op_repe[op]();
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 2658  I286FN _sti(void) {       // FB: sti Line 2654  I286FN _sti(void) {       // FB: sti
         I286_WORKCLOCK(2);          I286_WORKCLOCK(2);
 #if defined(INTR_FAST)  #if defined(INTR_FAST)
         if (I286_FLAG & I_FLAG) {          if (I286_FLAG & I_FLAG) {
                   NEXT_OPCODE;
                 return;                                                                 // 更新の意味なし                  return;                                                                 // 更新の意味なし
         }          }
 #endif  #endif
         I286_FLAG |= I_FLAG;          I286_FLAG |= I_FLAG;
         I286_TRAP = (I286_FLAG & T_FLAG) >> 8;          I286_TRAP = (I286_FLAG & T_FLAG) >> 8;
 #if defined(INTR_FAST)  #if defined(INTR_FAST)
         if (EXISTINTR) {          if ((I286_TRAP) || (PICEXISTINTR)) {
                 REMAIN_ADJUST(1)                  REMAIN_ADJUST(1)
         }          }
           else {
                   NEXT_OPCODE;
           }
 #else  #else
         REMAIN_ADJUST(1)          REMAIN_ADJUST(1)
 #endif  #endif
Line 2984  I286FN _repe_segprefix_es(void) { Line 2984  I286FN _repe_segprefix_es(void) {
   
         DS_FIX = ES_BASE;          DS_FIX = ES_BASE;
         SS_FIX = ES_BASE;          SS_FIX = ES_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repe[op]();                  i286op_repe[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 3001  I286FN _repe_segprefix_cs(void) { Line 3001  I286FN _repe_segprefix_cs(void) {
   
         DS_FIX = CS_BASE;          DS_FIX = CS_BASE;
         SS_FIX = CS_BASE;          SS_FIX = CS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repe[op]();                  i286op_repe[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 3018  I286FN _repe_segprefix_ss(void) { Line 3018  I286FN _repe_segprefix_ss(void) {
   
         DS_FIX = SS_BASE;          DS_FIX = SS_BASE;
         SS_FIX = SS_BASE;          SS_FIX = SS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repe[op]();                  i286op_repe[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 3035  I286FN _repe_segprefix_ds(void) { Line 3035  I286FN _repe_segprefix_ds(void) {
   
         DS_FIX = DS_BASE;          DS_FIX = DS_BASE;
         SS_FIX = DS_BASE;          SS_FIX = DS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repe[op]();                  i286op_repe[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 3329  I286FN _repne_segprefix_es(void) { Line 3329  I286FN _repne_segprefix_es(void) {
   
         DS_FIX = ES_BASE;          DS_FIX = ES_BASE;
         SS_FIX = ES_BASE;          SS_FIX = ES_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repne[op]();                  i286op_repne[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 3346  I286FN _repne_segprefix_cs(void) { Line 3346  I286FN _repne_segprefix_cs(void) {
   
         DS_FIX = CS_BASE;          DS_FIX = CS_BASE;
         SS_FIX = CS_BASE;          SS_FIX = CS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repne[op]();                  i286op_repne[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 3363  I286FN _repne_segprefix_ss(void) { Line 3363  I286FN _repne_segprefix_ss(void) {
   
         DS_FIX = SS_BASE;          DS_FIX = SS_BASE;
         SS_FIX = SS_BASE;          SS_FIX = SS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repne[op]();                  i286op_repne[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);
Line 3380  I286FN _repne_segprefix_ds(void) { Line 3380  I286FN _repne_segprefix_ds(void) {
   
         DS_FIX = DS_BASE;          DS_FIX = DS_BASE;
         SS_FIX = DS_BASE;          SS_FIX = DS_BASE;
         i286reg.prefix++;          I286_PREFIX++;
         if (i286reg.prefix < MAX_PREFIX) {          if (I286_PREFIX < MAX_PREFIX) {
                 UINT op;                  UINT op;
                 GET_PCBYTE(op);                  GET_PCBYTE(op);
                 i286op_repne[op]();                  i286op_repne[op]();
                 REMOVE_PREFIX                  REMOVE_PREFIX
                 i286reg.prefix = 0;                  I286_PREFIX = 0;
         }          }
         else {          else {
                 INT_NUM(6, I286_IP);                  INT_NUM(6, I286_IP);

Removed from v.1.17  
changed lines
  Added in v.1.24


RetroPC.NET-CVS <cvs@retropc.net>