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

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

Added include files for global functions and variables.

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