?resize FALSE
?use80386

?include "file.h--"
?include "WRITE.H--"
?include "graftext.h--"
?include "KEYCODES.H--"
?include "copyrigh.i--"

?define W1 0X217
?define W2 0XE1B
?define W3 0X91E
//ЦВЕТА
?define FON 0X1E
?define ACTIV 0X70

byte STDMBR=FROM "STD.MBR";
byte ZAGR=FROM "zagr.dat";
byte MANAG=FROM "multboot.dat";
byte BUF[1536];
byte VER=1,UVER=1;
byte DELAY=20,UDELAY=20;
byte ABOOT=0,UABOOT=0;
byte LABL="SHEKER";
byte INST=FALSE,SAME_VER=FALSE;
//byte NI=" Загрузчик не установлен ";
//byte MI=" Текущие параметры: ";
byte Z0="Windows";
byte Z1="DOS";
byte SELECT=1;
word FCUR;

main()
int i;
{
	AX=3;
	$INT 0X10
	FCUR=@HIDECUR();
	if(readsect(0,1,0,1,#BUF)==1){
		SI=#BUF+4;
		DI=#LABL;
		CX=3;
		$REPE
		$CMPSB
		IF(CX==0){
			INST=TRUE;
			IF(readsect(0,2,0,1,#BUF+512)==0)goto end;
			SI=#BUF+3;
			UVER=DSBYTE[SI];
			SI+=512;
			UDELAY=DSBYTE[SI];
			SI++;
			UABOOT=DSBYTE[SI];
			IF(UVER==VER){
				SAME_VER=TRUE;
			}
		}
		i=0;
		do{
			AX=i<<8;
			DX><AX;
			AH=2;
			$INT 0X10
			AX=0X9B1;
			BX=0X5B;
			CX=80;
			$INT 0X10
			i++;
		}while(i<24);
		boxm(0,78,22,2," Инсталяция мульти-загрузчика ",0);
		REFRESH();
		bar(W2,27,7,0X1E,0X60,1);
		box(W2,25,5,2);
		SETTEXTPOSITION(,0,,W2+0X103);
		WRITESTR("Изменить задержку");
		SETTEXTPOSITION(,0,,W2+0X203);
		WRITESTR("Загрузка по умолчанию");
		SETTEXTPOSITION(,0,,W2+0X303);
		WRITESTR("Установить менеджер");
		SETTEXTPOSITION(,0,,W2+0X403);
		WRITESTR("Снять менеджер");
		SETTEXTPOSITION(,0,,W2+0X503);
		WRITESTR("Закончить работу");

CONTPM:
	 	SETLINE(SELECT,ACTIV,23,W2+0X102);
WAITK:
		IF(@KBHIT()){
			BIOSREADKEY();
			IF(AX==k_up){
				HIDELINE();
				SELECT--;
				IF(ZEROFLAG)SELECT=5;
			}
			ELSE IF(AX==k_down){
				HIDELINE();
				SELECT++;
				IF(SELECT>5)SELECT=1;
			}
			ELSE IF(AX==k_return)GOTO ENPM;
			ELSE IF(AX==k_esc)GOTO en;
			ELSE GOTO WAITK;
			GOTO CONTPM;
		}
		GOTO WAITK;
ENPM:
		AL=SELECT;
		IF(AL==1){
			NEWDELAY();
		}
		ELSE IF(AL==2){
			NEWSTARTBOOT();
		}
		ELSE IF(AL==3){
			INSTALL();
		}
		ELSE IF(AL==4){
			DEINSTALL();
		}
		ELSE GOTO en;
		goto WAITK;
	}
	ELSE{
end:
		WRITESTR("\nOшибка чтения сектора диска.\n");
	}
en:
	SETTEXTPOSITION(,0,,0X1700);
	WRITESTR(#COPYRIGHT);
	@SHOWCUR(FCUR);
}

word readsect(byte head,sect;word cul;byte count_sect;word buffer)
/* чтение секторов
 вход:
 головка
 сектор
 цилиндр
 число секторов
 буфер
 */
{
	DH=head;
	DL=0X80;
	ES=CS;
	BX=buffer;
	CX=cul;
	CH><CL;
	$SHL CL,6
	AL=sect&0X3F;
	CL|=AL;
	AL=count_sect;
	AH=2;
	$INT 0X13
	IF(CARRYFLAG)AX=0;
	ELSE AX=1;
}

word savesect(byte head,sect;word cul;byte count_sect;word buffer)
/* запись секторов
 вход:
 головка
 сектор
 цилиндр
 число секторов
 буфер
 */
{
	DH=head;
	DL=0X80;
	ES=CS;
	BX=buffer;
	CX=cul;
	CH><CL;
	$SHL CL,6
	AL=sect&0X3F;
	CL|=AL;
	AL=count_sect;
	AH=3;
	$INT 0X13
	IF(CARRYFLAG)AX=0;
	ELSE AX=1;
}

SETLINE()
byte atrib,i;
{
	i=CL;
	atrib=BL;
	AX=AX-1<<8+DX;
	DI=AX;
	SETTEXTPOSITION(,0,,AX);
	loop(i){
		AH=8;
		BH=0;
		$INT 0X10
		AH=9;
		BH=0;
		CX=1;
		BL=atrib;
		$INT 0X10;
		DI++;
		SETTEXTPOSITION(,0,,DI);
	}
}

HIDELINE()
{
	SETLINE(SELECT,FON,23,W2+0X102);
}

NEWDELAY()
byte STR[5];
{
	bar(W3,20,3,0X1E,0X60,1);
	box(W3,18,1,2);
	SETTEXTPOSITION(,0,,W3+2);
	WRITESTR(" Новая задержка ");
	CLEARWINDOW(,0X7,W3+0X109,W3+0X10A);
	SETTEXTPOSITION(,0,,W3+0X109);
	AX=0XA2E;
	BH=0;
	CX=2;
	$INT 0X10
	STR[0]=3;
	READSTRING(,,,#STR);
	AL=0;
	BL=STR[2];
	IF(BL<0X30)GOTO ENP;
	IF(BL>0X39)GOTO ENP;
	AL=BL-0X30;
	BL=STR[3];
	IF(BL<0X30)GOTO ENP;
	IF(BL>0X39)GOTO ENP;
	BL-=0X30;
	AL=AL*10+BL;
ENP:
	IF(AL<3)AL=3;
	UDELAY=AL;
	REFRESH();
}

byte YESM=" Менеджер установлен ";
byte NOM=" Менеджер не установлен ";
REFRESH()
word i;
{
	i=9;
	do{
		AX=i<<8+5;
		DX><AX;
		AH=2;
		$INT 0X10
		AX=0X9B1;
		BX=0X5B;
		CX=70;
		$INT 0X10
		i++;
	}while(i<14);
	bar(W1,35,5,0X1E,0X60,1);
	box(W1,33,3,2);
	IF(INST==TRUE){
		SETTEXTPOSITION(,0,,W1+6);
		WRITESTR(#YESM);
	}
	ELSE{
		SETTEXTPOSITION(,0,,W1+5);
		WRITESTR(#NOM);
	}
	SETTEXTPOSITION(,0,,W1+0X10D);
	WRITESTR("Версия: ");
	WRITEWORD(UVER);
	SETTEXTPOSITION(,0,,W1+0X202);
	WRITESTR("Задержка до автозагрузки: ");
	WRITEWORD(UDELAY);
	SETTEXTPOSITION(,0,,W1+0X302);
	WRITESTR("Загружать по умолчанию: ");
	IF(UABOOT==0)AX=#Z0;
	ELSE AX=#Z1;
	WRITESTR();
}

NEWSTARTBOOT()
byte SZ;
{
	bar(W3,20,4,0X1E,0X60,1);
	box(W3,18,2,2);
	SETTEXTPOSITION(,0,,W3+5);
	WRITESTR(" Загрузка ");
	SETTEXTPOSITION(,0,,W3+0x208);
	WRITESTR("DOS");
	SETTEXTPOSITION(,0,,W3+0x106);
	WRITESTR("Windows");
	SZ=UABOOT+1;
CONTP:
 	SETLINE(SZ,ACTIV,16,W3+0X102);
WAITK:
	IF(@KBHIT()){
		BIOSREADKEY();
		IF(AX==k_up){
		 	SETLINE(SZ,FON,16,W3+0X102);
			SZ--;
			IF(ZEROFLAG)SZ=2;
		}
		ELSE IF(AX==k_down){
		 	SETLINE(SZ,FON,16,W3+0X102);
			SZ++;
			IF(SZ>2)SZ=2;
		}
		ELSE IF(AX==k_return)GOTO ENPM;
		ELSE IF(AX==k_esc)$RET
		ELSE GOTO WAITK;
		GOTO CONTP;
	}
	GOTO WAITK;
ENPM:
	UABOOT=SZ-1;
	REFRESH();
}

INSTALL()
{
	IF(INST==FALSE){
		writefile("old_mbr.dat",CS,#BUF,512);
		IF(savesect(0,7,0,1,#BUF)==0)$JMP SHORT ER1
		SI=#ZAGR;
		DI=#BUF;
		CX=sizeof(file "zagr.dat");
		$REPE
		$MOVSB
		IF(savesect(0,1,0,1,#BUF)==0){
ER1:
			ERWRITE();
			$RET
		}
	}
	SI=#MANAG+3;
	DSBYTE[SI]=UDELAY;
	DSBYTE[SI+1]=UABOOT;
	IF(savesect(0,2,0,sizeof(file "multboot.dat")/512+1,#MANAG)==0)$JMP SHORT ER1
	INST=TRUE;
	SAME_VER=TRUE;
	DELAY=UDELAY;
	ABOOT=UABOOT;
	VER=UVER;
	MESOK("Установлен");
}

DEINSTALL()
{

	IF(INST==TRUE){
	 	SI=#STDMBR;
		DI=#BUF;
		CX=sizeof(file "std.mbr");
		$REPE
		$MOVSB
		IF(savesect(0,1,0,1,#BUF)==0){
			ERWRITE();
			$RET
		}
		INST=FALSE;
		MESOK("  Удален  ");
	}
	ELSE{
		bar(W3,20,4,0X4E,0X60,1);
		box(W3,18,2,2);
		SETTEXTPOSITION(,0,,W3+5);
		WRITESTR(" Менеджер ");
		SETTEXTPOSITION(,0,,W3+0X104);
		WRITESTR("Не был ранее");
		SETTEXTPOSITION(,0,,W3+0X204);
		WRITESTR("установлен");
		BIOSREADKEY();
		REFRESH();
	}
}

ERWRITE()
{
	bar(W3,20,3,0X4E,0X60,1);
	box(W3,18,1,2);
	SETTEXTPOSITION(,0,,W3+6);
	WRITESTR(" Ошибка ");
	SETTEXTPOSITION(,0,,W3+0X103);
	WRITESTR("Записи сектора");
	BIOSREADKEY();
	REFRESH();
}

MESOK()
{
	$PUSH AX
	bar(W3,20,3,0X1E,0X60,1);
	box(W3,18,1,2);
	SETTEXTPOSITION(,0,,W3+5);
	WRITESTR(" Менеджер ");
	SETTEXTPOSITION(,0,,W3+0X104);
	$POP AX
	WRITESTR();
	BIOSREADKEY();
	REFRESH();
}
