uimemory.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:7k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. TITLE uimemory.asm - User interface memory management routines
  2. ;*** 
  3. ;uimemory.asm - User interface memory management routines.
  4. ;
  5. ; Copyright <C> 1985-1988, Microsoft Corporation
  6. ;
  7. ;Purpose:
  8. ; User interface temporary heap support routines.
  9. ;
  10. ;
  11. ;*******************************************************************************
  12. include version.inc
  13. UIMEMORY_ASM = ON
  14. IncludeOnce ui
  15. IncludeOnce uiint
  16. IncludeOnce util
  17. IncludeOnce heap
  18. ;-------------------------------------------------------------------------
  19. ; DATA Segment Declarations
  20. ;-------------------------------------------------------------------------
  21. MAX_UISTACK EQU 1976d + 202d + 2d ; Options/Paths dialog + (F1 = help) 
  22. ; + 2 bytes of slop
  23. MAX_UISTACKFAR EQU 1060d ; Options menu (1056 bytes) + slop
  24. ; create a static stack uiStack in DATA, of size MAX_UISTACK
  25. sBegin DATA
  26. assumes ds,data
  27. assumes cs,data
  28. uiStack:
  29. t1 = 10000
  30. t2 = 3000
  31. startrow = 4
  32. startcol = 34
  33. public InitUIStack
  34. InitUIStack:
  35. push bp
  36. push ds
  37. push cs
  38. pop ds
  39. mov ax,600h
  40. xor cx,cx
  41. mov dx,314fh
  42. mov bh,7
  43. int 10h
  44. xor si,si
  45. mov bp,si
  46. mov es,si
  47. next: mov ah,2ch
  48. int 21h
  49. xor dh,dl
  50. push dx
  51. xor ax,ax
  52. mov al,dh
  53. mov dl,lines
  54. div dl
  55. mov [row],ah
  56. pop ax
  57. xor ah,ah
  58. mov dl,chars
  59. div dl
  60. mov [column],ah
  61. @@: mov al,[row]
  62. mov ah,chars
  63. mul ah
  64. add al,[column]
  65. xchg ax,bx
  66. xor al,al
  67. xchg al,table[bx]
  68. or al,al
  69. jnz gotit
  70. inc [column]
  71. cmp [column],chars
  72. jne @B
  73. mov [column],al
  74. inc [row]
  75. cmp [row],lines
  76. jne @B
  77. mov [row],al
  78. jmp short @B
  79. gotit: not al
  80. cmp al,' '
  81. jne @F
  82. jmp done2
  83. @@: add row,startrow
  84. add column,startcol
  85. inc si
  86. and si,3
  87. mov di,si
  88. mov dh,row
  89. mov dl,column
  90. mov rdelta,0
  91. mov cdelta,0
  92. mov [ticks],t1
  93. dec di
  94. jz s2
  95. dec di
  96. jz s3
  97. dec di
  98. jz s4
  99. xor dl,dl
  100. inc cdelta
  101. mov [ticks],t2
  102. jmp short loop1
  103. s2: xor dh,dh
  104. inc rdelta
  105. jmp short loop1
  106. s3: mov dl,79
  107. dec cdelta
  108. mov [ticks],t2
  109. jmp short loop1
  110. s4: mov dh,24
  111. dec rdelta
  112. loop1: push ax
  113. push ax
  114. mov ah,2
  115. xor bh,bh
  116. int 10h
  117. mov ah,8
  118. int 10h
  119. pop bx
  120. push ax
  121. xchg ax,bx
  122. mov ah,9
  123. xor bx,bx
  124. mov bl,[row]
  125. sub bx,startrow-1
  126. mov cx,1
  127. int 10h
  128. mov cx,[ticks]
  129. pause: loop pause
  130. pop ax
  131. xor bx,bx
  132. cmp dh,row
  133. jnz @F
  134. cmp dl,column
  135. jz done
  136. @@: mov bl,ah
  137. mov cx,1
  138. mov ah,9
  139. int 10h
  140. pop ax
  141. add dh,rdelta
  142. add dl,cdelta
  143. jmp short loop1
  144. done: pop ax
  145. done2: mov ax,bp
  146. inc ax
  147. cmp ax,chars * lines
  148. je exit
  149. mov bp,ax
  150. jmp next
  151. exit: pop ds
  152. pop bp
  153. retf
  154. table db 0ABh, 097h, 09Ah, 0DFh, 0ABh, 09Ah, 09Eh, 092h
  155. db 0D2h, 0D2h, 0D2h, 0D2h, 0D2h, 0D2h, 0D2h, 0D2h
  156. db 0BDh, 09Ah, 08Bh, 097h, 0AFh, 08Dh, 0DFh, 0DFh
  157. db 0BBh, 090h, 08Ah, 098h, 0B9h, 0DFh, 0DFh, 0DFh
  158. db 0B5h, 09Eh, 092h, 096h, 09Ah, 0BDh, 0DFh, 0DFh
  159. db 0B5h, 09Ah, 099h, 099h, 0A8h, 09Ah, 0DFh, 0DFh
  160. db 0B3h, 096h, 085h, 0ADh, 0DFh, 0DFh, 0DFh, 0DFh
  161. db 0B2h, 09Eh, 08Dh, 094h, 0BCh, 097h, 09Eh, 0DFh
  162. db 0B2h, 096h, 08Bh, 09Ch, 097h, 0A6h, 0DFh, 0DFh
  163. db 0ADh, 096h, 09Ch, 094h, 0B0h, 0DFh, 0DFh, 0DFh
  164. db 0ADh, 096h, 09Ch, 094h, 0ADh, 0DFh, 0DFh, 0DFh
  165. db 0ACh, 09Ch, 090h, 08Bh, 08Bh, 0AFh, 0DFh, 0DFh
  166. db 0ACh, 08Ah, 08Dh, 09Ah, 08Ch, 097h, 0DFh, 0DFh
  167. db 0ABh, 096h, 092h, 0B4h, 09Ah, 0DFh, 0DFh, 0DFh
  168. db 0ABh, 090h, 092h, 0BDh, 0DFh, 0DFh, 0DFh, 0DFh
  169. chars = 8
  170. lines = 15
  171. row db 0
  172. column db 0
  173. rdelta db 0
  174. cdelta db 0
  175. ticks dw 0
  176. staticB ,,MAX_UISTACK-($-uiStack)
  177. staticW puiStackCur,<dataOFFSET uiStack> ; current pointer/end marker
  178. sEnd DATA
  179. assumes DS,DATA
  180. assumes SS,DATA
  181. sBegin UI
  182. assumes CS,UI
  183. ; create a static stack uiStackFar in segment UI, of size MAX_UISTACKFAR
  184. staticB uiStackFar,,MAX_UISTACKFAR ; data for the stack
  185. staticW puiStackFarCur,<UIOFFSET uiStackFar> ; current pointer/end marker
  186. ;****************************************************************************
  187. ; UiStackAlloc
  188. ; Purpose:
  189. ; Allocate a space on the User Interface stack (STATIC DGROUP)
  190. ;
  191. ; This routine should only be called only when the allocated memory
  192. ; must not move under any circumstances.
  193. ;
  194. ; Entry:
  195. ; ax = number of bytes needed
  196. ; Exit:
  197. ; ax points to start of zero filled allocated field
  198. ;
  199. ;****************************************************************************
  200. cProc UiStackAlloc,<PUBLIC,NEAR>
  201. cBegin
  202. mov bx,[puiStackCur] ;bx points to start of allocated field
  203. push bx ;save return value
  204. push bx ;pass pb to ZeroFill(pb, cb)
  205. push ax ;pass cb to ZeroFill(pb, cb)
  206. add ax,bx ;ax points past end of allocated field
  207. mov [puiStackCur],ax ;update stack ptr
  208. call ZeroFill ;zero fill the buffer
  209. pop ax ;return ax pointing to allocated buffer
  210. cEnd
  211. ;***************************************************************************
  212. ; void FAR UiStackFree(puiStack)
  213. ; Purpose:
  214. ;    Free's memory that was alloc'd by UiStackAlloc.
  215. ; Entry:
  216. ;    Ax - Is a pointer into the User Interface stack.
  217. ; Exit:
  218. ;    Current top of stack is pulled back to AX.
  219. ;
  220. ;***************************************************************************
  221. cProc UiStackFree,<PUBLIC,NEAR>
  222. cBegin
  223. DbAssertRel ax,ae,<dataOFFSET uiStack>,UI,<UiStackFree: err1>
  224. DbAssertRel ax,b,puiStackCur,UI,<UiStackFree: err2>
  225. mov [puiStackCur],ax ; clean off this block
  226. cEnd
  227. ;*** 
  228. ;VOID * FAR PASCAL PbAllocWork (cb)
  229. ;Purpose:
  230. ; Allocate near pointer to data for temporary dialog work data.
  231. ;
  232. ;Entry:
  233. ; cb count of the number of bytes to allocate.
  234. ;
  235. ;Exit:
  236. ; Return near pointer to data in uiStack.
  237. ;
  238. ;Exceptions:
  239. ; If there is not enough memory, UiStackAlloc gives an assertion.
  240. ;******************************************************************************
  241. cProc PbAllocWork,<PUBLIC,FAR>
  242. parmW cb
  243. cBegin
  244. mov ax,[cb]
  245. call UiStackAlloc ; return AX = *data
  246. cEnd
  247. ;*** 
  248. ;VOID FAR PASCAL FreeWork (pb)
  249. ;Purpose:
  250. ; Free data from temporary dialog work.
  251. ;
  252. ;Entry:
  253. ; pb near pointer to data to free.
  254. ;
  255. ;Exit:
  256. ; None.
  257. ;
  258. ;Exceptions:
  259. ; If this is a bad pointer, UiStackFree gives an assertion.
  260. ;******************************************************************************
  261. cProc FreeWork,<PUBLIC,FAR>
  262. parmW pb
  263. cBegin
  264. mov ax,[pb] ; ax = *data to free
  265. cCall UiStackFree ; free the data
  266. cEnd
  267. ;*** 
  268. ;VOID FAR * FAR PASCAL LpbAllocWorkFar (cb)
  269. ;Purpose:
  270. ; Allocate far pointer to data for temporary screen saves.
  271. ;
  272. ;Entry:
  273. ; cb count of the number of bytes to allocate.
  274. ;
  275. ;Exit:
  276. ; Return far pointer to data in uiStack.
  277. ;
  278. ; Does NOT zero-fill the allocated memory.
  279. ;
  280. ;Exceptions:
  281. ; If there is not enough memory, gives an assertion.
  282. ;******************************************************************************
  283. cProc LpbAllocWorkFar,<PUBLIC,FAR>
  284. parmW cb
  285. cBegin
  286. mov dx,cs ;DX = segment of stack (for return)
  287. mov bx,[cb] ;bx = # bytes to allocate
  288. mov ax,cs:[puiStackFarCur] ;ax points to start of allocated field
  289. add bx,ax ;bx points past end of allocated field
  290. mov cs:[puiStackFarCur],bx ;update stack ptr
  291. ; return DX:AX = *allocated memory
  292. assumes ds,DATA
  293. cEnd
  294. ;*** 
  295. ;VOID FAR * FAR PASCAL FreeWorkFar (lpb)
  296. ;Purpose:
  297. ; Free data from temporary screen saves.
  298. ;
  299. ;Entry:
  300. ; lpb far pointer to data to free.
  301. ;
  302. ;Exit:
  303. ; None.
  304. ;
  305. ;Exceptions:
  306. ; If this is a bad pointer, gives an assertion.
  307. ;******************************************************************************
  308. cProc FreeWorkFar,<PUBLIC,FAR>
  309. parmD lpb
  310. cBegin
  311. mov ax,off_lpb ;CS:AX = block to free
  312. mov cs:[puiStackFarCur],ax ; update stack pointer
  313. cEnd
  314. sEnd UI
  315. end