51
51
static gx_device_procs pe_procs =
53
NULL, /* get_initial_matrix */
54
NULL, /* sync_output */
55
NULL, /* output_page */
57
NULL, /* map_rgb_color */
58
NULL, /* map_color_rgb */
60
NULL, /* tile_rectangle */
53
NULL, /* get_initial_matrix */
54
NULL, /* sync_output */
55
NULL, /* output_page */
57
NULL, /* map_rgb_color */
58
NULL, /* map_color_rgb */
60
NULL, /* tile_rectangle */
65
gx_device_pe far_data gs_pe_device =
65
gx_device_pe far_data gs_pe_device =
66
66
{ std_device_std_body(gx_device_pe, &pe_procs, "pe",
67
XSIZE, YSIZE, XPPI, YPPI),
68
{ 0 }, /* std_procs */
69
DEFAULT_ADDRESS, DEFAULT_REGISTERS
67
XSIZE, YSIZE, XPPI, YPPI),
68
{ 0 }, /* std_procs */
69
DEFAULT_ADDRESS, DEFAULT_REGISTERS
72
72
static regval peinit[] = {{0x04, 0x1e}, {0x05, 0x00},
73
{0x04, 0x0c}, {0x05, 0x21},
74
{0x04, 0x0d}, {0x05, 0x98},
75
{0x08, 0x00}, {0x08, 0x1e},
76
{0x04, 0x1e}, {0x05, 0x01}};
73
{0x04, 0x0c}, {0x05, 0x21},
74
{0x04, 0x0d}, {0x05, 0x98},
75
{0x08, 0x00}, {0x08, 0x1e},
76
{0x04, 0x1e}, {0x05, 0x01}};
78
78
static regval pedone[] = {{0x04, 0x1e}, {0x05, 0x10},
79
{0x04, 0x0a}, {0x05, 0x00},
80
{0x04, 0x0b}, {0x05, 0x07},
81
{0x04, 0x0c}, {0x05, 0x00},
82
{0x04, 0x0d}, {0x05, 0x00},
83
{0x04, 0x0e}, {0x05, 0x00},
84
{0x04, 0x0f}, {0x05, 0x00},
85
{0x08, 0x00}, {0x08, 0x29}};
79
{0x04, 0x0a}, {0x05, 0x00},
80
{0x04, 0x0b}, {0x05, 0x07},
81
{0x04, 0x0c}, {0x05, 0x00},
82
{0x04, 0x0d}, {0x05, 0x00},
83
{0x04, 0x0e}, {0x05, 0x00},
84
{0x04, 0x0f}, {0x05, 0x00},
85
{0x08, 0x00}, {0x08, 0x29}};
87
87
int pe_open(gx_device *dev)
92
if ((str = getenv("PEFBADDR")) != 0)
94
if (!sscanf(str, "%lx", &(pedev->fbaddr)))
92
if ((str = getenv("PEFBADDR")) != 0)
94
if (!sscanf(str, "%lx", &(pedev->fbaddr)))
97
97
"Private Eye: PEFBADDR environment string format error\n");
102
if ((str = getenv("PEREGS")) != 0)
104
if (!sscanf(str, "%x", &(pedev->regs)))
106
emprintf(dev->memory,
102
if ((str = getenv("PEREGS")) != 0)
104
if (!sscanf(str, "%x", &(pedev->regs)))
106
emprintf(dev->memory,
107
107
"Private Eye: PEREGS environment string format error\n");
112
for (i = 0; i < 10; i++)
113
outportb(pedev->regs + peinit[i].reg, peinit[i].val);
112
for (i = 0; i < 10; i++)
113
outportb(pedev->regs + peinit[i].reg, peinit[i].val);
118
118
int pe_close(gx_device *dev)
122
/* restore the screen */
123
for (i = 0; i < 16; i++)
124
outportb(pedev->regs + pedone[i].reg, pedone[i].val);
126
/* clear the frame buffer */
127
memset(pedev->fbaddr, 0, 4000);
122
/* restore the screen */
123
for (i = 0; i < 16; i++)
124
outportb(pedev->regs + pedone[i].reg, pedone[i].val);
126
/* clear the frame buffer */
127
memset(pedev->fbaddr, 0, 4000);
132
132
int pe_fill_rectangle(gx_device *dev, int x1, int y1, int w, int h,
133
133
gx_color_index color)
141
if ((w <= 0) || (h <= 0) || (x1 > XSIZE) || (y1 > YSIZE))
149
if ((x2 < 0) || (y2 < 0))
155
if (x2 > XSIZE-1) x2 = XSIZE-1;
157
if (y2 > YSIZE-1) y2 = YSIZE-1;
161
xlen = (x2 >> 3) - (x1 >> 3) - 1;
162
led = 0xff >> (x1 & 7);
163
red = 0xff << (7 - (x2 & 7));
165
ptr = pedev->fbaddr + (y1 * BPL) + (x1 >> 3);
169
/* here to set pixels */
173
/* special for rectangles that fit in a byte */
176
for(; h >= 0; h--, ptr += BPL)
183
for(; h >= 0; h--, ptr += BPL)
184
{ register int x = xlen;
185
register byte *p = ptr;
187
while ( x-- ) *p++ = 0xff;
192
/* here to clear pixels */
199
/* special for rectangles that fit in a byte */
202
for(; h >= 0; h--, ptr += BPL)
209
for(; h >= 0; h--, ptr += BPL)
210
{ register int x = xlen;
211
register byte *p = ptr;
213
while ( x-- ) *p++ = 0x00;
141
if ((w <= 0) || (h <= 0) || (x1 > XSIZE) || (y1 > YSIZE))
149
if ((x2 < 0) || (y2 < 0))
155
if (x2 > XSIZE-1) x2 = XSIZE-1;
157
if (y2 > YSIZE-1) y2 = YSIZE-1;
161
xlen = (x2 >> 3) - (x1 >> 3) - 1;
162
led = 0xff >> (x1 & 7);
163
red = 0xff << (7 - (x2 & 7));
165
ptr = pedev->fbaddr + (y1 * BPL) + (x1 >> 3);
169
/* here to set pixels */
173
/* special for rectangles that fit in a byte */
176
for(; h >= 0; h--, ptr += BPL)
183
for(; h >= 0; h--, ptr += BPL)
184
{ register int x = xlen;
185
register byte *p = ptr;
187
while ( x-- ) *p++ = 0xff;
192
/* here to clear pixels */
199
/* special for rectangles that fit in a byte */
202
for(; h >= 0; h--, ptr += BPL)
209
for(; h >= 0; h--, ptr += BPL)
210
{ register int x = xlen;
211
register byte *p = ptr;
213
while ( x-- ) *p++ = 0x00;
219
219
int pe_copy_mono(gx_device *dev,
220
const byte *base, int sourcex, int raster, gx_bitmap_id id,
221
int x, int y, int w, int h,
222
gx_color_index zero, gx_color_index one)
220
const byte *base, int sourcex, int raster, gx_bitmap_id id,
221
int x, int y, int w, int h,
222
gx_color_index zero, gx_color_index one)
227
int invert, zmask, omask;
227
int invert, zmask, omask;
231
231
#define izero (int)zero
232
232
#define ione (int)one
234
234
if ( ione == izero ) /* vacuous case */
235
return pe_fill_rectangle(dev, x, y, w, h, zero);
239
if ((x > XSIZE) || (y > YSIZE) || ((x + w) < 0) || ((y + h) < 0))
243
dest = pedev->fbaddr + (y * BPL) + offset;
244
line = base + (sourcex >> 3);
245
sleft = 8 - (sourcex & 7);
247
mask = 0xff >> (8 - dleft);
251
rmask = 0xff00 >> ((w - dleft) & 7);
253
/* Macros for writing partial bytes. */
254
/* bits has already been inverted by xor'ing with invert. */
235
return pe_fill_rectangle(dev, x, y, w, h, zero);
239
if ((x > XSIZE) || (y > YSIZE) || ((x + w) < 0) || ((y + h) < 0))
243
dest = pedev->fbaddr + (y * BPL) + offset;
244
line = base + (sourcex >> 3);
245
sleft = 8 - (sourcex & 7);
247
mask = 0xff >> (8 - dleft);
251
rmask = 0xff00 >> ((w - dleft) & 7);
253
/* Macros for writing partial bytes. */
254
/* bits has already been inverted by xor'ing with invert. */
256
256
#define write_byte_masked(ptr, bits, mask)\
257
257
*ptr = ((bits | ~mask | zmask) & *ptr | (bits & mask & omask))
260
260
*ptr = ((bits | zmask) & *ptr | (bits & omask))
262
262
/* if ( dev->invert )
264
if ( izero != (int)gx_no_color_index ) zero ^= 1;
265
if ( ione != (int)gx_no_color_index ) one ^= 1;
267
invert = (izero == 1 || ione == 0 ? -1 : 0);
268
zmask = (izero == 0 || ione == 0 ? 0 : -1);
269
omask = (izero == 1 || ione == 1 ? -1 : 0);
264
if ( izero != (int)gx_no_color_index ) zero ^= 1;
265
if ( ione != (int)gx_no_color_index ) one ^= 1;
267
invert = (izero == 1 || ione == 0 ? -1 : 0);
268
zmask = (izero == 0 || ione == 0 ? 0 : -1);
269
omask = (izero == 1 || ione == 1 ? -1 : 0);
274
if (sleft == dleft) /* optimize the aligned case */
279
register const byte *bptr = line;
281
register byte *optr = dest;
282
register int bits = *bptr ^ invert; /* first partial byte */
284
write_byte_masked(optr, bits, mask);
288
while ((count -= 8) >= 0)
290
bits = *++bptr ^ invert;
292
write_byte(optr, bits);
299
bits = *++bptr ^ invert;
301
write_byte_masked(optr, bits, rmask);
309
int skew = (sleft - dleft) & 7;
310
int cskew = 8 - skew;
314
const byte *bptr = line;
319
/* Do the first partial byte */
323
bits = *bptr >> skew;
325
else /* ( sleft < dleft ) */
327
bits = *bptr++ << cskew;
329
bits += *bptr >> skew;
332
write_byte_masked(optr, bits, mask);
340
bits = *bptr++ << cskew;
341
bits += *bptr >> skew;
343
write_byte(optr, bits);
352
bits = *bptr++ << cskew;
354
bits += *bptr >> skew;
356
write_byte_masked(optr, bits, rmask);
274
if (sleft == dleft) /* optimize the aligned case */
279
register const byte *bptr = line;
281
register byte *optr = dest;
282
register int bits = *bptr ^ invert; /* first partial byte */
284
write_byte_masked(optr, bits, mask);
288
while ((count -= 8) >= 0)
290
bits = *++bptr ^ invert;
292
write_byte(optr, bits);
299
bits = *++bptr ^ invert;
301
write_byte_masked(optr, bits, rmask);
309
int skew = (sleft - dleft) & 7;
310
int cskew = 8 - skew;
314
const byte *bptr = line;
319
/* Do the first partial byte */
323
bits = *bptr >> skew;
325
else /* ( sleft < dleft ) */
327
bits = *bptr++ << cskew;
329
bits += *bptr >> skew;
332
write_byte_masked(optr, bits, mask);
340
bits = *bptr++ << cskew;
341
bits += *bptr >> skew;
343
write_byte(optr, bits);
352
bits = *bptr++ << cskew;
354
bits += *bptr >> skew;
356
write_byte_masked(optr, bits, rmask);