home *** CD-ROM | disk | FTP | other *** search
- ''
- '' $Id: ExecSupport.bas,v 1.4 1994/04/27 10:54:36 alex Rel $
- ''
- '' BASIC Exec Amiga.lib support functions
- ''
- '' (c) Copyright 1994 HiSoft
- ''
-
- 'REM $INCLUDE Exec.bh
-
- ''
- '' CreateExtIO
- ''
- '' Create an IORequest structure
- ''
- FUNCTION CreateExtIO&(BYVAL ioReplyPort&, BYVAL ioReqSize%)
- STATIC ioReq&
-
- CreateExtIO& = NULL&
- IF ioReplyPort& = NULL& THEN EXIT FUNCTION
-
- ioReq& = AllocMem&(ioReqSize%, MEMF_CLEAR& OR MEMF_PUBLIC&)
-
- IF ioReq& = NULL& THEN EXIT FUNCTION
-
- POKEB ioReq& + IORequestio_Message% + mn_Node% + ln_Type%, NT_MESSAGE&
- POKEW ioReq& + IORequestio_Message% + mn_Length%, ioReqSize%
- POKEL ioReq& + IORequestio_Message% + mn_ReplyPort%, ioReplyPort&
-
- CreateExtIO& = ioReq&
- END FUNCTION
-
- ''
- '' DeleteExtIO
- ''
- '' Return memory allocated for extended IO request
- ''
- SUB DeleteExtIO(BYVAL ioExt&)
- POKEB ioExt& + IORequestio_Message% + mn_Node% + ln_Type%, -1%
- POKEL ioExt& + IORequestio_Message% + mn_ReplyPort%, -1&
- POKEL ioExt& + IORequestio_Device%, -1&
-
- FreeMem ioExt&, PEEKW(ioExt& + IORequestio_Message% + mn_Length%)
- END SUB
-
- ''
- '' NewList
- ''
- '' Prepare a list structure for use
- ''
- SUB NewList(BYVAL list&)
- POKEL list& + lh_Head%, list& + lh_Tail%
- POKEL list& + lh_Tail%, 0
- POKEL list& + lh_TailPred%, list& + lh_Head%
- END SUB
-
- ''
- '' CreatePort
- ''
- '' Allocate and initialise a new message port
- ''
- FUNCTION CreatePort&(BYVAL pname&, BYVAL pri)
- LOCAL sigBit%, port&
-
- createPort& = NULL&
- sigBit% = AllocSignal&(-1&)
- IF sigBit% = -1% THEN EXIT FUNCTION
-
- port& = AllocMem&(MsgPort_sizeof%, MEMF_CLEAR& OR MEMF_PUBLIC&)
- IF port& = NULL& THEN
- FreeSignal sigBit%
- EXIT FUNCTION
- END IF
- POKEL port& + mp_Node% + ln_Name%, pname&
- POKEB port& + mp_Node% + ln_Pri%, pri
- POKEB port& + mp_Node% + ln_Type%, NT_MSGPORT&
-
- POKEB port& + mp_Flags%, PA_SIGNAL&
- POKEB port& + mp_SigBit%, sigBit%
- POKEL port& + mp_SigTask%, FindTask&(NULL&)
-
- IF pname& <> NULL& THEN
- AddPort port&
- ELSE
- NewList port& + mp_MsgList%
- END IF
-
- CreatePort& = port&
- END FUNCTION
-
- ''
- '' DeletePort
- ''
- '' Free a message port created by CreatePort
- ''
- SUB DeletePort(BYVAL port&)
- IF PEEKL(port& + mp_Node% + ln_Name%) <> NULL& THEN RemPort port&
-
- POKEL port& + mp_SigTask%, -1&
- POKEL port& + mp_MsgList% + lh_Head%, -1&
-
- FreeSignal PEEKB(port& + mp_SigBit%)
-
- FreeMem port&, MsgPort_sizeof%
- END SUB
-
- ''
- '' CreateTask
- ''
- '' Create task with given name, priority, stacksize
- ''
- '' NOTE: initPC cannot be a BASIC entry point (VARPTRS(...))
- ''
- FUNCTION CreateTask&(BYVAL tname&, BYVAL pri%, BYVAL initPC&, BYVAL stackSize&)
- LOCAL tempmemlist%((Node_sizeof% + 2 + 2 * MemEntry_sizeof%) \ 2)
- LOCAL newTask&, fakememlist&, ml&, junk&, tcb&
-
- CreateTask& = NULL&
-
- stackSize& = (stackSize& + 3) AND NOT 3
- fakememlist& = VARPTR(tempmemlist%(0))
-
- POKEW fakememlist& + Node_sizeof%, 2 ' number of entries
-
- POKEL fakememlist& + Node_sizeof% + 2 + meu_Reqs%, MEMF_PUBLIC& OR MEMF_CLEAR&
- POKEL fakememlist& + Node_sizeof% + 2 + me_Length%, Task_sizeof%
-
- POKEL fakememlist& + Node_sizeof% + 2 + MemEntry_sizeof% + meu_Reqs%, MEMF_CLEAR&
- POKEL fakememlist& + Node_sizeof% + 2 + MemEntry_sizeof% + me_Length%, stackSize&
-
- ml& = AllocEntry&(fakememlist&)
-
- IF ml& = NULL& THEN EXIT FUNCTION
-
- newTask& = PEEKL(ml& + MemList_sizeof% + meu_Addr%)
-
- ' set up the stack
- POKEL newTask& + tc_SPLower%, PEEKL(ml& + MemList_sizeof% + MemEntry_sizeof% + meu_Addr%)
- POKEL newTask& + tc_SPUpper%, PEEKL(newTask& + tc_SPLower%) + stackSize&
- POKEL newTask& + tc_SPReg%, PEEKL(newTask& + tc_SPUpper%)
-
- ' misc task structures
- POKEB newTask& + tc_Node% + ln_Type%, NT_TASK&
- POKEB newTask& + tc_Node% + ln_Pri%, pri%
- POKEL newTask& + tc_Node% + ln_Name%, tname&
-
- ' add the memory to the tasks memory list
- NewList newTask& + tc_MemEntry%
- AddHead newTask& + tc_MemEntry%, ml&
-
- ' add the task to the system, with the default PC
- tcb& = AddTask&(newTask&, initPC&, NULL&)
- IF PEEKW(LIBRARY("exec.library") + lib_Version%) >= 37 AND tcb& = NULL& THEN
- FreeEntry ml&
- EXIT FUNCTION
- END IF
-
- CreateTask& = newTask&
- END FUNCTION
-
- ''
- '' DeleteTask
- ''
- '' Delete a task created with CreateTask
- ''
- SUB DeleteTask(BYVAL tc&)
- RemTask tc&
- END SUB
-