home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / VDH / WDHREAD.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  16KB  |  426 lines

  1. ;*DDK*************************************************************************/
  2. ;
  3. ; COPYRIGHT (C) Microsoft Corporation, 1989
  4. ; COPYRIGHT    Copyright (C) 1995 IBM Corporation
  5. ;
  6. ;    The following IBM OS/2 WARP source code is provided to you solely for
  7. ;    the purpose of assisting you in your development of OS/2 WARP device
  8. ;    drivers. You may use this code in accordance with the IBM License
  9. ;    Agreement provided in the IBM Device Driver Source Kit for OS/2. This
  10. ;    Copyright statement may not be removed.;
  11. ;*****************************************************************************/
  12.         PAGE    60,132
  13.         TITLE   WDHREAD.ASM -- Buffer Read Routines for Windowable sessions
  14.  
  15. ;/*****************************************************************************
  16. ;*
  17. ;* SOURCE FILE NAME = WDHREAD.ASM
  18. ;*
  19. ;* DESCRIPTIVE NAME = Buffer Read Routines for Windowable sessions
  20. ;*
  21. ;*
  22. ;* VERSION      V2.0
  23. ;*
  24. ;* DATE
  25. ;*
  26. ;* DESCRIPTION  Buffer Read Routines for Windowable sessions
  27. ;*
  28. ;* FUNCTIONS    ReadCellTypes, ReadCharStr,
  29. ;*              ReadCellStr, LocateBuffAddr
  30. ;*
  31. ;* NOTES        NONE
  32. ;*
  33. ;* STRUCTURES   NONE
  34. ;*
  35. ;* EXTERNAL REFERENCES  NONE
  36. ;*
  37. ;* EXTERNAL FUNCTIONS
  38. ;*
  39. ;*              NONE
  40. ;*
  41. ;* CHANGE ACTIVIY =
  42. ;*   DATE      FLAG       APAR    CHANGE DESCRIPTION
  43. ;*   --------  ---------- -----   --------------------------------------
  44. ;*   mm/dd/yy  @Vr.mpppxx xxxxx   xxxxxxx
  45. ;*   09/14/94  @95837             WKB, pmwinp.inc -> pmwinx.inc
  46. ;****************************************************************************/
  47.  
  48.         .286c                                     ; 286 protect mode instructions
  49.  
  50.         .xlist
  51.         include pmwinx.inc                        ;@95837
  52.         include pmaviop.inc
  53.  
  54.         INCLUDE struc.inc                         ; Structure macro
  55.         INCLUDE error2.inc                        ; Subsystem error equates
  56.         INCLUDE vdhstruc.inc                      ; Buffer update data structures
  57.         INCLUDE vdhequ.inc                        ; Buffer update equates
  58.         .list
  59.  
  60. R2CSEG  SEGMENT WORD PUBLIC 'CODE'
  61.         ASSUME  CS:R2CSEG,DS:NOTHING,ES:NOTHING
  62.  
  63. ;/****************************************************************************
  64. ;*
  65. ;* SUBROUTINE NAME:     ReadCellTypes
  66. ;*
  67. ;* DESCRIPTIVE NAME:    Video device handler read cell types
  68. ;*
  69. ;* FUNCTION:    Process read cell types sub-function.
  70. ;*
  71. ;* ENTRY POINT: ReadCellTypes
  72. ;*   LINKAGE:   Near Call from BUFFERUPDATE routine
  73. ;*
  74. ;* INPUT:
  75. ;*
  76. ;* AX = 0
  77. ;* SS:BP  --->  Stack frame                        (see VDHSTRUC.INC)
  78. ;* DS:SI  --->  Parameter block buffer            (see WDHBUFUP.ASM)
  79. ;* ES:DI  --->  Mode data in environment buffer (see WDHBUFUP.ASM)
  80. ;*
  81. ;* PARAMETER BLOCK FORMAT:
  82. ;*
  83. ;*   SIZE   DESCRIPTION
  84. ;*   ----   -----------
  85. ;*
  86. ;*   WORD   Parameter length
  87. ;*   WORD   Flags                                      (source data buffer - LVB, PVB)
  88. ;*   DWORD  Application data address  (target data buffer)
  89. ;*   DWORD  Application data2 address (not used in this call)
  90. ;*   WORD   Index (0)
  91. ;*   WORD   Starting row                               (source row)
  92. ;*   WORD   Starting column                            (source column)
  93. ;*   WORD   Secondary row                              (not used in this call)
  94. ;*   WORD   Secondary column                           (net used in this call)
  95. ;*   WORD   RepeatFactor                               (input and output length)
  96. ;*   WORD   LogicalBufSel
  97. ;*
  98. ;* OUTPUT:
  99. ;*  The valid cell type for this OS/2 release is a word of zero.
  100. ;*
  101. ;* EXIT-NORMAL: AX = 0
  102. ;*
  103. ;* EXIT-ERROR:  AX = Error from LocateBuffAddr
  104. ;*
  105. ;* EFFECTS:     All
  106. ;*
  107. ;* INTERNAL REFERENCES: LocateBuffAddr
  108. ;*
  109. ;* EXTERNAL REFERENCES: None
  110. ;*
  111. ;****************************************************************************/
  112.  
  113.         PUBLIC  ReadCellTypes
  114. ReadCellTypes PROC NEAR
  115.  
  116.         mov     bx, 1                             ; Set indicator for word move
  117.         call    LocateBuffAddr                    ; On exit: BX = sel, AX = off
  118.         .if     <nc>                              ; Continue?
  119.             shr     cx, 1                         ; Adjust for word move
  120.             les     di, [si].AppDataAddr          ; Setup destination address
  121.             sub     ax, ax                        ; Clear return code
  122.             rep     stosw                         ; Transfer zeros to user buffer
  123.         .endif                                    ; 
  124.         ret
  125.  
  126. ReadCellTypes ENDP
  127.  
  128. ;/****************************************************************************
  129. ;*
  130. ;* SUBROUTINE NAME:     ReadCharStr
  131. ;*
  132. ;* DESCRIPTIVE NAME:    Video device handler read characters
  133. ;*
  134. ;* FUNCTION:    Process read characters sub-function.
  135. ;*              The characters are read from either PVB or LVB
  136. ;*              starting at the specified row, column location.
  137. ;*              Line wrap occurs if the end of a line is reached.
  138. ;*              Read function is terminated if the end of PVB or
  139. ;*              LVB is reached.  The characters read are placed
  140. ;*              in the specified buffer and the number of chars
  141. ;*              read is returned in the RepeatFactor field of
  142. ;*              the parameter block.
  143. ;*
  144. ;* ENTRY POINT: ReadCharStr
  145. ;*   LINKAGE:   Near Call from BUFFERUPDATE routine
  146. ;*
  147. ;* INPUT:
  148. ;*
  149. ;* AX = 0
  150. ;* SS:BP  --->  Stack frame                        (see VDHSTRUC.INC)
  151. ;* DS:SI  --->  Parameter block buffer            (see WDHBUFUP.ASM)
  152. ;* ES:DI  --->  Mode data in environment buffer (see WDHBUFUP.ASM)
  153. ;*
  154. ;* PARAMETER BLOCK FORMAT:
  155. ;*
  156. ;*   SIZE   DESCRIPTION
  157. ;*   ----   -----------
  158. ;*
  159. ;*   WORD   Parameter length
  160. ;*   WORD   Flags                                      (source data buffer - LVB, PVB)
  161. ;*   DWORD  Application data address  (target data buffer)
  162. ;*   DWORD  Application data2 address (not used in this call)
  163. ;*   WORD   Index (1)
  164. ;*   WORD   Starting row                               (source row)
  165. ;*   WORD   Starting column                            (source column)
  166. ;*   WORD   Secondary row                              (not used in this call)
  167. ;*   WORD   Secondary column                           (not used in this call)
  168. ;*   WORD   RepeatFactor                               (input and output length)
  169. ;*   WORD   LogicalBufSel
  170. ;*
  171. ;* OUTPUT:      Application data buffer = characters read
  172. ;*              RepeatFactor = number of characters read
  173. ;*
  174. ;* EXIT-NORMAL: AX = 0
  175. ;*
  176. ;* EXIT-ERROR:  AX = Error from LocateBuffAddr
  177. ;*
  178. ;* EFFECTS:     All registers
  179. ;*
  180. ;* INTERNAL REFERENCES: LocateBuffAddr
  181. ;*
  182. ;* EXTERNAL REFERENCES: None
  183. ;*
  184. ;****************************************************************************/
  185.  
  186.         PUBLIC  ReadCharStr
  187. ReadCharStr PROC NEAR
  188.  
  189.         sub     bx, bx                            ; Set indicator for byte move
  190.         call    LocateBuffAddr                    ; Setup LVB, PVB selectors
  191.         .if     <nc>                              ; Continue?
  192.             les     di, [si].AppDataAddr          ; Setup destination address
  193.             mov     ds, bx                        ; Setup source selector
  194.             mov     si, ax                        ; Setup source offset
  195.             .repeat                               ; 
  196.                 movsb                             ; Transfer chars to destination
  197.                 inc     si                        ; 
  198.             .loop                                 ; 
  199.             sub     ax,ax                         ; Clear return code
  200.         .endif                                    ; 
  201.         ret
  202.  
  203. ReadCharStr ENDP
  204.  
  205. ;/****************************************************************************
  206. ;*
  207. ;* SUBROUTINE NAME:     ReadCellStr
  208. ;*
  209. ;* DESCRIPTIVE NAME:    Video device handler read cells
  210. ;*
  211. ;* FUNCTION:    Process read cells sub-function.
  212. ;*              The cells are read from either PVB or LVB starting
  213. ;*              at the specified row, column location. Line wrap
  214. ;*              occurs if the end of a line is reached.  Read
  215. ;*              function is terminated if the end of PVB or LVB
  216. ;*              is reached.  The cells read are placed in the
  217. ;*              specified buffer and the number of cells read
  218. ;*              is returned in the RepeatFactor field of the
  219. ;*              parameter block.
  220. ;*
  221. ;* ENTRY POINT: ReadCellStr
  222. ;*   LINKAGE:   Near Call from BUFFERUPDATE routine
  223. ;*
  224. ;* INPUT:
  225. ;*
  226. ;* AX =   0
  227. ;* SS:BP  --->  Stack frame                        (see VDHSTRUC.INC)
  228. ;* DS:SI  --->  Parameter block buffer            (see WDHBUFUP.ASM)
  229. ;* ES:DI  --->  Mode data in environment buffer (see WDHBUFUP.ASM)
  230. ;*
  231. ;* PARAMETER BLOCK FORMAT:
  232. ;*
  233. ;*   SIZE   DESCRIPTION
  234. ;*   ----   -----------
  235. ;*
  236. ;*   WORD   Parameter length
  237. ;*   WORD   Flags                                      (source data buffer - LVB, PVB)
  238. ;*   DWORD  Application data address  (target data buffer)
  239. ;*   DWORD  Application data2 address (not used in this call)
  240. ;*   WORD   Index (2)
  241. ;*   WORD   Starting row                               (source row)
  242. ;*   WORD   Starting column                            (source column)
  243. ;*   WORD   Secondary row                              (not used in this call)
  244. ;*   WORD   Secondary column                           (not used in this call)
  245. ;*   WORD   RepeatFactor                               (input and output length)
  246. ;*   WORD   LogicalBufSel
  247. ;*
  248. ;* OUTPUT:      Application data buffer = character cells read
  249. ;*              RepeatFactor = sum of char/attr pairs read
  250. ;*
  251. ;* EXIT-NORMAL: AX = 0
  252. ;*
  253. ;* EXIT-ERROR:  AX = Error from LocateBuffAddr
  254. ;*
  255. ;* EFFECTS:     All
  256. ;*
  257. ;* INTERNAL REFERENCES: LocateBuffAddr
  258. ;*
  259. ;* EXTERNAL REFERENCES: None
  260. ;*
  261. ;****************************************************************************/
  262.  
  263.         PUBLIC  ReadCellStr
  264. ReadCellStr PROC NEAR
  265.  
  266.         mov     bx, 1                             ; Set indicator for word move
  267.         call    LocateBuffAddr                    ; On exit: BX = sel, AX = off
  268.         .if     <nc>                              ; Continue?
  269.             shr     cx, 1                         ; Adjust for word move
  270.             les     di, [si].AppDataAddr          ; Setup destination address
  271.             mov     ds, bx                        ; Setup source selector
  272.             mov     si, ax                        ; Setup source offset
  273.             rep     movsw                         ; Transfer cells to destination
  274.             sub     ax, ax                        ; Clear return code
  275.         .endif                                    ; 
  276.         ret                                       ; 
  277.  
  278. ReadCellStr ENDP
  279.  
  280. ;/****************************************************************************
  281. ;*
  282. ;* SUBROUTINE NAME:     LocateBuffAddr
  283. ;*
  284. ;* DESCRIPTIVE NAME:    Video device handler locate video buffer addr
  285. ;*
  286. ;* FUNCTION:    Determine the source/target buffer address for the
  287. ;*              read/write function based on the information in the
  288. ;*              parameter buffer and the mode data buffer.
  289. ;*
  290. ;* ENTRY POINT: LocateBuffAddr
  291. ;*   LINKAGE:   Near Call from ReadCharacters, ReadCells,
  292. ;*                             RepeatAttribute,
  293. ;*
  294. ;*
  295. ;* INPUT:
  296. ;*
  297. ;* AX = 0
  298. ;* BX = Type of transfer
  299. ;*      0 - byte transfer (character or attribute only)
  300. ;*      1 - word transfer (character cell - char/attr pair)
  301. ;* SS:BP  --->  Stack frame                        (see VDHSTRUC.INC)
  302. ;* DS:SI  --->  Parameter block buffer            (see WDHBUFUP.ASM)
  303. ;* ES:DI  --->  Mode data in environment buffer (see WDHBUFUP.ASM)
  304. ;*
  305. ;* OUTPUT:      AX = source buffer offset
  306. ;*              BX = source buffer selector
  307. ;*              CX = adjusted repeat factor
  308. ;*              DX = offset to the end of source buffer
  309. ;*              DS:[SI].RepeatFactor = # of bytes to be transfered
  310. ;*              CY = 1 Error encountered
  311. ;*
  312. ;* EXIT-NORMAL: CY = clear
  313. ;*
  314. ;* EXIT-ERROR:  CY = set
  315. ;*              AX = 0  if RepeatFactor = 0 for char or attr move
  316. ;*                                                = 0 or 1 for cell move
  317. ;*              AX = ERROR_VIO_COL
  318. ;*              AX = ERROR_VIO_ROW
  319. ;*
  320. ;* EFFECTS:     AX, BX, CX, DX, CY
  321. ;*
  322. ;* INTERNAL REFERENCES: None
  323. ;*
  324. ;* EXTERNAL REFERENCES: None
  325. ;*
  326. ;****************************************************************************/
  327.  
  328.         PUBLIC  LocateBuffAddr
  329. LocateBuffAddr PROC NEAR
  330.  
  331. ;/*
  332. ;**   Validate row, column value based on the current text mode setting.
  333. ;**   Make sure CY is set if validation fails.
  334. ;*/
  335.  
  336.  
  337.         mov     cx, es:[di].TextCols             ; Get column value from EnvBuf
  338.         .if     <cx a [si].Col>                  ; Valid input column value?
  339.             mov     cx, es:[di].TextRows         ; Get row value from EnvBuf
  340.             .if     <cx a [si].Row>              ; Valid input row value?
  341.  
  342. ;/*
  343. ;**  Minimum transfer count for either character or attribute is 1 and
  344. ;**  the minimum transfer count for a cell is 2.
  345. ;**  Transfer will not take place if minimum transfer count is not met.
  346. ;**  This is determine by the request type indicated in BX on entry.
  347. ;*/
  348.  
  349.  
  350.                 mov     cx, [si].RepeatFactor    ; Get repeat factor
  351.                 .if     <cx a bx>                ; Pass minimum requirement?
  352.  
  353. ;/*
  354. ;**   Calculate the starting offset within the PVB or LVB based on the
  355. ;**   starting row, column value.
  356. ;*/
  357.  
  358.                     mov     ax, [si].Row         ; Buffer offset = (parm row
  359.                     mul     es:[di].TextCols     ;    * screen columns + parm
  360.                     add     ax, [si].Col         ;   column) * 2
  361.                     add     ax, ax               ; AX = buffer offset
  362.                     .if     <[bp].Retrace eq 4>
  363.                         add                      ax,ax
  364.                     .endif
  365.  
  366. ;/*
  367. ;**   Determine how many bytes left to the end of the video buffer.
  368. ;**   Length = size of PVB - video buffer offset
  369. ;*/
  370.  
  371.  
  372.                     mov     dx, es:[di].BufferLenLo
  373.                     sub     dx, ax              ; Calculate eob length
  374.  
  375. ;/*
  376. ;**   For either character or attribute only transfer, cut the end of
  377. ;**   buffer length in half to allow for proper determination of buffer
  378. ;**   overflow condition.
  379. ;*/
  380.  
  381.  
  382.                     .if     <zero bx>                  ; Byte transfer request?
  383.                         shr                      dx, 1 ; Adjust end of buffer length
  384.                         .if                      <[bp].Retrace eq 4>
  385.                             shr     dx,1
  386.                         .endif
  387.                     .endif
  388.  
  389. ;/*
  390. ;**   If overflow condition occurs, use the adjusted end-of-buffer
  391. ;**   length as the repeat factor count.
  392. ;*/
  393.  
  394.  
  395.                     .if     <cx a dx>            ; Over flow buffer?
  396.                         mov               cx, dx ; Repeat factor = eob length
  397.                     .endif
  398.                     mov     [si].RepeatFactor, cx
  399.  
  400.  
  401. ;/*
  402. ;**    Setup BX with the LVB selector.
  403. ;*/
  404.  
  405.                     mov     bx, [si].LogicalBufSel ; Use LVB only
  406.                     clc
  407.                 .else
  408.                     sub     ax, ax                ; Clear return code
  409.                     mov     [si].RepeatFactor, ax ; Indicate no-op
  410.                     stc                           ; Force exit condition
  411.                 .endif
  412.             .else
  413.                 mov     ax, ERROR_VIO_ROW
  414.                 stc
  415.             .endif
  416.         .else
  417.             mov     ax, ERROR_VIO_COL
  418.             stc
  419.         .endif
  420.         ret
  421.  
  422. LocateBuffAddr ENDP
  423.  
  424. R2CSEG  ENDS
  425.         END
  426.