|
|
1.1 root 1: #include <jerq.h>
2: #include <layer.h>
3: #include <queue.h>
4: #include <jerqproc.h>
5: #include <setup.h>
6: #include <kbd.h>
7:
8: #ifdef BLITKBD
9: #define REBOOTKEY 0xEC /* ctrl-shift-BREAK */
10: #else
11: #define REBOOTKEY 0x81 /* discon */
12: #endif
13: extern int doubleclickOK;
14:
15: /*
16: * clockroutine() called at video interrupt time.
17: * reads chars off the keyboard, sends things to host
18: */
19:
20: short second;
21: short ticks;
22: extern long ticks0;
23: extern char *patchedspot;
24: extern char patch;
25: extern int kbdrepeat;
26: #define CONTROL 1
27:
28: clockroutine()
29: {
30: register c;
31: extern struct Proc *kbdproc;
32: register struct Proc *p;
33: register char *upc; /*SFBOTCH*/
34:
35: ticks0++;
36: if(--ticks<=0){
37: ticks=60; /* really HZ */
38: second=1;
39: }
40:
41: for(p= &proctab[CONTROL+1]; p<&proctab[NPROC]; p++)
42: if(p->nticks>0 && --p->nticks==0)
43: p->state|=WAKEUP|RUN;
44: setrun(&proctab[CONTROL]);
45: if((p=kbdproc)==0 && qpeekc(&KBDQUEUE) != 0x8E)
46: return;
47: while(KBDQUEUE.c_cc>0){
48: doubleclickOK=0;
49: c=qgetc(&KBDQUEUE);
50: if(c==0x8E){ /* SHIFT-SETUP; show what's up */
51: rectf(&display, P->rect, F_XOR);
52: do auto4(); while(button123()==0);
53: if(button2()){
54: /*SFBOTCHchar **/upc=(char *)P->pcb.pc;
55: patchedspot=upc;
56: patch= *upc;
57: *upc=0x14; /* EXTOP trap */
58: }
59: rectf(&display, P->rect, F_XOR);
60: do auto4(); while(button123());
61: }else if(c==REBOOTKEY)
62: reboot();
63: else
64: qputc(&p->kbdqueue, c);
65: if(p->state&KBDLOCAL)
66: p->state|=WAKEUP;
67: }
68: #ifndef BLITKBD
69: if((kbdrepeat&(RPTHAVECHR|RPTON)) && (ticks&1)==0)
70: kbdrpt();
71: #endif
72: givemouse(p);
73: }
74: givemouse(p)
75: register struct Proc *p;
76: {
77: register struct Mouse *m; /*SFBOTCH*/
78: if((p->state&(MOUSELOCAL|USER)) == (MOUSELOCAL|USER)){
79: /*SFBOTCHregister struct Mouse * */m= &((struct udata *)p->data)->mouse;
80: *m=mouse;
81: }
82: }
83: sleep(s){
84: register struct Proc *p=P;
85: register alarmed=p->state&ALARMREQD;
86: register long nticks;
87: extern long ticks0;
88: nticks=ticks0+p->nticks;
89: alarm(s);
90: Uwait(ALARM);
91: /* a little dance because sleep calls alarm */
92: if(alarmed){
93: spl1();
94: if(nticks>ticks0)
95: p->nticks=nticks-ticks0;
96: else /* we missed his wakeup! */
97: p->state|=WAKEUP;
98: spl0();
99: p->state|=ALARMREQD;
100: }else
101: p->state&=~ALARMREQD;
102: }
103: alarm(s){
104: P->state|=ALARMREQD;
105: if(s>0)
106: P->nticks=s;
107: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.