home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 359_11 / patch5.000 / GO32 / GRAPHICS.C < prev    next >
C/C++ Source or Header  |  1991-09-11  |  3KB  |  119 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.  
  15. #pragma inline
  16.  
  17. /* History:42,23 */
  18. #include <dos.h>
  19. #include <fcntl.h>
  20. #include <sys/stat.h>
  21. #include "build.h"
  22. #include "types.h"
  23. #include "paging.h"
  24. #include "graphics.h"
  25. #include "tss.h"
  26. #include "gdt.h"
  27.  
  28. int gr_def_tw = 0;
  29. int gr_def_th = 0;
  30. int gr_def_gw = 0;
  31. int gr_def_gh = 0;
  32.  
  33. far (*gr_init_func)();
  34. unsigned gr_paging_offset;
  35. unsigned gr_paging_segment;
  36. word32 gr_paging_func;
  37.  
  38. typedef struct {
  39.   word16 init_routine;
  40.   word16 paging_routine;
  41.   word16 split_rw;
  42.   word16 def_tw;
  43.   word16 def_th;
  44.   word16 def_gw;
  45.   word16 def_gh;
  46. } GR_DRIVER;
  47.  
  48. extern GR_DRIVER builtin_gr_driver;
  49. GR_DRIVER *gr_driver;
  50.  
  51. void setup_graphics_driver(char *drv_name)
  52. {
  53.   int file;
  54.   struct stat sbuf;
  55.   if (stat(drv_name, &sbuf))
  56.   {
  57.     gr_driver = &builtin_gr_driver;
  58.   }
  59.   else
  60.   {
  61.     gr_driver = (GR_DRIVER *)malloc(sbuf.st_size + 16);
  62.     if (gr_driver == 0)
  63.     {
  64.       gr_driver = &builtin_gr_driver;
  65.     }
  66.     else
  67.     {
  68.       gr_driver = (GR_DRIVER *)(((unsigned)gr_driver + 15) & ~15);
  69.       file = open(drv_name, O_RDONLY | O_BINARY);
  70.       read(file, gr_driver, sbuf.st_size);
  71.       close(file);
  72.     }
  73.   }
  74.  
  75.   if (gr_driver == &builtin_gr_driver)
  76.   {
  77.     gr_init_func = MK_FP(_DS, gr_driver->init_routine);
  78.     gr_paging_segment = _DS;
  79.     gr_paging_offset = gr_driver->paging_routine;
  80.   }
  81.   else
  82.   {
  83.     gr_init_func = MK_FP(_DS + (unsigned)gr_driver/16, gr_driver->init_routine);
  84.     gr_paging_segment = _DS + (unsigned)gr_driver/16;
  85.     gr_paging_offset = gr_driver->paging_routine;
  86.   }
  87.  
  88.   gr_paging_func = ((word32)g_grdr << 19) + gr_paging_offset;
  89.  
  90.   if (gr_def_tw) gr_driver->def_tw = gr_def_tw;
  91.   if (gr_def_th) gr_driver->def_th = gr_def_th;
  92.   if (gr_def_gw) gr_driver->def_gw = gr_def_gw;
  93.   if (gr_def_gh) gr_driver->def_gh = gr_def_gh;
  94. }
  95.  
  96. void graphics_mode(int ax)
  97. {
  98.   int bx, cx, dx;
  99.   bx = tss_ptr->tss_ebx;
  100.   cx = tss_ptr->tss_ecx;
  101.   dx = tss_ptr->tss_edx;
  102.   _AX = ax;
  103.   _CX = cx;
  104.   _DX = dx;
  105.   asm push ds
  106.   asm push ds
  107.   asm pop es
  108.   asm push word ptr gr_init_func+2
  109.   asm pop ds
  110.   asm call dword ptr es:[gr_init_func]
  111.   asm pop ds
  112.   dx = _DX;
  113.   cx = _CX;
  114.   bx = gr_driver->split_rw;
  115.   tss_ptr->tss_ebx = bx;
  116.   tss_ptr->tss_ecx = cx;
  117.   tss_ptr->tss_edx = dx;
  118. }
  119.