home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / sysext / init / 64units.pit / 64Units.pit / 64Units.asm next >
Assembly Source File  |  1987-02-26  |  3KB  |  84 lines

  1.  
  2. ;    64Units.asm        February 27, 1987
  3.  
  4. ;    Ephraim Vishniac
  5. ;    P.O. Box 1357
  6. ;    East Arlington, MA 02174
  7.  
  8. ;    This INIT expands the unit table to 64 entries and relocates to
  9. ;    high memory, out of the system heap.  The original unit table
  10. ;    is released, freeing a few precious bytes of system heap space.
  11. ;
  12. ;    Expanding the unit table from its original size of 32 (old ROMs)
  13. ;    or 48 (new ROMs) means that more slots are available for drivers,
  14. ;    including desk accessories.  Installing desk accessories into
  15. ;    these additional slots is your problem.  ResEdit is one way;
  16. ;    perhaps some non-Apple DA mover provides another.
  17. ;
  18. ;    The expansion is limited to 64 slots because of the format of
  19. ;    resource numbers for "owned" resources: there are only six bits
  20. ;    to designate the resource's owner.  Still, sixteen additional 
  21. ;    DA's should be enough for anyone.
  22.  
  23. ;    To use this INIT, assemble it, link it into a file of type 'INIT',
  24. ;    and place the file in your system folder.  It will be executed
  25. ;    next time you start up your Mac.
  26.  
  27. ;    This program is in the public domain.
  28.  
  29.     Resource 'INIT' 128 '64 Units' 00
  30.  
  31. ; This only uses a few definitions, so here they are.
  32.  
  33. ; Trap.
  34.     .TRAP    _DisposPtr    $A01F
  35.  
  36. ; Low memory globals
  37. UtableBase    equ    $11C    ; [long] Start of Unit Table
  38. UnitNtryCount    equ    $1D2    ; [word] Unit Table entry count
  39. SysZone        equ    $2A6    ; [long] Start of system heap
  40. ApplZone    equ    $2AA    ; [long] Start of application heap
  41. BufPtr        equ    $10C    ; [long] End of available memory
  42.  
  43. ; Local equates
  44. MaxUnits    equ    64    ; top size for unit table
  45.  
  46. StartHere                ; Start here!
  47.     Move.W    UnitNTryCount,D0    ; D0 = size of existing table
  48.     Cmp.W    #MaxUnits,D0        ; Table full-sized already?
  49.     Bge    FullTable        ; Exit if so
  50.  
  51.     Move.L    BufPtr,A1        ; A1 = end of available memory
  52.     Move.W    #MaxUnits-1,D1        ; D1 = loop counter for clearing
  53. @0    Clr.L    -(A1)            ; Clear a unit table entry
  54.     DBra    D1,@0            ; until whole table is clear
  55.  
  56.     Move.L    A1,BufPtr        ; Reserve new table space
  57.  
  58.     Move.L    UTableBase,A0        ; A0 = start of old table
  59.     SubQ.W    #1,D0            ; D0 = loop counter for copying
  60. @1    Move.L    (A0)+,(A1)+        ; Copy a unit table entry
  61.     DBra    D0,@1            ; until old table is copied
  62.  
  63.     Move.L    BufPtr,A1        ; A1 = new table
  64.     Move.L    UTableBase,A0        ; A0 = old table
  65.     Move.L    A1,UTableBase        ; Install new table
  66.     Move.W    #MaxUnits,UnitNtryCount    ; Expand table
  67.  
  68.     ; Before disposing of the old table pointer, let's be
  69.     ; sure that it's a plausible system heap pointer.
  70.     Cmp.L    SysZone,A0        ; above start of syszone?
  71.     Blt    StrangePlace        ; exit if not
  72.     Cmp.L    ApplZone,A0        ; below start of applzone?
  73.     Bge    StrangePlace        ; exit if not
  74.     _DisposPtr            ; else free table pointer
  75. FullTable
  76. StrangePlace
  77.     Rts
  78.  
  79.     dc.b    'Ephraim Vishniac '
  80.     dc.b    'P.O. Box 1357 '
  81.     dc.b    'East Arlington, MA 02174 '
  82.     .align 2
  83.  
  84.     END