This is AllocationMacros.txt in view mode; [Download] [Up]
DSP MEMORY ALLOCATION (ASSEMBLY LOCATION-COUNTER MACROS) The Location Counter (LC) macros, defined in DSPMACSRC/lc.asm and DSPMACSRC/alloc.asm ('include'ed by DSPMACSRC/stdmacros) are designed to simplify dsp memory allocation. They manage use of the ORG directive of the DSP56000 assembler (cf. page 6-52 of the assembler manual.) The macros provide saving and restoring of the current LC, and automatic sequential allocation of x, y, l, or p elements (with error checking). The macros insulate the user from system constants delineating dsp memory boundaries, and they hide the presence of shared external memory. Finally, they hide the big hole in the dsp address space from 512 to 8191 in the case of using 8K RAM chips (the address-bit 13 must be high to enable the 8K RAMS). The push_lc and pop_lc macros are self-explanatory. They allow dsp macros to conveniently save and restore any of the assembly location counters. For each memory space, there are two allocation macros, one for internal (on-chip) memory allocation and one for external (on-chip) memory allocation: new_xib name,count,value ; allocate and init next internal x block new_xeb name,count,value ; allocate and init next external x block new_yib name,count,value ; allocate and init next internal y block new_yeb name,count,value ; allocate and init next external y block new_lib name,count,hival,loval ; allocate and init next internal l block new_leb name,count,hival,loval ; allocate and init next external l block where the arguments are as follows: 'name' is the symbol name whose value will become the address of the first location of the allocated memory block, 'count' is the number of dsp words to be allocated (block length), 'value' is the 24-bit datum to be placed in each memory location, 'hival' is the 24-bit datum to be placed in the high-order word (x portion) of each (long) memory location, and 'loval' is the 24-bit datum to be placed in the low-order word (y portion) of each (long) memory location. Memory spaces x, y, and p are allocated from the lowest available address to the highest available address, while l memory is allocated from the highest available address donward (since l memory is actually the concatenation of x and y memory). If l memory overlaps with x or y memory, an error message is produced. If the value field is NOSET (a predefined constant which occupies more than 24 bits), no initialization is performed (the DS directive is used instead of the BSC directive). Data in program memory must be allocated by the user. (??? write new_pib et al?) All allocation macros switch to p assembly upon exit. Specifically, each allocation macro works as in the following (simplified) example: new_xib macro name,count,value ; allocate & initialize next internal x block cur_lc set @lcv(R) ; save current location counter org_xis xi_lc ; switch to xi ram location counter name bsc count,value ; allocate and initialize data storage xi_lc set @lcv(R) ; update xi next-free-word pointer org p:cur_lc ; assume we came from p memory endm For convenience, the following macros are defined to allocate single words: new_xi name,value ; allocate and init next internal x word new_xe name,value ; allocate and init next external x word new_yi name,value ; allocate and init next internal y word new_ye name,value ; allocate and init next external y word new_li name,hival,loval ; allocate and init next internal l word new_le name,hival,loval ; allocate and init next external l word Finally, there is a set of "constrained" block allocation calls new_xicb, new_yicb, etc., which place the allocated block at an address compatible with modulo addressing of a length 'count' table (i.e., the low-order k bits of the start address are 0, where k is the smallest integer greater than or equal to the log-base-2 of count). Note that the intervening storage locations are lost. (!!! <Define pointers for skipped storage so that user can use them if necessary>)
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.