home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 October / VPR9710A.ISO / BENCH / DJ1SRC_K / 105 / GRAPHICS.C < prev    next >
C/C++ Source or Header  |  1997-05-02  |  3KB  |  105 lines

  1. /* This is file GRAPHICS.C */
  2. /*
  3.    ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  4.    **
  5.    ** This file is distributed under the terms listed in the document
  6.    ** "copying.dj", available from DJ Delorie at the address above.
  7.    ** A copy of "copying.dj" should accompany this file; if not, a copy
  8.    ** should be available from where this file was obtained.  This file
  9.    ** may not be distributed without a verbatim copy of "copying.dj".
  10.    **
  11.    ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
  12.    ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13.  */
  14. /* 1997/05/01 modified by Kimio Itoh(kitoh@nn.iij4u.or.jp) 
  15.    for reduce binary size and for dead code elimination.
  16.  */
  17.  
  18. #pragma inline
  19.  
  20. /* History:42,23 */
  21. #include "build.h"
  22.  
  23. int gr_def_tw = 0;
  24. int gr_def_th = 0;
  25. int gr_def_gw = 0;
  26. int gr_def_gh = 0;
  27.  
  28. static far(*gr_init_func) ();
  29. static unsigned gr_paging_offset;
  30. unsigned gr_paging_segment;
  31. word32 gr_paging_func;
  32.  
  33. typedef struct {
  34.     word16 init_routine;
  35.     word16 paging_routine;
  36.     word16 split_rw;
  37.     word16 def_tw;
  38.     word16 def_th;
  39.     word16 def_gw;
  40.     word16 def_gh;
  41. } GR_DRIVER;
  42.  
  43. extern GR_DRIVER builtin_gr_driver;
  44. static GR_DRIVER *gr_driver;
  45.  
  46. void setup_graphics_driver(char *drv_name)
  47. {
  48.     int file;
  49.     struct stat sbuf;
  50.     if (stat(drv_name, &sbuf)) {
  51.         gr_driver = &builtin_gr_driver;
  52.     } else {
  53.         gr_driver = (GR_DRIVER *) malloc((size_t) sbuf.st_size + 16);
  54.         if (!gr_driver) {
  55.             gr_driver = &builtin_gr_driver;
  56.         } else {
  57.             gr_driver = (GR_DRIVER *) (((unsigned)gr_driver + 15) & ~15);
  58.             file = open(drv_name, O_RDONLY | O_BINARY);
  59.             read(file, gr_driver, (size_t) sbuf.st_size);
  60.             close(file);
  61.         }
  62.     }
  63.  
  64.     gr_paging_segment = _DS;
  65.     if (gr_driver != &builtin_gr_driver)
  66.         gr_paging_segment += (unsigned)gr_driver / 16;
  67.  
  68.     gr_init_func = MK_FP(gr_paging_segment, gr_driver->init_routine);
  69.     gr_paging_offset = gr_driver->paging_routine;
  70.     gr_paging_func = ((word32) g_grdr << 19) + gr_paging_offset;
  71.  
  72.     if (gr_def_tw)
  73.         gr_driver->def_tw = gr_def_tw;
  74.     if (gr_def_th)
  75.         gr_driver->def_th = gr_def_th;
  76.     if (gr_def_gw)
  77.         gr_driver->def_gw = gr_def_gw;
  78.     if (gr_def_gh)
  79.         gr_driver->def_gh = gr_def_gh;
  80. }
  81.  
  82. void graphics_mode(unsigned ax)
  83. {
  84.     unsigned bx, cx, dx;
  85.     bx = (unsigned)tss_ptr->tss_ebx;
  86.     cx = (unsigned)tss_ptr->tss_ecx;
  87.     dx = (unsigned)tss_ptr->tss_edx;
  88.     _AX = ax;
  89.     _CX = cx;
  90.     _DX = dx;
  91.     asm push ds;
  92.     asm push ds;
  93.     asm pop es;
  94.     asm push word ptr gr_init_func + 2;
  95.     asm pop ds;
  96.     asm call dword ptr es:[gr_init_func];
  97.     asm pop ds;
  98.     dx = _DX;
  99.     cx = _CX;
  100.     bx = gr_driver->split_rw;
  101.     tss_ptr->tss_ebx = bx;
  102.     tss_ptr->tss_ecx = cx;
  103.     tss_ptr->tss_edx = dx;
  104. }
  105.