Subversion Repositories pentevo

Rev

Blame | 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. //=============================================================================
  23. void spectrum_frame()
  24. {
  25. //-----------------------------------------------------------------------------
  26.     if (!temp.inputblock || input.keymode != K_INPUT::KM_DEFAULT)
  27.         input.make_matrix();
  28.        
  29. //-----------------------------------------------------------------------------
  30.                         //if (main_pause_flag == 0)
  31.                         //{
  32.         init_snd_frame();
  33.                         //}
  34.                         //if (main_pause_flag == 0)
  35.                         //{
  36.         init_frame();
  37.                         //}
  38.                         if (main_pause_flag == 0)
  39.                         {
  40. //-----------------------------------------------------------------------------
  41.         // init readfont position to simulate correct font reading for zxevo -- lvd
  42.         zxevo_set_readfont_pos();       //NEDOREPO
  43. //-----------------------------------------------------------------------------
  44.     if (cpu.dbgchk)
  45.     {
  46.                 //перекрывает сообщения от fast skip mode !!!!
  47.                 //strcpy(statusline, "CPU debug mode");
  48.         cpu.SetDbgMemIf();
  49.         z80dbg::z80loop();
  50.     }
  51.     else
  52.     {
  53.                 //strcpy(statusline, "CPU fast mode");
  54.         cpu.SetFastMemIf();
  55.         z80fast::z80loop();
  56.     }
  57.    
  58. //-----------------------------------------------------------------------------
  59.     if (modem.open_port)
  60.         modem.io();
  61. //-----------------------------------------------------------------------------
  62.     flush_snd_frame();
  63.     flush_frame();
  64.     showleds();
  65. //-----------------------------------------------------------------------------
  66.     if (!cpu.iff1 || // int disabled in CPU
  67. //      // int disabled by ATM hardware
  68. //      ((conf.mem_model == MM_ATM710 || conf.mem_model == MM_ATM3) && !(comp.pFF77 & 0x20)))
  69.         // int disabled by ATM hardware -- lvd removed int disabling in pentevo (atm3)
  70.         ((conf.mem_model == MM_ATM710/* || conf.mem_model == MM_ATM3*/) && !(comp.pFF77 & 0x20)))       //NEDOREPO
  71.     {
  72.         unsigned char *mp = am_r(cpu.pc);
  73.         if (cpu.halted)
  74.         {
  75.                 strcpy(statusline, "CPU HALTED");
  76.                 statcnt = 10;
  77.         }
  78.         if (*(unsigned short*)mp == WORD2(0x18,0xFE) ||
  79.         ((*mp == 0xC3) && *(unsigned short*)(mp+1) == (unsigned short)cpu.pc))
  80.         {
  81.                 strcpy(statusline, "CPU STOPPED");
  82.                 statcnt = 10;
  83.         }
  84.     }
  85. //-----------------------------------------------------------------------------
  86.  
  87.    comp.t_states += conf.frame;
  88.    cpu.t -= conf.frame;
  89.    cpu.eipos -= conf.frame;
  90.    comp.frame_counter++;
  91.                         }
  92.                         else
  93.                         {
  94.                                 debug_events(&cpu);
  95.                                 flush_snd_frame();      //помогло заглушить звук
  96.                         }
  97.  
  98. }
  99. //=============================================================================
  100.  
  101.  
  102. //=============================================================================
  103. static void do_idle()
  104. {
  105.    if(conf.SyncMode != SM_TSC)
  106.        return;
  107.  
  108.    static unsigned long long last_cpu = rdtsc();
  109.  
  110.    unsigned long long cpu = rdtsc();
  111.    if (conf.sleepidle && ((cpu-last_cpu) < temp.ticks_frame))
  112.    {
  113.        ULONG Delay = ULONG(((temp.ticks_frame - (cpu-last_cpu)) * 1000ULL) / temp.cpufq);
  114.  
  115.        if (Delay > 5)
  116.        {
  117.            Sleep(Delay-1);
  118.        }
  119.    }
  120.  
  121.    for (cpu = rdtsc(); (cpu-last_cpu) < temp.ticks_frame; cpu = rdtsc())
  122.    {
  123.       asm_pause();
  124.    }
  125.    last_cpu = rdtsc();
  126. }
  127. //=============================================================================
  128.  
  129.  
  130. // version before frame resampler
  131. //uncommented by Alone Coder
  132. /*
  133. void mainloop()
  134. {
  135.    unsigned char skipped = 0;
  136.    for (;;)
  137.    {
  138.       if (skipped < temp.frameskip)
  139.       {
  140.           skipped++;
  141.           temp.vidblock = 1;
  142.       }
  143.       else
  144.           skipped = temp.vidblock = 0;
  145.  
  146.       temp.sndblock = !conf.sound.enabled;
  147.       temp.inputblock = 0; //temp.vidblock; //Alone Coder
  148.       spectrum_frame();
  149.  
  150.       // message handling before flip (they paint to rbuf)
  151.       if (!temp.inputblock)
  152.           dispatch(conf.atm.xt_kbd ? ac_main_xt : ac_main);
  153.       if (!temp.vidblock)
  154.           flip();
  155.       if (!temp.sndblock)
  156.       {
  157.           do_sound();
  158.           Vs1001.Play();
  159.  
  160. //          if(conf.sound.do_sound != do_sound_ds)
  161.           do_idle();
  162.       }
  163.    }
  164. }
  165. */
  166.  
  167.  
  168. //=============================================================================
  169. void mainloop( const volatile bool &Exit)
  170. {
  171.     // printf("%s\n", __FUNCTION__);
  172.     unsigned char skipped = 0;
  173.     //-------------------------------------------------------------------------
  174.     for (    ; !Exit   ;    )
  175.     {
  176.                         // QueryPerformanceCounter
  177.                         // 3579545 попугаев в секунду есть (такты проца не влияют!!)
  178.                         // проверка на статичных 800 MHz
  179.                         // 20.357367 попугаев только сама мерялка без ничего
  180.                         //      весь цикл 50Гц !!!!
  181.                         //      значит где то задеркжа\синхронизация!!!!
  182.         //---------------------------------------------------------------------
  183.         extern int main_pause_flag;
  184.         //---------------------------------------------------------------------
  185.         if (skipped < temp.frameskip)
  186.         {
  187.             skipped++;
  188.             temp.vidblock = 1;
  189.         }
  190.         //---------------------------------------------------------------------
  191.         else
  192.         {
  193.             skipped = temp.vidblock = 0;
  194.         }
  195.         //---------------------------------------------------------------------
  196.         if (!temp.vidblock)     // без этого не обновляетсо экран
  197.         {      
  198.             flip();     // 7203.7550611 (128)
  199.                         // 6769.135877 (atarin)
  200.                         // 7176.8725490 (break 0)
  201.                         //      2429.617333 (2,5GHz)
  202.         }
  203.         //---------------------------------------------------------------------
  204.         for ( unsigned f = rsm.needframes[ rsm.frame];    f;    f--   )
  205.         {
  206.             //comp.fddIO2Ram_wr_disable = false;        //ЗАКОМЕНЧЕНО В NEDOREPO
  207.             temp.sndblock = !conf.sound.enabled;
  208.             temp.inputblock = temp.vidblock && conf.sound.enabled;
  209.             //if (main_pause_flag == 0) //так невойти в дебагер
  210.             //{
  211.             spectrum_frame();   // 19073.4151470 (128) 
  212.                                 // 17742.097473 (atarin)
  213.                                 // 20623.20489860 (break 0)    
  214.                                 //      6007.869088 (2,5GHz)   
  215.             //}
  216.             //VideoSaver();
  217.             //-----------------------------------------------------------------
  218.             if (videosaver_state)
  219.                 savevideo_gfx();
  220.             //-----------------------------------------------------------------
  221.             // message handling before flip (they paint to rbuf)
  222.             if (!temp.inputblock)
  223.             {          
  224.                 // без этого окко вообще не отвечает !!!!
  225.                 //printf("KYB ");
  226.                 dispatch( conf.atm.xt_kbd   ?   ac_main_xt :            // 45 -- 999+
  227.                                                 ac_main);               // 70.921015710 (128)
  228.                                                                         // 74.549958740 (atarin)
  229.                                                                         // 45 (debug)                                  
  230.             }
  231.             //-----------------------------------------------------------------
  232.             if (!temp.sndblock)
  233.             {
  234.                 //-------------------------------------------------------------
  235.                 if (videosaver_state)
  236.                         savevideo_snd();
  237.                 //-------------------------------------------------------------
  238.                 do_sound();     // 41905.864632 (128)          
  239.                                 // 43458.824821 (atarin)
  240.                                 // 39506.222415 (debug 0)
  241.                                 //      61697.805217 (2,5GHz)
  242.                        
  243.                 Vs1001.Play();          // 22.923798 (atarin)
  244.                                         // 22.249513 (debug 0)         
  245.             }
  246.             //-----------------------------------------------------------------
  247.             // просто так не вызываетсо (только когда frame resampler?)
  248.             if (rsm.mix_frames > 1)
  249.             {
  250.                 memcpy( rbuf_s + rsm.rbuf_dst * rb2_offs, rbuf, temp.scx * temp.scy / 4);
  251.                 //-------------------------------------------------------------
  252.                 if (++rsm.rbuf_dst == rsm.mix_frames)
  253.                     rsm.rbuf_dst = 0;
  254.                 //-------------------------------------------------------------
  255.             }
  256.             //-----------------------------------------------------------------
  257.             if (!temp.sndblock)
  258.             {
  259.                 do_idle();              // 20.708498 (128)
  260.                                         // 21.071146 (break)
  261.             }
  262.             //-----------------------------------------------------------------
  263.         }
  264.         //---------------------------------------------------------------------
  265.         if (++rsm.frame == rsm.period)
  266.             rsm.frame = 0;
  267.         //---------------------------------------------------------------------
  268.     }   //for (    ; !Exit   ;    )
  269.     //-------------------------------------------------------------------------
  270.     correct_exit();
  271. }
  272. //=============================================================================
  273.