Subversion Repositories SvarDOS

Rev

Rev 48 | 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);
49 mv_fox 169
  putstringnls(8, -1, 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 */
49 mv_fox 216
  res = r.x.ax;  /* sectors per cluster */
217
  res *= r.x.dx; /* dx contains total clusters, bx contains free clusters */
218
  res *= r.x.cx; /* bytes per sector */
219
  res >>= 20;    /* convert bytes to MiB */
220
  return(res);
35 mv_fox 221
}
222
 
223
 
224
/* returns 0 if disk is empty, non-zero otherwise */
225
static int diskempty(int drv) {
226
  unsigned int rc;
227
  int res;
228
  char buff[8];
229
  struct find_t fileinfo;
230
  sprintf(buff, "%c:\\*.*", 'A' + drv - 1);
231
  rc = _dos_findfirst(buff, _A_NORMAL | _A_SUBDIR | _A_HIDDEN | _A_SYSTEM, &fileinfo);
232
  if (rc == 0) {
233
    res = 1; /* call successfull means disk is not empty */
28 mv_fox 234
  } else {
35 mv_fox 235
    res = 0;
28 mv_fox 236
  }
35 mv_fox 237
  /* _dos_findclose(&fileinfo); */ /* apparently required only on OS/2 */
28 mv_fox 238
  return(res);
239
}
240
 
241
 
242
static int preparedrive(void) {
33 mv_fox 243
  int driveremovable;
36 mv_fox 244
  int selecteddrive = 3; /* hardcoded to 'C:' for now */
245
  int cselecteddrive;
35 mv_fox 246
  int ds;
36 mv_fox 247
  char buff[128];
248
  cselecteddrive = 'A' + selecteddrive - 1;
28 mv_fox 249
  for (;;) {
250
    newscreen();
33 mv_fox 251
    driveremovable = isdriveremovable(selecteddrive);
252
    if (driveremovable < 0) {
49 mv_fox 253
      char *list[] = { "Create a partition automatically", "Run the FDISK partitioning tool", "Quit to DOS", NULL};
42 mv_fox 254
      list[0] = kittengets(0, 3, list[0]);
255
      list[1] = kittengets(0, 4, list[1]);
256
      list[2] = kittengets(0, 2, list[2]);
257
      sprintf(buff, kittengets(3, 0, "ERROR: Drive %c: could not be found. Perhaps your hard disk needs to be"), cselecteddrive);
258
      video_putstring(4, 2, COLOR_BODY[mono], buff);
259
      putstringnls(5, 2, COLOR_BODY[mono], 3, 1, "       partitioned first. Please create at least one partition on your");
260
      putstringnls(6, 2, COLOR_BODY[mono], 3, 2, "       hard disk, so Svarog386 can be installed on it. Note, that");
47 mv_fox 261
      sprintf(buff, kittengets(3, 3, "       Svarog386 requires at least %d MiB of available disk space."), SVAROG_DISK_REQ);
42 mv_fox 262
      video_putstring(7, 2, COLOR_BODY[mono], buff);
263
      putstringnls(9, 2, COLOR_BODY[mono], 3, 4, "You can use the FDISK partitioning tool for creating the required partition");
264
      putstringnls(10, 2, COLOR_BODY[mono], 3, 5, "manually, or you can let the installer partitioning your disk");
265
      putstringnls(11, 2, COLOR_BODY[mono], 3, 6, "automatically. You can also abort the installation to use any other");
266
      putstringnls(12, 2, COLOR_BODY[mono], 3, 7, "partition manager of your choice.");
33 mv_fox 267
      switch (menuselect(14, -1, 5, list)) {
268
        case 0:
269
          system("FDISK /AUTO");
270
          break;
271
        case 1:
272
          video_clear(0x0700, 0);
273
          video_movecursor(0, 0);
274
          system("FDISK");
275
          break;
276
        case 2:
277
          return(-1);
278
      }
28 mv_fox 279
      newscreen();
42 mv_fox 280
      putstringnls(11, 10, COLOR_BODY[mono], 3, 8, "Your computer will reboot now.");
281
      putstringnls(12, 10, COLOR_BODY[mono], 0, 5, "Press any key...");
33 mv_fox 282
      input_getkey();
28 mv_fox 283
      reboot();
284
      return(-1);
33 mv_fox 285
    } else if (driveremovable > 0) {
42 mv_fox 286
      sprintf(buff, kittengets(3, 9, "ERROR: Drive %c: is a removable device. Installation aborted."), cselecteddrive);
36 mv_fox 287
      video_putstring(9, 2, COLOR_BODY[mono], buff);
42 mv_fox 288
      putstringnls(11, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
33 mv_fox 289
      return(-1);
28 mv_fox 290
    }
33 mv_fox 291
    /* if not formatted, propose to format it right away (try to create a directory) */
36 mv_fox 292
    sprintf(buff, "%c:\\SVWRTEST.123", cselecteddrive);
293
    if (mkdir(buff) != 0) {
28 mv_fox 294
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
42 mv_fox 295
      list[0] = kittengets(0, 6, list[0]);
296
      list[1] = kittengets(0, 2, list[1]);
297
      sprintf(buff, kittengets(3, 10, "ERROR: Drive %c: seems to be unformated."), cselecteddrive);
36 mv_fox 298
      video_putstring(7, 2, COLOR_BODY[mono], buff);
42 mv_fox 299
      putstringnls(8, 2, COLOR_BODY[mono], 3, 11, "       Do you wish to format it?");
28 mv_fox 300
      if (menuselect(12, -1, 4, list) != 0) return(-1);
301
      video_clear(0x0700, 0);
302
      video_movecursor(0, 0);
42 mv_fox 303
      sprintf(buff, "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
36 mv_fox 304
      system(buff);
28 mv_fox 305
      continue;
306
    }
36 mv_fox 307
    sprintf(buff, "%c:\\SVWRTEST.123", cselecteddrive);
42 mv_fox 308
    rmdir(buff);
33 mv_fox 309
    /* check total disk space */
35 mv_fox 310
    ds = disksize(selecteddrive);
47 mv_fox 311
    if (ds < SVAROG_DISK_REQ) {
42 mv_fox 312
      sprintf(buff, kittengets(3, 12, "ERROR: Drive %c: is not big enough!"), cselecteddrive);
313
      video_putstring(9, 2, COLOR_BODY[mono], buff);
47 mv_fox 314
      sprintf(buff, kittengets(3, 13, "      Svarog386 requires a disk of at least %d MiB."), SVAROG_DISK_REQ);
42 mv_fox 315
      video_putstring(10, 2, COLOR_BODY[mono], buff);
316
      putstringnls(12, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
28 mv_fox 317
      input_getkey();
318
      return(-1);
319
    }
320
    /* is the disk empty? */
35 mv_fox 321
    if (diskempty(selecteddrive) != 0) {
28 mv_fox 322
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
42 mv_fox 323
      list[0] = kittengets(0, 6, list[0]);
324
      list[1] = kittengets(0, 2, list[1]);
325
      sprintf(buff, kittengets(3, 14, "ERROR: Drive %c: is not empty. Svarog386 must be installed on an empty disk."), cselecteddrive);
326
      video_putstring(7, 2, COLOR_BODY[mono], buff);
327
      putstringnls(8, 2, COLOR_BODY[mono], 3, 15, "       You can format the disk now, to make it empty. Note however, that");
328
      putstringnls(9, 2, COLOR_BODY[mono], 3, 16, "       this will ERASE ALL CURRENT DATA on your disk.");
28 mv_fox 329
      if (menuselect(12, -1, 4, list) != 0) return(-1);
330
      video_clear(0x0700, 0);
331
      video_movecursor(0, 0);
42 mv_fox 332
      sprintf(buff, "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
333
      system(buff);
28 mv_fox 334
      continue;
335
    } else {
336
      /* final confirmation */
337
      char *list[] = { "Install Svarog386", "Quit to DOS", NULL};
42 mv_fox 338
      list[0] = kittengets(0, 1, list[0]);
339
      list[1] = kittengets(0, 2, list[1]);
340
      sprintf(buff, kittengets(3, 17, "The installation of Svarog386 to %c: is about to begin."), cselecteddrive);
49 mv_fox 341
      video_putstring(7, -1, COLOR_BODY[mono], buff);
28 mv_fox 342
      if (menuselect(10, -1, 4, list) != 0) return(-1);
36 mv_fox 343
      sprintf(buff, "SYS A: %c:", cselecteddrive);
344
      system(buff);
345
      sprintf(buff, "%c:\\TEMP", cselecteddrive);
346
      mkdir(buff);
347
      return(cselecteddrive);
28 mv_fox 348
    }
349
  }
350
}
351
 
352
 
353
static void bootfilesgen(int targetdrv, char *lang) {
354
  char buff[128];
49 mv_fox 355
  int cp, egafile;
28 mv_fox 356
  FILE *fd;
49 mv_fox 357
  cp = getnlscp(lang, &egafile);
28 mv_fox 358
  /*** AUTOEXEC.BAT ***/
36 mv_fox 359
  sprintf(buff, "%c:\\AUTOEXEC.BAT", targetdrv);
28 mv_fox 360
  fd = fopen(buff, "wb");
361
  if (fd == NULL) return;
362
  fprintf(fd, "@ECHO OFF\r\n");
36 mv_fox 363
  fprintf(fd, "SET TEMP=%c:\\TEMP\r\n", targetdrv);
364
  fprintf(fd, "SET DOSDIR=%c:\\SYSTEM\\SVAROG.386\r\n", targetdrv);
49 mv_fox 365
  fprintf(fd, "SET NLSPATH=%%DOSDIR%%\\NLS\r\n");
28 mv_fox 366
  fprintf(fd, "SET LANG=%s\r\n", lang);
367
  fprintf(fd, "SET DIRCMD=/OGNE/P\r\n");
368
  fprintf(fd, "SET FDNPKG.CFG=%c:\\SYSTEM\\CFG\\FDNPKG.CFG\r\n");
369
  fprintf(fd, "SET WATTCP.CFG=%c:\\SYSTEM\\CFG\\WATTCP.CFG\r\n");
370
  fprintf(fd, "PATH %%DOSDIR%%\\BIN;%%DOSDIR%%\\LINKS\r\n");
371
  fprintf(fd, "PROMPT $P$G\r\n");
30 mv_fox 372
  fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
373
  fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
28 mv_fox 374
  fprintf(fd, "\r\n");
49 mv_fox 375
  if (egafile > 0) {
376
    if (egafile == 1) {
377
      fprintf(fd, "MODE CON CP PREPARE=((%d) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA.CPX)\r\n", cp, targetdrv);
378
    } else {
379
      fprintf(fd, "MODE CON CP PREPARE=((%d) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA%d.CPX)\r\n", cp, targetdrv, egafile);
380
    }
381
    fprintf(fd, "MODE CON CP SELECT=%d\r\n", cp);
382
    fprintf(fd, "\r\n");
383
  }
384
  fprintf(fd, "SHSUCDX /d:SVCD0001\r\n");
385
  fprintf(fd, "\r\n");
386
  fprintf(fd, "REM Uncomment the line below for automatic mouse support\r\n");
387
  fprintf(fd, "REM CTMOUSE\r\n");
388
  fprintf(fd, "\r\n");
389
  fprintf(fd, "ECHO.");
390
  fprintf(fd, "ECHO WELCOME TO SVAROG386! TYPE 'HELP' IF YOU NEED HELP.\r\n");
28 mv_fox 391
  fclose(fd);
392
  /*** CONFIG.SYS ***/
36 mv_fox 393
  sprintf(buff, "%c:\\CONFIG.SYS", targetdrv);
28 mv_fox 394
  fd = fopen(buff, "wb");
395
  if (fd == NULL) return;
396
  fprintf(fd, "DOS=UMB,HIGH\r\n");
397
  fprintf(fd, "FILES=50\r\n");
49 mv_fox 398
  fprintf(fd, "DEVICE=%c:\\SYSTEM\\SVAROG.386\\BIN\\HIMEMX.EXE\r\n", targetdrv);
399
  fprintf(fd, "SHELLHIGH=%c:\\SYSTEM\\SVAROG.386\\BIN\\COMMAND.COM /E:512 /P\r\n", targetdrv);
36 mv_fox 400
  fprintf(fd, "REM COUNTRY=001,437,%c:\\SYSTEM\\SVAROG.386\r\n", targetdrv);
49 mv_fox 401
  fprintf(fd, "DEVICE=%c:\\SYSTEM\\DRIVERS\\UDVD2\\UDVD2.SYS /D:SVCD0001 /H\r\n", targetdrv);
28 mv_fox 402
  fclose(fd);
403
}
404
 
405
 
46 mv_fox 406
static void installpackages(int targetdrv) {
28 mv_fox 407
  char *pkglist[] = {
408
    "APPEND",
409
    "ASSIGN",
410
    "ATTRIB",
411
    "CHKDSK",
412
    "CHOICE",
413
    "COMMAND",
414
    "COMP",
415
    "CPIDOS",
416
    "CTMOUSE",
417
    "DEBUG",
418
    "DEFRAG",
419
    "DELTREE",
420
    "DEVLOAD",
421
    "DISKCOMP",
422
    "DISKCOPY",
423
    "DISPLAY",
424
    "DOSFSCK",
425
    "EDIT",
426
    "EDLIN",
427
    "EXE2BIN",
428
    "FC",
429
    "FDAPM",
430
    "FDISK",
431
    "FDNPKG",
432
    "FIND",
433
    "FORMAT",
434
    "HELP",
435
    "HIMEMX",
436
    "KERNEL",
437
    "KEYB",
438
    "LABEL",
439
    "LBACACHE",
440
    "MEM",
441
    "MIRROR",
442
    "MODE",
443
    "MORE",
444
    "MOVE",
445
    "NANSI",
446
    "NLSFUNC",
447
    "PRINT",
448
    "RDISK",
449
    "RECOVER",
450
    "REPLACE",
451
    "SHARE",
452
    "SHSUCDX",
453
    "SORT",
454
    "SWSUBST",
455
    "TREE",
456
    "UNDELETE",
457
    "XCOPY",
458
    NULL
459
  };
30 mv_fox 460
  int i, pkglistlen;
46 mv_fox 461
  char buff[64];
28 mv_fox 462
  newscreen();
30 mv_fox 463
  /* count how long the pkg list is */
464
  for (pkglistlen = 0; pkglist[pkglistlen] != NULL; pkglistlen++);
46 mv_fox 465
  /* set DOSDIR and friends */
466
  snprintf(buff, sizeof(buff), "%c:\\SYSTEM\\SVAROG.386", targetdrv);
467
  setenv("DOSDIR", buff, 1);
468
  snprintf(buff, sizeof(buff), "%c:\\TEMP", targetdrv);
469
  setenv("TEMP", buff, 1);
30 mv_fox 470
  /* install packages */
28 mv_fox 471
  for (i = 0; pkglist[i] != NULL; i++) {
36 mv_fox 472
    char buff[128];
42 mv_fox 473
    snprintf(buff, sizeof(buff), kittengets(4, 0, "Installing package %d/%d: %s"), i+1, pkglistlen, pkglist[i]);
36 mv_fox 474
    strcat(buff, "       ");
30 mv_fox 475
    video_putstring(10, 2, COLOR_BODY[mono], buff);
49 mv_fox 476
    sprintf(buff, "FDINST INSTALL X:\\CORE\\%s.ZIP > NUL", pkglist[i]);
28 mv_fox 477
    system(buff);
478
  }
479
}
480
 
481
 
42 mv_fox 482
static void finalreboot(void) {
483
  newscreen();
49 mv_fox 484
  putstringnls(9, 2, COLOR_BODY[mono], 5, 0, "Svarog386 installation is over. Your computer will reboot now.");
485
  putstringnls(10, 2, COLOR_BODY[mono], 5, 1, "Please remove the installation disk from your drive.");
486
  putstringnls(12, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
42 mv_fox 487
  input_getkey();
488
  reboot();
489
}
490
 
491
 
492
static void loadcp(char *lang) {
493
  int cp, egafile;
494
  char buff[64];
495
  cp = getnlscp(lang, &egafile);
496
  if (cp == 437) return;
497
  video_movecursor(1, 0);
498
  if (egafile == 1) {
499
    sprintf(buff, "MODE CON CP PREP=((%d) A:\\EGA.CPX)", cp);
500
  } else {
501
    sprintf(buff, "MODE CON CP PREP=((%d) A:\\EGA%d.CPX)", cp, egafile);
502
  }
503
  system(buff);
504
  sprintf(buff, "MODE CON CP SEL=%d", cp);
505
  system(buff);
506
  /* below I re-init the video controller - apparently this is required if
507
   * I want the new glyph symbols to be actually applied */
508
  {
509
  union REGS r;
510
  r.h.ah = 0x0F; /* get current video mode */
511
  int86(0x10, &r, &r); /* r.h.al contains the current video mode now */
512
  r.h.ah = 0; /* set video mode (to whatever is set in AL) */
513
  int86(0x10, &r, &r);
514
  }
515
}
516
 
517
 
28 mv_fox 518
int main(void) {
519
  char lang[4];
520
  int targetdrv;
521
 
29 mv_fox 522
  /* init screen and detect mono status */
523
  mono = video_init();
524
 
28 mv_fox 525
  for (;;) { /* fake loop, it's here just to break out easily */
526
    if (selectlang(lang) < 0) break; /* welcome to svarog, select your language */
42 mv_fox 527
    setenv("LANG", lang, 1);
528
    loadcp(lang);
529
    kittenopen("INSTALL"); /* NLS support */
30 mv_fox 530
    /*selectkeyb();*/ /* what keyb layout should we use? */
28 mv_fox 531
    if (welcomescreen() != 0) break; /* what svarog386 is, ask whether to run live dos or install */
532
    targetdrv = preparedrive(); /* what drive should we install to? check avail. space */
533
    if (targetdrv < 0) break;
534
    /*askaboutsources();*/ /* IF sources are available, ask if installing with them */
46 mv_fox 535
    installpackages(targetdrv);   /* install packages */
28 mv_fox 536
    bootfilesgen(targetdrv, lang); /* generate simple boot files */
537
    /*localcfg();*/ /* show local params (currency, etc), and propose to change them (based on localcfg) */
42 mv_fox 538
    /*netcfg();*/ /* basic networking config */
539
    /* TODO compute a customized FDNPKG file that looks either to local CD or net */
28 mv_fox 540
    finalreboot(); /* remove the CD and reboot */
541
    break;
542
  }
42 mv_fox 543
  kittenclose(); /* close NLS support */
28 mv_fox 544
  video_clear(0x0700, 0);
545
  video_movecursor(0, 0);
546
  return(0);
547
}