OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

[/] [thor/] [trunk/] [software/] [FMTK/] [source/] [kernel/] [FMTKc.c] - Blame information for rev 23

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 23 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2012-2016  Robert Finch, Stratford
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
//
9
// This source file is free software: you can redistribute it and/or modify 
10
// it under the terms of the GNU Lesser General Public License as published 
11
// by the Free Software Foundation, either version 3 of the License, or     
12
// (at your option) any later version.                                      
13
//                                                                          
14
// This source file is distributed in the hope that it will be useful,      
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
17
// GNU General Public License for more details.                             
18
//                                                                          
19
// You should have received a copy of the GNU General Public License        
20
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
21
//                                                                          
22
// ============================================================================
23
//
24
#include "config.h"
25
#include "const.h"
26
#include "types.h"
27
#include "proto.h"
28
#include "glo.h"
29
 
30
extern int shell();
31
extern void KeybdIRQ();
32
extern pascal int putstr(char *, int);
33
extern int printf(char *, ...);
34
void panic(char *msg);
35
extern int FMTK_FreeMbx(hMBX);
36
 
37
int irq_stack[512];
38
int sp_tmp;
39
int FMTK_Inited;
40
JCB jcbs[NR_JCB];
41
extern TCB tcbs[NR_TCB];
42
extern hTCB readyQ[8];
43
int sysstack[1024];
44
int stacks[NR_TCB][1024];
45
int sys_stacks[NR_TCB][512];
46
int bios_stacks[NR_TCB][512];
47
int fmtk_irq_stack[512];
48
int fmtk_sys_stack[512];
49
MBX mailbox[NR_MBX];
50
MSG message[NR_MSG];
51
int nMsgBlk;
52
int nMailbox;
53
hJCB freeJCB;
54
hMSG freeMSG;
55
hMBX freeMBX;
56
JCB *IOFocusNdx;
57
int IOFocusTbl[4];
58
int iof_switch;
59
int BIOS1_sema;
60
int iof_sema;
61
int sys_sema;
62
int BIOS_RespMbx;
63
char hasUltraHighPriorityTasks;
64
int missed_ticks;
65
 
66
short int video_bufs[NR_JCB][4096];
67
extern hTCB TimeoutList;
68
 
69
extern void gfx_demo();
70
 
71
// This table needed in case we want to call the OS routines directly.
72
// It is also used by the system call interrupt as a vector table.
73
 
74
naked void FMTK_BrTbl()
75
{
76
      asm {
77
                  align 4
78
dh      FMTKInitialize_
79
dh      FMTK_StartTask_
80
dh      FMTK_ExitTask_
81
dh      FMTK_KillTask_
82
dh      FMTK_SetTaskPriority_
83
dh      FMTK_Sleep_
84
dh      FMTK_AllocMbx_
85
dh      FMTK_FreeMbx_
86
dh      FMTK_PostMsg_
87
dh      FMTK_SendMsg_
88
dh      FMTK_WaitMsg_
89
dh      FMTK_CheckMsg_
90
      }
91
}
92
 
93
naked int GetVecno()
94
{
95
    asm {
96
        mfspr  r1,12
97
        rts
98
    }
99
}
100
 
101
naked void DisplayIRQLive()
102
{
103
     asm {
104
         lh       r1,hs:328
105
         addui    r1,r1,#1
106
         sh       r1,hs:328
107
     }
108
}
109
 
110
JCB *GetJCBPtr()
111
{
112
    return &jcbs[tcbs[GetRunningTCB()].hJob];
113
}
114
 
115
 
116
// ----------------------------------------------------------------------------
117
// Select a task to run.
118
// ----------------------------------------------------------------------------
119
 
120
private const __int8 startQ[32] = { 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 1, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 1, 0, 7, 0, 0, 0, 0 };
121
private __int8 startQNdx;
122
 
123
private hTCB SelectTaskToRun()
124
{
125
        int nn,kk;
126
        TCB *p, *q;
127
        int qToCheck;
128
    hTCB h;
129
 
130
        startQNdx++;
131
        startQNdx &= 31;
132
        qToCheck = startQ[startQNdx];
133
        qToCheck &= 7;
134
        for (nn = 0; nn < 8; nn++) {
135
                h = readyQ[qToCheck];
136
                if (h >= 0 && h < NR_TCB) {
137
                p = &tcbs[h];
138
            kk = 0;
139
            // Can run the head of a lower Q level if it's not the running
140
            // task, otherwise look to the next task.
141
            if (h != GetRunningTCB())
142
                        q = p;
143
                else
144
                        q = &tcbs[p->next];
145
            do {
146
                if (!(q->status & TS_RUNNING)) {
147
                    if (q->affinity == getCPU()) {
148
                                   readyQ[qToCheck] = q - tcbs;
149
                                   return q - tcbs;
150
                    }
151
                }
152
                q = &tcbs[q->next];
153
                kk = kk + 1;
154
            } while (q != p && kk < NR_TCB);
155
        }
156
                qToCheck++;
157
                qToCheck &= 7;
158
        }
159
        return GetRunningTCB();
160
        panic("No entries in ready queue.");
161
}
162
 
163
// ----------------------------------------------------------------------------
164
// There isn't any 'C' code in the SystemCall() function. If there were it
165
// would have to be arranged like the TimerIRQ() or RescheduleIRQ() functions.
166
// ----------------------------------------------------------------------------
167
 
168
naked FMTK_SystemCall()
169
{
170
        asm {
171
                sync
172
                sw              r2,TCB_r2[tr]
173
                sw              r3,TCB_r3[tr]
174
                sw              r4,TCB_r4[tr]
175
                sw              r5,TCB_r5[tr]
176
                sw              r6,TCB_r6[tr]
177
                sw              r7,TCB_r7[tr]
178
                sw              r8,TCB_r8[tr]
179
                sw              r9,TCB_r9[tr]
180
                sw              r10,TCB_r10[tr]
181
                sw              r11,TCB_r11[tr]
182
                sw              r12,TCB_r12[tr]
183
                sw              r13,TCB_r13[tr]
184
                sw              r14,TCB_r14[tr]
185
                sw              r15,TCB_r15[tr]
186
                sw              r16,TCB_r16[tr]
187
                sw              r17,TCB_r17[tr]
188
                sw              r18,TCB_r18[tr]
189
                sw              r19,TCB_r19[tr]
190
                sw              r20,TCB_r20[tr]
191
                sw              r21,TCB_r21[tr]
192
                sw              r22,TCB_r22[tr]
193
                sw              r23,TCB_r23[tr]
194
                sw              r24,TCB_r24[tr]
195
                sw              r25,TCB_r25[tr]
196
                sw              r26,TCB_r26[tr]
197
                sw              r27,TCB_r27[tr]
198
                sws             ds,TCB_ds[tr]
199
                sws             es,TCB_es[tr]
200
                sws             fs,TCB_fs[tr]
201
                sws             gs,TCB_gs[tr]
202
                sws             hs,TCB_hs[tr]
203
                sws             ss,TCB_ss[tr]
204
                sws             cs,TCB_cs[tr]
205
                sws             ds.lmt,TCB_dslmt[tr]
206
                sws             es.lmt,TCB_eslmt[tr]
207
                sws             fs.lmt,TCB_fslmt[tr]
208
                sws             gs.lmt,TCB_gslmt[tr]
209
                sws             hs.lmt,TCB_hslmt[tr]
210
                sws             ss.lmt,TCB_sslmt[tr]
211
                sws             cs.lmt,TCB_cslmt[tr]
212
                sws             c1,TCB_c1[tr]
213
                sws             c2,TCB_c2[tr]
214
                sws             c3,TCB_c3[tr]
215
                sws             c4,TCB_c4[tr]
216
                sws             c5,TCB_c5[tr]
217
                sws             c6,TCB_c6[tr]
218
                sws             c7,TCB_c7[tr]
219
                sws             c8,TCB_c8[tr]
220
                sws             c9,TCB_c9[tr]
221
                sws             c10,TCB_c10[tr]
222
                sws             c11,TCB_c11[tr]
223
                sws             c13,TCB_c13[tr]
224
                sws             c14,TCB_c14[tr]
225
                sws             pregs,TCB_pregs[tr]
226
        }
227
    asm {
228
                ldi             sp,#sysstack_+1023*8    ; switch to system stack
229
                mtspr   ss,r0
230
                ldi             ss.lmt,#-1
231
                mtspr   ds,r0                   ; and data segment
232
                ldi             ds.lmt,#-1
233
                mfspr   r6,c13                  ; r6 = return address
234
        lbu         r7,[r6]                     ; r7 = static call number parameter
235
                addui   r6,r6,#1
236
                mtspr   c13,r6
237
                sws             c13,TCB_c13[tr] ; save c13 in task image
238
        cmpi    p0,r7,#20
239
p0.gtu  ldi     r1,#E_BadFuncno
240
p0.gtu  br              .0001
241
                addui   sp,sp,#-40
242
                sw              r1,[sp]
243
                sw              r2,8[sp]
244
                sw              r3,16[sp]
245
                sw              r4,24[sp]
246
                sw              r5,32[sp]
247
                jhi             c1,cs:FMTK_BrTbl_[r7]   ; do the system function
248
.0001:
249
                ; leave r1 as system call result
250
                lw              r2,TCB_r2[tr]
251
                lw              r3,TCB_r3[tr]
252
                lw              r4,TCB_r4[tr]
253
                lw              r5,TCB_r5[tr]
254
                lw              r6,TCB_r6[tr]
255
                lw              r7,TCB_r7[tr]
256
                lw              r8,TCB_r8[tr]
257
                lw              r9,TCB_r9[tr]
258
                lw              r10,TCB_r10[tr]
259
                lw              r11,TCB_r11[tr]
260
                lw              r12,TCB_r12[tr]
261
                lw              r13,TCB_r13[tr]
262
                lw              r14,TCB_r14[tr]
263
                lw              r15,TCB_r15[tr]
264
                lw              r16,TCB_r16[tr]
265
                lw              r17,TCB_r17[tr]
266
                lw              r18,TCB_r18[tr]
267
                lw              r19,TCB_r19[tr]
268
                lw              r20,TCB_r20[tr]
269
                lw              r21,TCB_r21[tr]
270
                lw              r22,TCB_r22[tr]
271
                lw              r23,TCB_r23[tr]
272
                lw              r24,TCB_r24[tr]
273
                lw              r25,TCB_r25[tr]
274
                lw              r26,TCB_r26[tr]
275
                lw              r27,TCB_r27[tr]
276
                lws             ds,TCB_ds[tr]
277
                lws             es,TCB_es[tr]
278
                lws             fs,TCB_fs[tr]
279
                lws             gs,TCB_gs[tr]
280
                lws             hs,TCB_hs[tr]
281
                lws             ss,TCB_ss[tr]
282
                lws             cs,TCB_cs[tr]
283
                lws             ds.lmt,TCB_dslmt[tr]
284
                lws             es.lmt,TCB_eslmt[tr]
285
                lws             fs.lmt,TCB_fslmt[tr]
286
                lws             gs.lmt,TCB_gslmt[tr]
287
                lws             hs.lmt,TCB_hslmt[tr]
288
                lws             ss.lmt,TCB_sslmt[tr]
289
                lws             cs.lmt,TCB_cslmt[tr]
290
                lws             c1,TCB_c1[tr]
291
                lws             c2,TCB_c2[tr]
292
                lws             c3,TCB_c3[tr]
293
                lws             c4,TCB_c4[tr]
294
                lws             c5,TCB_c5[tr]
295
                lws             c6,TCB_c6[tr]
296
                lws             c7,TCB_c7[tr]
297
                lws             c8,TCB_c8[tr]
298
                lws             c9,TCB_c9[tr]
299
                lws             c10,TCB_c10[tr]
300
                lws             c11,TCB_c11[tr]
301
                lws             c13,TCB_c13[tr]
302
                lws             c14,TCB_c14[tr]
303
                lws             pregs,TCB_pregs[tr]
304
                sync
305
                rte
306
    }
307
}
308
 
309
// ----------------------------------------------------------------------------
310
// If timer interrupts are enabled during a priority #0 task, this routine
311
// only updates the missed ticks and remains in the same task. No timeouts
312
// are updated and no task switches will occur. The timer tick routine
313
// basically has a fixed latency when priority #0 is present.
314
// ----------------------------------------------------------------------------
315
 
316
void FMTK_SchedulerIRQ()
317
{
318
        TCB *t;
319
 
320
        prolog asm {
321
                sync
322
                sw              r1,TCB_ir1[tr]
323
                sw              r2,TCB_ir2[tr]
324
                sw              r3,TCB_ir3[tr]
325
                sw              r4,TCB_ir4[tr]
326
                sw              r5,TCB_ir5[tr]
327
                sw              r6,TCB_ir6[tr]
328
                sw              r7,TCB_ir7[tr]
329
                sw              r8,TCB_ir8[tr]
330
                sw              r9,TCB_ir9[tr]
331
                sw              r10,TCB_ir10[tr]
332
                sw              r11,TCB_ir11[tr]
333
                sw              r12,TCB_ir12[tr]
334
                sw              r13,TCB_ir13[tr]
335
                sw              r14,TCB_ir14[tr]
336
                sw              r15,TCB_ir15[tr]
337
                sw              r16,TCB_ir16[tr]
338
                sw              r17,TCB_ir17[tr]
339
                sw              r18,TCB_ir18[tr]
340
                sw              r19,TCB_ir19[tr]
341
                sw              r20,TCB_ir20[tr]
342
                sw              r21,TCB_ir21[tr]
343
                sw              r22,TCB_ir22[tr]
344
                sw              r23,TCB_ir23[tr]
345
                sw              r24,TCB_ir24[tr]
346
                sw              r25,TCB_ir25[tr]
347
                sw              r26,TCB_ir26[tr]
348
                sw              r27,TCB_ir27[tr]
349
                sws             ds,TCB_ids[tr]
350
                sws             es,TCB_ies[tr]
351
                sws             fs,TCB_ifs[tr]
352
                sws             gs,TCB_igs[tr]
353
                sws             hs,TCB_ihs[tr]
354
                sws             ss,TCB_iss[tr]
355
                sws             cs,TCB_ics[tr]
356
                sws             ds.lmt,TCB_idslmt[tr]
357
                sws             es.lmt,TCB_ieslmt[tr]
358
                sws             fs.lmt,TCB_ifslmt[tr]
359
                sws             gs.lmt,TCB_igslmt[tr]
360
                sws             hs.lmt,TCB_ihslmt[tr]
361
                sws             ss.lmt,TCB_isslmt[tr]
362
                sws             cs.lmt,TCB_icslmt[tr]
363
                sws             c1,TCB_ic1[tr]
364
                sws             c2,TCB_ic2[tr]
365
                sws             c3,TCB_ic3[tr]
366
                sws             c4,TCB_ic4[tr]
367
                sws             c5,TCB_ic5[tr]
368
                sws             c6,TCB_ic6[tr]
369
                sws             c7,TCB_ic7[tr]
370
                sws             c8,TCB_ic8[tr]
371
                sws             c9,TCB_ic9[tr]
372
                sws             c10,TCB_ic10[tr]
373
                sws             c11,TCB_ic11[tr]
374
                sws             c13,TCB_ic13[tr]
375
                sws             c14,TCB_ic14[tr]
376
                sws             pregs,TCB_ipregs[tr]
377
 
378
                ldi             sp,#irq_stack_+511*8    ; setup system stack and data segments
379
                mtspr   ss,r0
380
                ldis    ss.lmt,#-1
381
                mtspr   ds,r0
382
                ldis    ds.lmt,#-1
383
                ldi             hs,#$FFD00000
384
                ldi             hs.lmt,#$100000
385
                ldi             r1,#2                                   ; reset edge sense circuit
386
                sh              r1,hs:PIC_ESR
387
        }
388
        DisplayIRQLive();
389
        if (LockSemaphore(&sys_sema,10)) {
390
                t = GetRunningTCBPtr();
391
                t->ticks = t->ticks + (t->endTick - t->startTick);
392
                if (t->priority != 000) {
393
                        t->status = TS_PREEMPT;
394
                        while (TimeoutList >= 0 && TimeoutList < NR_TCB) {
395
                                if (tcbs[TimeoutList].timeout<=0)
396
                                        InsertIntoReadyList(PopTimeoutList());
397
                                else {
398
                                        tcbs[TimeoutList].timeout = tcbs[TimeoutList].timeout - missed_ticks - 1;
399
                                        missed_ticks = 0;
400
                                        break;
401
                                }
402
                        }
403
                        if (t->priority > 002)
404
                        SetRunningTCB(SelectTaskToRun());
405
                        GetRunningTCBPtr()->status = TS_RUNNING;
406
                }
407
                else {
408
                        missed_ticks++;
409
                }
410
                UnlockSemaphore(&sys_sema);
411
        }
412
        else {
413
                missed_ticks++;
414
        }
415
        // If an exception was flagged (eg CTRL-C) return to the catch handler
416
        // not the interrupted code.
417
        t = GetRunningTCBPtr();
418
        if (t->exception) {
419
                t->icregs[1] = t->icregs[11];    // set link register to catch handler
420
                t->icregs[13] = t->icregs[11];   // and the PC register
421
                t->iregs[1] = t->exception;    // r1 = exception value
422
                t->exception = 0;
423
                t->iregs[2] = 24;              // r2 = exception type
424
        }
425
        epilog asm {
426
                lw              r1,TCB_ir1[tr]
427
                lw              r2,TCB_ir2[tr]
428
                lw              r3,TCB_ir3[tr]
429
                lw              r4,TCB_ir4[tr]
430
                lw              r5,TCB_ir5[tr]
431
                lw              r6,TCB_ir6[tr]
432
                lw              r7,TCB_ir7[tr]
433
                lw              r8,TCB_ir8[tr]
434
                lw              r9,TCB_ir9[tr]
435
                lw              r10,TCB_ir10[tr]
436
                lw              r11,TCB_ir11[tr]
437
                lw              r12,TCB_ir12[tr]
438
                lw              r13,TCB_ir13[tr]
439
                lw              r14,TCB_ir14[tr]
440
                lw              r15,TCB_ir15[tr]
441
                lw              r16,TCB_ir16[tr]
442
                lw              r17,TCB_ir17[tr]
443
                lw              r18,TCB_ir18[tr]
444
                lw              r19,TCB_ir19[tr]
445
                lw              r20,TCB_ir20[tr]
446
                lw              r21,TCB_ir21[tr]
447
                lw              r22,TCB_ir22[tr]
448
                lw              r23,TCB_ir23[tr]
449
                lw              r24,TCB_ir24[tr]
450
                lw              r25,TCB_ir25[tr]
451
                lw              r26,TCB_ir26[tr]
452
                lw              r27,TCB_ir27[tr]
453
                lws             ds,TCB_ids[tr]
454
                lws             es,TCB_ies[tr]
455
                lws             fs,TCB_ifs[tr]
456
                lws             gs,TCB_igs[tr]
457
                lws             hs,TCB_ihs[tr]
458
                lws             ss,TCB_iss[tr]
459
                lws             cs,TCB_ics[tr]
460
                lws             ds.lmt,TCB_idslmt[tr]
461
                lws             es.lmt,TCB_ieslmt[tr]
462
                lws             fs.lmt,TCB_ifslmt[tr]
463
                lws             gs.lmt,TCB_igslmt[tr]
464
                lws             hs.lmt,TCB_ihslmt[tr]
465
                lws             ss.lmt,TCB_isslmt[tr]
466
                lws             cs.lmt,TCB_icslmt[tr]
467
                lws             c1,TCB_ic1[tr]
468
                lws             c2,TCB_ic2[tr]
469
                lws             c3,TCB_ic3[tr]
470
                lws             c4,TCB_ic4[tr]
471
                lws             c5,TCB_ic5[tr]
472
                lws             c6,TCB_ic6[tr]
473
                lws             c7,TCB_ic7[tr]
474
                lws             c8,TCB_ic8[tr]
475
                lws             c9,TCB_ic9[tr]
476
                lws             c10,TCB_ic10[tr]
477
                lws             c11,TCB_ic11[tr]
478
                lws             c13,TCB_ic13[tr]
479
                lws             c14,TCB_ic14[tr]
480
                lws             pregs,TCB_ipregs[tr]
481
                sync
482
                rti
483
        }
484
}
485
 
486
void FMTK_SchedulerIRQ2()
487
{
488
     TCB *t;
489
 
490
        prolog asm {
491
                sync
492
                sw              r1,TCB_ir1[tr]
493
                sw              r2,TCB_ir2[tr]
494
                sw              r3,TCB_ir3[tr]
495
                sw              r4,TCB_ir4[tr]
496
                sw              r5,TCB_ir5[tr]
497
                sw              r6,TCB_ir6[tr]
498
                sw              r7,TCB_ir7[tr]
499
                sw              r8,TCB_ir8[tr]
500
                sw              r9,TCB_ir9[tr]
501
                sw              r10,TCB_ir10[tr]
502
                sw              r11,TCB_ir11[tr]
503
                sw              r12,TCB_ir12[tr]
504
                sw              r13,TCB_ir13[tr]
505
                sw              r14,TCB_ir14[tr]
506
                sw              r15,TCB_ir15[tr]
507
                sw              r16,TCB_ir16[tr]
508
                sw              r17,TCB_ir17[tr]
509
                sw              r18,TCB_ir18[tr]
510
                sw              r19,TCB_ir19[tr]
511
                sw              r20,TCB_ir20[tr]
512
                sw              r21,TCB_ir21[tr]
513
                sw              r22,TCB_ir22[tr]
514
                sw              r23,TCB_ir23[tr]
515
                sw              r24,TCB_ir24[tr]
516
                sw              r25,TCB_ir25[tr]
517
                sw              r26,TCB_ir26[tr]
518
                sw              r27,TCB_ir27[tr]
519
                sws             ds,TCB_ids[tr]
520
                sws             es,TCB_ies[tr]
521
                sws             fs,TCB_ifs[tr]
522
                sws             gs,TCB_igs[tr]
523
                sws             hs,TCB_ihs[tr]
524
                sws             ss,TCB_iss[tr]
525
                sws             cs,TCB_ics[tr]
526
                sws             ds.lmt,TCB_idslmt[tr]
527
                sws             es.lmt,TCB_ieslmt[tr]
528
                sws             fs.lmt,TCB_ifslmt[tr]
529
                sws             gs.lmt,TCB_igslmt[tr]
530
                sws             hs.lmt,TCB_ihslmt[tr]
531
                sws             ss.lmt,TCB_isslmt[tr]
532
                sws             cs.lmt,TCB_icslmt[tr]
533
                sws             c1,TCB_ic1[tr]
534
                sws             c2,TCB_ic2[tr]
535
                sws             c3,TCB_ic3[tr]
536
                sws             c4,TCB_ic4[tr]
537
                sws             c5,TCB_ic5[tr]
538
                sws             c6,TCB_ic6[tr]
539
                sws             c7,TCB_ic7[tr]
540
                sws             c8,TCB_ic8[tr]
541
                sws             c9,TCB_ic9[tr]
542
                sws             c10,TCB_ic10[tr]
543
                sws             c11,TCB_ic11[tr]
544
                sws             c13,TCB_ic13[tr]
545
                sws             c14,TCB_ic14[tr]
546
                sws             pregs,TCB_ipregs[tr]
547
 
548
                ldi             sp,#irq_stack_+511*8    ; setup system stack and data segments
549
                mtspr   ss,r0
550
                ldis    ss.lmt,#-1
551
                mtspr   ds,r0
552
                ldis    ds.lmt,#-1
553
                ldi             hs,#$FFD00000
554
                ldi             hs.lmt,#$100000
555
                ldi             r1,#2                                   ; reset edge sense circuit
556
                sh              r1,hs:PIC_ESR
557
        }
558
         t->icregs[14] += 4;            // update return address
559
     // Explicit rescheduling request.
560
     t = GetRunningTCBPtr();
561
     t->ticks = t->ticks + (t->endTick - t->startTick);
562
     t->status = TS_GIVEAWAY;
563
     //t->iipc = t->iipc + 4;  // advance the return address
564
     SetRunningTCB(SelectTaskToRun());
565
     t = GetRunningTCBPtr();
566
     t->status = TS_RUNNING;
567
     // If an exception was flagged (eg CTRL-C) return to the catch handler
568
     // not the interrupted code.
569
     if (t->exception) {
570
         t->cregs[1] = t->cregs[11];   // set link register to catch handler
571
         t->cregs[13] = t->cregs[11];  // and the PC register
572
         t->regs[1] = t->exception;    // r1 = exception value
573
         t->exception = 0;
574
         t->regs[2] = 24;              // r2 = exception type
575
     }
576
     // Restore the processor registers and return using an RTE.
577
        epilog asm {
578
                lw              r1,TCB_ir1[tr]
579
                lw              r2,TCB_ir2[tr]
580
                lw              r3,TCB_ir3[tr]
581
                lw              r4,TCB_ir4[tr]
582
                lw              r5,TCB_ir5[tr]
583
                lw              r6,TCB_ir6[tr]
584
                lw              r7,TCB_ir7[tr]
585
                lw              r8,TCB_ir8[tr]
586
                lw              r9,TCB_ir9[tr]
587
                lw              r10,TCB_ir10[tr]
588
                lw              r11,TCB_ir11[tr]
589
                lw              r12,TCB_ir12[tr]
590
                lw              r13,TCB_ir13[tr]
591
                lw              r14,TCB_ir14[tr]
592
                lw              r15,TCB_ir15[tr]
593
                lw              r16,TCB_ir16[tr]
594
                lw              r17,TCB_ir17[tr]
595
                lw              r18,TCB_ir18[tr]
596
                lw              r19,TCB_ir19[tr]
597
                lw              r20,TCB_ir20[tr]
598
                lw              r21,TCB_ir21[tr]
599
                lw              r22,TCB_ir22[tr]
600
                lw              r23,TCB_ir23[tr]
601
                lw              r24,TCB_ir24[tr]
602
                lw              r25,TCB_ir25[tr]
603
                lw              r26,TCB_ir26[tr]
604
                lw              r27,TCB_ir27[tr]
605
                lws             ds,TCB_ids[tr]
606
                lws             es,TCB_ies[tr]
607
                lws             fs,TCB_ifs[tr]
608
                lws             gs,TCB_igs[tr]
609
                lws             hs,TCB_ihs[tr]
610
                lws             ss,TCB_iss[tr]
611
                lws             cs,TCB_ics[tr]
612
                lws             ds.lmt,TCB_idslmt[tr]
613
                lws             es.lmt,TCB_ieslmt[tr]
614
                lws             fs.lmt,TCB_ifslmt[tr]
615
                lws             gs.lmt,TCB_igslmt[tr]
616
                lws             hs.lmt,TCB_ihslmt[tr]
617
                lws             ss.lmt,TCB_isslmt[tr]
618
                lws             cs.lmt,TCB_icslmt[tr]
619
                lws             c1,TCB_ic1[tr]
620
                lws             c2,TCB_ic2[tr]
621
                lws             c3,TCB_ic3[tr]
622
                lws             c4,TCB_ic4[tr]
623
                lws             c5,TCB_ic5[tr]
624
                lws             c6,TCB_ic6[tr]
625
                lws             c7,TCB_ic7[tr]
626
                lws             c8,TCB_ic8[tr]
627
                lws             c9,TCB_ic9[tr]
628
                lws             c10,TCB_ic10[tr]
629
                lws             c11,TCB_ic11[tr]
630
                lws             c13,TCB_ic13[tr]
631
                lws             c14,TCB_ic14[tr]
632
                lws             pregs,TCB_ipregs[tr]
633
                sync
634
                rti
635
        }
636
}
637
 
638
void panic(char *msg)
639
{
640
     putstr(msg,84);
641
j1:  goto j1;
642
}
643
 
644
// ----------------------------------------------------------------------------
645
// ----------------------------------------------------------------------------
646
 
647
void IdleTask()
648
{
649
     int ii;
650
     __int32 *screen = (__int32 *)0xFFD00000;
651
 
652
//     try {
653
j1:  ;
654
         forever {
655
             try {
656
                 ii++;
657
                 if (getCPU()==0)
658
                                         outh(&screen[81],ii);
659
             }
660
             catch(static __exception ex=0) {
661
                 if (ex&0xFFFFFFFFL==515) {
662
                     printf("IdleTask: CTRL-C pressed.\r\n");
663
                 }
664
                 else
665
                     throw ex;
666
             }
667
         }
668
/*
669
     }
670
     catch (static __exception ex1=0) {
671
         printf("IdleTask: exception %d.\r\n", ex1);
672
         goto j1;
673
     }
674
*/
675
}
676
 
677
// ----------------------------------------------------------------------------
678
// ----------------------------------------------------------------------------
679
 
680
int FMTK_KillTask(int taskno)
681
{
682
    hTCB ht;
683
    int nn;
684
    JCB *j;
685
 
686
    check_privilege();
687
    ht = taskno;
688
    if (LockSemaphore(&sys_sema,-1)) {
689
        RemoveFromReadyList(ht);
690
        RemoveFromTimeoutList(ht);
691
        for (nn = 0; nn < 4; nn++)
692
            if (tcbs[ht].hMailboxes[nn] >= 0 && tcbs[ht].hMailboxes[nn] < NR_MBX) {
693
                FMTK_FreeMbx(tcbs[ht].hMailboxes[nn]);
694
                tcbs[ht].hMailboxes[nn] = -1;
695
            }
696
        // remove task from job's task list
697
        j = &jcbs[tcbs[ht].hJob];
698
        for (nn = 0; nn < 8; nn++) {
699
            if (j->tasks[nn]==ht)
700
                j->tasks[nn] = -1;
701
        }
702
        // If the job no longer has any tasks associated with it, it is 
703
        // finished.
704
        for (nn = 0; nn < 8; nn++)
705
            if (j->tasks[nn]!=-1)
706
                break;
707
        if (nn == 8) {
708
            j->next = freeJCB;
709
            freeJCB = j - jcbs;
710
        }
711
        UnlockSemaphore(&sys_sema);
712
    }
713
}
714
 
715
 
716
// ----------------------------------------------------------------------------
717
// ----------------------------------------------------------------------------
718
 
719
int FMTK_ExitTask()
720
{
721
    check_privilege();
722
    KillTask(GetRunningTCB());
723
    asm {
724
                db      $01
725
                db      $A6             ; INT
726
                db      $CE
727
                db      $02
728
        }     // reschedule
729
j1: goto j1;
730
}
731
 
732
 
733
// ----------------------------------------------------------------------------
734
// ----------------------------------------------------------------------------
735
 
736
int FMTK_StartTask(int priority, int affinity, int adr, int parm, hJCB job)
737
{
738
    hTCB ht;
739
    TCB *t;
740
    int nn;
741
 
742
        try {
743
        asm {
744
            ldi   r1,#66
745
            sc    r1,hs:LEDS
746
        }
747
    check_privilege();
748
        asm {
749
            ldi   r1,#60
750
            sc    r1,hs:LEDS
751
        }
752
    if (LockSemaphore(&sys_sema,-1)) {
753
        ht = freeTCB;
754
        freeTCB = tcbs[ht].next;
755
        UnlockSemaphore(&sys_sema);
756
    }
757
        asm {
758
            ldi   r1,#61
759
            sc    r1,hs:LEDS
760
        }
761
    t = &tcbs[ht];
762
    t->affinity = affinity;
763
    t->priority = priority;
764
    t->hJob = job;
765
    // Insert into the job's list of tasks.
766
    for (nn = 0; nn < 8; nn++) {
767
        if (jcbs[job].tasks[nn]<0) {
768
            jcbs[job].tasks[nn] = ht;
769
            break;
770
        }
771
    }
772
        asm {
773
            ldi   r1,#62
774
            sc    r1,hs:LEDS
775
        }
776
    if (nn == 8) {
777
        if (LockSemaphore(&sys_sema,-1)) {
778
            tcbs[ht].next = freeTCB;
779
            freeTCB = ht;
780
            UnlockSemaphore(&sys_sema);
781
        }
782
        return E_TooManyTasks;
783
    }
784
        asm {
785
            ldi   r1,#63
786
            sc    r1,hs:LEDS
787
        }
788
    t->iregs[1] = parm;
789
    t->icregs[1] = FMTK_ExitTask;
790
    t->iregs[27] = (unsigned int)t->stack + 1023*8;
791
    t->icregs[13] = adr;
792
    t->icregs[14] = adr;
793
//    t->icr0 = 0x140000000L;
794
    t->startTick = 0;
795
    t->endTick = 0;
796
    t->ticks = 0;
797
    t->exception = 0;
798
        asm {
799
            ldi   r1,#64
800
            sc    r1,hs:LEDS
801
        }
802
    if (LockSemaphore(&sys_sema,-1)) {
803
        InsertIntoReadyList(ht);
804
        UnlockSemaphore(&sys_sema);
805
    }
806
        asm {
807
            ldi   r1,#65
808
            sc    r1,hs:LEDS
809
        }
810
        }
811
        catch(static int ex)
812
                printf("StartTask error: %d\r\n", ex);
813
    return E_Ok;
814
}
815
 
816
// ----------------------------------------------------------------------------
817
// ----------------------------------------------------------------------------
818
 
819
int FMTK_Sleep(int timeout)
820
{
821
    hTCB ht;
822
 
823
    check_privilege();
824
    if (LockSemaphore(&sys_sema,-1)) {
825
        ht = GetRunningTCB();
826
        RemoveFromReadyList(ht);
827
        InsertIntoTimeoutList(ht, timeout);
828
        UnlockSemaphore(&sys_sema);
829
    }
830
    asm {
831
                db      $01
832
                db      $A6             ; INT
833
                db      $CE
834
                db      $02
835
        }     // reschedule
836
    return E_Ok;
837
}
838
 
839
// ----------------------------------------------------------------------------
840
// ----------------------------------------------------------------------------
841
 
842
int FMTK_SetTaskPriority(hTCB ht, int priority)
843
{
844
    TCB *t;
845
 
846
    check_privilege();
847
    if (priority > 077 || priority < 000)
848
       return E_Arg;
849
    if (LockSemaphore(&sys_sema,-1)) {
850
        t = &tcbs[ht];
851
        if (t->status & (TS_RUNNING | TS_READY)) {
852
            RemoveFromReadyList(ht);
853
            t->priority = priority;
854
            InsertIntoReadyList(ht);
855
        }
856
        else
857
            t->priority = priority;
858
        UnlockSemaphore(&sys_sema);
859
    }
860
    return E_Ok;
861
}
862
 
863
// ----------------------------------------------------------------------------
864
// ----------------------------------------------------------------------------
865
 
866
void FMTKInitialize()
867
{
868
        int nn,jj;
869
 
870
    check_privilege();
871
//    firstcall
872
    {
873
        asm {
874
            ldi   r1,#20
875
            sc    r1,hs:LEDS
876
        }
877
        hasUltraHighPriorityTasks = 0;
878
        missed_ticks = 0;
879
 
880
        IOFocusTbl[0] = 0;
881
        IOFocusNdx = null;
882
        iof_switch = 0;
883
 
884
        SetRunningTCB(0);
885
                tcbs[0].hJob = 0;
886
        UnlockSemaphore(&sys_sema);
887
        UnlockSemaphore(&iof_sema);
888
        UnlockSemaphore(&kbd_sema);
889
 
890
        for (nn = 0; nn < NR_MSG; nn++) {
891
            message[nn].link = nn+1;
892
        }
893
        message[NR_MSG-1].link = -1;
894
        freeMSG = 0;
895
 
896
        asm {
897
            ldi   r1,#30
898
            sc    r1,hs:LEDS
899
        }
900
 
901
        for (nn = 0; nn < NR_JCB; nn++) {
902
            jcbs[nn].number = nn;
903
            for (jj = 0; jj < 8; jj++)
904
                jcbs[nn].tasks[jj] = -1;
905
            if (nn == 0 ) {
906
                jcbs[nn].pVidMem = 0xFFD00000;
907
                jcbs[nn].pVirtVidMem = &video_bufs[nn];
908
                jcbs[nn].NormAttr = 0x0026B800;
909
                                asm {
910
                                        ldi   r1,#31
911
                                        sc    r1,hs:LEDS
912
                                }
913
                RequestIOFocus(&jcbs[0]);
914
                                asm {
915
                                        ldi   r1,#34
916
                                        sc    r1,hs:LEDS
917
                                }
918
           }
919
            else {
920
                 jcbs[nn].pVidMem = &video_bufs[nn];
921
                 jcbs[nn].pVirtVidMem = &video_bufs[nn];
922
                 jcbs[nn].NormAttr = 0x0026B800;
923
            }
924
                                asm {
925
                                        ldi   r1,#35
926
                                        sc    r1,hs:LEDS
927
                                }
928
            jcbs[nn].VideoRows = 31;
929
            jcbs[nn].VideoCols = 84;
930
            jcbs[nn].CursorRow = 0;
931
            jcbs[nn].CursorCol = 0;
932
            jcbs[nn].KeybdHead = 0;
933
            jcbs[nn].KeybdTail = 0;
934
            jcbs[nn].KeyState1 = 0;
935
            jcbs[nn].KeyState2 = 0;
936
                        jcbs[nn].KeybdBufSz = 64;
937
        }
938
 
939
                ClearScreen();
940
                HomeCursor();
941
                printf("FMTK Initializing");
942
 
943
        asm {
944
            ldi   r1,#40
945
            sc    r1,hs:LEDS
946
        }
947
 
948
        for (nn = 0; nn < 8; nn++)
949
                readyQ[nn] = -1;
950
        for (nn = 0; nn < NR_TCB; nn++) {
951
            tcbs[nn].number = nn;
952
                tcbs[nn].next = nn+1;
953
                tcbs[nn].prev = -1;
954
        asm {
955
            ldi   r1,#41
956
            sc    r1,hs:LEDS
957
        }
958
 
959
                tcbs[nn].status = 0;
960
                tcbs[nn].priority = 070;
961
                tcbs[nn].affinity = 0;
962
        asm {
963
            ldi   r1,#46
964
            sc    r1,hs:LEDS
965
        }
966
 
967
                tcbs[nn].sys_stack = &sys_stacks[nn] + 511;
968
                tcbs[nn].bios_stack = &bios_stacks[nn] + 511;
969
        asm {
970
            ldi   r1,#42
971
            sc    r1,hs:LEDS
972
        }
973
 
974
                tcbs[nn].stack = &stacks[nn] + 1023;
975
                tcbs[nn].hJob = 0;
976
                tcbs[nn].timeout = 0;
977
        asm {
978
            ldi   r1,#43
979
            sc    r1,hs:LEDS
980
        }
981
 
982
                tcbs[nn].hMailboxes[0] = -1;
983
                tcbs[nn].hMailboxes[1] = -1;
984
                tcbs[nn].hMailboxes[2] = -1;
985
                tcbs[nn].hMailboxes[3] = -1;
986
        asm {
987
            ldi   r1,#44
988
            sc    r1,hs:LEDS
989
        }
990
 
991
                if (nn<2) {
992
                tcbs[nn].affinity = nn;
993
                tcbs[nn].priority = 030;
994
            }
995
            tcbs[nn].exception = 0;
996
        asm {
997
            ldi   r1,#47
998
            sc    r1,hs:LEDS
999
        }
1000
 
1001
        }
1002
        tcbs[NR_TCB-1].next = -1;
1003
        freeTCB = 2;
1004
        asm {
1005
            ldi   r1,#48
1006
            sc    r1,hs:LEDS
1007
        }
1008
        InsertIntoReadyList(0);
1009
        InsertIntoReadyList(1);
1010
        tcbs[0].status = TS_RUNNING;
1011
        tcbs[1].status = TS_RUNNING;
1012
        asm {
1013
            ldi   r1,#49
1014
            sc    r1,hs:LEDS
1015
        }
1016
        SetRunningTCB(0);
1017
        TimeoutList = -1;
1018
        set_vector(4,FMTK_SystemCall);
1019
        set_vector(2,FMTK_SchedulerIRQ2);
1020
        set_vector(194,FMTK_SchedulerIRQ);
1021
                set_vector(195,KeybdIRQ);
1022
        asm {
1023
            ldi   r1,#50
1024
            sc    r1,hs:LEDS
1025
        }
1026
        FMTK_StartTask(030, 0, FocusSwitcher, 0, 0);
1027
        asm {
1028
            ldi   r1,#55
1029
            sc    r1,hs:LEDS
1030
        }
1031
        FMTK_StartTask(033, 0, shell, 0, 1);
1032
        asm {
1033
            ldi   r1,#52
1034
            sc    r1,hs:LEDS
1035
        }
1036
//      FMTK_StartTask(055, 0, gfx_demo, 0, 1);
1037
        FMTK_StartTask(077, 0, IdleTask, 0, 0);
1038
        asm {
1039
            ldi   r1,#53
1040
            sc    r1,hs:LEDS
1041
        }
1042
//      FMTK_StartTask(077, 1, IdleTask, 0, 0);
1043
        FMTK_Inited = 0x12345678;
1044
        asm {
1045
            ldi   r1,#56
1046
            sc    r1,hs:LEDS
1047
        }
1048
    }
1049
}
1050
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.