Subversion Repositories pentevo

Rev

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

  1. #include "std.h"
  2.  
  3. #include "emul.h"
  4. #include "vars.h"
  5. #include "sndrender/sndcounter.h"
  6. #include "sound.h"
  7. #include "draw.h"
  8. #include "dx.h"
  9. #include "dxr_rsm.h"
  10. #include "leds.h"
  11. #include "memory.h"
  12. #include "snapshot.h"
  13. #include "emulkeys.h"
  14. #include "vs1001.h"
  15. #include "z80.h"
  16. #include "mainloop.h"
  17. #include "funcs.h"
  18.  
  19. #include "util.h"
  20.  
  21. void spectrum_frame()
  22. {
  23.    if (!temp.inputblock || input.keymode != K_INPUT::KM_DEFAULT)
  24.       input.make_matrix();
  25.  
  26.    init_snd_frame();
  27.    init_frame();
  28.  
  29.    if(cpu.dbgchk)
  30.    {
  31.        cpu.SetDbgMemIf();
  32.        z80dbg::z80loop();
  33.    }
  34.    else
  35.    {
  36.        cpu.SetFastMemIf();
  37.        z80fast::z80loop();
  38.    }
  39.    if (modem.open_port)
  40.        modem.io();
  41.  
  42.    flush_snd_frame();
  43.    flush_frame();
  44.    showleds();
  45.  
  46.    if (!cpu.iff1 || // int disabled in CPU
  47.         ((conf.mem_model == MM_ATM710 || conf.mem_model == MM_ATM3) && !(comp.pFF77 & 0x20))) // int disabled by ATM hardware
  48.    {
  49.       unsigned char *mp = am_r(cpu.pc);
  50.       if (cpu.halted)
  51.       {
  52.           strcpy(statusline, "CPU HALTED");
  53.           statcnt = 10;
  54.       }
  55.       if (*(unsigned short*)mp == WORD2(0x18,0xFE) ||
  56.           ((*mp == 0xC3) && *(unsigned short*)(mp+1) == (unsigned short)cpu.pc))
  57.       {
  58.          strcpy(statusline, "CPU STOPPED");
  59.          statcnt = 10;
  60.       }
  61.    }
  62.  
  63.    comp.t_states += conf.frame;
  64.    cpu.t -= conf.frame;
  65.    cpu.eipos -= conf.frame;
  66.    comp.frame_counter++;
  67. }
  68.  
  69. static void do_idle()
  70. {
  71.    if(conf.SyncMode != SM_TSC)
  72.        return;
  73.  
  74.    static unsigned long long last_cpu = rdtsc();
  75.  
  76.    unsigned long long cpu = rdtsc();
  77.    if(conf.sleepidle && ((cpu-last_cpu) < temp.ticks_frame))
  78.    {
  79.        ULONG Delay = ULONG(((temp.ticks_frame - (cpu-last_cpu)) * 1000ULL) / temp.cpufq);
  80.  
  81.        if(Delay > 5)
  82.        {
  83.            Sleep(Delay-1);
  84.        }
  85.    }
  86.  
  87.    for (cpu = rdtsc(); (cpu-last_cpu) < temp.ticks_frame; cpu = rdtsc())
  88.    {
  89.       asm_pause();
  90.    }
  91.    last_cpu = rdtsc();
  92. }
  93.  
  94. // version before frame resampler
  95. //uncommented by Alone Coder
  96. /*
  97. void mainloop()
  98. {
  99.    unsigned char skipped = 0;
  100.    for (;;)
  101.    {
  102.       if (skipped < temp.frameskip)
  103.       {
  104.           skipped++;
  105.           temp.vidblock = 1;
  106.       }
  107.       else
  108.           skipped = temp.vidblock = 0;
  109.  
  110.       temp.sndblock = !conf.sound.enabled;
  111.       temp.inputblock = 0; //temp.vidblock; //Alone Coder
  112.       spectrum_frame();
  113.  
  114.       // message handling before flip (they paint to rbuf)
  115.       if (!temp.inputblock)
  116.           dispatch(conf.atm.xt_kbd ? ac_main_xt : ac_main);
  117.       if (!temp.vidblock)
  118.           flip();
  119.       if (!temp.sndblock)
  120.       {
  121.           do_sound();
  122.           Vs1001.Play();
  123.  
  124. //          if(conf.sound.do_sound != do_sound_ds)
  125.           do_idle();
  126.       }
  127.    }
  128. }
  129. */
  130.  
  131. void mainloop(const volatile bool &Exit)
  132. {
  133. //   printf("%s\n", __FUNCTION__);
  134.    unsigned char skipped = 0;
  135.    for (;!Exit;)
  136.    {
  137.       if (skipped < temp.frameskip)
  138.       {
  139.           skipped++;
  140.           temp.vidblock = 1;
  141.       }
  142.       else
  143.           skipped = temp.vidblock = 0;
  144.  
  145.       if (!temp.vidblock)
  146.           flip();
  147.  
  148.       for (unsigned f = rsm.needframes[rsm.frame]; f; f--)
  149.       {
  150.          temp.sndblock = !conf.sound.enabled;
  151.          temp.inputblock = temp.vidblock && conf.sound.enabled;
  152.          spectrum_frame();
  153.          //VideoSaver();
  154.          if(videosaver_state)
  155.             savevideo_gfx();
  156.  
  157.          // message handling before flip (they paint to rbuf)
  158.          if (!temp.inputblock)
  159.          {
  160.              dispatch(conf.atm.xt_kbd ? ac_main_xt : ac_main);
  161.          }
  162.          if (!temp.sndblock)
  163.          {
  164.              if(videosaver_state)
  165.                 savevideo_snd();
  166.              do_sound();
  167.              Vs1001.Play();
  168.          }
  169.          if (rsm.mix_frames > 1)
  170.          {
  171.             memcpy(rbuf_s + rsm.rbuf_dst * rb2_offs, rbuf, temp.scx * temp.scy / 4);
  172.             if (++rsm.rbuf_dst == rsm.mix_frames)
  173.                 rsm.rbuf_dst = 0;
  174.          }
  175.          if (!temp.sndblock)
  176.          {
  177.               do_idle();
  178.          }
  179.       }
  180.  
  181.       if (++rsm.frame == rsm.period)
  182.           rsm.frame = 0;
  183.  
  184.    }
  185.    correct_exit();
  186. }
  187.