17dd7cddfSDavid du Colombier /* Copyright (C) 1989, 1995 Aladdin Enterprises. All rights reserved.
27dd7cddfSDavid du Colombier
3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier implied.
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier
10*593dc095SDavid du Colombier For more information about licensing, please refer to
11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
17*593dc095SDavid du Colombier /* $Id: gdevpcfb.h,v 1.5 2002/06/16 07:25:26 lpd Exp $ */
187dd7cddfSDavid du Colombier /* IBM PC frame buffer definitions */
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier #ifndef gdevpcfb_INCLUDED
217dd7cddfSDavid du Colombier # define gdevpcfb_INCLUDED
227dd7cddfSDavid du Colombier
237dd7cddfSDavid du Colombier #ifdef __MSDOS__
247dd7cddfSDavid du Colombier # include "dos_.h"
257dd7cddfSDavid du Colombier typedef union REGS registers;
267dd7cddfSDavid du Colombier
277dd7cddfSDavid du Colombier #endif
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier /* For testing, the 16-color display may be defined as a monochrome, */
307dd7cddfSDavid du Colombier /* 8-color, or 16-color device. */
317dd7cddfSDavid du Colombier #define ega_bits_of_color 2 /* 0, 1, or 2 */
327dd7cddfSDavid du Colombier #define rgb_max ega_bits_of_color
337dd7cddfSDavid du Colombier
347dd7cddfSDavid du Colombier /* Define the short (integer) version of "transparent" color. */
357dd7cddfSDavid du Colombier /* ****** Depends on gx_no_color_index being all 1's. ***** */
367dd7cddfSDavid du Colombier #define no_color ((int)gx_no_color_index)
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier /* Procedures */
397dd7cddfSDavid du Colombier
407dd7cddfSDavid du Colombier /* See gxdevice.h for the definitions of the procedures. */
417dd7cddfSDavid du Colombier
427dd7cddfSDavid du Colombier dev_proc_open_device(ega_open);
437dd7cddfSDavid du Colombier dev_proc_close_device(ega_close);
447dd7cddfSDavid du Colombier dev_proc_fill_rectangle(ega_fill_rectangle);
457dd7cddfSDavid du Colombier dev_proc_tile_rectangle(ega_tile_rectangle);
467dd7cddfSDavid du Colombier dev_proc_copy_mono(ega_copy_mono);
477dd7cddfSDavid du Colombier dev_proc_copy_color(ega_copy_color);
487dd7cddfSDavid du Colombier dev_proc_get_bits(ega_get_bits);
497dd7cddfSDavid du Colombier
507dd7cddfSDavid du Colombier /* Structure for saving state of BIOS variables. */
517dd7cddfSDavid du Colombier typedef struct pcfb_bios_state_s {
527dd7cddfSDavid du Colombier int display_mode; /* must be first, see pcfb_save_state */
537dd7cddfSDavid du Colombier /* in gdevpcfb.c */
547dd7cddfSDavid du Colombier byte text_page;
557dd7cddfSDavid du Colombier uint text_cursor_mode;
567dd7cddfSDavid du Colombier uint text_font;
577dd7cddfSDavid du Colombier byte text_attribute;
587dd7cddfSDavid du Colombier byte border_color;
597dd7cddfSDavid du Colombier } pcfb_bios_state;
607dd7cddfSDavid du Colombier
617dd7cddfSDavid du Colombier /* Procedures used by gdevpcfb.c */
62*593dc095SDavid du Colombier void pcfb_set_signals(gx_device *);
63*593dc095SDavid du Colombier void pcfb_get_state(pcfb_bios_state *);
64*593dc095SDavid du Colombier void pcfb_set_mode(int);
65*593dc095SDavid du Colombier void pcfb_set_state(const pcfb_bios_state *);
667dd7cddfSDavid du Colombier
677dd7cddfSDavid du Colombier /* Types for frame buffer pointers. */
687dd7cddfSDavid du Colombier typedef byte *fb_ptr;
697dd7cddfSDavid du Colombier typedef volatile byte *volatile_fb_ptr;
707dd7cddfSDavid du Colombier
717dd7cddfSDavid du Colombier /* Define the nominal page height in inches. */
727dd7cddfSDavid du Colombier #ifdef A4
737dd7cddfSDavid du Colombier # define PAGE_HEIGHT_INCHES 11.69
747dd7cddfSDavid du Colombier #else
757dd7cddfSDavid du Colombier # define PAGE_HEIGHT_INCHES 11.0
767dd7cddfSDavid du Colombier #endif
777dd7cddfSDavid du Colombier
787dd7cddfSDavid du Colombier /* The device descriptor */
797dd7cddfSDavid du Colombier typedef struct gx_device_ega_s gx_device_ega;
807dd7cddfSDavid du Colombier struct gx_device_ega_s {
817dd7cddfSDavid du Colombier gx_device_common;
827dd7cddfSDavid du Colombier int raster; /* frame buffer bytes per line */
837dd7cddfSDavid du Colombier int fb_seg_mult; /* multiplier for segment part */
847dd7cddfSDavid du Colombier /* of frame buffer pointer */
857dd7cddfSDavid du Colombier int fb_byte_mult; /* multiplier for word part ditto */
867dd7cddfSDavid du Colombier #define mk_fb_ptr(x, y)\
877dd7cddfSDavid du Colombier (fb_dev->fb_byte_mult == 0 ?\
887dd7cddfSDavid du Colombier (fb_ptr)MK_PTR(regen + (y) * (fb_dev->fb_seg_mult), (x) >> 3) :\
897dd7cddfSDavid du Colombier (fb_ptr)MK_PTR(regen + ((y) >> 4) * (fb_dev->fb_seg_mult),\
907dd7cddfSDavid du Colombier (((y) & 15) * fb_dev->fb_byte_mult) + ((x) >> 3)))
917dd7cddfSDavid du Colombier int video_mode;
927dd7cddfSDavid du Colombier };
937dd7cddfSDavid du Colombier
947dd7cddfSDavid du Colombier /* Macro for creating instances */
957dd7cddfSDavid du Colombier /* The initial parameters map an appropriate fraction of */
967dd7cddfSDavid du Colombier /* the screen to a full-page coordinate space. */
977dd7cddfSDavid du Colombier /* This may or may not be what is desired! */
987dd7cddfSDavid du Colombier #define ega_device(dev_name, procs, fb_raster, screen_height, aspect_ratio, video_mode)\
997dd7cddfSDavid du Colombier { std_device_dci_body(gx_device_ega, &procs, dev_name,\
1007dd7cddfSDavid du Colombier fb_raster * 8, screen_height,\
1017dd7cddfSDavid du Colombier (screen_height * (aspect_ratio)) / PAGE_HEIGHT_INCHES, /* x dpi */\
1027dd7cddfSDavid du Colombier screen_height / PAGE_HEIGHT_INCHES, /* y dpi */\
1037dd7cddfSDavid du Colombier (rgb_max ? 3 : 1), /* num_components */\
1047dd7cddfSDavid du Colombier 4, /* depth */\
1057dd7cddfSDavid du Colombier (rgb_max ? rgb_max : 1), /* max_gray */\
1067dd7cddfSDavid du Colombier rgb_max,\
1077dd7cddfSDavid du Colombier (rgb_max ? rgb_max + 1 : 2), /* dither_grays */\
1087dd7cddfSDavid du Colombier (rgb_max ? rgb_max + 1 : 0) /* dither_colors */\
1097dd7cddfSDavid du Colombier ),\
1107dd7cddfSDavid du Colombier { 0 }, /* std_procs */\
1117dd7cddfSDavid du Colombier fb_raster,\
1127dd7cddfSDavid du Colombier (fb_raster & 15 ? fb_raster : fb_raster >> 4),\
1137dd7cddfSDavid du Colombier (fb_raster & 15 ? fb_raster : 0),\
1147dd7cddfSDavid du Colombier video_mode\
1157dd7cddfSDavid du Colombier }
1167dd7cddfSDavid du Colombier
1177dd7cddfSDavid du Colombier /* Define the device port and register numbers, and the regen map base */
1187dd7cddfSDavid du Colombier #define seq_addr 0x3c4
1197dd7cddfSDavid du Colombier #define s_map 2
1207dd7cddfSDavid du Colombier #define set_s_map(mask) outport2(seq_addr, s_map, mask)
1217dd7cddfSDavid du Colombier #define graph_addr 0x3ce
1227dd7cddfSDavid du Colombier #define g_const 0 /* set/reset */
1237dd7cddfSDavid du Colombier #define set_g_const(color) outport2(graph_addr, g_const, color)
1247dd7cddfSDavid du Colombier #define g_const_map 1 /* enable set/reset */
1257dd7cddfSDavid du Colombier #define set_g_const_map(map) outport2(graph_addr, g_const_map, map)
1267dd7cddfSDavid du Colombier #define g_function 3
1277dd7cddfSDavid du Colombier # define gf_WRITE 0
1287dd7cddfSDavid du Colombier # define gf_AND 8
1297dd7cddfSDavid du Colombier # define gf_OR 0x10
1307dd7cddfSDavid du Colombier # define gf_XOR 0x18
1317dd7cddfSDavid du Colombier #define set_g_function(func) outport2(graph_addr, g_function, func)
1327dd7cddfSDavid du Colombier #define g_read_plane 4
1337dd7cddfSDavid du Colombier #define set_g_read_plane(plane) outport2(graph_addr, g_read_plane, plane)
1347dd7cddfSDavid du Colombier #define g_mode 5
1357dd7cddfSDavid du Colombier # define gm_DATA 0
1367dd7cddfSDavid du Colombier # define gm_FILL 2
1377dd7cddfSDavid du Colombier #define set_g_mode(mode) outport2(graph_addr, g_mode, mode)
1387dd7cddfSDavid du Colombier #define g_mask 8
1397dd7cddfSDavid du Colombier #define set_g_mask(mask) outport2(graph_addr, g_mask, mask)
1407dd7cddfSDavid du Colombier #define select_g_mask() outportb(graph_addr, g_mask)
1417dd7cddfSDavid du Colombier #define out_g_mask(mask) outportb(graph_addr+1, mask)
1427dd7cddfSDavid du Colombier #define regen 0xa000
1437dd7cddfSDavid du Colombier
1447dd7cddfSDavid du Colombier /* Define access to the frame buffer and the video registers */
1457dd7cddfSDavid du Colombier /* according to whether we are on a DOS system or a Unix system. */
1467dd7cddfSDavid du Colombier
1477dd7cddfSDavid du Colombier #if defined(M_UNIX) || defined(M_XENIX) || defined(UNIX) || defined(SYSV) || defined(__linux__)
1487dd7cddfSDavid du Colombier
1497dd7cddfSDavid du Colombier /* SCO Unix/Xenix, AT&T SVR4, or Linux. */
1507dd7cddfSDavid du Colombier
1517dd7cddfSDavid du Colombier #undef outportb
1527dd7cddfSDavid du Colombier
1537dd7cddfSDavid du Colombier #if defined(__GNUC__)
1547dd7cddfSDavid du Colombier /* Inline assembly version for gcc */
1557dd7cddfSDavid du Colombier /* Under SCO, requires installing the gnu assembler as "as" */
1567dd7cddfSDavid du Colombier static inline void
outportb(int port,int data)1577dd7cddfSDavid du Colombier outportb(int port, int data)
1587dd7cddfSDavid du Colombier {
1597dd7cddfSDavid du Colombier __asm__ volatile ("outb %0,%1"::
1607dd7cddfSDavid du Colombier "a" ((unsigned char)data),
1617dd7cddfSDavid du Colombier "d" ((unsigned short)port));
1627dd7cddfSDavid du Colombier }
1637dd7cddfSDavid du Colombier static inline void
outport2(int port,int index,int data)1647dd7cddfSDavid du Colombier outport2(int port, int index, int data)
1657dd7cddfSDavid du Colombier {
1667dd7cddfSDavid du Colombier __asm__ volatile ("movb %0,%%ah; movb %1,%%al; outw %%ax,%2"::
1677dd7cddfSDavid du Colombier "qmi" ((unsigned char)data),
1687dd7cddfSDavid du Colombier "qmi" ((unsigned char)index),
1697dd7cddfSDavid du Colombier "d" ((unsigned short)port):
1707dd7cddfSDavid du Colombier "eax");
1717dd7cddfSDavid du Colombier }
1727dd7cddfSDavid du Colombier #else
173*593dc095SDavid du Colombier void outportb(uint, byte);
174*593dc095SDavid du Colombier void outport2(uint, byte, byte);
1757dd7cddfSDavid du Colombier
1767dd7cddfSDavid du Colombier #endif
1777dd7cddfSDavid du Colombier
1787dd7cddfSDavid du Colombier /* Redefine mk_fb_ptr -- no segmented addressing. */
1797dd7cddfSDavid du Colombier
1807dd7cddfSDavid du Colombier #undef mk_fb_ptr
1817dd7cddfSDavid du Colombier extern fb_ptr fb_addr;
1827dd7cddfSDavid du Colombier
1837dd7cddfSDavid du Colombier #define mk_fb_ptr(x, y) (fb_addr + (y) * (fb_dev->raster) + ((x) >> 3))
1847dd7cddfSDavid du Colombier
1857dd7cddfSDavid du Colombier #else
1867dd7cddfSDavid du Colombier
1877dd7cddfSDavid du Colombier /* MS-DOS */
1887dd7cddfSDavid du Colombier
1897dd7cddfSDavid du Colombier /* outportb is defined in dos_.h */
1907dd7cddfSDavid du Colombier #define outport2(port, index, data)\
1917dd7cddfSDavid du Colombier (outportb(port, index), outportb((port)+1, data))
1927dd7cddfSDavid du Colombier
1937dd7cddfSDavid du Colombier #endif
1947dd7cddfSDavid du Colombier
1957dd7cddfSDavid du Colombier /* Fetch and discard a byte. Prevent the compiler from */
1967dd7cddfSDavid du Colombier /* optimizing this away. */
1977dd7cddfSDavid du Colombier static unsigned char byte_discard_;
1987dd7cddfSDavid du Colombier
1997dd7cddfSDavid du Colombier #define byte_discard(expr) byte_discard_ = (expr)
2007dd7cddfSDavid du Colombier
2017dd7cddfSDavid du Colombier #endif /* gdevpcfb_INCLUDED */
202