Добавил:
Факультет ИКСС, группа ИКВТ-61 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
25
Добавлен:
20.02.2019
Размер:
3.81 Кб
Скачать
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#define stacksize (2048)
#define _stek unsigned int
#define intr 0x08
const int num_pr=3;
typedef
struct   Tdescr{
unsigned int ss,sp,si,di,bp,ds,cx,dx,bx,ax,fl,es;
};
#ifdef __cplusplus
	#define __CPPARGS...
#else
	#define __CPPARGS
#endif
void huge t_add(Tdescr huge *proc,void huge* task);
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN);

void huge set_disp(void);
void huge stop_disp(void);
void interrupt  (*old_han)(__CPPARGS);
void interrupt  _handler(__CPPARGS);

void huge task1(void);
void huge task2(void);
void huge task3(void);

Tdescr   *proc1=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr   *proc2=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr   *proc3=(Tdescr * )malloc(sizeof(Tdescr));
Tdescr  huge *Main=(Tdescr * huge)malloc(sizeof(Tdescr));


unsigned int count,flag;
void  main(void)

{
	clrscr();
	t_add(proc1,task1);
	t_add(proc2,task2);
	t_add(proc3,task3);
	count=-1;
	set_disp();

	free (proc1);
	free (proc2);
	free (proc3);
}
void  huge t_add(Tdescr huge *proc,void huge * task)
{
  _stek huge *st=(_stek huge *)malloc(2*stacksize);
  proc->ss=FP_SEG(st);
  proc->sp=FP_OFF(st)+1000;
  *(int huge *)MK_FP(proc->ss,proc->sp)=FP_OFF(task);
  *(int huge *)MK_FP(proc->ss,proc->sp+2)=FP_SEG(task);
  proc->es=_ES;
  proc->fl=_FLAGS;

  proc->sp-=8;
}
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN)
{
  asm {
  les bx,procO;
  mov es:[bx],ss
  mov es:[bx+2],sp
  mov es:[bx+4],si
  mov es:[bx+6],di
  mov es:[bx+8],cx
  mov es:[bx+10],dx
  mov es:[bx+12],bx
  mov es:[bx+14],ax
  pop ax
}
//  procO->fl=_FLAGS;
//  procO->es=_AX;
asm{
  les bx,procN;

  mov ax,es:[bx]
  mov ss,ax
  mov sp,es:[bx+2]
  mov si,es:[bx+4]
  mov di,es:[bx+6]
  mov cx,es:[bx+8]
  mov dx,es:[bx+10]
  mov bx,es:[bx+12]
  mov di,es:[bx+14]
  }
//  _FLAGS=procN->fl;
//  _ES=procN->es;
};
void huge task1(void)
{ // 	clrscr();
  int i=1;
  int j=0;
  enable();
  while(j<1){
   i++;
//   disable();
	 gotoxy(3,i);
	 cprintf(" 1Proc= %i \n\r ",i);
//  enable();
	 delay(10);
  }
}
void huge task2(void)
{
  int i=0;
  int j=0;
  enable();

  while(j<1){
	i++; i++;
//    disable();
	 gotoxy(30,i);
	 cprintf("2Proc=%i \n\r ",i);
//  enable();
	 delay(10);
  }
}
void huge task3(void)
{  int i=0;
  int j=0;
//  enable();

  while(j<1){
	i++;
 //   disable();
	 gotoxy(60,i);
	 cprintf("3Proc=%i \n\",i);
  enable();
   delay(30);
  }
  }

//------------------------------------------------------------------------
//          § ЇгбвЁвм ¤ЁбЇҐвзҐа
//--------------------------------------------------------------------------}

void huge set_disp(void)
{	      disable();
		  old_han=getvect(intr);
		  setvect(intr,_handler);
		  t_switch(Main,proc1);
}
 //------------------------------------------------------------------------
//          ®бв ­®ўЁвм ¤ЁбЇҐвзҐа
//--------------------------------------------------------------------------}

void huge stop_disp(void)
{  //      disable();
	 setvect(intr,old_han);
	 t_switch(proc2,Main);
  //	 enable();

}

//;------------------------------------------------------------------------
void interrupt _handler(__CPPARGS)
{   asm cli;
	old_han();
	//  asm int 61h
	count++;
	flag=(count % num_pr);
	switch(flag){
		 case 0:   t_switch(proc1,proc2);
			   if(kbhit()) {
				 getch();
				 stop_disp();
			   }
				break;
		 case 1:   t_switch(proc2,proc3);
			   if(kbhit()) {
				 getch();
				 stop_disp();
			   }
				break;
		 case 2:   t_switch(proc3,proc1);
			   if(kbhit()) {
				 getch();
				 stop_disp();
			   }
				break;
	}
	asm{
	mov al, 20h
	out 20h,al
	}
	asm sti;
}
Соседние файлы в папке программы на С+