Top secrets sources NedoPC pentevo

Rev

Rev 799 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

// Àäðåñ ìîæåò ïðåâûøàòü 0xFFFF
// (÷òîáû â êàæäîé êîìàíäå ðàáîòû ñ ðåãèñòðàìè íå äåëàòü &= 0xFFFF)
Z80INLINE unsigned char xm(unsigned addr)
{
   addr &= 0xFFFF;

   unsigned char byte = *am_r(addr);
   if ((addr & 0xE000) == 0x6000)
       gs_byte_to_dac(addr, byte);
   return byte;
}

// Àäðåñ ìîæåò ïðåâûøàòü 0xFFFF
// (÷òîáû â êàæäîé êîìàíäå ðàáîòû ñ ðåãèñòðàìè íå äåëàòü &= 0xFFFF)
Z80INLINE unsigned char rm(unsigned addr)
{
   addr &= 0xFFFF;
#ifdef Z80_DBG
   unsigned char *membit = z80gs::membits + (addr & 0xFFFF);
   *membit |= MEMBITS_R;
   dbgbreak |= (*membit & MEMBITS_BPR);
   gscpu.dbgbreak |= (*membit & MEMBITS_BPR);
#endif

   return xm(addr);
}

// Àäðåñ ìîæåò ïðåâûøàòü 0xFFFF
// (÷òîáû â êàæäîé êîìàíäå ðàáîòû ñ ðåãèñòðàìè íå äåëàòü &= 0xFFFF)
Z80INLINE void wm(unsigned addr, unsigned char val)
{
   addr &= 0xFFFF;
#ifdef Z80_DBG
   unsigned char *membit = z80gs::membits + (addr & 0xFFFF);
   *membit |= MEMBITS_W;
   dbgbreak |= (*membit & MEMBITS_BPW);
   gscpu.dbgbreak |= (*membit & MEMBITS_BPW);
#endif

   u8 *bank = gsbankw[(addr >> 14) & 3];
#ifndef TRASH_PAGE
   if (!bank)
       return;
#endif
   bank[addr & (PAGE-1)] = val;
}

static void z80loop()
{
   u64 end = u64((float(cpu.t) * float(GSCPUFQI)) / float(conf.frame) + 0.5f);//((cpu.t * mult_gs2) >> MULT_GS_SHIFT); //; // t*GSCPUFQI/conf.frame;
   end += gscpu_t_at_frame_start;
   for (;;)
   { // while (gs_t_states+gscpu.t < end)
//      assert(end >= gs_t_states);
//      int max_gscpu_t = min(GSCPUINT, (int)(end - gs_t_states));
/*
      if(gs_t_states + gscpu.t >= end)
      {
          printf("%s->SyncLost %llu, %u, %llu\n", __FUNCTION__, gs_t_states, gscpu.t, end);
      }
      else
      {
          printf("%s->SyncOk %llu, %u, %llu\n", __FUNCTION__, gs_t_states, gscpu.t, end);
      }
*/
      while ((gs_t_states + gscpu.t < end) && (gscpu.t < GSCPUINT)) // (int)gscpu.t < max_gscpu_t
      {
#ifdef Z80_DBG
         debug_events(&gscpu);
#endif
/* [vv]
         if (gscpu.halted)
         {
            unsigned st = (GSCPUINT - gscpu.t - 1) / 4 + 1;
            gscpu.t += 4 * st;
            gscpu.r_low += st;
            break;
         }
*/
         stepi();
      }
      if (gscpu.t < GSCPUINT)
          break;

      gscpu.int_pend = true;
      if (gscpu.iff1 && gscpu.t != gscpu.eipos) // interrupt, but not after EI
         handle_int(&gscpu, gscpu.IntVec());

      gscpu.t -= GSCPUINT;
      gs_t_states += GSCPUINT;
   }
}