home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / VDH / XGABUFUP.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  31KB  |  571 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   XGABUFUP.ASM -- Common Buffer Update Routine for EGA, VGA, BGA
  14.  
  15. ;/*****************************************************************************
  16. ;*
  17. ;* SOURCE FILE NAME = XGABUFUP.ASM
  18. ;*
  19. ;* DESCRIPTIVE NAME = Video Device Handler BufferUpdate routine     
  20. ;*
  21. ;*
  22. ;* VERSION      V2.0
  23. ;*
  24. ;* DATE         
  25. ;*
  26. ;* DESCRIPTION  Common Buffer Update Routine for EGA, VGA, BGA 
  27. ;*              Mainline routine for video buffer read, write,
  28. ;*              scroll functions.
  29. ;*                                                                      
  30. ;* INPUT:       STACK FRAME on entry                                    
  31. ;*                                                                      
  32. ;* SS:SP  --->  bvsip           dw      BVS IP offset                   
  33. ;*              bvscs           dw      BVS CS selector                 
  34. ;*              parmn           dw      Function number (256)           
  35. ;*              parmnm1         dw      Parameter block offset          
  36. ;*              parmnm2         dw      Parameter block selector        
  37. ;*              parmnm3         dw      Environment buffer offset       
  38. ;*              parmnm4         dw      Environment buffer selector     
  39. ;*                                                                      
  40. ;*                                                                      
  41. ;* PARAMETER BLOCK FORMAT:                                              
  42. ;*                                                                      
  43. ;*   SIZE   DESCRIPTION                                                 
  44. ;*   ----   -----------                                                 
  45. ;*                                                                      
  46. ;*   WORD   ParmLength (length of structure - 28 bytes)                 
  47. ;*   WORD   Flags                                                       
  48. ;*            Bit 0 = 0, do not update physical display buffer          
  49. ;*            Bit 0 = 1, update physical display buffer if possible     
  50. ;*            Bit 1 = 0, logical display buffer update not required     
  51. ;*            Bit 1 = 1, update logical display buffer                  
  52. ;*            Bit 2 = 0, use attribute as is                            
  53. ;*            Bit 2 = 1, convert attribute to or from CGA format        
  54. ;*            Bit 3 - 15 are reserved and must be OFF                   
  55. ;*                                                                      
  56. ;*          NOTE:  If bit 0 and 1 are both ON then the LVB will         
  57. ;*                 be written first before the PVB is updated.          
  58. ;*                 This will ensure that video devices with             
  59. ;*                 slower VRAM will benefit from this algorithm.        
  60. ;*                                                                      
  61. ;*                 The caller of BufferUpdate routine (BVS) must        
  62. ;*                 serialize access to this routine to insure           
  63. ;*                 that the LVB and the PVB will not get out of sync.   
  64. ;*                                                                      
  65. ;*   DWORD  AppDataAddr (address of application data)                   
  66. ;*   DWORD  AppCellAddr (address of character, attribute, or cell)      
  67. ;*   WORD   Index (BufferUpdate sub-function to be performed)           
  68. ;*            0 = Read cell types                                       
  69. ;*                  Bit 0 = 0, single cell character                    
  70. ;*                             (occupies one cell on the screen)        
  71. ;*                  Bit 0 = 1, double cell character                    
  72. ;*                             (occupies two cells on the screen)       
  73. ;*                  Bit 1 = 0, leading (or only) cell                   
  74. ;*                  Bit 1 = 1, trailing cell                            
  75. ;*                  Bit 2 - 15 are reserved and must be OFF             
  76. ;*            1 = Read characters from (Row, Col)                       
  77. ;*            2 = Read cells from (Row, Col)                            
  78. ;*            3 = Scroll (Row, Col) through (Row2, Col2) Up             
  79. ;*            4 = Scroll (Row, Col) through (Row2, Col2) Down           
  80. ;*            5 = Scroll (Row, Col) through (Row2, Col2) Left           
  81. ;*            6 = Scroll (Row, Col) through (Row2, Col2) Right          
  82. ;*            7 = Write cells to (Row, Col)                             
  83. ;*            8 = Write characters to (Row, Col)                        
  84. ;*            9 = Write characters with constant attr to (Row, Col)     
  85. ;*           10 = Write repeat character to (Row, Col)                  
  86. ;*           11 = Write repeat attribute to (Row, Col)                  
  87. ;*           12 = Write repeat cell to (Row, Col)                       
  88. ;*           13 = Copy LVB Rect to PVB                                  
  89. ;*   WORD   Row  (Starting row)                                         
  90. ;*   WORD   Col  (Starting column)                                      
  91. ;*   WORD   Row2 (Secondary row)                                        
  92. ;*   WORD   Col2 (Secondary column)                                     
  93. ;*   WORD   RepeatFactor (# of character cells or rows/columns)         
  94. ;*   WORD   LogicalBufSel (logical buffer selector - LVB)               
  95. ;*   WORD   TouchXLeft   (left most column touched by the write)        
  96. ;*   WORD   TouchYTop    (top most column touched by the write)         
  97. ;*   WORD   TouchXRight  (right most column touched by the write)       
  98. ;*   WORD   TouchYBottom (bottom most column touched by the write)      
  99. ;*   WORD   LVBRowOff    (row offset of the LVB in PVB coordinates)     
  100. ;*   WORD   LVBColOff    (column offset of the LVB in PVB coordinates)  
  101. ;*   WORD   LVBWidth     (width of the LVB in cells)                    
  102. ;*   WORD   LVBHeight    (height of the LVB in cells)                   
  103. ;*   BYTE   LVBFormatID  (format id of the LVB)                         
  104. ;*   BYTE   LVBAttrCount (number of attributes in the LVB)              
  105. ;*                                                                      
  106. ;*                                                                      
  107. ;* ENVIRONMENT BUFFER FORMAT:                                           
  108. ;*                                                                      
  109. ;*   SIZE   DESCRIPTION                                                 
  110. ;*   ----   -----------                                                 
  111. ;*   WORD   ModeDataOff (offset to mode data structure)                 
  112. ;*                                                                      
  113. ;*                                                                      
  114. ;* MODEDATA STRUCTURE FORMAT:                                           
  115. ;*                                                                      
  116. ;*   SIZE   DESCRIPTION                                                 
  117. ;*   ----   -----------                                                 
  118. ;*   WORD   Length (length of mode data structure - 34 bytes)           
  119. ;*   BYTE   ModeType                                                    
  120. ;*            Bit 0 = 0, monochrome compatible                          
  121. ;*            Bit 0 = 1, other                                          
  122. ;*            Bit 1 = 0, text mode                                      
  123. ;*            Bit 1 = 1, graphics mode                                  
  124. ;*            Bit 2 = 0, enable color burst                             
  125. ;*            Bit 2 = 1, disable color burst                            
  126. ;*            Bit 3 = 0, VGA compatible modes (0 - 13h)                 
  127. ;*            Bit 3 = 1, native mode                                    
  128. ;*            Bit 4 - 15 are reserved                                   
  129. ;*   BYTE   Color (number of colors as a power of 2)                    
  130. ;*   WORD   TextCols (number of text columns in current mode)           
  131. ;*   WORD   TextRows (number of text rows in current mode)              
  132. ;*   WORD   HorizRes (horizontal pel resolution)                        
  133. ;*   WORD   VertRes (vertical pel resolution)                           
  134. ;*   BYTE   AttrFormat (attribute format)                               
  135. ;*   BYTE   NAttributes (number of attributes in a character cell)      
  136. ;*  DWORD   BufferAddr (32-bit physical address of PVB)                 
  137. ;*  DWORD   BufferLength (length of PVB in current mode)                
  138. ;*  DWORD   FullBufSize (size of buffer required for screen save)       
  139. ;*  DWORD   PartBufSize (size of buffer for popup save)                 
  140. ;*  DWORD   ExtDataAddr (extended mode data structure address)          
  141. ;*                                                                      
  142. ;* EXIT-NORMAL: AX = 0                                                  
  143. ;* EXIT-ERROR:  AX = error code, ERROR_VIO_COL                          
  144. ;*                               ERROR_VIO_INVALID_LENGTH               
  145. ;*                               ERROR_VIO_INVALID_PARMS                
  146. ;*                               ERRPR_VIO_MODE                         
  147. ;*                               ERROR_VIO_ROW                          
  148. ;*                               ERROR_VIO_INTERNAL_RESOURCE            
  149. ;*                                                                      
  150. ;* EFFECTS:     All other registers are preserved                       
  151. ;*                                                                      
  152. ;* INTERNAL REFERENCES: None                                            
  153. ;*                                                                      
  154. ;* EXTERNAL REFERENCES: ReadCellTypes           in XGAREAD.ASM          
  155. ;*                      ReadCharStr             in XGAREAD.ASM          
  156. ;*                      ReadCellStr             in XGAREAD.ASM          
  157. ;*                      ScrollUp                in XGASCROL.ASM         
  158. ;*                      ScrollDown              in XGASCROL.ASM         
  159. ;*                      ScrollLeft              in XGASCROL.ASM         
  160. ;*                      ScrollRight             in XGASCROL.ASM         
  161. ;*                      WriteCellStr            in XGAWRITE.ASM         
  162. ;*                      WriteCharStr            in XGAWRITE.ASM         
  163. ;*                      WriteCharStrAttr        in XGAWRITE.ASM         
  164. ;*                      WriteNChar              in XGAWRITE.ASM         
  165. ;*                      WriteNAttr              in XGAWRITE.ASM         
  166. ;*                      WriteNCell              in XGAWRITE.ASM         
  167. ;*                      LVBToPVB                in XGASCROL.ASM          
  168. ;*
  169. ;* FUNCTIONS    BUFFERUPDATE 
  170. ;*              SetupPhysBuf 
  171. ;*              SetGenParms 
  172. ;*
  173. ;* NOTES:       Ring 2 conforming code, executable in either           
  174. ;*              privilege level 2 or 3 in protect mode.                 
  175. ;*   LINKAGE:   Far Call from Base Video Subsystem (BVSCALLS.DLL)
  176. ;*             
  177. ;* STRUCTURES   NONE
  178. ;*
  179. ;* EXTERNAL FUNCTIONS
  180. ;*
  181. ;*              NONE
  182. ;* PSEUDOCODE
  183. ;*   
  184. ;*   Begin BufferUpdate
  185. ;*       Preset return code to ERROR_VIO_MODE
  186. ;*       If text mode
  187. ;*           Preset return code to ERROR_VIO_INVALID_LENGTH
  188. ;*           If correct parameter length
  189. ;*               Preset return code to ERROR_VIO_INVALID_PARMS
  190. ;*               If valid reserved flags     AND
  191. ;*               If valid video buffer flags AND
  192. ;*               If valid function number    AND
  193. ;*               If valid index number
  194. ;*                   Call Read/Write/Scroll routines
  195. ;*               Endif
  196. ;*           Endif
  197. ;*       Endif
  198. ;*   End BufferUpdate
  199. ;*   
  200. ;* CHANGE ACTIVIY =
  201. ;*   DATE      FLAG       APAR    CHANGE DESCRIPTION
  202. ;*   --------  ---------- -----   --------------------------------------
  203. ;*   mm/dd/yy  @Vr.mpppxx xxxxx   xxxxxxx
  204. ;*   03/25/89  @P1        D132    TPL, DCR 132 changes
  205. ;*   05/22/89  @T30       D511    TPL, DCR 511 changes
  206. ;*   07/05/89  @B15       B702527 WKB, Performance enhancements,               
  207. ;*   07/15/89  @T39       B784056 TPL, Remove hardware dependencies in VDHINIT,  
  208. ;*   01/23/89  @T52       D704    TPL, DCR 704 work
  209. ;*   01/29/91  MS01               TPL, Rollover MS's runtime check for CGA
  210. ;*                                speedup
  211. ;*****************************************************************************/
  212.  
  213.         .xlist
  214.         INCLUDE bvscb.inc               ;                               ;@T52
  215.         INCLUDE struc.inc               ; Structure macro
  216.         INCLUDE error2.inc              ; Subsystem error equates
  217.         INCLUDE vdhstruc.inc            ; Buffer update data structures
  218.         INCLUDE vdhctl.inc              ; Conditional Assembly Control  ;MS01
  219.         INCLUDE vdhequ.inc              ; Buffer update equates
  220.         INCLUDE xgamac.inc              ;                               @P1
  221.         .list
  222.  
  223.         .286p                           ; 286 protect mode instructions
  224.  
  225.         EXTRN   BVHINSTANCE:WORD                                        ;@T52
  226.  
  227. _DATA   SEGMENT WORD PUBLIC 'DATA'                                 ;@T39;@T52
  228.  
  229. ;/*
  230. ;**   Global data                                                         
  231. ;*/
  232.  
  233.         PUBLIC  PVB                                                     ;@T52
  234.         PVB     dd      BVHINSTANCE                                     ;@T52
  235. _DATA   ENDS                                                            ;@T52
  236.  
  237.         EXTRN   _PhysToUVirt     : NEAR ; Allocate PVB selector         ;@B15
  238.         EXTRN   _FreePhysToUVirt : NEAR ; Deallocate PVB selector       ;@B15
  239.  
  240. R2CSEG  SEGMENT WORD    PUBLIC 'CODE'
  241.         ASSUME  CS:R2CSEG,DS:NOTHING,ES:NOTHING
  242.  
  243.         EXTRN   ReadCellTypes    : NEAR ; 
  244.         EXTRN   ReadCharStr      : NEAR ; VioReadCharStr
  245.         EXTRN   ReadCellStr      : NEAR ; VioReadCellStr
  246.         EXTRN   ScrollUp         : NEAR ; VioScrollUp
  247.         EXTRN   ScrollDown       : NEAR ; VioScrollDn
  248.         EXTRN   ScrollLeft       : NEAR ; VioScrollLt
  249.         EXTRN   ScrollRight      : NEAR ; VioScrollRt
  250.         EXTRN   WriteCellStr     : NEAR ; VioWriteCellStr
  251.         EXTRN   WriteCharStr     : NEAR ; VioWriteCharStr
  252.         EXTRN   WriteCharStrAttr : NEAR ; VioWriteCharStrAttr
  253.         EXTRN   WriteNChar       : NEAR ; VioWriteNChar
  254.         EXTRN   WriteNAttr       : NEAR ; VioWriteNAttr
  255.         EXTRN   WriteNCell       : NEAR ; VioWriteNCell
  256.         EXTRN   LVBToPVB         : NEAR                                 ;@P1
  257.  
  258.         PUBLIC  DispTbl
  259. DispTbl DW      ReadCellTypes    ; table for EGA format LVB
  260.         DW      ReadCharStr      ; Read characters
  261.         DW      ReadCellStr      ; Read character/attribute 's
  262.         DW      ScrollUp         ; Scroll window up
  263.         DW      ScrollDown       ; Scroll window down
  264.         DW      ScrollLeft       ; Scroll window left
  265.         DW      ScrollRight      ; Scroll window right
  266.         DW      WriteCellStr     ; Write character/attribute 's
  267.         DW      WriteCharStr     ; Write characters
  268.         DW      WriteCharStrAttr ; Write characters with attr
  269.         DW      WriteNChar       ; Write character N times
  270.         DW      WriteNAttr       ; Write attribute N times
  271.         DW      WriteNCell       ; Write cell N times
  272.         DW      LVBToPVB         ; Copy the LVB to the PVB @P1
  273.  
  274.         PUBLIC  BUFFERUPDATE
  275. BUFFERUPDATE    PROC    FAR
  276.  
  277.         ;/*
  278.         ;**  This mainline routine checks all high level errors before   
  279.         ;**  control is transfer to the worker routine.                  
  280.         ;**  On entry to each worker routine, the following registers    
  281.         ;**  are setup:                                                  
  282.         ;**      DS:SI -> Parameter block buffer                         
  283.         ;**      ES:DI -> Mode data structure in the environment buffer  
  284.         ;**      SS:BP -> Parameter stack frame                          
  285.         ;**                                                              
  286.         ;**      All registers are preserved                             
  287.         ;*/
  288.  
  289.         sub     sp, bottomdest-PVB_Sel+2; Allocate storage for: PVB selector @P1
  290.                                         ;                       Scroll parms
  291.         push    bp                      ; Save caller's BP
  292.         mov     bp, sp                  ; Establish parameter addressability
  293.         pusha                           ; Save all registers
  294.         push    ds                      ; 
  295.         push    es                      ; 
  296.         les     di, [bp].EnvBufParm     ; ES:DI -> environment buffer
  297.         add     di, es:[di].ModeDataOff ; ES:DI -> mode data structure
  298.         mov     ax, ERROR_VIO_MODE      ; Preset invalid mode error
  299.         test    es:[di].ModeType, GRAPHICS_MODE
  300.         .if     <z>                     ; Text mode?
  301.             lds     si, [bp].ParmBuf    ; DS:SI -> parameter buffer
  302.             mov     ax, ERROR_VIO_INVALID_LENGTH        ; Preset error code
  303.             .if     <[si].ParmLength ae LogicalBufSel+2>; Valid parm length? @P1
  304.                 mov     ax, ERROR_VIO_INVALID_PARMS     ; Preset error code
  305.                 test    [si].Flags, RESERVED_FLAGS      ; 
  306.                 .if     <z>                         AND ; Valid reserved flags?
  307.                 test    [si].Flags, PVB_SEL_BIT + LVB_SEL_BIT
  308.                 .if     <nz>                        AND ; Either bit is ON?
  309.                 .if     <[bp].FuncNumHi e 0>        AND ; Correct function #?
  310.                 .if     <[bp].FuncNumLo e FUNC_NUM> AND ; 
  311.                 .if     <[si].FuncIndex be MAX_INDEX>   ; Invalid index?
  312.                     sub     ax, ax                      ; Clear return code
  313.                     test    [si].Flags, PVB_SEL_BIT     ; 
  314.                     .if     <nz>                        ; Asked for PVB update?
  315.                         call    SetupPhysBuf            ; Go get PVB as needed
  316.                     .endif                              ; 
  317.                     .if     <zero ax>                   ; No error?
  318.                         cld                             ; 
  319.                         mov     bx, [si].FuncIndex      ; 
  320.                         shl     bx, 1                   ; Word align jump table
  321.                         call    cs:DispTbl[bx]          ; Dispatch to handler
  322.                     .endif                              ; 
  323.                 .endif                                  ; 
  324.             .endif                                      ; 
  325.         .endif                          ; 
  326.         mov     [bp-2], ax              ; 
  327.         pop     es                      ; 
  328.         pop     ds                      ; 
  329.         popa                            ; 
  330.         pop     bp                      ; 
  331.         add     sp, bottomdest          ; Deallocate local storage      @P1
  332.         ret     12                      ; 
  333.  
  334. BUFFERUPDATE    ENDP
  335.  
  336. ;/****************************************************************************
  337. ;*
  338. ;* FUNCTION NAME = SetupPhysBuf
  339. ;*
  340. ;* DESCRIPTION   = 
  341. ;*
  342. ;* INPUT         = AX = 0                                  
  343. ;*                 DS:SI -> parameter block                
  344. ;*                 ES:DI -> environment buffer (mode data) 
  345. ;*
  346. ;* OUTPUT        = NONE
  347. ;*
  348. ;* RETURN-NORMAL = AX = 0                                      
  349. ;* RETURN-ERROR  = AX = ERROR_VIO_INTERNAL_RESOURCE    
  350. ;*
  351. ;****************************************************************************/
  352.  
  353.         PUBLIC  SetupPhysBuf
  354. SetupPhysBuf    PROC    NEAR
  355.  
  356.  
  357.         mov     bx, _DATA               ;                               ;@T52
  358.         mov     ds, bx                  ; Setup global data
  359.         lds     bx, ds:PVB              ; Gain access to instance data  ;@T52
  360.  
  361. ;/*
  362. ;**  If PVBSelector in NULL, indicating that the current process does   
  363. ;**  not have a PVB selector allocated then _PhysToUVirt is called      
  364. ;**  to allocate one.  If there is a PVB selector then the current      
  365. ;**  PVB size along with its physical address will be checked against   
  366. ;**  those contained in the environment buffer to see if anything has   
  367. ;**  changed due to a prior set mode.  If any of these fields changed   
  368. ;**  then the current PVB selector will be deallocated and a new one    
  369. ;**  will be allocated based on it new size and/or physical address.    
  370. ;*/
  371.  
  372.         mov     si, es:[di].BufferaddrLo        ; Get the physical address and
  373.         mov     dx, es:[di].BufferAddrHi        ;   PVB size of the current
  374.         mov     cx, ds:[bx].bvhi_PVBSel         ;                       ;@T52
  375.         verw    cx                              ; BUGBUG replace this with the
  376.                                                 ; VerifyW macro
  377.         .if     <nz>                     OR     ; Write acess?
  378.         .if     <ds:[bx].bvhi_PVBAddrLo ne si> OR; Anything different   ;@T52
  379.         .if     <ds:[bx].bvhi_PVBAddrHi ne dx> OR;  due to mode change? ;@T52
  380.         mov     si, es:[di].BufferLenLo         ; 
  381.         .if     <ds:[bx].bvhi_PVBSizeLo ne si>  ;                       ;@T52
  382.             push    bx                          ; Save data offset      ;@T52
  383.             mov     ax, es:[di].BufferLenLo     ;                       ;@T52
  384.             mov     ds:[bx].bvhi_PVBSizeLo, ax  ;                       ;@T52
  385.             push    ax                          ; PVB buffer length     ;@T52
  386.             mov     ds:[bx].bvhi_PVBAddrHi, dx  ;                       ;@T52
  387.             mov     si, es:[di].BufferaddrLo    ; 
  388.             mov     ds:[bx].bvhi_PVBAddrLo, si  ;                       ;@T52
  389.             push    ds                          ; Address of returned
  390.             lea     ax,ds:[bx].bvhi_PVBOffset   ;   selector:offset     ;@T52
  391.             push    ax                          ;                  ;@T30;@T52
  392.             push    dx                          ; PVB address
  393.             push    si                          ; 
  394.             .if     <ncxz>                      ; PVB selector already exists?
  395.                 push    cx                      ; Deallocate it 1st
  396.                 call    _FreePhysToUVirt        ; 
  397.                 add     sp, 2                   ; Balance stack
  398.             .endif                              ; 
  399.             call    _PhysToUVirt                ; Allocate new PVB selector
  400.             add     sp, 10                      ; Balance
  401.             pop     bx                          ; Restore data offset   ;@T52
  402.             les     di, [bp].EnvBufParm         ; Re-setup mode data address
  403.             add     di, es:[di].ModeDataOff     ;   from the environment block
  404.             mov     cx, ds:[bx].bvhi_PVBSel     ; Setup PVB selector    ;@T52
  405.         .endif                                  ; 
  406.         .if     <zero ax>                       ; No error encountered?
  407.             mov     [bp].PVB_Sel, cx            ; Put PVB selector on stack
  408.             lds     si, [bp].ParmBuf            ; Re-setup parameter block addr
  409.         .else                                   ; Error encountered!
  410.             mov     ds:[bx].bvhi_PVBSizelo, 0   ; Clear the necessary   ;@T52
  411.             mov     ds:[bx].bvhi_PVBSel, 0      ;   per process fields  ;@T52
  412.             mov     ax, ERROR_VIO_INTERNAL_RESOURCE
  413.         .endif                                  ; 
  414.         ret
  415.  
  416. SetupPhysBuf    ENDP
  417.  
  418.  
  419. ;/****************************************************************************
  420. ;*
  421. ;* FUNCTION NAME = SetGenParms
  422. ;*
  423. ;* DESCRIPTION   = 
  424. ;*
  425. ;*     Set general parameters used by all buffer update functions
  426. ;*
  427. ;*     SetGenParms sets up basic information relating to LVB substitution.
  428. ;*     The routine sets up the boundaries for the write based on whether
  429. ;*     the LVB has been superceeded by passed parameters.
  430. ;*
  431. ;* INPUT      SS:BP - local data storage area
  432. ;*            DS:SI - user passed parameter block
  433. ;*            ES:DI - mode data structure
  434. ;*
  435. ;* OUTPUT     Carry Clear
  436. ;*               AX - index of right most row in LVB
  437. ;*               CX - index of bottom most column in LVB
  438. ;*               [bp].minrow - index of top most row in LVB (PVB coordinates)
  439. ;*               [bp].mincol - index of left most col in LVB (PVB coordinates)
  440. ;*               [bp].maxrow - index of bottom most row in LVB (PVB coordinates)
  441. ;*               [bp].maxcol - index of right most col in LVB (PVB coordinates)
  442. ;*               [bp].lvb_width - width of the LVB in cells
  443. ;*               [bp].lvb_height - height of the LVB in cells
  444. ;*               [bp].PVB_SEL - PVB selector if PVB write, else 0
  445. ;*               [bp].LVB_SEL - LVB selector if LVB write, else 0
  446. ;*          
  447. ;*            Carry Set
  448. ;*               PVB format == LVB format == CGA format
  449. ;*          
  450. ;*  USES     AX,CX,DX,FLAGS
  451. ;*
  452. ;* PSEUDOCODE
  453. ;*
  454. ;*     if !(parmflags & USEPVB)
  455. ;*         PVB_SEL = 0
  456. ;*    
  457. ;*     if (parmflags & USELVB)
  458. ;*         LVB_SEL = parmLVB
  459. ;*     else
  460. ;*         LVB_SEL = 0
  461. ;*    
  462. ;*     cellsize = modeattrcnt + 1
  463. ;*     if (US format PVB and LVB) &&
  464. ;*        (Read or Write [not scroll or lvbtopvb])
  465. ;*         Indicate US buffer type
  466. ;*         return
  467. ;*    
  468. ;*     if (parmlength >= LVBHeight)
  469. ;*         mincol = parmLVBColOff
  470. ;*         maxcol = parmLVBWidth + mincol
  471. ;*         minrow = parmLVBRowOff
  472. ;*         maxrow = parmLVBHeight + minrow
  473. ;*         lvb_width = parmLVBWidth
  474. ;*         lvb_height = parmLVBHeight
  475. ;*         if (parmlength >= LVBAttrCount)
  476. ;*             if (parmAttrCount == 3)
  477. ;*                 cellsize = 4
  478. ;*             else
  479. ;*                 cellsize = 2
  480. ;*     else
  481. ;*         mincol = 0
  482. ;*         maxcol = modeCols - 1
  483. ;*         minrow = 0
  484. ;*         maxrow = modeRows - 1
  485. ;*         lvb_width = modeCols
  486. ;*         lvb_height = modeRows
  487. ;*
  488. ;* RETURN-NORMAL = NONE
  489. ;* RETURN-ERROR  = NONE
  490. ;*
  491. ;****************************************************************************/
  492.  
  493.                 PUBLIC  SetGenParms
  494. SetGenParms     PROC                                            ;@P1 begin
  495.  
  496.         test    [si].Flags, PVB_SEL_BIT ; 
  497.         .if     <z>                     ; Do not update PVB?
  498.             mov     [bp].PVB_Sel,0      ; do not use PVB selector
  499.         .endif                          ; 
  500.  
  501.         test    [si].Flags, LVB_SEL_BIT
  502.         .if     <nz>                    ; Update LVB?
  503.             mov     ax, [si].LogicalBufSel  ; yes, use LVB
  504.             mov     [bp].LVB_Sel,ax     ; save the LVB selector
  505.         .else
  506.             mov     [bp].LVB_Sel,0      ; do not use LVB selector
  507.         .endif
  508.  
  509.         cmp     word ptr es:[di].AttrFormat,WorldFMTATTR; Special format?
  510.         .if     <e>                     ;   Yes, use three byte attributes
  511.             mov     [bp].cellsize,WorldCellSize
  512.         .else
  513.             mov     [bp].cellsize,DefaultCellSize
  514.             cmp     ds:[si].ParmLength,LogicalBufSel+2
  515.             .if     <e>                 ; Everything US normal
  516.                 mov     ax,ds:[si].FuncIndex    ; write or read (not scroll)
  517.                 .if     <ax be I_ReadCellStr> or
  518.                 .if     <ax ae I_WrtCellStr> and
  519.                 .if     <ax be I_WrtNCell>
  520.                     stc
  521.                     jmp     short sgpx
  522.                 .endif
  523.             .endif
  524.         .endif
  525.  
  526.         cmp     ds:[si].ParmLength,LVBFormatID  ; Did the caller specify LVB info?
  527.         .if     <ae>                        ;   Yes, use callers information
  528.             mov     cx,ds:[si].LVBColOff    ; (cx) = left most column
  529.             mov     [bp].mincol,cx          ; store left most column
  530.             mov     dx,ds:[si].LVBWidth     ; (dx) = number of columns
  531.             mov     [bp].lvb_width,dx       ; store number of columns
  532.             add     cx,dx                   ; (cx) = right most column + 1
  533.             dec     cx                      ; (cx) = right most column
  534.             mov     [bp].maxcol,cx          ; store right most column
  535.             mov     ax,ds:[si].LVBRowOff    ; (ax) = top most row
  536.             mov     [bp].minrow,ax          ; store top most row
  537.             mov     dx,ds:[si].LVBHeight    ; (dx) = number of rows
  538.             mov     [bp].lvb_height,dx      ; store number of rows
  539.             add     ax,dx                   ; (ax) = bottom most row + 1
  540.             dec     ax                      ; (ax) = bottom most row
  541.             mov     [bp].maxrow,ax          ; store bottom most row
  542.             cmp     ds:[si].ParmLength,LVBAttrCount + 1 ; Is the parm present?
  543.             .if     <ae> and near           ;   Yes, attribute count is included
  544.             cmp     word ptr ds:[si].LVBFormatID,WorldFMTATTR   ; Special format?
  545.             .if     <e> near                ;   Yes, use three byte attributes
  546.                 mov     [bp].cellsize,WorldCellSize
  547.             .else
  548.                 mov     [bp].cellsize,DefaultCellSize
  549.             .endif
  550.         .else                               ; Use default screen group information
  551.             mov     [bp].mincol,0           ; store left most column
  552.             mov     cx,es:[di].TextCols     ; (ax) = number of columns
  553.             mov     [bp].lvb_width,cx       ; store number of columns
  554.             dec     cx                      ; (ax) = right most column
  555.             mov     [bp].maxcol,cx          ; store right most column
  556.             mov     [bp].minrow,0           ; store top most row
  557.             mov     ax,es:[di].TextRows     ; (ax) = number of rows
  558.             mov     [bp].lvb_height,ax      ; store number of rows
  559.             dec     ax                      ; (ax) = bottom most row
  560.             mov     [bp].maxrow,ax          ; store bottom most row
  561.         .endif
  562.  
  563.         clc
  564. sgpx:   ret
  565.  
  566. SetGenParms     ENDP                                            ;@P1 end
  567.  
  568. R2CSEG  ENDS
  569.         END
  570.  
  571.