home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / c / cl5sr386.zip / GO32 / GRAPHICS.C < prev    next >
C/C++ Source or Header  |  1992-04-13  |  4KB  |  181 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. #ifdef NONEWDRIVER
  39.  
  40. typedef struct {
  41.   word16 init_routine;
  42.   word16 paging_routine;
  43.   word16 split_rw;
  44.   word16 def_tw;
  45.   word16 def_th;
  46.   word16 def_gw;
  47.   word16 def_gh;
  48. } GR_DRIVER;
  49.  
  50. #else
  51.  
  52. #include <stdio.h>
  53. #include "driver.h"
  54.  
  55. int gr_def_numcolor = 0;
  56. static char new_driver = 0;
  57.  
  58. #define  init_routine   old.modeset_routine
  59. #define  paging_routine old.paging_routine
  60. #define  split_rw       old.driver_flags
  61. #define  def_tw         old.def_tw
  62. #define  def_th         old.def_th
  63. #define  def_gw         old.def_gw
  64. #define  def_gh         old.def_gh
  65.  
  66. #endif
  67.  
  68. extern GR_DRIVER builtin_gr_driver;
  69. GR_DRIVER *gr_driver;
  70.  
  71. void setup_graphics_driver(char *drv_name)
  72. {
  73.   int file;
  74.   struct stat sbuf;
  75.   if ((drv_name == NULL) || stat(drv_name, &sbuf))
  76.   {
  77.     gr_driver = &builtin_gr_driver;
  78.   }
  79.   else
  80.   {
  81.     gr_driver = (GR_DRIVER *)malloc(sbuf.st_size + 16);
  82.     if (gr_driver == 0)
  83.     {
  84.       gr_driver = &builtin_gr_driver;
  85.     }
  86.     else
  87.     {
  88.       gr_driver = (GR_DRIVER *)(((unsigned)gr_driver + 15) & ~15);
  89.       file = open(drv_name, O_RDONLY | O_BINARY);
  90.       read(file, gr_driver, sbuf.st_size);
  91.       close(file);
  92.     }
  93.   }
  94.  
  95.   if (gr_driver == &builtin_gr_driver)
  96.   {
  97.     gr_init_func = MK_FP(_DS, gr_driver->init_routine);
  98.     gr_paging_segment = _DS;
  99.     gr_paging_offset = gr_driver->paging_routine;
  100.   }
  101.   else
  102.   {
  103.     gr_init_func = MK_FP(_DS + (unsigned)gr_driver/16, gr_driver->init_routine);
  104.     gr_paging_segment = _DS + (unsigned)gr_driver/16;
  105.     gr_paging_offset = gr_driver->paging_routine;
  106.   }
  107.  
  108.   gr_paging_func = ((word32)g_grdr << 19) + gr_paging_offset;
  109.  
  110.   if (gr_def_tw) gr_driver->def_tw = gr_def_tw;
  111.   if (gr_def_th) gr_driver->def_th = gr_def_th;
  112.   if (gr_def_gw) gr_driver->def_gw = gr_def_gw;
  113.   if (gr_def_gh) gr_driver->def_gh = gr_def_gh;
  114. #ifndef NONEWDRIVER
  115.   if(gr_driver->new.driver_flags & GRD_NEW_DRIVER) {
  116.     void far (*init_fun)(void);
  117.  
  118.     new_driver = 1;
  119.     if(gr_def_numcolor) gr_driver->new.def_numcolor = gr_def_numcolor;
  120.     init_fun = MK_FP(FP_SEG(gr_init_func),gr_driver->new.driver_init_routine);
  121.     _AX = FP_SEG(init_fun);
  122.     asm push  ds;
  123.     asm mov   ds,ax;
  124.     asm call  dword ptr ss:[init_fun];
  125.     asm pop   ds;
  126.     if(_AX == 0) {
  127.       /* You may want to do something more appropriate here */
  128.       fputs("Graphics initialization error -- probably incorrect driver\n",stderr);
  129.       /* exit(1); */
  130.     }
  131.   }
  132.   else new_driver = 0;
  133. #endif
  134. }
  135.  
  136. void graphics_mode(int ax)
  137. {
  138.   int bx, cx, dx;
  139.   bx = tss_ptr->tss_ebx;
  140.   cx = tss_ptr->tss_ecx;
  141.   dx = tss_ptr->tss_edx;
  142.   _AX = ax;
  143.   _BX = bx;
  144.   _CX = cx;
  145.   _DX = dx;
  146.   asm push ds
  147.   asm push ds
  148.   asm pop es
  149.   asm push word ptr gr_init_func+2
  150.   asm pop ds
  151.   asm call dword ptr es:[gr_init_func]
  152.   asm pop ds
  153.   dx = _DX;
  154.   cx = _CX;
  155. #ifndef NONEWDRIVER
  156.   bx = _BX;
  157.   if(!new_driver)
  158. #endif
  159.   bx = gr_driver->split_rw;
  160.   tss_ptr->tss_ebx = bx;
  161.   tss_ptr->tss_ecx = cx;
  162.   tss_ptr->tss_edx = dx;
  163. }
  164.  
  165. #ifndef NONEWDRIVER
  166. void graphics_inquiry(void)
  167. {
  168.   tss_ptr->tss_ebx = gr_driver->old.driver_flags;
  169.   if(new_driver) {
  170.     word32 base = 0xe0000000L + ((word32)FP_SEG(gr_init_func) << 4);
  171.     tss_ptr->tss_ecx = base + gr_driver->new.text_table;
  172.     tss_ptr->tss_edx = base + gr_driver->new.graphics_table;
  173.   }
  174.   else {
  175.     tss_ptr->tss_ecx = 0L;
  176.     tss_ptr->tss_edx = 0L;
  177.   }
  178. }
  179. #endif
  180.  
  181.