|
|
1.1 root 1: #include <jerq.h>
2: #include <layer.h>
3: #include <jerqproc.h>
4: #include "../msgs.h"
5:
6: long getlong();
7:
8: extern Texture cup;
9:
10: boot(){
11: register argc;
12: register char **argv;
13: register char *address;
14: char *bootaddress;
15: char *Ualloc();
16: register unsigned nbytes, nargchars;
17: register long i, amtloaded;
18: int text, data, bss;
19:
20: Urequest(MOUSE);
21: Ucursswitch(&cup);
22: argc=getlong();
23: nargchars=getlong();
24: argv=(char **)Ualloc(nargchars+(argc+1)*sizeof(char *));
25: if(argv==0)
26: address==0;
27: else{
28: text=getlong();
29: data=getlong();
30: bss=getlong();
31: nbytes=text+data; /* the amount to be downloaded */
32: address=Ualloc((unsigned)(nbytes+bss+4));
33: if (((unsigned)address) & 4)
34: address += 4;
35: bootaddress=address;
36: }
37: P->data=address+text;
38: P->bss=P->data+data;
39: muxublk(P);
40: muxmesg((int)(P-proctab), C_PUSHLD);
41: sendwithdelim(4, &bootaddress);
42: bldargs(argc, argv);
43: #define Y(a) (P->rect.corner.y-muldiv(P->rect.corner.y-P->rect.origin.y, a, nbytes))
44: amtloaded=0;
45: for(i=0; i<nbytes; i++){
46: *address++=getchar();
47: if(P->state&(RESHAPED|MOVED)){
48: if(!(P->state&MOVED))
49: amtloaded=0;
50: P->state&=~(RESHAPED|MOVED);
51: }
52: if((i&127)==0){
53: lrectf(P->layer, Rect(P->rect.origin.x, Y(i),
54: P->rect.corner.x, Y(amtloaded)), F_XOR);
55: amtloaded=i;
56: }
57: }
58: muxublk(P);
59: clear(P->rect, 1);
60: Urequest(0);
61: P->text=bootaddress;
62: P->state|=USER;
63: setdata(P);
64: #define udp ((struct udata *)P->data)
65: udp->argc=argc;
66: udp->argv=argv; /* these get set as arguments to main in notsolow.o */
67: if(P->state&ZOMBOOT){
68: P->state&=~ZOMBOOT;
69: P->state|=ZOMBIE;
70: zombexec(P->text);
71: }
72: exec(P->text);
73: }
74: bldargs(argc, argv)
75: register char **argv;
76: {
77: register i;
78: register char *p=(char *)(argv+argc+1);
79: for(i=0; i<argc; i++){
80: *argv++=p;
81: do
82: *p=getchar();
83: while(*p++);
84: }
85: *argv++=0;
86: }
87: setdata(p)
88: register struct Proc *p;
89: {
90: register struct udata *u=((struct udata *)p->data);
91: u->Drect=p->rect;
92: u->Jdisplayp=p->layer;
93: }
94: getchar(){
95: register c;
96: register struct Proc *p=P;
97:
98: while(p->nchars==0){
99: muxublk(p);
100: sw(0);
101: }
102: c = *(p->cbufpout)++;
103: if(p->cbufpout >= &p->cbuf[sizeof(p->cbuf)])
104: p->cbufpout = p->cbuf;
105: if((--p->nchars)==0)
106: muxublk(p); /* shouldn't be necessary, but... */
107: return c;
108: }
109:
110: long
111: getlong(){
112: long l;
113: register char *p=(char *)&l;
114: register i;
115: for(i=0; i<4; i++)
116: *p++=getchar();
117: return(l);
118: }
119:
120: shutdown(p)
121: register struct Proc *p;
122: {
123: extern struct Proc *debugger;
124: extern struct Proc *kbdproc;
125: Lbox(p->layer);
126: setborder(p);
127: if(debugger==p)
128: debugger=0;
129: muxublk(p);
130: p->state&=~(KBDLOCAL|MOUSELOCAL|GOTMOUSE|USER);
131: p->nticks=0;
132: p->inhibited=0;
133: qclear(&p->kbdqueue);
134: if((p->state&ZOMBIE)==0)
135: freemem(p);
136: }
137: freemem(p)
138: register struct Proc *p;
139: {
140: extern int end;
141: extern int windowstart();
142: freeall((char *)p);
143: clearname(p);
144: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.