Subversion Repositories pentevo

Rev

Rev 798 | 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 "config.h"
  6. #include "dx.h"
  7. #include "draw.h"
  8. #include "iehelp.h"
  9. #include "gs.h"
  10. #include "leds.h"
  11. #include "tape.h"
  12. #include "emulkeys.h"
  13. #include "sshot_png.h"
  14. #include "init.h"
  15. #include "snapshot.h"
  16. #include "savesnd.h"
  17. #include "fdd.h"
  18. #include "z80/tables.h"
  19. #include "dbgbpx.h"
  20.  
  21. #include "util.h"
  22.  
  23. static void cpu_info()
  24. {
  25.    char idstr[64];
  26.    idstr[0] = 0;
  27.  
  28.    fillCpuString(idstr);
  29.  
  30.    trim(idstr);
  31.  
  32.    unsigned cpuver = cpuid(1,0);
  33.    unsigned features = cpuid(1,1);
  34.    temp.mmx = (features >> 23) & 1;
  35.    temp.sse = (features >> 25) & 1;
  36.    temp.sse2 = (features >> 26) & 1;
  37.  
  38.    unsigned features_apm = 0;
  39.    bool features_apm_supported = false;
  40.    unsigned max_ext_id = cpuid(0x80000000, 0);
  41.    if(max_ext_id >= 0x80000007)
  42.    {
  43.        features_apm_supported = true;
  44.        features_apm = cpuid(0x80000007,1);
  45.    }
  46.  
  47.    temp.cpufq = GetCPUFrequency();
  48.  
  49.    color(CONSCLR_HARDITEM); printf("cpu: ");
  50.  
  51.    color(CONSCLR_HARDINFO);
  52.    printf("%s ", idstr);
  53.  
  54.    color(CONSCLR_HARDITEM);
  55.    printf("%u.%u.%u [MMX:%s,SSE:%s,SSE2:%s,TSCINV:%s] ",
  56.       (cpuver>>8) & 0x0F, (cpuver>>4) & 0x0F, cpuver & 0x0F,
  57.       temp.mmx ? "YES" : "NO",
  58.       temp.sse ? "YES" : "NO",
  59.       temp.sse2 ? "YES" : "NO",
  60.       features_apm_supported ? ((features_apm & (1 << 8)) ? "YES" : "NO") : "UNK");
  61.  
  62.    color(CONSCLR_HARDINFO);
  63.    printf("TSC at %u MHz\n", unsigned(temp.cpufq/1000000U));
  64.  
  65. #ifdef MOD_SSE2
  66.    if (!temp.sse2) {
  67.       color(CONSCLR_WARNING);
  68.       printf("warning: this is an SSE2 build, recompile or download non-P4 version\n");
  69.    }
  70. #else //MOD_SSE2
  71.    if (temp.sse2) {
  72.       color(CONSCLR_WARNING);
  73.       printf("warning: SSE2 disabled in compile-time, recompile or download P4 version\n");
  74.    }
  75. #endif
  76. }
  77.  
  78. static void restrict_version(char legacy)
  79. {
  80.     (void)legacy;
  81. //   color(CONSCLR_WARNING);
  82. //   printf ("WARNING: Windows 95/98/Me is not fully supported.\n");
  83.    temp.win9x=1; //Dexus
  84.    color();
  85.  
  86. /*   static const char vererror[] = "unsupported OS version";
  87.  
  88.    if (!legacy) errexit(vererror);
  89.  
  90.    #ifdef MOD_9X
  91.    static const char verwarning[] =
  92.       "detected windows version is not supported\r\n"
  93.       "by current version of UnrealSpeccy and untested.\r\n\r\n"
  94.       "you may click 'YES' to continue on your own risk.\r\n"
  95.       "in this case you will experience crashes under\r\n"
  96.       "some conditions. it's an OS-specific problem, please\r\n"
  97.       "don't report it and consider using NT-based system";
  98.    if (MessageBox(0, verwarning, vererror, MB_ICONERROR | MB_YESNO | MB_DEFBUTTON2) == IDNO) errexit(vererror);
  99.    #endif
  100. */
  101. }
  102.  
  103. void init_all(int argc, char **argv)
  104. {
  105. //   printf("%s\n", __FUNCTION__);
  106.    cpu_info();
  107.  
  108.    char *config = nullptr, legacy = 0;
  109.    for (int i = 0; i < argc; i++) {
  110.       if (argv[i][0] != '/' && argv[i][0] != '-') continue;
  111.       if(!stricmp(argv[i] + 1, "i") && i + 1 < argc)
  112.       {
  113.           config = argv[i + 1];
  114.           i++;
  115.       }
  116.       #ifdef MOD_9X
  117.       if (argv[i][1] == '9') legacy = 1;
  118.       #endif
  119.    }
  120.  
  121.    temp.Minimized = false;
  122.    temp.win9x=0; //Dexus
  123.    if (GetVersion() >> 31) restrict_version(legacy);
  124.  
  125.    init_z80tables();
  126.    video_permanent_tables();
  127.    init_ie_help();
  128.    load_config(config);
  129.    //make_samples();
  130.    init_leds();
  131.    init_tape();
  132.    init_hdd_cd();
  133.    start_dx();
  134.    set_priority();
  135.    applyconfig();
  136.    main_reset();
  137.    autoload();
  138.    init_bpx();
  139.    temp.PngSupport = PngInit();
  140.    if(!temp.PngSupport)
  141.    {
  142.        color(CONSCLR_WARNING);
  143.        printf("warning: libpng12.dll not found or wrong version -> png support disabled\n");
  144.        if(conf.scrshot == 2) // ┴√ы т√сЁрэ Єшя ёъЁшэ°юЄют .png
  145.        {
  146.            conf.scrshot = 1; // ╟рьхэр эр .bmp (Є.ъ. юЄёєЄёЄтєхЄ libpng)
  147.        }
  148.    }
  149.    temp.ZlibSupport = ZlibInit();
  150.    if(!temp.ZlibSupport)
  151.    {
  152.        color(CONSCLR_WARNING);
  153.        printf("warning: zlib1.dll not found or wrong version -> csw 2.0 support disabled\n");
  154.    }
  155.    temp.LastSnapName[0] = 0;
  156.    load_errors = 0;
  157.    trd_toload = 0;
  158.    *(DWORD*)trd_loaded = 0; // clear loaded flags, don't see autoload'ed images
  159.  
  160.    for (; argc; argc--, argv++)
  161.    {
  162.       if (**argv == '-' || **argv == '/')
  163.       {
  164.           if(argc > 1 && !stricmp(argv[0] + 1, "i"))
  165.           {
  166.               argc--;
  167.               argv++;
  168.           }
  169.          continue;
  170.       }
  171.  
  172.       char fname[0x200], *temp;
  173.       GetFullPathName(*argv, sizeof fname, fname, &temp);
  174.  
  175.       trd_toload = DefaultDrive; // auto-select
  176.       if(!loadsnap(fname))
  177.       {
  178.           errmsg("error loading <%s>", *argv);
  179.           load_errors = 1;
  180.       }
  181.    }
  182.  
  183.    if (load_errors) {
  184.       int code = MessageBox(wnd, "Some files, specified in\r\ncommand line, failed to load\r\n\r\nContinue emulation?", "File loading error", MB_YESNO | MB_ICONWARNING);
  185.       if (code != IDYES) exit();
  186.    }
  187.  
  188.    SetCurrentDirectory(conf.workdir);
  189.    if(conf.HighResolutionTimer)
  190.        timeBeginPeriod(1);
  191. }
  192.  
  193. void __declspec(noreturn) exit()
  194. {
  195. //   EnableMenuItem(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_ENABLED);
  196. #ifdef _DEBUG
  197.    if(!normal_exit)
  198.    {
  199.        __debugbreak();
  200.    }
  201. #endif
  202.    exitflag = 1;
  203.    if (savesndtype)
  204.        savesnddialog();  //stop saving sound
  205.    if(videosaver_state)
  206.        main_savevideo(); //stop saving video
  207.  
  208.    if(!normal_exit)
  209.        done_fdd(false);
  210.    done_tape();
  211.    done_dx();
  212.    done_gs();
  213.    done_leds();
  214.    save_nv();
  215.    modem.close();
  216.    done_ie_help();
  217.    done_bpx();
  218.    PngDone();
  219.    ZlibDone();
  220.  
  221.    if(conf.HighResolutionTimer)
  222.        timeEndPeriod(1);
  223.    if (ay[1].Chip2203) YM2203Shutdown(ay[1].Chip2203); //Dexus
  224.    if (ay[0].Chip2203) YM2203Shutdown(ay[0].Chip2203); //Dexus
  225.    color();
  226.    printf("\nsee you later!\n");
  227.    if (!nowait)
  228.    {
  229.        SetConsoleTitle("press a key...");
  230.        FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
  231.        getch();
  232.    }
  233.    fflush(stdout);
  234.    SetConsoleCtrlHandler(ConsoleHandler, FALSE);
  235.    exit(0);
  236. }
  237.