?resize FALSE
?use80386
?alignword FALSE
?startaddress 0x800

//ПОЗИЦИЯ И РАЗМЕРЫ
?define STARTW 0X611
?define SIZEG 40
?define SIZEV 8
?define ENDW SIZEV+1*256+SIZEG+STARTW+1
//ЦВЕТА
?define FON 0X1F
?define ACTIV 0X70

?include "GRAFTEXT.H--"
?include "WRITE.H--"
?include "KEYCODES.H--"

word FCUR,STR;
word NUM_ITEM;
byte CEK[3],ACTKEY;

byte DELAY=20;	//задержка перед загрузкой
byte STARTDEFAULT=1;	//загрузка по умолчанию
byte WIN="Windows";
byte DOS="DOS";
//некоторые русские буковки
byte LIT128=EXTRACT "8X16_ARE.FNT",16*128,16;
byte LIT130=EXTRACT "8X16_ARE.FNT",16*130,16;
byte LIT133=EXTRACT "8X16_ARE.FNT",16*133,16;
byte LIT135=EXTRACT "8X16_ARE.FNT",16*135,16;
byte LIT142=EXTRACT "8X16_ARE.FNT",16*142,16;
byte LIT143=EXTRACT "8X16_ARE.FNT",16*143,16;
byte LIT145=EXTRACT "8X16_ARE.FNT",16*145,16;
byte LIT147=EXTRACT "8X16_ARE.FNT",16*147,16;
byte LIT151=EXTRACT "8X16_ARE.FNT",16*151,16;
byte LIT160=EXTRACT "8X16_ARE.FNT",16*160,16;
byte LIT161=EXTRACT "8X16_ARE.FNT",16*161,16;
byte LIT162=EXTRACT "8X16_ARE.FNT",16*162,16;
byte LIT163=EXTRACT "8X16_ARE.FNT",16*163,16;
byte LIT164=EXTRACT "8X16_ARE.FNT",16*164,16;
byte LIT165=EXTRACT "8X16_ARE.FNT",16*165,16;
byte LIT166=EXTRACT "8X16_ARE.FNT",16*166,16;
byte LIT167=EXTRACT "8X16_ARE.FNT",16*167,16;
byte LIT168=EXTRACT "8X16_ARE.FNT",16*168,16;
byte LIT170=EXTRACT "8X16_ARE.FNT",16*170,16;
byte LIT171=EXTRACT "8X16_ARE.FNT",16*171,16;
byte LIT172=EXTRACT "8X16_ARE.FNT",16*172,16;
byte LIT173=EXTRACT "8X16_ARE.FNT",16*173,16;
byte LIT174=EXTRACT "8X16_ARE.FNT",16*174,16;
byte LIT175=EXTRACT "8X16_ARE.FNT",16*175,16;
byte LIT224=EXTRACT "8X16_ARE.FNT",16*224,16;
byte LIT225=EXTRACT "8X16_ARE.FNT",16*225,16;
byte LIT226=EXTRACT "8X16_ARE.FNT",16*226,16;
byte LIT227=EXTRACT "8X16_ARE.FNT",16*227,16;
byte LIT233=EXTRACT "8X16_ARE.FNT",16*233,16;
byte LIT235=EXTRACT "8X16_ARE.FNT",16*235,16;
byte LIT236=EXTRACT "8X16_ARE.FNT",16*236,16;
byte LIT238=EXTRACT "8X16_ARE.FNT",16*238,16;
byte RUSCODE={128,130,133,135,142,143,145,147,151,160,161,162,163,164,165,
      166,167,168,170,171,172,173,174,175,224,225,226,227,233,235,236,238};
?define NUMRUSCODE 32

main()
{
	AX=3;
	$INT 0X10
	DS=CS;
	FCUR=@HIDECUR();
	@CLEARWINDOW(,FON,STARTW,ENDW);
	STR=0;
	ES=CS;
	$PUSH BP
	BP=#LIT128;
	do{
		BX=STR;
		AL=RUSCODE[BX];
		AH=0;
		DX=AX;
		BX=0X1000;
		CX=1;
		AX=0X1100;
		$INT 0X10
		STR++;
		BP+=16;
	}while(STR<NUMRUSCODE);
	$POP BP
	box(STARTW,SIZEG,SIZEV,2);
	SETTEXTPOSITION(,0,,STARTW+0Xf);
	WRITESTR(" Загрузить: ");
	SETTEXTPOSITION(,0,,STARTW+0X208);
	WRITESTR("1 - WINDOWS 95");
	SETTEXTPOSITION(,0,,STARTW+0X308);
	WRITESTR("2 - Предыдущую версию DOS");
	NUM_ITEM=2;
	$INT 0X11
	$TEST AL,1
	IF(NOTZEROFLAG){
		AL>>=6;
		$PUSH AX
		NUM_ITEM++;
		ADDSTR(0);
		$POP AX
		IF(AL!=0){
			ADDSTR(1);
			NUM_ITEM++;
		}
	}
	SETTEXTPOSITION(,0,,STARTW+0X702);
	WRITESTR("Через ");
	WRITETIME(DELAY);
	WRITESTR(" секунд будет загружен ");
	IF(STARTDEFAULT==0)AX=#WIN;
	ELSE AX=#DOS;
	WRITESTR();
	SETTEXTPOSITION(,0,,STARTW+0X801);
	WRITESTR("Если у Вас проблемы звоните в ОАСУ 82-62");
	AL=STARTDEFAULT+1;
	AH=0;
	SI><AX;
	ACTKEY=0;
	ES=0;
	STR=ESWORD[0X46C];	//ВРЕМЯ НАЧАЛА
CONTPM:
 	SETLINE(SI,ACTIV,SIZEG-2,STARTW+0X202);
WAITK:
	IF(@KBHIT()){
		ACTKEY=1;
		SETTEXTPOSITION(,0,,STARTW+0X701);
		AX=0XA20;
		BX=0;
		CX=SIZEG;
		$INT 0X10
		@BIOSREADKEY();
		IF(AX==k_up){
			HIDELINE();
			SI--;
			IF(ZEROFLAG)SI=NUM_ITEM;
		}
		ELSE IF(AX==k_down){
			HIDELINE();
			SI++;
			IF(SI>NUM_ITEM)SI=1;
		}
		ELSE IF(AX==k_return)GOTO ENPM;
		ELSE IF(AL>=0X31){
			IF(AL<=0X34){
				AL=AL-0X30;
				AH=0;
				SI><AX;
				GOTO ENPM;
			}
		}
		ELSE GOTO WAITK;
		GOTO CONTPM;
	}
	IF(ACTKEY!=0)GOTO WAITK;
	AX=ESWORD[0X46C]-STR/18;
	IF(AX<DELAY){
		AX><BX;
		AX=DELAY-BX;
		WRITETIME();
		goto WAITK;
	}
ENPM:
//ВЫБОР СДЕЛАН
//	$INT 0x20
	STR=SI;
	@SHOWCUR(FCUR);
	SETTEXTPOSITION(,0,,0X1400);
	IF(STR>2){
		STR-=3;
		CX=1;
		DL=STR;
		DH=0;
		LOAD_BOOT();
		ESBYTE[0X7C24]=STR;
		GOTO ENDS;
	}
	SI=0X7BE;
	BL=4;
	do{
		IF(ESBYTE[SI]==0X80){
			DX=ESWORD[SI];
			CX=ESWORD[SI+2];
			BP=SI;
			do{
				SI+=0X10;
				BL--;
				$JZ SHORT LOC_005D
			} while ( ESBYTE[SI]==0 );
		}
		IF(ESBYTE[SI]!=0)$JMP SHORT LOC_0048
		SI+=0X10;
		BL--;
	}while(NOTZEROFLAG);
	$INT	0X18
LOC_0048:
	WRITESTR("Invalid partition table");
LOC_005B:
	$JMP	SHORT LOC_005B
LOC_005D:
	LOAD_BOOT();
	SI=BP;
	IF(STR==2){
		CX=k_F4;
		AH=5;
		$INT 0X16
	}
ENDS:
	$JMP FAR 0:0X7C00
}

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);
	}
}

WRITETIME()
{
	BL=10;
	$DIV BL
	AX+=0X3030;
	DSWORD[#CEK]=AX;
	CEK[2]=0;
	SETTEXTPOSITION(,0,,STARTW+0X708);
	WRITESTR(#CEK);
}

HIDELINE()
{
	SETLINE(SI,FON,SIZEG-2,STARTW+0X202);
}

ADDSTR()
word DISK;
{
	DISK=AX;
	AX=AX*256+STARTW+0X408;
	DX><AX;
	SETTEXTPOSITION(,0);
	WRITE(DISK+0X33);
	WRITESTR(" - С дисковода ");
	WRITE(DISK+0X41);
}

LOAD_BOOT()
{
	DI=5;
	do{
		BX=0X7C00;
		AX=0X201;
		$PUSH	DI
		$INT	0X13
		$POP	DI
		$JNC	LOC_0078
		AX=0;
		$INT	0X13
		DI--;
	}while(NOTZEROFLAG);
	WRITESTR("Error loading operating system");
LOC_007B:
	$JMP	SHORT LOC_007B
LOC_0078:
	IF(ESWORD[0X7DFE]!=0XAA55){
		WRITESTR("Missing operating system");
		$JMP	SHORT LOC_007B
	}
}
