home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Basic / MAXONB32.DMS / in.adf / Includes.lha / BH / BLib / ExecSupport.bas < prev    next >
Encoding:
BASIC Source File  |  1994-04-27  |  4.0 KB  |  169 lines

  1. ''
  2. '' $Id: ExecSupport.bas,v 1.4 1994/04/27 10:54:36 alex Rel $
  3. ''
  4. '' BASIC Exec Amiga.lib support functions
  5. ''
  6. '' (c) Copyright 1994 HiSoft
  7. ''
  8.  
  9. 'REM $INCLUDE Exec.bh
  10.  
  11. ''
  12. '' CreateExtIO
  13. ''
  14. ''    Create an IORequest structure
  15. ''
  16. FUNCTION CreateExtIO&(BYVAL ioReplyPort&, BYVAL ioReqSize%)
  17.     STATIC ioReq&
  18.  
  19.     CreateExtIO& = NULL&
  20.     IF ioReplyPort& = NULL& THEN EXIT FUNCTION
  21.  
  22.     ioReq& = AllocMem&(ioReqSize%, MEMF_CLEAR& OR MEMF_PUBLIC&)
  23.     
  24.     IF ioReq& = NULL& THEN EXIT FUNCTION
  25.  
  26.     POKEB ioReq& + IORequestio_Message% + mn_Node% + ln_Type%, NT_MESSAGE&
  27.     POKEW ioReq& + IORequestio_Message% + mn_Length%, ioReqSize%
  28.     POKEL ioReq& + IORequestio_Message% + mn_ReplyPort%, ioReplyPort&
  29.     
  30.     CreateExtIO& = ioReq&
  31. END FUNCTION
  32.  
  33. ''
  34. '' DeleteExtIO
  35. ''
  36. ''    Return memory allocated for extended IO request
  37. ''
  38. SUB DeleteExtIO(BYVAL ioExt&)
  39.     POKEB ioExt& + IORequestio_Message% + mn_Node% + ln_Type%, -1%
  40.     POKEL ioExt& + IORequestio_Message% + mn_ReplyPort%, -1&
  41.     POKEL ioExt& + IORequestio_Device%, -1&
  42.     
  43.     FreeMem ioExt&, PEEKW(ioExt& + IORequestio_Message% + mn_Length%)
  44. END SUB
  45.  
  46. ''
  47. '' NewList
  48. ''
  49. ''    Prepare a list structure for use
  50. ''
  51. SUB NewList(BYVAL list&)
  52.     POKEL list& + lh_Head%, list& + lh_Tail%
  53.     POKEL list& + lh_Tail%, 0
  54.     POKEL list& + lh_TailPred%, list& + lh_Head%
  55. END SUB
  56.  
  57. ''
  58. '' CreatePort
  59. ''
  60. ''    Allocate and initialise a new message port
  61. ''
  62. FUNCTION CreatePort&(BYVAL pname&, BYVAL pri)
  63.     LOCAL sigBit%, port&
  64.     
  65.     createPort& = NULL&
  66.     sigBit% = AllocSignal&(-1&)
  67.     IF sigBit% = -1% THEN EXIT FUNCTION
  68.  
  69.     port& = AllocMem&(MsgPort_sizeof%, MEMF_CLEAR& OR MEMF_PUBLIC&)
  70.     IF port& = NULL& THEN
  71.         FreeSignal sigBit%
  72.         EXIT FUNCTION
  73.     END IF
  74.     POKEL port& + mp_Node% + ln_Name%, pname&
  75.     POKEB port& + mp_Node% + ln_Pri%, pri
  76.     POKEB port& + mp_Node% + ln_Type%, NT_MSGPORT&
  77.     
  78.     POKEB port& + mp_Flags%, PA_SIGNAL&
  79.     POKEB port& + mp_SigBit%, sigBit%
  80.     POKEL port& + mp_SigTask%, FindTask&(NULL&)
  81.     
  82.     IF pname& <> NULL& THEN
  83.         AddPort port&
  84.     ELSE
  85.         NewList port& + mp_MsgList%
  86.     END IF
  87.  
  88.     CreatePort& = port&
  89. END FUNCTION
  90.  
  91. ''
  92. '' DeletePort
  93. ''
  94. ''    Free a message port created by CreatePort
  95. ''
  96. SUB DeletePort(BYVAL port&)
  97.     IF PEEKL(port& + mp_Node% + ln_Name%) <> NULL& THEN RemPort port&
  98.     
  99.     POKEL port& + mp_SigTask%, -1&
  100.     POKEL port& + mp_MsgList% + lh_Head%, -1&
  101.     
  102.     FreeSignal PEEKB(port& + mp_SigBit%)
  103.     
  104.     FreeMem port&, MsgPort_sizeof%
  105. END SUB
  106.  
  107. ''
  108. '' CreateTask
  109. ''
  110. ''    Create task with given name, priority, stacksize
  111. ''
  112. ''     NOTE: initPC cannot be a BASIC entry point (VARPTRS(...))
  113. ''
  114. FUNCTION CreateTask&(BYVAL tname&, BYVAL pri%, BYVAL initPC&, BYVAL stackSize&)
  115.     LOCAL tempmemlist%((Node_sizeof% + 2 + 2 * MemEntry_sizeof%) \ 2)
  116.     LOCAL newTask&, fakememlist&, ml&, junk&, tcb&
  117.  
  118.     CreateTask& = NULL&
  119.  
  120.     stackSize& = (stackSize& + 3) AND NOT 3
  121.     fakememlist& = VARPTR(tempmemlist%(0))
  122.     
  123.     POKEW fakememlist& + Node_sizeof%, 2    ' number of entries
  124.  
  125.     POKEL fakememlist& + Node_sizeof% + 2 + meu_Reqs%, MEMF_PUBLIC& OR MEMF_CLEAR&
  126.     POKEL fakememlist& + Node_sizeof% + 2 + me_Length%, Task_sizeof%
  127.  
  128.     POKEL fakememlist& + Node_sizeof% + 2 + MemEntry_sizeof% + meu_Reqs%, MEMF_CLEAR&
  129.     POKEL fakememlist& + Node_sizeof% + 2 + MemEntry_sizeof% + me_Length%, stackSize&
  130.     
  131.     ml& = AllocEntry&(fakememlist&)
  132.     
  133.     IF ml& = NULL& THEN EXIT FUNCTION
  134.     
  135.     newTask& = PEEKL(ml& + MemList_sizeof% + meu_Addr%)
  136.     
  137.     ' set up the stack
  138.     POKEL newTask& + tc_SPLower%, PEEKL(ml& + MemList_sizeof% + MemEntry_sizeof% + meu_Addr%)
  139.     POKEL newTask& + tc_SPUpper%, PEEKL(newTask& + tc_SPLower%) + stackSize&
  140.     POKEL newTask& + tc_SPReg%, PEEKL(newTask& + tc_SPUpper%)
  141.     
  142.     ' misc task structures
  143.     POKEB newTask& + tc_Node% + ln_Type%, NT_TASK&
  144.     POKEB newTask& + tc_Node% + ln_Pri%, pri%
  145.     POKEL newTask& + tc_Node% + ln_Name%, tname&
  146.     
  147.     ' add the memory to the tasks memory list
  148.     NewList newTask& + tc_MemEntry%
  149.     AddHead newTask& + tc_MemEntry%, ml&
  150.     
  151.     ' add the task to the system, with the default PC
  152.     tcb& = AddTask&(newTask&, initPC&, NULL&)
  153.     IF PEEKW(LIBRARY("exec.library") + lib_Version%) >= 37 AND tcb& = NULL& THEN
  154.         FreeEntry ml&
  155.         EXIT FUNCTION
  156.     END IF
  157.  
  158.     CreateTask& = newTask&
  159. END FUNCTION
  160.  
  161. ''
  162. '' DeleteTask
  163. ''
  164. ''    Delete a task created with CreateTask
  165. ''
  166. SUB DeleteTask(BYVAL tc&)
  167.     RemTask tc&
  168. END SUB
  169.