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