home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / c1 / c_impress / Sources / Heap < prev    next >
Encoding:
Text File  |  1991-04-08  |  5.4 KB  |  2 lines

  1.  
  2. 4&:ô  ><BasicV$Lib>.Heap         Wimp heap manager. v0.08
  3. 40ô  MACHINE:  Archimedes
  4. 4:ô  LANGUAGE: BBC BASIC V
  5. 4Dô  AUTHOR:   Cy Booker,
  6. 4NGô            86 Church View, Main Road, Crockenhill, Swanley, Kent.
  7. 4Xô            BR8 8JW
  8. 4bô  FUNCTIONS:
  9. 4l!ô   Claim_Heap_Block( size% )
  10. 4v0ô   XClaim_Heap_Block( RETURN addr%, size% )
  11. 4€+ô   XRelease_Heap_Block( RETURN addr% )
  12. 4⇩3ô   XExtend_Heap_Block( d_size%, RETURN addr% )
  13. 4“ô   XExtend_Heap()
  14. 4fiô  :
  15. 4¨ô  PROCEDURES:
  16. 4²/ô   Claim_Heap_Block( RETURN addr%, size% )
  17. 4¼*ô   Release_Heap_Block( RETURN addr% )
  18. 4Æô   Kill_Heap()
  19. 4Ðô  :
  20. 4Úô  EXTERNALS:
  21. 4äô   <BasicV$Dir>.Wimp
  22. 4îô  :
  23. 4øô  VARIABLES:
  24. 5<ô   Heap_Error%  == Error number when generate an error.
  25. 5 ô  :
  26. 5ô  UPDATES:
  27. 5 4ô   16.03.1991 CJB FN_XExtend_Heap syntax error!
  28. 5*%ô   17.03.1991 CJB PROC_Kill_Heap
  29. 54:ô   19.03.1991 CJB FN_XExtend_Heap, non-local result%!
  30. 5>Jô   30.03.1991 CJB XRelease_Heap_Block, non-local c%, XExtend_Heap, so
  31. 5HLô                  should handle 1Mbyte machines, Kill_Heap, non-locals.
  32. 5RLô                  When release block, trys and reduces heap/appl' size.
  33. 5\'ô   05.04.1991 CJB Library version.
  34. 5fIô   08.04.1991 CJB FN_XExtend_Heap_Block, now claims if zero address.
  35. 5gLô   08.04.1991 CJB PROC_Try_Reducing_Heap demonstrated a bug in OS_Heap,
  36. 5hDô                  which I got round by doing some extra checks.
  37. 5p:
  38. 5zC: ô  In this version, all parameters are absolute (application)
  39. 5☓G: ô  addresses, since the actual heap is always going to be static.
  40. 5‰:
  41. 5—:
  42. 5¢Ý ¤_Heap_version  :  = 008
  43. 5¬:
  44. 5¶Ý ¤_hard_initialise_Heap
  45. ê r0%, c%
  46. 5Êê Ŷ
  47. 5Ô7î Ŷ ê ÷ Ŷ  :  ò_e( "%.Heap: hard_initialise_Heap" )
  48. 5Þ0  ò_load_library( "<BasicV$Lib>.Wimp", 001 )
  49. 5è  Heap_Start% = ›
  50. 5ò  Heap_Size%  = 32 * 1024
  51. 5ü  Heap_Error% = &900
  52. 64  È− "Wimp_SlotSize", -1, -1 ¸ Application_Size%
  53. 6  Application_Size% = ›
  54. 6G  È− "XWimp_SlotSize", Application_Size% + Heap_Size%, -1 ¸ r0%; c%
  55. 6$  ç ¤_PSR_V_set(c%) …
  56. 6.A     Ŷ Heap_Error%, "Not enough memory to start application."
  57. 68  Í
  58. 6B:  È− "OS_Heap", 0, Heap_Start%, Heap_Size%, Heap_Size%
  59. 6L= 0
  60. 6V:
  61. 6`!Ý ¤_Claim_Heap_Block( size% )
  62. 6j
  63. ê result%
  64. 6t/  ç ¤_XClaim_Heap_Block( result%, size% ) …
  65. 6~C    ò_Wimp_Error( 0, "Not enough memory to claim heap block." )
  66. 6⇦  Í
  67. 6‹
  68. = result%
  69. 6†:
  70. 6¦>: ô  Returns Address of a claimed block, TRUE if couldn't.
  71. 6°+: ô  Tries extending heap if necessary.
  72. 6Ä:
  73. 6Î+Ý ¤_XClaim_Heap_Block( ø addr%, size% )
  74. 6Øê result%, heap_full%, c%
  75. 6â  result%    = ¹
  76. 6ì  heap_full% = £
  77. 6ö  addr%      = 0
  78. 7  õ
  79. 7
  80. <    È− "XOS_Heap", 2, Heap_Start%,, size% ¸ ,, addr%; c%
  81. 7    ç ¤_PSR_V_set(c%) …
  82. 7%      heap_full% = ¤_XExtend_Heap
  83. 7(        Ì
  84. 72      result% = £
  85. 7<        Í
  86. 7F  ý heap_full% ☓ ¬(result%)
  87. 7P= result% ☓ heap_full%
  88. 7Z:
  89. 7´*Ý ò_Claim_Heap_Block( ø addr%, size% )
  90. 7¾)  addr% = ¤_Claim_Heap_Block( size% )
  91. 7Èá
  92. 7Ò:
  93. 7Ü.: ô  An error is generated if bad pointer.
  94. 7æ%: ô  On exit, address reset to 0.
  95. 7ð:
  96. 7ú%Ý ò_Release_Heap_Block( ø addr% )
  97. 8
  98. ê r0%, c%
  99. 8  ç addr%<>0 …
  100. 86    È− "XOS_Heap", 3, Heap_Start%, addr% ¸ r0%; c%
  101. 8"    ç ¤_PSR_V_set(c%) …
  102. 8,D      Ŷ Heap_Error%, "Bad Release_Heap_Block: "+ ¤getname(r0%+4)
  103. 86        Í
  104. 8@    addr% = 0
  105. 8J    ò_Try_Reducing_Heap
  106. 8T  Í
  107. 8^á
  108. 8h:
  109. 8r&Ý ¤_XRelease_Heap_Block( ø addr% )
  110. 8|ê c%
  111. 8ŷ  ç addr%<>0 …
  112. 8‘3    È− "XOS_Heap", 3, Heap_Start%, addr% ¸ ; c%
  113. 8Œ    ç ¬(¤_PSR_V_set(c%)) …
  114. 8¤      addr% = 0
  115. 8®    ò_Try_Reducing_Heap
  116. 8¸        Í
  117. 8  Í
  118. 8Ì= (addr% <> 0)
  119. 8Ö:
  120. 8àJ: ô  Returns TRUE if no can do.  NB would have tried extending heap as
  121. 8ê6: ô  well.  Also note that addr% MAY have changed!
  122. 8ô:
  123. 8þ.Ý ¤_XExtend_Heap_Block( d_size%, ø addr% )
  124. 9"ê result%, heap_full%, r0%, c%
  125. 9  ç addr%=0 …
  126. 97    result% = ¤_XClaim_Heap_Block( addr%, d_size% )
  127. 9&  Ì
  128. 90    result%    = ¹
  129. 9:    heap_full% = £
  130. 9D        õ
  131. 9NI      È− "XOS_Heap", 4, Heap_Start%, addr%, d_size% ¸ r0%,, addr%; c%
  132. 9X      ç ¤_PSR_V_set(c%) …
  133. 9b'        heap_full% = ¤_XExtend_Heap
  134. 9l       Ì
  135. 9v        result% = £
  136. 9€       Í
  137. 9⇩!    ý heap_full% ☓ ¬(result%)
  138. 9“  Í
  139. 9fi
  140. = result%
  141. 9¨:
  142. 9²Ý ¤_XExtend_Heap
  143. 9¼ ê heap_full%, r0%, c%, base%
  144. 9Æ,  base% = Application_Size% + Heap_Size%
  145. 9Ð<  È− "XWimp_SlotSize", base% + (32 * 1024), -1 ¸ r0%; c%
  146. 9Ú3  heap_full% = (¤_PSR_V_set(c%) ☓ (r0%<=base%))
  147. 9ä  ç ¬(heap_full%) …
  148. 9î!    Heap_Size% += r0% - base%
  149. 9ø2    È− "OS_Heap", 5, Heap_Start%,, r0% - base%
  150. :  Í
  151. : = heap_full%
  152. ::
  153. : .: ô  Unconditionally kill off entire heap.
  154. :*E: ô  This is a quick and dirty bodge, should insist that all heap
  155. :40: ô  blocks have been released beforehand...
  156. :>:
  157. :HÝ ò_Kill_Heap
  158. :R
  159. ê r0%, c%
  160. :\:  È− "XWimp_SlotSize", Application_Size%, -1 ¸ r0%; c%
  161. :f  ç ¤_PSR_V_set(c%) …
  162. :p1    Ŷ Heap_Error%, "Fatally bad heap murder."
  163. :z  Í
  164. :☓á
  165. :‰:
  166. :—J: ô  This should be called after every release of a heap block, to see
  167. :¢L: ô  if can reduce the amount of memory the application is claiming from
  168. :¬: ô  the system.
  169. :¶G: ô  Error in OS_Heap 5, if try and reduce stack by more than total
  170. :À(: ô  free, then corrupts stack info.
  171. :Ê:
  172. :ÔÝ ò_Try_Reducing_Heap
  173. :Þê free%, c%
  174. :è.  È− "OS_Heap", 1, Heap_Start% ¸ ,,, free%
  175. :ò  È” free%>(32 * 1024)
  176. :ü;    È− "XOS_Heap", 5, Heap_Start%,, -(32 * 1024) ¸ ; c%
  177. ;    ç ¬(¤_PSR_V_set(c%))
  178. ;!      Heap_Size% -= 32 * 1024
  179. ;)      È− "Wimp_SlotSize", -1, -1 ¸ c%
  180. ;$@      È− "Wimp_SlotSize", Application_Size% + Heap_Size%, -1
  181. ;.2      È− "OS_Heap", 1, Heap_Start% ¸ ,,, free%
  182. ;8        Ì
  183. ;B      free% = 0
  184. ;L        Í
  185. ;V  Î
  186. ;`á
  187. ;j:
  188. ;t$ô Last line of <BasicV$Lib>.Heap
  189. ÿ