home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / lang / bison.sit / alloca.a next >
Text File  |  1989-01-02  |  1KB  |  48 lines

  1. ;;
  2. ;; Alloca() for Macintosh Programmer's Workshop C 2.0.2.
  3. ;; alloca(n) allocates n bytes of storage in the stack
  4. ;; frame of the caller.
  5. ;;
  6. ;; Allows caller to save up to 12 registers on the stack
  7. ;; at caller's procedure entry, and pop them off on exit.
  8. ;;
  9. ;; Calling routine must be set up to align stack pointer between
  10. ;; calls to functions, or this will fail.
  11. ;;
  12. ;; Earle R. Horton Sunday, January 1, 1989
  13. ;;
  14.     CASE ON
  15.     macro    
  16.     BlockMove 
  17.     dc.w    $A02E
  18.     endm
  19. SAVESIZE    EQU    48    ; 12 registers times 4 bytes each
  20.  
  21. _alloca PROC EXPORT
  22.     link    a6,#0
  23.     export alloca
  24. alloca
  25.         move.l  (sp)+,a1        ; pop return address
  26.         move.l  (sp)+,d0        ; pop parameter = size in bytes
  27.     move.l    sp,a0        ; save stack pointer, source parameter for BlockMove
  28.     addq.l    #3,d0        ; round size up to long word
  29.     andi.l    #-4,d0        ; mask out lower two bits of size
  30.     addi.l    #SAVESIZE,d0    ; allow for up to 12 registers saved by caller
  31.     sub.l    d0,sp        ; allocate by moving stack pointer
  32.     move.l    a1,-(sp)    ; push return address
  33.     lea    4(sp),a1    ; new save reg area, destination pointer for BlockMove
  34.     move.l    #SAVESIZE,d0    ; bytes to move
  35.     BlockMove        ; move save area
  36.     move.l    (sp)+,a0    ; pop return address
  37.     move.l    sp,d0        ; stack pointer to d0
  38.     addi.l    #SAVESIZE,d0    ; return pointer to just above new save area
  39.         adda.w  #-4,sp          ; new top of stack
  40.         jmp     (a0)            ; return to caller
  41.         unlk    a6
  42.         rts
  43.         STRING ASIS
  44.         dc.b    'ALLOCA  '
  45.         ENDP
  46.         END
  47.         
  48.