source: buchla-68k/ram/gcurpos.c@ 60288f5

Last change on this file since 60288f5 was 0580615, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Point of no return.

  • Property mode set to 100644
File size: 9.0 KB
Line 
1/*
2 =============================================================================
3 gcurpos.c -- MIDAS cursor arrow functions and arrow object definitions
4 Version 16 -- 1988-03-11 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#include "stddefs.h"
9#include "hwdefs.h"
10#include "graphdef.h"
11#include "vsdd.h"
12#include "vsddvars.h"
13
14#include "midas.h"
15
16#define YOFF 15 /* y pixel offset */
17#define XOFF 14 /* x pixel offset */
18
19extern short sgcsw;
20
21/* 4 bit pixel patterns */
22
23#define AW_0 0x0000
24#define AW_1 0xF000
25#define AW_2 0x0F00
26#define AW_3 0xFF00
27#define AW_4 0x00F0
28#define AW_5 0xF0F0
29#define AW_6 0x0FF0
30#define AW_7 0xFFF0
31#define AW_8 0x000F
32#define AW_9 0xF00F
33#define AW_A 0x0F0F
34#define AW_B 0xFF0F
35#define AW_C 0x00FF
36#define AW_D 0xF0FF
37#define AW_E 0x0FFF
38#define AW_F 0xFFFF
39
40extern void objclr(unsigned obj);
41extern void SetPri(int obj, int pri);
42extern void vbank(unsigned b);
43
44extern unsigned exp_c(unsigned c);
45
46extern short stcrow, stccol;
47
48/*
49
50*/
51
52static int ar_ule[] = { /* upper left even pixel arrow */
53
54 AW_F, AW_0, AW_0, AW_0, /* 0 */
55 AW_C, AW_0, AW_0, AW_0, /* 1 */
56 AW_A, AW_0, AW_0, AW_0, /* 2 */
57 AW_9, AW_0, AW_0, AW_0, /* 3 */
58 AW_0, AW_8, AW_0, AW_0, /* 4 */
59 AW_0, AW_4, AW_0, AW_0, /* 5 */
60 AW_0, AW_2, AW_0, AW_0, /* 6 */
61 AW_0, AW_1, AW_0, AW_0, /* 7 */
62 AW_0, AW_0, AW_8, AW_0, /* 8 */
63 AW_0, AW_0, AW_7, AW_8, /* 9 */
64 AW_0, AW_0, AW_6, AW_0, /* 10 */
65 AW_0, AW_0, AW_5, AW_E, /* 11 */
66 AW_0, AW_0, AW_5, AW_8, /* 12 */
67 AW_0, AW_0, AW_1, AW_4, /* 13 */
68 AW_0, AW_0, AW_1, AW_2, /* 14 */
69 AW_0, AW_0, AW_0, AW_0 /* 15 */
70};
71
72static int ar_ulo[] = { /* upper left odd pixel arrow */
73
74 AW_7, AW_8, AW_0, AW_0, /* 0 */
75 AW_6, AW_0, AW_0, AW_0, /* 1 */
76 AW_5, AW_0, AW_0, AW_0, /* 2 */
77 AW_4, AW_8, AW_0, AW_0, /* 3 */
78 AW_0, AW_4, AW_0, AW_0, /* 4 */
79 AW_0, AW_2, AW_0, AW_0, /* 5 */
80 AW_0, AW_1, AW_0, AW_0, /* 6 */
81 AW_0, AW_0, AW_8, AW_0, /* 7 */
82 AW_0, AW_0, AW_4, AW_0, /* 8 */
83 AW_0, AW_0, AW_3, AW_C, /* 9 */
84 AW_0, AW_0, AW_3, AW_0, /* 10 */
85 AW_0, AW_0, AW_2, AW_F, /* 11 */
86 AW_0, AW_0, AW_2, AW_C, /* 12 */
87 AW_0, AW_0, AW_0, AW_A, /* 13 */
88 AW_0, AW_0, AW_0, AW_9, /* 14 */
89 AW_0, AW_0, AW_0, AW_0 /* 15 */
90};
91
92/*
93
94*/
95
96static int ar_ure[] = { /* upper right even pixel arrow */
97
98 AW_0, AW_0, AW_1, AW_E, /* 0 */
99 AW_0, AW_0, AW_0, AW_6, /* 1 */
100 AW_0, AW_0, AW_0, AW_A, /* 2 */
101 AW_0, AW_0, AW_1, AW_2, /* 3 */
102 AW_0, AW_0, AW_2, AW_0, /* 4 */
103 AW_0, AW_0, AW_4, AW_0, /* 5 */
104 AW_0, AW_0, AW_8, AW_0, /* 6 */
105 AW_0, AW_1, AW_0, AW_0, /* 7 */
106 AW_0, AW_2, AW_0, AW_0, /* 8 */
107 AW_3, AW_C, AW_0, AW_0, /* 9 */
108 AW_0, AW_C, AW_0, AW_0, /* 10 */
109 AW_F, AW_4, AW_0, AW_0, /* 11 */
110 AW_3, AW_4, AW_0, AW_0, /* 12 */
111 AW_5, AW_0, AW_0, AW_0, /* 13 */
112 AW_9, AW_0, AW_0, AW_0, /* 14 */
113 AW_0, AW_0, AW_0, AW_0 /* 15 */
114};
115
116static int ar_uro[] = { /* upper right odd pixel arrow */
117
118 AW_0, AW_0, AW_0, AW_F, /* 0 */
119 AW_0, AW_0, AW_0, AW_3, /* 1 */
120 AW_0, AW_0, AW_0, AW_5, /* 2 */
121 AW_0, AW_0, AW_0, AW_9, /* 3 */
122 AW_0, AW_0, AW_1, AW_0, /* 4 */
123 AW_0, AW_0, AW_2, AW_0, /* 5 */
124 AW_0, AW_0, AW_4, AW_0, /* 6 */
125 AW_0, AW_0, AW_8, AW_0, /* 7 */
126 AW_0, AW_1, AW_0, AW_0, /* 8 */
127 AW_1, AW_E, AW_0, AW_0, /* 9 */
128 AW_0, AW_6, AW_0, AW_0, /* 10 */
129 AW_7, AW_A, AW_0, AW_0, /* 11 */
130 AW_1, AW_A, AW_0, AW_0, /* 12 */
131 AW_2, AW_8, AW_0, AW_0, /* 13 */
132 AW_4, AW_8, AW_0, AW_0, /* 14 */
133 AW_0, AW_0, AW_0, AW_0 /* 15 */
134};
135
136/*
137
138*/
139
140static int ar_lle[] = { /* lower left even pixel arrow */
141
142 AW_0, AW_0, AW_0, AW_0, /* 0 */
143 AW_0, AW_0, AW_1, AW_2, /* 1 */
144 AW_0, AW_0, AW_1, AW_4, /* 2 */
145 AW_0, AW_0, AW_5, AW_8, /* 3 */
146 AW_0, AW_0, AW_5, AW_E, /* 4 */
147 AW_0, AW_0, AW_6, AW_0, /* 5 */
148 AW_0, AW_0, AW_7, AW_8, /* 6 */
149 AW_0, AW_0, AW_8, AW_0, /* 7 */
150 AW_0, AW_1, AW_0, AW_0, /* 8 */
151 AW_0, AW_2, AW_0, AW_0, /* 9 */
152 AW_0, AW_4, AW_0, AW_0, /* 10 */
153 AW_0, AW_8, AW_0, AW_0, /* 11 */
154 AW_9, AW_0, AW_0, AW_0, /* 12 */
155 AW_A, AW_0, AW_0, AW_0, /* 13 */
156 AW_C, AW_0, AW_0, AW_0, /* 14 */
157 AW_F, AW_0, AW_0, AW_0 /* 15 */
158};
159
160static int ar_llo[] = { /* lower left odd pixel arrow */
161
162 AW_0, AW_0, AW_0, AW_0, /* 0 */
163 AW_0, AW_0, AW_0, AW_9, /* 1 */
164 AW_0, AW_0, AW_0, AW_A, /* 2 */
165 AW_0, AW_0, AW_2, AW_C, /* 3 */
166 AW_0, AW_0, AW_2, AW_F, /* 4 */
167 AW_0, AW_0, AW_3, AW_0, /* 5 */
168 AW_0, AW_0, AW_3, AW_C, /* 6 */
169 AW_0, AW_0, AW_4, AW_0, /* 7 */
170 AW_0, AW_0, AW_8, AW_0, /* 8 */
171 AW_0, AW_1, AW_0, AW_0, /* 9 */
172 AW_0, AW_2, AW_0, AW_0, /* 10 */
173 AW_0, AW_4, AW_0, AW_0, /* 11 */
174 AW_4, AW_8, AW_0, AW_0, /* 12 */
175 AW_5, AW_0, AW_0, AW_0, /* 13 */
176 AW_6, AW_0, AW_0, AW_0, /* 14 */
177 AW_7, AW_8, AW_0, AW_0 /* 15 */
178};
179
180/*
181
182*/
183
184static int ar_lre[] = { /* lower right even pixel arrow */
185
186 AW_0, AW_0, AW_0, AW_0, /* 0 */
187 AW_9, AW_0, AW_0, AW_0, /* 1 */
188 AW_5, AW_0, AW_0, AW_0, /* 2 */
189 AW_3, AW_4, AW_0, AW_0, /* 3 */
190 AW_F, AW_4, AW_0, AW_0, /* 4 */
191 AW_0, AW_C, AW_0, AW_0, /* 5 */
192 AW_3, AW_C, AW_0, AW_0, /* 6 */
193 AW_0, AW_2, AW_0, AW_0, /* 7 */
194 AW_0, AW_1, AW_0, AW_0, /* 8 */
195 AW_0, AW_0, AW_8, AW_0, /* 9 */
196 AW_0, AW_0, AW_4, AW_0, /* 10 */
197 AW_0, AW_0, AW_2, AW_0, /* 11 */
198 AW_0, AW_0, AW_1, AW_2, /* 12 */
199 AW_0, AW_0, AW_0, AW_A, /* 13 */
200 AW_0, AW_0, AW_0, AW_6, /* 14 */
201 AW_0, AW_0, AW_1, AW_E /* 15 */
202};
203
204static int ar_lro[] = { /* lower right odd pixel arrow */
205
206 AW_0, AW_0, AW_0, AW_0, /* 0 */
207 AW_4, AW_8, AW_0, AW_0, /* 1 */
208 AW_2, AW_8, AW_0, AW_0, /* 2 */
209 AW_1, AW_A, AW_0, AW_0, /* 3 */
210 AW_7, AW_A, AW_0, AW_0, /* 4 */
211 AW_0, AW_6, AW_0, AW_0, /* 5 */
212 AW_1, AW_E, AW_0, AW_0, /* 6 */
213 AW_0, AW_1, AW_0, AW_0, /* 7 */
214 AW_0, AW_0, AW_8, AW_0, /* 8 */
215 AW_0, AW_0, AW_4, AW_0, /* 9 */
216 AW_0, AW_0, AW_2, AW_0, /* 10 */
217 AW_0, AW_0, AW_1, AW_0, /* 11 */
218 AW_0, AW_0, AW_0, AW_9, /* 12 */
219 AW_0, AW_0, AW_0, AW_5, /* 13 */
220 AW_0, AW_0, AW_0, AW_3, /* 14 */
221 AW_0, AW_0, AW_0, AW_F /* 15 */
222};
223
224/*
225
226*/
227
228static int *arrows[] = { /* arrow pointer table */
229
230 v_curs0, /* 0 - upper left, even pixel */
231 v_curs1, /* 1 - upper left, odd pixel */
232
233 v_curs2, /* 2 - upper right, even pixel */
234 v_curs3, /* 3 - upper right, odd pixel */
235
236 v_curs4, /* 4 - lower left, even pixel */
237 v_curs5, /* 5 - lower left, odd pixel */
238
239 v_curs6, /* 6 - lower right, even pixel */
240 v_curs7 /* 7 - lower right, odd pixel */
241};
242
243/*
244
245*/
246
247/*
248 =============================================================================
249 gcurpos(xloc, yloc) -- position the graphic cursor at ('xloc', 'yloc')
250
251 Also sets stcrow and stccol to keep them in sync.
252 =============================================================================
253*/
254
255int gcurpos(int xloc, int yloc)
256{
257 register int ab, xo, yo;
258 register struct octent *op;
259
260 if (xloc LT XCTR) {
261
262 xo = 0; /* arrow points left */
263
264 if (yloc LT YCTR)
265 {ab = 0; yo = 0;} /* arrow points up */
266 else
267 {ab = 4; yo = -YOFF;} /* arrow points down */
268
269 } else {
270
271 xo = -XOFF; /* arrow points right */
272
273 if (yloc LT YCTR)
274 {ab = 2; yo = 0;} /* arrow points up */
275 else
276 {ab = 6; yo = -YOFF;} /* arrow points down */
277 }
278
279 if (v_regs[5] & 0x0180)
280 vbank(0);
281
282 v_odtab[GCPRI][0] |= V_BLA;
283 objclr(GCPRI);
284
285 op = &v_obtab[GCURS];
286 op->objx = xloc + xo;
287 op->objy = yloc + yo;
288 op->obase = arrows[ab + (xloc & 0x0001)];
289 op->odtw1 = 0x0400 | (0x03FF & (op->objx >> 1));
290
291 SetPri(GCURS, GCPRI);
292
293 stcrow = yloc / 14;
294 stccol = xloc >> 3;
295 return(ab + (xloc & 0x0001));
296}
297
298/*
299
300*/
301
302/*
303 =============================================================================
304 andcopy() -- copy a pattern
305 =============================================================================
306*/
307
308void andcopy(unsigned *to, unsigned *from, unsigned with, short len)
309{
310 register short i;
311
312 for (i = len; i--; )
313 *to++ = *from++ & with;
314}
315
316/*
317 =============================================================================
318 arcurs() -- setup the arrow cursor
319 =============================================================================
320*/
321
322void arcurs(unsigned icolor)
323{
324 register short color;
325
326 color = exp_c(icolor);
327
328 if ((v_regs[5] & 0x0180) NE 0x0100)
329 vbank(1);
330
331 andcopy(v_curs0, ar_ule, color, 64); /* setup arrow cursor */
332 andcopy(v_curs1, ar_ulo, color, 64);
333 andcopy(v_curs2, ar_ure, color, 64);
334 andcopy(v_curs3, ar_uro, color, 64);
335 andcopy(v_curs4, ar_lle, color, 64);
336 andcopy(v_curs5, ar_llo, color, 64);
337 andcopy(v_curs6, ar_lre, color, 64);
338 andcopy(v_curs7, ar_lro, color, 64);
339}
340
341/*
342
343*/
344
345/*
346 =============================================================================
347 sgcon() -- set graphic cursor object "on"
348 =============================================================================
349*/
350
351void sgcon(void)
352{
353 if (sgcsw)
354 return;
355
356 if (v_regs[5] & 0x0180)
357 vbank(0);
358
359 v_odtab[GCPRI][0] &= ~V_BLA;
360 sgcsw = TRUE;
361}
362
363/*
364 =============================================================================
365 sgcoff() -- set graphic cursor object "off"
366 =============================================================================
367*/
368
369void sgcoff(void)
370{
371 if (!sgcsw)
372 return;
373
374 if (v_regs[5] & 0x0180)
375 vbank(0);
376
377 v_odtab[GCPRI][0] |= V_BLA;
378 sgcsw = FALSE;
379}
Note: See TracBrowser for help on using the repository browser.