home *** CD-ROM | disk | FTP | other *** search
- Short: JRH's useful E modules
- Type: dev/e
- Author: m88jrh@ecs.ox.ac.uk (Jason R. Hulance)
- Uploader: m88jrh@ecs.ox.ac.uk (Jason R. Hulance)
-
- JRH's Useful Modules
- ====================
-
- These modules are Copyright (C) 1995, Jason R. Hulance.
-
- You are free to use these modules in your programs, whether they are freeware
- or commercial. However, if you want to distribute any of this archive you
- must include it all, unmodified, together with this file.
-
- Contents
- --------
-
- Various modules:
-
- ecode.m:
- PROC eCode(func)
- PROC eCodePreserve(func)
- PROC eCodeTask(func)
- PROC eCodeASLHook(func)
- PROC eCodeCxCustom(func)
- PROC eCodeIntHandler(func)
- PROC eCodeIntServer(func)
- PROC eCodeSoftInt(func)
- PROC eCodeDispose(addr)
-
- split.m:
- PROC argSplit(str=0)
-
-
- Amiga E does not support Resources (at least, not up to v3.1a, anyway).
- These modules rectify this.
-
- battclock.m:
- DEF battclockbase
- PROC readBattClock()
- PROC resetBattClock()
- PROC writeBattClock(time)
-
- battmem.m:
- DEF battmembase
- PROC obtainBattSemaphore()
- PROC readBattMem(buffer,offset,length)
- PROC releaseBattSemaphore()
- PROC writeBattMem(buffer,offset,length)
-
- cia.m:
- PROC ableICR(resource,mask)
- PROC addICRVector(resource,iCRBit,interrupt)
- PROC remICRVector(resource,iCRBit,interrupt)
- PROC setICR(resource,mask)
-
- disk.m:
- DEF diskbase
- PROC allocUnit(unitNum)
- PROC freeUnit(unitNum)
- PROC getUnit(unitPointer)
- PROC getUnitID(unitNum)
- PROC giveUnit()
- PROC readUnitID(unitNum)
-
- misc.m:
- DEF miscbase
- PROC allocMiscResource(unitNum,name)
- PROC freeMiscResource(unitNum)
-
- potgo.m:
- DEF potgobase
- PROC allocPotBits(bits)
- PROC freePotBits(bits)
- PROC writePotgo(word,mask)
-
-
- Documentation
- -------------
-
- The standard documentation on the Resource functions suffices for the
- Resource modules. All the other functions (eCodeXXX and split) return NIL
- if an error occurred, which is normally "out of memory".
-
- ecode.m:
- o eCode() takes the address of an E function (or a label) and wraps it
- so that it can be called from other tasks/processes and still access
- the global variables of the main program. This function was created
- for use with createTask(), but has other uses.
- o eCodePreserve() is similar, but it also protects the function by
- preserving the non-scratch registers on the stack. This means the
- function can retrieve (and change) registers D2-D7/A2-A6 as local
- variables. For instance,
- PROC fun(a6,a5,a4,a3,a2,d7,d6,d5,d4,d3,d2) IS d2:=d3+a3
- will have the effect of changing register D2 (and D0) when the
- function returns. Note: you do not need to specify all registers,
- just the suffix of the above that you are actually interested in.
- PROC fun(a3,a2,d7,d6,d5,d4,d3,d2) IS d2:=d3+a3
- would have done...
- o eCodeTask() is just eCode() with a more suggestive name.
- o eCodeASLHook() takes the address of an E function (or a label) and
- returns something usable as an ASL hook function (nothing to do with
- the utility library hooks, more's the pity).
- o eCodeCxCustom() does the same for CX custom functions.
- o eCodeIntHandler() is for interrupt handlers: you get A1 and D1 as
- arguments (in that order) to your function. (A1 is the data element
- of your interrupt, and D1 contains the interrupt flags.)
- o eCodeIntServer() is for interrupt servers: you get A1 (the data
- element of your interrupt) as an argument.
- o eCodeSoftInt() is the same, but for software interrupts.
- o eCodeDispose() is passed the result of the one of the above
- functions, and will to dispose the memory used by the special wrapper.
- You will rarely need to use this, as the memory will be freed
- automatically at the end of the program.
- o eCodeASLHook(), eCodeCxCustom(), eCodeIntHandler(), eCodeIntServer()
- and eCodeSoftInt() all use their own private scratch area to preserve
- registers, thus saving crucial stack space. This has the disadvantage
- of making the code non-reentrant, so if you need to use the same
- function as multiple interrupt servers you must use eCodeIntServer()
- multiple times. Apart from that they should be OK, since they do
- not get called from multiple tasks. (If you find this a problem then
- you can use eCodePreserve()...)
- o eCodePreserve() uses a big bit of stack to store registers, so be
- careful...
-
- split.m:
- o argSplit(str=NIL) splits a string of arguments like "arg" (which is
- the default), handling quoted arguments correctly. The result is an
- E-list of strings, or NIL if an error occurred. The list is also
- NIL-terminated so you have a choice of ways to manipulate it. The
- string passed to this function (or "arg" by default) is *altered* by
- this function, so you shouldn't try using it directly. You can
- DisposeLink() the resulting list if you want to free it before the end
- of the program. (You are also responsible for freeing the string when
- you are done with it, unless it was the default "arg", of course.)
-
- The main reason for the creation of these modules was my translations of the
- RKRM examples. These provide many examples of the use of these functions.
-