Subversion Repositories pentevo

Rev

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