section "lethh"
get "libhdr"
get "etherhdr"
global $( mcseg : ug
bseg : ug + 1
etsk : ug + 2
$)
let start() be // load ether handler task
$( let newsegl = vec 4
let csegl = tcb!tcb.seglist
let tres = ?
etsk := 0
mcseg := loadseg(":ether.emcseg")
bseg := loadseg (":ether.eth-task")
if mcseg=0 | bseg=0 do
$( tidy.up("Failed to load task segments")
stop(20)
$)
!newsegl := 4 // number of segments
newsegl!1 := csegl!1 // copy the two library segments
newsegl!2 := csegl!2
newsegl!3 := bseg
newsegl!4 := mcseg
// create the task, priority 1500, stack 200
etsk := createtask(newsegl, 200, 1500)
if etsk=0 do
$( tidy.up("Can't create task")
stop(30)
$)
// activate task
tres := sendpkt(-1, etsk, ?, ?, ?, ?)
unless tres do
$( tidy.up("Task wouldn't start properly")
stop(40)
$)
$( let rti = rootnode!rtn.info // see if info vector exists
if rti=0 do
$( rti := getvec(5)
!rti := 5 // size
for i = 1 to 5 do rti!i := 0
rootnode!rtn.info := rti
$)
rti!rtninfo.ether := etsk
$)
writef("********** Ether handler started as Task %n*n", etsk)
$)
and tidy.up(s) be
$( writes(s)
newline()
unless mcseg=0 do unloadseg(mcseg)
unless bseg=0 do unloadseg(bseg)
unless etsk=0 do deletetask(etsk)
$)