Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. #include "std.h"
  2.  
  3. #include <io.h>
  4. #include <fcntl.h>
  5. #include <sys/stat.h>
  6.  
  7. #include "emul.h"
  8. #include "vars.h"
  9. #include "memory.h"
  10. #include "debug.h"
  11. #include "dbglabls.h"
  12. #include "draw.h"
  13. #include "dx.h"
  14. #include "fontatm2.h"
  15. #include "snapshot.h"
  16. #include "sndrender/sndcounter.h"
  17. #include "sound.h"
  18. #include "sdcard.h"
  19. #include "gs.h"
  20. #include "zc.h"
  21. #include "util.h"
  22. #include "init.h"
  23. #include "config.h"
  24.  
  25. #include "zxusbnet.h"   //NEDOREPO NEW
  26.  
  27. //=============================================================================
  28. // АХТУНХ!!!
  29. // Может быть неправильная детекция похожих названий
  30. // YM2203 - срабатывает
  31. // YM - первые 2 буквы тоже совпадают - ложно срабатывает !!!!
  32. // МОЖНО ПЕРЕДЕЛАТЬ В ELSE IF
  33.  
  34.  
  35.  
  36.  
  37. //=============================================================================
  38. // обрезалка пробелов и табов перед ";" у строк
  39. // тк GetPrivateProfileString ниче не можот...
  40.  
  41. //    void string_comment_trimmer(char *string_for_comment_trim)        //[NS]
  42. //      лежит по ммоему в utils
  43. //=============================================================================
  44.  
  45.  
  46. char load_errors;
  47.  
  48. void loadkeys(action*);
  49. void loadzxkeys(CONFIG*);
  50. void load_arch(const char*);
  51.  
  52. //=============================================================================
  53. static unsigned load_rom(const char *path, unsigned char *bank, unsigned max_banks = 1)
  54. {
  55.    if (!*path) { norom: memset(bank, 0xFF, max_banks*PAGE); return 0; }
  56.    char tmp[FILENAME_MAX]; strcpy(tmp, path);
  57.    char *x = strrchr(tmp+2, ':');
  58.    unsigned page = 0;
  59.    if (x) { *x = 0; page = unsigned(atoi(x+1)); }
  60.    if (max_banks == 16) page *= 16; // bank for scorp prof.rom
  61.  
  62.    FILE *ff = fopen(tmp, "rb");
  63.  
  64.    if (!ff) {
  65.       errmsg("ROM file %s not found", tmp);
  66.    err:
  67.       load_errors = 1;
  68.       goto norom;
  69.    }
  70.  
  71.    if (fseek(ff, long(page*PAGE), SEEK_SET)) {
  72. badrom:
  73.       fclose(ff);
  74.       errmsg("Incorrect ROM file: %s", path);
  75.       goto err;
  76.    }
  77.  
  78.    size_t size = fread(bank, 1, max_banks*PAGE, ff);
  79.    if (!size || (size & (PAGE-1))) goto badrom;
  80.  
  81.    fclose(ff);
  82.    return unsigned(size / 1024);
  83. }
  84. //=============================================================================
  85.  
  86.  
  87.  
  88.  
  89. //=============================================================================
  90. void load_atm_font()
  91. {
  92.    FILE *ff = fopen("SGEN.ROM", "rb");
  93.    if (!ff)
  94.    {
  95.        memcpy(fontatm2, fontatm2_default, sizeof(fontatm2));
  96.        return;
  97.    }
  98.    unsigned char font[0x800];
  99.    size_t sz = fread(font, 1, 0x800, ff);
  100.    if (sz == 0x800) {
  101.       color(CONSCLR_INFO);
  102.       printf("using ATM font from external SGEN.ROM\n");
  103.       for (unsigned chr = 0; chr < 0x100; chr++)
  104.          for (unsigned l = 0; l < 8; l++)
  105.             fontatm2[chr+l*0x100] = font[chr*8+l];
  106.    }
  107.    fclose(ff);
  108. }
  109. //=============================================================================
  110.  
  111.  
  112.  
  113.  
  114. //=============================================================================
  115. static void load_atariset()
  116. {
  117.    memset(temp.ataricolors, 0, sizeof temp.ataricolors);
  118.    if (!conf.atariset[0])
  119.        return;
  120.    char defs[4000]; *defs = 0; // =12*256, strlen("07:aabbccdd,")=12
  121.    char keyname[80];
  122.    sprintf(keyname, "atari.%s", conf.atariset);
  123. // GetPrivateProfileString("COLORS", keyname, nil, defs, sizeof defs, ininame);
  124.    GetPrivateProfileString("COLORS_ATARI", keyname, nil, defs, sizeof defs, ininame);
  125.         string_comment_trimmer(defs);           //обрезка лишнего //[NS]
  126.         //printf("COLORS_ATARI <%s>\n",defs);
  127.  
  128.    if (!*defs)
  129.        conf.atariset[0] = 0;
  130.    for (char *ptr = defs; *ptr; )
  131.    {
  132.       if (ptr[2] != ':')
  133.           return;
  134.       for (int i = 0; i < 11; i++)
  135.          if (i != 2 && !ishex(ptr[i]))
  136.              return;
  137.       unsigned index, val;
  138.       sscanf(ptr, "%02X:%08X", &index, &val);
  139.       temp.ataricolors[index] = val;
  140.       // temp.ataricolors[(index*16 + index/16) & 0xFF] = val; // swap ink-paper
  141.       ptr += 12;
  142.       if (ptr [-1] != ',')
  143.           return;
  144.    }
  145. }
  146. //=============================================================================
  147.  
  148.  
  149.  
  150.  
  151. //=============================================================================
  152. void addpath(char *dst, const char *fname)
  153. {
  154.    if (!fname)
  155.        fname = dst;
  156.    else
  157.        strcpy(dst, fname);
  158.    if (!*fname)
  159.        return; // empty filenames have special meaning
  160.    if (fname[1] == ':' || (fname[0] == '\\' || fname[1] == '\\'))
  161.        return; // already full name
  162.  
  163.    char tmp[FILENAME_MAX];
  164.    GetModuleFileName(nullptr, tmp, sizeof tmp);
  165.    char *xx = strrchr(tmp, '\\');
  166.    if (*fname == '?')
  167.        *xx = 0; // "?" to get exe directory
  168.    else
  169.        strcpy(xx+1, fname);
  170.    strcpy(dst, tmp);
  171. }
  172. //=============================================================================
  173.  
  174.  
  175.  
  176.  
  177. //=============================================================================
  178. void save_nv()
  179. {
  180.    char line[FILENAME_MAX]; addpath(line, "CMOS");
  181.    FILE *f0 = fopen(line, "wb");
  182.    if(f0)
  183.    {
  184.        fwrite(cmos, 1, sizeof cmos, f0);
  185.        fclose(f0);
  186.    }
  187.  
  188.    addpath(line, "NVRAM");
  189.    if((f0 = fopen(line, "wb")))
  190.    {
  191.        fwrite(nvram, 1, sizeof nvram, f0);
  192.        fclose(f0);
  193.    }
  194. }
  195. //=============================================================================
  196.  
  197.  
  198.  
  199.  
  200. //=============================================================================
  201. void load_romset(CONFIG *conf, const char *romset)
  202. {
  203.    char sec[0x200];
  204.    sprintf(sec, "ROM.%s", romset);
  205. //-----------------------------------------------------------------------------
  206.  GetPrivateProfileString(sec, "sos", nil, conf->sos_rom_path, sizeof conf->sos_rom_path, ininame);
  207.         string_comment_trimmer(conf->sos_rom_path); //обрезка лишнего     //[NS]
  208.         //printf("sos <%s>\n",conf->sos_rom_path);
  209.    addpath(conf->sos_rom_path);
  210. //-----------------------------------------------------------------------------
  211.  GetPrivateProfileString(sec, "dos", nil, conf->dos_rom_path, sizeof conf->dos_rom_path, ininame);
  212.         string_comment_trimmer(conf->dos_rom_path); //обрезка лишнего     //[NS]
  213.         //printf("dos <%s>\n",conf->dos_rom_path);
  214.    addpath(conf->dos_rom_path);
  215. //-----------------------------------------------------------------------------
  216.  GetPrivateProfileString(sec, "128", nil, conf->zx128_rom_path, sizeof conf->zx128_rom_path, ininame);
  217.         string_comment_trimmer(conf->zx128_rom_path); //обрезка лишнего   //[NS]
  218.         //printf("128 <%s>\n",conf->zx128_rom_path);
  219.    addpath(conf->zx128_rom_path);
  220. //-----------------------------------------------------------------------------
  221.  GetPrivateProfileString(sec, "sys", nil, conf->sys_rom_path, sizeof conf->sys_rom_path, ininame);
  222.         string_comment_trimmer(conf->sys_rom_path); //обрезка лишнего     //[NS]
  223.         //printf("sys <%s>\n",conf->sys_rom_path);
  224.    addpath(conf->sys_rom_path);
  225. }
  226. //=============================================================================
  227.  
  228.  
  229.  
  230.  
  231. //=============================================================================
  232. static void add_presets(const char *section, const char *prefix0, unsigned *num, char **tab, unsigned char *curr)
  233. {
  234.    *num = 0;
  235.    char buf[0x7F00], defval[64];
  236.    GetPrivateProfileSection(section, buf, sizeof buf, ininame);
  237.    GetPrivateProfileString(section, prefix0, "none", defval, sizeof defval, ininame);
  238.         string_comment_trimmer(defval); //обрезка лишнего //[NS]
  239.         //printf("add_presets <%s>\n",defval);
  240.    char *p = strchr(defval, ';');       //это видно нативная проверка которая не работает
  241.    if (p) *p = 0;
  242.  
  243.    for (p = defval+strlen(defval)-1; p>=defval && *p == ' '; *p-- = 0);
  244.  
  245.    char prefix[0x200];
  246.    strcpy(prefix, prefix0);
  247.    strcat(prefix, ".");
  248.    size_t plen = strlen(prefix);
  249.    for (char *ptr = buf; *ptr; )
  250.    {
  251.       if (!strnicmp(ptr, prefix, plen))
  252.       {
  253.          ptr += plen;
  254.          tab[*num] = setptr;
  255.          while (*ptr && *ptr != '=')
  256.              *setptr++ = *ptr++;
  257.          *setptr++ = 0;
  258.  
  259.          if (!stricmp(tab[*num], defval))
  260.              *curr = (unsigned char)*num;
  261.          (*num)++;
  262.       }
  263.       while (*ptr) ptr++;
  264.       ptr++;
  265.    }
  266. }
  267. //=============================================================================
  268.  
  269.  
  270.  
  271.  
  272. //=============================================================================
  273. void load_ula_preset()
  274. {
  275.    if (conf.ula_preset >= num_ula) return;
  276.    char line[128], name[64];
  277.    sprintf(name, "PRESET.%s", ulapreset[conf.ula_preset]);
  278.    static char defaults[] = "71680,17989,224,50,32,0,0,0,0,0,320,240,24,32,384,288,48,64";
  279.    GetPrivateProfileString("ULA", name, defaults, line, sizeof line, ininame);
  280.         string_comment_trimmer(line);           //обрезка лишнего //[NS]
  281.         //printf("ULA PRESET <%s>\n",line);
  282.    unsigned t1, t2, t3, t4, t5;
  283.    sscanf(line, "%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u", &/*conf.frame*/frametime/*Alone Coder*/, &conf.paper,
  284.        &conf.t_line, &conf.intfq, &conf.intlen, &t1, &t2, &t3, &t4, &t5,
  285.        &conf.mcx_small, &conf.mcy_small, &conf.b_top_small, &conf.b_left_small,
  286.        &conf.mcx_full, &conf.mcy_full, &conf.b_top_full, &conf.b_left_full);
  287.    conf.even_M1 = (unsigned char)t1; conf.border_4T = (unsigned char)t2;
  288.    conf.floatbus = (unsigned char)t3; conf.floatdos = (unsigned char)t4;
  289.    conf.portff = t5 & 1;
  290.  
  291.    if (conf.mcx_small < 256)
  292.        conf.mcx_small = 256;
  293.    if (conf.mcy_small < 192)
  294.        conf.mcy_small = 192;
  295.  
  296.    if (conf.mcx_full < 256)
  297.        conf.mcx_full = 256;
  298.    if (conf.mcy_full < 192)
  299.        conf.mcy_full = 192;
  300.  
  301.    if(conf.b_left_full & 7)
  302.    {
  303.        err_printf("PRESET.%s:b_left_full not multiple of 8\n", ulapreset[conf.ula_preset]);
  304.        exit();
  305.    }
  306. }
  307. //=============================================================================
  308.  
  309.  
  310.  
  311.  
  312. //=============================================================================
  313. void load_ay_stereo()
  314. {
  315.    char line[128], name[64]; sprintf(name, "STEREO.%s", aystereo[conf.sound.ay_stereo]);
  316.    GetPrivateProfileString("AY", name, "100,10,66,66,10,100", line, sizeof line, ininame);
  317.    unsigned *stereo = conf.sound.ay_stereo_tab;
  318.    sscanf(line, "%u,%u,%u,%u,%u,%u", stereo+0, stereo+1, stereo+2, stereo+3, stereo+4, stereo+5);
  319. }
  320. //=============================================================================
  321.  
  322.  
  323.  
  324.  
  325. //=============================================================================
  326. void load_ay_vols()
  327. {
  328.    char line[512] = { 0 };
  329.    static char defaults[] = "0000,0340,04C0,06F2,0A44,0F13,1510,227E,289F,414E,5B21,7258,905E,B550,D7A0,FFFF";
  330.    char name[64]; sprintf(name, "VOLTAB.%s", ayvols[conf.sound.ay_vols]);
  331.    GetPrivateProfileString("AY", name, defaults, line, sizeof line, ininame);
  332.    if (line[74] != ',') strcpy(line, defaults);
  333.    if (line[79] == ',') { // YM
  334.       for (int i = 0; i < 32; i++)
  335.          sscanf(line+i*5, "%X", &conf.sound.ay_voltab[i]);
  336.    } else { // AY
  337.        for(int i = 0; i < 16; i++)
  338.        {
  339.            sscanf(line + i * 5, "%X", &conf.sound.ay_voltab[2 * i]);
  340.            conf.sound.ay_voltab[2 * i + 1] = conf.sound.ay_voltab[2 * i];
  341.        }
  342.    }
  343. }
  344. //=============================================================================
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355. //=============================================================================
  356. void load_config( const char *fname)
  357. {
  358.     char line[ FILENAME_MAX];
  359.     load_errors = 0;
  360.  
  361.     GetModuleFileName(    nullptr,
  362.                           ininame,
  363.                           sizeof ininame
  364.                         );
  365.     strlwr( ininame);
  366.     *(unsigned*)(strstr( ininame, ".exe") + 1) = WORD4( 'i','n','i',0);
  367.     //-------------------------------------------------------------------------
  368.     // какой то костыль?
  369.     // или запуск с другим конфигом?
  370.     if (fname && *fname)
  371.     {
  372.         char *dst = strrchr( ininame, '\\');
  373.         //---------------------------------------------------------------------
  374.         if (strchr( fname, '/')    ||    strchr( fname, '\\'))
  375.         {
  376.             dst = ininame;
  377.         }
  378.         //-------------------------------------------------------------------------
  379.         else
  380.         {
  381.             dst++;
  382.         }
  383.         //-------------------------------------------------------------------------
  384.         strcpy( dst, fname);
  385.     }
  386.     //-------------------------------------------------------------------------
  387.     color( CONSCLR_DEFAULT);    printf("ini: ");
  388.     color( CONSCLR_INFO);       printf("%s\n", ininame);
  389.     //-------------------------------------------------------------------------
  390.     if (GetFileAttributes( ininame) == INVALID_FILE_ATTRIBUTES)
  391.     {
  392.         //errexit( "config file not found");
  393.         color( CONSCLR_WARNING);    printf("config file not found!\n");
  394.         color( CONSCLR_DEFAULT);    printf("try default config\n");
  395.         //---------------------------------------------------------------------
  396.         // try default config
  397.         {
  398.             char *dst = strrchr( ininame, '\\');        // ГОФНОКОД !!!!
  399.             dst++;
  400.             strcpy( dst, "Unreal.ini");
  401.         }
  402.         color( CONSCLR_DEFAULT);        printf("ini: ");
  403.         color( CONSCLR_INFO);           printf("%s\n", ininame);
  404.         //---------------------------------------------------------------------
  405.         if (GetFileAttributes( ininame) == INVALID_FILE_ATTRIBUTES)
  406.         {
  407.             errexit( "default config file not found");
  408.         }
  409.         //---------------------------------------------------------------------
  410.     }
  411.     //-------------------------------------------------------------------------
  412.    
  413.    
  414.    
  415.     //для возможности быстрого переименования названий разделов
  416.     static const char* misc =           "MISC";
  417.     static const char* debuger =        "DEBUGER";
  418.     static const char* video =          "VIDEO";
  419.     static const char* ula =            "ULA";
  420.     static const char* beta128 =        "Beta128";
  421.     static const char* msx_dos =        "MSX_DOS";      // [NS]
  422.     static const char* USBZXNET =       "USBZXNET";     // NEDOREPO
  423.     static const char* leds =           "LEDS";
  424.     static const char* sound =          "SOUND";
  425.     static const char* input =          "INPUT";
  426.     static const char* colors =         "COLORS";
  427.     static const char* ay =             "AY";
  428.     static const char* saa1099 =        "SAA1099";
  429.     static const char* hdd =            "HDD";
  430.     static const char* rom =            "ROM";
  431.     static const char* ngs =            "NGS";
  432.     static const char* zc =             "ZC";
  433.  
  434.     static const char* video_modes =    "VIDEO_MODES";  //[NS]
  435.  
  436. #ifdef MOD_MONITOR
  437.     addpath( conf.sos_labels_path, "sos.l");
  438. #endif
  439.  
  440. //-----------------------------------------------------------------------------
  441. // HOW TO
  442. // читать int
  443. // conf.<название_параметра> = u8(GetPrivateProfileInt(        <название_раздела>,
  444. //                                                      <назваание_параметра>,
  445. //                                                      <значение_по_дефолту>,
  446. //                                                      <путь_к_ini>));
  447. //
  448. // conf.ConfirmExit = u8(GetPrivateProfileInt(misc, "ConfirmExit", 0, ininame));
  449. //
  450. //      потом нужно добавить <название_параметра> в emul.h / struct CONFIG
  451. //      unsigned char <название_параметра>;
  452. //      unsigned char ATM_DDp_4K_Palette;
  453. //
  454. // conf.<название_параметра> - дальше можно использовать как параметр для if итд...
  455.  
  456.  
  457. //-----------------------------------------------------------------------------
  458. // MISC
  459. //-----------------------------------------------------------------------------
  460.  
  461. // Перетаскивание окна за почти любую его часть                           // [NS]
  462.  conf.All_Screen_Drag = u8( GetPrivateProfileInt(   misc,              
  463.                                                     "All_Screen_Drag",
  464.                                                     0,
  465.                                                     ininame ));
  466.                
  467. //-----------------------------------------------------------------------------
  468. // DEBUG
  469. //-----------------------------------------------------------------------------
  470. //
  471.  conf.ZXGS_Step =
  472.         u8( GetPrivateProfileInt(   debuger,                    // [NS]
  473.                                     "ZXGS_Step",
  474.                                     0,
  475.                                     ininame ));
  476.                                    
  477.  conf.Disasm_Tabulation =
  478.         u8( GetPrivateProfileInt(   debuger,                    // [NS]
  479.                                     "Disasm_Tabulation",
  480.                                     0,
  481.                                     ininame ));
  482.  
  483.  conf.Disasm_A_Mnemonics_Style =
  484.         u8( GetPrivateProfileInt(   debuger,                    // [NS]
  485.                                     "Disasm_A_Mnemonics_Style", // 0 - full  (xxx a,a)
  486.                                     0,                          // 1 - short (xxx a)
  487.                                     ininame ));                 // 2 - Combined / Classic Unreal
  488.                                
  489.  conf.Disasm_Index_H_L_Style =
  490.         u8( GetPrivateProfileInt(   debuger,                    // [NS]
  491.                                     "Disasm_Index_H_L_Style",   // 0 - IXH IXL IYH IYL
  492.                                     0,                          // 1 - XH XL YH YL
  493.                                     ininame ));                 //
  494.  
  495.  conf.Disasm_New_Labels =
  496.         u8( GetPrivateProfileInt(   debuger,                    // [NS]
  497.                                     "Disasm_New_Labels",        // 0
  498.                                     0,                          // 1 - under construction
  499.                                     ininame ));
  500.  
  501.  conf.debug_unlock_mouse =
  502.         u8( GetPrivateProfileInt(   debuger,                    // [NS]
  503.                                     "Debug_Unlock_Mouse",       // 0 - при возврате захват сохраняется
  504.                                     0,                          // 1 - при входе в дебагер захват снимается
  505.                                     ininame ));                 //
  506.  
  507. //-----------------------------------------------------------------------------
  508. // VIDEO_MODES
  509. //-----------------------------------------------------------------------------
  510.  
  511.  conf.ATM_DDp_4K_Palette =
  512.         u8( GetPrivateProfileInt(   video_modes,                // [NS]
  513.                                     "ATM_DDp_4K_Palette",
  514.                                     0,
  515.                                     ininame ));
  516.  
  517. //-----------------------------------------------------------------------------
  518. // MSX DOS
  519. //-----------------------------------------------------------------------------
  520.  
  521.  conf.atm620_hl8_z =
  522.         u8( GetPrivateProfileInt(   msx_dos,                    // [NS]
  523.                                     "ATM_620_HL8_z",
  524.                                     0,
  525.                                     ininame ));
  526.  
  527.  conf.atm620_force_xt_keyb_ready =
  528.         u8( GetPrivateProfileInt(   msx_dos,                    // [NS]
  529.                                     "ATM_620_force_XT_Keyb_ready",
  530.                                     0,
  531.                                     ininame ));
  532.  
  533.  conf.atm620_xt_keyb =
  534.         u8( GetPrivateProfileInt(   msx_dos,                    // [NS]
  535.                                     "ATM_620_fake_XT_Keyb",
  536.                                     0,
  537.                                     ininame ));
  538.                                                        
  539. //-----------------------------------------------------------------------------
  540. // SOUND
  541. //-----------------------------------------------------------------------------
  542.  
  543.  conf.ZXI_TSFM_Mirror =
  544.         u8( GetPrivateProfileInt(   sound,                      // [NS]
  545.                                     "ZXI_TSFM_Mirror",
  546.                                     0,
  547.                                     ininame ));
  548.  
  549.  conf.MIDI_128_Out =
  550.         u8( GetPrivateProfileInt(   sound,                      // [NS]
  551.                                     "MIDI_128_Out",
  552.                                     0,
  553.                                     ininame ));
  554.                                    
  555.  
  556. //-----------------------------------------------------------------------------
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573. // GetPrivateProfileString - убогае гафно и не понимает каких либо разделителей !!!
  574. //-----------------------------------------------------------------------------
  575. // проверка номера версии
  576.     GetPrivateProfileString(    "*",
  577.                                 "UNREAL",
  578.                                 nil,
  579.                                 line,
  580.                                 sizeof line,
  581.                                 ininame
  582.                         );
  583.     unsigned a;
  584.     unsigned b;
  585.     unsigned c;
  586.     sscanf( line, "%u.%u.%u", &a, &b, &c);
  587.     //-------------------------------------------------------------------------
  588.     if ((((a << 8U) | b) != VER_HL)   ||   (c != (VER_A & 0x7F)))
  589.     {
  590.         //errexit("wrong ini-file version");    // тупо выходило!! [NS]
  591.         errmsg("wrong ini-file version");
  592.     }
  593. //-----------------------------------------------------------------------------
  594.    
  595.    
  596. //-----------------------------------------------------------------------------
  597.  GetPrivateProfileString(   misc,
  598.                             "Help",
  599.                             "help_eng.html",
  600.                             helpname,
  601.                             sizeof helpname,
  602.                             ininame
  603.                           );   
  604.  string_comment_trimmer( helpname); //обрезка лишнего             // [NS]
  605.  //printf("Help <%s>\n",helpname);
  606.  addpath( helpname);
  607. //-----------------------------------------------------------------------------
  608.  if (GetPrivateProfileInt(  misc,
  609.                             "HideConsole",
  610.                             0,
  611.                             ininame  )
  612.   )
  613.  {
  614.         FreeConsole();
  615.         nowait = 1;
  616.  }
  617. //-----------------------------------------------------------------------------
  618.  conf.ConfirmExit =
  619.         u8( GetPrivateProfileInt(   misc,
  620.                                     "ConfirmExit",
  621.                                     0,
  622.                                     ininame  ));
  623. //-----------------------------------------------------------------------------
  624.  conf.sleepidle =
  625.         u8( GetPrivateProfileInt(   misc,
  626.                                     "ShareCPU",
  627.                                     0,
  628.                                     ininame  ));
  629.  
  630.  //printf("ShareCPU     %x\n",conf.sleepidle);          //tab ok
  631. //-----------------------------------------------------------------------------
  632.  conf.highpriority =
  633.         u8(GetPrivateProfileInt(    misc,
  634.                                     "HighPriority",
  635.                                     0,
  636.                                     ininame  ));
  637.                                    
  638.  //printf("HighPriority %x\n",conf.highpriority);       //tab ok
  639. //-----------------------------------------------------------------------------
  640.  GetPrivateProfileString(   misc,
  641.                             "SyncMode",
  642.                             "SOUND",
  643.                             line,
  644.                             sizeof line,
  645.                             ininame
  646.                           );
  647.    
  648.     conf.SyncMode = SM_SOUND;   //default
  649.     //-------------------------------------------------------------------------
  650.     if (!strnicmp( line, "SOUND", 5))  
  651.     {
  652.         conf.SyncMode = SM_SOUND;
  653.         //printf("SyncMode      SM_SOUND\n");  
  654.     }
  655.     //-------------------------------------------------------------------------
  656.     else if (!strnicmp( line, "VIDEO", 5))
  657.     {
  658.         conf.SyncMode = SM_VIDEO;
  659.         //printf("SyncMode      SM_VIDEO\n");  
  660.     }
  661.     //-------------------------------------------------------------------------
  662.     else if (!strnicmp( line, "TSC", 3))
  663.     {
  664.         conf.SyncMode = SM_TSC;
  665.         //printf("SyncMode      SM_TSC\n");     //tab ok
  666.     }
  667. //-----------------------------------------------------------------------------
  668.  conf.HighResolutionTimer =
  669.         GetPrivateProfileInt(   misc,
  670.                                 "HighResolutionTimer",
  671.                                 0,
  672.                                 ininame  );
  673.  
  674. // printf("HighResolutionTimer  %x\n",conf.HighResolutionTimer);        //tab ok
  675. //-----------------------------------------------------------------------------
  676.  conf.tape_traps =
  677.         u8( GetPrivateProfileInt(   misc,
  678.                                     "TapeTraps",
  679.                                     1,
  680.                                     ininame  ));
  681.                                    
  682. // printf("TapeTraps            %x\n",conf.tape_traps); //tab ok
  683. //-----------------------------------------------------------------------------
  684.  conf.tape_autostart =
  685.         u8( GetPrivateProfileInt(   misc,
  686.                                     "TapeAutoStart",
  687.                                     1,
  688.                                     ininame  ));
  689.                                    
  690. // printf("TapeAutoStart        %x\n",conf.tape_autostart);     //tab ok
  691. //-----------------------------------------------------------------------------
  692.  conf.EFF7_mask =
  693.         u8( GetPrivateProfileInt(   misc,
  694.                                     "EFF7mask",
  695.                                     0,
  696.                                     ininame  ));
  697.                                    
  698. // printf("EFF7mask     %x\n",conf.EFF7_mask);  //tab ok
  699. //-----------------------------------------------------------------------------
  700.  
  701.  
  702. //-----------------------------------------------------------------------------
  703. // ROMs для single ROM image с привязкой к Memory logic
  704. //-----------------------------------------------------------------------------
  705.  GetPrivateProfileString(   rom,
  706.                             "ATM1",
  707.                             nil,
  708.                             conf.atm1_rom_path,
  709.                             sizeof conf.atm1_rom_path,
  710.                             ininame
  711.                           );
  712.                          
  713.     string_comment_trimmer( conf.atm1_rom_path); //обрезка лишнего        // [NS]
  714.     // printf("ATM1 <%s>\n",conf.atm1_rom_path);
  715.     addpath( conf.atm1_rom_path);
  716. //-----------------------------------------------------------------------------
  717.  GetPrivateProfileString(   rom,
  718.                             "ATM2",
  719.                             nil,
  720.                             conf.atm2_rom_path,
  721.                             sizeof conf.atm2_rom_path,
  722.                             ininame
  723.                           );
  724.                          
  725.     string_comment_trimmer( conf.atm2_rom_path); //обрезка лишнего        // [NS]
  726.     // printf("ATM2 <%s>\n",conf.atm2_rom_path);
  727.     addpath( conf.atm2_rom_path);
  728. //-----------------------------------------------------------------------------
  729.  GetPrivateProfileString(   rom,
  730.                             "ATM3",
  731.                             nil,
  732.                             conf.atm3_rom_path,
  733.                             sizeof conf.atm3_rom_path,
  734.                             ininame
  735.                           );
  736.                          
  737.     string_comment_trimmer( conf.atm3_rom_path); //обрезка лишнего        // [NS]
  738.     // printf("ATM3 <%s>\n",conf.atm3_rom_path);
  739.     addpath( conf.atm3_rom_path);
  740. //-----------------------------------------------------------------------------
  741.  GetPrivateProfileString(   rom,
  742.                             "SCORP",
  743.                             nil,
  744.                             conf.scorp_rom_path,
  745.                             sizeof conf.scorp_rom_path,
  746.                             ininame
  747.                          );
  748.                          
  749.     string_comment_trimmer( conf.scorp_rom_path); //обрезка лишнего       // [NS]
  750.     // printf("SCORP <%s>\n",conf.scorp_rom_path);
  751.     addpath( conf.scorp_rom_path);
  752. //-----------------------------------------------------------------------------
  753.  GetPrivateProfileString(   rom,
  754.                             "PROFROM",
  755.                             nil,
  756.                             conf.prof_rom_path,
  757.                             sizeof conf.prof_rom_path,
  758.                             ininame
  759.                          );
  760.     string_comment_trimmer( conf.prof_rom_path); //обрезка лишнего        // [NS]
  761.     //printf("PROFROM <%s>\n",conf.prof_rom_path);
  762.     addpath( conf.prof_rom_path);
  763. //-----------------------------------------------------------------------------
  764.  GetPrivateProfileString(   rom,
  765.                             "PROFI",
  766.                             nil,
  767.                             conf.profi_rom_path,
  768.                             sizeof conf.profi_rom_path,
  769.                             ininame
  770.                           );
  771.                          
  772.     string_comment_trimmer( conf.profi_rom_path); //обрезка лишнего       // [NS]
  773.     //printf("PROFI <%s>\n",conf.profi_rom_path);
  774.     addpath( conf.profi_rom_path);
  775. //-----------------------------------------------------------------------------
  776. //[vv]
  777. // GetPrivateProfileString(   rom,
  778. //                            "KAY",
  779. //                            nil,
  780. //                            conf.kay_rom_path,
  781. //                            sizeof conf.kay_rom_path,
  782. //                            ininame
  783. //                          );
  784. //
  785. // выпилено десусофтами к хуям сдуру (хотя подписано vv-мами о_О)
  786. // иззо левых дампов?
  787. //
  788. // addpath( conf.kay_rom_path);
  789. //[vv]
  790. //-----------------------------------------------------------------------------
  791.  GetPrivateProfileString(   rom,
  792.                             "PLUS3",
  793.                             nil,
  794.                             conf.plus3_rom_path,
  795.                             sizeof conf.plus3_rom_path,
  796.                             ininame
  797.                           );
  798.                          
  799.     string_comment_trimmer( conf.plus3_rom_path); //обрезка лишнего       // [NS]
  800.     //printf("PLUS3 <%s>\n",conf.plus3_rom_path);
  801.     addpath( conf.plus3_rom_path);
  802. //-----------------------------------------------------------------------------
  803.  GetPrivateProfileString(   rom,
  804.                             "QUORUM",
  805.                             nil,
  806.                             conf.quorum_rom_path,
  807.                             sizeof conf.quorum_rom_path,
  808.                             ininame
  809.                           );
  810.                          
  811.     string_comment_trimmer( conf.quorum_rom_path); //обрезка лишнего      // [NS]
  812.     //printf("QUORUM <%s>\n",conf.quorum_rom_path);
  813.     addpath( conf.quorum_rom_path);
  814. //-----------------------------------------------------------------------------
  815. #ifdef MOD_GSZ80
  816.  GetPrivateProfileString(   rom,
  817.                             "GS",
  818.                             nil,
  819.                             conf.gs_rom_path,
  820.                             sizeof conf.gs_rom_path,
  821.                             ininame
  822.                           );
  823.                          
  824.     string_comment_trimmer( conf.gs_rom_path); //обрезка лишнего  // [NS]
  825.     //printf("GS <%s>\n",conf.gs_rom_path);
  826.     addpath( conf.gs_rom_path);
  827. #endif
  828. //-----------------------------------------------------------------------------
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837. //-----------------------------------------------------------------------------
  838.  GetPrivateProfileString(   rom,
  839.                             "ROMSET",
  840.                             "default",
  841.                             line,
  842.                             sizeof line,
  843.                             ininame
  844.                           );
  845.                          
  846.     string_comment_trimmer( line); //обрезка лишнего              // [NS]
  847.     // printf("ROMSET <%s>\n",line);
  848.     //-------------------------------------------------------------------------
  849.     if (*line)
  850.     {
  851.         load_romset( &conf, line);
  852.         conf.use_romset = 1;
  853.     }
  854.     //-------------------------------------------------------------------------
  855.     else
  856.     {
  857.         conf.use_romset = 0;
  858.     }
  859.     //-------------------------------------------------------------------------
  860. //-----------------------------------------------------------------------------
  861.  conf.smuc =
  862.         u8( GetPrivateProfileInt(   misc,
  863.                                     "SMUC",
  864.                                     0,
  865.                                     ininame  ));
  866.                                    
  867. // printf("SMUC         %x\n",conf.smuc);       //tab ok
  868. //-----------------------------------------------------------------------------
  869.  GetPrivateProfileString(   misc,
  870.                             "CMOS",
  871.                             nil,
  872.                             line,
  873.                             sizeof line,
  874.                             ininame
  875.                           );
  876.                          
  877.     conf.cmos = 0;      //default
  878.     //-------------------------------------------------------------------------
  879.     if (!strnicmp( line, "DALLAS", 6))
  880.     {
  881.         conf.cmos = 1;
  882.         //printf("CMOS          DALLAS\n");     //tab ok
  883.     }
  884.     //-------------------------------------------------------------------------
  885.     if (!strnicmp( line, "512Bu1", 6))
  886.     {
  887.         conf.cmos = 2;
  888.         //printf("CMOS          512Bu1\n");     //tab ok
  889.     }
  890.     //-------------------------------------------------------------------------
  891. //-----------------------------------------------------------------------------
  892.  conf.cache =
  893.         u8( GetPrivateProfileInt(   misc,
  894.                                     "Cache",
  895.                                     0,
  896.                                     ininame  
  897.                                  ));
  898.     //-------------------------------------------------------------------------                            
  899.     if ((conf.cache) && (conf.cache != 16) && (conf.cache != 32))
  900.         conf.cache = 0;
  901.     //-------------------------------------------------------------------------
  902.     // printf("Cache            %d\n",conf.cache);      //tab ok
  903. //-----------------------------------------------------------------------------
  904. // memory logic
  905.  GetPrivateProfileString(   misc,
  906.                             "HIMEM",
  907.                             nil,
  908.                             line,
  909.                             sizeof line,
  910.                             ininame
  911.                           );
  912.                          
  913.     conf.mem_model = MM_PENTAGON;       // default?
  914.     unsigned i;                         // Alone Coder 0.36.7
  915.     //-------------------------------------------------------------------------
  916.     for (/*unsigned*/ i = 0;    i < N_MM_MODELS;    i++)
  917.     {
  918.         //---------------------------------------------------------------------
  919.         if (!strnicmp( line, mem_model[ i].shortname, strlen( mem_model[ i].shortname)))
  920.         {
  921.             conf.mem_model = mem_model[ i].Model;
  922.         }
  923.         //-------------------------------------------------------------------------
  924.     }
  925.     //-------------------------------------------------------------------------
  926. //-----------------------------------------------------------------------------
  927.  conf.ramsize =
  928.         GetPrivateProfileInt(   misc,
  929.                                 "RamSize",
  930.                                 128,
  931.                                 ininame
  932.                               );
  933.                              
  934.     // printf("RamSize          %d\n",conf.ramsize);    //tab ok
  935.     // есть защита от неправильных результатов
  936. //-----------------------------------------------------------------------------
  937.  conf.Sna128Lock =
  938.         GetPrivateProfileInt(   misc,
  939.                                 "Sna128Lock",
  940.                                 1,
  941.                                 ininame
  942.                               );
  943.                              
  944.     //printf("Sna128Lock        %x\n",conf.Sna128Lock);         // tab ok
  945. //-----------------------------------------------------------------------------
  946.  GetPrivateProfileString(   misc,
  947.                             "DIR",
  948.                             nil,
  949.                             conf.workdir,
  950.                             sizeof conf.workdir,
  951.                             ininame
  952.                           );
  953.                          
  954.  GetPrivateProfileString(   misc,
  955.                             "SNAP_DIR",
  956.                             nil,
  957.                             temp.SnapDir,
  958.                             sizeof temp.SnapDir,
  959.                             ininame
  960.                           );
  961.                          
  962.  GetPrivateProfileString(   misc,
  963.                             "ROM_DIR",
  964.                             nil,
  965.                             temp.RomDir,
  966.                             sizeof temp.RomDir,
  967.                             ininame
  968.                           );
  969.        
  970.  GetPrivateProfileString(   misc,
  971.                             "HDD_DIR",
  972.                             nil,
  973.                             temp.HddDir,
  974.                             sizeof temp.HddDir,
  975.                             ininame
  976.                           );
  977.  
  978.  GetPrivateProfileString(   misc,
  979.                             "SD_DIR",
  980.                             nil,
  981.                             temp.SdDir,
  982.                             sizeof temp.SdDir,
  983.                             ininame
  984.                           );   
  985.  
  986.     string_comment_trimmer( conf.workdir); //обрезка лишнего      // [NS]
  987.     string_comment_trimmer( temp.SnapDir); //обрезка лишнего      // [NS]
  988.     string_comment_trimmer( temp.RomDir ); //обрезка лишнего      // [NS]
  989.     string_comment_trimmer( temp.HddDir ); //обрезка лишнего      // [NS]
  990.     string_comment_trimmer( temp.SdDir  ); //обрезка лишнего      // [NS]
  991.    
  992.     // color( CONSCLR_DEFAULT); printf("DIR: ");
  993.     // color( CONSCLR_INFO);    printf("<%s>\n", conf.workdir);
  994.     // color( CONSCLR_DEFAULT); printf("ROM_DIR: ");
  995.     // color( CONSCLR_INFO);    printf("<%s>\n", temp.RomDir);
  996.     // color( CONSCLR_DEFAULT); printf("HDD_DIR: ");
  997.     // color( CONSCLR_INFO);    printf("<%s>\n", temp.HddDir);
  998.     // color( CONSCLR_DEFAULT); printf("SD_DIR: ");
  999.     // color( CONSCLR_INFO);    printf("<%s>\n", temp.SdDir);
  1000.    
  1001. // не есно нахрена так сделано
  1002. // чтоб сохранить текущий CurrentDirectory?
  1003. // при вызове унриала хрен знает от куда
  1004. //      с другой стороны в случае "неправильного" пути
  1005. //      так получаетсо предыдущий путь
  1006. //      и все это без жанглирования строками левым говнокодом
  1007. //  GetCurrentDirectory( _countof( line), line);
  1008. //      SetCurrentDirectory( conf.workdir);
  1009. //      GetCurrentDirectory( _countof( temp.SnapDir), temp.SnapDir);
  1010. //  SetCurrentDirectory( line);
  1011.             color( CONSCLR_DEFAULT);    printf("DIR: ");
  1012.             color( CONSCLR_INFO);       printf("<%s>\n", conf.workdir);
  1013.    
  1014.     GetCurrentDirectory( _countof( line), line);
  1015.         SetCurrentDirectory( temp.SnapDir);
  1016.         GetCurrentDirectory( _countof( temp.SnapDir), temp.SnapDir);
  1017.             color( CONSCLR_DEFAULT);    printf("SNAP_DIR: ");
  1018.             color( CONSCLR_INFO);       printf("<%s>\n", temp.SnapDir);
  1019.     SetCurrentDirectory( line);
  1020.    
  1021.     //GetCurrentDirectory( _countof( line), line);
  1022.         SetCurrentDirectory( temp.RomDir);
  1023.         GetCurrentDirectory( _countof( temp.RomDir), temp.RomDir);
  1024.             color( CONSCLR_DEFAULT);    printf("ROM_DIR: ");
  1025.             color( CONSCLR_INFO);       printf("<%s>\n", temp.RomDir);
  1026.     SetCurrentDirectory( line);
  1027.  
  1028.     //GetCurrentDirectory( _countof( line), line);         
  1029.         SetCurrentDirectory( temp.HddDir);
  1030.         GetCurrentDirectory( _countof( temp.HddDir), temp.HddDir);
  1031.             color( CONSCLR_DEFAULT);    printf("HDD_DIR: ");
  1032.             color( CONSCLR_INFO);       printf("<%s>\n", temp.HddDir);
  1033.     SetCurrentDirectory( line);    
  1034.        
  1035.     //GetCurrentDirectory( _countof( line), line);     
  1036.         SetCurrentDirectory( temp.SdDir);
  1037.         GetCurrentDirectory( _countof( temp.SdDir), temp.SdDir);       
  1038.             color( CONSCLR_DEFAULT);    printf("SD_DIR: ");
  1039.             color( CONSCLR_INFO);       printf("<%s>\n", temp.SdDir);
  1040.     SetCurrentDirectory( line);
  1041.  
  1042. //    strcpy( temp.RomDir, temp.SnapDir);
  1043. //    strcpy( temp.HddDir, temp.SnapDir);
  1044. //    strcpy( temp.SdDir,  temp.SnapDir);
  1045. //-----------------------------------------------------------------------------
  1046. // RESET
  1047.                
  1048.  GetPrivateProfileString(   misc,
  1049.                             "RESET",
  1050.                             nil,
  1051.                             line,
  1052.                             sizeof line,
  1053.                             ininame
  1054.                           );
  1055.  
  1056.     conf.reset_rom = RM_SOS;    //default
  1057.     //-------------------------------------------------------------------------
  1058.     if (!strnicmp( line, "DOS", 3))
  1059.     {
  1060.         conf.reset_rom = RM_DOS;
  1061.         //printf("RESET         DOS\n");        //tab ok
  1062.     }
  1063.     //-------------------------------------------------------------------------
  1064.     if (!strnicmp( line, "MENU", 4))
  1065.     {
  1066.         conf.reset_rom = RM_128;
  1067.         //printf("RESET         MENU\n");       //tab ok
  1068.     }
  1069.     //-------------------------------------------------------------------------
  1070.     if (!strnicmp(line, "SYS", 3))
  1071.     {
  1072.         conf.reset_rom = RM_SYS;
  1073.         //printf("RESET         SYS\n");        //tab ok
  1074.     }
  1075.     //-------------------------------------------------------------------------
  1076. //-----------------------------------------------------------------------------
  1077.  GetPrivateProfileString(   misc,
  1078.                             "Modem",
  1079.                             nil,
  1080.                             line,
  1081.                             sizeof line,
  1082.                             ininame
  1083.                           );
  1084.                          
  1085.     string_comment_trimmer( line); //обрезка лишнего              // [NS]
  1086.  
  1087.         color( CONSCLR_DEFAULT);        printf("Modem: ");
  1088.         color( CONSCLR_INFO);           printf("<%s>\n",line);
  1089.            
  1090.     conf.modem_port = 0;
  1091.  
  1092.     sscanf( line, "COM%d", &conf.modem_port);
  1093. //-----------------------------------------------------------------------------
  1094.  conf.paper =   GetPrivateProfileInt( ula, "Paper",  17989, ininame);
  1095.  conf.t_line =  GetPrivateProfileInt( ula, "Line",   224,   ininame);
  1096.  conf.intfq =   GetPrivateProfileInt( ula, "int",    50,    ininame);
  1097.  conf.intlen =  GetPrivateProfileInt( ula, "intlen", 32,    ininame);
  1098.  frametime =    GetPrivateProfileInt( ula, "Frame",  71680, ininame); // Alone Coder
  1099.  
  1100.  // /*conf.frame*/frametime/*Alone Coder*/ = GetPrivateProfileInt(ula, "Frame", 71680, ininame);
  1101.  
  1102.  conf.border_4T = u8( GetPrivateProfileInt( ula, "4TBorder",     0,   ininame));
  1103.  conf.even_M1 =   u8( GetPrivateProfileInt( ula, "EvenM1",       0,   ininame));
  1104.  conf.floatbus =  u8( GetPrivateProfileInt( ula, "FloatBus",     0,   ininame));
  1105.  conf.floatdos =  u8( GetPrivateProfileInt( ula, "FloatDOS",     0,   ininame));
  1106.  conf.portff =        GetPrivateProfileInt( ula, "PortFF",       0,   ininame) != 0;
  1107.  conf.mcx_small =     GetPrivateProfileInt( ula, "mcx_small",    320, ininame);
  1108.  conf.mcy_small =     GetPrivateProfileInt( ula, "mcy_small",    240, ininame);
  1109.  conf.b_top_small =   GetPrivateProfileInt( ula, "b_top_small",  24,  ininame);
  1110.  conf.b_left_small =  GetPrivateProfileInt( ula, "b_left_small", 32,  ininame);
  1111.  conf.mcx_full =      GetPrivateProfileInt( ula, "mcx_full",     384, ininame);
  1112.  conf.mcy_full =      GetPrivateProfileInt( ula, "mcy_full",     288, ininame);
  1113.  conf.b_top_full =    GetPrivateProfileInt( ula, "b_top_full",   48,  ininame);
  1114.  conf.b_left_full =   GetPrivateProfileInt( ula, "b_left_full",  64,  ininame);
  1115.  
  1116.  conf.ula_preset = u8( -1U);
  1117.  add_presets( ula, "preset", &num_ula, ulapreset, &conf.ula_preset);
  1118.  
  1119.  load_ula_preset();
  1120. //-----------------------------------------------------------------------------
  1121.  conf.atm.mem_swap =
  1122.         u8( GetPrivateProfileInt(   ula,
  1123.                                     "AtmMemSwap",
  1124.                                     0,
  1125.                                     ininame  ));
  1126. //-----------------------------------------------------------------------------
  1127.  conf.use_comp_pal =
  1128.         u8( GetPrivateProfileInt(   ula,
  1129.                                     "UsePalette",
  1130.                                     1,
  1131.                                     ininame  ));
  1132. //-----------------------------------------------------------------------------
  1133.  conf.profi_monochrome =
  1134.         u8( GetPrivateProfileInt(   ula,
  1135.                                     "ProfiMonochrome",
  1136.                                     0,
  1137.                                     ininame  ));
  1138. //-----------------------------------------------------------------------------
  1139.  conf.ula_plus =
  1140.         GetPrivateProfileInt(   ula,
  1141.                                 "ULAPlus",
  1142.                                 0,
  1143.                                 ininame  ) != 0;
  1144. //-----------------------------------------------------------------------------
  1145.  conf.flashcolor =
  1146.         u8( GetPrivateProfileInt(   video,
  1147.                                     "FlashColor",
  1148.                                     0,
  1149.                                     ininame  ));
  1150. //-----------------------------------------------------------------------------
  1151.  conf.frameskip =
  1152.         u8( GetPrivateProfileInt(   video,
  1153.                                     "SkipFrame",
  1154.                                     0,
  1155.                                     ininame  ));
  1156. //-----------------------------------------------------------------------------
  1157.  conf.flip =
  1158.         (conf.SyncMode == SM_VIDEO)  ?  1 :
  1159.                                         u8( GetPrivateProfileInt(   video,
  1160.                                                                     "VSync",
  1161.                                                                     0,
  1162.                                                                     ininame  ));
  1163. //-----------------------------------------------------------------------------
  1164.  conf.fullscr =
  1165.         u8( GetPrivateProfileInt(   video,
  1166.                                     "FullScr",
  1167.                                     1,
  1168.                                     ininame  ));
  1169. //-----------------------------------------------------------------------------
  1170.  conf.refresh =
  1171.         GetPrivateProfileInt(   video,
  1172.                                 "Refresh",
  1173.                                 0,
  1174.                                 ininame  );
  1175. //-----------------------------------------------------------------------------
  1176.  conf.frameskipmax =
  1177.         u8( GetPrivateProfileInt(   video,
  1178.                                     "SkipFrameMaxSpeed",
  1179.                                     33,
  1180.                                     ininame  ));
  1181. //-----------------------------------------------------------------------------
  1182.  conf.updateb =
  1183.         u8( GetPrivateProfileInt(   video,
  1184.                                     "Update",
  1185.                                     1,
  1186.                                     ininame  ));
  1187. //-----------------------------------------------------------------------------
  1188.  conf.ch_size =
  1189.         u8( GetPrivateProfileInt(   video,
  1190.                                     "ChunkSize",
  1191.                                     0,
  1192.                                     ininame  ));
  1193.                                    
  1194. // printf("ChunkSize %d\n",conf.ch_size);
  1195. // надпись auto детектитсо как 0
  1196. //-----------------------------------------------------------------------------
  1197.  conf.noflic =
  1198.         u8( GetPrivateProfileInt(   video,
  1199.                                     "NoFlic",
  1200.                                     0,
  1201.                                     ininame  ));
  1202. //-----------------------------------------------------------------------------
  1203.  conf.alt_nf =
  1204.         u8( GetPrivateProfileInt(   video,
  1205.                                     "AltNoFlic",
  1206.                                     0,
  1207.                                     ininame  ));
  1208. //-----------------------------------------------------------------------------
  1209.  conf.scanbright =
  1210.         GetPrivateProfileInt(   video,
  1211.                                 "ScanIntens",
  1212.                                 66,
  1213.                                 ininame  );
  1214. //-----------------------------------------------------------------------------
  1215.  conf.pixelscroll =
  1216.         u8( GetPrivateProfileInt(   video,
  1217.                                     "PixelScroll",
  1218.                                     0,
  1219.                                     ininame   ));
  1220. //-----------------------------------------------------------------------------
  1221.  conf.detect_video =
  1222.         u8( GetPrivateProfileInt(   video,
  1223.                                     "DetectModel",
  1224.                                     1,
  1225.                                     ininame   ));
  1226. //-----------------------------------------------------------------------------
  1227.  conf.fontsize = 8;     //????
  1228. //-----------------------------------------------------------------------------
  1229.  conf.videoscale =
  1230.         u8( GetPrivateProfileInt(   video,
  1231.                                     "scale",
  1232.                                     2,
  1233.                                     ininame   ));
  1234. //-----------------------------------------------------------------------------
  1235.  conf.rsm.mix_frames =
  1236.         u8( GetPrivateProfileInt(   video,
  1237.                                     "rsm.frames",
  1238.                                     8,
  1239.                                     ininame   ));
  1240. //-----------------------------------------------------------------------------
  1241.  GetPrivateProfileString(   video,
  1242.                             "rsm.mode",
  1243.                             nil,
  1244.                             line,
  1245.                             sizeof line,
  1246.                             ininame
  1247.                           );
  1248.                          
  1249.     conf.rsm.mode = RSM_FIR0;
  1250.     if (!strnicmp( line, "FULL",   4))  conf.rsm.mode = RSM_FIR0;
  1251.     if (!strnicmp( line, "2C",     2))  conf.rsm.mode = RSM_FIR1;
  1252.     if (!strnicmp( line, "3C",     2))  conf.rsm.mode = RSM_FIR2;
  1253.     if (!strnicmp( line, "SIMPLE", 6))  conf.rsm.mode = RSM_SIMPLE;
  1254. //-----------------------------------------------------------------------------
  1255.  GetPrivateProfileString(   video,
  1256.                             "AtariPreset",
  1257.                             nil,
  1258.                             conf.atariset,
  1259.                             sizeof conf.atariset,
  1260.                             ininame
  1261.                           );
  1262.                          
  1263.     string_comment_trimmer( conf.atariset); //обрезка лишнего             // [NS]
  1264. // printf("AtariPreset <%s>\n",conf.atariset);
  1265. //-----------------------------------------------------------------------------
  1266.  GetPrivateProfileString(   video,
  1267.                             video,
  1268.                             nil,
  1269.                             line,
  1270.                             sizeof line,
  1271.                             ininame
  1272.                           );
  1273.                          
  1274.     string_comment_trimmer( line); //обрезка лишнего                      // [NS]
  1275.  
  1276.         color( CONSCLR_DEFAULT);        printf("video filter/renderer: ");
  1277.         color( CONSCLR_INFO);           printf("<%s>\n",line);
  1278.  
  1279.     conf.render = 0;
  1280.     //-------------------------------------------------------------------------
  1281.     for (i = 0;    renders[ i].func;    i++)
  1282.     {
  1283.         //-------------------------------------------------------------------------
  1284.         if (!strnicmp(  line,
  1285.                         renders[ i].nick,
  1286.                         strlen( renders[ i].nick)
  1287.                 )
  1288.          )
  1289.         {
  1290.             conf.render = i;
  1291.         }
  1292.         //-------------------------------------------------------------------------
  1293.     }
  1294.     //-------------------------------------------------------------------------
  1295. //-----------------------------------------------------------------------------
  1296.  GetPrivateProfileString(   video,
  1297.                             "driver",
  1298.                             nil,
  1299.                             line,
  1300.                             sizeof line,
  1301.                             ininame
  1302.                           );
  1303.     string_comment_trimmer( line); //обрезка лишнего              //[NS]
  1304.    
  1305.         color( CONSCLR_DEFAULT);        printf("driver: ");
  1306.         color( CONSCLR_INFO);           printf("<%s>\n",line);
  1307.  
  1308.     conf.driver = DRIVER_DDRAW;
  1309.     //-------------------------------------------------------------------------
  1310.     for (i = 0;    drivers[ i].nick;    i++)
  1311.     {
  1312.         //---------------------------------------------------------------------
  1313.         if (!strnicmp(  line,
  1314.                         drivers[ i].nick,
  1315.                         strlen( drivers[ i].nick)
  1316.                        )
  1317.          )
  1318.         {
  1319.             conf.driver = i;
  1320.         }
  1321.         //---------------------------------------------------------------------
  1322.     }
  1323.     //-------------------------------------------------------------------------
  1324. //-----------------------------------------------------------------------------
  1325.  conf.fast_sl =
  1326.         u8( GetPrivateProfileInt(   video,
  1327.                                     "fastlines",
  1328.                                     0,
  1329.                                     ininame   ));
  1330. //-----------------------------------------------------------------------------
  1331.  GetPrivateProfileString(   video,
  1332.                             "Border",
  1333.                             nil,
  1334.                             line,
  1335.                             sizeof line,
  1336.                             ininame
  1337.                          );
  1338.                          
  1339.     conf.bordersize = 1;        //default
  1340.     if          (!strnicmp( line, "none",  4))  conf.bordersize = 0;
  1341.     else if     (!strnicmp( line, "small", 5))  conf.bordersize = 1;
  1342.     else if     (!strnicmp( line, "wide",  4))  conf.bordersize = 2;
  1343.     else if     (!strnicmp( line, "full",  4))  conf.bordersize = 3;
  1344.        
  1345. //-----------------------------------------------------------------------------
  1346.        
  1347.    conf.minres = GetPrivateProfileInt(video, "MinRes", 0, ininame);
  1348.  
  1349. //-----------------------------------------------------------------------------
  1350.  
  1351.    GetPrivateProfileString(video, "Hide", nil, line, sizeof line, ininame);
  1352.         string_comment_trimmer(line); //обрезка лишнего   //NS
  1353.         printf("ignore filters <%s>\n",line);
  1354.    char *ptr = strchr(line, ';'); if (ptr) *ptr = 0;
  1355.    for (ptr = line;;)
  1356.    {
  1357.       size_t max = renders_count - 1;
  1358.       for (i = 0; renders[i].func; i++)
  1359.       {
  1360.          size_t sl = strlen(renders[i].nick);
  1361.          if (!strnicmp(ptr, renders[i].nick, sl) && !isalnum(ptr[sl]))
  1362.          {
  1363.             ptr += sl;
  1364.             memcpy(&renders[i], &renders[i+1], (sizeof *renders) * (max-i));
  1365.             break;
  1366.          }
  1367.       }
  1368.       if (!*ptr++)
  1369.           break;
  1370.    }
  1371. //-----------------------------------------------------------------------------
  1372.    GetPrivateProfileString(video, "ScrShotDir", ".", conf.scrshot_dir, sizeof(conf.scrshot_dir), ininame);
  1373.         string_comment_trimmer(conf.scrshot_dir); //обрезка лишнего       //NS
  1374.         printf("ScrShotDir <%s>\n",conf.scrshot_dir);
  1375. //-----------------------------------------------------------------------------
  1376.    GetPrivateProfileString(video, "ScrShot", nil, line, sizeof line, ininame);
  1377.    conf.scrshot = 0;
  1378.    if(!strnicmp(line, "scr", 3))
  1379.        conf.scrshot = 0;
  1380.    else if(!strnicmp(line, "bmp", 3))
  1381.        conf.scrshot = 1;
  1382.    else if(!strnicmp(line, "png", 3))
  1383.        conf.scrshot = 2;
  1384. //-----------------------------------------------------------------------------
  1385.     GetPrivateProfileString(video, "ffmpeg.exec", "ffmpeg.exe", conf.ffmpeg.exec, sizeof conf.ffmpeg.exec, ininame);
  1386.         string_comment_trimmer(conf.ffmpeg.exec);        //обрезка лишнего        //NS
  1387.         printf("ffmpeg.exec <%s>\n",conf.ffmpeg.exec);
  1388. //-----------------------------------------------------------------------------
  1389.     GetPrivateProfileString(video, "ffmpeg.parm", nil, conf.ffmpeg.parm, sizeof conf.ffmpeg.parm, ininame);
  1390.         string_comment_trimmer(conf.ffmpeg.parm);       //обрезка лишнего //NS
  1391.         printf("ffmpeg.parm <%s>\n",conf.ffmpeg.parm);
  1392. //-----------------------------------------------------------------------------
  1393.     GetPrivateProfileString(video, "ffmpeg.vout", "video#.avi", conf.ffmpeg.vout, sizeof conf.ffmpeg.vout, ininame);
  1394.         string_comment_trimmer(conf.ffmpeg.vout);       //обрезка лишнего //NS
  1395.         printf("ffmpeg.vout <%s>\n",conf.ffmpeg.vout);
  1396. //-----------------------------------------------------------------------------
  1397.         conf.ffmpeg.newcons = i8(GetPrivateProfileInt(video, "ffmpeg.newconsole", 1, ininame));
  1398. //-----------------------------------------------------------------------------
  1399.         conf.trdos_present = u8(GetPrivateProfileInt(beta128, "beta128", 1, ininame));
  1400. //-----------------------------------------------------------------------------
  1401.         conf.trdos_traps = u8(GetPrivateProfileInt(beta128, "Traps", 1, ininame));
  1402. //-----------------------------------------------------------------------------
  1403.         conf.wd93_nodelay = u8(GetPrivateProfileInt(beta128, "Fast", 1, ininame));
  1404. //-----------------------------------------------------------------------------
  1405.    conf.trdos_interleave = u8(GetPrivateProfileInt(beta128, "IL", 1, ininame)-1);
  1406.    if (conf.trdos_interleave > 2) conf.trdos_interleave = 0;
  1407. //-----------------------------------------------------------------------------
  1408.         conf.fdd_noise = u8(GetPrivateProfileInt(beta128, "Noise", 0, ininame));
  1409. //-----------------------------------------------------------------------------
  1410.    GetPrivateProfileString(beta128, "BOOT", nil, conf.appendboot, sizeof conf.appendboot, ininame);
  1411.         string_comment_trimmer(conf.appendboot); //обрезка лишнего        //NS
  1412.         //printf("BOOT <%s>\n",conf.appendboot);
  1413.    addpath(conf.appendboot);
  1414. //-----------------------------------------------------------------------------
  1415.    //временный код, потом надо удалить      NEDOREPO NEW
  1416.    conf.trdos_IORam = GetPrivateProfileInt(beta128, "RamPageFddIO", 0, ininame);
  1417. //-----------------------------------------------------------------------------
  1418.    conf.wiznet = GetPrivateProfileInt(USBZXNET, "WizNet", 0, ininame);  //NEDOREPO
  1419. //-----------------------------------------------------------------------------
  1420.    GetPrivateProfileString(misc, "ColdRAM", "0000FFFF", conf.cold_ram_pat, sizeof conf.cold_ram_pat, ininame);  //NEDOREPO
  1421.         string_comment_trimmer(conf.cold_ram_pat); //обрезка лишнего      //NS
  1422.         //printf("BOOT <%s>\n",conf.cold_ram_pat);
  1423. //-----------------------------------------------------------------------------
  1424.  conf.led.enabled = u8(GetPrivateProfileInt(leds, "leds", 1, ininame));
  1425. //-----------------------------------------------------------------------------
  1426.  conf.led.flash_ay_kbd = u8(GetPrivateProfileInt(leds, "KBD_AY", 1, ininame));
  1427. //-----------------------------------------------------------------------------
  1428.  conf.led.perf_t = u8(GetPrivateProfileInt(leds, "PerfShowT", 0, ininame));
  1429. //-----------------------------------------------------------------------------
  1430.    conf.led.bandBpp = GetPrivateProfileInt(leds, "BandBpp", 512, ininame);
  1431.    if (conf.led.bandBpp != 64 && conf.led.bandBpp != 128 && conf.led.bandBpp != 256 && conf.led.bandBpp != 512) conf.led.bandBpp = 512;
  1432. //-----------------------------------------------------------------------------
  1433.    // уебащная блядота написанная каким то пидорасом
  1434.    static char nm[] = "AY\0Perf\0LOAD\0Input\0Time\0OSW\0MemBand\0MemBand_256";
  1435.    char *n2 = nm;
  1436.    for (i = 0; i < NUM_LEDS; i++) {
  1437.       GetPrivateProfileString(leds, n2, nil, line, sizeof line, ininame);
  1438.       int x, y;
  1439.       unsigned z; unsigned r; n2 += strlen(n2) + 1;
  1440.       if (sscanf(line, "%u:%d,%d", &z, &x, &y) != 3) r = 0;
  1441.       else r = (x & 0xFFFF) + ((y << 16) & 0x7FFFFFFF) + z*0x80000000;
  1442.       //printf("LEDS READ =========== %X\n",r);
  1443.       *(&conf.led.ay+i) = r;
  1444.    }
  1445.  
  1446. //-----------------------------------------------------------------------------
  1447.     conf.sound.do_sound = do_sound_none;        //default
  1448.     GetPrivateProfileString(    sound,
  1449.                                 "SoundDrv",
  1450.                                 nil,
  1451.                                 line,
  1452.                                 sizeof line,
  1453.                                 ininame
  1454.                              );
  1455.     //-------------------------------------------------------------------------
  1456.     if (!strnicmp( line, "wave", 4))
  1457.     {
  1458.         conf.sound.do_sound = do_sound_wave;
  1459.         conf.soundbuffer = GetPrivateProfileInt(    sound,
  1460.                                                     "SoundBuffer",
  1461.                                                     0,
  1462.                                                     ininame
  1463.                                                   );
  1464.         //---------------------------------------------------------------------
  1465.         if (!conf.soundbuffer)
  1466.             conf.soundbuffer = 6;
  1467.         //---------------------------------------------------------------------
  1468.         if (conf.soundbuffer >= MAXWQSIZE)
  1469.             conf.soundbuffer = MAXWQSIZE - 1;
  1470.         //---------------------------------------------------------------------
  1471.     }
  1472.     //-------------------------------------------------------------------------
  1473.     if (!strnicmp(line, "ds", 2))
  1474.     {
  1475.         conf.sound.do_sound = do_sound_ds;
  1476. //      conf.soundbuffer = GetPrivateProfileInt(    sound,
  1477. //                                                  "DSoundBuffer",
  1478. //                                                  1000,
  1479. //                                                  ininame
  1480. //                                                );
  1481. //      conf.soundbuffer *= 4; // 16-bit, stereo
  1482.     }
  1483. //-----------------------------------------------------------------------------
  1484.     conf.sound.enabled = u8( GetPrivateProfileInt(      sound,
  1485.                                                         "Enabled",
  1486.                                                         1,
  1487.                                                         ininame
  1488.                                                     ));
  1489. //-----------------------------------------------------------------------------
  1490. #ifdef MOD_GS
  1491.     conf.sound.gsreset = u8( GetPrivateProfileInt(      sound,
  1492.                                                         "GSReset",
  1493.                                                         0,
  1494.                                                         ininame
  1495.                                                     ));
  1496. #endif
  1497. //-----------------------------------------------------------------------------
  1498.    conf.sound.fq = GetPrivateProfileInt(sound, "Fq", 44100, ininame);
  1499. //-----------------------------------------------------------------------------
  1500.  conf.sound.dsprimary = u8(GetPrivateProfileInt(sound, "DSPrimary", 0, ininame));
  1501. //-----------------------------------------------------------------------------
  1502.    conf.gs_type = 0;
  1503. #ifdef MOD_GS
  1504.    GetPrivateProfileString(sound, "GSTYPE", nil, line, sizeof line, ininame);
  1505.    #ifdef MOD_GSZ80
  1506.         if (!strnicmp(line, "Z80", 3)) conf.gs_type = 1;
  1507.    #endif
  1508.    #ifdef MOD_GSBASS
  1509.         if (!strnicmp(line, "BASS", 4)) conf.gs_type = 2;
  1510.    #endif
  1511. //-----------------------------------------------------------------------------
  1512.  conf.gs_ramsize = GetPrivateProfileInt(ngs, "RamSize", 2048, ininame);
  1513. #endif
  1514.  
  1515. //-----------------------------------------------------------------------------
  1516.  conf.soundfilter = u8(GetPrivateProfileInt(sound, "SoundFilter", 0, ininame)); //Alone Coder 0.36.4
  1517. //-----------------------------------------------------------------------------
  1518.  conf.RejectDC = u8(GetPrivateProfileInt(sound, "RejectDC", 1, ininame));
  1519. //-----------------------------------------------------------------------------
  1520.  conf.sound.beeper_vol = int(GetPrivateProfileInt(sound, "BeeperVol", 4000, ininame));
  1521. //-----------------------------------------------------------------------------
  1522.  conf.sound.micout_vol = int(GetPrivateProfileInt(sound, "MicOutVol", 1000, ininame));
  1523. //-----------------------------------------------------------------------------
  1524.  conf.sound.micin_vol = int(GetPrivateProfileInt(sound, "MicInVol", 1000, ininame));
  1525. //-----------------------------------------------------------------------------
  1526.  conf.sound.ay_vol = int(GetPrivateProfileInt(sound, "AYVol", 4000, ininame));
  1527. //-----------------------------------------------------------------------------
  1528.  conf.sound.covoxFB = int(GetPrivateProfileInt(sound, "CovoxFB", 0, ininame));
  1529. //-----------------------------------------------------------------------------
  1530.  conf.sound.covoxFB_vol = int(GetPrivateProfileInt(sound, "CovoxFBVol", 8192, ininame));
  1531. //-----------------------------------------------------------------------------
  1532.  conf.sound.covoxDD = int(GetPrivateProfileInt(sound, "CovoxDD", 0, ininame));
  1533. //-----------------------------------------------------------------------------
  1534.  conf.sound.covoxDD_vol = int(GetPrivateProfileInt(sound, "CovoxDDVol", 4000, ininame));
  1535. //-----------------------------------------------------------------------------
  1536.  conf.sound.sd = int(GetPrivateProfileInt(sound, "SD", 0, ininame));
  1537. //-----------------------------------------------------------------------------
  1538.  conf.sound.sd_vol = int(GetPrivateProfileInt(sound, "SDVol", 4000, ininame));
  1539. //-----------------------------------------------------------------------------
  1540. // conf.sound.saa1099 = int(GetPrivateProfileInt(sound, "Saa1099", 0, ininame));
  1541.    conf.sound.saa1099 = SAA_NONE;       //NEDOREPO
  1542.    GetPrivateProfileString(sound, "Saa1099", 0, line, sizeof line, ininame);
  1543.    if(!strnicmp(line, "ZXM", 3))
  1544.        conf.sound.saa1099 = SAA_ZXM;
  1545.    else if(!strnicmp(line, "TFMpro", 6))
  1546.        conf.sound.saa1099 = SAA_TFM_PRO;
  1547.  
  1548. //-----------------------------------------------------------------------------
  1549.    #ifdef MOD_GS
  1550.    conf.sound.gs_vol = int(GetPrivateProfileInt(sound, "GSVol", 8000, ininame));
  1551.    #endif
  1552. //-----------------------------------------------------------------------------
  1553.    #ifdef MOD_GSBASS
  1554.    conf.sound.bass_vol = int(GetPrivateProfileInt(sound, "BASSVol", 8000, ininame));
  1555.    #endif
  1556. //-----------------------------------------------------------------------------
  1557.  conf.sound.saa1099fq = GetPrivateProfileInt(saa1099, "Fq", 8000000, ininame);
  1558. //-----------------------------------------------------------------------------
  1559.    add_presets(ay, "VOLTAB", &num_ayvols, ayvols, &conf.sound.ay_vols);
  1560. //-----------------------------------------------------------------------------
  1561.    add_presets(ay, "STEREO", &num_aystereo, aystereo, &conf.sound.ay_stereo);
  1562. //-----------------------------------------------------------------------------
  1563.    conf.sound.ayfq = GetPrivateProfileInt(ay, "Fq", 1750000, ininame);
  1564.                                                 //1774400 апсолютно левая частота
  1565. //-----------------------------------------------------------------------------
  1566.    //соблюдать последовательность (YM может сработать после YM2203 !!!
  1567.    GetPrivateProfileString(ay, "Chip", nil, line, sizeof line, ininame);
  1568.    conf.sound.ay_chip = SNDCHIP::CHIP_YM;       //default
  1569.    if (!strnicmp(line, "AY",     2)) conf.sound.ay_chip = SNDCHIP::CHIP_AY;
  1570.    if (!strnicmp(line, "YM",     2)) conf.sound.ay_chip = SNDCHIP::CHIP_YM;
  1571.    if (!strnicmp(line, "YM2203", 6)) conf.sound.ay_chip = SNDCHIP::CHIP_YM2203; //else //Dexus
  1572.  
  1573. //-----------------------------------------------------------------------------
  1574.    conf.sound.ay_samples = u8(GetPrivateProfileInt(ay, "UseSamples", 0, ininame));
  1575. //-----------------------------------------------------------------------------
  1576.    GetPrivateProfileString(ay, "Scheme", nil, line, sizeof line, ininame);
  1577.    conf.sound.ay_scheme = AY_SCHEME_NONE;
  1578.    if (!strnicmp(line, "default", 7)) conf.sound.ay_scheme = AY_SCHEME_SINGLE;
  1579.    if (!strnicmp(line, "FULLER",  6)) conf.sound.ay_scheme = AY_SCHEME_FULLER;
  1580.    if (!strnicmp(line, "PSEUDO",  6)) conf.sound.ay_scheme = AY_SCHEME_PSEUDO;
  1581.    if (!strnicmp(line, "QUADRO",  6)) conf.sound.ay_scheme = AY_SCHEME_QUADRO;
  1582.    if (!strnicmp(line, "POS",     3)) conf.sound.ay_scheme = AY_SCHEME_POS;
  1583.    if (!strnicmp(line, "CHRV",    4)) conf.sound.ay_scheme = AY_SCHEME_CHRV;
  1584. // if (!strnicmp(line, "ZXI",     3)) conf.sound.ay_scheme = AY_SCHEME_ZXI;     //NS
  1585. //-----------------------------------------------------------------------------
  1586.    GetPrivateProfileString(input, "ZXKeyMap", "default", conf.zxkeymap, sizeof conf.zxkeymap, ininame);
  1587.         string_comment_trimmer(conf.zxkeymap); //обрезка лишнего  //NS
  1588.         printf("ZXKeyMap <%s>\n",conf.zxkeymap);
  1589.  
  1590.    for (i = 0; i < zxk_maps_count; i++)
  1591.    {
  1592.       if (!strnicmp(conf.zxkeymap, zxk_maps[i].name, strlen(zxk_maps[i].name)))
  1593.       {
  1594.           conf.input.active_zxk = &zxk_maps[i];
  1595.           break;
  1596.       }
  1597.    }
  1598.  
  1599.    if(!conf.input.active_zxk)
  1600.    {
  1601.        errmsg("Invalid keyboard layout '%s' specified, default used", conf.zxkeymap);
  1602.        conf.input.active_zxk = &zxk_maps[0]; // default
  1603.    }
  1604.  
  1605.    GetPrivateProfileString(input, "KeybLayout", "default", line, sizeof(line), ininame);
  1606.         string_comment_trimmer(line); //обрезка лишнего   //NS
  1607.         printf("KeybLayout <%s>\n",line);
  1608.  
  1609.    ptr = strtok(line, " ;");
  1610.    strcpy(conf.keyset, ptr ? ptr : line);
  1611.  
  1612. //-----------------------------------------------------------------------------
  1613.         GetPrivateProfileString(input, "Mouse", nil, line, sizeof line, ininame);
  1614.         conf.input.mouse = 0;
  1615.         if (!strnicmp(line, "KEMPSTON", 8)) conf.input.mouse = 1;
  1616.         if (!strnicmp(line, "AY", 2)) conf.input.mouse = 2;
  1617. //-----------------------------------------------------------------------------
  1618. //0.36.6 from 0.35b2
  1619.         GetPrivateProfileString(input, "Wheel", nil, line, sizeof line, ininame);
  1620.         conf.input.mousewheel = MOUSE_WHEEL_NONE;
  1621.         if (!strnicmp(line, "KEMPSTON", 8)) conf.input.mousewheel = MOUSE_WHEEL_KEMPSTON;
  1622.         if (!strnicmp(line, "KEYBOARD", 8)) conf.input.mousewheel = MOUSE_WHEEL_KEYBOARD;
  1623. //-----------------------------------------------------------------------------
  1624.         conf.input.joymouse = u8(GetPrivateProfileInt(input, "JoyMouse", 0, ininame));
  1625. //-----------------------------------------------------------------------------
  1626.         conf.input.mousescale = i8(GetPrivateProfileInt(input, "MouseScale", 0, ininame));
  1627. //-----------------------------------------------------------------------------
  1628.         conf.input.mouseswap = u8(GetPrivateProfileInt(input, "SwapMouse", 0, ininame));
  1629. //-----------------------------------------------------------------------------
  1630.         conf.input.kjoy = u8(GetPrivateProfileInt(input, "KJoystick", 1, ininame));
  1631. //-----------------------------------------------------------------------------
  1632.         conf.input.fjoy = GetPrivateProfileInt(input, "FJoystick", 1, ininame) != 0;
  1633. //-----------------------------------------------------------------------------
  1634.         conf.input.keymatrix = u8(GetPrivateProfileInt(input, "Matrix", 1, ininame));
  1635. //-----------------------------------------------------------------------------
  1636.         conf.input.firedelay = u8(GetPrivateProfileInt(input, "FireRate", 1, ininame));
  1637. //-----------------------------------------------------------------------------
  1638.         conf.input.altlock = u8(GetPrivateProfileInt(input, "AltLock", 1, ininame));
  1639. //-----------------------------------------------------------------------------
  1640.         conf.input.paste_hold = u8(GetPrivateProfileInt(input, "HoldDelay", 2, ininame));
  1641.         conf.input.paste_release = u8(GetPrivateProfileInt(input, "ReleaseDelay", 5, ininame));
  1642.         conf.input.paste_newline = u8(GetPrivateProfileInt(input, "NewlineDelay", 20, ininame));
  1643. //-----------------------------------------------------------------------------
  1644.         conf.input.keybpcmode = u8(GetPrivateProfileInt(input, "KeybPCMode", 0, ininame));
  1645. //-----------------------------------------------------------------------------
  1646.         conf.atm.xt_kbd = u8(GetPrivateProfileInt(input, "ATMKBD", 0, ininame));
  1647. //-----------------------------------------------------------------------------
  1648.         conf.input.JoyId = GetPrivateProfileInt(input, "Joy", 0, ininame);
  1649. //-----------------------------------------------------------------------------
  1650.    GetPrivateProfileString(input, "Fire", "0", line, sizeof line, ininame);
  1651.         string_comment_trimmer(line); //обрезка лишнего   //NS
  1652.         //printf("Fire <%s>\n",line);
  1653.    conf.input.firenum = 0; conf.input.fire = 0;
  1654.    zxkeymap *active_zxk = conf.input.active_zxk;
  1655.    for (i = 0; i < active_zxk->zxk_size; i++)
  1656.       if (!stricmp(line, active_zxk->zxk[i].name))
  1657.       {  conf.input.firenum = i; break; }
  1658.  
  1659.    char buff[0x7000];
  1660.  
  1661.    GetPrivateProfileSection(colors, buff, sizeof buff, ininame);
  1662. //-----------------------------------------------------------------------------
  1663.    GetPrivateProfileString(colors, "color", "default", line, sizeof line, ininame);
  1664.         string_comment_trimmer(line); //обрезка лишнего   //NS
  1665.         printf("color <%s>\n",line);
  1666.  
  1667.    conf.pal = 0;
  1668.  
  1669.    for (i = 1, ptr = buff; i < _countof(pals); ptr += strlen(ptr)+1)
  1670.    {
  1671.       if (!*ptr)
  1672.           break;
  1673.       if (!isalnum(*ptr) || !strnicmp(ptr, "color=", 6))
  1674.           continue;
  1675.       char *ptr1 = strchr(ptr, '=');
  1676.       if (!ptr1)
  1677.           continue;
  1678.       *ptr1 = 0; strcpy(pals[i].name, ptr); ptr = ptr1+1;
  1679.       sscanf(ptr, "%02X,%02X,%02X,%02X,%02X,%02X:%X,%X,%X;%X,%X,%X;%X,%X,%X",
  1680.          &pals[i].ZZ,  &pals[i].ZN,  &pals[i].NN,
  1681.          &pals[i].NB,  &pals[i].BB,  &pals[i].ZB,
  1682.          &pals[i].r11, &pals[i].r12, &pals[i].r13,
  1683.          &pals[i].r21, &pals[i].r22, &pals[i].r23,
  1684.          &pals[i].r31, &pals[i].r32, &pals[i].r33);
  1685.  
  1686.       pals[i].r11 = min(pals[i].r11, 256U);
  1687.       pals[i].r12 = min(pals[i].r12, 256U);
  1688.       pals[i].r13 = min(pals[i].r13, 256U);
  1689.  
  1690.       pals[i].r21 = min(pals[i].r21, 256U);
  1691.       pals[i].r22 = min(pals[i].r22, 256U);
  1692.       pals[i].r23 = min(pals[i].r23, 256U);
  1693.  
  1694.       pals[i].r31 = min(pals[i].r31, 256U);
  1695.       pals[i].r32 = min(pals[i].r32, 256U);
  1696.       pals[i].r33 = min(pals[i].r33, 256U);
  1697.  
  1698.       if (!strnicmp(line, pals[i].name, strlen(pals[i].name)))
  1699.           conf.pal = i;
  1700.       i++;
  1701.    }
  1702.    conf.num_pals = i;
  1703.  
  1704. //-----------------------------------------------------------------------------
  1705.    GetPrivateProfileString(hdd, "SCHEME", nil, line, sizeof line, ininame);
  1706.    conf.ide_scheme = IDE_NONE;
  1707.    if(!strnicmp(line, "ATM", 3))
  1708.        conf.ide_scheme = IDE_ATM;
  1709.    else if(!strnicmp(line, "NEMO-DIVIDE", 11))
  1710.        conf.ide_scheme = IDE_NEMO_DIVIDE;
  1711.    else if(!strnicmp(line, "NEMO-A8", 7))
  1712.        conf.ide_scheme = IDE_NEMO_A8;
  1713.    else if(!strnicmp(line, "NEMO", 4))
  1714.        conf.ide_scheme = IDE_NEMO;
  1715.    else if(!strnicmp(line, "SMUC", 4))
  1716.        conf.ide_scheme = IDE_SMUC;
  1717.    else if(!strnicmp(line, "PROFI", 5))
  1718.        conf.ide_scheme = IDE_PROFI;
  1719.    else if(!strnicmp(line, "DIVIDE", 6))
  1720.        conf.ide_scheme = IDE_DIVIDE;
  1721. //-----------------------------------------------------------------------------
  1722.  conf.ide_skip_real = u8(GetPrivateProfileInt(hdd, "SkipReal", 0, ininame));
  1723. //-----------------------------------------------------------------------------
  1724.    GetPrivateProfileString(hdd, "CDROM", "SPTI", line, sizeof line, ininame);
  1725.    conf.cd_aspi = !strnicmp(line, "ASPI", 4) ? 1 : 0;
  1726. //-----------------------------------------------------------------------------
  1727.    for (int ide_device = 0; ide_device < 2; ide_device++)
  1728.    {
  1729.       char param[32];
  1730.       sprintf(param, "LBA%d", ide_device);
  1731.  
  1732.       GetPrivateProfileString(hdd, param, "0", line, sizeof(line), ininame);
  1733.         string_comment_trimmer(line);           //обрезка лишнего //NS
  1734.         //printf("hdd <%s>\n",line);
  1735.       conf.ide[ide_device].lba = strtoull(line, nullptr, 10);
  1736.       sprintf(param, "CHS%d", ide_device);
  1737.       GetPrivateProfileString(hdd, param, "0/0/0", line, sizeof line, ininame);
  1738.         string_comment_trimmer(line);           //обрезка лишнего //NS
  1739.         //printf("hdd <%s>\n",line);
  1740.       unsigned c, h, s;
  1741.  
  1742.       sscanf(line, "%u/%u/%u", &c, &h, &s);
  1743.       if(h > 16)
  1744.       {
  1745.           sprintf(line, "HDD%d heads count > 16 : %u\n", ide_device, h);
  1746.           errexit(line);
  1747.       }
  1748.       if(s > 63)
  1749.       {
  1750.           sprintf(line, "error HDD%d sectors count > 63 : %u\n", ide_device, s);
  1751.           errexit(line);
  1752.       }
  1753.       if(c > 16383)
  1754.       {
  1755.           sprintf(line, "error HDD%d cylinders count > 16383 : %u\n", ide_device, c);
  1756.           errexit(line);
  1757.       }
  1758.  
  1759.       conf.ide[ide_device].c = c;
  1760.       conf.ide[ide_device].h = h;
  1761.       conf.ide[ide_device].s = s;
  1762.  
  1763.       sprintf(param, "Image%d", ide_device);
  1764.       GetPrivateProfileString(hdd, param, nil, conf.ide[ide_device].image, sizeof conf.ide[ide_device].image, ininame);
  1765.         string_comment_trimmer(conf.ide[ide_device].image); //обрезка лишнего     //NS
  1766.         printf("Image%d <%s>\n",ide_device,conf.ide[ide_device].image);
  1767.       if(conf.ide[ide_device].image[0] &&
  1768.          conf.ide[ide_device].image[0] != '<')
  1769.           addpath(conf.ide[ide_device].image);
  1770.  
  1771.       sprintf(param, "HD%dRO", ide_device);
  1772.       conf.ide[ide_device].readonly = (BYTE)GetPrivateProfileInt(hdd, param, 0, ininame);
  1773.       sprintf(param, "CD%d", ide_device);
  1774.       conf.ide[ide_device].cd = (BYTE)GetPrivateProfileInt(hdd, param, 0, ininame);
  1775.  
  1776.       if(!conf.ide[ide_device].cd &&
  1777.          conf.ide[ide_device].lba == 0 &&
  1778.          conf.ide[ide_device].image[0] &&
  1779.          conf.ide[ide_device].image[0] != '<')
  1780.       {
  1781.           int file = open(conf.ide[ide_device].image, O_RDONLY | O_BINARY, S_IREAD);
  1782.           if(file >= 0)
  1783.           {
  1784.               __int64 sz = _filelengthi64(file);
  1785.               close(file);
  1786.               conf.ide[ide_device].lba = unsigned(sz / 512);
  1787.           }
  1788.       }
  1789.    }
  1790.  
  1791.    addpath(line, "CMOS");
  1792.    FILE *f0 = fopen(line, "rb");
  1793.    if (f0)
  1794.    {
  1795.      fread(cmos, 1, sizeof cmos, f0);
  1796.      fclose(f0);
  1797.    }
  1798.    else
  1799.        cmos[0x11] = 0xAA;
  1800.  
  1801.    addpath(line, "NVRAM");
  1802.    if ((f0 = fopen(line, "rb")))
  1803.    {
  1804.         fread(nvram, 1, sizeof nvram, f0);
  1805.         fclose(f0);
  1806.    }
  1807. //-----------------------------------------------------------------------------
  1808.    if(conf.gs_type == 1)        // z80gs mode
  1809.    {
  1810.        GetPrivateProfileString(ngs, "SDCARD", nullptr, conf.ngs_sd_card_path, _countof(conf.ngs_sd_card_path), ininame);
  1811.                 string_comment_trimmer(conf.ngs_sd_card_path); //обрезка лишнего  //NS
  1812.                 printf("NGS SDCARD <%s>\n",conf.ngs_sd_card_path);
  1813.         addpath(conf.ngs_sd_card_path);
  1814.         if(conf.ngs_sd_card_path[0])
  1815.                 {
  1816.                 //printf("NGS SDCARD <%s>\n", conf.ngs_sd_card_path);
  1817.                 }
  1818.    }
  1819. //-----------------------------------------------------------------------------
  1820.    conf.zc = u8(GetPrivateProfileInt(misc, "ZC", 0, ininame));
  1821.    if(conf.zc)
  1822.    {
  1823.         GetPrivateProfileString(zc, "SDCARD", nullptr, conf.zc_sd_card_path, _countof(conf.zc_sd_card_path), ininame);
  1824.                 string_comment_trimmer(conf.zc_sd_card_path); //обрезка лишнего   //NS
  1825.                 printf("ZC SDCARD <%s>\n", conf.zc_sd_card_path);
  1826.         addpath(conf.zc_sd_card_path);
  1827.         if(conf.zc_sd_card_path[0])
  1828.         {
  1829.            //printf("ZC SDCARD=`%s'\n", conf.zc_sd_card_path);
  1830.         }
  1831. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1832.         conf.sd_delay = GetPrivateProfileInt(zc, "SDDelay", 1000, ininame);     //NEDOREPO
  1833.    }
  1834.  
  1835. //-----------------------------------------------------------------------------
  1836.    GetPrivateProfileString("AUTOLOAD", "DefaultDrive", nil, line, sizeof(line), ininame);
  1837.    if(!strnicmp(line, "Auto", 4))       //Auto - редкостная дичь
  1838.        DefaultDrive = -1U;
  1839.    else if(!strnicmp(line, "A", 1))
  1840.        DefaultDrive = 0;
  1841.    else if(!strnicmp(line, "B", 1))
  1842.        DefaultDrive = 1;
  1843.    else if(!strnicmp(line, "C", 1))
  1844.        DefaultDrive = 2;
  1845.    else if(!strnicmp(line, "D", 1))
  1846.        DefaultDrive = 3;
  1847. //-----------------------------------------------------------------------------
  1848.    load_arch(ininame);
  1849.    loadkeys(ac_main);
  1850. #ifdef MOD_MONITOR
  1851.    loadkeys(ac_main_xt);
  1852.    loadkeys(ac_regs);
  1853.    loadkeys(ac_trace);
  1854.    loadkeys(ac_mem);
  1855.    loadkeys(ac_mon);    // [NS] глобальные хоткеи дебагера теперь отдельным набором
  1856. #endif
  1857. //-----------------------------------------------------------------------------
  1858.    temp.scale = GetPrivateProfileInt(video, "winscale", 1, ininame);
  1859. }
  1860. //=============================================================================
  1861.  
  1862.  
  1863.  
  1864.  
  1865. //=============================================================================
  1866. void autoload()
  1867. {
  1868.    static char autoload[] = "AUTOLOAD";
  1869.    char line[512];
  1870. //-----------------------------------------------------------------------------
  1871.     for (unsigned disk = 0; disk < 4; disk++)
  1872.     {
  1873.         char key[8]; sprintf(key, "disk%c", int('A'+disk));
  1874.         GetPrivateProfileString(autoload, key, nil, line, sizeof line, ininame);    
  1875.                 string_comment_trimmer(line); //обрезка лишнего   //NS
  1876.                 printf("disk%c autoload <%s>\n",int('A'+disk),line);  
  1877.         if (!*line) continue;
  1878.                 //string_comment_trimmer(line); //обрезка лишнего //NS
  1879.                 //printf("autoload <%s>\n",line);  
  1880.         addpath(line);
  1881.         trd_toload = disk;
  1882.         if (!loadsnap(line)) errmsg("failed to autoload <%s>", line);
  1883.    }
  1884. //-----------------------------------------------------------------------------
  1885.    GetPrivateProfileString(autoload, "snapshot", nil, line, sizeof line, ininame);
  1886.         string_comment_trimmer(line); //обрезка лишнего   //NS
  1887.         printf("snapshot autoload <%s>\n",line);  
  1888.    if (!*line) return;
  1889.         //string_comment_trimmer(line); //обрезка лишнего //NS
  1890.         //printf("autoload <%s>\n",line);    
  1891.    addpath(line);
  1892.    if (!loadsnap(line)) { color(CONSCLR_ERROR); printf("failed to start snapshot <%s>\n", line); }
  1893. }
  1894. //=============================================================================
  1895.  
  1896.  
  1897.  
  1898.  
  1899. //=============================================================================
  1900. static void apply_memory()
  1901. {
  1902.     //-------------------------------------------------------------------------
  1903.     #ifdef MOD_GSZ80
  1904.         //---------------------------------------------------------------------
  1905.         if (conf.gs_type == 1)  // z80gs mode
  1906.         {
  1907.             if (load_rom(conf.gs_rom_path, ROM_GS_M, 32) != 512) // 512k rom
  1908.             {
  1909.                 errmsg("invalid ROM size for NGS (need 512kb), NGS disabled\n");
  1910.                 conf.gs_type = 0;
  1911.             }
  1912.         }
  1913.         //---------------------------------------------------------------------
  1914.     #endif
  1915.     //-------------------------------------------------------------------------
  1916.     if (conf.ramsize != 128 && conf.ramsize != 256 && conf.ramsize != 512 && conf.ramsize != 1024 && conf.ramsize != 4096)
  1917.     {
  1918.     conf.ramsize = 0;
  1919.     }
  1920. //-----------------------------------------------------------------------------
  1921.     if (!(mem_model[conf.mem_model].availRAMs & conf.ramsize))
  1922.     {
  1923.         conf.ramsize = mem_model[conf.mem_model].defaultRAM;
  1924.         color(CONSCLR_ERROR);
  1925.         printf("invalid RAM size for %s, using default (%uK)\n",
  1926.         mem_model[conf.mem_model].fullname, conf.ramsize);
  1927.     }
  1928. //-----------------------------------------------------------------------------
  1929.     switch(conf.mem_model)
  1930.     {
  1931.     case MM_ATM710:
  1932.     case MM_ATM3:
  1933.         //printf("MM_ATM710 MM_ATM3\n");
  1934.         base_sos_rom = ROM_BASE_M + 0*PAGE;
  1935.         base_dos_rom = ROM_BASE_M + 1*PAGE;
  1936.         base_128_rom = ROM_BASE_M + 2*PAGE;
  1937.         base_sys_rom = ROM_BASE_M + 3*PAGE;
  1938.     break;
  1939.  
  1940.     case MM_ATM450:
  1941.     case MM_PROFI:
  1942.         //printf("MM_ATM450 MM_PROFI\n");
  1943.         base_sys_rom = ROM_BASE_M + 0*PAGE;
  1944.         base_dos_rom = ROM_BASE_M + 1*PAGE;
  1945.         base_128_rom = ROM_BASE_M + 2*PAGE;
  1946.         base_sos_rom = ROM_BASE_M + 3*PAGE;
  1947.     break;
  1948.  
  1949.     case MM_PLUS3:
  1950.         //printf("MM_PLUS3\n");
  1951.         base_128_rom = ROM_BASE_M + 0*PAGE;
  1952.         base_sys_rom = ROM_BASE_M + 1*PAGE;
  1953.         base_dos_rom = ROM_BASE_M + 2*PAGE;
  1954.         base_sos_rom = ROM_BASE_M + 3*PAGE;
  1955.     break;
  1956.  
  1957.     case MM_QUORUM:
  1958.         //printf("MM_QUORUM\n");
  1959.         base_sys_rom = ROM_BASE_M + 0*PAGE;
  1960.         base_dos_rom = ROM_BASE_M + 1*PAGE;
  1961.         base_128_rom = ROM_BASE_M + 2*PAGE;
  1962.         base_sos_rom = ROM_BASE_M + 3*PAGE;
  1963.     break;
  1964.  
  1965. /*
  1966.     case MM_KAY:
  1967.         printf("MM_KAY\n");
  1968.         base_128_rom = ROM_BASE_M + 0*PAGE;
  1969.         base_sos_rom = ROM_BASE_M + 1*PAGE;
  1970.         base_dos_rom = ROM_BASE_M + 2*PAGE;
  1971.         base_sys_rom = ROM_BASE_M + 3*PAGE;
  1972.     break;
  1973. */
  1974.  
  1975.     default:
  1976.         //printf("default\n");
  1977.         base_128_rom = ROM_BASE_M + 0*PAGE;
  1978.         base_sos_rom = ROM_BASE_M + 1*PAGE;
  1979.         base_sys_rom = ROM_BASE_M + 2*PAGE;
  1980.         base_dos_rom = ROM_BASE_M + 3*PAGE;
  1981.     }
  1982. //-----------------------------------------------------------------------------
  1983.    unsigned romsize;
  1984.     if (conf.use_romset)
  1985.     {
  1986. // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  1987.         // использование 64К ROMSET-а или сборной солянки из ромов
  1988.         if (!load_rom(conf.sos_rom_path, base_sos_rom))
  1989.         {
  1990.                 color(CONSCLR_ERROR);
  1991.                 printf("failed to load BASIC48 ROM\n");
  1992.                 //errexit("failed to load BASIC48 ROM");
  1993.                 color(CONSCLR_DEFAULT);
  1994.                 conf.reset_rom = RM_SOS;
  1995.         }
  1996. // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  1997.         if (!load_rom(conf.zx128_rom_path, base_128_rom) && conf.reset_rom == RM_128)
  1998.         {
  1999.                 conf.reset_rom = RM_SOS;        //НЕТУ 128 PAGE
  2000.         }
  2001. // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  2002.         if (!load_rom(conf.dos_rom_path, base_dos_rom))
  2003.         {
  2004.                 conf.trdos_present = 0;         //НЕТУ DOS PAGE
  2005.         }
  2006. // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  2007.         if (!load_rom(conf.sys_rom_path, base_sys_rom) && conf.reset_rom == RM_SYS)
  2008.         {
  2009.                 conf.reset_rom = RM_SOS;        //НЕТУ SYS PAGEE
  2010.         }
  2011. // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  2012.         romsize = 64;
  2013.     }
  2014.     else
  2015.     {
  2016.         //использование цельных ПЗУ-шек под конкретную машину
  2017.         if (conf.mem_model == MM_ATM710 || conf.mem_model == MM_ATM3)
  2018.         {
  2019.             romsize = load_rom(conf.mem_model == MM_ATM710 ? conf.atm2_rom_path : conf.atm3_rom_path, ROM_BASE_M, 64);
  2020.             if (romsize != 64 && romsize != 128 && romsize != 512 && romsize != 1024)
  2021.                 errexit("invalid ROM size for ATM bios");
  2022.             unsigned char *lastpage = ROM_BASE_M + (romsize - 64) * 1024;
  2023.             base_sos_rom = lastpage + 0*PAGE;
  2024.             base_dos_rom = lastpage + 1*PAGE;
  2025.             base_128_rom = lastpage + 2*PAGE;
  2026.             base_sys_rom = lastpage + 3*PAGE;
  2027.         }
  2028.         else if (conf.mem_model == MM_PROFSCORP)
  2029.         {
  2030.             romsize = load_rom(conf.prof_rom_path, ROM_BASE_M, 16);
  2031.             if (romsize != 64 && romsize != 128 && romsize != 256)
  2032.                 errexit("invalid PROF-ROM size");
  2033.         }
  2034.         else
  2035.         {
  2036.             const char *romname = nullptr;
  2037.  
  2038.             switch(conf.mem_model)
  2039.             {
  2040.             case MM_PROFI: romname = conf.profi_rom_path; break;
  2041.             case MM_SCORP: romname = conf.scorp_rom_path; break;
  2042. //[vv]      case MM_KAY: romname = conf.kay_rom_path; break;
  2043.             case MM_ATM450: romname = conf.atm1_rom_path; break;
  2044.             case MM_PLUS3: romname = conf.plus3_rom_path; break;
  2045.             case MM_QUORUM: romname = conf.quorum_rom_path; break;
  2046.  
  2047.             default:
  2048.                 errexit("ROMSET should be defined for this memory model");
  2049.             }
  2050.  
  2051.             romsize = load_rom(romname, ROM_BASE_M, 64);
  2052.             if (romsize != 64)
  2053.                 errexit("invalid ROM filesize");
  2054.         }
  2055.     }
  2056. //-----------------------------------------------------------------------------
  2057.     if (conf.mem_model == MM_PROFSCORP)
  2058.     {
  2059.         temp.profrom_mask = 0;
  2060.         if (romsize == 128)
  2061.             temp.profrom_mask = 1;
  2062.         if (romsize == 256)
  2063.             temp.profrom_mask = 3;
  2064.  
  2065.         comp.profrom_bank &= temp.profrom_mask;
  2066.         set_scorp_profrom(0);
  2067.     }
  2068. //-----------------------------------------------------------------------------
  2069. #ifdef MOD_MONITOR
  2070.    load_labels(conf.sos_labels_path, base_sos_rom, 0x4000);
  2071. #endif
  2072. //-----------------------------------------------------------------------------
  2073.    temp.gs_ram_mask = u8((conf.gs_ramsize-1) >> 4);
  2074.    temp.ram_mask = u8((conf.ramsize-1) >> 4);
  2075.    temp.rom_mask = u8((romsize-1) >> 4);
  2076.    set_banks();
  2077.  
  2078.    for(unsigned i = 0; i < CpuMgr.GetCount(); i++)
  2079.    {
  2080.        Z80 &cpu = CpuMgr.Cpu(i);
  2081.        cpu.dbgchk = isbrk(cpu);
  2082.    }
  2083. }
  2084. //=============================================================================
  2085.  
  2086.  
  2087.  
  2088.  
  2089. //=============================================================================
  2090. void applyconfig(bool Init)
  2091. {
  2092. #ifdef MOD_GS
  2093.     init_gs(Init);
  2094. #endif
  2095.  
  2096. //   printf("%s\n", __FUNCTION__);
  2097.    //[vv] disable turbo
  2098.    comp.pEFF7 |= EFF7_GIGASCREEN;
  2099.  
  2100. //Alone Coder 0.36.4
  2101.    conf.frame = frametime;
  2102.    cpu.SetTpi(conf.frame);
  2103. /*
  2104.    if ((conf.mem_model == MM_PENTAGON)&&(comp.pEFF7 & EFF7_GIGASCREEN))
  2105.        conf.frame = 71680;
  2106. */
  2107. //~Alone Coder
  2108.    temp.ticks_frame = (unsigned)(temp.cpufq / double(conf.intfq) + 1.0);
  2109.    loadzxkeys(&conf);
  2110.    apply_memory();
  2111.  
  2112.    temp.snd_frame_ticks = (conf.sound.fq << TICK_FF) / conf.intfq;
  2113.    temp.snd_frame_samples = temp.snd_frame_ticks >> TICK_FF;
  2114.    temp.frameskip = conf.sound.enabled? conf.frameskip : conf.frameskipmax;
  2115.  
  2116.    input.firedelay = 1; // if conf.input.fire changed
  2117.    input.clear_zx();
  2118.  
  2119.    modem.open(conf.modem_port);
  2120.  
  2121.    load_atariset();
  2122.    apply_video();
  2123.    apply_sound();
  2124.  
  2125.    hdd.dev[0].configure(conf.ide+0);
  2126.    hdd.dev[1].configure(conf.ide+1);
  2127.    if (conf.atm.xt_kbd) input.atm51.clear();
  2128.  
  2129.    if(conf.gs_type == 1)        // z80gs mode
  2130.    {
  2131.        SdCard.Close();
  2132.        SdCard.Open(conf.ngs_sd_card_path);
  2133.    }
  2134.  
  2135.    if(conf.zc)
  2136.    {
  2137.        Zc.Close();
  2138.        Zc.Open(conf.zc_sd_card_path);
  2139.    }
  2140.         if(conf.wiznet){                //NEDOREPO NEW
  2141.                 comp.wiznet.p83=0;
  2142.                 comp.wiznet.p82=0;
  2143.                 comp.wiznet.p81=0;
  2144.                 Wiz5300_Close();
  2145.                 Wiz5300_Init();
  2146.         }
  2147.  
  2148.    setpal(0);
  2149. }
  2150. //=============================================================================
  2151.  
  2152.  
  2153.  
  2154.  
  2155. //=============================================================================
  2156. void load_arch(const char *fname)
  2157. {
  2158.    GetPrivateProfileString("ARC", "SkipFiles", nil, skiparc, sizeof skiparc, fname);
  2159.         //string_comment_trimmer(skiparc); //обрезка лишнего      //NS
  2160.         //printf("ARC <%s>\n",skiparc);
  2161.         //неподходит изза ";" разделителя?
  2162.    char *p; //Alone Coder 0.36.7
  2163.    for (/*char * */p = skiparc;;) {
  2164.       char *nxt = strchr(p, ';');
  2165.       if (!nxt) break;
  2166.       *nxt = 0; p = nxt+1;
  2167.    }
  2168.    p[strlen(p)+1] = 0;
  2169.  
  2170.    GetPrivateProfileSection("ARC", arcbuffer, sizeof arcbuffer, fname);
  2171.    for (char *x = arcbuffer; *x; ) {
  2172.       char *newx = x + strlen(x)+1;
  2173.       char *y = strchr(x, '=');
  2174.       if (!y) {
  2175. ignore_line:
  2176.          memcpy(x, newx, sizeof arcbuffer - size_t(newx-arcbuffer));
  2177.       } else {
  2178.          *y = 0; if (!stricmp(x, "SkipFiles")) goto ignore_line;
  2179.          x = newx;
  2180.       }
  2181.    }
  2182. }
  2183. //=============================================================================
  2184.  
  2185.  
  2186.  
  2187.  
  2188. //=============================================================================
  2189. void loadkeys(action *table)
  2190. {
  2191.    unsigned num[0x300], i = 0;
  2192.    unsigned j; //Alone Coder 0.36.7
  2193.    if (!table->name)
  2194.        return; // empty table (can't sort)
  2195.    for (action *p = table; p->name; p++, i++)
  2196.    {
  2197.       char line[0x400];
  2198.       GetPrivateProfileString("SYSTEM.KEYS", p->name, "`", line, sizeof line, ininame);
  2199.         string_comment_trimmer(line);           //обрезка лишнего //NS
  2200.         //printf("SYSTEM.KEYS <%s> -> <%s>\n",p->name,line);
  2201.  
  2202.       if (*line == '`')
  2203.       {
  2204.          errmsg("keydef for %s not found", p->name);
  2205.          load_errors = 1;
  2206. bad_key:
  2207.          p->k1 = 0xFE;
  2208.          p->k2 = 0xFF;
  2209.          p->k3 = 0xFD;
  2210.          continue;
  2211.       }
  2212.       char *s = strchr(line, ';');
  2213.       if(s)
  2214.           *s = 0;
  2215.       p->k1 = p->k2 = p->k3 = p->k4 = 0; num[i] = 0;
  2216.       for (s = line;;)
  2217.       {
  2218. //       while (*s == ' ') s++;
  2219.         //пропуск пробелов и табуляций
  2220.          while ((*s == ' ') || (*s == 0x09) ) s++;
  2221.          if (!*s)
  2222.              break;
  2223.          char *s1 = s;
  2224.          while (isalnum(*s))
  2225.              s++;
  2226.          for (j = 0; j < pckeys_count; j++)
  2227.          {
  2228.             if ((int)strlen(pckeys[j].name)==s-s1 && !strnicmp(s1, pckeys[j].name, size_t(s-s1)))
  2229.             {
  2230.                switch (num[i])
  2231.                {
  2232.                   case 0: p->k1 = pckeys[j].virtkey; break;
  2233.                   case 1: p->k2 = pckeys[j].virtkey; break;
  2234.                   case 2: p->k3 = pckeys[j].virtkey; break;
  2235.                   case 3: p->k4 = pckeys[j].virtkey; break;
  2236.                   default:
  2237.                      color(CONSCLR_ERROR);
  2238.                      printf("warning: too many keys in %s=%s\n", p->name, line);
  2239.                      load_errors = 1;
  2240.                }
  2241.                num[i]++;
  2242.                break;
  2243.             }
  2244.          }
  2245.          if (j == pckeys_count)
  2246.          {
  2247.             color(CONSCLR_ERROR);
  2248.             char x = *s; *s = 0;
  2249.             printf("bad key: %s\n", s1); *s = x;
  2250.             load_errors = 1;
  2251.          }
  2252.       }
  2253.       if (!num[i])
  2254.           goto bad_key;
  2255.    }
  2256.  
  2257.    // sort keys
  2258.    for (unsigned k = 0; k < i-1; k++)
  2259.    {
  2260.       unsigned max = k;
  2261.       for (unsigned l = k+1; l < i; l++)
  2262.          if (num[l] > num[max])
  2263.              max = l;
  2264.  
  2265.       action tmp = table[k];
  2266.       table[k] = table[max];
  2267.       table[max] = tmp;
  2268.  
  2269.       unsigned tm = num[k];
  2270.       num[k] = num[max];
  2271.       num[max] = tm;
  2272.    }
  2273. }
  2274. //=============================================================================
  2275.  
  2276.  
  2277.  
  2278.  
  2279. //=============================================================================
  2280. void loadzxkeys(CONFIG *conf)
  2281. {
  2282.    char section[0x200];
  2283.    sprintf(section, "ZX.KEYS.%s", conf->keyset);
  2284.    char line[0x300];
  2285.    char *s; //Alone Coder 0.36.7
  2286.    unsigned k; //Alone Coder 0.36.7
  2287.    zxkeymap *active_zxk = conf->input.active_zxk;
  2288.  
  2289.    for (unsigned i = 0; i < VK_MAX; i++)
  2290.    {
  2291.       inports[i].port1 = inports[i].port2 = &input.kjoy;
  2292.       inports[i].mask1 = inports[i].mask2 = 0xFF;
  2293.       for (unsigned j = 0; j < pckeys_count; j++)
  2294.       {
  2295.          if (pckeys[j].virtkey == i)
  2296.          {
  2297.             GetPrivateProfileString(section, pckeys[j].name, "", line, sizeof line, ininame);
  2298.                 string_comment_trimmer(line);           //обрезка лишнего //NS
  2299.                 //printf("ZX.KEYS <%s> => <%s>\n",pckeys[j].name,line);
  2300.             s = strtok(line, " ;");
  2301.             if(s)
  2302.             {
  2303.                for(k = 0; k < active_zxk->zxk_size; k++)
  2304.                {
  2305.                   if (!stricmp(s, active_zxk->zxk[k].name))
  2306.                   {
  2307.                      inports[i].port1 = active_zxk->zxk[k].port;
  2308.                      inports[i].mask1 = active_zxk->zxk[k].mask;
  2309.                      switch(i)
  2310.                      {
  2311.                      case DIK_CONTROL:
  2312.                          inports[DIK_LCONTROL].port1 = active_zxk->zxk[k].port;
  2313.                          inports[DIK_LCONTROL].mask1 = active_zxk->zxk[k].mask;
  2314.                          inports[DIK_RCONTROL].port1 = active_zxk->zxk[k].port;
  2315.                          inports[DIK_RCONTROL].mask1 = active_zxk->zxk[k].mask;
  2316.                      break;
  2317.  
  2318.                      case DIK_SHIFT:
  2319.                          inports[DIK_LSHIFT].port1 = active_zxk->zxk[k].port;
  2320.                          inports[DIK_LSHIFT].mask1 = active_zxk->zxk[k].mask;
  2321.                          inports[DIK_RSHIFT].port1 = active_zxk->zxk[k].port;
  2322.                          inports[DIK_RSHIFT].mask1 = active_zxk->zxk[k].mask;
  2323.                      break;
  2324.  
  2325.                      case DIK_MENU:
  2326.                          inports[DIK_LMENU].port1 = active_zxk->zxk[k].port;
  2327.                          inports[DIK_LMENU].mask1 = active_zxk->zxk[k].mask;
  2328.                          inports[DIK_RMENU].port1 = active_zxk->zxk[k].port;
  2329.                          inports[DIK_RMENU].mask1 = active_zxk->zxk[k].mask;
  2330.                      break;
  2331.                      }
  2332.                      break;
  2333.                   }
  2334.                }
  2335.             }
  2336.             s = strtok(nullptr, " ;");
  2337.             if(s)
  2338.             {
  2339.                for (k = 0; k < active_zxk->zxk_size; k++)
  2340.                {
  2341.                   if (!stricmp(s, active_zxk->zxk[k].name))
  2342.                   {
  2343.                      inports[i].port2 = active_zxk->zxk[k].port;
  2344.                      inports[i].mask2 = active_zxk->zxk[k].mask;
  2345.  
  2346.                      switch(i)
  2347.                      {
  2348.                      case DIK_CONTROL:
  2349.                          inports[DIK_LCONTROL].port2 = active_zxk->zxk[k].port;
  2350.                          inports[DIK_LCONTROL].mask2 = active_zxk->zxk[k].mask;
  2351.                          inports[DIK_RCONTROL].port2 = active_zxk->zxk[k].port;
  2352.                          inports[DIK_RCONTROL].mask2 = active_zxk->zxk[k].mask;
  2353.                      break;
  2354.  
  2355.                      case DIK_SHIFT:
  2356.                          inports[DIK_LSHIFT].port2 = active_zxk->zxk[k].port;
  2357.                          inports[DIK_LSHIFT].mask2 = active_zxk->zxk[k].mask;
  2358.                          inports[DIK_RSHIFT].port2 = active_zxk->zxk[k].port;
  2359.                          inports[DIK_RSHIFT].mask2 = active_zxk->zxk[k].mask;
  2360.                      break;
  2361.  
  2362.                      case DIK_MENU:
  2363.                          inports[DIK_LMENU].port2 = active_zxk->zxk[k].port;
  2364.                          inports[DIK_LMENU].mask2 = active_zxk->zxk[k].mask;
  2365.                          inports[DIK_RMENU].port2 = active_zxk->zxk[k].port;
  2366.                          inports[DIK_RMENU].mask2 = active_zxk->zxk[k].mask;
  2367.                      break;
  2368.                      }
  2369.                      break;
  2370.                   }
  2371.                }
  2372.             }
  2373.             break;
  2374.          }
  2375.       }
  2376.    }
  2377. }
  2378. //=============================================================================
  2379.