|
|
1.1 root 1: #include <jerq.h>
2: #include <layer.h>
3: #define TASK_C
4: #include <jerqproc.h>
5:
6: #define STACK 16
7: int swstk[STACK];
8: int swpcbp[20];
9: extern int (*Sys[])(); /* pcb for the switcher */
10: #define PSW 0x281A100 /* ipl 13 */
11:
12: struct Proc *
13: newproc(f)
14: int (*f)();
15: {
16: register struct Proc *u;
17: register i;
18: for(i=0,u=proctab; i<NPROC; i++,u++) {
19: if((u->state&BUSY)==0){
20: u->state |= BUSY;
21: restart(u, f);
22: u->layer=0;
23: u->nchars=0;
24: u->cbufpin=u->cbuf;
25: u->cbufpout=u->cbuf;
26: u->traptype=0;
27: u->traploc=0;
28: u->defaultfont = (struct Font*)Sys[1];
29: return u;
30: }
31: }
32: return 0;
33: }
34: restart(p, loc)
35: register struct Proc *p;
36: register (*loc)();
37: {
38: register i;
39: p->pcb.psw=PSW;
40: p->pcb.pc=(char(*)())loc;
41: p->pcb.sp=(int)(p->stack);
42: p->pcb.lower=p->pcb.sp;
43: p->pcb.upper=p->pcb.lower+STKSIZ;
44: p->pcb.ap=p->pcb.sp;
45: p->pcb.fp=p->pcb.sp;
46: for(i=8; i>=0; i--)
47: p->pcb.reg[i]=0;
48: p->pcb.blkmv=0; /* no block moves */
49: p->text=(char *)(loc);
50: }
51: sw(run){
52: if(!run)
53: setnorun(P);
54: callps(swpcbp);
55: return;
56: }
57: switcher()
58: {
59: register struct Proc *p=P;
60: for(;;){
61: p++; /* 'cos we are the current p */
62: if(p>=&proctab[NPROC])
63: p=proctab;
64: if((p->state&(RUN|ZOMBIE))==RUN)
65: resume(P=p);
66: }
67: }
68: swinit()
69: {
70: register int * pcbptr = swpcbp;
71:
72: *pcbptr=0x281a180; /* psw, r+i bits set only */
73: *(pcbptr+1)=(int)switcher; /* initial pc */
74: *(pcbptr+2)=(int)swstk; /* initial stack */
75: *(pcbptr+3)=0x1a100;
76: *(pcbptr+4)=(int)switcher; /* initial pc */
77: *(pcbptr+5)=(int)swstk;
78: *(pcbptr+6)=(int)swstk;
79: *(pcbptr+7)=(int)&swstk[STACK-1];
80: *(pcbptr+8)=(int)swstk; /* ap */
81: *(pcbptr+9)=(int)swstk; /* fp */
82: *(pcbptr+19)=0; /* no block moves */
83: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.