Jspice3
mfbbox.c
Go to the documentation of this file.
1 /*************************************************************************
2  MFB graphics and miscellaneous library
3  Copyright (c) Stephen R. Whiteley 1992
4  Author: Stephen R. Whiteley
5  *************************************************************************/
6 
7 #include "mfb.h"
8 #include "mfbP.h"
9 #include <dos.h>
10 
11 #define ror(x,n) ((x >> n) | (x << (8-n)))
12 
13 #ifdef __STDC__
14 static void mode_1_box(int,int,int,int);
15 static void mode_2_box(int,int,int,int);
16 #else
17 static void mode_1_box();
18 static void mode_2_box();
19 #endif
20 
21 
22 void
23 MFBBox(x1,y1,x2,y2)
24 
25 int x1,y1,x2,y2;
26 {
27  if (pc.mfbMODE & 2)
28  mode_2_box(x1,y1,x2,y2);
29  else
30  mode_1_box(x1,y1,x2,y2);
31 }
32 
33 
34 static void
35 mode_1_box(xl,yl,xu,yu)
36 
37 int xl, yl, xu, yu;
38 {
39  int lnum, dx, tx, dy, next, *st = NULL;
40  vidmptr rgen;
41  unsigned char left, right, cbuf;
42  union { unsigned short color2; unsigned char c[2]; } c;
43 
44  if (yu < yl) MFBSwapInt(yu,yl);
45  if (xu < xl) MFBSwapInt(xu,xl);
46 
47  /* expand box so that it covers a box formed of lines with the
48  * same coordinates
49  */
50  xu++;
51  yl--;
52 
53  if (pc.curfillpatt)
54  st = pc.stipples[pc.curfillpatt];
55 
56  c.c[0] = pc.curcolor;
57  c.c[1] = c.c[0];
58  lnum = (pc.ysize-1-yu);
59  dy = yu - yl;
60 
61  left = (0xff >> (xl & 7));
62  right = ~(0xff >> (xu & 7));
63  dx = (xu >> 3) - (xl >>= 3) - 1;
64  if (dx < 0) { left &= right; dx = 0; right = 0; }
65  rgen = pc.base + xl + (long) lnum*pc.bytpline;
66  next = pc.bytpline - 1 - dx;
67 
68  outpw(0x3ce,0x0b05); /* read mode 1, write mode 3 */
69  outpw(0x3ce,c.color2 & 0xff00); /* set/reset */
70  outpw(0x3ce,0x7); /* zero color dont care */
71  outpw(0x3ce,pc.alumode); /* set alu mode */
72 
73  cbuf = 0xff;
74 
75  if (!st) {
76 
77  while (dy--) {
78  mfb_trash = *rgen;
79  *rgen = left;
80  rgen++;
81  tx = dx;
82  while (tx--) {
83  mfb_trash = *rgen;
84  *rgen = cbuf;
85  rgen++;
86  }
87  mfb_trash = *rgen;
88  *rgen = right;
89  rgen += next;
90  }
91  }
92  else {
93  while (dy--) {
94  cbuf = st[lnum++ & 7];
95  mfb_trash = *rgen;
96  *rgen = left & cbuf;
97  rgen++;
98  tx = dx;
99  while (tx--) {
100  mfb_trash = *rgen;
101  *rgen = cbuf;
102  rgen++;
103  }
104  mfb_trash = *rgen;
105  *rgen = right & cbuf;
106  rgen += next;
107  }
108  }
109 
110  outpw(0x3ce,0x5);
111  outpw(0x3ce,0xff07);
112 }
113 
114 
115 #ifndef __GNUC__
116 
117 
118 static void
119 mode_2_box(xl,yl,xu,yu)
120 
121 int xl, yl, xu, yu;
122 {
123  int lnum, dy, next, *st = NULL;
124  unsigned short dx, tx;
125  unsigned char left, right, cbuf;
126  union { unsigned short o[2]; long l; } p1, p2;
127  union { unsigned short color2; unsigned char c[2]; } c;
128  vidmptr rgen;
129 
130  if (yu < yl) MFBSwapInt(yu,yl);
131  if (xu < xl) MFBSwapInt(xu,xl);
132 
133  outpw(0x3ce,0xff08); /* set bit mask */
134  outpw(0x3ce,pc.alumode); /* set alu mode */
135 
136  /* expand box so that it covers a box formed of lines with the
137  * same coordinates
138  */
139  xu++;
140  yl--;
141 
142  if (pc.curfillpatt)
143  st = pc.stipples[pc.curfillpatt];
144 
145  c.c[0] = pc.curcolor;
146  c.c[1] = c.c[0];
147  lnum = (pc.ysize-1-yu);
148  dy = yu - yl;
149  dx = xu - xl;
150  p1.l = xl + (long) lnum*pc.xsize;
151  p2.l = p1.l + dx;
152 
153  cbuf = inp(0x3cd);
154  cbuf |= (cbuf << 4);
155  next = pc.xsize;
156 
157  if (!st) {
158 
159  while (dy--) {
160  if ((cbuf & 0xf) != p1.o[1]) {
161  cbuf = p1.o[1];
162  cbuf |= (cbuf << 4);
163  outp(0x3cd,cbuf);
164  }
165  if (p1.o[1] != p2.o[1])
166  tx = ~(p1.o[0]) + 1;
167  else
168  tx = dx;
169  rgen = pc.base + p1.o[0];
170 
171  if (pc.alumode == 0x3) {
172  if ((unsigned)rgen & 1) {
173  *rgen = c.c[0];
174  rgen++;
175  tx--;
176  }
177  if (tx & 1)
178  *(rgen + tx - 1) = c.c[0];
179  tx >>= 1;
180  while (tx--) {
181  *(short far *)rgen = c.color2;
182  rgen += 2;
183  }
184  }
185  else {
186  while (tx--) {
187  mfb_trash = *rgen;
188  *rgen = c.c[0];
189  rgen++;
190  }
191  }
192  if (p1.o[1] != p2.o[1]) {
193  cbuf += 0x11;
194  outp(0x3cd,cbuf);
195  tx = p2.o[0];
196  rgen = pc.base;
197  if (pc.alumode == 0x3) {
198  if (tx & 1)
199  *(rgen + tx - 1) = c.c[0];
200  tx >>= 1;
201  while (tx--) {
202  *(short far *)rgen = c.color2;
203  rgen += 2;
204  }
205  }
206  else {
207  while (tx--) {
208  mfb_trash = *rgen;
209  *rgen = c.c[0];
210  rgen++;
211  }
212  }
213  }
214  p2.l += next;
215  p1.l += next;
216  }
217  }
218 
219  else {
220 
221  while (dy--) {
222  left = 0x80 >> (xl & 7);
223  right = st[lnum++ & 7];
224 
225  if ((cbuf & 0xf) != p1.o[1]) {
226  cbuf = p1.o[1];
227  cbuf |= (cbuf << 4);
228  outp(0x3cd,cbuf);
229  }
230  if (p1.o[1] != p2.o[1])
231  tx = ~(p1.o[0]) + 1;
232  else
233  tx = dx;
234  rgen = pc.base + p1.o[0];
235 
236  while (tx--) {
237  if (left & right) {
238  if (pc.alumode != 3)
239  mfb_trash = *rgen;
240  *rgen = c.c[0];
241  }
242  left = ror(left,1);
243  rgen++;
244  }
245 
246  if (p1.o[1] != p2.o[1]) {
247  cbuf += 0x11;
248  outp(0x3cd,cbuf);
249  tx = p2.o[0];
250  rgen = pc.base;
251  while (tx--) {
252  if (left & right) {
253  if (pc.alumode != 3)
254  mfb_trash = *rgen;
255  *rgen = c.c[0];
256  }
257  left = ror(left,1);
258  rgen++;
259  }
260  }
261  p1.l += next;
262  p2.l += next;
263  }
264  }
265 }
266 
267 
268 #else /* __GNUC__ */
269 
270 
271 static void
272 mode_2_box(xl,yl,xu,yu)
273 
274 int xl, yl, xu, yu;
275 {
276  int lnum, dx, tx, dy, next, *st = NULL;
277  unsigned char left, right;
278  union { unsigned short color2; unsigned char c[2]; } c;
279  vidmptr rgen;
280 
281  if (yu < yl) MFBSwapInt(yu,yl);
282  if (xu < xl) MFBSwapInt(xu,xl);
283 
284  outpw(0x3ce,0xff08); /* set bit mask */
285  outpw(0x3ce,pc.alumode); /* set alu mode */
286 
287  /* expand box so that it covers a box formed of lines with the
288  * same coordinates
289  */
290  xu++;
291  yl--;
292 
293  if (pc.curfillpatt)
294  st = pc.stipples[pc.curfillpatt];
295 
296  c.c[0] = pc.curcolor;
297  c.c[1] = c.c[0];
298  lnum = (pc.ysize-1-yu);
299  dy = yu - yl;
300  dx = xu - xl;
301  rgen = pc.base + xl + (long) lnum*pc.xsize;
302  next = pc.xsize - dx;
303 
304  if (!st) {
305 
306  if (pc.alumode == 0x3) {
307 
308  while (dy--) {
309  tx = dx;
310  if ((unsigned)rgen & 1) {
311  *rgen = c.c[0];
312  rgen++;
313  tx--;
314  }
315  left = tx & 1;
316  tx >>= 1;
317  while (tx--) {
318  *(short*)rgen = c.color2;
319  rgen += 2;
320  }
321  if (left) {
322  *rgen = c.c[0];
323  rgen++;
324  }
325  rgen += next;
326  }
327  }
328  else {
329 
330  while (dy--) {
331  tx = dx;
332  while (tx--) {
333  mfb_trash = *rgen;
334  *rgen = c.c[0];
335  rgen++;
336  }
337  rgen += next;
338  }
339  }
340  }
341 
342  else {
343 
344  while (dy--) {
345  left = 0x80 >> (xl & 7);
346  right = st[lnum++ & 7];
347 
348  tx = dx;
349  while (tx--) {
350  if (left & right) {
351  if (pc.alumode != 3)
352  mfb_trash = *rgen;
353  *rgen = c.c[0];
354  }
355  left = ror(left,1);
356  rgen++;
357  }
358  rgen += next;
359  }
360  }
361 }
362 
363 #endif /* __GNUC__ */
void MFBBox(int x1, int y1, int x2, int y2)
Definition: mfbbox.c:23
static void mode_1_box()
if(TDesc==NULL)
Definition: cd.c:1326
int mfbMODE
Definition: mfbp.h:41
char mfb_trash
Definition: mfbopen.c:15
Definition: cddefs.h:312
int stipples[10][8]
Definition: mfbp.h:70
char * vidmptr
Definition: mfbp.h:17
int ysize
Definition: mfbp.h:54
vidmptr base
Definition: mfbp.h:38
#define NULL
Definition: spdefs.h:121
int alumode
Definition: mfbp.h:56
static double c
Definition: vectors.c:16
Definition: cddefs.h:142
int xsize
Definition: mfbp.h:53
while(TDesc->tSucc!=NULL)
Definition: cd.c:1335
Definition: cddefs.h:177
int bytpline
Definition: mfbp.h:39
#define ror(x, n)
Definition: mfbbox.c:11
#define MFBSwapInt(f1, f2)
Definition: mfb.h:35
int curcolor
Definition: mfbp.h:46
static void mode_2_box()
struct mfbpc pc
Definition: mfbopen.c:14
int curfillpatt
Definition: mfbp.h:48