1 #include <exec/types.h>
2 #include <exec/memory.h>
3 #include <exec/tasks.h>
4 #include <hardware/intbits.h>
6 #include <proto/exec.h>
12 #include "fix_mem_region.h"
15 #define TASK_PRIORITY 80
16 #define TASK_STACK_SIZE 1024
18 struct MsgPort task_mp;
22 struct Interrupt ports_interrupt;
24 extern void task_main();
25 extern void init_sockets();
26 extern void IntServer();
28 void NewList(struct List *l)
30 l->lh_Head = (struct Node *)&(l->lh_Tail);
32 l->lh_TailPred = (struct Node *)&(l->lh_Head);
35 static struct Task *create_task(char *name, long priority, char *initialPC, unsigned long stacksize)
37 char *stack = AllocMem(stacksize, MEMF_CLEAR);
41 struct Task *tc = AllocMem(sizeof(struct Task), MEMF_CLEAR | MEMF_PUBLIC);
44 FreeMem(stack, stacksize);
48 tc->tc_Node.ln_Type = NT_TASK;
49 tc->tc_Node.ln_Pri = priority;
50 tc->tc_Node.ln_Name = name;
51 tc->tc_SPLower = (APTR)stack;
52 tc->tc_SPUpper = (APTR)(stack + stacksize);
53 tc->tc_SPReg = (APTR)(stack + stacksize);
55 AddTask(tc, initialPC, 0);
59 static void init_message_port()
61 task_mp.mp_Node.ln_Name = device_name;
62 task_mp.mp_Node.ln_Pri = 0;
63 task_mp.mp_Node.ln_Type = NT_MSGPORT;
64 task_mp.mp_Flags = PA_SIGNAL;
65 task_mp.mp_SigBit = SIGB_MSGPORT;
66 task_mp.mp_SigTask = task;
67 NewList(&(task_mp.mp_MsgList));
70 static void add_interrupt_handler()
72 ports_interrupt.is_Node.ln_Type = NT_INTERRUPT;
73 ports_interrupt.is_Node.ln_Pri = 0;
74 ports_interrupt.is_Node.ln_Name = device_name;
75 ports_interrupt.is_Data = (APTR)task;
76 ports_interrupt.is_Code = IntServer;
78 AddIntServer(INTB_PORTS, &ports_interrupt);
86 ca = (struct ComArea *)COM_AREA_BASE;
88 task = create_task(device_name, TASK_PRIORITY, (void *)task_main, TASK_STACK_SIZE);
91 debug_printf("Unable to create task\n");
99 unsigned char discard_value = ca->a_events;
101 ca->r_events = R_EVENT_STARTED;
103 add_interrupt_handler();
105 ca->a_enable = A_EVENT_R2A_TAIL;