Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:SolKosLaba2
.doc#include <stdio.h>
#include <dos.h>
#include <time.h>
#include <stdlib.h>
#include <conio.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;
};
#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 huge task1(void);
void interrupt (*old_han)(__CPPARGS);
void interrupt (*old_han61)(__CPPARGS);
void interrupt _handler(__CPPARGS);
void huge task2(void);
void huge task3(void);
Tdescr huge *proc1=(Tdescr * huge)malloc(sizeof(Tdescr));
Tdescr huge *proc2=(Tdescr * huge)malloc(sizeof(Tdescr));
Tdescr huge *proc3=(Tdescr * huge)malloc(sizeof(Tdescr));
Tdescr huge *Main=(Tdescr * huge)malloc(sizeof(Tdescr));
int _08_cs,_08_ip,_61_cs,_61_ip;
int num_proc;
unsigned int d_count1,d_count2,d_count3;
unsigned int count;
void main(void)
{
clrscr();
t_add(proc1,task1);
t_add(proc2,task2);
t_add(proc3,task3);
clrscr();
set_disp();
free (proc1);
free (proc2);
free (proc3);
}
void huge t_add(Tdescr huge *proc,void huge *task)
{
_stek huge *st=(_stek huge *)malloc(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->sp-=8;
}
void huge t_switch(Tdescr huge *procO,Tdescr huge *procN )
{
/* procO->ss=_SS;
procO->sp=_SP;
procO->bp=_BP;
procO->ds=_DS;
procO->si=_SI;
procO->di=_DI;
_AX=procN->ss;
_SS=_AX;
_SP=procN->sp;
_BP=procN->bp;
_DS=procN->ds;
_SI=procN->si;
_DI=procN->di; */
asm {
les bx,procO
mov es:[bx],ss
mov es:[bx+2],sp
mov es:[bx+4],bp
mov es:[bx+6],ds
mov es:[bx+8],si
mov es:[bx+10],di
les bx,procN
mov ax,es:[bx]
mov ss,ax
mov sp,es:[bx+2]
mov bp,es:[bx+4]
mov ds,es:[bx+6]
mov si,es:[bx+8]
mov di,es:[bx+10]
};
}
void huge task1(void){
int i=0;
int j=0;
enable();
while(j<1){
num_proc=1;
i++;
cprintf(" 1Proc= %i \r\n ",i);
delay(55);
}
}
void huge task2(void){
int i=0;
int j=0;
enable();
while(j<1){
num_proc=2;
i++; i++;
cprintf(" 2Proc=%i \r \n ",i);
delay(20);
}
}
void huge task3(void) {
int i=0;
int j=0;
while(j<1){
num_proc=3;
i++;
cprintf(" 3Proc=%i \r \n",i);
enable();
delay(5);
}
}
void huge set_disp(void)
{
disable();
old_han=getvect(intr);
setvect(intr,_handler);
int random_proc;
srand(time(NULL));
random_proc = 1 + rand() %3;
switch (random_proc)
{
case 1: t_switch(Main,proc1);
break;
case 2: t_switch(Main,proc2);
break;
case 3: t_switch(Main,proc3);
break;
}
}
void huge stop_disp(void)
{
asm{
cli
push ds
lds dx,old_han
mov ax,2508h
int 21h
pop ds
sti
};
//setvect(intr,old_han);
switch (num_proc)
{
case 1:t_switch(proc1,Main);;
break;
case 2: t_switch(proc2,Main);;
break;
case 3: t_switch(proc3,Main);;
break;
}
//enable();
}
void interrupt _handler(__CPPARGS)
{
disable();
old_han();
int random_proc;
srand(time(NULL));
random_proc = 1 + rand() %3;
if (num_proc==1)
switch(random_proc){
case 1:
t_switch(proc1,proc1);
if(kbhit()) {
getch();
stop_disp();
}
break;
case 2:
t_switch(proc1,proc2);
if(kbhit()) {
getch();
stop_disp();
}
break;
case 3:
t_switch(proc1,proc3);
if(kbhit()) {
getch();
stop_disp();
}
break;
}
if (num_proc==2)
switch(random_proc){
case 1:
t_switch(proc2,proc1);
if(kbhit()) {
getch();
stop_disp();
}
break;
case 2:
t_switch(proc2,proc2);
if(kbhit()) {
getch();
stop_disp();
}
break;
case 3:
t_switch(proc2,proc3);
if(kbhit()) {
getch();
stop_disp();
}
break;
}
if (num_proc==3)
switch(random_proc){
case 1:
t_switch(proc3,proc1);
if(kbhit()) {
getch();
stop_disp();
}
break;
case 2:
t_switch(proc3,proc2);
if(kbhit()) {
getch();
stop_disp();
}
break;
case 3:
t_switch(proc3,proc3);
if(kbhit()) {
getch();
stop_disp();
}
break;
}
asm {
mov al, 20h
out 20h,al
}
enable();
}
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
