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

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

Zero redundant declarations.

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