Subversion Repositories SvarDOS

Rev

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

Rev 36 Rev 42
Line 1... Line 1...
1
/*
1
/*
2
 * SVAROG386 INSTALL
2
 * SVAROG386 INSTALL
3
 * COPYRIGHT (C) 2016 MATEUSZ VISTE
3
 * COPYRIGHT (C) 2016 MATEUSZ VISTE
-
 
4
 *
-
 
5
 * http://svarog386.sf.net
4
 */
6
 */
5
 
7
 
6
#include <dos.h>
8
#include <dos.h>
7
#include <direct.h>  /* mkdir() */
9
#include <direct.h>  /* mkdir() */
8
#include <stdio.h>   /* printf() and friends */
10
#include <stdio.h>   /* printf() and friends */
9
#include <stdlib.h>  /* system() */
11
#include <stdlib.h>  /* system() */
10
#include <string.h>  /* memcpy() */
12
#include <string.h>  /* memcpy() */
11
#include <unistd.h>
13
#include <unistd.h>
-
 
14
 
-
 
15
#include "kitten\kitten.h"
-
 
16
 
12
#include "input.h"
17
#include "input.h"
13
#include "video.h"
18
#include "video.h"
14
 
19
 
-
 
20
 
15
/* color scheme (color, mono) */
21
/* color scheme (color, mono) */
16
static unsigned short COLOR_TITLEBAR[2] = {0x7000,0x7000};
22
static unsigned short COLOR_TITLEBAR[2] = {0x7000,0x7000};
17
static unsigned short COLOR_BODY[2] = {0x1700,0x0700};
23
static unsigned short COLOR_BODY[2] = {0x1700,0x0700};
18
static unsigned short COLOR_SELECT[2] = {0x7000,0x7000};
24
static unsigned short COLOR_SELECT[2] = {0x7000,0x7000};
19
static unsigned short COLOR_SELECTCUR[2] = {0x1F00,0x0700};
25
static unsigned short COLOR_SELECTCUR[2] = {0x1F00,0x0700};
Line 28... Line 34...
28
  int far *rstaddr = (int far *)0x00400072L; /* BIOS boot flag is at 0040:0072 */
34
  int far *rstaddr = (int far *)0x00400072L; /* BIOS boot flag is at 0040:0072 */
29
  *rstaddr = 0x1234; /* 0x1234 = warm boot, 0 = cold boot */
35
  *rstaddr = 0x1234; /* 0x1234 = warm boot, 0 = cold boot */
30
  (*bootroutine)(); /* jump to the BIOS reboot routine at FFFF:0000 */
36
  (*bootroutine)(); /* jump to the BIOS reboot routine at FFFF:0000 */
31
}
37
}
32
 
38
 
-
 
39
 
-
 
40
/* an NLS wrapper around video_putstring() */
-
 
41
static void putstringnls(int y, int x, unsigned short attr, int nlsmaj, int nlsmin, char *s) {
-
 
42
  s = kittengets(nlsmaj, nlsmin, s);
-
 
43
  video_putstring(y, x, attr, s);
-
 
44
}
-
 
45
 
-
 
46
 
-
 
47
#define LDEC(x,y) (((unsigned short)x << 8) | (unsigned short)y)
-
 
48
/* provides codepage and country files required by lang */
-
 
49
static int getnlscp(char *lang, int *egafile) {
-
 
50
  unsigned short l;
-
 
51
  l = lang[0];
-
 
52
  l <<= 8;
-
 
53
  l |= lang[1];
-
 
54
  switch (l) {
-
 
55
    case LDEC('E','N'):
-
 
56
      *egafile = 0;
-
 
57
      return(437);
-
 
58
    case LDEC('P','L'):
-
 
59
      *egafile = 10;
-
 
60
      return(991);
-
 
61
  }
-
 
62
  *egafile = 0;
-
 
63
  return(437);
-
 
64
}
-
 
65
 
-
 
66
 
33
static int menuselect(int ypos, int xpos, int height, char **list) {
67
static int menuselect(int ypos, int xpos, int height, char **list) {
34
  int i, offset = 0, res = 0, count, width = 0;
68
  int i, offset = 0, res = 0, count, width = 0;
35
  /* count how many languages there is */
69
  /* count how many languages there is */
36
  for (count = 0; list[count] != NULL; count++) {
70
  for (count = 0; list[count] != NULL; count++) {
37
    int len = strlen(list[count]);
71
    int len = strlen(list[count]);
Line 96... Line 130...
96
  }
130
  }
97
}
131
}
98
 
132
 
99
static void newscreen(void) {
133
static void newscreen(void) {
100
  int x;
134
  int x;
-
 
135
  char *title;
-
 
136
  title = kittengets(0, 0, "SVAROG386 INSTALLATION");
101
  for (x = 0; x < 80; x++) video_putchar(0, x, COLOR_TITLEBAR[mono], ' ');
137
  for (x = 0; x < 80; x++) video_putchar(0, x, COLOR_TITLEBAR[mono], ' ');
-
 
138
  video_putstring(0, 40 - (strlen(title) >> 1), COLOR_TITLEBAR[mono], title);
102
  video_clear(COLOR_BODY[mono], 80);
139
  video_clear(COLOR_BODY[mono], 80);
103
  video_putstring(0, 29, COLOR_TITLEBAR[mono], "SVAROG386 INSTALLATION");
-
 
104
  video_movecursor(25,0);
140
  video_movecursor(25,0);
105
}
141
}
106
 
142
 
107
 
-
 
108
static int selectlang(char *lang) {
143
static int selectlang(char *lang) {
109
  int choice;
144
  int choice;
-
 
145
  int x;
-
 
146
  char *msg;
110
  char *code;
147
  char *code;
111
  char *langlist[] = {
148
  char *langlist[] = {
112
    "English\0EN",
149
    "English\0EN",
113
    "French\0FR",
150
    "French\0FR",
114
    "German\0DE",
151
    "German\0DE",
Line 120... Line 157...
120
    "Turkish\0TR",
157
    "Turkish\0TR",
121
    NULL
158
    NULL
122
  };
159
  };
123
 
160
 
124
  newscreen();
161
  newscreen();
-
 
162
  msg = kittengets(1, 0, "Welcome to Svarog386");
-
 
163
  x = 40 - (strlen(msg) >> 1);
125
  video_putstring(4, 30, COLOR_BODY[mono], "Welcome to Svarog386");
164
  video_putstring(4, x, COLOR_BODY[mono], msg);
126
  video_putstring(5, 30, COLOR_BODY[mono], "====================");
165
  video_putcharmulti(5, x, COLOR_BODY[mono], '=', strlen(msg), 1);
127
  video_putstring(8, 2, COLOR_BODY[mono], "Please select your language from the list below:");
166
  putstringnls(8, 2, COLOR_BODY[mono], 1, 1, "Please select your language from the list below:");
128
  choice = menuselect(10, -1, 12, langlist);
167
  choice = menuselect(10, -1, 12, langlist);
129
  if (choice < 0) return(-1);
168
  if (choice < 0) return(-1);
130
  /* write short language code into lang */
169
  /* write short language code into lang */
131
  for (code = langlist[choice]; *code != 0; code++);
170
  for (code = langlist[choice]; *code != 0; code++);
132
  memcpy(lang, code + 1, 2);
171
  memcpy(lang, code + 1, 2);
Line 136... Line 175...
136
 
175
 
137
 
176
 
138
/* returns 0 if installation must proceed, non-zero otherwise */
177
/* returns 0 if installation must proceed, non-zero otherwise */
139
static int welcomescreen(void) {
178
static int welcomescreen(void) {
140
  char *choice[] = {"Install Svarog386 to disk", "Quit to DOS", NULL};
179
  char *choice[] = {"Install Svarog386 to disk", "Quit to DOS", NULL};
-
 
180
  choice[0] = kittengets(0, 1, choice[0]);
-
 
181
  choice[1] = kittengets(0, 2, choice[1]);
141
  newscreen();
182
  newscreen();
142
  video_putstring(4, 1, COLOR_BODY[mono], "You are about to install Svarog386: a free, MSDOS-compatible operating system");
183
  putstringnls(4, 1, COLOR_BODY[mono], 2, 0, "You are about to install Svarog386: a free, MSDOS-compatible operating system");
143
  video_putstring(5, 1, COLOR_BODY[mono], "based on the FreeDOS kernel. Svarog386 targets 386+ computers and comes with a");
184
  putstringnls(5, 1, COLOR_BODY[mono], 2, 1, "based on the FreeDOS kernel. Svarog386 targets 386+ computers and comes with a");
144
  video_putstring(6, 1, COLOR_BODY[mono], "variety of third-party applications.");
185
  putstringnls(6, 1, COLOR_BODY[mono], 2, 2, "variety of third-party applications.");
145
  video_putstring(8, 1, COLOR_BODY[mono], "WARNING: If your PC has another operating system installed, this other system");
186
  putstringnls(8, 1, COLOR_BODY[mono], 2, 3, "WARNING: If your PC has another operating system installed, this other system");
146
  video_putstring(9, 1, COLOR_BODY[mono], "         might be unable to boot once Svarog386 is installed.");
187
  putstringnls(9, 1, COLOR_BODY[mono], 2, 4, "         might be unable to boot once Svarog386 is installed.");
147
  return(menuselect(14, -1, 4, choice));
188
  return(menuselect(13, -1, 4, choice));
148
}
189
}
149
 
190
 
150
 
191
 
151
/* returns 1 if drive is removable, 0 if not, -1 on error */
192
/* returns 1 if drive is removable, 0 if not, -1 on error */
152
static int isdriveremovable(int drv) {
193
static int isdriveremovable(int drv) {
Line 204... Line 245...
204
  for (;;) {
245
  for (;;) {
205
    newscreen();
246
    newscreen();
206
    driveremovable = isdriveremovable(selecteddrive);
247
    driveremovable = isdriveremovable(selecteddrive);
207
    if (driveremovable < 0) {
248
    if (driveremovable < 0) {
208
      char *list[] = { "Create an automatic partition", "Run the FDISK partitioning tool", "Quit to DOS", NULL};
249
      char *list[] = { "Create an automatic partition", "Run the FDISK partitioning tool", "Quit to DOS", NULL};
-
 
250
      list[0] = kittengets(0, 3, list[0]);
-
 
251
      list[1] = kittengets(0, 4, list[1]);
-
 
252
      list[2] = kittengets(0, 2, list[2]);
209
      video_putstring(4, 2, COLOR_BODY[mono], "ERROR: Drive C: could not be found. Perhaps your hard disk needs to be");
253
      sprintf(buff, kittengets(3, 0, "ERROR: Drive %c: could not be found. Perhaps your hard disk needs to be"), cselecteddrive);
-
 
254
      video_putstring(4, 2, COLOR_BODY[mono], buff);
210
      video_putstring(5, 2, COLOR_BODY[mono], "       partitioned first. Please create at least one partition on your");
255
      putstringnls(5, 2, COLOR_BODY[mono], 3, 1, "       partitioned first. Please create at least one partition on your");
211
      video_putstring(6, 2, COLOR_BODY[mono], "       hard disk, so Svarog386 can be installed on it. Note, that");
256
      putstringnls(6, 2, COLOR_BODY[mono], 3, 2, "       hard disk, so Svarog386 can be installed on it. Note, that");
212
      video_putstring(7, 2, COLOR_BODY[mono], "       Svarog386 requires at least 16 MiB of available disk space.");
257
      sprintf(buff, kittengets(3, 3, "       Svarog386 requires at least %d MiB of available disk space."), 16);
-
 
258
      video_putstring(7, 2, COLOR_BODY[mono], buff);
213
      video_putstring(9, 2, COLOR_BODY[mono], "You can use the FDISK partitioning tool for creating the required partition");
259
      putstringnls(9, 2, COLOR_BODY[mono], 3, 4, "You can use the FDISK partitioning tool for creating the required partition");
214
      video_putstring(10, 2, COLOR_BODY[mono], "manually, or you can let the installer partitioning your disk");
260
      putstringnls(10, 2, COLOR_BODY[mono], 3, 5, "manually, or you can let the installer partitioning your disk");
215
      video_putstring(11, 2, COLOR_BODY[mono], "automatically. You can also abort the installation to use any other");
261
      putstringnls(11, 2, COLOR_BODY[mono], 3, 6, "automatically. You can also abort the installation to use any other");
216
      video_putstring(12, 2, COLOR_BODY[mono], "partition manager of your choice.");
262
      putstringnls(12, 2, COLOR_BODY[mono], 3, 7, "partition manager of your choice.");
217
      switch (menuselect(14, -1, 5, list)) {
263
      switch (menuselect(14, -1, 5, list)) {
218
        case 0:
264
        case 0:
219
          system("FDISK /AUTO");
265
          system("FDISK /AUTO");
220
          break;
266
          break;
221
        case 1:
267
        case 1:
Line 225... Line 271...
225
          break;
271
          break;
226
        case 2:
272
        case 2:
227
          return(-1);
273
          return(-1);
228
      }
274
      }
229
      newscreen();
275
      newscreen();
230
      video_putstring(11, 10, COLOR_BODY[mono], "Your computer will reboot now. Press any key.");
276
      putstringnls(11, 10, COLOR_BODY[mono], 3, 8, "Your computer will reboot now.");
-
 
277
      putstringnls(12, 10, COLOR_BODY[mono], 0, 5, "Press any key...");
231
      input_getkey();
278
      input_getkey();
232
      reboot();
279
      reboot();
233
      return(-1);
280
      return(-1);
234
    } else if (driveremovable > 0) {
281
    } else if (driveremovable > 0) {
235
      sprintf(buff, "ERROR: Drive %c: appears to be a removable device.");
282
      sprintf(buff, kittengets(3, 9, "ERROR: Drive %c: is a removable device. Installation aborted."), cselecteddrive);
236
      video_putstring(9, 2, COLOR_BODY[mono], buff);
283
      video_putstring(9, 2, COLOR_BODY[mono], buff);
237
      video_putstring(11, 2, COLOR_BODY[mono], "Installation aborted. Press any key.");
284
      putstringnls(11, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
238
      return(-1);
285
      return(-1);
239
    }
286
    }
240
    /* if not formatted, propose to format it right away (try to create a directory) */
287
    /* if not formatted, propose to format it right away (try to create a directory) */
241
    sprintf(buff, "%c:\\SVWRTEST.123", cselecteddrive);
288
    sprintf(buff, "%c:\\SVWRTEST.123", cselecteddrive);
242
    if (mkdir(buff) != 0) {
289
    if (mkdir(buff) != 0) {
243
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
290
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
-
 
291
      list[0] = kittengets(0, 6, list[0]);
-
 
292
      list[1] = kittengets(0, 2, list[1]);
244
      sprintf(buff, "ERROR: Drive %c: seems to be unformated.", cselecteddrive);
293
      sprintf(buff, kittengets(3, 10, "ERROR: Drive %c: seems to be unformated."), cselecteddrive);
245
      video_putstring(7, 2, COLOR_BODY[mono], buff);
294
      video_putstring(7, 2, COLOR_BODY[mono], buff);
246
      video_putstring(8, 2, COLOR_BODY[mono], "       Do you wish to format it?");
295
      putstringnls(8, 2, COLOR_BODY[mono], 3, 11, "       Do you wish to format it?");
247
      if (menuselect(12, -1, 4, list) != 0) return(-1);
296
      if (menuselect(12, -1, 4, list) != 0) return(-1);
248
      video_clear(0x0700, 0);
297
      video_clear(0x0700, 0);
249
      video_movecursor(0, 0);
298
      video_movecursor(0, 0);
250
      sprintf(buff, "FORMAT %c: /Q /U /V:SVAROG386", cselecteddrive);
299
      sprintf(buff, "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
251
      system(buff);
300
      system(buff);
252
      continue;
301
      continue;
253
    }
302
    }
254
    sprintf(buff, "%c:\\SVWRTEST.123", cselecteddrive);
303
    sprintf(buff, "%c:\\SVWRTEST.123", cselecteddrive);
255
    rmdir("C:\\SVWRTEST.123");
304
    rmdir(buff);
256
    /* check total disk space */
305
    /* check total disk space */
257
    ds = disksize(selecteddrive);
306
    ds = disksize(selecteddrive);
258
    if (ds < 16) {
307
    if (ds < 16) {
-
 
308
      sprintf(buff, kittengets(3, 12, "ERROR: Drive %c: is not big enough!"), cselecteddrive);
259
      video_putstring(9, 2, COLOR_BODY[mono], "ERROR: Drive C: is not big enough!");
309
      video_putstring(9, 2, COLOR_BODY[mono], buff);
260
      video_putstring(10, 2, COLOR_BODY[mono], "      Svarog386 requires a disk of at least 16 MiB.");
310
      sprintf(buff, kittengets(3, 13, "      Svarog386 requires a disk of at least %d MiB."), 16);
-
 
311
      video_putstring(10, 2, COLOR_BODY[mono], buff);
261
      video_putstring(12, 2, COLOR_BODY[mono], "Press any key to return to DOS.");
312
      putstringnls(12, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
262
      input_getkey();
313
      input_getkey();
263
      return(-1);
314
      return(-1);
264
    }
315
    }
265
    /* is the disk empty? */
316
    /* is the disk empty? */
266
    if (diskempty(selecteddrive) != 0) {
317
    if (diskempty(selecteddrive) != 0) {
267
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
318
      char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
-
 
319
      list[0] = kittengets(0, 6, list[0]);
-
 
320
      list[1] = kittengets(0, 2, list[1]);
268
      video_putstring(7, 2, COLOR_BODY[mono], "ERROR: Drive C: is not empty. Svarog386 must be installed on an empty disk.");
321
      sprintf(buff, kittengets(3, 14, "ERROR: Drive %c: is not empty. Svarog386 must be installed on an empty disk."), cselecteddrive);
-
 
322
      video_putstring(7, 2, COLOR_BODY[mono], buff);
269
      video_putstring(8, 2, COLOR_BODY[mono], "       You can format the disk now, to make it empty. Note however, that");
323
      putstringnls(8, 2, COLOR_BODY[mono], 3, 15, "       You can format the disk now, to make it empty. Note however, that");
270
      video_putstring(9, 2, COLOR_BODY[mono], "       this will ERASE ALL CURRENT DATA on your disk.");
324
      putstringnls(9, 2, COLOR_BODY[mono], 3, 16, "       this will ERASE ALL CURRENT DATA on your disk.");
271
      if (menuselect(12, -1, 4, list) != 0) return(-1);
325
      if (menuselect(12, -1, 4, list) != 0) return(-1);
272
      video_clear(0x0700, 0);
326
      video_clear(0x0700, 0);
273
      video_movecursor(0, 0);
327
      video_movecursor(0, 0);
274
      system("FORMAT C: /Q /U /V:SVAROG386");
328
      sprintf(buff, "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
-
 
329
      system(buff);
275
      continue;
330
      continue;
276
    } else {
331
    } else {
277
      /* final confirmation */
332
      /* final confirmation */
278
      char *list[] = { "Install Svarog386", "Quit to DOS", NULL};
333
      char *list[] = { "Install Svarog386", "Quit to DOS", NULL};
-
 
334
      list[0] = kittengets(0, 1, list[0]);
-
 
335
      list[1] = kittengets(0, 2, list[1]);
279
      sprintf(buff, "The installation of Svarog386 to your %c: disk is about to begin.", cselecteddrive);
336
      sprintf(buff, kittengets(3, 17, "The installation of Svarog386 to %c: is about to begin."), cselecteddrive);
280
      video_putstring(7, 2, COLOR_BODY[mono], buff);
337
      video_putstring(7, 2, COLOR_BODY[mono], buff);
281
      if (menuselect(10, -1, 4, list) != 0) return(-1);
338
      if (menuselect(10, -1, 4, list) != 0) return(-1);
282
      sprintf(buff, "SYS A: %c:", cselecteddrive);
339
      sprintf(buff, "SYS A: %c:", cselecteddrive);
283
      system(buff);
340
      system(buff);
284
      sprintf(buff, "%c:\\TEMP", cselecteddrive);
341
      sprintf(buff, "%c:\\TEMP", cselecteddrive);
Line 287... Line 344...
287
    }
344
    }
288
  }
345
  }
289
}
346
}
290
 
347
 
291
 
348
 
292
static void finalreboot(void) {
-
 
293
  newscreen();
-
 
294
  video_putstring(10, 2, COLOR_BODY[mono], "Svarog386 installation is over. Please remove the installation");
-
 
295
  video_putstring(11, 2, COLOR_BODY[mono], "diskette and/or CD from the drive.");
-
 
296
  video_putstring(13, 2, COLOR_BODY[mono], "Press any key to reboot...");
-
 
297
  input_getkey();
-
 
298
  reboot();
-
 
299
}
-
 
300
 
-
 
301
 
-
 
302
static void bootfilesgen(int targetdrv, char *lang) {
349
static void bootfilesgen(int targetdrv, char *lang) {
303
  char buff[128];
350
  char buff[128];
304
  FILE *fd;
351
  FILE *fd;
305
  /*** AUTOEXEC.BAT ***/
352
  /*** AUTOEXEC.BAT ***/
306
  sprintf(buff, "%c:\\AUTOEXEC.BAT", targetdrv);
353
  sprintf(buff, "%c:\\AUTOEXEC.BAT", targetdrv);
Line 317... Line 364...
317
  fprintf(fd, "PATH %%DOSDIR%%\\BIN;%%DOSDIR%%\\LINKS\r\n");
364
  fprintf(fd, "PATH %%DOSDIR%%\\BIN;%%DOSDIR%%\\LINKS\r\n");
318
  fprintf(fd, "PROMPT $P$G\r\n");
365
  fprintf(fd, "PROMPT $P$G\r\n");
319
  fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
366
  fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
320
  fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
367
  fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
321
  fprintf(fd, "\r\n\r\n");
368
  fprintf(fd, "\r\n\r\n");
322
  fprintf(fd, "MODE CON CP PREPARE=((991) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA10.CPX\r\n");
369
  fprintf(fd, "MODE CON CP PREPARE=((991) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA10.CPX)\r\n");
323
  fprintf(fd, "MODE CON CP SELECT=991\r\n");
370
  fprintf(fd, "MODE CON CP SELECT=991\r\n");
324
  fprintf(fd, "\r\n");
371
  fprintf(fd, "\r\n");
325
  fprintf(fd, "SHSUCDX /d:FDCD0001\r\n");
372
  fprintf(fd, "SHSUCDX /d:FDCD0001\r\n");
326
  fclose(fd);
373
  fclose(fd);
327
  /*** CONFIG.SYS ***/
374
  /*** CONFIG.SYS ***/
Line 397... Line 444...
397
  /* count how long the pkg list is */
444
  /* count how long the pkg list is */
398
  for (pkglistlen = 0; pkglist[pkglistlen] != NULL; pkglistlen++);
445
  for (pkglistlen = 0; pkglist[pkglistlen] != NULL; pkglistlen++);
399
  /* install packages */
446
  /* install packages */
400
  for (i = 0; pkglist[i] != NULL; i++) {
447
  for (i = 0; pkglist[i] != NULL; i++) {
401
    char buff[128];
448
    char buff[128];
402
    sprintf(buff, "Installing package %d/%d: %s", i+1, pkglistlen, pkglist[i]);
449
    snprintf(buff, sizeof(buff), kittengets(4, 0, "Installing package %d/%d: %s"), i+1, pkglistlen, pkglist[i]);
403
    strcat(buff, "       ");
450
    strcat(buff, "       ");
404
    video_putstring(10, 2, COLOR_BODY[mono], buff);
451
    video_putstring(10, 2, COLOR_BODY[mono], buff);
405
    sprintf(buff, "FDNPKG INSTALL %s > NUL");
452
    sprintf(buff, "FDNPKG INSTALL %s > NUL");
406
    system(buff);
453
    system(buff);
407
  }
454
  }
408
}
455
}
409
 
456
 
410
 
457
 
-
 
458
static void finalreboot(void) {
-
 
459
  newscreen();
-
 
460
  putstringnls(10, 2, COLOR_BODY[mono], 5, 0, "Svarog386 installation is over. Your computer will reboot now.");
-
 
461
  putstringnls(11, 2, COLOR_BODY[mono], 5, 1, "Please remove the installation disk from your drive.");
-
 
462
  putstringnls(13, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
-
 
463
  input_getkey();
-
 
464
  reboot();
-
 
465
}
-
 
466
 
-
 
467
 
-
 
468
static void loadcp(char *lang) {
-
 
469
  int cp, egafile;
-
 
470
  char buff[64];
-
 
471
  cp = getnlscp(lang, &egafile);
-
 
472
  if (cp == 437) return;
-
 
473
  video_movecursor(1, 0);
-
 
474
  if (egafile == 1) {
-
 
475
    sprintf(buff, "MODE CON CP PREP=((%d) A:\\EGA.CPX)", cp);
-
 
476
  } else {
-
 
477
    sprintf(buff, "MODE CON CP PREP=((%d) A:\\EGA%d.CPX)", cp, egafile);
-
 
478
  }
-
 
479
  system(buff);
-
 
480
  sprintf(buff, "MODE CON CP SEL=%d", cp);
-
 
481
  system(buff);
-
 
482
  /* below I re-init the video controller - apparently this is required if
-
 
483
   * I want the new glyph symbols to be actually applied */
-
 
484
  {
-
 
485
  union REGS r;
-
 
486
  r.h.ah = 0x0F; /* get current video mode */
-
 
487
  int86(0x10, &r, &r); /* r.h.al contains the current video mode now */
-
 
488
  r.h.ah = 0; /* set video mode (to whatever is set in AL) */
-
 
489
  int86(0x10, &r, &r);
-
 
490
  }
-
 
491
}
-
 
492
 
-
 
493
 
411
int main(void) {
494
int main(void) {
412
  char lang[4];
495
  char lang[4];
413
  int targetdrv;
496
  int targetdrv;
414
 
497
 
415
  /* init screen and detect mono status */
498
  /* init screen and detect mono status */
416
  mono = video_init();
499
  mono = video_init();
417
 
500
 
418
  for (;;) { /* fake loop, it's here just to break out easily */
501
  for (;;) { /* fake loop, it's here just to break out easily */
419
    if (selectlang(lang) < 0) break; /* welcome to svarog, select your language */
502
    if (selectlang(lang) < 0) break; /* welcome to svarog, select your language */
-
 
503
    setenv("LANG", lang, 1);
-
 
504
    loadcp(lang);
-
 
505
    kittenopen("INSTALL"); /* NLS support */
420
    /*selectkeyb();*/ /* what keyb layout should we use? */
506
    /*selectkeyb();*/ /* what keyb layout should we use? */
421
    if (welcomescreen() != 0) break; /* what svarog386 is, ask whether to run live dos or install */
507
    if (welcomescreen() != 0) break; /* what svarog386 is, ask whether to run live dos or install */
422
    targetdrv = preparedrive(); /* what drive should we install to? check avail. space */
508
    targetdrv = preparedrive(); /* what drive should we install to? check avail. space */
423
    if (targetdrv < 0) break;
509
    if (targetdrv < 0) break;
424
    /*askaboutsources();*/ /* IF sources are available, ask if installing with them */
510
    /*askaboutsources();*/ /* IF sources are available, ask if installing with them */
425
    installpackages();   /* install packages */
511
    installpackages();   /* install packages */
426
    bootfilesgen(targetdrv, lang); /* generate simple boot files */
512
    bootfilesgen(targetdrv, lang); /* generate simple boot files */
427
    /*localcfg();*/ /* show local params (currency, etc), and propose to change them (based on localcfg) */
513
    /*localcfg();*/ /* show local params (currency, etc), and propose to change them (based on localcfg) */
428
    /*netcfg();*/ /* basic networking config? */
514
    /*netcfg();*/ /* basic networking config */
-
 
515
    /* TODO compute a customized FDNPKG file that looks either to local CD or net */
429
    finalreboot(); /* remove the CD and reboot */
516
    finalreboot(); /* remove the CD and reboot */
430
    break;
517
    break;
431
  }
518
  }
-
 
519
  kittenclose(); /* close NLS support */
432
  video_clear(0x0700, 0);
520
  video_clear(0x0700, 0);
433
  video_movecursor(0, 0);
521
  video_movecursor(0, 0);
434
  return(0);
522
  return(0);
435
}
523
}