Subversion Repositories pentevo

Rev

Rev 796 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
716 lvd 1
// └фЁхё ьюцхЄ яЁхт√°рЄ№ 0xFFFF
2
// (ўЄюс√ т ърцфющ ъюьрэфх ЁрсюЄ√ ё ЁхушёЄЁрьш эх фхырЄ№ &= 0xFFFF)
3
Z80INLINE unsigned char xm(unsigned addr)
4
{
5
   addr &= 0xFFFF;
6
 
7
   unsigned char byte = *am_r(addr);
8
   if ((addr & 0xE000) == 0x6000)
9
       gs_byte_to_dac(addr, byte);
10
   return byte;
11
}
12
 
13
// └фЁхё ьюцхЄ яЁхт√°рЄ№ 0xFFFF
14
// (ўЄюс√ т ърцфющ ъюьрэфх ЁрсюЄ√ ё ЁхушёЄЁрьш эх фхырЄ№ &= 0xFFFF)
15
Z80INLINE unsigned char rm(unsigned addr)
16
{
17
   addr &= 0xFFFF;
18
#ifdef Z80_DBG
19
   unsigned char *membit = z80gs::membits + (addr & 0xFFFF);
20
   *membit |= MEMBITS_R;
21
   dbgbreak |= (*membit & MEMBITS_BPR);
22
   gscpu.dbgbreak |= (*membit & MEMBITS_BPR);
23
#endif
24
 
25
   return xm(addr);
26
}
27
 
28
// └фЁхё ьюцхЄ яЁхт√°рЄ№ 0xFFFF
29
// (ўЄюс√ т ърцфющ ъюьрэфх ЁрсюЄ√ ё ЁхушёЄЁрьш эх фхырЄ№ &= 0xFFFF)
30
Z80INLINE void wm(unsigned addr, unsigned char val)
31
{
32
   addr &= 0xFFFF;
33
#ifdef Z80_DBG
34
   unsigned char *membit = z80gs::membits + (addr & 0xFFFF);
35
   *membit |= MEMBITS_W;
36
   dbgbreak |= (*membit & MEMBITS_BPW);
37
   gscpu.dbgbreak |= (*membit & MEMBITS_BPW);
38
#endif
39
 
40
   u8 *bank = gsbankw[(addr >> 14) & 3];
41
#ifndef TRASH_PAGE
42
   if (!bank)
43
       return;
44
#endif
45
   bank[addr & (PAGE-1)] = val;
46
}
47
 
796 DimkaM 48
static void z80loop()
716 lvd 49
{
50
   u64 end = u64((float(cpu.t) * float(GSCPUFQI)) / float(conf.frame) + 0.5f);//((cpu.t * mult_gs2) >> MULT_GS_SHIFT); //; // t*GSCPUFQI/conf.frame;
51
   end += gscpu_t_at_frame_start;
52
   for (;;)
53
   { // while (gs_t_states+gscpu.t < end)
54
//      assert(end >= gs_t_states);
55
//      int max_gscpu_t = min(GSCPUINT, (int)(end - gs_t_states));
56
/*
57
      if(gs_t_states + gscpu.t >= end)
58
      {
59
          printf("%s->SyncLost %llu, %u, %llu\n", __FUNCTION__, gs_t_states, gscpu.t, end);
60
      }
61
      else
62
      {
63
          printf("%s->SyncOk %llu, %u, %llu\n", __FUNCTION__, gs_t_states, gscpu.t, end);
64
      }
65
*/
66
      while ((gs_t_states + gscpu.t < end) && (gscpu.t < GSCPUINT)) // (int)gscpu.t < max_gscpu_t
67
      {
68
#ifdef Z80_DBG
69
         debug_events(&gscpu);
70
#endif
71
/* [vv]
72
         if (gscpu.halted)
73
         {
74
            unsigned st = (GSCPUINT - gscpu.t - 1) / 4 + 1;
75
            gscpu.t += 4 * st;
76
            gscpu.r_low += st;
77
            break;
78
         }
79
*/
80
         stepi();
81
      }
82
      if (gscpu.t < GSCPUINT)
83
          break;
84
 
85
      gscpu.int_pend = true;
86
      if (gscpu.iff1 && gscpu.t != gscpu.eipos) // interrupt, but not after EI
87
         handle_int(&gscpu, gscpu.IntVec());
88
 
89
      gscpu.t -= GSCPUINT;
90
      gs_t_states += GSCPUINT;
91
   }
92
}