Diff for /np2/i286c/i286c.c between versions 1.16 and 1.27

version 1.16, 2003/12/25 19:26:55 version 1.27, 2005/03/05 06:02:29
Line 4 Line 4
 #include        "v30patch.h"  #include        "v30patch.h"
 #include        "pccore.h"  #include        "pccore.h"
 #include        "iocore.h"  #include        "iocore.h"
 #include        "dmap.h"  #include        "dmax86.h"
 #include        "i286c.mcr"  #include        "i286c.mcr"
   #if defined(ENABLE_TRAP)
   #include        "steptrap.h"
   #endif
   
   
         I286CORE        i286core;          I286CORE        i286core;
Line 94  const UINT8 iflags[512] = {     // Z_FLA Line 97  const UINT8 iflags[512] = {     // Z_FLA
   
 void i286c_initialize(void) {  void i286c_initialize(void) {
   
   #if !defined(MEMOPTIMIZE) || (MEMOPTIMIZE < 2)
         UINT    i;          UINT    i;
         UINT    bit;  #endif
         REG8    f;  
   
 #if !defined(MEMOPTIMIZE) || (MEMOPTIMIZE < 2)  #if !defined(MEMOPTIMIZE) || (MEMOPTIMIZE < 2)
         for (i=0; i<0x100; i++) {          for (i=0; i<0x100; i++) {
Line 124  void i286c_initialize(void) { Line 127  void i286c_initialize(void) {
   
 #if !defined(MEMOPTIMIZE)  #if !defined(MEMOPTIMIZE)
         for (i=0; i<0x10000; i++) {          for (i=0; i<0x10000; i++) {
                   REG8 f;
                   UINT bit;
                 f = P_FLAG;                  f = P_FLAG;
                 for (bit=0x80; bit; bit>>=1) {                  for (bit=0x80; bit; bit>>=1) {
                         if (i & bit) {                          if (i & bit) {
Line 143  void i286c_initialize(void) { Line 148  void i286c_initialize(void) {
         i286cea_initialize();          i286cea_initialize();
 #endif  #endif
         v30cinit();          v30cinit();
           ZeroMemory(&i286core, sizeof(i286core));
 }  }
   
 void i286c_reset(void) {  void i286c_deinitialize(void) {
   
           if (CPU_EXTMEM) {
                   _MFREE(CPU_EXTMEM);
                   CPU_EXTMEM = NULL;
                   CPU_EXTMEMSIZE = 0;
           }
   }
   
   static void i286c_initreg(void) {
   
         ZeroMemory(&I286_STAT, sizeof(I286_STAT));          I286_CS = 0xf000;
         I286_CS = 0xffff;          CS_BASE = 0xf0000;
         CS_BASE = 0xffff0;          I286_IP = 0xfff0;
         I286_ADRSMASK = 0xfffff;          I286_ADRSMASK = 0xfffff;
 }  }
   
   void i286c_reset(void) {
   
           ZeroMemory(&i286core.s, sizeof(i286core.s));
           i286c_initreg();
   }
   
 void i286c_shut(void) {  void i286c_shut(void) {
   
         I286_MSW = 0;          ZeroMemory(&i286core.s, offsetof(I286STAT, cpu_type));
         I286_CS = 0xffff;          i286c_initreg();
         CS_BASE = 0xffff0;  }
         I286_IP = 0;  
         I286_ADRSMASK = 0xfffff;  void i286c_setextsize(UINT32 size) {
   
           if (CPU_EXTMEMSIZE != size) {
                   if (CPU_EXTMEM) {
                           _MFREE(CPU_EXTMEM);
                           CPU_EXTMEM = NULL;
                   }
                   if (size) {
                           CPU_EXTMEM = (UINT8 *)_MALLOC(size + 16, "EXTMEM");
                           if (CPU_EXTMEM == NULL) {
                                   size = 0;
                           }
                   }
                   CPU_EXTMEMSIZE = size;
           }
           i286core.e.ems[0] = mem + 0xc0000;
           i286core.e.ems[1] = mem + 0xc4000;
           i286core.e.ems[2] = mem + 0xc8000;
           i286core.e.ems[3] = mem + 0xcc000;
   }
   
   void i286c_setemm(UINT frame, UINT32 addr) {
   
           UINT8   *ptr;
   
           frame &= 3;
           if (addr < USE_HIMEM) {
                   ptr = mem + addr;
           }
           else if ((addr - 0x100000 + 0x4000) <= CPU_EXTMEMSIZE) {
                   ptr = CPU_EXTMEM + (addr - 0x100000);
           }
           else {
                   ptr = mem + 0xc0000 + (frame << 14);
           }
           i286core.e.ems[frame] = ptr;
 }  }
   
   
 void CPUCALL i286c_intnum(UINT vect, REG16 IP) {  void CPUCALL i286c_intnum(UINT vect, REG16 IP) {
   
 const BYTE      *ptr;  const UINT8     *ptr;
   
         REGPUSH0(REAL_FLAGREG)          REGPUSH0(REAL_FLAGREG)
         REGPUSH0(I286_CS)          REGPUSH0(I286_CS)
Line 183  const BYTE *ptr; Line 240  const BYTE *ptr;
 void CPUCALL i286c_interrupt(REG8 vect) {  void CPUCALL i286c_interrupt(REG8 vect) {
   
         UINT    op;          UINT    op;
 const BYTE      *ptr;  const UINT8     *ptr;
   
         op = i286_memoryread(I286_IP + CS_BASE);          op = i286_memoryread(I286_IP + CS_BASE);
         if (op == 0xf4) {                                                       // hlt          if (op == 0xf4) {                                                       // hlt
Line 209  void i286c(void) { Line 266  void i286c(void) {
   
         if (I286_TRAP) {          if (I286_TRAP) {
                 do {                  do {
   #if defined(ENABLE_TRAP)
                           steptrap(CPU_CS, CPU_IP);
   #endif
                         GET_PCBYTE(opcode);                          GET_PCBYTE(opcode);
                         i286op[opcode]();                          i286op[opcode]();
                         if (I286_TRAP) {                          if (I286_TRAP) {
                                 i286c_interrupt(1);                                  i286c_interrupt(1);
                         }                          }
                         dmap_i286();                          dmax86();
                 } while(I286_REMCLOCK > 0);                  } while(I286_REMCLOCK > 0);
         }          }
         else if (dmac.working) {          else if (dmac.working) {
                 do {                  do {
   #if defined(ENABLE_TRAP)
                           steptrap(CPU_CS, CPU_IP);
   #endif
                         GET_PCBYTE(opcode);                          GET_PCBYTE(opcode);
                         i286op[opcode]();                          i286op[opcode]();
                         dmap_i286();                          dmax86();
                 } while(I286_REMCLOCK > 0);                  } while(I286_REMCLOCK > 0);
         }          }
         else {          else {
                 do {                  do {
   #if defined(ENABLE_TRAP)
                           steptrap(CPU_CS, CPU_IP);
   #endif
                         GET_PCBYTE(opcode);                          GET_PCBYTE(opcode);
                         i286op[opcode]();                          i286op[opcode]();
                 } while(I286_REMCLOCK > 0);                  } while(I286_REMCLOCK > 0);
Line 246  void i286c_step(void) { Line 312  void i286c_step(void) {
         if (I286_OV) {          if (I286_OV) {
                 I286_FLAG |= (O_FLAG);                  I286_FLAG |= (O_FLAG);
         }          }
         dmap_i286();          dmax86();
 }  }
   
   
 // ---- test  // ---- test
   
 #if defined(I286C_TEST)  #if defined(I286C_TEST)
 BYTE BYTESZPF(UINT r) {  UINT8 BYTESZPF(UINT r) {
   
         if (r & (~0xff)) {          if (r & (~0xff)) {
                 TRACEOUT(("BYTESZPF bound error: %x", r));                  TRACEOUT(("BYTESZPF bound error: %x", r));
Line 261  BYTE BYTESZPF(UINT r) { Line 327  BYTE BYTESZPF(UINT r) {
         return(iflags[r & 0xff]);          return(iflags[r & 0xff]);
 }  }
   
 BYTE BYTESZPCF(UINT r) {  UINT8 BYTESZPCF(UINT r) {
   
         if (r & (~0x1ff)) {          if (r & (~0x1ff)) {
                 TRACEOUT(("BYTESZPCF bound error: %x", r));                  TRACEOUT(("BYTESZPCF bound error: %x", r));
Line 269  BYTE BYTESZPCF(UINT r) { Line 335  BYTE BYTESZPCF(UINT r) {
         return(iflags[r & 0x1ff]);          return(iflags[r & 0x1ff]);
 }  }
   
 BYTE WORDSZPF(UINT32 r) {  UINT8 WORDSZPF(UINT32 r) {
   
         BYTE    f1;          UINT8   f1;
         BYTE    f2;          UINT8   f2;
   
         if (r & (~0xffff)) {          if (r & (~0xffff)) {
                 TRACEOUT(("WORDSZPF bound error: %x", r));                  TRACEOUT(("WORDSZPF bound error: %x", r));
Line 287  BYTE WORDSZPF(UINT32 r) { Line 353  BYTE WORDSZPF(UINT32 r) {
         return(f1);          return(f1);
 }  }
   
 BYTE WORDSZPCF(UINT32 r) {  UINT8 WORDSZPCF(UINT32 r) {
   
         BYTE    f1;          UINT8   f1;
         BYTE    f2;          UINT8   f2;
   
         if ((r & 0xffff0000) && (!(r & 0x00010000))) {          if ((r & 0xffff0000) && (!(r & 0x00010000))) {
                 TRACEOUT(("WORDSZPCF bound error: %x", r));                  TRACEOUT(("WORDSZPCF bound error: %x", r));

Removed from v.1.16  
changed lines
  Added in v.1.27


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