Subversion Repositories SvarDOS

Compare Revisions

No changes between revisions

Ignore whitespace Rev 820 → Rev 821

/install/tags/20220217/cdrom.c
0,0 → 1,30
/*
* CD-ROM detection routines
* Copyright (C) 2016 Mateusz Viste
*/
 
#include <dos.h>
#include "cdrom.h" /* include self for control */
 
/* returns 1 if drive drv is a valid CDROM, zero if not, negative if no MSCDEX (0=A:, etc) */
int cdrom_drivecheck(int drv) {
union REGS r;
r.x.ax = 0x150B;
r.x.cx = drv;
int86(0x2F, &r, &r);
if (r.x.bx != 0xADAD) return(-1); /* look for the MSCDEX signature */
if (r.x.ax == 0) return(0);
return(1);
}
 
/* returns the identifier of the first CDROM drive (0=A:, etc), or a negative value on error */
int cdrom_findfirst(void) {
int i;
for (i = 2; i < 26; i++) { /* check drives from C to Z */
int cdres = cdrom_drivecheck(i);
if (cdres == 0) continue;
if (cdres == 1) return(i);
break;
}
return(-1);
}
/install/tags/20220217/cdrom.h
0,0 → 1,15
/*
* CD-ROM detection routines
* Copyright (C) 2016 Mateusz Viste
*/
 
#ifndef CDROM_H_SENTINEL
#define CDROM_H_SENTINEL
 
/* returns 1 if drive drv is a valid CDROM, zero if not, negative if no MSCDEX (0=A:, etc) */
int cdrom_drivecheck(int drv);
 
/* returns the identifier of the first CDROM drive (0=A:, etc), or a negative value on error */
int cdrom_findfirst(void);
 
#endif
/install/tags/20220217/deflang.c
0,0 → 1,135
/* THIS FILE HAS BEEN AUTOGENERATE BY TLUMACZ (PART OF THE SVARLANG LIBRARY) */
const unsigned short svarlang_memsz = 4198u;
char svarlang_mem[4198] = {
0,0,21,0,83,86,65,82,68,79,83,32,73,78,83,84,
65,76,76,65,84,73,79,78,0,1,0,16,0,73,110,115,
116,97,108,108,32,83,118,97,114,68,79,83,0,2,0,12,
0,81,117,105,116,32,116,111,32,68,79,83,0,3,0,33,
0,67,114,101,97,116,101,32,97,32,112,97,114,116,105,116,
105,111,110,32,97,117,116,111,109,97,116,105,99,97,108,108,
121,0,4,0,32,0,82,117,110,32,116,104,101,32,70,68,
73,83,75,32,112,97,114,116,105,116,105,111,110,105,110,103,
32,116,111,111,108,0,5,0,17,0,80,114,101,115,115,32,
97,110,121,32,107,101,121,46,46,46,0,7,0,17,0,70,
111,114,109,97,116,32,100,114,105,118,101,32,37,99,58,0,
10,0,72,0,85,112,47,68,111,119,110,32,61,32,83,101,
108,101,99,116,32,101,110,116,114,121,32,124,32,69,110,116,
101,114,32,61,32,67,111,110,102,105,114,109,32,99,104,111,
105,99,101,32,124,32,69,83,67,32,61,32,80,114,101,118,
105,111,117,115,32,115,99,114,101,101,110,0,11,0,68,0,
85,112,47,68,111,119,110,32,61,32,83,101,108,101,99,116,
32,101,110,116,114,121,32,124,32,69,110,116,101,114,32,61,
32,67,111,110,102,105,114,109,32,99,104,111,105,99,101,32,
124,32,69,83,67,32,61,32,81,117,105,116,32,116,111,32,
68,79,83,0,0,1,19,0,87,101,108,99,111,109,101,32,
116,111,32,83,118,97,114,68,79,83,0,1,1,59,0,80,
108,101,97,115,101,32,115,101,108,101,99,116,32,121,111,117,
114,32,112,114,101,102,101,114,114,101,100,32,108,97,110,103,
117,97,103,101,32,102,114,111,109,32,116,104,101,32,108,105,
115,116,32,98,101,108,111,119,58,0,5,1,87,0,83,118,
97,114,68,79,83,32,115,117,112,112,111,114,116,115,32,100,
105,102,102,101,114,101,110,116,32,107,101,121,98,111,97,114,
100,32,108,97,121,111,117,116,115,46,32,67,104,111,111,115,
101,32,116,104,101,32,107,101,121,98,111,97,114,100,32,108,
97,121,111,117,116,32,116,104,97,116,32,121,111,117,32,119,
97,110,116,46,0,0,2,27,1,89,111,117,32,97,114,101,
32,97,98,111,117,116,32,116,111,32,105,110,115,116,97,108,
108,32,83,118,97,114,68,79,83,58,32,97,32,102,114,101,
101,44,32,77,83,45,68,79,83,32,99,111,109,112,97,116,
105,98,108,101,32,111,112,101,114,97,116,105,110,103,32,115,
121,115,116,101,109,32,98,97,115,101,100,32,111,110,32,70,
114,101,101,68,79,83,46,32,83,118,97,114,68,79,83,32,
99,111,109,101,115,32,119,105,116,104,32,97,32,118,97,114,
105,101,116,121,32,111,102,32,116,104,105,114,100,45,112,97,
114,116,121,32,97,112,112,108,105,99,97,116,105,111,110,115,
46,10,10,87,65,82,78,73,78,71,58,32,73,102,32,121,
111,117,114,32,80,67,32,104,97,115,32,97,110,111,116,104,
101,114,32,111,112,101,114,97,116,105,110,103,32,115,121,115,
116,101,109,32,105,110,115,116,97,108,108,101,100,44,32,116,
104,105,115,32,111,116,104,101,114,32,115,121,115,116,101,109,
32,109,105,103,104,116,32,98,101,32,117,110,97,98,108,101,
32,116,111,32,98,111,111,116,32,111,110,99,101,32,83,118,
97,114,68,79,83,32,105,115,32,105,110,115,116,97,108,108,
101,100,46,0,0,3,244,1,69,82,82,79,82,58,32,68,
114,105,118,101,32,37,99,58,32,99,111,117,108,100,32,110,
111,116,32,98,101,32,102,111,117,110,100,46,32,80,101,114,
104,97,112,115,32,121,111,117,114,32,104,97,114,100,32,100,
105,115,107,32,110,101,101,100,115,32,116,111,32,98,101,32,
112,97,114,116,105,116,105,111,110,101,100,32,102,105,114,115,
116,46,32,80,108,101,97,115,101,32,99,114,101,97,116,101,
32,97,116,32,108,101,97,115,116,32,111,110,101,32,112,114,
105,109,97,114,121,32,112,97,114,116,105,116,105,111,110,32,
111,110,32,121,111,117,114,32,104,97,114,100,32,100,105,115,
107,44,32,115,111,32,83,118,97,114,68,79,83,32,99,97,
110,32,98,101,32,105,110,115,116,97,108,108,101,100,32,111,
110,32,105,116,46,32,78,111,116,101,44,32,116,104,97,116,
32,83,118,97,114,68,79,83,32,114,101,113,117,105,114,101,
115,32,97,116,32,108,101,97,115,116,32,37,100,32,77,105,
66,32,111,102,32,97,118,97,105,108,97,98,108,101,32,100,
105,115,107,32,115,112,97,99,101,46,10,10,89,111,117,32,
99,97,110,32,117,115,101,32,116,104,101,32,70,68,73,83,
75,32,112,97,114,116,105,116,105,111,110,105,110,103,32,116,
111,111,108,32,102,111,114,32,99,114,101,97,116,105,110,103,
32,116,104,101,32,114,101,113,117,105,114,101,100,32,112,97,
114,116,105,116,105,111,110,32,109,97,110,117,97,108,108,121,
44,32,111,114,32,121,111,117,32,99,97,110,32,108,101,116,
32,116,104,101,32,105,110,115,116,97,108,108,101,114,32,112,
97,114,116,105,116,105,111,110,105,110,103,32,121,111,117,114,
32,100,105,115,107,32,97,117,116,111,109,97,116,105,99,97,
108,108,121,46,32,89,111,117,32,99,97,110,32,97,108,115,
111,32,97,98,111,114,116,32,116,104,101,32,105,110,115,116,
97,108,108,97,116,105,111,110,32,116,111,32,117,115,101,32,
97,110,121,32,111,116,104,101,114,32,112,97,114,116,105,116,
105,111,110,32,109,97,110,97,103,101,114,32,111,102,32,121,
111,117,114,32,99,104,111,105,99,101,46,0,1,3,31,0,
89,111,117,114,32,99,111,109,112,117,116,101,114,32,119,105,
108,108,32,114,101,98,111,111,116,32,110,111,119,46,0,2,
3,62,0,69,82,82,79,82,58,32,68,114,105,118,101,32,
37,99,58,32,105,115,32,97,32,114,101,109,111,118,97,98,
108,101,32,100,101,118,105,99,101,46,32,73,110,115,116,97,
108,108,97,116,105,111,110,32,97,98,111,114,116,101,100,46,
0,3,3,41,0,69,82,82,79,82,58,32,68,114,105,118,
101,32,37,99,58,32,115,101,101,109,115,32,116,111,32,98,
101,32,117,110,102,111,114,109,97,116,101,100,46,0,4,3,
80,0,69,82,82,79,82,58,32,68,114,105,118,101,32,37,
99,58,32,105,115,32,110,111,116,32,98,105,103,32,101,110,
111,117,103,104,33,32,83,118,97,114,68,79,83,32,114,101,
113,117,105,114,101,115,32,97,32,100,105,115,107,32,111,102,
32,97,116,32,108,101,97,115,116,32,37,100,32,77,105,66,
46,0,5,3,189,0,69,82,82,79,82,58,32,68,114,105,
118,101,32,37,99,58,32,105,115,32,110,111,116,32,101,109,
112,116,121,46,32,83,118,97,114,68,79,83,32,109,117,115,
116,32,98,101,32,105,110,115,116,97,108,108,101,100,32,111,
110,32,97,110,32,101,109,112,116,121,32,100,105,115,107,46,
10,10,89,111,117,32,99,97,110,32,102,111,114,109,97,116,
32,116,104,101,32,100,105,115,107,32,110,111,119,44,32,116,
111,32,109,97,107,101,32,105,116,32,101,109,112,116,121,46,
32,78,111,116,101,32,104,111,119,101,118,101,114,44,32,116,
104,97,116,32,116,104,105,115,32,119,105,108,108,32,69,82,
65,83,69,32,65,76,76,32,67,85,82,82,69,78,84,32,
68,65,84,65,32,111,110,32,121,111,117,114,32,100,105,115,
107,46,0,6,3,54,0,84,104,101,32,105,110,115,116,97,
108,108,97,116,105,111,110,32,111,102,32,83,118,97,114,68,
79,83,32,116,111,32,37,99,58,32,105,115,32,97,98,111,
117,116,32,116,111,32,98,101,103,105,110,46,0,0,4,29,
0,73,110,115,116,97,108,108,105,110,103,32,112,97,99,107,
97,103,101,32,37,100,47,37,100,58,32,37,115,0,1,4,
74,0,42,42,42,32,73,78,83,69,82,84,32,84,72,69,
32,68,73,83,75,32,84,72,65,84,32,67,79,78,84,65,
73,78,83,32,84,72,69,32,82,69,81,85,73,82,69,68,
32,70,73,76,69,32,65,78,68,32,80,82,69,83,83,32,
65,78,89,32,75,69,89,32,42,42,42,0,0,5,84,0,
89,111,117,114,32,99,111,109,112,117,116,101,114,32,119,105,
108,108,32,114,101,98,111,111,116,32,110,111,119,46,10,80,
108,101,97,115,101,32,114,101,109,111,118,101,32,116,104,101,
32,105,110,115,116,97,108,108,97,116,105,111,110,32,100,105,
115,107,32,102,114,111,109,32,121,111,117,114,32,100,114,105,
118,101,46,0,1,5,64,0,83,118,97,114,68,79,83,32,
105,110,115,116,97,108,108,97,116,105,111,110,32,105,115,32,
111,118,101,114,46,32,80,108,101,97,115,101,32,114,101,115,
116,97,114,116,32,121,111,117,114,32,99,111,109,112,117,116,
101,114,32,110,111,119,46,0,0,6,50,0,87,101,108,99,
111,109,101,32,116,111,32,83,118,97,114,68,79,83,33,32,
84,121,112,101,32,39,72,69,76,80,39,32,105,102,32,121,
111,117,32,110,101,101,100,32,104,101,108,112,46,0,0,0,
0,0,0};
/install/tags/20220217/input.c
0,0 → 1,37
/*
* input keyboard routines used by the SvarDOS installer.
* Copyright (C) 2016 Mateusz Viste
*/
 
#ifndef input_h_sentinel
#define input_h_sentinel
 
#include <dos.h>
#include "input.h" /* include self for control */
 
/* waits for a keypress and return it. Returns 0x1xx for extended keys */
int input_getkey(void) {
union REGS regs;
int res;
regs.h.ah = 0x08;
int86(0x21, &regs, &regs);
res = regs.h.al;
if (res == 0) { /* extended key - poll again */
regs.h.ah = 0x08;
int86(0x21, &regs, &regs);
res = regs.h.al | 0x100;
}
return(res);
}
 
 
/* poll the keyboard, and return the next input key in buffer, or -1 if none */
int input_getkeyifany(void) {
union REGS regs;
regs.h.ah = 0x0B;
int86(0x21, &regs, &regs);
if (regs.h.al == 0xFF) return(input_getkey());
return(-1);
}
 
#endif
/install/tags/20220217/input.h
0,0 → 1,11
/*
* input keyboard routines used by the SvarDOS installer.
* Copyright (C) 2016 Mateusz Viste
*/
 
/* waits for a keypress and return it. Returns 0 for extended keystroke, then
function must be called again to return scan code. */
int input_getkey(void);
 
/* poll the keyboard, and return the next input key if any, or -1 */
int input_getkeyifany(void);
/install/tags/20220217/install.c
0,0 → 1,894
/*
* SVARDOS INSTALL PROGRAM
*
* PUBLISHED UNDER THE TERMS OF THE MIT LICENSE
*
* COPYRIGHT (C) 2016-2022 MATEUSZ VISTE, ALL RIGHTS RESERVED.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* http://svardos.osdn.io
*/
 
#include <dos.h>
#include <direct.h> /* mkdir() */
#include <stdio.h> /* printf() and friends */
#include <stdlib.h> /* system() */
#include <string.h> /* memcpy() */
#include <unistd.h>
 
#include "svarlang.lib\svarlang.h"
 
#include "input.h"
#include "video.h"
 
/* keyboard layouts and locales */
#include "keylay.h"
#include "keyoff.h"
 
/* color scheme (color, mono) */
static unsigned short COLOR_TITLEBAR[2] = {0x7000,0x7000};
static unsigned short COLOR_BODY[2] = {0x1700,0x0700};
static unsigned short COLOR_SELECT[2] = {0x7000,0x7000};
static unsigned short COLOR_SELECTCUR[2] = {0x1F00,0x0700};
 
/* mono flag */
static int mono = 0;
 
/* how much disk space does SvarDOS require (in MiB) */
#define SVARDOS_DISK_REQ 8
 
/* menu screens can output only one of these: */
#define MENUNEXT 0
#define MENUPREV -1
#define MENUQUIT -2
 
/* a convenience 'function' used for debugging */
#define DBG(x) { video_putstringfix(24, 0, 0x4F00u, x, 80); }
 
struct slocales {
char lang[4];
const char *keybcode;
unsigned int codepage;
int egafile;
int keybfile;
int keyboff;
int keyblen;
unsigned int keybid;
};
 
 
/* reboot the computer */
static void reboot(void) {
void ((far *bootroutine)()) = (void (far *)()) 0xFFFF0000L;
int far *rstaddr = (int far *)0x00400072L; /* BIOS boot flag is at 0040:0072 */
*rstaddr = 0x1234; /* 0x1234 = warm boot, 0 = cold boot */
(*bootroutine)(); /* jump to the BIOS reboot routine at FFFF:0000 */
}
 
 
/* outputs a string to screen with taking care of word wrapping. returns amount of lines. */
static int putstringwrap(int y, int x, unsigned short attr, const char *s) {
int linew, lincount;
linew = 80;
if (x >= 0) linew -= (x << 1);
 
for (lincount = 1; y+lincount < 25; lincount++) {
int i, len = linew;
for (i = 0; i <= linew; i++) {
if (s[i] == ' ') len = i;
if (s[i] == '\n') {
len = i;
break;
}
if (s[i] == 0) {
len = i;
break;
}
}
video_putstring(y++, x, attr, s, len);
s += len;
if (*s == 0) break;
s += 1; /* skip the whitespace char */
}
return(lincount);
}
 
 
/* an NLS wrapper around video_putstring(), also performs line wrapping when
* needed. returns the amount of lines that were output */
static int putstringnls(int y, int x, unsigned short attr, int nlsmaj, int nlsmin) {
const char *s = svarlang_str(nlsmaj, nlsmin);
if (s == NULL) s = "";
return(putstringwrap(y, x, attr, s));
}
 
 
/* copy file f1 to f2 using buff as a buffer of buffsz bytes. f2 will be overwritten if it
* exists already! returns 0 on success. */
static int fcopy(const char *f2, const char *f1, void *buff, size_t buffsz) {
FILE *fd1, *fd2;
size_t sz;
int res = -1; /* assume failure */
 
/* open files */
fd1 = fopen(f1, "rb");
fd2 = fopen(f2, "wb");
if ((fd1 == NULL) || (fd2 == NULL)) goto QUIT;
 
/* copy data */
for (;;) {
sz = fread(buff, 1, buffsz, fd1);
if (sz == 0) {
if (feof(fd1) != 0) break;
goto QUIT;
}
if (fwrite(buff, 1, sz, fd2) != sz) goto QUIT;
}
 
res = 0; /* success */
 
QUIT:
if (fd1 != NULL) fclose(fd1);
if (fd2 != NULL) fclose(fd2);
return(res);
}
 
 
static int menuselect(int ypos, int xpos, int height, const char **list, int listlen) {
int i, offset = 0, res = 0, count, width = 0;
/* count how many positions there is, and check their width */
for (count = 0; (list[count] != NULL) && (count != listlen); count++) {
int len = strlen(list[count]);
if (len > width) width = len;
}
 
/* if xpos negative, means 'center out' */
if (xpos < 0) xpos = 39 - (width >> 1);
 
video_putchar(ypos, xpos+width+2, COLOR_SELECT[mono], 0xBF); /* \ */
video_putchar(ypos, xpos-1, COLOR_SELECT[mono], 0xDA); /* / */
video_putchar(ypos+height-1, xpos-1, COLOR_SELECT[mono], 0xC0); /* \ */
video_putchar(ypos+height-1, xpos+width+2, COLOR_SELECT[mono], 0xD9);/* / */
video_putcharmulti(ypos, xpos, COLOR_SELECT[mono], 0xC4, width + 2, 1);
video_putcharmulti(ypos+height-1, xpos, COLOR_SELECT[mono], 0xC4, width + 2, 1);
video_putcharmulti(ypos+1, xpos-1, COLOR_SELECT[mono], 0xB3, height - 2, 80);
video_putcharmulti(ypos+1, xpos+width+2, COLOR_SELECT[mono], 0xB3, height - 2, 80);
 
for (;;) {
int key;
/* list of selectable items */
for (i = 0; i < height - 2; i++) {
if (i + offset == res) {
video_putchar(ypos + 1 + i, xpos, COLOR_SELECTCUR[mono], 16);
video_putchar(ypos + 1 + i, xpos+width+1, COLOR_SELECTCUR[mono], 17);
video_movecursor(ypos + 1 + i, xpos);
video_putstringfix(ypos + 1 + i, xpos+1, COLOR_SELECTCUR[mono], list[i + offset], width);
} else if (i + offset < count) {
video_putchar(ypos + 1 + i, xpos, COLOR_SELECT[mono], ' ');
video_putchar(ypos + 1 + i, xpos+width+1, COLOR_SELECT[mono], ' ');
video_putstringfix(ypos + 1 + i, xpos+1, COLOR_SELECT[mono], list[i + offset], width);
} else {
video_putcharmulti(ypos + 1 + i, xpos, COLOR_SELECT[mono], ' ', width+2, 1);
}
}
key = input_getkey();
if (key == 0x0D) { /* ENTER */
return(res);
} else if (key == 0x148) { /* up */
if (res > 0) {
res--;
if (res < offset) offset = res;
}
} else if (key == 0x150) { /* down */
if (res+1 < count) {
res++;
if (res > offset + height - 3) offset = res - (height - 3);
}
} else if (key == 0x147) { /* home */
res = 0;
offset = 0;
} else if (key == 0x14F) { /* end */
res = count - 1;
if (res > offset + height - 3) offset = res - (height - 3);
} else if (key == 0x1B) { /* ESC */
return(-1);
}/* else {
char buf[8];
snprintf(buf, sizeof(buf), "0x%02X ", key);
video_putstring(1, 0, COLOR_BODY[mono], buf, -1);
}*/
}
}
 
static void newscreen(int statusbartype) {
const char *msg;
msg = svarlang_strid(0x00); /* "SVARDOS INSTALLATION" */
video_putcharmulti(0, 0, COLOR_TITLEBAR[mono], ' ', 80, 1);
video_putstring(0, 40 - (strlen(msg) >> 1), COLOR_TITLEBAR[mono], msg, -1);
video_clear(COLOR_BODY[mono], 80, -80);
switch (statusbartype) {
case 1:
msg = svarlang_strid(0x000B); /* "Up/Down = Select entry | Enter = Validate your choice | ESC = Quit to DOS" */
break;
case 2:
msg = svarlang_strid(0x0005); /* "Press any key..." */
break;
case 3:
msg = "";
break;
default:
msg = svarlang_strid(0x000A); /* "Up/Down = Select entry | Enter = Validate your choice | ESC = Previous screen" */
break;
}
video_putchar(24, 0, COLOR_TITLEBAR[mono], ' ');
video_putstringfix(24, 1, COLOR_TITLEBAR[mono], msg, 79);
video_movecursor(25,0);
}
 
/* fills a slocales struct accordingly to the value of its keyboff member */
static void kblay2slocal(struct slocales *locales) {
const char *m;
for (m = kblayouts[locales->keyboff]; *m != 0; m++); /* skip layout name */
m++;
/* skip keyb code and copy it to locales.keybcode */
locales->keybcode = m;
for (; *m != 0; m++);
/* */
locales->codepage = ((unsigned short)m[1] << 8) | m[2];
locales->egafile = m[3];
locales->keybfile = m[4];
locales->keybid = ((unsigned short)m[5] << 8) | m[6];
}
 
static int selectlang(struct slocales *locales) {
int choice, x;
const char *msg;
const char *langlist[] = {
"English",
"French",
"German",
"Italian",
"Polish",
"Russian",
"Slovene",
"Swedish",
"Turkish",
NULL
};
 
newscreen(1);
msg = svarlang_strid(0x0100); /* "Welcome to SvarDOS" */
x = 40 - (strlen(msg) >> 1);
video_putstring(4, x, COLOR_BODY[mono], msg, -1);
video_putcharmulti(5, x, COLOR_BODY[mono], '=', strlen(msg), 1);
putstringnls(8, -1, COLOR_BODY[mono], 1, 1); /* "Please select your language from the list below:" */
choice = menuselect(11, -1, 11, langlist, -1);
if (choice < 0) return(MENUPREV);
/* populate locales with default values */
memset(locales, 0, sizeof(struct slocales));
switch (choice) {
case 1:
strcpy(locales->lang, "FR");
locales->keyboff = OFFLOC_FR;
locales->keyblen = OFFLEN_FR;
break;
case 2:
strcpy(locales->lang, "DE");
locales->keyboff = OFFLOC_DE;
locales->keyblen = OFFLEN_DE;
break;
case 3:
strcpy(locales->lang, "IT");
locales->keyboff = OFFLOC_IT;
locales->keyblen = OFFLEN_IT;
break;
case 4:
strcpy(locales->lang, "PL");
locales->keyboff = OFFLOC_PL;
locales->keyblen = OFFLEN_PL;
break;
case 5:
strcpy(locales->lang, "RU");
locales->keyboff = OFFLOC_RU;
locales->keyblen = OFFLEN_RU;
break;
case 6:
strcpy(locales->lang, "SI");
locales->keyboff = OFFLOC_SI;
locales->keyblen = OFFLEN_SI;
break;
case 7:
strcpy(locales->lang, "SV");
locales->keyboff = OFFLOC_SV;
locales->keyblen = OFFLEN_SV;
break;
case 8:
strcpy(locales->lang, "TR");
locales->keyboff = OFFLOC_TR;
locales->keyblen = OFFLEN_TR;
break;
default:
strcpy(locales->lang, "EN");
locales->keyboff = 0;
locales->keyblen = OFFCOUNT;
break;
}
/* populate the slocales struct accordingly to the keyboff member */
kblay2slocal(locales);
/* */
return(MENUNEXT);
}
 
 
static int selectkeyb(struct slocales *locales) {
int menuheight, choice;
if (locales->keyblen == 1) return(MENUNEXT); /* do not ask for keyboard layout if only one is available for given language */
newscreen(0);
putstringnls(5, 1, COLOR_BODY[mono], 1, 5); /* "SvarDOS supports different keyboard layouts */
menuheight = locales->keyblen + 2;
if (menuheight > 13) menuheight = 13;
choice = menuselect(10, -1, menuheight, &(kblayouts[locales->keyboff]), locales->keyblen);
if (choice < 0) return(MENUPREV);
/* (re)load the keyboard layout & codepage setup */
locales->keyboff += choice;
kblay2slocal(locales);
return(MENUNEXT);
}
 
 
/* returns 0 if installation must proceed, non-zero otherwise */
static int welcomescreen(void) {
int c;
const char *choice[3];
choice[0] = svarlang_strid(0x0001);
choice[1] = svarlang_strid(0x0002);
choice[2] = NULL;
newscreen(0);
putstringnls(4, 1, COLOR_BODY[mono], 2, 0); /* "You are about to install SvarDOS */
c = menuselect(13, -1, 4, choice, -1);
if (c < 0) return(MENUPREV);
if (c == 0) return(MENUNEXT);
return(MENUQUIT);
}
 
 
/* returns 1 if drive is removable, 0 if not, -1 on error */
static int isdriveremovable(int drv) {
union REGS r;
r.x.ax = 0x4408;
r.h.bl = drv;
int86(0x21, &r, &r);
/* CF set on error, AX set to 0 if removable, 1 if fixed */
if (r.x.cflag != 0) return(-1);
if (r.x.ax == 0) return(1);
return(0);
}
 
 
/* returns total disk space of drive drv (in MiB, max 2048), or -1 if drive invalid */
static int disksize(int drv) {
long res;
union REGS r;
r.h.ah = 0x36; /* DOS 2+ get free disk space */
r.h.dl = drv; /* A=1, B=2, etc */
int86(0x21, &r, &r);
if (r.x.ax == 0xffffu) return(-1); /* AX set to FFFFh if drive invalid */
res = r.x.ax; /* sectors per cluster */
res *= r.x.dx; /* dx contains total clusters, bx contains free clusters */
res *= r.x.cx; /* bytes per sector */
res >>= 20; /* convert bytes to MiB */
return(res);
}
 
 
/* returns 0 if disk is empty, non-zero otherwise */
static int diskempty(int drv) {
unsigned int rc;
int res;
char buff[8];
struct find_t fileinfo;
snprintf(buff, sizeof(buff), "%c:\\*.*", 'A' + drv - 1);
rc = _dos_findfirst(buff, _A_NORMAL | _A_SUBDIR | _A_HIDDEN | _A_SYSTEM, &fileinfo);
if (rc == 0) {
res = 1; /* call successfull means disk is not empty */
} else {
res = 0;
}
/* _dos_findclose(&fileinfo); */ /* apparently required only on OS/2 */
return(res);
}
 
#ifdef DEADCODE
/* set new DOS "current drive" to drv ('A', 'B', etc). returns 0 on success */
static int set_cur_drive(char drv) {
union REGS r;
if ((drv < 'A') || (drv > 'Z')) return(-1);
r.h.ah = 0x0E; /* DOS 1+ SELECT DEFAULT DRIVE */
r.h.dl = drv - 'A';
int86(0x21, &r, &r);
if (r.h.al < drv - 'A') return(-1);
return(0);
}
#endif
 
 
/* get the DOS "current drive" (0=A:, 1=B:, etc) */
static int get_cur_drive(void) {
union REGS r;
r.h.ah = 0x19; /* DOS 1+ GET CURRENT DEFAULT DRIVE */
int86(0x21, &r, &r);
return(r.h.al);
}
 
 
/* returns 0 if file exists, non-zero otherwise */
static int fileexists(const char *fname) {
FILE *fd;
fd = fopen(fname, "rb");
if (fd == NULL) return(-1);
fclose(fd);
return(0);
}
 
 
static int preparedrive(char sourcedrv) {
int driveremovable;
int selecteddrive = 3; /* default to 'C:' */
int cselecteddrive;
int ds;
int choice;
char buff[1024];
int driveid = 1; /* fdisk runs on first drive (unless USB boot) */
if (selecteddrive == get_cur_drive() + 1) { /* get_cur_drive() returns 0-based values (A=0) while selecteddrive is 1-based (A=1) */
selecteddrive = 4; /* use D: if install is run from C: (typically because it was booted from USB?) */
driveid = 2; /* primary drive is the emulated USB storage */
}
cselecteddrive = 'A' + selecteddrive - 1;
for (;;) {
driveremovable = isdriveremovable(selecteddrive);
if (driveremovable < 0) {
const char *list[4];
newscreen(0);
list[0] = svarlang_str(0, 3); /* Create a partition automatically */
list[1] = svarlang_str(0, 4); /* Run the FDISK tool */
list[2] = svarlang_str(0, 2); /* Quit to DOS */
list[3] = NULL;
snprintf(buff, sizeof(buff), svarlang_strid(0x0300), cselecteddrive, SVARDOS_DISK_REQ); /* "ERROR: Drive %c: could not be found. Note, that SvarDOS requires at least %d MiB of available disk space */
switch (menuselect(6 + putstringwrap(4, 1, COLOR_BODY[mono], buff), -1, 5, list, -1)) {
case 0:
sprintf(buff, "FDISK /AUTO %d", driveid);
system(buff);
break;
case 1:
video_clear(0x0700, 0, 0);
video_movecursor(0, 0);
sprintf(buff, "FDISK %d", driveid);
system(buff);
break;
case 2:
return(MENUQUIT);
default:
return(-1);
}
/* write a temporary MBR which only skips the drive (in case BIOS would
* try to boot off the not-yet-ready C: disk) */
sprintf(buff, "FDISK /AMBR %d", driveid);
system(buff); /* writes BOOT.MBR into actual MBR */
newscreen(2);
putstringnls(10, 10, COLOR_BODY[mono], 3, 1); /* "Your computer will reboot now." */
putstringnls(12, 10, COLOR_BODY[mono], 0, 5); /* "Press any key..." */
input_getkey();
reboot();
return(MENUQUIT);
} else if (driveremovable > 0) {
newscreen(2);
snprintf(buff, sizeof(buff), svarlang_strid(0x0302), cselecteddrive); /* "ERROR: Drive %c: is a removable device */
video_putstring(9, 1, COLOR_BODY[mono], buff, -1);
putstringnls(11, 2, COLOR_BODY[mono], 0, 5); /* "Press any key..." */
return(MENUQUIT);
}
/* if not formatted, propose to format it right away (try to create a directory) */
snprintf(buff, sizeof(buff), "%c:\\SVWRTEST.123", cselecteddrive);
if (mkdir(buff) == 0) {
rmdir(buff);
} else {
const char *list[3];
newscreen(0);
snprintf(buff, sizeof(buff), svarlang_str(3, 3), cselecteddrive); /* "ERROR: Drive %c: seems to be unformated. Do you wish to format it?") */
video_putstring(7, 1, COLOR_BODY[mono], buff, -1);
 
snprintf(buff, sizeof(buff), svarlang_strid(0x0007), cselecteddrive); /* "Format drive %c:" */
list[0] = buff;
list[1] = svarlang_strid(0x0002); /* "Quit to DOS" */
list[2] = NULL;
 
choice = menuselect(12, -1, 4, list, -1);
if (choice < 0) return(MENUPREV);
if (choice == 1) return(MENUQUIT);
video_clear(0x0700, 0, 0);
video_movecursor(0, 0);
snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVARDOS", cselecteddrive);
system(buff);
continue;
}
/* check total disk space */
ds = disksize(selecteddrive);
if (ds < SVARDOS_DISK_REQ) {
int y = 9;
newscreen(2);
snprintf(buff, sizeof(buff), svarlang_strid(0x0304), cselecteddrive, SVARDOS_DISK_REQ); /* "ERROR: Drive %c: is not big enough! SvarDOS requires a disk of at least %d MiB." */
y += putstringwrap(y, 1, COLOR_BODY[mono], buff);
putstringnls(++y, 1, COLOR_BODY[mono], 0, 5); /* "Press any key..." */
input_getkey();
return(MENUQUIT);
}
/* is the disk empty? */
newscreen(0);
if (diskempty(selecteddrive) != 0) {
const char *list[3];
int y = 6;
snprintf(buff, sizeof(buff), svarlang_strid(0x0305), cselecteddrive); /* "ERROR: Drive %c: not empty" */
y += putstringwrap(y, 1, COLOR_BODY[mono], buff);
 
snprintf(buff, sizeof(buff), svarlang_strid(0x0007), cselecteddrive); /* "Format drive %c:" */
list[0] = buff;
list[1] = svarlang_strid(0x0002); /* "Quit to DOS" */
list[2] = NULL;
 
choice = menuselect(++y, -1, 4, list, -1);
if (choice < 0) return(MENUPREV);
if (choice == 1) return(MENUQUIT);
video_clear(0x0700, 0, 0);
video_movecursor(0, 0);
snprintf(buff, sizeof(buff), "FORMAT %c: /Q /U /Z:seriously /V:SVARDOS", cselecteddrive);
system(buff);
continue;
} else {
/* final confirmation */
const char *list[3];
list[0] = svarlang_strid(0x0001); /* Install SvarDOS */
list[1] = svarlang_strid(0x0002); /* Quit to DOS */
list[2] = NULL;
snprintf(buff, sizeof(buff), svarlang_strid(0x0306), cselecteddrive); /* "The installation of SvarDOS to %c: is about to begin." */
video_putstring(7, -1, COLOR_BODY[mono], buff, -1);
choice = menuselect(10, -1, 4, list, -1);
if (choice < 0) return(MENUPREV);
if (choice == 1) return(MENUQUIT);
snprintf(buff, sizeof(buff), "SYS %c: %c: > NUL", sourcedrv, cselecteddrive);
system(buff);
sprintf(buff, "FDISK /MBR %d", driveid);
system(buff);
snprintf(buff, sizeof(buff), "%c:\\TEMP", cselecteddrive);
mkdir(buff);
return(cselecteddrive);
}
}
}
 
 
/* generates locales-related configurations and writes them to file (this
* is used to compute autoexec.bat content) */
static void genlocalesconf(FILE *fd, const struct slocales *locales) {
if (locales == NULL) return;
 
fprintf(fd, "SET LANG=%s\r\n", locales->lang);
 
if (locales->egafile > 0) {
fprintf(fd, "DISPLAY CON=(EGA,,1)\r\n");
if (locales->egafile == 1) {
fprintf(fd, "MODE CON CP PREPARE=((%u) %%DOSDIR%%\\CPI\\EGA.CPX)\r\n", locales->codepage);
} else {
fprintf(fd, "MODE CON CP PREPARE=((%u) %%DOSDIR%%\\CPI\\EGA%d.CPX)\r\n", locales->codepage, locales->egafile);
}
fprintf(fd, "MODE CON CP SELECT=%u\r\n", locales->codepage);
}
 
if (locales->keybfile > 0) {
fprintf(fd, "KEYB %s,%d,%%DOSDIR%%\\BIN\\", locales->keybcode, locales->codepage);
if (locales->keybfile == 1) {
fprintf(fd, "KEYBOARD.SYS");
} else {
fprintf(fd, "KEYBRD%d.SYS", locales->keybfile);
}
if (locales->keybid != 0) fprintf(fd, " /ID:%d", locales->keybid);
fprintf(fd, "\r\n");
}
}
 
 
static void bootfilesgen(char targetdrv, const struct slocales *locales) {
char buff[128];
FILE *fd;
/*** CONFIG.SYS ***/
snprintf(buff, sizeof(buff), "%c:\\TEMP\\CONFIG.SYS", targetdrv);
fd = fopen(buff, "wb");
if (fd == NULL) return;
fprintf(fd, "DOS=UMB,HIGH\r\n"
"LASTDRIVE=Z\r\n"
"FILES=50\r\n");
fprintf(fd, "DEVICE=C:\\SVARDOS\\BIN\\HIMEMX.EXE\r\n");
if (strcmp(locales->lang, "EN") == 0) {
strcpy(buff, "COMMAND");
} else {
snprintf(buff, sizeof(buff), "CMD-%s", locales->lang);
}
fprintf(fd, "SHELLHIGH=C:\\SVARDOS\\BIN\\%s.COM /E:512 /P\r\n", buff);
fprintf(fd, "REM COUNTRY=001,%u,C:\\SVARDOS\\CFG\\COUNTRY.SYS\r\n", locales->codepage);
fprintf(fd, "REM DEVICE=C:\\DRIVERS\\UDVD2\\UDVD2.SYS /D:SVCD0001 /H\r\n");
fclose(fd);
/*** AUTOEXEC.BAT ***/
snprintf(buff, sizeof(buff), "%c:\\TEMP\\AUTOEXEC.BAT", targetdrv);
fd = fopen(buff, "wb");
if (fd == NULL) return;
fprintf(fd, "@ECHO OFF\r\n");
fprintf(fd, "SET TEMP=C:\\TEMP\r\n");
fprintf(fd, "SET DOSDIR=C:\\SVARDOS\r\n");
fprintf(fd, "SET NLSPATH=%%DOSDIR%%\\NLS;.\r\n");
fprintf(fd, "SET DIRCMD=/OGNE/P/4\r\n");
fprintf(fd, "SET WATTCP.CFG=%%DOSDIR%%\\CFG\r\n");
fprintf(fd, "PATH %%DOSDIR%%\\BIN\r\n");
fprintf(fd, "PROMPT $P$G\r\n");
fprintf(fd, "ALIAS REBOOT=FDAPM COLDBOOT\r\n");
fprintf(fd, "ALIAS HALT=FDAPM POWEROFF\r\n");
fprintf(fd, "FDAPM APMDOS\r\n");
fprintf(fd, "\r\n");
genlocalesconf(fd, locales);
fprintf(fd, "\r\n");
fprintf(fd, "REM Uncomment the line below for CDROM support\r\n");
fprintf(fd, "REM SHSUCDX /d:SVCD0001\r\n");
fprintf(fd, "\r\n");
fprintf(fd, "REM Uncomment the line below for automatic mouse support\r\n");
fprintf(fd, "REM CTMOUSE\r\n");
fprintf(fd, "\r\n");
fprintf(fd, "ECHO.\r\n");
fprintf(fd, "ECHO %s\r\n", svarlang_strid(0x0600)); /* "Welcome to SvarDOS!" */
fclose(fd);
/*** CREATE DIRECTORY FOR CONFIGURATION FILES ***/
snprintf(buff, sizeof(buff), "%c:\\SVARDOS", targetdrv);
mkdir(buff);
snprintf(buff, sizeof(buff), "%c:\\SVARDOS\\CFG", targetdrv);
mkdir(buff);
/*** PKG.CFG ***/
snprintf(buff, sizeof(buff), "%c:\\SVARDOS\\CFG\\PKG.CFG", targetdrv);
fd = fopen(buff, "wb");
if (fd == NULL) return;
fprintf(fd, "# pkg config file - specifies locations where packages should be installed\r\n"
"\r\n"
"# Programs\r\n"
"DIR PROGS C:\\\r\n"
"\r\n"
"# Games \r\n"
"DIR GAMES C:\\\r\n"
"\r\n"
"# Drivers\r\n"
"DIR DRIVERS C:\\DRIVERS\r\n"
"\r\n"
"# Development tools\r\n"
"DIR DEVEL C:\\DEVEL\r\n");
fclose(fd);
/*** COUNTRY.SYS ***/
/*** PICOTCP ***/
/*** WATTCP ***/
snprintf(buff, sizeof(buff), "%c:\\SVARDOS\\CFG\\WATTCP.CFG", targetdrv);
fd = fopen(buff, "wb");
if (fd == NULL) return;
fprintf(fd, "my_ip = dhcp\r\n"
"#my_ip = 192.168.0.7\r\n"
"#netmask = 255.255.255.0\r\n"
"#nameserver = 192.168.0.1\r\n"
"#nameserver = 192.168.0.2\r\n"
"#gateway = 192.168.0.1\r\n");
fclose(fd);
}
 
 
static int installpackages(char targetdrv, char srcdrv, const struct slocales *locales) {
char pkglist[512];
int i, pkglistlen;
size_t pkglistflen;
char buff[1024]; /* must be *at least* 1 sector big for efficient file copying */
FILE *fd = NULL;
char *pkgptr;
newscreen(3);
/* load pkg list */
fd = fopen("install.lst", "rb");
if (fd == NULL) {
video_putstring(10, 30, COLOR_BODY[mono], "ERROR: INSTALL.LST NOT FOUND", -1);
input_getkey();
return(-1);
}
pkglistflen = fread(pkglist, 1, sizeof(pkglist), fd);
fclose(fd);
if (pkglistflen == sizeof(pkglist)) {
video_putstring(10, 30, COLOR_BODY[mono], "ERROR: INSTALL.LST TOO LARGE", -1);
input_getkey();
return(-1);
}
pkglist[pkglistflen] = 0xff; /* mark the end of list */
/* replace all \r and \n chars by 0 bytes, and count the number of packages */
pkglistlen = 0;
for (i = 0; i < pkglistflen; i++) {
switch (pkglist[i]) {
case '\n':
pkglistlen++;
/* FALLTHRU */
case '\r':
pkglist[i] = 0;
break;
}
}
/* copy pkg.exe to the new drive, along with all packages */
snprintf(buff, sizeof(buff), "%c:\\TEMP\\pkg.exe", targetdrv);
snprintf(buff + 64, sizeof(buff) - 64, "%c:\\pkg.exe", srcdrv);
fcopy(buff, buff + 64, buff, sizeof(buff));
 
/* open the post-install autoexec.bat and prepare initial instructions */
snprintf(buff, sizeof(buff), "%c:\\temp\\postinst.bat", targetdrv);
fd = fopen(buff, "wb");
if (fd == NULL) return(-1);
fprintf(fd, "@ECHO OFF\r\n");
 
/* copy packages */
pkgptr = pkglist;
for (i = 0;; i++) {
/* move forward to nearest entry or end of list */
while (*pkgptr == 0) pkgptr++;
if (*pkgptr == 0xff) break;
/* install the package */
snprintf(buff, sizeof(buff), svarlang_strid(0x0400), i+1, pkglistlen, pkgptr); /* "Installing package %d/%d: %s" */
strcat(buff, " ");
video_putstringfix(10, 1, COLOR_BODY[mono], buff, sizeof(buff));
/* wait for new diskette if package not found */
snprintf(buff, sizeof(buff), "%c:\\%s.svp", srcdrv, pkgptr);
while (fileexists(buff) != 0) {
putstringnls(12, 1, COLOR_BODY[mono], 4, 1); /* "INSERT THE DISK THAT CONTAINS THE REQUIRED FILE AND PRESS ANY KEY" */
input_getkey();
video_putstringfix(12, 1, COLOR_BODY[mono], "", 80); /* erase the 'insert disk' message */
}
/* proceed with package copy (buff contains the src filename already) */
snprintf(buff + 32, sizeof(buff) - 32, "%c:\\temp\\%s.svp", targetdrv, pkgptr);
if (fcopy(buff + 32, buff, buff, sizeof(buff)) != 0) {
video_putstring(10, 30, COLOR_BODY[mono], "READ ERROR", -1);
input_getkey();
fclose(fd);
return(-1);
}
/* write install instruction to post-install script */
fprintf(fd, "pkg install %s.svp\r\ndel %s.svp\r\n", pkgptr, pkgptr);
/* jump to next entry or end of list */
while ((*pkgptr != 0) && (*pkgptr != 0xff)) pkgptr++;
if (*pkgptr == 0xff) break;
}
/* set up locales so the "installation over" message is nicely displayed */
genlocalesconf(fd, locales);
/* replace autoexec.bat and config.sys now and write some nice message on screen */
fprintf(fd, "DEL pkg.exe\r\n"
"COPY CONFIG.SYS C:\\\r\n"
"DEL CONFIG.SYS\r\n"
"DEL C:\\AUTOEXEC.BAT\r\n"
"COPY AUTOEXEC.BAT C:\\\r\n"
"DEL AUTOEXEC.BAT\r\n");
/* print out the "installation over" message */
fprintf(fd, "ECHO.\r\n"
"ECHO %s\r\n"
"ECHO.\r\n", svarlang_strid(0x0501)); /* "SvarDOS installation is over. Please restart your computer now" */
fclose(fd);
 
/* prepare a dummy autoexec.bat that will call temp\postinst.bat */
snprintf(buff, sizeof(buff), "%c:\\autoexec.bat", targetdrv);
fd = fopen(buff, "wb");
if (fd == NULL) return(-1);
fprintf(fd, "@ECHO OFF\r\n"
"SET DOSDIR=C:\\SVARDOS\r\n"
"SET NLSPATH=%%DOSDIR%%\\NLS\r\n"
"PATH %%DOSDIR%%\\BIN\r\n");
fprintf(fd, "CD TEMP\r\n"
"postinst.bat\r\n");
fclose(fd);
 
return(0);
}
 
 
static void finalreboot(void) {
int y = 9;
newscreen(2);
y += putstringnls(y, 1, COLOR_BODY[mono], 5, 0); /* "Your computer will reboot now.\nPlease remove the installation disk from your drive" */
putstringnls(++y, 1, COLOR_BODY[mono], 0, 5); /* "Press any key..." */
input_getkey();
reboot();
}
 
 
static void loadcp(const struct slocales *locales) {
char buff[64];
if (locales->codepage == 437) return;
video_movecursor(1, 0);
if (locales->egafile == 1) {
snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%u) EGA.CPX) > NUL", locales->codepage);
} else {
snprintf(buff, sizeof(buff), "MODE CON CP PREP=((%u) EGA%d.CPX) > NUL", locales->codepage, locales->egafile);
}
system(buff);
snprintf(buff, sizeof(buff), "MODE CON CP SEL=%u > NUL", locales->codepage);
system(buff);
/* below I re-init the video controller - apparently this is required if
* I want the new glyph symbols to be actually applied, at least some
* (broken?) BIOSes, like VBox, apply glyphs only at next video mode change */
{
union REGS r;
r.h.ah = 0x0F; /* get current video mode */
int86(0x10, &r, &r); /* r.h.al contains the current video mode now */
r.h.al |= 128; /* set the high bit of AL to instruct BIOS not to flush VRAM's content (EGA+) */
r.h.ah = 0; /* re-set video mode (to whatever is set in AL) */
int86(0x10, &r, &r);
}
}
 
 
#ifdef DEADCODE
/* checks that drive drv contains SvarDOS packages
* returns 0 if found, non-zero otherwise */
static int checkinstsrc(char drv) {
char fname[16];
snprintf(fname, sizeof(fname), "%c:\\ATTRIB.SVP", drv);
return(fileexists(fname));
}
#endif
 
 
int main(void) {
struct slocales locales;
int targetdrv;
int sourcedrv;
int action;
 
sourcedrv = get_cur_drive() + 'A';
 
/* init screen and detect mono status */
mono = video_init();
 
SelectLang:
action = selectlang(&locales); /* welcome to svardos, select your language */
if (action != MENUNEXT) goto Quit;
loadcp(&locales);
svarlang_load("INSTALL", locales.lang, NULL); /* NLS support */
action = selectkeyb(&locales); /* what keyb layout should we use? */
if (action == MENUQUIT) goto Quit;
if (action == MENUPREV) goto SelectLang;
 
WelcomeScreen:
action = welcomescreen(); /* what svardos is, ask whether to run live dos or install */
if (action == MENUQUIT) goto Quit;
if (action == MENUPREV) goto SelectLang;
targetdrv = preparedrive(sourcedrv); /* what drive should we install from? check avail. space */
if (targetdrv == MENUQUIT) goto Quit;
if (targetdrv == MENUPREV) goto WelcomeScreen;
bootfilesgen(targetdrv, &locales); /* generate boot files and other configurations */
if (installpackages(targetdrv, sourcedrv, &locales) != 0) goto Quit; /* install packages */
/*localcfg();*/ /* show local params (currency, etc), and propose to change them (based on localcfg) */
/*netcfg();*/ /* basic networking config */
finalreboot(); /* remove the CD and reboot */
 
Quit:
video_clear(0x0700, 0, 0);
video_movecursor(0, 0);
return(0);
}
/install/tags/20220217/install.txt
0,0 → 1,33
 
SVARDOS INSTALLER
Copyright (C) 2016-2022 Mateusz Viste
 
This is a simple installer for SvarDOS. It installs packages from the CD or
floppy (relying on pkginst), SYS the boot disk and pre-configures default boot
files (autoexec.bat and config.sys).
 
 
=== LICENSE ===
 
The SvarDOS INSTALL program is published under the terms of the MIT license.
 
Copyright (C) 2016-2022 Mateusz Viste
All rights reserved.
 
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
 
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
/install/tags/20220217/keylay.h
0,0 → 1,36
/* DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED BY LOCALES.EXE */
const char *kblayouts[] = {
/****** EN ******/
"English (US)\0en\0\1\265\0\0\0\0",
"English (UK)\0uk\0\1\265\0\1\0\0",
/****** HY ******/
"Armenian\0hy\0\3\203\6\3\0\0",
/****** BG ******/
"Bulgarian\0bg\0\3\150\3\2\0\0",
/****** FR ******/
"French (France)\0fr\0\3\132\1\1\0\0",
"French (Canada, standard)\0cf\0\3\137\11\1\0\0",
"French (Canada, legacy)\0cf\0\3\137\11\1\1\365",
/****** DE ******/
"German\0de\0\3\132\1\1\0\0",
/****** HU ******/
"Hungarian\0hu\0\3\124\1\1\0\320",
/****** IT ******/
"Italian\0it\0\3\132\1\1\0\0",
/****** NO ******/
"Norvegian\0no\0\3\132\11\1\0\0",
/****** PL ******/
"Polish (Programmer)\0pl\0\3\337\12\1\0\0",
"Polish (Typewriter)\0pl\0\3\337\12\1\0\326",
/****** RU ******/
"Russian (Standard)\0ru\0\3\142\3\2\0\0",
"Russian (Typewriter)\0ru\0\3\142\3\2\1\273",
/****** SI ******/
"Slovenian\0si\0\3\124\1\1\0\0",
/****** ES ******/
"Spanish\0es\0\3\132\1\1\0\0",
/****** SV ******/
"Swedish\0sv\0\3\132\1\1\0\0",
/****** TR ******/
"Turkish\0tr\0\3\131\1\2\0\0",
NULL};
/install/tags/20220217/keyoff.h
0,0 → 1,30
/* DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED BY LOCALES.EXE */
#define OFFLOC_EN 0
#define OFFLEN_EN 2
#define OFFLOC_HY 2
#define OFFLEN_HY 1
#define OFFLOC_BG 3
#define OFFLEN_BG 1
#define OFFLOC_FR 4
#define OFFLEN_FR 3
#define OFFLOC_DE 7
#define OFFLEN_DE 1
#define OFFLOC_HU 8
#define OFFLEN_HU 1
#define OFFLOC_IT 9
#define OFFLEN_IT 1
#define OFFLOC_NO 10
#define OFFLEN_NO 1
#define OFFLOC_PL 11
#define OFFLEN_PL 2
#define OFFLOC_RU 13
#define OFFLEN_RU 2
#define OFFLOC_SI 15
#define OFFLEN_SI 1
#define OFFLOC_ES 16
#define OFFLEN_ES 1
#define OFFLOC_SV 17
#define OFFLEN_SV 1
#define OFFLOC_TR 18
#define OFFLEN_TR 1
#define OFFCOUNT 19
/install/tags/20220217/locales.c
0,0 → 1,140
/*
* This program creates a header file for the SvarDOS installer, that
* contains the list of all supported keyboard layouts, along with a way to
* select sets of keyboard layouts that apply to only a specific region.
*
* Copyright (C) 2016 Mateusz Viste
*/
 
/* the kblayouts list is a NULL-terminated array that contains entries in the
* following format:
* human description string <0> layout code string <0> <codepage number as a 16bit value> <ega.sys file number as a single byte> <keyboard.sys file number as a single byte> <sub keyb ID as a 16bit value, zero if none>
 
char *kblayouts[] = {
"English (US)\0xxxx",
"Polish\0pl\0xxxx"};
};
*/
 
 
#include <stdio.h>
#include <string.h>
 
 
/* global file pointers */
FILE *fdkeyb, *fdoff;
 
 
/* Converts a positive base_10 into base_8 */
static unsigned int dec2oct(int n) {
int res=0, digitPos=1;
while (n) {
res += (n & 7) * digitPos;
n >>= 3;
digitPos *= 10;
}
return(res);
}
 
 
static void addnew(char *countrycode, char *humanlang, char *keybcode, unsigned short cp, unsigned char egafile, unsigned char keybfile, unsigned int subid) {
static char lastcountry[4] = {0};
static int curoffset = 0, curcountryoffset = 0;
/* if new country, declare an offset */
if (strcmp(countrycode, lastcountry) != 0) {
/* close previous one, if any */
if (lastcountry[0] != 0) {
fprintf(fdoff, "#define OFFLEN_%s %d\r\n", lastcountry, curoffset - curcountryoffset);
} else {
fprintf(fdkeyb, "const char *kblayouts[] = {\r\n");
}
/* open new one, if any */
if (countrycode[0] != 0) {
fprintf(fdkeyb, " /****** %s ******/\r\n", countrycode);
curcountryoffset = curoffset;
fprintf(fdoff, "#define OFFLOC_%s %d\r\n", countrycode, curoffset);
strcpy(lastcountry, countrycode);
} else {
fprintf(fdoff, "#define OFFCOUNT %d\r\n", curoffset);
}
}
/* */
if (countrycode[0] != 0) {
fprintf(fdkeyb, " \"%s\\0%s\\0\\%d\\%d\\%d\\%d\\%d\\%d\",\r\n", humanlang, keybcode, dec2oct(cp >> 8), dec2oct(cp & 0xff), dec2oct(egafile), dec2oct(keybfile), dec2oct(subid >> 8), dec2oct(subid & 0xff));
} else {
fprintf(fdkeyb, " NULL};\r\n");
}
curoffset++;
}
 
 
int main(void) {
 
/*** open files ***/
fdkeyb = fopen("keylay.h", "wb");
fdoff = fopen("keyoff.h", "wb");
fprintf(fdkeyb, "/* DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED BY LOCALES.EXE */\r\n");
fprintf(fdoff, "/* DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED BY LOCALES.EXE */\r\n");
 
/******************* LAYOUTS LIST START *******************/
 
/* addnew(countrycode, humanlang, keybcode, cp, egafile, keybfile, subid) */
 
/* English */
addnew("EN", "English (US)", "en", 437, 0, 0, 0);
addnew("EN", "English (UK)", "uk", 437, 0, 1, 0);
 
/* Armenian */
addnew("HY", "Armenian", "hy", 899, 6, 3, 0);
 
/* Bulgarian */
addnew("BG", "Bulgarian", "bg", 872, 3, 2, 0);
 
/* French */
addnew("FR", "French (France)", "fr", 858, 1, 1, 0);
addnew("FR", "French (Canada, standard)", "cf", 863, 9, 1, 0);
addnew("FR", "French (Canada, legacy)", "cf", 863, 9, 1, 501);
 
/* German */
addnew("DE", "German", "de", 858, 1, 1, 0);
 
/* Hungarian */
addnew("HU", "Hungarian", "hu", 852, 1, 1, 208);
 
/* Italian */
addnew("IT", "Italian", "it", 858, 1, 1, 0);
 
/* Norvegian */
addnew("NO", "Norvegian", "no", 858, 9, 1, 0);
 
/* Polish */
addnew("PL", "Polish (Programmer)", "pl", 991, 10, 1, 0);
addnew("PL", "Polish (Typewriter)", "pl", 991, 10, 1, 214);
 
/* Russian */
addnew("RU", "Russian (Standard)", "ru", 866, 3, 2, 0);
addnew("RU", "Russian (Typewriter)", "ru", 866, 3, 2, 443);
 
/* Slovenian */
addnew("SI", "Slovenian", "si", 852, 1, 1, 0);
 
/* Spanish */
addnew("ES", "Spanish", "es", 858, 1, 1, 0);
 
/* Swedish */
addnew("SV", "Swedish", "sv", 858, 1, 1, 0);
 
/* Turkish */
addnew("TR", "Turkish", "tr", 857, 1, 2, 0);
 
/******************* LAYOUTS LIST STOP *******************/
 
/* end of list - DO NOT REMOVE */
addnew("", "", "", 0, 0, 0, 0);
 
/* close files */
fclose(fdoff);
fclose(fdkeyb);
 
return(0);
}
/install/tags/20220217/makefile
0,0 → 1,46
#
# This is a makefile to build the SvarDOS install program
#
# You can use following targets:
#
# wmake - compiles the program
# wmake clean - cleans up all non-source files
#
 
all: install.com
 
install.com: keylay.h install.c input.c video.c deflang.c
wcl -0 -y -cc -wx -mt -lr -we -d0 -ox install.c input.c video.c deflang.c svarlang.lib\svarlngs.lib
upx --8086 -9 install.com
 
deflang.c:
cd nls
utf8tocp 437 en_utf8.txt > en.txt
utf8tocp 858 de_utf8.txt > de.txt
utf8tocp 858 fr_utf8.txt > fr.txt
utf8tocp 858 it_utf8.txt > it.txt
utf8tocp maz pl_utf8.txt > pl.txt
utf8tocp 866 ru_utf8.txt > ru.txt
utf8tocp 852 si_utf8.txt > si.txt
utf8tocp 858 sv_utf8.txt > sv.txt
utf8tocp 857 tr_utf8.txt > tr.txt
..\svarlang.lib\tlumacz en de fr it pl ru si sv tr
if exist ..\deflang.c del ..\deflang.c
if exist ..\install.lng del ..\install.lng
move deflang.c ..
move out.lng ..\install.lng
del ??.txt
cd ..
 
locales.exe: locales.c
wcl -0 -y -cc -wx -ml -lr -we -d0 -ox locales.c
 
keylay.h: locales.exe
locales.exe
 
clean: .SYMBOLIC
del install.com
del locales.exe
del *.obj
del deflang.c
del install.lng
/install/tags/20220217/nls/de_utf8.txt
0,0 → 1,51
#
# This is a localization file for the SvarDOS INSTALL program
#
# Language..: German
# Translator: Jörg Jenderek, Robert Riebisch
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
0.0:SVARDOS INSTALLATION
0.1:SvarDOS installieren
0.2:Zurück zu DOS
0.3:Erstelle eine Partition automatisch
0.4:Partitionierungswerkzeug FDISK ausführen
0.5:Drücken Sie eine beliebige Taste...
0.7:Laufwerk %c: formatieren
# Every string below must be at most 78 characters long! (used in status bar)
0.10:Hoch/Runter=Eintrag wählen | Enter=Bestätigen | ESC=Vorheriger Bildschirm
0.11:Hoch/Runter=Eintrag wählen | Enter=Bestätigen | ESC=Zurück zu DOS
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
1.0:Willkommen bei SvarDOS
1.1:Bitte wählen Sie Ihre bevorzugte Sprache aus der folgenden Liste:
1.5:SvarDOS unterstützt verschiedene Tastaturlayouts. Wählen Sie das gewünschte Tastaturlayout aus.
 
### WELCOME SCREEN ###
2.0:Sie sind dabei, SvarDOS zu installieren: ein freies und quelloffenes, MS-DOS-kompatibles Betriebssystem basierend auf FreeDOS. SvarDOS kommt mit einer Vielzahl von Anwendungen von Drittanbietern.\n\nWARNUNG: Wenn auf Ihrem PC bereits ein anderes Betriebssystem installiert ist, startet dieses möglicherweise nicht mehr, sobald SvarDOS installiert ist.
 
### DISK SETUP ###
3.0:FEHLER: Laufwerk %c: konnte nicht gefunden werden. Vielleicht muss die Festplatte zuerst partitioniert werden. Bitte erstellen Sie mindestens eine primäre Partition auf Ihrer Festplatte, so dass SvarDOS darauf installiert werden kann. Beachten Sie, dass SvarDOS mindestens %d MiB des verfügbaren Speicherplatzes benötigt.\n\nSie können das Partitionierungswerkzeug FDISK verwenden, um die erforderliche Partition manuell zu erstellen, oder Sie können das Installationsprogramm die Festplatte automatisch partitionieren lassen. Sie können auch die Installation abbrechen, um einen anderen Partitionsmanager Ihrer Wahl zu verwenden.
3.1:Ihr Computer wird jetzt neu gestartet.
3.2:FEHLER: Laufwerk %c: ist ein Wechseldatenträger. Installation abgebrochen.
3.3:FEHLER: Laufwerk %c: scheint unformatiert zu sein.
3.4:FEHLER: Laufwerk %c: ist nicht groß genug! SvarDOS benötigt mindestens %d MiB.
3.5:FEHLER: Laufwerk %c: ist nicht leer. SvarDOS muss auf einem leeren Datenträger installiert werden.\n\nSie können den Datenträger jetzt formatieren, um ihn zu leeren. Beachten Sie jedoch, dass dies ALLE AKTUELLEN DATEN auf Ihrer Festplatte löscht.
3.6:Die Installation von SvarDOS auf Laufwerk %c: beginnt nun.
 
### PACKAGES INSTALLATION ###
# example: "Installing package 4/50: FDISK"
4.0:Installiere Paket %d von %d: %s
4.1:*** LEGEN SIE DEN DATENTRÄGER, DER DIE BENÖTIGTE DATEI ENTHÄLT, EIN UND DRÜCKEN SIE EINE BELIEBIGE TASTE ***
 
### END SCREEN ###
5.0:Ihr Computer wird jetzt neu gestartet.\nBitte entfernen Sie den Installationsdatenträger.
5.1:Installation von SvarDOS abgeschlossen. Bitte starten Sie Ihren Computer neu.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
6.0:Willkommen bei SvarDOS! Geben Sie 'HELP' ein, wenn Sie Hilfe benötigen.
 
# Local Variables:
# coding:cp850-dos
# End:
/install/tags/20220217/nls/en_utf8.txt
0,0 → 1,47
#
# This is a localization file for the SvarDOS INSTALL program
#
# Language..: English
# Translator: Mateusz Viste
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
0.0:SVARDOS INSTALLATION
0.1:Install SvarDOS
0.2:Quit to DOS
0.3:Create a partition automatically
0.4:Run the FDISK partitioning tool
0.5:Press any key...
0.7:Format drive %c:
# Every string below must be at most 78 characters long! (used in status bar)
0.10:Up/Down = Select entry | Enter = Confirm choice | ESC = Previous screen
0.11:Up/Down = Select entry | Enter = Confirm choice | ESC = Quit to DOS
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
1.0:Welcome to SvarDOS
1.1:Please select your preferred language from the list below:
1.5:SvarDOS supports different keyboard layouts. Choose the keyboard layout that you want.
 
### WELCOME SCREEN ###
2.0:You are about to install SvarDOS: a free, MS-DOS compatible operating system based on FreeDOS. SvarDOS 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 SvarDOS is installed.
 
### DISK SETUP ###
3.0:ERROR: Drive %c: could not be found. Perhaps your hard disk needs to be partitioned first. Please create at least one primary partition on your hard disk, so SvarDOS can be installed on it. Note, that SvarDOS 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.
3.1:Your computer will reboot now.
3.2:ERROR: Drive %c: is a removable device. Installation aborted.
3.3:ERROR: Drive %c: seems to be unformated.
3.4:ERROR: Drive %c: is not big enough! SvarDOS requires a disk of at least %d MiB.
3.5:ERROR: Drive %c: is not empty. SvarDOS 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.
3.6:The installation of SvarDOS to %c: is about to begin.
 
### PACKAGES INSTALLATION ###
# example: "Installing package 4/50: FDISK"
4.0:Installing package %d/%d: %s
4.1:*** INSERT THE DISK THAT CONTAINS THE REQUIRED FILE AND PRESS ANY KEY ***
 
### END SCREEN ###
5.0:Your computer will reboot now.\nPlease remove the installation disk from your drive.
5.1:SvarDOS installation is over. Please restart your computer now.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
6.0:Welcome to SvarDOS! Type 'HELP' if you need help.
/install/tags/20220217/nls/fr_utf8.txt
0,0 → 1,45
#
# This is a localization file for the SvarDOS INSTALL program
#
# Language..: French
# Translator: anonymous
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
0.0:INSTALLATION DE SVARDOS
0.1:Installer SvarDOS
0.2:Quitter vers DOS
0.3:Créer une partition automatiquement
0.4:Exécuter l'outil de partitionnement FDISK
0.5:Appuyez sur une touche quelconque...
# Every string below must be at most 78 characters long! (used in status bar)
0.10:Haut/Bas = Choisir l'élément | Entrée = Valider | Échap = Écran précédent
0.11:Haut/Bas = Choisir l'élément | Entrée = Valider | Échap = Quitter vers DOS
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
1.0:Bienvenue sur SvarDOS
1.1:Veuillez choisir votre langue sur la liste ci-dessous :
1.5:SvarDOS prend en charge différents claviers. Choisissez le clavier que vous préférez.
 
### WELCOME SCREEN ###
2.0:Vous êtes sur le point d'installer SvarDOS : un système d'exploitation libre, compatible avec MS-DOS et basé sur le noyau FreeDOS. SvarDOS offre une multitude d'applications tierces.\n\nATTENTION : s'il y a un autre système d'exploitation installé sur votre PC, cet autre système pourrait ne plus démarrer une fois que SvarDOS sera installé.
 
### DISK SETUP ###
3.0:ERREUR: le lecteur %c: n'a pu être trouvé. Peut-être que votre disque a d'abord besoin d'être partitionné. Veuillez créer au moins une partition sur votre disque dur pour que SvarDOS puisse y être installé. Notez que SvarDOS nécessite au moins %d Mio d'espace disque disponible.\n\nVous pouvez utiliser l'outil de partitionnement FDISK pour créer manuellement la partition nécessaire, ou bien vous pouvez laisser l'installeur partitionner votre disque automatiquement. Vous pouvez aussi annuler l'installation pour utiliser un autre outil.
3.1:Votre ordinateur va maintenant redémarrer.
3.2:ERREUR: le lecteur %c: est un périphérique amovible. Installation annulée.
3.3:ERREUR: le lecteur %c: ne semble pas être formaté.
3.4:ERREUR: le lecteur %c: n'a pas assez d'espace ! SvarDOS nécessite un disque d'au moins %d Mio.
3.5:ERREUR: le lecteur %c: n'est pas vide. SvarDOS doit être installé sur un disque vide.\n\nVous pouvez formater le disque maintenant afin de le vider. Veuillez noter cependant que cela EFFACERA TOUTES LES DONNÉES ACTUELLES de votre disque.
3.6:L'installation de SvarDOS sur %c: est sur le point de commencer.
 
### PACKAGES INSTALLATION ###
# example: "Installing package 4/50: FDISK"
4.0:Installation du paquet %d/%d: %s
 
### END SCREEN ###
5.0:Votre ordinateur va maintenant redémarrer.\nVeuillez enlever le disque d'installation de votre lecteur.
5.1:L'installation de SvarDOS est terminée. Veuillez svp redémarrer votre ordinateur.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
6.0:Bienvenue sur SvarDOS ! Tapez 'HELP' si vous avez besoin d'aide.
/install/tags/20220217/nls/it_utf8.txt
0,0 → 1,47
#
# This is a localization file for the SvarDOS INSTALL program
#
# Language..: Italian
# Codepage..: 850/858/437
# Translator: Roberto Mariottini
# Revision..: 2
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
0.0:INSTALLAZIONE DI SVARDOS
0.1:Installa SvarDOS
0.2:Esci al DOS
0.3:Crea automaticamente una partizione
0.4:Esegui lo strumento di partizionamento FDISK
0.5:Premi un tasto...
# Every string below must be at most 78 characters long! (used in status bar)
0.10:Su/Giù = Seleziona | Invio = Conferma la scelta | ESC = Precedente
0.11:Su/Giù = Seleziona | Invio = Conferma la scelta | ESC = Esci al DOS
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
1.0:Benvenuto in SvarDOS
1.1:Seleziona la lingua desiderata dalla lista seguente:
1.5:SvarDOS supporta le tastiere usate in paesi differenti. Scegli la tastiera che stai usando.
 
### WELCOME SCREEN ###
2.0:Stai per installare SvarDOS: un sistema operativo libero, compatibile con MSDOS, basato sul kernel di FreeDOS. SvarDOS include una varietà di applicazioni di terze parti.\n\nATTENZIONE: Se il tuo PC ha già un altro sistema operativo installato, l'altro sistema operativo potrebbe non essere in grado di ripartire dopo aver installato SvarDOS.
 
### DISK SETUP ###
3.0:ERRORE: L'unità %c: non è stata trovata. Forse perché l'hard disk deve essere prima partizionato. Occorre creare almeno una partizione sull'hard disk per poterci installare SvarDOS. Notare che SvarDOS richiede almeno %d MiB di spazio libero su disco.\n\nPuoi usare lo strumento di partizionamento FDISK per creare la partizione manualmente, o lasciare che il programma di installazione partizioni il disco automaticamente. Puoi anche annullare l'installazione per usare lo strumento di partizionamento che preferisci.
3.1:Il computer sarà ora riavviato.
3.2:ERRORE: L'unità %c: è un disco rimovibile. Installazione annullata.
3.3:ERRORE: L'unità %c: non sembra essere formattata.
3.4:ERRORE: L'unità %c: non è abbastanza capiente! SvarDOS richiede un disco di almeno %d MiB.
3.5:ERRORE: L'unità %c: non è vuota. SvarDOS deve essere installato su un disco vuoto.\n\nPuoi formattare il disco adesso, per svuotarlo. Nota che questa operazione CANCELLERA' TUTTI I DATI presenti sul disco.
3.6:L'installazione di SvarDOS in %c: sta per cominciare.
 
### PACKAGES INSTALLATION ###
# example: "Installing package 4/50: FDISK"
4.0:Installazione del pacchetto %d/%d: %s
 
### END SCREEN ###
5.0:Il computer sarà riavviato.\nRimuovere il disco di installazione dall'unità.
5.1:L'installazione di SvarDOS è terminata. Please restart your computer now.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
6.0:Benvenuto in SvarDOS! Scrivi 'HELP' se hai bisogno di aiuto.
/install/tags/20220217/nls/pl_utf8.txt
0,0 → 1,47
#
# This is a localization file for the SvarDOS INSTALL program
#
# Language..: Polish
# Translator: Mateusz Viste
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
0.0:INSTALACJA SVARDOS
0.1:Instaluj SvarDOS
0.2:Wyjdź do DOS
0.3:Stwórz partycję automatycznie
0.4:Uruchom narzędzie partycjonowania FDISK
0.5:Naciśnij dowolny klawisz...
0.7:Formatuj dysk %c:
# Every string below must be at most 78 characters long! (used in status bar)
0.10:Góra/Dół = Wybór pozycji | Enter = Zatwierdź wybór | ESC = Poprzedni ekran
0.11:Góra/Dół = Wybór pozycji | Enter = Zatwierdź wybór | ESC = Wyjdź do DOS
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
1.0:Witaj w systemie SvarDOS
1.1:Wybierz swój język z poniższej listy:
1.5:SvarDOS wspiera różne układy klawiatury. Wybierz układ, który ci odpowiada.
 
### WELCOME SCREEN ###
2.0:Za chwilę rozpocznie się instalacja systemu SvarDOS: bezpłatnego systemu operacyjnego opartego na jądrze FreeDOS, i kompatybilnego z MSDOS. SvarDOS zawiera mnóstwo aplikacji dodatkowych.\n\nUWAGA: Jeśli twój komputer posiada już inny system operacyjny, system ten może nie zdołać uruchomić się po instalacji SvarDOS.
 
### DISK SETUP ###
3.0:BŁĄD: Nie wykryto dysku %c:. Być może twój dysk powinien zostać najpierw spartycjonowany. Utwórz co najmniej jedną partycję na twoim dysku, aby SvarDOS mógł zostać na nią zainstalowany. SvarDOS wymaga co najmniej %d MiB miejsca.\n\nMożesz skorzystać z narzędzia FDISK aby stworzyć wymaganą partycję ręcznie, lub pozwolić instalatorowi stworzyć ją automatycznie. Możesz także wstrzymać instalację aby użyć jakiegokolwiek innego narzędzia do partycjonowania.
3.1:Twój komputer zostanie teraz uruchomiony ponownie.
3.2:BŁĄD: Dysk %c: jest nośnikiem wymiennym. Instalacja zatrzymana.
3.3:BŁĄD: Dysk %c: zdaje się nie być sformatowany.
3.4:BŁĄD: Dysk %c: jest za mały! SvarDOS wymaga co najmniej %d MiB miejsca.
3.5:BŁĄD: Dysk %c: nie jest pusty. SvarDOS może być zainstalowany wyłącznie na pustym dysku.\n\nMożesz sformatować dysk teraz, aby go opróżnić. Operacja ta sprawi jednak że WSZYSTKIE OBECNE DANE ZOSTANĄ UTRACONE.
3.6:Za chwilę rozpocznie się instalacja systemu SvarDOS na dysk %c:.
 
### PACKAGES INSTALLATION ###
# example: "Installing package 4/50: FDISK"
4.0:Instalacja pakietu %d/%d: %s
4.1:*** WŁÓŻ DYSK ZAWIERAJĄCY POTRZEBNY PLIK I NACIŚNIJ DOWOLNY KLAWISZ ***
 
### END SCREEN ###
5.0:Twój komputer zostanie teraz uruchomiony ponownie.\nWyjmij dysk instalacyjny z napędu.
5.1:Instalacja SvarDOS jest zakończona. Proszę zrestartować teraz komputer.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
6.0:Witaj w systemie SvarDOS! Wpisz 'HELP' jeśli potrzebujesz pomocy.
/install/tags/20220217/nls/ru_utf8.txt
0,0 → 1,45
#
# This is a localization file for the SvarDOS INSTALL program
#
# Language..: Russian
# Translator: Mateusz Viste
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
0.0:УСТАНОВКА SVARDOS
0.1:Установить SvarDOS
0.2:Выход в DOS
0.3:Создание раздела автоматически
0.4:Запуск FDISK
0.5:Нажмите любую кнопку...
# Every string below must be at most 78 characters long! (used in status bar)
0.10:Вверх/вниз = выбор входа | Enter = Подтвердить выбор | ESC = Предыдущий экран
0.11:Вверх/вниз = выбор входа | Enter = Подтвердить выбор | ESC = Выход в DOS
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
1.0:Добро пожаловать в SvarDOS
1.1:Пожалуйста, выберите язык из списка ниже:
1.5:SvarDOS поддерживает раскладки клавиатуры. Выберите раскладки клавиатуры вы хотите.
 
### WELCOME SCREEN ###
2.0:Вы собираетесь установить SvarDOS: свободный, MSDOS-совместимая операционная система, основанная на ядре FreeDOS. SvarDOS поставляется с множеством сторонних пакетов.\n\nВНИМАНИЕ: Если ваш компьютер имеет другую операционную систему, это другая система может оказаться не в состоянии загрузиться после установки SvarDOS.
 
### DISK SETUP ###
3.0:ОШИБКА: Диск %c: не может быть найден. Возможно, ваш диск должен первый быть разбит на разделы. Пожалуйста, создайте по крайней мере один раздел на диске, поэтому SvarDOS может быть установлен на нем. Обратите внимание, что SvarDOS требует по крайней мере %d МиБ свободного места на диске.\n\nВы можете использовать FDISK для создания требуемого раздела вручную, или вы можете позволить программе установки разбиения вашего диска автоматически. Вы также можете отменить установку использовать любой другой менеджер разделов по вашему выбору.
3.1:Ваш компьютер будет сейчас перезагружен.
3.2:ОШИБКА: Диск %c: является съемным. Установка прервана.
3.3:ОШИБКА: Диск %c:, кажется, не отформатирован.
3.4:ОШИБКА: Диск %c: слишком мал! SvarDOS требует диск не менее %d МиБ.
3.5:ОШИБКА: Диск %c: не является пустым. SvarDOS должен быть установлен на пустой диск.\n\nВы можете отформатировать диск сейчас, чтобы сделать его пустым. Отметим, однако, что это приведет к УДАЛЕНИЮ ВСЕХ ДАННЫХ на жестком диске.
3.6:Установка SvarDOS до %c: вот-вот начнется.
 
### PACKAGES INSTALLATION ###
# example: "Installing package 4/50: FDISK"
4.0:Установка пакета %d/%d: %s
 
### END SCREEN ###
5.0:Ваш компьютер будет сейчас перезагружен.\nПожалуйста, удалите установочный диск из дисковода.
5.1:Установка SvarDOS закончена. Please restart your computer now.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
6.0:Добро пожаловать в SvarDOS! Введите слово "HELP", если вам нужна помощь.
/install/tags/20220217/nls/si_utf8.txt
0,0 → 1,45
#
# This is a localization file for the SvarDOS INSTALL program
#
# Language..: Slovene
# Translator: Matej Horvat
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
0.0:NAMESTITEV SVARDOS
0.1:Namesti SvarDOS
0.2:Izhod v DOS
0.3:Samodejno ustvari particijo
0.4:Zaženi program za particioniranje FDISK
0.5:Pritisnite tipko...
# Every string below must be at most 78 characters long! (used in status bar)
0.10:Gor/dol = izbira | Enter = potrdi izbiro | Esc = prejšnji zaslon
0.11:Gor/dol = izbira | Enter = potrdi izbiro | Esc = izhod v DOS
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
1.0:Dobrodošli v SvarDOS!
1.1:Izberite svoj jezik s spodnjega seznama:
1.5:SvarDOS podpira razporede tipkovnic več držav. Izberite, katerega želite uporabljati.
 
### WELCOME SCREEN ###
2.0:Ta program bo namestil SvarDOS - brezplačen in odprtokoden operacijski sistem, združljiv z MS-DOS, ki uporablja jedro projekta FreeDOS. SvarDOS vključuje veliko aplikacij tretjih oseb.\n\nOPOZORILO: Če ima računalnik že nameščen operacijski sistem, tega morda ne bo več mogoče zagnati, ko boste namestili SvarDOS.
 
### DISK SETUP ###
3.0:NAPAKA: Pogon %c: ni bil najden. Morda je treba najprej ustvariti particijo na trdem disku. Prosimo, ustvarite vsaj eno particijo, da lahko namestite SvarDOS. Velika mora biti vsaj %d MB.\n\nUstvarite jo lahko sami s programom FDISK, lahko pa jo program za namestitev ustvari samodejno. Namestitev lahko tudi prekinete in uporabite svoj program za particioniranje.
3.1:Računalnik se bo zdaj ponovno zagnal.
3.2:NAPAKA: Pogon %c: je odstranljiv medij. Namestitev bo prekinjena.
3.3:NAPAKA: Pogon %c: ni formatiran.
3.4:NAPAKA: Pogon %c: je premajhen. SvarDOS zahteva vsaj %d MB prostora.
3.5:NAPAKA: Pogon %c: ni prazen. SvarDOS mora biti nameščen na prazen pogon.\n\nLahko ga formatirate in s tem izpraznite, vendar bo to IZBRISALO VSE PODATKE na njem.
3.6:Namestitev operacijskega sistema SvarDOS na pogon %c: se bo začela.
 
### PACKAGES INSTALLATION ###
# example: "Installing package 4/50: FDISK"
4.0:Nameščanje paketa %d/%d: %s
 
### END SCREEN ###
5.0:Računalnik se bo zdaj ponovno zagnal.\nProsimo, odstranite namestitveni medij.
5.1:SvarDOS je nameščen. Please restart your computer now.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
6.0:Dobrodošli v SvarDOS! Če potrebujete pomoč, vtipkajte HELP.
/install/tags/20220217/nls/sv_utf8.txt
0,0 → 1,79
#
# This is a localization file for the SvarDOS INSTALL program
# Detta är en localiseringsfil för SvarDOSs INSTALLprogram
#
# Language..: Swedish
# Translator: Martin Strömberg
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
### GEMENSAMMA SAKER: TITLE-BAR AND MULTIPLA-VALSTRÄNGAR ###
#0.0:SVARDOS INSTALLATION
0.0:SVARDOS INSTALLATION
#0.1:Install SvarDOS
0.1:Installera SvarDOS
#0.2:Quit to DOS
0.2:Avsluta till DOS
#0.3:Create a partition automatically
0.3:Skapa en partition automatiskt
#0.4:Run the FDISK partitioning tool
0.4:Kör FDISK-partitioneringsverktyget
#0.5:Press any key...
0.5:Tryck på en tangent...
# Every string below must be at most 78 characters long! (used in status bar)
# Varje sträng nedan måste vara som mest 78 bokstäver lång (används i statusbaren)
#0.10:Up/Down = Select entry | Enter = Confirm choice | ESC = Previous screen
0.10:Upp/Ner = Välj rad | Enter = Bekräfta val | ESC = Föregående skärm
#0.11:Up/Down = Select entry | Enter = Confirm choice | ESC = Quit to DOS
0.11:Up/Down = Välj rad | Enter = Bekräfta val | ESC = Avsluta till DOS
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
### SPRÅKVAL & TANGENTBORDSLAYOUTSKÄRMAR ###
#1.0:Welcome to SvarDOS
1.0:Välkommen till SvarDOS
#1.1:Please select your preferred language from the list below:
1.1:Vänligen välj språket du vill använda från listan nedan:
#1.5:SvarDOS supports different keyboard layouts. Choose the keyboard layout that you want.
1.5:SvarDOS stödjer olika tangentbordslayouter. Välj tangentbordslayouten som du vill ha.
 
### WELCOME SCREEN ###
### VÄLKOMSTSKÄRM ###
#2.0:You are about to install SvarDOS: a free, MS-DOS compatible operating system based on FreeDOS. SvarDOS 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 SvarDOS is installed.
2.0:Du ska just till att installera SvarDOS: ett fritt, MS-DOS-kompatibelt operativsystem baserat på FreeDOS. SvarDOS kommer med en samling olika tredjepartsapplikationer.\n\nVARNING: Om din PC har ett annat operativsystem intstallerat, kanske detta andra system inte kan boota när väl SvarDOS har installerats.
 
### DISK SETUP ###
### DISKSETUP ###
#3.0:ERROR: Drive %c: could not be found. Perhaps your hard disk needs to be partitioned first. Please create at least one primary partition on your hard disk, so SvarDOS can be installed on it. Note, that SvarDOS 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.
3.0:FEL: Enhet %c: kunde inte hittas. Kanske din hårddisk behöver partitioneras först. Vänligen skapa minst en primär partition på din hårddisk, så SvarDOS kan installeras på den. N.B. att SvarDOS behöver minst %d MiB ledigt diskutrymme.\n\nDu kan använda FDISK-partitioneringsverktyget för att skapa den nödvändiga partitionen manuellt, eller så kan du låta installationsprogrammet partitioner din disk automatiskt. Du kan också avbryta installationen för att använda en annan valfri partitionsmanager.
#3.1:Your computer will reboot now.
3.1:Din dator kommer att boota om nu.
#3.2:ERROR: Drive %c: is a removable device. Installation aborted.
3.2:FEL: Enhet %c: är ett removable device. Installationen avbryts.
#3.3:ERROR: Drive %c: seems to be unformated. Do you wish to format it?
3.3:FEL: Enhet %c: verkar vara oformaterad.
#3.4:ERROR: Drive %c: is not big enough! SvarDOS requires a disk of at least %d MiB.
3.4:FEL: Enhet %c: är inte tillräckligt stor! SvarDOS behöver en disk som är minst %d MiB.
#3.5:ERROR: Drive %c: is not empty. SvarDOS 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.
3.5:FEL: Enhet %c: är inte tom. SvarDOS måste installeras på en tom disk.\n\nDu kan formatera disken nu, för att tömma den. N.B. detta kommer att RADERA ALLT NUVARANDE DATA på din disk.
#3.6:The installation of SvarDOS to %c: is about to begin.
3.6:Installationen av SvarDOS till %c: ska just börja.
 
### PACKAGES INSTALLATION ###
### PAKETINSTALLATION ###
# example: "Installing package 4/50: FDISK"
# exempel: "Installerar paketet 4/50: FDISK"
#4.0:Installing package %d/%d: %s
4.0:Installerar paketet %d/%d: %s
 
### END SCREEN ###
### AVSLUTNINGSSKÄRM ###
#(5.0:SvarDOS installation is over. Your computer will reboot now.\nPlease remove the installation disk from your drive.)
#5.0:Your computer will reboot now.\nPlease make sure to remove the installation media.
5.0:Din dator kommer att reboota nu.\nVänligen se till att ta bort installationsmediet.
#5.1:SvarDOS installation is over. Please restart your computer now.
5.1:SvarDOS-installationen är klar. Please restart your computer now.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
### LOGINVÄLKOMSTTEXT NÄR SYSTEMET ÄR INSTALLERAT ###
#6.0:Welcome to SvarDOS! Type 'HELP' if you need help.
6.0:Välkommen till SvarDOS! Skriv 'HELP' om du behöver hjälp.
/install/tags/20220217/nls/tr_utf8.txt
0,0 → 1,45
#
# This is a localization file for the SvarDOS INSTALL program
#
# Language..: Turkish
# Translator: anonymous
#
 
### COMMON STUFF: TITLE BAR AND MULTIPLE CHOICE STRINGS ###
0.0:SVARDOS KURULUMU
0.1:SvarDOS'yı kur
0.2:DOS'a çık
0.3:Disk bölümünü otomatik olarak oluştur
0.4:FDISK disk bölümü oluşturma aracını çalıştır
0.5:Herhangi bir tuşa basın...
# Every string below must be at most 78 characters long! (used in status bar)
0.10:Yukarı/Aşağı = Unsur seç | Enter = Seçimi doğrula | ESC = Önceki ekran
0.11:Yukarı/Aşağı = Unsur seç | Enter = Seçimi doğrula | ESC = Dos'a çık
 
### LANGUAGE SELECTION & KEYBOARD LAYOUT SCREENS ###
1.0:SvarDOS'ya hoş geldiniz
1.1:Dilinizi aşağıdaki listeden seçiniz:
1.5:SvarDOS değişik ülkelerde kullanılan klavye düzenlerini destekler. İstediğiniz klavye düzenini seçiniz.
 
### WELCOME SCREEN ###
2.0:FreeDOS çekirdeğine dayalı, ücretsiz ve MS-DOS uyumlu bir işletim sistemi olan SvarDOS'yı kurmak üzeresiniz. SvarDOS çeşitli üçüncü parti uygulamaları sunar.\n\nİKAZ: Eğer PC'nizde başka bir işletim sistemi kuruluysa, bu sistem SvarDOS kurulduktan sonra başlamayabilir.
 
### DISK SETUP ###
3.0:HATA: %c: sürücüsü bulunamadı. Belki sabit diskinizde önce bölüm oluşturmanız gerekmektedir. Lütfen sabit diskinizde en az bir bölüm oluşturun ki SvarDOS o bölüme kurulabilsin. SvarDOS'nın en az %d MiB disk alanına ihtiyaç duyduğunu unutmayın.\n\nGerekli bölümü elle oluşturmak için FDISK bölüm oluşturma aracını kullanabilir ya da kurulumun diskinizde otomatik olarak bölüm oluşturmasına izin verebilirsiniz. Başka bir bölüm yöneticisi kullanmak için kurulumu iptal de edebilirsiniz.
3.1:Bilgisayarınız şimdi yeniden başlayacaktır.
3.2:HATA: %c: sürücüsü çıkarılabilir bir cihazdır. Kurulum iptal edilmiştir.
3.3:HATA: %c: biçimlendirilmemiş gözükmektedir.
3.4:HATA: %c: sürücüsü yeteri kadar büyük değildir! SvarDOS en az %d MiB boyutunda bir diske ihtiyaç duyar.
3.5:HATA: %c: sürücüsü boş değildir. SvarDOS, boş bir diske kurulmalıdır.\n\nDiski boşaltmak için şimdi biçimlendirebilirsiniz. Bununla beraber, bunun diskinizdeki TÜM GÜNCEL VERİLERİ SİLECEĞİNİ unutmayınız.
3.6:SvarDOS'nın %c: sürücüsüne kurulumu başlamak üzeredir.
 
### PACKAGES INSTALLATION ###
# example: "Installing package 4/50: FDISK"
4.0:Şu paket kuruluyor: %d/%d: %s
 
### END SCREEN ###
5.0:Bilgisayarınız şimdi yeniden başlayacaktır.\nLütfen kurulum diskini sürücünüzden çıkarın.
5.1:SvarDOS kurulumu sona ermiştir. Please restart your computer now.
 
### LOG IN WELCOME TEXT ONCE SYSTEM IS INSTALLED ###
6.0:SvarDOS'ya hoş geldiniz! Yardıma ihtiyacınız varsa 'HELP' yazınız.
/install/tags/20220217/svarlang.lib
0,0 → 1,0
link ../../svarlang.lib
Property changes:
Added: svn:special
+*
\ No newline at end of property
/install/tags/20220217/video.c
0,0 → 1,88
/*
* Video routines used by the SvarDOS installer
* Copyright (C) 2016 Mateusz Viste
*
* All video routines output data directly to VRAM, and they all do that
* to both B8000:0000 and B0000:0000 areas simulteanously, for compatibility
* with all possible video adapters in all possible modes.
*/
 
#include <dos.h>
#include "video.h" /* include self for control */
 
/* pointer to the VGA/MDA screen */
static unsigned short far *scr = (unsigned short far *)0xB8000000L;
 
void video_clear(unsigned short attr, int offset, int offsetend) {
offsetend += 2000;
while (offset < offsetend) scr[offset++] = attr;
}
 
/* inits screen, returns 0 for color mode, 1 for mono */
int video_init(void) {
union REGS r;
int monoflag;
/* get current video mode to detect color (7 = mono, anything else is color) */
r.h.ah = 0x0F;
int86(0x10, &r, &r);
/* set the monoflag to detected value and prepare the next mode we will set */
if (r.h.al == 7) {
monoflag = 1;
r.h.al = 7; /* 80x25 2 colors (MDA / Hercules) */
scr = (unsigned short far *)0xB0000000L;
} else if (r.h.al == 2) { /* 80x25 grayscale */
monoflag = 1;
r.h.al = 2; /* 80x25 grayscale */
scr = (unsigned short far *)0xB8000000L;
} else {
monoflag = 0;
r.h.al = 3; /* 80x25 16 colors */
scr = (unsigned short far *)0xB8000000L;
}
/* (re)set video mode to be sure what we are dealing with */
r.h.ah = 0;
int86(0x10, &r, &r);
return(monoflag);
}
 
void video_putchar(int y, int x, unsigned short attr, int c) {
scr[(y << 6) + (y << 4) + x] = attr | c;
}
 
void video_putcharmulti(int y, int x, unsigned short attr, int c, int repeat, int step) {
int offset = (y << 6) + (y << 4) + x;
while (repeat-- > 0) {
scr[offset] = attr | c;
offset += step;
}
}
 
void video_putstring(int y, int x, unsigned short attr, const char *s, int maxlen) {
if (x < 0) { /* means 'center out' */
int slen;
for (slen = 0; s[slen] != 0; slen++); /* faster than strlen() */
x = 40 - (slen >> 1);
}
x += (y << 6) + (y << 4); /* I use x as an offset now */
while ((*s != 0) && (maxlen-- != 0)) {
scr[x++] = attr | *s;
s++;
}
}
 
void video_putstringfix(int y, int x, unsigned short attr, const char *s, int w) {
x += (y << 6) + (y << 4); /* I use x as an offset now */
while (w-- > 0) {
scr[x++] = attr | *s;
if (*s != 0) s++;
}
}
 
void video_movecursor(int y, int x) {
union REGS r;
r.h.ah = 2;
r.h.bh = 0;
r.h.dh = y;
r.h.dl = x;
int86(0x10, &r, &r);
}
/install/tags/20220217/video.h
0,0 → 1,17
/*
* Video routines used by the SvarDOS installer
* Copyright (C) 2016 Mateusz Viste
*/
 
#ifndef VIDEO_H_SENTINEL
#define VIDEO_H_SENTINEL
 
int video_init(void);
void video_clear(unsigned short attr, int offset, int offsetend);
void video_putchar(int y, int x, unsigned short attr, int c);
void video_putcharmulti(int y, int x, unsigned short attr, int c, int repeat, int step);
void video_putstring(int y, int x, unsigned short attr, const char *str, int maxlen);
void video_putstringfix(int y, int x, unsigned short attr, const char *s, int w);
void video_movecursor(int y, int x);
 
#endif