Subversion Repositories SvarDOS

Rev

Rev 46 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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