/*********************************************/ /* MIRX68K for PEP VSBC-1 */ /*********************************************/ #include "iodef.h" #include "task.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]; unsigned long Sysclk=0; int vmemask=0; extern int inportb(); extern int outportb(); extern int outportl(); int absl(a) /*aを絶対値表示*/ { int ans; if(a<0) ans = 0 - a; else ans = a; return(ans); } /***********************/ /*MIRX68K main program*/ /***********************/ void main() { int usetsk,i,rtc_base; eichi = 30; /* Real Time Clock initialize*/ outportb(MSR,0x40); outportb(PFIC,0x10); outportb(TSIC,0x00); outportb(MSR,0x00); /* written by N.Hayashi */ /*リアルタイムクロックの初期化*/ 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 enable */ while( usetsk != 0) { timdsp(); nrmdsp(); } } int inzdsp() { int ut,tn,py; ut=0; for (tn=0;tn0x80) ut++;/*フラグの7と6、3、2ビット目のいずれかが*/ } /*1なら帰り値が1*/ return(ut); } void timdsp() /*タスクタイマ処理(タイマー割込み処理)timt00〜timt05を実効*/ { 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()/*ノーマルタスク処理 nrmt00〜nrmt05を実効*/ { 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 = 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; /*fgn<<=m fgnの値をm回左へビットシフト*/ table[tskn].flg=fg7+fg6+fg3+fg2; /*4ビットの[flag]を1バイトの制御フラグに変換する*/ } 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; /*vpにintt00〜intt05迄をセット*/ { 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:BB 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; case 6:table[tskn].BB6 = dat;break; } } int sys9(tskn,bbn) /* system call 9:BB 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); case 6:return(table[tskn].BB6); } return(0); } int sys10(irqn) /* VME IRQx mask */ int irqn; { int i; i=(1<