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

操作系统开发

开发平台:

Visual C++

  1. PAGE 56,132
  2. TITLE GETPUT - iAPX 88/86 SUPPORT FOR GRAPHICS PUT/GET STATEMENTS
  3. ;***
  4. ; GETPUT - iAPX 88/86 SUPPORT FOR GRAPHICS PUT/GET STATEMENTS
  5. ;
  6. ; Copyright <C> 1986, Microsoft Corporation
  7. ;
  8. ;Purpose:
  9. ;
  10. ; BASIC Syntax mapping to included runtime entry points:
  11. ;
  12. ; - GET Statement:
  13. ;
  14. ;      GET (x1,y1)-(x2,y2),arrayname [(indecies)]
  15. ; |     |       |
  16. ; |   Coord Routines       B$GGET
  17. ; |  |
  18. ; +--------------------------------+
  19. ;
  20. ; - PUT Statement:
  21. ;
  22. ;      PUT (x,y),array[(indecies)][,action]
  23. ; |    |
  24. ; |  Coord Routines B$GPUT
  25. ; |    |
  26. ; +--------------------------+
  27. ;
  28. ;******************************************************************************
  29. INCLUDE switch.inc
  30. INCLUDE rmacros.inc ; Runtime Macro Defintions
  31. useSeg _BSS
  32. useSeg GR_TEXT 
  33. INCLUDE seg.inc 
  34. INCLUDE array.inc
  35. sBegin _BSS
  36. ;
  37. ;****************************************************************************
  38. ; External low-level function vectors
  39. ;****************************************************************************
  40. ;
  41. externW b$MapXYC
  42. externW b$UpC
  43. externW b$DownC
  44. externW b$SetPixLastC
  45. externW B$GXPOS ; defined in GWDATA.ASM
  46. externW B$GYPOS ; defined in GWDATA.ASM
  47. externW B$MINDEL  ; defined in GWDATA.ASM
  48. externW B$MAXDEL  ; defined in GWDATA.ASM
  49. externB B$WNDWSW  ; defined in GWDATA.ASM
  50. externB B$WNDWSC  ; defined in GWDATA.ASM
  51. sEnd _BSS
  52. sBegin GR_TEXT 
  53. assumes CS,GR_TEXT
  54. externNP B$IDIVBX
  55. externNP B$ComputeSpace
  56. externNP B$COORD1
  57. externNP B$COORD2
  58. externNP B$INVIEW
  59. externNP B$SCINIT ; Performs screen initialization
  60. externNP B$ERR_FC
  61. externNP B$ERR_BS
  62. ;
  63. ;low-levels:
  64. ;
  65. externNP B$ImageSize
  66. externNP B$PixSize
  67. externNP B$PutGetInit
  68. externNP B$NReadC
  69. externNP B$NWriteC
  70. externNP B$XDELT 
  71. externNP B$YDELT 
  72. SUBTTL B$GGET - read rectangle screen area into the specified array
  73. PAGE
  74. ;***
  75. ; B$GGET - read the rectangle screen area into the specified array
  76. ; void pascal B$GGET(far *fpData, ad *pAd)
  77. ;
  78. ;Purpose:
  79. ; Read all the pixels in the specified rectangle on the screen into the array.
  80. ; The first two bytes of the array will be set to the number of bits along the
  81. ; X axis, the second two bytes, the Y axis.
  82. ;
  83. ; NOTE: This routine can take a far pointer to a movable item in a heap. This
  84. ; routine cannot directly or indirectly cause heap movement.
  85. ;
  86. ;Entry:
  87. ; fpData = Far pointer to location at which to place the data.
  88. ; pAd  = Pointer to the array descriptor to be used...
  89. ;
  90. ;Exit:
  91. ; Array set
  92. ;
  93. ;Uses:
  94. ; Per convention
  95. ;
  96. ;Exceptions:
  97. ; Control could be transfered to an error routine, such as B$ERR_FC
  98. ;
  99. ; [3/4] Routine largely rewritten for array indecies and new array descriptor
  100. ;******************************************************************************
  101. cProc B$GGET,<FAR,PUBLIC>,<ES,SI>
  102. parmD fpData ;far ptr to start of array data
  103. parmW pAd ;pointer to array descripptor of interest
  104. cBegin
  105. CALL B$SCINIT ; initialize screen if not already done.
  106. cCall B$COORD1 ;Process first coord pair
  107. PUSH CX ;save X1
  108. PUSH DX ;save Y1
  109. cCall B$COORD2 ;Process second coord pair
  110. ;
  111. ; First step is to calculate the upper right hand corner and the delta-x and
  112. ; delta-y of the area that the caller has selected through previous calls to
  113. ; set the first and second pairs of coordinates.
  114. ;
  115. POP DX ; [DX] = Y1
  116. POP CX ; [CX] = X1
  117. CALL B$YDELT ;CALC DELTA Y
  118. JNB GPUTG2
  119. XCHG DX,[B$GYPOS] ;ensure DX = MIN(Y1,Y2)
  120. GPUTG2:
  121. CMP B$WNDWSW,0
  122. JZ GPUTGW ;Brif no WINDOW
  123. CMP B$WNDWSC,0
  124. JNZ GPUTGW ;Use MinY if WINDOW SCREEN
  125. XCHG DX,[B$GYPOS] ;ensure DX = MIN(Y1,Y2)
  126. GPUTGW:
  127. INC BX ;MAKE DELTA A COUNT
  128. MOV B$MINDEL,BX ;SAVE DELTA Y IN MIDEL
  129. CALL B$XDELT
  130. JNB GPUTG3
  131. XCHG CX,[B$GXPOS] ;ensure CX = MIN(X1,X2)
  132. GPUTG3:
  133. INC BX ;MAKE DELTA A COUNT
  134. MOV B$MAXDEL,BX ;SAVE DX IN B$MAXDEL
  135. CALL [b$MapXYC] ;OEM ROUTINE CALL TO UPDATE GRAPHICS ACCUM
  136. ;
  137. ; Next step is to calculate the starting location in the array, and the amount
  138. ; of room available for the data to GET.
  139. ;
  140. cCall B$ComputeSpace,<fpData,pAd>
  141. PUSH DX ;place on stack for subsequent pops
  142. PUSH AX ;[ES:SI] = address, [TOS] = room left
  143. ;
  144. ; From the delta-x and delta-y, calculate the amount of room required for the
  145. ; graphics area to GET, and then make sure that the amount of available space
  146. ; calculated above is sufficient.
  147. ;
  148. MOV BX,B$MINDEL ;Get delta Y
  149. MOV DX,B$MAXDEL ;Get delta X
  150. XOR CX,CX ;Clear CX before call to ImageSize
  151. CALL B$ImageSize ;[CX:BX]=number bytes req'd, [DX]=bits per row
  152. JC OVERFL ;Jump if overflow occurred
  153. ADD BX,4 ;Add 4 bytes to space needed for deltax,deltay
  154. adc cx,0 ;carry to high-order word
  155. ; JC GP0_ERR  ;Issue error if space needed > 64K
  156. ; INC CX
  157. ; LOOP GP0_ERR  ;If CX <> 0 issue error
  158. POP AX ; [AX] = low bytes available
  159. SUB AX,BX ; [AX] = low available - low required
  160. POP AX ; [AX] = high available
  161. SBB AX,CX ; [AX] = high available - high required
  162. JNB GET0 ;Continue if there's enough room
  163. GP0_ERR: JMP  B$ERR_FC    ;ERROR IF TOO BIG
  164. GET0:
  165. ;
  166. ; Begin the GET. Store the delta-x and delta-y as the first two (word) elements
  167. ; in the array, and then perform a line read delta-y times.
  168. ;
  169. PUSH BP ;low level GET trashes BP
  170. MOV BX,SI ;[ES:BX] = address
  171. MOV ES:[BX],DX ;Store x dimension at ES:BX
  172. MOV CX,B$MINDEL ;get y line count
  173. MOV ES:[BX+2],CX ;Store y dimension at ES:BX + 2
  174. ADD BX,4 ;Increment array ptr past raster
  175. XCHG CX,DX ;CX:=bits per row for INIT ;DX:=delta y of raster
  176. CLC ;Clear carry for INIT
  177. PUSH DX ;RESAVE DY
  178. CALL B$PutGetInit ; [CX]=BIT COUNT,[BX]=ARRAY ADDR
  179. POP CX ;get y count
  180. MOV AX,WORD PTR [B$WNDWSW] ;get window switches
  181. ;
  182. ;      if wndwsw and ~wndwsc then use upc else use downc
  183. ;
  184. NOT AH ;negate B$WNDWSC (low bit 1 for no SCREEN)
  185. AND AL,AH
  186. RCR AL,1 ;only make assumption about 0/1
  187. JC GLOOPU
  188. GLOOPD:
  189. PUSH CX ;preserve count register
  190. CALL B$NReadC ;read a raster line from the screen
  191. CALL [b$DownC] ;move the cursor down a line
  192. POP CX ;restore count register
  193. LOOP GLOOPD ;repeat cx times
  194. JMP SHORT GGET_90
  195. GLOOPU:
  196. PUSH CX ;preserve count register
  197. CALL B$NReadC ;read a raster line from the screen
  198. CALL [b$UpC] ;move the cursor up a line
  199. POP CX ;restore count register
  200. LOOP GLOOPU ;repeat cx times
  201. GGET_90:
  202. POP BP ;recover real BP
  203. call [b$SetPixLastC] 
  204. cEnd
  205. OVERFL: JMP B$ERR_BS
  206. PAGE
  207. SUBTTL B$GPUT - write specified array contents to screen with action
  208. PAGE
  209. ;***
  210. ; B$GPUT - write specified array contents to screen with action
  211. ; void pascal B$GPUT(far *fpData, ad *pAd, I2 action)
  212. ;
  213. ;Purpose:
  214. ; Write the specified array data to the screen in a rectangle whose upper left
  215. ; vertex is the specified coordinate. The action is performed on the pixel
  216. ; value in the array before it is written to the screen. The rectangle width
  217. ; and height are kept in the first word of the array.
  218. ;
  219. ; NOTE: This routine can take a far pointer to a movable item in a heap. This
  220. ; routine cannot directly or indirectly cause heap movement.
  221. ;
  222. ;Entry:
  223. ; fpData = Far pointer to location from which to obtain the data.
  224. ; pAd  = Pointer to the array descriptor to be used.
  225. ; action = PUT action to be performed
  226. ; 1 for PSET
  227. ; 2 for PRESET
  228. ; 3 for XOR
  229. ; 4 for OR
  230. ; 5 for AND
  231. ;
  232. ;Exit:
  233. ; None.
  234. ;
  235. ;Uses:
  236. ; Per convention.
  237. ;
  238. ;Exceptions:
  239. ; Control could be transfered to an error routine, such as B$ERR_FC
  240. ;
  241. ; [3/4] Routine largely rewritten for array indecies and new array descriptor
  242. ;******************************************************************************
  243. cProc B$GPUT,<FAR,PUBLIC>,<DI,SI,ES>
  244. parmD fpData ;far ptr to start of array data
  245. parmW pAd ;pointer to array descriptor of interest
  246. parmW action ;PUT action to be taken
  247. cBegin
  248. CALL B$SCINIT ; initialize screen if not already done.
  249. cCall B$COORD1 ;Process Coord pair
  250. cCall [b$MapXYC] ;update graphics cursor
  251. ;
  252. ; Start by determining the base address within the array at which to place
  253. ; data, taking into account if any indecies have been passed.
  254. ;
  255. LES BX,fpData ;[ES:BX] = address to obtain data
  256. MOV CX,ES
  257. INC CX ;Is there a specified place?
  258. LOOP GPUT_10  ;brif so
  259. MOV BX,pAd ;[AX] = ptr to array descriptor
  260. LES BX,DWORD PTR [BX].AD_fhd.FHD_oData ;[ES:BX] = base array address
  261. GPUT_10: ;[ES:BX] = address
  262. ;
  263. ; Compute the opposite corner of the rectangle to be PUT, and ensure that it
  264. ; lies within the available area.
  265. ;
  266. MOV SI,ES:[BX] ;[SI] = x bit count
  267. PUSH SI
  268. MOV DI,ES:[BX+2] ;[DI] = y dimension
  269. PUSH DI
  270. ADD BX,4 ;[BX] = Pointer to array data
  271. PUSH BX
  272. CALL B$PixSize ;[AL] = BITS/PIXEL
  273. XCHG AX,BX ;[BL] = bits/pixel
  274. XCHG AX,SI ;[AX] = bit count for IDIV instruction
  275. CWD ;[DX:AX] = bit count for B$IDIVBX
  276. XOR BH,BH ;[BX] = bits/pixel
  277. CALL B$IDIVBX  ;[AX] = No. of pixels in x
  278. DEC AX ;DECREMENT SINCE IT'S A COUNTER
  279. MOV DX,B$GXPOS ;[DX] = starting X
  280. ADD AX,DX ;[AX] = ending X
  281. JB PRNGER ;ERROR IF CARRY
  282. MOV CX,AX ;[CX] = ending X
  283. MOV BX,B$GYPOS ;[BX] = starting Y
  284. CMP B$WNDWSW,0
  285. JZ PRNGNW ;Brif no WINDOW
  286. CMP B$WNDWSC,0
  287. JNZ PRNGNW ;Use MinY if WINDOW SCREEN
  288. SUB BX,DI ;Since y is reversed if window
  289. JMP SHORT PRNGER
  290. PRNGNW:
  291. DEC DI ;DECREMENT DY SINCE IT'S A COUNTER
  292. ADD BX,DI ;[BX] = Ending Y (start Y + DELTA Y)
  293. PRNGER:
  294. JNB PRNGOK
  295. PUTERR: JMP B$ERR_FC   ;ERROR IF CARRY
  296. PRNGOK:
  297. MOV DX,BX ;[DX]=Y + DELTA Y
  298. CALL B$INVIEW  ;If coords inside viewport boundary
  299. JNC PUTERR ;ABORT IF CX,DX OFF SCREEN
  300. POP BX ;[ES:BX] = ARRAY POINTER
  301. POP DX ;POP DY
  302. POP CX ;POP DX*BITS/PIX
  303. PUSH BP ;low levels trash BP
  304. PUSH DX ;RESAVE DY
  305. ;
  306. ;For a PUT statement, on entry to INIT AL=put action mode (0..4):
  307. ;
  308. ; 0 OR
  309. ; 1 AND
  310. ; 2 PRESET
  311. ; 3 PSET
  312. ; 4 XOR
  313. ;
  314. STC ;SET CARRY TO FLAG PUT INIT
  315. MOV AX,action ;get the action
  316. CALL B$PutGetInit ;[CX]=BIT COUNT,[BX]=ARRAY ADDR
  317. POP CX ;get y count
  318. MOV AX,WORD PTR [B$WNDWSW] ;get window switches
  319. ;
  320. ;      if wndwsw and ~wndwsc then use upc else use downc
  321. ;
  322. NOT AH ;negate B$WNDWSC (low bit 1 for no SCREEN)
  323. AND AL,AH
  324. RCR AL,1 ;only make assumption about 0/1
  325. JC PLOOPU
  326. PLOOPD:  ;do put loop with downc
  327. PUSH CX ;preserve count register
  328. CALL B$NWriteC ;write a raster line to the screen
  329. CALL [b$DownC] ;move the cursor down a line
  330. POP CX ;restore count register
  331. LOOP PLOOPD ;repeat cx times
  332. JMP SHORT GPUT_90
  333. PLOOPU:  ;put with upc
  334. PUSH CX ;preserve count register
  335. CALL B$NWriteC ;write a raster line to the screen
  336. CALL [b$UpC] ;move the cursor up a line
  337. POP CX ;restore count register
  338. LOOP PLOOPU ;repeat cx times
  339. GPUT_90:
  340. call [b$SetPixLastC] 
  341. POP BP ;recover trashed BP
  342. cEnd
  343. sEnd GR_TEXT 
  344. END