Diff for /np2/i386c/ia32/interface.c between versions 1.26 and 1.29

version 1.26, 2008/01/27 12:11:31 version 1.29, 2011/01/15 18:36:12
Line 1 Line 1
 /*      $Id$    */  
   
 /*  /*
  * Copyright (c) 2002-2003 NONAKA Kimihiro   * Copyright (c) 2002-2003 NONAKA Kimihiro
  * All rights reserved.   * All rights reserved.
Line 36 Line 34
 #include "iocore.h"  #include "iocore.h"
 #include "dmax86.h"  #include "dmax86.h"
 #include "bios.h"  #include "bios.h"
 #if defined(IA32_REBOOT_ON_PANIC)  
 #include "pccore.h"  
 #endif  
   
   
 void  void
Line 58  ia32_initreg(void) Line 53  ia32_initreg(void)
         CPU_CR0 |= CPU_CR0_ET;          CPU_CR0 |= CPU_CR0_ET;
 #endif  #endif
         CPU_MXCSR = 0x1f80;          CPU_MXCSR = 0x1f80;
   
           CPU_GDTR_BASE = 0x0;
         CPU_GDTR_LIMIT = 0xffff;          CPU_GDTR_LIMIT = 0xffff;
           CPU_IDTR_BASE = 0x0;
         CPU_IDTR_LIMIT = 0xffff;          CPU_IDTR_LIMIT = 0xffff;
           CPU_LDTR_BASE = 0x0;
           CPU_LDTR_LIMIT = 0xffff;
           CPU_TR_BASE = 0x0;
           CPU_TR_LIMIT = 0xffff;
   
 #if CPU_FAMILY == 4  
         CPU_STATSAVE.cpu_regs.dr[6] = 0xffff1ff0;          CPU_STATSAVE.cpu_regs.dr[6] = 0xffff1ff0;
 #elif CPU_FAMILY >= 5  
         CPU_STATSAVE.cpu_regs.dr[6] = 0xffff0ff0;  
         CPU_STATSAVE.cpu_regs.dr[7] = 0x00000400;  
 #endif  
   
         for (i = 0; i < CPU_SEGREG_NUM; ++i) {          for (i = 0; i < CPU_SEGREG_NUM; ++i) {
                 CPU_STAT_SREG_INIT(i);                  segdesc_init(i, 0, &CPU_STAT_SREG(i));
         }          }
         CPU_LDTR_LIMIT = 0xffff;          LOAD_SEGREG(CPU_CS_INDEX, 0xf000);
         CPU_TR_LIMIT = 0xffff;          CPU_STAT_CS_BASE = 0xffff0000;
   
         CPU_SET_SEGREG(CPU_CS_INDEX, 0xf000);  
         CPU_EIP = 0xfff0;          CPU_EIP = 0xfff0;
         CPU_ADRSMASK = 0x000fffff;          CPU_ADRSMASK = 0x000fffff;
   
Line 103  ia32shut(void) Line 98  ia32shut(void)
 void  void
 ia32a20enable(BOOL enable)  ia32a20enable(BOOL enable)
 {  {
 #if (CPU_FAMILY == 3)  
         CPU_ADRSMASK = (enable)?0x00ffffff:0x00ffffff;  
 #else  
         CPU_ADRSMASK = (enable)?0xffffffff:0x00ffffff;          CPU_ADRSMASK = (enable)?0xffffffff:0x00ffffff;
 #endif  
 }  }
   
 void  void
Line 146  ia32(void) Line 138  ia32(void)
                         exec_1step();                          exec_1step();
                         if (CPU_TRAP) {                          if (CPU_TRAP) {
                                 CPU_DR6 |= CPU_DR6_BS;                                  CPU_DR6 |= CPU_DR6_BS;
                                 INTERRUPT(1, TRUE, FALSE, 0);                                  INTERRUPT(1, INTR_TYPE_EXCEPTION);
                         }                          }
                         dmax86();                          dmax86();
                 } while (CPU_REMCLOCK > 0);                  } while (CPU_REMCLOCK > 0);
Line 191  ia32_step(void) Line 183  ia32_step(void)
 #if !defined(IA32_SUPPORT_DEBUG_REGISTER)  #if !defined(IA32_SUPPORT_DEBUG_REGISTER)
                 if (CPU_TRAP) {                  if (CPU_TRAP) {
                         CPU_DR6 |= CPU_DR6_BS;                          CPU_DR6 |= CPU_DR6_BS;
                         INTERRUPT(1, TRUE, FALSE, 0);                          INTERRUPT(1, INTR_TYPE_EXCEPTION);
                 }                  }
 #endif  #endif
                 if (dmac.working) {                  if (dmac.working) {
Line 206  ia32_interrupt(int vect, int soft) Line 198  ia32_interrupt(int vect, int soft)
   
 //      TRACEOUT(("int (%x, %x) PE=%d VM=%d",  vect, soft, CPU_STAT_PM, CPU_STAT_VM86));  //      TRACEOUT(("int (%x, %x) PE=%d VM=%d",  vect, soft, CPU_STAT_PM, CPU_STAT_VM86));
         if (!soft) {          if (!soft) {
                 INTERRUPT(vect, FALSE, FALSE, 0);                  INTERRUPT(vect, INTR_TYPE_EXTINTR);
         }          } else {
         else {                  if (CPU_STAT_PM && CPU_STAT_VM86 && CPU_STAT_IOPL < CPU_IOPL3) {
                 if (CPU_STAT_VM86 && (CPU_STAT_IOPL < CPU_IOPL3) && (soft == -1)) {                          VERBOSE(("ia32_interrupt: VM86 && IOPL < 3 && INTn"));
                         TRACEOUT(("BIOS interrupt: VM86 && IOPL < 3 && INTn"));                          EXCEPTION(GP_EXCEPTION, 0);
                 }                  }
                 INTERRUPT(vect, TRUE, FALSE, 0);                  INTERRUPT(vect, INTR_TYPE_SOFTINTR);
         }          }
 }  }
   
Line 282  ia32_bioscall(void) Line 274  ia32_bioscall(void)
   
         if (!CPU_STAT_PM || CPU_STAT_VM86) {          if (!CPU_STAT_PM || CPU_STAT_VM86) {
 #if 1  #if 1
                 adrs = (CPU_EIP - 1) + ((CPU_REGS_SREG(CPU_CS_INDEX)) << 4);                  adrs = CPU_PREV_EIP + (CPU_CS << 4);
 #else  #else
                 adrs = (CPU_EIP - 1) + CPU_STAT_CS_BASE;                  adrs = CPU_PREV_EIP + CPU_STAT_CS_BASE;
 #endif  #endif
                 if ((adrs >= 0xf8000) && (adrs < 0x100000)) {                  if ((adrs >= 0xf8000) && (adrs < 0x100000)) {
                         if (biosfunc(adrs)) {                          if (biosfunc(adrs)) {
                                 /* Nothing to do */                                  /* Nothing to do */
                         }                          }
                         if (!CPU_STAT_PM || CPU_STAT_VM86) {                          LOAD_SEGREG(CPU_ES_INDEX, CPU_ES);
                                 CPU_SET_SEGREG(CPU_ES_INDEX, CPU_ES);                          LOAD_SEGREG(CPU_CS_INDEX, CPU_CS);
                                 CPU_SET_SEGREG(CPU_CS_INDEX, CPU_CS);                          LOAD_SEGREG(CPU_SS_INDEX, CPU_SS);
                                 CPU_SET_SEGREG(CPU_SS_INDEX, CPU_SS);                          LOAD_SEGREG(CPU_DS_INDEX, CPU_DS);
                                 CPU_SET_SEGREG(CPU_DS_INDEX, CPU_DS);  
                         }  
                 }                  }
         }          }
 }  }

Removed from v.1.26  
changed lines
  Added in v.1.29


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