|
|
researchv9-SUN3(old)
#include <jerq.h>
#include <layer.h>
#include <queue.h>
#include <jerqproc.h>
#include <setup.h>
#include <kbd.h>
#ifdef BLITKBD
#define REBOOTKEY 0xEC /* ctrl-shift-BREAK */
#else
#define REBOOTKEY 0x81 /* discon */
#endif
extern int doubleclickOK;
/*
* clockroutine() called at video interrupt time.
* reads chars off the keyboard, sends things to host
*/
short second;
short ticks;
extern long ticks0;
extern char *patchedspot;
extern char patch;
extern int kbdrepeat;
#define CONTROL 1
clockroutine()
{
register c;
extern struct Proc *kbdproc;
register struct Proc *p;
register char *upc; /*SFBOTCH*/
ticks0++;
if(--ticks<=0){
ticks=60; /* really HZ */
second=1;
}
for(p= &proctab[CONTROL+1]; p<&proctab[NPROC]; p++)
if(p->nticks>0 && --p->nticks==0)
p->state|=WAKEUP|RUN;
setrun(&proctab[CONTROL]);
if((p=kbdproc)==0 && qpeekc(&KBDQUEUE) != 0x8E)
return;
while(KBDQUEUE.c_cc>0){
doubleclickOK=0;
c=qgetc(&KBDQUEUE);
if(c==0x8E){ /* SHIFT-SETUP; show what's up */
rectf(&display, P->rect, F_XOR);
do auto4(); while(button123()==0);
if(button2()){
/*SFBOTCHchar **/upc=(char *)P->pcb.pc;
patchedspot=upc;
patch= *upc;
*upc=0x14; /* EXTOP trap */
}
rectf(&display, P->rect, F_XOR);
do auto4(); while(button123());
}else if(c==REBOOTKEY)
reboot();
else
qputc(&p->kbdqueue, c);
if(p->state&KBDLOCAL)
p->state|=WAKEUP;
}
#ifndef BLITKBD
if((kbdrepeat&(RPTHAVECHR|RPTON)) && (ticks&1)==0)
kbdrpt();
#endif
givemouse(p);
}
givemouse(p)
register struct Proc *p;
{
register struct Mouse *m; /*SFBOTCH*/
if((p->state&(MOUSELOCAL|USER)) == (MOUSELOCAL|USER)){
/*SFBOTCHregister struct Mouse * */m= &((struct udata *)p->data)->mouse;
*m=mouse;
}
}
sleep(s){
register struct Proc *p=P;
register alarmed=p->state&ALARMREQD;
register long nticks;
extern long ticks0;
nticks=ticks0+p->nticks;
alarm(s);
Uwait(ALARM);
/* a little dance because sleep calls alarm */
if(alarmed){
spl1();
if(nticks>ticks0)
p->nticks=nticks-ticks0;
else /* we missed his wakeup! */
p->state|=WAKEUP;
spl0();
p->state|=ALARMREQD;
}else
p->state&=~ALARMREQD;
}
alarm(s){
P->state|=ALARMREQD;
if(s>0)
P->nticks=s;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.