Subversion Repositories SvarDOS

Rev

Rev 46 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
28 mv_fox 1
/*
2
 * SVAROG386 INSTALL
3
 * COPYRIGHT (C) 2016 MATEUSZ VISTE
42 mv_fox 4
 *
5
 * http://svarog386.sf.net
28 mv_fox 6
 */
7
 
8
#include <dos.h>
30 mv_fox 9
#include <direct.h>  /* mkdir() */
28 mv_fox 10
#include <stdio.h>   /* printf() and friends */
11
#include <stdlib.h>  /* system() */
12
#include <string.h>  /* memcpy() */
13
#include <unistd.h>
42 mv_fox 14
 
15
#include "kitten\kitten.h"
16
 
28 mv_fox 17
#include "input.h"
18
#include "video.h"
19
 
42 mv_fox 20
 
29 mv_fox 21
/* color scheme (color, mono) */
22
static unsigned short COLOR_TITLEBAR[2] = {0x7000,0x7000};
23
static unsigned short COLOR_BODY[2] = {0x1700,0x0700};
24
static unsigned short COLOR_SELECT[2] = {0x7000,0x7000};
25
static unsigned short COLOR_SELECTCUR[2] = {0x1F00,0x0700};
28 mv_fox 26
 
29 mv_fox 27
/* mono flag */
28
static int mono = 0;
28 mv_fox 29
 
47 mv_fox 30
/* how much disk space does Svarog386 require (in MiB) */
31
#define SVAROG_DISK_REQ 8
28 mv_fox 32
 
47 mv_fox 33
 
28 mv_fox 34
/* reboot the computer */
35
static void reboot(void) {
36
  void ((far *bootroutine)()) = (void (far *)()) 0xFFFF0000L;
37
  int far *rstaddr = (int far *)0x00400072L; /* BIOS boot flag is at 0040:0072 */
38
  *rstaddr = 0x1234; /* 0x1234 = warm boot, 0 = cold boot */
39
  (*bootroutine)(); /* jump to the BIOS reboot routine at FFFF:0000 */
40
}
41
 
42 mv_fox 42
 
43
/* an NLS wrapper around video_putstring() */
44
static void putstringnls(int y, int x, unsigned short attr, int nlsmaj, int nlsmin, char *s) {
45
  s = kittengets(nlsmaj, nlsmin, s);
46
  video_putstring(y, x, attr, s);
47
}
48
 
49
 
50
#define LDEC(x,y) (((unsigned short)x << 8) | (unsigned short)y)
51
/* provides codepage and country files required by lang */
52
static int getnlscp(char *lang, int *egafile) {
53
  unsigned short l;
54
  l = lang[0];
55
  l <<= 8;
56
  l |= lang[1];
57
  switch (l) {
58
    case LDEC('E','N'):
59
      *egafile = 0;
60
      return(437);
61
    case LDEC('P','L'):
62
      *egafile = 10;
63
      return(991);
64
  }
65
  *egafile = 0;
66
  return(437);
67
}
68
 
69
 
28 mv_fox 70
static int menuselect(int ypos, int xpos, int height, char **list) {
71
  int i, offset = 0, res = 0, count, width = 0;
72
  /* count how many languages there is */
73
  for (count = 0; list[count] != NULL; count++) {
74
    int len = strlen(list[count]);
75
    if (len > width) width = len;
76
  }
77
 
78
  /* if xpos negative, means 'center out' */
79
  if (xpos < 0) xpos = 39 - (width >> 1);
80
 
29 mv_fox 81
  video_putchar(ypos, xpos+width+2, COLOR_SELECT[mono], 0xBF);         /*       \ */
82
  video_putchar(ypos, xpos-1, COLOR_SELECT[mono], 0xDA);               /*  /      */
83
  video_putchar(ypos+height-1, xpos-1, COLOR_SELECT[mono], 0xC0);      /*  \      */
84
  video_putchar(ypos+height-1, xpos+width+2, COLOR_SELECT[mono], 0xD9);/*      /  */
85
  video_putcharmulti(ypos, xpos, COLOR_SELECT[mono], 0xC4, width + 2, 1);
86
  video_putcharmulti(ypos+height-1, xpos, COLOR_SELECT[mono], 0xC4, width + 2, 1);
87
  video_putcharmulti(ypos+1, xpos-1, COLOR_SELECT[mono], 0xB3, height - 2, 80);
88
  video_putcharmulti(ypos+1, xpos+width+2, COLOR_SELECT[mono], 0xB3, height - 2, 80);
28 mv_fox 89
 
90
  for (;;) {
91
    int key;
92
    /* list of selectable items */
93
    for (i = 0; i < height - 2; i++) {
94
      if (i + offset == res) {
29 mv_fox 95
        video_putchar(ypos + 1 + i, xpos, COLOR_SELECTCUR[mono], 16);
96
        video_putchar(ypos + 1 + i, xpos+width+1, COLOR_SELECTCUR[mono], 17);
28 mv_fox 97
        video_movecursor(ypos + 1 + i, xpos);
29 mv_fox 98
        video_putstringfix(ypos + 1 + i, xpos+1, COLOR_SELECTCUR[mono], list[i + offset], width);
28 mv_fox 99
      } else if (i + offset < count) {
29 mv_fox 100
        video_putchar(ypos + 1 + i, xpos, COLOR_SELECT[mono], ' ');
101
        video_putchar(ypos + 1 + i, xpos+width+1, COLOR_SELECT[mono], ' ');
102
        video_putstringfix(ypos + 1 + i, xpos+1, COLOR_SELECT[mono], list[i + offset], width);
28 mv_fox 103
      } else {
29 mv_fox 104
        video_putcharmulti(ypos + 1 + i, xpos, COLOR_SELECT[mono], ' ', width+2, 1);
28 mv_fox 105
      }
106
    }
107
    key = input_getkey();
108
    if (key == 0x0D) { /* ENTER */
109
      return(res);
110
    } else if (key == 0x148) { /* up */
33 mv_fox 111
      if (res > 0) {
112
        res--;
113
        if (res < offset) offset = res;
114
      }
28 mv_fox 115
    } else if (key == 0x150) { /* down */
33 mv_fox 116
      if (res+1 < count) {
117
        res++;
118
        if (res > offset + height - 3) offset = res - (height - 3);
119
      }
120
    } else if (key == 0x147) { /* home */
121
      res = 0;
122
      offset = 0;
123
    } else if (key == 0x14F) { /* end */
124
      res = count - 1;
125
      if (res > offset + height - 3) offset = res - (height - 3);
28 mv_fox 126
    } else if (key == 0x1B) {  /* ESC */
127
      return(-1);
33 mv_fox 128
    } else {
129
      char buf[8];
130
      sprintf(buf, "0x%02X ", key);
131
      video_putstring(1, 0, COLOR_BODY[mono], buf);
28 mv_fox 132
    }
133
  }
134
}
135
 
136
static void newscreen(void) {
137
  int x;
42 mv_fox 138
  char *title;
139
  title = kittengets(0, 0, "SVAROG386 INSTALLATION");
29 mv_fox 140
  for (x = 0; x < 80; x++) video_putchar(0, x, COLOR_TITLEBAR[mono], ' ');
42 mv_fox 141
  video_putstring(0, 40 - (strlen(title) >> 1), COLOR_TITLEBAR[mono], title);
29 mv_fox 142
  video_clear(COLOR_BODY[mono], 80);
36 mv_fox 143
  video_movecursor(25,0);
28 mv_fox 144
}
145
 
146
static int selectlang(char *lang) {
147
  int choice;
42 mv_fox 148
  int x;
149
  char *msg;
28 mv_fox 150
  char *code;
151
  char *langlist[] = {
152
    "English\0EN",
153
    "French\0FR",
154
    "German\0DE",
155
    "Italian\0IT",
156
    "Polish\0PL",
157
    "Russian\0RU",
158
    "Slovenian\0SL",
159
    "Spanish\0ES",
160
    "Turkish\0TR",
161
    NULL
162
  };
163
 
164
  newscreen();
42 mv_fox 165
  msg = kittengets(1, 0, "Welcome to Svarog386");
166
  x = 40 - (strlen(msg) >> 1);
167
  video_putstring(4, x, COLOR_BODY[mono], msg);
168
  video_putcharmulti(5, x, COLOR_BODY[mono], '=', strlen(msg), 1);
169
  putstringnls(8, 2, COLOR_BODY[mono], 1, 1, "Please select your language from the list below:");
36 mv_fox 170
  choice = menuselect(10, -1, 12, langlist);
28 mv_fox 171
  if (choice < 0) return(-1);
172
  /* write short language code into lang */
173
  for (code = langlist[choice]; *code != 0; code++);
174
  memcpy(lang, code + 1, 2);
175
  lang[2] = 0;
176
  return(0);
177
}
178
 
179
 
180
/* returns 0 if installation must proceed, non-zero otherwise */
181
static int welcomescreen(void) {
182
  char *choice[] = {"Install Svarog386 to disk", "Quit to DOS", NULL};
42 mv_fox 183
  choice[0] = kittengets(0, 1, choice[0]);
184
  choice[1] = kittengets(0, 2, choice[1]);
28 mv_fox 185
  newscreen();
42 mv_fox 186
  putstringnls(4, 1, COLOR_BODY[mono], 2, 0, "You are about to install Svarog386: a free, MSDOS-compatible operating system");
187
  putstringnls(5, 1, COLOR_BODY[mono], 2, 1, "based on the FreeDOS kernel. Svarog386 targets 386+ computers and comes with a");
188
  putstringnls(6, 1, COLOR_BODY[mono], 2, 2, "variety of third-party applications.");
189
  putstringnls(8, 1, COLOR_BODY[mono], 2, 3, "WARNING: If your PC has another operating system installed, this other system");
190
  putstringnls(9, 1, COLOR_BODY[mono], 2, 4, "         might be unable to boot once Svarog386 is installed.");
191
  return(menuselect(13, -1, 4, choice));
28 mv_fox 192
}
193
 
194
 
33 mv_fox 195
/* returns 1 if drive is removable, 0 if not, -1 on error */
196
static int isdriveremovable(int drv) {
28 mv_fox 197
  union REGS r;
33 mv_fox 198
  r.x.ax = 0x4408;
199
  r.h.bl = drv;
28 mv_fox 200
  int86(0x21, &r, &r);
33 mv_fox 201
  /* CF set on error, AX set to 0 if removable, 1 if fixed */
202
  if (r.x.cflag != 0) return(-1);
203
  if (r.x.ax == 0) return(1);
204
  return(0);
28 mv_fox 205
}
206
 
207
 
35 mv_fox 208
/* returns total disk space of drive drv (in MiB, max 2048), or -1 if drive invalid */
209
static int disksize(int drv) {
28 mv_fox 210
  long res;
211
  union REGS r;
212
  r.h.ah = 0x36; /* DOS 2+ get free disk space */
213
  r.h.dl = drv;
214
  int86(0x21, &r, &r);
215
  if (r.x.ax == 0xffffu) return(-1); /* AX set to FFFFh if drive invalid */
216
  res = r.x.ax;
217
  res *= r.x.bx;
218
  res *= r.x.cx;
35 mv_fox 219
  return(res >> 20); /* return result after converting bytes to MiB */
220
}
221
 
222
 
223
/* returns 0 if disk is empty, non-zero otherwise */
224
static int diskempty(int drv) {
225
  unsigned int rc;
226
  int res;
227
  char buff[8];
228
  struct find_t fileinfo;
229
  sprintf(buff, "%c:\\*.*", 'A' + drv - 1);
230
  rc = _dos_findfirst(buff, _A_NORMAL | _A_SUBDIR | _A_HIDDEN | _A_SYSTEM, &fileinfo);
231
  if (rc == 0) {
232
    res = 1; /* call successfull means disk is not empty */
28 mv_fox 233
  } else {
35 mv_fox 234
    res = 0;
28 mv_fox 235
  }
35 mv_fox 236
  /* _dos_findclose(&fileinfo); */ /* apparently required only on OS/2 */
28 mv_fox 237
  return(res);
238
}
239
 
240
 
241
static int preparedrive(void) {
33 mv_fox 242
  int driveremovable;
36 mv_fox 243
  int selecteddrive = 3; /* hardcoded to 'C:' for now */
244
  int cselecteddrive;
35 mv_fox 245
  int ds;
36 mv_fox 246
  char buff[128];
247
  cselecteddrive = 'A' + selecteddrive - 1;
28 mv_fox 248
  for (;;) {
249
    newscreen();
33 mv_fox 250
    driveremovable = isdriveremovable(selecteddrive);
251
    if (driveremovable < 0) {
34 mv_fox 252
      char *list[] = { "Create an automatic partition", "Run the FDISK partitioning tool", "Quit to DOS", NULL};
42 mv_fox 253
      list[0] = kittengets(0, 3, list[0]);
254
      list[1] = kittengets(0, 4, list[1]);
255
      list[2] = kittengets(0, 2, list[2]);
256
      sprintf(buff, kittengets(3, 0, "ERROR: Drive %c: could not be found. Perhaps your hard disk needs to be"), cselecteddrive);
257
      video_putstring(4, 2, COLOR_BODY[mono], buff);
258
      putstringnls(5, 2, COLOR_BODY[mono], 3, 1, "       partitioned first. Please create at least one partition on your");
259
      putstringnls(6, 2, COLOR_BODY[mono], 3, 2, "       hard disk, so Svarog386 can be installed on it. Note, that");
47 mv_fox 260
      sprintf(buff, kittengets(3, 3, "       Svarog386 requires at least %d MiB of available disk space."), SVAROG_DISK_REQ);
42 mv_fox 261
      video_putstring(7, 2, COLOR_BODY[mono], buff);
262
      putstringnls(9, 2, COLOR_BODY[mono], 3, 4, "You can use the FDISK partitioning tool for creating the required partition");
263
      putstringnls(10, 2, COLOR_BODY[mono], 3, 5, "manually, or you can let the installer partitioning your disk");
264
      putstringnls(11, 2, COLOR_BODY[mono], 3, 6, "automatically. You can also abort the installation to use any other");
265
      putstringnls(12, 2, COLOR_BODY[mono], 3, 7, "partition manager of your choice.");
33 mv_fox 266
      switch (menuselect(14, -1, 5, list)) {
267
        case 0:
268
          system("FDISK /AUTO");
269
          break;
270
        case 1:
271
          video_clear(0x0700, 0);
272
          video_movecursor(0, 0);
273
          system("FDISK");
274
          break;
275
        case 2:
276
          return(-1);
277
      }
28 mv_fox 278
      newscreen();
42 mv_fox 279
      putstringnls(11, 10, COLOR_BODY[mono], 3, 8, "Your computer will reboot now.");
280
      putstringnls(12, 10, COLOR_BODY[mono], 0, 5, "Press any key...");
33 mv_fox 281
      input_getkey();
28 mv_fox 282
      reboot();
283
      return(-1);
33 mv_fox 284
    } else if (driveremovable > 0) {
42 mv_fox 285
      sprintf(buff, kittengets(3, 9, "ERROR: Drive %c: is a removable device. Installation aborted."), cselecteddrive);
36 mv_fox 286
      video_putstring(9, 2, COLOR_BODY[mono], buff);
42 mv_fox 287
      putstringnls(11, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
33 mv_fox 288
      return(-1);
28 mv_fox 289
    }
33 mv_fox 290
    /* if not formatted, propose to format it right away (try to create a directory) */
36 mv_fox 291
    sprintf(buff, "%c:\\SVWRTEST.123", cselecteddrive);
292
    if (mkdir(buff) != 0) {
28 mv_fox 293
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
42 mv_fox 294
      list[0] = kittengets(0, 6, list[0]);
295
      list[1] = kittengets(0, 2, list[1]);
296
      sprintf(buff, kittengets(3, 10, "ERROR: Drive %c: seems to be unformated."), cselecteddrive);
36 mv_fox 297
      video_putstring(7, 2, COLOR_BODY[mono], buff);
42 mv_fox 298
      putstringnls(8, 2, COLOR_BODY[mono], 3, 11, "       Do you wish to format it?");
28 mv_fox 299
      if (menuselect(12, -1, 4, list) != 0) return(-1);
300
      video_clear(0x0700, 0);
301
      video_movecursor(0, 0);
42 mv_fox 302
      sprintf(buff, "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
36 mv_fox 303
      system(buff);
28 mv_fox 304
      continue;
305
    }
36 mv_fox 306
    sprintf(buff, "%c:\\SVWRTEST.123", cselecteddrive);
42 mv_fox 307
    rmdir(buff);
33 mv_fox 308
    /* check total disk space */
35 mv_fox 309
    ds = disksize(selecteddrive);
47 mv_fox 310
    if (ds < SVAROG_DISK_REQ) {
42 mv_fox 311
      sprintf(buff, kittengets(3, 12, "ERROR: Drive %c: is not big enough!"), cselecteddrive);
312
      video_putstring(9, 2, COLOR_BODY[mono], buff);
47 mv_fox 313
      sprintf(buff, kittengets(3, 13, "      Svarog386 requires a disk of at least %d MiB."), SVAROG_DISK_REQ);
42 mv_fox 314
      video_putstring(10, 2, COLOR_BODY[mono], buff);
315
      putstringnls(12, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
28 mv_fox 316
      input_getkey();
317
      return(-1);
318
    }
319
    /* is the disk empty? */
35 mv_fox 320
    if (diskempty(selecteddrive) != 0) {
28 mv_fox 321
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
42 mv_fox 322
      list[0] = kittengets(0, 6, list[0]);
323
      list[1] = kittengets(0, 2, list[1]);
324
      sprintf(buff, kittengets(3, 14, "ERROR: Drive %c: is not empty. Svarog386 must be installed on an empty disk."), cselecteddrive);
325
      video_putstring(7, 2, COLOR_BODY[mono], buff);
326
      putstringnls(8, 2, COLOR_BODY[mono], 3, 15, "       You can format the disk now, to make it empty. Note however, that");
327
      putstringnls(9, 2, COLOR_BODY[mono], 3, 16, "       this will ERASE ALL CURRENT DATA on your disk.");
28 mv_fox 328
      if (menuselect(12, -1, 4, list) != 0) return(-1);
329
      video_clear(0x0700, 0);
330
      video_movecursor(0, 0);
42 mv_fox 331
      sprintf(buff, "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
332
      system(buff);
28 mv_fox 333
      continue;
334
    } else {
335
      /* final confirmation */
336
      char *list[] = { "Install Svarog386", "Quit to DOS", NULL};
42 mv_fox 337
      list[0] = kittengets(0, 1, list[0]);
338
      list[1] = kittengets(0, 2, list[1]);
339
      sprintf(buff, kittengets(3, 17, "The installation of Svarog386 to %c: is about to begin."), cselecteddrive);
36 mv_fox 340
      video_putstring(7, 2, COLOR_BODY[mono], buff);
28 mv_fox 341
      if (menuselect(10, -1, 4, list) != 0) return(-1);
36 mv_fox 342
      sprintf(buff, "SYS A: %c:", cselecteddrive);
343
      system(buff);
344
      sprintf(buff, "%c:\\TEMP", cselecteddrive);
345
      mkdir(buff);
346
      return(cselecteddrive);
28 mv_fox 347
    }
348
  }
349
}
350
 
351
 
352
static void bootfilesgen(int targetdrv, char *lang) {
353
  char buff[128];
354
  FILE *fd;
355
  /*** AUTOEXEC.BAT ***/
36 mv_fox 356
  sprintf(buff, "%c:\\AUTOEXEC.BAT", targetdrv);
28 mv_fox 357
  fd = fopen(buff, "wb");
358
  if (fd == NULL) return;
359
  fprintf(fd, "@ECHO OFF\r\n");
36 mv_fox 360
  fprintf(fd, "SET TEMP=%c:\\TEMP\r\n", targetdrv);
361
  fprintf(fd, "SET DOSDIR=%c:\\SYSTEM\\SVAROG.386\r\n", targetdrv);
362
  fprintf(fd, "SET NLSPATH=%%DOSDIR%%\\NLS\r\n", targetdrv);
28 mv_fox 363
  fprintf(fd, "SET LANG=%s\r\n", lang);
364
  fprintf(fd, "SET DIRCMD=/OGNE/P\r\n");
365
  fprintf(fd, "SET FDNPKG.CFG=%c:\\SYSTEM\\CFG\\FDNPKG.CFG\r\n");
366
  fprintf(fd, "SET WATTCP.CFG=%c:\\SYSTEM\\CFG\\WATTCP.CFG\r\n");
367
  fprintf(fd, "PATH %%DOSDIR%%\\BIN;%%DOSDIR%%\\LINKS\r\n");
368
  fprintf(fd, "PROMPT $P$G\r\n");
30 mv_fox 369
  fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
370
  fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
28 mv_fox 371
  fprintf(fd, "\r\n\r\n");
42 mv_fox 372
  fprintf(fd, "MODE CON CP PREPARE=((991) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA10.CPX)\r\n");
28 mv_fox 373
  fprintf(fd, "MODE CON CP SELECT=991\r\n");
374
  fprintf(fd, "\r\n");
375
  fprintf(fd, "SHSUCDX /d:FDCD0001\r\n");
376
  fclose(fd);
377
  /*** CONFIG.SYS ***/
36 mv_fox 378
  sprintf(buff, "%c:\\CONFIG.SYS", targetdrv);
28 mv_fox 379
  fd = fopen(buff, "wb");
380
  if (fd == NULL) return;
381
  fprintf(fd, "DOS=UMB,HIGH\r\n");
382
  fprintf(fd, "FILES=50\r\n");
36 mv_fox 383
  fprintf(fd, "DEVICE=%c:\\SYSTEM\\SVAROG.386\\BIN\\HIMEM.EXE\r\n", targetdrv);
384
  fprintf(fd, "SHELLHIGH=%c:\\SYSTEM\\SVAROG.386\\BIN\\COMMAND.COM /E:512", targetdrv);
385
  fprintf(fd, "REM COUNTRY=001,437,%c:\\SYSTEM\\SVAROG.386\r\n", targetdrv);
386
  fprintf(fd, "DEVICE=%c:\\SYSTEM\\SVAROG.386\\BIN\\CDROM.SYS /D:FDCD0001\r\n", targetdrv);
28 mv_fox 387
  fclose(fd);
388
}
389
 
390
 
46 mv_fox 391
static void installpackages(int targetdrv) {
28 mv_fox 392
  char *pkglist[] = {
393
    "APPEND",
394
    "ASSIGN",
395
    "ATTRIB",
396
    "CHKDSK",
397
    "CHOICE",
398
    "COMMAND",
399
    "COMP",
400
    "CPIDOS",
401
    "CTMOUSE",
402
    "DEBUG",
403
    "DEFRAG",
404
    "DELTREE",
405
    "DEVLOAD",
406
    "DISKCOMP",
407
    "DISKCOPY",
408
    "DISPLAY",
409
    "DOSFSCK",
410
    "EDIT",
411
    "EDLIN",
412
    "EXE2BIN",
413
    "FC",
414
    "FDAPM",
415
    "FDISK",
416
    "FDNPKG",
417
    "FIND",
418
    "FORMAT",
419
    "HELP",
420
    "HIMEMX",
421
    "KERNEL",
422
    "KEYB",
423
    "LABEL",
424
    "LBACACHE",
425
    "MEM",
426
    "MIRROR",
427
    "MODE",
428
    "MORE",
429
    "MOVE",
430
    "NANSI",
431
    "NLSFUNC",
432
    "PRINT",
433
    "RDISK",
434
    "RECOVER",
435
    "REPLACE",
436
    "SHARE",
437
    "SHSUCDX",
438
    "SORT",
439
    "SWSUBST",
440
    "TREE",
441
    "UNDELETE",
442
    "XCOPY",
443
    NULL
444
  };
30 mv_fox 445
  int i, pkglistlen;
46 mv_fox 446
  char buff[64];
28 mv_fox 447
  newscreen();
30 mv_fox 448
  /* count how long the pkg list is */
449
  for (pkglistlen = 0; pkglist[pkglistlen] != NULL; pkglistlen++);
46 mv_fox 450
  /* set DOSDIR and friends */
451
  snprintf(buff, sizeof(buff), "%c:\\SYSTEM\\SVAROG.386", targetdrv);
452
  setenv("DOSDIR", buff, 1);
453
  snprintf(buff, sizeof(buff), "%c:\\TEMP", targetdrv);
454
  setenv("TEMP", buff, 1);
30 mv_fox 455
  /* install packages */
28 mv_fox 456
  for (i = 0; pkglist[i] != NULL; i++) {
36 mv_fox 457
    char buff[128];
42 mv_fox 458
    snprintf(buff, sizeof(buff), kittengets(4, 0, "Installing package %d/%d: %s"), i+1, pkglistlen, pkglist[i]);
36 mv_fox 459
    strcat(buff, "       ");
30 mv_fox 460
    video_putstring(10, 2, COLOR_BODY[mono], buff);
46 mv_fox 461
    sprintf(buff, "FDINST INSTALL X:\\BASE\\%s.ZIP > NUL", pkglist[i]);
28 mv_fox 462
    system(buff);
463
  }
464
}
465
 
466
 
42 mv_fox 467
static void finalreboot(void) {
468
  newscreen();
469
  putstringnls(10, 2, COLOR_BODY[mono], 5, 0, "Svarog386 installation is over. Your computer will reboot now.");
470
  putstringnls(11, 2, COLOR_BODY[mono], 5, 1, "Please remove the installation disk from your drive.");
471
  putstringnls(13, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
472
  input_getkey();
473
  reboot();
474
}
475
 
476
 
477
static void loadcp(char *lang) {
478
  int cp, egafile;
479
  char buff[64];
480
  cp = getnlscp(lang, &egafile);
481
  if (cp == 437) return;
482
  video_movecursor(1, 0);
483
  if (egafile == 1) {
484
    sprintf(buff, "MODE CON CP PREP=((%d) A:\\EGA.CPX)", cp);
485
  } else {
486
    sprintf(buff, "MODE CON CP PREP=((%d) A:\\EGA%d.CPX)", cp, egafile);
487
  }
488
  system(buff);
489
  sprintf(buff, "MODE CON CP SEL=%d", cp);
490
  system(buff);
491
  /* below I re-init the video controller - apparently this is required if
492
   * I want the new glyph symbols to be actually applied */
493
  {
494
  union REGS r;
495
  r.h.ah = 0x0F; /* get current video mode */
496
  int86(0x10, &r, &r); /* r.h.al contains the current video mode now */
497
  r.h.ah = 0; /* set video mode (to whatever is set in AL) */
498
  int86(0x10, &r, &r);
499
  }
500
}
501
 
502
 
28 mv_fox 503
int main(void) {
504
  char lang[4];
505
  int targetdrv;
506
 
29 mv_fox 507
  /* init screen and detect mono status */
508
  mono = video_init();
509
 
28 mv_fox 510
  for (;;) { /* fake loop, it's here just to break out easily */
511
    if (selectlang(lang) < 0) break; /* welcome to svarog, select your language */
42 mv_fox 512
    setenv("LANG", lang, 1);
513
    loadcp(lang);
514
    kittenopen("INSTALL"); /* NLS support */
30 mv_fox 515
    /*selectkeyb();*/ /* what keyb layout should we use? */
28 mv_fox 516
    if (welcomescreen() != 0) break; /* what svarog386 is, ask whether to run live dos or install */
517
    targetdrv = preparedrive(); /* what drive should we install to? check avail. space */
518
    if (targetdrv < 0) break;
519
    /*askaboutsources();*/ /* IF sources are available, ask if installing with them */
46 mv_fox 520
    installpackages(targetdrv);   /* install packages */
28 mv_fox 521
    bootfilesgen(targetdrv, lang); /* generate simple boot files */
522
    /*localcfg();*/ /* show local params (currency, etc), and propose to change them (based on localcfg) */
42 mv_fox 523
    /*netcfg();*/ /* basic networking config */
524
    /* TODO compute a customized FDNPKG file that looks either to local CD or net */
28 mv_fox 525
    finalreboot(); /* remove the CD and reboot */
526
    break;
527
  }
42 mv_fox 528
  kittenclose(); /* close NLS support */
28 mv_fox 529
  video_clear(0x0700, 0);
530
  video_movecursor(0, 0);
531
  return(0);
532
}