Subversion Repositories SvarDOS

Rev

Rev 65 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 65 Rev 67
Line 16... Line 16...
16
 
16
 
17
#include "cdrom.h"
17
#include "cdrom.h"
18
#include "input.h"
18
#include "input.h"
19
#include "video.h"
19
#include "video.h"
20
 
20
 
-
 
21
/* keyboard layouts and locales */
-
 
22
#include "keylay.h"
-
 
23
#include "keyoff.h"
21
 
24
 
22
/* color scheme (color, mono) */
25
/* color scheme (color, mono) */
23
static unsigned short COLOR_TITLEBAR[2] = {0x7000,0x7000};
26
static unsigned short COLOR_TITLEBAR[2] = {0x7000,0x7000};
24
static unsigned short COLOR_BODY[2] = {0x1700,0x0700};
27
static unsigned short COLOR_BODY[2] = {0x1700,0x0700};
25
static unsigned short COLOR_SELECT[2] = {0x7000,0x7000};
28
static unsigned short COLOR_SELECT[2] = {0x7000,0x7000};
Line 29... Line 32...
29
static int mono = 0;
32
static int mono = 0;
30
 
33
 
31
/* how much disk space does Svarog386 require (in MiB) */
34
/* how much disk space does Svarog386 require (in MiB) */
32
#define SVAROG_DISK_REQ 8
35
#define SVAROG_DISK_REQ 8
33
 
36
 
-
 
37
/* a convenience 'function' used for debugging */
-
 
38
#define DBG(x) { video_putstringfix(24, 0, 0x4F00u, x, 80); }
-
 
39
 
-
 
40
struct slocales {
-
 
41
  char lang[4];
-
 
42
  char *keybcode;
-
 
43
  unsigned int codepage;
-
 
44
  int egafile;
-
 
45
  int keybfile;
-
 
46
  int keyboff;
-
 
47
  int keyblen;
-
 
48
};
-
 
49
 
34
 
50
 
35
/* reboot the computer */
51
/* reboot the computer */
36
static void reboot(void) {
52
static void reboot(void) {
37
  void ((far *bootroutine)()) = (void (far *)()) 0xFFFF0000L;
53
  void ((far *bootroutine)()) = (void (far *)()) 0xFFFF0000L;
38
  int far *rstaddr = (int far *)0x00400072L; /* BIOS boot flag is at 0040:0072 */
54
  int far *rstaddr = (int far *)0x00400072L; /* BIOS boot flag is at 0040:0072 */
Line 75... Line 91...
75
  s = kittengets(nlsmaj, nlsmin, s);
91
  s = kittengets(nlsmaj, nlsmin, s);
76
  return(putstringwrap(y, x, attr, s));
92
  return(putstringwrap(y, x, attr, s));
77
}
93
}
78
 
94
 
79
 
95
 
80
#define LDEC(x,y) (((unsigned short)x << 8) | (unsigned short)y)
-
 
81
/* provides codepage and country files required by lang */
-
 
82
static int getnlscp(char *lang, int *egafile) {
-
 
83
  unsigned short l;
-
 
84
  l = lang[0];
-
 
85
  l <<= 8;
-
 
86
  l |= lang[1];
-
 
87
  switch (l) {
-
 
88
    case LDEC('E','N'):
-
 
89
      *egafile = 0;
-
 
90
      return(437);
-
 
91
    case LDEC('P','L'):
-
 
92
      *egafile = 10;
-
 
93
      return(991);
-
 
94
  }
-
 
95
  *egafile = 0;
-
 
96
  return(437);
-
 
97
}
-
 
98
 
-
 
99
 
-
 
100
static int menuselect(int ypos, int xpos, int height, char **list) {
96
static int menuselect(int ypos, int xpos, int height, char **list, int listlen) {
101
  int i, offset = 0, res = 0, count, width = 0;
97
  int i, offset = 0, res = 0, count, width = 0;
102
  /* count how many languages there is */
98
  /* count how many positions there is, and check their width */
103
  for (count = 0; list[count] != NULL; count++) {
99
  for (count = 0; (list[count] != NULL) && (count != listlen); count++) {
104
    int len = strlen(list[count]);
100
    int len = strlen(list[count]);
105
    if (len > width) width = len;
101
    if (len > width) width = len;
106
  }
102
  }
107
 
103
 
108
  /* if xpos negative, means 'center out' */
104
  /* if xpos negative, means 'center out' */
Line 171... Line 167...
171
  video_putstring(0, 40 - (strlen(title) >> 1), COLOR_TITLEBAR[mono], title, -1);
167
  video_putstring(0, 40 - (strlen(title) >> 1), COLOR_TITLEBAR[mono], title, -1);
172
  video_clear(COLOR_BODY[mono], 80);
168
  video_clear(COLOR_BODY[mono], 80);
173
  video_movecursor(25,0);
169
  video_movecursor(25,0);
174
}
170
}
175
 
171
 
176
static int selectlang(char *lang) {
172
static int selectlang(struct slocales *locales) {
177
  int choice;
173
  int choice, x;
178
  int x;
-
 
179
  char *msg;
174
  char *msg;
180
  char *code;
-
 
181
  char *langlist[] = {
175
  char *langlist[] = {
182
    "English\0EN",
176
    "English",
183
/*    "French\0FR",*/
177
    "French",
184
    "Polish\0PL",
178
    "Polish",
185
/*    "Turkish\0TR",*/
179
    "Turkish",
186
    NULL
180
    NULL
187
  };
181
  };
188
 
182
 
189
  newscreen();
183
  newscreen();
190
  msg = kittengets(1, 0, "Welcome to Svarog386");
184
  msg = kittengets(1, 0, "Welcome to Svarog386");
191
  x = 40 - (strlen(msg) >> 1);
185
  x = 40 - (strlen(msg) >> 1);
192
  video_putstring(4, x, COLOR_BODY[mono], msg, -1);
186
  video_putstring(4, x, COLOR_BODY[mono], msg, -1);
193
  video_putcharmulti(5, x, COLOR_BODY[mono], '=', strlen(msg), 1);
187
  video_putcharmulti(5, x, COLOR_BODY[mono], '=', strlen(msg), 1);
194
  putstringnls(8, -1, COLOR_BODY[mono], 1, 1, "Please select your language from the list below:");
188
  putstringnls(8, -1, COLOR_BODY[mono], 1, 1, "Please select your language from the list below:");
195
  choice = menuselect(11, -1, 3, langlist);
189
  choice = menuselect(11, -1, 6, langlist, -1);
196
  if (choice < 0) return(-1);
190
  if (choice < 0) return(-1);
197
  /* write short language code into lang */
191
  /* populate locales with default values */
-
 
192
  memset(locales, 0, sizeof(struct slocales));
-
 
193
  switch (choice) {
-
 
194
    case 1:
-
 
195
      strcpy(locales->lang, "FR");
-
 
196
      locales->keyboff = OFFLOC_FR;
-
 
197
      locales->keyblen = OFFLEN_FR;
-
 
198
      break;
-
 
199
    case 2:
-
 
200
      strcpy(locales->lang, "PL");
-
 
201
      locales->keyboff = OFFLOC_PL;
-
 
202
      locales->keyblen = OFFLEN_PL;
-
 
203
      break;
-
 
204
    case 3:
-
 
205
      strcpy(locales->lang, "TR");
-
 
206
      locales->keyboff = OFFLOC_TR;
-
 
207
      locales->keyblen = OFFLEN_TR;
-
 
208
      break;
-
 
209
    default:
-
 
210
      strcpy(locales->lang, "EN");
-
 
211
      locales->keyboff = 0;
-
 
212
      locales->keyblen = OFFCOUNT;
-
 
213
      break;
-
 
214
  }
-
 
215
  /* populate the slocales struct */
-
 
216
  for (msg = kblayouts[locales->keyboff]; *msg != 0; msg++); /* skip layout name */
-
 
217
  msg++;
198
  for (code = langlist[choice]; *code != 0; code++);
218
  /* skip keyb code and copy it to locales.keybcode */
199
  memcpy(lang, code + 1, 2);
219
  locales->keybcode = msg;
-
 
220
  for (; *msg != 0; msg++);
-
 
221
  /* */
-
 
222
  locales->codepage = ((unsigned short)msg[1] << 8) | msg[2];
-
 
223
  locales->egafile = msg[3];
-
 
224
  locales->keybfile = msg[4];
-
 
225
  /* */
-
 
226
  return(0);
-
 
227
}
-
 
228
 
-
 
229
 
-
 
230
#define LTODEC(x, y) ((unsigned short)(x << 8) | (y))
-
 
231
static int selectkeyb(struct slocales *locales) {
-
 
232
  int keyboff, keyblen, menuheight;
-
 
233
  unsigned short lang;
-
 
234
  lang = LTODEC(locales->lang[0], locales->lang[1]);
-
 
235
 
-
 
236
  switch (lang) {
-
 
237
    case LTODEC('F', 'R'):
-
 
238
      keyboff = OFFLOC_FR;
-
 
239
      keyblen = OFFLEN_FR;
-
 
240
      break;
-
 
241
    case LTODEC('P', 'L'):
-
 
242
      keyboff = OFFLOC_PL;
-
 
243
      keyblen = OFFLEN_PL;
-
 
244
      break;
-
 
245
    case LTODEC('T', 'R'):
-
 
246
      keyboff = OFFLOC_TR;
-
 
247
      keyblen = OFFLEN_TR;
-
 
248
      break;
-
 
249
    default: /* otherwise propose all possible keyoard layouts */
200
  lang[2] = 0;
250
      keyboff = 0;
-
 
251
      keyblen = OFFCOUNT;
-
 
252
      break;
-
 
253
  }
-
 
254
  if (keyblen == 1) return(0); /* do not ask for keyboard layout if only one is available for given language */
-
 
255
  newscreen();
-
 
256
  putstringnls(5, 1, COLOR_BODY[mono], 1, 5, "Svarog386 supports the keyboard layouts used in different countries. Choose the keyboard layout you want.");
-
 
257
  menuheight = keyblen + 2;
-
 
258
  if (menuheight > 13) menuheight = 13;
-
 
259
  if (menuselect(10, -1, menuheight, &(kblayouts[keyboff]), keyblen) < 0) return(-1);
201
  return(0);
260
  return(0);
202
}
261
}
203
 
262
 
204
 
263
 
205
/* returns 0 if installation must proceed, non-zero otherwise */
264
/* returns 0 if installation must proceed, non-zero otherwise */
Line 207... Line 266...
207
  char *choice[] = {"Install Svarog386 to disk", "Quit to DOS", NULL};
266
  char *choice[] = {"Install Svarog386 to disk", "Quit to DOS", NULL};
208
  choice[0] = kittengets(0, 1, choice[0]);
267
  choice[0] = kittengets(0, 1, choice[0]);
209
  choice[1] = kittengets(0, 2, choice[1]);
268
  choice[1] = kittengets(0, 2, choice[1]);
210
  newscreen();
269
  newscreen();
211
  putstringnls(4, 1, COLOR_BODY[mono], 2, 0, "You are about to install Svarog386: a free, MSDOS-compatible operating system based on the FreeDOS kernel. Svarog386 targets 386+ computers and comes with a variety of third-party applications.\n\nWARNING: If your PC has another operating system installed, this other system might be unable to boot once Svarog386 is installed.");
270
  putstringnls(4, 1, COLOR_BODY[mono], 2, 0, "You are about to install Svarog386: a free, MSDOS-compatible operating system based on the FreeDOS kernel. Svarog386 targets 386+ computers and comes with a variety of third-party applications.\n\nWARNING: If your PC has another operating system installed, this other system might be unable to boot once Svarog386 is installed.");
212
  return(menuselect(13, -1, 4, choice));
271
  return(menuselect(13, -1, 4, choice, -1));
213
}
272
}
214
 
273
 
215
 
274
 
216
/* returns 1 if drive is removable, 0 if not, -1 on error */
275
/* returns 1 if drive is removable, 0 if not, -1 on error */
217
static int isdriveremovable(int drv) {
276
static int isdriveremovable(int drv) {
Line 275... Line 334...
275
      list[0] = kittengets(0, 3, list[0]);
334
      list[0] = kittengets(0, 3, list[0]);
276
      list[1] = kittengets(0, 4, list[1]);
335
      list[1] = kittengets(0, 4, list[1]);
277
      list[2] = kittengets(0, 2, list[2]);
336
      list[2] = kittengets(0, 2, list[2]);
278
      snprintf(buff, sizeof(buff), kittengets(3, 0, "ERROR: Drive %c: could not be found. Perhaps your hard disk needs to be partitioned first. Please create at least one partition on your hard disk, so Svarog386 can be installed on it. Note, that Svarog386 requires at least %d MiB of available disk space.\n\nYou can use the FDISK partitioning tool for creating the required partition manually, or you can let the installer partitioning your disk automatically. You can also abort the installation to use any other partition manager of your choice."), cselecteddrive, SVAROG_DISK_REQ);
337
      snprintf(buff, sizeof(buff), kittengets(3, 0, "ERROR: Drive %c: could not be found. Perhaps your hard disk needs to be partitioned first. Please create at least one partition on your hard disk, so Svarog386 can be installed on it. Note, that Svarog386 requires at least %d MiB of available disk space.\n\nYou can use the FDISK partitioning tool for creating the required partition manually, or you can let the installer partitioning your disk automatically. You can also abort the installation to use any other partition manager of your choice."), cselecteddrive, SVAROG_DISK_REQ);
279
      putstringwrap(4, 1, COLOR_BODY[mono], buff);
338
      putstringwrap(4, 1, COLOR_BODY[mono], buff);
280
      switch (menuselect(14, -1, 5, list)) {
339
      switch (menuselect(14, -1, 5, list, -1)) {
281
        case 0:
340
        case 0:
282
          system("FDISK /AUTO");
341
          system("FDISK /AUTO");
283
          break;
342
          break;
284
        case 1:
343
        case 1:
285
          video_clear(0x0700, 0);
344
          video_clear(0x0700, 0);
Line 309... Line 368...
309
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
368
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
310
      list[0] = kittengets(0, 6, list[0]);
369
      list[0] = kittengets(0, 6, list[0]);
311
      list[1] = kittengets(0, 2, list[1]);
370
      list[1] = kittengets(0, 2, list[1]);
312
      snprintf(buff, sizeof(buff), kittengets(3, 3, "ERROR: Drive %c: seems to be unformated. Do you wish to format it?"), cselecteddrive);
371
      snprintf(buff, sizeof(buff), kittengets(3, 3, "ERROR: Drive %c: seems to be unformated. Do you wish to format it?"), cselecteddrive);
313
      video_putstring(7, 1, COLOR_BODY[mono], buff, -1);
372
      video_putstring(7, 1, COLOR_BODY[mono], buff, -1);
314
      if (menuselect(12, -1, 4, list) != 0) return(-1);
373
      if (menuselect(12, -1, 4, list, -1) != 0) return(-1);
315
      video_clear(0x0700, 0);
374
      video_clear(0x0700, 0);
316
      video_movecursor(0, 0);
375
      video_movecursor(0, 0);
317
      snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
376
      snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
318
      system(buff);
377
      system(buff);
319
      continue;
378
      continue;
Line 334... Line 393...
334
      int y = 6;
393
      int y = 6;
335
      list[0] = kittengets(0, 6, list[0]);
394
      list[0] = kittengets(0, 6, list[0]);
336
      list[1] = kittengets(0, 2, list[1]);
395
      list[1] = kittengets(0, 2, list[1]);
337
      snprintf(buff, sizeof(buff), kittengets(3, 5, "ERROR: Drive %c: is not empty. Svarog386 must be installed on an empty disk.\n\nYou can format the disk now, to make it empty. Note however, that this will ERASE ALL CURRENT DATA on your disk."), cselecteddrive);
396
      snprintf(buff, sizeof(buff), kittengets(3, 5, "ERROR: Drive %c: is not empty. Svarog386 must be installed on an empty disk.\n\nYou can format the disk now, to make it empty. Note however, that this will ERASE ALL CURRENT DATA on your disk."), cselecteddrive);
338
      y += putstringwrap(y, 1, COLOR_BODY[mono], buff);
397
      y += putstringwrap(y, 1, COLOR_BODY[mono], buff);
339
      if (menuselect(++y, -1, 4, list) != 0) return(-1);
398
      if (menuselect(++y, -1, 4, list, -1) != 0) return(-1);
340
      video_clear(0x0700, 0);
399
      video_clear(0x0700, 0);
341
      video_movecursor(0, 0);
400
      video_movecursor(0, 0);
342
      snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
401
      snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
343
      system(buff);
402
      system(buff);
344
      continue;
403
      continue;
Line 347... Line 406...
347
      char *list[] = { "Install Svarog386", "Quit to DOS", NULL};
406
      char *list[] = { "Install Svarog386", "Quit to DOS", NULL};
348
      list[0] = kittengets(0, 1, list[0]);
407
      list[0] = kittengets(0, 1, list[0]);
349
      list[1] = kittengets(0, 2, list[1]);
408
      list[1] = kittengets(0, 2, list[1]);
350
      snprintf(buff, sizeof(buff), kittengets(3, 6, "The installation of Svarog386 to %c: is about to begin."), cselecteddrive);
409
      snprintf(buff, sizeof(buff), kittengets(3, 6, "The installation of Svarog386 to %c: is about to begin."), cselecteddrive);
351
      video_putstring(7, -1, COLOR_BODY[mono], buff, -1);
410
      video_putstring(7, -1, COLOR_BODY[mono], buff, -1);
352
      if (menuselect(10, -1, 4, list) != 0) return(-1);
411
      if (menuselect(10, -1, 4, list, -1) != 0) return(-1);
353
      snprintf(buff, sizeof(buff), "SYS A: %c: > NUL", cselecteddrive);
412
      snprintf(buff, sizeof(buff), "SYS A: %c: > NUL", cselecteddrive);
354
      system(buff);
413
      system(buff);
355
      snprintf(buff, sizeof(buff), "%c:\\TEMP", cselecteddrive);
414
      snprintf(buff, sizeof(buff), "%c:\\TEMP", cselecteddrive);
356
      mkdir(buff);
415
      mkdir(buff);
357
      return(cselecteddrive);
416
      return(cselecteddrive);
Line 382... Line 441...
382
  fclose(fdd);
441
  fclose(fdd);
383
  fclose(fds);
442
  fclose(fds);
384
}
443
}
385
 
444
 
386
 
445
 
387
static void bootfilesgen(int targetdrv, char *lang, int cdromdrv) {
446
static void bootfilesgen(int targetdrv, struct slocales *locales, int cdromdrv) {
388
  char buff[128];
447
  char buff[128];
389
  int cp, egafile;
-
 
390
  FILE *fd;
448
  FILE *fd;
391
  cp = getnlscp(lang, &egafile);
-
 
392
  /*** CONFIG.SYS ***/
449
  /*** CONFIG.SYS ***/
393
  snprintf(buff, sizeof(buff), "%c:\\CONFIG.SYS", targetdrv);
450
  snprintf(buff, sizeof(buff), "%c:\\CONFIG.SYS", targetdrv);
394
  fd = fopen(buff, "wb");
451
  fd = fopen(buff, "wb");
395
  if (fd == NULL) return;
452
  if (fd == NULL) return;
396
  fprintf(fd, "DOS=UMB,HIGH\r\n");
453
  fprintf(fd, "DOS=UMB,HIGH\r\n");
Line 406... Line 463...
406
  if (fd == NULL) return;
463
  if (fd == NULL) return;
407
  fprintf(fd, "@ECHO OFF\r\n");
464
  fprintf(fd, "@ECHO OFF\r\n");
408
  fprintf(fd, "SET TEMP=%c:\\TEMP\r\n", targetdrv);
465
  fprintf(fd, "SET TEMP=%c:\\TEMP\r\n", targetdrv);
409
  fprintf(fd, "SET DOSDIR=%c:\\SYSTEM\\SVAROG.386\r\n", targetdrv);
466
  fprintf(fd, "SET DOSDIR=%c:\\SYSTEM\\SVAROG.386\r\n", targetdrv);
410
  fprintf(fd, "SET NLSPATH=%%DOSDIR%%\\NLS\r\n");
467
  fprintf(fd, "SET NLSPATH=%%DOSDIR%%\\NLS\r\n");
411
  fprintf(fd, "SET LANG=%s\r\n", lang);
468
  fprintf(fd, "SET LANG=%s\r\n", locales->lang);
412
  fprintf(fd, "SET DIRCMD=/OGNE/P/4\r\n");
469
  fprintf(fd, "SET DIRCMD=/OGNE/P/4\r\n");
413
  fprintf(fd, "SET FDNPKG.CFG=%c:\\SYSTEM\\CFG\\FDNPKG.CFG\r\n", targetdrv);
470
  fprintf(fd, "SET FDNPKG.CFG=%c:\\SYSTEM\\CFG\\FDNPKG.CFG\r\n", targetdrv);
414
  fprintf(fd, "SET WATTCP.CFG=%c:\\SYSTEM\\CFG\\WATTCP.CFG\r\n", targetdrv);
471
  fprintf(fd, "SET WATTCP.CFG=%c:\\SYSTEM\\CFG\\WATTCP.CFG\r\n", targetdrv);
415
  fprintf(fd, "PATH %%DOSDIR%%\\BIN;%c:\\SYSTEM\\LINKS\r\n", targetdrv);
472
  fprintf(fd, "PATH %%DOSDIR%%\\BIN;%c:\\SYSTEM\\LINKS\r\n", targetdrv);
416
  fprintf(fd, "PROMPT $P$G\r\n");
473
  fprintf(fd, "PROMPT $P$G\r\n");
417
  fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
474
  fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
418
  fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
475
  fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
419
  fprintf(fd, "FDAPM APMDOS\r\n");
476
  fprintf(fd, "FDAPM APMDOS\r\n");
420
  fprintf(fd, "\r\n");
477
  fprintf(fd, "\r\n");
421
  if (egafile > 0) {
478
  if (locales->egafile > 0) {
422
    fprintf(fd, "DISPLAY CON=(EGA,,1)\r\n");
479
    fprintf(fd, "DISPLAY CON=(EGA,,1)\r\n");
423
    if (egafile == 1) {
480
    if (locales->egafile == 1) {
424
      fprintf(fd, "MODE CON CP PREPARE=((%d) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA.CPX)\r\n", cp, targetdrv);
481
      fprintf(fd, "MODE CON CP PREPARE=((%u) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA.CPX)\r\n", locales->codepage, targetdrv);
425
    } else {
482
    } else {
426
      fprintf(fd, "MODE CON CP PREPARE=((%d) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA%d.CPX)\r\n", cp, targetdrv, egafile);
483
      fprintf(fd, "MODE CON CP PREPARE=((%u) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA%d.CPX)\r\n", locales->codepage, targetdrv, locales->egafile);
-
 
484
    }
-
 
485
    fprintf(fd, "MODE CON CP SELECT=%u\r\n", locales->codepage);
-
 
486
    if (locales->keybfile == 1) {
-
 
487
      fprintf(fd, "KEYB %s,%d,%c:\\SYSTEM\\SVAROG.386\\BIN\\KEYBOARD.SYS\r\n", locales->keybcode, locales->codepage, targetdrv);
-
 
488
    } else {
-
 
489
      fprintf(fd, "KEYB %s,%d,%c:\\SYSTEM\\SVAROG.386\\BIN\\KEYBRD%d.SYS\r\n", locales->keybcode, locales->codepage, targetdrv, locales->keybfile);
427
    }
490
    }
428
    fprintf(fd, "MODE CON CP SELECT=%d\r\n", cp);
-
 
429
    fprintf(fd, "\r\n");
491
    fprintf(fd, "\r\n");
430
  }
492
  }
431
  fprintf(fd, "SHSUCDX /d:SVCD0001\r\n");
493
  fprintf(fd, "SHSUCDX /d:SVCD0001\r\n");
432
  fprintf(fd, "\r\n");
494
  fprintf(fd, "\r\n");
433
  fprintf(fd, "REM Uncomment the line below for automatic mouse support\r\n");
495
  fprintf(fd, "REM Uncomment the line below for automatic mouse support\r\n");
Line 538... Line 600...
538
  input_getkey();
600
  input_getkey();
539
  reboot();
601
  reboot();
540
}
602
}
541
 
603
 
542
 
604
 
543
static void loadcp(char *lang) {
605
static void loadcp(struct slocales *locales) {
544
  int cp, egafile;
-
 
545
  char buff[64];
606
  char buff[64];
546
  cp = getnlscp(lang, &egafile);
-
 
547
  if (cp == 437) return;
607
  if (locales->codepage == 437) return;
548
  video_movecursor(1, 0);
608
  video_movecursor(1, 0);
549
  if (egafile == 1) {
609
  if (locales->egafile == 1) {
550
    snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%d) A:\\EGA.CPX) > NUL", cp);
610
    snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%u) A:\\EGA.CPX) > NUL", locales->codepage);
551
  } else {
611
  } else {
552
    snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%d) A:\\EGA%d.CPX) > NUL", cp, egafile);
612
    snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%u) A:\\EGA%d.CPX) > NUL", locales->codepage, locales->egafile);
553
  }
613
  }
554
  system(buff);
614
  system(buff);
555
  snprintf(buff, sizeof(buff), "MODE CON CP SEL=%d > NUL", cp);
615
  snprintf(buff, sizeof(buff), "MODE CON CP SEL=%u > NUL", locales->codepage);
556
  system(buff);
616
  system(buff);
557
  /* below I re-init the video controller - apparently this is required if
617
  /* below I re-init the video controller - apparently this is required if
558
   * I want the new glyph symbols to be actually applied, at least some
618
   * I want the new glyph symbols to be actually applied, at least some
559
   * (broken?) BIOSes, like VBox, apply glyphs only at next video mode change */
619
   * (broken?) BIOSes, like VBox, apply glyphs only at next video mode change */
560
  {
620
  {
Line 568... Line 628...
568
}
628
}
569
 
629
 
570
 
630
 
571
/* checks CD drive drv for the presence of the Svarog386 install CD
631
/* checks CD drive drv for the presence of the Svarog386 install CD
572
 * returns 0 if found, non-zero otherwise */
632
 * returns 0 if found, non-zero otherwise */
573
static int checkcd(char drv) {
633
/*static int checkcd(char drv) {
574
  FILE *fd;
634
  FILE *fd;
575
  char fname[32];
635
  char fname[32];
576
  snprintf(fname, sizeof(fname), "%c:\\CORE\\MEM.ZIP", drv);
636
  snprintf(fname, sizeof(fname), "%c:\\CORE\\MEM.ZIP", drv);
577
  fd = fopen(fname, "rb");
637
  fd = fopen(fname, "rb");
578
  if (fd == NULL) return(-1);
638
  if (fd == NULL) return(-1);
579
  fclose(fd);
639
  fclose(fd);
580
  return(0);
640
  return(0);
581
}
641
}*/
582
 
642
 
583
 
643
 
584
int main(void) {
644
int main(void) {
585
  char lang[4];
645
  struct slocales locales;
586
  int targetdrv;
646
  int targetdrv;
587
  int cdromdrv;
647
  int cdromdrv;
588
 
648
 
589
  /* find where the cdrom drive is */
649
  /* find where the cdrom drive is */
590
  cdromdrv = cdrom_findfirst();
650
  cdromdrv = cdrom_findfirst();
591
  if (cdromdrv < 0) {
651
  if (cdromdrv < 0) {
592
    printf("ERROR: CD-ROM DRIVE NOT FOUND\r\n");
652
    printf("ERROR: CD-ROM DRIVE NOT FOUND\r\n");
593
    return(1);
653
    return(1);
594
  }
654
  }
595
  cdromdrv += 'A'; /* convert the cdrom 'id' (A=0) to an actual drive letter */
655
  cdromdrv += 'A'; /* convert the cdrom 'id' (A=0) to an actual drive letter */
596
  if (checkcd(cdromdrv) != 0) {
656
  /*if (checkcd(cdromdrv) != 0) {
597
    printf("ERROR: SVAROG386 INSTALLATION CD NOT FOUND IN THE DRIVE.\r\n");
657
    printf("ERROR: SVAROG386 INSTALLATION CD NOT FOUND IN THE DRIVE.\r\n");
598
    return(1);
658
    return(1);
599
  }
659
  }*/
600
 
660
 
601
  /* init screen and detect mono status */
661
  /* init screen and detect mono status */
602
  mono = video_init();
662
  mono = video_init();
603
 
663
 
604
  for (;;) { /* fake loop, it's here just to break out easily */
664
  for (;;) { /* fake loop, it's here just to break out easily */
605
    kittenopen("INSTALL"); /* NLS support */
665
    kittenopen("INSTALL"); /* NLS support */
606
    if (selectlang(lang) < 0) break; /* welcome to svarog, select your language */
666
    if (selectlang(&locales) < 0) break; /* welcome to svarog, select your language */
607
    setenv("LANG", lang, 1);
667
    setenv("LANG", locales.lang, 1);
608
    loadcp(lang);
668
    loadcp(&locales);
609
    kittenclose(); /* reload NLS with new language */
669
    kittenclose(); /* reload NLS with new language */
610
    kittenopen("INSTALL"); /* NLS support */
670
    kittenopen("INSTALL"); /* NLS support */
611
    /*selectkeyb();*/ /* what keyb layout should we use? */
671
    if (selectkeyb(&locales) != 0) break;  /* what keyb layout should we use? */
612
    if (welcomescreen() != 0) break; /* what svarog386 is, ask whether to run live dos or install */
672
    if (welcomescreen() != 0) break; /* what svarog386 is, ask whether to run live dos or install */
613
    targetdrv = preparedrive(); /* what drive should we install to? check avail. space */
673
    targetdrv = preparedrive(); /* what drive should we install to? check avail. space */
614
    if (targetdrv < 0) break;
674
    if (targetdrv < 0) break;
615
    /*askaboutsources();*/ /* IF sources are available, ask if installing with them */
675
    /*askaboutsources();*/ /* IF sources are available, ask if installing with them */
616
    installpackages(targetdrv, cdromdrv);    /* install packages */
676
    installpackages(targetdrv, cdromdrv);    /* install packages */
617
    bootfilesgen(targetdrv, lang, cdromdrv); /* generate boot files and other configurations */
677
    bootfilesgen(targetdrv, &locales, cdromdrv); /* generate boot files and other configurations */
618
    /*localcfg();*/ /* show local params (currency, etc), and propose to change them (based on localcfg) */
678
    /*localcfg();*/ /* show local params (currency, etc), and propose to change them (based on localcfg) */
619
    /*netcfg();*/ /* basic networking config */
679
    /*netcfg();*/ /* basic networking config */
620
    finalreboot(); /* remove the CD and reboot */
680
    finalreboot(); /* remove the CD and reboot */
621
    break;
681
    break;
622
  }
682
  }