home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / UUPC11XS.ZIP / LIB / SCRSIZE.C < prev    next >
C/C++ Source or Header  |  1992-12-18  |  5KB  |  130 lines

  1. /*--------------------------------------------------------------------*/
  2. /*    s c r s i z e .  c                                              */
  3. /*                                                                    */
  4. /*    Report screen size under MS-DOS                                 */
  5. /*                                                                    */
  6. /*    Copyright (c) 1992 by Kendra Electronic Wonderworks.            */
  7. /*    All rights reserved except those explicitly granted by          */
  8. /*    the UUPC/extended license.                                      */
  9. /*--------------------------------------------------------------------*/
  10.  
  11. /*
  12.  *    $Id: SCRSIZE.C 1.4 1992/12/18 12:05:57 ahd Exp $
  13.  *
  14.  *    $Log: SCRSIZE.C $
  15.  * Revision 1.4  1992/12/18  12:05:57  ahd
  16.  * Fix query for ANSI sys
  17.  *
  18.  * Revision 1.3  1992/12/11  12:45:11  ahd
  19.  * Use BIOS values if no ANSI driver
  20.  *
  21.  * Revision 1.2  1992/11/29  22:09:10  ahd
  22.  * Add stdlib.h for _osmajor under MSC
  23.  *
  24.  * Revision 1.1  1992/11/27  14:36:10  ahd
  25.  * Initial revision
  26.  *
  27.  */
  28.  
  29. /*--------------------------------------------------------------------*/
  30. /*                        System include files                        */
  31. /*--------------------------------------------------------------------*/
  32.  
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #include <dos.h>
  36.  
  37. /*--------------------------------------------------------------------*/
  38. /*                    UUPC/extended include files                     */
  39. /*--------------------------------------------------------------------*/
  40.  
  41. #include "lib.h"
  42. #include "scrsize.h"
  43.  
  44. /*--------------------------------------------------------------------*/
  45. /*    s c r s i z e                                                   */
  46. /*                                                                    */
  47. /*    Return screen size under MS-DOS 4.0 and 5.0                     */
  48. /*--------------------------------------------------------------------*/
  49.  
  50. short scrsize( void )
  51. {
  52.  
  53. #ifdef __TURBOC__
  54.    static unsigned far char *bios_rows = MK_FP( 0x0040, 0x0084 );
  55. /* static unsigned far char *bios_cols = MK_FP( 0x40, 0x4a ); */
  56. #else
  57.    static unsigned far char *bios_rows = 0x0484;
  58. #endif
  59.  
  60.    static boolean error = FALSE;
  61.    static short default_rows = 0;
  62.  
  63.    typedef struct _DISPLAYMODE   /* Page 310 MS-DOS 5.0 PGMR Reference */
  64.    {
  65.       char  dmInfoLevel;
  66.       char  dmReserved1;
  67.       short dmDataLength;
  68.       short dmFlags;
  69.       char  dmMode;
  70.       char  dmReserved2;
  71.       short dmColors;
  72.       short dmWidth;
  73.       short dmLength;
  74.       short dmColumns;
  75.       short dmRows;
  76.  
  77.    } DISPLAYMODE;
  78.  
  79.    DISPLAYMODE info;
  80.  
  81.    union REGS regs;
  82.  
  83. /*--------------------------------------------------------------------*/
  84. /*            If an old version of DOS, return stock size             */
  85. /*--------------------------------------------------------------------*/
  86.  
  87.    if ((_osmajor < 4) || error )
  88.       return (short) (default_rows ? default_rows : *bios_rows);
  89.                                  /* Faster, but not well documented  */
  90.  
  91. /*--------------------------------------------------------------------*/
  92. /*             Fill in information to perform processing              */
  93. /*--------------------------------------------------------------------*/
  94.  
  95.    info.dmInfoLevel   = 0;       /* Magic number in book          */
  96.    info.dmReserved1   = 0;       /* Magic number in book          */
  97.    info.dmReserved2   = 0;       /* Magic number in book          */
  98.    info.dmDataLength  = 14;      /* Magic number in book          */
  99.  
  100.    regs.x.bx = 0x0001;           /* STDOUT file handle            */
  101.    regs.h.ch = 0x03;             /* Screen device category        */
  102.    regs.h.cl = 0x7f;             /* Get display mode              */
  103.    regs.x.ax = 0x440c;           /* Video Status                  */
  104.    regs.x.dx = (short) &info;    /* Address of structure          */
  105.  
  106.    intdos(®s, ®s );
  107.  
  108. /*--------------------------------------------------------------------*/
  109. /*    If we have an error, set up to use the BIOS information (or     */
  110. /*    a fixed default) on future calls.  Otherwise, return the        */
  111. /*    ANSI supplied value.                                            */
  112. /*--------------------------------------------------------------------*/
  113.  
  114.    if ( regs.x.cflag )
  115.    {
  116.       if ((*bios_rows < 20 ) || (*bios_rows > 99)) /* Sanity check   */
  117.          default_rows = 24;
  118.  
  119.       printmsg(2,"DOS error %d retrieving screen size, using BIOS value %d",
  120.                   (int) regs.x.ax,
  121.                   (short) (default_rows ? default_rows : *bios_rows ));
  122.       error = TRUE;
  123.       return (short) (default_rows ? default_rows : *bios_rows);
  124.                                  /* Faster, but not well documented  */
  125.    }
  126.    else
  127.       return info.dmRows;
  128.  
  129. } /* scrsize */
  130.