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 |
|
---|