[3ae31e9] | 1 | /*
|
---|
| 2 | =============================================================================
|
---|
| 3 | mtinit.c -- Multi-Tasker -- initialization, etc.
|
---|
| 4 | Version 31 -- 1988-04-15 -- D.N. Lynx Crowe
|
---|
| 5 | (c) Copyright 1988 -- D.N. Lynx Crowe
|
---|
| 6 | =============================================================================
|
---|
| 7 | */
|
---|
| 8 |
|
---|
| 9 | #include "stddefs.h"
|
---|
| 10 | #include "biosdefs.h"
|
---|
| 11 | #include "mtdefs.h"
|
---|
| 12 | #include "debug.h"
|
---|
| 13 |
|
---|
| 14 | extern short _MT_Swp(); /* swapper TRAP handler -- swap */
|
---|
| 15 | extern short _MT_Nxt(); /* swapper TRAP handler -- next */
|
---|
| 16 | extern short setipl(); /* set processor IPL function */
|
---|
| 17 |
|
---|
| 18 | extern TCB *MT_TCBs; /* TCB chain pointer */
|
---|
| 19 | extern TCB *MT_CurP; /* current TCB pointer */
|
---|
| 20 | extern TCB *MT_RdyQ; /* ready queue pointer */
|
---|
| 21 | extern TCB _MTptcb[2]; /* private TCBs */
|
---|
| 22 |
|
---|
| 23 | extern unsigned MT_IDct; /* next available task ID */
|
---|
| 24 |
|
---|
| 25 | extern unsigned *_MT_Vc1; /* old swapper TRAP vector 1 */
|
---|
| 26 | extern unsigned *_MT_Vc2; /* old swapper TRAP vector 2 */
|
---|
| 27 |
|
---|
| 28 | long _MT_Stk[48]; /* a stack for _MT_Nil() */
|
---|
| 29 |
|
---|
| 30 | TCB _MT_TCB; /* dummy TCB for shutdown */
|
---|
| 31 |
|
---|
| 32 | /* |
---|
| 33 |
|
---|
| 34 | */
|
---|
| 35 |
|
---|
| 36 | /*
|
---|
| 37 | =============================================================================
|
---|
| 38 | _MT_Nil() -- the NIL task (must always be present on the ready queue)
|
---|
| 39 | =============================================================================
|
---|
| 40 | */
|
---|
| 41 |
|
---|
| 42 | _MT_Nil()
|
---|
| 43 | {
|
---|
| 44 | register short i, j;
|
---|
| 45 |
|
---|
| 46 | while (TRUE) {
|
---|
| 47 |
|
---|
| 48 | setipl(2); /* make sure we're interruptable */
|
---|
| 49 |
|
---|
| 50 | for (i = 0; i < 10; i++)
|
---|
| 51 | ++j;
|
---|
| 52 |
|
---|
| 53 | DB_CMNT("_MT_Nil");
|
---|
| 54 | MTSwap();
|
---|
| 55 | }
|
---|
| 56 | }
|
---|
| 57 |
|
---|
| 58 | /*
|
---|
| 59 | =============================================================================
|
---|
| 60 | MTInit() -- initialize the mutitasker and setup the task 0 default TCB
|
---|
| 61 | =============================================================================
|
---|
| 62 | */
|
---|
| 63 |
|
---|
| 64 | MTInit()
|
---|
| 65 | {
|
---|
| 66 | register short i, oldipl;
|
---|
| 67 | register TCB *tcp;
|
---|
| 68 |
|
---|
| 69 | DB_ENTR("MTInit");
|
---|
| 70 | oldipl = setipl(7); /* DISABLE INTERRUPTS */
|
---|
| 71 |
|
---|
| 72 | MT_TCBs = &_MTptcb[1]; /* setup the TCB chain pointer */
|
---|
| 73 | MT_RdyQ = &_MTptcb[0]; /* task 0 is on the ready queue */
|
---|
| 74 |
|
---|
| 75 | memsetw(&_MTptcb[0], 0, sizeof (TCB) / 2); /* clear task 0 TCB */
|
---|
| 76 | memsetw(&_MTptcb[1], 0, sizeof (TCB) / 2); /* clear task 1 TCB */
|
---|
| 77 |
|
---|
| 78 | _MTptcb[0].flags = MTF_OCC | MTF_RDY; /* set task 0 ready ... */
|
---|
| 79 | _MTptcb[0].slice = -1L; /* ... not time-sliced */
|
---|
| 80 | _MTptcb[0].pc = _MT_Nil; /* ... NIL task */
|
---|
| 81 | _MTptcb[0].sp = &_MT_Stk[48]; /* ... set stack space */
|
---|
| 82 | _MTptcb[0].reg[15] = &_MT_Stk[48]; /* ... and a7 */
|
---|
| 83 | _MTptcb[0].sr = MT_NilSR; /* ... set sr */
|
---|
| 84 |
|
---|
| 85 | MT_CurP = &_MTptcb[1]; /* task 1 is the current task */
|
---|
| 86 |
|
---|
| 87 | _MTptcb[1].fwd = &_MTptcb[0]; /* point at next TCB */
|
---|
| 88 | _MTptcb[1].flags = MTF_OCC | MTF_RUN; /* set task 1 running ... */
|
---|
| 89 | _MTptcb[1].pri = MT_DfPri; /* ... default priority */
|
---|
| 90 | _MTptcb[1].slice = -1L; /* ... not time-sliced */
|
---|
| 91 | _MTptcb[1].tid = 1; /* ... set task ID */
|
---|
| 92 |
|
---|
| 93 | MT_IDct = 2; /* next task ID = 2 */
|
---|
| 94 |
|
---|
| 95 | _MT_Vc1 = BIOS(B_SETV, 40, _MT_Swp); /* set swapper TRAP vector 1 */
|
---|
| 96 | _MT_Vc2 = BIOS(B_SETV, 41, _MT_Nxt); /* set swapper TRAP vector 2 */
|
---|
| 97 |
|
---|
| 98 | setipl(oldipl); /* RESTORE INTERRUPTS */
|
---|
| 99 | DB_EXIT("MTInit");
|
---|
| 100 | }
|
---|
| 101 |
|
---|