Line 39... |
Line 39... |
39 |
*rstaddr = 0x1234; /* 0x1234 = warm boot, 0 = cold boot */
|
39 |
*rstaddr = 0x1234; /* 0x1234 = warm boot, 0 = cold boot */
|
40 |
(*bootroutine)(); /* jump to the BIOS reboot routine at FFFF:0000 */
|
40 |
(*bootroutine)(); /* jump to the BIOS reboot routine at FFFF:0000 */
|
41 |
}
|
41 |
}
|
42 |
|
42 |
|
43 |
|
43 |
|
- |
|
44 |
/* outputs a string to screen with taking care of word wrapping. returns amount of lines. */
|
- |
|
45 |
static int putstringwrap(int y, int x, unsigned short attr, char *s) {
|
- |
|
46 |
int linew, lincount;
|
- |
|
47 |
linew = 80;
|
- |
|
48 |
if (x >= 0) linew -= (x << 1);
|
- |
|
49 |
|
- |
|
50 |
for (lincount = 1; y+lincount < 25; lincount++) {
|
- |
|
51 |
int i, len = linew;
|
- |
|
52 |
for (i = 0; i <= linew; i++) {
|
- |
|
53 |
if (s[i] == ' ') len = i;
|
- |
|
54 |
if (s[i] == '\n') {
|
- |
|
55 |
len = i;
|
- |
|
56 |
break;
|
- |
|
57 |
}
|
- |
|
58 |
if (s[i] == 0) {
|
- |
|
59 |
len = i;
|
- |
|
60 |
break;
|
- |
|
61 |
}
|
- |
|
62 |
}
|
- |
|
63 |
video_putstring(y++, x, attr, s, len);
|
- |
|
64 |
s += len;
|
- |
|
65 |
if (*s == 0) break;
|
- |
|
66 |
s += 1; /* skip the whitespace char */
|
- |
|
67 |
}
|
- |
|
68 |
return(lincount);
|
- |
|
69 |
}
|
- |
|
70 |
|
- |
|
71 |
|
44 |
/* an NLS wrapper around video_putstring() */
|
72 |
/* an NLS wrapper around video_putstring(), also performs line wrapping when
|
- |
|
73 |
* needed. returns the amount of lines that were output */
|
45 |
static void putstringnls(int y, int x, unsigned short attr, int nlsmaj, int nlsmin, char *s) {
|
74 |
static int putstringnls(int y, int x, unsigned short attr, int nlsmaj, int nlsmin, char *s) {
|
46 |
s = kittengets(nlsmaj, nlsmin, s);
|
75 |
s = kittengets(nlsmaj, nlsmin, s);
|
47 |
video_putstring(y, x, attr, s);
|
76 |
return(putstringwrap(y, x, attr, s));
|
48 |
}
|
77 |
}
|
49 |
|
78 |
|
50 |
|
79 |
|
51 |
#define LDEC(x,y) (((unsigned short)x << 8) | (unsigned short)y)
|
80 |
#define LDEC(x,y) (((unsigned short)x << 8) | (unsigned short)y)
|
52 |
/* provides codepage and country files required by lang */
|
81 |
/* provides codepage and country files required by lang */
|
Line 127... |
Line 156... |
127 |
} else if (key == 0x1B) { /* ESC */
|
156 |
} else if (key == 0x1B) { /* ESC */
|
128 |
return(-1);
|
157 |
return(-1);
|
129 |
} else {
|
158 |
} else {
|
130 |
char buf[8];
|
159 |
char buf[8];
|
131 |
snprintf(buf, sizeof(buf), "0x%02X ", key);
|
160 |
snprintf(buf, sizeof(buf), "0x%02X ", key);
|
132 |
video_putstring(1, 0, COLOR_BODY[mono], buf);
|
161 |
video_putstring(1, 0, COLOR_BODY[mono], buf, -1);
|
133 |
}
|
162 |
}
|
134 |
}
|
163 |
}
|
135 |
}
|
164 |
}
|
136 |
|
165 |
|
137 |
static void newscreen(void) {
|
166 |
static void newscreen(void) {
|
138 |
int x;
|
167 |
int x;
|
139 |
char *title;
|
168 |
char *title;
|
140 |
title = kittengets(0, 0, "SVAROG386 INSTALLATION");
|
169 |
title = kittengets(0, 0, "SVAROG386 INSTALLATION");
|
141 |
for (x = 0; x < 80; x++) video_putchar(0, x, COLOR_TITLEBAR[mono], ' ');
|
170 |
for (x = 0; x < 80; x++) video_putchar(0, x, COLOR_TITLEBAR[mono], ' ');
|
142 |
video_putstring(0, 40 - (strlen(title) >> 1), COLOR_TITLEBAR[mono], title);
|
171 |
video_putstring(0, 40 - (strlen(title) >> 1), COLOR_TITLEBAR[mono], title, -1);
|
143 |
video_clear(COLOR_BODY[mono], 80);
|
172 |
video_clear(COLOR_BODY[mono], 80);
|
144 |
video_movecursor(25,0);
|
173 |
video_movecursor(25,0);
|
145 |
}
|
174 |
}
|
146 |
|
175 |
|
147 |
static int selectlang(char *lang) {
|
176 |
static int selectlang(char *lang) {
|
Line 163... |
Line 192... |
163 |
};
|
192 |
};
|
164 |
|
193 |
|
165 |
newscreen();
|
194 |
newscreen();
|
166 |
msg = kittengets(1, 0, "Welcome to Svarog386");
|
195 |
msg = kittengets(1, 0, "Welcome to Svarog386");
|
167 |
x = 40 - (strlen(msg) >> 1);
|
196 |
x = 40 - (strlen(msg) >> 1);
|
168 |
video_putstring(4, x, COLOR_BODY[mono], msg);
|
197 |
video_putstring(4, x, COLOR_BODY[mono], msg, -1);
|
169 |
video_putcharmulti(5, x, COLOR_BODY[mono], '=', strlen(msg), 1);
|
198 |
video_putcharmulti(5, x, COLOR_BODY[mono], '=', strlen(msg), 1);
|
170 |
putstringnls(8, -1, COLOR_BODY[mono], 1, 1, "Please select your language from the list below:");
|
199 |
putstringnls(8, -1, COLOR_BODY[mono], 1, 1, "Please select your language from the list below:");
|
171 |
choice = menuselect(10, -1, 12, langlist);
|
200 |
choice = menuselect(10, -1, 12, langlist);
|
172 |
if (choice < 0) return(-1);
|
201 |
if (choice < 0) return(-1);
|
173 |
/* write short language code into lang */
|
202 |
/* write short language code into lang */
|
Line 182... |
Line 211... |
182 |
static int welcomescreen(void) {
|
211 |
static int welcomescreen(void) {
|
183 |
char *choice[] = {"Install Svarog386 to disk", "Quit to DOS", NULL};
|
212 |
char *choice[] = {"Install Svarog386 to disk", "Quit to DOS", NULL};
|
184 |
choice[0] = kittengets(0, 1, choice[0]);
|
213 |
choice[0] = kittengets(0, 1, choice[0]);
|
185 |
choice[1] = kittengets(0, 2, choice[1]);
|
214 |
choice[1] = kittengets(0, 2, choice[1]);
|
186 |
newscreen();
|
215 |
newscreen();
|
187 |
putstringnls(4, 1, COLOR_BODY[mono], 2, 0, "You are about to install Svarog386: a free, MSDOS-compatible operating system");
|
216 |
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.");
|
188 |
putstringnls(5, 1, COLOR_BODY[mono], 2, 1, "based on the FreeDOS kernel. Svarog386 targets 386+ computers and comes with a");
|
- |
|
189 |
putstringnls(6, 1, COLOR_BODY[mono], 2, 2, "variety of third-party applications.");
|
- |
|
190 |
putstringnls(8, 1, COLOR_BODY[mono], 2, 3, "WARNING: If your PC has another operating system installed, this other system");
|
- |
|
191 |
putstringnls(9, 1, COLOR_BODY[mono], 2, 4, " might be unable to boot once Svarog386 is installed.");
|
- |
|
192 |
return(menuselect(13, -1, 4, choice));
|
217 |
return(menuselect(13, -1, 4, choice));
|
193 |
}
|
218 |
}
|
194 |
|
219 |
|
195 |
|
220 |
|
196 |
/* returns 1 if drive is removable, 0 if not, -1 on error */
|
221 |
/* returns 1 if drive is removable, 0 if not, -1 on error */
|
Line 243... |
Line 268... |
243 |
static int preparedrive(void) {
|
268 |
static int preparedrive(void) {
|
244 |
int driveremovable;
|
269 |
int driveremovable;
|
245 |
int selecteddrive = 3; /* hardcoded to 'C:' for now */
|
270 |
int selecteddrive = 3; /* hardcoded to 'C:' for now */
|
246 |
int cselecteddrive;
|
271 |
int cselecteddrive;
|
247 |
int ds;
|
272 |
int ds;
|
248 |
char buff[128];
|
273 |
char buff[1024];
|
249 |
cselecteddrive = 'A' + selecteddrive - 1;
|
274 |
cselecteddrive = 'A' + selecteddrive - 1;
|
250 |
for (;;) {
|
275 |
for (;;) {
|
251 |
newscreen();
|
276 |
newscreen();
|
252 |
driveremovable = isdriveremovable(selecteddrive);
|
277 |
driveremovable = isdriveremovable(selecteddrive);
|
253 |
if (driveremovable < 0) {
|
278 |
if (driveremovable < 0) {
|
254 |
char *list[] = { "Create a partition automatically", "Run the FDISK partitioning tool", "Quit to DOS", NULL};
|
279 |
char *list[] = { "Create a partition automatically", "Run the FDISK partitioning tool", "Quit to DOS", NULL};
|
255 |
list[0] = kittengets(0, 3, list[0]);
|
280 |
list[0] = kittengets(0, 3, list[0]);
|
256 |
list[1] = kittengets(0, 4, list[1]);
|
281 |
list[1] = kittengets(0, 4, list[1]);
|
257 |
list[2] = kittengets(0, 2, list[2]);
|
282 |
list[2] = kittengets(0, 2, list[2]);
|
258 |
snprintf(buff, sizeof(buff), kittengets(3, 0, "ERROR: Drive %c: could not be found. Perhaps your hard disk needs to be"), cselecteddrive);
|
283 |
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);
|
259 |
video_putstring(4, 2, COLOR_BODY[mono], buff);
|
284 |
video_putstring(4, 2, COLOR_BODY[mono], buff, -1);
|
260 |
putstringnls(5, 2, COLOR_BODY[mono], 3, 1, " partitioned first. Please create at least one partition on your");
|
- |
|
261 |
putstringnls(6, 2, COLOR_BODY[mono], 3, 2, " hard disk, so Svarog386 can be installed on it. Note, that");
|
- |
|
262 |
snprintf(buff, sizeof(buff), kittengets(3, 3, " Svarog386 requires at least %d MiB of available disk space."), SVAROG_DISK_REQ);
|
- |
|
263 |
video_putstring(7, 2, COLOR_BODY[mono], buff);
|
- |
|
264 |
putstringnls(9, 2, COLOR_BODY[mono], 3, 4, "You can use the FDISK partitioning tool for creating the required partition");
|
- |
|
265 |
putstringnls(10, 2, COLOR_BODY[mono], 3, 5, "manually, or you can let the installer partitioning your disk");
|
- |
|
266 |
putstringnls(11, 2, COLOR_BODY[mono], 3, 6, "automatically. You can also abort the installation to use any other");
|
- |
|
267 |
putstringnls(12, 2, COLOR_BODY[mono], 3, 7, "partition manager of your choice.");
|
- |
|
268 |
switch (menuselect(14, -1, 5, list)) {
|
285 |
switch (menuselect(14, -1, 5, list)) {
|
269 |
case 0:
|
286 |
case 0:
|
270 |
system("FDISK /AUTO");
|
287 |
system("FDISK /AUTO");
|
271 |
break;
|
288 |
break;
|
272 |
case 1:
|
289 |
case 1:
|
273 |
video_clear(0x0700, 0);
|
290 |
video_clear(0x0700, 0);
|
274 |
video_movecursor(0, 0);
|
291 |
video_movecursor(0, 0);
|
275 |
system("FDISK");
|
292 |
system("FDISK");
|
276 |
break;
|
293 |
break;
|
277 |
case 2:
|
294 |
default:
|
278 |
return(-1);
|
295 |
return(-1);
|
279 |
}
|
296 |
}
|
280 |
newscreen();
|
297 |
newscreen();
|
281 |
putstringnls(11, 10, COLOR_BODY[mono], 3, 8, "Your computer will reboot now.");
|
298 |
putstringnls(11, 10, COLOR_BODY[mono], 3, 1, "Your computer will reboot now.");
|
282 |
putstringnls(12, 10, COLOR_BODY[mono], 0, 5, "Press any key...");
|
299 |
putstringnls(12, 10, COLOR_BODY[mono], 0, 5, "Press any key...");
|
283 |
input_getkey();
|
300 |
input_getkey();
|
284 |
reboot();
|
301 |
reboot();
|
285 |
return(-1);
|
302 |
return(-1);
|
286 |
} else if (driveremovable > 0) {
|
303 |
} else if (driveremovable > 0) {
|
287 |
snprintf(buff, sizeof(buff), kittengets(3, 9, "ERROR: Drive %c: is a removable device. Installation aborted."), cselecteddrive);
|
304 |
snprintf(buff, sizeof(buff), kittengets(3, 2, "ERROR: Drive %c: is a removable device. Installation aborted."), cselecteddrive);
|
288 |
video_putstring(9, 2, COLOR_BODY[mono], buff);
|
305 |
video_putstring(9, 2, COLOR_BODY[mono], buff, -1);
|
289 |
putstringnls(11, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
|
306 |
putstringnls(11, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
|
290 |
return(-1);
|
307 |
return(-1);
|
291 |
}
|
308 |
}
|
292 |
/* if not formatted, propose to format it right away (try to create a directory) */
|
309 |
/* if not formatted, propose to format it right away (try to create a directory) */
|
293 |
snprintf(buff, sizeof(buff), "%c:\\SVWRTEST.123", cselecteddrive);
|
310 |
snprintf(buff, sizeof(buff), "%c:\\SVWRTEST.123", cselecteddrive);
|
Line 295... |
Line 312... |
295 |
rmdir(buff);
|
312 |
rmdir(buff);
|
296 |
} else {
|
313 |
} else {
|
297 |
char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
|
314 |
char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
|
298 |
list[0] = kittengets(0, 6, list[0]);
|
315 |
list[0] = kittengets(0, 6, list[0]);
|
299 |
list[1] = kittengets(0, 2, list[1]);
|
316 |
list[1] = kittengets(0, 2, list[1]);
|
300 |
snprintf(buff, sizeof(buff), kittengets(3, 10, "ERROR: Drive %c: seems to be unformated."), cselecteddrive);
|
317 |
snprintf(buff, sizeof(buff), kittengets(3, 3, "ERROR: Drive %c: seems to be unformated. Do you wish to format it?"), cselecteddrive);
|
301 |
video_putstring(7, 2, COLOR_BODY[mono], buff);
|
318 |
video_putstring(7, 2, COLOR_BODY[mono], buff, -1);
|
302 |
putstringnls(8, 2, COLOR_BODY[mono], 3, 11, " Do you wish to format it?");
|
- |
|
303 |
if (menuselect(12, -1, 4, list) != 0) return(-1);
|
319 |
if (menuselect(12, -1, 4, list) != 0) return(-1);
|
304 |
video_clear(0x0700, 0);
|
320 |
video_clear(0x0700, 0);
|
305 |
video_movecursor(0, 0);
|
321 |
video_movecursor(0, 0);
|
306 |
snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
|
322 |
snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
|
307 |
system(buff);
|
323 |
system(buff);
|
308 |
continue;
|
324 |
continue;
|
309 |
}
|
325 |
}
|
310 |
/* check total disk space */
|
326 |
/* check total disk space */
|
311 |
ds = disksize(selecteddrive);
|
327 |
ds = disksize(selecteddrive);
|
312 |
if (ds < SVAROG_DISK_REQ) {
|
328 |
if (ds < SVAROG_DISK_REQ) {
|
313 |
snprintf(buff, sizeof(buff), kittengets(3, 12, "ERROR: Drive %c: is not big enough!"), cselecteddrive);
|
- |
|
314 |
video_putstring(9, 2, COLOR_BODY[mono], buff);
|
329 |
int y = 9;
|
315 |
snprintf(buff, sizeof(buff), kittengets(3, 13, " Svarog386 requires a disk of at least %d MiB."), SVAROG_DISK_REQ);
|
330 |
snprintf(buff, sizeof(buff), kittengets(3, 4, "ERROR: Drive %c: is not big enough! Svarog386 requires a disk of at least %d MiB."), cselecteddrive);
|
316 |
video_putstring(10, 2, COLOR_BODY[mono], buff);
|
331 |
y += putstringwrap(y, 2, COLOR_BODY[mono], buff);
|
317 |
putstringnls(12, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
|
332 |
putstringnls(++y, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
|
318 |
input_getkey();
|
333 |
input_getkey();
|
319 |
return(-1);
|
334 |
return(-1);
|
320 |
}
|
335 |
}
|
321 |
/* is the disk empty? */
|
336 |
/* is the disk empty? */
|
322 |
if (diskempty(selecteddrive) != 0) {
|
337 |
if (diskempty(selecteddrive) != 0) {
|
323 |
char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
|
338 |
char *list[] = { "Proceed with formatting", "Quit to DOS", NULL};
|
324 |
list[0] = kittengets(0, 6, list[0]);
|
339 |
list[0] = kittengets(0, 6, list[0]);
|
325 |
list[1] = kittengets(0, 2, list[1]);
|
340 |
list[1] = kittengets(0, 2, list[1]);
|
326 |
snprintf(buff, sizeof(buff), kittengets(3, 14, "ERROR: Drive %c: is not empty. Svarog386 must be installed on an empty disk."), cselecteddrive);
|
341 |
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);
|
327 |
video_putstring(7, 2, COLOR_BODY[mono], buff);
|
342 |
putstringwrap(7, 2, COLOR_BODY[mono], buff);
|
328 |
putstringnls(8, 2, COLOR_BODY[mono], 3, 15, " You can format the disk now, to make it empty. Note however, that");
|
- |
|
329 |
putstringnls(9, 2, COLOR_BODY[mono], 3, 16, " this will ERASE ALL CURRENT DATA on your disk.");
|
- |
|
330 |
if (menuselect(12, -1, 4, list) != 0) return(-1);
|
343 |
if (menuselect(12, -1, 4, list) != 0) return(-1);
|
331 |
video_clear(0x0700, 0);
|
344 |
video_clear(0x0700, 0);
|
332 |
video_movecursor(0, 0);
|
345 |
video_movecursor(0, 0);
|
333 |
snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
|
346 |
snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVAROG386", cselecteddrive);
|
334 |
system(buff);
|
347 |
system(buff);
|
Line 336... |
Line 349... |
336 |
} else {
|
349 |
} else {
|
337 |
/* final confirmation */
|
350 |
/* final confirmation */
|
338 |
char *list[] = { "Install Svarog386", "Quit to DOS", NULL};
|
351 |
char *list[] = { "Install Svarog386", "Quit to DOS", NULL};
|
339 |
list[0] = kittengets(0, 1, list[0]);
|
352 |
list[0] = kittengets(0, 1, list[0]);
|
340 |
list[1] = kittengets(0, 2, list[1]);
|
353 |
list[1] = kittengets(0, 2, list[1]);
|
341 |
snprintf(buff, sizeof(buff), kittengets(3, 17, "The installation of Svarog386 to %c: is about to begin."), cselecteddrive);
|
354 |
snprintf(buff, sizeof(buff), kittengets(3, 6, "The installation of Svarog386 to %c: is about to begin."), cselecteddrive);
|
342 |
video_putstring(7, -1, COLOR_BODY[mono], buff);
|
355 |
video_putstring(7, -1, COLOR_BODY[mono], buff, -1);
|
343 |
if (menuselect(10, -1, 4, list) != 0) return(-1);
|
356 |
if (menuselect(10, -1, 4, list) != 0) return(-1);
|
344 |
snprintf(buff, sizeof(buff), "SYS A: %c:", cselecteddrive);
|
357 |
snprintf(buff, sizeof(buff), "SYS A: %c:", cselecteddrive);
|
345 |
system(buff);
|
358 |
system(buff);
|
346 |
snprintf(buff, sizeof(buff), "%c:\\TEMP", cselecteddrive);
|
359 |
snprintf(buff, sizeof(buff), "%c:\\TEMP", cselecteddrive);
|
347 |
mkdir(buff);
|
360 |
mkdir(buff);
|
Line 405... |
Line 418... |
405 |
fprintf(fd, "SET WATTCP.CFG=%c:\\SYSTEM\\CFG\\WATTCP.CFG\r\n", targetdrv);
|
418 |
fprintf(fd, "SET WATTCP.CFG=%c:\\SYSTEM\\CFG\\WATTCP.CFG\r\n", targetdrv);
|
406 |
fprintf(fd, "PATH %%DOSDIR%%\\BIN;%c:\\SYSTEM\\LINKS\r\n", targetdrv);
|
419 |
fprintf(fd, "PATH %%DOSDIR%%\\BIN;%c:\\SYSTEM\\LINKS\r\n", targetdrv);
|
407 |
fprintf(fd, "PROMPT $P$G\r\n");
|
420 |
fprintf(fd, "PROMPT $P$G\r\n");
|
408 |
fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
|
421 |
fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
|
409 |
fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
|
422 |
fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
|
- |
|
423 |
fprintf(fd, "FDAPM APMDOS\r\n");
|
410 |
fprintf(fd, "\r\n");
|
424 |
fprintf(fd, "\r\n");
|
411 |
if (egafile > 0) {
|
425 |
if (egafile > 0) {
|
412 |
fprintf(fd, "DISPLAY CON=(EGA,,1)\r\n");
|
426 |
fprintf(fd, "DISPLAY CON=(EGA,,1)\r\n");
|
413 |
if (egafile == 1) {
|
427 |
if (egafile == 1) {
|
414 |
fprintf(fd, "MODE CON CP PREPARE=((%d) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA.CPX)\r\n", cp, targetdrv);
|
428 |
fprintf(fd, "MODE CON CP PREPARE=((%d) %c:\\SYSTEM\\SVAROG.386\\CPI\\EGA.CPX)\r\n", cp, targetdrv);
|
Line 506... |
Line 520... |
506 |
/* install packages */
|
520 |
/* install packages */
|
507 |
for (i = 0; pkglist[i] != NULL; i++) {
|
521 |
for (i = 0; pkglist[i] != NULL; i++) {
|
508 |
char buff[128];
|
522 |
char buff[128];
|
509 |
snprintf(buff, sizeof(buff), kittengets(4, 0, "Installing package %d/%d: %s"), i+1, pkglistlen, pkglist[i]);
|
523 |
snprintf(buff, sizeof(buff), kittengets(4, 0, "Installing package %d/%d: %s"), i+1, pkglistlen, pkglist[i]);
|
510 |
strcat(buff, " ");
|
524 |
strcat(buff, " ");
|
511 |
video_putstring(10, 2, COLOR_BODY[mono], buff);
|
525 |
video_putstring(10, 2, COLOR_BODY[mono], buff, -1);
|
512 |
if (pkglist[i][1] == ':') {
|
526 |
if (pkglist[i][1] == ':') {
|
513 |
snprintf(buff, sizeof(buff), "FDINST INSTALL %s.ZIP > NUL", pkglist[i]);
|
527 |
snprintf(buff, sizeof(buff), "FDINST INSTALL %s.ZIP > NUL", pkglist[i]);
|
514 |
} else {
|
528 |
} else {
|
515 |
snprintf(buff, sizeof(buff), "FDINST INSTALL %c:\\CORE\\%s.ZIP > NUL", cdromdrv, pkglist[i]);
|
529 |
snprintf(buff, sizeof(buff), "FDINST INSTALL %c:\\CORE\\%s.ZIP > NUL", cdromdrv, pkglist[i]);
|
516 |
}
|
530 |
}
|
Line 518... |
Line 532... |
518 |
}
|
532 |
}
|
519 |
}
|
533 |
}
|
520 |
|
534 |
|
521 |
|
535 |
|
522 |
static void finalreboot(void) {
|
536 |
static void finalreboot(void) {
|
- |
|
537 |
int y = 9;
|
523 |
newscreen();
|
538 |
newscreen();
|
524 |
putstringnls(9, 2, COLOR_BODY[mono], 5, 0, "Svarog386 installation is over. Your computer will reboot now.");
|
539 |
y += putstringnls(y, 2, COLOR_BODY[mono], 5, 0, "Svarog386 installation is over. Your computer will reboot now.\nPlease remove the installation disk from your drive.");
|
525 |
putstringnls(10, 2, COLOR_BODY[mono], 5, 1, "Please remove the installation disk from your drive.");
|
- |
|
526 |
putstringnls(12, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
|
540 |
putstringnls(++y, 2, COLOR_BODY[mono], 0, 5, "Press any key...");
|
527 |
input_getkey();
|
541 |
input_getkey();
|
528 |
reboot();
|
542 |
reboot();
|
529 |
}
|
543 |
}
|
530 |
|
544 |
|
531 |
|
545 |
|
Line 534... |
Line 548... |
534 |
char buff[64];
|
548 |
char buff[64];
|
535 |
cp = getnlscp(lang, &egafile);
|
549 |
cp = getnlscp(lang, &egafile);
|
536 |
if (cp == 437) return;
|
550 |
if (cp == 437) return;
|
537 |
video_movecursor(1, 0);
|
551 |
video_movecursor(1, 0);
|
538 |
if (egafile == 1) {
|
552 |
if (egafile == 1) {
|
539 |
snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%d) A:\\EGA.CPX)", cp);
|
553 |
snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%d) A:\\EGA.CPX) > NUL", cp);
|
540 |
} else {
|
554 |
} else {
|
541 |
snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%d) A:\\EGA%d.CPX)", cp, egafile);
|
555 |
snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%d) A:\\EGA%d.CPX) > NUL", cp, egafile);
|
542 |
}
|
556 |
}
|
543 |
system(buff);
|
557 |
system(buff);
|
544 |
snprintf(buff, sizeof(buff), "MODE CON CP SEL=%d", cp);
|
558 |
snprintf(buff, sizeof(buff), "MODE CON CP SEL=%d > NUL", cp);
|
545 |
system(buff);
|
559 |
system(buff);
|
546 |
/* below I re-init the video controller - apparently this is required if
|
560 |
/* below I re-init the video controller - apparently this is required if
|
547 |
* I want the new glyph symbols to be actually applied */
|
561 |
* I want the new glyph symbols to be actually applied */
|
548 |
{
|
562 |
{
|
549 |
union REGS r;
|
563 |
union REGS r;
|
550 |
r.h.ah = 0x0F; /* get current video mode */
|
564 |
r.h.ah = 0x0F; /* get current video mode */
|
551 |
int86(0x10, &r, &r); /* r.h.al contains the current video mode now */
|
565 |
int86(0x10, &r, &r); /* r.h.al contains the current video mode now */
|
- |
|
566 |
r.h.al |= 128; /* set the high bit of AL to instruct BIOS not to flush VRAM's content (EGA+) */
|
552 |
r.h.ah = 0; /* set video mode (to whatever is set in AL) */
|
567 |
r.h.ah = 0; /* re-set video mode (to whatever is set in AL) */
|
553 |
int86(0x10, &r, &r);
|
568 |
int86(0x10, &r, &r);
|
554 |
}
|
569 |
}
|
555 |
}
|
570 |
}
|
556 |
|
571 |
|
557 |
|
572 |
|
Line 560... |
Line 575... |
560 |
int targetdrv;
|
575 |
int targetdrv;
|
561 |
int cdromdrv;
|
576 |
int cdromdrv;
|
562 |
|
577 |
|
563 |
/* find where the cdrom drive is */
|
578 |
/* find where the cdrom drive is */
|
564 |
cdromdrv = cdrom_findfirst();
|
579 |
cdromdrv = cdrom_findfirst();
|
- |
|
580 |
cdromdrv = 3;
|
565 |
if (cdromdrv < 0) {
|
581 |
if (cdromdrv < 0) {
|
566 |
printf("ERROR: CD-ROM DRIVE NOT FOUND\r\n");
|
582 |
printf("ERROR: CD-ROM DRIVE NOT FOUND\r\n");
|
567 |
return(1);
|
583 |
return(1);
|
568 |
}
|
584 |
}
|
569 |
cdromdrv += 'A'; /* convert the cdrom 'id' (A=0) to an actual drive letter */
|
585 |
cdromdrv += 'A'; /* convert the cdrom 'id' (A=0) to an actual drive letter */
|