/************/
/*mirx68k1.c*/
/************/
#include "m9402.h"
#include "table.h"
int inzdsp(),eichi;
void timdsp(),nrmdsp(),intdsp();
interrupt void reig1(),reig2(),reig3(),reig4(),reig5(),reig6(),reig7(),reig8();
interrupt void reig9(),reig10(),reig11(),reig12(),reig13(),reig14(),reig15();
interrupt void reig16(),l1(),l2(),l3(),l4(),l5(),RTCint(),l7(),unsi();
void fin(),e_fin(int e2,int e1);
void sys0(),sys2(),sys3(),sys4(),sys5(),sys8();
int sys1(),sys9(),sys10(),sys11();
void (*pinz)(),(*pnrm)(),(*ptim)(),(*pint)(),(*(*vp))();
unsigned que[7][MAXTSK],lastq[7];
int ncom[7][MAXTSK], tcom[MAXTSK], icom[MAXTSK];
int nscom[7][MAXTSK],tscom[MAXTSK],iscom[MAXTSK];
int code[2];
extern void rtc_clr();
unsigned long Sysclk=0;
int vmemask=0;
int inportb(port)
char *port;
{
return((int)*port);
}
int outportb(port,data)
char *port;
int data;
{
return(*port = data);
}
int outportl(port,data)
char *port;
int data;
{
unsigned char tbyte,hbyte,mbyte,lbyte;
tbyte = (unsigned char)((data&0xff000000)>>24);
hbyte = (unsigned char)((data&0x00ff0000)>>16);
mbyte = (unsigned char)((data&0x0000ff00)>>8);
lbyte = (unsigned char)(data&0x000000ff);
*port = tbyte;
*(port + 0x02) = hbyte;
*(port + 0x04) = mbyte;
*(port + 0x06) = lbyte;
return(data);
}
int absl(a)
int a;
{
int ans;
if(a<0) ans = 0 - a;
else ans = a;
return(ans);
}
/***********************/
/*mirx68k1 main program*/
/***********************/
void main()
{
int usetsk;
eichi = 30;
rtc_clr(); /*mirs9402 1/31*/
/*tm_init*/
/* outportb(MSR,0x40);
outportb(PFIC,0x10);
outportb(TSIC,0x00);
outportb(MSR,0x00);*/
outportb(MSR,0x0c);
inportb(0xfdfe07);
outportb(MSR,0x4c);
outportb(RTMR,0x08);
outportb(PFIC,0x10);
outportb(MSR,0x0c);
usetsk=inzdsp();
eichi = 70;
/* asm(" MOVE.W #$2000,SR "); */ /* Interrupt Able */
asm("\tMOVE\t#$2000,SR\t"); /*enable interrupt*/
while( usetsk != 0)
{
timdsp();
nrmdsp();
}
}
int inzdsp()
{
int ut,tn,py;
ut=0;
for (tn=0;tn 0x80) ut++;
}
return(ut);
}
void timdsp()
{
int tn;
for (tn=0;tn= table[tn].timset))
{
ptim=table[tn].timtsk;
table[tn].flg |= 0x20; /* set busyflag */
(*ptim)(tcom[tn],tscom[tn]);
table[tn].flg &= 0xdf; /* reset busyflag */
table[tn].timer=0;
}
}
void nrmdsp()
{
int nb,tn,py,savesrn;
nb=tn=py=0;
for (py=0;py<7;py++)
if (lastq[py] != 0)
{
tn=que[py][0];
if ((table[tn].flg & 0xe0) == 0xc0)
{
pnrm=table[tn].nrmtsk;
table[tn].flg |= 0x20; /* set busyflag */
(*pnrm)(ncom[py][0],nscom[py][0]);
table[tn].flg &= 0xdf; /* reset busyflag */
}
asm(" MOVE.W SR,`savesrn` "); /*Save SR*/
asm(" MOVE.W #$2700,SR "); /*Interrupt disable*/
lastq[py]--;
for (nb=0;nb<lastq[py];nb++)
{
que[py][nb] =que[py][nb+1];
ncom[py][nb] =ncom[py][nb+1];
nscom[py][nb]=nscom[py][nb+1];
}
asm(" MOVE.W `savesrn`,SR "); /*Restore SR*/
/*break;*/
}
};
/*
void intdsp(intnum)
int intnum;
{
int inttask;
inttask = inter[intnum].tskn;
if ((table[inttask].flg & 0xb8) == 0x88)
{
pint=table[inttask].inttsk;
table[inttask].flg |= 0x20; *//* set busyflag *//*
(*pint)(icom[inttask],iscom[inttask]);
table[inttask].flg &= 0xdf; *//* reset busyflag *//*
}
}
*/
void e_fin(e2,e1)
int e1,e2;
{
code[1]=e2; code[0]=e1;
fin();
}
void fin()
{
asm(" MOVE.W #$2700,SR "); /*Interrupt Enable*/
for(;;);
}
interrupt void reig1() /*reset ssp*/
{ e_fin(0,1);}
interrupt void reig2() /*reset pc*/
{ e_fin(0,2);}
interrupt void reig3() /*Bus error*/
{ e_fin(0,3);}
interrupt void reig4() /*Address error*/
{ e_fin(0,4);}
interrupt void reig5() /*illegal error*/
{ e_fin(0,5);}
interrupt void reig6() /*zero divide*/
{ e_fin(0,6);}
interrupt void reig7() /*CHK*/
{ e_fin(0,7);}
interrupt void reig8() /*trapV*/
{ e_fin(0,8);}
interrupt void reig9() /*privilege*/
{ e_fin(0,9);}
interrupt void reig10() /*trace*/
{ e_fin(1,0);}
interrupt void reig11() /*l.10100 emu.*/
{ e_fin(1,1);}
interrupt void reig12() /*l.1111 emu.*/
{e_fin(1,2);}
interrupt void reig13() /*format error*/
{ e_fin(1,3);}
interrupt void reig14() /*uninitialized*/
{ e_fin(1,4);}
interrupt void reig15() /*sprious*/
{ e_fin(1,5);}
interrupt void reig16() /*trap*/
{ e_fin(1,6);}
interrupt void unsi() /*unsigned, reserved*/
{ e_fin(2,0);}
interrupt void l1()
{ e_fin(2,1);}
interrupt void l2()
{ e_fin(2,2);}
interrupt void l3()
{ e_fin(2,3);}
interrupt void l4()
{ e_fin(2,4);}
interrupt void l5()
{ e_fin(2,5);}
interrupt void RTCint() /*RTC interrupt*/
{
int tn,count,i,j,o,p;
o=0;p=0;
code[1]=2;code[0]=6;
o = inportb(MSR);
p = inportb(PFIC);
if (((o & 0x04)==0x04) && ((p & 0x10)==0x10))
{
Sysclk+=10; /*mintim=10msec*/
count = sys9(0,2); /* count up */
count++;
sys8(0,2,count);
count = sys9(0,3); /* mirs9402 original */
count+=10; /* mirs9402 original */
sys8(0,3,count); /* mirs9402 original */
for (tn=0;tn= 0x80)
e_fin(2,7);
else
e_fin(2,8);
}
void sys0(tskn,flag) /* system call 0:task initialize */
int tskn,flag;
{
int fg7,fg6,fg3,fg2;
fg7=fg6=fg3=fg2=1;
if ((flag&0x1000) == 0) fg7=0;
if ((flag&0x100) == 0) fg6=0;
if ((flag&0x10) == 0) fg2=0;
if ((flag&0x1) == 0) fg3=0;
fg7<<=7; fg6<<=6; fg3<<=3; fg2<<=2;
table[tskn].flg=fg7+fg6+fg3+fg2;
}
int sys1(tn,py,cm,scm) /* system call 1:set normal task */
int tn,py,cm,scm;
{
int n,i,savesr;
asm(" MOVE.W SR,`savesr` "); /*Save SR*/
asm(" MOVE.W #$2700,SR "); /*Interrupt disable*/
n=lastq[py]++;
if (n>=MAXTSK) fin();
que[py][n] =tn;
ncom[py][n] =cm;
nscom[py][n]=scm;
if(eichi != 30)
{
asm(" MOVE.W `savesr`,SR "); /*Restore SR*/
}
return(0);
}
void sys2(tn,st,cm,scm) /* system call 2:set timer task */
int tn,st,cm,scm;
{
table[tn].timset = st;
tcom[tn]=cm;
tscom[tn]=scm;
sys3(tn,0);
}
void sys3(tskn,reset) /* system call 3:count start */
int tskn,reset;
{
table[tskn].flg |= 0x01;
if (reset!=0) table[tskn].timer=0;
}
void sys4(tskn) /* system call 4:count stop */
int tskn;
{
table[tskn].flg &= 0xfe;
}
void sys5(tskn,aflg,lv,cm,scm) /* system call 5:set interrupt task */
int tskn,aflg,lv,cm,scm;
{
if(aflg == 1) {
table[tskn].flg &= 0xef;
icom[tskn]=cm;
iscom[tskn]=scm;
vp=(void *)(0x60+4*lv);
*vp=table[tskn].inttsk;
}
if(aflg == 0) {
table[tskn].flg &= 0xef;
icom[tskn]=cm;
iscom[tskn]=scm;
vp = (void *)(lv * 4);
*vp=table[tskn].inttsk;
}
}
void sys8(tskn,bbn,dat) /* system call 8:‚a‚a write */
int tskn,bbn,dat;
{
switch (bbn)
{
case 1:table[tskn].BB1 = dat;break;
case 2:table[tskn].BB2 = dat;break;
case 3:table[tskn].BB3 = dat;break;
case 4:table[tskn].BB4 = dat;break;
case 5:table[tskn].BB5 = dat;break;
}
}
int sys9(tskn,bbn) /* system call 9:‚a‚a read */
int tskn,bbn;
{
switch (bbn)
{
case 1:return(table[tskn].BB1);
case 2:return(table[tskn].BB2);
case 3:return(table[tskn].BB3);
case 4:return(table[tskn].BB4);
case 5:return(table[tskn].BB5);
}
return(0);
}
int sys10(irqn) /* VME IRQx mask */
int irqn;
{
int i;
i=(1<<irqn)^0xff;
vmemask&=i;
outportb(VIMR,vmemask); /* VME IRQ disable */
return(vmemask);
}
int sys11(irqn) /* VME IRQx unmask */
int irqn;
{
int i;
i=1<<irqn;
vmemask|=i;
outportb(VIMR,vmemask); /* VME IRQ1 enable */
return(vmemask);
}
ŠJ”‹K–ñ‚É–ß‚é