#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NTCB 1000
#define FINISHED 0
#define RUNNING 1
#define READY 2
#define BLOCKED 3
typedef struct thread {
char name[10];
unsigned ss;
unsigned sp;
char state;
unsigned char *stack;
} TCB;
typedef struct int_reg {
unsigned bp,di, si, ds, es, dx, cx, bx, ax, ip, cs, flags, off, seg;
} REG;
TCB tcb[NTCB];
int curtcb; /*current tcb*/
typedef int(far *codeptr)(void);
int create(char *name, codeptr code, int stck);
void f1();
void meminit(REG reg, void* src);
int main(void) {
create("f1", (codeptr)f1, 1024);
return 0;
}
void f1() {
int i;
for (i=0;i<40;i++) {
putchar('a');
for (j=0;j<10000;j++)
for (k=0;k<10000;k++)
;
}
}
int create(char *name, codeptr code, int stck) {
/*no more tcb*/
if (curtcb >= NTCB)
return -1;
int i;
/*initialize the name*/
for (i=0;name[i]!='\0';i++) {
tcb[curtcb].name[i]=name[i];
}
tcb[curtcb].name[i]='\0';
char *stack=malloc(sizeof(char)*stck);
tcb[curtcb].state=READY;
/*initialize the regs*/
struct int_regs reg;
reg.ds=seg;
reg.es=seg;
reg.ip=FP_OFF(code);
reg.cs=FP_SEG(code);
reg.flags=200;
meminit(reg, stack+stck-sizeof(REG));
tcb[curtcb].stack=FP_OFF(stack);
tcb[curtcb].ss=FP_SEG(stack);
tcb[curtcb].sp=FP_OFF(stack)+stck-sizeof(REG);
curtcb++;
}
void meminit(REG reg, void *dest) {
memcpy(dest, (void *)®, sizeof(REG));
}