home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / DVIDEO.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  6KB  |  170 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*----------------------------[ dvideo.c ]-----------------------------*/
  4. /*                     Hardware Interface Routines                     */
  5. /*---------------------------------------------------------------------*/
  6.  
  7. /*---------------------------------------------------------------------*/
  8. /* This code is a subset of a library copyrighted by Jeff Dunlop.      */
  9. /* License is hereby granted for unrestricted use.                     */
  10. /*---------------------------------------------------------------------*/
  11.  
  12. /*---------------------------------------------------------------------*/
  13. /* dv_info: get video and version info about DesqView                  */
  14. /* get_rows: determine number of rows on screen                        */
  15. /* get_cols: determine number of columns on screen                     */
  16. /* get_vidpage: determine the current text mode video page             */
  17. /* get_vidbase: determine the base of video ram                        */
  18. /* is_dv: determine if DesqView is loaded                              */
  19. /* is_egavga: determine if monitor is ega/vga                          */
  20. /*---------------------------------------------------------------------*/
  21.  
  22. /*--------------------------------------------------------------*/
  23. /*-----------------------[ include files ]----------------------*/
  24. /*--------------------------------------------------------------*/
  25.  
  26. #include <dos.h>
  27. #include "dvideo.h"
  28. #include "mk_fp.h"
  29.  
  30. /*------------------------[ get_vidpage ]-----------------------*/
  31. /* Determine the current text mode video page                   */
  32. /*--------------------------------------------------------------*/
  33. /* local:                                                       */
  34. /*      regs = register storage buffer                          */
  35. /* return:                                                      */
  36. /*      video page number as determined by bios call            */
  37. /*--------------------------------------------------------------*/
  38.  
  39. unsigned char get_vidpage(void)
  40. {
  41.     union REGS regs;
  42.  
  43.     regs.h.ah = 0x0f;
  44.     int86(0x10, ®s, ®s);
  45.     return regs.h.bh;
  46. }
  47.  
  48. /*---------------------------[ is_dv ]--------------------------*/
  49. /*             Determine whether DesqView is active             */
  50. /*--------------------------------------------------------------*/
  51.  
  52. int is_dv(void)
  53. {
  54.     union REGS regs;
  55.  
  56.     regs.h.ah = 0x2b;
  57.     regs.x.cx = 0x4445;         /* 'DE' */
  58.     regs.x.dx = 0x5351;         /* 'SQ' */
  59.     regs.h.al = 1;              /* get version */
  60.     int86(0x21, ®s, ®s);
  61.  
  62.     return regs.h.al != 0xff;
  63. }
  64.  
  65. /*--------------------------[ dv_info ]-------------------------*/
  66. /*      Return screen and version info about DesqView           */
  67. /*--------------------------------------------------------------*/
  68. /* return:                                                      */
  69. /*      -1 on error                                             */
  70. /*--------------------------------------------------------------*/
  71.  
  72. int get_dvinfo(DV_INFO *dv_info)
  73. {
  74.     union REGS regs;
  75.  
  76.     regs.h.ah = 0x2b;
  77.     regs.x.cx = 0x4445;         /* 'DE' */
  78.     regs.x.dx = 0x5351;         /* 'SQ' */
  79.     regs.h.al = 1;              /* get version */
  80.     int86(0x21, ®s, ®s);
  81.  
  82.     if (regs.h.al == 0xff)
  83.         return -1;
  84.     dv_info->ver_major = regs.h.bh;
  85.     dv_info->ver_minor = regs.h.bl;
  86.     regs.h.al = 4;              /* get screen info */
  87.     int86(0x21, ®s, ®s);
  88.  
  89.     if (regs.h.al == 0xff)
  90.         return -1;
  91.     dv_info->regen_buf = regs.x.dx;
  92.     dv_info->win_rows = regs.h.bh;
  93.     dv_info->win_cols = regs.h.bl;
  94.     return 0;
  95. }
  96.  
  97. /*------------------------[ get_vidbase ]-----------------------*/
  98. /* Determine the base of video ram                              */
  99. /*--------------------------------------------------------------*/
  100. /* local:                                                       */
  101. /*      regs = register union for ISR                           */
  102. /* return:                                                      */
  103. /*      the current text base segment                           */
  104. /*--------------------------------------------------------------*/
  105.  
  106. unsigned get_vidbase(void)
  107. {
  108.     union REGS regs;
  109.     DV_INFO dv_info;
  110.  
  111.     if (is_dv() && get_dvinfo(&dv_info) != -1)
  112.         return dv_info.regen_buf;
  113.     else
  114.     {
  115.         regs.h.ah = 0xf;
  116.         int86(0x10, ®s, ®s);
  117.  
  118.         if (regs.h.al == 7)
  119.             return 0xb000;
  120.         else
  121.             return 0xb800;
  122.     }
  123. }
  124.  
  125. /*-------------------------[ get_rows ]-------------------------*/
  126. /*  Determine the number of rows in current text mode screen    */
  127. /*--------------------------------------------------------------*/
  128.  
  129. int get_rows(void)
  130. {
  131.     DV_INFO dv_info;
  132.     char far *p = MK_FP(0x40, 0x84);
  133.  
  134.     if (is_dv() && get_dvinfo(&dv_info) != -1)
  135.         return dv_info.win_rows;
  136.     else
  137.         return *p + is_egavga();
  138. }
  139.  
  140. /*-------------------------[ get_cols ]-------------------------*/
  141. /*  Determine the number of columns in current text screen      */
  142. /*--------------------------------------------------------------*/
  143.  
  144. int get_cols(void)
  145. {
  146.     DV_INFO dv_info;
  147.     int far *p = MK_FP(0x40, 0x4a);
  148.  
  149.     if (is_dv() && get_dvinfo(&dv_info) != -1)
  150.         return dv_info.win_cols;
  151.     else
  152.         return *p;
  153. }
  154.  
  155. /*-------------------------[ is_egavga ]------------------------*/
  156. /*      Determine whether the current text mode is ega/vga      */
  157. /*--------------------------------------------------------------*/
  158.  
  159. int is_egavga(void)
  160. {
  161.     union REGS regs;
  162.  
  163.     regs.h.ah = 0x1a;
  164.     regs.h.al = 0;
  165.  
  166.     int86(0x10, ®s, ®s);
  167.  
  168.     return regs.h.al == 0x1a;
  169. }
  170.