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