V10/630/src/task.c
#include <jerq.h>
#include <layer.h>
#define TASK_C
#include <jerqproc.h>
#define STACK 16
int swstk[STACK];
int swpcbp[20];
extern int (*Sys[])(); /* pcb for the switcher */
#define PSW 0x281A100 /* ipl 13 */
struct Proc *
newproc(f)
int (*f)();
{
register struct Proc *u;
register i;
for(i=0,u=proctab; i<NPROC; i++,u++) {
if((u->state&BUSY)==0){
u->state |= BUSY;
restart(u, f);
u->layer=0;
u->nchars=0;
u->cbufpin=u->cbuf;
u->cbufpout=u->cbuf;
u->traptype=0;
u->traploc=0;
u->defaultfont = (struct Font*)Sys[1];
return u;
}
}
return 0;
}
restart(p, loc)
register struct Proc *p;
register (*loc)();
{
register i;
p->pcb.psw=PSW;
p->pcb.pc=(char(*)())loc;
p->pcb.sp=(int)(p->stack);
p->pcb.lower=p->pcb.sp;
p->pcb.upper=p->pcb.lower+STKSIZ;
p->pcb.ap=p->pcb.sp;
p->pcb.fp=p->pcb.sp;
for(i=8; i>=0; i--)
p->pcb.reg[i]=0;
p->pcb.blkmv=0; /* no block moves */
p->text=(char *)(loc);
}
sw(run){
if(!run)
setnorun(P);
callps(swpcbp);
return;
}
switcher()
{
register struct Proc *p=P;
for(;;){
p++; /* 'cos we are the current p */
if(p>=&proctab[NPROC])
p=proctab;
if((p->state&(RUN|ZOMBIE))==RUN)
resume(P=p);
}
}
swinit()
{
register int * pcbptr = swpcbp;
*pcbptr=0x281a180; /* psw, r+i bits set only */
*(pcbptr+1)=(int)switcher; /* initial pc */
*(pcbptr+2)=(int)swstk; /* initial stack */
*(pcbptr+3)=0x1a100;
*(pcbptr+4)=(int)switcher; /* initial pc */
*(pcbptr+5)=(int)swstk;
*(pcbptr+6)=(int)swstk;
*(pcbptr+7)=(int)&swstk[STACK-1];
*(pcbptr+8)=(int)swstk; /* ap */
*(pcbptr+9)=(int)swstk; /* fp */
*(pcbptr+19)=0; /* no block moves */
};